@flexkit/studio 0.2.39 → 0.2.41

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.
Files changed (86) hide show
  1. package/dist/{chat-page-2ES466GO.js → chat-page-DM5R7DEJ.js} +3 -3
  2. package/dist/{chat-page-2ES466GO.js.map → chat-page-DM5R7DEJ.js.map} +1 -1
  3. package/dist/{chunk-U3PTPLSE.js → chunk-2MNG5HBI.js} +2 -2
  4. package/dist/{chunk-U3PTPLSE.js.map → chunk-2MNG5HBI.js.map} +1 -1
  5. package/dist/{chunk-DUS2CRB3.js → chunk-3DT7IQLS.js} +2 -2
  6. package/dist/{chunk-DUS2CRB3.js.map → chunk-3DT7IQLS.js.map} +1 -1
  7. package/dist/chunk-3V7VAQBP.js +2 -0
  8. package/dist/chunk-3V7VAQBP.js.map +1 -0
  9. package/dist/{chunk-SGQMQZIW.js → chunk-JHYLYOJJ.js} +2 -2
  10. package/dist/{chunk-SGQMQZIW.js.map → chunk-JHYLYOJJ.js.map} +1 -1
  11. package/dist/chunk-KGNQ6P6R.js +7 -0
  12. package/dist/chunk-KGNQ6P6R.js.map +1 -0
  13. package/dist/{chunk-VR3LFFJ3.js → chunk-KL2NENPM.js} +3 -3
  14. package/dist/chunk-KL2NENPM.js.map +1 -0
  15. package/dist/{chunk-SAVZBVP5.js → chunk-NHNJNPF5.js} +3 -3
  16. package/dist/{chunk-SAVZBVP5.js.map → chunk-NHNJNPF5.js.map} +1 -1
  17. package/dist/{chunk-DR36N2JC.js → chunk-NS4FHGIC.js} +2 -2
  18. package/dist/{chunk-DR36N2JC.js.map → chunk-NS4FHGIC.js.map} +1 -1
  19. package/dist/{chunk-CESG6WQB.js → chunk-NVQANITJ.js} +3 -3
  20. package/dist/{chunk-CESG6WQB.js.map → chunk-NVQANITJ.js.map} +1 -1
  21. package/dist/{chunk-DQ2OVNOB.js → chunk-OXJJX6QV.js} +2 -2
  22. package/dist/{chunk-DQ2OVNOB.js.map → chunk-OXJJX6QV.js.map} +1 -1
  23. package/dist/{chunk-KWE3LHFM.js → chunk-T7IAVZCX.js} +4 -4
  24. package/dist/{chunk-KWE3LHFM.js.map → chunk-T7IAVZCX.js.map} +1 -1
  25. package/dist/{chunk-JJFOUJMQ.js → chunk-TATNK4AH.js} +3 -3
  26. package/dist/{chunk-JJFOUJMQ.js.map → chunk-TATNK4AH.js.map} +1 -1
  27. package/dist/{chunk-Z7JAN2UW.js → chunk-VS7RDMW2.js} +2 -2
  28. package/dist/{chunk-Z7JAN2UW.js.map → chunk-VS7RDMW2.js.map} +1 -1
  29. package/dist/{chunk-7FYOLFHG.js → chunk-VT476KKC.js} +3 -3
  30. package/dist/{chunk-7FYOLFHG.js.map → chunk-VT476KKC.js.map} +1 -1
  31. package/dist/{chunk-TOISBMRE.js → chunk-VUGISMZA.js} +2 -2
  32. package/dist/{chunk-TOISBMRE.js.map → chunk-VUGISMZA.js.map} +1 -1
  33. package/dist/{chunk-WSXNYZQC.js → chunk-VXRA33F4.js} +2 -2
  34. package/dist/{chunk-WSXNYZQC.js.map → chunk-VXRA33F4.js.map} +1 -1
  35. package/dist/{chunk-R7EOMV6C.js → chunk-XRZBQA6H.js} +3 -3
  36. package/dist/{chunk-R7EOMV6C.js.map → chunk-XRZBQA6H.js.map} +1 -1
  37. package/dist/{chunk-TP6QGIJH.js → chunk-YGG43LHF.js} +3 -3
  38. package/dist/{chunk-TP6QGIJH.js.map → chunk-YGG43LHF.js.map} +1 -1
  39. package/dist/{entry-ZYSQFFEW.js → entry-4OP3BASI.js} +2 -2
  40. package/dist/{entry-ZYSQFFEW.js.map → entry-4OP3BASI.js.map} +1 -1
  41. package/dist/index.d.ts +12 -1
  42. package/dist/index.js +2 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/{list-XTC2OYA6.js → list-4XKSEBGT.js} +3 -3
  45. package/dist/{list-XTC2OYA6.js.map → list-4XKSEBGT.js.map} +1 -1
  46. package/dist/list-KPKWXWZZ.js +2 -0
  47. package/dist/list-KPKWXWZZ.js.map +1 -0
  48. package/dist/pages-JYXHLRSZ.js +5 -0
  49. package/dist/pages-JYXHLRSZ.js.map +1 -0
  50. package/dist/{plugin-pages-CUTCB6NU.js → plugin-pages-5PNAZGCO.js} +2 -2
  51. package/dist/{plugin-pages-CUTCB6NU.js.map → plugin-pages-5PNAZGCO.js.map} +1 -1
  52. package/dist/{project-selector-Z4Q6G6GM.js → project-selector-6VHU5KVQ.js} +2 -2
  53. package/dist/{project-selector-Z4Q6G6GM.js.map → project-selector-6VHU5KVQ.js.map} +1 -1
  54. package/dist/record-links-KRMGWWLU.js +2 -0
  55. package/dist/{record-links-DBU5G6ZH.js.map → record-links-KRMGWWLU.js.map} +1 -1
  56. package/dist/{root-3Q44ISGQ.js → root-4F6MS4T7.js} +3 -3
  57. package/dist/{root-3Q44ISGQ.js.map → root-4F6MS4T7.js.map} +1 -1
  58. package/dist/{root-7FYWXLI6.js → root-7UPTEL7G.js} +3 -3
  59. package/dist/{root-7FYWXLI6.js.map → root-7UPTEL7G.js.map} +1 -1
  60. package/dist/{root-SYRZ3UBN.js → root-HYB5RRH4.js} +2 -2
  61. package/dist/{root-SYRZ3UBN.js.map → root-HYB5RRH4.js.map} +1 -1
  62. package/dist/{root-7NZPP7IC.js → root-ILUM4ZHH.js} +2 -2
  63. package/dist/{root-7NZPP7IC.js.map → root-ILUM4ZHH.js.map} +1 -1
  64. package/dist/root-KYXGSM45.js +23 -0
  65. package/dist/root-KYXGSM45.js.map +1 -0
  66. package/dist/{root-Q6SHODPG.js → root-WOUYFOQO.js} +2 -2
  67. package/dist/{root-Q6SHODPG.js.map → root-WOUYFOQO.js.map} +1 -1
  68. package/dist/{search-X7F5JZOU.js → search-HV4MXIKW.js} +2 -2
  69. package/dist/{search-X7F5JZOU.js.map → search-HV4MXIKW.js.map} +1 -1
  70. package/dist/{skills-pages-X3DVZXY5.js → skills-pages-C4OOTCLS.js} +2 -2
  71. package/dist/{skills-pages-X3DVZXY5.js.map → skills-pages-C4OOTCLS.js.map} +1 -1
  72. package/dist/{source-43PHAELP.js → source-EGHZGVN4.js} +2 -2
  73. package/dist/{source-43PHAELP.js.map → source-EGHZGVN4.js.map} +1 -1
  74. package/package.json +5 -5
  75. package/dist/chunk-MGCXYA2S.js +0 -7
  76. package/dist/chunk-MGCXYA2S.js.map +0 -1
  77. package/dist/chunk-PR3MTHFM.js +0 -2
  78. package/dist/chunk-PR3MTHFM.js.map +0 -1
  79. package/dist/chunk-VR3LFFJ3.js.map +0 -1
  80. package/dist/list-4EXGXJZA.js +0 -2
  81. package/dist/list-4EXGXJZA.js.map +0 -1
  82. package/dist/pages-HW4OCENA.js +0 -5
  83. package/dist/pages-HW4OCENA.js.map +0 -1
  84. package/dist/record-links-DBU5G6ZH.js +0 -2
  85. package/dist/root-422O7YX5.js +0 -23
  86. package/dist/root-422O7YX5.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import'./index.css';export{a as EntityKnowledgeButton,c as LinkedRecordsSection,b as RecordKnowledgePanel}from'./chunk-WSXNYZQC.js';import'./chunk-DUS2CRB3.js';import'./chunk-4ZWQ44NZ.js';import'./chunk-PR3MTHFM.js';import'./chunk-DSLPTDZX.js';import'./chunk-VR3LFFJ3.js';import'./chunk-DQ2OVNOB.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-SAVZBVP5.js';import'./chunk-TP6QGIJH.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import'./chunk-RULCANNM.js';import'./chunk-A4DPLZZF.js';import'./chunk-G5N6HEPW.js';import'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import'./chunk-N33S7BSG.js';import'./chunk-X3SHNHHM.js';//# sourceMappingURL=record-links-DBU5G6ZH.js.map
