@atyaio/ledgr-web 0.0.0-stage → 0.1.2
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/dist/assets/badge-DCLlsDNI.js +55 -0
- package/dist/assets/breakdown-B7xclB2-.js +1 -0
- package/dist/assets/categories-C9LvkWNc.js +1 -0
- package/dist/assets/color-picker-DUPZPbk3.js +1 -0
- package/dist/assets/custom-cell-DOJAsRPW.js +1 -0
- package/dist/assets/data-BX7xFZfR.js +1 -0
- package/dist/assets/download-gNHw92Vi.js +1 -0
- package/dist/assets/expenses-Ct1Tk3pC.js +1 -0
- package/dist/assets/format-GDcQVAp4.js +1 -0
- package/dist/assets/index-B9WjaP25.js +31 -0
- package/dist/assets/index-YWd9JGBA.css +2 -0
- package/dist/assets/insights-C0cl4vss.js +1 -0
- package/dist/assets/integrations-CueFg-5F.js +1 -0
- package/dist/assets/ledger-toolbar-B_Gbv5Ws.js +1 -0
- package/dist/assets/media-D6XgVZ7M.js +1 -0
- package/dist/assets/menu-C-8r2BNA.js +1 -0
- package/dist/assets/money-OFUBQ3gl.js +1 -0
- package/dist/assets/money-input-DQaEauAw.js +1 -0
- package/dist/assets/overview-CZMXeLeG.js +1 -0
- package/dist/assets/payments-D9NCfpzJ.js +1 -0
- package/dist/assets/project-CYHaWZqH.js +1 -0
- package/dist/assets/pull-shift-sheet-BaOiY46Z.js +1 -0
- package/dist/assets/queries-CxLQqNqz.js +1 -0
- package/dist/assets/recurring-e7X3okBc.js +1 -0
- package/dist/assets/revenue-TPYHnUaW.js +1 -0
- package/dist/assets/search-CnrmI1BH.js +1 -0
- package/dist/assets/settings-mDly_aVZ.js +4 -0
- package/dist/assets/shift-sales-BpOCNuGY.js +1 -0
- package/dist/assets/stakeholders-DzTfUHX0.js +1 -0
- package/dist/assets/star-DZj1Tpai.js +1 -0
- package/dist/assets/table-QAdUTXQz.js +1 -0
- package/dist/assets/tooltip-CYNpGhCZ.js +55 -0
- package/dist/favicon.svg +1 -0
- package/dist/icons/add-expense-96.png +0 -0
- package/dist/icons/add-expense.svg +1 -0
- package/dist/icons/add-revenue-96.png +0 -0
- package/dist/icons/add-revenue.svg +1 -0
- package/dist/icons/apple-touch-icon.png +0 -0
- package/dist/icons/icon-192.png +0 -0
- package/dist/icons/icon-512.png +0 -0
- package/dist/icons/icon.svg +1 -0
- package/dist/icons/maskable-192.png +0 -0
- package/dist/icons/maskable-512.png +0 -0
- package/dist/icons/maskable.svg +1 -0
- package/dist/index.html +39 -0
- package/dist/manifest.webmanifest +21 -0
- package/package.json +43 -3
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as e}from"./badge-DCLlsDNI.js";var t={name:`download`,size:24,node:[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]};t.node;var n=e(t);export{n as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{U as e,_t as t,d as n,ft as r,h as i,i as a,mt as o,o as s,r as c,s as l,t as u,v as ee}from"./badge-DCLlsDNI.js";import{O as te,i as d,l as ne,s as re,u as ie,v as ae}from"./queries-CxLQqNqz.js";import{n as f}from"./project-CYHaWZqH.js";import{a as p,i as m,n as oe,o as se,r as ce,t as le}from"./table-QAdUTXQz.js";import{a as ue,i as h,n as g,o as de,r as _,t as fe}from"./menu-C-8r2BNA.js";import{a as pe,i as me,n as he,r as ge,t as _e}from"./ledger-toolbar-B_Gbv5Ws.js";import{n as v}from"./search-CnrmI1BH.js";import{n as y,t as ve}from"./media-D6XgVZ7M.js";import{b as ye,f as b,h as be,l as xe,m as x,o as Se,p as Ce,u as S}from"./index-B9WjaP25.js";import{t as C}from"./money-OFUBQ3gl.js";import{t as w}from"./custom-cell-DOJAsRPW.js";var T=t(o(),1),E=r(),we=50;function D(){let{t,name:r,label:o}=ee(),S=e=>r({name:e.name??``,nameAr:e.nameAr}),{range:D}=Ce(),{date:O,money:k}=f(),A=he(),j=be(),Ee=ve(),De=d(`expense`,!0),Oe=te(),ke=re(`expense`),M=ae(!0),N=(0,T.useMemo)(()=>(M.data?.items??[]).filter(e=>!e.archived),[M.data]),[Ae,P]=(0,T.useState)(null),je=(0,T.useMemo)(()=>({from:D.from,to:D.to,q:A.q,categoryId:A.categoryId,stakeholderId:A.stakeholderId,paymentMethodId:A.paymentMethodId,sort:A.sort,order:A.order,page:A.page,pageSize:we}),[D,A.q,A.categoryId,A.stakeholderId,A.paymentMethodId,A.sort,A.order,A.page]),F=ie(je),{remove:I,bulkDelete:Me,recompute:Ne,recomputeRange:Pe}=ne(),[Fe,L]=(0,T.useState)(void 0),[R,z]=(0,T.useState)(null),[B,V]=(0,T.useState)(new Set),[H,U]=(0,T.useState)(!1),[Ie,W]=(0,T.useState)(!1),[G,K]=(0,T.useState)(null),q=F.data?.items??[],J=ke.data?.items??[],Y=q.length>0&&q.every(e=>B.has(e.id)),Le=()=>V(Y?new Set:new Set(q.map(e=>e.id))),X=e=>V(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),Z=e=>A.set({sort:e,order:A.sort===e&&A.order===`desc`?`asc`:`desc`}),Q=e=>A.sort===e?A.order:null,Re=async()=>{if(R)try{await I.mutateAsync(R.id),j.success(t(`Expense deleted`)),z(null),K(null)}catch(e){j.error(t(`Delete failed`),x(e))}},ze=async()=>{try{await Me.mutateAsync([...B]),j.success(t(`{n} expenses deleted`,{n:B.size})),V(new Set),U(!1),W(!1)}catch(e){j.error(t(`Delete failed`),x(e))}},$=async e=>{try{await Ne.mutateAsync(e.id),j.success(t(`Split recomputed`))}catch(e){j.error(t(`Recompute failed`),x(e))}},Be=(n=`xlsx`)=>e(`/export/expenses.${n}`,`expenses.${n}`,{from:D.from,to:D.to}).catch(e=>j.error(t(`Export failed`),x(e))),Ve=(0,T.useMemo)(()=>{let e=new Map;for(let t of q)e.set(t.date,[...e.get(t.date)??[],t]);return[...e.entries()]},[q]);return(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(n,{title:t(`Expenses`),subtitle:F.data?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(C,{minor:F.data.totals.amountMinor,className:`text-ink font-medium`}),` `,t(`across {n} entries`,{n:F.data.totals.count})]}):t(`Loading…`),actions:(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(fe,{trigger:()=>(0,E.jsx)(b,{variant:`secondary`,size:`sm`,icon:(0,E.jsx)(de,{className:`size-4`}),className:`rounded-full`,children:t(`More`)}),title:t(`Expenses`),children:e=>(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(g,{icon:H?(0,E.jsx)(pe,{}):(0,E.jsx)(me,{}),onClick:()=>{e(),U(e=>!e),V(new Set)},children:t(H?`Done selecting`:`Select entries`)}),(0,E.jsx)(g,{icon:(0,E.jsx)(v,{}),onClick:async()=>{e();try{let e=await Pe.mutateAsync({from:D.from,to:D.to});j.success(t(`Re-split {n} ownership-mode expenses`,{n:e.updated}))}catch(e){j.error(t(`Recompute failed`),x(e))}},children:t(`Re-split range by current ownership`)}),(0,E.jsx)(_,{}),(0,E.jsx)(g,{icon:(0,E.jsx)(h,{}),danger:!0,disabled:!B.size,onClick:()=>{e(),W(!0)},children:t(`Delete {n} selected`,{n:B.size||``})})]})}),(0,E.jsx)(b,{variant:`primary`,size:`sm`,className:`rounded-full max-md:hidden`,icon:(0,E.jsx)(ye,{className:`size-4`}),onClick:()=>L(null),children:t(`New expense`)})]})}),(0,E.jsx)(`div`,{className:`mb-3`,children:(0,E.jsx)(_e,{categories:De.data?.items.filter(e=>!e.archived)??[],stakeholders:Oe.data?.items??[],paymentMethods:N,stakeholderLabel:`Paid by`,onExport:Be})}),H&&q.length>0&&(0,E.jsxs)(`div`,{className:`mb-3 flex items-center justify-between gap-2 card px-4 py-2 fade-up`,children:[(0,E.jsx)(y,{label:t(Y?`Deselect all on page`:`Select all on page`),checked:Y,onChange:Le}),(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(b,{size:`xs`,variant:`ghost`,onClick:()=>{U(!1),V(new Set)},children:t(`Done`)}),(0,E.jsx)(b,{size:`xs`,variant:`danger`,disabled:!B.size,icon:(0,E.jsx)(h,{className:`size-3.5`}),onClick:()=>W(!0),children:t(`Delete {n}`,{n:B.size||``})})]})]}),Ee?(0,E.jsxs)(`div`,{className:`space-y-4`,children:[F.isPending&&(0,E.jsx)(s,{children:(0,E.jsx)(`div`,{className:`py-10 text-center text-ink-3`,children:t(`Loading…`)})}),!F.isPending&&!q.length&&(0,E.jsx)(s,{children:(0,E.jsx)(l,{title:t(`No expenses`),description:t(`Nothing matches this period and filters.`)})}),Ve.map(([e,n])=>(0,E.jsxs)(`section`,{children:[(0,E.jsxs)(`div`,{className:`flex items-baseline justify-between px-1 mb-1.5`,children:[(0,E.jsx)(`span`,{className:`label`,children:O(e,`long`)}),(0,E.jsx)(`span`,{className:`num text-[12px] text-ink-3`,children:k(n.reduce((e,t)=>e+t.amountMinor,0))})]}),(0,E.jsx)(`ul`,{className:`card divide-y divide-line overflow-hidden`,children:n.map(e=>(0,E.jsx)(`li`,{children:(0,E.jsxs)(`button`,{type:`button`,onClick:()=>H?X(e.id):K(e),className:i(`pressable w-full flex items-center gap-3 px-4 py-3 text-start`,B.has(e.id)&&`bg-accent-soft/50`),children:[H?(0,E.jsx)(`span`,{className:i(`size-6 rounded-full border-2 inline-flex items-center justify-center shrink-0`,B.has(e.id)?`bg-accent border-accent text-white`:`border-line-strong`),children:B.has(e.id)&&(0,E.jsx)(pe,{className:`size-3.5`})}):(0,E.jsx)(`span`,{className:`inline-flex items-center justify-center size-10 rounded-[12px] shrink-0`,style:{background:`${e.category?.color??`#999`}1f`},children:(0,E.jsx)(a,{color:e.category?.color??`#999`,size:10})}),(0,E.jsxs)(`span`,{className:`flex-1 min-w-0`,children:[(0,E.jsx)(`span`,{dir:`auto`,className:`block text-[15px] font-medium truncate`,children:e.description}),(0,E.jsxs)(`span`,{className:`block text-[12.5px] text-ink-3 truncate`,children:[e.category?r(e.category):``,e.payments.filter(e=>e.amountMinor>0).length>1?` · ${e.payments.filter(e=>e.amountMinor>0).map(e=>`${S(e)} ${k(e.amountMinor,{compact:!0})}`).join(` + `)}`:e.payments[0]?` · ${S(e.payments[0])}`:``,e.paidBy?` · ${r(e.paidBy)}`:` · ${t(`Company`)}`,e.splitMode===`custom`?` · ${t(`custom split`)}`:``]})]}),(0,E.jsx)(C,{minor:e.amountMinor,className:`text-[15px] font-semibold shrink-0`})]})},e.id))})]},e)),F.data&&(0,E.jsx)(`div`,{className:`card`,children:(0,E.jsx)(oe,{page:F.data.page,pageSize:F.data.pageSize,total:F.data.total,onPage:e=>A.set({page:String(e)})})})]}):(0,E.jsxs)(s,{flush:!0,children:[(0,E.jsxs)(ce,{children:[(0,E.jsx)(`thead`,{children:(0,E.jsxs)(`tr`,{children:[H&&(0,E.jsx)(p,{className:`w-10`,children:(0,E.jsx)(y,{checked:Y,onChange:Le,"aria-label":t(`Select all`)})}),(0,E.jsx)(p,{sortable:!0,sorted:Q(`date`),onSort:()=>Z(`date`),className:`w-28`,children:t(`Date`)}),(0,E.jsx)(p,{sortable:!0,sorted:Q(`description`),onSort:()=>Z(`description`),children:t(`Description`)}),(0,E.jsx)(p,{children:t(`Category`)}),(0,E.jsx)(p,{children:t(`Paid by`)}),J.map(e=>(0,E.jsx)(p,{align:e.type===`money`||e.type===`number`?`right`:`left`,children:o(e)},e.id)),N.map(e=>(0,E.jsx)(p,{align:`right`,children:(0,E.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,E.jsx)(a,{color:e.color}),r(e)]})},e.id)),(0,E.jsx)(p,{align:`right`,sortable:!0,sorted:Q(`amountMinor`),onSort:()=>Z(`amountMinor`),className:`w-36`,children:N.length?t(`Total`):t(`Amount`)}),(0,E.jsx)(p,{className:`w-12`})]})}),(0,E.jsxs)(`tbody`,{children:[F.isPending&&(0,E.jsx)(le,{colSpan:8+J.length+N.length,children:t(`Loading…`)}),!F.isPending&&!q.length&&(0,E.jsx)(le,{colSpan:8+J.length+N.length,children:t(`No expenses match. Try a wider period or clear filters.`)}),q.map(e=>(0,E.jsxs)(se,{selected:B.has(e.id),className:`cursor-pointer`,onClick:()=>H?X(e.id):K(e),children:[H&&(0,E.jsx)(m,{onClick:e=>e.stopPropagation(),children:(0,E.jsx)(y,{checked:B.has(e.id),onChange:()=>X(e.id),"aria-label":t(`Select`)})}),(0,E.jsx)(m,{className:`num text-ink-2 whitespace-nowrap`,children:O(e.date)}),(0,E.jsxs)(m,{children:[(0,E.jsx)(`div`,{dir:`auto`,className:`font-medium truncate max-w-[380px]`,children:e.description}),(e.vendor||e.recurringRuleId||e.splitMode===`custom`)&&(0,E.jsx)(`div`,{className:`text-[12px] text-ink-3 truncate`,children:[e.vendor,e.recurringRuleId&&t(`recurring`),e.splitMode===`custom`&&t(`custom split`)].filter(Boolean).join(` · `)})]}),(0,E.jsx)(m,{children:e.category&&(0,E.jsx)(c,{color:e.category.color,children:r(e.category)})}),(0,E.jsx)(m,{children:e.paidBy?(0,E.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,E.jsx)(u,{name:r(e.paidBy),color:e.paidBy.color,size:22}),(0,E.jsx)(`span`,{className:`truncate`,children:r(e.paidBy)})]}):(0,E.jsx)(`span`,{className:`text-ink-3`,children:t(`Company`)})}),J.map(t=>(0,E.jsx)(m,{align:t.type===`money`||t.type===`number`?`right`:`left`,children:(0,E.jsx)(w,{def:t,value:e.customFields?.[t.key]})},t.id)),N.map(n=>{let i=e.payments.find(e=>e.paymentMethodId===n.id);return(0,E.jsx)(m,{align:`right`,onClick:e=>e.stopPropagation(),children:i&&i.amountMinor>0?(0,E.jsx)(`button`,{type:`button`,className:`num hover:text-accent`,title:t(`Edit {method} amount`,{method:r(n)}),onClick:()=>P({kind:`expense`,entry:e,method:n}),children:k(i.amountMinor)}):(0,E.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 text-[12.5px] font-medium text-accent/80 hover:text-accent whitespace-nowrap`,onClick:()=>P({kind:`expense`,entry:e,method:n}),children:[(0,E.jsx)(ye,{className:`size-3.5`}),t(`Add {method}`,{method:r(n)})]})},n.id)}),(0,E.jsx)(m,{align:`right`,children:(0,E.jsx)(C,{minor:e.amountMinor,className:`font-semibold`})}),(0,E.jsx)(m,{onClick:e=>e.stopPropagation(),children:(0,E.jsx)(fe,{trigger:()=>(0,E.jsx)(`button`,{type:`button`,className:`size-8 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover`,"aria-label":t(`Actions`),children:(0,E.jsx)(de,{className:`size-4`})}),children:n=>(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(g,{icon:(0,E.jsx)(ue,{}),onClick:()=>{n(),L(e)},children:t(`Edit`)}),(0,E.jsx)(g,{icon:(0,E.jsx)(v,{}),onClick:()=>{n(),$(e)},children:t(`Re-split by current ownership`)}),(0,E.jsx)(_,{}),(0,E.jsx)(g,{icon:(0,E.jsx)(h,{}),danger:!0,onClick:()=>{n(),z(e)},children:t(`Delete`)})]})})})]},e.id))]})]}),F.data&&(0,E.jsx)(oe,{page:F.data.page,pageSize:F.data.pageSize,total:F.data.total,onPage:e=>A.set({page:String(e)})})]}),(0,E.jsx)(Te,{expense:G,onClose:()=>K(null),onEdit:()=>{L(G),K(null)},onDelete:()=>z(G),onRecompute:()=>G&&$(G),defs:J}),(0,E.jsx)(Se,{open:Fe!==void 0,onClose:()=>L(void 0),expense:Fe??null}),(0,E.jsx)(ge,{target:Ae,onClose:()=>P(null)}),(0,E.jsx)(xe,{open:!!R,onClose:()=>z(null),onConfirm:Re,loading:I.isPending,title:t(`Delete this expense?`),description:R?t(`{description} · {amount} on {date}.`,{description:R.description,amount:k(R.amountMinor),date:O(R.date)}):``}),(0,E.jsx)(xe,{open:Ie,onClose:()=>W(!1),onConfirm:ze,loading:Me.isPending,title:t(`Delete {n} expenses?`,{n:B.size}),description:t(`This cannot be undone. Export first if you want a copy.`)})]})}function Te({expense:e,onClose:t,onEdit:n,onDelete:r,onRecompute:i,defs:a}){let{t:o,name:s,label:c}=ee(),l=e=>s({name:e.name??``,nameAr:e.nameAr}),{money:u,date:te}=f(),d=e;return(0,E.jsx)(S,{open:!!d,onClose:t,title:d?.description??``,description:d?`${te(d.date,`long`)} · ${d.category?s(d.category):``}`:``,width:480,footer:d&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(b,{variant:`ghost`,size:`md`,onClick:()=>{i()},children:o(`Re-split`)}),(0,E.jsx)(b,{variant:`danger`,size:`md`,onClick:()=>{r()},children:o(`Delete`)}),(0,E.jsx)(b,{variant:`primary`,size:`md`,onClick:n,children:o(`Edit`)})]}),children:d&&(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsx)(`div`,{className:`num text-[32px] font-semibold tracking-tight`,children:u(d.amountMinor)}),(0,E.jsxs)(`dl`,{className:`grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-[14px]`,children:[d.payments.filter(e=>e.amountMinor>0).map(e=>(0,E.jsxs)(`span`,{className:`contents`,children:[(0,E.jsx)(`dt`,{className:`text-ink-3`,children:l(e)}),(0,E.jsx)(`dd`,{className:`num`,children:u(e.amountMinor)})]},e.paymentMethodId)),(0,E.jsx)(`dt`,{className:`text-ink-3`,children:o(`Paid by`)}),(0,E.jsx)(`dd`,{className:`font-medium`,children:d.paidBy?s(d.paidBy):o(`Company account`)}),d.vendor&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`dt`,{className:`text-ink-3`,children:o(`Vendor`)}),(0,E.jsx)(`dd`,{children:d.vendor})]}),a.map(e=>(0,E.jsxs)(`span`,{className:`contents`,children:[(0,E.jsx)(`dt`,{className:`text-ink-3`,children:c(e)}),(0,E.jsx)(`dd`,{children:(0,E.jsx)(w,{def:e,value:d.customFields?.[e.key]})})]},e.id)),d.notes&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`dt`,{className:`text-ink-3`,children:o(`Notes`)}),(0,E.jsx)(`dd`,{className:`whitespace-pre-wrap`,children:d.notes})]})]}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`div`,{className:`label mb-2`,children:d.splitMode===`custom`?o(`Split (custom)`):o(`Split (by ownership)`)}),(0,E.jsxs)(`ul`,{className:`rounded-[14px] border border-line divide-y divide-line`,children:[d.splits.map(e=>(0,E.jsxs)(`li`,{className:`flex items-center justify-between px-3.5 h-11 text-[14px]`,children:[(0,E.jsxs)(`span`,{children:[e.stakeholderName??e.stakeholderId,` `,(0,E.jsxs)(`span`,{className:`num text-ink-3 text-[12.5px]`,children:[e.sharePercent.toFixed(e.sharePercent%1?2:0),`%`]})]}),(0,E.jsx)(`span`,{className:`num font-medium`,children:u(e.amountMinor)})]},e.id)),!d.splits.length&&(0,E.jsx)(`li`,{className:`px-3.5 py-3 text-[13px] text-ink-3`,children:o(`No stakeholders at the time of entry.`)})]})]})]})})}export{D as ExpensesPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e,t=1){return e==null||!Number.isFinite(e)?`—`:`${e.toFixed(t)}%`}function t(e,t=1){return e==null||!Number.isFinite(e)?`—`:`${e>0?`+`:``}${e.toFixed(t)}%`}function n(e,t){let n=Date.now()-new Date(e).getTime(),r=Math.round(n/6e4),i=new Intl.RelativeTimeFormat(t,{numeric:`auto`});if(r<1)return i.format(0,`second`);if(r<60)return i.format(-r,`minute`);let a=Math.round(r/60);if(a<24)return i.format(-a,`hour`);let o=Math.round(a/24);return o<30?i.format(-o,`day`):new Date(e).toLocaleDateString(t)}export{n,t as r,e as t};
|