@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.
Files changed (38) hide show
  1. package/build/.vite/manifest.json +27 -17
  2. package/build/index.html +1 -1
  3. package/build/kcab/{kcab.worker.fb5495b79632bd06ea0f.js → kcab.worker.d3576baccc44df86e1d9.js} +57 -57
  4. package/build/kcab/{kcab.worker.fb5495b79632bd06ea0f.js.map → kcab.worker.d3576baccc44df86e1d9.js.map} +1 -1
  5. package/build/static/js/AppliedFilters.6hw_SZMi.chunk.js +2 -0
  6. package/build/static/js/AppliedFilters.6hw_SZMi.chunk.js.map +1 -0
  7. package/build/static/js/{BackgroundImage.Jugq91td.chunk.js → BackgroundImage.UwhfLEYN.chunk.js} +2 -2
  8. package/build/static/js/{BackgroundImage.Jugq91td.chunk.js.map → BackgroundImage.UwhfLEYN.chunk.js.map} +1 -1
  9. package/build/static/js/BalanceTooltip.hDG0UB7U.chunk.js +2 -0
  10. package/build/static/js/BalanceTooltip.hDG0UB7U.chunk.js.map +1 -0
  11. package/build/static/js/ButtonLink.WYXFzja-.chunk.js +2 -0
  12. package/build/static/js/{ButtonLink.ElUV7DMx.chunk.js.map → ButtonLink.WYXFzja-.chunk.js.map} +1 -1
  13. package/build/static/js/ReportRouter.mLx3JUh2.chunk.js +66 -0
  14. package/build/static/js/ReportRouter.mLx3JUh2.chunk.js.map +1 -0
  15. package/build/static/js/import.M8LEm-Nc.chunk.js +2 -0
  16. package/build/static/js/import.M8LEm-Nc.chunk.js.map +1 -0
  17. package/build/static/js/index.MAk9r4yg.js +216 -0
  18. package/build/static/js/index.MAk9r4yg.js.map +1 -0
  19. package/build/static/js/narrow.vxy14QoE.chunk.js +108 -0
  20. package/build/static/js/narrow.vxy14QoE.chunk.js.map +1 -0
  21. package/build/static/js/wide.GDttRuTJ.chunk.js +2 -0
  22. package/build/static/js/wide.GDttRuTJ.chunk.js.map +1 -0
  23. package/build/sw.js +1 -1
  24. package/build/sw.js.map +1 -1
  25. package/package.json +3 -2
  26. package/build/static/js/AppliedFilters.ggJl8zjp.chunk.js +0 -2
  27. package/build/static/js/AppliedFilters.ggJl8zjp.chunk.js.map +0 -1
  28. package/build/static/js/BalanceTooltip.nSDrDsfc.chunk.js +0 -2
  29. package/build/static/js/BalanceTooltip.nSDrDsfc.chunk.js.map +0 -1
  30. package/build/static/js/ButtonLink.ElUV7DMx.chunk.js +0 -2
  31. package/build/static/js/ReportRouter.8mlKGqxC.chunk.js +0 -69
  32. package/build/static/js/ReportRouter.8mlKGqxC.chunk.js.map +0 -1
  33. package/build/static/js/index.O6ABAWXP.js +0 -216
  34. package/build/static/js/index.O6ABAWXP.js.map +0 -1
  35. package/build/static/js/narrow.BvCotSUP.chunk.js +0 -108
  36. package/build/static/js/narrow.BvCotSUP.chunk.js.map +0 -1
  37. package/build/static/js/wide.Puo4nQYF.chunk.js +0 -2
  38. package/build/static/js/wide.Puo4nQYF.chunk.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actual-app/web",
3
- "version": "24.3.0",
3
+ "version": "24.4.0",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "build"
@@ -37,7 +37,6 @@
37
37
  "downshift": "7.6.2",
38
38
  "focus-visible": "^4.1.5",
39
39
  "glamor": "^2.20.40",
40
- "hotkeys-js": "^3.13.5",
41
40
  "inter-ui": "^3.19.3",
42
41
  "jest": "^27.5.1",
43
42
  "jest-watch-typeahead": "^2.2.2",
@@ -49,6 +48,7 @@
49
48
  "react-dnd-html5-backend": "^16.0.1",
50
49
  "react-dom": "18.2.0",
51
50
  "react-error-boundary": "^4.0.12",
51
+ "react-hotkeys-hook": "^4.5.0",
52
52
  "react-markdown": "^8.0.7",
53
53
  "react-merge-refs": "^1.1.0",
54
54
  "react-modal": "3.16.1",
@@ -65,6 +65,7 @@
65
65
  "sass": "^1.70.0",
66
66
  "swc-loader": "^0.2.3",
67
67
  "terser-webpack-plugin": "^5.3.10",
68
+ "usehooks-ts": "^3.0.1",
68
69
  "uuid": "^9.0.1",
69
70
  "vite": "^5.0.12",
70
71
  "vite-plugin-pwa": "^0.19.0",