2
- //# sourceMappingURL=record-links-DBU5G6ZH.js.map
@@ -1,23 +0,0 @@
1
- import'./index.css';import {a as a$1}from'./chunk-CLCIE5RF.js';import {c as c$3,a as a$5}from'./chunk-SGQMQZIW.js';import {a as a$4}from'./chunk-VFV44YZB.js';import {a as a$3}from'./chunk-U3PTPLSE.js';import {m,a,b as b$1,d,f as f$1,e as e$4,c as c$5,h as h$2,j as j$3,i as i$2,k as k$1}from'./chunk-MGCXYA2S.js';import {b as b$5}from'./chunk-CAZ6EUR2.js';import'./chunk-2DXR5NJV.js';import {e as e$1}from'./chunk-PR3MTHFM.js';import {b as b$2}from'./chunk-DSLPTDZX.js';import {e,j as j$1}from'./chunk-VR3LFFJ3.js';import {c}from'./chunk-DQ2OVNOB.js';import {o,i,m as m$1,l}from'./chunk-SAVZBVP5.js';import {f,b}from'./chunk-TP6QGIJH.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import {v,w,x,ja,c as c$4,d as d$1,n}from'./chunk-RULCANNM.js';import {e as e$3,g,h,j,o as o$1,t as t$1}from'./chunk-A4DPLZZF.js';import {b as b$4}from'./chunk-G5N6HEPW.js';import {m as m$2,d as d$2,e as e$5,f as f$2,g as g$1,h as h$1,j as j$2,i as i$1}from'./chunk-5JUG4BEF.js';import {k,l as l$1,p,q,s,t,r}from'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import {a as a$2,b as b$3,c as c$1,e as e$2}from'./chunk-N33S7BSG.js';import {c as c$2}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useCallback,useRef,useEffect}from'react';import {TagIcon,PlusIcon,Loader2,Ellipsis,Check,Copy,Link,MinusIcon,Trash2,LoaderCircle,Search,X,ImagePlayIcon,ImageIcon,FilePlayIcon,LayersIcon,SplinePointerIcon,ListChecks,Trash2Icon,LayoutGrid,List}from'lucide-react';import {gql}from'@apollo/client';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useLocation,Outlet,useParams}from'react-router-dom';import {useReactTable,getSortedRowModel,getPaginationRowModel,getFilteredRowModel,getCoreRowModel}from'@tanstack/react-table';import {defaultStyles,FileIcon}from'react-file-icon';var be={where:{},limit:500,offset:0,sort:[{name:"ASC"}]},Y={selection:"display",includeCount:false};function Pt(){let{scope:e}=c(),{currentProjectSchema:n}=f(),[t$1,s$1,r$1]=f$1(),[f$2,l$2]=useState(""),[u,D]=useState(false),[v,g$1]=useState(false),[I,i$1]=useState(null),[A,d]=useState(false),[_,x]=useState(null),[J,M]=useState(""),[P,O]=useState(false),[R,B]=useState(false),k$1=b$2(),w="_tag",c$3="_tags",{data:b,isLoading:T}=e$1({entityNamePlural:c$3,schema:n,scope:e,variables:be,...Y}),z=(Array.isArray(b)?b:[]).map(a=>{let U=a;return {_id:U._id,name:U.name}}),L=useCallback(async()=>{let a=f$2.trim();if(!a)return;O(true);let U=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}`,F=o(c$3,n,{name:{value:a,disabled:false,scope:"default"}},U),j=i(c$3,e,n,Y),K=gql`
2
- ${j.query}
3
- `;await new Promise(h=>{s$1(gql`
4
- ${F}
5
- `),r$1({refetchQueries:[K],onCompleted:()=>{l$2(""),D(false),h();}}),t$1(true);}),O(false);},[c$3,t$1,n,e,s$1,r$1,f$2]),q$1=useCallback(async a=>{B(true);let U=m$1(w,n,a),Z=i(c$3,e,n,Y),F=gql`
6
- ${Z.query}
7
- `;await new Promise((j,K)=>{s$1(gql`
8
- ${U}
9
- `),r$1({variables:{where:{_id:{eq:a}}},refetchQueries:[F],onCompleted:()=>{j();},onError:h=>{K(h);}}),t$1(true);}),B(false);},[w,c$3,t$1,n,e,s$1,r$1]),y=useCallback(async()=>{let a=J.trim();if(!a||!_)return;O(true);let U={name:{value:a,disabled:false,scope:"default"}},Z={},F=l(c$3,_._id,e,n,Z,U),j=i(c$3,e,n,Y),K=gql`
10
- ${j.query}
11
- `;await new Promise(h=>{s$1(gql`
12
- ${F}
13
- `),r$1({variables:{where:{_id:{eq:_._id}}},refetchQueries:[K],onCompleted:()=>{d(false),x(null),M(""),h();}}),t$1(true);}),O(false);},[J,c$3,t$1,n,e,s$1,r$1,_]);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"}),k$1?jsx(a$2,{children:jsxs(b$3,{children:[jsx(c$1,{asChild:true,children:jsxs(k,{open:u,onOpenChange:D,children:[jsx(l$1,{asChild:true,children:jsxs(c$2,{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(p,{children:[jsxs(q,{children:[jsx(s,{children:"New tag"}),jsx(t,{className:"fk:sr-only",children:"Create a new tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(b$4,{autoFocus:true,value:f$2,placeholder:"New tag name",onChange:a=>l$2(a.target.value),onKeyDown:a=>{a.key==="Enter"&&L();}})}),jsx(r,{children:jsxs(c$2,{disabled:P,onClick:L,variant:"default",children:[P?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Add"]})})]})]})}),jsx(e$2,{children:jsx("p",{children:"Add tag"})})]})}):jsx("div",{className:"fk:ml-auto",children:jsx(ja,{disabled:true,children:jsxs(c$2,{disabled:true,variant:"secondary",size:"icon",className:"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"})]})})})]}),jsx(m$2,{className:"fk:h-full",children:jsx("div",{className:"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2",children:T?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Loading..."}):z.length===0?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"No tags yet"}):z.map(a=>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 fk:corner-squircle",children:[jsx("span",{className:"fk:text-sm",children:a.name}),jsxs(e$3,{children:[jsx(ja,{disabled:!k$1,children:jsx(g,{asChild:true,children:jsx(c$2,{"aria-label":`Actions for ${a.name}`,disabled:!k$1,title:k$1?`Actions for ${a.name}`:void 0,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(h,{align:"end",className:"w-[160px]",children:[jsx(j,{onClick:()=>{x(a),M(a.name),d(true);},children:"Edit"}),jsx(o$1,{}),jsx(j,{className:"fk:text-destructive",onClick:()=>{i$1(a),g$1(true);},children:"Remove"})]})]})]},a._id))})}),jsx(k,{open:A,onOpenChange:d,children:jsxs(p,{children:[jsxs(q,{children:[jsx(s,{children:"Edit tag"}),jsx(t,{className:"fk:sr-only",children:"Rename an existing tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(b$4,{autoFocus:true,value:J,placeholder:"Tag name",onChange:a=>M(a.target.value),onKeyDown:a=>{a.key==="Enter"&&y();}})}),jsxs(r,{children:[jsx(c$2,{disabled:P,variant:"secondary",onClick:()=>{d(false),x(null);},children:"Cancel"}),jsxs(c$2,{disabled:P,onClick:y,variant:"default",children:[P?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Save"]})]})]})}),jsx(k,{open:v,onOpenChange:g$1,children:jsxs(p,{children:[jsxs(q,{children:[jsx(s,{children:"Delete tag"}),jsx(t,{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:I?.name}),"?"]}),jsxs(r,{children:[jsx(c$2,{disabled:R,variant:"secondary",onClick:()=>{g$1(false),i$1(null);},children:"Cancel"}),jsxs(c$2,{disabled:R,variant:"destructive",onClick:()=>{I&&(async()=>(await q$1(I._id),g$1(false),i$1(null)))();},children:[R?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Delete"]})]})]})})]})}var Ft=`_updatedAt
14
- tags(limit: 3, offset: 0) {
15
- _id
16
- name
17
- }
18
- `;function Le({assetIds:e,mode:n,onModeChange:t,onCompleted:s}){let{scope:r}=c(),f$3=a$5("_assets"),[l$1,u,D]=f$1(),{currentProjectSchema:v}=f(),[g,I]=useState([]),[i,A]=useState(false),{data:d}=e$1({entityNamePlural:"_tags",schema:v,scope:r,variables:be,...Y}),_=useMemo(()=>(Array.isArray(d)?d:[]).map(w=>({_id:w._id,name:w.name})),[d]),x=useCallback(()=>{I([]);},[]),J=useCallback(k=>{!k&&!i&&(t(null),x());},[i,t,x]),M=useCallback(k=>{let c=(k?.update_assets?._assets??[]).filter(b=>typeof b?._id=="string").map(b=>{let T=(Array.isArray(b.tags)?b.tags:[]).map(z=>z.name).filter(Boolean).slice(0,3).join(", ");return {_id:b._id,attributes:{tags:T,...typeof b._updatedAt=="string"?{_updatedAt:b._updatedAt}:{}}}});c.length>0&&f$3(c);},[f$3]),P=useCallback(async()=>{if(!(e.length===0||g.length===0||i)){A(true);try{let k={tags:{relationships:{connect:g.map(c=>({_id:c}))},disabled:!1,scope:r}},w=l("_assets",e[0]??"",r,v,{},k,{responseFields:Ft});await new Promise((c,b)=>{u(gql`
19
- ${w}
20
- `),D({variables:{where:{_id:{in:e}}},onCompleted:T=>{M(T),c();},onError:T=>b(T)}),l$1(!0);}),s?.(),x(),t(null);}catch{}finally{A(false);}}},[M,e,i,s,t,x,l$1,v,r,g,u,D]),O=useCallback(async()=>{if(!(e.length===0||g.length===0||i)){A(true);try{let k={tags:{relationships:{disconnect:g},disabled:!1,scope:r}},w=l("_assets",e[0]??"",r,v,{},k,{responseFields:Ft});await new Promise((c,b)=>{u(gql`
21
- ${w}
22
- `),D({variables:{where:{_id:{in:e}}},onCompleted:T=>{M(T),c();},onError:T=>b(T)}),l$1(!0);}),s?.(),x(),t(null);}catch{}finally{A(false);}}},[M,e,i,s,t,x,l$1,v,r,g,u,D]),R=n==="remove",B=R?"Remove tag(s)":"Add tag(s)";return e.length>1&&(B=R?"Remove tag(s) from selected assets":"Add tag(s) to selected assets"),jsxs(d$2,{open:n!==null,onOpenChange:J,children:[jsx(e$5,{placeholder:"Search tags..."}),jsxs(f$2,{className:"fk:h-75",children:[jsx(g$1,{children:"No tags found."}),jsx(h$1,{heading:"Tags",children:_.map(k=>{let w=g.includes(k._id);return jsxs(j$2,{disabled:i,onSelect:()=>{i||I(c=>w?c.filter(b=>b!==k._id):[...c,k._id]);},children:[jsx("input",{className:"fk:mr-2",checked:w,onChange:()=>{},type:"checkbox"}),k.name]},k._id)})})]}),jsx(i$1,{}),jsx("div",{className:"fk:p-2",children:jsxs(c$2,{className:"fk:w-full",disabled:g.length===0||i,onClick:R?O:P,children:[i?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):null,B]})})]})}function Ve({overlay:e=false,row:n}){let[t,s]=useState(null),[r,f]=useState(null),l=j$1(),u=b$2(),D=n.original,v=D._id??"",g$1=D.url??"";function I(){l({type:"DeleteEntity",payload:{entityId:v,entityName:b.name}});}function i(d,_){navigator.clipboard.writeText(_),s(d),window.setTimeout(()=>s(null),1500);}return jsxs(Fragment,{children:[jsxs(e$3,{children:[jsx(g,{asChild:true,children:jsxs(c$2,{className:e?"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:text-white fk:group-hover:bg-background/10 fk:group-hover:text-white! fk:data-[state=open]:bg-background/15":"fk:flex fk:h-8 fk:w-8 fk:p-0 fk:data-[state=open]:bg-muted",onClick:d=>d.stopPropagation(),variant:"ghost",children:[jsx(Ellipsis,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Open menu"})]})}),jsxs(h,{align:"start",className:"fk:w-45",children:[jsxs(j,{disabled:!v,onClick:d=>{d.stopPropagation(),i("id",v);},children:[t==="id"?jsx(Check,{className:"fk:mr-2 fk:h-4 fk:w-4"}):jsx(Copy,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Copy ID"]}),jsxs(j,{disabled:!g$1,onClick:d=>{d.stopPropagation(),i("url",g$1);},children:[t==="url"?jsx(Check,{className:"fk:mr-2 fk:h-4 fk:w-4"}):jsx(Link,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Copy URL"]}),jsx(o$1,{}),jsxs(j,{disabled:!v||!u,onClick:d=>{d.stopPropagation(),f("add");},children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Add tag"]}),jsxs(j,{disabled:!v||!u,onClick:d=>{d.stopPropagation(),f("remove");},children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Remove tag"]}),jsx(o$1,{}),jsxs(j,{className:"fk:text-destructive",disabled:!v||!u,onClick:d=>{d.stopPropagation(),I();},children:[jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete"]})]})]}),r!==null?jsx(Le,{assetIds:v?[v]:[],mode:r,onModeChange:f}):null]})}var ho=FileIcon,yo="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 vo(e){return e==null||Number.isNaN(e)?"":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Ut({columns:e$1,data:n,entityName:t,hasMore:s=false,isLoading:r=false,isLoadingMore:f=false,onLoadMore:l,onSortingChange:u,pageSize:D,sorting:v,toolbarComponent:g}){let I=useRef(null),{schemaErrorMessage:i}=e(),[A,d]=useState({}),[_,x]=useState({}),[J,M]=useState([]),[P,O]=useState([]),R=v??P;useEffect(()=>{I.current?.scrollTo({top:0});},[t]);function B(y){if(u){u(y);return}O(y);}let k=useReactTable({data:n,columns:e$1,state:{sorting:R,columnVisibility:_,rowSelection:A,columnFilters:J},initialState:{pagination:{pageSize:D??50}},enableRowSelection:true,onRowSelectionChange:d,onSortingChange:B,onColumnFiltersChange:M,onColumnVisibilityChange:x,getCoreRowModel:getCoreRowModel(),getFilteredRowModel:getFilteredRowModel(),getPaginationRowModel:getPaginationRowModel(),getSortedRowModel:getSortedRowModel(),getRowId:y=>y._id,manualFiltering:true,manualPagination:true,manualSorting:true}),{rows:w}=k.getRowModel(),c=useRef(l),b=useRef(s),T=useRef(f);c.current=l,b.current=s,T.current=f;let z=useCallback(y=>{if(!c.current||!b.current||T.current)return;let a=y??I.current;a&&c$5(a)&&(T.current=true,c.current());},[]),L=b$5();useEffect(()=>{L&&z();},[z,w.length,s,f,L]);function q(y){z(y.currentTarget);}return i?jsx(Fragment,{}):jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4",children:[g?g(k):null,jsxs("div",{className:"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1",children:[f?jsx("div",{"aria-hidden":true,className:"fk:pointer-events-none fk:absolute fk:top-0 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-40",children:jsx("div",{className:"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground"})}):null,jsxs("div",{className:"fk:h-full fk:overflow-auto fk:pt-px fk:pb-20 fk:-ml-0.5 fk:pr-3",onScroll:q,ref:I,children:[r?jsx("div",{className:"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3",children:Array.from({length:D??50},(y,a)=>jsxs("div",{className:"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle",children:[jsx(t$1,{className:"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle"}),jsx(t$1,{className:"fk:mt-2 fk:h-3 fk:w-[75%]"}),jsx(t$1,{className:"fk:mt-1.5 fk:h-3 fk:w-[50%]"})]},`skeleton-${a}`))}):null,!r&&w.length===0?jsx("div",{className:"fk:flex fk:h-24 fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground",children:"No results."}):null,!r&&w.length>0?jsx("div",{className:"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3",children:w.map(y=>jsx(wo,{row:y},y.id))}):null]})]})]})}function wo({row:e}){let n$1=e.original,t=h$2(n$1)||"Untitled",s=n$1.mimeType??"",r=vo(n$1.size),f=e.getIsSelected(),l=[s,r].filter(Boolean).join(" \xB7 ");return jsxs("div",{className:`fk:relative fk:rounded-md fk:border fk:p-2 fk:transition-colors ${f?"fk:border-primary fk:ring-1 fk:ring-primary/40 fk:bg-muted/40":"fk:border-border fk:bg-background fk:hover:border-muted-foreground/30"} fk:corner-squircle`,"data-state":f?"selected":void 0,children:[jsx("div",{className:"fk:absolute fk:left-3 fk:top-3 fk:z-10 fk:mix-blend-difference",children:jsx(n,{className:"fk:border-white!","aria-label":`Select ${t}`,checked:f,onCheckedChange:u=>{e.toggleSelected(!!u);},onClick:u=>u.stopPropagation()})}),jsx("div",{className:"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference",children:jsx(Ve,{overlay:true,row:e})}),jsx(bo,{asset:n$1,filename:t}),jsx("div",{className:"fk:mt-2 fk:truncate fk:text-xs fk:font-medium",title:t,children:t}),l?jsx("div",{className:"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground",title:l,children:l}):null]})}function bo({asset:e,filename:n}){let[t$1,s$1]=useState(false),[r,f]=useState(false),l=e.url??"";if(!l&&!e.path)return jsx("div",{className:"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:corner-squircle",children:jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:"No preview"})});if(!j$3(e)||!l){let i=i$2(e),A=defaultStyles[i];return jsx("div",{className:"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:[&>svg]:h-12 fk:[&>svg]:w-auto fk:corner-squircle",children:jsx(ho,{extension:i,...A||{}})})}let D=k$1(l,{width:320,height:320}),v=l;function g(i){i.stopPropagation(),f(false),s$1(true);}function I(i){s$1(i),i||f(false);}return jsxs(Fragment,{children:[jsx("button",{className:`fk:aspect-square fk:w-full fk:cursor-zoom-in fk:overflow-hidden fk:rounded-sm fk:border-0 fk:p-0 ${yo} fk:corner-squircle`,onClick:g,type:"button",children:jsx("img",{alt:n,className:"fk:h-full fk:w-full fk:object-contain",src:D})}),jsx(k,{open:t$1,onOpenChange:I,children:jsxs(p,{className:"fk:sm:max-w-4xl fk:p-3",children:[jsxs(q,{children:[jsx(s,{className:"fk:sr-only",children:"Asset preview"}),jsx(t,{className:"fk:sr-only",children:"Enlarged asset preview"})]}),jsxs("div",{className:"fk:relative fk:flex fk:h-[min(85vh,56rem)] fk:w-full fk:items-center fk:justify-center fk:overflow-hidden fk:rounded-md fk:corner-squircle",children:[r?null:jsx(LoaderCircle,{"aria-label":"Loading image",className:"fk:absolute fk:h-8 fk:w-8 fk:animate-spin fk:text-muted-foreground"}),jsx("img",{alt:n,className:`fk:max-h-full fk:max-w-full fk:object-contain fk:transition-opacity ${r?"fk:opacity-100":"fk:opacity-0"}`,onError:()=>f(true),onLoad:()=>f(true),src:v})]})]})})]})}var Fo=[{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 je({entityName:e,isUploading:n=false,table:t,viewMode:s,onUploadClick:r,onViewModeChange:f$1,onSearchLoadingChange:l,onSearchWhereChange:u}){let D=t.getState().columnFilters.length>0,{projectId:v}=useParams(),g$1=j$1(),{scope:I}=c(),[i,A]=useState(null),{currentProjectSchema:d}=f(),_=b$2(),[x,J]=useState(""),M=useRef({}),P=useRef({});function O(){return {searchRequests:{searches:[{collection:"_assets"},{collection:"_tags"}]},commonParams:{q:""}}}let R=useMemo(()=>O(),[]),[B,k]=useState(R),{results:w,isLoading:c$1}=a$3(v??"",B),b=useRef(""),T=x.trim(),z=B.commonParams.q??"",L=T.length>0&&(c$1||z!==T),q=useMemo(()=>Lo(m=>{k({...R,commonParams:{q:m}});},300),[R]);useEffect(()=>()=>{q.cancel();},[q]);let y=t.getSelectedRowModel().rows.map(m=>m.original._id),{data:a}=e$1({entityNamePlural:"_tags",schema:d,scope:I,variables:be,...Y}),U=useMemo(()=>(Array.isArray(a)?a:[]).map(S=>({_id:S._id,name:S.name})),[a]),Z=useMemo(()=>U.map(m=>({value:m._id,label:m.name})),[U]),F=useCallback(()=>{if(!u)return;let m=[];Object.keys(M.current).length>0&&m.push(M.current),Object.keys(P.current).length>0&&m.push(P.current);let S=m.length===0?{}:m.length===1?m[0]:{AND:m},H=JSON.stringify(S);b.current!==H&&(b.current=H,u(S));},[u]);function j$2(){q.cancel(),J(""),k({...R,commonParams:{q:""}}),M.current={},F();}async function K(){g$1({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${y.length} asset${y.length>1?"s":""}`,dialogMessage:y.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:()=>{g$1({type:"DeleteEntity",_id:`delete-batch-${Date.now()}`,payload:{entityId:y,entityName:e,silent:true}}),t.resetRowSelection();}}}});}useEffect(()=>{l?.(L);},[L,l]),useEffect(()=>{if(!u)return;if(T.length===0){M.current={},F();return}if(L)return;let m=w??[],S={};if(m.length===0)S={_id:{in:[]}};else {let H=m.filter(V=>V._entityNamePlural==="_assets").map(V=>V._id),xe=m.filter(V=>V._entityNamePlural==="_tags").map(V=>({tags:{some:{_id:{eq:V._id}}}})),Q=[];H.length>0&&Q.push({_id:{in:H}}),Q.push(...xe),Q.length===0?S={_id:{in:[]}}:Q.length===1?S=Q[0]:S={OR:Q};}M.current=S,F();},[F,L,u,w,T]);let h$1=JSON.stringify(t.getState().columnFilters);return useEffect(()=>{if(!u)return;let m=t.getState().columnFilters.find(V=>V.id==="mimeType"),S=Array.isArray(m?.value)?m?.value:[],H=t.getState().columnFilters.find(V=>V.id==="tags"),xe=Array.isArray(H?.value)?H?.value:[],Q=[];if(S.length>0&&Q.push({mimeType:{in:S}}),xe.length>0){let V=xe.map(jt=>({tags:{some:{_id:{eq:jt}}}}));Q.push(V.length===1?V[0]:{OR:V});}Q.length===0?P.current={}:Q.length===1?P.current=Q[0]:P.current={AND:Q},F();},[h$1,F,u,t]),jsxs("div",{className:"fk:flex fk:items-center fk:justify-between fk:pr-3",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[jsxs("div",{className:"fk:relative",children:[c$1?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(b$4,{placeholder:"Search assets...",name:"search-assets",value:x,onChange:m=>{let{value:S}=m.target;if(J(S),S.trim().length===0){j$2();return}q(S.trim());},className:"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7"}),x?jsx(c$2,{"aria-label":"Clear search",className:"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle",onClick:j$2,type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})}):null]}),t.getColumn("mimeType")&&jsx(a$4,{column:t.getColumn("mimeType"),options:Fo,title:"File type"}),t.getColumn("tags")&&jsx(a$4,{column:t.getColumn("tags"),options:Z,title:"Tags"}),D&&jsxs(c$2,{variant:"ghost",onClick:()=>{t.resetColumnFilters(),P.current={},F();},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"})]}),jsx(e$4,{table:t})]}),y.length>0?jsx("div",{className:"fk:flex fk:items-center fk:gap-2",children:jsxs(e$3,{children:[jsx(ja,{disabled:!_,children:jsx(g,{asChild:true,children:jsxs(c$2,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:!_,size:"sm",variant:"secondary",children:["Actions ",jsx(ListChecks,{className:"fk:ml-2 fk:h-4 fk:w-4"})]})})}),jsxs(h,{align:"end",className:"fk:w-[240px]",children:[jsxs(j,{onClick:()=>A("add"),children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Add tag"]}),jsxs(j,{onClick:()=>A("remove"),children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Remove tag"]}),jsx(o$1,{}),jsxs(j,{onClick:K,className:"fk:text-destructive",children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Delete asset",y.length>1?"s":""," (",y.length,")"]})]})]})}):null,jsxs("div",{className:"fk:ml-auto fk:flex fk:items-center fk:gap-2",children:[jsxs(c$4,{size:"sm",type:"single",value:s,onValueChange:m=>{(m==="list"||m==="grid")&&f$1(m);},children:[jsx(d$1,{"aria-label":"Grid view",value:"grid",children:jsx(LayoutGrid,{className:"fk:h-4 fk:w-4"})}),jsx(d$1,{"aria-label":"List view",value:"list",children:jsx(List,{className:"fk:h-4 fk:w-4"})})]}),jsx(ja,{disabled:!_,children:jsxs(c$2,{"aria-busy":n,className:"fk:h-8 fk:lg:flex",disabled:!_||n,onClick:r,size:"sm",variant:"default",children:[n?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):null,"Upload assets"]})})]}),i!==null?jsx(Le,{assetIds:y,mode:i,onCompleted:()=>t.resetRowSelection(),onModeChange:A}):null]})}function Lo(e,n=300){let t,s=function(...r){t!==void 0&&clearTimeout(t),t=setTimeout(()=>{t=void 0,e.apply(this,r);},n);};return s.cancel=()=>{t!==void 0&&(clearTimeout(t),t=void 0);},s}var Uo=4*1024*1024;function Gt(){let{projectId:e}=useParams(),n=c$3(),t=b$2(),[s,r]=useState(false);async function f(l){if(!(!t||s)&&!(l&&l.length===0))try{await n({files:l,maxBytes:Uo,multiple:!0,onUploadStart:()=>{r(!0);},projectId:e});}finally{r(false);}}return {canMutate:t,isUploading:s,uploadFiles:l=>f(l),uploadFromDialog:()=>f()}}var Wt="flexkit-asset-manager:viewMode";function $t(){if(typeof localStorage>"u")return "grid";try{let e=localStorage.getItem(Wt);if(e==="list"||e==="grid")return e}catch{}return "grid"}function Jt(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(Wt,e);}catch{}}var Me=36,Qo=[{_updatedAt:"DESC"},{_id:"DESC"}];function Xt(){let e$2="_assets",{search:n}=useLocation(),s=new URLSearchParams(n).get("id"),{scope:r}=c(),{schemaErrorMessage:f$1}=e(),{currentProject:l}=f(),u=l?.schema??[],[D,v]=useState([]),[g,I]=useState(()=>$t()),i=m({attributesSchema:b.attributes,actionsComponent:h=>jsx(Ve,{row:h}),checkboxSelect:"multiple",enableColumnSorting:true}),[A,d$1]=useState({}),[_,x]=useState(false),{canMutate:J,isUploading:M,uploadFiles:P,uploadFromDialog:O}=Gt(),R=useMemo(()=>{let h=s?{_id:{eq:s}}:{NOT:{path:{eq:null}}};return !A||Object.keys(A).length===0||s?h:{AND:[h,A]}},[s,A]),B=useMemo(()=>{if(D.length===0)return Qo;let h=D.map(({id:S,desc:H})=>({[S]:H?"DESC":"ASC"}));return h.some(S=>"_id"in S)?h:[...h,{_id:"DESC"}]},[D]),k=useMemo(()=>({where:R,offset:0,limit:Me,sort:B}),[R,B]);function w(h){v(h);}function c$1(h){I(h),Jt(h);}let{isLoading:b$2,isLoadingMore:T,fetchMore:z,count:L,data:q,isProjectDisabled:y}=e$1({entityNamePlural:e$2,schema:u,scope:r,variables:k,selection:"list"}),a$2=_||b$2&&(q==null||q.length===0),U=q?.length??0,Z=!_&&L>0&&U>0&&U<L,F=useCallback(()=>{z({variables:{offset:0,limit:Me}});},[z]),j=useMemo(()=>Array.from({length:Me},(h,m)=>({_id:`loading-${m}`})),[]),K=useMemo(()=>Go(i),[i]);return y?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:jsx(a,{})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:[jsx(b$1,{}),jsxs("div",{className:"fk:mb-4 fk:flex fk:items-center fk:gap-2 fk:pr-3",children:[jsx("h2",{className:"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:"Asset Manager"}),a$2?null:jsxs("span",{className:"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground",children:[L.toLocaleString()," ",L===1?"record":"records"]})]}),f$1?null:jsx(a$1,{disabled:!J||M,onDropFiles:P,children:g==="list"?jsx(d,{classNames:{row:"fk:h-20"},columns:a$2?K:i,data:a$2?j:q??[],entityName:b.name,hasMore:Z,isLoadingMore:T,pageSize:Me,sorting:D,onLoadMore:F,onSortingChange:w,toolbarComponent:h=>jsx(je,{entityName:b.name,isUploading:M,table:h,viewMode:g,onSearchLoadingChange:x,onSearchWhereChange:d$1,onUploadClick:O,onViewModeChange:c$1})}):jsx(Ut,{columns:i,data:a$2?[]:q??[],entityName:b.name,hasMore:Z,isLoading:a$2,isLoadingMore:T,pageSize:Me,sorting:D,onLoadMore:F,onSortingChange:w,toolbarComponent:h=>jsx(je,{entityName:b.name,isUploading:M,table:h,viewMode:g,onSearchLoadingChange:x,onSearchWhereChange:d$1,onUploadClick:O,onViewModeChange:c$1})})}),jsx(Outlet,{})]})}function Go(e){return e.map(n=>({...n,cell:()=>jsx(t$1,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function Rn(){return jsxs(v,{orientation:"horizontal",className:"fk:h-full",children:[jsx(w,{className:"fk:p-3",defaultSize:"82%",children:jsx("div",{className:"fk:flex fk:flex-col fk:h-full",children:jsx(Xt,{})})}),jsx(x,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(w,{defaultSize:"18%",minSize:"10%",children:jsx("div",{className:"fk:sm:hidden fk:md:block",children:jsx(Pt,{})})})]})}export{Rn as Root};//# sourceMappingURL=root-422O7YX5.js.map
23
- //# sourceMappingURL=root-422O7YX5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/apps/asset-manager/tag-query.ts","../src/apps/asset-manager/sidebar.tsx","../src/apps/asset-manager/data-grid/asset-tag-dialogs.tsx","../src/apps/asset-manager/data-grid/asset-row-actions.tsx","../src/apps/asset-manager/data-grid/asset-grid.tsx","../src/apps/asset-manager/data-grid/data-table-toolbar.tsx","../src/apps/asset-manager/data-grid/use-asset-manager-upload.ts","../src/apps/asset-manager/data-grid/view-mode.ts","../src/apps/asset-manager/list.tsx","../src/apps/asset-manager/root.tsx"],"names":["tagQueryVariables","tagQueryOptions","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","canMutate","useCanMutate","entityName","entityNamePlural","data","isLoading","useEntityQuery","tags","item","it","handleCreate","useCallback","name","_id","mutation","getEntityCreateMutation","entityQuery","getEntityQuery","refreshQuery","gql","resolve","handleDelete","getEntityDeleteMutation","reject","error","handleRename","dataToMutate","originalData","getEntityUpdateMutation","jsxs","jsx","TagIcon","TooltipProvider","Tooltip","TooltipTrigger","Dialog","DialogTrigger","Button","PlusIcon","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","DialogFooter","Loader2","TooltipContent","PermissionTooltip","ScrollArea","tag","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","TAG_UPDATE_RESPONSE_FIELDS","AssetTagDialogs","assetIds","mode","onModeChange","onCompleted","patchAssets","usePatchEntityList","selectedTagIds","setSelectedTagIds","tagsData","allTags","useMemo","resetSelection","handleOpenChange","open","applyMutationResult","patches","asset","tagNames","handleAddTags","id","handleRemoveTags","isRemove","actionLabel","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","prev","CommandSeparator","LoaderCircle","AssetRowActions","overlay","row","copiedField","setCopiedField","tagDialogMode","setTagDialogMode","dispatch","useDispatch","assetId","assetUrl","assetSchema","copyToClipboard","field","text","Fragment","event","EllipsisIcon","CheckIcon","CopyIcon","LinkIcon","MinusIcon","Trash2Icon","FileTypeIconCompat","FileTypeIcon","transparentImageBackground","formatAssetSize","bytes","AssetGrid","columns","hasMore","isLoadingMore","onLoadMore","onSortingChange","pageSize","sortingProp","toolbarComponent","scrollRef","useRef","schemaErrorMessage","useGraphQLError","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","useEffect","handleSortingChange","updater","table","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","rows","onLoadMoreRef","hasMoreRef","isLoadingMoreRef","checkLoadMore","container","scrollElement","shouldLoadMore","isAppActive","useIsAppActive","handleScroll","_","index","Skeleton","AssetGridCard","filename","getAssetFilename","mimeType","sizeLabel","metaLine","Checkbox","value","AssetGridMedia","isZoomOpen","setIsZoomOpen","isZoomImageLoaded","setIsZoomImageLoaded","url","isImageAsset","ext","getExtensionFromAsset","style","defaultStyles","thumbnailUrl","getAssetImageUrl","zoomUrl","handleThumbnailClick","handleZoomOpenChange","mimeTypes","ImagePlayIcon","ImageIcon","FilePlayIcon","LayersIcon","SplinePointerIcon","DataTableToolbar","isUploading","viewMode","onUploadClick","onViewModeChange","onSearchLoadingChange","onSearchWhereChange","isFiltered","projectId","useParams","search","setSearch","textWhereRef","filterWhereRef","getBaseSearchRequest","baseSearchRequest","searchQuery","setSearchQuery","results","useSearch","lastWhereRef","trimmedSearch","committedSearchQuery","isSearchPending","debouncedSetSearchQuery","debounce","query","selectedIds","t","tagOptions","emitCombinedWhere","clauses","combinedWhere","whereKey","clearSearch","handleBatchDelete","safeResults","nextWhere","r","tagClauses","orClauses","columnFiltersKey","mimeFilter","f","mimeValues","tagsFilter","tagValues","orTags","SearchIcon","ResetIcon","DataTableFacetedFilter","DataTableSortedBy","ListChecks","ToggleGroup","ToggleGroupItem","LayoutGrid","List","fn","ms","timeoutId","debounced","args","MAX_UPLOAD_BYTES","useAssetManagerUpload","uploadAssets","useUploadAssets","setIsUploading","runUpload","files","VIEW_MODE_STORAGE_KEY","getStoredViewMode","stored","setStoredViewMode","defaultSort","useLocation","entityId","currentProject","setSorting","setViewMode","columnsDefinition","useGridColumnsDefinition","searchWhere","setSearchWhere","isSearchLoading","setIsSearchLoading","uploadFiles","uploadFromDialog","where","whereBase","graphqlSort","primarySort","desc","entry","variables","handleViewModeChange","fetchMore","count","isProjectDisabled","isInitialLoading","rowsCount","handleLoadMore","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","AssetDropZone","DataTable","Outlet","column","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle"],"mappings":"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","file":"root-422O7YX5.js","sourcesContent":["// All mounted tag menus use the same operation and variables so Apollo can\n// share an in-flight request and reuse the cached result.\nexport const tagQueryVariables = { where: {}, limit: 500, offset: 0, sort: [{ name: 'ASC' }] };\nexport const tagQueryOptions = { selection: 'display' as const, includeCount: false };\n","import { JSX, useCallback, 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 PermissionTooltip,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../ui';\nimport { gql } from '@apollo/client';\nimport { useAppContext } from '../../core/app-context';\nimport { useCanMutate } from '../../core/permissions';\nimport { useEntityMutation } from '../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport {\n getEntityDeleteMutation,\n getEntityCreateMutation,\n getEntityQuery,\n getEntityUpdateMutation,\n} from '../../graphql-client/queries';\nimport { useConfig } from '../../core/config/config-context';\nimport type { FormEntityItem } from '../../graphql-client/types';\n\nimport { tagQueryOptions, tagQueryVariables } from './tag-query';\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 const canMutate = useCanMutate();\n\n const entityName = '_tag';\n const entityNamePlural = '_tags';\n const { data, isLoading } = useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\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: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const mutation = getEntityCreateMutation(entityNamePlural, schema, entityData, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\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 // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: _id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\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: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const originalData: FormEntityItem = {};\n const mutation = getEntityUpdateMutation(\n entityNamePlural,\n tagToEdit._id,\n scope,\n schema,\n originalData,\n dataToMutate\n );\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\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 {canMutate ? (\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 ) : (\n <div className=\"fk:ml-auto\">\n <PermissionTooltip disabled>\n <Button disabled variant=\"secondary\" size=\"icon\" className=\"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 </PermissionTooltip>\n </div>\n )}\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 fk:corner-squircle\"\n >\n <span className=\"fk:text-sm\">{tag.name}</span>\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${tag.name}`}\n disabled={!canMutate}\n title={canMutate ? `Actions for ${tag.name}` : undefined}\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 </PermissionTooltip>\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 { useCallback, useMemo, useState, type JSX } from 'react';\nimport { LoaderCircle } from 'lucide-react';\nimport {\n Button,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../../ui';\nimport { gql } from '@apollo/client';\nimport { getEntityUpdateMutation } from '../../../graphql-client/queries';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useEntityMutation } from '../../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { usePatchEntityList } from '../../../graphql-client/use-patch-entity-list';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ntype TagItem = {\n _id: string;\n name: string;\n};\n\ntype WhereClause = { [key: string]: unknown };\n\ntype AssetTagMutationAsset = {\n _id?: string;\n _updatedAt?: string;\n tags?: TagItem[] | null;\n};\n\ntype AssetTagMutationData = {\n update_assets?: {\n _assets?: AssetTagMutationAsset[] | null;\n } | null;\n};\n\nexport type AssetTagDialogMode = 'add' | 'remove' | null;\n\nconst TAG_UPDATE_RESPONSE_FIELDS = `_updatedAt\n tags(limit: 3, offset: 0) {\n _id\n name\n }\n`;\n\ninterface AssetTagDialogsProps {\n assetIds: string[];\n mode: AssetTagDialogMode;\n onModeChange: (mode: AssetTagDialogMode) => void;\n onCompleted?: () => void;\n}\n\nexport function AssetTagDialogs({\n assetIds,\n mode,\n onModeChange,\n onCompleted,\n}: AssetTagDialogsProps): JSX.Element {\n const { scope } = useAppContext();\n const patchAssets = usePatchEntityList('_assets');\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const { currentProjectSchema: schema } = useConfig();\n const [selectedTagIds, setSelectedTagIds] = useState<string[]>([]);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((tag) => ({\n _id: (tag as TagItem)._id,\n name: (tag as TagItem).name,\n }));\n }, [tagsData]);\n\n const resetSelection = useCallback((): void => {\n setSelectedTagIds([]);\n }, []);\n\n const handleOpenChange = useCallback(\n (open: boolean): void => {\n if (!open && !isSubmitting) {\n onModeChange(null);\n resetSelection();\n }\n },\n [isSubmitting, onModeChange, resetSelection]\n );\n\n const applyMutationResult = useCallback(\n (data: unknown): void => {\n const assets = (data as AssetTagMutationData | null | undefined)?.update_assets?._assets ?? [];\n const patches = assets\n .filter((asset): asset is AssetTagMutationAsset & { _id: string } => typeof asset?._id === 'string')\n .map((asset) => {\n const tagNames = (Array.isArray(asset.tags) ? asset.tags : [])\n .map((tag) => tag.name)\n .filter(Boolean)\n .slice(0, 3)\n .join(', ');\n\n return {\n _id: asset._id,\n attributes: {\n tags: tagNames,\n ...(typeof asset._updatedAt === 'string' ? { _updatedAt: asset._updatedAt } : {}),\n },\n };\n });\n\n if (patches.length > 0) {\n patchAssets(patches);\n }\n },\n [patchAssets]\n );\n\n const handleAddTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\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(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const handleRemoveTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n disconnect: selectedTagIds,\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const isRemove = mode === 'remove';\n let actionLabel = isRemove ? 'Remove tag(s)' : 'Add tag(s)';\n\n if (assetIds.length > 1) {\n actionLabel = isRemove ? 'Remove tag(s) from selected assets' : 'Add tag(s) to selected assets';\n }\n\n return (\n <CommandDialog open={mode !== null} onOpenChange={handleOpenChange}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-75\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedTagIds.includes(tag._id);\n\n return (\n <CommandItem\n disabled={isSubmitting}\n key={tag._id}\n onSelect={() => {\n if (isSubmitting) {\n return;\n }\n\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\n className=\"fk:w-full\"\n disabled={selectedTagIds.length === 0 || isSubmitting}\n onClick={isRemove ? handleRemoveTags : handleAddTags}\n >\n {isSubmitting ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {actionLabel}\n </Button>\n </div>\n </CommandDialog>\n );\n}\n","import { useState, type JSX } from 'react';\nimport {\n Check as CheckIcon,\n Copy as CopyIcon,\n Ellipsis as EllipsisIcon,\n Link as LinkIcon,\n MinusIcon,\n TagIcon,\n Trash2 as Trash2Icon,\n} from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { assetSchema } from '../../../entities/assets-schema';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../../ui';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\n\ntype AssetRow = {\n _id?: string;\n url?: string | null;\n};\n\ninterface AssetRowActionsProps<TData> {\n overlay?: boolean;\n row: Row<TData>;\n}\n\nexport function AssetRowActions<TData>({ overlay = false, row }: AssetRowActionsProps<TData>): JSX.Element {\n const [copiedField, setCopiedField] = useState<'id' | 'url' | null>(null);\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const dispatch = useDispatch();\n const canMutate = useCanMutate();\n const asset = row.original as AssetRow;\n const assetId = asset._id ?? '';\n const assetUrl = asset.url ?? '';\n\n function handleDelete(): void {\n dispatch({ type: 'DeleteEntity', payload: { entityId: assetId, entityName: assetSchema.name } });\n }\n\n function copyToClipboard(field: 'id' | 'url', text: string): void {\n void navigator.clipboard.writeText(text);\n setCopiedField(field);\n window.setTimeout(() => setCopiedField(null), 1500);\n }\n\n // Pure white glyph; parent wrapper applies mix-blend-difference so it inverts over the asset.\n // A light hover fill also inverts, so the hit area reads as a contrast disc on any asset.\n const triggerClassName = overlay\n ? 'fk:flex fk:h-7 fk:w-7 fk:p-0 fk:text-white fk:group-hover:bg-background/10 fk:group-hover:text-white! fk:data-[state=open]:bg-background/15'\n : 'fk:flex fk:h-8 fk:w-8 fk:p-0 fk:data-[state=open]:bg-muted';\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className={triggerClassName} onClick={(event) => event.stopPropagation()} variant=\"ghost\">\n <EllipsisIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-45\">\n <DropdownMenuItem\n disabled={!assetId}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('id', assetId);\n }}\n >\n {copiedField === 'id' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <CopyIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy ID\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetUrl}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('url', assetUrl);\n }}\n >\n {copiedField === 'url' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <LinkIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy URL\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('add');\n }}\n >\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Add tag\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('remove');\n }}\n >\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n handleDelete();\n }}\n >\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n {tagDialogMode !== null ? (\n <AssetTagDialogs assetIds={assetId ? [assetId] : []} mode={tagDialogMode} onModeChange={setTagDialogMode} />\n ) : null}\n </>\n );\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type JSX,\n type MouseEvent,\n type ReactElement,\n type UIEvent,\n} from 'react';\nimport {\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n Table as ReactTable,\n Row,\n RowSelectionState,\n SortingState,\n Updater,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useGraphQLError } from '../../../graphql-client/graphql-context';\nimport type { AttributeValue } from '../../../graphql-client/types';\nimport {\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Skeleton,\n} from '../../../ui';\nimport { LoaderCircle } from 'lucide-react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetFilename, getAssetImageUrl, getExtensionFromAsset, isImageAsset } from './asset-url';\nimport { AssetRowActions } from './asset-row-actions';\nimport { useIsAppActive } from '../../../core/apps/app-active';\nimport { shouldLoadMore } from '../../../data-grid/should-load-more';\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\ntype AssetRecord = {\n _id?: string;\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n size?: number | null;\n url?: string | null;\n};\n\ninterface AssetGridProps<TData extends AttributeValue, TValue> {\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n isLoading?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n onSortingChange?: (updater: Updater<SortingState>) => void;\n pageSize?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: ReactTable<AttributeValue>) => ReactElement;\n}\n\nfunction formatAssetSize(bytes: number | null | undefined): string {\n if (bytes == null || Number.isNaN(bytes)) {\n return '';\n }\n\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function AssetGrid<TData extends AttributeValue, TValue>({\n columns,\n data,\n entityName,\n hasMore = false,\n isLoading = false,\n isLoadingMore = false,\n onLoadMore,\n onSortingChange,\n pageSize,\n sorting: sortingProp,\n toolbarComponent,\n}: AssetGridProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0 });\n }, [entityName]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` from the toolbar; keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n });\n\n const { rows } = table.getRowModel();\n\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n // A grid in an app behind the active one has no height (`display: none`):\n // without this guard it looks scrolled to the bottom and would page\n // through the whole entity while nobody is looking.\n if (!shouldLoadMore(scrollElement)) {\n return;\n }\n\n // Optimistic guard until the parent's isLoadingMore prop catches up.\n isLoadingMoreRef.current = true;\n onLoadMoreRef.current();\n }, []);\n\n // Re-check when rows/hasMore/loading settle, and when the app comes back\n // to the front (a hidden grid skips loading until then).\n const isAppActive = useIsAppActive();\n\n useEffect(() => {\n if (isAppActive) {\n checkLoadMore();\n }\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore, isAppActive]);\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4\">\n {toolbarComponent ? toolbarComponent(table) : null}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1\">\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-0 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-40\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n <div\n className=\"fk:h-full fk:overflow-auto fk:pt-px fk:pb-20 fk:-ml-0.5 fk:pr-3\"\n onScroll={handleScroll}\n ref={scrollRef}\n >\n {isLoading ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3\">\n {Array.from({ length: pageSize ?? 50 }, (_, index) => (\n <div className=\"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle\" key={`skeleton-${index}`}>\n <Skeleton className=\"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle\" />\n <Skeleton className=\"fk:mt-2 fk:h-3 fk:w-[75%]\" />\n <Skeleton className=\"fk:mt-1.5 fk:h-3 fk:w-[50%]\" />\n </div>\n ))}\n </div>\n ) : null}\n {!isLoading && rows.length === 0 ? (\n <div className=\"fk:flex fk:h-24 fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground\">\n No results.\n </div>\n ) : null}\n {!isLoading && rows.length > 0 ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3\">\n {rows.map((row) => (\n <AssetGridCard key={row.id} row={row} />\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction AssetGridCard({ row }: { row: Row<AttributeValue> }): JSX.Element {\n const asset = row.original as AssetRecord;\n const filename = getAssetFilename(asset) || 'Untitled';\n const mimeType = asset.mimeType ?? '';\n const sizeLabel = formatAssetSize(asset.size);\n const isSelected = row.getIsSelected();\n const metaLine = [mimeType, sizeLabel].filter(Boolean).join(' · ');\n\n return (\n <div\n className={`fk:relative fk:rounded-md fk:border fk:p-2 fk:transition-colors ${\n isSelected\n ? 'fk:border-primary fk:ring-1 fk:ring-primary/40 fk:bg-muted/40'\n : 'fk:border-border fk:bg-background fk:hover:border-muted-foreground/30'\n } fk:corner-squircle`}\n data-state={isSelected ? 'selected' : undefined}\n >\n <div className=\"fk:absolute fk:left-3 fk:top-3 fk:z-10 fk:mix-blend-difference\">\n <Checkbox\n className=\"fk:border-white!\"\n aria-label={`Select ${filename}`}\n checked={isSelected}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n <div className=\"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference\">\n <AssetRowActions overlay row={row} />\n </div>\n <AssetGridMedia asset={asset} filename={filename} />\n <div className=\"fk:mt-2 fk:truncate fk:text-xs fk:font-medium\" title={filename}>\n {filename}\n </div>\n {metaLine ? (\n <div className=\"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground\" title={metaLine}>\n {metaLine}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction AssetGridMedia({ asset, filename }: { asset: AssetRecord; filename: string }): JSX.Element {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const [isZoomImageLoaded, setIsZoomImageLoaded] = useState(false);\n const url = asset.url ?? '';\n\n if (!url && !asset.path) {\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:corner-squircle\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">No preview</span>\n </div>\n );\n }\n\n const isImage = isImageAsset(asset);\n\n if (!isImage || !url) {\n const ext = getExtensionFromAsset(asset);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:[&>svg]:h-12 fk:[&>svg]:w-auto fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 320, height: 320 });\n const zoomUrl = url;\n\n function handleThumbnailClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n setIsZoomImageLoaded(false);\n setIsZoomOpen(true);\n }\n\n function handleZoomOpenChange(open: boolean): void {\n setIsZoomOpen(open);\n\n if (!open) {\n setIsZoomImageLoaded(false);\n }\n }\n\n return (\n <>\n <button\n className={`fk:aspect-square fk:w-full fk:cursor-zoom-in fk:overflow-hidden fk:rounded-sm fk:border-0 fk:p-0 ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n type=\"button\"\n >\n <img alt={filename} className=\"fk:h-full fk:w-full fk:object-contain\" src={thumbnailUrl} />\n </button>\n <Dialog open={isZoomOpen} onOpenChange={handleZoomOpenChange}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <div className=\"fk:relative fk:flex fk:h-[min(85vh,56rem)] fk:w-full fk:items-center fk:justify-center fk:overflow-hidden fk:rounded-md fk:corner-squircle\">\n {!isZoomImageLoaded ? (\n <LoaderCircle\n aria-label=\"Loading image\"\n className=\"fk:absolute fk:h-8 fk:w-8 fk:animate-spin fk:text-muted-foreground\"\n />\n ) : null}\n <img\n alt={filename}\n className={`fk:max-h-full fk:max-w-full fk:object-contain fk:transition-opacity ${\n isZoomImageLoaded ? 'fk:opacity-100' : 'fk:opacity-0'\n }`}\n onError={() => setIsZoomImageLoaded(true)}\n onLoad={() => setIsZoomImageLoaded(true)}\n src={zoomUrl}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\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 LayoutGrid,\n List,\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 { useParams } from 'react-router-dom';\nimport type { Table as ReactTable } from '@tanstack/react-table';\nimport type { SearchRequestProps } from '../../../core/types';\nimport { DataTableFacetedFilter } from '../../../data-grid/data-table-faceted-filter';\nimport { DataTableSortedBy } from '../../../data-grid/data-table-sorted-by';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useSearch } from '../../../core/use-search';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n PermissionTooltip,\n ToggleGroup,\n ToggleGroupItem,\n} from '../../../ui';\nimport type { AssetViewMode } from './view-mode';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isUploading?: boolean;\n table: ReactTable<TData>;\n viewMode: AssetViewMode;\n onUploadClick?: () => void;\n onViewModeChange: (mode: AssetViewMode) => void;\n onSearchLoadingChange?: (isLoading: boolean) => void;\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 isUploading = false,\n table,\n viewMode,\n onUploadClick,\n onViewModeChange,\n onSearchLoadingChange,\n onSearchWhereChange,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0;\n const { projectId } = useParams();\n const dispatch = useDispatch();\n const { scope } = useAppContext();\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const { currentProjectSchema: schema } = useConfig();\n const canMutate = useCanMutate();\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 const trimmedSearch = search.trim();\n const committedSearchQuery = searchQuery.commonParams.q ?? '';\n const isSearchPending = trimmedSearch.length > 0 && (isLoading || committedSearchQuery !== trimmedSearch);\n\n const debouncedSetSearchQuery = useMemo(\n () =>\n debounce((query: string) => {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: query } });\n }, 300),\n [baseSearchRequest]\n );\n\n useEffect(() => {\n return () => {\n debouncedSetSearchQuery.cancel();\n };\n }, [debouncedSetSearchQuery]);\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 (full tags collection, not derived from loaded assets)\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\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 const tagOptions = useMemo(() => {\n return allTags.map((t) => ({ value: t._id, label: t.name }));\n }, [allTags]);\n\n const emitCombinedWhere = useCallback((): 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 }, [onSearchWhereChange]);\n\n function clearSearch(): void {\n debouncedSetSearchQuery.cancel();\n setSearch('');\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n textWhereRef.current = {};\n emitCombinedWhere();\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 // One DeleteEntity action → one GraphQL mutation with `_id: { in: [...] }`.\n dispatch({\n type: 'DeleteEntity',\n _id: `delete-batch-${Date.now()}`,\n payload: { entityId: selectedIds, entityName, silent: true },\n });\n\n table.resetRowSelection();\n },\n },\n },\n });\n }\n\n useEffect(() => {\n onSearchLoadingChange?.(isSearchPending);\n }, [isSearchPending, onSearchLoadingChange]);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n if (trimmedSearch.length === 0) {\n textWhereRef.current = {};\n emitCombinedWhere();\n\n return;\n }\n\n // Wait for debounce + search results before applying text filters (avoids empty-table flash).\n if (isSearchPending) {\n return;\n }\n\n const safeResults = results ?? [];\n let nextWhere: WhereClause = {};\n\n if (safeResults.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else {\n // Prefer `_id: { in: [...] }` over one OR-eq per hit. Large OR trees break\n // offset pagination and were re-triggering endless fetchMore requests.\n const assetIds = safeResults.filter((r) => r._entityNamePlural === '_assets').map((r) => r._id);\n const tagClauses = safeResults\n .filter((r) => r._entityNamePlural === '_tags')\n .map((r) => ({ tags: { some: { _id: { eq: r._id } } } }));\n\n const orClauses: WhereClause[] = [];\n\n if (assetIds.length > 0) {\n orClauses.push({ _id: { in: assetIds } });\n }\n\n orClauses.push(...tagClauses);\n\n if (orClauses.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else if (orClauses.length === 1) {\n nextWhere = orClauses[0] as WhereClause;\n } else {\n nextWhere = { OR: orClauses };\n }\n }\n\n textWhereRef.current = nextWhere;\n emitCombinedWhere();\n }, [emitCombinedWhere, isSearchPending, onSearchWhereChange, results, trimmedSearch]);\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, emitCombinedWhere, onSearchWhereChange, table]);\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between fk:pr-3\">\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 clearSearch();\n\n return;\n }\n\n debouncedSetSearchQuery(value.trim());\n }}\n className=\"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7\"\n />\n {search ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle\"\n onClick={clearSearch}\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')} options={mimeTypes} title=\"File type\" />\n )}\n {table.getColumn('tags') && (\n <DataTableFacetedFilter column={table.getColumn('tags')} options={tagOptions} title=\"Tags\" />\n )}\n {isFiltered && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n table.resetColumnFilters();\n filterWhereRef.current = {};\n emitCombinedWhere();\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 <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8 fk:mr-2 fk:lg:flex\" disabled={!canMutate} size=\"sm\" variant=\"secondary\">\n Actions <ListChecks className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[240px]\">\n <DropdownMenuItem onClick={() => setTagDialogMode('add')}>\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Add tag\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTagDialogMode('remove')}>\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 <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-2\">\n <ToggleGroup\n size=\"sm\"\n type=\"single\"\n value={viewMode}\n onValueChange={(value) => {\n if (value === 'list' || value === 'grid') {\n onViewModeChange(value);\n }\n }}\n >\n <ToggleGroupItem aria-label=\"Grid view\" value=\"grid\">\n <LayoutGrid className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem aria-label=\"List view\" value=\"list\">\n <List className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n <PermissionTooltip disabled={!canMutate}>\n <Button\n aria-busy={isUploading}\n className=\"fk:h-8 fk:lg:flex\"\n disabled={!canMutate || isUploading}\n onClick={onUploadClick}\n size=\"sm\"\n variant=\"default\"\n >\n {isUploading ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n Upload assets\n </Button>\n </PermissionTooltip>\n </div>\n\n {tagDialogMode !== null ? (\n <AssetTagDialogs\n assetIds={selectedIds}\n mode={tagDialogMode}\n onCompleted={() => table.resetRowSelection()}\n onModeChange={setTagDialogMode}\n />\n ) : null}\n </div>\n );\n}\n\ntype DebouncedFn<TArgs extends unknown[]> = ((...args: TArgs) => void) & {\n cancel: () => void;\n};\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300): DebouncedFn<TArgs> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = function (this: unknown, ...args: TArgs) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n fn.apply(this, args);\n }, ms);\n } as DebouncedFn<TArgs>;\n\n debounced.cancel = () => {\n if (timeoutId === undefined) {\n return;\n }\n\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n return debounced;\n}\n","import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useUploadAssets } from '../../../core/upload';\n\nconst MAX_UPLOAD_BYTES = 4 * 1024 * 1024;\n\nexport function useAssetManagerUpload(): {\n canMutate: boolean;\n isUploading: boolean;\n uploadFiles: (files: File[]) => Promise<void>;\n uploadFromDialog: () => Promise<void>;\n} {\n const { projectId } = useParams();\n const uploadAssets = useUploadAssets();\n const canMutate = useCanMutate();\n const [isUploading, setIsUploading] = useState(false);\n\n async function runUpload(files?: File[]): Promise<void> {\n if (!canMutate || isUploading) {\n return;\n }\n\n if (files && files.length === 0) {\n return;\n }\n\n try {\n await uploadAssets({\n files,\n maxBytes: MAX_UPLOAD_BYTES,\n multiple: true,\n onUploadStart: () => {\n setIsUploading(true);\n },\n projectId,\n });\n } finally {\n setIsUploading(false);\n }\n }\n\n return {\n canMutate,\n isUploading,\n uploadFiles: (files) => runUpload(files),\n uploadFromDialog: () => runUpload(),\n };\n}\n","export type AssetViewMode = 'list' | 'grid';\n\nconst VIEW_MODE_STORAGE_KEY = 'flexkit-asset-manager:viewMode';\n\nexport function getStoredViewMode(): AssetViewMode {\n if (typeof localStorage === 'undefined') {\n return 'grid';\n }\n\n try {\n const stored = localStorage.getItem(VIEW_MODE_STORAGE_KEY);\n\n if (stored === 'list' || stored === 'grid') {\n return stored;\n }\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n\n return 'grid';\n}\n\nexport function setStoredViewMode(mode: AssetViewMode): void {\n if (typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n localStorage.setItem(VIEW_MODE_STORAGE_KEY, mode);\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n}\n","import { useCallback, useMemo, useState, type JSX } from 'react';\nimport { useLocation, Outlet } from 'react-router-dom';\nimport type { ColumnDef, SortingState, Updater } from '@tanstack/react-table';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { DataTable } from '../../data-grid/data-table';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton } from '../../ui';\nimport { AssetDropZone } from './data-grid/asset-drop-zone';\nimport { AssetGrid } from './data-grid/asset-grid';\nimport { DataTableToolbar } from './data-grid/data-table-toolbar';\nimport { AssetRowActions } from './data-grid/asset-row-actions';\nimport { useAssetManagerUpload } from './data-grid/use-asset-manager-upload';\nimport { getStoredViewMode, setStoredViewMode, type AssetViewMode } from './data-grid/view-mode';\n\ntype WhereClause = { [key: string]: unknown };\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\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 { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const [sorting, setSorting] = useState<SortingState>([]);\n const [viewMode, setViewMode] = useState<AssetViewMode>(() => getStoredViewMode());\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: assetSchema.attributes,\n actionsComponent: (row) => <AssetRowActions row={row} />,\n checkboxSelect: 'multiple',\n enableColumnSorting: true,\n });\n\n const [searchWhere, setSearchWhere] = useState<WhereClause>({});\n const [isSearchLoading, setIsSearchLoading] = useState(false);\n const { canMutate, isUploading, uploadFiles, uploadFromDialog } = useAssetManagerUpload();\n\n const where = useMemo(() => {\n const whereBase = entityId ? { _id: { eq: entityId } } : { NOT: { path: { eq: null } } };\n\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 graphqlSort = useMemo(() => {\n if (sorting.length === 0) {\n return defaultSort;\n }\n\n const primarySort = sorting.map(({ id, desc }) => ({ [id]: desc ? 'DESC' : 'ASC' }));\n const hasIdSort = primarySort.some((entry) => '_id' in entry);\n\n if (hasIdSort) {\n return primarySort;\n }\n\n // Tie-break so offset pages stay stable when sort values collide.\n return [...primarySort, { _id: 'DESC' }];\n }, [sorting]);\n\n const variables = useMemo(() => ({ where, offset: 0, limit: pageSize, sort: graphqlSort }), [where, graphqlSort]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n setSorting(updater);\n }\n\n function handleViewModeChange(mode: AssetViewMode): void {\n setViewMode(mode);\n setStoredViewMode(mode);\n }\n\n const { isLoading, isLoadingMore, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n selection: 'list',\n });\n\n const isInitialLoading = isSearchLoading || (isLoading && (data == null || data.length === 0));\n\n const rowsCount = data?.length ?? 0;\n const hasMore = !isSearchLoading && count > 0 && rowsCount > 0 && rowsCount < count;\n\n const handleLoadMore = useCallback(() => {\n fetchMore({\n variables: {\n // Offset is tracked inside useEntityQuery from page windows; value here is ignored.\n offset: 0,\n limit: pageSize,\n },\n });\n }, [fetchMore]);\n\n const loadingData = useMemo(\n () => Array.from({ length: pageSize }, (_, index) => ({ _id: `loading-${index}` }) as AttributeValue),\n []\n );\n const loadingColumns = useMemo(() => getLoadingColumns(columnsDefinition), [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 <div className=\"fk:mb-4 fk:flex fk:items-center fk:gap-2 fk:pr-3\">\n <h2 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Asset Manager</h2>\n {!isInitialLoading ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {count.toLocaleString()} {count === 1 ? 'record' : 'records'}\n </span>\n ) : null}\n </div>\n {!schemaErrorMessage ? (\n <AssetDropZone disabled={!canMutate || isUploading} onDropFiles={uploadFiles}>\n {viewMode === 'list' ? (\n <DataTable\n classNames={{ row: 'fk:h-20' }}\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n ) : (\n <AssetGrid\n columns={columnsDefinition}\n data={isInitialLoading ? [] : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoading={isInitialLoading}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n )}\n </AssetDropZone>\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 '../../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"]}