@flexkit/asset-manager 0.0.25 → 0.0.26

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/index.js CHANGED
@@ -1,18 +1,18 @@
1
- import'./index.css';import {FileStack,TagIcon,PlusIcon,Loader2,Ellipsis,LoaderCircle,Search,X,ImagePlayIcon,ImageIcon,FilePlayIcon,LayersIcon,SplinePointerIcon,ListChecks,MinusIcon,Trash2Icon}from'lucide-react';import {IMAGES_BASE_URL,useLocation,useAppContext,useGraphQLError,useConfig,useGridColumnsDefinition,assetSchema,useEntityQuery,ProjectDisabled,SchemaError,DataTable,Outlet,useEntityMutation,getEntityCreateMutation,getEntityQuery,gql,getEntityDeleteMutation,getEntityUpdateMutation,useParams,useUploadAssets,useDispatch,useSearch,DataTableFacetedFilter}from'@flexkit/studio';import {TooltipProvider,Tooltip,TooltipTrigger,TooltipPortal,TooltipContent,ResizablePanelGroup,ResizablePanel,ResizableHandle,Dialog,DialogTrigger,Button,DialogContent,DialogHeader,DialogTitle,DialogDescription,Input,DialogFooter,ScrollArea,DropdownMenu,DropdownMenuTrigger,DropdownMenuContent,DropdownMenuItem,DropdownMenuSeparator,Skeleton,CommandDialog,CommandInput,CommandList,CommandEmpty,CommandGroup,CommandItem,CommandSeparator}from'@flexkit/studio/ui';import {defaultStyles,FileIcon}from'react-file-icon';import {jsx,jsxs}from'react/jsx-runtime';import {useState,useMemo,useRef,useCallback,useEffect}from'react';import {find,propEq}from'ramda';var ct=FileIcon,Se="fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]";function _e({value:m}){if(!m)return null;let t=m,i=/\.(png|jpe?g|gif|webp|avif|svg)$/i.test(t),u=C=>{let[f]=C.split("?"),O=f.split(".");return O.length>1?O.pop().toLowerCase():"file"},h=t.endsWith(".svg")?`${IMAGES_BASE_URL}${t}`:`${IMAGES_BASE_URL}${t}?w=84&h=84&f=webp`,R=t.endsWith(".svg")?`${IMAGES_BASE_URL}${t}`:`${IMAGES_BASE_URL}${t}?w=624&h=624&f=webp`;return jsx("div",{className:"fk:z-10",children:jsx(TooltipProvider,{children:i?jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsx("img",{src:h,alt:"asset",className:`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${Se}`})}),jsx(TooltipPortal,{children:jsx(TooltipContent,{children:jsx("img",{src:R,alt:"asset",className:`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${Se}`})})})]}):jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsx("div",{className:"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto",children:(()=>{let C=u(t),f=defaultStyles[C];return jsx(ct,{extension:C,...f||{}})})()})}),jsx(TooltipPortal,{children:jsx(TooltipContent,{children:jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Preview not available"})})})]})})})}function Me(){let{scope:m}=useAppContext(),{currentProjectSchema:t}=useConfig(),[i,u,h]=useEntityMutation(),[R,C]=useState(""),[f,O]=useState(false),[q,x]=useState(false),[F,y]=useState(null),[ee,T]=useState(false),[S,I]=useState(null),[b,g]=useState(""),[D,N]=useState(false),[L,z]=useState(false),A="_tag",v="_tags",p=useMemo(()=>({where:{},options:{limit:200,offset:0,sort:[{name:"ASC"}]}}),[]),{data:_,isLoading:j}=useEntityQuery({entityNamePlural:v,schema:t,scope:m,variables:p}),G=(Array.isArray(_)?_:[]).map(o=>{let r=o;return {_id:r._id,name:r.name}}),U=useCallback(async()=>{let o=R.trim();if(!o)return;N(true);let r=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}`,M=getEntityCreateMutation(v,t,{name:{value:o,disabled:false,scope:"default"}},r),$=getEntityQuery(v,m,t),te=gql`
2
- ${$.query}
1
+ import'./index.css';import {FileStack,TagIcon,PlusIcon,Loader2,Ellipsis,LoaderCircle,Search,X,ImagePlayIcon,ImageIcon,FilePlayIcon,LayersIcon,SplinePointerIcon,ListChecks,MinusIcon,Trash2Icon}from'lucide-react';import {IMAGES_BASE_URL,useLocation,useAppContext,useGraphQLError,useConfig,useGridColumnsDefinition,assetSchema,useEntityQuery,ProjectDisabled,SchemaError,DataTable,Outlet,useEntityMutation,getEntityCreateMutation,getEntityQuery,gql,getEntityDeleteMutation,getEntityUpdateMutation,useParams,useUploadAssets,useDispatch,useSearch,DataTableFacetedFilter}from'@flexkit/studio';import {TooltipProvider,Tooltip,TooltipTrigger,TooltipPortal,TooltipContent,ResizablePanelGroup,ResizablePanel,ResizableHandle,Dialog,DialogTrigger,Button,DialogContent,DialogHeader,DialogTitle,DialogDescription,Input,DialogFooter,ScrollArea,DropdownMenu,DropdownMenuTrigger,DropdownMenuContent,DropdownMenuItem,DropdownMenuSeparator,Skeleton,CommandDialog,CommandInput,CommandList,CommandEmpty,CommandGroup,CommandItem,CommandSeparator}from'@flexkit/studio/ui';import {defaultStyles,FileIcon}from'react-file-icon';import {jsx,jsxs}from'react/jsx-runtime';import {useState,useMemo,useRef,useCallback,useEffect}from'react';import {find,propEq}from'ramda';var ct=FileIcon,Se="fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]";function Pe({value:m}){if(!m)return null;let t=m,i=/\.(png|jpe?g|gif|webp|avif|svg)$/i.test(t),u=T=>{let[f]=T.split("?"),F=f.split(".");return F.length>1?F.pop().toLowerCase():"file"},h=t.endsWith(".svg")?`${IMAGES_BASE_URL}${t}`:`${IMAGES_BASE_URL}${t}?w=84&h=84&f=webp`,R=t.endsWith(".svg")?`${IMAGES_BASE_URL}${t}`:`${IMAGES_BASE_URL}${t}?w=624&h=624&f=webp`;return jsx("div",{className:"fk:z-10",children:jsx(TooltipProvider,{children:i?jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsx("img",{src:h,alt:"asset",className:`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${Se}`})}),jsx(TooltipPortal,{children:jsx(TooltipContent,{children:jsx("img",{src:R,alt:"asset",className:`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${Se}`})})})]}):jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsx("div",{className:"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto",children:(()=>{let T=u(t),f=defaultStyles[T];return jsx(ct,{extension:T,...f||{}})})()})}),jsx(TooltipPortal,{children:jsx(TooltipContent,{children:jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Preview not available"})})})]})})})}function Me(){let{scope:m}=useAppContext(),{currentProjectSchema:t}=useConfig(),[i,u,h]=useEntityMutation(),[R,T]=useState(""),[f,F]=useState(false),[W,x]=useState(false),[O,y]=useState(null),[ee,C]=useState(false),[S,I]=useState(null),[b,g]=useState(""),[D,N]=useState(false),[q,z]=useState(false),A="_tag",v="_tags",p=useMemo(()=>({where:{},limit:200,offset:0,sort:[{name:"ASC"}]}),[]),{data:P,isLoading:j}=useEntityQuery({entityNamePlural:v,schema:t,scope:m,variables:p}),J=(Array.isArray(P)?P:[]).map(o=>{let r=o;return {_id:r._id,name:r.name}}),U=useCallback(async()=>{let o=R.trim();if(!o)return;N(true);let r=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}`,M=getEntityCreateMutation(v,t,{name:{value:o,disabled:false,scope:"default"}},r),L=getEntityQuery(v,m,t),te=gql`
2
+ ${L.query}
3
3
  `;await new Promise(ne=>{u(gql`
4
4
  ${M}
5
- `),h({refetchQueries:[te],onCompleted:()=>{C(""),O(false),ne();}}),i(true);}),N(false);},[v,i,t,m,u,h,R]),V=useCallback(async o=>{z(true);let r=getEntityDeleteMutation(A,t,o),J=getEntityQuery(v,m,t),M=gql`
6
- ${J.query}
7
- `;await new Promise($=>{u(gql`
5
+ `),h({refetchQueries:[te],onCompleted:()=>{T(""),F(false),ne();}}),i(true);}),N(false);},[v,i,t,m,u,h,R]),V=useCallback(async o=>{z(true);let r=getEntityDeleteMutation(A,t,o),Q=getEntityQuery(v,m,t),M=gql`
6
+ ${Q.query}
7
+ `;await new Promise(L=>{u(gql`
8
8
  ${r}
9
- `),h({variables:{where:{_id:o}},refetchQueries:[M],onCompleted:()=>{$();}}),i(true);}),z(false);},[A,v,i,t,m,u,h]),K=useCallback(async()=>{let o=b.trim();if(!o||!S)return;N(true);let r={name:{value:o,disabled:false,scope:"default"}},J={},M=getEntityUpdateMutation(v,S._id,m,t,J,r),$=getEntityQuery(v,m,t),te=gql`
10
- ${$.query}
9
+ `),h({variables:{where:{_id:{eq:o}}},refetchQueries:[M],onCompleted:()=>{L();}}),i(true);}),z(false);},[A,v,i,t,m,u,h]),K=useCallback(async()=>{let o=b.trim();if(!o||!S)return;N(true);let r={name:{value:o,disabled:false,scope:"default"}},Q={},M=getEntityUpdateMutation(v,S._id,m,t,Q,r),L=getEntityQuery(v,m,t),te=gql`
10
+ ${L.query}
11
11
  `;await new Promise(ne=>{u(gql`
12
12
  ${M}
13
- `),h({variables:{where:{_id:S._id}},refetchQueries:[te],onCompleted:()=>{T(false),I(null),g(""),ne();}}),i(true);}),N(false);},[b,v,i,t,m,u,h,S]);return jsxs("div",{className:"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6",children:[jsx(TagIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight",children:"Tags"}),jsx(TooltipProvider,{children:jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsxs(Dialog,{open:f,onOpenChange:O,children:[jsx(DialogTrigger,{asChild:true,children:jsxs(Button,{variant:"secondary",size:"icon",className:"fk:ml-auto fk:h-8 fk:w-8",children:[jsx(PlusIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Add tag"})]})}),jsxs(DialogContent,{children:[jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:"New tag"}),jsx(DialogDescription,{className:"fk:sr-only",children:"Create a new tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(Input,{autoFocus:true,value:R,placeholder:"New tag name",onChange:o=>C(o.target.value),onKeyDown:o=>{o.key==="Enter"&&U();}})}),jsx(DialogFooter,{children:jsxs(Button,{disabled:D,onClick:U,variant:"default",children:[D?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Add"]})})]})]})}),jsx(TooltipContent,{children:jsx("p",{children:"Add tag"})})]})})]}),jsx(ScrollArea,{className:"fk:h-full",children:jsx("div",{className:"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2",children:j?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Loading..."}):G.length===0?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"No tags yet"}):G.map(o=>jsxs("div",{className:"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1",children:[jsx("span",{className:"fk:text-sm",children:o.name}),jsxs(DropdownMenu,{children:[jsx(DropdownMenuTrigger,{asChild:true,children:jsx(Button,{"aria-label":`Actions for ${o.name}`,title:`Actions for ${o.name}`,variant:"ghost",size:"icon",className:"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground",children:jsx(Ellipsis,{className:"fk:h-4 fk:w-4"})})}),jsxs(DropdownMenuContent,{align:"end",className:"w-[160px]",children:[jsx(DropdownMenuItem,{onClick:()=>{I(o),g(o.name),T(true);},children:"Edit"}),jsx(DropdownMenuSeparator,{}),jsx(DropdownMenuItem,{className:"fk:text-destructive",onClick:()=>{y(o),x(true);},children:"Remove"})]})]})]},o._id))})}),jsx(Dialog,{open:ee,onOpenChange:T,children:jsxs(DialogContent,{children:[jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:"Edit tag"}),jsx(DialogDescription,{className:"fk:sr-only",children:"Rename an existing tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(Input,{autoFocus:true,value:b,placeholder:"Tag name",onChange:o=>g(o.target.value),onKeyDown:o=>{o.key==="Enter"&&K();}})}),jsxs(DialogFooter,{children:[jsx(Button,{disabled:D,variant:"secondary",onClick:()=>{T(false),I(null);},children:"Cancel"}),jsxs(Button,{disabled:D,onClick:K,variant:"default",children:[D?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Save"]})]})]})}),jsx(Dialog,{open:q,onOpenChange:x,children:jsxs(DialogContent,{children:[jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:"Delete tag"}),jsx(DialogDescription,{className:"fk:sr-only",children:"Confirm deletion of a tag"})]}),jsxs("div",{className:"fk:text-sm fk:text-muted-foreground",children:["Are you sure you want to delete the tag"," ",jsx("span",{className:"fk:font-semibold fk:text-foreground",children:F?.name}),"?"]}),jsxs(DialogFooter,{children:[jsx(Button,{disabled:L,variant:"secondary",onClick:()=>{x(false),y(null);},children:"Cancel"}),jsxs(Button,{disabled:L,variant:"destructive",onClick:()=>{F&&(async()=>(await V(F._id),x(false),y(null)))();},children:[L?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Delete"]})]})]})})]})}var Vt=[{value:"image/gif",label:"GIF",icon:ImagePlayIcon},{value:"image/jpeg",label:"JPEG",icon:ImageIcon},{value:"video/mp4",label:"MP4",icon:FilePlayIcon},{value:"image/png",label:"PNG",icon:LayersIcon},{value:"image/svg+xml",label:"SVG",icon:SplinePointerIcon},{value:"image/webp",label:"WebP",icon:ImageIcon}];function Xe({entityName:m,table:t,onSearchWhereChange:i}){let u=t.getState().columnFilters.length>0,{projectId:h}=useParams(),R=useUploadAssets(),C=useDispatch(),{scope:f}=useAppContext(),[O,q]=useState(false),[x,F]=useState(false),[y,ee]=useState([]),[T,S]=useState([]),[I,b,g]=useEntityMutation(),{currentProjectSchema:D}=useConfig(),[N,L]=useState(""),z=useRef({}),A=useRef({});function v(){return {searchRequests:{searches:[{collection:"_assets"},{collection:"_tags"}]},commonParams:{q:""}}}let p=useMemo(()=>v(),[]),[_,j]=useState(p),{results:G,isLoading:U}=useSearch(h??"",_),V=useRef(""),K=useCallback(Kt(e=>{j({...p,commonParams:{q:e}});},300),[p]);async function o(){await R({projectId:h,accept:"image/*",multiple:true,maxBytes:4*1024*1024});}let r=t.getSelectedRowModel().rows.map(e=>e.original._id),{data:J}=useEntityQuery({entityNamePlural:"_tags",schema:D,scope:f,variables:{where:{},options:{limit:500,offset:0,sort:[{name:"ASC"}]}}}),M=Array.isArray(J)?J.map(e=>({_id:e._id,name:e.name})):[],{data:$}=useEntityQuery({entityNamePlural:"_assets",schema:D,scope:f,variables:{where:{},options:{limit:500,offset:0,sort:[{_updatedAt:"DESC"}]}}});function te(e){if(e==="image/gif")return "GIF";if(e==="image/jpeg")return "JPEG";if(e==="video/mp4")return "MP4";if(e==="image/png")return "PNG";if(e==="image/svg+xml")return "SVG";if(e==="image/webp")return "WebP";let s=e.split("/");return s.length===2&&s[1]?s[1].toUpperCase():e}function ne(e){return e==="image/svg+xml"?SplinePointerIcon:e.startsWith("image/")?ImageIcon:e.startsWith("video/")?FilePlayIcon:LayersIcon}let Ce=useMemo(()=>{let e=Array.isArray($)?$:[],s=new Set;for(let k of e){let P=k.mimeType??"";P&&s.add(P);}return Array.from(s.values()).sort().map(k=>({value:k,label:te(k),icon:ne(k)}))},[$]),et=Ce.length>0?Ce:Vt,tt=useMemo(()=>M.map(e=>({value:e._id,label:e.name})),[M]);function Te(){if(!i)return;let e=[];Object.keys(z.current).length>0&&e.push(z.current),Object.keys(A.current).length>0&&e.push(A.current);let s=e.length===0?{}:e.length===1?e[0]:{AND:e},l=JSON.stringify(s);V.current!==l&&(V.current=l,i(s));}async function nt(){C({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${r.length} asset${r.length>1?"s":""}`,dialogMessage:r.length>1?"Are you sure you want to delete the selected assets? They will be deleted permanently.":"Are you sure you want to delete the selected asset? The item will be deleted permanently.",dialogCancelTitle:"Cancel",dialogActionLabel:"Delete",isDestructive:true,dialogActionCancel:()=>{},dialogActionSubmit:()=>{for(let e of r)C({type:"DeleteEntity",payload:{entityId:e,entityName:m,silent:true}});t.resetRowSelection();}}}});}let at=useCallback(async()=>{if(r.length===0||y.length===0)return;let e={tags:{relationships:{connect:y.map(l=>({_id:l}))},disabled:false,scope:f}},s=getEntityUpdateMutation("_assets",r[0]??"",f,D,{},e);await new Promise(l=>{b(gql`
14
- ${s}
15
- `),g({variables:{where:{_id_IN:r}},onCompleted:()=>l()}),I(true);}),q(false),ee([]),t.resetRowSelection();},[I,f,r,y,b,g,t]),st=useCallback(async()=>{if(r.length===0||T.length===0)return;let e={tags:{relationships:{disconnect:T},disabled:false,scope:f}},s=getEntityUpdateMutation("_assets",r[0]??"",f,D,{},e);await new Promise(l=>{b(gql`
16
- ${s}
17
- `),g({variables:{where:{_id_IN:r}},onCompleted:()=>l()}),I(true);}),F(false),S([]),t.resetRowSelection();},[I,f,r,T,b,g,t]);useEffect(()=>{if(!i)return;let e=G??[],s=N.trim(),l={};if(s.length===0)l={};else if(e.length===0)l={_id_IN:[]};else {let k=e.filter(B=>B._entityNamePlural==="_assets").map(B=>({_id:B._id})),P=e.filter(B=>B._entityNamePlural==="_tags").map(B=>({tagsConnection_SOME:{node:{_id:B._id}}})),E=[...k,...P];l=E.length>0?{OR:E}:{_id_IN:[]};}z.current=l,Te();},[i,G,N]);let ot=JSON.stringify(t.getState().columnFilters);return useEffect(()=>{if(!i)return;let e=t.getState().columnFilters.find(E=>E.id==="mimeType"),s=Array.isArray(e?.value)?e?.value:[],l=t.getState().columnFilters.find(E=>E.id==="tags"),k=Array.isArray(l?.value)?l?.value:[],P=[];if(s.length>0&&P.push({mimeType_IN:s}),k.length>0){let E=k.map(B=>({tagsConnection_SOME:{node:{_id:B}}}));P.push(E.length===1?E[0]:{OR:E});}P.length===0?A.current={}:P.length===1?A.current=P[0]:A.current={AND:P},Te();},[ot,i,t]),jsxs("div",{className:"fk:flex fk:items-center fk:justify-between",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[jsxs("div",{className:"fk:relative",children:[U?jsx(LoaderCircle,{className:"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin"}):jsx(Search,{className:"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50"}),jsx(Input,{placeholder:"Search assets...",name:"search-assets",value:N,onChange:e=>{let{value:s}=e.target;if(L(s),s.trim().length===0){j({...p,commonParams:{q:""}}),i&&i({});return}K(s);},className:"fk:h-8 fk:w-[150px] fk:lg:w-[250px] fk:pl-8"}),N?jsx("button",{"aria-label":"Clear search",className:"fk:absolute fk:right-2 fk:top-2 fk:text-muted-foreground fk:hover:text-foreground",onClick:()=>{L(""),j({...p,commonParams:{q:""}}),i&&i({});},type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})}):null]}),t.getColumn("mimeType")&&jsx(DataTableFacetedFilter,{column:t.getColumn("mimeType"),title:"File type",options:et}),t.getColumn("tags")&&jsx(DataTableFacetedFilter,{column:t.getColumn("tags"),title:"Tags",options:tt}),u&&jsxs(Button,{variant:"ghost",onClick:()=>{t.resetColumnFilters(),i&&i({});},className:"fk:h-8 fk:px-2 fk:lg:px-3",children:["Reset",jsx(X,{className:"fk:ml-2 fk:h-4 fk:w-4"})]})]}),r.length>0?jsx("div",{className:"fk:flex fk:items-center fk:gap-2",children:jsxs(DropdownMenu,{children:[jsx(DropdownMenuTrigger,{asChild:true,children:jsxs(Button,{className:"fk:h-8 fk:mr-2 fk:lg:flex",size:"sm",variant:"secondary",children:["Actions ",jsx(ListChecks,{className:"fk:ml-2 fk:h-4 fk:w-4"})]})}),jsxs(DropdownMenuContent,{align:"end",className:"fk:w-[240px]",children:[jsxs(DropdownMenuItem,{onClick:()=>q(true),children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Add tag"]}),jsxs(DropdownMenuItem,{onClick:()=>F(true),children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Remove tag"]}),jsx(DropdownMenuSeparator,{}),jsxs(DropdownMenuItem,{onClick:nt,className:"fk:text-destructive",children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Delete asset",r.length>1?"s":""," (",r.length,")"]})]})]})}):null,jsx(Button,{className:"fk:ml-auto fk:h-8 fk:lg:flex",onClick:o,size:"sm",variant:"default",children:"Upload assets"}),jsxs(CommandDialog,{open:O,onOpenChange:q,children:[jsx(CommandInput,{placeholder:"Search tags..."}),jsxs(CommandList,{className:"fk:h-[300px]",children:[jsx(CommandEmpty,{children:"No tags found."}),jsx(CommandGroup,{heading:"Tags",children:M.map(e=>{let s=y.includes(e._id);return jsxs(CommandItem,{onSelect:()=>{ee(l=>s?l.filter(k=>k!==e._id):[...l,e._id]);},children:[jsx("input",{className:"fk:mr-2",checked:s,onChange:()=>{},type:"checkbox"}),e.name]},e._id)})})]}),jsx(CommandSeparator,{}),jsx("div",{className:"fk:p-2",children:jsx(Button,{className:"fk:w-full",onClick:at,disabled:y.length===0,children:"Add tag(s) to selected assets"})})]}),jsxs(CommandDialog,{open:x,onOpenChange:F,children:[jsx(CommandInput,{placeholder:"Search tags..."}),jsxs(CommandList,{className:"fk:h-[300px]",children:[jsx(CommandEmpty,{children:"No tags found."}),jsx(CommandGroup,{heading:"Tags",children:M.map(e=>{let s=T.includes(e._id);return jsxs(CommandItem,{onSelect:()=>{S(l=>s?l.filter(k=>k!==e._id):[...l,e._id]);},children:[jsx("input",{className:"fk:mr-2",checked:s,onChange:()=>{},type:"checkbox"}),e.name]},e._id)})})]}),jsx(CommandSeparator,{}),jsx("div",{className:"fk:p-2",children:jsx(Button,{className:"fk:w-full",onClick:st,disabled:T.length===0,children:"Remove tag(s) from selected assets"})})]})]})}function Kt(m,t=300){let i;return function(...u){clearTimeout(i),i=setTimeout(()=>m.apply(this,u),t);}}var oe=25;function Ve(){let m="_assets",{search:t}=useLocation(),u=new URLSearchParams(t).get("id"),{scope:h}=useAppContext(),{schemaErrorMessage:R}=useGraphQLError(),{projects:C,currentProjectId:f}=useConfig(),{schema:O}=find(propEq(f??"","projectId"))(C),q=useGridColumnsDefinition({attributesSchema:assetSchema.attributes,checkboxSelect:"multiple"}),[x,F]=useState({}),y=u?{_id:u}:{NOT:{path:null}},T={where:useMemo(()=>!x||Object.keys(x).length===0||u?y:{AND:[y,x]},[u,x]),options:{offset:0,limit:oe,sort:[{_updatedAt:"DESC"}]}},{isLoading:S,fetchMore:I,count:b,data:g,isProjectDisabled:D}=useEntityQuery({entityNamePlural:m,schema:O,scope:h,variables:T}),N=useRef(null),L=S&&(g==null||g.length===0),z=useCallback(p=>{let _=g?.length??0;if(!S&&p&&b>0&&_>0){let{scrollHeight:j,scrollTop:G,clientHeight:U}=p,V=j-G-U,K=Math.min(500,Math.floor(U*.75));if(V<K&&_<b){if(N.current===_)return;N.current=_,I({variables:{options:{offset:g?.length??0,limit:oe}}});}}},[b,g?.length,I,S]),A=Array(oe).fill({}),v=kn(q);return D?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:jsx(ProjectDisabled,{})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:[jsx(SchemaError,{}),jsx("h2",{className:"fk:mb-4 fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:"Asset Manager"}),R?null:jsx(DataTable,{classNames:{row:"fk:h-20"},columns:L?v:q,data:L?A:g??[],entityName:assetSchema.name,pageSize:oe,onScroll:p=>{z(p.currentTarget);},toolbarComponent:p=>jsx(Xe,{entityName:assetSchema.name,table:p,onSearchWhereChange:_=>F(_)})}),jsx(Outlet,{})]})}function kn(m){return m.map(t=>({...t,cell:()=>jsx(Skeleton,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function Ye(){return jsxs(ResizablePanelGroup,{orientation:"horizontal",className:"fk:h-full",children:[jsx(ResizablePanel,{className:"fk:p-3",defaultSize:"82%",children:jsx("div",{className:"fk:flex fk:flex-col fk:h-full",children:jsx(Ve,{})})}),jsx(ResizableHandle,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(ResizablePanel,{defaultSize:"18%",minSize:"10%",children:jsx("div",{className:"fk:sm:hidden fk:md:block",children:jsx(Me,{})})})]})}function aa(){return {name:"flexkit.asset-manager",contributes:{apps:[{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:jsx(Ye,{}),routes:[]}],previewFields:{assetPreviewField:{component:_e,description:"Asset preview field for the asset manager"}}}}}export{aa as AssetManager};//# sourceMappingURL=index.js.map
13
+ `),h({variables:{where:{_id:{eq:S._id}}},refetchQueries:[te],onCompleted:()=>{C(false),I(null),g(""),ne();}}),i(true);}),N(false);},[b,v,i,t,m,u,h,S]);return jsxs("div",{className:"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6",children:[jsx(TagIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight",children:"Tags"}),jsx(TooltipProvider,{children:jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsxs(Dialog,{open:f,onOpenChange:F,children:[jsx(DialogTrigger,{asChild:true,children:jsxs(Button,{variant:"secondary",size:"icon",className:"fk:ml-auto fk:h-8 fk:w-8",children:[jsx(PlusIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Add tag"})]})}),jsxs(DialogContent,{children:[jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:"New tag"}),jsx(DialogDescription,{className:"fk:sr-only",children:"Create a new tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(Input,{autoFocus:true,value:R,placeholder:"New tag name",onChange:o=>T(o.target.value),onKeyDown:o=>{o.key==="Enter"&&U();}})}),jsx(DialogFooter,{children:jsxs(Button,{disabled:D,onClick:U,variant:"default",children:[D?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Add"]})})]})]})}),jsx(TooltipContent,{children:jsx("p",{children:"Add tag"})})]})})]}),jsx(ScrollArea,{className:"fk:h-full",children:jsx("div",{className:"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2",children:j?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Loading..."}):J.length===0?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"No tags yet"}):J.map(o=>jsxs("div",{className:"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1",children:[jsx("span",{className:"fk:text-sm",children:o.name}),jsxs(DropdownMenu,{children:[jsx(DropdownMenuTrigger,{asChild:true,children:jsx(Button,{"aria-label":`Actions for ${o.name}`,title:`Actions for ${o.name}`,variant:"ghost",size:"icon",className:"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground",children:jsx(Ellipsis,{className:"fk:h-4 fk:w-4"})})}),jsxs(DropdownMenuContent,{align:"end",className:"w-[160px]",children:[jsx(DropdownMenuItem,{onClick:()=>{I(o),g(o.name),C(true);},children:"Edit"}),jsx(DropdownMenuSeparator,{}),jsx(DropdownMenuItem,{className:"fk:text-destructive",onClick:()=>{y(o),x(true);},children:"Remove"})]})]})]},o._id))})}),jsx(Dialog,{open:ee,onOpenChange:C,children:jsxs(DialogContent,{children:[jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:"Edit tag"}),jsx(DialogDescription,{className:"fk:sr-only",children:"Rename an existing tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(Input,{autoFocus:true,value:b,placeholder:"Tag name",onChange:o=>g(o.target.value),onKeyDown:o=>{o.key==="Enter"&&K();}})}),jsxs(DialogFooter,{children:[jsx(Button,{disabled:D,variant:"secondary",onClick:()=>{C(false),I(null);},children:"Cancel"}),jsxs(Button,{disabled:D,onClick:K,variant:"default",children:[D?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Save"]})]})]})}),jsx(Dialog,{open:W,onOpenChange:x,children:jsxs(DialogContent,{children:[jsxs(DialogHeader,{children:[jsx(DialogTitle,{children:"Delete tag"}),jsx(DialogDescription,{className:"fk:sr-only",children:"Confirm deletion of a tag"})]}),jsxs("div",{className:"fk:text-sm fk:text-muted-foreground",children:["Are you sure you want to delete the tag"," ",jsx("span",{className:"fk:font-semibold fk:text-foreground",children:O?.name}),"?"]}),jsxs(DialogFooter,{children:[jsx(Button,{disabled:q,variant:"secondary",onClick:()=>{x(false),y(null);},children:"Cancel"}),jsxs(Button,{disabled:q,variant:"destructive",onClick:()=>{O&&(async()=>(await V(O._id),x(false),y(null)))();},children:[q?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Delete"]})]})]})})]})}var Vt=[{value:"image/gif",label:"GIF",icon:ImagePlayIcon},{value:"image/jpeg",label:"JPEG",icon:ImageIcon},{value:"video/mp4",label:"MP4",icon:FilePlayIcon},{value:"image/png",label:"PNG",icon:LayersIcon},{value:"image/svg+xml",label:"SVG",icon:SplinePointerIcon},{value:"image/webp",label:"WebP",icon:ImageIcon}];function He({entityName:m,table:t,onSearchWhereChange:i}){let u=t.getState().columnFilters.length>0,{projectId:h}=useParams(),R=useUploadAssets(),T=useDispatch(),{scope:f}=useAppContext(),[F,W]=useState(false),[x,O]=useState(false),[y,ee]=useState([]),[C,S]=useState([]),[I,b,g]=useEntityMutation(),{currentProjectSchema:D}=useConfig(),[N,q]=useState(""),z=useRef({}),A=useRef({});function v(){return {searchRequests:{searches:[{collection:"_assets"},{collection:"_tags"}]},commonParams:{q:""}}}let p=useMemo(()=>v(),[]),[P,j]=useState(p),{results:J,isLoading:U}=useSearch(h??"",P),V=useRef(""),K=useCallback(Kt(e=>{j({...p,commonParams:{q:e}});},300),[p]);async function o(){await R({projectId:h,accept:"image/*",multiple:true,maxBytes:4*1024*1024});}let r=t.getSelectedRowModel().rows.map(e=>e.original._id),{data:Q}=useEntityQuery({entityNamePlural:"_tags",schema:D,scope:f,variables:{where:{},limit:500,offset:0,sort:[{name:"ASC"}]}}),M=useMemo(()=>(Array.isArray(Q)?Q:[]).map(a=>({_id:a._id,name:a.name})),[Q]),{data:L}=useEntityQuery({entityNamePlural:"_assets",schema:D,scope:f,variables:{where:{},limit:500,offset:0,sort:[{_updatedAt:"DESC"}]}});function te(e){if(e==="image/gif")return "GIF";if(e==="image/jpeg")return "JPEG";if(e==="video/mp4")return "MP4";if(e==="image/png")return "PNG";if(e==="image/svg+xml")return "SVG";if(e==="image/webp")return "WebP";let a=e.split("/");return a.length===2&&a[1]?a[1].toUpperCase():e}function ne(e){return e==="image/svg+xml"?SplinePointerIcon:e.startsWith("image/")?ImageIcon:e.startsWith("video/")?FilePlayIcon:LayersIcon}let Te=useMemo(()=>{let e=Array.isArray(L)?L:[],a=new Set;for(let k of e){let _=k.mimeType??"";_&&a.add(_);}return Array.from(a.values()).sort().map(k=>({value:k,label:te(k),icon:ne(k)}))},[L]),et=Te.length>0?Te:Vt,tt=useMemo(()=>M.map(e=>({value:e._id,label:e.name})),[M]);function Ce(){if(!i)return;let e=[];Object.keys(z.current).length>0&&e.push(z.current),Object.keys(A.current).length>0&&e.push(A.current);let a=e.length===0?{}:e.length===1?e[0]:{AND:e},l=JSON.stringify(a);V.current!==l&&(V.current=l,i(a));}async function nt(){T({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${r.length} asset${r.length>1?"s":""}`,dialogMessage:r.length>1?"Are you sure you want to delete the selected assets? They will be deleted permanently.":"Are you sure you want to delete the selected asset? The item will be deleted permanently.",dialogCancelTitle:"Cancel",dialogActionLabel:"Delete",isDestructive:true,dialogActionCancel:()=>{},dialogActionSubmit:()=>{for(let e of r)T({type:"DeleteEntity",payload:{entityId:e,entityName:m,silent:true}});t.resetRowSelection();}}}});}let at=useCallback(async()=>{if(r.length===0||y.length===0)return;let e={tags:{relationships:{connect:y.map(l=>({_id:l}))},disabled:false,scope:f}},a=getEntityUpdateMutation("_assets",r[0]??"",f,D,{},e);await new Promise(l=>{b(gql`
14
+ ${a}
15
+ `),g({variables:{where:{_id:{in:r}}},onCompleted:()=>l()}),I(true);}),W(false),ee([]),t.resetRowSelection();},[I,f,r,y,b,g,t]),st=useCallback(async()=>{if(r.length===0||C.length===0)return;let e={tags:{relationships:{disconnect:C},disabled:false,scope:f}},a=getEntityUpdateMutation("_assets",r[0]??"",f,D,{},e);await new Promise(l=>{b(gql`
16
+ ${a}
17
+ `),g({variables:{where:{_id:{in:r}}},onCompleted:()=>l()}),I(true);}),O(false),S([]),t.resetRowSelection();},[I,f,r,C,b,g,t]);useEffect(()=>{if(!i)return;let e=J??[],a=N.trim(),l={};if(a.length===0)l={};else if(e.length===0)l={_id:{in:[]}};else {let k=e.filter($=>$._entityNamePlural==="_assets").map($=>({_id:{eq:$._id}})),_=e.filter($=>$._entityNamePlural==="_tags").map($=>({tags:{some:{_id:{eq:$._id}}}})),E=[...k,..._];l=E.length>0?{OR:E}:{_id:{in:[]}};}z.current=l,Ce();},[i,J,N]);let ot=JSON.stringify(t.getState().columnFilters);return useEffect(()=>{if(!i)return;let e=t.getState().columnFilters.find(E=>E.id==="mimeType"),a=Array.isArray(e?.value)?e?.value:[],l=t.getState().columnFilters.find(E=>E.id==="tags"),k=Array.isArray(l?.value)?l?.value:[],_=[];if(a.length>0&&_.push({mimeType:{in:a}}),k.length>0){let E=k.map($=>({tags:{some:{_id:{eq:$}}}}));_.push(E.length===1?E[0]:{OR:E});}_.length===0?A.current={}:_.length===1?A.current=_[0]:A.current={AND:_},Ce();},[ot,i,t]),jsxs("div",{className:"fk:flex fk:items-center fk:justify-between",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[jsxs("div",{className:"fk:relative",children:[U?jsx(LoaderCircle,{className:"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin"}):jsx(Search,{className:"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50"}),jsx(Input,{placeholder:"Search assets...",name:"search-assets",value:N,onChange:e=>{let{value:a}=e.target;if(q(a),a.trim().length===0){j({...p,commonParams:{q:""}}),i&&i({});return}K(a);},className:"fk:h-8 fk:w-[150px] fk:lg:w-[250px] fk:pl-8"}),N?jsx("button",{"aria-label":"Clear search",className:"fk:absolute fk:right-2 fk:top-2 fk:text-muted-foreground fk:hover:text-foreground",onClick:()=>{q(""),j({...p,commonParams:{q:""}}),i&&i({});},type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})}):null]}),t.getColumn("mimeType")&&jsx(DataTableFacetedFilter,{column:t.getColumn("mimeType"),title:"File type",options:et}),t.getColumn("tags")&&jsx(DataTableFacetedFilter,{column:t.getColumn("tags"),title:"Tags",options:tt}),u&&jsxs(Button,{variant:"ghost",onClick:()=>{t.resetColumnFilters(),i&&i({});},className:"fk:h-8 fk:px-2 fk:lg:px-3",children:["Reset",jsx(X,{className:"fk:ml-2 fk:h-4 fk:w-4"})]})]}),r.length>0?jsx("div",{className:"fk:flex fk:items-center fk:gap-2",children:jsxs(DropdownMenu,{children:[jsx(DropdownMenuTrigger,{asChild:true,children:jsxs(Button,{className:"fk:h-8 fk:mr-2 fk:lg:flex",size:"sm",variant:"secondary",children:["Actions ",jsx(ListChecks,{className:"fk:ml-2 fk:h-4 fk:w-4"})]})}),jsxs(DropdownMenuContent,{align:"end",className:"fk:w-[240px]",children:[jsxs(DropdownMenuItem,{onClick:()=>W(true),children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Add tag"]}),jsxs(DropdownMenuItem,{onClick:()=>O(true),children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Remove tag"]}),jsx(DropdownMenuSeparator,{}),jsxs(DropdownMenuItem,{onClick:nt,className:"fk:text-destructive",children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Delete asset",r.length>1?"s":""," (",r.length,")"]})]})]})}):null,jsx(Button,{className:"fk:ml-auto fk:h-8 fk:lg:flex",onClick:o,size:"sm",variant:"default",children:"Upload assets"}),jsxs(CommandDialog,{open:F,onOpenChange:W,children:[jsx(CommandInput,{placeholder:"Search tags..."}),jsxs(CommandList,{className:"fk:h-[300px]",children:[jsx(CommandEmpty,{children:"No tags found."}),jsx(CommandGroup,{heading:"Tags",children:M.map(e=>{let a=y.includes(e._id);return jsxs(CommandItem,{onSelect:()=>{ee(l=>a?l.filter(k=>k!==e._id):[...l,e._id]);},children:[jsx("input",{className:"fk:mr-2",checked:a,onChange:()=>{},type:"checkbox"}),e.name]},e._id)})})]}),jsx(CommandSeparator,{}),jsx("div",{className:"fk:p-2",children:jsx(Button,{className:"fk:w-full",onClick:at,disabled:y.length===0,children:"Add tag(s) to selected assets"})})]}),jsxs(CommandDialog,{open:x,onOpenChange:O,children:[jsx(CommandInput,{placeholder:"Search tags..."}),jsxs(CommandList,{className:"fk:h-[300px]",children:[jsx(CommandEmpty,{children:"No tags found."}),jsx(CommandGroup,{heading:"Tags",children:M.map(e=>{let a=C.includes(e._id);return jsxs(CommandItem,{onSelect:()=>{S(l=>a?l.filter(k=>k!==e._id):[...l,e._id]);},children:[jsx("input",{className:"fk:mr-2",checked:a,onChange:()=>{},type:"checkbox"}),e.name]},e._id)})})]}),jsx(CommandSeparator,{}),jsx("div",{className:"fk:p-2",children:jsx(Button,{className:"fk:w-full",onClick:st,disabled:C.length===0,children:"Remove tag(s) from selected assets"})})]})]})}function Kt(m,t=300){let i;return function(...u){clearTimeout(i),i=setTimeout(()=>m.apply(this,u),t);}}var ie=25;function Ve(){let m="_assets",{search:t}=useLocation(),u=new URLSearchParams(t).get("id"),{scope:h}=useAppContext(),{schemaErrorMessage:R}=useGraphQLError(),{projects:T,currentProjectId:f}=useConfig(),{schema:F}=find(propEq(f??"","projectId"))(T),W=useGridColumnsDefinition({attributesSchema:assetSchema.attributes,checkboxSelect:"multiple"}),[x,O]=useState({}),y=u?{_id:{eq:u}}:{NOT:{path:{eq:null}}},C={where:useMemo(()=>!x||Object.keys(x).length===0||u?y:{AND:[y,x]},[u,x]),offset:0,limit:ie,sort:[{_updatedAt:"DESC"}]},{isLoading:S,fetchMore:I,count:b,data:g,isProjectDisabled:D}=useEntityQuery({entityNamePlural:m,schema:F,scope:h,variables:C}),N=useRef(null),q=S&&(g==null||g.length===0),z=useCallback(p=>{let P=g?.length??0;if(!S&&p&&b>0&&P>0){let{scrollHeight:j,scrollTop:J,clientHeight:U}=p,V=j-J-U,K=Math.min(500,Math.floor(U*.75));if(V<K&&P<b){if(N.current===P)return;N.current=P,I({variables:{offset:g?.length??0,limit:ie}});}}},[b,g?.length,I,S]),A=Array(ie).fill({}),v=kn(W);return D?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:jsx(ProjectDisabled,{})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:[jsx(SchemaError,{}),jsx("h2",{className:"fk:mb-4 fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:"Asset Manager"}),R?null:jsx(DataTable,{classNames:{row:"fk:h-20"},columns:q?v:W,data:q?A:g??[],entityName:assetSchema.name,pageSize:ie,onScroll:p=>{z(p.currentTarget);},toolbarComponent:p=>jsx(He,{entityName:assetSchema.name,table:p,onSearchWhereChange:P=>O(P)})}),jsx(Outlet,{})]})}function kn(m){return m.map(t=>({...t,cell:()=>jsx(Skeleton,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function Ye(){return jsxs(ResizablePanelGroup,{orientation:"horizontal",className:"fk:h-full",children:[jsx(ResizablePanel,{className:"fk:p-3",defaultSize:"82%",children:jsx("div",{className:"fk:flex fk:flex-col fk:h-full",children:jsx(Ve,{})})}),jsx(ResizableHandle,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(ResizablePanel,{defaultSize:"18%",minSize:"10%",children:jsx("div",{className:"fk:sm:hidden fk:md:block",children:jsx(Me,{})})})]})}function aa(){return {name:"flexkit.asset-manager",contributes:{apps:[{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:jsx(Ye,{}),routes:[]}],previewFields:{assetPreviewField:{component:Pe,description:"Asset preview field for the asset manager"}}}}}export{aa as AssetManager};//# sourceMappingURL=index.js.map
18
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data-grid/preview-components/asset.tsx","../src/sidebar.tsx","../src/data-grid/data-table-toolbar.tsx","../src/list.tsx","../src/root.tsx","../src/index.tsx"],"names":["FileTypeIconCompat","FileTypeIcon","transparentImageBackground","Asset","value","path","isImage","getExtensionFromPath","p","clean","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","TooltipPortal","TooltipContent","ext","style","defaultStyles","Sidebar","scope","useAppContext","schema","useConfig","runMutation","setMutation","setOptions","useEntityMutation","newTagName","setNewTagName","useState","isDialogOpen","setIsDialogOpen","isDeleteOpen","setIsDeleteOpen","tagToDelete","setTagToDelete","isEditOpen","setIsEditOpen","tagToEdit","setTagToEdit","editTagName","setEditTagName","isSubmitting","setIsSubmitting","isDeleting","setIsDeleting","entityName","entityNamePlural","variables","useMemo","data","isLoading","useEntityQuery","tags","item","it","handleCreate","useCallback","name","_id","mutation","getEntityCreateMutation","entityQuery","getEntityQuery","refreshQuery","gql","resolve","handleDelete","getEntityDeleteMutation","handleRename","dataToMutate","originalData","getEntityUpdateMutation","TagIcon","Dialog","DialogTrigger","Button","PlusIcon","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","DialogFooter","Loader2","ScrollArea","tag","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","mimeTypes","ImagePlayIcon","ImageIcon","FilePlayIcon","LayersIcon","SplinePointerIcon","DataTableToolbar","table","onSearchWhereChange","isFiltered","projectId","useParams","uploadAssets","useUploadAssets","dispatch","useDispatch","isTagDialogOpen","setIsTagDialogOpen","isRemoveTagDialogOpen","setIsRemoveTagDialogOpen","selectedTagIds","setSelectedTagIds","selectedRemoveTagIds","setSelectedRemoveTagIds","search","setSearch","textWhereRef","useRef","filterWhereRef","getBaseSearchRequest","baseSearchRequest","searchQuery","setSearchQuery","results","useSearch","lastWhereRef","debouncedSetSearchQuery","debounce","query","handleUpload","selectedIds","row","tagsData","allTags","t","mimeSampleData","getMimeLabel","mime","getMimeIcon","dynamicMimeOptions","items","unique","mimeTypeOptions","tagOptions","emitCombinedWhere","clauses","combinedWhere","whereKey","handleBatchDelete","id","handleAddTagsToSelected","handleRemoveTagsFromSelected","useEffect","safeResults","trimmed","nextWhere","assetIdClauses","r","tagClauses","orClauses","columnFiltersKey","mimeFilter","f","mimeValues","tagsFilter","tagValues","orTags","LoaderCircle","SearchIcon","ResetIcon","DataTableFacetedFilter","ListChecks","MinusIcon","Trash2Icon","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","prev","CommandSeparator","fn","ms","timeoutId","args","pageSize","List","useLocation","entityId","schemaErrorMessage","useGraphQLError","projects","currentProjectId","find","propEq","columnsDefinition","useGridColumnsDefinition","assetSchema","searchWhere","setSearchWhere","whereBase","fetchMore","count","isProjectDisabled","lastRequestedOffsetRef","isInitialLoading","fetchMoreOnBottomReached","containerRefElement","rowsCount","scrollHeight","scrollTop","clientHeight","remaining","threshold","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","DataTable","w","Outlet","columns","column","Skeleton","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle","AssetManager","FileStackIcon"],"mappings":"wtCAYA,IAAMA,EAAAA,CAAqBC,QAAAA,CAErBC,EAAAA,CACJ,6bAAA,CAEK,SAASC,EAAAA,CAAM,CAAE,KAAA,CAAAC,CAAM,CAAA,CAA0C,CACtE,GAAI,CAACA,EACH,OAAO,IAAA,CAGT,IAAMC,CAAAA,CAAOD,CAAAA,CAEPE,CAAAA,CAAU,mCAAA,CAAoC,IAAA,CAAKD,CAAI,CAAA,CAEvDE,CAAAA,CAAwBC,CAAAA,EAAsB,CAClD,GAAM,CAACC,CAAK,EAAID,CAAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CACrBE,CAAAA,CAAQD,CAAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAE7B,OAAIC,CAAAA,CAAM,MAAA,CAAS,CAAA,CACVA,CAAAA,CAAM,GAAA,EAAI,CAAG,WAAA,EAAY,CAG3B,MACT,CAAA,CAEMC,CAAAA,CAAgBN,CAAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CACtC,CAAA,EAAGO,eAAe,CAAA,EAAGP,CAAI,CAAA,CAAA,CACzB,CAAA,EAAGO,eAAe,GAAGP,CAAI,CAAA,iBAAA,CAAA,CAEvBQ,CAAAA,CAAUR,CAAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAI,CAAA,EAAGO,eAAe,CAAA,EAAGP,CAAI,CAAA,CAAA,CAAK,CAAA,EAAGO,eAAe,CAAA,EAAGP,CAAI,sBAE/F,OACES,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAAA,GAAAA,CAACC,eAAAA,CAAA,CACE,QAAA,CAAAT,CAAAA,CACCU,IAAAA,CAACC,OAAAA,CAAA,CACC,QAAA,CAAA,CAAAH,GAAAA,CAACI,eAAA,CAAe,OAAA,CAAO,IAAA,CACrB,QAAA,CAAAJ,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKH,CAAAA,CACL,GAAA,CAAI,OAAA,CACJ,SAAA,CAAW,CAAA,qFAAA,EAAwFT,EAA0B,CAAA,CAAA,CAC/H,CAAA,CACF,CAAA,CACAY,GAAAA,CAACK,aAAAA,CAAA,CACC,QAAA,CAAAL,GAAAA,CAACM,cAAAA,CAAA,CACC,QAAA,CAAAN,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKD,CAAAA,CACL,GAAA,CAAI,OAAA,CACJ,SAAA,CAAW,CAAA,mEAAA,EAAsEX,EAA0B,CAAA,CAAA,CAC7G,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEAc,IAAAA,CAACC,OAAAA,CAAA,CACC,QAAA,CAAA,CAAAH,GAAAA,CAACI,cAAAA,CAAA,CAAe,OAAA,CAAO,IAAA,CACrB,QAAA,CAAAJ,GAAAA,CAAC,OAAI,SAAA,CAAU,6HAAA,CACX,QAAA,CAAA,CAAA,IAAM,CACN,IAAMO,CAAAA,CAAMd,CAAAA,CAAqBF,CAAI,CAAA,CAC/BiB,CAAAA,CACJC,aAAAA,CAGAF,CAAG,CAAA,CAEL,OAAOP,GAAAA,CAACd,EAAAA,CAAA,CAAmB,SAAA,CAAWqB,CAAAA,CAAM,GAAIC,CAAAA,EAAS,EAAC,CAAI,CAChE,CAAA,GAAG,CACL,CAAA,CACF,CAAA,CACAR,GAAAA,CAACK,aAAAA,CAAA,CACC,QAAA,CAAAL,GAAAA,CAACM,cAAAA,CAAA,CACC,QAAA,CAAAN,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CAAsC,QAAA,CAAA,uBAAA,CAAqB,CAAA,CAC5E,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,CACF,CAEJ,CCvDO,SAASU,EAAAA,EAAuB,CACrC,GAAM,CAAE,KAAA,CAAAC,CAAM,CAAA,CAAIC,aAAAA,GACZ,CAAE,oBAAA,CAAsBC,CAAO,CAAA,CAAIC,SAAAA,EAAU,CAC7C,CAACC,CAAAA,CAAaC,CAAAA,CAAaC,CAAU,CAAA,CAAIC,iBAAAA,EAAkB,CAC3D,CAACC,CAAAA,CAAYC,CAAa,CAAA,CAAIC,QAAAA,CAAiB,EAAE,CAAA,CACjD,CAACC,CAAAA,CAAcC,CAAe,CAAA,CAAIF,QAAAA,CAAkB,KAAK,CAAA,CACzD,CAACG,CAAAA,CAAcC,CAAe,CAAA,CAAIJ,QAAAA,CAAkB,KAAK,CAAA,CACzD,CAACK,CAAAA,CAAaC,CAAc,CAAA,CAAIN,QAAAA,CAAyB,IAAI,CAAA,CAC7D,CAACO,EAAAA,CAAYC,CAAa,CAAA,CAAIR,QAAAA,CAAkB,KAAK,CAAA,CACrD,CAACS,EAAWC,CAAY,CAAA,CAAIV,QAAAA,CAAyB,IAAI,CAAA,CACzD,CAACW,CAAAA,CAAaC,CAAc,CAAA,CAAIZ,QAAAA,CAAiB,EAAE,CAAA,CACnD,CAACa,CAAAA,CAAcC,CAAe,CAAA,CAAId,SAAkB,KAAK,CAAA,CACzD,CAACe,CAAAA,CAAYC,CAAa,CAAA,CAAIhB,QAAAA,CAAkB,KAAK,CAAA,CAErDiB,CAAAA,CAAa,MAAA,CACbC,CAAAA,CAAmB,OAAA,CACnBC,CAAAA,CAAYC,OAAAA,CAAQ,KAAO,CAAE,KAAA,CAAO,EAAC,CAAG,OAAA,CAAS,CAAE,KAAA,CAAO,GAAA,CAAK,MAAA,CAAQ,CAAA,CAAG,IAAA,CAAM,CAAC,CAAE,IAAA,CAAM,KAAM,CAAC,CAAE,CAAE,CAAA,CAAA,CAAI,EAAE,CAAA,CAC1G,CAAE,IAAA,CAAAC,CAAAA,CAAM,SAAA,CAAAC,CAAU,CAAA,CAAIC,cAAAA,CAAe,CACzC,gBAAA,CAAAL,CAAAA,CACA,MAAA,CAAA1B,EACA,KAAA,CAAAF,CAAAA,CACA,SAAA,CAAA6B,CACF,CAAC,CAAA,CAEKK,CAAAA,CAAAA,CAAmB,KAAA,CAAM,OAAA,CAAQH,CAAI,CAAA,CAAKA,CAAAA,CAAqB,EAAC,EAAG,GAAA,CAAKI,CAAAA,EAAS,CACrF,IAAMC,CAAAA,CAAKD,CAAAA,CACX,OAAO,CAAE,GAAA,CAAKC,CAAAA,CAAG,GAAA,CAAK,IAAA,CAAMA,CAAAA,CAAG,IAAK,CACtC,CAAC,CAAA,CAEKC,CAAAA,CAAeC,WAAAA,CAAY,SAA2B,CAC1D,IAAMC,CAAAA,CAAO/B,CAAAA,CAAW,IAAA,EAAK,CAE7B,GAAI,CAAC+B,CAAAA,CACH,OAGFf,CAAAA,CAAgB,IAAI,CAAA,CACpB,IAAMgB,CAAAA,CAAM,OAAO,OAAW,GAAA,EAAe,YAAA,GAAgB,MAAA,CAAS,MAAA,CAAO,UAAA,EAAW,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,CAEnGC,CAAAA,CAAWC,uBAAAA,CAAwBd,CAAAA,CAAkB1B,CAAAA,CADxC,CAAE,KAAM,CAAE,KAAA,CAAOqC,CAAAA,CAAM,QAAA,CAAU,KAAA,CAAO,KAAA,CAAO,SAAU,CAAE,CAAA,CACCC,CAAG,CAAA,CAC5EG,CAAAA,CAAcC,cAAAA,CAAehB,CAAAA,CAAkB5B,CAAAA,CAAOE,CAAM,EAC5D2C,EAAAA,CAAeC,GAAAA;AAAA,MAAA,EACjBH,EAAY,KAAK;AAAA,IAAA,CAAA,CAGrB,MAAM,IAAI,OAAA,CAAeI,EAAAA,EAAY,CACnC1C,CAAAA,CAAYyC,GAAAA;AAAA,QAAA,EACRL,CAAQ;AAAA,MAAA,CACX,CAAA,CACDnC,CAAAA,CAAW,CACT,cAAA,CAAgB,CAACuC,EAAY,CAAA,CAC7B,WAAA,CAAa,IAAM,CACjBpC,CAAAA,CAAc,EAAE,CAAA,CAChBG,CAAAA,CAAgB,KAAK,CAAA,CACrBmC,EAAAA,GACF,CACF,CAAC,CAAA,CACD3C,CAAAA,CAAY,IAAI,EAClB,CAAC,CAAA,CACDoB,CAAAA,CAAgB,KAAK,EACvB,CAAA,CAAG,CAACI,CAAAA,CAAkBxB,CAAAA,CAAaF,CAAAA,CAAQF,CAAAA,CAAOK,CAAAA,CAAaC,CAAAA,CAAYE,CAAU,CAAC,CAAA,CAEhFwC,CAAAA,CAAeV,WAAAA,CACnB,MAAOE,CAAAA,EAA+B,CACpCd,CAAAA,CAAc,IAAI,CAAA,CAClB,IAAMe,CAAAA,CAAWQ,uBAAAA,CAAwBtB,CAAAA,CAAYzB,CAAAA,CAAQsC,CAAG,CAAA,CAC1DG,CAAAA,CAAcC,cAAAA,CAAehB,CAAAA,CAAkB5B,CAAAA,CAAOE,CAAM,EAC5D2C,CAAAA,CAAeC,GAAAA;AAAA,QAAA,EACjBH,EAAY,KAAK;AAAA,MAAA,CAAA,CAGrB,MAAM,IAAI,OAAA,CAAeI,CAAAA,EAAY,CACnC1C,CAAAA,CAAYyC,GAAAA;AAAA,UAAA,EACRL,CAAQ;AAAA,QAAA,CACX,CAAA,CACDnC,EAAW,CACT,SAAA,CAAW,CAAE,KAAA,CAAO,CAAE,IAAAkC,CAAI,CAAE,EAC5B,cAAA,CAAgB,CAACK,CAAY,CAAA,CAC7B,WAAA,CAAa,IAAM,CACjBE,CAAAA,GACF,CACF,CAAC,EACD3C,CAAAA,CAAY,IAAI,EAClB,CAAC,CAAA,CACDsB,EAAc,KAAK,EACrB,EACA,CAACC,CAAAA,CAAYC,EAAkBxB,CAAAA,CAAaF,CAAAA,CAAQF,EAAOK,CAAAA,CAAaC,CAAU,CACpF,CAAA,CAEM4C,CAAAA,CAAeZ,YAAY,SAA2B,CAC1D,IAAMC,CAAAA,CAAOlB,CAAAA,CAAY,MAAK,CAE9B,GAAI,CAACkB,CAAAA,EAAQ,CAACpB,EACZ,OAGFK,CAAAA,CAAgB,IAAI,CAAA,CAEpB,IAAM2B,EAAe,CAAE,IAAA,CAAM,CAAE,KAAA,CAAOZ,CAAAA,CAAM,SAAU,KAAA,CAAO,KAAA,CAAO,SAAU,CAAE,CAAA,CAC1Ea,EAAe,EAAC,CAChBX,EAAWY,uBAAAA,CACfzB,CAAAA,CACAT,EAAU,GAAA,CACVnB,CAAAA,CACAE,EACAkD,CAAAA,CACAD,CACF,EACMR,CAAAA,CAAcC,cAAAA,CAAehB,EAAkB5B,CAAAA,CAAOE,CAAM,EAC5D2C,EAAAA,CAAeC,GAAAA;AAAA,MAAA,EACjBH,EAAY,KAAK;AAAA,IAAA,CAAA,CAGrB,MAAM,IAAI,OAAA,CAAeI,EAAAA,EAAY,CACnC1C,CAAAA,CAAYyC,GAAAA;AAAA,QAAA,EACRL,CAAQ;AAAA,MAAA,CACX,EACDnC,CAAAA,CAAW,CACT,UAAW,CAAE,KAAA,CAAO,CAAE,GAAA,CAAKa,CAAAA,CAAU,GAAI,CAAE,EAC3C,cAAA,CAAgB,CAAC0B,EAAY,CAAA,CAC7B,WAAA,CAAa,IAAM,CACjB3B,CAAAA,CAAc,KAAK,CAAA,CACnBE,EAAa,IAAI,CAAA,CACjBE,EAAe,EAAE,CAAA,CACjByB,KACF,CACF,CAAC,CAAA,CACD3C,EAAY,IAAI,EAClB,CAAC,CAAA,CAEDoB,CAAAA,CAAgB,KAAK,EACvB,CAAA,CAAG,CAACH,CAAAA,CAAaO,EAAkBxB,CAAAA,CAAaF,CAAAA,CAAQF,EAAOK,CAAAA,CAAaC,CAAAA,CAAYa,CAAS,CAAC,CAAA,CAElG,OACE5B,IAAAA,CAAC,OAAI,SAAA,CAAU,wDAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mFAAA,CACb,QAAA,CAAA,CAAAF,GAAAA,CAACiE,OAAAA,CAAA,CAAQ,SAAA,CAAU,eAAA,CAAgB,EACnCjE,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,uDAAA,CAAwD,QAAA,CAAA,MAAA,CAAI,CAAA,CAC5EA,GAAAA,CAACC,gBAAA,CACC,QAAA,CAAAC,KAACC,OAAAA,CAAA,CACC,UAAAH,GAAAA,CAACI,cAAAA,CAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAAF,IAAAA,CAACgE,OAAA,CAAO,IAAA,CAAM5C,EAAc,YAAA,CAAcC,CAAAA,CACxC,QAAA,CAAA,CAAAvB,GAAAA,CAACmE,cAAA,CAAc,OAAA,CAAO,KACpB,QAAA,CAAAjE,IAAAA,CAACkE,OAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,OAAO,SAAA,CAAU,0BAAA,CAChD,UAAApE,GAAAA,CAACqE,QAAAA,CAAA,CAAS,SAAA,CAAU,eAAA,CAAgB,CAAA,CACpCrE,GAAAA,CAAC,QAAK,SAAA,CAAU,YAAA,CAAa,mBAAO,CAAA,CAAA,CACtC,CAAA,CACF,EACAE,IAAAA,CAACoE,aAAAA,CAAA,CACC,QAAA,CAAA,CAAApE,KAACqE,YAAAA,CAAA,CACC,UAAAvE,GAAAA,CAACwE,WAAAA,CAAA,CAAY,QAAA,CAAA,SAAA,CAAO,CAAA,CACpBxE,GAAAA,CAACyE,iBAAAA,CAAA,CAAkB,SAAA,CAAU,YAAA,CAAa,4BAAgB,CAAA,CAAA,CAC5D,CAAA,CACAzE,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAA,IAAC0E,KAAAA,CAAA,CACC,UAAS,IAAA,CACT,KAAA,CAAOvD,EACP,WAAA,CAAY,cAAA,CACZ,QAAA,CAAWwD,CAAAA,EAAMvD,EAAcuD,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC7C,SAAA,CAAYA,GAAM,CACZA,CAAAA,CAAE,GAAA,GAAQ,OAAA,EACP3B,IAET,CAAA,CACF,EACF,CAAA,CACAhD,GAAAA,CAAC4E,aAAA,CACC,QAAA,CAAA1E,IAAAA,CAACkE,MAAAA,CAAA,CAAO,QAAA,CAAUlC,CAAAA,CAAc,QAASc,CAAAA,CAAc,OAAA,CAAQ,UAC5D,QAAA,CAAA,CAAAd,CAAAA,CAAelC,GAAAA,CAAC6E,OAAAA,CAAA,CAAQ,SAAA,CAAU,uCAAA,CAAwC,EAAK,IAAA,CAAK,KAAA,CAAA,CAEvF,EACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACA7E,IAACM,cAAAA,CAAA,CACC,SAAAN,GAAAA,CAAC,GAAA,CAAA,CAAE,mBAAO,CAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,EAEAA,GAAAA,CAAC8E,UAAAA,CAAA,CAAW,SAAA,CAAU,WAAA,CACpB,SAAA9E,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACZ,SAAA2C,CAAAA,CACC3C,GAAAA,CAAC,OAAI,SAAA,CAAU,qCAAA,CAAsC,sBAAU,CAAA,CAC7D6C,CAAAA,CAAK,MAAA,GAAW,CAAA,CAClB7C,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAsC,QAAA,CAAA,aAAA,CAAW,CAAA,CAEhE6C,EAAK,GAAA,CAAKkC,CAAAA,EACR7E,IAAAA,CAAC,KAAA,CAAA,CAEC,UAAU,yHAAA,CAEV,QAAA,CAAA,CAAAF,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAc,QAAA,CAAA+E,CAAAA,CAAI,IAAA,CAAK,CAAA,CACvC7E,KAAC8E,YAAAA,CAAA,CACC,UAAAhF,GAAAA,CAACiF,mBAAAA,CAAA,CAAoB,OAAA,CAAO,IAAA,CAC1B,QAAA,CAAAjF,GAAAA,CAACoE,OAAA,CACC,YAAA,CAAY,eAAeW,CAAAA,CAAI,IAAI,GACnC,KAAA,CAAO,CAAA,YAAA,EAAeA,CAAAA,CAAI,IAAI,GAC9B,OAAA,CAAQ,OAAA,CACR,KAAK,MAAA,CACL,SAAA,CAAU,kEAEV,QAAA,CAAA/E,GAAAA,CAACkF,QAAAA,CAAA,CAAS,UAAU,eAAA,CAAgB,CAAA,CACtC,EACF,CAAA,CACAhF,IAAAA,CAACiF,oBAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,YACzC,QAAA,CAAA,CAAAnF,GAAAA,CAACoF,iBAAA,CACC,OAAA,CAAS,IAAM,CACbrD,CAAAA,CAAagD,CAAG,CAAA,CAChB9C,EAAe8C,CAAAA,CAAI,IAAI,EACvBlD,CAAAA,CAAc,IAAI,EACpB,CAAA,CACD,QAAA,CAAA,MAAA,CAED,CAAA,CACA7B,GAAAA,CAACqF,sBAAA,EAAsB,CAAA,CACvBrF,IAACoF,gBAAAA,CAAA,CACC,UAAU,qBAAA,CACV,OAAA,CAAS,IAAM,CACbzD,CAAAA,CAAeoD,CAAG,CAAA,CAClBtD,CAAAA,CAAgB,IAAI,EACtB,CAAA,CACD,kBAED,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CArCKsD,CAAAA,CAAI,GAsCX,CACD,CAAA,CAEL,EACF,CAAA,CACA/E,GAAAA,CAACkE,OAAA,CAAO,IAAA,CAAMtC,EAAAA,CAAY,YAAA,CAAcC,EACtC,QAAA,CAAA3B,IAAAA,CAACoE,cAAA,CACC,QAAA,CAAA,CAAApE,KAACqE,YAAAA,CAAA,CACC,QAAA,CAAA,CAAAvE,GAAAA,CAACwE,YAAA,CAAY,QAAA,CAAA,UAAA,CAAQ,EACrBxE,GAAAA,CAACyE,iBAAAA,CAAA,CAAkB,SAAA,CAAU,YAAA,CAAa,QAAA,CAAA,wBAAA,CAAsB,CAAA,CAAA,CAClE,EACAzE,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kBAAA,CACb,QAAA,CAAAA,IAAC0E,KAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,MAAO1C,CAAAA,CACP,WAAA,CAAY,WACZ,QAAA,CAAW2C,CAAAA,EAAM1C,EAAe0C,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAC9C,UAAYA,CAAAA,EAAM,CACZA,EAAE,GAAA,GAAQ,OAAA,EACPd,IAET,CAAA,CACF,CAAA,CACF,CAAA,CACA3D,KAAC0E,YAAAA,CAAA,CACC,UAAA5E,GAAAA,CAACoE,MAAAA,CAAA,CACC,QAAA,CAAUlC,CAAAA,CACV,OAAA,CAAQ,WAAA,CACR,QAAS,IAAM,CACbL,EAAc,KAAK,CAAA,CACnBE,EAAa,IAAI,EACnB,CAAA,CACD,QAAA,CAAA,QAAA,CAED,EACA7B,IAAAA,CAACkE,MAAAA,CAAA,CAAO,QAAA,CAAUlC,CAAAA,CAAc,QAAS2B,CAAAA,CAAc,OAAA,CAAQ,SAAA,CAC5D,QAAA,CAAA,CAAA3B,EAAelC,GAAAA,CAAC6E,OAAAA,CAAA,CAAQ,SAAA,CAAU,uCAAA,CAAwC,EAAK,IAAA,CAAK,MAAA,CAAA,CAEvF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAAA,CACA7E,GAAAA,CAACkE,OAAA,CAAO,IAAA,CAAM1C,EAAc,YAAA,CAAcC,CAAAA,CACxC,QAAA,CAAAvB,IAAAA,CAACoE,cAAA,CACC,QAAA,CAAA,CAAApE,KAACqE,YAAAA,CAAA,CACC,UAAAvE,GAAAA,CAACwE,WAAAA,CAAA,CAAY,QAAA,CAAA,YAAA,CAAU,EACvBxE,GAAAA,CAACyE,iBAAAA,CAAA,CAAkB,SAAA,CAAU,YAAA,CAAa,qCAAyB,CAAA,CAAA,CACrE,CAAA,CACAvE,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,qCAAA,CAAsC,QAAA,CAAA,CAAA,yCAAA,CACX,IACxCF,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,qCAAA,CAAuC,QAAA,CAAA0B,CAAAA,EAAa,IAAA,CAAK,EAAO,GAAA,CAAA,CAClF,CAAA,CACAxB,KAAC0E,YAAAA,CAAA,CACC,UAAA5E,GAAAA,CAACoE,MAAAA,CAAA,CACC,QAAA,CAAUhC,CAAAA,CACV,QAAQ,WAAA,CACR,OAAA,CAAS,IAAM,CACbX,CAAAA,CAAgB,KAAK,CAAA,CACrBE,CAAAA,CAAe,IAAI,EACrB,EACD,QAAA,CAAA,QAAA,CAED,CAAA,CACAzB,KAACkE,MAAAA,CAAA,CACC,SAAUhC,CAAAA,CACV,OAAA,CAAQ,aAAA,CACR,OAAA,CAAS,IAAM,CACRV,CAAAA,EAAAA,CAIC,UACJ,MAAMiC,CAAAA,CAAajC,EAAY,GAAG,CAAA,CAClCD,CAAAA,CAAgB,KAAK,EACrBE,CAAAA,CAAe,IAAI,MAEvB,CAAA,CAEC,QAAA,CAAA,CAAAS,EAAapC,GAAAA,CAAC6E,OAAAA,CAAA,CAAQ,SAAA,CAAU,wCAAwC,CAAA,CAAK,IAAA,CAAK,UAErF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAAA,CAAA,CACF,CAEJ,CCvSA,IAAMS,EAAAA,CAAY,CAChB,CACE,KAAA,CAAO,WAAA,CACP,MAAO,KAAA,CACP,IAAA,CAAMC,aACR,CAAA,CACA,CACE,KAAA,CAAO,YAAA,CACP,MAAO,MAAA,CACP,IAAA,CAAMC,SACR,CAAA,CACA,CACE,MAAO,WAAA,CACP,KAAA,CAAO,KAAA,CACP,IAAA,CAAMC,YACR,CAAA,CACA,CACE,MAAO,WAAA,CACP,KAAA,CAAO,MACP,IAAA,CAAMC,UACR,CAAA,CACA,CACE,MAAO,eAAA,CACP,KAAA,CAAO,MACP,IAAA,CAAMC,iBACR,EACA,CACE,KAAA,CAAO,YAAA,CACP,KAAA,CAAO,OACP,IAAA,CAAMH,SACR,CACF,CAAA,CAEO,SAASI,GAAwB,CACtC,UAAA,CAAAtD,CAAAA,CACA,KAAA,CAAAuD,EACA,mBAAA,CAAAC,CACF,EAA8C,CAC5C,IAAMC,EAAaF,CAAAA,CAAM,QAAA,EAAS,CAAE,aAAA,CAAc,OAAS,CAAA,CACrD,CAAE,UAAAG,CAAU,CAAA,CAAIC,WAAU,CAC1BC,CAAAA,CAAeC,eAAAA,EAAgB,CAC/BC,EAAWC,WAAAA,EAAY,CACvB,CAAE,KAAA,CAAA1F,CAAM,EAAIC,aAAAA,EAAc,CAC1B,CAAC0F,CAAAA,CAAiBC,CAAkB,CAAA,CAAIlF,QAAAA,CAAS,KAAK,CAAA,CACtD,CAACmF,EAAuBC,CAAwB,CAAA,CAAIpF,QAAAA,CAAS,KAAK,EAClE,CAACqF,CAAAA,CAAgBC,EAAiB,CAAA,CAAItF,QAAAA,CAAmB,EAAE,CAAA,CAC3D,CAACuF,CAAAA,CAAsBC,CAAuB,CAAA,CAAIxF,QAAAA,CAAmB,EAAE,CAAA,CACvE,CAACN,CAAAA,CAAaC,CAAAA,CAAaC,CAAU,CAAA,CAAIC,mBAAkB,CAC3D,CAAE,qBAAsBL,CAAO,CAAA,CAAIC,WAAU,CAC7C,CAACgG,CAAAA,CAAQC,CAAS,EAAI1F,QAAAA,CAAS,EAAE,EACjC2F,CAAAA,CAAeC,MAAAA,CAAoB,EAAE,CAAA,CACrCC,CAAAA,CAAiBD,MAAAA,CAAoB,EAAE,CAAA,CAE7C,SAASE,CAAAA,EAA2C,CAClD,OAAO,CACL,cAAA,CAAgB,CACd,QAAA,CAAU,CAAC,CAAE,UAAA,CAAY,SAAU,EAAG,CAAE,UAAA,CAAY,OAAQ,CAAC,CAC/D,CAAA,CACA,YAAA,CAAc,CAAE,CAAA,CAAG,EAAG,CACxB,CACF,CAEA,IAAMC,CAAAA,CAAoB3E,OAAAA,CAAQ,IAAM0E,CAAAA,GAAwB,EAAE,EAC5D,CAACE,CAAAA,CAAaC,CAAc,CAAA,CAAIjG,QAAAA,CAA6B+F,CAAiB,CAAA,CAC9E,CAAE,OAAA,CAAAG,CAAAA,CAAS,UAAA5E,CAAU,CAAA,CAAI6E,UAAUxB,CAAAA,EAAa,EAAA,CAAIqB,CAAW,CAAA,CAC/DI,EAAeR,MAAAA,CAAe,EAAE,EAEhCS,CAAAA,CAA0BzE,WAAAA,CAC9B0E,GAAUC,CAAAA,EAAkB,CAC1BN,CAAAA,CAAe,CAAE,GAAGF,CAAAA,CAAmB,YAAA,CAAc,CAAE,CAAA,CAAGQ,CAAM,CAAE,CAAC,EACrE,CAAA,CAAG,GAAG,EACN,CAACR,CAAiB,CACpB,CAAA,CAEA,eAAeS,GAA8B,CAC3C,MAAM3B,CAAAA,CAAa,CAAE,UAAAF,CAAAA,CAAW,MAAA,CAAQ,UAAW,QAAA,CAAU,IAAA,CAAM,SAAU,CAAA,CAAI,IAAA,CAAO,IAAK,CAAC,EAChG,CAGA,IAAM8B,EAAwBjC,CAAAA,CAC3B,mBAAA,GACA,IAAA,CAAK,GAAA,CAAKkC,CAAAA,EAASA,CAAAA,CAAI,SAAwC,GAAG,CAAA,CAG/D,CAAE,IAAA,CAAMC,CAAS,EAAIpF,cAAAA,CAAe,CACxC,gBAAA,CAAkB,OAAA,CAClB,OAAA/B,CAAAA,CACA,KAAA,CAAAF,EACA,SAAA,CAAW,CAAE,MAAO,EAAC,CAAG,OAAA,CAAS,CAAE,MAAO,GAAA,CAAK,MAAA,CAAQ,EAAG,IAAA,CAAM,CAAC,CAAE,IAAA,CAAM,KAAM,CAAC,CAAE,CAAE,CACtF,CAAC,EACKsH,CAAAA,CAAU,KAAA,CAAM,QAAQD,CAAQ,CAAA,CACjCA,CAAAA,CAAuB,GAAA,CAAKE,IAAO,CAAE,GAAA,CAAMA,EAAsB,GAAA,CAAK,IAAA,CAAOA,EAAuB,IAAK,CAAA,CAAE,CAAA,CAC5G,GAGE,CAAE,IAAA,CAAMC,CAAe,CAAA,CAAIvF,cAAAA,CAAe,CAC9C,gBAAA,CAAkB,SAAA,CAClB,MAAA,CAAA/B,CAAAA,CACA,MAAAF,CAAAA,CACA,SAAA,CAAW,CAAE,KAAA,CAAO,GAAI,OAAA,CAAS,CAAE,MAAO,GAAA,CAAK,MAAA,CAAQ,EAAG,IAAA,CAAM,CAAC,CAAE,UAAA,CAAY,MAAO,CAAC,CAAE,CAAE,CAC7F,CAAC,EAID,SAASyH,EAAAA,CAAaC,EAAsB,CAC1C,GAAIA,IAAS,WAAA,CACX,OAAO,KAAA,CAGT,GAAIA,IAAS,YAAA,CACX,OAAO,OAGT,GAAIA,CAAAA,GAAS,YACX,OAAO,KAAA,CAGT,GAAIA,CAAAA,GAAS,YACX,OAAO,KAAA,CAGT,GAAIA,CAAAA,GAAS,eAAA,CACX,OAAO,KAAA,CAGT,GAAIA,CAAAA,GAAS,YAAA,CACX,OAAO,MAAA,CAGT,IAAMzI,EAAQyI,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAE5B,OAAIzI,CAAAA,CAAM,MAAA,GAAW,GAAKA,CAAAA,CAAM,CAAC,EACxBA,CAAAA,CAAM,CAAC,EAAE,WAAA,EAAY,CAGvByI,CACT,CAEA,SAASC,EAAAA,CAAYD,CAAAA,CAAc,CACjC,OAAIA,CAAAA,GAAS,gBACJ1C,iBAAAA,CAGL0C,CAAAA,CAAK,UAAA,CAAW,QAAQ,EACnB7C,SAAAA,CAGL6C,CAAAA,CAAK,WAAW,QAAQ,CAAA,CACnB5C,aAGFC,UACT,CAEA,IAAM6C,EAAAA,CAAqB9F,QAAQ,IAAM,CACvC,IAAM+F,CAAAA,CAAQ,KAAA,CAAM,QAAQL,CAAc,CAAA,CAAKA,CAAAA,CAA4C,GACrFM,CAAAA,CAAS,IAAI,IAEnB,IAAA,IAAW3F,CAAAA,IAAQ0F,EAAO,CACxB,IAAMlJ,CAAAA,CAAQwD,CAAAA,CAAK,UAAY,EAAA,CAE3BxD,CAAAA,EACFmJ,EAAO,GAAA,CAAInJ,CAAK,EAEpB,CAIA,OAFe,KAAA,CAAM,IAAA,CAAKmJ,EAAO,MAAA,EAAQ,EAAE,IAAA,EAAK,CAElC,IAAKnJ,CAAAA,GAAW,CAAE,KAAA,CAAAA,CAAAA,CAAO,MAAO8I,EAAAA,CAAa9I,CAAK,EAAG,IAAA,CAAMgJ,EAAAA,CAAYhJ,CAAK,CAAE,CAAA,CAAE,CAChG,CAAA,CAAG,CAAC6I,CAAc,CAAC,EAEbO,EAAAA,CAAkBH,EAAAA,CAAmB,OAAS,CAAA,CAAIA,EAAAA,CAAqBjD,EAAAA,CAEvEqD,EAAAA,CAAalG,QAAQ,IAClBwF,CAAAA,CAAQ,IAAKC,CAAAA,GAAO,CAAE,MAAOA,CAAAA,CAAE,GAAA,CAAK,KAAA,CAAOA,CAAAA,CAAE,IAAK,CAAA,CAAE,CAAA,CAC1D,CAACD,CAAO,CAAC,EAEZ,SAASW,EAAAA,EAA0B,CACjC,GAAI,CAAC9C,EACH,OAGF,IAAM+C,EAAyB,EAAC,CAE5B,OAAO,IAAA,CAAK7B,CAAAA,CAAa,OAAO,CAAA,CAAE,OAAS,CAAA,EAC7C6B,CAAAA,CAAQ,KAAK7B,CAAAA,CAAa,OAAO,EAG/B,MAAA,CAAO,IAAA,CAAKE,CAAAA,CAAe,OAAO,EAAE,MAAA,CAAS,CAAA,EAC/C2B,EAAQ,IAAA,CAAK3B,CAAAA,CAAe,OAAO,CAAA,CAGrC,IAAM4B,CAAAA,CAAgBD,CAAAA,CAAQ,SAAW,CAAA,CAAI,GAAKA,CAAAA,CAAQ,MAAA,GAAW,EAAIA,CAAAA,CAAQ,CAAC,CAAA,CAAI,CAAE,IAAKA,CAAQ,CAAA,CAC/FE,EAAW,IAAA,CAAK,SAAA,CAAUD,CAAa,CAAA,CAEzCrB,CAAAA,CAAa,OAAA,GAAYsB,CAAAA,GAC3BtB,EAAa,OAAA,CAAUsB,CAAAA,CACvBjD,EAAoBgD,CAAa,CAAA,EAErC,CAEA,eAAeE,EAAAA,EAAmC,CAChD5C,CAAAA,CAAS,CACP,IAAA,CAAM,aAAA,CACN,QAAS,CACP,OAAA,CAAS,CACP,WAAA,CAAa,CAAA,OAAA,EAAU0B,CAAAA,CAAY,MAAM,SAASA,CAAAA,CAAY,MAAA,CAAS,EAAI,GAAA,CAAM,EAAE,GACnF,aAAA,CACEA,CAAAA,CAAY,MAAA,CAAS,CAAA,CACjB,yFACA,2FAAA,CACN,iBAAA,CAAmB,SACnB,iBAAA,CAAmB,QAAA,CACnB,cAAe,IAAA,CACf,kBAAA,CAAoB,IAAM,CAAC,EAC3B,kBAAA,CAAoB,IAAM,CACxB,IAAA,IAAWmB,CAAAA,IAAMnB,EAKf1B,CAAAA,CAAS,CAAE,IAAA,CAAM,cAAA,CAAgB,QAJjB,CAAE,QAAA,CAAU6C,EAAI,UAAA,CAAA3G,CAAAA,CAAY,OAAQ,IAAK,CAIhB,CAAC,CAAA,CAG5CuD,EAAM,iBAAA,GACR,CACF,CACF,CACF,CAAC,EACH,CAEA,IAAMqD,EAAAA,CAA0BjG,YAAY,SAA2B,CACrE,GAAI6E,CAAAA,CAAY,MAAA,GAAW,GAAKpB,CAAAA,CAAe,MAAA,GAAW,CAAA,CACxD,OAIF,IAAM5C,CAAAA,CAAe,CACnB,KAAM,CACJ,aAAA,CAAe,CACb,OAAA,CAAS4C,CAAAA,CAAe,GAAA,CAAKuC,CAAAA,GAAQ,CAAE,GAAA,CAAKA,CAAG,EAAE,CACnD,CAAA,CACA,SAAU,KAAA,CACV,KAAA,CAAAtI,CACF,CACF,EAEMyC,CAAAA,CAAWY,uBAAAA,CAAwB,UAAW8D,CAAAA,CAAY,CAAC,GAAK,EAAA,CAAInH,CAAAA,CAAOE,EAAQ,EAAC,CAAGiD,CAAqB,CAAA,CAElH,MAAM,IAAI,OAAA,CAAeJ,CAAAA,EAAY,CACnC1C,CAAAA,CAAYyC,GAAAA;AAAA,QAAA,EACRL,CAAQ;AAAA,MAAA,CACX,EACDnC,CAAAA,CAAW,CACT,UAAW,CAAE,KAAA,CAAO,CAAE,MAAA,CAAQ6G,CAAY,CAAE,CAAA,CAC5C,WAAA,CAAa,IAAMpE,CAAAA,EACrB,CAAC,CAAA,CACD3C,CAAAA,CAAY,IAAI,EAClB,CAAC,CAAA,CAEDwF,CAAAA,CAAmB,KAAK,CAAA,CACxBI,EAAAA,CAAkB,EAAE,CAAA,CACpBd,EAAM,iBAAA,GACR,EAAG,CAAC9E,CAAAA,CAAaJ,EAAOmH,CAAAA,CAAapB,CAAAA,CAAgB1F,EAAaC,CAAAA,CAAY4E,CAAK,CAAC,CAAA,CAE9EsD,EAAAA,CAA+BlG,WAAAA,CAAY,SAA2B,CAC1E,GAAI6E,CAAAA,CAAY,SAAW,CAAA,EAAKlB,CAAAA,CAAqB,SAAW,CAAA,CAC9D,OAGF,IAAM9C,CAAAA,CAAe,CACnB,KAAM,CACJ,aAAA,CAAe,CACb,UAAA,CAAY8C,CACd,EACA,QAAA,CAAU,KAAA,CACV,MAAAjG,CACF,CACF,EAEMyC,CAAAA,CAAWY,uBAAAA,CAAwB,UAAW8D,CAAAA,CAAY,CAAC,GAAK,EAAA,CAAInH,CAAAA,CAAOE,EAAQ,EAAC,CAAGiD,CAAqB,CAAA,CAElH,MAAM,IAAI,OAAA,CAAeJ,CAAAA,EAAY,CACnC1C,CAAAA,CAAYyC,GAAAA;AAAA,QAAA,EACRL,CAAQ;AAAA,MAAA,CACX,EACDnC,CAAAA,CAAW,CACT,SAAA,CAAW,CAAE,MAAO,CAAE,MAAA,CAAQ6G,CAAY,CAAE,EAC5C,WAAA,CAAa,IAAMpE,GACrB,CAAC,EACD3C,CAAAA,CAAY,IAAI,EAClB,CAAC,EAED0F,CAAAA,CAAyB,KAAK,CAAA,CAC9BI,CAAAA,CAAwB,EAAE,CAAA,CAC1BhB,CAAAA,CAAM,iBAAA,GACR,CAAA,CAAG,CAAC9E,EAAaJ,CAAAA,CAAOmH,CAAAA,CAAalB,EAAsB5F,CAAAA,CAAaC,CAAAA,CAAY4E,CAAK,CAAC,EAE1FuD,SAAAA,CAAU,IAAM,CACd,GAAI,CAACtD,CAAAA,CACH,OAGF,IAAMuD,CAAAA,CAAc9B,GAAW,EAAC,CAC1B+B,EAAUxC,CAAAA,CAAO,IAAA,GAEnByC,CAAAA,CAAyB,EAAC,CAE9B,GAAID,EAAQ,MAAA,GAAW,CAAA,CACrBC,CAAAA,CAAY,WACHF,CAAAA,CAAY,MAAA,GAAW,CAAA,CAChCE,CAAAA,CAAY,CAAE,MAAA,CAAQ,EAAG,CAAA,CAAA,KACpB,CACL,IAAMC,CAAAA,CAAiBH,CAAAA,CAAY,MAAA,CAAQI,CAAAA,EAAMA,EAAE,iBAAA,GAAsB,SAAS,CAAA,CAAE,GAAA,CAAKA,IAAO,CAAE,GAAA,CAAKA,CAAAA,CAAE,GAAI,EAAE,CAAA,CAEzGC,CAAAA,CAAaL,EAChB,MAAA,CAAQI,CAAAA,EAAMA,EAAE,iBAAA,GAAsB,OAAO,CAAA,CAC7C,GAAA,CAAKA,IAAO,CAAE,mBAAA,CAAqB,CAAE,IAAA,CAAM,CAAE,GAAA,CAAKA,CAAAA,CAAE,GAAI,CAAE,CAAE,CAAA,CAAE,CAAA,CAE3DE,EAAY,CAAC,GAAGH,EAAgB,GAAGE,CAAU,CAAA,CACnDH,CAAAA,CAAYI,EAAU,MAAA,CAAS,CAAA,CAAI,CAAE,EAAA,CAAIA,CAAU,CAAA,CAAI,CAAE,MAAA,CAAQ,EAAG,EACtE,CAEA3C,EAAa,OAAA,CAAUuC,CAAAA,CACvBX,KACF,CAAA,CAAG,CAAC9C,CAAAA,CAAqByB,EAAST,CAAM,CAAC,CAAA,CAGzC,IAAM8C,GAAmB,IAAA,CAAK,SAAA,CAAU/D,CAAAA,CAAM,QAAA,GAAW,aAAa,CAAA,CAEtE,OAAAuD,SAAAA,CAAU,IAAM,CACd,GAAI,CAACtD,CAAAA,CACH,OAGF,IAAM+D,CAAAA,CAAahE,CAAAA,CAAM,QAAA,EAAS,CAAE,cAAc,IAAA,CAAMiE,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAO,UAAU,CAAA,CAC3EC,CAAAA,CAAc,MAAM,OAAA,CAAQF,CAAAA,EAAY,KAAK,CAAA,CAAKA,CAAAA,EAAY,KAAA,CAAsB,GAEpFG,CAAAA,CAAanE,CAAAA,CAAM,QAAA,EAAS,CAAE,cAAc,IAAA,CAAMiE,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAO,MAAM,CAAA,CACvEG,CAAAA,CAAa,MAAM,OAAA,CAAQD,CAAAA,EAAY,KAAK,CAAA,CAAKA,CAAAA,EAAY,KAAA,CAAsB,GAEnFnB,CAAAA,CAAyB,EAAC,CAMhC,GAJIkB,EAAW,MAAA,CAAS,CAAA,EACtBlB,CAAAA,CAAQ,IAAA,CAAK,CAAE,WAAA,CAAakB,CAAW,CAAgB,CAAA,CAGrDE,CAAAA,CAAU,OAAS,CAAA,CAAG,CACxB,IAAMC,CAAAA,CAASD,EAAU,GAAA,CAAKhB,CAAAA,GAAQ,CAAE,mBAAA,CAAqB,CAAE,IAAA,CAAM,CAAE,GAAA,CAAKA,CAAG,CAAE,CAAE,CAAA,CAAE,EACrFJ,CAAAA,CAAQ,IAAA,CAAKqB,EAAO,MAAA,GAAW,CAAA,CAAIA,CAAAA,CAAO,CAAC,EAAI,CAAE,EAAA,CAAIA,CAAO,CAAC,EAC/D,CAEIrB,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACrB3B,EAAe,OAAA,CAAU,GAChB2B,CAAAA,CAAQ,MAAA,GAAW,EAC5B3B,CAAAA,CAAe,OAAA,CAAU2B,CAAAA,CAAQ,CAAC,EAElC3B,CAAAA,CAAe,OAAA,CAAU,CAAE,GAAA,CAAK2B,CAAQ,CAAA,CAG1CD,EAAAA,GACF,CAAA,CAAG,CAACgB,EAAAA,CAAkB9D,CAAAA,CAAqBD,CAAK,CAAC,CAAA,CAG/C3F,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACZ,QAAA,CAAA,CAAAyC,EACC3C,GAAAA,CAACmK,YAAAA,CAAA,CAAa,SAAA,CAAU,wFAAA,CAAyF,EAEjHnK,GAAAA,CAACoK,MAAAA,CAAA,CAAW,SAAA,CAAU,yEAAyE,CAAA,CAEjGpK,GAAAA,CAAC0E,MAAA,CACC,WAAA,CAAY,mBACZ,IAAA,CAAK,eAAA,CACL,KAAA,CAAOoC,CAAAA,CACP,SAAW,CAAA,EAAM,CACf,GAAM,CAAE,KAAA,CAAAxH,CAAM,CAAA,CAAI,CAAA,CAAE,MAAA,CAGpB,GAFAyH,EAAUzH,CAAK,CAAA,CAEXA,CAAAA,CAAM,IAAA,GAAO,MAAA,GAAW,CAAA,CAAG,CAC7BgI,CAAAA,CAAe,CAAE,GAAGF,CAAAA,CAAmB,aAAc,CAAE,CAAA,CAAG,EAAG,CAAE,CAAC,CAAA,CAE5DtB,CAAAA,EACFA,EAAoB,EAAE,CAAA,CAGxB,MACF,CAEA4B,CAAAA,CAAwBpI,CAAK,EAC/B,CAAA,CACA,UAAU,6CAAA,CACZ,CAAA,CACCwH,EACC9G,GAAAA,CAAC,QAAA,CAAA,CACC,aAAW,cAAA,CACX,SAAA,CAAU,mFAAA,CACV,OAAA,CAAS,IAAM,CACb+G,CAAAA,CAAU,EAAE,CAAA,CACZO,EAAe,CAAE,GAAGF,CAAAA,CAAmB,YAAA,CAAc,CAAE,CAAA,CAAG,EAAG,CAAE,CAAC,CAAA,CAC5DtB,GACFA,CAAAA,CAAoB,EAAE,EAE1B,EACA,IAAA,CAAK,QAAA,CAEL,QAAA,CAAA9F,GAAAA,CAACqK,EAAA,CAAU,SAAA,CAAU,eAAA,CAAgB,CAAA,CACvC,EACE,IAAA,CAAA,CACN,CAAA,CACCxE,EAAM,SAAA,CAAU,UAAU,GACzB7F,GAAAA,CAACsK,sBAAAA,CAAA,CAAuB,MAAA,CAAQzE,EAAM,SAAA,CAAU,UAAU,CAAA,CAAG,KAAA,CAAM,YAAY,OAAA,CAAS6C,EAAAA,CAAiB,CAAA,CAE1G7C,CAAAA,CAAM,UAAU,MAAM,CAAA,EACrB7F,IAACsK,sBAAAA,CAAA,CAAuB,OAAQzE,CAAAA,CAAM,SAAA,CAAU,MAAM,CAAA,CAAG,MAAM,MAAA,CAAO,OAAA,CAAS8C,EAAAA,CAAY,CAAA,CAE5F5C,GACC7F,IAAAA,CAACkE,MAAAA,CAAA,CACC,OAAA,CAAQ,QACR,OAAA,CAAS,IAAM,CACbyB,CAAAA,CAAM,kBAAA,GAEFC,CAAAA,EACFA,CAAAA,CAAoB,EAAE,EAE1B,CAAA,CACA,SAAA,CAAU,2BAAA,CACX,QAAA,CAAA,CAAA,OAAA,CAEC9F,IAACqK,CAAAA,CAAA,CAAU,SAAA,CAAU,uBAAA,CAAwB,GAC/C,CAAA,CAAA,CAEJ,CAAA,CACCvC,EAAY,MAAA,CAAS,CAAA,CACpB9H,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAE,KAAC8E,YAAAA,CAAA,CACC,UAAAhF,GAAAA,CAACiF,mBAAAA,CAAA,CAAoB,OAAA,CAAO,IAAA,CAC1B,QAAA,CAAA/E,IAAAA,CAACkE,OAAA,CAAO,SAAA,CAAU,4BAA4B,IAAA,CAAK,IAAA,CAAK,QAAQ,WAAA,CAAY,QAAA,CAAA,CAAA,UAAA,CAClEpE,GAAAA,CAACuK,UAAAA,CAAA,CAAW,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAAA,CACxD,CAAA,CACF,EACArK,IAAAA,CAACiF,mBAAAA,CAAA,CAAoB,KAAA,CAAM,MAAM,SAAA,CAAU,cAAA,CACzC,UAAAjF,IAAAA,CAACkF,gBAAAA,CAAA,CAAiB,OAAA,CAAS,IAAMmB,CAAAA,CAAmB,IAAI,EACtD,QAAA,CAAA,CAAAvG,GAAAA,CAACiE,OAAAA,CAAA,CAAQ,UAAU,uBAAA,CAAwB,CAAA,CAAE,UAAA,CAAA,CAC/C,CAAA,CACA/D,KAACkF,gBAAAA,CAAA,CAAiB,QAAS,IAAMqB,CAAAA,CAAyB,IAAI,CAAA,CAC5D,QAAA,CAAA,CAAAzG,GAAAA,CAACwK,SAAAA,CAAA,CAAU,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAAE,aAAA,CAAA,CACjD,EACAxK,GAAAA,CAACqF,qBAAAA,CAAA,EAAsB,CAAA,CACvBnF,KAACkF,gBAAAA,CAAA,CAAiB,QAAS4D,EAAAA,CAAmB,SAAA,CAAU,sBACtD,QAAA,CAAA,CAAAhJ,GAAAA,CAACyK,UAAAA,CAAA,CAAW,UAAU,uBAAA,CAAwB,CAAA,CAAE,eAAA,CAAc3C,CAAAA,CAAY,OAAS,CAAA,CAAI,GAAA,CAAM,EAAA,CAAG,IAAA,CAC/FA,EAAY,MAAA,CAAO,GAAA,CAAA,CACtB,GACF,CAAA,CAAA,CACF,CAAA,CACF,EACE,IAAA,CACJ9H,GAAAA,CAACoE,MAAAA,CAAA,CAAO,UAAU,8BAAA,CAA+B,OAAA,CAASyD,CAAAA,CAAc,IAAA,CAAK,KAAK,OAAA,CAAQ,SAAA,CAAU,QAAA,CAAA,eAAA,CAEpG,CAAA,CAEA3H,KAACwK,aAAAA,CAAA,CAAc,KAAMpE,CAAAA,CAAiB,YAAA,CAAcC,EAClD,QAAA,CAAA,CAAAvG,GAAAA,CAAC2K,YAAAA,CAAA,CAAa,YAAY,gBAAA,CAAiB,CAAA,CAC3CzK,IAAAA,CAAC0K,WAAAA,CAAA,CAAY,SAAA,CAAU,cAAA,CACrB,QAAA,CAAA,CAAA5K,GAAAA,CAAC6K,aAAA,CAAa,QAAA,CAAA,gBAAA,CAAc,EAC5B7K,GAAAA,CAAC8K,YAAAA,CAAA,CAAa,OAAA,CAAQ,MAAA,CACnB,QAAA,CAAA7C,CAAAA,CAAQ,IAAKlD,CAAAA,EAAQ,CACpB,IAAMgG,CAAAA,CAAarE,EAAe,QAAA,CAAS3B,CAAAA,CAAI,GAAG,CAAA,CAClD,OACE7E,IAAAA,CAAC8K,WAAAA,CAAA,CAEC,QAAA,CAAU,IAAM,CACdrE,EAAAA,CAAmBsE,CAAAA,EACjBF,CAAAA,CAAaE,CAAAA,CAAK,OAAQhC,CAAAA,EAAOA,CAAAA,GAAOlE,EAAI,GAAG,CAAA,CAAI,CAAC,GAAGkG,CAAAA,CAAMlG,CAAAA,CAAI,GAAG,CACtE,EACF,CAAA,CAEA,UAAA/E,GAAAA,CAAC,OAAA,CAAA,CAAM,UAAU,SAAA,CAAU,OAAA,CAAS+K,CAAAA,CAAY,QAAA,CAAU,IAAM,CAAC,CAAA,CAAG,IAAA,CAAK,UAAA,CAAW,EACnFhG,CAAAA,CAAI,IAAA,CAAA,CAAA,CARAA,CAAAA,CAAI,GASX,CAEJ,CAAC,CAAA,CACH,GACF,CAAA,CACA/E,GAAAA,CAACkL,iBAAA,EAAiB,CAAA,CAClBlL,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,QAAA,CACb,QAAA,CAAAA,GAAAA,CAACoE,MAAAA,CAAA,CAAO,SAAA,CAAU,WAAA,CAAY,OAAA,CAAS8E,EAAAA,CAAyB,SAAUxC,CAAAA,CAAe,MAAA,GAAW,EAAG,QAAA,CAAA,+BAAA,CAEvG,CAAA,CACF,GACF,CAAA,CAEAxG,IAAAA,CAACwK,aAAAA,CAAA,CAAc,KAAMlE,CAAAA,CAAuB,YAAA,CAAcC,CAAAA,CACxD,QAAA,CAAA,CAAAzG,IAAC2K,YAAAA,CAAA,CAAa,WAAA,CAAY,gBAAA,CAAiB,EAC3CzK,IAAAA,CAAC0K,WAAAA,CAAA,CAAY,SAAA,CAAU,cAAA,CACrB,UAAA5K,GAAAA,CAAC6K,YAAAA,CAAA,CAAa,QAAA,CAAA,gBAAA,CAAc,EAC5B7K,GAAAA,CAAC8K,YAAAA,CAAA,CAAa,OAAA,CAAQ,OACnB,QAAA,CAAA7C,CAAAA,CAAQ,GAAA,CAAKlD,CAAAA,EAAQ,CACpB,IAAMgG,CAAAA,CAAanE,EAAqB,QAAA,CAAS7B,CAAAA,CAAI,GAAG,CAAA,CACxD,OACE7E,IAAAA,CAAC8K,WAAAA,CAAA,CAEC,QAAA,CAAU,IAAM,CACdnE,CAAAA,CAAyBoE,GACvBF,CAAAA,CAAaE,CAAAA,CAAK,MAAA,CAAQhC,CAAAA,EAAOA,IAAOlE,CAAAA,CAAI,GAAG,EAAI,CAAC,GAAGkG,EAAMlG,CAAAA,CAAI,GAAG,CACtE,EACF,EAEA,QAAA,CAAA,CAAA/E,GAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,UAAU,OAAA,CAAS+K,CAAAA,CAAY,QAAA,CAAU,IAAM,CAAC,CAAA,CAAG,IAAA,CAAK,WAAW,CAAA,CACnFhG,CAAAA,CAAI,OARAA,CAAAA,CAAI,GASX,CAEJ,CAAC,EACH,CAAA,CAAA,CACF,CAAA,CACA/E,GAAAA,CAACkL,gBAAAA,CAAA,EAAiB,CAAA,CAClBlL,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SACb,QAAA,CAAAA,GAAAA,CAACoE,OAAA,CACC,SAAA,CAAU,YACV,OAAA,CAAS+E,EAAAA,CACT,QAAA,CAAUvC,CAAAA,CAAqB,SAAW,CAAA,CAC3C,QAAA,CAAA,oCAAA,CAED,EACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAEA,SAASe,EAAAA,CAAkCwD,CAAAA,CAA8BC,EAAK,GAAA,CAAK,CACjF,IAAIC,CAAAA,CAEJ,OAAO,YAA4BC,CAAAA,CAAa,CAC9C,YAAA,CAAaD,CAAS,EACtBA,CAAAA,CAAY,UAAA,CAAW,IAAMF,CAAAA,CAAG,MAAM,IAAA,CAAMG,CAAI,CAAA,CAAGF,CAAE,EACvD,CACF,CC7jBA,IAAMG,EAAAA,CAAW,EAAA,CAEV,SAASC,EAAAA,EAAoB,CAClC,IAAMlJ,CAAAA,CAAa,UACb,CAAE,MAAA,CAAAwE,CAAO,CAAA,CAAI2E,aAAY,CAEzBC,CAAAA,CADQ,IAAI,eAAA,CAAgB5E,CAAM,EACjB,GAAA,CAAI,IAAI,CAAA,CACzB,CAAE,MAAAnG,CAAM,CAAA,CAAIC,aAAAA,EAAc,CAC1B,CAAE,kBAAA,CAAA+K,CAAmB,CAAA,CAAIC,eAAAA,GACzB,CAAE,QAAA,CAAAC,EAAU,gBAAA,CAAAC,CAAiB,EAAIhL,SAAAA,EAAU,CAC3C,CAAE,MAAA,CAAAD,CAAO,CAAA,CAAIkL,IAAAA,CAAKC,MAAAA,CAAOF,CAAAA,EAAoB,GAAI,WAAW,CAAC,CAAA,CAAED,CAAQ,EACvEI,CAAAA,CAAoBC,wBAAAA,CAAyB,CACjD,gBAAA,CAAkBC,WAAAA,CAAY,WAC9B,cAAA,CAAgB,UAClB,CAAC,CAAA,CAEK,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIhL,QAAAA,CAAsB,EAAE,CAAA,CAExDiL,CAAAA,CAAYZ,CAAAA,CAAW,CAAE,GAAA,CAAKA,CAAS,EAAI,CAAE,GAAA,CAAK,CAAE,IAAA,CAAM,IAAK,CAAE,CAAA,CAajElJ,EAAY,CAAE,KAAA,CAZNC,OAAAA,CAAQ,IAChB,CAAC2J,CAAAA,EAAe,MAAA,CAAO,IAAA,CAAKA,CAAW,EAAE,MAAA,GAAW,CAAA,EAIpDV,EACKY,CAAAA,CAGF,CAAE,IAAK,CAACA,CAAAA,CAAWF,CAAW,CAAE,EACtC,CAACV,CAAAA,CAAUU,CAAW,CAAC,EAEC,OAAA,CAAS,CAAE,MAAA,CAAQ,CAAA,CAAG,MAAOb,EAAAA,CAAU,IAAA,CAAM,CAAC,CAAE,UAAA,CAAY,MAAO,CAAC,CAAE,CAAE,CAAA,CAE7F,CAAE,SAAA,CAAA5I,CAAAA,CAAW,UAAA4J,CAAAA,CAAW,KAAA,CAAAC,EAAO,IAAA,CAAA9J,CAAAA,CAAM,iBAAA,CAAA+J,CAAkB,EAAI7J,cAAAA,CAAe,CAC9E,iBAAkBN,CAAc,CAChC,OAAAzB,CAAAA,CACA,KAAA,CAAAF,CAAAA,CACA,SAAA,CAAA6B,CACF,CAAC,CAAA,CAEKkK,CAAAA,CAAyBzF,MAAAA,CAAsB,IAAI,CAAA,CACnD0F,CAAAA,CAAmBhK,CAAAA,GAAcD,CAAAA,EAAQ,MAAQA,CAAAA,CAAK,MAAA,GAAW,GAGjEkK,CAAAA,CAA2B3J,WAAAA,CAC9B4J,GAAgD,CAC/C,IAAMC,CAAAA,CAAYpK,CAAAA,EAAM,QAAU,CAAA,CAElC,GAAI,CAAAC,CAAAA,EAIAkK,GAAuBL,CAAAA,CAAQ,CAAA,EAAKM,CAAAA,CAAY,CAAA,CAAG,CACrD,GAAM,CAAE,aAAAC,CAAAA,CAAc,SAAA,CAAAC,EAAW,YAAA,CAAAC,CAAa,CAAA,CAAIJ,CAAAA,CAC5CK,EAAYH,CAAAA,CAAeC,CAAAA,CAAYC,CAAAA,CACvCE,CAAAA,CAAY,KAAK,GAAA,CAAI,GAAA,CAAK,IAAA,CAAK,KAAA,CAAMF,EAAe,GAAI,CAAC,EAG/D,GAAIC,CAAAA,CAAYC,GAAaL,CAAAA,CAAYN,CAAAA,CAAO,CAC9C,GAAIE,EAAuB,OAAA,GAAYI,CAAAA,CACrC,OAGFJ,CAAAA,CAAuB,QAAUI,CAAAA,CAEjCP,CAAAA,CAAU,CACR,SAAA,CAAW,CACT,OAAA,CAAS,CACP,OAAQ7J,CAAAA,EAAM,MAAA,EAAU,EACxB,KAAA,CAAO6I,EACT,CACF,CACF,CAAC,EACH,CACF,CACF,CAAA,CACA,CAACiB,CAAAA,CAAO9J,CAAAA,EAAM,MAAA,CAAQ6J,CAAAA,CAAW5J,CAAS,CAC5C,CAAA,CAEMyK,EAAc,KAAA,CAAM7B,EAAQ,EAAE,IAAA,CAAK,EAAE,CAAA,CACrC8B,EAAiBC,EAAAA,CAAkBrB,CAAiB,CAAA,CAE1D,OAAIQ,EAEAzM,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CACb,SAAAA,GAAAA,CAACuN,eAAAA,CAAA,EAAgB,CAAA,CACnB,CAAA,CAKFrN,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CACb,QAAA,CAAA,CAAAF,IAACwN,WAAAA,CAAA,EAAY,CAAA,CACbxN,GAAAA,CAAC,MAAG,SAAA,CAAU,uEAAA,CAAwE,QAAA,CAAA,eAAA,CAAa,CAAA,CACjG2L,EAkBE,IAAA,CAjBF3L,GAAAA,CAACyN,UAAA,CACC,UAAA,CAAY,CAAE,GAAA,CAAK,SAAU,CAAA,CAC7B,OAAA,CAASd,EAAmBU,CAAAA,CAAiBpB,CAAAA,CAC7C,KAAMU,CAAAA,CAAmBS,CAAAA,CAAe1K,GAAQ,EAAC,CACjD,UAAA,CAAYyJ,WAAAA,CAAY,KACxB,QAAA,CAAUZ,EAAAA,CACV,SAAW5G,CAAAA,EAAM,CACfiI,EAAyBjI,CAAAA,CAAE,aAA+B,EAC5D,CAAA,CACA,iBAAmBkB,CAAAA,EACjB7F,GAAAA,CAAC4F,EAAAA,CAAA,CACC,WAAYuG,WAAAA,CAAY,IAAA,CACxB,KAAA,CAAOtG,CAAAA,CACP,oBAAsB6H,CAAAA,EAAMrB,CAAAA,CAAeqB,CAAC,CAAA,CAC9C,CAAA,CAEJ,EAEF1N,GAAAA,CAAC2N,MAAAA,CAAA,EAAO,CAAA,CAAA,CACV,CAEJ,CAQA,SAASL,EAAAA,CAAkBM,CAAAA,CAAgD,CACzE,OAAOA,CAAAA,CAAQ,GAAA,CAAKC,CAAAA,GAAY,CAC9B,GAAGA,CAAAA,CACH,KAAM,IAAM7N,GAAAA,CAAC8N,SAAA,CAAS,SAAA,CAAU,kBAAA,CAAmB,KAAA,CAAO,CAAE,SAAA,CAAW,KAAA,CAAO,YAAA,CAAc,KAAM,EAAG,CACvG,CAAA,CAAE,CACJ,CC/IO,SAASC,EAAAA,EAAoB,CAClC,OACE7N,IAAAA,CAAC8N,oBAAA,CAAoB,WAAA,CAAY,YAAA,CAAa,SAAA,CAAU,YACtD,QAAA,CAAA,CAAAhO,GAAAA,CAACiO,cAAAA,CAAA,CAAe,UAAU,QAAA,CAAS,WAAA,CAAY,MAC7C,QAAA,CAAAjO,GAAAA,CAAC,OAAI,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAA,GAAAA,CAACwL,GAAA,EAAK,CAAA,CACR,CAAA,CACF,CAAA,CACAxL,IAACkO,eAAAA,CAAA,CAAgB,SAAA,CAAU,2CAAA,CAA4C,WAAU,IAAA,CAAC,CAAA,CAClFlO,IAACiO,cAAAA,CAAA,CAAe,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,CACxC,QAAA,CAAAjO,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACb,QAAA,CAAAA,IAACU,EAAAA,CAAA,EAAQ,CAAA,CACX,CAAA,CACF,GACF,CAEJ,CClBO,SAASyN,EAAAA,EAA8B,CAC5C,OAAO,CACL,KAAM,uBAAA,CACN,WAAA,CAAa,CACX,IAAA,CAAM,CACJ,CACE,IAAA,CAAM,eAAA,CACN,IAAA,CAAMnO,IAACoO,SAAAA,CAAA,CAAc,YAAa,GAAA,CAAK,CAAA,CACvC,MAAO,eAAA,CACP,SAAA,CAAWpO,GAAAA,CAAC+N,EAAAA,CAAA,EAAK,CAAA,CACjB,MAAA,CAAQ,EACV,CACF,EACA,aAAA,CAAe,CACb,iBAAA,CAAmB,CACjB,UAAW1O,EAAAA,CACX,WAAA,CAAa,2CACf,CACF,CACF,CACF,CACF","file":"index.js","sourcesContent":["import { JSX } from 'react';\nimport { IMAGES_BASE_URL } from '@flexkit/studio';\nimport { Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger } from '@flexkit/studio/ui';\nimport type { ComponentType } from 'react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: string }): JSX.Element | null {\n if (!value) {\n return null;\n }\n\n const path = value;\n\n const isImage = /\\.(png|jpe?g|gif|webp|avif|svg)$/i.test(path);\n\n const getExtensionFromPath = (p: string): string => {\n const [clean] = p.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n };\n\n const thumbnaillUrl = path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=84&h=84&f=webp`;\n\n const fullUrl = path.endsWith('.svg') ? `${IMAGES_BASE_URL}${path}` : `${IMAGES_BASE_URL}${path}?w=624&h=624&f=webp`;\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n {isImage ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n src={thumbnaillUrl}\n alt=\"asset\"\n className={`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground}`}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n src={fullUrl}\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground}`}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto\">\n {(() => {\n const ext = getExtensionFromPath(path);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return <FileTypeIconCompat extension={ext} {...(style || {})} />;\n })()}\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk:text-sm fk:text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n );\n}\n","import { JSX, useCallback, useMemo, useState } from 'react';\nimport { Loader2, PlusIcon, TagIcon, Ellipsis } from 'lucide-react';\nimport {\n Button,\n Input,\n ScrollArea,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n DialogTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport {\n gql,\n useAppContext,\n useEntityMutation,\n useEntityQuery,\n getEntityDeleteMutation,\n useConfig,\n} from '@flexkit/studio';\nimport { getEntityCreateMutation, getEntityQuery, getEntityUpdateMutation } from '@flexkit/studio';\nimport type { EntityData, FormEntityItem } from '@flexkit/studio';\n\ntype TagItem = { _id: string; name: string };\n\nexport function Sidebar(): JSX.Element {\n const { scope } = useAppContext();\n const { currentProjectSchema: schema } = useConfig();\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [newTagName, setNewTagName] = useState<string>('');\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState<boolean>(false);\n const [tagToDelete, setTagToDelete] = useState<TagItem | null>(null);\n const [isEditOpen, setIsEditOpen] = useState<boolean>(false);\n const [tagToEdit, setTagToEdit] = useState<TagItem | null>(null);\n const [editTagName, setEditTagName] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\n\n const entityName = '_tag';\n const entityNamePlural = '_tags';\n const variables = useMemo(() => ({ where: {}, options: { limit: 200, offset: 0, sort: [{ name: 'ASC' }] } }), []);\n const { data, isLoading } = useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables,\n });\n\n const tags: TagItem[] = (Array.isArray(data) ? (data as unknown[]) : []).map((item) => {\n const it = item as { _id: string; name: string };\n return { _id: it._id, name: it.name };\n });\n\n const handleCreate = useCallback(async (): Promise<void> => {\n const name = newTagName.trim();\n\n if (!name) {\n return;\n }\n\n setIsSubmitting(true);\n const _id = typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}`;\n const entityData = { name: { value: name, disabled: false, scope: 'default' } } as unknown as EntityData;\n const mutation = getEntityCreateMutation(entityNamePlural, schema, entityData, _id);\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setNewTagName('');\n setIsDialogOpen(false);\n resolve();\n },\n });\n runMutation(true);\n });\n setIsSubmitting(false);\n }, [entityNamePlural, runMutation, schema, scope, setMutation, setOptions, newTagName]);\n\n const handleDelete = useCallback(\n async (_id: string): Promise<void> => {\n setIsDeleting(true);\n const mutation = getEntityDeleteMutation(entityName, schema, _id);\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n resolve();\n },\n });\n runMutation(true);\n });\n setIsDeleting(false);\n },\n [entityName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions]\n );\n\n const handleRename = useCallback(async (): Promise<void> => {\n const name = editTagName.trim();\n\n if (!name || !tagToEdit) {\n return;\n }\n\n setIsSubmitting(true);\n\n const dataToMutate = { name: { value: name, disabled: false, scope: 'default' } } as unknown as EntityData;\n const originalData = {} as unknown as FormEntityItem;\n const mutation = getEntityUpdateMutation(\n entityNamePlural,\n tagToEdit._id,\n scope,\n schema,\n originalData,\n dataToMutate\n );\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: tagToEdit._id } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setIsEditOpen(false);\n setTagToEdit(null);\n setEditTagName('');\n resolve();\n },\n });\n runMutation(true);\n });\n\n setIsSubmitting(false);\n }, [editTagName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions, tagToEdit]);\n\n return (\n <div className=\"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6\">\n <TagIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight\">Tags</span>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogTrigger asChild>\n <Button variant=\"secondary\" size=\"icon\" className=\"fk:ml-auto fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Create a new tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={newTagName}\n placeholder=\"New tag name\"\n onChange={(e) => setNewTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleCreate();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button disabled={isSubmitting} onClick={handleCreate} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Add\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add tag</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n\n <ScrollArea className=\"fk:h-full\">\n <div className=\"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2\">\n {isLoading ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">Loading...</div>\n ) : tags.length === 0 ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">No tags yet</div>\n ) : (\n tags.map((tag) => (\n <div\n key={tag._id}\n className=\"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1\"\n >\n <span className=\"fk:text-sm\">{tag.name}</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${tag.name}`}\n title={`Actions for ${tag.name}`}\n variant=\"ghost\"\n size=\"icon\"\n className=\"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground\"\n >\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem\n onClick={() => {\n setTagToEdit(tag);\n setEditTagName(tag.name);\n setIsEditOpen(true);\n }}\n >\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n onClick={() => {\n setTagToDelete(tag);\n setIsDeleteOpen(true);\n }}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n <Dialog open={isEditOpen} onOpenChange={setIsEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Rename an existing tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={editTagName}\n placeholder=\"Tag name\"\n onChange={(e) => setEditTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleRename();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n disabled={isSubmitting}\n variant=\"secondary\"\n onClick={() => {\n setIsEditOpen(false);\n setTagToEdit(null);\n }}\n >\n Cancel\n </Button>\n <Button disabled={isSubmitting} onClick={handleRename} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog open={isDeleteOpen} onOpenChange={setIsDeleteOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Confirm deletion of a tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:text-sm fk:text-muted-foreground\">\n Are you sure you want to delete the tag{' '}\n <span className=\"fk:font-semibold fk:text-foreground\">{tagToDelete?.name}</span>?\n </div>\n <DialogFooter>\n <Button\n disabled={isDeleting}\n variant=\"secondary\"\n onClick={() => {\n setIsDeleteOpen(false);\n setTagToDelete(null);\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isDeleting}\n variant=\"destructive\"\n onClick={() => {\n if (!tagToDelete) {\n return;\n }\n\n void (async () => {\n await handleDelete(tagToDelete._id);\n setIsDeleteOpen(false);\n setTagToDelete(null);\n })();\n }}\n >\n {isDeleting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","'use client';\n\nimport { JSX, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FilePlayIcon,\n ImageIcon,\n ImagePlayIcon,\n LayersIcon,\n ListChecks,\n MinusIcon,\n SplinePointerIcon,\n TagIcon,\n Trash2Icon,\n LoaderCircle,\n Search as SearchIcon,\n X as ResetIcon,\n} from 'lucide-react';\nimport type { ReactTable, SearchRequestProps } from '@flexkit/studio';\nimport {\n Button,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n} from '@flexkit/studio/ui';\nimport {\n DataTableFacetedFilter,\n useParams,\n useUploadAssets,\n useDispatch,\n useEntityQuery,\n useEntityMutation,\n useAppContext,\n gql,\n useConfig,\n getEntityUpdateMutation,\n useSearch,\n} from '@flexkit/studio';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n table: ReactTable<TData>;\n onSearchWhereChange?: (where: WhereClause) => void;\n}\n\ntype WhereClause = { [key: string]: unknown };\n\nconst mimeTypes = [\n {\n value: 'image/gif',\n label: 'GIF',\n icon: ImagePlayIcon,\n },\n {\n value: 'image/jpeg',\n label: 'JPEG',\n icon: ImageIcon,\n },\n {\n value: 'video/mp4',\n label: 'MP4',\n icon: FilePlayIcon,\n },\n {\n value: 'image/png',\n label: 'PNG',\n icon: LayersIcon,\n },\n {\n value: 'image/svg+xml',\n label: 'SVG',\n icon: SplinePointerIcon,\n },\n {\n value: 'image/webp',\n label: 'WebP',\n icon: ImageIcon,\n },\n];\n\nexport function DataTableToolbar<TData>({\n entityName,\n table,\n onSearchWhereChange,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0;\n const { projectId } = useParams();\n const uploadAssets = useUploadAssets();\n const dispatch = useDispatch();\n const { scope } = useAppContext();\n const [isTagDialogOpen, setIsTagDialogOpen] = useState(false);\n const [isRemoveTagDialogOpen, setIsRemoveTagDialogOpen] = useState(false);\n const [selectedTagIds, setSelectedTagIds] = useState<string[]>([]);\n const [selectedRemoveTagIds, setSelectedRemoveTagIds] = useState<string[]>([]);\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const { currentProjectSchema: schema } = useConfig();\n const [search, setSearch] = useState('');\n const textWhereRef = useRef<WhereClause>({});\n const filterWhereRef = useRef<WhereClause>({});\n\n function getBaseSearchRequest(): SearchRequestProps {\n return {\n searchRequests: {\n searches: [{ collection: '_assets' }, { collection: '_tags' }],\n },\n commonParams: { q: '' },\n };\n }\n\n const baseSearchRequest = useMemo(() => getBaseSearchRequest(), []);\n const [searchQuery, setSearchQuery] = useState<SearchRequestProps>(baseSearchRequest);\n const { results, isLoading } = useSearch(projectId ?? '', searchQuery);\n const lastWhereRef = useRef<string>('');\n\n const debouncedSetSearchQuery = useCallback(\n debounce((query: string) => {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: query } });\n }, 300),\n [baseSearchRequest]\n );\n\n async function handleUpload(): Promise<void> {\n await uploadAssets({ projectId, accept: 'image/*', multiple: true, maxBytes: 4 * 1024 * 1024 });\n }\n\n // Collect selected entity ids from the table\n const selectedIds: string[] = table\n .getSelectedRowModel()\n .rows.map((row) => (row.original as unknown as { _id: string })._id);\n\n // Load tags for the selector\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: { where: {}, options: { limit: 500, offset: 0, sort: [{ name: 'ASC' }] } },\n });\n const allTags = Array.isArray(tagsData)\n ? (tagsData as unknown[]).map((t) => ({ _id: (t as { _id: string })._id, name: (t as { name: string }).name }))\n : [];\n\n // Load a sample of assets to derive dynamic mime type options\n const { data: mimeSampleData } = useEntityQuery({\n entityNamePlural: '_assets',\n schema,\n scope,\n variables: { where: {}, options: { limit: 500, offset: 0, sort: [{ _updatedAt: 'DESC' }] } },\n });\n\n type AssetItem = { _id: string; mimeType?: string | null };\n\n function getMimeLabel(mime: string): string {\n if (mime === 'image/gif') {\n return 'GIF';\n }\n\n if (mime === 'image/jpeg') {\n return 'JPEG';\n }\n\n if (mime === 'video/mp4') {\n return 'MP4';\n }\n\n if (mime === 'image/png') {\n return 'PNG';\n }\n\n if (mime === 'image/svg+xml') {\n return 'SVG';\n }\n\n if (mime === 'image/webp') {\n return 'WebP';\n }\n\n const parts = mime.split('/');\n\n if (parts.length === 2 && parts[1]) {\n return parts[1].toUpperCase();\n }\n\n return mime;\n }\n\n function getMimeIcon(mime: string) {\n if (mime === 'image/svg+xml') {\n return SplinePointerIcon;\n }\n\n if (mime.startsWith('image/')) {\n return ImageIcon;\n }\n\n if (mime.startsWith('video/')) {\n return FilePlayIcon;\n }\n\n return LayersIcon;\n }\n\n const dynamicMimeOptions = useMemo(() => {\n const items = Array.isArray(mimeSampleData) ? (mimeSampleData as unknown as AssetItem[]) : [];\n const unique = new Set<string>();\n\n for (const item of items) {\n const value = item.mimeType ?? '';\n\n if (value) {\n unique.add(value);\n }\n }\n\n const values = Array.from(unique.values()).sort();\n\n return values.map((value) => ({ value, label: getMimeLabel(value), icon: getMimeIcon(value) }));\n }, [mimeSampleData]);\n\n const mimeTypeOptions = dynamicMimeOptions.length > 0 ? dynamicMimeOptions : mimeTypes;\n\n const tagOptions = useMemo(() => {\n return allTags.map((t) => ({ value: t._id, label: t.name }));\n }, [allTags]);\n\n function emitCombinedWhere(): void {\n if (!onSearchWhereChange) {\n return;\n }\n\n const clauses: WhereClause[] = [];\n\n if (Object.keys(textWhereRef.current).length > 0) {\n clauses.push(textWhereRef.current);\n }\n\n if (Object.keys(filterWhereRef.current).length > 0) {\n clauses.push(filterWhereRef.current);\n }\n\n const combinedWhere = clauses.length === 0 ? {} : clauses.length === 1 ? clauses[0] : { AND: clauses };\n const whereKey = JSON.stringify(combinedWhere);\n\n if (lastWhereRef.current !== whereKey) {\n lastWhereRef.current = whereKey;\n onSearchWhereChange(combinedWhere);\n }\n }\n\n async function handleBatchDelete(): Promise<void> {\n dispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} asset${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected assets? They will be deleted permanently.`\n : `Are you sure you want to delete the selected asset? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionCancel: () => {},\n dialogActionSubmit: () => {\n for (const id of selectedIds) {\n const payload = { entityId: id, entityName, silent: true } as unknown as {\n entityId: string;\n entityName: string;\n };\n dispatch({ type: 'DeleteEntity', payload });\n }\n\n table.resetRowSelection();\n },\n },\n },\n });\n }\n\n const handleAddTagsToSelected = useCallback(async (): Promise<void> => {\n if (selectedIds.length === 0 || selectedTagIds.length === 0) {\n return;\n }\n\n // Build relationship connect for multiple tags\n const dataToMutate = {\n tags: {\n relationships: {\n connect: selectedTagIds.map((id) => ({ _id: id })),\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation('_assets', selectedIds[0] ?? '', scope, schema, {}, dataToMutate as never);\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id_IN: selectedIds } },\n onCompleted: () => resolve(),\n });\n runMutation(true);\n });\n\n setIsTagDialogOpen(false);\n setSelectedTagIds([]);\n table.resetRowSelection();\n }, [runMutation, scope, selectedIds, selectedTagIds, setMutation, setOptions, table]);\n\n const handleRemoveTagsFromSelected = useCallback(async (): Promise<void> => {\n if (selectedIds.length === 0 || selectedRemoveTagIds.length === 0) {\n return;\n }\n\n const dataToMutate = {\n tags: {\n relationships: {\n disconnect: selectedRemoveTagIds,\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation('_assets', selectedIds[0] ?? '', scope, schema, {}, dataToMutate as never);\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id_IN: selectedIds } },\n onCompleted: () => resolve(),\n });\n runMutation(true);\n });\n\n setIsRemoveTagDialogOpen(false);\n setSelectedRemoveTagIds([]);\n table.resetRowSelection();\n }, [runMutation, scope, selectedIds, selectedRemoveTagIds, setMutation, setOptions, table]);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const safeResults = results ?? [];\n const trimmed = search.trim();\n\n let nextWhere: WhereClause = {};\n\n if (trimmed.length === 0) {\n nextWhere = {};\n } else if (safeResults.length === 0) {\n nextWhere = { _id_IN: [] };\n } else {\n const assetIdClauses = safeResults.filter((r) => r._entityNamePlural === '_assets').map((r) => ({ _id: r._id }));\n\n const tagClauses = safeResults\n .filter((r) => r._entityNamePlural === '_tags')\n .map((r) => ({ tagsConnection_SOME: { node: { _id: r._id } } }));\n\n const orClauses = [...assetIdClauses, ...tagClauses];\n nextWhere = orClauses.length > 0 ? { OR: orClauses } : { _id_IN: [] };\n }\n\n textWhereRef.current = nextWhere;\n emitCombinedWhere();\n }, [onSearchWhereChange, results, search]);\n\n // Watch column filter changes (e.g., mime type) and push server-side where\n const columnFiltersKey = JSON.stringify(table.getState().columnFilters);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const mimeFilter = table.getState().columnFilters.find((f) => f.id === 'mimeType');\n const mimeValues = (Array.isArray(mimeFilter?.value) ? (mimeFilter?.value as unknown[]) : []) as string[];\n\n const tagsFilter = table.getState().columnFilters.find((f) => f.id === 'tags');\n const tagValues = (Array.isArray(tagsFilter?.value) ? (tagsFilter?.value as unknown[]) : []) as string[];\n\n const clauses: WhereClause[] = [];\n\n if (mimeValues.length > 0) {\n clauses.push({ mimeType_IN: mimeValues } as WhereClause);\n }\n\n if (tagValues.length > 0) {\n const orTags = tagValues.map((id) => ({ tagsConnection_SOME: { node: { _id: id } } }));\n clauses.push(orTags.length === 1 ? orTags[0] : { OR: orTags });\n }\n\n if (clauses.length === 0) {\n filterWhereRef.current = {};\n } else if (clauses.length === 1) {\n filterWhereRef.current = clauses[0] as WhereClause;\n } else {\n filterWhereRef.current = { AND: clauses } as WhereClause;\n }\n\n emitCombinedWhere();\n }, [columnFiltersKey, onSearchWhereChange, table]);\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n <div className=\"fk:relative\">\n {isLoading ? (\n <LoaderCircle className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <Input\n placeholder=\"Search assets...\"\n name=\"search-assets\"\n value={search}\n onChange={(e) => {\n const { value } = e.target;\n setSearch(value);\n\n if (value.trim().length === 0) {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n\n if (onSearchWhereChange) {\n onSearchWhereChange({});\n }\n\n return;\n }\n\n debouncedSetSearchQuery(value);\n }}\n className=\"fk:h-8 fk:w-[150px] fk:lg:w-[250px] fk:pl-8\"\n />\n {search ? (\n <button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-2 fk:top-2 fk:text-muted-foreground fk:hover:text-foreground\"\n onClick={() => {\n setSearch('');\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n if (onSearchWhereChange) {\n onSearchWhereChange({});\n }\n }}\n type=\"button\"\n >\n <ResetIcon className=\"fk:h-4 fk:w-4\" />\n </button>\n ) : null}\n </div>\n {table.getColumn('mimeType') && (\n <DataTableFacetedFilter column={table.getColumn('mimeType')} title=\"File type\" options={mimeTypeOptions} />\n )}\n {table.getColumn('tags') && (\n <DataTableFacetedFilter column={table.getColumn('tags')} title=\"Tags\" options={tagOptions} />\n )}\n {isFiltered && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n table.resetColumnFilters();\n\n if (onSearchWhereChange) {\n onSearchWhereChange({});\n }\n }}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3\"\n >\n Reset\n <ResetIcon className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n )}\n </div>\n {selectedIds.length > 0 ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8 fk:mr-2 fk:lg:flex\" size=\"sm\" variant=\"secondary\">\n Actions <ListChecks className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[240px]\">\n <DropdownMenuItem onClick={() => setIsTagDialogOpen(true)}>\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Add tag\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setIsRemoveTagDialogOpen(true)}>\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleBatchDelete} className=\"fk:text-destructive\">\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Delete asset{selectedIds.length > 1 ? 's' : ''} (\n {selectedIds.length})\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <Button className=\"fk:ml-auto fk:h-8 fk:lg:flex\" onClick={handleUpload} size=\"sm\" variant=\"default\">\n Upload assets\n </Button>\n\n <CommandDialog open={isTagDialogOpen} onOpenChange={setIsTagDialogOpen}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-[300px]\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedTagIds.includes(tag._id);\n return (\n <CommandItem\n key={tag._id}\n onSelect={() => {\n setSelectedTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button className=\"fk:w-full\" onClick={handleAddTagsToSelected} disabled={selectedTagIds.length === 0}>\n Add tag(s) to selected assets\n </Button>\n </div>\n </CommandDialog>\n\n <CommandDialog open={isRemoveTagDialogOpen} onOpenChange={setIsRemoveTagDialogOpen}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-[300px]\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedRemoveTagIds.includes(tag._id);\n return (\n <CommandItem\n key={tag._id}\n onSelect={() => {\n setSelectedRemoveTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button\n className=\"fk:w-full\"\n onClick={handleRemoveTagsFromSelected}\n disabled={selectedRemoveTagIds.length === 0}\n >\n Remove tag(s) from selected assets\n </Button>\n </div>\n </CommandDialog>\n </div>\n );\n}\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300) {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return function (this: unknown, ...args: TArgs) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n}\n","import { useCallback, useMemo, useRef, useState } from 'react';\nimport { find, propEq } from 'ramda';\nimport {\n assetSchema,\n DataTable,\n useAppContext,\n useConfig,\n useLocation,\n Outlet,\n useEntityQuery,\n useGraphQLError,\n ProjectDisabled,\n SchemaError,\n useGridColumnsDefinition,\n} from '@flexkit/studio';\nimport { Skeleton } from '@flexkit/studio/ui';\nimport type { ColumnDef, SingleProject } from '@flexkit/studio';\nimport { DataTableToolbar } from './data-grid/data-table-toolbar';\n\ntype WhereClause = { [key: string]: unknown };\n\nconst pageSize = 25;\n\nexport function List(): JSX.Element {\n const entityName = '_assets';\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { projects, currentProjectId } = useConfig();\n const { schema } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const columnsDefinition = useGridColumnsDefinition({\n attributesSchema: assetSchema.attributes,\n checkboxSelect: 'multiple',\n });\n\n const [searchWhere, setSearchWhere] = useState<WhereClause>({});\n\n const whereBase = entityId ? { _id: entityId } : { NOT: { path: null } };\n const where = useMemo(() => {\n if (!searchWhere || Object.keys(searchWhere).length === 0) {\n return whereBase;\n }\n\n if (entityId) {\n return whereBase; // ignore search when a single asset is selected via id\n }\n\n return { AND: [whereBase, searchWhere] } as WhereClause;\n }, [entityId, searchWhere]);\n\n const variables = { where, options: { offset: 0, limit: pageSize, sort: [{ _updatedAt: 'DESC' }] } };\n\n const { isLoading, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n });\n\n const lastRequestedOffsetRef = useRef<number | null>(null);\n const isInitialLoading = isLoading && (data == null || data.length === 0);\n\n // called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useCallback(\n (containerRefElement?: HTMLDivElement | null) => {\n const rowsCount = data?.length ?? 0;\n\n if (isLoading) {\n return;\n }\n\n if (containerRefElement && count > 0 && rowsCount > 0) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n const remaining = scrollHeight - scrollTop - clientHeight;\n const threshold = Math.min(500, Math.floor(clientHeight * 0.75));\n\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (remaining < threshold && rowsCount < count) {\n if (lastRequestedOffsetRef.current === rowsCount) {\n return;\n }\n\n lastRequestedOffsetRef.current = rowsCount;\n\n fetchMore({\n variables: {\n options: {\n offset: data?.length ?? 0,\n limit: pageSize,\n },\n },\n });\n }\n }\n },\n [count, data?.length, fetchMore, isLoading]\n );\n\n const loadingData = Array(pageSize).fill({});\n const loadingColumns = getLoadingColumns(columnsDefinition);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <SchemaError />\n <h2 className=\"fk:mb-4 fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Asset Manager</h2>\n {!schemaErrorMessage ? (\n <DataTable\n classNames={{ row: 'fk:h-20' }}\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : (data ?? [])}\n entityName={assetSchema.name}\n pageSize={pageSize}\n onScroll={(e) => {\n fetchMoreOnBottomReached(e.currentTarget as HTMLDivElement);\n }}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n table={table}\n onSearchWhereChange={(w) => setSearchWhere(w)}\n />\n )}\n />\n ) : null}\n <Outlet />\n </div>\n );\n}\n\ntype AttributeValue = {\n _id: string;\n [key: string]: string | AttributeValue | null;\n __typename: string;\n};\n\nfunction getLoadingColumns(columns: object[]): ColumnDef<AttributeValue>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n })) as unknown as ColumnDef<AttributeValue>[];\n}\n","'use client';\n\nimport { JSX } from 'react';\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@flexkit/studio/ui';\nimport { Sidebar } from './sidebar';\nimport { List } from './list';\n\nexport function Root(): JSX.Element {\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"fk:h-full\">\n <ResizablePanel className=\"fk:p-3\" defaultSize=\"82%\">\n <div className=\"fk:flex fk:flex-col fk:h-full\">\n <List />\n </div>\n </ResizablePanel>\n <ResizableHandle className=\"fk:hover:bg-blue-500 fk:transition-colors\" withHandle />\n <ResizablePanel defaultSize=\"18%\" minSize=\"10%\">\n <div className=\"fk:sm:hidden fk:md:block\">\n <Sidebar />\n </div>\n </ResizablePanel>\n </ResizablePanelGroup>\n );\n}\n","import { FileStack as FileStackIcon } from 'lucide-react';\nimport type { PluginOptions } from '@flexkit/studio';\nimport { Asset } from './data-grid/preview-components/asset';\nimport { Root } from './root';\n\nexport function AssetManager(): PluginOptions {\n return {\n name: 'flexkit.asset-manager',\n contributes: {\n apps: [\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: <Root />,\n routes: [],\n },\n ],\n previewFields: {\n assetPreviewField: {\n component: Asset,\n description: 'Asset preview field for the asset manager',\n },\n },\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/data-grid/preview-components/asset.tsx","../src/sidebar.tsx","../src/data-grid/data-table-toolbar.tsx","../src/list.tsx","../src/root.tsx","../src/index.tsx"],"names":["FileTypeIconCompat","FileTypeIcon","transparentImageBackground","Asset","value","path","isImage","getExtensionFromPath","p","clean","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","TooltipPortal","TooltipContent","ext","style","defaultStyles","Sidebar","scope","useAppContext","schema","useConfig","runMutation","setMutation","setOptions","useEntityMutation","newTagName","setNewTagName","useState","isDialogOpen","setIsDialogOpen","isDeleteOpen","setIsDeleteOpen","tagToDelete","setTagToDelete","isEditOpen","setIsEditOpen","tagToEdit","setTagToEdit","editTagName","setEditTagName","isSubmitting","setIsSubmitting","isDeleting","setIsDeleting","entityName","entityNamePlural","variables","useMemo","data","isLoading","useEntityQuery","tags","item","it","handleCreate","useCallback","name","_id","mutation","getEntityCreateMutation","entityQuery","getEntityQuery","refreshQuery","gql","resolve","handleDelete","getEntityDeleteMutation","handleRename","dataToMutate","originalData","getEntityUpdateMutation","TagIcon","Dialog","DialogTrigger","Button","PlusIcon","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","DialogFooter","Loader2","ScrollArea","tag","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","mimeTypes","ImagePlayIcon","ImageIcon","FilePlayIcon","LayersIcon","SplinePointerIcon","DataTableToolbar","table","onSearchWhereChange","isFiltered","projectId","useParams","uploadAssets","useUploadAssets","dispatch","useDispatch","isTagDialogOpen","setIsTagDialogOpen","isRemoveTagDialogOpen","setIsRemoveTagDialogOpen","selectedTagIds","setSelectedTagIds","selectedRemoveTagIds","setSelectedRemoveTagIds","search","setSearch","textWhereRef","useRef","filterWhereRef","getBaseSearchRequest","baseSearchRequest","searchQuery","setSearchQuery","results","useSearch","lastWhereRef","debouncedSetSearchQuery","debounce","query","handleUpload","selectedIds","row","tagsData","allTags","t","mimeSampleData","getMimeLabel","mime","getMimeIcon","dynamicMimeOptions","items","unique","mimeTypeOptions","tagOptions","emitCombinedWhere","clauses","combinedWhere","whereKey","handleBatchDelete","id","handleAddTagsToSelected","handleRemoveTagsFromSelected","useEffect","safeResults","trimmed","nextWhere","assetIdClauses","r","tagClauses","orClauses","columnFiltersKey","mimeFilter","f","mimeValues","tagsFilter","tagValues","orTags","LoaderCircle","SearchIcon","ResetIcon","DataTableFacetedFilter","ListChecks","MinusIcon","Trash2Icon","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","prev","CommandSeparator","fn","ms","timeoutId","args","pageSize","List","useLocation","entityId","schemaErrorMessage","useGraphQLError","projects","currentProjectId","find","propEq","columnsDefinition","useGridColumnsDefinition","assetSchema","searchWhere","setSearchWhere","whereBase","fetchMore","count","isProjectDisabled","lastRequestedOffsetRef","isInitialLoading","fetchMoreOnBottomReached","containerRefElement","rowsCount","scrollHeight","scrollTop","clientHeight","remaining","threshold","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","DataTable","w","Outlet","columns","column","Skeleton","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle","AssetManager","FileStackIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { JSX } from 'react';\nimport { IMAGES_BASE_URL } from '@flexkit/studio';\nimport { Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger } from '@flexkit/studio/ui';\nimport type { ComponentType } from 'react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: string }): JSX.Element | null {\n if (!value) {\n return null;\n }\n\n const path = value;\n\n const isImage = /\\.(png|jpe?g|gif|webp|avif|svg)$/i.test(path);\n\n const getExtensionFromPath = (p: string): string => {\n const [clean] = p.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n };\n\n const thumbnaillUrl = path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=84&h=84&f=webp`;\n\n const fullUrl = path.endsWith('.svg') ? `${IMAGES_BASE_URL}${path}` : `${IMAGES_BASE_URL}${path}?w=624&h=624&f=webp`;\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n {isImage ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n src={thumbnaillUrl}\n alt=\"asset\"\n className={`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground}`}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n src={fullUrl}\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground}`}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto\">\n {(() => {\n const ext = getExtensionFromPath(path);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return <FileTypeIconCompat extension={ext} {...(style || {})} />;\n })()}\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk:text-sm fk:text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n );\n}\n","import { JSX, useCallback, useMemo, useState } from 'react';\nimport { Loader2, PlusIcon, TagIcon, Ellipsis } from 'lucide-react';\nimport {\n Button,\n Input,\n ScrollArea,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n DialogTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport {\n gql,\n useAppContext,\n useEntityMutation,\n useEntityQuery,\n getEntityDeleteMutation,\n useConfig,\n} from '@flexkit/studio';\nimport { getEntityCreateMutation, getEntityQuery, getEntityUpdateMutation } from '@flexkit/studio';\nimport type { EntityData, FormEntityItem } from '@flexkit/studio';\n\ntype TagItem = { _id: string; name: string };\n\nexport function Sidebar(): JSX.Element {\n const { scope } = useAppContext();\n const { currentProjectSchema: schema } = useConfig();\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [newTagName, setNewTagName] = useState<string>('');\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState<boolean>(false);\n const [tagToDelete, setTagToDelete] = useState<TagItem | null>(null);\n const [isEditOpen, setIsEditOpen] = useState<boolean>(false);\n const [tagToEdit, setTagToEdit] = useState<TagItem | null>(null);\n const [editTagName, setEditTagName] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\n\n const entityName = '_tag';\n const entityNamePlural = '_tags';\n const variables = useMemo(() => ({ where: {}, limit: 200, offset: 0, sort: [{ name: 'ASC' }] }), []);\n const { data, isLoading } = useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables,\n });\n\n const tags: TagItem[] = (Array.isArray(data) ? (data as unknown[]) : []).map((item) => {\n const it = item as { _id: string; name: string };\n return { _id: it._id, name: it.name };\n });\n\n const handleCreate = useCallback(async (): Promise<void> => {\n const name = newTagName.trim();\n\n if (!name) {\n return;\n }\n\n setIsSubmitting(true);\n const _id = typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}`;\n const entityData = { name: { value: name, disabled: false, scope: 'default' } } as unknown as EntityData;\n const mutation = getEntityCreateMutation(entityNamePlural, schema, entityData, _id);\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setNewTagName('');\n setIsDialogOpen(false);\n resolve();\n },\n });\n runMutation(true);\n });\n setIsSubmitting(false);\n }, [entityNamePlural, runMutation, schema, scope, setMutation, setOptions, newTagName]);\n\n const handleDelete = useCallback(\n async (_id: string): Promise<void> => {\n setIsDeleting(true);\n const mutation = getEntityDeleteMutation(entityName, schema, _id);\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: _id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n resolve();\n },\n });\n runMutation(true);\n });\n setIsDeleting(false);\n },\n [entityName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions]\n );\n\n const handleRename = useCallback(async (): Promise<void> => {\n const name = editTagName.trim();\n\n if (!name || !tagToEdit) {\n return;\n }\n\n setIsSubmitting(true);\n\n const dataToMutate = { name: { value: name, disabled: false, scope: 'default' } } as unknown as EntityData;\n const originalData = {} as unknown as FormEntityItem;\n const mutation = getEntityUpdateMutation(\n entityNamePlural,\n tagToEdit._id,\n scope,\n schema,\n originalData,\n dataToMutate\n );\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: tagToEdit._id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setIsEditOpen(false);\n setTagToEdit(null);\n setEditTagName('');\n resolve();\n },\n });\n runMutation(true);\n });\n\n setIsSubmitting(false);\n }, [editTagName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions, tagToEdit]);\n\n return (\n <div className=\"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6\">\n <TagIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight\">Tags</span>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogTrigger asChild>\n <Button variant=\"secondary\" size=\"icon\" className=\"fk:ml-auto fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Create a new tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={newTagName}\n placeholder=\"New tag name\"\n onChange={(e) => setNewTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleCreate();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button disabled={isSubmitting} onClick={handleCreate} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Add\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add tag</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n\n <ScrollArea className=\"fk:h-full\">\n <div className=\"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2\">\n {isLoading ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">Loading...</div>\n ) : tags.length === 0 ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">No tags yet</div>\n ) : (\n tags.map((tag) => (\n <div\n key={tag._id}\n className=\"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1\"\n >\n <span className=\"fk:text-sm\">{tag.name}</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${tag.name}`}\n title={`Actions for ${tag.name}`}\n variant=\"ghost\"\n size=\"icon\"\n className=\"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground\"\n >\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem\n onClick={() => {\n setTagToEdit(tag);\n setEditTagName(tag.name);\n setIsEditOpen(true);\n }}\n >\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n onClick={() => {\n setTagToDelete(tag);\n setIsDeleteOpen(true);\n }}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n <Dialog open={isEditOpen} onOpenChange={setIsEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Rename an existing tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={editTagName}\n placeholder=\"Tag name\"\n onChange={(e) => setEditTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleRename();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n disabled={isSubmitting}\n variant=\"secondary\"\n onClick={() => {\n setIsEditOpen(false);\n setTagToEdit(null);\n }}\n >\n Cancel\n </Button>\n <Button disabled={isSubmitting} onClick={handleRename} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog open={isDeleteOpen} onOpenChange={setIsDeleteOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Confirm deletion of a tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:text-sm fk:text-muted-foreground\">\n Are you sure you want to delete the tag{' '}\n <span className=\"fk:font-semibold fk:text-foreground\">{tagToDelete?.name}</span>?\n </div>\n <DialogFooter>\n <Button\n disabled={isDeleting}\n variant=\"secondary\"\n onClick={() => {\n setIsDeleteOpen(false);\n setTagToDelete(null);\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isDeleting}\n variant=\"destructive\"\n onClick={() => {\n if (!tagToDelete) {\n return;\n }\n\n void (async () => {\n await handleDelete(tagToDelete._id);\n setIsDeleteOpen(false);\n setTagToDelete(null);\n })();\n }}\n >\n {isDeleting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","'use client';\n\nimport { JSX, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FilePlayIcon,\n ImageIcon,\n ImagePlayIcon,\n LayersIcon,\n ListChecks,\n MinusIcon,\n SplinePointerIcon,\n TagIcon,\n Trash2Icon,\n LoaderCircle,\n Search as SearchIcon,\n X as ResetIcon,\n} from 'lucide-react';\nimport type { ReactTable, SearchRequestProps } from '@flexkit/studio';\nimport {\n Button,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n} from '@flexkit/studio/ui';\nimport {\n DataTableFacetedFilter,\n useParams,\n useUploadAssets,\n useDispatch,\n useEntityQuery,\n useEntityMutation,\n useAppContext,\n gql,\n useConfig,\n getEntityUpdateMutation,\n useSearch,\n} from '@flexkit/studio';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n table: ReactTable<TData>;\n onSearchWhereChange?: (where: WhereClause) => void;\n}\n\ntype WhereClause = { [key: string]: unknown };\n\nconst mimeTypes = [\n {\n value: 'image/gif',\n label: 'GIF',\n icon: ImagePlayIcon,\n },\n {\n value: 'image/jpeg',\n label: 'JPEG',\n icon: ImageIcon,\n },\n {\n value: 'video/mp4',\n label: 'MP4',\n icon: FilePlayIcon,\n },\n {\n value: 'image/png',\n label: 'PNG',\n icon: LayersIcon,\n },\n {\n value: 'image/svg+xml',\n label: 'SVG',\n icon: SplinePointerIcon,\n },\n {\n value: 'image/webp',\n label: 'WebP',\n icon: ImageIcon,\n },\n];\n\nexport function DataTableToolbar<TData>({\n entityName,\n table,\n onSearchWhereChange,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0;\n const { projectId } = useParams();\n const uploadAssets = useUploadAssets();\n const dispatch = useDispatch();\n const { scope } = useAppContext();\n const [isTagDialogOpen, setIsTagDialogOpen] = useState(false);\n const [isRemoveTagDialogOpen, setIsRemoveTagDialogOpen] = useState(false);\n const [selectedTagIds, setSelectedTagIds] = useState<string[]>([]);\n const [selectedRemoveTagIds, setSelectedRemoveTagIds] = useState<string[]>([]);\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const { currentProjectSchema: schema } = useConfig();\n const [search, setSearch] = useState('');\n const textWhereRef = useRef<WhereClause>({});\n const filterWhereRef = useRef<WhereClause>({});\n\n function getBaseSearchRequest(): SearchRequestProps {\n return {\n searchRequests: {\n searches: [{ collection: '_assets' }, { collection: '_tags' }],\n },\n commonParams: { q: '' },\n };\n }\n\n const baseSearchRequest = useMemo(() => getBaseSearchRequest(), []);\n const [searchQuery, setSearchQuery] = useState<SearchRequestProps>(baseSearchRequest);\n const { results, isLoading } = useSearch(projectId ?? '', searchQuery);\n const lastWhereRef = useRef<string>('');\n\n const debouncedSetSearchQuery = useCallback(\n debounce((query: string) => {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: query } });\n }, 300),\n [baseSearchRequest]\n );\n\n async function handleUpload(): Promise<void> {\n await uploadAssets({ projectId, accept: 'image/*', multiple: true, maxBytes: 4 * 1024 * 1024 });\n }\n\n // Collect selected entity ids from the table\n const selectedIds: string[] = table\n .getSelectedRowModel()\n .rows.map((row) => (row.original as unknown as { _id: string })._id);\n\n // Load tags for the selector\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: { where: {}, limit: 500, offset: 0, sort: [{ name: 'ASC' }] },\n });\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((t) => ({ _id: (t as { _id: string })._id, name: (t as { name: string }).name }));\n }, [tagsData]);\n\n // Load a sample of assets to derive dynamic mime type options\n const { data: mimeSampleData } = useEntityQuery({\n entityNamePlural: '_assets',\n schema,\n scope,\n variables: { where: {}, limit: 500, offset: 0, sort: [{ _updatedAt: 'DESC' }] },\n });\n\n type AssetItem = { _id: string; mimeType?: string | null };\n\n function getMimeLabel(mime: string): string {\n if (mime === 'image/gif') {\n return 'GIF';\n }\n\n if (mime === 'image/jpeg') {\n return 'JPEG';\n }\n\n if (mime === 'video/mp4') {\n return 'MP4';\n }\n\n if (mime === 'image/png') {\n return 'PNG';\n }\n\n if (mime === 'image/svg+xml') {\n return 'SVG';\n }\n\n if (mime === 'image/webp') {\n return 'WebP';\n }\n\n const parts = mime.split('/');\n\n if (parts.length === 2 && parts[1]) {\n return parts[1].toUpperCase();\n }\n\n return mime;\n }\n\n function getMimeIcon(mime: string) {\n if (mime === 'image/svg+xml') {\n return SplinePointerIcon;\n }\n\n if (mime.startsWith('image/')) {\n return ImageIcon;\n }\n\n if (mime.startsWith('video/')) {\n return FilePlayIcon;\n }\n\n return LayersIcon;\n }\n\n const dynamicMimeOptions = useMemo(() => {\n const items = Array.isArray(mimeSampleData) ? (mimeSampleData as unknown as AssetItem[]) : [];\n const unique = new Set<string>();\n\n for (const item of items) {\n const value = item.mimeType ?? '';\n\n if (value) {\n unique.add(value);\n }\n }\n\n const values = Array.from(unique.values()).sort();\n\n return values.map((value) => ({ value, label: getMimeLabel(value), icon: getMimeIcon(value) }));\n }, [mimeSampleData]);\n\n const mimeTypeOptions = dynamicMimeOptions.length > 0 ? dynamicMimeOptions : mimeTypes;\n\n const tagOptions = useMemo(() => {\n return allTags.map((t) => ({ value: t._id, label: t.name }));\n }, [allTags]);\n\n function emitCombinedWhere(): void {\n if (!onSearchWhereChange) {\n return;\n }\n\n const clauses: WhereClause[] = [];\n\n if (Object.keys(textWhereRef.current).length > 0) {\n clauses.push(textWhereRef.current);\n }\n\n if (Object.keys(filterWhereRef.current).length > 0) {\n clauses.push(filterWhereRef.current);\n }\n\n const combinedWhere = clauses.length === 0 ? {} : clauses.length === 1 ? clauses[0] : { AND: clauses };\n const whereKey = JSON.stringify(combinedWhere);\n\n if (lastWhereRef.current !== whereKey) {\n lastWhereRef.current = whereKey;\n onSearchWhereChange(combinedWhere);\n }\n }\n\n async function handleBatchDelete(): Promise<void> {\n dispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} asset${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected assets? They will be deleted permanently.`\n : `Are you sure you want to delete the selected asset? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionCancel: () => {},\n dialogActionSubmit: () => {\n for (const id of selectedIds) {\n const payload = { entityId: id, entityName, silent: true } as unknown as {\n entityId: string;\n entityName: string;\n };\n dispatch({ type: 'DeleteEntity', payload });\n }\n\n table.resetRowSelection();\n },\n },\n },\n });\n }\n\n const handleAddTagsToSelected = useCallback(async (): Promise<void> => {\n if (selectedIds.length === 0 || selectedTagIds.length === 0) {\n return;\n }\n\n // Build relationship connect for multiple tags\n const dataToMutate = {\n tags: {\n relationships: {\n connect: selectedTagIds.map((id) => ({ _id: id })),\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation('_assets', selectedIds[0] ?? '', scope, schema, {}, dataToMutate as never);\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: selectedIds } } },\n onCompleted: () => resolve(),\n });\n runMutation(true);\n });\n\n setIsTagDialogOpen(false);\n setSelectedTagIds([]);\n table.resetRowSelection();\n }, [runMutation, scope, selectedIds, selectedTagIds, setMutation, setOptions, table]);\n\n const handleRemoveTagsFromSelected = useCallback(async (): Promise<void> => {\n if (selectedIds.length === 0 || selectedRemoveTagIds.length === 0) {\n return;\n }\n\n const dataToMutate = {\n tags: {\n relationships: {\n disconnect: selectedRemoveTagIds,\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation('_assets', selectedIds[0] ?? '', scope, schema, {}, dataToMutate as never);\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: selectedIds } } },\n onCompleted: () => resolve(),\n });\n runMutation(true);\n });\n\n setIsRemoveTagDialogOpen(false);\n setSelectedRemoveTagIds([]);\n table.resetRowSelection();\n }, [runMutation, scope, selectedIds, selectedRemoveTagIds, setMutation, setOptions, table]);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const safeResults = results ?? [];\n const trimmed = search.trim();\n\n let nextWhere: WhereClause = {};\n\n if (trimmed.length === 0) {\n nextWhere = {};\n } else if (safeResults.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else {\n const assetIdClauses = safeResults\n .filter((r) => r._entityNamePlural === '_assets')\n .map((r) => ({ _id: { eq: r._id } }));\n\n const tagClauses = safeResults\n .filter((r) => r._entityNamePlural === '_tags')\n .map((r) => ({ tags: { some: { _id: { eq: r._id } } } }));\n\n const orClauses = [...assetIdClauses, ...tagClauses];\n nextWhere = orClauses.length > 0 ? { OR: orClauses } : { _id: { in: [] } };\n }\n\n textWhereRef.current = nextWhere;\n emitCombinedWhere();\n }, [onSearchWhereChange, results, search]);\n\n // Watch column filter changes (e.g., mime type) and push server-side where\n const columnFiltersKey = JSON.stringify(table.getState().columnFilters);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const mimeFilter = table.getState().columnFilters.find((f) => f.id === 'mimeType');\n const mimeValues = (Array.isArray(mimeFilter?.value) ? (mimeFilter?.value as unknown[]) : []) as string[];\n\n const tagsFilter = table.getState().columnFilters.find((f) => f.id === 'tags');\n const tagValues = (Array.isArray(tagsFilter?.value) ? (tagsFilter?.value as unknown[]) : []) as string[];\n\n const clauses: WhereClause[] = [];\n\n if (mimeValues.length > 0) {\n clauses.push({ mimeType: { in: mimeValues } } as WhereClause);\n }\n\n if (tagValues.length > 0) {\n const orTags = tagValues.map((id) => ({ tags: { some: { _id: { eq: id } } } }));\n clauses.push(orTags.length === 1 ? orTags[0] : { OR: orTags });\n }\n\n if (clauses.length === 0) {\n filterWhereRef.current = {};\n } else if (clauses.length === 1) {\n filterWhereRef.current = clauses[0] as WhereClause;\n } else {\n filterWhereRef.current = { AND: clauses } as WhereClause;\n }\n\n emitCombinedWhere();\n }, [columnFiltersKey, onSearchWhereChange, table]);\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n <div className=\"fk:relative\">\n {isLoading ? (\n <LoaderCircle className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <Input\n placeholder=\"Search assets...\"\n name=\"search-assets\"\n value={search}\n onChange={(e) => {\n const { value } = e.target;\n setSearch(value);\n\n if (value.trim().length === 0) {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n\n if (onSearchWhereChange) {\n onSearchWhereChange({});\n }\n\n return;\n }\n\n debouncedSetSearchQuery(value);\n }}\n className=\"fk:h-8 fk:w-[150px] fk:lg:w-[250px] fk:pl-8\"\n />\n {search ? (\n <button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-2 fk:top-2 fk:text-muted-foreground fk:hover:text-foreground\"\n onClick={() => {\n setSearch('');\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n if (onSearchWhereChange) {\n onSearchWhereChange({});\n }\n }}\n type=\"button\"\n >\n <ResetIcon className=\"fk:h-4 fk:w-4\" />\n </button>\n ) : null}\n </div>\n {table.getColumn('mimeType') && (\n <DataTableFacetedFilter column={table.getColumn('mimeType')} title=\"File type\" options={mimeTypeOptions} />\n )}\n {table.getColumn('tags') && (\n <DataTableFacetedFilter column={table.getColumn('tags')} title=\"Tags\" options={tagOptions} />\n )}\n {isFiltered && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n table.resetColumnFilters();\n\n if (onSearchWhereChange) {\n onSearchWhereChange({});\n }\n }}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3\"\n >\n Reset\n <ResetIcon className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n )}\n </div>\n {selectedIds.length > 0 ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8 fk:mr-2 fk:lg:flex\" size=\"sm\" variant=\"secondary\">\n Actions <ListChecks className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[240px]\">\n <DropdownMenuItem onClick={() => setIsTagDialogOpen(true)}>\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Add tag\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setIsRemoveTagDialogOpen(true)}>\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleBatchDelete} className=\"fk:text-destructive\">\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Delete asset{selectedIds.length > 1 ? 's' : ''} (\n {selectedIds.length})\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <Button className=\"fk:ml-auto fk:h-8 fk:lg:flex\" onClick={handleUpload} size=\"sm\" variant=\"default\">\n Upload assets\n </Button>\n\n <CommandDialog open={isTagDialogOpen} onOpenChange={setIsTagDialogOpen}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-[300px]\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedTagIds.includes(tag._id);\n return (\n <CommandItem\n key={tag._id}\n onSelect={() => {\n setSelectedTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button className=\"fk:w-full\" onClick={handleAddTagsToSelected} disabled={selectedTagIds.length === 0}>\n Add tag(s) to selected assets\n </Button>\n </div>\n </CommandDialog>\n\n <CommandDialog open={isRemoveTagDialogOpen} onOpenChange={setIsRemoveTagDialogOpen}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-[300px]\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedRemoveTagIds.includes(tag._id);\n return (\n <CommandItem\n key={tag._id}\n onSelect={() => {\n setSelectedRemoveTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button\n className=\"fk:w-full\"\n onClick={handleRemoveTagsFromSelected}\n disabled={selectedRemoveTagIds.length === 0}\n >\n Remove tag(s) from selected assets\n </Button>\n </div>\n </CommandDialog>\n </div>\n );\n}\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300) {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return function (this: unknown, ...args: TArgs) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n}\n","import { useCallback, useMemo, useRef, useState, type JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport {\n assetSchema,\n DataTable,\n useAppContext,\n useConfig,\n useLocation,\n Outlet,\n useEntityQuery,\n useGraphQLError,\n ProjectDisabled,\n SchemaError,\n useGridColumnsDefinition,\n} from '@flexkit/studio';\nimport { Skeleton } from '@flexkit/studio/ui';\nimport type { AttributeValue, ColumnDef, SingleProject } from '@flexkit/studio';\nimport { DataTableToolbar } from './data-grid/data-table-toolbar';\n\ntype WhereClause = { [key: string]: unknown };\n\nconst pageSize = 25;\n\nexport function List(): JSX.Element {\n const entityName = '_assets';\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { projects, currentProjectId } = useConfig();\n const { schema } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: assetSchema.attributes,\n checkboxSelect: 'multiple',\n });\n\n const [searchWhere, setSearchWhere] = useState<WhereClause>({});\n\n const whereBase = entityId ? { _id: { eq: entityId } } : { NOT: { path: { eq: null } } };\n const where = useMemo(() => {\n if (!searchWhere || Object.keys(searchWhere).length === 0) {\n return whereBase;\n }\n\n if (entityId) {\n return whereBase; // ignore search when a single asset is selected via id\n }\n\n return { AND: [whereBase, searchWhere] } as WhereClause;\n }, [entityId, searchWhere]);\n\n const variables = { where, offset: 0, limit: pageSize, sort: [{ _updatedAt: 'DESC' }] };\n\n const { isLoading, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n });\n\n const lastRequestedOffsetRef = useRef<number | null>(null);\n const isInitialLoading = isLoading && (data == null || data.length === 0);\n\n // called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useCallback(\n (containerRefElement?: HTMLDivElement | null) => {\n const rowsCount = data?.length ?? 0;\n\n if (isLoading) {\n return;\n }\n\n if (containerRefElement && count > 0 && rowsCount > 0) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n const remaining = scrollHeight - scrollTop - clientHeight;\n const threshold = Math.min(500, Math.floor(clientHeight * 0.75));\n\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (remaining < threshold && rowsCount < count) {\n if (lastRequestedOffsetRef.current === rowsCount) {\n return;\n }\n\n lastRequestedOffsetRef.current = rowsCount;\n\n fetchMore({\n variables: {\n offset: data?.length ?? 0,\n limit: pageSize,\n },\n });\n }\n }\n },\n [count, data?.length, fetchMore, isLoading]\n );\n\n const loadingData = Array(pageSize).fill({});\n const loadingColumns = getLoadingColumns(columnsDefinition);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <SchemaError />\n <h2 className=\"fk:mb-4 fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Asset Manager</h2>\n {!schemaErrorMessage ? (\n <DataTable\n classNames={{ row: 'fk:h-20' }}\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : (data ?? [])}\n entityName={assetSchema.name}\n pageSize={pageSize}\n onScroll={(e) => {\n fetchMoreOnBottomReached(e.currentTarget as HTMLDivElement);\n }}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n table={table}\n onSearchWhereChange={(w) => setSearchWhere(w)}\n />\n )}\n />\n ) : null}\n <Outlet />\n </div>\n );\n}\n\nfunction getLoadingColumns(columns: ColumnDef<AttributeValue, unknown>[]): ColumnDef<AttributeValue, unknown>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n }));\n}\n","'use client';\n\nimport { JSX } from 'react';\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@flexkit/studio/ui';\nimport { Sidebar } from './sidebar';\nimport { List } from './list';\n\nexport function Root(): JSX.Element {\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"fk:h-full\">\n <ResizablePanel className=\"fk:p-3\" defaultSize=\"82%\">\n <div className=\"fk:flex fk:flex-col fk:h-full\">\n <List />\n </div>\n </ResizablePanel>\n <ResizableHandle className=\"fk:hover:bg-blue-500 fk:transition-colors\" withHandle />\n <ResizablePanel defaultSize=\"18%\" minSize=\"10%\">\n <div className=\"fk:sm:hidden fk:md:block\">\n <Sidebar />\n </div>\n </ResizablePanel>\n </ResizablePanelGroup>\n );\n}\n","import { FileStack as FileStackIcon } from 'lucide-react';\nimport type { PluginOptions } from '@flexkit/studio';\nimport { Asset } from './data-grid/preview-components/asset';\nimport { Root } from './root';\n\nexport function AssetManager(): PluginOptions {\n return {\n name: 'flexkit.asset-manager',\n contributes: {\n apps: [\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: <Root />,\n routes: [],\n },\n ],\n previewFields: {\n assetPreviewField: {\n component: Asset,\n description: 'Asset preview field for the asset manager',\n },\n },\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexkit/asset-manager",
3
- "version": "0.0.25",
3
+ "version": "0.0.26",
4
4
  "description": "Flexkit plugin for browsing and managing assets in a project.",
5
5
  "keywords": [
6
6
  "flexkit",
@@ -53,7 +53,7 @@
53
53
  "tailwindcss": "4.2.4",
54
54
  "tsup": "8.5.1",
55
55
  "typescript": "^5.3.3",
56
- "@flexkit/studio": "0.0.25",
56
+ "@flexkit/studio": "0.0.26",
57
57
  "eslint-config-custom": "0.0.0",
58
58
  "tailwind-config": "0.0.1",
59
59
  "tsconfig": "0.0.0"
@@ -67,7 +67,7 @@
67
67
  "peerDependencies": {
68
68
  "react": "^19.0.0",
69
69
  "react-dom": "^19.0.0",
70
- "@flexkit/studio": "0.0.25"
70
+ "@flexkit/studio": "0.0.26"
71
71
  },
72
72
  "publishConfig": {
73
73
  "access": "public"