@accounter/client
Version:
Accounter client application
7 lines (4 loc) • 21.9 kB
JavaScript
import{s as e}from"./dist-BbgEzppd.js";import{i as t,n,o as r,t as i}from"./utils-BUNz070n.js";import{Hn as a,Ja as o,R as s,Ya as c,_ as l,r as u,t as d}from"./error-handling-AQOG1RNy.js";import{B as f,F as p,I as m,L as h,M as g,N as _,P as v,R as y,V as b,a as x,c as S,d as C,dt as w,f as ee,gt as te,i as ne,it as re,l as ie,n as ae,o as oe,ot as se,pt as ce,r as T,s as le,t as ue,u as de,z as fe}from"./select-6mBYg_R6.js";import{_ as pe,b as me,c as E,f as he,i as ge,o as _e,p as D,r as ve,v as ye,y as O}from"./separator-EFzchRgs.js";import{t as be}from"./pencil-C7tx8CH2.js";import{a as xe,c as k,n as A,s as j,t as M}from"./button-CBTN3XMQ.js";import{w as Se}from"./index-B8E5XsZe.js";import{t as Ce}from"./page-layout-BO3YzLcj.js";var we=te(`tag`,[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`,key:`vktsd0`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`kqv944`}]]),N=e(r(),1),P=t(),F=`AlertDialog`,[Te,Ee]=se(F,[b]),I=b(),L=e=>{let{__scopeAlertDialog:t,...n}=e,r=I(t);return(0,P.jsx)(h,{...r,...n,modal:!0})};L.displayName=F;var De=`AlertDialogTrigger`,Oe=N.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=I(n);return(0,P.jsx)(fe,{...i,...r,ref:t})});Oe.displayName=De;var ke=`AlertDialogPortal`,R=e=>{let{__scopeAlertDialog:t,...n}=e,r=I(t);return(0,P.jsx)(m,{...r,...n})};R.displayName=ke;var Ae=`AlertDialogOverlay`,z=N.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=I(n);return(0,P.jsx)(p,{...i,...r,ref:t})});z.displayName=Ae;var B=`AlertDialogContent`,[je,Me]=Te(B),Ne=xe(`AlertDialogContent`),V=N.forwardRef((e,t)=>{let{__scopeAlertDialog:n,children:r,...i}=e,a=I(n),o=N.useRef(null),s=j(t,o),c=N.useRef(null);return(0,P.jsx)(f,{contentName:B,titleName:H,docsSlug:`alert-dialog`,children:(0,P.jsx)(je,{scope:n,cancelRef:c,children:(0,P.jsxs)(_,{role:`alertdialog`,...a,...i,ref:s,onOpenAutoFocus:re(i.onOpenAutoFocus,e=>{e.preventDefault(),c.current?.focus({preventScroll:!0})}),onPointerDownOutside:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),children:[(0,P.jsx)(Ne,{children:r}),(0,P.jsx)(Ie,{contentRef:o})]})})})});V.displayName=B;var H=`AlertDialogTitle`,U=N.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=I(n);return(0,P.jsx)(y,{...i,...r,ref:t})});U.displayName=H;var Pe=`AlertDialogDescription`,W=N.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=I(n);return(0,P.jsx)(v,{...i,...r,ref:t})});W.displayName=Pe;var Fe=`AlertDialogAction`,G=N.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=I(n);return(0,P.jsx)(g,{...i,...r,ref:t})});G.displayName=Fe;var K=`AlertDialogCancel`,q=N.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,{cancelRef:i}=Me(K,n),a=I(n),o=j(t,i);return(0,P.jsx)(g,{...a,...r,ref:o})});q.displayName=K;var Ie=({contentRef:e})=>{let t=`\`${B}\` requires a description for the component to be accessible for screen reader users.
You can add a description to the \`${B}\` by passing a \`${Pe}\` component as a child, which also benefits sighted users by adding visible context to the dialog.
Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${B}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return N.useEffect(()=>{document.getElementById(e.current?.getAttribute(`aria-describedby`))||console.warn(t)},[t,e]),null},Le=L,Re=R,J=z,Y=V,X=G,Z=q,ze=U,Be=W;function Ve({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`input-group`,role:`group`,className:i(`group/input-group border-gray-200 dark:bg-gray-200/30 shadow-xs relative flex w-full items-center rounded-md border outline-none transition-[color,box-shadow] dark:border-gray-800 dark:dark:bg-gray-800/30`,`h-9 has-[>textarea]:h-auto`,`has-[>[data-align=inline-start]]:[&>input]:pl-2`,`has-[>[data-align=inline-end]]:[&>input]:pr-2`,`has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3`,`has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3`,`has-[[data-slot=input-group-control]:focus-visible]:ring-gray-950 has-[[data-slot=input-group-control]:focus-visible]:ring-1 dark:has-[[data-slot=input-group-control]:focus-visible]:ring-gray-300`,`has-[[data-slot][aria-invalid=true]]:ring-red-500/20 has-[[data-slot][aria-invalid=true]]:border-red-500 dark:has-[[data-slot][aria-invalid=true]]:ring-red-500/40 dark:has-[[data-slot][aria-invalid=true]]:ring-red-900/20 dark:has-[[data-slot][aria-invalid=true]]:border-red-900 dark:dark:has-[[data-slot][aria-invalid=true]]:ring-red-900/40`,e),...t})}var He=k(`text-gray-500 flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 dark:text-gray-400`,{variants:{align:{"inline-start":`order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]`,"inline-end":`order-last pr-3 has-[>button]:mr-[-0.4rem] has-[>kbd]:mr-[-0.35rem]`,"block-start":`[.border-b]:pb-3 order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5`,"block-end":`[.border-t]:pt-3 order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5`}},defaultVariants:{align:`inline-start`}});function Ue({className:e,align:t=`inline-start`,...n}){return(0,P.jsx)(`div`,{role:`group`,"data-slot":`input-group-addon`,"data-align":t,className:i(He({align:t}),e),onClick:e=>{e.target.closest(`button`)||e.currentTarget.parentElement?.querySelector(`input`)?.focus()},...n})}k(`flex items-center gap-2 text-sm shadow-none`,{variants:{size:{xs:`h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5`,sm:`h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5`,"icon-xs":`size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0`,"icon-sm":`size-8 p-0 has-[>svg]:p-0`}},defaultVariants:{size:`xs`}});function We({className:e,...t}){return(0,P.jsx)(D,{"data-slot":`input-group-control`,className:i(`flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent`,e),...t})}function Q({className:e,...t}){return(0,P.jsx)(w,{role:`status`,"aria-label":`Loading`,className:i(`size-4 animate-spin`,e),...t})}var Ge=`addTag`,Ke=()=>{let[{fetching:e},t]=o(l);return{fetching:e,addTag:(0,N.useCallback)(async e=>{let n=`Error adding new tag [${e.tagName}]`,r=`${Ge}-${e.tagName}`;u.loading(`Adding tag`,{id:r});try{d(await t(e),n,r)&&u.success(`Success`,{id:r,description:`"${e.tagName}" tag was successfully added`})}catch(e){console.error(`${n}: ${e}`),u.error(`Error`,{id:r,description:n,duration:1e5,closeButton:!0})}},[t])}};function qe({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`field-group`,className:i(`group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4`,e),...t})}var Je=k(`group/field data-[invalid=true]:text-red-500 flex w-full gap-3 dark:data-[invalid=true]:text-red-900`,{variants:{orientation:{vertical:[`flex-col [&>*]:w-full [&>.sr-only]:w-auto`],horizontal:[`flex-row items-center`,`[&>[data-slot=field-label]]:flex-auto`,`has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px has-[>[data-slot=field-content]]:items-start`],responsive:[`@md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto flex-col [&>*]:w-full [&>.sr-only]:w-auto`,`@md/field-group:[&>[data-slot=field-label]]:flex-auto`,`@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px`]}},defaultVariants:{orientation:`vertical`}});function Ye({className:e,orientation:t=`vertical`,...n}){return(0,P.jsx)(`div`,{role:`group`,"data-slot":`field`,"data-orientation":t,className:i(Je({orientation:t}),e),...n})}function Xe({className:e,...t}){return(0,P.jsx)(oe,{"data-slot":`field-label`,className:i(`group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50`,`has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>[data-slot=field]]:p-4`,`has-data-[state=checked]:bg-gray-900/5 has-data-[state=checked]:border-gray-900 dark:has-data-[state=checked]:bg-gray-900/10 dark:has-data-[state=checked]:bg-gray-50/5 dark:has-data-[state=checked]:border-gray-50 dark:dark:has-data-[state=checked]:bg-gray-50/10`,e),...t})}function Ze({open:e,onOpenChange:t,tag:r,onSave:i,isSaving:a}){let[o,l]=(0,N.useState)(``),[u,d]=(0,N.useState)(null),[{data:f,fetching:p},m]=c({query:s,pause:!0});(0,N.useEffect)(()=>{e&&m()},[e,m]);let h=(0,N.useMemo)(()=>f?.allTags??[],[f]);(0,N.useEffect)(()=>{e&&(r?(l(r.name),d(r.parent?.id??null)):(l(``),d(null)))},[r,e]);let g=async()=>{o.trim()&&!a&&(await i(o.trim(),u),t(!1))},_=(0,N.useMemo)(()=>{if(!r)return h;let e=new Set,t=[r.id],n=h.reduce((e,t)=>{if(t.parent?.id){let n=e.get(t.parent.id)??[];n.push(t.id),e.set(t.parent.id,n)}return e},new Map);for(;t.length>0;){let r=t.shift();if(!e.has(r)){e.add(r);let i=n.get(r)??[];t.push(...i)}}return h.filter(t=>!e.has(t.id))},[h,r]),v=n(o);return(0,P.jsx)(le,{open:e,onOpenChange:a?void 0:t,children:(0,P.jsx)(S,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:p&&h.length===0?(0,P.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-10 gap-3`,children:[(0,P.jsx)(Q,{className:`size-8`}),(0,P.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`Loading tags...`})]}):(0,P.jsxs)(P.Fragment,{children:[(0,P.jsxs)(C,{children:[(0,P.jsx)(ee,{children:r?`Edit Tag`:`Create Tag`}),(0,P.jsx)(ie,{children:r?`Update the tag name and parent category.`:`Add a new tag to organize your finances.`})]}),(0,P.jsxs)(qe,{children:[(0,P.jsxs)(Ye,{children:[(0,P.jsx)(Xe,{htmlFor:`tag-name`,children:`Name`}),(0,P.jsx)(D,{id:`tag-name`,value:o,onChange:e=>l(e.target.value),placeholder:`Enter tag name`,dir:v?`rtl`:`ltr`,disabled:a,onKeyDown:e=>{e.key===`Enter`&&g()}})]}),(0,P.jsxs)(Ye,{children:[(0,P.jsx)(Xe,{htmlFor:`tag-parent`,children:`Parent Tag (optional)`}),(0,P.jsxs)(ue,{value:u??`none`,onValueChange:e=>d(e===`none`?null:e),disabled:a,children:[(0,P.jsx)(ne,{id:`tag-parent`,children:(0,P.jsx)(x,{placeholder:`Select parent tag`})}),(0,P.jsxs)(ae,{children:[(0,P.jsx)(T,{value:`none`,children:`No Parent`}),_.map(e=>{let t=e.namePath&&e.namePath.length>0?`${e.namePath.join(` / `)} / ${e.name}`:e.name;return(0,P.jsx)(T,{value:e.id,dir:n(e.name)?`rtl`:`ltr`,children:t},e.id)})]})]})]})]}),(0,P.jsxs)(de,{className:`flex-col gap-2 sm:flex-row`,children:[(0,P.jsx)(M,{variant:`outline`,onClick:()=>t(!1),className:`w-full sm:w-auto`,disabled:a,children:`Cancel`}),(0,P.jsx)(M,{onClick:g,disabled:!o.trim()||a,className:`w-full sm:w-auto`,children:a?(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(Q,{className:`size-4 me-2`}),`Saving...`]}):r?`Save Changes`:`Create Tag`})]})]})})})}function Qe({onDone:e,children:t}){let[n,r]=(0,N.useState)(!1),[i,a]=(0,N.useState)(!1),{addTag:o}=Ke(),s=(0,N.useCallback)(async(t,n)=>{a(!0);try{await o({tagName:t,parentTag:n}),await e()}finally{a(!1)}},[o,e]);return(0,P.jsxs)(P.Fragment,{children:[t?(0,P.jsx)(M,{asChild:!0,onClick:()=>r(!0),children:t}):(0,P.jsxs)(M,{onClick:()=>r(!0),className:`w-full sm:w-auto`,children:[(0,P.jsx)(O,{className:`size-4 me-2`}),`Create Tag`]}),(0,P.jsx)(Ze,{open:n,onOpenChange:r,tag:null,onSave:s,isSaving:i})]})}function $e({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty`,className:i(`flex min-w-0 flex-1 flex-col items-center justify-center gap-6 text-balance rounded-lg border-dashed p-6 text-center md:p-12`,e),...t})}var et=k(`mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0`,{variants:{variant:{default:`bg-transparent`,icon:`bg-gray-100 text-gray-950 flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6 dark:bg-gray-800 dark:text-gray-50`}},defaultVariants:{variant:`default`}});function tt({className:e,variant:t=`default`,...n}){return(0,P.jsx)(`div`,{"data-slot":`empty-icon`,"data-variant":t,className:i(et({variant:t,className:e})),...n})}function nt({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty-title`,className:i(`text-lg font-medium tracking-tight`,e),...t})}function rt({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty-description`,className:i(`text-gray-500 [&>a:hover]:text-gray-900 text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4 dark:text-gray-400 dark:[&>a:hover]:text-gray-50`,e),...t})}function it({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty-content`,className:i(`flex w-full min-w-0 max-w-sm flex-col items-center gap-4 text-balance text-sm`,e),...t})}var at=`deleteTag`,ot=()=>{let[{fetching:e},t]=o(a);return{fetching:e,deleteTag:(0,N.useCallback)(async e=>{let n=`Error deleting new tag [${e.name}]`,r=`${at}-${e.tagId}`;u.loading(`Deleting tag [${e.name}]`,{id:r});try{d(await t(e),n,r)&&u.success(`Tag Deleted`,{id:r,description:`[${e.name}] tag was successfully removed`})}catch(e){console.error(`${n}: ${e}`),u.error(`Error`,{id:r,description:n,duration:1e5,closeButton:!0})}},[t])}},st=Le,ct=Re,lt=N.forwardRef(({className:e,...t},n)=>(0,P.jsx)(J,{className:i(`fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,e),...t,ref:n}));lt.displayName=J.displayName;var ut=N.forwardRef(({className:e,...t},n)=>(0,P.jsxs)(ct,{children:[(0,P.jsx)(lt,{}),(0,P.jsx)(Y,{ref:n,className:i(`fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg dark:border-gray-800 dark:bg-gray-950`,e),...t})]}));ut.displayName=Y.displayName;var dt=({className:e,...t})=>(0,P.jsx)(`div`,{className:i(`flex flex-col space-y-2 text-center sm:text-left`,e),...t});dt.displayName=`AlertDialogHeader`;var ft=({className:e,...t})=>(0,P.jsx)(`div`,{className:i(`flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2`,e),...t});ft.displayName=`AlertDialogFooter`;var pt=N.forwardRef(({className:e,...t},n)=>(0,P.jsx)(ze,{ref:n,className:i(`text-lg font-semibold`,e),...t}));pt.displayName=ze.displayName;var mt=N.forwardRef(({className:e,...t},n)=>(0,P.jsx)(Be,{ref:n,className:i(`text-sm text-gray-500 dark:text-gray-400`,e),...t}));mt.displayName=Be.displayName;var ht=N.forwardRef(({className:e,...t},n)=>(0,P.jsx)(X,{ref:n,className:i(A(),e),...t}));ht.displayName=X.displayName;var gt=N.forwardRef(({className:e,...t},n)=>(0,P.jsx)(Z,{ref:n,className:i(A({variant:`outline`}),`mt-2 sm:mt-0`,e),...t}));gt.displayName=Z.displayName;function _t({open:e,onOpenChange:t,tag:r,onConfirm:i,isDeleting:a}){if(!r)return null;let o=n(r.name);return(0,P.jsx)(st,{open:e,onOpenChange:a?void 0:t,children:(0,P.jsxs)(ut,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:[(0,P.jsxs)(dt,{children:[(0,P.jsx)(pt,{children:`Delete Tag`}),(0,P.jsxs)(mt,{children:[`Are you sure you want to delete the tag`,` `,(0,P.jsxs)(`span`,{className:`font-semibold text-foreground`,dir:o?`rtl`:`ltr`,children:[`"`,r.name,`"`]}),`? This action cannot be undone.`]})]}),(0,P.jsxs)(ft,{className:`flex-col gap-2 sm:flex-row`,children:[(0,P.jsx)(gt,{className:`w-full sm:w-auto`,disabled:a,children:`Cancel`}),(0,P.jsx)(M,{onClick:i,disabled:a,variant:`destructive`,className:`w-full sm:w-auto`,children:a?(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(Q,{className:`size-4 me-2`}),`Deleting...`]}):`Delete`})]})]})})}function vt({tag:e,depth:t,hasChildren:r,isCollapsed:a,onToggleCollapse:o,onEdit:s,onDelete:c}){let l=n(e.name);return(0,P.jsxs)(`div`,{className:i(`group flex items-center justify-between gap-2 px-3 py-3 border-b border-border`,`hover:bg-secondary/50 transition-colors`,`sm:px-4`),children:[(0,P.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0 flex-1`,style:{paddingInlineStart:`${t*20}px`},children:[r?(0,P.jsx)(`button`,{type:`button`,onClick:()=>o(e.id),className:`p-0.5 rounded hover:bg-secondary transition-colors shrink-0`,"aria-expanded":!a,"aria-label":a?`Expand`:`Collapse`,children:(0,P.jsx)(ce,{className:i(`size-4 text-muted-foreground transition-transform rtl:rotate-180`,!a&&`rotate-90 rtl:rotate-90`)})}):t>0?(0,P.jsx)(`span`,{className:`size-4 shrink-0`,"aria-hidden":`true`}):null,(0,P.jsx)(`span`,{className:i(`text-foreground font-medium truncate`,l&&`text-right`),dir:l?`rtl`:`ltr`,children:e.name}),e.namePath&&e.namePath.length>0&&(0,P.jsxs)(`span`,{className:`text-muted-foreground text-sm hidden sm:inline truncate shrink-0`,children:[`(`,e.namePath.join(` / `),`)`]})]}),(0,P.jsxs)(ge,{children:[(0,P.jsx)(he,{asChild:!0,children:(0,P.jsxs)(M,{variant:`ghost`,size:`sm`,className:`opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity shrink-0`,children:[(0,P.jsx)(me,{className:`size-4`}),(0,P.jsx)(`span`,{className:`sr-only`,children:`Actions`})]})}),(0,P.jsxs)(_e,{align:`end`,children:[(0,P.jsxs)(E,{onClick:()=>s(e),children:[(0,P.jsx)(be,{className:`size-4 me-2`}),`Edit`]}),(0,P.jsxs)(E,{onClick:()=>c(e),className:`text-destructive focus:text-destructive`,children:[(0,P.jsx)(pe,{className:`size-4 me-2`}),`Delete`]})]})]})]})}function yt(e){let t=new Map,n=[];e.map(e=>{t.set(e.id,{tag:e,children:[]})}),e.map(e=>{let r=t.get(e.id);if(e.parent){let i=t.get(e.parent.id);i?i.children.push(r):n.push(r)}else n.push(r)});let r=e=>e.sort((e,t)=>e.tag.name.localeCompare(t.tag.name)).map(e=>({...e,children:r(e.children)}));return r(n)}function $(e,t,n=0){let r=[];return e.map(e=>{let i=e.children.length>0;r.push({tag:e.tag,depth:n,hasChildren:i}),i&&!t.has(e.tag.id)&&r.push(...$(e.children,t,n+1))}),r}function bt({search:e,allTags:t,onChange:n}){let[r,i]=(0,N.useState)(new Set),[a,o]=(0,N.useState)(!1),[s,c]=(0,N.useState)(!1),[l,u]=(0,N.useState)(null),[d,f]=(0,N.useState)(!1),[p,m]=(0,N.useState)(!1),{addTag:h}=Ke(),{deleteTag:g}=ot(),{updateTag:_}=ve(),v=(0,N.useMemo)(()=>{if(!e.trim())return t;let n=e.toLowerCase();return t.filter(e=>e.name.toLowerCase().includes(n)||e.namePath?.some(e=>e.toLowerCase().includes(n)))},[t,e]),y=(0,N.useMemo)(()=>$(yt(v),r),[v,r]);(0,N.useEffect)(()=>{e.trim()&&i(new Set)},[e]);let b=(0,N.useCallback)(e=>{i(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),x=(0,N.useCallback)(e=>{u(e),o(!0)},[]),S=(0,N.useCallback)(e=>{u(e),c(!0)},[]),C=(0,N.useCallback)(async(e,t)=>{f(!0);try{l?await _({tagId:l.id,fields:{name:e,parentId:t}}):await h({tagName:e,parentTag:t}),await n(),u(null)}finally{f(!1)}},[h,l,n,_]),w=(0,N.useCallback)(async()=>{if(l){m(!0);try{await g({tagId:l.id,name:l.name}),await n(),u(null),c(!1)}finally{m(!1)}}},[g,l,n]);return(0,P.jsxs)(`div`,{className:`min-h-screen bg-background`,children:[(0,P.jsxs)(`div`,{className:`max-w-4xl mx-auto px-4 py-6 sm:py-8`,children:[(0,P.jsx)(`div`,{className:`rounded-lg border border-border bg-card overflow-hidden`,children:y.length>0?y.map(({tag:e,depth:t,hasChildren:n})=>(0,P.jsx)(vt,{tag:e,depth:t,hasChildren:n,isCollapsed:r.has(e.id),onToggleCollapse:b,onEdit:x,onDelete:S},e.id)):(0,P.jsxs)($e,{className:`py-8 sm:py-12`,children:[(0,P.jsx)(tt,{children:(0,P.jsx)(we,{className:`size-8 sm:size-10 text-muted-foreground`})}),(0,P.jsx)(nt,{children:e?`No tags found`:`No tags yet`}),(0,P.jsx)(rt,{children:e?`Try adjusting your search query.`:`Create your first tag to start organizing your finances.`}),!e&&(0,P.jsx)(it,{children:(0,P.jsx)(Qe,{onDone:n,children:(0,P.jsxs)(M,{children:[(0,P.jsx)(O,{className:`size-4 me-2`}),`Create Tag`]})})})]})}),t.length>0&&(0,P.jsxs)(`p`,{className:`text-muted-foreground text-sm mt-4 text-center`,children:[v.length,` of `,t.length,` tag`,t.length===1?``:`s`]})]}),(0,P.jsx)(Ze,{open:a,onOpenChange:o,tag:l,onSave:C,isSaving:d}),(0,P.jsx)(_t,{open:s,onOpenChange:c,tag:l,onConfirm:w,isDeleting:p})]})}var xt=()=>{let[e,t]=(0,N.useState)(``),{setFiltersContext:n}=(0,N.useContext)(Se);(0,N.useEffect)(()=>{n(null)},[n]);let[{data:r,fetching:i},a]=c({query:s}),o=(0,N.useMemo)(()=>r?.allTags??[],[r]);return i&&o.length===0?(0,P.jsx)(`div`,{className:`min-h-screen bg-background flex items-center justify-center`,children:(0,P.jsxs)(`div`,{className:`flex flex-col items-center gap-3`,children:[(0,P.jsx)(Q,{className:`size-8`}),(0,P.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`Loading tags...`})]})}):(0,P.jsx)(Ce,{title:`Tags`,description:`Manage your charges tags.`,headerActions:(0,P.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,P.jsxs)(Ve,{className:`max-w-xs`,children:[(0,P.jsx)(We,{placeholder:`Search tags...`,value:e,onChange:e=>t(e.target.value),className:`ps-10`}),(0,P.jsx)(Ue,{children:(0,P.jsx)(ye,{})})]}),(0,P.jsx)(Qe,{onDone:async()=>{await a()},children:(0,P.jsxs)(M,{className:`w-full sm:w-auto`,children:[(0,P.jsx)(O,{className:`size-4 me-2`}),`Create Tag`]})})]}),children:(0,P.jsx)(bt,{search:e,allTags:o,onChange:async()=>{await a()}})})};export{xt as TagsManager};