Files
firefly-iii/public/build/assets/dashboard-ada6c7cd.js
2024-01-02 15:41:14 +01:00

2 lines
28 KiB
JavaScript

import{a as k,f as g,g as y,P as Pt,l as z,G as kt,b as Dt,d as xt}from"./get-81296add.js";import{f,C as m,a as A,I as H,S as Ot,F as Mt,L as St,b as Ft,A as At,B as Bt,T as $t,P as jt,c as It,i as Wt,p as Vt,d as Kt,e as Et,g as Lt,h as Gt,j as Tt}from"./vendor-a1812e4c.js";class Rt{get(t,n,a){return k.get("/api/v2/summary/basic",{params:{start:t,end:n,code:a}})}}function D(e,t,n){const a=f(t,"y-MM-dd")+"_"+f(n,"y-MM-dd")+"_"+e;return console.log("getCacheKey: "+a),String(a)}let Q=!1;const Ut=()=>({balanceBox:{amounts:[],subtitles:[]},billBox:{paid:[],unpaid:[]},leftBox:{left:[],perDay:[]},netBox:{net:[]},autoConversion:!1,loading:!1,boxData:null,boxOptions:null,getFreshData(){const e=new Date(window.store.get("start")),t=new Date(window.store.get("end")),n=D("dashboard-boxes-data",e,t),a=window.store.get("cacheValid");let o=window.store.get(n);if(a&&typeof o<"u"){this.boxData=o,this.generateOptions(this.boxData);return}new Rt().get(f(e,"yyyy-MM-dd"),f(t,"yyyy-MM-dd"),null).then(i=>{this.boxData=i.data,window.store.set(n,i.data),this.generateOptions(this.boxData)})},generateOptions(e){this.balanceBox={amounts:[],subtitles:[]},this.billBox={paid:[],unpaid:[]},this.leftBox={left:[],perDay:[]},this.netBox={net:[]};let t={};for(const n in e)if(e.hasOwnProperty(n)){const a=e[n];if(!a.hasOwnProperty("key"))continue;let o=a.key;if(this.autoConversion){if(o.startsWith("balance-in-native")){this.balanceBox.amounts.push(g(a.value,a.currency_code)),t.hasOwnProperty(a.currency_code)||(t[a.currency_code]="");continue}if(o.startsWith("spent-in-native")){t.hasOwnProperty(a.currency_code)||(t[a.currency_code]=""),t[a.currency_code]=t[a.currency_code]+g(a.value,a.currency_code);continue}if(o.startsWith("earned-in-native")){t.hasOwnProperty(a.currency_code)||(t[a.currency_code]=""),t[a.currency_code]=g(a.value,a.currency_code)+" + "+t[a.currency_code];continue}if(o.startsWith("bills-unpaid-in-native")){this.billBox.unpaid.push(g(a.value,a.currency_code));continue}if(o.startsWith("bills-paid-in-native")){this.billBox.paid.push(g(a.value,a.currency_code));continue}if(o.startsWith("left-to-spend-in-native")){this.leftBox.left.push(g(a.value,a.currency_code));continue}if(o.startsWith("left-per-day-to-spend-in-native")){this.leftBox.perDay.push(g(a.value,a.currency_code));continue}if(o.startsWith("net-worth-in-native")){this.netBox.net.push(g(a.value,a.currency_code));continue}}if(!this.autoConversion&&!o.endsWith("native")){if(o.startsWith("balance-in-")){this.balanceBox.amounts.push(g(a.value,a.currency_code));continue}if(o.startsWith("spent-in-")){t.hasOwnProperty(a.currency_code)||(t[a.currency_code]=""),t[a.currency_code]=t[a.currency_code]+g(a.value,a.currency_code);continue}if(o.startsWith("earned-in-")){t.hasOwnProperty(a.currency_code)||(t[a.currency_code]=""),t[a.currency_code]=g(a.value,a.currency_code)+" + "+t[a.currency_code];continue}if(o.startsWith("bills-unpaid-in-")){this.billBox.unpaid.push(g(a.value,a.currency_code));continue}if(o.startsWith("bills-paid-in-")){this.billBox.paid.push(g(a.value,a.currency_code));continue}if(o.startsWith("left-to-spend-in-")){this.leftBox.left.push(g(a.value,a.currency_code));continue}if(o.startsWith("left-per-day-to-spend-in-")){this.leftBox.perDay.push(g(a.value,a.currency_code));continue}o.startsWith("net-worth-in-")&&this.netBox.net.push(g(a.value,a.currency_code))}}for(let n in t)t.hasOwnProperty(n)&&this.balanceBox.subtitles.push(t[n]);this.loading=!1},loadBoxes(){if(this.loading!==!0){if(this.loading=!0,this.boxData===null){this.getFreshData();return}this.generateOptions(this.boxData),this.loading=!1}},init(){Promise.all([y("viewRange"),y("autoConversion",!1)]).then(e=>{Q=!0,this.autoConversion=e[1],this.loadBoxes()}),window.store.observe("end",()=>{Q&&(this.boxData=null,this.loadBoxes())}),window.store.observe("autoConversion",e=>{Q&&(this.autoConversion=e,this.loadBoxes())})}});class qt{put(t,n){let a="/api/v1/preferences/"+t;return k.put(a,{data:n})}}function Nt(e,t=null){window.store.set(e,t),new qt().put(e,t).then(a=>{}).catch(()=>{new Pt().post(e,t).then(o=>{})})}let Yt=class{dashboard(t,n){let a=f(t,"y-MM-dd"),o=f(n,"y-MM-dd");return k.get("/api/v2/chart/account/dashboard",{params:{start:a,end:o}})}expense(t,n){let a=f(t,"y-MM-dd"),o=f(n,"y-MM-dd");return k.get("/api/v2/chart/account/expense-dashboard",{params:{start:a,end:o}})}},ht=class{get(t,n){let a={date:f(n,"y-MM-dd").slice(0,10)};return n?k.get("/api/v2/accounts/"+t,{params:a}):k.get("/api/v2/accounts/"+t)}transactions(t,n){const a={page:n.page??1};return n.hasOwnProperty("start")&&(a.start=f(n.start,"y-MM-dd")),n.hasOwnProperty("end")&&(a.end=f(n.end,"y-MM-dd")),k.get("/api/v2/accounts/"+t+"/transactions",{params:a})}};function J(e){return e==="sankey"?{type:"sankey",data:{datasets:[]},options:{animations:!1}}:e==="pie"?{type:"pie",data:{datasets:[]}}:e==="column"?{type:"bar",data:{labels:[],datasets:[]},options:{plugins:{tooltip:{callbacks:{label:function(t){let n=t.dataset.currency_code;return g(t.raw,n)}}}},maintainAspectRatio:!1,scales:{}}}:e==="line"?{options:{plugins:{tooltip:{callbacks:{label:function(t){let n=t.dataset.currency_code;return g(t.raw,n)}}}},maintainAspectRatio:!1,scales:{x:{type:"time",time:{tooltipFormat:"PP"}}}},type:"line",data:{labels:[],datasets:[]}}:{}}let Y=new m("#36a2eb"),V=new m("#ff6384"),R=new m("#4bc0c0"),yt=new m("#ff9f40"),zt=new m("#9966ff"),Ht=new m("#ffcd56"),Jt=new m("#c9cbcf"),gt=0;window.theme==="dark"&&(V.darken(.3).desaturate(.3),R.darken(.3).desaturate(.3),Y.darken(.3).desaturate(.3),yt.darken(.3).desaturate(.3));let X=[V,yt,Y,R,zt,Ht,Jt,R];function j(e,t){let n={borderColor:V.rgbString(),backgroundColor:V.rgbString()},a;switch(e){default:let r=Math.floor(gt/2)%X.length;a=new m(X[r].rgbString()),a.lighten(.38),n={borderColor:X[r].hexString(),backgroundColor:a.hexString()};break;case"spent":a=new m(Y.rgbString()),a.lighten(.38),n={borderColor:Y.rgbString(),backgroundColor:a.rgbString()};break;case"left":a=new m(R.rgbString()),a.lighten(.38),n={borderColor:R.rgbString(),backgroundColor:a.rgbString()};break;case"overspent":a=new m(V.rgbString()),a.lighten(.22),n={borderColor:V.rgbString(),backgroundColor:a.rgbString()};break}return gt++,t==="border"?n.borderColor:t==="background"?n.backgroundColor:"#FF0000"}let B=[],K=null,tt=null,et=!1;const Zt=()=>({loading:!1,loadingAccounts:!1,accountList:[],autoConversion:!1,chartOptions:null,switchAutoConversion(){this.autoConversion=!this.autoConversion,Nt("autoConversion",this.autoConversion)},getFreshData(){const e=new Date(window.store.get("start")),t=new Date(window.store.get("end")),n=D("dashboard-accounts-chart",e,t),a=window.store.get("cacheValid");let o=window.store.get(n);if(a&&typeof o<"u"){console.log(o),this.drawChart(this.generateOptions(o)),this.loading=!1;return}new Yt().dashboard(e,t,null).then(i=>{this.chartData=i.data,window.store.set(n,i.data),console.log(i.data),this.drawChart(this.generateOptions(this.chartData)),this.loading=!1})},generateOptions(e){B=[];let t=J("line");for(let n=0;n<e.length;n++)if(e.hasOwnProperty(n)){let a="y",o=e[n],r={},i=[];n===0&&(t.data.labels=Object.keys(o.entries)),r.label=o.label,this.autoConversion&&(B.push(o.native_currency_code),r.currency_code=o.native_currency_code,i=Object.values(o.native_entries),a="y"+o.native_currency_code),this.autoConversion||(a="y"+o.currency_code,r.currency_code=o.currency_code,B.push(o.currency_code),i=Object.values(o.entries)),r.yAxisID=a,r.data=i,t.data.datasets.push(r)}for(let n in B)if(B.hasOwnProperty(n)){let a="y"+B[n];t.options.scales.hasOwnProperty(a)||(t.options.scales[a]={id:n,type:"linear",position:parseInt(n)===1?"right":"left",ticks:{callback:function(o,r,i){return g(o,B[n])}}})}return t},loadChart(){if(this.loading!==!0){if(this.loading=!0,tt===null){this.getFreshData();return}this.drawChart(this.generateOptions(tt)),this.loading=!1}},drawChart(e){if(K!==null){K.options=e.options,K.data=e.data,K.update();return}K=new A(document.querySelector("#account-chart"),e)},loadAccounts(){if(this.loadingAccounts===!0)return;if(this.loadingAccounts=!0,this.accountList.length>0){this.loadingAccounts=!1;return}const e=new Date(window.store.get("start")),t=new Date(window.store.get("end")),n=D("dashboard-accounts-data",e,t),a=window.store.get("cacheValid");let o=window.store.get(n);if(a&&typeof o<"u"){this.accountList=o,this.loadingAccounts=!1;return}const r=10;let i=0,l=0,u=[];Promise.all([y("frontpageAccounts")]).then(d=>{i=d[0].length;for(let h in d[0]){let c=d[0];if(c.hasOwnProperty(h)){let p=c[h];new ht().get(p,new Date(window.store.get("end"))).then(v=>{let C=v.data.data;const Ct={page:1,start:new Date(window.store.get("start")),end:new Date(window.store.get("end"))};new ht().transactions(C.id,Ct).then(st=>{let lt=[];for(let $=0;$<st.data.data.length&&!($>=r);$++){let M=st.data.data[$],ut={title:M.attributes.group_title===null?"":M.attributes.group_title,id:M.id,transactions:[]};for(let Z=0;Z<M.attributes.transactions.length;Z++){let P=M.attributes.transactions[Z];const ct=P.type==="withdrawal"?parseFloat(P.native_amount)*-1:parseFloat(P.native_amount),dt=P.type==="withdrawal"?parseFloat(P.amount)*-1:parseFloat(P.amount);ut.transactions.push({description:P.description,id:M.id,type:P.type,amount_raw:dt,amount:g(dt,P.currency_code),native_amount_raw:ct,native_amount:g(ct,P.native_currency_code)})}lt.push(ut)}u.push({name:C.attributes.name,order:C.attributes.order,id:C.id,balance_raw:parseFloat(C.attributes.current_balance),balance:g(C.attributes.current_balance,C.attributes.currency_code),native_balance_raw:parseFloat(C.attributes.native_current_balance),native_balance:g(C.attributes.native_current_balance,C.attributes.native_currency_code),groups:lt}),l++,l===i&&(u.sort(($,M)=>$.order-M.order),this.accountList=u,this.loadingAccounts=!1,window.store.set(n,u))})})}}})},init(){Promise.all([y("viewRange","1M"),y("autoConversion",!1),y("language","en_US")]).then(e=>{this.autoConversion=e[1],et=!0,this.loadChart(),this.loadAccounts()}),window.store.observe("end",()=>{et&&(tt=null,this.accountList=[],this.loadChart(),this.loadAccounts())}),window.store.observe("autoConversion",()=>{et&&(this.loadChart(),this.loadAccounts())})}});let Qt=class{dashboard(t,n){let a=f(t,"y-MM-dd"),o=f(n,"y-MM-dd");return k.get("/api/v2/chart/budget/dashboard",{params:{start:a,end:o}})}},E=[],U=null,S=null,at=!1,I;const Xt=()=>({loading:!1,autoConversion:!1,loadChart(){if(this.loading!==!0){if(this.loading=!0,S!==null){this.drawChart(this.generateOptions(S)),this.loading=!1;return}this.getFreshData()}},drawChart(e){if(U!==null){U.data.datasets=e.data.datasets,U.update();return}U=new A(document.querySelector("#budget-chart"),e)},getFreshData(){const e=new Date(window.store.get("start")),t=new Date(window.store.get("end")),n=D("dashboard-budgets-chart",e,t),a=window.store.get("cacheValid");let o=window.store.get(n);if(a&&typeof o<"u"){S=o,this.drawChart(this.generateOptions(S)),this.loading=!1;return}new Qt().dashboard(e,t,null).then(i=>{S=i.data,this.drawChart(this.generateOptions(S)),window.store.set(n,S),this.loading=!1})},generateOptions(e){E=[];let t=J("column");t.options.locale=window.store.get("locale").replace("_","-"),t.options.plugins={tooltip:{callbacks:{title:function(n){return n.label},label:function(n){let a=n.dataset.label||"";return a&&(a+=": "),a+" "+g(n.parsed.y,E[n.parsed.x]??"EUR")}}}},t.data={labels:[],datasets:[{label:I.t("firefly.spent"),data:[],borderWidth:1,stack:1,backgroundColor:j("spent","background"),borderColor:j("spent","border")},{label:I.t("firefly.left"),data:[],borderWidth:1,stack:1,backgroundColor:j("left","background"),borderColor:j("left","border")},{label:I.t("firefly.overspent"),data:[],borderWidth:1,stack:1,backgroundColor:j("overspent","background"),borderColor:j("overspent","border")}]};for(const n in e)if(e.hasOwnProperty(n)){let a=e[n],o=a.label+" ("+a.currency_code+")";t.data.labels.push(o),this.autoConversion&&(E.push(a.native_currency_code),t.data.datasets[0].data.push(parseFloat(a.native_entries.spent)*-1),t.data.datasets[1].data.push(parseFloat(a.native_entries.left)),t.data.datasets[2].data.push(parseFloat(a.native_entries.overspent))),this.autoConversion||(E.push(a.currency_code),t.data.datasets[0].data.push(parseFloat(a.entries.spent)*-1),t.data.datasets[1].data.push(parseFloat(a.entries.left)),t.data.datasets[2].data.push(parseFloat(a.entries.overspent)))}return t.options.scales={y:{ticks:{callback:function(n){return g(n,E[0]??"EUR")}}}},t},init(){Promise.all([y("autoConversion",!1),y("language","en_US")]).then(e=>{I=new H;const t=e[1].replace("-","_");I.locale=t,z(I,t).then(()=>{this.autoConversion=e[0],at=!0,this.loading===!1&&this.loadChart()})}),window.store.observe("end",()=>{at&&this.loading===!1&&(S=null,this.loadChart())}),window.store.observe("autoConversion",e=>{at&&(this.autoConversion=e,this.loading===!1&&this.loadChart())})}});class te{dashboard(t,n){let a=f(t,"y-MM-dd"),o=f(n,"y-MM-dd");return k.get("/api/v2/chart/category/dashboard",{params:{start:a,end:o}})}}let ft=[],L=null,W=null,nt=!1;const ee=()=>({loading:!1,autoConversion:!1,generateOptions(e){ft=[];let t=J("column"),n={};for(const o in e)if(e.hasOwnProperty(o)){let r=e[o],i=r.currency_code;this.autoConversion&&(i=r.native_currency_code),n.hasOwnProperty(i)||(n[i]={name:i,yAxisID:"",data:{}},ft.push(i))}for(const o in e)if(e.hasOwnProperty(o)){let r=e[o],i=r.currency_code;this.autoConversion&&(i=r.native_currency_code);for(const l in n)if(n.hasOwnProperty(l)){let u=0;i===l&&(u=parseFloat(r.amount),""+r.currency_code,this.autoConversion&&(u=parseFloat(r.native_amount),""+r.native_currency_code)),n[l].data.hasOwnProperty(r.label)&&(n[l].data[r.label]=n[l].data[r.label]+u),n[l].data.hasOwnProperty(r.label)||(n[l].data[r.label]=u)}t.data.labels.includes(r.label)||t.data.labels.push(r.label)}let a=0;for(const o in n){let r="y"+o,i={label:o,currency_code:o,yAxisID:r,data:[]};for(const l in n[o].data)i.data.push(n[o].data[l]);t.data.datasets.push(i),t.options.scales.hasOwnProperty(r)||(t.options.scales[r]={beginAtZero:!0,type:"linear",position:a===1?"right":"left",ticks:{callback:function(l,u,d){return g(l,o)}}},a++)}return t},drawChart(e){if(L!==null){L.options=e.options,L.data=e.data,L.update();return}L=new A(document.querySelector("#category-chart"),e)},getFreshData(){const e=new Date(window.store.get("start")),t=new Date(window.store.get("end")),n=D("dashboard-categories-chart",e,t),a=window.store.get("cacheValid");let o=window.store.get(n);if(a&&typeof o<"u"){W=o,this.drawChart(this.generateOptions(W)),this.loading=!1;return}new te().dashboard(e,t,null).then(i=>{W=i.data,this.drawChart(this.generateOptions(i.data)),window.store.set(n,W),this.loading=!1})},loadChart(){if(this.loading!==!0){if(this.loading=!0,W!==null){this.drawChart(this.generateOptions(W)),this.loading=!1;return}this.getFreshData()}},init(){Promise.all([y("autoConversion",!1)]).then(e=>{this.autoConversion=e[0],nt=!0,this.loadChart()}),window.store.observe("end",()=>{nt&&(this.chartData=null,this.loadChart())}),window.store.observe("autoConversion",e=>{nt&&(this.autoConversion=e,this.loadChart())})}});class ae{list(t){return k.get("/api/v2/transactions",{params:t})}}A.register({SankeyController:Ot,Flow:Mt});const pt="dashboard-sankey-data";let b,ot=!1,q=null,x=[],_=!1,s={category:null,unknown_category:null,in:null,out:null,unknown_source:null,unknown_dest:null,unknown_account:null,expense_account:null,revenue_account:null,budget:null,unknown_budget:null,all_money:null};const _t=function(e){return e.includes(s.revenue_account)?"forestgreen":e.includes("("+s.in+",")?"green":e.includes(s.budget)||e.includes(s.unknown_budget)?"Orchid":e.includes("("+s.out+",")?"MediumOrchid":e.includes(s.all_money)?"blue":"red"};function G(e,t,n,a){if(e==="category"&&t!==null&&n==="in")return s.category+' "'+t+'" ('+s.in+(_?", "+a+")":")");if(e==="category"&&t===null&&n==="in")return s.unknown_category+" ("+s.in+(_?", "+a+")":")");if(e==="category"&&t!==null&&n==="out")return s.category+' "'+t+'" ('+s.out+(_?", "+a+")":")");if(e==="category"&&t===null&&n==="out")return s.unknown_category+" ("+s.out+(_?", "+a+")":")");if(e==="account"&&t===null&&n==="in")return s.unknown_source+(_?" ("+a+")":"");if(e==="account"&&t!==null&&n==="in")return s.revenue_account+'"'+t+'"'+(_?" ("+a+")":"");if(e==="account"&&t===null&&n==="out")return s.unknown_dest+(_?" ("+a+")":"");if(e==="account"&&t!==null&&n==="out")return s.expense_account+' "'+t+'"'+(_?" ("+a+")":"");if(e==="budget"&&t!==null)return s.budget+' "'+t+'"'+(_?" ("+a+")":"");if(e==="budget"&&t===null)return s.unknown_budget+(_?" ("+a+")":"");console.error('Cannot handle: type:"'+e+'", dir: "'+n+'"')}function T(e,t,n){if(e==="category"&&t!==null)return s.category+' "'+t+'"'+(_?" ("+n+")":"");if(e==="category"&&t===null)return s.unknown_category+(_?" ("+n+")":"");if(e==="account"&&t===null)return s.unknown_account+(_?" ("+n+")":"");if(e==="account"&&t!==null)return t+(_?" ("+n+")":"");if(e==="budget"&&t!==null)return s.budget+' "'+t+'"'+(_?" ("+n+")":"");if(e==="budget"&&t===null)return s.unknown_budget+(_?" ("+n+")":"");console.error('Cannot handle: type:"'+e+'"')}const ne=()=>({loading:!1,autoConversion:!1,generateOptions(){let e=J("sankey"),t={},n={};for(let o in x)if(x.hasOwnProperty(o)){let r=x[o];for(let i in r.attributes.transactions)if(r.attributes.transactions.hasOwnProperty(i)){let l=r.attributes.transactions[i],u=this.autoConversion?l.native_currency_code:l.currency_code,d=this.autoConversion?parseFloat(l.native_amount):parseFloat(l.amount),h;if(l.type==="deposit"){let c=G("category",l.category_name,"in",u),p=G("account",l.source_name,"in",u);n[c]=T("category",l.category_name,u),n[p]=T("account",l.source_name,u),h=p+"-"+c+"-"+u,t.hasOwnProperty(h)||(t[h]={from:p,to:c,amount:0}),t[h].amount+=d,h=c+"-"+s.all_money+"-"+u,t.hasOwnProperty(h)||(t[h]={from:c,to:s.all_money+(this.autoConversion?" ("+u+")":""),amount:0}),t[h].amount+=d}if(l.type==="withdrawal"){let c=G("budget",l.budget_name,"out",u);n[c]=T("budget",l.budget_name,u),h=s.all_money+"-"+c+"-"+u,t.hasOwnProperty(h)||(t[h]={from:s.all_money+(this.autoConversion?" ("+u+")":""),to:c,amount:0}),t[h].amount+=d;let p=G("category",l.category_name,"out",u);n[p]=T("category",l.category_name,u),h=c+"-"+p+"-"+u,t.hasOwnProperty(h)||(t[h]={from:c,to:p,amount:0}),t[h].amount+=d;let v=G("account",l.destination_name,"out",u);n[v]=T("account",l.destination_name,u),h=p+"-"+v+"-"+u,t.hasOwnProperty(h)||(t[h]={from:p,to:v,amount:0}),t[h].amount+=d}}}let a={label:"Firefly III dashboard sankey chart",data:[],colorFrom:o=>_t(o.dataset.data[o.dataIndex]?o.dataset.data[o.dataIndex].from:""),colorTo:o=>_t(o.dataset.data[o.dataIndex]?o.dataset.data[o.dataIndex].to:""),colorMode:"gradient",labels:n,size:"min"};for(let o in t)if(t.hasOwnProperty(o)){let r=t[o];a.data.push({from:r.from,to:r.to,flow:r.amount})}return e.data.datasets.push(a),e},drawChart(e){if(q!==null){q.data.datasets=e.data.datasets,q.update();return}q=new A(document.querySelector("#sankey-chart"),e)},getFreshData(){const e=new Date(window.store.get("start")),t=new Date(window.store.get("end")),n=D(pt,e,t),a=window.store.get("cacheValid");let o=window.store.get(n);if(a&&typeof o<"u"){x=o,this.drawChart(this.generateOptions()),this.loading=!1;return}let r={start:f(e,"y-MM-dd"),end:f(t,"y-MM-dd"),type:"withdrawal,deposit",page:1};this.downloadTransactions(r)},downloadTransactions(e){const t=new Date(window.store.get("start")),n=new Date(window.store.get("end")),a=D(pt,t,n);new ae().list(e).then(r=>{if(x=[...x,...r.data.data],parseInt(r.data.meta.pagination.total_pages)>e.page){e.page++,this.downloadTransactions(e);return}window.store.set(a,x),this.drawChart(this.generateOptions()),this.loading=!1})},loadChart(){if(this.loading!==!0){if(this.loading=!0,x.length!==0){this.drawChart(this.generateOptions()),this.loading=!1;return}this.getFreshData()}},init(){x=[],Promise.all([y("autoConversion",!1),y("language","en_US")]).then(e=>{this.autoConversion=e[0],_=e[0],b=new H;const t=e[1].replace("-","_");b.locale=t,z(b,t).then(()=>{s.all_money=b.t("firefly.all_money"),s.category=b.t("firefly.category"),s.in=b.t("firefly.money_flowing_in"),s.out=b.t("firefly.money_flowing_out"),s.unknown_category=b.t("firefly.unknown_category_plain"),s.unknown_source=b.t("firefly.unknown_source_plain"),s.unknown_dest=b.t("firefly.unknown_dest_plain"),s.unknown_account=b.t("firefly.unknown_any_plain"),s.unknown_budget=b.t("firefly.unknown_budget_plain"),s.expense_account=b.t("firefly.expense_account"),s.revenue_account=b.t("firefly.revenue_account"),s.budget=b.t("firefly.budget"),ot=!0,this.loadChart()})}),window.store.observe("end",()=>{ot&&(this.transactions=[],this.loadChart())}),window.store.observe("autoConversion",e=>{ot&&(this.autoConversion=e,this.loadChart())})}});let rt=!1,F,w={};function wt(e){return new kt().list(e).then(n=>{let a=n.data.data;for(let o in a)if(a.hasOwnProperty(o)){let r=a[o];if(r.attributes.active&&r.attributes.pay_dates.length>0){let i=r.attributes.object_group_id===null?0:r.attributes.object_group_id,l=r.attributes.object_group_title===null?F.t("firefly.default_group_title_name_plain"):r.attributes.object_group_title,u=r.attributes.object_group_order===null?0:r.attributes.object_group_order;w.hasOwnProperty(i)||(w[i]={id:i,title:l,order:u,payment_info:{},bills:[]});let d={id:r.id,name:r.attributes.name,amount_min:r.attributes.amount_min,amount_max:r.attributes.amount_max,amount:(parseFloat(r.attributes.amount_max)+parseFloat(r.attributes.amount_min))/2,currency_code:r.attributes.currency_code,native_amount_min:r.attributes.native_amount_min,native_amount_max:r.attributes.native_amount_max,native_amount:(parseFloat(r.attributes.native_amount_max)+parseFloat(r.attributes.native_amount_min))/2,native_currency_code:r.attributes.native_currency_code,transactions:[],pay_dates:r.attributes.pay_dates,paid:r.attributes.paid_dates.length>0};d.expected_amount=e.autoConversion?g(d.native_amount,d.native_currency_code):g(d.amount,d.currency_code),d.expected_times=F.t("firefly.subscr_expected_x_times",{times:r.attributes.pay_dates.length,amount:d.expected_amount});for(let h in r.attributes.paid_dates)if(r.attributes.paid_dates.hasOwnProperty(h)){const c=r.attributes.paid_dates[h];let p=100;e.autoConversion&&(p=Math.round(-100+parseFloat(c.native_amount)*-1/parseFloat(d.native_amount)*100)),e.autoConversion||(p=Math.round(-100+parseFloat(c.amount)*-1/parseFloat(d.amount)*100));let v={amount:e.autoConversion?g(c.native_amount,c.native_currency_code):g(c.amount,c.currency_code),percentage:p,date:f(new Date(c.date),"PP"),foreign_amount:null};c.foreign_currency_code!==null&&(v.foreign_amount=e.autoConversion?c.foreign_native_amount:c.foreign_amount,v.foreign_currency_code=e.autoConversion?c.native_currency_code:c.foreign_currency_code),d.transactions.push(v)}if(w[i].bills.push(d),r.attributes.paid_dates.length===0){const h=r.attributes.pay_dates.length*d.amount,c=r.attributes.pay_dates.length*d.native_amount;w[i].payment_info.hasOwnProperty(d.currency_code)||(w[i].payment_info[d.currency_code]={currency_code:d.currency_code,paid:0,unpaid:0,native_currency_code:d.native_currency_code,native_paid:0,native_unpaid:0}),w[i].payment_info[d.currency_code].unpaid+=h,w[i].payment_info[d.currency_code].native_unpaid+=c}if(r.attributes.paid_dates.length>0){for(let h in r.attributes.paid_dates)if(r.attributes.paid_dates.hasOwnProperty(h)){let c=r.attributes.paid_dates[h];w[i].payment_info.hasOwnProperty(c.currency_code)||(w[i].payment_info[c.currency_code]={currency_code:d.currency_code,paid:0,unpaid:0,native_currency_code:d.native_currency_code,native_paid:0,native_unpaid:0});const p=parseFloat(c.amount)*-1,v=parseFloat(c.native_amount)*-1;w[i].payment_info[c.currency_code].paid+=p,w[i].payment_info[c.currency_code].native_paid+=v}}}}return parseInt(n.data.meta.pagination.total_pages)>e.page?(e.page++,wt(e)):Promise.resolve()})}const oe=()=>({loading:!1,autoConversion:!1,subscriptions:[],startSubscriptions(){this.loading=!0;let e=new Date(window.store.get("start")),t=new Date(window.store.get("end"));const n=window.store.get("cacheValid");let a=window.store.get(D("subscriptions-data-dashboard",e,t));n&&typeof a<"u",w={},this.subscriptions=[],console.log("cache is invalid, must download");let o={start:f(e,"y-MM-dd"),end:f(t,"y-MM-dd"),autoConversion:this.autoConversion,page:1};wt(o).then(()=>{console.log("Done with download!");let r=Object.values(w);for(let i in r)if(r.hasOwnProperty(i)){let l=r[i];const u=Object.keys(l.payment_info);l.col_size=u.length===1?"col-6 offset-3":"col-6",l.chart_width=u.length===1?"50%":"100%",l.payment_length=u.length,this.subscriptions.push(l)}this.loading=!1})},drawPieChart(e,t,n){let a="#pie_"+e+"_"+n.currency_code;const o=this.autoConversion?n.native_unpaid:n.unpaid,r=this.autoConversion?n.native_paid:n.paid,i=this.autoConversion?n.native_currency_code:n.currency_code,u={type:"doughnut",data:{labels:[F.t("firefly.paid"),F.t("firefly.unpaid")],datasets:[{label:F.t("firefly.subscriptions_in_group",{title:t}),data:[r,o],backgroundColor:["rgb(54, 162, 235)","rgb(255, 99, 132)"],hoverOffset:4}]},options:{plugins:{tooltip:{callbacks:{label:function(h){return h.dataset.label+": "+g(h.raw,i)}}}}}};var d=A.getChart(document.querySelector(a));typeof d<"u"&&d.destroy(),new A(document.querySelector(a),u)},init(){console.log("subscriptions init"),Promise.all([y("autoConversion",!1),y("language","en_US")]).then(e=>{console.log("subscriptions after promises"),this.autoConversion=e[0],rt=!0,F=new H;const t=e[1].replace("-","_");F.locale=t,z(F,t).then(()=>{this.loading===!1&&this.startSubscriptions()})}),window.store.observe("end",()=>{rt&&(console.log("subscriptions observe end"),this.loading===!1&&this.startSubscriptions())}),window.store.observe("autoConversion",e=>{rt&&(console.log("subscriptions observe autoConversion"),this.autoConversion=e,this.loading===!1&&this.startSubscriptions())})}});let O={},it=!1,N;const bt="dashboard-piggies-data",re=()=>({loading:!1,autoConversion:!1,sankeyGrouping:"account",piggies:[],getFreshData(){const e=new Date(window.store.get("start")),t=new Date(window.store.get("end")),n=D(bt,e,t),a=window.store.get("cacheValid");let o=window.store.get(n);if(a&&typeof o<"u"){O=o,this.parsePiggies(),this.loading=!1;return}let r={start:f(e,"y-MM-dd"),end:f(t,"y-MM-dd"),page:1};this.downloadPiggyBanks(r)},downloadPiggyBanks(e){const t=new Date(window.store.get("start")),n=new Date(window.store.get("end")),a=D(bt,t,n);new Dt().list(e).then(r=>{if(O=[...O,...r.data.data],parseInt(r.data.meta.pagination.total_pages)>e.page){e.page++,this.downloadPiggyBanks(e);return}window.store.set(a,O),this.parsePiggies(),this.loading=!1})},parsePiggies(){let e=[];for(let t in O)if(O.hasOwnProperty(t)){let n=O[t];if(n.attributes.percentage>=100||n.attributes.percentage===0)continue;let a=n.object_group_title??N.t("firefly.default_group_title_name_plain");e.hasOwnProperty(a)||(e[a]={id:n.object_group_id??0,title:a,order:n.object_group_order??0,piggies:[]});let o={id:n.id,name:n.attributes.name,percentage:parseInt(n.attributes.percentage),amount:this.autoConversion?n.attributes.native_current_amount:n.attributes.current_amount,left_to_save:this.autoConversion?n.attributes.native_left_to_save:n.attributes.left_to_save,target_amount:this.autoConversion?n.attributes.native_target_amount:n.attributes.target_amount,save_per_month:this.autoConversion?n.attributes.native_save_per_month:n.attributes.save_per_month,currency_code:this.autoConversion?n.attributes.native_currency_code:n.attributes.currency_code};e[a].piggies.push(o)}this.piggies=Object.values(e)},loadPiggyBanks(){if(this.loading!==!0){if(this.loading=!0,this.piggies.length!==0){this.parsePiggies(),this.loading=!1;return}this.getFreshData()}},init(){O=[],Promise.all([y("autoConversion",!1),y("language","en_US")]).then(e=>{N=new H;const t=e[1].replace("-","_");N.locale=t,z(N,t).then(()=>{it=!0,this.autoConversion=e[0],this.loadPiggyBanks()})}),window.store.observe("end",()=>{it&&(O=[],this.loadPiggyBanks())}),window.store.observe("autoConversion",e=>{it&&(this.autoConversion=e,this.loadPiggyBanks())})}});A.register({LineController:St,LineElement:Ft,ArcElement:At,BarController:Bt,TimeScale:$t,PieController:jt,BarElement:It,Filler:Wt,Colors:Vt,LinearScale:Kt,CategoryScale:Et,PointElement:Lt,Tooltip:Gt,Legend:Tt});const vt={dates:xt,boxes:Ut,accounts:Zt,budgets:Xt,categories:ee,sankey:ne,subscriptions:oe,piggies:re};function mt(e){Object.keys(e).forEach(t=>{console.log(`Loading page component "${t}"`);let n=e[t]();Alpine.data(t,()=>n)}),Alpine.start()}document.addEventListener("firefly-iii-bootstrapped",()=>{mt(vt)});window.bootstrapped&&mt(vt);