@actual-app/web 24.3.0 → 24.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/.vite/manifest.json +27 -17
- package/build/index.html +1 -1
- package/build/kcab/{kcab.worker.fb5495b79632bd06ea0f.js → kcab.worker.d3576baccc44df86e1d9.js} +57 -57
- package/build/kcab/{kcab.worker.fb5495b79632bd06ea0f.js.map → kcab.worker.d3576baccc44df86e1d9.js.map} +1 -1
- package/build/static/js/AppliedFilters.6hw_SZMi.chunk.js +2 -0
- package/build/static/js/AppliedFilters.6hw_SZMi.chunk.js.map +1 -0
- package/build/static/js/{BackgroundImage.Jugq91td.chunk.js → BackgroundImage.UwhfLEYN.chunk.js} +2 -2
- package/build/static/js/{BackgroundImage.Jugq91td.chunk.js.map → BackgroundImage.UwhfLEYN.chunk.js.map} +1 -1
- package/build/static/js/BalanceTooltip.hDG0UB7U.chunk.js +2 -0
- package/build/static/js/BalanceTooltip.hDG0UB7U.chunk.js.map +1 -0
- package/build/static/js/ButtonLink.WYXFzja-.chunk.js +2 -0
- package/build/static/js/{ButtonLink.ElUV7DMx.chunk.js.map → ButtonLink.WYXFzja-.chunk.js.map} +1 -1
- package/build/static/js/ReportRouter.mLx3JUh2.chunk.js +66 -0
- package/build/static/js/ReportRouter.mLx3JUh2.chunk.js.map +1 -0
- package/build/static/js/import.M8LEm-Nc.chunk.js +2 -0
- package/build/static/js/import.M8LEm-Nc.chunk.js.map +1 -0
- package/build/static/js/index.MAk9r4yg.js +216 -0
- package/build/static/js/index.MAk9r4yg.js.map +1 -0
- package/build/static/js/narrow.vxy14QoE.chunk.js +108 -0
- package/build/static/js/narrow.vxy14QoE.chunk.js.map +1 -0
- package/build/static/js/wide.GDttRuTJ.chunk.js +2 -0
- package/build/static/js/wide.GDttRuTJ.chunk.js.map +1 -0
- package/build/sw.js +1 -1
- package/build/sw.js.map +1 -1
- package/package.json +3 -2
- package/build/static/js/AppliedFilters.ggJl8zjp.chunk.js +0 -2
- package/build/static/js/AppliedFilters.ggJl8zjp.chunk.js.map +0 -1
- package/build/static/js/BalanceTooltip.nSDrDsfc.chunk.js +0 -2
- package/build/static/js/BalanceTooltip.nSDrDsfc.chunk.js.map +0 -1
- package/build/static/js/ButtonLink.ElUV7DMx.chunk.js +0 -2
- package/build/static/js/ReportRouter.8mlKGqxC.chunk.js +0 -69
- package/build/static/js/ReportRouter.8mlKGqxC.chunk.js.map +0 -1
- package/build/static/js/index.O6ABAWXP.js +0 -216
- package/build/static/js/index.O6ABAWXP.js.map +0 -1
- package/build/static/js/narrow.BvCotSUP.chunk.js +0 -108
- package/build/static/js/narrow.BvCotSUP.chunk.js.map +0 -1
- package/build/static/js/wide.Puo4nQYF.chunk.js +0 -2
- package/build/static/js/wide.Puo4nQYF.chunk.js.map +0 -1
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import{j as e,d as y,V as c,t as s,T as te,s as g,R as z,F as Xe,al as Je,am as Ze,ah as ee,an as Ke,ao as et,ap as pe,Q as q,z as Be,aq as U,ar as F,as as M,at as Ee,au as Ae,Z as tt,av as nt,a7 as rt,U as ot,L as ke,a2 as it,aw as st,ax as ie,ay as Ie,az as at,aA as lt,aB as Re,aC as we,aD as ct,aE as dt,aF as ut,X as xe,aG as _e,x as gt,aH as ye,aI as De,A as ft,m as ue,aJ as he,a3 as ht,aK as mt,aL as Le,_ as He,aM as me,aN as Fe,aO as Me,aP as pt,aQ as xt,aR as Pe,aS as yt,aT as bt,aU as vt,aV as jt,aW as wt,aX as Tt,aY as St,ai as Ct,aZ as Bt,a_ as Et,a$ as At,b0 as kt,b1 as It,b2 as Rt,b3 as _t,b4 as Dt,b5 as Lt,b6 as Ht,b7 as Ft,b8 as Mt,b9 as Pt,ba as Nt,bb as Wt,bc as zt}from"./index.O6ABAWXP.js";import{B as Gt,a as $t,b as Ot}from"./BalanceTooltip.nSDrDsfc.chunk.js";import{B as Vt}from"./ButtonLink.ElUV7DMx.chunk.js";const Ut=t=>e.jsx("svg",{...t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",style:{color:"inherit",...t.style},children:e.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"})});function Yt({onSync:t,children:n}){const[r,o]=y.useState(!1);async function i(){o(!0),await t(),o(!1)}return e.jsx(e.Fragment,{children:n({refreshing:r,onRefresh:i})})}const be=y.forwardRef(({children:t,...n},r)=>e.jsx(c,{...n,ref:r,style:{marginTop:15,marginLeft:5,marginRight:5,borderRadius:6,backgroundColor:s.cardBackground,borderColor:s.cardBorder,boxShadow:"0 1px 2px #9594A8",...n.style},children:e.jsx(c,{style:{borderRadius:6,overflow:"hidden"},children:t})}));be.displayName="Card";function J({title:t,style:n}){return e.jsx(te,{style:{...g.text,color:s.tableRowHeaderText,textAlign:"right",fontSize:12,marginBottom:2,...n},children:t})}var se;(function(t){t[t.UP=-1]="UP",t[t.DOWN=1]="DOWN"})(se||(se={}));function Qt(t){var n=getComputedStyle(t).overflowY;return t===document.scrollingElement&&n==="visible"?!0:!(n!=="scroll"&&n!=="auto")}function qt(t,n){if(!Qt(t))return!1;if(n===se.DOWN){var r=t.scrollTop+t.clientHeight;return r<t.scrollHeight}if(n===se.UP)return t.scrollTop>0;throw new Error("unsupported direction")}function Ne(t,n){return qt(t,n)?!0:t.parentElement==null?!1:Ne(t.parentElement,n)}function We(t,n){n===void 0&&(n={});var r=n.insertAt;if(!(!t||typeof document>"u")){var o=document.head||document.getElementsByTagName("head")[0],i=document.createElement("style");i.type="text/css",r==="top"&&o.firstChild?o.insertBefore(i,o.firstChild):o.appendChild(i),i.styleSheet?i.styleSheet.cssText=t:i.appendChild(document.createTextNode(t))}}var Xt=`.lds-ellipsis {
|
|
2
|
-
display: inline-block;
|
|
3
|
-
position: relative;
|
|
4
|
-
width: 64px;
|
|
5
|
-
height: 64px; }
|
|
6
|
-
|
|
7
|
-
.lds-ellipsis div {
|
|
8
|
-
position: absolute;
|
|
9
|
-
top: 27px;
|
|
10
|
-
width: 11px;
|
|
11
|
-
height: 11px;
|
|
12
|
-
border-radius: 50%;
|
|
13
|
-
background: #363636;
|
|
14
|
-
animation-timing-function: cubic-bezier(0, 1, 1, 0); }
|
|
15
|
-
|
|
16
|
-
.lds-ellipsis div:nth-child(1) {
|
|
17
|
-
left: 6px;
|
|
18
|
-
animation: lds-ellipsis1 0.6s infinite; }
|
|
19
|
-
|
|
20
|
-
.lds-ellipsis div:nth-child(2) {
|
|
21
|
-
left: 6px;
|
|
22
|
-
animation: lds-ellipsis2 0.6s infinite; }
|
|
23
|
-
|
|
24
|
-
.lds-ellipsis div:nth-child(3) {
|
|
25
|
-
left: 26px;
|
|
26
|
-
animation: lds-ellipsis2 0.6s infinite; }
|
|
27
|
-
|
|
28
|
-
.lds-ellipsis div:nth-child(4) {
|
|
29
|
-
left: 45px;
|
|
30
|
-
animation: lds-ellipsis3 0.6s infinite; }
|
|
31
|
-
|
|
32
|
-
@keyframes lds-ellipsis1 {
|
|
33
|
-
0% {
|
|
34
|
-
transform: scale(0); }
|
|
35
|
-
100% {
|
|
36
|
-
transform: scale(1); } }
|
|
37
|
-
|
|
38
|
-
@keyframes lds-ellipsis3 {
|
|
39
|
-
0% {
|
|
40
|
-
transform: scale(1); }
|
|
41
|
-
100% {
|
|
42
|
-
transform: scale(0); } }
|
|
43
|
-
|
|
44
|
-
@keyframes lds-ellipsis2 {
|
|
45
|
-
0% {
|
|
46
|
-
transform: translate(0, 0); }
|
|
47
|
-
100% {
|
|
48
|
-
transform: translate(19px, 0); } }
|
|
49
|
-
`;We(Xt);var Jt=function(){return z.createElement("div",{className:"lds-ellipsis"},z.createElement("div",null),z.createElement("div",null),z.createElement("div",null),z.createElement("div",null))},Zt=function(){return z.createElement("div",null,z.createElement("p",null,"↧ pull to refresh ↧"))},Kt=`.ptr,
|
|
50
|
-
.ptr__children {
|
|
51
|
-
height: 100%;
|
|
52
|
-
width: 100%;
|
|
53
|
-
overflow: hidden;
|
|
54
|
-
-webkit-overflow-scrolling: touch;
|
|
55
|
-
position: relative; }
|
|
56
|
-
|
|
57
|
-
.ptr.ptr--fetch-more-treshold-breached .ptr__fetch-more {
|
|
58
|
-
display: block; }
|
|
59
|
-
|
|
60
|
-
.ptr__fetch-more {
|
|
61
|
-
display: none; }
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Pull down transition
|
|
65
|
-
*/
|
|
66
|
-
.ptr__children,
|
|
67
|
-
.ptr__pull-down {
|
|
68
|
-
transition: transform 0.2s cubic-bezier(0, 0, 0.31, 1); }
|
|
69
|
-
|
|
70
|
-
.ptr__pull-down {
|
|
71
|
-
position: absolute;
|
|
72
|
-
overflow: hidden;
|
|
73
|
-
left: 0;
|
|
74
|
-
right: 0;
|
|
75
|
-
top: 0;
|
|
76
|
-
visibility: hidden; }
|
|
77
|
-
.ptr__pull-down > div {
|
|
78
|
-
display: none; }
|
|
79
|
-
|
|
80
|
-
.ptr--dragging {
|
|
81
|
-
/**
|
|
82
|
-
* Hide PullMore content is treshold breached
|
|
83
|
-
*/
|
|
84
|
-
/**
|
|
85
|
-
* Otherwize, display content
|
|
86
|
-
*/ }
|
|
87
|
-
.ptr--dragging.ptr--pull-down-treshold-breached .ptr__pull-down--pull-more {
|
|
88
|
-
display: none; }
|
|
89
|
-
.ptr--dragging .ptr__pull-down--pull-more {
|
|
90
|
-
display: block; }
|
|
91
|
-
|
|
92
|
-
.ptr--pull-down-treshold-breached {
|
|
93
|
-
/**
|
|
94
|
-
* Force opacity to 1 is pull down trashold breached
|
|
95
|
-
*/
|
|
96
|
-
/**
|
|
97
|
-
* And display loader
|
|
98
|
-
*/ }
|
|
99
|
-
.ptr--pull-down-treshold-breached .ptr__pull-down {
|
|
100
|
-
opacity: 1 !important; }
|
|
101
|
-
.ptr--pull-down-treshold-breached .ptr__pull-down--loading {
|
|
102
|
-
display: block; }
|
|
103
|
-
|
|
104
|
-
.ptr__loader {
|
|
105
|
-
margin: 0 auto;
|
|
106
|
-
text-align: center; }
|
|
107
|
-
`;We(Kt);var en=function(t){var n=t.isPullable,r=n===void 0?!0:n,o=t.canFetchMore,i=o===void 0?!1:o,h=t.onRefresh,u=t.onFetchMore,p=t.refreshingContent,d=p===void 0?z.createElement(Jt,null):p,m=t.pullingContent,b=m===void 0?z.createElement(Zt,null):m,a=t.children,C=t.pullDownThreshold,f=C===void 0?67:C,j=t.fetchMoreThreshold,D=j===void 0?100:j,I=t.maxPullDownDistance,k=I===void 0?95:I,P=t.resistance,_=P===void 0?1:P,L=t.backgroundColor,B=t.className,O=B===void 0?"":B,E=y.useRef(null),A=y.useRef(null),w=y.useRef(null),K=y.useRef(null),R=!1,Y=!1,N=!1,Q=0,V=0;y.useEffect(function(){if(!(!r||!A||!A.current)){var x=A.current;return x.addEventListener("touchstart",X,{passive:!0}),x.addEventListener("mousedown",X),x.addEventListener("touchmove",G,{passive:!1}),x.addEventListener("mousemove",G),window.addEventListener("scroll",ae),x.addEventListener("touchend",ne),x.addEventListener("mouseup",ne),document.body.addEventListener("mouseleave",ne),function(){x.removeEventListener("touchstart",X),x.removeEventListener("mousedown",X),x.removeEventListener("touchmove",G),x.removeEventListener("mousemove",G),window.removeEventListener("scroll",ae),x.removeEventListener("touchend",ne),x.removeEventListener("mouseup",ne),document.body.removeEventListener("mouseleave",ne)}}},[a,r,h,f,k,i,D]),y.useEffect(function(){var x;if(!((x=E)===null||x===void 0)&&x.current){var Z=E.current.classList.contains("ptr--fetch-more-treshold-breached");Z||i&&v()<D&&u&&(E.current.classList.add("ptr--fetch-more-treshold-breached"),Y=!0,u().then(W).catch(W))}},[i,a]);var v=function(){if(!A||!A.current)return-1;var x=window.scrollY,Z=A.current.scrollHeight;return Z-x-window.innerHeight},W=function(){requestAnimationFrame(function(){A.current&&(A.current.style.overflowX="hidden",A.current.style.overflowY="auto",A.current.style.transform="unset"),w.current&&(w.current.style.opacity="0"),E.current&&(E.current.classList.remove("ptr--pull-down-treshold-breached"),E.current.classList.remove("ptr--dragging"),E.current.classList.remove("ptr--fetch-more-treshold-breached")),R&&(R=!1),Y&&(Y=!1)})},X=function(x){N=!1,x instanceof MouseEvent&&(Q=x.pageY),window.TouchEvent&&x instanceof TouchEvent&&(Q=x.touches[0].pageY),V=Q,!(x.type==="touchstart"&&Ne(x.target,se.UP))&&(A.current.getBoundingClientRect().top<0||(N=!0))},G=function(x){if(N){if(window.TouchEvent&&x instanceof TouchEvent?V=x.touches[0].pageY:V=x.pageY,E.current.classList.add("ptr--dragging"),V<Q){N=!1;return}x.cancelable&&x.preventDefault();var Z=Math.min((V-Q)/_,k);Z>=f&&(N=!0,R=!0,E.current.classList.remove("ptr--dragging"),E.current.classList.add("ptr--pull-down-treshold-breached")),!(Z>=k)&&(w.current.style.opacity=(Z/65).toString(),A.current.style.overflow="visible",A.current.style.transform="translate(0px, "+Z+"px)",w.current.style.visibility="visible")}},ae=function(x){Y||i&&v()<D&&u&&(Y=!0,E.current.classList.add("ptr--fetch-more-treshold-breached"),u().then(W).catch(W))},ne=function(){if(N=!1,Q=0,V=0,!R){w.current&&(w.current.style.visibility="hidden"),W();return}A.current&&(A.current.style.overflow="visible",A.current.style.transform="translate(0px, "+f+"px)"),h().then(W).catch(W)};return z.createElement("div",{className:"ptr "+O,style:{backgroundColor:L},ref:E},z.createElement("div",{className:"ptr__pull-down",ref:w},z.createElement("div",{className:"ptr__loader ptr__pull-down--loading"},d),z.createElement("div",{className:"ptr__pull-down--pull-more"},b)),z.createElement("div",{className:"ptr__children",ref:A},a,z.createElement("div",{className:"ptr__fetch-more",ref:K},z.createElement("div",{className:"ptr__loader ptr__fetch-more--loading"},d))))};function ve(t){return e.jsx("div",{style:{overflow:"auto"},children:e.jsx(en,{pullDownThreshold:80,resistance:2,className:String(Xe({"& .ptr__pull-down":{textAlign:"center"},"& .ptr__children":{overflow:"hidden auto"}})),...t})})}const $=50,ge=({children:t,style:n,...r})=>e.jsx(c,{style:{height:$,borderBottomWidth:1,borderColor:s.tableBorder,flexDirection:"row",alignItems:"center",paddingLeft:10,paddingRight:10,zIndex:1,...n},...r,children:t});function tn({toBudget:t,onClick:n}){const r=ie(t);return e.jsxs(q,{type:"bare",style:{flexDirection:"column",alignItems:"flex-start"},onClick:n,children:[e.jsx(J,{title:r<0?"OVERBUDGETED":"TO BUDGET",style:{...g.underlinedText,color:s.formInputText,flexShrink:0,textAlign:"left"}}),e.jsx(F,{binding:t,type:"financial",style:{...g.smallText,fontWeight:"500",color:r<0?s.errorText:s.formInputText}})]})}function nn({projected:t,onClick:n}){const r=t?M.totalBudgetedSaved:M.totalSaved,i=(ie(r)||0)<0;return e.jsxs(q,{type:"bare",style:{flexDirection:"column",alignItems:"flex-start"},onClick:n,children:[t?e.jsx(J,{title:"PROJECTED SAVINGS",style:{...g.underlinedText,color:s.formInputText,textAlign:"left",fontSize:9}}):e.jsx(J,{title:i?"OVERSPENT":"SAVED",style:{...g.underlinedText,color:s.formInputText,textAlign:"left"}}),e.jsx(F,{binding:r,type:"financial",style:{...g.smallText,fontWeight:"500",color:t?s.warningText:i?s.errorTextDark:s.formInputText}})]})}function ze({name:t,binding:n,style:r,textStyle:o,categoryId:i,month:h,onBudgetAction:u,onEdit:p,onBlur:d,isEditing:m}){const b=ie(n);function a(f){u?.(h,"budget-amount",{category:i,amount:f})}function C(){p?.()}return e.jsxs(c,{style:r,children:[e.jsx(ct,{value:b,zeroSign:"+",style:{...!m&&{display:"none"},height:$,transform:"translateX(6px)"},focused:m,textStyle:{...g.smallText,...o},onUpdate:a,onBlur:d}),e.jsx(c,{role:"button",style:{...m&&{display:"none"},justifyContent:"center",alignItems:"flex-end",height:$},children:e.jsx(F,{binding:n,type:"financial",style:{...g.smallText,...o,...g.underlinedText},getStyle:Re,"data-testid":t,onPointerUp:C,onPointerDown:f=>f.preventDefault()})})]})}const rn=y.memo(function({type:n,category:r,goal:o,budgeted:i,spent:h,balance:u,carryover:p,index:d,blank:m,style:b,month:a,onEdit:C,onBudgetAction:f,show3Cols:j,showBudgetedCol:D}){const I=m?0:1,k=Ae(),[P,_]=y.useState(!1),{onRequestActiveEdit:L,onClearActiveEdit:B}=lt(),O=()=>{L(`${r.id}-budget`,()=>(_(!0),()=>_(!1)))},E=()=>{L(`${r.id}-balance`,()=>(k.open(),()=>k.close()))},A=y.useRef(),w=(R,Y,N)=>{f?.(dt(ut(a),R),Y,N)},K=e.jsxs(ge,{style:{backgroundColor:"transparent",borderBottomWidth:0,borderTopWidth:d>0?1:0,opacity:r.hidden?.5:void 0,...b},"data-testid":"row",innerRef:A,children:[e.jsx(c,{role:"button",style:{flex:1},children:e.jsx(te,{style:{...g.smallText,...g.underlinedText,...g.lineClamp(2)},onClick:()=>C?.(r.id),"data-testid":"category-name",children:r.name})}),e.jsxs(c,{style:{justifyContent:"center",alignItems:"center",flexDirection:"row",opacity:I},children:[e.jsx(ze,{name:"budgeted",binding:i,style:{...!j&&!D&&{display:"none"},width:90},textStyle:{...g.smallText,textAlign:"right"},categoryId:r.id,month:a,onBudgetAction:f,isEditing:P,onEdit:O,onBlur:B}),e.jsx(c,{style:{...!j&&D&&{display:"none"},justifyContent:"center",alignItems:"flex-end",width:90,height:$},children:e.jsx(F,{name:"spent",binding:h,style:{...g.smallText,textAlign:"right"},getStyle:Re,type:"financial"})}),e.jsx(c,{style:{...g.noTapHighlight,justifyContent:"center",alignItems:"flex-end",width:90,height:$},children:e.jsxs("span",{role:"button",onPointerUp:()=>E?.(),onPointerDown:R=>R.preventDefault(),children:[e.jsx(Gt,{carryover:p,balance:u,goal:o,budgeted:i,balanceStyle:{...g.smallText,...g.underlinedText}}),k.isOpen&&(n==="report"?e.jsx($t,{offset:5,categoryId:r.id,tooltip:k,monthIndex:we(a),onBudgetAction:w,onClose:()=>{B()}}):e.jsx(Ot,{offset:5,categoryId:r.id,tooltip:k,monthIndex:we(a),onBudgetAction:w,onClose:()=>{B()}}))]})})]})]});return e.jsx(c,{children:K})}),on=y.memo(function({group:n,budgeted:r,spent:o,balance:i,editMode:h,onEdit:u,blank:p,show3Cols:d,showBudgetedCol:m}){const b=p?0:1,a=y.useRef(),C=e.jsxs(ge,{style:{flexDirection:"row",alignItems:"center",backgroundColor:s.tableRowHeaderBackground,opacity:n.hidden?.5:void 0},"data-testid":"totals",innerRef:a,children:[e.jsx(c,{role:"button",style:{flex:1},children:e.jsx(te,{style:{...g.smallText,...g.underlinedText,...g.lineClamp(2),fontWeight:"500"},onClick:()=>u?.(n.id),"data-testid":"name",children:n.name})}),e.jsxs(c,{style:{flexDirection:"row",justifyContent:"center",alignItems:"center",height:$,opacity:b},children:[e.jsx(c,{style:{...!d&&!m&&{display:"none"},width:90,height:$,justifyContent:"center",alignItems:"flex-end"},children:e.jsx(F,{binding:r,style:{...g.smallText,fontWeight:"500",textAlign:"right"},type:"financial"})}),e.jsx(c,{style:{...!d&&m&&{display:"none"},width:90,height:$,justifyContent:"center",alignItems:"flex-end"},children:e.jsx(F,{binding:o,style:{...g.smallText,fontWeight:"500",textAlign:"right"},type:"financial"})}),e.jsx(c,{style:{width:90,height:$,justifyContent:"center",alignItems:"flex-end"},children:e.jsx(F,{binding:i,style:{...g.smallText,fontWeight:"500",textAlign:"right"},type:"financial"})})]})]});return C}),sn=y.memo(function({group:n,budgeted:r,balance:o,style:i,onEdit:h}){const u=y.useRef();return e.jsxs(ge,{style:{flexDirection:"row",alignItems:"center",padding:10,backgroundColor:s.tableRowHeaderBackground,opacity:n.hidden?.5:void 0,...i},innerRef:u,children:[e.jsx(c,{role:"button",style:{flex:1,justifyContent:"center",alignItems:"flex-start",height:$},children:e.jsx(te,{style:{...g.smallText,...g.underlinedText,...g.lineClamp(2),fontWeight:"500"},onClick:()=>h?.(n.id),"data-testid":"name",children:n.name})}),r&&e.jsx(c,{style:{justifyContent:"center",alignItems:"flex-end",width:90,height:$},children:e.jsx(F,{binding:r,style:{...g.smallText,textAlign:"right",fontWeight:"500"},type:"financial"})}),e.jsx(c,{style:{justifyContent:"center",alignItems:"flex-end",width:90,height:$},children:e.jsx(F,{binding:o,style:{...g.smallText,textAlign:"right",fontWeight:"500"},type:"financial"})})]})}),an=y.memo(function({index:n,category:r,budgeted:o,balance:i,month:h,style:u,onEdit:p,onBudgetAction:d,isEditingBudget:m,onEditBudget:b}){const a=y.useRef();return e.jsxs(ge,{style:{flexDirection:"row",alignItems:"center",padding:10,backgroundColor:"transparent",borderBottomWidth:0,borderTopWidth:n>0?1:0,opacity:r.hidden?.5:void 0,...u},innerRef:a,children:[e.jsx(c,{role:"button",style:{flex:1,justifyContent:"center",alignItems:"flex-start",height:$},children:e.jsx(te,{style:{...g.smallText,...g.underlinedText,...g.lineClamp(2)},onClick:()=>p?.(r.id),"data-testid":"name",children:r.name})}),o&&e.jsx(c,{style:{justifyContent:"center",alignItems:"flex-end",width:90,height:$},children:e.jsx(ze,{name:"budgeted",binding:o,style:{width:90},textStyle:{...g.smallText,textAlign:"right"},categoryId:r.id,month:h,onBudgetAction:d,isEditing:m,onEdit:b})}),e.jsx(c,{style:{justifyContent:"center",alignItems:"flex-end",width:90,height:$},children:e.jsx(F,{binding:i,style:{...g.smallText,textAlign:"right"},type:"financial"})})]})}),ln=y.memo(function({type:n,group:r,editMode:o,onEditGroup:i,onEditCategory:h,month:u,onAddCategory:p,onBudgetAction:d,showBudgetedCol:m,show3Cols:b,showHiddenCategories:a}){function C(f){return f}return e.jsxs(be,{style:{marginTop:7,marginBottom:7},children:[e.jsx(on,{group:r,showBudgetedCol:m,budgeted:n==="report"?M.groupBudgeted(r.id):U.groupBudgeted(r.id),spent:n==="report"?M.groupSumAmount(r.id):U.groupSumAmount(r.id),balance:n==="report"?M.groupBalance(r.id):U.groupBalance(r.id),show3Cols:b,editMode:o,onAddCategory:p,onEdit:i}),r.categories.filter(f=>!f.hidden||a).map((f,j)=>e.jsx(rn,{index:j,show3Cols:b,type:n,category:f,goal:n==="report"?M.catGoal(f.id):U.catGoal(f.id),budgeted:n==="report"?M.catBudgeted(f.id):U.catBudgeted(f.id),spent:n==="report"?M.catSumAmount(f.id):U.catSumAmount(f.id),balance:n==="report"?M.catBalance(f.id):U.catBalance(f.id),carryover:n==="report"?M.catCarryover(f.id):U.catCarryover(f.id),style:{backgroundColor:s.tableBackground},showBudgetedCol:m,editMode:o,onEdit:h,month:u,onBudgetAction:d},f.id))]})});function cn({type:t,group:n,month:r,onAddCategory:o,showHiddenCategories:i,editMode:h,onEditGroup:u,onEditCategory:p,editingBudgetCategoryId:d,onEditCategoryBudget:m,onBudgetAction:b}){return e.jsxs(c,{children:[e.jsxs(c,{style:{flexDirection:"row",alignItems:"center",justifyContent:"flex-end",marginTop:50,marginBottom:5,marginRight:14},children:[t==="report"&&e.jsx(J,{title:"BUDGETED",style:{width:90}}),e.jsx(J,{title:"RECEIVED",style:{width:90}})]}),e.jsxs(be,{style:{marginTop:0},children:[e.jsx(sn,{group:n,budgeted:t==="report"?M.groupBudgeted(n.id):null,balance:t==="report"?M.groupSumAmount(n.id):U.groupSumAmount(n.id),style:{backgroundColor:s.tableRowHeaderBackground},onAddCategory:o,editMode:h,onEdit:u}),n.categories.filter(a=>!a.hidden||i).map((a,C)=>e.jsx(an,{index:C,category:a,month:r,type:t,budgeted:t==="report"?M.catBudgeted(a.id):null,balance:t==="report"?M.catSumAmount(a.id):U.catSumAmount(a.id),style:{backgroundColor:s.tableBackground},editMode:h,onEdit:p,onBudgetAction:b,isEditingBudget:d===a.id,onEditBudget:m},a.id))]})]})}function Te({type:t,categoryGroups:n,onEditGroup:r,onEditCategory:o,editMode:i,gestures:h,month:u,onSaveCategory:p,onDeleteCategory:d,onAddCategory:m,onAddGroup:b,onReorderCategory:a,onReorderGroup:C,onBudgetAction:f,showBudgetedCol:j,show3Cols:D,showHiddenCategories:I,pushModal:k}){const P=Ie(B=>({incomeGroup:B.find(O=>O.is_income),expenseGroups:B.filter(O=>!O.is_income)})),{incomeGroup:_,expenseGroups:L}=P(n);return e.jsx(at,{formName:"mobile-budget-table",children:e.jsxs(c,{"data-testid":"budget-groups",style:{flex:"1 0 auto",overflowY:"auto",paddingBottom:15},children:[L.filter(B=>!B.hidden||I).map(B=>e.jsx(ln,{type:t,group:B,showBudgetedCol:j,gestures:h,month:u,editMode:i,onEditGroup:r,onEditCategory:o,onSaveCategory:p,onDeleteCategory:d,onAddCategory:m,onReorderCategory:a,onReorderGroup:C,onBudgetAction:f,show3Cols:D,showHiddenCategories:I,pushModal:k},B.id)),e.jsx(c,{style:{alignItems:"flex-start",justifyContent:"flex-start"},children:e.jsx(q,{onClick:b,style:{fontSize:12,margin:10},children:"Add Group"})}),_&&e.jsx(cn,{type:t,group:_,month:u,onAddCategory:m,onSaveCategory:p,onDeleteCategory:d,showHiddenCategories:I,editMode:i,onEditGroup:r,onEditCategory:o,onBudgetAction:f,pushModal:k})]})})}function dn({type:t,categoryGroups:n,month:r,monthBounds:o,editMode:i,onPrevMonth:h,onNextMonth:u,onSaveGroup:p,onDeleteGroup:d,onAddGroup:m,onAddCategory:b,onSaveCategory:a,onDeleteCategory:C,onEditMode:f,onReorderCategory:j,onReorderGroup:D,onShowBudgetSummary:I,onOpenMonthActionMenu:k,onBudgetAction:P,onRefresh:_,onSwitchBudgetType:L,pushModal:B,onEditGroup:O,onEditCategory:E}){const{width:A}=Je(),w=A>=360,K=Ze(),[R=!1,Y]=ee("mobile.showSpentColumn"),[N=!1,Q]=ee("budget.showHiddenCategories");function V(){Y(!R)}const v={padding:0,backgroundColor:"transparent",borderRadius:"unset"},W=()=>{B("switch-budget-type",{onSwitch:L})},X=()=>{Q(!N)};return e.jsx(Ke.Provider,{value:et(r),children:e.jsxs(pe,{padding:0,title:e.jsx(gn,{month:r,monthBounds:o,onPrevMonth:h,onNextMonth:u}),headerRightContent:i?e.jsx(q,{type:"bare",hoveredStyle:{color:s.mobileHeaderText,background:s.mobileHeaderTextHover},style:{...g.noTapHighlight,...g.text,backgroundColor:"transparent",color:s.mobileHeaderText},onClick:()=>f?.(!1),children:"Done"}):e.jsx(un,{onEditMode:f,onToggleHiddenCategories:X,onSwitchBudgetType:W}),style:{flex:1},children:[e.jsxs(c,{style:{flexDirection:"row",flexShrink:0,padding:10,paddingRight:14,backgroundColor:s.tableRowHeaderBackground,borderBottomWidth:1,borderColor:s.tableBorder},children:[t==="report"?e.jsx(nn,{projected:r>=Be(),onClick:I}):e.jsx(tn,{toBudget:U.toBudget,onClick:I}),e.jsx(c,{style:{flex:1}}),(w||!R)&&e.jsx(q,{type:"bare",disabled:w,onClick:V,style:{...v,padding:"0 8px",margin:"0 -8px",background:!R&&!w?`linear-gradient(-45deg, ${s.formInputBackgroundSelection} 8px, transparent 0)`:null},children:e.jsxs(c,{style:{flexBasis:90,width:90,justifyContent:"center",alignItems:"flex-end"},children:[e.jsx(J,{title:"BUDGETED",style:{color:s.buttonNormalText}}),e.jsx(F,{binding:t==="report"?M.totalBudgetedExpense:U.totalBudgeted,type:"financial",style:{...g.smallText,color:s.buttonNormalText,textAlign:"right",fontWeight:"500"},formatter:G=>K(-parseFloat(G||"0"),"financial")})]})}),(w||R)&&e.jsx(q,{type:"bare",disabled:w,onClick:V,style:{...v,background:R&&!w?`linear-gradient(45deg, ${s.formInputBackgroundSelection} 8px, transparent 0)`:null},children:e.jsxs(c,{style:{width:90,justifyContent:"center",alignItems:"flex-end"},children:[e.jsx(J,{title:"SPENT",style:{color:s.formInputText}}),e.jsx(F,{binding:t==="report"?M.totalSpent:U.totalSpent,type:"financial",style:{...g.smallText,color:s.formInputText,textAlign:"right",fontWeight:"500"}})]})}),e.jsxs(c,{style:{width:90,justifyContent:"center",alignItems:"flex-end"},children:[e.jsx(J,{title:"BALANCE",style:{color:s.formInputText}}),e.jsx(F,{binding:t==="report"?M.totalLeftover:U.totalBalance,type:"financial",style:{...g.smallText,color:s.formInputText,textAlign:"right",fontWeight:"500"}})]})]}),e.jsx(ve,{onRefresh:_,children:i?e.jsx(c,{"data-testid":"budget-table",children:e.jsx(Te,{type:t,categoryGroups:n,showBudgetedCol:!R,show3Cols:w,showHiddenCategories:N,editMode:i,onEditGroup:O,onEditCategory:E,onSaveCategory:a,onDeleteCategory:C,onAddCategory:b,onAddGroup:m,onSaveGroup:p,onDeleteGroup:d,onReorderCategory:j,onReorderGroup:D,onOpenMonthActionMenu:k,onBudgetAction:P,pushModal:B})}):e.jsx(c,{"data-testid":"budget-table",style:{paddingBottom:Ee},children:e.jsx(Te,{type:t,categoryGroups:n,showBudgetedCol:!R,show3Cols:w,showHiddenCategories:N,month:r,editMode:i,onEditGroup:O,onEditCategory:E,onSaveCategory:a,onDeleteCategory:C,onAddCategory:b,onAddGroup:m,onSaveGroup:p,onDeleteGroup:d,onReorderCategory:j,onReorderGroup:D,onOpenMonthActionMenu:k,onBudgetAction:P,pushModal:B})})})]})})}function un({onEditMode:t,onToggleHiddenCategories:n,onSwitchBudgetType:r}){const o=Ae(),i=tt("reportBudget"),h=u=>{switch(o.close(),u){case"edit-mode":t?.(!0);break;case"toggle-hidden-categories":n?.();break;case"switch-budget-type":r?.();break;default:throw new Error(`Unrecognized menu option: ${u}`)}};return e.jsxs(e.Fragment,{children:[e.jsx(q,{type:"bare",style:{...g.noTapHighlight},hoveredStyle:{color:s.mobileHeaderText,background:s.mobileHeaderTextHover},...o.getOpenEvents(),children:e.jsx(nt,{width:"20",height:"20",style:{color:s.mobileHeaderText}})}),o.isOpen&&e.jsx(rt,{position:"bottom-right",width:250,style:{padding:0},onClose:o.close,children:e.jsx(ot,{onMenuSelect:h,items:[{name:"toggle-hidden-categories",text:"Toggle hidden categories"},i&&{name:"switch-budget-type",text:"Switch budget type"}]})})]})}function gn({month:t,monthBounds:n,onPrevMonth:r,onNextMonth:o}){const i=t>n.start,h=t<ke(n.end,1),u={padding:10,margin:2};return e.jsxs(c,{style:{flex:1,justifyContent:"center",alignItems:"center",flexDirection:"row"},children:[e.jsx(q,{type:"bare",onClick:i&&r,style:{...g.noTapHighlight,...u,opacity:i?1:.6,color:s.mobileHeaderText},hoveredStyle:{color:s.mobileHeaderText,background:s.mobileHeaderTextHover},children:e.jsx(Ut,{width:"15",height:"15",style:{margin:-5}})}),e.jsx(te,{style:{color:s.mobileHeaderText,textAlign:"center",fontSize:16,fontWeight:500},children:it(t,"MMMM ''yy")}),e.jsx(q,{type:"bare",onClick:h&&o,style:{...g.noTapHighlight,...u,opacity:h?1:.6,color:s.mobileHeaderText},hoveredStyle:{color:s.mobileHeaderText,background:s.mobileHeaderTextHover},children:e.jsx(st,{width:"15",height:"15",style:{margin:-5}})})]})}function fn(t){const{categoryGroups:n,categories:r,loadPrefs:o,budgetType:i,spreadsheet:h,applyBudgetAction:u,collapseModals:p,pushModal:d,createGroup:m,updateGroup:b,deleteGroup:a,moveCategoryGroup:C,createCategory:f,updateCategory:j,deleteCategory:D,moveCategory:I}=t,k=Be(),[P,_]=y.useState({start:k,end:k}),[L,B]=y.useState(k),[O,E]=y.useState(!1),[A,w]=y.useState(!1),[K]=ee("numberFormat"),R=K||"comma-dot",[Y=!1]=ee("hideFraction");y.useEffect(()=>{async function l(){const{start:S,end:H}=await ue("get-budget-bounds");_({start:S,end:H}),await he(t.budgetType,t.spreadsheet,L),E(!0)}l();const T=De("sync-event",({type:S,tables:H})=>{S==="success"&&(H.includes("categories")||H.includes("category_mapping")||H.includes("category_groups"))&&t.getCategories()});return()=>T()},[]);const N=()=>{i==="report"?d("report-budget-summary",{month:L}):d("rollover-budget-summary",{month:L,onBudgetAction:u})},Q=()=>{d("new-category-group",{onValidate:l=>l?null:"Name is required.",onSubmit:async l=>{await m(l)}})},V=(l,T)=>{d("new-category",{onValidate:S=>S?null:"Name is required.",onSubmit:async S=>{p("category-group-menu"),await f(S,l,T,!1)}})},v=l=>{b(l)},W=async l=>{const T=n?.find(H=>H.id===l);if(!T)return;let S=!1;for(const H of T.categories??[])if(await ue("must-category-transfer",{id:H.id})){S=!0;break}S?d("confirm-category-delete",{group:l,onDelete:H=>{p("category-group-menu"),a(l,H)}}):(p("category-group-menu"),a(l))},X=l=>{j(l)},G=async l=>{await ue("must-category-transfer",{id:l})?d("confirm-category-delete",{category:l,onDelete:S=>{l!==S&&(p("category-menu"),D(l,S))}}):(p("category-menu"),D(l))},ae=(l,{inGroup:T,aroundCategory:S})=>{let H,le;if(T)H=T;else if(S){const{id:Qe,position:qe}=S;let ce=Qe;const oe=n.find(de=>de.categories?.find(fe=>fe.id===ce));if(qe==="bottom"){const de=oe?.categories?.findIndex(fe=>fe.id===ce)??-1;ce=oe?.categories&&de<oe.categories.length-1?oe.categories[de+1].id:null}H=oe?.id,le=ce}I(l,H,le)},ne=(l,T,S)=>{if(S==="bottom"){const H=n.findIndex(le=>le.id===T);T=H<n.length-1?n[H+1].id:null}C(l,T)},x=async()=>{const l=await t.sync();return l?.error?"error":l?"updated":null},Z=async()=>{const l=ke(L,1);await he(i,h,l),B(l),E(!0)},Ge=async()=>{const l=ht(L,1);await he(i,h,l),B(l),E(!0)},$e=async()=>{E(!1),await mt(i==="rollover"?"report":"rollover",h,P,L,()=>o()),E(!0)},je=async(l,T)=>{await ue("notes-save",{id:l,note:T})},Oe=l=>{const T=n.find(S=>S.id===l);d("notes",{id:l,name:T.name,onSave:je})},Ve=l=>{const T=r.find(S=>S.id===l);d("notes",{id:l,name:T.name,onSave:je})},Ue=l=>{const T=n.find(S=>S.id===l);d("category-group-menu",{groupId:T.id,onSave:v,onAddCategory:V,onEditNotes:Oe,onDelete:W})},Ye=l=>{const T=r.find(S=>S.id===l);d("category-menu",{categoryId:T.id,onSave:X,onEditNotes:Ve,onDelete:G})};return!n||!O?e.jsx(c,{style:{flex:1,backgroundColor:s.mobilePageBackground,alignItems:"center",justifyContent:"center",marginBottom:25},children:e.jsx(ft,{width:25,height:25})}):e.jsx(Yt,{onSync:async()=>{await x()},children:({onRefresh:l})=>e.jsx(dn,{categoryGroups:n,type:i,month:L,monthBounds:P,editMode:A,onEditMode:T=>w(T),onShowBudgetSummary:N,onPrevMonth:Z,onNextMonth:Ge,onSaveGroup:v,onDeleteGroup:W,onAddGroup:Q,onAddCategory:V,onSaveCategory:X,onDeleteCategory:G,onReorderCategory:ae,onReorderGroup:ne,onOpenMonthActionMenu:()=>{},onBudgetAction:u,onRefresh:l,onSwitchBudgetType:$e,pushModal:d,onEditGroup:Ue,onEditCategory:Ye},`${R}${Y}`)})}function Tn(){const{list:t,grouped:n}=xe(),[r]=ee("budgetType"),o=r||"rollover",i=_e(),h=gt();return ye(s.mobileViewTheme),e.jsx(fn,{categoryGroups:n,categories:t,budgetType:o,...i,spreadsheet:h})}function Se({name:t,amount:n,style:r={}}){return e.jsxs(c,{style:{flex:1,flexDirection:"row",marginTop:10,marginRight:10,color:s.pageTextLight,width:"100%",...r},children:[e.jsx(c,{style:{flex:1},children:e.jsx(te,{style:{...g.text,textTransform:"uppercase",fontSize:13},"data-testid":"name",children:t})}),e.jsx(F,{binding:n,style:{...g.text,fontSize:13},type:"financial"})]})}function Ce({account:t,updated:n,getBalanceQuery:r,onSelect:o}){return e.jsx(c,{style:{flex:1,flexDirection:"row",backgroundColor:s.tableBackground,boxShadow:`0 1px 1px ${s.mobileAccountShadow}`,borderRadius:6,marginTop:10,marginRight:10,width:"100%"},"data-testid":"account",children:e.jsxs(q,{onMouseDown:()=>o(t.id),style:{flexDirection:"row",border:"1px solid "+s.pillBorder,flex:1,alignItems:"center",borderRadius:6,"&:active":{opacity:.1}},children:[e.jsx(c,{style:{flex:1,margin:"10px 0"},children:e.jsxs(c,{style:{flexDirection:"row",alignItems:"center"},children:[e.jsx(vt,{style:{...g.text,fontSize:17,fontWeight:600,color:n?s.mobileAccountText:s.pillText,paddingRight:30},"data-testid":"account-name",children:t.name}),t.bankId&&e.jsx(c,{style:{backgroundColor:s.noticeBackgroundDark,marginLeft:"-23px",width:8,height:8,borderRadius:8}})]})}),e.jsx(F,{binding:r(t),type:"financial",style:{fontSize:16,color:"inherit"},getStyle:i=>i<0&&{color:"inherit"},"data-testid":"account-balance"})]})})}function hn(){return e.jsx(c,{style:{flex:1,padding:30},children:e.jsx(te,{style:g.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."})})}function mn({accounts:t,updatedAccounts:n,getBalanceQuery:r,getOnBudgetBalance:o,getOffBudgetBalance:i,onAddAccount:h,onSelectAccount:u,onSync:p}){const d=t.filter(a=>a.offbudget===0),m=t.filter(a=>a.offbudget===1),b={backgroundColor:"transparent",color:"white"};return e.jsxs(pe,{title:"Accounts",headerRightContent:e.jsx(q,{type:"bare",style:{...b,margin:10},activeStyle:b,hoveredStyle:b,onClick:h,children:e.jsx(Pe,{width:20,height:20})}),padding:0,style:{flex:1,backgroundColor:s.mobilePageBackground,paddingBottom:Ee},children:[t.length===0&&e.jsx(hn,{}),e.jsx(ve,{onRefresh:p,children:e.jsxs(c,{style:{margin:10},children:[d.length>0&&e.jsx(Se,{name:"For Budget",amount:o()}),d.map(a=>e.jsx(Ce,{account:a,updated:n.includes(a.id),getBalanceQuery:r,onSelect:u},a.id)),m.length>0&&e.jsx(Se,{name:"Off budget",amount:i(),style:{marginTop:30}}),m.map(a=>e.jsx(Ce,{account:a,updated:n.includes(a.id),getBalanceQuery:r,onSelect:u},a.id))]})})]})}function Sn(){const t=Le(),n=He(),r=me(j=>j.queries.newTransactions),o=me(j=>j.queries.updatedAccounts),[i]=ee("numberFormat"),h=i||"comma-dot",[u=!1]=ee("hideFraction"),{list:p}=xe(),d=y.useState({}),m=Fe(),b=j=>{m(`/accounts/${j}`)},a=j=>{m(`/transaction/${j}`)},C=()=>{t(yt("add-account"))},f=()=>{t(bt())};return ye(s.mobileViewTheme),e.jsx(c,{style:{flex:1},children:e.jsx(mn,{accounts:n.filter(j=>!j.closed),categories:p,transactions:d||[],updatedAccounts:o,newTransactions:r,getBalanceQuery:Me,getOnBudgetBalance:pt,getOffBudgetBalance:xt,onAddAccount:C,onSelectAccount:b,onSelectTransaction:a,onSync:f},h+u)})}function pn({accountName:t,onSearch:n}){const[r,o]=y.useState("");return e.jsx(c,{style:{flexDirection:"row",alignItems:"center",backgroundColor:s.mobilePageBackground,margin:"11px auto 4px",padding:10,width:"100%"},children:e.jsx(Tt,{leftContent:e.jsx(St,{style:{width:13,height:13,flexShrink:0,color:r?s.formInputTextHighlight:"inherit",margin:5,marginRight:0}}),value:r,onUpdate:i=>{o(i),n(i)},placeholder:`Search ${t}`,style:{backgroundColor:s.tableBackground,border:`1px solid ${s.formInputBorder}`,fontSize:15,flex:1,height:32,marginLeft:4,padding:8}})})}function xn({account:t,prependTransactions:n,transactions:r,accounts:o,categories:i,payees:h,balance:u,balanceCleared:p,balanceUncleared:d,isNewTransaction:m,onLoadMore:b,onSearch:a,onSelectTransaction:C,pushModal:f}){const j=y.useMemo(()=>n.concat(r),[n,r]),{syncAndDownload:D}=_e(),I=async()=>{await D(t.id)};return e.jsxs(pe,{title:t.name,headerLeftContent:e.jsx(jt,{}),headerRightContent:e.jsx(Vt,{to:"transactions/new",type:"bare","aria-label":"Add Transaction",style:{justifyContent:"center",color:s.mobileHeaderText,margin:10},hoveredStyle:{color:s.mobileHeaderText,background:s.mobileHeaderTextHover},activeStyle:{background:"transparent"},children:e.jsx(Pe,{width:20,height:20})}),padding:0,style:{flex:1,backgroundColor:s.mobilePageBackground},children:[e.jsxs(c,{style:{alignItems:"center",flexShrink:0,marginTop:10},children:[e.jsxs(c,{style:{flexDirection:"row",boxSizing:"content-box",width:"100%",justifyContent:"space-evenly"},children:[e.jsxs(c,{style:{visibility:ie(d)===0?"hidden":"visible",width:"33%"},children:[e.jsx(J,{title:"CLEARED",style:{textAlign:"center",fontSize:12}}),e.jsx(F,{binding:p,type:"financial",style:{fontSize:12,textAlign:"center",fontWeight:"500"},"data-testid":"account-balance-cleared"})]}),e.jsxs(c,{style:{width:"33%"},children:[e.jsx(J,{title:"BALANCE",style:{textAlign:"center"}}),e.jsx(F,{binding:u,type:"financial",style:{fontSize:18,textAlign:"center",fontWeight:"500"},getStyle:k=>({color:k<0?s.errorText:s.pillTextHighlighted}),"data-testid":"account-balance"})]}),e.jsxs(c,{style:{visibility:ie(d)===0?"hidden":"visible",width:"33%"},children:[e.jsx(J,{title:"UNCLEARED",style:{textAlign:"center",fontSize:12}}),e.jsx(F,{binding:d,type:"financial",style:{fontSize:12,textAlign:"center",fontWeight:"500"},"data-testid":"account-balance-uncleared"})]})]}),e.jsx(pn,{accountName:t.name,onSearch:a})]}),e.jsx(ve,{onRefresh:I,children:e.jsx(wt,{account:t,transactions:j,categories:i,accounts:o,payees:h,isNew:m,onLoadMore:b,onSelect:C,pushModal:f})})]})}const yn=Ie((t,n)=>{let r=Ft(t,"_account");return n&&(r={id:null}),o=>(o=o.filter({$and:[r,{"_account.closed":!1}]}),o.orderBy({next_date:"desc"}))});function bn({children:t}){const n=Mt();if(n==null)return t(null);const r=n.schedules.filter(o=>!o.completed&&["due","upcoming","missed"].includes(n.statuses.get(o.id)));return t(r.map(o=>({id:"preview/"+o.id,payee:o._payee,account:o._account,amount:o._amount,date:o.next_date,notes:n.statuses.get(o.id),schedule:o.id})))}let re;function Cn(t){const n=He(),r=Ct(),o=Fe(),[i,h]=y.useState([]),[u,p]=y.useState(""),[d,m]=y.useState(),b=me(v=>v.queries.newTransactions),a=Bt(),C=Et()||"MM/dd/yyyy",[f]=ee("numberFormat"),j=f||"comma-dot",[D=!1]=ee("hideFraction"),I={payees:r,newTransactions:b,prefs:a,dateFormat:C},k=Le(),P=y.useMemo(()=>At(kt,k),[k]),{id:_}=It(),L=()=>zt(_),B=v=>{re&&re.unsubscribe(),re=Pt(v.options({splits:"grouped"}).select("*"),W=>h(W),{pageCount:150,mapper:Wt})},O=async()=>{const v=L();m(v),B(v)};y.useEffect(()=>{let v;async function W(){v=De("sync-event",({type:X,tables:G})=>{X==="applied"&&((G.includes("transactions")||G.includes("category_mapping")||G.includes("payee_mapping"))&&re?.run(),(G.includes("payees")||G.includes("payee_mapping"))&&P.getPayees())}),await O(),P.markAccountRead(_)}return W(),()=>v()},[]);const E=xe(),A=Rt(()=>{u===""&&d?B(d):u&&d&&B(_t(d,u,I.dateFormat))},150);if(y.useEffect(A,[u,d,I.dateFormat]),ye(s.mobileViewTheme),!n||!n.length)return null;if(_==="budgeted"||_==="offbudget"||_==="uncategorized")return e.jsxs(c,{style:{flex:1,padding:30},children:[e.jsx(te,{style:{textAlign:"center"},children:"There is no Mobile View at the moment"}),e.jsx(q,{type:"normal",style:{fontSize:15,marginLeft:10,marginTop:10},onClick:()=>o("/accounts"),children:"Go back to Mobile Accounts"})]});const w=n.find(v=>v.id===_),K=v=>I.newTransactions.includes(v),R=async v=>{re.unsubscribe(),p(v)},Y=v=>{Nt(v.id)||o(`transactions/${v.id}`)},N=Me(w),Q=Dt(w),V=Lt(w);return e.jsx(Ht,{transform:yn(_,u!==""),children:e.jsx(bn,{accountId:t.accountId,children:v=>v==null?null:y.createElement(xn,{...I,...P,key:j+D,account:w,accounts:n,categories:E.list,payees:I.payees,transactions:i,prependTransactions:v||[],balance:N,balanceCleared:Q,balanceUncleared:V,isNewTransaction:K,onLoadMore:()=>{re?.fetchNext()},onSearch:R,onSelectTransaction:Y})})})}export{Cn as Account,Sn as Accounts,Tn as Budget};
|
|
108
|
-
//# sourceMappingURL=narrow.BvCotSUP.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"narrow.BvCotSUP.chunk.js","sources":["../../../src/icons/v1/ArrowThinLeft.tsx","../../../src/components/SyncRefresh.tsx","../../../src/components/common/Card.tsx","../../../src/components/common/Label.tsx","../../../../../node_modules/react-simple-pull-to-refresh/build/index.esm.js","../../../src/components/responsive/PullToRefresh.tsx","../../../src/components/budget/MobileTable.tsx","../../../src/components/budget/MobileBudgetTable.jsx","../../../src/components/budget/MobileBudget.tsx","../../../src/components/accounts/MobileAccounts.jsx","../../../src/components/accounts/MobileAccountDetails.jsx","../../../src/components/accounts/MobileAccount.jsx"],"sourcesContent":["import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowThinLeft = (props: SVGProps<SVGSVGElement>) => (\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);\n","import React, { 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 function SyncRefresh({ onSync, children }: SyncRefreshProps) {\n const [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 { type ComponentProps, forwardRef } from 'react';\n\nimport { theme } from '../../style';\n\nimport { View } from './View';\n\ntype CardProps = ComponentProps<typeof View>;\n\nexport const 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\nCard.displayName = '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 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, { 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 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, { 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, { memo, useRef, useState } from 'react';\n\nimport memoizeOne from 'memoize-one';\n\nimport { rolloverBudget, reportBudget } from 'loot-core/src/client/queries';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { useFeatureFlag } from '../../hooks/useFeatureFlag';\nimport { useLocalPref } from '../../hooks/useLocalPref';\nimport {\n SingleActiveEditFormProvider,\n useSingleActiveEditForm,\n} from '../../hooks/useSingleActiveEditForm';\nimport {\n SvgArrowThinLeft,\n SvgArrowThinRight,\n SvgDotsHorizontalTriple,\n} from '../../icons/v1';\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 { Menu } from '../common/Menu';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { ROW_HEIGHT as MOBILE_NAV_HEIGHT } from '../mobile/MobileNavTabs';\nimport { Page } from '../Page';\nimport { PullToRefresh } from '../responsive/PullToRefresh';\nimport { CellValue } from '../spreadsheet/CellValue';\nimport { NamespaceContext } from '../spreadsheet/NamespaceContext';\nimport { useFormat } from '../spreadsheet/useFormat';\nimport { useSheetValue } from '../spreadsheet/useSheetValue';\nimport { Tooltip, useTooltip } from '../tooltips';\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 { BalanceWithCarryover } from './BalanceWithCarryover';\nimport { ListItem, ROW_HEIGHT } from './MobileTable';\nimport { BalanceTooltip as ReportBudgetBalanceTooltip } from './report/BalanceTooltip';\nimport { BalanceTooltip as RolloverBudgetBalanceTooltip } from './rollover/BalanceTooltip';\nimport { makeAmountGrey } from './util';\n\nfunction ToBudget({ toBudget, onClick }) {\n const amount = useSheetValue(toBudget);\n return (\n <Button\n type=\"bare\"\n style={{ flexDirection: 'column', alignItems: 'flex-start' }}\n onClick={onClick}\n >\n <Label\n title={amount < 0 ? 'OVERBUDGETED' : 'TO BUDGET'}\n style={{\n ...styles.underlinedText,\n color: theme.formInputText,\n flexShrink: 0,\n textAlign: 'left',\n }}\n />\n <CellValue\n binding={toBudget}\n type=\"financial\"\n style={{\n ...styles.smallText,\n fontWeight: '500',\n color: amount < 0 ? theme.errorText : theme.formInputText,\n }}\n />\n </Button>\n );\n}\n\nfunction Saved({ projected, onClick }) {\n const binding = projected\n ? reportBudget.totalBudgetedSaved\n : reportBudget.totalSaved;\n\n const saved = useSheetValue(binding) || 0;\n const isNegative = saved < 0;\n\n return (\n <Button\n type=\"bare\"\n style={{\n flexDirection: 'column',\n alignItems: 'flex-start',\n }}\n onClick={onClick}\n >\n {projected ? (\n <Label\n title=\"PROJECTED SAVINGS\"\n style={{\n ...styles.underlinedText,\n color: theme.formInputText,\n textAlign: 'left',\n fontSize: 9,\n }}\n />\n ) : (\n <Label\n title={isNegative ? 'OVERSPENT' : 'SAVED'}\n style={{\n ...styles.underlinedText,\n color: theme.formInputText,\n textAlign: 'left',\n }}\n />\n )}\n\n <CellValue\n binding={binding}\n type=\"financial\"\n style={{\n ...styles.smallText,\n fontWeight: '500',\n color: projected\n ? theme.warningText\n : isNegative\n ? theme.errorTextDark\n : theme.formInputText,\n }}\n />\n </Button>\n );\n}\n\nfunction BudgetCell({\n name,\n binding,\n style,\n textStyle,\n categoryId,\n month,\n onBudgetAction,\n onEdit,\n onBlur,\n isEditing,\n}) {\n const sheetValue = useSheetValue(binding);\n\n function updateBudgetAmount(amount) {\n onBudgetAction?.(month, 'budget-amount', {\n category: categoryId,\n amount,\n });\n }\n\n function onAmountClick() {\n onEdit?.();\n }\n\n return (\n <View style={style}>\n <AmountInput\n value={sheetValue}\n zeroSign=\"+\"\n style={{\n ...(!isEditing && { display: 'none' }),\n height: ROW_HEIGHT,\n transform: 'translateX(6px)',\n }}\n focused={isEditing}\n textStyle={{ ...styles.smallText, ...textStyle }}\n onUpdate={updateBudgetAmount}\n onBlur={onBlur}\n />\n <View\n role=\"button\"\n style={{\n ...(isEditing && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'flex-end',\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={binding}\n type=\"financial\"\n style={{\n ...styles.smallText,\n ...textStyle,\n ...styles.underlinedText,\n }}\n getStyle={makeAmountGrey}\n data-testid={name}\n onPointerUp={onAmountClick}\n onPointerDown={e => e.preventDefault()}\n />\n </View>\n </View>\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction ExpenseGroupPreview({ group, pending, style }) {\n return (\n <Card\n style={{\n marginTop: 7,\n marginBottom: 7,\n opacity: pending ? 1 : 0.4,\n }}\n >\n <ExpenseGroupTotals group={group} blank={true} />\n\n {group.categories.map((cat, index) => (\n <ExpenseCategory\n key={cat.id}\n category={cat}\n blank={true}\n index={index}\n />\n ))}\n </Card>\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction ExpenseCategoryPreview({ name, pending, style }) {\n return (\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 );\n}\n\nconst ExpenseCategory = memo(function ExpenseCategory({\n type,\n category,\n goal,\n budgeted,\n spent,\n balance,\n carryover,\n index,\n // gestures,\n blank,\n style,\n month,\n onEdit,\n onBudgetAction,\n show3Cols,\n showBudgetedCol,\n}) {\n const opacity = blank ? 0 : 1;\n const balanceTooltip = useTooltip();\n\n const [isEditingBudget, setIsEditingBudget] = useState(false);\n const { onRequestActiveEdit, onClearActiveEdit } = useSingleActiveEditForm();\n\n const onEditBudget = () => {\n onRequestActiveEdit(`${category.id}-budget`, () => {\n setIsEditingBudget(true);\n return () => setIsEditingBudget(false);\n });\n };\n\n const onOpenBalanceActionMenu = () => {\n onRequestActiveEdit(`${category.id}-balance`, () => {\n balanceTooltip.open();\n return () => balanceTooltip.close();\n });\n };\n\n const listItemRef = useRef();\n\n const _onBudgetAction = (monthIndex, action, arg) => {\n onBudgetAction?.(\n monthUtils.getMonthFromIndex(monthUtils.getYear(month), monthIndex),\n action,\n arg,\n );\n };\n\n const content = (\n <ListItem\n style={{\n backgroundColor: 'transparent',\n borderBottomWidth: 0,\n borderTopWidth: index > 0 ? 1 : 0,\n opacity: !!category.hidden ? 0.5 : undefined,\n ...style,\n }}\n data-testid=\"row\"\n innerRef={listItemRef}\n >\n <View role=\"button\" style={{ flex: 1 }}>\n <Text\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n }}\n onClick={() => onEdit?.(category.id)}\n data-testid=\"category-name\"\n >\n {category.name}\n </Text>\n </View>\n <View\n style={{\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'row',\n opacity,\n }}\n >\n <BudgetCell\n name=\"budgeted\"\n binding={budgeted}\n style={{\n ...(!show3Cols && !showBudgetedCol && { display: 'none' }),\n width: 90,\n }}\n textStyle={{ ...styles.smallText, textAlign: 'right' }}\n categoryId={category.id}\n month={month}\n onBudgetAction={onBudgetAction}\n isEditing={isEditingBudget}\n onEdit={onEditBudget}\n onBlur={onClearActiveEdit}\n />\n <View\n style={{\n ...(!show3Cols && showBudgetedCol && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n name=\"spent\"\n binding={spent}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n }}\n getStyle={makeAmountGrey}\n type=\"financial\"\n />\n </View>\n <View\n style={{\n ...styles.noTapHighlight,\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <span\n role=\"button\"\n onPointerUp={() => onOpenBalanceActionMenu?.()}\n onPointerDown={e => e.preventDefault()}\n >\n <BalanceWithCarryover\n carryover={carryover}\n balance={balance}\n goal={goal}\n budgeted={budgeted}\n balanceStyle={{\n ...styles.smallText,\n ...styles.underlinedText,\n }}\n />\n {balanceTooltip.isOpen &&\n (type === 'report' ? (\n <ReportBudgetBalanceTooltip\n offset={5}\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthUtils.getMonthIndex(month)}\n onBudgetAction={_onBudgetAction}\n onClose={() => {\n onClearActiveEdit();\n }}\n />\n ) : (\n <RolloverBudgetBalanceTooltip\n offset={5}\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthUtils.getMonthIndex(month)}\n onBudgetAction={_onBudgetAction}\n onClose={() => {\n onClearActiveEdit();\n }}\n />\n ))}\n </span>\n </View>\n </View>\n </ListItem>\n );\n\n return <View>{content}</View>;\n\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 // 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\nconst ExpenseGroupTotals = memo(function ExpenseGroupTotals({\n group,\n budgeted,\n spent,\n balance,\n editMode,\n onEdit,\n blank,\n show3Cols,\n showBudgetedCol,\n}) {\n const opacity = blank ? 0 : 1;\n const listItemRef = useRef();\n\n const content = (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: theme.tableRowHeaderBackground,\n opacity: !!group.hidden ? 0.5 : undefined,\n }}\n data-testid=\"totals\"\n innerRef={listItemRef}\n >\n <View role=\"button\" style={{ flex: 1 }}>\n <Text\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n fontWeight: '500',\n }}\n onClick={() => onEdit?.(group.id)}\n data-testid=\"name\"\n >\n {group.name}\n </Text>\n </View>\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n height: ROW_HEIGHT,\n opacity,\n }}\n >\n <View\n style={{\n ...(!show3Cols && !showBudgetedCol && { display: 'none' }),\n width: 90,\n height: ROW_HEIGHT,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <CellValue\n binding={budgeted}\n style={{\n ...styles.smallText,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n <View\n style={{\n ...(!show3Cols && showBudgetedCol && { display: 'none' }),\n width: 90,\n height: ROW_HEIGHT,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <CellValue\n binding={spent}\n style={{\n ...styles.smallText,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n <View\n style={{\n width: 90,\n height: ROW_HEIGHT,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <CellValue\n binding={balance}\n style={{\n ...styles.smallText,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n </View>\n\n {/* {editMode && (\n <View>\n <Button\n onClick={() => onAddCategory(group.id, group.is_income)}\n style={{ padding: 10 }}\n >\n <Add width={15} height={15} />\n </Button>\n </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 // props.onReorderCategory(id, { inGroup: group.id })\n // }\n // >\n // {() => content}\n // </Droppable>\n});\n\nconst IncomeGroupTotals = memo(function IncomeGroupTotals({\n group,\n budgeted,\n balance,\n style,\n onEdit,\n}) {\n const listItemRef = useRef();\n\n return (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 10,\n backgroundColor: theme.tableRowHeaderBackground,\n opacity: !!group.hidden ? 0.5 : undefined,\n ...style,\n }}\n innerRef={listItemRef}\n >\n <View\n role=\"button\"\n style={{\n flex: 1,\n justifyContent: 'center',\n alignItems: 'flex-start',\n height: ROW_HEIGHT,\n }}\n >\n <Text\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n fontWeight: '500',\n }}\n onClick={() => onEdit?.(group.id)}\n data-testid=\"name\"\n >\n {group.name}\n </Text>\n </View>\n {budgeted && (\n <View\n style={{\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={budgeted}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n type=\"financial\"\n />\n </View>\n )}\n <View\n style={{\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={balance}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n type=\"financial\"\n />\n </View>\n </ListItem>\n );\n});\n\nconst IncomeCategory = memo(function IncomeCategory({\n index,\n category,\n budgeted,\n balance,\n month,\n style,\n onEdit,\n onBudgetAction,\n isEditingBudget,\n onEditBudget,\n}) {\n const listItemRef = useRef();\n\n return (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 10,\n backgroundColor: 'transparent',\n borderBottomWidth: 0,\n borderTopWidth: index > 0 ? 1 : 0,\n opacity: !!category.hidden ? 0.5 : undefined,\n ...style,\n }}\n innerRef={listItemRef}\n >\n <View\n role=\"button\"\n style={{\n flex: 1,\n justifyContent: 'center',\n alignItems: 'flex-start',\n height: ROW_HEIGHT,\n }}\n >\n <Text\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n }}\n onClick={() => onEdit?.(category.id)}\n data-testid=\"name\"\n >\n {category.name}\n </Text>\n </View>\n {budgeted && (\n <View\n style={{\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <BudgetCell\n name=\"budgeted\"\n binding={budgeted}\n style={{\n width: 90,\n }}\n textStyle={{ ...styles.smallText, textAlign: 'right' }}\n categoryId={category.id}\n month={month}\n onBudgetAction={onBudgetAction}\n isEditing={isEditingBudget}\n onEdit={onEditBudget}\n />\n {/* <CellValue\n binding={budget}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n }}\n type=\"financial\"\n /> */}\n </View>\n )}\n <View\n style={{\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={balance}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n </ListItem>\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\nconst ExpenseGroup = memo(function ExpenseGroup({\n type,\n group,\n editMode,\n onEditGroup,\n onEditCategory,\n // gestures,\n month,\n // onReorderCategory,\n // onReorderGroup,\n onAddCategory,\n onBudgetAction,\n showBudgetedCol,\n show3Cols,\n showHiddenCategories,\n}) {\n function editable(content) {\n if (!editMode) {\n return content;\n }\n\n return content;\n // <Draggable\n // id={group.id}\n // type=\"group\"\n // preview={({ pending, style }) => (\n // <BudgetGroupPreview group={group} pending={pending} style={style} />\n // )}\n // gestures={gestures}\n // >\n // <Droppable\n // type=\"group\"\n // getActiveStatus={(x, y, { layout }, { id }) => {\n // let pos = (y - layout.y) / layout.height;\n // return pos < 0.5 ? 'top' : 'bottom';\n // }}\n // onDrop={(id, type, droppable, status) => {\n // onReorderGroup(id, group.id, status);\n // }}\n // >\n // {() => content}\n // </Droppable>\n // </Draggable>\n }\n\n return editable(\n <Card\n style={{\n marginTop: 7,\n marginBottom: 7,\n }}\n >\n <ExpenseGroupTotals\n group={group}\n showBudgetedCol={showBudgetedCol}\n budgeted={\n type === 'report'\n ? reportBudget.groupBudgeted(group.id)\n : rolloverBudget.groupBudgeted(group.id)\n }\n spent={\n type === 'report'\n ? reportBudget.groupSumAmount(group.id)\n : rolloverBudget.groupSumAmount(group.id)\n }\n balance={\n type === 'report'\n ? reportBudget.groupBalance(group.id)\n : rolloverBudget.groupBalance(group.id)\n }\n show3Cols={show3Cols}\n editMode={editMode}\n onAddCategory={onAddCategory}\n onEdit={onEditGroup}\n // onReorderCategory={onReorderCategory}\n />\n\n {group.categories\n .filter(category => !category.hidden || showHiddenCategories)\n .map((category, index) => {\n return (\n <ExpenseCategory\n key={category.id}\n index={index}\n show3Cols={show3Cols}\n type={type}\n category={category}\n goal={\n type === 'report'\n ? reportBudget.catGoal(category.id)\n : rolloverBudget.catGoal(category.id)\n }\n budgeted={\n type === 'report'\n ? reportBudget.catBudgeted(category.id)\n : rolloverBudget.catBudgeted(category.id)\n }\n spent={\n type === 'report'\n ? reportBudget.catSumAmount(category.id)\n : rolloverBudget.catSumAmount(category.id)\n }\n balance={\n type === 'report'\n ? reportBudget.catBalance(category.id)\n : rolloverBudget.catBalance(category.id)\n }\n carryover={\n type === 'report'\n ? reportBudget.catCarryover(category.id)\n : rolloverBudget.catCarryover(category.id)\n }\n style={{\n backgroundColor: theme.tableBackground,\n }}\n showBudgetedCol={showBudgetedCol}\n editMode={editMode}\n onEdit={onEditCategory}\n // gestures={gestures}\n month={month}\n // onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n />\n );\n })}\n </Card>,\n );\n});\n\nfunction IncomeGroup({\n type,\n group,\n month,\n onAddCategory,\n showHiddenCategories,\n editMode,\n onEditGroup,\n onEditCategory,\n editingBudgetCategoryId,\n onEditCategoryBudget,\n onBudgetAction,\n}) {\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' && <Label title=\"BUDGETED\" style={{ width: 90 }} />}\n <Label title=\"RECEIVED\" style={{ width: 90 }} />\n </View>\n\n <Card style={{ marginTop: 0 }}>\n <IncomeGroupTotals\n group={group}\n budgeted={\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 style={{\n backgroundColor: theme.tableRowHeaderBackground,\n }}\n onAddCategory={onAddCategory}\n editMode={editMode}\n onEdit={onEditGroup}\n />\n\n {group.categories\n .filter(category => !category.hidden || showHiddenCategories)\n .map((category, index) => {\n return (\n <IncomeCategory\n key={category.id}\n index={index}\n category={category}\n month={month}\n type={type}\n budgeted={\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 style={{\n backgroundColor: theme.tableBackground,\n }}\n editMode={editMode}\n onEdit={onEditCategory}\n onBudgetAction={onBudgetAction}\n isEditingBudget={editingBudgetCategoryId === category.id}\n onEditBudget={onEditCategoryBudget}\n />\n );\n })}\n </Card>\n </View>\n );\n}\n\nfunction BudgetGroups({\n type,\n categoryGroups,\n onEditGroup,\n onEditCategory,\n editMode,\n gestures,\n month,\n onSaveCategory,\n onDeleteCategory,\n onAddCategory,\n onAddGroup,\n onReorderCategory,\n onReorderGroup,\n onBudgetAction,\n showBudgetedCol,\n show3Cols,\n showHiddenCategories,\n pushModal,\n}) {\n const separateGroups = memoizeOne(groups => {\n return {\n incomeGroup: groups.find(group => group.is_income),\n expenseGroups: groups.filter(group => !group.is_income),\n };\n });\n\n const { incomeGroup, expenseGroups } = separateGroups(categoryGroups);\n\n return (\n <SingleActiveEditFormProvider formName=\"mobile-budget-table\">\n <View\n data-testid=\"budget-groups\"\n style={{ flex: '1 0 auto', overflowY: 'auto', paddingBottom: 15 }}\n >\n {expenseGroups\n .filter(group => !group.hidden || showHiddenCategories)\n .map(group => {\n return (\n <ExpenseGroup\n key={group.id}\n type={type}\n group={group}\n showBudgetedCol={showBudgetedCol}\n gestures={gestures}\n month={month}\n editMode={editMode}\n onEditGroup={onEditGroup}\n onEditCategory={onEditCategory}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n onAddCategory={onAddCategory}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onBudgetAction={onBudgetAction}\n show3Cols={show3Cols}\n showHiddenCategories={showHiddenCategories}\n pushModal={pushModal}\n />\n );\n })}\n\n <View\n style={{\n alignItems: 'flex-start',\n justifyContent: 'flex-start',\n }}\n >\n <Button onClick={onAddGroup} style={{ fontSize: 12, margin: 10 }}>\n Add Group\n </Button>\n </View>\n\n {incomeGroup && (\n <IncomeGroup\n type={type}\n group={incomeGroup}\n month={month}\n onAddCategory={onAddCategory}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n showHiddenCategories={showHiddenCategories}\n editMode={editMode}\n onEditGroup={onEditGroup}\n onEditCategory={onEditCategory}\n onBudgetAction={onBudgetAction}\n pushModal={pushModal}\n />\n )}\n </View>\n </SingleActiveEditFormProvider>\n );\n}\n\nexport function BudgetTable({\n type,\n categoryGroups,\n month,\n monthBounds,\n editMode,\n // refreshControl,\n onPrevMonth,\n onNextMonth,\n onSaveGroup,\n onDeleteGroup,\n onAddGroup,\n onAddCategory,\n onSaveCategory,\n onDeleteCategory,\n onEditMode,\n onReorderCategory,\n onReorderGroup,\n onShowBudgetSummary,\n onOpenMonthActionMenu,\n onBudgetAction,\n onRefresh,\n onSwitchBudgetType,\n pushModal,\n onEditGroup,\n onEditCategory,\n}) {\n const { width } = useResponsive();\n const show3Cols = width >= 360;\n\n // let editMode = false; // neuter editMode -- sorry, not rewriting drag-n-drop right now\n const format = useFormat();\n\n const [showSpentColumn = false, setShowSpentColumnPref] = useLocalPref(\n 'mobile.showSpentColumn',\n );\n\n const [showHiddenCategories = false, setShowHiddenCategoriesPref] =\n useLocalPref('budget.showHiddenCategories');\n\n function toggleDisplay() {\n setShowSpentColumnPref(!showSpentColumn);\n }\n\n const buttonStyle = {\n padding: 0,\n backgroundColor: 'transparent',\n borderRadius: 'unset',\n };\n\n const _onSwitchBudgetType = () => {\n pushModal('switch-budget-type', {\n onSwitch: onSwitchBudgetType,\n });\n };\n\n const onToggleHiddenCategories = () => {\n setShowHiddenCategoriesPref(!showHiddenCategories);\n };\n\n return (\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month, type)}>\n <Page\n padding={0}\n title={\n <MonthSelector\n month={month}\n monthBounds={monthBounds}\n onPrevMonth={onPrevMonth}\n onNextMonth={onNextMonth}\n />\n }\n headerRightContent={\n !editMode ? (\n <BudgetPageMenu\n onEditMode={onEditMode}\n onToggleHiddenCategories={onToggleHiddenCategories}\n onSwitchBudgetType={_onSwitchBudgetType}\n />\n ) : (\n <Button\n type=\"bare\"\n hoveredStyle={{\n color: theme.mobileHeaderText,\n background: theme.mobileHeaderTextHover,\n }}\n style={{\n ...styles.noTapHighlight,\n ...styles.text,\n backgroundColor: 'transparent',\n color: theme.mobileHeaderText,\n }}\n onClick={() => onEditMode?.(false)}\n >\n Done\n </Button>\n )\n }\n style={{ flex: 1 }}\n >\n <View\n style={{\n flexDirection: 'row',\n flexShrink: 0,\n padding: 10,\n paddingRight: 14,\n backgroundColor: theme.tableRowHeaderBackground,\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\n }}\n >\n {type === 'report' ? (\n <Saved\n projected={month >= monthUtils.currentMonth()}\n onClick={onShowBudgetSummary}\n />\n ) : (\n <ToBudget\n toBudget={rolloverBudget.toBudget}\n onClick={onShowBudgetSummary}\n />\n )}\n <View style={{ flex: 1 }} />\n {(show3Cols || !showSpentColumn) && (\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 !showSpentColumn && !show3Cols\n ? `linear-gradient(-45deg, ${theme.formInputBackgroundSelection} 8px, transparent 0)`\n : null,\n }}\n >\n <View\n style={{\n flexBasis: 90,\n width: 90,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <Label\n title=\"BUDGETED\"\n style={{ color: theme.buttonNormalText }}\n />\n <CellValue\n binding={\n type === 'report'\n ? reportBudget.totalBudgetedExpense\n : rolloverBudget.totalBudgeted\n }\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 </Button>\n )}\n {(show3Cols || showSpentColumn) && (\n <Button\n type=\"bare\"\n disabled={show3Cols}\n onClick={toggleDisplay}\n style={{\n ...buttonStyle,\n background:\n showSpentColumn && !show3Cols\n ? `linear-gradient(45deg, ${theme.formInputBackgroundSelection} 8px, transparent 0)`\n : null,\n }}\n >\n <View\n style={{\n width: 90,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <Label title=\"SPENT\" style={{ color: theme.formInputText }} />\n <CellValue\n binding={\n type === 'report'\n ? reportBudget.totalSpent\n : rolloverBudget.totalSpent\n }\n type=\"financial\"\n style={{\n ...styles.smallText,\n color: theme.formInputText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n />\n </View>\n </Button>\n )}\n <View\n style={{\n width: 90,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <Label title=\"BALANCE\" style={{ color: theme.formInputText }} />\n <CellValue\n binding={\n type === 'report'\n ? reportBudget.totalLeftover\n : rolloverBudget.totalBalance\n }\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 <PullToRefresh onRefresh={onRefresh}>\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 data-testid=\"budget-table\"\n style={{\n paddingBottom: MOBILE_NAV_HEIGHT,\n }}\n >\n <BudgetGroups\n type={type}\n categoryGroups={categoryGroups}\n showBudgetedCol={!showSpentColumn}\n show3Cols={show3Cols}\n showHiddenCategories={showHiddenCategories}\n // gestures={gestures}\n month={month}\n editMode={editMode}\n onEditGroup={onEditGroup}\n onEditCategory={onEditCategory}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n onAddCategory={onAddCategory}\n onAddGroup={onAddGroup}\n onSaveGroup={onSaveGroup}\n onDeleteGroup={onDeleteGroup}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onOpenMonthActionMenu={onOpenMonthActionMenu}\n onBudgetAction={onBudgetAction}\n pushModal={pushModal}\n />\n </View>\n ) : (\n // </ScrollView>\n // <DragDrop>\n // {({\n // dragging,\n // onGestureEvent,\n // onHandlerStateChange,\n // scrollRef,\n // onScroll\n // }) => (\n <View data-testid=\"budget-table\">\n <BudgetGroups\n type={type}\n categoryGroups={categoryGroups}\n showBudgetedCol={!showSpentColumn}\n show3Cols={show3Cols}\n showHiddenCategories={showHiddenCategories}\n // gestures={gestures}\n editMode={editMode}\n onEditGroup={onEditGroup}\n onEditCategory={onEditCategory}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n onAddCategory={onAddCategory}\n onAddGroup={onAddGroup}\n onSaveGroup={onSaveGroup}\n onDeleteGroup={onDeleteGroup}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onOpenMonthActionMenu={onOpenMonthActionMenu}\n onBudgetAction={onBudgetAction}\n pushModal={pushModal}\n />\n </View>\n\n // <DragDropHighlight />\n // </DragDrop>\n )}\n </PullToRefresh>\n </Page>\n </NamespaceContext.Provider>\n );\n}\n\nfunction BudgetPageMenu({\n onEditMode,\n onToggleHiddenCategories,\n onSwitchBudgetType,\n}) {\n const tooltip = useTooltip();\n const isReportBudgetEnabled = useFeatureFlag('reportBudget');\n\n const onMenuSelect = name => {\n tooltip.close();\n switch (name) {\n case 'edit-mode':\n onEditMode?.(true);\n break;\n case 'toggle-hidden-categories':\n onToggleHiddenCategories?.();\n break;\n case 'switch-budget-type':\n onSwitchBudgetType?.();\n break;\n default:\n throw new Error(`Unrecognized menu option: ${name}`);\n }\n };\n\n return (\n <>\n <Button\n type=\"bare\"\n style={{\n ...styles.noTapHighlight,\n }}\n hoveredStyle={{\n color: theme.mobileHeaderText,\n background: theme.mobileHeaderTextHover,\n }}\n {...tooltip.getOpenEvents()}\n >\n <SvgDotsHorizontalTriple\n width=\"20\"\n height=\"20\"\n style={{ color: theme.mobileHeaderText }}\n />\n </Button>\n {tooltip.isOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={250}\n style={{ padding: 0 }}\n onClose={tooltip.close}\n >\n <Menu\n onMenuSelect={onMenuSelect}\n items={[\n // Removing for now until we work on mobile category drag and drop.\n // { name: 'edit-mode', text: 'Edit mode' },\n {\n name: 'toggle-hidden-categories',\n text: 'Toggle hidden categories',\n },\n isReportBudgetEnabled && {\n name: 'switch-budget-type',\n text: 'Switch budget type',\n },\n ]}\n />\n </Tooltip>\n )}\n </>\n );\n}\n\nfunction MonthSelector({ month, monthBounds, onPrevMonth, onNextMonth }) {\n const prevEnabled = month > monthBounds.start;\n const nextEnabled = month < monthUtils.subMonths(monthBounds.end, 1);\n\n const arrowButtonStyle = {\n padding: 10,\n margin: 2,\n };\n\n return (\n <View\n style={{\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'row',\n }}\n >\n <Button\n type=\"bare\"\n onClick={prevEnabled && onPrevMonth}\n style={{\n ...styles.noTapHighlight,\n ...arrowButtonStyle,\n opacity: prevEnabled ? 1 : 0.6,\n color: theme.mobileHeaderText,\n }}\n hoveredStyle={{\n color: theme.mobileHeaderText,\n background: theme.mobileHeaderTextHover,\n }}\n >\n <SvgArrowThinLeft width=\"15\" height=\"15\" style={{ margin: -5 }} />\n </Button>\n <Text\n style={{\n color: theme.mobileHeaderText,\n textAlign: 'center',\n fontSize: 16,\n fontWeight: 500,\n }}\n >\n {/* eslint-disable-next-line rulesdir/typography */}\n {monthUtils.format(month, \"MMMM ''yy\")}\n </Text>\n <Button\n type=\"bare\"\n onClick={nextEnabled && onNextMonth}\n style={{\n ...styles.noTapHighlight,\n ...arrowButtonStyle,\n opacity: nextEnabled ? 1 : 0.6,\n color: theme.mobileHeaderText,\n }}\n hoveredStyle={{\n color: theme.mobileHeaderText,\n background: theme.mobileHeaderTextHover,\n }}\n >\n <SvgArrowThinRight width=\"15\" height=\"15\" style={{ margin: -5 }} />\n </Button>\n </View>\n );\n}\n","// @ts-strict-ignore\nimport React, { useEffect, useState } from 'react';\n\nimport { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport {\n type CategoryEntity,\n type CategoryGroupEntity,\n} from 'loot-core/src/types/models';\n\nimport { type BoundActions, useActions } from '../../hooks/useActions';\nimport { useCategories } from '../../hooks/useCategories';\nimport { useLocalPref } from '../../hooks/useLocalPref';\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';\nimport { prewarmMonth, switchBudgetType } from './util';\n\ntype BudgetInnerProps = {\n categories: CategoryEntity[];\n categoryGroups: CategoryGroupEntity[];\n loadPrefs: BoundActions['loadPrefs'];\n savePrefs: BoundActions['savePrefs'];\n budgetType: 'rollover' | 'report';\n spreadsheet: ReturnType<typeof useSpreadsheet>;\n applyBudgetAction: BoundActions['applyBudgetAction'];\n collapseModals: BoundActions['collapseModals'];\n pushModal: BoundActions['pushModal'];\n getCategories: BoundActions['getCategories'];\n createCategory: BoundActions['createCategory'];\n updateCategory: BoundActions['updateCategory'];\n deleteCategory: BoundActions['deleteCategory'];\n moveCategory: BoundActions['moveCategory'];\n createGroup: BoundActions['createGroup'];\n updateGroup: BoundActions['updateGroup'];\n deleteGroup: BoundActions['deleteGroup'];\n moveCategoryGroup: BoundActions['moveCategoryGroup'];\n sync: BoundActions['sync'];\n};\n\nfunction BudgetInner(props: BudgetInnerProps) {\n const {\n categoryGroups,\n categories,\n loadPrefs,\n budgetType,\n spreadsheet,\n applyBudgetAction,\n collapseModals,\n pushModal,\n createGroup,\n updateGroup,\n deleteGroup,\n moveCategoryGroup,\n createCategory,\n updateCategory,\n deleteCategory,\n moveCategory,\n } = props;\n\n const currMonth = monthUtils.currentMonth();\n\n const [bounds, setBounds] = useState({ start: currMonth, end: currMonth });\n const [currentMonth, setCurrentMonth] = useState(currMonth);\n const [initialized, setInitialized] = useState(false);\n const [editMode, setEditMode] = useState(false);\n\n const [_numberFormat] = useLocalPref('numberFormat');\n const numberFormat = _numberFormat || 'comma-dot';\n const [hideFraction = false] = useLocalPref('hideFraction');\n\n useEffect(() => {\n async function init() {\n const { start, end } = await send('get-budget-bounds');\n setBounds({ start, end });\n\n await prewarmMonth(props.budgetType, props.spreadsheet, currentMonth);\n\n setInitialized(true);\n }\n\n init();\n\n const 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 props.getCategories();\n }\n });\n\n return () => unlisten();\n }, []);\n\n const onShowBudgetSummary = () => {\n if (budgetType === 'report') {\n pushModal('report-budget-summary', {\n month: currentMonth,\n });\n } else {\n pushModal('rollover-budget-summary', {\n month: currentMonth,\n onBudgetAction: applyBudgetAction,\n });\n }\n };\n\n // const onBudgetAction = type => {\n // applyBudgetAction(currentMonth, type, bounds);\n // };\n\n const onAddGroup = () => {\n pushModal('new-category-group', {\n onValidate: name => (!name ? 'Name is required.' : null),\n onSubmit: async name => {\n await createGroup(name);\n },\n });\n };\n\n const onAddCategory = (groupId, isIncome) => {\n pushModal('new-category', {\n onValidate: name => (!name ? 'Name is required.' : null),\n onSubmit: async name => {\n collapseModals('category-group-menu');\n await createCategory(name, groupId, isIncome, false);\n },\n });\n };\n\n const onSaveGroup = group => {\n updateGroup(group);\n };\n\n const onDeleteGroup = async groupId => {\n const group = categoryGroups?.find(g => g.id === groupId);\n\n if (!group) {\n return;\n }\n\n let mustTransfer = false;\n for (const category of group.categories ?? []) {\n if (await send('must-category-transfer', { id: category.id })) {\n mustTransfer = true;\n break;\n }\n }\n\n if (mustTransfer) {\n pushModal('confirm-category-delete', {\n group: groupId,\n onDelete: transferCategory => {\n collapseModals('category-group-menu');\n deleteGroup(groupId, transferCategory);\n },\n });\n } else {\n collapseModals('category-group-menu');\n deleteGroup(groupId);\n }\n };\n\n const onSaveCategory = category => {\n updateCategory(category);\n };\n\n const onDeleteCategory = async categoryId => {\n const mustTransfer = await send('must-category-transfer', {\n id: categoryId,\n });\n\n if (mustTransfer) {\n pushModal('confirm-category-delete', {\n category: categoryId,\n onDelete: transferCategory => {\n if (categoryId !== transferCategory) {\n collapseModals('category-menu');\n deleteCategory(categoryId, transferCategory);\n }\n },\n });\n } else {\n collapseModals('category-menu');\n deleteCategory(categoryId);\n }\n };\n\n const onReorderCategory = (id, { inGroup, aroundCategory }) => {\n let groupId, targetId;\n\n if (inGroup) {\n groupId = inGroup;\n } else if (aroundCategory) {\n const { id: originalCatId, position } = aroundCategory;\n\n let catId = originalCatId;\n const group = categoryGroups.find(group =>\n group.categories?.find(cat => cat.id === catId),\n );\n\n if (position === 'bottom') {\n const idx = group?.categories?.findIndex(cat => cat.id === catId) ?? -1;\n catId = group?.categories\n ? idx < group.categories.length - 1\n ? group.categories[idx + 1].id\n : null\n : null;\n }\n\n groupId = group?.id;\n targetId = catId;\n }\n\n moveCategory(id, groupId, targetId);\n };\n\n const onReorderGroup = (id, targetId, position) => {\n if (position === 'bottom') {\n const idx = categoryGroups.findIndex(group => group.id === targetId);\n targetId =\n idx < categoryGroups.length - 1 ? categoryGroups[idx + 1].id : null;\n }\n\n moveCategoryGroup(id, targetId);\n };\n\n const sync = async () => {\n const result = await props.sync();\n if (result?.error) {\n return 'error';\n } else if (result) {\n return 'updated';\n }\n return null;\n };\n\n const onPrevMonth = async () => {\n const month = monthUtils.subMonths(currentMonth, 1);\n await prewarmMonth(budgetType, spreadsheet, month);\n setCurrentMonth(month);\n setInitialized(true);\n };\n\n const onNextMonth = async () => {\n const month = monthUtils.addMonths(currentMonth, 1);\n await prewarmMonth(budgetType, spreadsheet, month);\n setCurrentMonth(month);\n setInitialized(true);\n };\n\n // const onOpenMonthActionMenu = () => {\n // const options = [\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 // ].filter(Boolean);\n\n // props.showActionSheetWithOptions(\n // {\n // options,\n // cancelButtonIndex: options.length - 1,\n // title: 'Actions',\n // },\n // idx => {\n // switch (idx) {\n // case 0:\n // setEditMode(true);\n // break;\n // case 1:\n // onBudgetAction('copy-last');\n // break;\n // case 2:\n // onBudgetAction('set-zero');\n // break;\n // case 3:\n // onBudgetAction('set-3-avg');\n // break;\n // case 4:\n // if (budgetType === 'report') {\n // onBudgetAction('set-all-future');\n // }\n // break;\n // default:\n // }\n // },\n // );\n // };\n\n const onSwitchBudgetType = async () => {\n setInitialized(false);\n\n const newBudgetType = budgetType === 'rollover' ? 'report' : 'rollover';\n await switchBudgetType(\n newBudgetType,\n spreadsheet,\n bounds,\n currentMonth,\n () => loadPrefs(),\n );\n\n setInitialized(true);\n };\n\n const onSaveNotes = async (id, notes) => {\n await send('notes-save', { id, note: notes });\n };\n\n const onEditGroupNotes = id => {\n const group = categoryGroups.find(g => g.id === id);\n pushModal('notes', {\n id,\n name: group.name,\n onSave: onSaveNotes,\n });\n };\n\n const onEditCategoryNotes = id => {\n const category = categories.find(c => c.id === id);\n pushModal('notes', {\n id,\n name: category.name,\n onSave: onSaveNotes,\n });\n };\n\n const onEditGroup = id => {\n const group = categoryGroups.find(g => g.id === id);\n pushModal('category-group-menu', {\n groupId: group.id,\n onSave: onSaveGroup,\n onAddCategory,\n onEditNotes: onEditGroupNotes,\n onDelete: onDeleteGroup,\n });\n };\n\n const onEditCategory = id => {\n const category = categories.find(c => c.id === id);\n pushModal('category-menu', {\n categoryId: category.id,\n onSave: onSaveCategory,\n onEditNotes: onEditCategoryNotes,\n onDelete: onDeleteCategory,\n });\n };\n\n if (!categoryGroups || !initialized) {\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.mobilePageBackground,\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\n onSync={async () => {\n await sync();\n }}\n >\n {({ onRefresh }) => (\n <BudgetTable\n // This key forces the whole table rerender when the number\n // format changes\n key={`${numberFormat}${hideFraction}`}\n categoryGroups={categoryGroups}\n type={budgetType}\n month={currentMonth}\n monthBounds={bounds}\n editMode={editMode}\n onEditMode={flag => setEditMode(flag)}\n onShowBudgetSummary={onShowBudgetSummary}\n onPrevMonth={onPrevMonth}\n onNextMonth={onNextMonth}\n onSaveGroup={onSaveGroup}\n onDeleteGroup={onDeleteGroup}\n onAddGroup={onAddGroup}\n onAddCategory={onAddCategory}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onOpenMonthActionMenu={() => {}} //onOpenMonthActionMenu}\n onBudgetAction={applyBudgetAction}\n onRefresh={onRefresh}\n onSwitchBudgetType={onSwitchBudgetType}\n pushModal={pushModal}\n onEditGroup={onEditGroup}\n onEditCategory={onEditCategory}\n />\n )}\n </SyncRefresh>\n );\n}\n\nexport function Budget() {\n const { list: categories, grouped: categoryGroups } = useCategories();\n const [_budgetType] = useLocalPref('budgetType');\n const budgetType = _budgetType || 'rollover';\n\n const actions = useActions();\n const spreadsheet = useSpreadsheet();\n useSetThemeColor(theme.mobileViewTheme);\n return (\n <BudgetInner\n categoryGroups={categoryGroups}\n categories={categories}\n budgetType={budgetType}\n {...actions}\n spreadsheet={spreadsheet}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { replaceModal, syncAndDownload } from 'loot-core/src/client/actions';\nimport * as queries from 'loot-core/src/client/queries';\n\nimport { useAccounts } from '../../hooks/useAccounts';\nimport { useCategories } from '../../hooks/useCategories';\nimport { useLocalPref } from '../../hooks/useLocalPref';\nimport { useNavigate } from '../../hooks/useNavigate';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { SvgAdd } from '../../icons/v1';\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 { ROW_HEIGHT as MOBILE_NAV_HEIGHT } from '../mobile/MobileNavTabs';\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,\n flexDirection: 'row',\n marginTop: 10,\n marginRight: 10,\n color: theme.pageTextLight,\n width: '100%',\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,\n flexDirection: 'row',\n backgroundColor: theme.tableBackground,\n boxShadow: `0 1px 1px ${theme.mobileAccountShadow}`,\n borderRadius: 6,\n marginTop: 10,\n marginRight: 10,\n width: '100%',\n }}\n data-testid=\"account\"\n >\n <Button\n onMouseDown={() => onSelect(account.id)}\n style={{\n flexDirection: 'row',\n border: '1px solid ' + theme.pillBorder,\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,\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.noticeBackgroundDark,\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() {\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 </View>\n );\n}\n\nfunction AccountList({\n accounts,\n updatedAccounts,\n getBalanceQuery,\n getOnBudgetBalance,\n getOffBudgetBalance,\n onAddAccount,\n onSelectAccount,\n onSync,\n}) {\n const budgetedAccounts = accounts.filter(account => account.offbudget === 0);\n const offbudgetAccounts = accounts.filter(account => account.offbudget === 1);\n const noBackgroundColorStyle = {\n backgroundColor: 'transparent',\n color: 'white',\n };\n\n return (\n <Page\n title=\"Accounts\"\n headerRightContent={\n <Button\n type=\"bare\"\n style={{\n ...noBackgroundColorStyle,\n margin: 10,\n }}\n activeStyle={noBackgroundColorStyle}\n hoveredStyle={noBackgroundColorStyle}\n onClick={onAddAccount}\n >\n <SvgAdd width={20} height={20} />\n </Button>\n }\n padding={0}\n style={{\n flex: 1,\n backgroundColor: theme.mobilePageBackground,\n paddingBottom: MOBILE_NAV_HEIGHT,\n }}\n >\n {accounts.length === 0 && <EmptyMessage />}\n <PullToRefresh onRefresh={onSync}>\n <View style={{ margin: 10 }}>\n {budgetedAccounts.length > 0 && (\n <AccountHeader name=\"For Budget\" amount={getOnBudgetBalance()} />\n )}\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 {offbudgetAccounts.length > 0 && (\n <AccountHeader\n name=\"Off budget\"\n amount={getOffBudgetBalance()}\n style={{ marginTop: 30 }}\n />\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 </View>\n </PullToRefresh>\n </Page>\n );\n}\n\nexport function Accounts() {\n const dispatch = useDispatch();\n const accounts = useAccounts();\n const newTransactions = useSelector(state => state.queries.newTransactions);\n const updatedAccounts = useSelector(state => state.queries.updatedAccounts);\n const [_numberFormat] = useLocalPref('numberFormat');\n const numberFormat = _numberFormat || 'comma-dot';\n const [hideFraction = false] = useLocalPref('hideFraction');\n\n const { list: categories } = useCategories();\n\n const transactions = useState({});\n const navigate = useNavigate();\n\n const onSelectAccount = id => {\n navigate(`/accounts/${id}`);\n };\n\n const onSelectTransaction = transaction => {\n navigate(`/transaction/${transaction}`);\n };\n\n const onAddAccount = () => {\n dispatch(replaceModal('add-account'));\n };\n\n const onSync = () => {\n dispatch(syncAndDownload());\n };\n\n useSetThemeColor(theme.mobileViewTheme);\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={onAddAccount}\n onSelectAccount={onSelectAccount}\n onSelectTransaction={onSelectTransaction}\n onSync={onSync}\n />\n </View>\n );\n}\n","import React, { useState, useMemo } from 'react';\n\nimport { useActions } from '../../hooks/useActions';\nimport { SvgAdd } from '../../icons/v1';\nimport { SvgSearchAlternate } from '../../icons/v2';\nimport { theme } from '../../style';\nimport { ButtonLink } from '../common/ButtonLink';\nimport { InputWithContent } from '../common/InputWithContent';\nimport { Label } from '../common/Label';\nimport { View } from '../common/View';\nimport { MobileBackButton } from '../MobileBackButton';\nimport { Page } from '../Page';\nimport { PullToRefresh } from '../responsive/PullToRefresh';\nimport { CellValue } from '../spreadsheet/CellValue';\nimport { useSheetValue } from '../spreadsheet/useSheetValue';\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.mobilePageBackground,\n margin: '11px auto 4px',\n padding: 10,\n width: '100%',\n }}\n >\n <InputWithContent\n leftContent={\n <SvgSearchAlternate\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.tableBackground,\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\nexport function AccountDetails({\n account,\n prependTransactions,\n transactions,\n accounts,\n categories,\n payees,\n balance,\n balanceCleared,\n balanceUncleared,\n isNewTransaction,\n onLoadMore,\n onSearch,\n onSelectTransaction,\n pushModal,\n}) {\n const 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 <Page\n title={account.name}\n headerLeftContent={<MobileBackButton />}\n headerRightContent={\n <ButtonLink\n to=\"transactions/new\"\n type=\"bare\"\n aria-label=\"Add Transaction\"\n style={{\n justifyContent: 'center',\n color: theme.mobileHeaderText,\n margin: 10,\n }}\n hoveredStyle={{\n color: theme.mobileHeaderText,\n background: theme.mobileHeaderTextHover,\n }}\n activeStyle={{ background: 'transparent' }}\n >\n <SvgAdd width={20} height={20} />\n </ButtonLink>\n }\n padding={0}\n style={{\n flex: 1,\n backgroundColor: theme.mobilePageBackground,\n }}\n >\n <View\n style={{\n alignItems: 'center',\n flexShrink: 0,\n marginTop: 10,\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n boxSizing: 'content-box',\n width: '100%',\n justifyContent: 'space-evenly',\n }}\n >\n <View\n style={{\n visibility:\n useSheetValue(balanceUncleared) === 0 ? 'hidden' : 'visible',\n width: '33%',\n }}\n >\n <Label\n title=\"CLEARED\"\n style={{ textAlign: 'center', fontSize: 12 }}\n />\n <CellValue\n binding={balanceCleared}\n type=\"financial\"\n style={{\n fontSize: 12,\n textAlign: 'center',\n fontWeight: '500',\n }}\n data-testid=\"account-balance-cleared\"\n />\n </View>\n <View style={{ width: '33%' }}>\n <Label title=\"BALANCE\" style={{ textAlign: 'center' }} />\n <CellValue\n binding={balance}\n type=\"financial\"\n style={{\n fontSize: 18,\n textAlign: 'center',\n fontWeight: '500',\n }}\n getStyle={value => ({\n color: value < 0 ? theme.errorText : theme.pillTextHighlighted,\n })}\n data-testid=\"account-balance\"\n />\n </View>\n <View\n style={{\n visibility:\n useSheetValue(balanceUncleared) === 0 ? 'hidden' : 'visible',\n width: '33%',\n }}\n >\n <Label\n title=\"UNCLEARED\"\n style={{ textAlign: 'center', fontSize: 12 }}\n />\n <CellValue\n binding={balanceUncleared}\n type=\"financial\"\n style={{\n fontSize: 12,\n textAlign: 'center',\n fontWeight: '500',\n }}\n data-testid=\"account-balance-uncleared\"\n />\n </View>\n </View>\n <TransactionSearchInput\n accountName={account.name}\n onSearch={onSearch}\n />\n </View>\n <PullToRefresh onRefresh={onRefresh}>\n <TransactionList\n account={account}\n transactions={allTransactions}\n categories={categories}\n accounts={accounts}\n payees={payees}\n isNew={isNewTransaction}\n onLoadMore={onLoadMore}\n onSelect={onSelectTransaction}\n pushModal={pushModal}\n />\n </PullToRefresh>\n </Page>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } 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 { useAccounts } from '../../hooks/useAccounts';\nimport { useCategories } from '../../hooks/useCategories';\nimport { useDateFormat } from '../../hooks/useDateFormat';\nimport { useLocalPref } from '../../hooks/useLocalPref';\nimport { useLocalPrefs } from '../../hooks/useLocalPrefs';\nimport { useNavigate } from '../../hooks/useNavigate';\nimport { usePayees } from '../../hooks/usePayees';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { theme, styles } from '../../style';\nimport { Button } from '../common/Button';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\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({ children }) {\n const scheduleData = useCachedSchedules();\n\n if (scheduleData == null) {\n return children(null);\n }\n\n const 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 function Account(props) {\n const accounts = useAccounts();\n const payees = usePayees();\n\n const navigate = useNavigate();\n const [transactions, setTransactions] = useState([]);\n const [searchText, setSearchText] = useState('');\n const [currentQuery, setCurrentQuery] = useState();\n\n const newTransactions = useSelector(state => state.queries.newTransactions);\n const prefs = useLocalPrefs();\n const dateFormat = useDateFormat() || 'MM/dd/yyyy';\n const [_numberFormat] = useLocalPref('numberFormat');\n const numberFormat = _numberFormat || 'comma-dot';\n const [hideFraction = false] = useLocalPref('hideFraction');\n\n const state = {\n payees,\n newTransactions,\n prefs,\n dateFormat,\n };\n\n const dispatch = useDispatch();\n const 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 const 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 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.mobileViewTheme);\n\n if (!accounts || !accounts.length) {\n return null;\n }\n\n if (\n accountId === 'budgeted' ||\n accountId === 'offbudget' ||\n accountId === 'uncategorized'\n ) {\n return (\n <View style={{ flex: 1, padding: 30 }}>\n <Text style={(styles.text, { textAlign: 'center' })}>\n There is no Mobile View at the moment\n </Text>\n <Button\n type=\"normal\"\n style={{ fontSize: 15, marginLeft: 10, marginTop: 10 }}\n onClick={() => navigate('/accounts')}\n >\n Go back to Mobile Accounts\n </Button>\n </View>\n );\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 const balance = queries.accountBalance(account);\n const balanceCleared = queries.accountBalanceCleared(account);\n const balanceUncleared = queries.accountBalanceUncleared(account);\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 balanceCleared={balanceCleared}\n balanceUncleared={balanceUncleared}\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"],"names":["SvgArrowThinLeft","props","_jsx","svg","xmlns","viewBox","style","color","path","d","fill","SyncRefresh","onSync","children","syncing","setSyncing","useState","onSync_","_Fragment","refreshing","onRefresh","Card","ref","View","marginTop","marginLeft","marginRight","borderRadius","backgroundColor","theme","cardBackground","borderColor","cardBorder","boxShadow","overflow","displayName","Label","title","Text","styles","text","tableRowHeaderText","textAlign","fontSize","marginBottom","DIRECTION","isOverflowScrollable","element","overflowType","isScrollable","direction","bottomScroll","isTreeScrollable","styleInject","css","insertAt","head","RefreshingContent","React","PullingContent","css$1","PullToRefresh","_a","_b","isPullable","_c","canFetchMore","onFetchMore","_d","refreshingContent","_e","pullingContent","_f","pullDownThreshold","_g","fetchMoreThreshold","_h","maxPullDownDistance","_j","resistance","_k","className","containerRef","useRef","childrenRef","pullDownRef","fetchMoreRef","pullToRefreshThresholdBreached","fetchMoreTresholdBreached","isDragging","startY","currentY","useEffect","childrenEl","onTouchStart","onTouchMove","onScroll","onEnd","isAlreadyFetchingMore","getScrollToBottomValue","initContainer","scrollTop","scrollHeight","e","yDistanceMoved","div","BasePullToRefresh","String","ROW_HEIGHT","ListItem","height","borderBottomWidth","tableBorder","flexDirection","alignItems","paddingLeft","paddingRight","zIndex","ToBudget","toBudget","onClick","amount","useSheetValue","Button","type","underlinedText","formInputText","flexShrink","CellValue","binding","smallText","fontWeight","errorText","Saved","projected","reportBudget","totalBudgetedSaved","totalSaved","isNegative","warningText","errorTextDark","BudgetCell","name","textStyle","categoryId","month","onBudgetAction","onEdit","onBlur","isEditing","sheetValue","updateBudgetAmount","category","onAmountClick","AmountInput","value","zeroSign","display","transform","focused","onUpdate","role","justifyContent","getStyle","makeAmountGrey","data-testid","onPointerUp","onPointerDown","preventDefault","ExpenseCategory","memo","goal","budgeted","spent","balance","carryover","index","blank","show3Cols","showBudgetedCol","opacity","balanceTooltip","useTooltip","isEditingBudget","setIsEditingBudget","onRequestActiveEdit","onClearActiveEdit","useSingleActiveEditForm","onEditBudget","id","onOpenBalanceActionMenu","open","close","listItemRef","_onBudgetAction","monthIndex","action","arg","monthUtils","content","borderTopWidth","hidden","undefined","innerRef","flex","lineClamp","width","noTapHighlight","span","BalanceWithCarryover","balanceStyle","isOpen","ReportBudgetBalanceTooltip","offset","tooltip","onClose","RolloverBudgetBalanceTooltip","ExpenseGroupTotals","group","editMode","tableRowHeaderBackground","IncomeGroupTotals","padding","IncomeCategory","ExpenseGroup","onEditGroup","onEditCategory","onAddCategory","showHiddenCategories","editable","groupBudgeted","rolloverBudget","groupSumAmount","groupBalance","categories","filter","map","catGoal","catBudgeted","catSumAmount","catBalance","catCarryover","tableBackground","IncomeGroup","editingBudgetCategoryId","onEditCategoryBudget","BudgetGroups","categoryGroups","gestures","onSaveCategory","onDeleteCategory","onAddGroup","onReorderCategory","onReorderGroup","pushModal","separateGroups","memoizeOne","groups","incomeGroup","find","is_income","expenseGroups","SingleActiveEditFormProvider","formName","overflowY","paddingBottom","margin","BudgetTable","monthBounds","onPrevMonth","onNextMonth","onSaveGroup","onDeleteGroup","onEditMode","onShowBudgetSummary","onOpenMonthActionMenu","onSwitchBudgetType","useResponsive","format","useFormat","showSpentColumn","setShowSpentColumnPref","useLocalPref","setShowHiddenCategoriesPref","toggleDisplay","buttonStyle","_onSwitchBudgetType","onSwitch","onToggleHiddenCategories","NamespaceContext","Provider","Page","MonthSelector","headerRightContent","hoveredStyle","mobileHeaderText","background","mobileHeaderTextHover","BudgetPageMenu","disabled","formInputBackgroundSelection","flexBasis","buttonNormalText","totalBudgetedExpense","totalBudgeted","formatter","parseFloat","totalSpent","totalLeftover","totalBalance","MOBILE_NAV_HEIGHT","isReportBudgetEnabled","useFeatureFlag","onMenuSelect","Error","getOpenEvents","SvgDotsHorizontalTriple","Tooltip","position","Menu","items","prevEnabled","start","nextEnabled","end","arrowButtonStyle","SvgArrowThinRight","BudgetInner","loadPrefs","budgetType","spreadsheet","applyBudgetAction","collapseModals","createGroup","updateGroup","deleteGroup","moveCategoryGroup","createCategory","updateCategory","deleteCategory","moveCategory","currMonth","bounds","setBounds","currentMonth","setCurrentMonth","initialized","setInitialized","setEditMode","_numberFormat","numberFormat","hideFraction","init","send","prewarmMonth","unlisten","listen","tables","includes","getCategories","onValidate","onSubmit","groupId","isIncome","g","mustTransfer","onDelete","transferCategory","inGroup","aroundCategory","targetId","originalCatId","catId","cat","idx","findIndex","length","sync","result","error","switchBudgetType","onSaveNotes","notes","note","onEditGroupNotes","onSave","onEditCategoryNotes","c","onEditNotes","mobilePageBackground","AnimatedLoading","flag","Budget","list","grouped","useCategories","_budgetType","actions","useActions","useSpreadsheet","useSetThemeColor","mobileViewTheme","AccountHeader","pageTextLight","textTransform","AccountCard","account","updated","getBalanceQuery","onSelect","mobileAccountShadow","onMouseDown","border","pillBorder","TextOneLine","mobileAccountText","pillText","bankId","noticeBackgroundDark","EmptyMessage","AccountList","accounts","updatedAccounts","getOnBudgetBalance","getOffBudgetBalance","onAddAccount","onSelectAccount","budgetedAccounts","offbudget","offbudgetAccounts","noBackgroundColorStyle","activeStyle","SvgAdd","acct","Accounts","dispatch","useDispatch","useAccounts","newTransactions","useSelector","state","queries","transactions","navigate","useNavigate","onSelectTransaction","transaction","replaceModal","syncAndDownload","closed","TransactionSearchInput","accountName","onSearch","setText","InputWithContent","leftContent","SvgSearchAlternate","formInputTextHighlight","placeholder","formInputBorder","AccountDetails","prependTransactions","payees","balanceCleared","balanceUncleared","isNewTransaction","onLoadMore","allTransactions","useMemo","concat","headerLeftContent","MobileBackButton","ButtonLink","to","aria-label","boxSizing","visibility","pillTextHighlighted","TransactionList","isNew","getSchedulesTransform","hasSearch","q","$and","orderBy","next_date","PreviewTransactions","scheduleData","useCachedSchedules","schedules","s","completed","statuses","get","schedule","payee","_payee","_account","_amount","date","paged","Account","usePayees","setTransactions","searchText","setSearchText","currentQuery","setCurrentQuery","prefs","useLocalPrefs","dateFormat","useDateFormat","actionCreators","bindActionCreators","accountId","useParams","makeRootQuery","updateQuery","query","unsubscribe","pagedQuery","options","splits","select","data","pageCount","mapper","ungroupTransactions","fetchTransactions","setUpAccount","run","getPayees","markAccountRead","updateSearchQuery","debounce","isPreviewId","SchedulesProvider","key","fetchNext"],"mappings":"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","x_google_ignoreList":[4]}
|