@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.
- package/dist/activity-nav-button-7SVTTHBQ.js +2 -0
- package/dist/{activity-nav-button-LZESIQL2.js.map → activity-nav-button-7SVTTHBQ.js.map} +1 -1
- package/dist/astro.js +1 -1
- package/dist/{chat-page-EKOGKEFR.js → chat-page-L427VVVR.js} +3 -3
- package/dist/{chat-page-EKOGKEFR.js.map → chat-page-L427VVVR.js.map} +1 -1
- package/dist/chunk-2HYQVMP3.js +3 -0
- package/dist/chunk-2HYQVMP3.js.map +1 -0
- package/dist/chunk-5CVDMZUI.js +3 -0
- package/dist/chunk-5CVDMZUI.js.map +1 -0
- package/dist/chunk-6YJ3DLIU.js +2 -0
- package/dist/{chunk-OFJOZMCR.js.map → chunk-6YJ3DLIU.js.map} +1 -1
- package/dist/{chunk-BOXFB6E6.js → chunk-7ELMTFZ4.js} +2 -2
- package/dist/{chunk-BOXFB6E6.js.map → chunk-7ELMTFZ4.js.map} +1 -1
- package/dist/chunk-ALCK2BJY.js +2 -0
- package/dist/chunk-ALCK2BJY.js.map +1 -0
- package/dist/chunk-CAZ6EUR2.js +2 -0
- package/dist/chunk-CAZ6EUR2.js.map +1 -0
- package/dist/chunk-D5WYD5M4.js +2 -0
- package/dist/chunk-D5WYD5M4.js.map +1 -0
- package/dist/{chunk-2AVINVYN.js → chunk-GFAOY74A.js} +28 -18
- package/dist/chunk-MGXG5PWU.js +384 -0
- package/dist/chunk-MGXG5PWU.js.map +1 -0
- package/dist/{chunk-EWBEPYML.js → chunk-MJVWFANP.js} +3 -3
- package/dist/{chunk-EWBEPYML.js.map → chunk-MJVWFANP.js.map} +1 -1
- package/dist/chunk-NLRSLQUT.js +3 -0
- package/dist/chunk-NLRSLQUT.js.map +1 -0
- package/dist/{chunk-F2DHCPWW.js → chunk-P5ZRTZ5Z.js} +2 -2
- package/dist/{chunk-F2DHCPWW.js.map → chunk-P5ZRTZ5Z.js.map} +1 -1
- package/dist/{chunk-QQSI7BPK.js → chunk-R64ELY3B.js} +3 -3
- package/dist/{chunk-QQSI7BPK.js.map → chunk-R64ELY3B.js.map} +1 -1
- package/dist/chunk-U5D3EDCY.js +2 -0
- package/dist/chunk-U5D3EDCY.js.map +1 -0
- package/dist/chunk-W7Z4MY43.js +2 -0
- package/dist/{chunk-7IHEL6LU.js.map → chunk-W7Z4MY43.js.map} +1 -1
- package/dist/chunk-XWBACTNR.js +3 -0
- package/dist/{chunk-C47FNPLK.js.map → chunk-XWBACTNR.js.map} +1 -1
- package/dist/chunk-ZZRA4567.js +2 -0
- package/dist/{chunk-V64P56OA.js.map → chunk-ZZRA4567.js.map} +1 -1
- package/dist/electron.d.ts +103 -0
- package/dist/electron.js +131 -0
- package/dist/index.css +9 -0
- package/dist/index.d.ts +33 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/list-WJLU3K2X.js +2 -0
- package/dist/{list-DOTORSUC.js.map → list-WJLU3K2X.js.map} +1 -1
- package/dist/nextjs.js +1 -1
- package/dist/{pages-ILAXYS2J.js → pages-3EK5GS2T.js} +4 -4
- package/dist/{pages-ILAXYS2J.js.map → pages-3EK5GS2T.js.map} +1 -1
- package/dist/plugin-pages-PQO22EOE.js +2 -0
- package/dist/{plugin-pages-RKJRHKNL.js.map → plugin-pages-PQO22EOE.js.map} +1 -1
- package/dist/root-4EALW3G6.js +2 -0
- package/dist/{root-RE3ZNXQ3.js.map → root-4EALW3G6.js.map} +1 -1
- package/dist/root-BA7BLCFR.js +23 -0
- package/dist/root-BA7BLCFR.js.map +1 -0
- package/dist/root-YNGCF5QM.js +31 -0
- package/dist/{root-JB3NZZNZ.js.map → root-YNGCF5QM.js.map} +1 -1
- package/dist/root-ZF62TR5Z.js +2 -0
- package/dist/{root-76YQTZUI.js.map → root-ZF62TR5Z.js.map} +1 -1
- package/dist/search-QHMCAT7O.js +2 -0
- package/dist/{search-WUO6VWKU.js.map → search-QHMCAT7O.js.map} +1 -1
- package/dist/skills-pages-HIBSAVOP.js +2 -0
- package/dist/{skills-pages-POKCFHOL.js.map → skills-pages-HIBSAVOP.js.map} +1 -1
- package/dist/tanstack-start.js +1 -1
- package/dist/user-nav-36ACWXOW.js +2 -0
- package/dist/{user-nav-DCAHVWN7.js.map → user-nav-36ACWXOW.js.map} +1 -1
- package/package.json +10 -6
- package/dist/activity-nav-button-LZESIQL2.js +0 -2
- package/dist/chunk-2HSIWUH3.js +0 -3
- package/dist/chunk-2HSIWUH3.js.map +0 -1
- package/dist/chunk-6YOVF2AD.js +0 -384
- package/dist/chunk-6YOVF2AD.js.map +0 -1
- package/dist/chunk-7IHEL6LU.js +0 -2
- package/dist/chunk-ACS3TGGP.js +0 -2
- package/dist/chunk-ACS3TGGP.js.map +0 -1
- package/dist/chunk-C47FNPLK.js +0 -3
- package/dist/chunk-HYSTMQD7.js +0 -2
- package/dist/chunk-HYSTMQD7.js.map +0 -1
- package/dist/chunk-KXAGLQ2B.js +0 -2
- package/dist/chunk-KXAGLQ2B.js.map +0 -1
- package/dist/chunk-OFJOZMCR.js +0 -2
- package/dist/chunk-TYDYAOQ7.js +0 -3
- package/dist/chunk-TYDYAOQ7.js.map +0 -1
- package/dist/chunk-V64P56OA.js +0 -2
- package/dist/list-DOTORSUC.js +0 -2
- package/dist/plugin-pages-RKJRHKNL.js +0 -2
- package/dist/root-76YQTZUI.js +0 -2
- package/dist/root-A4VHAEK5.js +0 -23
- package/dist/root-A4VHAEK5.js.map +0 -1
- package/dist/root-JB3NZZNZ.js +0 -31
- package/dist/root-RE3ZNXQ3.js +0 -2
- package/dist/search-WUO6VWKU.js +0 -2
- package/dist/skills-pages-POKCFHOL.js +0 -2
- 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-
|
|
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":"
|
|
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
|