1import{p as ie,q as k,s as I,v as O,d as oe,x as de,y as re,a as i,e as s,w as c,u as b,S as ue,g as me,F as B,h as _e,o as l,b as n,B as T,P as ce,f as m,t as o,z as _,A as z,H as G,I as K,r as R,m as be,K as Y,_ as pe}from"./index-CmrISuXK.js";import{C as J}from"./Card-BrIifD0a.js";import{I as v}from"./Input-_Fs5mqJt.js";import{P as Q}from"./ProgressBar-DIhTypJZ.js";import{T as N,f as E,e as W,a as X}from"./format-CsO3HTKa.js";const fe=ie("debts",()=>{const C=k([]),U=k(!1);async function y(f){U.value=!0;try{const{debts:p}=await I("/api/debts",{headers:await O(f)});C.value=p}finally{U.value=!1}}async function F(f,p){const{debt:g}=await I("/api/debts",{method:"POST",body:JSON.stringify(p),headers:await O(f)});return C.value=[g,...C.value],g}async function M(f,p,g){const{debt:P}=await I(`/api/debts/${p}`,{method:"PATCH",body:JSON.stringify(g),headers:await O(f)});return C.value=C.value.map(V=>V.id===p?P:V),P}async function H(f,p){await I(`/api/debts/${p}`,{method:"DELETE",headers:await O(f)}),C.value=C.value.filter(g=>g.id!==p)}return{debts:C,loading:U,fetchAll:y,create:F,update:M,remove:H}}),ve={class:"debts"},ye={class:"debts__header"},Ce={key:0,class:"debts__error"},ge={class:"debts__form"},ke={class:"debts__field"},Pe={class:"debts__field"},Ve=["value"],he={class:"debts__field"},we={class:"debts__field"},Te={class:"debts__field"},Se={class:"debts__field"},De={class:"debts__field debts__field--wide"},$e={key:0,class:"debts__form-error"},Be={class:"debts__form-actions"},Ee={key:2,class:"debts__empty"},Ue={key:3,class:"debts__empty"},Fe={key:0},Le={class:"debts__list"},Ae={class:"debt__head"},Ne={class:"debt__name"},Me={class:"debt__sub"},xe={class:"debt__amount","data-mono":""},Ie={key:0,class:"debt__util"},Oe={class:"debt__util-label"},ze={"data-mono":""},Re={class:"debt__meta"},He={key:0},je={"data-mono":""},Je={key:1},qe={"data-mono":""},Ge={key:2},Ke={key:3},Ye={"data-mono":""},Qe={key:1},We={class:"debts__list"},Xe={key:0,class:"debt__head"},Ze={class:"debt__name"},et={class:"debt__sub"},tt={class:"debt__amount","data-mono":""},nt={key:1,class:"debt__util"},at={class:"debt__util-label"},lt={"data-mono":""},st={key:2,class:"debt__meta"},it={key:0},ot={"data-mono":""},dt={key:1},rt={"data-mono":""},ut={key:2},mt={key:3,class:"debt__actions"},_t={key:4,class:"debts__form"},ct={class:"debts__field"},bt=["for"],pt={class:"debts__field"},ft=["for"],vt=["id"],yt=["value"],Ct={class:"debts__field"},gt=["for"],kt={class:"debts__field"},Pt=["for"],Vt={class:"debts__field"},ht=["for"],wt={class:"debts__field"},Tt=["for"],St={class:"debts__field debts__field--wide"},Dt=["for"],$t={key:0,class:"debts__form-error"},Bt={class:"debts__form-actions"},Et=oe({__name:"Debts",setup(C){const U=_e(),y=fe(),{getToken:F,isLoaded:M,isSignedIn:H}=de(),f=k(null),p=()=>{var a;return((a=F.value)==null?void 0:a.call(F))??Promise.resolve(null)},g=["credit_card","student","auto","mortgage","installment","personal","other"];function P(a){return a==="credit_card"?"Credit card":a==="student"?"Student loan":a==="auto"?"Auto loan":a==="mortgage"?"Mortgage":a==="installment"?"Installment":a==="personal"?"Personal loan":"Other"}const V=be(()=>{const a=[],e=[];for(const t of y.debts)t.source==="manual"?e.push(t):a.push(t);return{plaid:a,manual:e}}),L=k(!1),h=k(null),d=Y(j()),w=k(null),r=Y(j()),A=k(!1),S=k(null),x=k(null);function j(){return{name:"",debtType:"credit_card",balance:"",limit:"",apr:"",minPayment:"",notes:""}}function D(a){const e=a.trim();if(!e)return null;const t=Number(e);return!Number.isFinite(t)||t<0?null:Math.round(t*100)}function q(a){const e=a.trim();if(!e)return null;const t=Number(e);return!Number.isFinite(t)||t<0?null:Math.round(t*100)}function $(a){return a.debtType!=="credit_card"||!a.creditLimitCents||a.creditLimitCents<=0?null:Math.round(a.balanceCents/a.creditLimitCents*100)}function Z(){Object.assign(d,j()),h.value=null,L.value=!0}function ee(){L.value=!1}async function te(){h.value=null;const a=D(d.balance);if(a==null){h.value="Enter a current balance (numbers only).";return}const e={name:d.name.trim(),debtType:d.debtType,balanceCents:a,creditLimitCents:D(d.limit),aprBps:q(d.apr),minimumPaymentCents:D(d.minPayment),notes:d.notes.trim()||null};if(!e.name){h.value="Give the debt a name.";return}try{await y.create(p,e),L.value=!1}catch(t){h.value=t instanceof Error?t.message:String(t)}}function ne(a){w.value=a.id,S.value=null,Object.assign(r,{name:a.name,debtType:a.debtType,balance:(a.balanceCents/100).toFixed(2),limit:a.creditLimitCents!=null?(a.creditLimitCents/100).toFixed(2):"",apr:a.aprBps!=null?(a.aprBps/100).toFixed(2):"",minPayment:a.minimumPaymentCents!=null?(a.minimumPaymentCents/100).toFixed(2):"",notes:a.notes??""})}function ae(){w.value=null}async function le(a){S.value=null;const e=D(r.balance);if(e==null){S.value="Enter a current balance (numbers only).";return}A.value=!0;try{await y.update(p,a,{name:r.name.trim(),debtType:r.debtType,balanceCents:e,creditLimitCents:D(r.limit),aprBps:q(r.apr),minimumPaymentCents:D(r.minPayment),notes:r.notes.trim()||null}),w.value=null}catch(t){S.value=t instanceof Error?t.message:String(t)}finally{A.value=!1}}async function se(a){x.value=a.id;try{await y.remove(p,a.id)}catch(e){f.value=e instanceof Error?e.message:String(e)}finally{x.value=null}}return re(async()=>
1{if(await new Promise(e=>{if(M.value)return e();const t=setInterval(()=>{M.value&&(clearInterval(t),e())},50)}),!H.value){U.replace("/sign-in");return}try{await y.fetchAll(p)}catch(e){f.value=e instanceof Error?e.message:String(e)}}),(a,e)=>(l(),i(B,null,[s(b(ue),null,{default:c(()=>[...e[14]||(e[14]=[n("section",{class:"debts"},[n("p",null,"Redirecting to sign-inâ¦")],-1)])]),_:1}),s(b(me),null,{default:c(()=>[n("section",ve,[n("header",ye,[e[16]||(e[16]=n("div",null,[n("p",{class:"debts__eyebrow"},"Obligations"),n("h1",{class:"debts__title"},"Debts"),n("p",{class:"debts__copy"}," Cards and loans linked via Plaid appear here automatically with live balances. Add anything Plaid can't see â family loans, private creditors â manually. ")],-1)),s(T,{disabled:L.value,onClick:Z},{default:c(()=>[s(b(ce),{size:16,"aria-hidden":"true"}),e[15]||(e[15]=m(" Add debt manually ",-1))]),_:1},8,["disabled"])]),f.value?(l(),i("p",Ce,o(f.value),1)):_("",!0),L.value?(l(),z(J,{key:1,class:"debts__create"},{default:c(()=>[e[26]||(e[26]=n("div",{class:"debts__eyebrow"},"Add a debt",-1)),n("div",ge,[n("div",ke,[e[17]||(e[17]=n("label",{for:"create-name"},"Name",-1)),s(v,{id:"create-name",modelValue:d.name,"onUpdate:modelValue":e[0]||(e[0]=t=>d.name=t),placeholder:"e.g. Family loan"},null,8,["modelValue"])]),n("div",Pe,[e[18]||(e[18]=n("label",{for:"create-type"},"Type",-1)),G(n("select",{id:"create-type","onUpdate:modelValue":e[1]||(e[1]=t=>d.debtType=t),class:"debts__select"},[(l(),i(B,null,R(g,t=>n("option",{key:t,value:t},o(P(t)),9,Ve)),64))],512),[[K,d.debtType]])]),n("div",he,[e[19]||(e[19]=n("label",{for:"create-balance"},"Balance (USD)",-1)),s(v,{id:"create-balance",modelValue:d.balance,"onUpdate:modelValue":e[2]||(e[2]=t=>d.balance=t),inputmode:"decimal",placeholder:"0.00"},null,8,["modelValue"])]),n("div",we,[e[20]||(e[20]=n("label",{for:"create-limit"},"Credit limit (optional)",-1)),s(v,{id:"create-limit",modelValue:d.limit,"onUpdate:modelValue":e[3]||(e[3]=t=>d.limit=t),inputmode:"decimal",placeholder:"0.00"},null,8,["modelValue"])]),n("div",Te,[e[21]||(e[21]=n("label",{for:"create-apr"},"APR % (optional)",-1)),s(v,{id:"create-apr",modelValue:d.apr,"onUpdate:modelValue":e[4]||(e[4]=t=>d.apr=t),inputmode:"decimal",placeholder:"0.00"},null,8,["modelValue"])]),n("div",Se,[e[22]||(e[22]=n("label",{for:"create-min"},"Minimum payment (optional)",-1)),s(v,{id:"create-min",modelValue:d.minPayment,"onUpdate:modelValue":e[5]||(e[5]=t=>d.minPayment=t),inputmode:"decimal",placeholder:"0.00"},null,8,["modelValue"])]),n("div",De,[e[23]||(e[23]=n("label",{for:"create-notes"},"Notes (optional)",-1)),s(v,{id:"create-notes",modelValue:d.notes,"onUpdate:modelValue":e[6]||(e[6]=t=>d.notes=t)},null,8,["modelValue"])]),h.value?(l(),i("p",$e,o(h.value),1)):_("",!0),n("div",Be,[s(T,{variant:"secondary",onClick:ee},{default:c(()=>[...e[24]||(e[24]=[m(" Cancel ",-1)])]),_:1}),s(T,{onClick:te},{default:c(()=>[...e[25]||(e[25]=[m(" Save debt ",-1)])]),_:1})])])]),_:1})):_("",!0),b(y).loading&&b(y).debts.length===0?(l(),i("div",Ee," Loading debts⦠")):b(y).debts.length===0?(l(),i("div",Ue," No debts yet. Link a bank with credit cards or loans to pull them in automatically, or add a debt manually. ")):(l(),i(B,{key:4},[V.value.plaid.length>0?(l(),i("section",Fe,[e[33]||(e[33]=n("h2",{class:"debts__group-title"},"From Plaid",-1)),n("div",Le,[(l(!0),i(B,null,R(V.value.plaid,t=>(l(),z(J,{key:t.id,class:"debt"},{default:c(()=>[n("div",Ae,[n("div",null,[n("div",Ne,o(t.name),1),n("div",Me,[s(N,null,{default:c(()=>[m(o(P(t.debtType)),1)]),_:2},1024),s(N,null,{default:c(()=>[...e[27]||(e[27]=[m("Plaid",-1)])]),_:1}),t.isOverdue?(l(),z(N,{key:0},{default:c(()=>[...e[28]||(e[28]=[m(" Overdue ",-1)])]),_:1})):_("",!0)])]),n("div",xe,o(b(E)(t.balanceCents)),1)]),$(t)!=null?(l(),i("div",Ie,[n("div",Oe,[e[29]||(e[29]=n("span",null,"Utilization",-1)),n("span",ze,o($(t))+"% · limit "+o(b(E)(t.creditLimitCents)),1)]),s(Q,{value:Math.min(100,$(t)??0),"utilization-coloring":"",label:`${t.name} utilization`},null,8,["value","label"])])):_("",!0),n("div",Re,[t.aprBps!=null?(l(),i("span",He,[e[30]||(e[30]=m("APR ",-1)),n("span",je,o(b(W)(t.aprBps)),1)])):_("",!0),t.minimumPaymentCents!=null?(l(),i("span",Je,[e[31]||(e[31]=m(" Min ",-1)),n("span",qe,o(b(E)(t.minimumPaymentCents)),1)])):_("",!0),t.nextPaymentDueDate?(l(),i("span",Ge," Due "+o(b(X)(t.nextPaymentDueDate)),1)):_("",!0),t.lastPaymentAmountCents!=null?(l(),i("span",Ke,[e[32]||(e[32]=m(" Last ",-1)),n("span",Ye,o(b(E)(t.lastPaymentAmountCents)),1),m(" "+o(t.lastPaymentDate?b(X)(t.lastPaymentDate):""),1)])):_("",!0)])]),_:2},1024))),128))])])):_("",!0),V.value.manual.length>0?(l(),i("section",Qe,[e[40]||(e[40]=n("h2",{class:"debts__group-title"},"Manual entries",-1)),n("div",We,[(l(!0),i(B,null,R(V.value.manual,t=>(l(),z(J,{key:t.id,class:"debt"},{default:c(()=>[w.value!==t.id?(l(),i("div",Xe,[n("div",null,[n("div",Ze,o(t.name),1),n("div",et,[s(N,null,{default:c(()=>[m(o(P(t.debtType)),1)]),_:2},1024),s(N,null,{default:c(()=>[...e[34]||(e[34]=[m("Manual",-1)])]),_:1})])]),n("div",tt,o(b(E)(t.balanceCents)),1)])):_("",!0),w.value!==t.id&&$(t)!=null?(l(),i("div",nt,[n("div",at,[e[35]||(e[35]=n("span",null,"Utilization",-1)),n("span",lt,o($(t))+"%",1)]),s(Q,{value:Math.min(100,$(t)??0),"utilization-coloring":"",label:`${t.name} utilization`},null,8,["value","label"])])):_("",!0),w.value!==t.id?(l(),i("div",st,[t.aprBps!=null?(l(),i("span",it,[e[36]||(e[36]=m("APR ",-1)),n("span",ot,o(b(W)(t.aprBps)),1)])):_("",!0),t.minimumPaymentCents!=null?(l(),i("span",dt,[e[37]||(e[37]=m(" Min ",-1)),n("span",rt,o(b(E)(t.minimumPaymentCents)),1)])):_("",!0),t.notes?(l(),i("span",ut,o(t.notes),1)):_("",!0)])):_("",!0),w.value!==t.id?(l(),i("div",mt,[s(T,{variant:"secondary",disabled:x.value===t.id,onClick:u=>se(t)},{default:c(()=>[m(o(x.value===t.id?"Deletingâ¦":"Delete"),1)]),_:2},1032,["disabled","onClick"]),s(T,{variant:"secondary",onClick:u=>ne(t)},{default:c(()=>[...e[38]||(e[38]=[m(" Edit ",-1)])]),_:1},8,["onClick"])])):(l(),i("div",_t,[n("div",ct,[n("label",{for:`edit-name-${t.id}`},"Name",8,bt),s(v,{id:`edit-name-${t.id}
1`,modelValue:r.name,"onUpdate:modelValue":e[7]||(e[7]=u=>r.name=u)},null,8,["id","modelValue"])]),n("div",pt,[n("label",{for:`edit-type-${t.id}`},"Type",8,ft),G(n("select",{id:`edit-type-${t.id}`,"onUpdate:modelValue":e[8]||(e[8]=u=>r.debtType=u),class:"debts__select"},[(l(),i(B,null,R(g,u=>n("option",{key:u,value:u},o(P(u)),9,yt)),64))],8,vt),[[K,r.debtType]])]),n("div",Ct,[n("label",{for:`edit-balance-${t.id}`},"Balance (USD)",8,gt),s(v,{id:`edit-balance-${t.id}`,modelValue:r.balance,"onUpdate:modelValue":e[9]||(e[9]=u=>r.balance=u),inputmode:"decimal"},null,8,["id","modelValue"])]),n("div",kt,[n("label",{for:`edit-limit-${t.id}`},"Credit limit",8,Pt),s(v,{id:`edit-limit-${t.id}`,modelValue:r.limit,"onUpdate:modelValue":e[10]||(e[10]=u=>r.limit=u),inputmode:"decimal"},null,8,["id","modelValue"])]),n("div",Vt,[n("label",{for:`edit-apr-${t.id}`},"APR %",8,ht),s(v,{id:`edit-apr-${t.id}`,modelValue:r.apr,"onUpdate:modelValue":e[11]||(e[11]=u=>r.apr=u),inputmode:"decimal"},null,8,["id","modelValue"])]),n("div",wt,[n("label",{for:`edit-min-${t.id}`},"Min payment",8,Tt),s(v,{id:`edit-min-${t.id}`,modelValue:r.minPayment,"onUpdate:modelValue":e[12]||(e[12]=u=>r.minPayment=u),inputmode:"decimal"},null,8,["id","modelValue"])]),n("div",St,[n("label",{for:`edit-notes-${t.id}`},"Notes",8,Dt),s(v,{id:`edit-notes-${t.id}`,modelValue:r.notes,"onUpdate:modelValue":e[13]||(e[13]=u=>r.notes=u)},null,8,["id","modelValue"])]),S.value?(l(),i("p",$t,o(S.value),1)):_("",!0),n("div",Bt,[s(T,{variant:"secondary",disabled:A.value,onClick:ae},{default:c(()=>[...e[39]||(e[39]=[m(" Cancel ",-1)])]),_:1},8,["disabled"]),s(T,{disabled:A.value,onClick:u=>le(t.id)},{default:c(()=>[m(o(A.value?"Savingâ¦":"Save"),1)]),_:1},8,["disabled","onClick"])])]))]),_:2},1024))),128))])])):_("",!0)],64))])]),_:1})],64))}}),Mt=pe(Et,[["__scopeId","data-v-1d1c128b"]]);export{Mt as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.