@@ -1,2 +0,0 @@
1
- import{j as e,Q as h,av as A,a7 as b,T as w,t as f,cT as I,V as x,cU as B,cV as N,cW as m,cX as C,cN as H,a_ as V,d as g,cY as W,cZ as M,a6 as Z,U as Y,cq as F,c_ as $,S as j,a1 as L,af as P,c$ as E,d0 as k,d1 as _,cv as T,h as S,m as z,d2 as U,d3 as q,d4 as G,i as Q}from"./index.O6ABAWXP.js";const X=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:"m12 12 8-8V0H0v4l8 8v8l4-4v-4z",fill:"currentColor"})}),J=t=>e.jsx("svg",{...t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",style:{color:"inherit",...t.style},children:e.jsx("path",{fill:"currentColor",d:"M4.5 17.5h6.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 0 0 0-2h-1.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2Zm10-2.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM19.5 6.5h-6.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2h1.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 1 0 0-2ZM9.5 9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Z"})});function ie({onClick:t,style:s}){return e.jsx(h,{type:"bare",onClick:t,"aria-label":"Menu",style:s,children:e.jsx(A,{width:15,height:15,style:{transform:"rotateZ(90deg)"}})})}function ae({width:t,onClose:s,children:n}){return e.jsx(b,{position:"bottom-right",width:t,style:{padding:0},onClose:s,children:n})}function K({conditionsOp:t,onCondOpChange:s,filters:n}){return n.length>1?e.jsxs(w,{style:{color:f.pageText,marginTop:11,marginRight:5},children:[e.jsx(I,{style:{display:"inline-flex"},fields:[["and","all"],["or","any"]],value:t,onChange:(o,a)=>s(a,n)}),"of:"]}):e.jsx(x,{})}function ee({onClick:t}){return e.jsx(h,{type:"bare",onClick:t,children:e.jsx(X,{width:15,height:15})})}function te({onClick:t}){return e.jsxs(h,{type:"bare",onClick:t,title:"Filters",children:[e.jsx(J,{style:{width:16,height:16,marginRight:5}})," ","Filter"]})}function v({op:t,selected:s,style:n,onClick:o}){return e.jsx(h,{type:"bare",style:{backgroundColor:f.pillBackground,marginBottom:5,...n,...s&&{color:f.buttonNormalSelectedText,"&,:hover,:active":{backgroundColor:f.buttonNormalSelectedBackground,color:f.buttonNormalSelectedText}}},onClick:o,children:B(t)})}function O({field:t,options:s,value:n}){if(t==="date"&&typeof n=="string"){if(n.length===7)return"month";if(n.length===4)return"year"}if(t==="amount"){if(s&&s.inflow)return"amount-inflow";if(s&&s.outflow)return"amount-outflow"}return t}function ne(t,s){let n;switch(t){case"amount":switch(s){case"amount-inflow":n={inflow:!0};break;case"amount-outflow":n={outflow:!0};break}break;case"date":switch(s){case"month":n={month:!0};break;case"year":n={year:!0};break}break}return n}function R(t,s){switch(s.type){case"set-op":{const n=m.get(t.field);let o=t.value;return(n==="id"||n==="string")&&(s.op==="contains"||s.op==="is"||s.op==="doesNotContain"||s.op==="isNot")&&(o=null),{...t,op:s.op,value:o}}case"set-value":{const{value:n}=N(s.value,{type:m.get(t.field)});return{...t,value:n}}default:throw new Error(`Unhandled action type: ${s.type}`)}}const le=["date","account","payee","notes","category","amount","cleared","reconciled","saved"].map(t=>[t,C(t)]);function D({field:t,initialSubfield:s=t,op:n,value:o,dispatch:a,onApply:u}){const[r,y]=g.useState(s),l=g.useRef(),c=g.useRef(null);g.useEffect(()=>{c.current!==n&&l.current&&l.current.focus(),c.current=n},[n]);const p=m.get(t);let d=M[p].ops.filter(i=>i!=="isbetween");return(r==="month"||r==="year")&&(d=["is"]),e.jsx(b,{position:"bottom-left",style:{padding:15,color:f.menuItemText},width:275,onClose:()=>a({type:"close"}),"data-testid":"filters-menu-tooltip",children:e.jsxs($,{children:[e.jsx(x,{style:{marginBottom:10},children:e.jsxs(j,{direction:"row",align:"flex-start",children:[t==="amount"||t==="date"?e.jsx(L,{bare:!0,options:t==="amount"?[["amount","Amount"],["amount-inflow","Amount (inflow)"],["amount-outflow","Amount (outflow)"]]:t==="date"?[["date","Date"],["month","Month"],["year","Year"]]:null,value:r,onChange:i=>{y(i),(i==="month"||i==="year")&&a({type:"set-op",op:"is"})},style:{borderWidth:1}}):F(C(t)),e.jsx(x,{style:{flex:1}})]})}),e.jsx(x,{style:{color:f.pageTextLight,marginBottom:10},children:t==="saved"&&"Existing filters will be cleared"}),e.jsx(j,{direction:"row",align:"flex-start",spacing:1,style:{flexWrap:"wrap"},children:p==="boolean"?e.jsxs(e.Fragment,{children:[e.jsx(v,{op:"true",selected:o===!0,onClick:()=>{a({type:"set-op",op:"is"}),a({type:"set-value",value:!0})}},"true"),e.jsx(v,{op:"false",selected:o===!1,onClick:()=>{a({type:"set-op",op:"is"}),a({type:"set-value",value:!1})}},"false")]}):e.jsxs(e.Fragment,{children:[e.jsx(j,{direction:"row",align:"flex-start",spacing:1,style:{flexWrap:"wrap"},children:d.slice(0,3).map(i=>e.jsx(v,{op:i,selected:i===n,onClick:()=>a({type:"set-op",op:i})},i))}),e.jsx(j,{direction:"row",align:"flex-start",spacing:1,style:{flexWrap:"wrap"},children:d.slice(3,d.length).map(i=>e.jsx(v,{op:i,selected:i===n,onClick:()=>a({type:"set-op",op:i})},i))})]})}),e.jsxs("form",{action:"#",children:[p!=="boolean"&&e.jsx(P,{inputRef:l,field:t,subfield:r,type:p==="id"&&(n==="contains"||n==="doesNotContain")?"string":p,value:o,multi:n==="oneOf"||n==="notOneOf",style:{marginTop:10},onChange:i=>a({type:"set-value",value:i})}),e.jsxs(j,{direction:"row",justify:"flex-end",align:"center",style:{marginTop:15},children:[e.jsx(x,{style:{flex:1}}),e.jsx(h,{type:"primary",onClick:i=>{i.preventDefault(),u({field:t,op:n,value:o,options:ne(t,r)})},children:"Apply"})]})]})]})})}function ue({onApply:t,compact:s,hover:n}){const o=H(),a=V()||"MM/dd/yyyy",[u,r]=g.useReducer((l,c)=>{switch(c.type){case"select-field":return{...l,fieldsOpen:!0,condOpen:!1};case"configure":{const{field:p}=W(c.field),d=m.get(p),i=M[d].ops;return{...l,fieldsOpen:!1,condOpen:!0,field:c.field,op:i[0],value:d==="boolean"?!0:null}}case"close":return{fieldsOpen:!1,condOpen:!1,value:null};default:return R(l,c)}},{fieldsOpen:!1,condOpen:!1,field:null,value:null});async function y(l){if(l=E({...l,type:m.get(l.field)}),l.type==="date"&&l.options){if(l.options.month){const d=k(l.value,_(a),new Date);if(T(d))l.value=S(d,"yyyy-MM");else{alert("Invalid date format");return}}else if(l.options.year){const d=k(l.value,"yyyy",new Date);if(T(d))l.value=S(d,"yyyy");else{alert("Invalid date format");return}}}const{error:c}=l.field!=="saved"&&await z("rule-validate",{conditions:[l],actions:[]}),p=o.find(d=>l.value===d.id);if(c&&c.conditionErrors.length>0){const d=F(C(l.field));alert(d+": "+U(c.conditionErrors[0]))}else t(p||l),r({type:"close"})}return e.jsxs(x,{children:[e.jsx(Z,{style:{flexShrink:0},renderContent:()=>n&&e.jsx(b,{position:"bottom-left",style:{lineHeight:1.5,padding:"6px 10px",backgroundColor:f.menuBackground,color:f.menuItemText},children:e.jsx(w,{children:"Filters"})}),children:s?e.jsx(ee,{onClick:()=>r({type:"select-field"})}):e.jsx(te,{onClick:()=>r({type:"select-field"})})}),u.fieldsOpen&&e.jsx(b,{position:"bottom-left",style:{padding:0},onClose:()=>r({type:"close"}),"data-testid":"filters-select-tooltip",children:e.jsx(Y,{onMenuSelect:l=>{r({type:"configure",field:l})},items:le.map(([l,c])=>({name:l,text:F(c)}))})}),u.condOpen&&e.jsx(D,{field:u.field,op:u.op,value:u.value,dispatch:r,onApply:y})]})}function se({field:t,op:s,value:n,options:o,onSave:a,onClose:u}){const[r,y]=g.useReducer((l,c)=>{switch(c.type){case"close":return u(),l;default:return R(l,c)}},{field:t,op:s,value:n,options:o});return e.jsx(D,{field:r.field,initialSubfield:O({field:t,options:o,value:n}),op:r.op,value:r.value,options:r.options,dispatch:y,onApply:l=>{l=E({...l,type:m.get(l.field)}),a(l),u()}})}function oe({field:t,customName:s,op:n,value:o,options:a,style:u,onChange:r,onDelete:y}){const[l,c]=g.useState(!1),p=O({field:t,value:o});return e.jsxs(x,{style:{backgroundColor:f.pillBackground,borderRadius:4,flexDirection:"row",alignItems:"center",marginRight:10,marginTop:10,...u},children:[e.jsx(h,{type:"bare",disabled:s!=null,onClick:()=>c(!0),style:{marginRight:-7},children:e.jsx("div",{style:{paddingBlock:1,paddingLeft:5,paddingRight:2},children:s?e.jsx(w,{style:{color:f.pageTextPositive},children:s}):e.jsxs(e.Fragment,{children:[e.jsx(w,{style:{color:f.pageTextPositive},children:C(p,a)})," ",e.jsx(w,{children:B(n,null)})," ",e.jsx(q,{value:o,field:p,inline:!0,valueIsRaw:n==="contains"||n==="doesNotContain"})]})})}),e.jsx(h,{type:"bare",onClick:y,"aria-label":"Delete filter",children:e.jsx(G,{style:{width:8,height:8,margin:5,marginLeft:3}})}),l&&e.jsx(se,{field:t,op:n,value:p==="amount"&&typeof o=="number"?Q(o):o,options:a,onSave:r,onClose:()=>c(!1)})]})}function ce({filters:t,onUpdate:s,onDelete:n,conditionsOp:o,onCondOpChange:a}){return e.jsxs(x,{style:{flexDirection:"row",alignItems:"flex-start",flexWrap:"wrap"},children:[e.jsx(K,{conditionsOp:o,onCondOpChange:a,filters:t}),t.map((u,r)=>e.jsx(oe,{customName:u.customName,field:u.field,op:u.op,value:u.value,options:u.options,onChange:y=>s(u,y),onDelete:()=>n(u)},r))]})}export{ce as A,ue as F,ae as M,ie as a};
2
- //# sourceMappingURL=AppliedFilters.ggJl8zjp.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AppliedFilters.ggJl8zjp.chunk.js","sources":["../../../src/icons/v1/Filter.tsx","../../../src/icons/v2/SettingsSliderAlternate.tsx","../../../src/components/common/MenuButton.tsx","../../../src/components/common/MenuTooltip.tsx","../../../src/components/filters/CondOpMenu.tsx","../../../src/components/filters/CompactFiltersButton.tsx","../../../src/components/filters/FiltersButton.tsx","../../../src/components/filters/OpButton.tsx","../../../src/components/filters/subfieldFromFilter.ts","../../../src/components/filters/subfieldToOptions.ts","../../../src/components/filters/updateFilterReducer.ts","../../../src/components/filters/FiltersMenu.jsx","../../../src/components/filters/FilterExpression.tsx","../../../src/components/filters/AppliedFilters.tsx"],"sourcesContent":["import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgFilter = (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 d=\"m12 12 8-8V0H0v4l8 8v8l4-4v-4z\" fill=\"currentColor\" />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgSettingsSliderAlternate = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M4.5 17.5h6.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 0 0 0-2h-1.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2Zm10-2.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM19.5 6.5h-6.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2h1.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 1 0 0-2ZM9.5 9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Z\"\n />\n </svg>\n);\n","import React from 'react';\n\nimport { SvgDotsHorizontalTriple } from '../../icons/v1';\nimport { type CSSProperties } from '../../style';\n\nimport { Button } from './Button';\n\nexport function MenuButton({\n onClick,\n style,\n}: {\n onClick: () => void;\n style?: CSSProperties;\n}) {\n return (\n <Button type=\"bare\" onClick={onClick} aria-label=\"Menu\" style={style}>\n <SvgDotsHorizontalTriple\n width={15}\n height={15}\n style={{ transform: 'rotateZ(90deg)' }}\n />\n </Button>\n );\n}\n","// @ts-strict-ignore\nimport React from 'react';\n\nimport { Tooltip } from '../tooltips';\n\nexport function MenuTooltip({ width, onClose, children }) {\n return (\n <Tooltip\n position=\"bottom-right\"\n width={width}\n style={{ padding: 0 }}\n onClose={onClose}\n >\n {children}\n </Tooltip>\n );\n}\n","import React from 'react';\n\nimport { type RuleConditionEntity } from 'loot-core/types/models';\n\nimport { theme } from '../../style';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { FieldSelect } from '../modals/EditRule';\n\nexport function CondOpMenu({\n conditionsOp,\n onCondOpChange,\n filters,\n}: {\n conditionsOp: string;\n onCondOpChange: (value: string, filters: RuleConditionEntity[]) => void;\n filters: RuleConditionEntity[];\n}) {\n return filters.length > 1 ? (\n <Text style={{ color: theme.pageText, marginTop: 11, marginRight: 5 }}>\n <FieldSelect\n style={{ display: 'inline-flex' }}\n fields={[\n ['and', 'all'],\n ['or', 'any'],\n ]}\n value={conditionsOp}\n onChange={(name: string, value: string) =>\n onCondOpChange(value, filters)\n }\n />\n of:\n </Text>\n ) : (\n <View />\n );\n}\n","import React from 'react';\n\nimport { SvgFilter } from '../../icons/v1';\nimport { Button } from '../common/Button';\n\nexport function CompactFiltersButton({ onClick }: { onClick: () => void }) {\n return (\n <Button type=\"bare\" onClick={onClick}>\n <SvgFilter width={15} height={15} />\n </Button>\n );\n}\n","import React from 'react';\n\nimport { SvgSettingsSliderAlternate } from '../../icons/v2';\nimport { Button } from '../common/Button';\n\nexport function FiltersButton({ onClick }: { onClick: () => void }) {\n return (\n <Button type=\"bare\" onClick={onClick} title=\"Filters\">\n <SvgSettingsSliderAlternate\n style={{ width: 16, height: 16, marginRight: 5 }}\n />{' '}\n Filter\n </Button>\n );\n}\n","import React from 'react';\n\nimport { friendlyOp } from 'loot-core/src/shared/rules';\n\nimport { type CSSProperties, theme } from '../../style';\nimport { Button } from '../common/Button';\n\ntype OpButtonProps = {\n op: string;\n selected: boolean;\n onClick: () => void;\n style?: CSSProperties;\n};\n\nexport function OpButton({ op, selected, style, onClick }: OpButtonProps) {\n return (\n <Button\n type=\"bare\"\n style={{\n backgroundColor: theme.pillBackground,\n marginBottom: 5,\n ...style,\n ...(selected && {\n color: theme.buttonNormalSelectedText,\n '&,:hover,:active': {\n backgroundColor: theme.buttonNormalSelectedBackground,\n color: theme.buttonNormalSelectedText,\n },\n }),\n }}\n onClick={onClick}\n >\n {friendlyOp(op)}\n </Button>\n );\n}\n","import { type RuleConditionEntity } from 'loot-core/src/types/models';\n\nexport function subfieldFromFilter({\n field,\n options,\n value,\n}: RuleConditionEntity) {\n if (field === 'date') {\n if (typeof value === 'string') {\n if (value.length === 7) {\n return 'month';\n } else if (value.length === 4) {\n return 'year';\n }\n }\n }\n\n if (field === 'amount') {\n if (options && options.inflow) {\n return 'amount-inflow';\n } else if (options && options.outflow) {\n return 'amount-outflow';\n }\n }\n\n return field;\n}\n","import { type RuleConditionEntity } from 'loot-core/src/types/models';\n\nexport function subfieldToOptions(field: string, subfield: string) {\n let setOptions: RuleConditionEntity['options'];\n switch (field) {\n case 'amount':\n switch (subfield) {\n case 'amount-inflow':\n setOptions = { inflow: true };\n break;\n case 'amount-outflow':\n setOptions = { outflow: true };\n break;\n default:\n break;\n }\n break;\n case 'date':\n switch (subfield) {\n case 'month':\n setOptions = { month: true };\n break;\n case 'year':\n setOptions = { year: true };\n break;\n default:\n break;\n }\n break;\n default:\n break;\n }\n return setOptions;\n}\n","import { makeValue, FIELD_TYPES } from 'loot-core/src/shared/rules';\nimport { type RuleConditionEntity } from 'loot-core/src/types/models';\n\nexport function updateFilterReducer(\n state: { field: string; value: string | string[] | number | boolean | null },\n action: RuleConditionEntity,\n) {\n switch (action.type) {\n case 'set-op': {\n const type = FIELD_TYPES.get(state.field);\n let value = state.value;\n if (\n (type === 'id' || type === 'string') &&\n (action.op === 'contains' ||\n action.op === 'is' ||\n action.op === 'doesNotContain' ||\n action.op === 'isNot')\n ) {\n // Clear out the value if switching between contains or\n // is/oneof for the id or string type\n value = null;\n }\n return { ...state, op: action.op, value };\n }\n case 'set-value': {\n const { value } = makeValue(action.value, {\n type: FIELD_TYPES.get(state.field),\n });\n return { ...state, value };\n }\n default:\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n}\n","import React, { useState, useRef, useEffect, useReducer } from 'react';\n\nimport { FocusScope } from '@react-aria/focus';\nimport {\n parse as parseDate,\n format as formatDate,\n isValid as isDateValid,\n} from 'date-fns';\n\nimport { useFilters } from 'loot-core/src/client/data-hooks/filters';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { getMonthYearFormat } from 'loot-core/src/shared/months';\nimport {\n mapField,\n deserializeField,\n getFieldError,\n unparse,\n FIELD_TYPES,\n TYPE_INFO,\n} from 'loot-core/src/shared/rules';\nimport { titleFirst } from 'loot-core/src/shared/util';\n\nimport { useDateFormat } from '../../hooks/useDateFormat';\nimport { theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { HoverTarget } from '../common/HoverTarget';\nimport { Menu } from '../common/Menu';\nimport { Select } from '../common/Select';\nimport { Stack } from '../common/Stack';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { Tooltip } from '../tooltips';\nimport { GenericInput } from '../util/GenericInput';\n\nimport { CompactFiltersButton } from './CompactFiltersButton';\nimport { FiltersButton } from './FiltersButton';\nimport { OpButton } from './OpButton';\nimport { subfieldFromFilter } from './subfieldFromFilter';\nimport { subfieldToOptions } from './subfieldToOptions';\nimport { updateFilterReducer } from './updateFilterReducer';\n\nconst filterFields = [\n 'date',\n 'account',\n 'payee',\n 'notes',\n 'category',\n 'amount',\n 'cleared',\n 'reconciled',\n 'saved',\n].map(field => [field, mapField(field)]);\n\nfunction ConfigureField({\n field,\n initialSubfield = field,\n op,\n value,\n dispatch,\n onApply,\n}) {\n const [subfield, setSubfield] = useState(initialSubfield);\n const inputRef = useRef();\n const prevOp = useRef(null);\n\n useEffect(() => {\n if (prevOp.current !== op && inputRef.current) {\n inputRef.current.focus();\n }\n prevOp.current = op;\n }, [op]);\n\n const type = FIELD_TYPES.get(field);\n let ops = TYPE_INFO[type].ops.filter(op => op !== 'isbetween');\n\n // Month and year fields are quite hacky right now! Figure out how\n // to clean this up later\n if (subfield === 'month' || subfield === 'year') {\n ops = ['is'];\n }\n\n return (\n <Tooltip\n position=\"bottom-left\"\n style={{ padding: 15, color: theme.menuItemText }}\n width={275}\n onClose={() => dispatch({ type: 'close' })}\n data-testid=\"filters-menu-tooltip\"\n >\n <FocusScope>\n <View style={{ marginBottom: 10 }}>\n <Stack direction=\"row\" align=\"flex-start\">\n {field === 'amount' || field === 'date' ? (\n <Select\n bare\n options={\n field === 'amount'\n ? [\n ['amount', 'Amount'],\n ['amount-inflow', 'Amount (inflow)'],\n ['amount-outflow', 'Amount (outflow)'],\n ]\n : field === 'date'\n ? [\n ['date', 'Date'],\n ['month', 'Month'],\n ['year', 'Year'],\n ]\n : null\n }\n value={subfield}\n onChange={sub => {\n setSubfield(sub);\n\n if (sub === 'month' || sub === 'year') {\n dispatch({ type: 'set-op', op: 'is' });\n }\n }}\n style={{ borderWidth: 1 }}\n />\n ) : (\n titleFirst(mapField(field))\n )}\n <View style={{ flex: 1 }} />\n </Stack>\n </View>\n\n <View\n style={{\n color: theme.pageTextLight,\n marginBottom: 10,\n }}\n >\n {field === 'saved' && 'Existing filters will be cleared'}\n </View>\n\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ flexWrap: 'wrap' }}\n >\n {type === 'boolean' ? (\n <>\n <OpButton\n key=\"true\"\n op=\"true\"\n selected={value === true}\n onClick={() => {\n dispatch({ type: 'set-op', op: 'is' });\n dispatch({ type: 'set-value', value: true });\n }}\n />\n <OpButton\n key=\"false\"\n op=\"false\"\n selected={value === false}\n onClick={() => {\n dispatch({ type: 'set-op', op: 'is' });\n dispatch({ type: 'set-value', value: false });\n }}\n />\n </>\n ) : (\n <>\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ flexWrap: 'wrap' }}\n >\n {ops.slice(0, 3).map(currOp => (\n <OpButton\n key={currOp}\n op={currOp}\n selected={currOp === op}\n onClick={() => dispatch({ type: 'set-op', op: currOp })}\n />\n ))}\n </Stack>\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ flexWrap: 'wrap' }}\n >\n {ops.slice(3, ops.length).map(currOp => (\n <OpButton\n key={currOp}\n op={currOp}\n selected={currOp === op}\n onClick={() => dispatch({ type: 'set-op', op: currOp })}\n />\n ))}\n </Stack>\n </>\n )}\n </Stack>\n\n <form action=\"#\">\n {type !== 'boolean' && (\n <GenericInput\n inputRef={inputRef}\n field={field}\n subfield={subfield}\n type={\n type === 'id' && (op === 'contains' || op === 'doesNotContain')\n ? 'string'\n : type\n }\n value={value}\n multi={op === 'oneOf' || op === 'notOneOf'}\n style={{ marginTop: 10 }}\n onChange={v => dispatch({ type: 'set-value', value: v })}\n />\n )}\n\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n align=\"center\"\n style={{ marginTop: 15 }}\n >\n <View style={{ flex: 1 }} />\n <Button\n type=\"primary\"\n onClick={e => {\n e.preventDefault();\n onApply({\n field,\n op,\n value,\n options: subfieldToOptions(field, subfield),\n });\n }}\n >\n Apply\n </Button>\n </Stack>\n </form>\n </FocusScope>\n </Tooltip>\n );\n}\n\nexport function FilterButton({ onApply, compact, hover }) {\n const filters = useFilters();\n\n const dateFormat = useDateFormat() || 'MM/dd/yyyy';\n\n const [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'select-field':\n return { ...state, fieldsOpen: true, condOpen: false };\n case 'configure': {\n const { field } = deserializeField(action.field);\n const type = FIELD_TYPES.get(field);\n const ops = TYPE_INFO[type].ops;\n return {\n ...state,\n fieldsOpen: false,\n condOpen: true,\n field: action.field,\n op: ops[0],\n value: type === 'boolean' ? true : null,\n };\n }\n case 'close':\n return { fieldsOpen: false, condOpen: false, value: null };\n default:\n return updateFilterReducer(state, action);\n }\n },\n { fieldsOpen: false, condOpen: false, field: null, value: null },\n );\n\n async function onValidateAndApply(cond) {\n cond = unparse({ ...cond, type: FIELD_TYPES.get(cond.field) });\n\n if (cond.type === 'date' && cond.options) {\n if (cond.options.month) {\n const date = parseDate(\n cond.value,\n getMonthYearFormat(dateFormat),\n new Date(),\n );\n if (isDateValid(date)) {\n cond.value = formatDate(date, 'yyyy-MM');\n } else {\n alert('Invalid date format');\n return;\n }\n } else if (cond.options.year) {\n const date = parseDate(cond.value, 'yyyy', new Date());\n if (isDateValid(date)) {\n cond.value = formatDate(date, 'yyyy');\n } else {\n alert('Invalid date format');\n return;\n }\n }\n }\n\n const { error } =\n cond.field !== 'saved' &&\n (await send('rule-validate', {\n conditions: [cond],\n actions: [],\n }));\n\n const saved = filters.find(f => cond.value === f.id);\n\n if (error && error.conditionErrors.length > 0) {\n const field = titleFirst(mapField(cond.field));\n alert(field + ': ' + getFieldError(error.conditionErrors[0]));\n } else {\n onApply(saved ? saved : cond);\n dispatch({ type: 'close' });\n }\n }\n\n return (\n <View>\n <HoverTarget\n style={{ flexShrink: 0 }}\n renderContent={() =>\n hover && (\n <Tooltip\n position=\"bottom-left\"\n style={{\n lineHeight: 1.5,\n padding: '6px 10px',\n backgroundColor: theme.menuBackground,\n color: theme.menuItemText,\n }}\n >\n <Text>Filters</Text>\n </Tooltip>\n )\n }\n >\n {compact ? (\n <CompactFiltersButton\n onClick={() => dispatch({ type: 'select-field' })}\n />\n ) : (\n <FiltersButton onClick={() => dispatch({ type: 'select-field' })} />\n )}\n </HoverTarget>\n {state.fieldsOpen && (\n <Tooltip\n position=\"bottom-left\"\n style={{ padding: 0 }}\n onClose={() => dispatch({ type: 'close' })}\n data-testid=\"filters-select-tooltip\"\n >\n <Menu\n onMenuSelect={name => {\n dispatch({ type: 'configure', field: name });\n }}\n items={filterFields.map(([name, text]) => ({\n name,\n text: titleFirst(text),\n }))}\n />\n </Tooltip>\n )}\n {state.condOpen && (\n <ConfigureField\n field={state.field}\n op={state.op}\n value={state.value}\n dispatch={dispatch}\n onApply={onValidateAndApply}\n />\n )}\n </View>\n );\n}\n\nexport function FilterEditor({ field, op, value, options, onSave, onClose }) {\n const [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'close':\n onClose();\n return state;\n default:\n return updateFilterReducer(state, action);\n }\n },\n { field, op, value, options },\n );\n\n return (\n <ConfigureField\n field={state.field}\n initialSubfield={subfieldFromFilter({ field, options, value })}\n op={state.op}\n value={state.value}\n options={state.options}\n dispatch={dispatch}\n onApply={cond => {\n cond = unparse({ ...cond, type: FIELD_TYPES.get(cond.field) });\n onSave(cond);\n onClose();\n }}\n />\n );\n}\n","import React, { useState } from 'react';\n\nimport { mapField, friendlyOp } from 'loot-core/src/shared/rules';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport {\n type RuleConditionOp,\n type RuleConditionEntity,\n} from 'loot-core/src/types/models';\n\nimport { SvgDelete } from '../../icons/v0';\nimport { type CSSProperties, theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { Value } from '../rules/Value';\n\nimport { FilterEditor } from './FiltersMenu';\nimport { subfieldFromFilter } from './subfieldFromFilter';\n\ntype FilterExpressionProps = {\n field: string | undefined;\n customName: string | undefined;\n op: RuleConditionOp | undefined;\n value: string | string[] | number | boolean | undefined;\n options: RuleConditionEntity['options'];\n style?: CSSProperties;\n onChange: (cond: RuleConditionEntity) => RuleConditionEntity;\n onDelete: () => void;\n};\n\nexport function FilterExpression({\n field: originalField,\n customName,\n op,\n value,\n options,\n style,\n onChange,\n onDelete,\n}: FilterExpressionProps) {\n const [editing, setEditing] = useState(false);\n\n const field = subfieldFromFilter({ field: originalField, value });\n\n return (\n <View\n style={{\n backgroundColor: theme.pillBackground,\n borderRadius: 4,\n flexDirection: 'row',\n alignItems: 'center',\n marginRight: 10,\n marginTop: 10,\n ...style,\n }}\n >\n <Button\n type=\"bare\"\n disabled={customName != null}\n onClick={() => setEditing(true)}\n style={{ marginRight: -7 }}\n >\n <div style={{ paddingBlock: 1, paddingLeft: 5, paddingRight: 2 }}>\n {customName ? (\n <Text style={{ color: theme.pageTextPositive }}>{customName}</Text>\n ) : (\n <>\n <Text style={{ color: theme.pageTextPositive }}>\n {mapField(field, options)}\n </Text>{' '}\n <Text>{friendlyOp(op, null)}</Text>{' '}\n <Value\n value={value}\n field={field}\n inline={true}\n valueIsRaw={op === 'contains' || op === 'doesNotContain'}\n />\n </>\n )}\n </div>\n </Button>\n <Button type=\"bare\" onClick={onDelete} aria-label=\"Delete filter\">\n <SvgDelete\n style={{\n width: 8,\n height: 8,\n margin: 5,\n marginLeft: 3,\n }}\n />\n </Button>\n {editing && (\n <FilterEditor\n field={originalField}\n op={op}\n value={\n field === 'amount' && typeof value === 'number'\n ? integerToCurrency(value)\n : value\n }\n options={options}\n onSave={onChange}\n onClose={() => setEditing(false)}\n />\n )}\n </View>\n );\n}\n","import React from 'react';\n\nimport { type RuleConditionEntity } from 'loot-core/src/types/models';\n\nimport { View } from '../common/View';\n\nimport { CondOpMenu } from './CondOpMenu';\nimport { FilterExpression } from './FilterExpression';\n\ntype AppliedFiltersProps = {\n filters: RuleConditionEntity[];\n onUpdate: (\n filter: RuleConditionEntity,\n newFilter: RuleConditionEntity,\n ) => RuleConditionEntity;\n onDelete: (filter: RuleConditionEntity) => void;\n conditionsOp: string;\n onCondOpChange: (value: string, filters: RuleConditionEntity[]) => void;\n};\n\nexport function AppliedFilters({\n filters,\n onUpdate,\n onDelete,\n conditionsOp,\n onCondOpChange,\n}: AppliedFiltersProps) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'flex-start',\n flexWrap: 'wrap',\n }}\n >\n <CondOpMenu\n conditionsOp={conditionsOp}\n onCondOpChange={onCondOpChange}\n filters={filters}\n />\n {filters.map((filter: RuleConditionEntity, i: number) => (\n <FilterExpression\n key={i}\n customName={filter.customName}\n field={filter.field}\n op={filter.op}\n value={filter.value}\n options={filter.options}\n onChange={newFilter => onUpdate(filter, newFilter)}\n onDelete={() => onDelete(filter)}\n />\n ))}\n </View>\n );\n}\n"],"names":["SvgFilter","props","_jsx","svg","xmlns","viewBox","style","color","path","d","fill","SvgSettingsSliderAlternate","MenuButton","onClick","Button","type","aria-label","SvgDotsHorizontalTriple","width","height","transform","MenuTooltip","onClose","children","Tooltip","position","padding","CondOpMenu","conditionsOp","onCondOpChange","filters","length","_jsxs","Text","theme","pageText","marginTop","marginRight","FieldSelect","display","fields","value","onChange","name","View","CompactFiltersButton","FiltersButton","title","OpButton","op","selected","backgroundColor","pillBackground","marginBottom","buttonNormalSelectedText","buttonNormalSelectedBackground","friendlyOp","subfieldFromFilter","field","options","inflow","outflow","subfieldToOptions","subfield","setOptions","month","year","updateFilterReducer","state","action","FIELD_TYPES","get","makeValue","Error","filterFields","map","mapField","ConfigureField","initialSubfield","dispatch","onApply","setSubfield","useState","inputRef","useRef","prevOp","useEffect","current","focus","ops","TYPE_INFO","filter","menuItemText","data-testid","FocusScope","Stack","direction","align","Select","bare","sub","borderWidth","titleFirst","flex","pageTextLight","spacing","flexWrap","_Fragment","slice","currOp","form","GenericInput","multi","v","justify","e","preventDefault","FilterButton","compact","hover","useFilters","dateFormat","useDateFormat","useReducer","fieldsOpen","condOpen","deserializeField","onValidateAndApply","cond","unparse","date","parseDate","getMonthYearFormat","Date","isDateValid","formatDate","alert","error","send","conditions","actions","saved","find","f","id","conditionErrors","getFieldError","HoverTarget","flexShrink","renderContent","lineHeight","menuBackground","Menu","onMenuSelect","items","text","FilterEditor","onSave","FilterExpression","originalField","customName","onDelete","editing","setEditing","borderRadius","flexDirection","alignItems","disabled","div","paddingBlock","paddingLeft","paddingRight","pageTextPositive","Value","inline","valueIsRaw","SvgDelete","margin","marginLeft","integerToCurrency","AppliedFilters","onUpdate","i","newFilter"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{ax as g,Z as T,j as e,V as d,ar as b,d5 as x,aw as S,as as B,a7 as f,U as h,X as w,d6 as V,d as j,cH as R,ct as E,Q as F,aq as y,d7 as M}from"./index.O6ABAWXP.js";function G({carryover:t,balance:i,goal:n,budgeted:o,disabled:c,style:u,balanceStyle:s,carryoverStyle:a}){const l=g(t),m=g(i),p=g(n),r=g(o),v=T("goalTemplatesEnabled");return e.jsxs(d,{style:u,children:[e.jsx(b,{binding:i,type:"financial",getStyle:C=>x(C,v?p:null,r),style:{textAlign:"right",...!c&&{cursor:"pointer",":hover":{textDecoration:"underline"}},...s}}),l&&e.jsx(d,{style:{alignSelf:"center",marginLeft:2,position:"absolute",right:-8,top:0,bottom:0,justifyContent:"center",...a},children:e.jsx(S,{width:7,height:7,style:x(m,p,r)})})]})}function _({categoryId:t,tooltip:i,monthIndex:n,onBudgetAction:o,onClose:c,...u}){const s=g(B.catCarryover(t)),a=()=>{i.close(),c?.()};return e.jsx(f,{position:"bottom-right",width:200,style:{padding:0},onClose:a,...u,children:e.jsx(h,{onMenuSelect:()=>{o(n,"carryover",{category:t,flag:!s}),a()},items:[{name:"carryover",text:s?"Remove overspending rollover":"Rollover overspending"}]})})}function k({tooltipProps:t,onSubmit:i,onClose:n}){let{grouped:o}=w();o=V(o.filter(a=>!a.is_income));const[c,u]=j.useState(null);function s(){c&&(i(c),n())}return e.jsxs(f,{position:"bottom-right",width:200,style:{padding:10},...t,onClose:n,children:[e.jsx(d,{style:{marginBottom:5},children:"Cover from category:"}),e.jsx(R,{children:a=>e.jsx(E,{categoryGroups:o,value:null,openOnFocus:!0,onUpdate:()=>{},onSelect:l=>u(l),inputProps:{inputRef:a,onKeyDown:l=>{l.key==="Enter"&&s()}}})}),e.jsx(d,{style:{alignItems:"flex-end",marginTop:10},children:e.jsx(F,{type:"primary",style:{fontSize:12,paddingTop:3},onClick:s,children:"Transfer"})})]})}function D({categoryId:t,tooltip:i,monthIndex:n,onBudgetAction:o,onClose:c,...u}){const s=g(y.catCarryover(t)),a=g(y.catBalance(t)),[l,m]=j.useState("menu"),p=()=>{i.close(),c?.()};return e.jsxs(e.Fragment,{children:[l==="menu"&&e.jsx(f,{position:"bottom-right",width:200,style:{padding:0},onClose:p,...u,children:e.jsx(h,{onMenuSelect:r=>{r==="carryover"?(o(n,"carryover",{category:t,flag:!s}),p()):m(r)},items:[{name:"transfer",text:"Transfer to another category"},{name:"carryover",text:s?"Remove overspending rollover":"Rollover overspending"},a<0&&{name:"cover",text:"Cover overspending"}].filter(r=>r)})}),l==="transfer"&&e.jsx(M,{initialAmountName:y.catBalance(t),showToBeBudgeted:!0,onClose:p,onSubmit:(r,v)=>{o(n,"transfer-category",{amount:r,from:t,to:v})}}),l==="cover"&&e.jsx(k,{onClose:p,onSubmit:r=>{o(n,"cover",{to:t,from:r})}})]})}export{G as B,_ as a,D as b};
2
- //# sourceMappingURL=BalanceTooltip.nSDrDsfc.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BalanceTooltip.nSDrDsfc.chunk.js","sources":["../../../src/components/budget/BalanceWithCarryover.tsx","../../../src/components/budget/report/BalanceTooltip.tsx","../../../src/components/budget/rollover/CoverTooltip.tsx","../../../src/components/budget/rollover/BalanceTooltip.tsx"],"sourcesContent":["// @ts-strict-ignore\nimport React, { type ComponentProps } from 'react';\n\nimport { useFeatureFlag } from '../../hooks/useFeatureFlag';\nimport { SvgArrowThinRight } from '../../icons/v1';\nimport { type CSSProperties } from '../../style';\nimport { View } from '../common/View';\nimport { CellValue } from '../spreadsheet/CellValue';\nimport { useSheetValue } from '../spreadsheet/useSheetValue';\n\nimport { makeAmountStyle } from './util';\n\ntype BalanceWithCarryoverProps = {\n carryover: ComponentProps<typeof CellValue>['binding'];\n balance: ComponentProps<typeof CellValue>['binding'];\n goal?: ComponentProps<typeof CellValue>['binding'];\n budgeted?: ComponentProps<typeof CellValue>['binding'];\n disabled?: boolean;\n style?: CSSProperties;\n balanceStyle?: CSSProperties;\n carryoverStyle?: CSSProperties;\n};\nexport function BalanceWithCarryover({\n carryover,\n balance,\n goal,\n budgeted,\n disabled,\n style,\n balanceStyle,\n carryoverStyle,\n}: BalanceWithCarryoverProps) {\n const carryoverValue = useSheetValue(carryover);\n const balanceValue = useSheetValue(balance);\n const goalValue = useSheetValue(goal);\n const budgetedValue = useSheetValue(budgeted);\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n return (\n <View style={style}>\n <CellValue\n binding={balance}\n type=\"financial\"\n getStyle={value =>\n makeAmountStyle(\n value,\n isGoalTemplatesEnabled ? goalValue : null,\n budgetedValue,\n )\n }\n style={{\n textAlign: 'right',\n ...(!disabled && {\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' },\n }),\n ...balanceStyle,\n }}\n />\n {carryoverValue && (\n <View\n style={{\n alignSelf: 'center',\n marginLeft: 2,\n position: 'absolute',\n right: -8,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n ...carryoverStyle,\n }}\n >\n <SvgArrowThinRight\n width={7}\n height={7}\n style={makeAmountStyle(balanceValue, goalValue, budgetedValue)}\n />\n </View>\n )}\n </View>\n );\n}\n","import React from 'react';\n\nimport { reportBudget } from 'loot-core/src/client/queries';\n\nimport { Menu } from '../../common/Menu';\nimport { useSheetValue } from '../../spreadsheet/useSheetValue';\nimport { Tooltip } from '../../tooltips';\n\ntype BalanceTooltipProps = {\n categoryId: string;\n tooltip: { close: () => void };\n monthIndex: number;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n onClose?: () => void;\n};\n\nexport function BalanceTooltip({\n categoryId,\n tooltip,\n monthIndex,\n onBudgetAction,\n onClose,\n ...tooltipProps\n}: BalanceTooltipProps) {\n const carryover = useSheetValue(reportBudget.catCarryover(categoryId));\n\n const _onClose = () => {\n tooltip.close();\n onClose?.();\n };\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={_onClose}\n {...tooltipProps}\n >\n <Menu\n onMenuSelect={() => {\n onBudgetAction(monthIndex, 'carryover', {\n category: categoryId,\n flag: !carryover,\n });\n _onClose();\n }}\n items={[\n {\n name: 'carryover',\n text: carryover\n ? 'Remove overspending rollover'\n : 'Rollover overspending',\n },\n ]}\n />\n </Tooltip>\n );\n}\n","// @ts-strict-ignore\nimport React, { type ComponentProps, useState } from 'react';\n\nimport { useCategories } from '../../../hooks/useCategories';\nimport { CategoryAutocomplete } from '../../autocomplete/CategoryAutocomplete';\nimport { Button } from '../../common/Button';\nimport { InitialFocus } from '../../common/InitialFocus';\nimport { View } from '../../common/View';\nimport { Tooltip } from '../../tooltips';\nimport { addToBeBudgetedGroup } from '../util';\n\ntype CoverTooltipProps = {\n tooltipProps?: ComponentProps<typeof Tooltip>;\n onSubmit: (category: unknown) => void;\n onClose: () => void;\n};\nexport function CoverTooltip({\n tooltipProps,\n onSubmit,\n onClose,\n}: CoverTooltipProps) {\n let { grouped: categoryGroups } = useCategories();\n categoryGroups = addToBeBudgetedGroup(\n categoryGroups.filter(g => !g.is_income),\n );\n const [category, setCategory] = useState(null);\n\n function submit() {\n if (category) {\n onSubmit(category);\n onClose();\n }\n }\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 10 }}\n {...tooltipProps}\n onClose={onClose}\n >\n <View style={{ marginBottom: 5 }}>Cover from category:</View>\n\n <InitialFocus>\n {node => (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={null}\n openOnFocus={true}\n onUpdate={() => {}}\n onSelect={id => setCategory(id)}\n inputProps={{\n inputRef: node,\n onKeyDown: e => {\n if (e.key === 'Enter') {\n submit();\n }\n },\n }}\n />\n )}\n </InitialFocus>\n\n <View\n style={{\n alignItems: 'flex-end',\n marginTop: 10,\n }}\n >\n <Button\n type=\"primary\"\n style={{\n fontSize: 12,\n paddingTop: 3,\n }}\n onClick={submit}\n >\n Transfer\n </Button>\n </View>\n </Tooltip>\n );\n}\n","// @ts-strict-ignore\nimport React, { useState } from 'react';\n\nimport { rolloverBudget } from 'loot-core/src/client/queries';\n\nimport { Menu } from '../../common/Menu';\nimport { useSheetValue } from '../../spreadsheet/useSheetValue';\nimport { Tooltip } from '../../tooltips';\n\nimport { CoverTooltip } from './CoverTooltip';\nimport { TransferTooltip } from './TransferTooltip';\n\ntype BalanceTooltipProps = {\n categoryId: string;\n tooltip: { close: () => void };\n monthIndex: number;\n onBudgetAction: (idx: number, action: string, arg?: unknown) => void;\n onClose?: () => void;\n};\nexport function BalanceTooltip({\n categoryId,\n tooltip,\n monthIndex,\n onBudgetAction,\n onClose,\n ...tooltipProps\n}: BalanceTooltipProps) {\n const carryover = useSheetValue(rolloverBudget.catCarryover(categoryId));\n const balance = useSheetValue(rolloverBudget.catBalance(categoryId));\n const [menu, setMenu] = useState('menu');\n\n const _onClose = () => {\n tooltip.close();\n onClose?.();\n };\n\n return (\n <>\n {menu === 'menu' && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={_onClose}\n {...tooltipProps}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'carryover') {\n onBudgetAction(monthIndex, 'carryover', {\n category: categoryId,\n flag: !carryover,\n });\n _onClose();\n } else {\n setMenu(type);\n }\n }}\n items={[\n {\n name: 'transfer',\n text: 'Transfer to another category',\n },\n {\n name: 'carryover',\n text: carryover\n ? 'Remove overspending rollover'\n : 'Rollover overspending',\n },\n balance < 0 && {\n name: 'cover',\n text: 'Cover overspending',\n },\n ].filter(x => x)}\n />\n </Tooltip>\n )}\n\n {menu === 'transfer' && (\n <TransferTooltip\n initialAmountName={rolloverBudget.catBalance(categoryId)}\n showToBeBudgeted={true}\n onClose={_onClose}\n onSubmit={(amount, toCategory) => {\n onBudgetAction(monthIndex, 'transfer-category', {\n amount,\n from: categoryId,\n to: toCategory,\n });\n }}\n />\n )}\n\n {menu === 'cover' && (\n <CoverTooltip\n onClose={_onClose}\n onSubmit={fromCategory => {\n onBudgetAction(monthIndex, 'cover', {\n to: categoryId,\n from: fromCategory,\n });\n }}\n />\n )}\n </>\n );\n}\n"],"names":["BalanceWithCarryover","carryover","balance","goal","budgeted","disabled","style","balanceStyle","carryoverStyle","carryoverValue","useSheetValue","balanceValue","goalValue","budgetedValue","isGoalTemplatesEnabled","useFeatureFlag","View","CellValue","binding","type","getStyle","value","makeAmountStyle","textAlign","cursor","textDecoration","alignSelf","marginLeft","position","right","top","bottom","justifyContent","SvgArrowThinRight","width","height","BalanceTooltip","categoryId","tooltip","monthIndex","onBudgetAction","onClose","tooltipProps","reportBudget","catCarryover","_onClose","close","Tooltip","padding","Menu","onMenuSelect","category","flag","items","name","text","CoverTooltip","onSubmit","grouped","categoryGroups","useCategories","addToBeBudgetedGroup","filter","g","is_income","setCategory","useState","submit","marginBottom","InitialFocus","node","_jsx","CategoryAutocomplete","openOnFocus","onUpdate","onSelect","id","inputProps","inputRef","onKeyDown","e","key","alignItems","marginTop","Button","fontSize","paddingTop","onClick","rolloverBudget","catBalance","menu","setMenu","_Fragment","x","TransferTooltip","initialAmountName","showToBeBudgeted","amount","toCategory","from","to","fromCategory"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{aN as c,bd as e,j as r,Q as m}from"./index.O6ABAWXP.js";function h({to:t,style:s,activeStyle:a,...n}){const o=c(),i=e({path:t});return r.jsx(m,{style:{...s,...i?a:{}},activeStyle:a,...n,onClick:u=>{n.onClick?.(u),o(t)}})}export{h as B};
2
- //# sourceMappingURL=ButtonLink.ElUV7DMx.chunk.js.map