@flexkit/studio 0.2.38 → 0.2.40
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 +76 -7
- package/dist/{chat-page-DW3FP4UZ.js → chat-page-I2IFVZA3.js} +3 -3
- package/dist/{chat-page-DW3FP4UZ.js.map → chat-page-I2IFVZA3.js.map} +1 -1
- package/dist/{chunk-DSZJXMN5.js → chunk-2IJWBRN2.js} +2 -2
- package/dist/{chunk-DSZJXMN5.js.map → chunk-2IJWBRN2.js.map} +1 -1
- package/dist/{chunk-IJECATW3.js → chunk-4JG3OWQW.js} +2 -2
- package/dist/{chunk-IJECATW3.js.map → chunk-4JG3OWQW.js.map} +1 -1
- package/dist/{chunk-JUWAKQPE.js → chunk-53GVTCXC.js} +3 -3
- package/dist/{chunk-JUWAKQPE.js.map → chunk-53GVTCXC.js.map} +1 -1
- package/dist/{chunk-WYVXSLB7.js → chunk-CQS6AIOX.js} +2 -2
- package/dist/{chunk-WYVXSLB7.js.map → chunk-CQS6AIOX.js.map} +1 -1
- package/dist/{chunk-AQBULUC2.js → chunk-DAXVPJJS.js} +4 -4
- package/dist/{chunk-AQBULUC2.js.map → chunk-DAXVPJJS.js.map} +1 -1
- package/dist/{chunk-LMJEP4VR.js → chunk-DFOPVG7I.js} +2 -2
- package/dist/{chunk-LMJEP4VR.js.map → chunk-DFOPVG7I.js.map} +1 -1
- package/dist/{chunk-IUWDNPMY.js → chunk-E3KO5NGM.js} +2 -2
- package/dist/{chunk-IUWDNPMY.js.map → chunk-E3KO5NGM.js.map} +1 -1
- package/dist/chunk-GPMBBJHK.js +7 -0
- package/dist/chunk-GPMBBJHK.js.map +1 -0
- package/dist/{chunk-3GXM5SSM.js → chunk-GPTSQ2WH.js} +3 -3
- package/dist/{chunk-3GXM5SSM.js.map → chunk-GPTSQ2WH.js.map} +1 -1
- package/dist/{chunk-GORBKX24.js → chunk-HOAVEDVI.js} +3 -3
- package/dist/{chunk-GORBKX24.js.map → chunk-HOAVEDVI.js.map} +1 -1
- package/dist/{chunk-KV4OGH5U.js → chunk-HUG2NGZI.js} +2 -2
- package/dist/{chunk-KV4OGH5U.js.map → chunk-HUG2NGZI.js.map} +1 -1
- package/dist/{chunk-377TM7UG.js → chunk-L62VVHKS.js} +2 -2
- package/dist/{chunk-377TM7UG.js.map → chunk-L62VVHKS.js.map} +1 -1
- package/dist/{chunk-6J3ZIVDQ.js → chunk-LO37DY2Z.js} +2 -2
- package/dist/{chunk-6J3ZIVDQ.js.map → chunk-LO37DY2Z.js.map} +1 -1
- package/dist/{chunk-32B35YDF.js → chunk-LWI3HNJL.js} +3 -3
- package/dist/{chunk-32B35YDF.js.map → chunk-LWI3HNJL.js.map} +1 -1
- package/dist/{chunk-UOTVVZPA.js → chunk-NPMBADZL.js} +3 -3
- package/dist/{chunk-UOTVVZPA.js.map → chunk-NPMBADZL.js.map} +1 -1
- package/dist/chunk-NPO7ISWV.js +2 -0
- package/dist/chunk-NPO7ISWV.js.map +1 -0
- package/dist/{chunk-4OGLWOO3.js → chunk-X5QKLF63.js} +3 -3
- package/dist/chunk-X5QKLF63.js.map +1 -0
- package/dist/{chunk-INZZOKRC.js → chunk-Y7VBTUNI.js} +3 -3
- package/dist/{chunk-INZZOKRC.js.map → chunk-Y7VBTUNI.js.map} +1 -1
- package/dist/{entry-G2R3W5NU.js → entry-NCKQ45MI.js} +2 -2
- package/dist/{entry-G2R3W5NU.js.map → entry-NCKQ45MI.js.map} +1 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/list-UHHDZ3DM.js +2 -0
- package/dist/list-UHHDZ3DM.js.map +1 -0
- package/dist/{list-LVXMUJHP.js → list-VWN4IJYC.js} +3 -3
- package/dist/{list-LVXMUJHP.js.map → list-VWN4IJYC.js.map} +1 -1
- package/dist/{pages-HJHR7DFO.js → pages-LZEKCA4W.js} +3 -3
- package/dist/{pages-HJHR7DFO.js.map → pages-LZEKCA4W.js.map} +1 -1
- package/dist/{plugin-pages-ZO3TLUYW.js → plugin-pages-LLJPZJWL.js} +2 -2
- package/dist/{plugin-pages-ZO3TLUYW.js.map → plugin-pages-LLJPZJWL.js.map} +1 -1
- package/dist/{project-selector-OXDEHTJ5.js → project-selector-K3T6H77F.js} +2 -2
- package/dist/{project-selector-OXDEHTJ5.js.map → project-selector-K3T6H77F.js.map} +1 -1
- package/dist/record-links-CILZYRSE.js +2 -0
- package/dist/{record-links-SZQUATM6.js.map → record-links-CILZYRSE.js.map} +1 -1
- package/dist/{root-4ATHF5ZZ.js → root-ADEORVTL.js} +2 -2
- package/dist/{root-4ATHF5ZZ.js.map → root-ADEORVTL.js.map} +1 -1
- package/dist/root-CE6LNBBW.js +23 -0
- package/dist/root-CE6LNBBW.js.map +1 -0
- package/dist/{root-P537YXFS.js → root-LSBCX6AE.js} +2 -2
- package/dist/{root-P537YXFS.js.map → root-LSBCX6AE.js.map} +1 -1
- package/dist/{root-MMGPZ4ZF.js → root-PY5SBJ4F.js} +3 -3
- package/dist/{root-MMGPZ4ZF.js.map → root-PY5SBJ4F.js.map} +1 -1
- package/dist/{root-E4GIVJYA.js → root-XTF6EH63.js} +3 -3
- package/dist/{root-E4GIVJYA.js.map → root-XTF6EH63.js.map} +1 -1
- package/dist/{root-BRIEXCDH.js → root-Y3D2FTDR.js} +2 -2
- package/dist/{root-BRIEXCDH.js.map → root-Y3D2FTDR.js.map} +1 -1
- package/dist/{search-57W7MXQ3.js → search-MGY3OWZQ.js} +2 -2
- package/dist/{search-57W7MXQ3.js.map → search-MGY3OWZQ.js.map} +1 -1
- package/dist/{skills-pages-LUOBTEAP.js → skills-pages-7QYBKBSB.js} +2 -2
- package/dist/{skills-pages-LUOBTEAP.js.map → skills-pages-7QYBKBSB.js.map} +1 -1
- package/dist/{source-CJPY5PTU.js → source-M746FR3B.js} +2 -2
- package/dist/{source-CJPY5PTU.js.map → source-M746FR3B.js.map} +1 -1
- package/package.json +4 -4
- package/dist/chunk-4OGLWOO3.js.map +0 -1
- package/dist/chunk-CCVE7GGO.js +0 -2
- package/dist/chunk-CCVE7GGO.js.map +0 -1
- package/dist/chunk-GSKQHFQM.js +0 -7
- package/dist/chunk-GSKQHFQM.js.map +0 -1
- package/dist/list-IRTUEW55.js +0 -2
- package/dist/list-IRTUEW55.js.map +0 -1
- package/dist/record-links-SZQUATM6.js +0 -2
- package/dist/root-BIUU3CXY.js +0 -23
- package/dist/root-BIUU3CXY.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';export{b as CatalogHeader,d as InstalledPluginsPage,a as PluginConnectControl,e as PluginDetailPage,c as PluginsPage}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=plugin-pages-
|
|
1
|
+
import'./index.css';export{b as CatalogHeader,d as InstalledPluginsPage,a as PluginConnectControl,e as PluginDetailPage,c as PluginsPage}from'./chunk-E3KO5NGM.js';import'./chunk-QSTWBKPN.js';import'./chunk-L5Z56DDM.js';import'./chunk-PLCI2RJA.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-Y7VBTUNI.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import'./chunk-RULCANNM.js';import'./chunk-A4DPLZZF.js';import'./chunk-G5N6HEPW.js';import'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import'./chunk-N33S7BSG.js';import'./chunk-X3SHNHHM.js';//# sourceMappingURL=plugin-pages-LLJPZJWL.js.map
|
|
2
|
+
//# sourceMappingURL=plugin-pages-LLJPZJWL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"plugin-pages-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"plugin-pages-LLJPZJWL.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {a,b,d as d$1}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=project-selector-
|
|
1
|
+
import'./index.css';import {a,b,d as d$1}from'./chunk-DFOPVG7I.js';export{a as getProjectLabel}from'./chunk-DFOPVG7I.js';import'./chunk-GPTSQ2WH.js';import {f}from'./chunk-Y7VBTUNI.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import'./chunk-G5N6HEPW.js';import {a as a$1,d,c,e,b as b$1,f as f$1,g,h,k,p,q as q$1,s,t}from'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import'./chunk-X3SHNHHM.js';import {useState}from'react';import {useNavigate}from'react-router-dom';import {Plus}from'lucide-react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var _="__new_project__";function q({projectId:i,projectIds:v,projectSummaries:a$2=[],projects:s$1}){let L=useNavigate(),{mode:E,teams:V}=f(),[m,r]=useState(false),p$1=a(i,s$1,a$2),J=b(v,a$2),g$1=E==="hosted";return jsxs(Fragment,{children:[jsxs(a$1,{onValueChange:o=>{if(o===_){r(true);return}L(`/${o}`);},value:i,children:[jsx(d,{className:"fk:w-48! fk:h-9 fk:py-1",id:"project",children:jsx(c,{"aria-label":p$1,children:p$1})}),jsxs(e,{children:[J.map((o,U)=>jsxs(b$1,{children:[o.label?jsx(f$1,{children:o.label}):null,o.projectIds.map(c=>jsx(g,{value:c,children:a(c,s$1,a$2)},c))]},o.label??U)),g$1?jsxs(Fragment,{children:[jsx(h,{}),jsxs(g,{value:_,children:[jsx(Plus,{className:"fk:h-4 fk:w-4"}),"New project"]})]}):null]})]}),g$1?jsx(k,{onOpenChange:r,open:m,children:jsxs(p,{className:"fk:sm:max-w-md",children:[jsxs(q$1,{children:[jsx(s,{children:"New project"}),jsx(t,{children:"Projects start on the Free plan. Start from the commerce starter, or let the AI agent design the schema with you."})]}),m?jsx(d$1,{onCancel:()=>{r(false);},onCreated:()=>{r(false);},teams:V}):null]})}):null]})}export{q as ProjectSelector};//# sourceMappingURL=project-selector-K3T6H77F.js.map
|
|
2
|
+
//# sourceMappingURL=project-selector-K3T6H77F.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/components/project-selector.tsx"],"names":["NEW_PROJECT_VALUE","ProjectSelector","projectId","projectIds","projectSummaries","projects","navigate","useNavigate","mode","teams","useConfig","isCreating","setIsCreating","useState","label","getProjectLabel","groups","groupProjectIdsByTeam","canCreate","jsxs","Fragment","Select","id","jsx","SelectTrigger","SelectValue","SelectContent","group","index","SelectGroup","SelectLabel","SelectItem","SelectSeparator","Plus","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","NewProjectFlow"],"mappings":"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","file":"project-selector-
|
|
1
|
+
{"version":3,"sources":["../src/ui/components/project-selector.tsx"],"names":["NEW_PROJECT_VALUE","ProjectSelector","projectId","projectIds","projectSummaries","projects","navigate","useNavigate","mode","teams","useConfig","isCreating","setIsCreating","useState","label","getProjectLabel","groups","groupProjectIdsByTeam","canCreate","jsxs","Fragment","Select","id","jsx","SelectTrigger","SelectValue","SelectContent","group","index","SelectGroup","SelectLabel","SelectItem","SelectSeparator","Plus","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","NewProjectFlow"],"mappings":"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","file":"project-selector-K3T6H77F.js","sourcesContent":["import { useState, type JSX } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Plus } from 'lucide-react';\nimport { useConfig } from '../../core/config/config-context';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../primitives/dialog';\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from '../primitives/select';\nimport type { ProjectSummary, ProjectUiConfig } from '../../core/config/types';\nimport { NewProjectFlow } from './new-project-flow';\nimport { getProjectLabel, groupProjectIdsByTeam } from './project-label';\n\n/** Select value of the \"New project\" entry; project ids are ten lowercase characters, so it cannot collide. */\nconst NEW_PROJECT_VALUE = '__new_project__';\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 { mode, teams } = useConfig();\n const [isCreating, setIsCreating] = useState(false);\n const label = getProjectLabel(projectId, projects, projectSummaries);\n const groups = groupProjectIdsByTeam(projectIds, projectSummaries);\n // Projects are created from the hosted Studio only; a self-hosted Studio lists fixed project ids.\n const canCreate = mode === 'hosted';\n\n return (\n <>\n <Select\n onValueChange={(id) => {\n if (id === NEW_PROJECT_VALUE) {\n setIsCreating(true);\n\n return;\n }\n\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 {canCreate ? (\n <>\n <SelectSeparator />\n <SelectItem value={NEW_PROJECT_VALUE}>\n <Plus className=\"fk:h-4 fk:w-4\" />\n New project\n </SelectItem>\n </>\n ) : null}\n </SelectContent>\n </Select>\n {canCreate ? (\n <Dialog onOpenChange={setIsCreating} open={isCreating}>\n <DialogContent className=\"fk:sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>New project</DialogTitle>\n <DialogDescription>\n Projects start on the Free plan. Start from the commerce starter, or let the AI agent design the schema\n with you.\n </DialogDescription>\n </DialogHeader>\n {isCreating ? (\n <NewProjectFlow\n onCancel={() => {\n setIsCreating(false);\n }}\n onCreated={() => {\n setIsCreating(false);\n }}\n teams={teams}\n />\n ) : null}\n </DialogContent>\n </Dialog>\n ) : null}\n </>\n );\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import'./index.css';export{a as EntityKnowledgeButton,c as LinkedRecordsSection,b as RecordKnowledgePanel}from'./chunk-CQS6AIOX.js';import'./chunk-4JG3OWQW.js';import'./chunk-4ZWQ44NZ.js';import'./chunk-NPO7ISWV.js';import'./chunk-DSLPTDZX.js';import'./chunk-X5QKLF63.js';import'./chunk-2IJWBRN2.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-HOAVEDVI.js';import'./chunk-Y7VBTUNI.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import'./chunk-RULCANNM.js';import'./chunk-A4DPLZZF.js';import'./chunk-G5N6HEPW.js';import'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import'./chunk-N33S7BSG.js';import'./chunk-X3SHNHHM.js';//# sourceMappingURL=record-links-CILZYRSE.js.map
|
|
2
|
+
//# sourceMappingURL=record-links-CILZYRSE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"record-links-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"record-links-CILZYRSE.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {c}from'./chunk-2DXR5NJV.js';import {f}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=root-
|
|
1
|
+
import'./index.css';import {c}from'./chunk-2DXR5NJV.js';import {f}from'./chunk-Y7VBTUNI.js';import {g}from'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import {I,K,X,O}from'./chunk-RULCANNM.js';import'./chunk-A4DPLZZF.js';import'./chunk-G5N6HEPW.js';import'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import'./chunk-N33S7BSG.js';import'./chunk-X3SHNHHM.js';import {Outlet}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';function P(){let[,u]=g(),{currentProject:r}=f(),c$1=r?.schema??[],p=r?.menuGroups??[],d=c(c$1,u.user?.spaces),f$1=I();return jsxs(K,{defaultOpen:f$1,children:[jsx(X,{schema:d,menuGroups:p}),jsx(O,{children:jsx(Outlet,{})})]})}export{P as Root};//# sourceMappingURL=root-ADEORVTL.js.map
|
|
2
|
+
//# sourceMappingURL=root-ADEORVTL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/desk/root.tsx"],"names":["Root","auth","useAuth","currentProject","useConfig","schema","menuGroups","visibleSchema","filterEntitiesForSpaces","defaultOpen","readSidebarCookieState","jsxs","SidebarProvider","jsx","Sidebar","SidebarInset","Outlet"],"mappings":"ydAOO,SAASA,CAAAA,EAAoB,CAClC,GAAM,EAAGC,CAAI,CAAA,CAAIC,CAAAA,EAAQ,CACnB,CAAE,cAAA,CAAAC,CAAe,EAAIC,CAAAA,EAAU,CAC/BC,GAAAA,CAASF,CAAAA,EAAgB,MAAA,EAAU,EAAC,CACpCG,CAAAA,CAAaH,GAAgB,UAAA,EAAc,EAAC,CAG5CI,CAAAA,CAAgBC,CAAAA,CAAwBH,GAAAA,CAAQJ,CAAAA,CAAK,IAAA,EAAM,MAAM,CAAA,CACjEQ,GAAAA,CAAcC,CAAAA,EAAuB,CAE3C,OACEC,IAAAA,CAACC,CAAAA,CAAA,CAAgB,YAAaH,GAAAA,CAC5B,QAAA,CAAA,CAAAI,GAAAA,CAACC,CAAAA,CAAA,CAAQ,MAAA,CAAQP,CAAAA,CAAe,UAAA,CAAYD,EAAY,CAAA,CACxDO,GAAAA,CAACE,CAAAA,CAAA,CACC,SAAAF,GAAAA,CAACG,MAAAA,CAAA,EAAO,CAAA,CACV,GACF,CAEJ","file":"root-
|
|
1
|
+
{"version":3,"sources":["../src/apps/desk/root.tsx"],"names":["Root","auth","useAuth","currentProject","useConfig","schema","menuGroups","visibleSchema","filterEntitiesForSpaces","defaultOpen","readSidebarCookieState","jsxs","SidebarProvider","jsx","Sidebar","SidebarInset","Outlet"],"mappings":"ydAOO,SAASA,CAAAA,EAAoB,CAClC,GAAM,EAAGC,CAAI,CAAA,CAAIC,CAAAA,EAAQ,CACnB,CAAE,cAAA,CAAAC,CAAe,EAAIC,CAAAA,EAAU,CAC/BC,GAAAA,CAASF,CAAAA,EAAgB,MAAA,EAAU,EAAC,CACpCG,CAAAA,CAAaH,GAAgB,UAAA,EAAc,EAAC,CAG5CI,CAAAA,CAAgBC,CAAAA,CAAwBH,GAAAA,CAAQJ,CAAAA,CAAK,IAAA,EAAM,MAAM,CAAA,CACjEQ,GAAAA,CAAcC,CAAAA,EAAuB,CAE3C,OACEC,IAAAA,CAACC,CAAAA,CAAA,CAAgB,YAAaH,GAAAA,CAC5B,QAAA,CAAA,CAAAI,GAAAA,CAACC,CAAAA,CAAA,CAAQ,MAAA,CAAQP,CAAAA,CAAe,UAAA,CAAYD,EAAY,CAAA,CACxDO,GAAAA,CAACE,CAAAA,CAAA,CACC,SAAAF,GAAAA,CAACG,MAAAA,CAAA,EAAO,CAAA,CACV,GACF,CAEJ","file":"root-ADEORVTL.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 { readSidebarCookieState, Sidebar, SidebarInset, SidebarProvider } from '../../ui';\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 = readSidebarCookieState();\n\n return (\n <SidebarProvider defaultOpen={defaultOpen}>\n <Sidebar schema={visibleSchema} menuGroups={menuGroups} />\n <SidebarInset>\n <Outlet />\n </SidebarInset>\n </SidebarProvider>\n );\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import'./index.css';import {a as a$1}from'./chunk-CLCIE5RF.js';import {c as c$3,a as a$5}from'./chunk-LO37DY2Z.js';import {a as a$4}from'./chunk-VFV44YZB.js';import {a as a$3}from'./chunk-L62VVHKS.js';import {m,a,b as b$1,d,f as f$1,e as e$4,c as c$5,h as h$2,j as j$3,i as i$2,k as k$1}from'./chunk-GPMBBJHK.js';import {b as b$5}from'./chunk-CAZ6EUR2.js';import'./chunk-2DXR5NJV.js';import {e as e$1}from'./chunk-NPO7ISWV.js';import {b as b$2}from'./chunk-DSLPTDZX.js';import {e,j as j$1}from'./chunk-X5QKLF63.js';import {c}from'./chunk-2IJWBRN2.js';import {o,i,m as m$1,l}from'./chunk-HOAVEDVI.js';import {f,b}from'./chunk-Y7VBTUNI.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import {v,w,x,ja,c as c$4,d as d$1,n}from'./chunk-RULCANNM.js';import {e as e$3,g,h,j,o as o$1,t as t$1}from'./chunk-A4DPLZZF.js';import {b as b$4}from'./chunk-G5N6HEPW.js';import {m as m$2,d as d$2,e as e$5,f as f$2,g as g$1,h as h$1,j as j$2,i as i$1}from'./chunk-5JUG4BEF.js';import {k,l as l$1,p,q,s,t,r}from'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import {a as a$2,b as b$3,c as c$1,e as e$2}from'./chunk-N33S7BSG.js';import {c as c$2}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useCallback,useRef,useEffect}from'react';import {TagIcon,PlusIcon,Loader2,Ellipsis,Check,Copy,Link,MinusIcon,Trash2,LoaderCircle,Search,X,ImagePlayIcon,ImageIcon,FilePlayIcon,LayersIcon,SplinePointerIcon,ListChecks,Trash2Icon,LayoutGrid,List}from'lucide-react';import {gql}from'@apollo/client';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useLocation,Outlet,useParams}from'react-router-dom';import {useReactTable,getSortedRowModel,getPaginationRowModel,getFilteredRowModel,getCoreRowModel}from'@tanstack/react-table';import {defaultStyles,FileIcon}from'react-file-icon';var Ce={where:{},limit:500,offset:0,sort:[{name:"ASC"}]},Y={selection:"display",includeCount:false};function Pt(){let{scope:e}=c(),{currentProjectSchema:n}=f(),[t$1,r$1,i$1]=f$1(),[c$3,l$2]=useState(""),[p$1,M]=useState(false),[k$1,v]=useState(false),[S,f$2]=useState(null),[N,m]=useState(false),[I,x]=useState(null),[V,_]=useState(""),[A,$]=useState(false),[E,q$1]=useState(false),h$1=b$2(),C="_tag",d="_tags",{data:w,isLoading:D}=e$1({entityNamePlural:d,schema:n,scope:e,variables:Ce,...Y}),U=(Array.isArray(w)?w:[]).map(s=>{let z=s;return {_id:z._id,name:z.name}}),O=useCallback(async()=>{let s=c$3.trim();if(!s)return;$(true);let z=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}`,R=o(d,n,{name:{value:s,disabled:false,scope:"default"}},z),X=i(d,e,n,Y),Z=gql`
|
|
2
|
+
${X.query}
|
|
3
|
+
`;await new Promise(K=>{r$1(gql`
|
|
4
|
+
${R}
|
|
5
|
+
`),i$1({refetchQueries:[Z],onCompleted:()=>{l$2(""),M(false),K();}}),t$1(true);}),$(false);},[d,t$1,n,e,r$1,i$1,c$3]),B=useCallback(async s=>{q$1(true);let z=m$1(C,n,s),J=i(d,e,n,Y),R=gql`
|
|
6
|
+
${J.query}
|
|
7
|
+
`;await new Promise((X,Z)=>{r$1(gql`
|
|
8
|
+
${z}
|
|
9
|
+
`),i$1({variables:{where:{_id:{eq:s}}},refetchQueries:[R],onCompleted:()=>{X();},onError:K=>{Z(K);}}),t$1(true);}),q$1(false);},[C,d,t$1,n,e,r$1,i$1]),u=useCallback(async()=>{let s=V.trim();if(!s||!I)return;$(true);let z={name:{value:s,disabled:false,scope:"default"}},J={},R=l(d,I._id,e,n,J,z),X=i(d,e,n,Y),Z=gql`
|
|
10
|
+
${X.query}
|
|
11
|
+
`;await new Promise(K=>{r$1(gql`
|
|
12
|
+
${R}
|
|
13
|
+
`),i$1({variables:{where:{_id:{eq:I._id}}},refetchQueries:[Z],onCompleted:()=>{m(false),x(null),_(""),K();}}),t$1(true);}),$(false);},[V,d,t$1,n,e,r$1,i$1,I]);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$1?jsx(a$2,{children:jsxs(b$3,{children:[jsx(c$1,{asChild:true,children:jsxs(k,{open:p$1,onOpenChange:M,children:[jsx(l$1,{asChild:true,children:jsxs(c$2,{variant:"secondary",size:"icon",className:"fk:ml-auto fk:h-8 fk:w-8",children:[jsx(PlusIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Add tag"})]})}),jsxs(p,{children:[jsxs(q,{children:[jsx(s,{children:"New tag"}),jsx(t,{className:"fk:sr-only",children:"Create a new tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(b$4,{autoFocus:true,value:c$3,placeholder:"New tag name",onChange:s=>l$2(s.target.value),onKeyDown:s=>{s.key==="Enter"&&O();}})}),jsx(r,{children:jsxs(c$2,{disabled:A,onClick:O,variant:"default",children:[A?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Add"]})})]})]})}),jsx(e$2,{children:jsx("p",{children:"Add tag"})})]})}):jsx("div",{className:"fk:ml-auto",children:jsx(ja,{disabled:true,children:jsxs(c$2,{disabled:true,variant:"secondary",size:"icon",className:"fk:h-8 fk:w-8",children:[jsx(PlusIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Add tag"})]})})})]}),jsx(m$2,{className:"fk:h-full",children:jsx("div",{className:"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2",children:D?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Loading..."}):U.length===0?jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"No tags yet"}):U.map(s=>jsxs("div",{className:"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1 fk:corner-squircle",children:[jsx("span",{className:"fk:text-sm",children:s.name}),jsxs(e$3,{children:[jsx(ja,{disabled:!h$1,children:jsx(g,{asChild:true,children:jsx(c$2,{"aria-label":`Actions for ${s.name}`,disabled:!h$1,title:h$1?`Actions for ${s.name}`:void 0,variant:"ghost",size:"icon",className:"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground",children:jsx(Ellipsis,{className:"fk:h-4 fk:w-4"})})})}),jsxs(h,{align:"end",className:"w-[160px]",children:[jsx(j,{onClick:()=>{x(s),_(s.name),m(true);},children:"Edit"}),jsx(o$1,{}),jsx(j,{className:"fk:text-destructive",onClick:()=>{f$2(s),v(true);},children:"Remove"})]})]})]},s._id))})}),jsx(k,{open:N,onOpenChange:m,children:jsxs(p,{children:[jsxs(q,{children:[jsx(s,{children:"Edit tag"}),jsx(t,{className:"fk:sr-only",children:"Rename an existing tag"})]}),jsx("div",{className:"fk:flex fk:gap-2",children:jsx(b$4,{autoFocus:true,value:V,placeholder:"Tag name",onChange:s=>_(s.target.value),onKeyDown:s=>{s.key==="Enter"&&u();}})}),jsxs(r,{children:[jsx(c$2,{disabled:A,variant:"secondary",onClick:()=>{m(false),x(null);},children:"Cancel"}),jsxs(c$2,{disabled:A,onClick:u,variant:"default",children:[A?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Save"]})]})]})}),jsx(k,{open:k$1,onOpenChange:v,children:jsxs(p,{children:[jsxs(q,{children:[jsx(s,{children:"Delete tag"}),jsx(t,{className:"fk:sr-only",children:"Confirm deletion of a tag"})]}),jsxs("div",{className:"fk:text-sm fk:text-muted-foreground",children:["Are you sure you want to delete the tag"," ",jsx("span",{className:"fk:font-semibold fk:text-foreground",children:S?.name}),"?"]}),jsxs(r,{children:[jsx(c$2,{disabled:E,variant:"secondary",onClick:()=>{v(false),f$2(null);},children:"Cancel"}),jsxs(c$2,{disabled:E,variant:"destructive",onClick:()=>{S&&(async()=>(await B(S._id),v(false),f$2(null)))();},children:[E?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin"}):null,"Delete"]})]})]})})]})}var Ft=`_updatedAt
|
|
14
|
+
tags(limit: 3, offset: 0) {
|
|
15
|
+
_id
|
|
16
|
+
name
|
|
17
|
+
}
|
|
18
|
+
`;function Le({assetIds:e,mode:n,onModeChange:t,onCompleted:r}){let{scope:i}=c(),c$1=a$5("_assets"),[l$1,p,M]=f$1(),{currentProjectSchema:k}=f(),[v,S]=useState([]),[f$3,N]=useState(false),{data:m}=e$1({entityNamePlural:"_tags",schema:k,scope:i,variables:Ce,...Y}),I=useMemo(()=>(Array.isArray(m)?m:[]).map(C=>({_id:C._id,name:C.name})),[m]),x=useCallback(()=>{S([]);},[]),V=useCallback(h=>{!h&&!f$3&&(t(null),x());},[f$3,t,x]),_=useCallback(h=>{let d=(h?.update_assets?._assets??[]).filter(w=>typeof w?._id=="string").map(w=>{let D=(Array.isArray(w.tags)?w.tags:[]).map(U=>U.name).filter(Boolean).slice(0,3).join(", ");return {_id:w._id,attributes:{tags:D,...typeof w._updatedAt=="string"?{_updatedAt:w._updatedAt}:{}}}});d.length>0&&c$1(d);},[c$1]),A=useCallback(async()=>{if(!(e.length===0||v.length===0||f$3)){N(true);try{let h={tags:{relationships:{connect:v.map(d=>({_id:d}))},disabled:!1,scope:i}},C=l("_assets",e[0]??"",i,k,{},h,{responseFields:Ft});await new Promise((d,w)=>{p(gql`
|
|
19
|
+
${C}
|
|
20
|
+
`),M({variables:{where:{_id:{in:e}}},onCompleted:D=>{_(D),d();},onError:D=>w(D)}),l$1(!0);}),r?.(),x(),t(null);}catch{}finally{N(false);}}},[_,e,f$3,r,t,x,l$1,k,i,v,p,M]),$=useCallback(async()=>{if(!(e.length===0||v.length===0||f$3)){N(true);try{let h={tags:{relationships:{disconnect:v},disabled:!1,scope:i}},C=l("_assets",e[0]??"",i,k,{},h,{responseFields:Ft});await new Promise((d,w)=>{p(gql`
|
|
21
|
+
${C}
|
|
22
|
+
`),M({variables:{where:{_id:{in:e}}},onCompleted:D=>{_(D),d();},onError:D=>w(D)}),l$1(!0);}),r?.(),x(),t(null);}catch{}finally{N(false);}}},[_,e,f$3,r,t,x,l$1,k,i,v,p,M]),E=n==="remove",q=E?"Remove tag(s)":"Add tag(s)";return e.length>1&&(q=E?"Remove tag(s) from selected assets":"Add tag(s) to selected assets"),jsxs(d$2,{open:n!==null,onOpenChange:V,children:[jsx(e$5,{placeholder:"Search tags..."}),jsxs(f$2,{className:"fk:h-75",children:[jsx(g$1,{children:"No tags found."}),jsx(h$1,{heading:"Tags",children:I.map(h=>{let C=v.includes(h._id);return jsxs(j$2,{disabled:f$3,onSelect:()=>{f$3||S(d=>C?d.filter(w=>w!==h._id):[...d,h._id]);},children:[jsx("input",{className:"fk:mr-2",checked:C,onChange:()=>{},type:"checkbox"}),h.name]},h._id)})})]}),jsx(i$1,{}),jsx("div",{className:"fk:p-2",children:jsxs(c$2,{className:"fk:w-full",disabled:v.length===0||f$3,onClick:E?$:A,children:[f$3?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):null,q]})})]})}function Ve({overlay:e=false,row:n}){let[t,r]=useState(null),[i,c]=useState(null),l=j$1(),p=b$2(),M=n.original,k=M._id??"",v=M.url??"";function S(){l({type:"DeleteEntity",payload:{entityId:k,entityName:b.name}});}function f(m,I){navigator.clipboard.writeText(I),r(m),window.setTimeout(()=>r(null),1500);}return jsxs(Fragment,{children:[jsxs(e$3,{children:[jsx(g,{asChild:true,children:jsxs(c$2,{className:e?"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:text-white fk:group-hover:bg-background/10 fk:group-hover:text-white! fk:data-[state=open]:bg-background/15":"fk:flex fk:h-8 fk:w-8 fk:p-0 fk:data-[state=open]:bg-muted",onClick:m=>m.stopPropagation(),variant:"ghost",children:[jsx(Ellipsis,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Open menu"})]})}),jsxs(h,{align:"start",className:"fk:w-45",children:[jsxs(j,{disabled:!k,onClick:m=>{m.stopPropagation(),f("id",k);},children:[t==="id"?jsx(Check,{className:"fk:mr-2 fk:h-4 fk:w-4"}):jsx(Copy,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Copy ID"]}),jsxs(j,{disabled:!v,onClick:m=>{m.stopPropagation(),f("url",v);},children:[t==="url"?jsx(Check,{className:"fk:mr-2 fk:h-4 fk:w-4"}):jsx(Link,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Copy URL"]}),jsx(o$1,{}),jsxs(j,{disabled:!k||!p,onClick:m=>{m.stopPropagation(),c("add");},children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Add tag"]}),jsxs(j,{disabled:!k||!p,onClick:m=>{m.stopPropagation(),c("remove");},children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Remove tag"]}),jsx(o$1,{}),jsxs(j,{className:"fk:text-destructive",disabled:!k||!p,onClick:m=>{m.stopPropagation(),S();},children:[jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete"]})]})]}),i!==null?jsx(Le,{assetIds:k?[k]:[],mode:i,onModeChange:c}):null]})}var ho=FileIcon,yo="fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]";function vo(e){return e==null||Number.isNaN(e)?"":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Ut({columns:e$1,data:n,entityName:t,hasMore:r=false,isLoading:i=false,isLoadingMore:c=false,onLoadMore:l,onSortingChange:p,pageSize:M,sorting:k,toolbarComponent:v}){let S=useRef(null),{schemaErrorMessage:f}=e(),[N,m]=useState({}),[I,x]=useState({}),[V,_]=useState([]),[A,$]=useState([]),E=k??A;useEffect(()=>{S.current?.scrollTo({top:0});},[t]);function q(u){if(p){p(u);return}$(u);}let h=useReactTable({data:n,columns:e$1,state:{sorting:E,columnVisibility:I,rowSelection:N,columnFilters:V},initialState:{pagination:{pageSize:M??50}},enableRowSelection:true,onRowSelectionChange:m,onSortingChange:q,onColumnFiltersChange:_,onColumnVisibilityChange:x,getCoreRowModel:getCoreRowModel(),getFilteredRowModel:getFilteredRowModel(),getPaginationRowModel:getPaginationRowModel(),getSortedRowModel:getSortedRowModel(),getRowId:u=>u._id,manualFiltering:true,manualPagination:true,manualSorting:true}),{rows:C}=h.getRowModel(),d=useRef(l),w=useRef(r),D=useRef(c);d.current=l,w.current=r,D.current=c;let U=useCallback(u=>{if(!d.current||!w.current||D.current)return;let s=u??S.current;s&&c$5(s)&&(D.current=true,d.current());},[]),O=b$5();useEffect(()=>{O&&U();},[U,C.length,r,c,O]);function B(u){U(u.currentTarget);}return f?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:[v?v(h):null,jsxs("div",{className:"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1",children:[c?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:B,ref:S,children:[i?jsx("div",{className:"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3",children:Array.from({length:M??50},(u,s)=>jsxs("div",{className:"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle",children:[jsx(t$1,{className:"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle"}),jsx(t$1,{className:"fk:mt-2 fk:h-3 fk:w-[75%]"}),jsx(t$1,{className:"fk:mt-1.5 fk:h-3 fk:w-[50%]"})]},`skeleton-${s}`))}):null,!i&&C.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&&C.length>0?jsx("div",{className:"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3",children:C.map(u=>jsx(wo,{row:u},u.id))}):null]})]})]})}function wo({row:e}){let n$1=e.original,t=h$2(n$1)||"Untitled",r=n$1.mimeType??"",i=vo(n$1.size),c=e.getIsSelected(),l=[r,i].filter(Boolean).join(" \xB7 ");return jsxs("div",{className:`fk:relative fk:rounded-md fk:border fk:p-2 fk:transition-colors ${c?"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":c?"selected":void 0,children:[jsx("div",{className:"fk:absolute fk:left-3 fk:top-3 fk:z-10 fk:mix-blend-difference",children:jsx(n,{className:"fk:border-white!","aria-label":`Select ${t}`,checked:c,onCheckedChange:p=>{e.toggleSelected(!!p);},onClick:p=>p.stopPropagation()})}),jsx("div",{className:"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference",children:jsx(Ve,{overlay:true,row:e})}),jsx(bo,{asset:n$1,filename:t}),jsx("div",{className:"fk:mt-2 fk:truncate fk:text-xs fk:font-medium",title:t,children:t}),l?jsx("div",{className:"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground",title:l,children:l}):null]})}function bo({asset:e,filename:n}){let[t$1,r]=useState(false),[i,c]=useState(false),l=e.url??"";if(!l&&!e.path)return jsx("div",{className:"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:corner-squircle",children:jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:"No preview"})});if(!j$3(e)||!l){let f=i$2(e),N=defaultStyles[f];return jsx("div",{className:"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:[&>svg]:h-12 fk:[&>svg]:w-auto fk:corner-squircle",children:jsx(ho,{extension:f,...N||{}})})}let M=k$1(l,{width:320,height:320}),k$2=l;function v(f){f.stopPropagation(),c(false),r(true);}function S(f){r(f),f||c(false);}return jsxs(Fragment,{children:[jsx("button",{className:`fk:aspect-square fk:w-full fk:cursor-zoom-in fk:overflow-hidden fk:rounded-sm fk:border-0 fk:p-0 ${yo} fk:corner-squircle`,onClick:v,type:"button",children:jsx("img",{alt:n,className:"fk:h-full fk:w-full fk:object-contain",src:M})}),jsx(k,{open:t$1,onOpenChange:S,children:jsxs(p,{className:"fk:sm:max-w-4xl fk:p-3",children:[jsxs(q,{children:[jsx(s,{className:"fk:sr-only",children:"Asset preview"}),jsx(t,{className:"fk:sr-only",children:"Enlarged asset preview"})]}),jsxs("div",{className:"fk:relative fk:flex fk:h-[min(85vh,56rem)] fk:w-full fk:items-center fk:justify-center fk:overflow-hidden fk:rounded-md fk:corner-squircle",children:[i?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?"fk:opacity-100":"fk:opacity-0"}`,onError:()=>c(true),onLoad:()=>c(true),src:k$2})]})]})})]})}var Fo=[{value:"image/gif",label:"GIF",icon:ImagePlayIcon},{value:"image/jpeg",label:"JPEG",icon:ImageIcon},{value:"video/mp4",label:"MP4",icon:FilePlayIcon},{value:"image/png",label:"PNG",icon:LayersIcon},{value:"image/svg+xml",label:"SVG",icon:SplinePointerIcon},{value:"image/webp",label:"WebP",icon:ImageIcon}];function Xe({entityName:e,isUploading:n=false,table:t,viewMode:r,onUploadClick:i,onViewModeChange:c$1,onSearchLoadingChange:l,onSearchWhereChange:p}){let M=t.getState().columnFilters.length>0,{projectId:k}=useParams(),v=j$1(),{scope:S}=c(),[f$1,N]=useState(null),{currentProjectSchema:m}=f(),I=b$2(),[x,V]=useState(""),_=useRef({}),A=useRef({});function $(){return {searchRequests:{searches:[{collection:"_assets"},{collection:"_tags"}]},commonParams:{q:""}}}let E=useMemo(()=>$(),[]),[q,h$1]=useState(E),{results:C,isLoading:d}=a$3(k??"",q),w=useRef(""),D=x.trim(),U=q.commonParams.q??"",O=D.length>0&&(d||U!==D),B=useMemo(()=>Lo(g=>{h$1({...E,commonParams:{q:g}});},300),[E]);useEffect(()=>()=>{B.cancel();},[B]);let u=t.getSelectedRowModel().rows.map(g=>g.original._id),{data:s}=e$1({entityNamePlural:"_tags",schema:m,scope:S,variables:Ce,...Y}),z=useMemo(()=>(Array.isArray(s)?s:[]).map(a=>({_id:a._id,name:a.name})),[s]),J=useMemo(()=>z.map(g=>({value:g._id,label:g.name})),[z]),R=useCallback(()=>{if(!p)return;let g=[];Object.keys(_.current).length>0&&g.push(_.current),Object.keys(A.current).length>0&&g.push(A.current);let a=g.length===0?{}:g.length===1?g[0]:{AND:g},H=JSON.stringify(a);w.current!==H&&(w.current=H,p(a));},[p]);function X$1(){B.cancel(),V(""),h$1({...E,commonParams:{q:""}}),_.current={},R();}async function Z(){v({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${u.length} asset${u.length>1?"s":""}`,dialogMessage:u.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:()=>{v({type:"DeleteEntity",_id:`delete-batch-${Date.now()}`,payload:{entityId:u,entityName:e,silent:true}}),t.resetRowSelection();}}}});}useEffect(()=>{l?.(O);},[O,l]),useEffect(()=>{if(!p)return;if(D.length===0){_.current={},R();return}if(O)return;let g=C??[],a={};if(g.length===0)a={_id:{in:[]}};else {let H=g.filter(L=>L._entityNamePlural==="_assets").map(L=>L._id),ae=g.filter(L=>L._entityNamePlural==="_tags").map(L=>({tags:{some:{_id:{eq:L._id}}}})),F=[];H.length>0&&F.push({_id:{in:H}}),F.push(...ae),F.length===0?a={_id:{in:[]}}:F.length===1?a=F[0]:a={OR:F};}_.current=a,R();},[R,O,p,C,D]);let K=JSON.stringify(t.getState().columnFilters);return useEffect(()=>{if(!p)return;let g=t.getState().columnFilters.find(L=>L.id==="mimeType"),a=Array.isArray(g?.value)?g?.value:[],H=t.getState().columnFilters.find(L=>L.id==="tags"),ae=Array.isArray(H?.value)?H?.value:[],F=[];if(a.length>0&&F.push({mimeType:{in:a}}),ae.length>0){let L=ae.map(Xt=>({tags:{some:{_id:{eq:Xt}}}}));F.push(L.length===1?L[0]:{OR:L});}F.length===0?A.current={}:F.length===1?A.current=F[0]:A.current={AND:F},R();},[K,R,p,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:[d?jsx(LoaderCircle,{className:"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin"}):jsx(Search,{className:"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50"}),jsx(b$4,{placeholder:"Search assets...",name:"search-assets",value:x,onChange:g=>{let{value:a}=g.target;if(V(a),a.trim().length===0){X$1();return}B(a.trim());},className:"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7"}),x?jsx(c$2,{"aria-label":"Clear search",className:"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle",onClick:X$1,type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})}):null]}),t.getColumn("mimeType")&&jsx(a$4,{column:t.getColumn("mimeType"),options:Fo,title:"File type"}),t.getColumn("tags")&&jsx(a$4,{column:t.getColumn("tags"),options:J,title:"Tags"}),M&&jsxs(c$2,{variant:"ghost",onClick:()=>{t.resetColumnFilters(),A.current={},R();},className:"fk:h-8 fk:px-2 fk:lg:px-3",children:["Reset",jsx(X,{className:"fk:ml-2 fk:h-4 fk:w-4"})]}),jsx(e$4,{table:t})]}),u.length>0?jsx("div",{className:"fk:flex fk:items-center fk:gap-2",children:jsxs(e$3,{children:[jsx(ja,{disabled:!I,children:jsx(g,{asChild:true,children:jsxs(c$2,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:!I,size:"sm",variant:"secondary",children:["Actions ",jsx(ListChecks,{className:"fk:ml-2 fk:h-4 fk:w-4"})]})})}),jsxs(h,{align:"end",className:"fk:w-[240px]",children:[jsxs(j,{onClick:()=>N("add"),children:[jsx(TagIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Add tag"]}),jsxs(j,{onClick:()=>N("remove"),children:[jsx(MinusIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Remove tag"]}),jsx(o$1,{}),jsxs(j,{onClick:Z,className:"fk:text-destructive",children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"})," Delete asset",u.length>1?"s":""," (",u.length,")"]})]})]})}):null,jsxs("div",{className:"fk:ml-auto fk:flex fk:items-center fk:gap-2",children:[jsxs(c$4,{size:"sm",type:"single",value:r,onValueChange:g=>{(g==="list"||g==="grid")&&c$1(g);},children:[jsx(d$1,{"aria-label":"Grid view",value:"grid",children:jsx(LayoutGrid,{className:"fk:h-4 fk:w-4"})}),jsx(d$1,{"aria-label":"List view",value:"list",children:jsx(List,{className:"fk:h-4 fk:w-4"})})]}),jsx(ja,{disabled:!I,children:jsxs(c$2,{"aria-busy":n,className:"fk:h-8 fk:lg:flex",disabled:!I||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"]})})]}),f$1!==null?jsx(Le,{assetIds:u,mode:f$1,onCompleted:()=>t.resetRowSelection(),onModeChange:N}):null]})}function Lo(e,n=300){let t,r=function(...i){t!==void 0&&clearTimeout(t),t=setTimeout(()=>{t=void 0,e.apply(this,i);},n);};return r.cancel=()=>{t!==void 0&&(clearTimeout(t),t=void 0);},r}var Uo=4*1024*1024;function Gt(){let{projectId:e}=useParams(),n=c$3(),t=b$2(),[r,i]=useState(false);async function c(l){if(!(!t||r)&&!(l&&l.length===0))try{await n({files:l,maxBytes:Uo,multiple:!0,onUploadStart:()=>{i(!0);},projectId:e});}finally{i(false);}}return {canMutate:t,isUploading:r,uploadFiles:l=>c(l),uploadFromDialog:()=>c()}}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 xe=36,Qo=[{_updatedAt:"DESC"},{_id:"DESC"}];function jt(){let e$2="_assets",{search:n}=useLocation(),r=new URLSearchParams(n).get("id"),{scope:i}=c(),{schemaErrorMessage:c$1}=e(),{currentProject:l,currentProjectId:p}=f(),M=l?.schema??[],[k,v]=useState([]),[S,f$1]=useState(()=>$t()),N=m({attributesSchema:b.attributes,actionsComponent:a=>jsx(Ve,{row:a}),checkboxSelect:"multiple",enableColumnSorting:true}),[m$1,I]=useState({}),[x,V]=useState(false),{canMutate:_,isUploading:A,uploadFiles:$,uploadFromDialog:E}=Gt(),q=useMemo(()=>{let a=r?{_id:{eq:r}}:{NOT:{path:{eq:null}}};return !m$1||Object.keys(m$1).length===0||r?a:{AND:[a,m$1]}},[r,m$1]),h=useMemo(()=>{if(k.length===0)return Qo;let a=k.map(({id:ae,desc:F})=>({[ae]:F?"DESC":"ASC"}));return a.some(ae=>"_id"in ae)?a:[...a,{_id:"DESC"}]},[k]),C=useMemo(()=>({where:q,offset:0,limit:xe,sort:h}),[q,h]);function d$1(a){v(a);}function w(a){f$1(a),Jt(a);}let{isLoading:D,isLoadingMore:U,fetchMore:O,count:B,data:u,isProjectDisabled:s,isProjectHibernated:z}=e$1({entityNamePlural:e$2,schema:M,scope:i,variables:C,selection:"list"}),J=x||D&&(u==null||u.length===0),R=u?.length??0,X=!x&&B>0&&R>0&&R<B,Z=useCallback(()=>{O({variables:{offset:0,limit:xe}});},[O]),K=useMemo(()=>Array.from({length:xe},(a,H)=>({_id:`loading-${H}`})),[]),g=useMemo(()=>Go(N),[N]);return s?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:jsx(a,{isHibernated:z,projectId:p})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:pl-3",children:[jsx(b$1,{}),jsxs("div",{className:"fk:mb-4 fk:flex fk:items-center fk:gap-2 fk:pr-3",children:[jsx("h2",{className:"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:"Asset Manager"}),J?null:jsxs("span",{className:"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground",children:[B.toLocaleString()," ",B===1?"record":"records"]})]}),c$1?null:jsx(a$1,{disabled:!_||A,onDropFiles:$,children:S==="list"?jsx(d,{classNames:{row:"fk:h-20"},columns:J?g:N,data:J?K:u??[],entityName:b.name,hasMore:X,isLoadingMore:U,pageSize:xe,sorting:k,onLoadMore:Z,onSortingChange:d$1,toolbarComponent:a=>jsx(Xe,{entityName:b.name,isUploading:A,table:a,viewMode:S,onSearchLoadingChange:V,onSearchWhereChange:I,onUploadClick:E,onViewModeChange:w})}):jsx(Ut,{columns:N,data:J?[]:u??[],entityName:b.name,hasMore:X,isLoading:J,isLoadingMore:U,pageSize:xe,sorting:k,onLoadMore:Z,onSortingChange:d$1,toolbarComponent:a=>jsx(Xe,{entityName:b.name,isUploading:A,table:a,viewMode:S,onSearchLoadingChange:V,onSearchWhereChange:I,onUploadClick:E,onViewModeChange:w})})}),jsx(Outlet,{})]})}function Go(e){return e.map(n=>({...n,cell:()=>jsx(t$1,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function Rn(){return jsxs(v,{orientation:"horizontal",className:"fk:h-full",children:[jsx(w,{className:"fk:p-3",defaultSize:"82%",children:jsx("div",{className:"fk:flex fk:flex-col fk:h-full",children:jsx(jt,{})})}),jsx(x,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(w,{defaultSize:"18%",minSize:"10%",children:jsx("div",{className:"fk:sm:hidden fk:md:block",children:jsx(Pt,{})})})]})}export{Rn as Root};//# sourceMappingURL=root-CE6LNBBW.js.map
|
|
23
|
+
//# sourceMappingURL=root-CE6LNBBW.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-tag-dialogs.tsx","../src/apps/asset-manager/data-grid/asset-row-actions.tsx","../src/apps/asset-manager/data-grid/asset-grid.tsx","../src/apps/asset-manager/data-grid/data-table-toolbar.tsx","../src/apps/asset-manager/data-grid/use-asset-manager-upload.ts","../src/apps/asset-manager/data-grid/view-mode.ts","../src/apps/asset-manager/list.tsx","../src/apps/asset-manager/root.tsx"],"names":["tagQueryVariables","tagQueryOptions","Sidebar","scope","useAppContext","schema","useConfig","runMutation","setMutation","setOptions","useEntityMutation","newTagName","setNewTagName","useState","isDialogOpen","setIsDialogOpen","isDeleteOpen","setIsDeleteOpen","tagToDelete","setTagToDelete","isEditOpen","setIsEditOpen","tagToEdit","setTagToEdit","editTagName","setEditTagName","isSubmitting","setIsSubmitting","isDeleting","setIsDeleting","canMutate","useCanMutate","entityName","entityNamePlural","data","isLoading","useEntityQuery","tags","item","it","handleCreate","useCallback","name","_id","mutation","getEntityCreateMutation","entityQuery","getEntityQuery","refreshQuery","gql","resolve","handleDelete","getEntityDeleteMutation","reject","error","handleRename","dataToMutate","originalData","getEntityUpdateMutation","jsxs","jsx","TagIcon","TooltipProvider","Tooltip","TooltipTrigger","Dialog","DialogTrigger","Button","PlusIcon","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","DialogFooter","Loader2","TooltipContent","PermissionTooltip","ScrollArea","tag","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","TAG_UPDATE_RESPONSE_FIELDS","AssetTagDialogs","assetIds","mode","onModeChange","onCompleted","patchAssets","usePatchEntityList","selectedTagIds","setSelectedTagIds","tagsData","allTags","useMemo","resetSelection","handleOpenChange","open","applyMutationResult","patches","asset","tagNames","handleAddTags","id","handleRemoveTags","isRemove","actionLabel","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","prev","CommandSeparator","LoaderCircle","AssetRowActions","overlay","row","copiedField","setCopiedField","tagDialogMode","setTagDialogMode","dispatch","useDispatch","assetId","assetUrl","assetSchema","copyToClipboard","field","text","Fragment","event","EllipsisIcon","CheckIcon","CopyIcon","LinkIcon","MinusIcon","Trash2Icon","FileTypeIconCompat","FileTypeIcon","transparentImageBackground","formatAssetSize","bytes","AssetGrid","columns","hasMore","isLoadingMore","onLoadMore","onSortingChange","pageSize","sortingProp","toolbarComponent","scrollRef","useRef","schemaErrorMessage","useGraphQLError","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","useEffect","handleSortingChange","updater","table","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","rows","onLoadMoreRef","hasMoreRef","isLoadingMoreRef","checkLoadMore","container","scrollElement","shouldLoadMore","isAppActive","useIsAppActive","handleScroll","_","index","Skeleton","AssetGridCard","filename","getAssetFilename","mimeType","sizeLabel","metaLine","Checkbox","value","AssetGridMedia","isZoomOpen","setIsZoomOpen","isZoomImageLoaded","setIsZoomImageLoaded","url","isImageAsset","ext","getExtensionFromAsset","style","defaultStyles","thumbnailUrl","getAssetImageUrl","zoomUrl","handleThumbnailClick","handleZoomOpenChange","mimeTypes","ImagePlayIcon","ImageIcon","FilePlayIcon","LayersIcon","SplinePointerIcon","DataTableToolbar","isUploading","viewMode","onUploadClick","onViewModeChange","onSearchLoadingChange","onSearchWhereChange","isFiltered","projectId","useParams","search","setSearch","textWhereRef","filterWhereRef","getBaseSearchRequest","baseSearchRequest","searchQuery","setSearchQuery","results","useSearch","lastWhereRef","trimmedSearch","committedSearchQuery","isSearchPending","debouncedSetSearchQuery","debounce","query","selectedIds","t","tagOptions","emitCombinedWhere","clauses","combinedWhere","whereKey","clearSearch","handleBatchDelete","safeResults","nextWhere","r","tagClauses","orClauses","columnFiltersKey","mimeFilter","f","mimeValues","tagsFilter","tagValues","orTags","SearchIcon","ResetIcon","DataTableFacetedFilter","DataTableSortedBy","ListChecks","ToggleGroup","ToggleGroupItem","LayoutGrid","List","fn","ms","timeoutId","debounced","args","MAX_UPLOAD_BYTES","useAssetManagerUpload","uploadAssets","useUploadAssets","setIsUploading","runUpload","files","VIEW_MODE_STORAGE_KEY","getStoredViewMode","stored","setStoredViewMode","defaultSort","useLocation","entityId","currentProject","currentProjectId","setSorting","setViewMode","columnsDefinition","useGridColumnsDefinition","searchWhere","setSearchWhere","isSearchLoading","setIsSearchLoading","uploadFiles","uploadFromDialog","where","whereBase","graphqlSort","primarySort","desc","entry","variables","handleViewModeChange","fetchMore","count","isProjectDisabled","isProjectHibernated","isInitialLoading","rowsCount","handleLoadMore","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","AssetDropZone","DataTable","Outlet","column","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle"],"mappings":"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","file":"root-CE6LNBBW.js","sourcesContent":["// All mounted tag menus use the same operation and variables so Apollo can\n// share an in-flight request and reuse the cached result.\nexport const tagQueryVariables = { where: {}, limit: 500, offset: 0, sort: [{ name: 'ASC' }] };\nexport const tagQueryOptions = { selection: 'display' as const, includeCount: false };\n","import { JSX, useCallback, useState } from 'react';\nimport { Loader2, PlusIcon, TagIcon, Ellipsis } from 'lucide-react';\nimport {\n Button,\n Input,\n ScrollArea,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n DialogTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PermissionTooltip,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../ui';\nimport { gql } from '@apollo/client';\nimport { useAppContext } from '../../core/app-context';\nimport { useCanMutate } from '../../core/permissions';\nimport { useEntityMutation } from '../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport {\n getEntityDeleteMutation,\n getEntityCreateMutation,\n getEntityQuery,\n getEntityUpdateMutation,\n} from '../../graphql-client/queries';\nimport { useConfig } from '../../core/config/config-context';\nimport type { FormEntityItem } from '../../graphql-client/types';\n\nimport { tagQueryOptions, tagQueryVariables } from './tag-query';\n\ntype TagItem = { _id: string; name: string };\n\nexport function Sidebar(): JSX.Element {\n const { scope } = useAppContext();\n const { currentProjectSchema: schema } = useConfig();\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [newTagName, setNewTagName] = useState<string>('');\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState<boolean>(false);\n const [tagToDelete, setTagToDelete] = useState<TagItem | null>(null);\n const [isEditOpen, setIsEditOpen] = useState<boolean>(false);\n const [tagToEdit, setTagToEdit] = useState<TagItem | null>(null);\n const [editTagName, setEditTagName] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\n const canMutate = useCanMutate();\n\n const entityName = '_tag';\n const entityNamePlural = '_tags';\n const { data, isLoading } = useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const tags: TagItem[] = (Array.isArray(data) ? (data as unknown[]) : []).map((item) => {\n const it = item as { _id: string; name: string };\n return { _id: it._id, name: it.name };\n });\n\n const handleCreate = useCallback(async (): Promise<void> => {\n const name = newTagName.trim();\n\n if (!name) {\n return;\n }\n\n setIsSubmitting(true);\n const _id = typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}`;\n const entityData: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const mutation = getEntityCreateMutation(entityNamePlural, schema, entityData, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setNewTagName('');\n setIsDialogOpen(false);\n resolve();\n },\n });\n runMutation(true);\n });\n setIsSubmitting(false);\n }, [entityNamePlural, runMutation, schema, scope, setMutation, setOptions, newTagName]);\n\n const handleDelete = useCallback(\n async (_id: string): Promise<void> => {\n setIsDeleting(true);\n const mutation = getEntityDeleteMutation(entityName, schema, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: _id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n runMutation(true);\n });\n setIsDeleting(false);\n },\n [entityName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions]\n );\n\n const handleRename = useCallback(async (): Promise<void> => {\n const name = editTagName.trim();\n\n if (!name || !tagToEdit) {\n return;\n }\n\n setIsSubmitting(true);\n\n const dataToMutate: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const originalData: FormEntityItem = {};\n const mutation = getEntityUpdateMutation(\n entityNamePlural,\n tagToEdit._id,\n scope,\n schema,\n originalData,\n dataToMutate\n );\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: tagToEdit._id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setIsEditOpen(false);\n setTagToEdit(null);\n setEditTagName('');\n resolve();\n },\n });\n runMutation(true);\n });\n\n setIsSubmitting(false);\n }, [editTagName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions, tagToEdit]);\n\n return (\n <div className=\"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6\">\n <TagIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight\">Tags</span>\n {canMutate ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogTrigger asChild>\n <Button variant=\"secondary\" size=\"icon\" className=\"fk:ml-auto fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Create a new tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={newTagName}\n placeholder=\"New tag name\"\n onChange={(e) => setNewTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleCreate();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button disabled={isSubmitting} onClick={handleCreate} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Add\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add tag</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"fk:ml-auto\">\n <PermissionTooltip disabled>\n <Button disabled variant=\"secondary\" size=\"icon\" className=\"fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </PermissionTooltip>\n </div>\n )}\n </div>\n\n <ScrollArea className=\"fk:h-full\">\n <div className=\"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2\">\n {isLoading ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">Loading...</div>\n ) : tags.length === 0 ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">No tags yet</div>\n ) : (\n tags.map((tag) => (\n <div\n key={tag._id}\n className=\"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1 fk:corner-squircle\"\n >\n <span className=\"fk:text-sm\">{tag.name}</span>\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${tag.name}`}\n disabled={!canMutate}\n title={canMutate ? `Actions for ${tag.name}` : undefined}\n variant=\"ghost\"\n size=\"icon\"\n className=\"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground\"\n >\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem\n onClick={() => {\n setTagToEdit(tag);\n setEditTagName(tag.name);\n setIsEditOpen(true);\n }}\n >\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n onClick={() => {\n setTagToDelete(tag);\n setIsDeleteOpen(true);\n }}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n <Dialog open={isEditOpen} onOpenChange={setIsEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Rename an existing tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={editTagName}\n placeholder=\"Tag name\"\n onChange={(e) => setEditTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleRename();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n disabled={isSubmitting}\n variant=\"secondary\"\n onClick={() => {\n setIsEditOpen(false);\n setTagToEdit(null);\n }}\n >\n Cancel\n </Button>\n <Button disabled={isSubmitting} onClick={handleRename} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog open={isDeleteOpen} onOpenChange={setIsDeleteOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Confirm deletion of a tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:text-sm fk:text-muted-foreground\">\n Are you sure you want to delete the tag{' '}\n <span className=\"fk:font-semibold fk:text-foreground\">{tagToDelete?.name}</span>?\n </div>\n <DialogFooter>\n <Button\n disabled={isDeleting}\n variant=\"secondary\"\n onClick={() => {\n setIsDeleteOpen(false);\n setTagToDelete(null);\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isDeleting}\n variant=\"destructive\"\n onClick={() => {\n if (!tagToDelete) {\n return;\n }\n\n void (async () => {\n await handleDelete(tagToDelete._id);\n setIsDeleteOpen(false);\n setTagToDelete(null);\n })();\n }}\n >\n {isDeleting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useState, type JSX } from 'react';\nimport { LoaderCircle } from 'lucide-react';\nimport {\n Button,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../../ui';\nimport { gql } from '@apollo/client';\nimport { getEntityUpdateMutation } from '../../../graphql-client/queries';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useEntityMutation } from '../../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { usePatchEntityList } from '../../../graphql-client/use-patch-entity-list';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ntype TagItem = {\n _id: string;\n name: string;\n};\n\ntype WhereClause = { [key: string]: unknown };\n\ntype AssetTagMutationAsset = {\n _id?: string;\n _updatedAt?: string;\n tags?: TagItem[] | null;\n};\n\ntype AssetTagMutationData = {\n update_assets?: {\n _assets?: AssetTagMutationAsset[] | null;\n } | null;\n};\n\nexport type AssetTagDialogMode = 'add' | 'remove' | null;\n\nconst TAG_UPDATE_RESPONSE_FIELDS = `_updatedAt\n tags(limit: 3, offset: 0) {\n _id\n name\n }\n`;\n\ninterface AssetTagDialogsProps {\n assetIds: string[];\n mode: AssetTagDialogMode;\n onModeChange: (mode: AssetTagDialogMode) => void;\n onCompleted?: () => void;\n}\n\nexport function AssetTagDialogs({\n assetIds,\n mode,\n onModeChange,\n onCompleted,\n}: AssetTagDialogsProps): JSX.Element {\n const { scope } = useAppContext();\n const patchAssets = usePatchEntityList('_assets');\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const { currentProjectSchema: schema } = useConfig();\n const [selectedTagIds, setSelectedTagIds] = useState<string[]>([]);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((tag) => ({\n _id: (tag as TagItem)._id,\n name: (tag as TagItem).name,\n }));\n }, [tagsData]);\n\n const resetSelection = useCallback((): void => {\n setSelectedTagIds([]);\n }, []);\n\n const handleOpenChange = useCallback(\n (open: boolean): void => {\n if (!open && !isSubmitting) {\n onModeChange(null);\n resetSelection();\n }\n },\n [isSubmitting, onModeChange, resetSelection]\n );\n\n const applyMutationResult = useCallback(\n (data: unknown): void => {\n const assets = (data as AssetTagMutationData | null | undefined)?.update_assets?._assets ?? [];\n const patches = assets\n .filter((asset): asset is AssetTagMutationAsset & { _id: string } => typeof asset?._id === 'string')\n .map((asset) => {\n const tagNames = (Array.isArray(asset.tags) ? asset.tags : [])\n .map((tag) => tag.name)\n .filter(Boolean)\n .slice(0, 3)\n .join(', ');\n\n return {\n _id: asset._id,\n attributes: {\n tags: tagNames,\n ...(typeof asset._updatedAt === 'string' ? { _updatedAt: asset._updatedAt } : {}),\n },\n };\n });\n\n if (patches.length > 0) {\n patchAssets(patches);\n }\n },\n [patchAssets]\n );\n\n const handleAddTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n connect: selectedTagIds.map((id) => ({ _id: id })),\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const handleRemoveTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n disconnect: selectedTagIds,\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const isRemove = mode === 'remove';\n let actionLabel = isRemove ? 'Remove tag(s)' : 'Add tag(s)';\n\n if (assetIds.length > 1) {\n actionLabel = isRemove ? 'Remove tag(s) from selected assets' : 'Add tag(s) to selected assets';\n }\n\n return (\n <CommandDialog open={mode !== null} onOpenChange={handleOpenChange}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-75\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedTagIds.includes(tag._id);\n\n return (\n <CommandItem\n disabled={isSubmitting}\n key={tag._id}\n onSelect={() => {\n if (isSubmitting) {\n return;\n }\n\n setSelectedTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button\n className=\"fk:w-full\"\n disabled={selectedTagIds.length === 0 || isSubmitting}\n onClick={isRemove ? handleRemoveTags : handleAddTags}\n >\n {isSubmitting ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {actionLabel}\n </Button>\n </div>\n </CommandDialog>\n );\n}\n","import { useState, type JSX } from 'react';\nimport {\n Check as CheckIcon,\n Copy as CopyIcon,\n Ellipsis as EllipsisIcon,\n Link as LinkIcon,\n MinusIcon,\n TagIcon,\n Trash2 as Trash2Icon,\n} from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { assetSchema } from '../../../entities/assets-schema';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../../ui';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\n\ntype AssetRow = {\n _id?: string;\n url?: string | null;\n};\n\ninterface AssetRowActionsProps<TData> {\n overlay?: boolean;\n row: Row<TData>;\n}\n\nexport function AssetRowActions<TData>({ overlay = false, row }: AssetRowActionsProps<TData>): JSX.Element {\n const [copiedField, setCopiedField] = useState<'id' | 'url' | null>(null);\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const dispatch = useDispatch();\n const canMutate = useCanMutate();\n const asset = row.original as AssetRow;\n const assetId = asset._id ?? '';\n const assetUrl = asset.url ?? '';\n\n function handleDelete(): void {\n dispatch({ type: 'DeleteEntity', payload: { entityId: assetId, entityName: assetSchema.name } });\n }\n\n function copyToClipboard(field: 'id' | 'url', text: string): void {\n void navigator.clipboard.writeText(text);\n setCopiedField(field);\n window.setTimeout(() => setCopiedField(null), 1500);\n }\n\n // Pure white glyph; parent wrapper applies mix-blend-difference so it inverts over the asset.\n // A light hover fill also inverts, so the hit area reads as a contrast disc on any asset.\n const triggerClassName = overlay\n ? 'fk:flex fk:h-7 fk:w-7 fk:p-0 fk:text-white fk:group-hover:bg-background/10 fk:group-hover:text-white! fk:data-[state=open]:bg-background/15'\n : 'fk:flex fk:h-8 fk:w-8 fk:p-0 fk:data-[state=open]:bg-muted';\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className={triggerClassName} onClick={(event) => event.stopPropagation()} variant=\"ghost\">\n <EllipsisIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-45\">\n <DropdownMenuItem\n disabled={!assetId}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('id', assetId);\n }}\n >\n {copiedField === 'id' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <CopyIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy ID\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetUrl}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('url', assetUrl);\n }}\n >\n {copiedField === 'url' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <LinkIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy URL\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('add');\n }}\n >\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Add tag\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('remove');\n }}\n >\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n handleDelete();\n }}\n >\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n {tagDialogMode !== null ? (\n <AssetTagDialogs assetIds={assetId ? [assetId] : []} mode={tagDialogMode} onModeChange={setTagDialogMode} />\n ) : null}\n </>\n );\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type JSX,\n type MouseEvent,\n type ReactElement,\n type UIEvent,\n} from 'react';\nimport {\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n Table as ReactTable,\n Row,\n RowSelectionState,\n SortingState,\n Updater,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useGraphQLError } from '../../../graphql-client/graphql-context';\nimport type { AttributeValue } from '../../../graphql-client/types';\nimport {\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Skeleton,\n} from '../../../ui';\nimport { LoaderCircle } from 'lucide-react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetFilename, getAssetImageUrl, getExtensionFromAsset, isImageAsset } from './asset-url';\nimport { AssetRowActions } from './asset-row-actions';\nimport { useIsAppActive } from '../../../core/apps/app-active';\nimport { shouldLoadMore } from '../../../data-grid/should-load-more';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\ntype AssetRecord = {\n _id?: string;\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n size?: number | null;\n url?: string | null;\n};\n\ninterface AssetGridProps<TData extends AttributeValue, TValue> {\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n isLoading?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n onSortingChange?: (updater: Updater<SortingState>) => void;\n pageSize?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: ReactTable<AttributeValue>) => ReactElement;\n}\n\nfunction formatAssetSize(bytes: number | null | undefined): string {\n if (bytes == null || Number.isNaN(bytes)) {\n return '';\n }\n\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function AssetGrid<TData extends AttributeValue, TValue>({\n columns,\n data,\n entityName,\n hasMore = false,\n isLoading = false,\n isLoadingMore = false,\n onLoadMore,\n onSortingChange,\n pageSize,\n sorting: sortingProp,\n toolbarComponent,\n}: AssetGridProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0 });\n }, [entityName]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` from the toolbar; keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n });\n\n const { rows } = table.getRowModel();\n\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n // A grid in an app behind the active one has no height (`display: none`):\n // without this guard it looks scrolled to the bottom and would page\n // through the whole entity while nobody is looking.\n if (!shouldLoadMore(scrollElement)) {\n return;\n }\n\n // Optimistic guard until the parent's isLoadingMore prop catches up.\n isLoadingMoreRef.current = true;\n onLoadMoreRef.current();\n }, []);\n\n // Re-check when rows/hasMore/loading settle, and when the app comes back\n // to the front (a hidden grid skips loading until then).\n const isAppActive = useIsAppActive();\n\n useEffect(() => {\n if (isAppActive) {\n checkLoadMore();\n }\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore, isAppActive]);\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4\">\n {toolbarComponent ? toolbarComponent(table) : null}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1\">\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-0 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-40\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n <div\n className=\"fk:h-full fk:overflow-auto fk:pt-px fk:pb-20 fk:-ml-0.5 fk:pr-3\"\n onScroll={handleScroll}\n ref={scrollRef}\n >\n {isLoading ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3\">\n {Array.from({ length: pageSize ?? 50 }, (_, index) => (\n <div className=\"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle\" key={`skeleton-${index}`}>\n <Skeleton className=\"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle\" />\n <Skeleton className=\"fk:mt-2 fk:h-3 fk:w-[75%]\" />\n <Skeleton className=\"fk:mt-1.5 fk:h-3 fk:w-[50%]\" />\n </div>\n ))}\n </div>\n ) : null}\n {!isLoading && rows.length === 0 ? (\n <div className=\"fk:flex fk:h-24 fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground\">\n No results.\n </div>\n ) : null}\n {!isLoading && rows.length > 0 ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3\">\n {rows.map((row) => (\n <AssetGridCard key={row.id} row={row} />\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction AssetGridCard({ row }: { row: Row<AttributeValue> }): JSX.Element {\n const asset = row.original as AssetRecord;\n const filename = getAssetFilename(asset) || 'Untitled';\n const mimeType = asset.mimeType ?? '';\n const sizeLabel = formatAssetSize(asset.size);\n const isSelected = row.getIsSelected();\n const metaLine = [mimeType, sizeLabel].filter(Boolean).join(' · ');\n\n return (\n <div\n className={`fk:relative fk:rounded-md fk:border fk:p-2 fk:transition-colors ${\n isSelected\n ? 'fk:border-primary fk:ring-1 fk:ring-primary/40 fk:bg-muted/40'\n : 'fk:border-border fk:bg-background fk:hover:border-muted-foreground/30'\n } fk:corner-squircle`}\n data-state={isSelected ? 'selected' : undefined}\n >\n <div className=\"fk:absolute fk:left-3 fk:top-3 fk:z-10 fk:mix-blend-difference\">\n <Checkbox\n className=\"fk:border-white!\"\n aria-label={`Select ${filename}`}\n checked={isSelected}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n <div className=\"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference\">\n <AssetRowActions overlay row={row} />\n </div>\n <AssetGridMedia asset={asset} filename={filename} />\n <div className=\"fk:mt-2 fk:truncate fk:text-xs fk:font-medium\" title={filename}>\n {filename}\n </div>\n {metaLine ? (\n <div className=\"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground\" title={metaLine}>\n {metaLine}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction AssetGridMedia({ asset, filename }: { asset: AssetRecord; filename: string }): JSX.Element {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const [isZoomImageLoaded, setIsZoomImageLoaded] = useState(false);\n const url = asset.url ?? '';\n\n if (!url && !asset.path) {\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:corner-squircle\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">No preview</span>\n </div>\n );\n }\n\n const isImage = isImageAsset(asset);\n\n if (!isImage || !url) {\n const ext = getExtensionFromAsset(asset);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:[&>svg]:h-12 fk:[&>svg]:w-auto fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 320, height: 320 });\n const zoomUrl = url;\n\n function handleThumbnailClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n setIsZoomImageLoaded(false);\n setIsZoomOpen(true);\n }\n\n function handleZoomOpenChange(open: boolean): void {\n setIsZoomOpen(open);\n\n if (!open) {\n setIsZoomImageLoaded(false);\n }\n }\n\n return (\n <>\n <button\n className={`fk:aspect-square fk:w-full fk:cursor-zoom-in fk:overflow-hidden fk:rounded-sm fk:border-0 fk:p-0 ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n type=\"button\"\n >\n <img alt={filename} className=\"fk:h-full fk:w-full fk:object-contain\" src={thumbnailUrl} />\n </button>\n <Dialog open={isZoomOpen} onOpenChange={handleZoomOpenChange}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <div className=\"fk:relative fk:flex fk:h-[min(85vh,56rem)] fk:w-full fk:items-center fk:justify-center fk:overflow-hidden fk:rounded-md fk:corner-squircle\">\n {!isZoomImageLoaded ? (\n <LoaderCircle\n aria-label=\"Loading image\"\n className=\"fk:absolute fk:h-8 fk:w-8 fk:animate-spin fk:text-muted-foreground\"\n />\n ) : null}\n <img\n alt={filename}\n className={`fk:max-h-full fk:max-w-full fk:object-contain fk:transition-opacity ${\n isZoomImageLoaded ? 'fk:opacity-100' : 'fk:opacity-0'\n }`}\n onError={() => setIsZoomImageLoaded(true)}\n onLoad={() => setIsZoomImageLoaded(true)}\n src={zoomUrl}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","'use client';\n\nimport { JSX, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FilePlayIcon,\n ImageIcon,\n ImagePlayIcon,\n LayersIcon,\n LayoutGrid,\n List,\n ListChecks,\n MinusIcon,\n SplinePointerIcon,\n TagIcon,\n Trash2Icon,\n LoaderCircle,\n Search as SearchIcon,\n X as ResetIcon,\n} from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport type { Table as ReactTable } from '@tanstack/react-table';\nimport type { SearchRequestProps } from '../../../core/types';\nimport { DataTableFacetedFilter } from '../../../data-grid/data-table-faceted-filter';\nimport { DataTableSortedBy } from '../../../data-grid/data-table-sorted-by';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useSearch } from '../../../core/use-search';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n PermissionTooltip,\n ToggleGroup,\n ToggleGroupItem,\n} from '../../../ui';\nimport type { AssetViewMode } from './view-mode';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isUploading?: boolean;\n table: ReactTable<TData>;\n viewMode: AssetViewMode;\n onUploadClick?: () => void;\n onViewModeChange: (mode: AssetViewMode) => void;\n onSearchLoadingChange?: (isLoading: boolean) => void;\n onSearchWhereChange?: (where: WhereClause) => void;\n}\n\ntype WhereClause = { [key: string]: unknown };\n\nconst mimeTypes = [\n {\n value: 'image/gif',\n label: 'GIF',\n icon: ImagePlayIcon,\n },\n {\n value: 'image/jpeg',\n label: 'JPEG',\n icon: ImageIcon,\n },\n {\n value: 'video/mp4',\n label: 'MP4',\n icon: FilePlayIcon,\n },\n {\n value: 'image/png',\n label: 'PNG',\n icon: LayersIcon,\n },\n {\n value: 'image/svg+xml',\n label: 'SVG',\n icon: SplinePointerIcon,\n },\n {\n value: 'image/webp',\n label: 'WebP',\n icon: ImageIcon,\n },\n];\n\nexport function DataTableToolbar<TData>({\n entityName,\n isUploading = false,\n table,\n viewMode,\n onUploadClick,\n onViewModeChange,\n onSearchLoadingChange,\n onSearchWhereChange,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0;\n const { projectId } = useParams();\n const dispatch = useDispatch();\n const { scope } = useAppContext();\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const { currentProjectSchema: schema } = useConfig();\n const canMutate = useCanMutate();\n const [search, setSearch] = useState('');\n const textWhereRef = useRef<WhereClause>({});\n const filterWhereRef = useRef<WhereClause>({});\n\n function getBaseSearchRequest(): SearchRequestProps {\n return {\n searchRequests: {\n searches: [{ collection: '_assets' }, { collection: '_tags' }],\n },\n commonParams: { q: '' },\n };\n }\n\n const baseSearchRequest = useMemo(() => getBaseSearchRequest(), []);\n const [searchQuery, setSearchQuery] = useState<SearchRequestProps>(baseSearchRequest);\n const { results, isLoading } = useSearch(projectId ?? '', searchQuery);\n const lastWhereRef = useRef<string>('');\n const trimmedSearch = search.trim();\n const committedSearchQuery = searchQuery.commonParams.q ?? '';\n const isSearchPending = trimmedSearch.length > 0 && (isLoading || committedSearchQuery !== trimmedSearch);\n\n const debouncedSetSearchQuery = useMemo(\n () =>\n debounce((query: string) => {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: query } });\n }, 300),\n [baseSearchRequest]\n );\n\n useEffect(() => {\n return () => {\n debouncedSetSearchQuery.cancel();\n };\n }, [debouncedSetSearchQuery]);\n\n // Collect selected entity ids from the table\n const selectedIds: string[] = table\n .getSelectedRowModel()\n .rows.map((row) => (row.original as unknown as { _id: string })._id);\n\n // Load tags for the selector (full tags collection, not derived from loaded assets)\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((t) => ({ _id: (t as { _id: string })._id, name: (t as { name: string }).name }));\n }, [tagsData]);\n\n const tagOptions = useMemo(() => {\n return allTags.map((t) => ({ value: t._id, label: t.name }));\n }, [allTags]);\n\n const emitCombinedWhere = useCallback((): void => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const clauses: WhereClause[] = [];\n\n if (Object.keys(textWhereRef.current).length > 0) {\n clauses.push(textWhereRef.current);\n }\n\n if (Object.keys(filterWhereRef.current).length > 0) {\n clauses.push(filterWhereRef.current);\n }\n\n const combinedWhere = clauses.length === 0 ? {} : clauses.length === 1 ? clauses[0] : { AND: clauses };\n const whereKey = JSON.stringify(combinedWhere);\n\n if (lastWhereRef.current !== whereKey) {\n lastWhereRef.current = whereKey;\n onSearchWhereChange(combinedWhere);\n }\n }, [onSearchWhereChange]);\n\n function clearSearch(): void {\n debouncedSetSearchQuery.cancel();\n setSearch('');\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n textWhereRef.current = {};\n emitCombinedWhere();\n }\n\n async function handleBatchDelete(): Promise<void> {\n dispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} asset${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected assets? They will be deleted permanently.`\n : `Are you sure you want to delete the selected asset? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionCancel: () => {},\n dialogActionSubmit: () => {\n // One DeleteEntity action → one GraphQL mutation with `_id: { in: [...] }`.\n dispatch({\n type: 'DeleteEntity',\n _id: `delete-batch-${Date.now()}`,\n payload: { entityId: selectedIds, entityName, silent: true },\n });\n\n table.resetRowSelection();\n },\n },\n },\n });\n }\n\n useEffect(() => {\n onSearchLoadingChange?.(isSearchPending);\n }, [isSearchPending, onSearchLoadingChange]);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n if (trimmedSearch.length === 0) {\n textWhereRef.current = {};\n emitCombinedWhere();\n\n return;\n }\n\n // Wait for debounce + search results before applying text filters (avoids empty-table flash).\n if (isSearchPending) {\n return;\n }\n\n const safeResults = results ?? [];\n let nextWhere: WhereClause = {};\n\n if (safeResults.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else {\n // Prefer `_id: { in: [...] }` over one OR-eq per hit. Large OR trees break\n // offset pagination and were re-triggering endless fetchMore requests.\n const assetIds = safeResults.filter((r) => r._entityNamePlural === '_assets').map((r) => r._id);\n const tagClauses = safeResults\n .filter((r) => r._entityNamePlural === '_tags')\n .map((r) => ({ tags: { some: { _id: { eq: r._id } } } }));\n\n const orClauses: WhereClause[] = [];\n\n if (assetIds.length > 0) {\n orClauses.push({ _id: { in: assetIds } });\n }\n\n orClauses.push(...tagClauses);\n\n if (orClauses.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else if (orClauses.length === 1) {\n nextWhere = orClauses[0] as WhereClause;\n } else {\n nextWhere = { OR: orClauses };\n }\n }\n\n textWhereRef.current = nextWhere;\n emitCombinedWhere();\n }, [emitCombinedWhere, isSearchPending, onSearchWhereChange, results, trimmedSearch]);\n\n // Watch column filter changes (e.g., mime type) and push server-side where\n const columnFiltersKey = JSON.stringify(table.getState().columnFilters);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const mimeFilter = table.getState().columnFilters.find((f) => f.id === 'mimeType');\n const mimeValues = (Array.isArray(mimeFilter?.value) ? (mimeFilter?.value as unknown[]) : []) as string[];\n\n const tagsFilter = table.getState().columnFilters.find((f) => f.id === 'tags');\n const tagValues = (Array.isArray(tagsFilter?.value) ? (tagsFilter?.value as unknown[]) : []) as string[];\n\n const clauses: WhereClause[] = [];\n\n if (mimeValues.length > 0) {\n clauses.push({ mimeType: { in: mimeValues } } as WhereClause);\n }\n\n if (tagValues.length > 0) {\n const orTags = tagValues.map((id) => ({ tags: { some: { _id: { eq: id } } } }));\n clauses.push(orTags.length === 1 ? orTags[0] : { OR: orTags });\n }\n\n if (clauses.length === 0) {\n filterWhereRef.current = {};\n } else if (clauses.length === 1) {\n filterWhereRef.current = clauses[0] as WhereClause;\n } else {\n filterWhereRef.current = { AND: clauses } as WhereClause;\n }\n\n emitCombinedWhere();\n }, [columnFiltersKey, emitCombinedWhere, onSearchWhereChange, table]);\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between fk:pr-3\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n <div className=\"fk:relative\">\n {isLoading ? (\n <LoaderCircle className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <Input\n placeholder=\"Search assets...\"\n name=\"search-assets\"\n value={search}\n onChange={(e) => {\n const { value } = e.target;\n setSearch(value);\n\n if (value.trim().length === 0) {\n clearSearch();\n\n return;\n }\n\n debouncedSetSearchQuery(value.trim());\n }}\n className=\"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7\"\n />\n {search ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle\"\n onClick={clearSearch}\n type=\"button\"\n >\n <ResetIcon className=\"fk:h-4 fk:w-4\" />\n </Button>\n ) : null}\n </div>\n {table.getColumn('mimeType') && (\n <DataTableFacetedFilter column={table.getColumn('mimeType')} options={mimeTypes} title=\"File type\" />\n )}\n {table.getColumn('tags') && (\n <DataTableFacetedFilter column={table.getColumn('tags')} options={tagOptions} title=\"Tags\" />\n )}\n {isFiltered && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n table.resetColumnFilters();\n filterWhereRef.current = {};\n emitCombinedWhere();\n }}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3\"\n >\n Reset\n <ResetIcon className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n )}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8 fk:mr-2 fk:lg:flex\" disabled={!canMutate} size=\"sm\" variant=\"secondary\">\n Actions <ListChecks className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[240px]\">\n <DropdownMenuItem onClick={() => setTagDialogMode('add')}>\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Add tag\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTagDialogMode('remove')}>\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleBatchDelete} className=\"fk:text-destructive\">\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Delete asset{selectedIds.length > 1 ? 's' : ''} (\n {selectedIds.length})\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-2\">\n <ToggleGroup\n size=\"sm\"\n type=\"single\"\n value={viewMode}\n onValueChange={(value) => {\n if (value === 'list' || value === 'grid') {\n onViewModeChange(value);\n }\n }}\n >\n <ToggleGroupItem aria-label=\"Grid view\" value=\"grid\">\n <LayoutGrid className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem aria-label=\"List view\" value=\"list\">\n <List className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n <PermissionTooltip disabled={!canMutate}>\n <Button\n aria-busy={isUploading}\n className=\"fk:h-8 fk:lg:flex\"\n disabled={!canMutate || isUploading}\n onClick={onUploadClick}\n size=\"sm\"\n variant=\"default\"\n >\n {isUploading ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n Upload assets\n </Button>\n </PermissionTooltip>\n </div>\n\n {tagDialogMode !== null ? (\n <AssetTagDialogs\n assetIds={selectedIds}\n mode={tagDialogMode}\n onCompleted={() => table.resetRowSelection()}\n onModeChange={setTagDialogMode}\n />\n ) : null}\n </div>\n );\n}\n\ntype DebouncedFn<TArgs extends unknown[]> = ((...args: TArgs) => void) & {\n cancel: () => void;\n};\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300): DebouncedFn<TArgs> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = function (this: unknown, ...args: TArgs) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n fn.apply(this, args);\n }, ms);\n } as DebouncedFn<TArgs>;\n\n debounced.cancel = () => {\n if (timeoutId === undefined) {\n return;\n }\n\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n return debounced;\n}\n","import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useUploadAssets } from '../../../core/upload';\n\nconst MAX_UPLOAD_BYTES = 4 * 1024 * 1024;\n\nexport function useAssetManagerUpload(): {\n canMutate: boolean;\n isUploading: boolean;\n uploadFiles: (files: File[]) => Promise<void>;\n uploadFromDialog: () => Promise<void>;\n} {\n const { projectId } = useParams();\n const uploadAssets = useUploadAssets();\n const canMutate = useCanMutate();\n const [isUploading, setIsUploading] = useState(false);\n\n async function runUpload(files?: File[]): Promise<void> {\n if (!canMutate || isUploading) {\n return;\n }\n\n if (files && files.length === 0) {\n return;\n }\n\n try {\n await uploadAssets({\n files,\n maxBytes: MAX_UPLOAD_BYTES,\n multiple: true,\n onUploadStart: () => {\n setIsUploading(true);\n },\n projectId,\n });\n } finally {\n setIsUploading(false);\n }\n }\n\n return {\n canMutate,\n isUploading,\n uploadFiles: (files) => runUpload(files),\n uploadFromDialog: () => runUpload(),\n };\n}\n","export type AssetViewMode = 'list' | 'grid';\n\nconst VIEW_MODE_STORAGE_KEY = 'flexkit-asset-manager:viewMode';\n\nexport function getStoredViewMode(): AssetViewMode {\n if (typeof localStorage === 'undefined') {\n return 'grid';\n }\n\n try {\n const stored = localStorage.getItem(VIEW_MODE_STORAGE_KEY);\n\n if (stored === 'list' || stored === 'grid') {\n return stored;\n }\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n\n return 'grid';\n}\n\nexport function setStoredViewMode(mode: AssetViewMode): void {\n if (typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n localStorage.setItem(VIEW_MODE_STORAGE_KEY, mode);\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n}\n","import { useCallback, useMemo, useState, type JSX } from 'react';\nimport { useLocation, Outlet } from 'react-router-dom';\nimport type { ColumnDef, SortingState, Updater } from '@tanstack/react-table';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { DataTable } from '../../data-grid/data-table';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton } from '../../ui';\nimport { AssetDropZone } from './data-grid/asset-drop-zone';\nimport { AssetGrid } from './data-grid/asset-grid';\nimport { DataTableToolbar } from './data-grid/data-table-toolbar';\nimport { AssetRowActions } from './data-grid/asset-row-actions';\nimport { useAssetManagerUpload } from './data-grid/use-asset-manager-upload';\nimport { getStoredViewMode, setStoredViewMode, type AssetViewMode } from './data-grid/view-mode';\n\ntype WhereClause = { [key: string]: unknown };\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\n\nexport function List(): JSX.Element {\n const entityName = '_assets';\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { currentProject, currentProjectId } = 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, isProjectHibernated } = 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 isHibernated={isProjectHibernated} projectId={currentProjectId} />\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"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {b}from'./chunk-EUWIIL3X.js';import {f}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=root-
|
|
1
|
+
import'./index.css';import {b}from'./chunk-EUWIIL3X.js';import {f}from'./chunk-Y7VBTUNI.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import {I,K,O}from'./chunk-RULCANNM.js';import'./chunk-A4DPLZZF.js';import'./chunk-G5N6HEPW.js';import'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import'./chunk-N33S7BSG.js';import'./chunk-X3SHNHHM.js';import {Outlet}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';function p(){let{currentProjectId:l}=f(),m=I();return l?jsxs(K,{className:"fk:h-full",defaultOpen:m,children:[jsx(b,{}),jsx(O,{className:"fk:min-w-0",children:jsx("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:overflow-hidden fk:pl-4 fk:pt-3",children:jsx("div",{className:"fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col",children:jsx(Outlet,{})})})})]}):jsx("main",{className:"fk:flex fk:h-full fk:flex-1 fk:items-center fk:justify-center fk:p-8 fk:text-sm fk:text-muted-foreground",children:"Select a project to manage its knowledge."})}export{p as Root};//# sourceMappingURL=root-LSBCX6AE.js.map
|
|
2
|
+
//# sourceMappingURL=root-LSBCX6AE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/knowledge/root.tsx"],"names":["Root","currentProjectId","useConfig","defaultOpen","readSidebarCookieState","jsxs","SidebarProvider","jsx","KnowledgeSidebar","SidebarInset","Outlet"],"mappings":"+cAWO,SAASA,CAAAA,EAAoB,CAClC,GAAM,CAAE,gBAAA,CAAAC,CAAiB,CAAA,CAAIC,CAAAA,EAAU,CACjCC,CAAAA,CAAcC,CAAAA,EAAuB,CAE3C,OAAKH,CAAAA,CASHI,IAAAA,CAACC,CAAAA,CAAA,CAAgB,SAAA,CAAU,WAAA,CAAY,WAAA,CAAaH,EAClD,QAAA,CAAA,CAAAI,GAAAA,CAACC,CAAAA,CAAA,EAAiB,CAAA,CAClBD,GAAAA,CAACE,CAAAA,CAAA,CAAa,SAAA,CAAU,YAAA,CACtB,QAAA,CAAAF,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wFAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDAAA,CACb,QAAA,CAAAA,GAAAA,CAACG,MAAAA,CAAA,EAAO,CAAA,CACV,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAhBEH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0GAAA,CAA2G,qDAE3H,CAgBN","file":"root-
|
|
1
|
+
{"version":3,"sources":["../src/apps/knowledge/root.tsx"],"names":["Root","currentProjectId","useConfig","defaultOpen","readSidebarCookieState","jsxs","SidebarProvider","jsx","KnowledgeSidebar","SidebarInset","Outlet"],"mappings":"+cAWO,SAASA,CAAAA,EAAoB,CAClC,GAAM,CAAE,gBAAA,CAAAC,CAAiB,CAAA,CAAIC,CAAAA,EAAU,CACjCC,CAAAA,CAAcC,CAAAA,EAAuB,CAE3C,OAAKH,CAAAA,CASHI,IAAAA,CAACC,CAAAA,CAAA,CAAgB,SAAA,CAAU,WAAA,CAAY,WAAA,CAAaH,EAClD,QAAA,CAAA,CAAAI,GAAAA,CAACC,CAAAA,CAAA,EAAiB,CAAA,CAClBD,GAAAA,CAACE,CAAAA,CAAA,CAAa,SAAA,CAAU,YAAA,CACtB,QAAA,CAAAF,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wFAAA,CACb,QAAA,CAAAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDAAA,CACb,QAAA,CAAAA,GAAAA,CAACG,MAAAA,CAAA,EAAO,CAAA,CACV,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAhBEH,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0GAAA,CAA2G,qDAE3H,CAgBN","file":"root-LSBCX6AE.js","sourcesContent":["import type { JSX } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { useConfig } from '../../core/config/config-context';\nimport { readSidebarCookieState, SidebarInset, SidebarProvider } from '../../ui';\nimport { KnowledgeSidebar } from './sidebar';\n\n/**\n * The Knowledge library: documents the team adds so people can read them and\n * the agent can search and cite them. The sidebar filters the list; the list\n * and the document pages render in the inset.\n */\nexport function Root(): JSX.Element {\n const { currentProjectId } = useConfig();\n const defaultOpen = readSidebarCookieState();\n\n if (!currentProjectId) {\n return (\n <main className=\"fk:flex fk:h-full fk:flex-1 fk:items-center fk:justify-center fk:p-8 fk:text-sm fk:text-muted-foreground\">\n Select a project to manage its knowledge.\n </main>\n );\n }\n\n return (\n <SidebarProvider className=\"fk:h-full\" defaultOpen={defaultOpen}>\n <KnowledgeSidebar />\n <SidebarInset className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:overflow-hidden fk:pl-4 fk:pt-3\">\n <div className=\"fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col\">\n <Outlet />\n </div>\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n"]}
|