@flexkit/studio 0.2.12 → 0.2.14

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 (94) hide show
  1. package/dist/activity-nav-button-7SVTTHBQ.js +2 -0
  2. package/dist/{activity-nav-button-LZESIQL2.js.map → activity-nav-button-7SVTTHBQ.js.map} +1 -1
  3. package/dist/astro.js +1 -1
  4. package/dist/{chat-page-EKOGKEFR.js → chat-page-L427VVVR.js} +3 -3
  5. package/dist/{chat-page-EKOGKEFR.js.map → chat-page-L427VVVR.js.map} +1 -1
  6. package/dist/chunk-2HYQVMP3.js +3 -0
  7. package/dist/chunk-2HYQVMP3.js.map +1 -0
  8. package/dist/chunk-5CVDMZUI.js +3 -0
  9. package/dist/chunk-5CVDMZUI.js.map +1 -0
  10. package/dist/chunk-6YJ3DLIU.js +2 -0
  11. package/dist/{chunk-OFJOZMCR.js.map → chunk-6YJ3DLIU.js.map} +1 -1
  12. package/dist/{chunk-BOXFB6E6.js → chunk-7ELMTFZ4.js} +2 -2
  13. package/dist/{chunk-BOXFB6E6.js.map → chunk-7ELMTFZ4.js.map} +1 -1
  14. package/dist/chunk-ALCK2BJY.js +2 -0
  15. package/dist/chunk-ALCK2BJY.js.map +1 -0
  16. package/dist/chunk-CAZ6EUR2.js +2 -0
  17. package/dist/chunk-CAZ6EUR2.js.map +1 -0
  18. package/dist/chunk-D5WYD5M4.js +2 -0
  19. package/dist/chunk-D5WYD5M4.js.map +1 -0
  20. package/dist/{chunk-2AVINVYN.js → chunk-GFAOY74A.js} +28 -18
  21. package/dist/chunk-MGXG5PWU.js +384 -0
  22. package/dist/chunk-MGXG5PWU.js.map +1 -0
  23. package/dist/{chunk-EWBEPYML.js → chunk-MJVWFANP.js} +3 -3
  24. package/dist/{chunk-EWBEPYML.js.map → chunk-MJVWFANP.js.map} +1 -1
  25. package/dist/chunk-NLRSLQUT.js +3 -0
  26. package/dist/chunk-NLRSLQUT.js.map +1 -0
  27. package/dist/{chunk-F2DHCPWW.js → chunk-P5ZRTZ5Z.js} +2 -2
  28. package/dist/{chunk-F2DHCPWW.js.map → chunk-P5ZRTZ5Z.js.map} +1 -1
  29. package/dist/{chunk-QQSI7BPK.js → chunk-R64ELY3B.js} +3 -3
  30. package/dist/{chunk-QQSI7BPK.js.map → chunk-R64ELY3B.js.map} +1 -1
  31. package/dist/chunk-U5D3EDCY.js +2 -0
  32. package/dist/chunk-U5D3EDCY.js.map +1 -0
  33. package/dist/chunk-W7Z4MY43.js +2 -0
  34. package/dist/{chunk-7IHEL6LU.js.map → chunk-W7Z4MY43.js.map} +1 -1
  35. package/dist/chunk-XWBACTNR.js +3 -0
  36. package/dist/{chunk-C47FNPLK.js.map → chunk-XWBACTNR.js.map} +1 -1
  37. package/dist/chunk-ZZRA4567.js +2 -0
  38. package/dist/{chunk-V64P56OA.js.map → chunk-ZZRA4567.js.map} +1 -1
  39. package/dist/electron.d.ts +103 -0
  40. package/dist/electron.js +131 -0
  41. package/dist/index.css +9 -0
  42. package/dist/index.d.ts +33 -1
  43. package/dist/index.js +9 -9
  44. package/dist/index.js.map +1 -1
  45. package/dist/list-WJLU3K2X.js +2 -0
  46. package/dist/{list-DOTORSUC.js.map → list-WJLU3K2X.js.map} +1 -1
  47. package/dist/nextjs.js +1 -1
  48. package/dist/{pages-ILAXYS2J.js → pages-3EK5GS2T.js} +4 -4
  49. package/dist/{pages-ILAXYS2J.js.map → pages-3EK5GS2T.js.map} +1 -1
  50. package/dist/plugin-pages-PQO22EOE.js +2 -0
  51. package/dist/{plugin-pages-RKJRHKNL.js.map → plugin-pages-PQO22EOE.js.map} +1 -1
  52. package/dist/root-4EALW3G6.js +2 -0
  53. package/dist/{root-RE3ZNXQ3.js.map → root-4EALW3G6.js.map} +1 -1
  54. package/dist/root-BA7BLCFR.js +23 -0
  55. package/dist/root-BA7BLCFR.js.map +1 -0
  56. package/dist/root-YNGCF5QM.js +31 -0
  57. package/dist/{root-JB3NZZNZ.js.map → root-YNGCF5QM.js.map} +1 -1
  58. package/dist/root-ZF62TR5Z.js +2 -0
  59. package/dist/{root-76YQTZUI.js.map → root-ZF62TR5Z.js.map} +1 -1
  60. package/dist/search-QHMCAT7O.js +2 -0
  61. package/dist/{search-WUO6VWKU.js.map → search-QHMCAT7O.js.map} +1 -1
  62. package/dist/skills-pages-HIBSAVOP.js +2 -0
  63. package/dist/{skills-pages-POKCFHOL.js.map → skills-pages-HIBSAVOP.js.map} +1 -1
  64. package/dist/tanstack-start.js +1 -1
  65. package/dist/user-nav-36ACWXOW.js +2 -0
  66. package/dist/{user-nav-DCAHVWN7.js.map → user-nav-36ACWXOW.js.map} +1 -1
  67. package/package.json +10 -6
  68. package/dist/activity-nav-button-LZESIQL2.js +0 -2
  69. package/dist/chunk-2HSIWUH3.js +0 -3
  70. package/dist/chunk-2HSIWUH3.js.map +0 -1
  71. package/dist/chunk-6YOVF2AD.js +0 -384
  72. package/dist/chunk-6YOVF2AD.js.map +0 -1
  73. package/dist/chunk-7IHEL6LU.js +0 -2
  74. package/dist/chunk-ACS3TGGP.js +0 -2
  75. package/dist/chunk-ACS3TGGP.js.map +0 -1
  76. package/dist/chunk-C47FNPLK.js +0 -3
  77. package/dist/chunk-HYSTMQD7.js +0 -2
  78. package/dist/chunk-HYSTMQD7.js.map +0 -1
  79. package/dist/chunk-KXAGLQ2B.js +0 -2
  80. package/dist/chunk-KXAGLQ2B.js.map +0 -1
  81. package/dist/chunk-OFJOZMCR.js +0 -2
  82. package/dist/chunk-TYDYAOQ7.js +0 -3
  83. package/dist/chunk-TYDYAOQ7.js.map +0 -1
  84. package/dist/chunk-V64P56OA.js +0 -2
  85. package/dist/list-DOTORSUC.js +0 -2
  86. package/dist/plugin-pages-RKJRHKNL.js +0 -2
  87. package/dist/root-76YQTZUI.js +0 -2
  88. package/dist/root-A4VHAEK5.js +0 -23
  89. package/dist/root-A4VHAEK5.js.map +0 -1
  90. package/dist/root-JB3NZZNZ.js +0 -31
  91. package/dist/root-RE3ZNXQ3.js +0 -2
  92. package/dist/search-WUO6VWKU.js +0 -2
  93. package/dist/skills-pages-POKCFHOL.js +0 -2
  94. package/dist/user-nav-DCAHVWN7.js +0 -2
