@flexkit/studio 0.0.36 → 0.1.0
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/README.md +81 -0
- package/dist/astro.d.ts +3 -5
- package/dist/astro.js +3 -8
- package/dist/chat-page-NWMI4XOE.js +2 -0
- package/dist/chat-page-NWMI4XOE.js.map +1 -0
- package/dist/chunk-2DXR5NJV.js +2 -0
- package/dist/chunk-2DXR5NJV.js.map +1 -0
- package/dist/chunk-3CPWATOI.js +2 -0
- package/dist/chunk-3CPWATOI.js.map +1 -0
- package/dist/chunk-5DHOBLAE.js +2 -0
- package/dist/chunk-5DHOBLAE.js.map +1 -0
- package/dist/chunk-6LYEDKFY.js +7 -0
- package/dist/chunk-6LYEDKFY.js.map +1 -0
- package/dist/chunk-7PDYCDX6.js +2 -0
- package/dist/chunk-7PDYCDX6.js.map +1 -0
- package/dist/chunk-7SK5YPHT.js +2 -0
- package/dist/chunk-7SK5YPHT.js.map +1 -0
- package/dist/chunk-AKQ6ELDX.js +2 -0
- package/dist/chunk-AKQ6ELDX.js.map +1 -0
- package/dist/{chunk-POQX5GIA.js → chunk-C2BPRGGQ.js} +47 -172
- package/dist/chunk-CSUHZFEP.js +2 -0
- package/dist/chunk-CSUHZFEP.js.map +1 -0
- package/dist/chunk-G4PYYHI3.js +2 -0
- package/dist/chunk-G4PYYHI3.js.map +1 -0
- package/dist/chunk-GZIMMYLK.js +2 -0
- package/dist/chunk-GZIMMYLK.js.map +1 -0
- package/dist/chunk-HROHAMPM.js +3 -0
- package/dist/chunk-HROHAMPM.js.map +1 -0
- package/dist/chunk-NNA4MLFC.js +3 -0
- package/dist/chunk-NNA4MLFC.js.map +1 -0
- package/dist/chunk-NSYO57O3.js +5 -0
- package/dist/chunk-NSYO57O3.js.map +1 -0
- package/dist/chunk-ODORXGGY.js +2 -0
- package/dist/chunk-ODORXGGY.js.map +1 -0
- package/dist/chunk-OUSEULBR.js +384 -0
- package/dist/chunk-OUSEULBR.js.map +1 -0
- package/dist/chunk-P6BZ4QP7.js +2 -0
- package/dist/chunk-P6BZ4QP7.js.map +1 -0
- package/dist/chunk-QQUNCDUB.js +2 -0
- package/dist/chunk-QQUNCDUB.js.map +1 -0
- package/dist/chunk-SZEGGBOC.js +2 -0
- package/dist/chunk-SZEGGBOC.js.map +1 -0
- package/dist/chunk-W2EBZZAY.js +3 -0
- package/dist/chunk-W2EBZZAY.js.map +1 -0
- package/dist/chunk-YINI2YKQ.js +4 -0
- package/dist/chunk-YINI2YKQ.js.map +1 -0
- package/dist/{core-handler-C3xC98bN.d.ts → core-handler-XAVVKLhV.d.ts} +0 -3
- package/dist/edit-entity-PVT34FD7.js +2 -0
- package/dist/edit-entity-PVT34FD7.js.map +1 -0
- package/dist/index.css +1402 -0
- package/dist/index.d.ts +433 -33
- package/dist/index.js +12 -395
- package/dist/index.js.map +1 -1
- package/dist/list-SQCN7HA3.js +2 -0
- package/dist/list-SQCN7HA3.js.map +1 -0
- package/dist/nextjs.d.ts +61 -56
- package/dist/nextjs.js +3 -8
- package/dist/pages-OIAPASPF.js +3 -0
- package/dist/pages-OIAPASPF.js.map +1 -0
- package/dist/plugin-pages-AHOA6YJE.js +2 -0
- package/dist/plugin-pages-AHOA6YJE.js.map +1 -0
- package/dist/project-selector-72VM6SUI.js +2 -0
- package/dist/project-selector-72VM6SUI.js.map +1 -0
- package/dist/root-4FGNRGCD.js +23 -0
- package/dist/root-4FGNRGCD.js.map +1 -0
- package/dist/root-5ZW536V7.js +2 -0
- package/dist/root-5ZW536V7.js.map +1 -0
- package/dist/root-IIILTOJI.js +31 -0
- package/dist/root-IIILTOJI.js.map +1 -0
- package/dist/root-QPQQ3DFJ.js +2 -0
- package/dist/root-QPQQ3DFJ.js.map +1 -0
- package/dist/search-2K2BU4UU.js +2 -0
- package/dist/{search-XKG5A7XM.js.map → search-2K2BU4UU.js.map} +1 -1
- package/dist/skills-pages-PSBRTFGK.js +2 -0
- package/dist/skills-pages-PSBRTFGK.js.map +1 -0
- package/dist/tanstack-start.d.ts +4 -6
- package/dist/tanstack-start.js +5 -12
- package/dist/ui.d.ts +5 -7
- package/dist/ui.js +1 -6
- package/dist/ui.js.map +1 -1
- package/dist/user-nav-QZFCICK3.js +2 -0
- package/dist/{user-nav-LSEOOH4E.js.map → user-nav-QZFCICK3.js.map} +1 -1
- package/package.json +30 -12
- package/dist/asset-3XMRPTA5.js +0 -2
- package/dist/asset-3XMRPTA5.js.map +0 -1
- package/dist/boolean-MTD44LXP.js +0 -2
- package/dist/boolean-MTD44LXP.js.map +0 -1
- package/dist/chunk-3VOTTOJT.js +0 -2
- package/dist/chunk-3VOTTOJT.js.map +0 -1
- package/dist/chunk-5I7Q5ODB.js +0 -2
- package/dist/chunk-5I7Q5ODB.js.map +0 -1
- package/dist/chunk-6NRQMG26.js +0 -2
- package/dist/chunk-6NRQMG26.js.map +0 -1
- package/dist/chunk-6V73336R.js +0 -623
- package/dist/chunk-7BOX7HHO.js +0 -2
- package/dist/chunk-7BOX7HHO.js.map +0 -1
- package/dist/chunk-7JFLGBWE.js +0 -2
- package/dist/chunk-7JFLGBWE.js.map +0 -1
- package/dist/chunk-7ZJN4MWQ.js +0 -2
- package/dist/chunk-7ZJN4MWQ.js.map +0 -1
- package/dist/chunk-AICNS7KW.js +0 -2
- package/dist/chunk-AICNS7KW.js.map +0 -1
- package/dist/chunk-D4XLXU2H.js +0 -2
- package/dist/chunk-D4XLXU2H.js.map +0 -1
- package/dist/chunk-FLT6RWXH.js +0 -2
- package/dist/chunk-FLT6RWXH.js.map +0 -1
- package/dist/chunk-GBM7VKFS.js +0 -2
- package/dist/chunk-GBM7VKFS.js.map +0 -1
- package/dist/chunk-HMMBYXYA.js +0 -2
- package/dist/chunk-HMMBYXYA.js.map +0 -1
- package/dist/chunk-IRY4KWB5.js +0 -2
- package/dist/chunk-IRY4KWB5.js.map +0 -1
- package/dist/chunk-JH4MVD36.js +0 -2
- package/dist/chunk-JH4MVD36.js.map +0 -1
- package/dist/chunk-JKHUO27E.js +0 -2
- package/dist/chunk-JKHUO27E.js.map +0 -1
- package/dist/chunk-LIV5RBWJ.js +0 -2
- package/dist/chunk-LIV5RBWJ.js.map +0 -1
- package/dist/chunk-PENRGDNC.js +0 -2
- package/dist/chunk-PENRGDNC.js.map +0 -1
- package/dist/chunk-QOX3QNMM.js +0 -2
- package/dist/chunk-QOX3QNMM.js.map +0 -1
- package/dist/chunk-QVBNGGOE.js +0 -2
- package/dist/chunk-QVBNGGOE.js.map +0 -1
- package/dist/chunk-S6MOM5G3.js +0 -2
- package/dist/chunk-S6MOM5G3.js.map +0 -1
- package/dist/chunk-UGRS4FEI.js +0 -2
- package/dist/chunk-UGRS4FEI.js.map +0 -1
- package/dist/chunk-USNXQOMJ.js +0 -2
- package/dist/chunk-USNXQOMJ.js.map +0 -1
- package/dist/chunk-UWMJBBTY.js +0 -2
- package/dist/chunk-UWMJBBTY.js.map +0 -1
- package/dist/chunk-W3Z33ETA.js +0 -2
- package/dist/chunk-W3Z33ETA.js.map +0 -1
- package/dist/chunk-WDRCARCP.js +0 -3
- package/dist/chunk-WDRCARCP.js.map +0 -1
- package/dist/chunk-WIUPQHZ5.js +0 -2
- package/dist/chunk-WIUPQHZ5.js.map +0 -1
- package/dist/chunk-WJ4ORIXF.js +0 -2
- package/dist/chunk-WJ4ORIXF.js.map +0 -1
- package/dist/chunk-YSLN4XT6.js +0 -2
- package/dist/chunk-YSLN4XT6.js.map +0 -1
- package/dist/datetime-C55QQQJK.js +0 -2
- package/dist/datetime-C55QQQJK.js.map +0 -1
- package/dist/editor-NZLXIOE7.js +0 -2
- package/dist/editor-NZLXIOE7.js.map +0 -1
- package/dist/project-selector-GQ24PVO6.js +0 -2
- package/dist/project-selector-GQ24PVO6.js.map +0 -1
- package/dist/search-XKG5A7XM.js +0 -2
- package/dist/select-SO3DICYX.js +0 -2
- package/dist/select-SO3DICYX.js.map +0 -1
- package/dist/switch-SU3OIXL6.js +0 -2
- package/dist/switch-SU3OIXL6.js.map +0 -1
- package/dist/text-FZSI6W5I.js +0 -2
- package/dist/text-FZSI6W5I.js.map +0 -1
- package/dist/text-QXGOD2KW.js +0 -2
- package/dist/text-QXGOD2KW.js.map +0 -1
- package/dist/textarea-INLURFNU.js +0 -2
- package/dist/textarea-INLURFNU.js.map +0 -1
- package/dist/tools.d.ts +0 -78
- package/dist/tools.js +0 -60
- package/dist/types-U28Ppixq.d.ts +0 -56
- package/dist/types.d-CPIuPrvL.d.ts +0 -458
- package/dist/user-nav-LSEOOH4E.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import'./index.css';export{c as CatalogHeader,e as InstalledPluginsPage,b as PluginConnectControl,f as PluginDetailPage,d as PluginsPage}from'./chunk-7PDYCDX6.js';import'./chunk-HROHAMPM.js';import'./chunk-W2EBZZAY.js';import'./chunk-NNA4MLFC.js';import'./chunk-6LYEDKFY.js';import'./chunk-SZEGGBOC.js';import'./chunk-ODORXGGY.js';import'./chunk-5DHOBLAE.js';import'./chunk-HDOIOXMP.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=plugin-pages-AHOA6YJE.js.map
|
|
2
|
+
//# sourceMappingURL=plugin-pages-AHOA6YJE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"plugin-pages-AHOA6YJE.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import'./index.css';import {a,b}from'./chunk-AKQ6ELDX.js';export{a as getProjectLabel}from'./chunk-AKQ6ELDX.js';import {a as a$1,d,c,e,b as b$1,f,g}from'./chunk-HDOIOXMP.js';import'./chunk-O2QMYUPS.js';import {useNavigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';function T({projectId:c$1,projectIds:P,projectSummaries:o=[],projects:a$2}){let b$2=useNavigate(),m=a(c$1,a$2,o),j=b(P,o);return jsxs(a$1,{onValueChange:e=>{b$2(`/${e}`);},value:c$1,children:[jsx(d,{className:"fk:w-48! fk:h-9 fk:py-1",id:"project",children:jsx(c,{"aria-label":m,children:m})}),jsx(e,{children:j.map((e,k)=>jsxs(b$1,{children:[e.label?jsx(f,{children:e.label}):null,e.projectIds.map(r=>jsx(g,{value:r,children:a(r,a$2,o)},r))]},e.label??k))})]})}export{T as ProjectSelector};//# sourceMappingURL=project-selector-72VM6SUI.js.map
|
|
2
|
+
//# sourceMappingURL=project-selector-72VM6SUI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/components/project-selector.tsx"],"names":["ProjectSelector","projectId","projectIds","projectSummaries","projects","navigate","useNavigate","label","getProjectLabel","groups","groupProjectIdsByTeam","jsxs","Select","id","jsx","SelectTrigger","SelectValue","SelectContent","group","index","SelectGroup","SelectLabel","SelectItem"],"mappings":"8RA0BO,SAASA,CAAAA,CAAgB,CAAE,SAAA,CAAAC,GAAAA,CAAW,WAAAC,CAAAA,CAAY,gBAAA,CAAAC,CAAAA,CAAmB,EAAC,CAAG,QAAA,CAAAC,GAAS,CAAA,CAAuB,CAC9G,IAAMC,GAAAA,CAAWC,WAAAA,EAAY,CACvBC,CAAAA,CAAQC,EAAgBP,GAAAA,CAAWG,GAAAA,CAAUD,CAAgB,CAAA,CAC7DM,CAAAA,CAASC,CAAAA,CAAsBR,CAAAA,CAAYC,CAAgB,CAAA,CAEjE,OACEQ,IAAAA,CAACC,GAAAA,CAAA,CACC,aAAA,CAAgBC,CAAAA,EAAO,CACrBR,GAAAA,CAAS,CAAA,CAAA,EAAIQ,CAAE,CAAA,CAAE,EACnB,CAAA,CACA,KAAA,CAAOZ,GAAAA,CAEP,QAAA,CAAA,CAAAa,GAAAA,CAACC,CAAAA,CAAA,CAAc,SAAA,CAAU,yBAAA,CAA0B,GAAG,SAAA,CACpD,QAAA,CAAAD,GAAAA,CAACE,CAAAA,CAAA,CAAY,YAAA,CAAYT,CAAAA,CAAQ,QAAA,CAAAA,CAAAA,CAAM,CAAA,CACzC,CAAA,CACAO,GAAAA,CAACG,CAAAA,CAAA,CACE,SAAAR,CAAAA,CAAO,GAAA,CAAI,CAACS,CAAAA,CAAOC,CAAAA,GAClBR,IAAAA,CAACS,GAAAA,CAAA,CACE,QAAA,CAAA,CAAAF,CAAAA,CAAM,KAAA,CAAQJ,GAAAA,CAACO,CAAAA,CAAA,CAAa,SAAAH,CAAAA,CAAM,KAAA,CAAM,CAAA,CAAiB,IAAA,CACzDA,CAAAA,CAAM,UAAA,CAAW,GAAA,CAAKL,CAAAA,EACrBC,GAAAA,CAACQ,CAAAA,CAAA,CAAoB,KAAA,CAAOT,CAAAA,CACzB,QAAA,CAAAL,CAAAA,CAAgBK,CAAAA,CAAIT,GAAAA,CAAUD,CAAgB,CAAA,CAAA,CADhCU,CAEjB,CACD,CAAA,CAAA,CAAA,CANeK,CAAAA,CAAM,KAAA,EAASC,CAOjC,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAEJ","file":"project-selector-72VM6SUI.js","sourcesContent":["import type { JSX } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from '../primitives/select';\nimport type { ProjectSummary, ProjectUiConfig } from '../../core/config/types';\nimport { getProjectLabel, groupProjectIdsByTeam } from './project-label';\n\nexport { getProjectLabel } from './project-label';\n\ntype Props = {\n projectId: string;\n /** Every project the Studio can open, loaded or not. */\n projectIds: string[];\n /** Hosted mode: names and teams known before any schema loads. */\n projectSummaries?: ProjectSummary[];\n /** Projects whose schema has loaded; used for titles. */\n projects: ProjectUiConfig[];\n};\n\nexport function ProjectSelector({ projectId, projectIds, projectSummaries = [], projects }: Props): JSX.Element {\n const navigate = useNavigate();\n const label = getProjectLabel(projectId, projects, projectSummaries);\n const groups = groupProjectIdsByTeam(projectIds, projectSummaries);\n\n return (\n <Select\n onValueChange={(id) => {\n navigate(`/${id}`);\n }}\n value={projectId}\n >\n <SelectTrigger className=\"fk:w-48! fk:h-9 fk:py-1\" id=\"project\">\n <SelectValue aria-label={label}>{label}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {groups.map((group, index) => (\n <SelectGroup key={group.label ?? index}>\n {group.label ? <SelectLabel>{group.label}</SelectLabel> : null}\n {group.projectIds.map((id) => (\n <SelectItem key={id} value={id}>\n {getProjectLabel(id, projects, projectSummaries)}\n </SelectItem>\n ))}\n </SelectGroup>\n ))}\n </SelectContent>\n </Select>\n );\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import'./index.css';import {c as c$2,a as a$2}from'./chunk-GZIMMYLK.js';import {a as a$1}from'./chunk-G4PYYHI3.js';import {a}from'./chunk-3CPWATOI.js';import {s,J,u,v,w,x as x$1,C,j,e,h,g,A,B,E,G,F,H}from'./chunk-OUSEULBR.js';import {b as b$1}from'./chunk-7SK5YPHT.js';import {c}from'./chunk-P6BZ4QP7.js';import'./chunk-2DXR5NJV.js';import {f,b}from'./chunk-W2EBZZAY.js';import'./chunk-NNA4MLFC.js';import {x,y,z,K,L,M,s as s$1,O,ra,c as c$3,d as d$2,o as o$2}from'./chunk-6LYEDKFY.js';import {e as e$1,g as g$1,h as h$2,j as j$2,o,t}from'./chunk-SZEGGBOC.js';import {c as c$1,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-ODORXGGY.js';import {d as d$1}from'./chunk-5DHOBLAE.js';import'./chunk-HDOIOXMP.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 Et(){let{scope:e$2}=c(),{currentProjectSchema:n}=f(),[t,a,i$1]=C(),[f$1,c$2]=useState(""),[d$2,b]=useState(false),[v,u$1]=useState(false),[l$1,s]=useState(null),[M$1,p]=useState(false),[E,I]=useState(null),[J,x]=useState(""),[_,U]=useState(false),[F,B]=useState(false),h$3=b$1(),D="_tag",m="_tags",{data:C$1,isLoading:S}=u({entityNamePlural:m,schema:n,scope:e$2,variables:we,...Y}),z=(Array.isArray(C$1)?C$1:[]).map(r=>{let V=r;return {_id:V._id,name:V.name}}),O$1=useCallback(async()=>{let r=f$1.trim();if(!r)return;U(true);let V=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}`,L=j(m,n,{name:{value:r,disabled:false,scope:"default"}},V),j$1=e(m,e$2,n,Y),K=gql`
|
|
2
|
+
${j$1.query}
|
|
3
|
+
`;await new Promise(y=>{a(gql`
|
|
4
|
+
${L}
|
|
5
|
+
`),i$1({refetchQueries:[K],onCompleted:()=>{c$2(""),b(false),y();}}),t(true);}),U(false);},[m,t,n,e$2,a,i$1,f$1]),w=useCallback(async r=>{B(true);let V=h(D,n,r),X=e(m,e$2,n,Y),L=gql`
|
|
6
|
+
${X.query}
|
|
7
|
+
`;await new Promise((j,K)=>{a(gql`
|
|
8
|
+
${V}
|
|
9
|
+
`),i$1({variables:{where:{_id:{eq:r}}},refetchQueries:[L],onCompleted:()=>{j();},onError:y=>{K(y);}}),t(true);}),B(false);},[D,m,t,n,e$2,a,i$1]),P=useCallback(async()=>{let r=J.trim();if(!r||!E)return;U(true);let V={name:{value:r,disabled:false,scope:"default"}},X={},L=g(m,E._id,e$2,n,X,V),j=e(m,e$2,n,Y),K=gql`
|
|
10
|
+
${j.query}
|
|
11
|
+
`;await new Promise(y=>{a(gql`
|
|
12
|
+
${L}
|
|
13
|
+
`),i$1({variables:{where:{_id:{eq:E._id}}},refetchQueries:[K],onCompleted:()=>{p(false),I(null),x(""),y();}}),t(true);}),U(false);},[J,m,t,n,e$2,a,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(K,{children:jsxs(L,{children:[jsx(M,{asChild:true,children:jsxs(c$1,{open:d$2,onOpenChange:b,children:[jsx(d,{asChild:true,children:jsxs(d$1,{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:r=>c$2(r.target.value),onKeyDown:r=>{r.key==="Enter"&&O$1();}})}),jsx(j$1,{children:jsxs(d$1,{disabled:_,onClick:O$1,variant:"default",children:[_?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Add"]})})]})]})}),jsx(O,{children:jsx("p",{children:"Add tag"})})]})}):jsx("div",{className:"fk:ml-auto",children:jsx(ra,{disabled:true,children:jsxs(d$1,{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(r=>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:r.name}),jsxs(e$1,{children:[jsx(ra,{disabled:!h$3,children:jsx(g$1,{asChild:true,children:jsx(d$1,{"aria-label":`Actions for ${r.name}`,disabled:!h$3,title:h$3?`Actions for ${r.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(r),x(r.name),p(true);},children:"Edit"}),jsx(o,{}),jsx(j$2,{className:"fk:text-destructive",onClick:()=>{s(r),u$1(true);},children:"Remove"})]})]})]},r._id))})}),jsx(c$1,{open:M$1,onOpenChange:p,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:r=>x(r.target.value),onKeyDown:r=>{r.key==="Enter"&&P();}})}),jsxs(j$1,{children:[jsx(d$1,{disabled:_,variant:"secondary",onClick:()=>{p(false),I(null);},children:"Cancel"}),jsxs(d$1,{disabled:_,onClick:P,variant:"default",children:[_?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Save"]})]})]})}),jsx(c$1,{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(d$1,{disabled:F,variant:"secondary",onClick:()=>{u$1(false),s(null);},children:"Cancel"}),jsxs(d$1,{disabled:F,variant:"destructive",onClick:()=>{l$1&&(async()=>(await w(l$1._id),u$1(false),s(null)))();},children:[F?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 _t({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 b(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 s=Array.from(l.dataTransfer.files);s.length!==0&&t(s);}return jsxs("div",{className:"fk:relative fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",onDragEnter:d,onDragLeave:v,onDragOver:b,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 Ft=`_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$2("_assets"),[c$1,d,b]=C(),{currentProjectSchema:v}=f(),[u$1,l]=useState([]),[s,M]=useState(false),{data:p$1}=u({entityNamePlural:"_tags",schema:v,scope:i,variables:we,...Y}),E=useMemo(()=>(Array.isArray(p$1)?p$1:[]).map(D=>({_id:D._id,name:D.name})),[p$1]),I=useCallback(()=>{l([]);},[]),J=useCallback(h=>{!h&&!s&&(t(null),I());},[s,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||s)){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:Ft});await new Promise((m,C)=>{d(gql`
|
|
19
|
+
${D}
|
|
20
|
+
`),b({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,s,a,t,I,c$1,v,i,u$1,d,b]),U=useCallback(async()=>{if(!(e.length===0||u$1.length===0||s)){M(true);try{let h={tags:{relationships:{disconnect:u$1},disabled:!1,scope:i}},D=g("_assets",e[0]??"",i,v,{},h,{responseFields:Ft});await new Promise((m,C)=>{d(gql`
|
|
21
|
+
${D}
|
|
22
|
+
`),b({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,s,a,t,I,c$1,v,i,u$1,d,b]),F=n$1==="remove",B=F?"Remove tag(s)":"Add tag(s)";return e.length>1&&(B=F?"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:s,onSelect:()=>{s||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(d$1,{className:"fk:w-full",disabled:u$1.length===0||s,onClick:F?U:_,children:[s?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=A(),d=b$1(),b$2=n.original,v=b$2._id??"",u=b$2.url??"";function l(){c({type:"DeleteEntity",payload:{entityId:v,entityName:b.name}});}function s(p,E){navigator.clipboard.writeText(E),a(p),window.setTimeout(()=>a(null),1500);}return jsxs(Fragment,{children:[jsxs(e$1,{children:[jsx(g$1,{asChild:true,children:jsxs(d$1,{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:p=>p.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:p=>{p.stopPropagation(),s("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:p=>{p.stopPropagation(),s("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:p=>{p.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:p=>{p.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:p=>{p.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 bo=FileIcon,wo="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 Do(e){return Math.max(600,e)}function Co(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 Ot({columns:e,data:n,entityName:t$1,hasMore:a=false,isLoading:i=false,isLoadingMore:f=false,onLoadMore:c,onSortingChange:d,pageSize:b,sorting:v,toolbarComponent:u}){let l=useRef(null),{schemaErrorMessage:s$1}=s(),[M,p]=useState({}),[E,I]=useState({}),[J,x]=useState([]),[_,U]=useState([]),F=v??_;useEffect(()=>{l.current?.scrollTo({top:0});},[t$1]);function B(w){if(d){d(w);return}U(w);}let h=useReactTable({data:n,columns:e,state:{sorting:F,columnVisibility:E,rowSelection:M,columnFilters:J},initialState:{pagination:{pageSize:b??50}},enableRowSelection:true,onRowSelectionChange:p,onSortingChange:B,onColumnFiltersChange:x,onColumnVisibilityChange:I,getCoreRowModel:getCoreRowModel(),getFilteredRowModel:getFilteredRowModel(),getPaginationRowModel:getPaginationRowModel(),getSortedRowModel:getSortedRowModel(),getRowId:w=>w._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(w=>{if(!m.current||!C.current||S.current)return;let P=w??l.current;if(!P)return;let{scrollHeight:r,scrollTop:V,clientHeight:X}=P;r-V-X>=Do(X)||m.current();},[]);useEffect(()=>{z();},[z,D.length,a,f]);function O(w){z(w.currentTarget);}return s$1?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:O,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:b??50},(w,P)=>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-${P}`))}):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(w=>jsx(To,{row:w},w.id))}):null]})]})]})}function To({row:e}){let n=e.original,t=E(n)||"Untitled",a=n.mimeType??"",i=Co(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(So,{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 So({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(!G(e)||!c){let s=F(e),M=defaultStyles[s];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(bo,{extension:s,...M||{}})})}let b=H(c,{width:320,height:320}),v=c;function u(s){s.stopPropagation(),f(false),a(true);}function l$1(s){a(s),s||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 ${wo} fk:corner-squircle`,onClick:u,type:"button",children:jsx("img",{alt:n,className:"fk:h-full fk:w-full fk:object-contain",src:b})}),jsx(c$1,{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 Oo=[{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$2,onUploadClick:i,onViewModeChange:f$1,onSearchLoadingChange:c$1,onSearchWhereChange:d}){let b=t.getState().columnFilters.length>0,{projectId:v}=useParams(),u$1=A(),{scope:l}=c(),[s,M]=useState(null),{currentProjectSchema:p}=f(),E=b$1(),[I,J]=useState(""),x=useRef({}),_=useRef({});function U(){return {searchRequests:{searches:[{collection:"_assets"},{collection:"_tags"}]},commonParams:{q:""}}}let F=useMemo(()=>U(),[]),[B$1,h]=useState(F),{results:D,isLoading:m}=a(v??"",B$1),C=useRef(""),S=I.trim(),z=B$1.commonParams.q??"",O=S.length>0&&(m||z!==S),w=useMemo(()=>Uo(g=>{h({...F,commonParams:{q:g}});},300),[F]);useEffect(()=>()=>{w.cancel();},[w]);let P=t.getSelectedRowModel().rows.map(g=>g.original._id),{data:r}=u({entityNamePlural:"_tags",schema:p,scope:l,variables:we,...Y}),V=useMemo(()=>(Array.isArray(r)?r:[]).map(N=>({_id:N._id,name:N.name})),[r]),X$1=useMemo(()=>V.map(g=>({value:g._id,label:g.name})),[V]),L=useCallback(()=>{if(!d)return;let g=[];Object.keys(x.current).length>0&&g.push(x.current),Object.keys(_.current).length>0&&g.push(_.current);let N=g.length===0?{}:g.length===1?g[0]:{AND:g},Z=JSON.stringify(N);C.current!==Z&&(C.current=Z,d(N));},[d]);function j(){w.cancel(),J(""),h({...F,commonParams:{q:""}}),x.current={},L();}async function K(){u$1({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${P.length} asset${P.length>1?"s":""}`,dialogMessage:P.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:P,entityName:e,silent:true}}),t.resetRowSelection();}}}});}useEffect(()=>{c$1?.(O);},[O,c$1]),useEffect(()=>{if(!d)return;if(S.length===0){x.current={},L();return}if(O)return;let g=D??[],N={};if(g.length===0)N={_id:{in:[]}};else {let Z=g.filter(q=>q._entityNamePlural==="_assets").map(q=>q._id),xe=g.filter(q=>q._entityNamePlural==="_tags").map(q=>({tags:{some:{_id:{eq:q._id}}}})),Q=[];Z.length>0&&Q.push({_id:{in:Z}}),Q.push(...xe),Q.length===0?N={_id:{in:[]}}:Q.length===1?N=Q[0]:N={OR:Q};}x.current=N,L();},[L,O,d,D,S]);let y=JSON.stringify(t.getState().columnFilters);return useEffect(()=>{if(!d)return;let g=t.getState().columnFilters.find(q=>q.id==="mimeType"),N=Array.isArray(g?.value)?g?.value:[],Z=t.getState().columnFilters.find(q=>q.id==="tags"),xe=Array.isArray(Z?.value)?Z?.value:[],Q=[];if(N.length>0&&Q.push({mimeType:{in:N}}),xe.length>0){let q=xe.map(Ht=>({tags:{some:{_id:{eq:Ht}}}}));Q.push(q.length===1?q[0]:{OR:q});}Q.length===0?_.current={}:Q.length===1?_.current=Q[0]:_.current={AND:Q},L();},[y,L,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:g=>{let{value:N}=g.target;if(J(N),N.trim().length===0){j();return}w(N.trim());},className:"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7"}),I?jsx(d$1,{"aria-label":"Clear search",className:"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle",onClick:j,type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})}):null]}),t.getColumn("mimeType")&&jsx(a$1,{column:t.getColumn("mimeType"),options:Oo,title:"File type"}),t.getColumn("tags")&&jsx(a$1,{column:t.getColumn("tags"),options:X$1,title:"Tags"}),b&&jsxs(d$1,{variant:"ghost",onClick:()=>{t.resetColumnFilters(),_.current={},L();},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(B,{table:t})]}),P.length>0?jsx("div",{className:"fk:flex fk:items-center fk:gap-2",children:jsxs(e$1,{children:[jsx(ra,{disabled:!E,children:jsx(g$1,{asChild:true,children:jsxs(d$1,{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",P.length>1?"s":""," (",P.length,")"]})]})]})}):null,jsxs("div",{className:"fk:ml-auto fk:flex fk:items-center fk:gap-2",children:[jsxs(c$3,{size:"sm",type:"single",value:a$2,onValueChange:g=>{(g==="list"||g==="grid")&&f$1(g);},children:[jsx(d$2,{"aria-label":"Grid view",value:"grid",children:jsx(LayoutGrid,{className:"fk:h-4 fk:w-4"})}),jsx(d$2,{"aria-label":"List view",value:"list",children:jsx(List,{className:"fk:h-4 fk:w-4"})})]}),jsx(ra,{disabled:!E,children:jsxs(d$1,{"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"]})})]}),s!==null?jsx(Ve,{assetIds:P,mode:s,onCompleted:()=>t.resetRowSelection(),onModeChange:M}):null]})}function Uo(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 Qo=4*1024*1024;function Gt(){let{projectId:e}=useParams(),n=c$2(),t=b$1(),[a,i]=useState(false);async function f(c){if(!(!t||a)&&!(c&&c.length===0))try{await n({files:c,maxBytes:Qo,multiple:!0,onUploadStart:()=>{i(!0);},projectId:e});}finally{i(false);}}return {canMutate:t,isUploading:a,uploadFiles:c=>f(c),uploadFromDialog:()=>f()}}var Wt="flexkit-asset-manager:viewMode";function $t(){if(typeof localStorage>"u")return "grid";try{let e=localStorage.getItem(Wt);if(e==="list"||e==="grid")return e}catch{}return "grid"}function Jt(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(Wt,e);}catch{}}var Me=36,Jo=[{_updatedAt:"DESC"},{_id:"DESC"}];function Xt(){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??[],[b$1,v$1]=useState([]),[u$1,l]=useState(()=>$t()),s$1=J({attributesSchema:b.attributes,actionsComponent:y=>jsx(qe,{row:y}),checkboxSelect:"multiple",enableColumnSorting:true}),[M,p]=useState({}),[E,I]=useState(false),{canMutate:J$1,isUploading:x,uploadFiles:_,uploadFromDialog:U}=Gt(),F=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(b$1.length===0)return Jo;let y=b$1.map(({id:N,desc:Z})=>({[N]:Z?"DESC":"ASC"}));return y.some(N=>"_id"in N)?y:[...y,{_id:"DESC"}]},[b$1]),h=useMemo(()=>({where:F,offset:0,limit:Me,sort:B}),[F,B]);function D(y){v$1(y);}function m(y){l(y),Jt(y);}let{isLoading:C,isLoadingMore:S,fetchMore:z,count:O,data:w$1,isProjectDisabled:P}=u({entityNamePlural:e,schema:d,scope:i,variables:h,selection:"list"}),r=E||C&&(w$1==null||w$1.length===0),V=w$1?.length??0,X=!E&&O>0&&V>0&&V<O,L=useCallback(()=>{z({variables:{offset:0,limit:Me}});},[z]),j=useMemo(()=>Array.from({length:Me},(y,g)=>({_id:`loading-${g}`})),[]),K=useMemo(()=>Xo(s$1),[s$1]);return P?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"}),r?null:jsxs("span",{className:"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground",children:[O.toLocaleString()," ",O===1?"record":"records"]})]}),f$1?null:jsx(_t,{disabled:!J$1||x,onDropFiles:_,children:u$1==="list"?jsx(x$1,{classNames:{row:"fk:h-20"},columns:r?K:s$1,data:r?j:w$1??[],entityName:b.name,hasMore:X,isLoadingMore:S,pageSize:Me,sorting:b$1,onLoadMore:L,onSortingChange:D,toolbarComponent:y=>jsx(Ze,{entityName:b.name,isUploading:x,table:y,viewMode:u$1,onSearchLoadingChange:I,onSearchWhereChange:p,onUploadClick:U,onViewModeChange:m})}):jsx(Ot,{columns:s$1,data:r?[]:w$1??[],entityName:b.name,hasMore:X,isLoading:r,isLoadingMore:S,pageSize:Me,sorting:b$1,onLoadMore:L,onSortingChange:D,toolbarComponent:y=>jsx(Ze,{entityName:b.name,isUploading:x,table:y,viewMode:u$1,onSearchLoadingChange:I,onSearchWhereChange:p,onUploadClick:U,onViewModeChange:m})})}),jsx(Outlet,{})]})}function Xo(e){return e.map(n=>({...n,cell:()=>jsx(t,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function On(){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(Xt,{})})}),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(Et,{})})})]})}export{On as Root};//# sourceMappingURL=root-4FGNRGCD.js.map
|
|
23
|
+
//# sourceMappingURL=root-4FGNRGCD.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","getLoadMoreThreshold","clientHeight","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","scrollHeight","scrollTop","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-4FGNRGCD.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';\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 getLoadMoreThreshold(clientHeight: number): number {\n return Math.max(600, clientHeight);\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 const { scrollHeight, scrollTop, clientHeight } = scrollElement;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n if (distanceFromBottom >= getLoadMoreThreshold(clientHeight)) {\n return;\n }\n\n onLoadMoreRef.current();\n }, []);\n\n useEffect(() => {\n checkLoadMore();\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore]);\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,2 @@
|
|
|
1
|
+
import'./index.css';import {c}from'./chunk-2DXR5NJV.js';import {f}from'./chunk-W2EBZZAY.js';import {h}from'./chunk-NNA4MLFC.js';import {Q,ba,U}from'./chunk-6LYEDKFY.js';import'./chunk-SZEGGBOC.js';import'./chunk-ODORXGGY.js';import'./chunk-5DHOBLAE.js';import'./chunk-HDOIOXMP.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]=h(),{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(Q,{defaultOpen:f$1,children:[jsx(ba,{schema:p,menuGroups:u}),jsx(U,{children:jsx(Outlet,{})})]})}export{A as Root};//# sourceMappingURL=root-5ZW536V7.js.map
|
|
2
|
+
//# sourceMappingURL=root-5ZW536V7.js.map
|
|
@@ -0,0 +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":"oYAOA,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,GAAA,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-5ZW536V7.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,31 @@
|
|
|
1
|
+
import'./index.css';import {f}from'./chunk-W2EBZZAY.js';import'./chunk-NNA4MLFC.js';import {x,y as y$1,la,ma,na,L,M,O,oa,z}from'./chunk-6LYEDKFY.js';import'./chunk-SZEGGBOC.js';import {v,w,x as x$1}from'./chunk-ODORXGGY.js';import {d}from'./chunk-5DHOBLAE.js';import'./chunk-HDOIOXMP.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$1,E]=useState(false),k=useRef(null),M$1=useMemo(()=>nt(pe),[]),h=useMemo(()=>t.forcedTheme&&at.includes(t.forcedTheme)?t.forcedTheme:void 0,[t.forcedTheme]),A=useCopyQuery({onCopyQuery:t.onCopyQuery}),O$1=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$1,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$1,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$1,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(la,{className:"fk:w-full",defaultValue:s?.plugins[0].title,children:[jsxs("div",{className:`fk:flex fk:items-center fk:py-1 ${d$1?"":"fk:px-3"}`,children:[jsx(ma,{className:d$1?"fk:hidden":"",children:s?.plugins.map((a,r)=>{let x=`${a===s.visiblePlugin?"Hide":"Show"} ${a.title}`;return jsx(na,{"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(L,{children:[jsx(M,{asChild:true,children:jsx(d,{className:d$1?"fk:ml-1.5":"fk:ml-auto",onClick:()=>{let a=k.current;d$1?a?.expand():a?.collapse();},size:"icon",variant:"ghost",children:d$1?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(O,{children:d$1?"Expand":"Collapse"})]})]}),d$1?null:jsx(v,{}),s?.plugins.map(a=>jsx(oa,{className:`fk:flex fk:w-full fk:max-h-full fk:mt-0 ${d$1?"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$1==="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$1==="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 an in-browser tool for writing, validating, and
|
|
4
|
+
# testing GraphQL queries against your Flexkit datasource.
|
|
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-IIILTOJI.js.map
|
|
31
|
+
//# sourceMappingURL=root-IIILTOJI.js.map
|