@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
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,z as h,ay as A,aa as b,T as w,t as f,da as I,V as x,db as M,dc as H,dd as m,de as F,d3 as N,bF as V,r as g,df as W,dg as B,a9 as Z,W as z,cM as C,S as j,a5 as L,ai as P,dh as E,di as k,dj as Y,cQ as T,f as S,h as $,dk as _,dl as G,dm as Q,i as U}from"./index.MAk9r4yg.js";import{i as q}from"./import.M8LEm-Nc.chunk.js";const J=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"})}),K=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 ae({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 de({width:t,onClose:s,children:n}){return e.jsx(b,{position:"bottom-right",width:t,style:{padding:0},onClose:s,children:n})}function X({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(J,{width:15,height:15})})}function te({onClick:t}){return e.jsxs(h,{type:"bare",onClick:t,title:"Filters",children:[e.jsx(K,{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:M(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}=H(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,F(t)]);function D({field:t,initialSubfield:s=t,op:n,value:o,dispatch:a,onApply:d}){const[r,y]=g.useState(s),l=g.useRef(),u=g.useRef(null);g.useEffect(()=>{u.current!==n&&l.current&&l.current.focus(),u.current=n},[n]);const p=m.get(t);let c=B[p].ops.filter(i=>i!=="isbetween");return(r==="month"||r==="year")&&(c=["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(q,{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}}):C(F(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:c.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:c.slice(3,c.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(),d({field:t,op:n,value:o,options:ne(t,r)})},children:"Apply"})]})]})]})})}function ue({onApply:t,compact:s,hover:n}){const o=N(),a=V()||"MM/dd/yyyy",[d,r]=g.useReducer((l,u)=>{switch(u.type){case"select-field":return{...l,fieldsOpen:!0,condOpen:!1};case"configure":{const{field:p}=W(u.field),c=m.get(p),i=B[c].ops;return{...l,fieldsOpen:!1,condOpen:!0,field:u.field,op:i[0],value:c==="boolean"?!0:null}}case"close":return{fieldsOpen:!1,condOpen:!1,value:null};default:return R(l,u)}},{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 c=k(l.value,Y(a),new Date);if(T(c))l.value=S(c,"yyyy-MM");else{alert("Invalid date format");return}}else if(l.options.year){const c=k(l.value,"yyyy",new Date);if(T(c))l.value=S(c,"yyyy");else{alert("Invalid date format");return}}}const{error:u}=l.field!=="saved"&&await $("rule-validate",{conditions:[l],actions:[]}),p=o.find(c=>l.value===c.id);if(u&&u.conditionErrors.length>0){const c=C(F(l.field));alert(c+": "+_(u.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"})})}),d.fieldsOpen&&e.jsx(b,{position:"bottom-left",style:{padding:0},onClose:()=>r({type:"close"}),"data-testid":"filters-select-tooltip",children:e.jsx(z,{onMenuSelect:l=>{r({type:"configure",field:l})},items:le.map(([l,u])=>({name:l,text:C(u)}))})}),d.condOpen&&e.jsx(D,{field:d.field,op:d.op,value:d.value,dispatch:r,onApply:y})]})}function se({field:t,op:s,value:n,options:o,onSave:a,onClose:d}){const[r,y]=g.useReducer((l,u)=>{switch(u.type){case"close":return d(),l;default:return R(l,u)}},{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),d()}})}function oe({field:t,customName:s,op:n,value:o,options:a,style:d,onChange:r,onDelete:y}){const[l,u]=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,...d},children:[e.jsx(h,{type:"bare",disabled:s!=null,onClick:()=>u(!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:F(p,a)})," ",e.jsx(w,{children:M(n,null)})," ",e.jsx(G,{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(Q,{style:{width:8,height:8,margin:5,marginLeft:3}})}),l&&e.jsx(se,{field:t,op:n,value:p==="amount"&&typeof o=="number"?U(o):o,options:a,onSave:r,onClose:()=>u(!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(X,{conditionsOp:o,onCondOpChange:a,filters:t}),t.map((d,r)=>e.jsx(oe,{customName:d.customName,field:d.field,op:d.op,value:d.value,options:d.options,onChange:y=>s(d,y),onDelete:()=>n(d)},r))]})}export{ce as A,ue as F,de as M,ae as a};
|
|
2
|
+
//# sourceMappingURL=AppliedFilters.6hw_SZMi.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppliedFilters.6hw_SZMi.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","import React, { type ReactNode } from 'react';\n\nimport { Tooltip } from '../tooltips';\n\ntype MenuTooltipProps = {\n width: number;\n onClose: () => void;\n children: ReactNode;\n};\n\nexport function MenuTooltip({ width, onClose, children }: MenuTooltipProps) {\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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"}
|