@@ -0,0 +1,2 @@
1
+ import'./index.css';export{b as CatalogHeader,d as InstalledPluginsPage,a as PluginConnectControl,e as PluginDetailPage,c as PluginsPage}from'./chunk-7ELMTFZ4.js';import'./chunk-ALCK2BJY.js';import'./chunk-NLRSLQUT.js';import'./chunk-XWBACTNR.js';import'./chunk-2HYQVMP3.js';import'./chunk-5CVDMZUI.js';import'./chunk-YCCFUGWJ.js';import'./chunk-32ZU4MLE.js';import'./chunk-HDOIOXMP.js';import'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';import'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=plugin-pages-PQO22EOE.js.map
2
+ //# sourceMappingURL=plugin-pages-PQO22EOE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"plugin-pages-RKJRHKNL.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"plugin-pages-PQO22EOE.js"}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {c}from'./chunk-2DXR5NJV.js';import {f}from'./chunk-XWBACTNR.js';import {g}from'./chunk-2HYQVMP3.js';import'./chunk-5CVDMZUI.js';import {L,Y,P}from'./chunk-YCCFUGWJ.js';import'./chunk-32ZU4MLE.js';import'./chunk-HDOIOXMP.js';import'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';import'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {Outlet}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';var S="flexkit:sidebar:state";function A(){let[,a]=g(),{currentProject:t}=f(),c$1=t?.schema??[],u=t?.menuGroups??[],p=c(c$1,a.user?.spaces),f$1=document.cookie.split("; ").find(d=>d.startsWith(`${S}=`))?.split("=")[1]!=="false";return jsxs(L,{defaultOpen:f$1,children:[jsx(Y,{schema:p,menuGroups:u}),jsx(P,{children:jsx(Outlet,{})})]})}export{A as Root};//# sourceMappingURL=root-4EALW3G6.js.map
2
+ //# sourceMappingURL=root-4EALW3G6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/desk/root.tsx"],"names":["SIDEBAR_COOKIE_NAME","Root","auth","useAuth","currentProject","useConfig","schema","menuGroups","visibleSchema","filterEntitiesForSpaces","defaultOpen","row","jsxs","SidebarProvider","jsx","Sidebar","SidebarInset","Outlet"],"mappings":"2bAOA,IAAMA,CAAAA,CAAsB,uBAAA,CAErB,SAASC,CAAAA,EAAoB,CAClC,GAAM,EAAGC,CAAI,CAAA,CAAIC,CAAAA,GACX,CAAE,cAAA,CAAAC,CAAe,CAAA,CAAIC,CAAAA,GACrBC,GAAAA,CAASF,CAAAA,EAAgB,QAAU,EAAC,CACpCG,EAAaH,CAAAA,EAAgB,UAAA,EAAc,EAAC,CAG5CI,CAAAA,CAAgBC,EAAwBH,GAAAA,CAAQJ,CAAAA,CAAK,MAAM,MAAM,CAAA,CACjEQ,GAAAA,CACJ,QAAA,CAAS,OACN,KAAA,CAAM,IAAI,EACV,IAAA,CAAMC,CAAAA,EAAQA,EAAI,UAAA,CAAW,CAAA,EAAGX,CAAmB,CAAA,CAAA,CAAG,CAAC,GACtD,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,GAAM,QAExB,OACEY,IAAAA,CAACC,EAAA,CAAgB,WAAA,CAAaH,IAC5B,QAAA,CAAA,CAAAI,GAAAA,CAACC,EAAA,CAAQ,MAAA,CAAQP,EAAe,UAAA,CAAYD,CAAAA,CAAY,EACxDO,GAAAA,CAACE,CAAAA,CAAA,CACC,QAAA,CAAAF,GAAAA,CAACG,OAAA,EAAO,CAAA,CACV,GACF,CAEJ","file":"root-RE3ZNXQ3.js","sourcesContent":["import { JSX } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { filterEntitiesForSpaces } from '../../core/spaces';\nimport { useAuth } from '../../auth/auth-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { Sidebar, SidebarInset, SidebarProvider } from '../../ui';\n\nconst SIDEBAR_COOKIE_NAME = 'flexkit:sidebar:state';\n\nexport function Root(): JSX.Element {\n const [, auth] = useAuth();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const menuGroups = currentProject?.menuGroups ?? [];\n // Space-bound entities are hidden from non-members; the generated\n // @authorization rules block their data server-side either way.\n const visibleSchema = filterEntitiesForSpaces(schema, auth.user?.spaces);\n const defaultOpen =\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${SIDEBAR_COOKIE_NAME}=`))\n ?.split('=')[1] !== 'false';\n\n return (\n <SidebarProvider defaultOpen={defaultOpen}>\n <Sidebar schema={visibleSchema} menuGroups={menuGroups} />\n <SidebarInset>\n <Outlet />\n </SidebarInset>\n </SidebarProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/desk/root.tsx"],"names":["SIDEBAR_COOKIE_NAME","Root","auth","useAuth","currentProject","useConfig","schema","menuGroups","visibleSchema","filterEntitiesForSpaces","defaultOpen","row","jsxs","SidebarProvider","jsx","Sidebar","SidebarInset","Outlet"],"mappings":"udAOA,IAAMA,CAAAA,CAAsB,uBAAA,CAErB,SAASC,CAAAA,EAAoB,CAClC,GAAM,EAAGC,CAAI,CAAA,CAAIC,CAAAA,GACX,CAAE,cAAA,CAAAC,CAAe,CAAA,CAAIC,CAAAA,GACrBC,GAAAA,CAASF,CAAAA,EAAgB,QAAU,EAAC,CACpCG,EAAaH,CAAAA,EAAgB,UAAA,EAAc,EAAC,CAG5CI,CAAAA,CAAgBC,EAAwBH,GAAAA,CAAQJ,CAAAA,CAAK,MAAM,MAAM,CAAA,CACjEQ,GAAAA,CACJ,QAAA,CAAS,OACN,KAAA,CAAM,IAAI,EACV,IAAA,CAAMC,CAAAA,EAAQA,EAAI,UAAA,CAAW,CAAA,EAAGX,CAAmB,CAAA,CAAA,CAAG,CAAC,GACtD,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,GAAM,QAExB,OACEY,IAAAA,CAACC,EAAA,CAAgB,WAAA,CAAaH,IAC5B,QAAA,CAAA,CAAAI,GAAAA,CAACC,EAAA,CAAQ,MAAA,CAAQP,EAAe,UAAA,CAAYD,CAAAA,CAAY,EACxDO,GAAAA,CAACE,CAAAA,CAAA,CACC,QAAA,CAAAF,GAAAA,CAACG,OAAA,EAAO,CAAA,CACV,GACF,CAEJ","file":"root-4EALW3G6.js","sourcesContent":["import { JSX } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { filterEntitiesForSpaces } from '../../core/spaces';\nimport { useAuth } from '../../auth/auth-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { Sidebar, SidebarInset, SidebarProvider } from '../../ui';\n\nconst SIDEBAR_COOKIE_NAME = 'flexkit:sidebar:state';\n\nexport function Root(): JSX.Element {\n const [, auth] = useAuth();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const menuGroups = currentProject?.menuGroups ?? [];\n // Space-bound entities are hidden from non-members; the generated\n // @authorization rules block their data server-side either way.\n const visibleSchema = filterEntitiesForSpaces(schema, auth.user?.spaces);\n const defaultOpen =\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${SIDEBAR_COOKIE_NAME}=`))\n ?.split('=')[1] !== 'false';\n\n return (\n <SidebarProvider defaultOpen={defaultOpen}>\n <Sidebar schema={visibleSchema} menuGroups={menuGroups} />\n <SidebarInset>\n <Outlet />\n </SidebarInset>\n </SidebarProvider>\n );\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import'./index.css';import {c as c$3,a as a$3}from'./chunk-6YJ3DLIU.js';import {a as a$1}from'./chunk-W7Z4MY43.js';import {a as a$2}from'./chunk-3C2EG3SI.js';import {s,K,u,v,w,y as y$1,D,j,e,h,g,B,C,x as x$1,F,H,G,I}from'./chunk-MGXG5PWU.js';import {c}from'./chunk-P6BZ4QP7.js';import {b as b$4}from'./chunk-CAZ6EUR2.js';import {b as b$1}from'./chunk-ZZRA4567.js';import'./chunk-2DXR5NJV.js';import {f,b}from'./chunk-XWBACTNR.js';import'./chunk-2HYQVMP3.js';import'./chunk-5CVDMZUI.js';import {x,y,z,s as s$1,ma,c as c$4,d as d$1,o as o$2}from'./chunk-YCCFUGWJ.js';import {c as c$2,d,h as h$1,i,k,l,j as j$1,w as w$1,n,o as o$1,p,q,r,t as t$1,s as s$2}from'./chunk-32ZU4MLE.js';import'./chunk-HDOIOXMP.js';import {e as e$2,g as g$1,h as h$2,j as j$2,o,t}from'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';import {a,b as b$2,c as c$1,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$3}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.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 we={where:{},limit:500,offset:0,sort:[{name:"ASC"}]},Y={selection:"display",includeCount:false};function Pt(){let{scope:e$3}=c(),{currentProjectSchema:n}=f(),[t,a$1,i$1]=D(),[f$1,c$3]=useState(""),[d$1,w]=useState(false),[v,u$1]=useState(false),[l$1,r]=useState(null),[M,g$2]=useState(false),[E,I]=useState(null),[J,x]=useState(""),[_,U]=useState(false),[R,B]=useState(false),h$3=b$1(),D$1="_tag",m="_tags",{data:C,isLoading:S}=u({entityNamePlural:m,schema:n,scope:e$3,variables:we,...Y}),z=(Array.isArray(C)?C:[]).map(s=>{let O=s;return {_id:O._id,name:O.name}}),L=useCallback(async()=>{let s=f$1.trim();if(!s)return;U(true);let O=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}`,F=j(m,n,{name:{value:s,disabled:false,scope:"default"}},O),H=e(m,e$3,n,Y),K=gql`
2
+ ${H.query}
3
+ `;await new Promise(y=>{a$1(gql`
4
+ ${F}
5
+ `),i$1({refetchQueries:[K],onCompleted:()=>{c$3(""),w(false),y();}}),t(true);}),U(false);},[m,t,n,e$3,a$1,i$1,f$1]),q=useCallback(async s=>{B(true);let O=h(D$1,n,s),Z=e(m,e$3,n,Y),F=gql`
6
+ ${Z.query}
7
+ `;await new Promise((H,K)=>{a$1(gql`
8
+ ${O}
9
+ `),i$1({variables:{where:{_id:{eq:s}}},refetchQueries:[F],onCompleted:()=>{H();},onError:y=>{K(y);}}),t(true);}),B(false);},[D$1,m,t,n,e$3,a$1,i$1]),b=useCallback(async()=>{let s=J.trim();if(!s||!E)return;U(true);let O={name:{value:s,disabled:false,scope:"default"}},Z={},F=g(m,E._id,e$3,n,Z,O),H=e(m,e$3,n,Y),K=gql`
10
+ ${H.query}
11
+ `;await new Promise(y=>{a$1(gql`
12
+ ${F}
13
+ `),i$1({variables:{where:{_id:{eq:E._id}}},refetchQueries:[K],onCompleted:()=>{g$2(false),I(null),x(""),y();}}),t(true);}),U(false);},[J,m,t,n,e$3,a$1,i$1,E]);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"}),h$3?jsx(a,{children:jsxs(b$2,{children:[jsx(c$1,{asChild:true,children:jsxs(c$2,{open:d$1,onOpenChange:w,children:[jsx(d,{asChild:true,children:jsxs(b$3,{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(h$1,{children:[jsxs(i,{children:[jsx(k,{children:"New tag"}),jsx(l,{className:"fk:sr-only",children:"Create a new tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(s$1,{autoFocus:true,value:f$1,placeholder:"New tag name",onChange:s=>c$3(s.target.value),onKeyDown:s=>{s.key==="Enter"&&L();}})}),jsx(j$1,{children:jsxs(b$3,{disabled:_,onClick:L,variant:"default",children:[_?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Add"]})})]})]})}),jsx(e$1,{children:jsx("p",{children:"Add tag"})})]})}):jsx("div",{className:"fk:ml-auto",children:jsx(ma,{disabled:true,children:jsxs(b$3,{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(w$1,{className:"fk:h-full",children:jsx("div",{className:"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2",children:S?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(s=>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:s.name}),jsxs(e$2,{children:[jsx(ma,{disabled:!h$3,children:jsx(g$1,{asChild:true,children:jsx(b$3,{"aria-label":`Actions for ${s.name}`,disabled:!h$3,title:h$3?`Actions for ${s.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$2,{align:"end",className:"w-[160px]",children:[jsx(j$2,{onClick:()=>{I(s),x(s.name),g$2(true);},children:"Edit"}),jsx(o,{}),jsx(j$2,{className:"fk:text-destructive",onClick:()=>{r(s),u$1(true);},children:"Remove"})]})]})]},s._id))})}),jsx(c$2,{open:M,onOpenChange:g$2,children:jsxs(h$1,{children:[jsxs(i,{children:[jsx(k,{children:"Edit tag"}),jsx(l,{className:"fk:sr-only",children:"Rename an existing tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(s$1,{autoFocus:true,value:J,placeholder:"Tag name",onChange:s=>x(s.target.value),onKeyDown:s=>{s.key==="Enter"&&b();}})}),jsxs(j$1,{children:[jsx(b$3,{disabled:_,variant:"secondary",onClick:()=>{g$2(false),I(null);},children:"Cancel"}),jsxs(b$3,{disabled:_,onClick:b,variant:"default",children:[_?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Save"]})]})]})}),jsx(c$2,{open:v,onOpenChange:u$1,children:jsxs(h$1,{children:[jsxs(i,{children:[jsx(k,{children:"Delete tag"}),jsx(l,{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:l$1?.name}),"?"]}),jsxs(j$1,{children:[jsx(b$3,{disabled:R,variant:"secondary",onClick:()=>{u$1(false),r(null);},children:"Cancel"}),jsxs(b$3,{disabled:R,variant:"destructive",onClick:()=>{l$1&&(async()=>(await q(l$1._id),u$1(false),r(null)))();},children:[R?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Delete"]})]})]})})]})}function Fe(e){return Array.from(e.dataTransfer.types).includes("Files")}function Rt({children:e,disabled:n=false,onDropFiles:t}){let a=useRef(0),[i,f]=useState(false);function c(){a.current=0,f(false);}function d(l){Fe(l)&&(l.preventDefault(),l.stopPropagation(),a.current+=1,n||f(true));}function w(l){Fe(l)&&(l.preventDefault(),l.stopPropagation(),l.dataTransfer.dropEffect=n?"none":"copy");}function v(l){Fe(l)&&(l.preventDefault(),l.stopPropagation(),a.current=Math.max(0,a.current-1),a.current===0&&f(false));}function u(l){if(!Fe(l)||(l.preventDefault(),l.stopPropagation(),c(),n))return;let r=Array.from(l.dataTransfer.files);r.length!==0&&t(r);}return jsxs("div",{className:"fk:relative fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",onDragEnter:d,onDragLeave:v,onDragOver:w,onDrop:u,children:[jsx("div",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:e}),i?jsx("div",{"aria-hidden":true,className:"fk:pointer-events-none fk:absolute fk:inset-0 fk:z-30 fk:flex fk:items-center fk:justify-center fk:rounded-md fk:border-2 fk:border-dashed fk:border-primary fk:bg-background/80 fk:corner-squircle",children:jsx("p",{className:"fk:text-sm fk:font-medium fk:text-foreground",children:"Drop files to upload"})}):null]})}var Vt=`_updatedAt
14
+ tags(limit: 3, offset: 0) {
15
+ _id
16
+ name
17
+ }
18
+ `;function Ve({assetIds:e,mode:n$1,onModeChange:t,onCompleted:a}){let{scope:i}=c(),f$1=a$3("_assets"),[c$1,d,w]=D(),{currentProjectSchema:v}=f(),[u$1,l]=useState([]),[r$1,M]=useState(false),{data:g$1}=u({entityNamePlural:"_tags",schema:v,scope:i,variables:we,...Y}),E=useMemo(()=>(Array.isArray(g$1)?g$1:[]).map(D=>({_id:D._id,name:D.name})),[g$1]),I=useCallback(()=>{l([]);},[]),J=useCallback(h=>{!h&&!r$1&&(t(null),I());},[r$1,t,I]),x=useCallback(h=>{let m=(h?.update_assets?._assets??[]).filter(C=>typeof C?._id=="string").map(C=>{let S=(Array.isArray(C.tags)?C.tags:[]).map(z=>z.name).filter(Boolean).slice(0,3).join(", ");return {_id:C._id,attributes:{tags:S,...typeof C._updatedAt=="string"?{_updatedAt:C._updatedAt}:{}}}});m.length>0&&f$1(m);},[f$1]),_=useCallback(async()=>{if(!(e.length===0||u$1.length===0||r$1)){M(true);try{let h={tags:{relationships:{connect:u$1.map(m=>({_id:m}))},disabled:!1,scope:i}},D=g("_assets",e[0]??"",i,v,{},h,{responseFields:Vt});await new Promise((m,C)=>{d(gql`
19
+ ${D}
20
+ `),w({variables:{where:{_id:{in:e}}},onCompleted:S=>{x(S),m();},onError:S=>C(S)}),c$1(!0);}),a?.(),I(),t(null);}catch{}finally{M(false);}}},[x,e,r$1,a,t,I,c$1,v,i,u$1,d,w]),U=useCallback(async()=>{if(!(e.length===0||u$1.length===0||r$1)){M(true);try{let h={tags:{relationships:{disconnect:u$1},disabled:!1,scope:i}},D=g("_assets",e[0]??"",i,v,{},h,{responseFields:Vt});await new Promise((m,C)=>{d(gql`
21
+ ${D}
22
+ `),w({variables:{where:{_id:{in:e}}},onCompleted:S=>{x(S),m();},onError:S=>C(S)}),c$1(!0);}),a?.(),I(),t(null);}catch{}finally{M(false);}}},[x,e,r$1,a,t,I,c$1,v,i,u$1,d,w]),R=n$1==="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(n,{open:n$1!==null,onOpenChange:J,children:[jsx(o$1,{placeholder:"Search tags..."}),jsxs(p,{className:"fk:h-75",children:[jsx(q,{children:"No tags found."}),jsx(r,{heading:"Tags",children:E.map(h=>{let D=u$1.includes(h._id);return jsxs(t$1,{disabled:r$1,onSelect:()=>{r$1||l(m=>D?m.filter(C=>C!==h._id):[...m,h._id]);},children:[jsx("input",{className:"fk:mr-2",checked:D,onChange:()=>{},type:"checkbox"}),h.name]},h._id)})})]}),jsx(s$2,{}),jsx("div",{className:"fk:p-2",children:jsxs(b$3,{className:"fk:w-full",disabled:u$1.length===0||r$1,onClick:R?U:_,children:[r$1?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):null,B]})})]})}function qe({overlay:e=false,row:n}){let[t,a]=useState(null),[i,f]=useState(null),c=B(),d=b$1(),w=n.original,v=w._id??"",u=w.url??"";function l(){c({type:"DeleteEntity",payload:{entityId:v,entityName:b.name}});}function r(g,E){navigator.clipboard.writeText(E),a(g),window.setTimeout(()=>a(null),1500);}return jsxs(Fragment,{children:[jsxs(e$2,{children:[jsx(g$1,{asChild:true,children:jsxs(b$3,{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:g=>g.stopPropagation(),variant:"ghost",children:[jsx(Ellipsis,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Open menu"})]})}),jsxs(h$2,{align:"start",className:"fk:w-45",children:[jsxs(j$2,{disabled:!v,onClick:g=>{g.stopPropagation(),r("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$2,{disabled:!u,onClick:g=>{g.stopPropagation(),r("url",u);},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,{}),jsxs(j$2,{disabled:!v||!d,onClick:g=>{g.stopPropagation(),f("add");},children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Add tag"]}),jsxs(j$2,{disabled:!v||!d,onClick:g=>{g.stopPropagation(),f("remove");},children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Remove tag"]}),jsx(o,{}),jsxs(j$2,{className:"fk:text-destructive",disabled:!v||!d,onClick:g=>{g.stopPropagation(),l();},children:[jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete"]})]})]}),i!==null?jsx(Ve,{assetIds:v?[v]:[],mode:i,onModeChange:f}):null]})}var Do=FileIcon,Co="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 To(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 Bt({columns:e,data:n,entityName:t$1,hasMore:a=false,isLoading:i=false,isLoadingMore:f=false,onLoadMore:c,onSortingChange:d,pageSize:w,sorting:v,toolbarComponent:u}){let l=useRef(null),{schemaErrorMessage:r}=s(),[M,g]=useState({}),[E,I]=useState({}),[J,x]=useState([]),[_,U]=useState([]),R=v??_;useEffect(()=>{l.current?.scrollTo({top:0});},[t$1]);function B(b){if(d){d(b);return}U(b);}let h=useReactTable({data:n,columns:e,state:{sorting:R,columnVisibility:E,rowSelection:M,columnFilters:J},initialState:{pagination:{pageSize:w??50}},enableRowSelection:true,onRowSelectionChange:g,onSortingChange:B,onColumnFiltersChange:x,onColumnVisibilityChange:I,getCoreRowModel:getCoreRowModel(),getFilteredRowModel:getFilteredRowModel(),getPaginationRowModel:getPaginationRowModel(),getSortedRowModel:getSortedRowModel(),getRowId:b=>b._id,manualFiltering:true,manualPagination:true,manualSorting:true}),{rows:D}=h.getRowModel(),m=useRef(c),C=useRef(a),S=useRef(f);m.current=c,C.current=a,S.current=f;let z=useCallback(b=>{if(!m.current||!C.current||S.current)return;let s=b??l.current;s&&x$1(s)&&(S.current=true,m.current());},[]),L=b$4();useEffect(()=>{L&&z();},[z,D.length,a,f,L]);function q(b){z(b.currentTarget);}return r?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:[u?u(h):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:l,children:[i?jsx("div",{className:"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3",children:Array.from({length:w??50},(b,s)=>jsxs("div",{className:"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle",children:[jsx(t,{className:"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle"}),jsx(t,{className:"fk:mt-2 fk:h-3 fk:w-[75%]"}),jsx(t,{className:"fk:mt-1.5 fk:h-3 fk:w-[50%]"})]},`skeleton-${s}`))}):null,!i&&D.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,!i&&D.length>0?jsx("div",{className:"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3",children:D.map(b=>jsx(So,{row:b},b.id))}):null]})]})]})}function So({row:e}){let n=e.original,t=F(n)||"Untitled",a=n.mimeType??"",i=To(n.size),f=e.getIsSelected(),c=[a,i].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(o$2,{className:"fk:border-white!","aria-label":`Select ${t}`,checked:f,onCheckedChange:d=>{e.toggleSelected(!!d);},onClick:d=>d.stopPropagation()})}),jsx("div",{className:"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference",children:jsx(qe,{overlay:true,row:e})}),jsx(No,{asset:n,filename:t}),jsx("div",{className:"fk:mt-2 fk:truncate fk:text-xs fk:font-medium",title:t,children:t}),c?jsx("div",{className:"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground",title:c,children:c}):null]})}function No({asset:e,filename:n}){let[t,a]=useState(false),[i$1,f]=useState(false),c=e.url??"";if(!c&&!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(!H(e)||!c){let r=G(e),M=defaultStyles[r];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(Do,{extension:r,...M||{}})})}let w=I(c,{width:320,height:320}),v=c;function u(r){r.stopPropagation(),f(false),a(true);}function l$1(r){a(r),r||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 ${Co} fk:corner-squircle`,onClick:u,type:"button",children:jsx("img",{alt:n,className:"fk:h-full fk:w-full fk:object-contain",src:w})}),jsx(c$2,{open:t,onOpenChange:l$1,children:jsxs(h$1,{className:"fk:sm:max-w-4xl fk:p-3",children:[jsxs(i,{children:[jsx(k,{className:"fk:sr-only",children:"Asset preview"}),jsx(l,{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:[i$1?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 ${i$1?"fk:opacity-100":"fk:opacity-0"}`,onError:()=>f(true),onLoad:()=>f(true),src:v})]})]})})]})}var Uo=[{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 Ze({entityName:e,isUploading:n=false,table:t,viewMode:a,onUploadClick:i,onViewModeChange:f$1,onSearchLoadingChange:c$1,onSearchWhereChange:d}){let w=t.getState().columnFilters.length>0,{projectId:v}=useParams(),u$1=B(),{scope:l}=c(),[r,M]=useState(null),{currentProjectSchema:g}=f(),E=b$1(),[I,J]=useState(""),x=useRef({}),_=useRef({});function U(){return {searchRequests:{searches:[{collection:"_assets"},{collection:"_tags"}]},commonParams:{q:""}}}let R=useMemo(()=>U(),[]),[B$1,h]=useState(R),{results:D,isLoading:m}=a$1(v??"",B$1),C$1=useRef(""),S=I.trim(),z=B$1.commonParams.q??"",L=S.length>0&&(m||z!==S),q=useMemo(()=>Bo(p=>{h({...R,commonParams:{q:p}});},300),[R]);useEffect(()=>()=>{q.cancel();},[q]);let b=t.getSelectedRowModel().rows.map(p=>p.original._id),{data:s}=u({entityNamePlural:"_tags",schema:g,scope:l,variables:we,...Y}),O=useMemo(()=>(Array.isArray(s)?s:[]).map(N=>({_id:N._id,name:N.name})),[s]),Z=useMemo(()=>O.map(p=>({value:p._id,label:p.name})),[O]),F=useCallback(()=>{if(!d)return;let p=[];Object.keys(x.current).length>0&&p.push(x.current),Object.keys(_.current).length>0&&p.push(_.current);let N=p.length===0?{}:p.length===1?p[0]:{AND:p},j=JSON.stringify(N);C$1.current!==j&&(C$1.current=j,d(N));},[d]);function H(){q.cancel(),J(""),h({...R,commonParams:{q:""}}),x.current={},F();}async function K(){u$1({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${b.length} asset${b.length>1?"s":""}`,dialogMessage:b.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:()=>{u$1({type:"DeleteEntity",_id:`delete-batch-${Date.now()}`,payload:{entityId:b,entityName:e,silent:true}}),t.resetRowSelection();}}}});}useEffect(()=>{c$1?.(L);},[L,c$1]),useEffect(()=>{if(!d)return;if(S.length===0){x.current={},F();return}if(L)return;let p=D??[],N={};if(p.length===0)N={_id:{in:[]}};else {let j=p.filter(V=>V._entityNamePlural==="_assets").map(V=>V._id),xe=p.filter(V=>V._entityNamePlural==="_tags").map(V=>({tags:{some:{_id:{eq:V._id}}}})),Q=[];j.length>0&&Q.push({_id:{in:j}}),Q.push(...xe),Q.length===0?N={_id:{in:[]}}:Q.length===1?N=Q[0]:N={OR:Q};}x.current=N,F();},[F,L,d,D,S]);let y=JSON.stringify(t.getState().columnFilters);return useEffect(()=>{if(!d)return;let p=t.getState().columnFilters.find(V=>V.id==="mimeType"),N=Array.isArray(p?.value)?p?.value:[],j=t.getState().columnFilters.find(V=>V.id==="tags"),xe=Array.isArray(j?.value)?j?.value:[],Q=[];if(N.length>0&&Q.push({mimeType:{in:N}}),xe.length>0){let V=xe.map(Zt=>({tags:{some:{_id:{eq:Zt}}}}));Q.push(V.length===1?V[0]:{OR:V});}Q.length===0?_.current={}:Q.length===1?_.current=Q[0]:_.current={AND:Q},F();},[y,F,d,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:[m?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(s$1,{placeholder:"Search assets...",name:"search-assets",value:I,onChange:p=>{let{value:N}=p.target;if(J(N),N.trim().length===0){H();return}q(N.trim());},className:"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7"}),I?jsx(b$3,{"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:H,type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})}):null]}),t.getColumn("mimeType")&&jsx(a$2,{column:t.getColumn("mimeType"),options:Uo,title:"File type"}),t.getColumn("tags")&&jsx(a$2,{column:t.getColumn("tags"),options:Z,title:"Tags"}),w&&jsxs(b$3,{variant:"ghost",onClick:()=>{t.resetColumnFilters(),_.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(C,{table:t})]}),b.length>0?jsx("div",{className:"fk:flex fk:items-center fk:gap-2",children:jsxs(e$2,{children:[jsx(ma,{disabled:!E,children:jsx(g$1,{asChild:true,children:jsxs(b$3,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:!E,size:"sm",variant:"secondary",children:["Actions ",jsx(ListChecks,{className:"fk:ml-2 fk:h-4 fk:w-4"})]})})}),jsxs(h$2,{align:"end",className:"fk:w-[240px]",children:[jsxs(j$2,{onClick:()=>M("add"),children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Add tag"]}),jsxs(j$2,{onClick:()=>M("remove"),children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Remove tag"]}),jsx(o,{}),jsxs(j$2,{onClick:K,className:"fk:text-destructive",children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Delete asset",b.length>1?"s":""," (",b.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:a,onValueChange:p=>{(p==="list"||p==="grid")&&f$1(p);},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(ma,{disabled:!E,children:jsxs(b$3,{"aria-busy":n,className:"fk:h-8 fk:lg:flex",disabled:!E||n,onClick:i,size:"sm",variant:"default",children:[n?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):null,"Upload assets"]})})]}),r!==null?jsx(Ve,{assetIds:b,mode:r,onCompleted:()=>t.resetRowSelection(),onModeChange:M}):null]})}function Bo(e,n=300){let t,a=function(...i){t!==void 0&&clearTimeout(t),t=setTimeout(()=>{t=void 0,e.apply(this,i);},n);};return a.cancel=()=>{t!==void 0&&(clearTimeout(t),t=void 0);},a}var Go=4*1024*1024;function $t(){let{projectId:e}=useParams(),n=c$3(),t=b$1(),[a,i]=useState(false);async function f(c){if(!(!t||a)&&!(c&&c.length===0))try{await n({files:c,maxBytes:Go,multiple:!0,onUploadStart:()=>{i(!0);},projectId:e});}finally{i(false);}}return {canMutate:t,isUploading:a,uploadFiles:c=>f(c),uploadFromDialog:()=>f()}}var Jt="flexkit-asset-manager:viewMode";function Xt(){if(typeof localStorage>"u")return "grid";try{let e=localStorage.getItem(Jt);if(e==="list"||e==="grid")return e}catch{}return "grid"}function Ht(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(Jt,e);}catch{}}var Me=36,Xo=[{_updatedAt:"DESC"},{_id:"DESC"}];function jt(){let e="_assets",{search:n}=useLocation(),a=new URLSearchParams(n).get("id"),{scope:i}=c(),{schemaErrorMessage:f$1}=s(),{currentProject:c$1}=f(),d=c$1?.schema??[],[w$1,v$1]=useState([]),[u$1,l]=useState(()=>Xt()),r=K({attributesSchema:b.attributes,actionsComponent:y=>jsx(qe,{row:y}),checkboxSelect:"multiple",enableColumnSorting:true}),[M,g]=useState({}),[E,I]=useState(false),{canMutate:J,isUploading:x,uploadFiles:_,uploadFromDialog:U}=$t(),R=useMemo(()=>{let y=a?{_id:{eq:a}}:{NOT:{path:{eq:null}}};return !M||Object.keys(M).length===0||a?y:{AND:[y,M]}},[a,M]),B=useMemo(()=>{if(w$1.length===0)return Xo;let y=w$1.map(({id:N,desc:j})=>({[N]:j?"DESC":"ASC"}));return y.some(N=>"_id"in N)?y:[...y,{_id:"DESC"}]},[w$1]),h=useMemo(()=>({where:R,offset:0,limit:Me,sort:B}),[R,B]);function D(y){v$1(y);}function m(y){l(y),Ht(y);}let{isLoading:C,isLoadingMore:S,fetchMore:z,count:L,data:q,isProjectDisabled:b$1}=u({entityNamePlural:e,schema:d,scope:i,variables:h,selection:"list"}),s$1=E||C&&(q==null||q.length===0),O=q?.length??0,Z=!E&&L>0&&O>0&&O<L,F=useCallback(()=>{z({variables:{offset:0,limit:Me}});},[z]),H=useMemo(()=>Array.from({length:Me},(y,p)=>({_id:`loading-${p}`})),[]),K$1=useMemo(()=>Ho(r),[r]);return b$1?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:jsx(v,{})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:[jsx(w,{}),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"}),s$1?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(Rt,{disabled:!J||x,onDropFiles:_,children:u$1==="list"?jsx(y$1,{classNames:{row:"fk:h-20"},columns:s$1?K$1:r,data:s$1?H:q??[],entityName:b.name,hasMore:Z,isLoadingMore:S,pageSize:Me,sorting:w$1,onLoadMore:F,onSortingChange:D,toolbarComponent:y=>jsx(Ze,{entityName:b.name,isUploading:x,table:y,viewMode:u$1,onSearchLoadingChange:I,onSearchWhereChange:g,onUploadClick:U,onViewModeChange:m})}):jsx(Bt,{columns:r,data:s$1?[]:q??[],entityName:b.name,hasMore:Z,isLoading:s$1,isLoadingMore:S,pageSize:Me,sorting:w$1,onLoadMore:F,onSortingChange:D,toolbarComponent:y=>jsx(Ze,{entityName:b.name,isUploading:x,table:y,viewMode:u$1,onSearchLoadingChange:I,onSearchWhereChange:g,onUploadClick:U,onViewModeChange:m})})}),jsx(Outlet,{})]})}function Ho(e){return e.map(n=>({...n,cell:()=>jsx(t,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function zn(){return jsxs(x,{orientation:"horizontal",className:"fk:h-full",children:[jsx(y,{className:"fk:p-3",defaultSize:"82%",children:jsx("div",{className:"fk:flex fk:flex-col fk:h-full",children:jsx(jt,{})})}),jsx(z,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(y,{defaultSize:"18%",minSize:"10%",children:jsx("div",{className:"fk:sm:hidden fk:md:block",children:jsx(Pt,{})})})]})}export{zn as Root};//# sourceMappingURL=root-BA7BLCFR.js.map
23
+ //# sourceMappingURL=root-BA7BLCFR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/apps/asset-manager/tag-query.ts","../src/apps/asset-manager/sidebar.tsx","../src/apps/asset-manager/data-grid/asset-drop-zone.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","hasFileDrag","event","AssetDropZone","children","disabled","onDropFiles","dragDepthRef","useRef","isDragActive","setIsDragActive","clearDragState","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","files","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","EllipsisIcon","CheckIcon","CopyIcon","LinkIcon","MinusIcon","Trash2Icon","FileTypeIconCompat","FileTypeIcon","transparentImageBackground","formatAssetSize","bytes","AssetGrid","columns","hasMore","isLoadingMore","onLoadMore","onSortingChange","pageSize","sortingProp","toolbarComponent","scrollRef","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","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","DataTable","Outlet","column","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle"],"mappings":"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","file":"root-BA7BLCFR.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","import { useRef, useState, type DragEvent, type JSX, type ReactNode } from 'react';\n\ninterface AssetDropZoneProps {\n children: ReactNode;\n disabled?: boolean;\n onDropFiles: (files: File[]) => void;\n}\n\nfunction hasFileDrag(event: DragEvent<HTMLDivElement>): boolean {\n return Array.from(event.dataTransfer.types).includes('Files');\n}\n\nexport function AssetDropZone({ children, disabled = false, onDropFiles }: AssetDropZoneProps): JSX.Element {\n const dragDepthRef = useRef(0);\n const [isDragActive, setIsDragActive] = useState(false);\n\n function clearDragState(): void {\n dragDepthRef.current = 0;\n setIsDragActive(false);\n }\n\n function handleDragEnter(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current += 1;\n\n if (!disabled) {\n setIsDragActive(true);\n }\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = disabled ? 'none' : 'copy';\n }\n\n function handleDragLeave(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n\n if (dragDepthRef.current === 0) {\n setIsDragActive(false);\n }\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n clearDragState();\n\n if (disabled) {\n return;\n }\n\n const files = Array.from(event.dataTransfer.files);\n\n if (files.length === 0) {\n return;\n }\n\n onDropFiles(files);\n }\n\n return (\n <div\n className=\"fk:relative fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <div className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">{children}</div>\n {isDragActive ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:inset-0 fk:z-30 fk:flex fk:items-center fk:justify-center fk:rounded-md fk:border-2 fk:border-dashed fk:border-primary fk:bg-background/80 fk:corner-squircle\"\n >\n <p className=\"fk:text-sm fk:font-medium fk:text-foreground\">Drop files to upload</p>\n </div>\n ) : null}\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"]}
@@ -0,0 +1,31 @@
1
+ import'./index.css';import {f}from'./chunk-XWBACTNR.js';import'./chunk-2HYQVMP3.js';import'./chunk-5CVDMZUI.js';import {x,y as y$1,ga,ha,ia,ja,z}from'./chunk-YCCFUGWJ.js';import {v,w,x as x$1}from'./chunk-32ZU4MLE.js';import'./chunk-HDOIOXMP.js';import'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';import {b,c,e}from'./chunk-USNXQOMJ.js';import {b as b$1}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useMemo,useState,useRef,useEffect,Children,useCallback,Fragment as Fragment$1}from'react';import {createGraphiQLFetcher}from'@graphiql/toolkit';import {GraphiQLProvider,useEditorContext,useExecutionContext,useSchemaContext,useStorageContext,usePluginContext,useCopyQuery,useMergeQuery,usePrettifyEditors,useTheme,ToolbarButton,PrettifyIcon,MergeIcon,CopyIcon,Tooltip,UnStyledButton,PlusIcon,ReloadIcon,KeyboardShortcutIcon,SettingsIcon,Tabs,Tab,QueryEditor,ExecuteButton,VariableEditor,Spinner,ResponseEditor,Dialog,ButtonGroup,Button,isMacOs}from'@graphiql/react';import {HISTORY_PLUGIN,HistoryContextProvider}from'@graphiql/plugin-history';import {ChevronsRight,ChevronsLeft}from'lucide-react';import {jsx,Fragment,jsxs}from'react/jsx-runtime';import'@graphiql/react/style.css';import'@graphiql/plugin-history/style.css';function y({dangerouslyAssumeSchemaIsValid:t,confirmCloseTab:i,defaultQuery:n,defaultTabs:l,externalFragments:f,fetcher:s,getDefaultFieldNames:d,headers:E,inputValueDeprecation:k,introspectionQueryName:M,maxHistoryLength:h,onEditOperationName:A,onSchemaChange:O,onTabChange:B,onTogglePluginVisibility:T,operationName:L,plugins:p,query:C,response:v,schema:R,schemaDescription:I,shouldPersistHeaders:Q,storage:z,validationRules:w,variables:F,visiblePlugin:D,defaultHeaders:U,...m}){if(typeof s!="function")throw new TypeError("The `GraphiQL` component requires a `fetcher` function to be passed as prop.");let V=useMemo(()=>{let S=p??[];return S.some($=>$.title===HISTORY_PLUGIN.title)?S:[HISTORY_PLUGIN,...S]},[p]);return jsx(GraphiQLProvider,{getDefaultFieldNames:d,dangerouslyAssumeSchemaIsValid:t,defaultQuery:n,defaultHeaders:U,defaultTabs:l,externalFragments:f,fetcher:s,headers:E,inputValueDeprecation:k,introspectionQueryName:M,onEditOperationName:A,onSchemaChange:O,onTabChange:B,onTogglePluginVisibility:T,plugins:V,visiblePlugin:D,operationName:L,query:C,response:v,schema:R,schemaDescription:I,shouldPersistHeaders:Q,storage:z,validationRules:w,variables:F,children:jsx(HistoryContextProvider,{maxHistoryLength:h,children:jsx(lt,{confirmCloseTab:i,showPersistHeadersSettings:Q!==false,disableTabs:m.disableTabs??false,forcedTheme:m.forcedTheme,...m})})})}y.Toolbar=ge;y.Footer=ye;var at=["light","dark","system"],H="graphiql-session-tab-",pe="flexkit-explorer:layout",me=3;function it(t){if(typeof t=="number")return t;if(typeof t!="object"||t===null||!("asPercentage"in t))return;let i=t.asPercentage;if(typeof i=="number")return i}function ot(t){return !t||typeof t!="object"||Array.isArray(t)?false:Object.values(t).every(i=>typeof i=="number")}function nt(t){if(typeof window>"u")return;let i=window.localStorage.getItem(t);if(i)try{let n=JSON.parse(i);if(ot(n))return n}catch{return}}function rt(t,i){if(!(typeof window>"u"))try{window.localStorage.setItem(t,JSON.stringify(i));}catch{}}function lt(t){let i=useEditorContext({nonNull:true}),n=useExecutionContext({nonNull:true}),l=useSchemaContext({nonNull:true}),f=useStorageContext(),s=usePluginContext(),[d,E]=useState(false),k=useRef(null),M=useMemo(()=>nt(pe),[]),h=useMemo(()=>t.forcedTheme&&at.includes(t.forcedTheme)?t.forcedTheme:void 0,[t.forcedTheme]),A=useCopyQuery({onCopyQuery:t.onCopyQuery}),O=useMergeQuery(),B=usePrettifyEditors(),{setTheme:T}=useTheme(t.defaultTheme);useEffect(()=>{h==="system"?T(null):(h==="light"||h==="dark")&&T(h);},[h,T]),useEffect(()=>{s?.setVisiblePlugin(s.plugins[0]);},[s]);let[L,p]=useState(null),[C,v$1]=useState(null),R=Children.toArray(t.children),I=R.find(a=>be(a,y.Toolbar))??jsxs(Fragment,{children:[jsx(ToolbarButton,{onClick:B,label:"Prettify query (Shift-Ctrl-P)",children:jsx(PrettifyIcon,{className:"fk:w-6 fk:h-6 fk:block","aria-hidden":"true"})}),jsx(ToolbarButton,{onClick:O,label:"Merge fragments into query (Shift-Ctrl-M)",children:jsx(MergeIcon,{className:"fk:w-6 fk:h-6 fk:block","aria-hidden":"true"})}),jsx(ToolbarButton,{onClick:A,label:"Copy query (Shift-Ctrl-C)",children:jsx(CopyIcon,{className:"fk:w-6 fk:h-6 fk:block","aria-hidden":"true"})}),t.toolbar?.additionalContent,t.toolbar?.additionalComponent&&jsx(t.toolbar.additionalComponent,{})]}),Q=R.find(a=>be(a,y.Footer)),z$1=useCallback(()=>{try{f?.clear(),v$1("success");}catch{v$1("error");}},[f]),w$1=useCallback(a=>{i.setShouldPersistHeaders(a.currentTarget.dataset.value==="true");},[i]),F=()=>{i.addTab();},D=()=>{l.introspect();},U=a=>{i.moveTab(a);},m=useCallback(a=>{p(a.currentTarget.dataset.value);},[]),V=useCallback(a=>{let r=s,u=Number(a.currentTarget.dataset.index);if(!r)return;let x=r.plugins.find((mt,xe)=>u===xe)??null;if(x===r.visiblePlugin){r.setVisiblePlugin(null);return}r.setVisiblePlugin(x);},[s]),S=useCallback(a=>{a||p(null);},[]),$=useCallback(a=>{a||(p(null),v$1(null));},[]),ke=jsx(Tooltip,{label:"Add tab",children:jsx(UnStyledButton,{type:"button",className:"graphiql-tab-add",onClick:F,"aria-label":"Add tab",children:jsx(PlusIcon,{"aria-hidden":"true"})})}),Te=t.className?` ${t.className}`:"",_=t.confirmCloseTab,Ce=useCallback(async a=>{let r=a.currentTarget.previousSibling,u=Number(r.id.replace(H,""));(!_||await _(u))&&(i.activeTabIndex===u&&n.stop(),i.closeTab(u));},[_,i,n]),ve=useCallback(a=>{let r=Number(a.currentTarget.id.replace(H,""));n.stop(),i.changeTab(r);},[i,n]),Se=useCallback(a=>{rt(pe,a);},[]);return jsx(Tooltip.Provider,{children:jsxs("div",{className:`graphiql-container${Te}`,children:[jsxs(x,{className:"fk:h-full fk:max-h-full",defaultLayout:M,id:"explorer",onLayoutChanged:Se,orientation:"horizontal",children:[jsxs(y$1,{collapsible:true,collapsedSize:`${me}%`,defaultSize:"22%",id:"explorer-sidebar",minSize:"10%",onResize:a=>{let r=k.current;if(r){E(r.isCollapsed());return}let u=it(a);u!==void 0&&E(u<=me);},panelRef:k,children:[jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:pb-6",children:jsxs(ga,{className:"fk:w-full",defaultValue:s?.plugins[0].title,children:[jsxs("div",{className:`fk:flex fk:items-center fk:py-1 ${d?"":"fk:px-3"}`,children:[jsx(ha,{className:d?"fk:hidden":"",children:s?.plugins.map((a,r)=>{let x=`${a===s.visiblePlugin?"Hide":"Show"} ${a.title}`;return jsx(ia,{"aria-label":x,className:"fk:text-muted-foreground","data-index":r,onClick:V,value:a.title,children:jsx(a.icon,{"aria-hidden":"true"})},a.title)})}),jsxs(b,{children:[jsx(c,{asChild:true,children:jsx(b$1,{className:d?"fk:ml-1.5":"fk:ml-auto",onClick:()=>{let a=k.current;d?a?.expand():a?.collapse();},size:"icon",variant:"ghost",children:d?jsxs(Fragment,{children:[jsx(ChevronsRight,{className:"fk:w-4 fk:h-4"}),jsx("span",{className:"fk:sr-only",children:"Expand"})]}):jsxs(Fragment,{children:[jsx(ChevronsLeft,{className:"fk:w-4 fk:h-4"}),jsx("span",{className:"fk:sr-only",children:"Collapse"})]})})}),jsx(e,{children:d?"Expand":"Collapse"})]})]}),d?null:jsx(v,{}),s?.plugins.map(a=>jsx(ja,{className:`fk:flex fk:w-full fk:max-h-full fk:mt-0 ${d?"fk:hidden":""}`,value:a.title,children:jsxs(w,{className:"fk:flex fk:w-full fk:max-h-full fk:overflow-auto fk:pl-3 fk:pr-6 fk:pt-3 fk:pb-6 fk:mb-3 fk:[&>div>div]:block!",children:[jsx(a.content,{}),jsx(x$1,{orientation:"horizontal"})]})},a.title))]})}),jsx(Tooltip,{label:"Re-fetch GraphQL schema",children:jsx(UnStyledButton,{type:"button",disabled:l.isFetching,onClick:D,"aria-label":"Re-fetch GraphQL schema",children:jsx(ReloadIcon,{className:l.isFetching?"graphiql-spin":"","aria-hidden":"true"})})}),jsx(Tooltip,{label:"Open short keys dialog",children:jsx(UnStyledButton,{type:"button","data-value":"short-keys",onClick:m,"aria-label":"Open short keys dialog",children:jsx(KeyboardShortcutIcon,{"aria-hidden":"true"})})}),jsx(Tooltip,{label:"Open settings dialog",children:jsx(UnStyledButton,{type:"button","data-value":"settings",onClick:m,"aria-label":"Open settings dialog",children:jsx(SettingsIcon,{"aria-hidden":"true"})})})]}),jsx(z,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(y$1,{className:"fk:bg-muted",defaultSize:"40%",id:"explorer-editor",children:jsxs("div",{className:"fk:flex fk:flex-col fk:h-full",children:[jsxs("div",{className:"fk:flex fk:items-center fk:py-1 fk:px-4 fk:gap-6 fk:bg-muted",children:[!t.disableTabs&&jsx(Tabs,{"aria-label":"Select active operation",className:"fk:p-1! fk:bg-muted fk:rounded-md",onReorder:U,values:i.tabs,children:i.tabs.length>0&&jsx(Fragment,{children:i.tabs.map((a,r)=>jsxs(Tab,{isActive:r===i.activeTabIndex,value:a,children:[jsx(Tab.Button,{"aria-controls":"graphiql-session",id:`${H}${r.toString()}`,onClick:ve,children:a.title}),jsx(Tab.Close,{onClick:Ce})]},a.id))})}),ke]}),jsx("div",{role:"tabpanel",id:"graphiql-session",className:"graphiql-session","aria-labelledby":`${H}${i.activeTabIndex}`,children:jsx("div",{className:`graphiql-editors${i.tabs.length===1?" full-height":""}`,children:jsxs(x,{orientation:"vertical",children:[jsxs(y$1,{className:"fk:flex fk:w-full fk:gap-x-4 fk:px-4 fk:py-2",defaultSize:"80%",children:[jsx(QueryEditor,{editorTheme:t.editorTheme,keyMap:t.keyMap,onCopyQuery:t.onCopyQuery,onEdit:t.onEditQuery,readOnly:t.readOnly}),jsxs("div",{className:"graphiql-toolbar",role:"toolbar","aria-label":"Editor Commands",children:[jsx(ExecuteButton,{}),I]})]}),jsx(z,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsxs(y$1,{className:"fk:bg-muted fk:px-4 fk:pt-2",defaultSize:"20%",children:[jsx("div",{className:"fk:text-sm fk:font-medium fk:text-muted-foreground",children:"Variables"}),jsx(VariableEditor,{editorTheme:t.editorTheme,isHidden:false,keyMap:t.keyMap,onEdit:t.onEditVariables,readOnly:t.readOnly})]})]})})})]})}),jsx(z,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(y$1,{className:"fk:px-5 fk:pt-10 fk:relative",defaultSize:"38%",id:"explorer-response",children:jsxs("div",{className:"graphiql-response fk:h-full",children:[n.isFetching?jsx(Spinner,{}):null,jsx(ResponseEditor,{editorTheme:t.editorTheme,responseTooltip:t.responseTooltip,keyMap:t.keyMap}),Q]})})]}),jsxs(Dialog,{open:L==="short-keys",onOpenChange:S,children:[jsxs("div",{className:"graphiql-dialog-header",children:[jsx(Dialog.Title,{className:"graphiql-dialog-title",children:"Short Keys"}),jsx(Dialog.Close,{})]}),jsx("div",{className:"graphiql-dialog-section",children:jsx(dt,{keyMap:t.keyMap||"sublime"})})]}),jsxs(Dialog,{open:L==="settings",onOpenChange:$,children:[jsxs("div",{className:"graphiql-dialog-header",children:[jsx(Dialog.Title,{className:"graphiql-dialog-title",children:"Settings"}),jsx(Dialog.Close,{})]}),t.showPersistHeadersSettings?jsxs("div",{className:"graphiql-dialog-section",children:[jsxs("div",{children:[jsx("div",{className:"graphiql-dialog-section-title",children:"Persist headers"}),jsxs("div",{className:"graphiql-dialog-section-caption",children:["Save headers upon reloading."," ",jsx("span",{className:"graphiql-warning-text",children:"Only enable if you trust this device."})]})]}),jsxs(ButtonGroup,{children:[jsx(Button,{type:"button",id:"enable-persist-headers",className:i.shouldPersistHeaders?"active":"","data-value":"true",onClick:w$1,children:"On"}),jsx(Button,{type:"button",id:"disable-persist-headers",className:i.shouldPersistHeaders?"":"active",onClick:w$1,children:"Off"})]})]}):null,f?jsxs("div",{className:"graphiql-dialog-section",children:[jsxs("div",{children:[jsx("div",{className:"graphiql-dialog-section-title",children:"Clear storage"}),jsx("div",{className:"graphiql-dialog-section-caption",children:"Remove all locally stored data and start fresh."})]}),jsx(Button,{type:"button",state:C||void 0,disabled:C==="success",onClick:z$1,children:{success:"Cleared data",error:"Failed"}[C]||"Clear data"})]}):null]})]})})}var Y=isMacOs?"\u2318":"Ctrl",st=Object.entries({"Search in editor":[Y,"F"],"Search in documentation":[Y,"K"],"Execute query":[Y,"Enter"],"Prettify editors":["Ctrl","Shift","P"],"Merge fragments definitions into operation definition":["Ctrl","Shift","M"],"Copy query":["Ctrl","Shift","C"],"Re-fetch schema using introspection":["Ctrl","Shift","R"]});function dt({keyMap:t}){return jsxs("div",{children:[jsxs("table",{className:"graphiql-table",children:[jsx("thead",{children:jsxs("tr",{children:[jsx("th",{children:"Short Key"}),jsx("th",{children:"Function"})]})}),jsx("tbody",{children:st.map(([i,n])=>jsxs("tr",{children:[jsx("td",{children:n.map((l,f,s)=>jsxs(Fragment$1,{children:[jsx("code",{className:"graphiql-key",children:l}),f!==s.length-1&&" + "]},l))}),jsx("td",{children:i})]},i))})]}),jsxs("p",{children:["The editors use"," ",jsx("a",{href:"https://codemirror.net/5/doc/manual.html#keymaps",target:"_blank",rel:"noopener noreferrer",children:"CodeMirror Key Maps"})," ","that add more short keys. This instance of Graph",jsx("em",{children:"i"}),"QL uses ",jsx("code",{children:t}),"."]})]})}function ge(t){return jsx(Fragment,{children:t.children})}ge.displayName="GraphiQLToolbar";function ye(t){return jsx("div",{className:"graphiql-footer",children:t.children})}ye.displayName="GraphiQLFooter";function be(t,i){let n=typeof t=="object"&&t!==null?t:null;if(!n)return false;let l=n.type;return typeof l=="object"&&l!==null&&"displayName"in l&&typeof l.displayName=="string"&&l.displayName===i.displayName?true:n.type===i}var ft=`# Welcome to Flexkit Explorer
2
+ #
3
+ # Explorer is where you write, validate and run GraphQL queries
4
+ # against your Flexkit project.
5
+ #
6
+ # Type queries into this side of the screen, and you will see intelligent
7
+ # typeaheads aware of the current GraphQL schema and live syntax and
8
+ # validation errors highlighted within the text.
9
+ #
10
+ # GraphQL queries typically start with a "{" character. Lines that start
11
+ # with a # are ignored.
12
+ #
13
+ # An example GraphQL query might look like:
14
+ #
15
+ # {
16
+ # field(arg: "value") {
17
+ # subField
18
+ # }
19
+ # }
20
+ #
21
+ # Keyboard shortcuts:
22
+ #
23
+ # Prettify query: Shift-Ctrl-P (or press the prettify button)
24
+ #
25
+ # Merge fragments: Shift-Ctrl-M (or press the merge button)
26
+ #
27
+ # Run Query: Ctrl-Enter (or press the play button)
28
+ #
29
+ # Auto Complete: Ctrl-Space (or just start typing)
30
+ #`;function Qt(){let{currentProjectId:t}=f(),i=`/api/flexkit/${t}/graphql`,n=useMemo(()=>createGraphiQLFetcher({url:i}),[i]);return jsx(y,{fetcher:n,forcedTheme:"light",defaultQuery:ft})}export{Qt as Root};//# sourceMappingURL=root-YNGCF5QM.js.map
31
+ //# sourceMappingURL=root-YNGCF5QM.js.map