@flexkit/studio 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/activity-nav-button-AESIPODJ.js +2 -0
- package/dist/{activity-nav-button-Z6M3FURW.js.map → activity-nav-button-AESIPODJ.js.map} +1 -1
- package/dist/{chat-page-J7I5V6G4.js → chat-page-S2YGOKO5.js} +3 -3
- package/dist/{chat-page-J7I5V6G4.js.map → chat-page-S2YGOKO5.js.map} +1 -1
- package/dist/{chunk-BP27UNNR.js → chunk-2AHDTE5T.js} +2 -2
- package/dist/{chunk-BP27UNNR.js.map → chunk-2AHDTE5T.js.map} +1 -1
- package/dist/chunk-3TGCCDOR.js +2 -0
- package/dist/chunk-3TGCCDOR.js.map +1 -0
- package/dist/{chunk-QJDD73JR.js → chunk-6RDPFMLK.js} +2 -2
- package/dist/{chunk-QJDD73JR.js.map → chunk-6RDPFMLK.js.map} +1 -1
- package/dist/{chunk-MM356YIK.js → chunk-CKNFYN3O.js} +3 -3
- package/dist/chunk-CKNFYN3O.js.map +1 -0
- package/dist/chunk-J2G4C6I5.js +2 -0
- package/dist/chunk-J2G4C6I5.js.map +1 -0
- package/dist/{chunk-G74PT7Z7.js → chunk-KWS3NAYS.js} +3 -3
- package/dist/{chunk-G74PT7Z7.js.map → chunk-KWS3NAYS.js.map} +1 -1
- package/dist/{chunk-76CL7HSO.js → chunk-LN55VJ35.js} +3 -3
- package/dist/{chunk-76CL7HSO.js.map → chunk-LN55VJ35.js.map} +1 -1
- package/dist/{chunk-IAA4CEBW.js → chunk-NOFQHWES.js} +2 -2
- package/dist/{chunk-IAA4CEBW.js.map → chunk-NOFQHWES.js.map} +1 -1
- package/dist/{chunk-MPLNRUP3.js → chunk-NYKATVPZ.js} +3 -3
- package/dist/{chunk-MPLNRUP3.js.map → chunk-NYKATVPZ.js.map} +1 -1
- package/dist/{chunk-QDXGSL5B.js → chunk-PWQPA2QL.js} +2 -2
- package/dist/{chunk-QDXGSL5B.js.map → chunk-PWQPA2QL.js.map} +1 -1
- package/dist/chunk-SVZY7ZZD.js +8 -0
- package/dist/chunk-SVZY7ZZD.js.map +1 -0
- package/dist/index.css +19 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +1 -1
- package/dist/{list-IBUZ2LXU.js → list-PNKQAYUK.js} +2 -2
- package/dist/{list-IBUZ2LXU.js.map → list-PNKQAYUK.js.map} +1 -1
- package/dist/pages-KHFSZ3PH.js +3 -0
- package/dist/pages-KHFSZ3PH.js.map +1 -0
- package/dist/{plugin-pages-HQPZQSZT.js → plugin-pages-SE52XFFW.js} +2 -2
- package/dist/{plugin-pages-HQPZQSZT.js.map → plugin-pages-SE52XFFW.js.map} +1 -1
- package/dist/{root-XGNAKO5P.js → root-44ZJLA4E.js} +2 -2
- package/dist/{root-XGNAKO5P.js.map → root-44ZJLA4E.js.map} +1 -1
- package/dist/{root-ZY2HGDBT.js → root-BH3PQS2H.js} +3 -3
- package/dist/{root-ZY2HGDBT.js.map → root-BH3PQS2H.js.map} +1 -1
- package/dist/{root-4UVGZZRU.js → root-LFQA2VSE.js} +2 -2
- package/dist/{root-4UVGZZRU.js.map → root-LFQA2VSE.js.map} +1 -1
- package/dist/{root-HUJPHUHL.js → root-X5NDURAN.js} +3 -3
- package/dist/{root-HUJPHUHL.js.map → root-X5NDURAN.js.map} +1 -1
- package/dist/{search-N7G6BVN6.js → search-Q65IC67C.js} +2 -2
- package/dist/{search-N7G6BVN6.js.map → search-Q65IC67C.js.map} +1 -1
- package/dist/{skills-pages-VP32HFUN.js → skills-pages-TWOIIU5J.js} +2 -2
- package/dist/{skills-pages-VP32HFUN.js.map → skills-pages-TWOIIU5J.js.map} +1 -1
- package/package.json +3 -3
- package/dist/activity-nav-button-Z6M3FURW.js +0 -2
- package/dist/chunk-72TZUR4Q.js +0 -2
- package/dist/chunk-72TZUR4Q.js.map +0 -1
- package/dist/chunk-AN4APNXO.js +0 -2
- package/dist/chunk-AN4APNXO.js.map +0 -1
- package/dist/chunk-K7FD54PW.js +0 -6
- package/dist/chunk-K7FD54PW.js.map +0 -1
- package/dist/chunk-MM356YIK.js.map +0 -1
- package/dist/pages-ZKDDV5T3.js +0 -3
- package/dist/pages-ZKDDV5T3.js.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import'./index.css';import {h,e}from'./chunk-NNA4MLFC.js';import {b as b$1}from'./chunk-U45E5X3H.js';import {createContext,lazy,Suspense,useMemo,useContext}from'react';import {Navigate,useParams}from'react-router-dom';import {Bot,Layout,FileStack,SquarePlay}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';import C,{mutate}from'swr';var d={name:"_asset",plural:"_assets",display:"originalFilename",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:320},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:90},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:100},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",hidden:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"url",label:"URL",scope:"global",hidden:true,readOnly:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"tags",label:"Tags",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",previewType:"tags",options:{size:300},relationship:{mode:"multiple",field:"name",entity:"_tag"}}]};var f={name:"_tag",plural:"_tags",display:"name",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"assets",label:"Assets",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",relationship:{mode:"multiple",field:"originalFilename",entity:"_asset"}}]};function x(){let{resolvedTheme:e}=b$1();return jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background",children:jsxs("div",{className:"fk:flex fk:flex-col fk:items-center",children:[e==="dark"?jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"#020817"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"white"})]}):jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"white"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"#020817"})]}),jsx("div",{className:"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse",children:"Loading..."})]})})}var _=Navigate;function o(e){let t=lazy(e);return jsx(Suspense,{fallback:jsx(x,{}),children:jsx(t,{})})}var B=o(()=>import('./root-
|
|
2
|
-
export{x as a,d as b,f as c,Re as d,De as e,Ze as f};//# sourceMappingURL=chunk-
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {h,e}from'./chunk-NNA4MLFC.js';import {b as b$1}from'./chunk-U45E5X3H.js';import {createContext,lazy,Suspense,useMemo,useContext}from'react';import {Navigate,useParams}from'react-router-dom';import {Bot,Layout,FileStack,SquarePlay}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';import C,{mutate}from'swr';var d={name:"_asset",plural:"_assets",display:"originalFilename",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:320},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:90},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:100},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",hidden:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"url",label:"URL",scope:"global",hidden:true,readOnly:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"tags",label:"Tags",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",previewType:"tags",options:{size:300},relationship:{mode:"multiple",field:"name",entity:"_tag"}}]};var f={name:"_tag",plural:"_tags",display:"name",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"assets",label:"Assets",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",relationship:{mode:"multiple",field:"originalFilename",entity:"_asset"}}]};function x(){let{resolvedTheme:e}=b$1();return jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background",children:jsxs("div",{className:"fk:flex fk:flex-col fk:items-center",children:[e==="dark"?jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"#020817"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"white"})]}):jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"white"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"#020817"})]}),jsx("div",{className:"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse",children:"Loading..."})]})})}var _=Navigate;function o(e){let t=lazy(e);return jsx(Suspense,{fallback:jsx(x,{}),children:jsx(t,{})})}var B=o(()=>import('./root-LFQA2VSE.js').then(e=>({default:e.Root}))),J=o(()=>import('./list-PNKQAYUK.js').then(e=>({default:e.List}))),W=o(()=>import('./edit-entity-PVT34FD7.js').then(e=>({default:e.EditEntity}))),X=o(()=>import('./root-X5NDURAN.js').then(e=>({default:e.Root}))),q=o(()=>import('./root-BH3PQS2H.js').then(e=>({default:e.Root}))),K=o(()=>import('./root-44ZJLA4E.js').then(e=>({default:e.Root}))),$=o(()=>import('./plugin-pages-SE52XFFW.js').then(e=>({default:e.PluginsPage}))),G=o(()=>import('./plugin-pages-SE52XFFW.js').then(e=>({default:e.InstalledPluginsPage}))),Q=o(()=>import('./plugin-pages-SE52XFFW.js').then(e=>({default:e.PluginDetailPage}))),T=o(()=>import('./chat-page-S2YGOKO5.js').then(e=>({default:e.AgentChatPage}))),Y=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.AutomationsPage}))),ee=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.RunHistoryPage}))),te=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.ApprovalsPage}))),oe=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.ActivityPage}))),ae=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.ActivityItemPage}))),ne=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.CreateAutomationPage}))),ie=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.AutomationDetailPage}))),re=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.RunsPage}))),se=o(()=>import('./pages-KHFSZ3PH.js').then(e=>({default:e.RunDetailPage}))),pe=o(()=>import('./skills-pages-TWOIIU5J.js').then(e=>({default:e.SkillsPage}))),ce=o(()=>import('./skills-pages-TWOIIU5J.js').then(e=>({default:e.CreateSkillPage}))),le=o(()=>import('./skills-pages-TWOIIU5J.js').then(e=>({default:e.SkillDetailPage}))),l=[{name:"ai",icon:jsx(Bot,{strokeWidth:1.5}),title:"AI",component:K,routes:[{path:"plugins",component:$},{path:"plugins/installed",component:G},{path:"plugins/:pluginId",component:Q},{component:jsx(_,{replace:true,to:"agent"}),path:""},{component:T,path:"agent"},{component:T,path:"agent/chats/:chatId"},{component:Y,path:"automations"},{component:ee,path:"runs"},{component:te,path:"approvals"},{component:oe,path:"activity"},{component:ae,path:"activity/:itemId"},{component:ne,path:"automations/new"},{component:ie,path:"automations/:automationId"},{component:re,path:"automations/:automationId/runs"},{component:se,path:"automations/:automationId/runs/:runId"},{component:pe,path:"skills"},{component:ce,path:"skills/new"},{component:le,path:"skills/:skillId"}]},{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:B,routes:[{path:"list/:entity",component:J,children:[{path:"edit/:id",component:W}]}]},{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:X,routes:[]},{name:"explorer",icon:jsx(SquarePlay,{strokeWidth:1.5}),title:"Explorer",component:q,routes:[]}];async function b(e$1){try{let t=await fetch(e(e$1).schema,{credentials:"include",mode:"cors"});if(!t.ok){let n=t.statusText||`Request failed with status ${String(t.status)}`;try{let i=await t.json();n=i.error??i.message??n;}catch{}return {ok:!1,projectId:e$1,error:{status:t.status,message:n}}}let a=await t.json();return {ok:!0,project:{...a,projectId:a.projectId||e$1}}}catch(t){return {ok:false,projectId:e$1,error:{status:0,message:t instanceof Error?t.message:"Network error"}}}}function w(e,t){let a=[],n={};for(let i of e??[])i.ok?a.push(i.project):n[i.projectId]=i.error;return {projects:a,errors:n,isLoading:t}}function A(e,t){let a=t&&e.length>0?["project-schemas",t,...e]:null,{data:n,isLoading:i}=C(a,()=>Promise.all(e.map(s=>b(s))),{revalidateOnFocus:false,revalidateOnReconnect:false});return w(n,!!a&&(i||n===void 0))}function ue(e,t){return w(e?[e]:void 0,t)}function L(e,t){let a=t&&e?["project-schema",t,e]:null,{data:n,isLoading:i}=C(a,()=>b(e??""),{revalidateOnFocus:false,revalidateOnReconnect:false});return ue(n,!!a&&(i||n===void 0))}function de(e,t){return Array.isArray(e)&&(e[0]==="project-schema"||e[0]==="project-schemas")&&e.slice(2).includes(t)}function Re(e){return mutate(t=>de(t,e))}var I=createContext({mode:"projects",apps:l,contributions:{apps:l},currentProjectId:void 0,currentProject:void 0,currentProjectSchema:[],projects:[],projectIds:[],projectSummaries:[],schemaErrors:{},isLoadingSchemas:false});function ye(e){return [...e.filter(a=>a.name!==d.name&&a.name!==f.name),d,f]}function De({projectIds:e,projectSummaries:t=[],mode:a="projects",userId:n,children:i}){let{projectId:s}=useParams(),[,R]=h(),h$1=R.user?.id??n,V=A(a==="projects"?e:[],h$1),O=L(a==="hosted"&&s&&e.includes(s)?s:void 0,h$1),{projects:y,errors:P,isLoading:S}=a==="hosted"?O:V,m=useMemo(()=>e.map(r=>y.find(u=>u.projectId===r)).filter(r=>r!==void 0).map(r=>({...r,schema:ye(r.schema)})),[y,e]),H=useMemo(()=>{let r=m.find(u=>u.projectId===s);return {mode:a,apps:l,contributions:{apps:l},currentProjectId:s,currentProject:r,currentProjectSchema:r?.schema??[],projects:m,projectIds:e,projectSummaries:t,schemaErrors:P,isLoadingSchemas:S}},[s,P,S,a,e,t,m]);return jsx(I.Provider,{value:H,children:i})}function Ze(){return useContext(I)}
|
|
2
|
+
export{x as a,d as b,f as c,Re as d,De as e,Ze as f};//# sourceMappingURL=chunk-LN55VJ35.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-LN55VJ35.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/ui/components/loading.tsx","../src/core/apps/built-in-apps.tsx","../src/core/config/use-project-schemas.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","Loading","resolvedTheme","useTheme","jsx","jsxs","NavigateCompat","Navigate","lazyElement","loader","Component","lazy","Suspense","deskRoot","m","deskList","deskEditEntity","assetManagerRoot","explorerRoot","aiRoot","aiPluginsPage","aiInstalledPluginsPage","aiPluginDetailPage","aiAgentChatPage","aiAutomationsPage","aiRunHistoryPage","aiApprovalsPage","aiActivityPage","aiActivityItemPage","aiCreateAutomationPage","aiAutomationDetailPage","aiRunsPage","aiRunDetailPage","aiSkillsPage","aiCreateSkillPage","aiSkillDetailPage","builtInApps","BotIcon","LayoutIcon","FileStackIcon","SquarePlayIcon","fetchProjectSchema","projectId","response","apiPaths","message","body","project","error","toProjectSchemasState","outcomes","isLoading","projects","errors","outcome","useProjectSchemas","projectIds","userId","key","data","useSWR","toProjectSchemaState","useProjectSchema","isProjectSchemaKey","revalidateProjectSchema","mutate","ConfigContext","createContext","upsertReservedEntities","schema","entity","ConfigProvider","projectSummaries","mode","children","currentProjectId","useParams","auth","useAuth","schemaUserId","allSchemas","currentSchema","loadedProjects","useMemo","value","currentProject","useConfig","useContext"],"mappings":"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","file":"chunk-76CL7HSO.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\n display: 'originalFilename',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'path',\n label: 'Asset',\n scope: 'global',\n options: {\n size: 140,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'assetPreviewField',\n defaultValue: '',\n },\n {\n name: 'originalFilename',\n label: 'Filename',\n scope: 'global',\n options: {\n size: 320,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'width',\n label: 'Width',\n scope: 'global',\n options: {\n size: 90,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'height',\n label: 'Height',\n scope: 'global',\n options: {\n size: 100,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'mimeType',\n label: 'Mime Type',\n scope: 'global',\n options: {\n size: 160,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n hidden: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'url',\n label: 'URL',\n scope: 'global',\n hidden: true,\n readOnly: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'tags',\n label: 'Tags',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n previewType: 'tags',\n options: {\n size: 300,\n },\n relationship: {\n mode: 'multiple',\n field: 'name',\n entity: '_tag',\n },\n },\n ],\n};\n","import type { Entity } from '../core/types';\n\nexport const tagSchema: Entity = {\n name: '_tag',\n plural: '_tags',\n display: 'name',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'name',\n label: 'Tag Name',\n scope: 'global',\n options: {\n size: 220,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'assets',\n label: 'Assets',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n relationship: {\n mode: 'multiple',\n field: 'originalFilename',\n entity: '_asset',\n },\n },\n ],\n};\n","import type { JSX } from 'react';\nimport { useTheme } from '../theme-context';\n\nexport function Loading(): JSX.Element {\n const { resolvedTheme } = useTheme();\n\n return (\n <div className=\"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background\">\n <div className=\"fk:flex fk:flex-col fk:items-center\">\n {resolvedTheme === 'dark' ? (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"#020817\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"white\"\n />\n </svg>\n ) : (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"white\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"#020817\"\n />\n </svg>\n )}\n <div className=\"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse\">Loading...</div>\n </div>\n </div>\n );\n}\n","import { lazy, Suspense } from 'react';\nimport type { ComponentType, JSX } from 'react';\nimport {\n Bot as BotIcon,\n FileStack as FileStackIcon,\n Layout as LayoutIcon,\n SquarePlay as SquarePlayIcon,\n} from 'lucide-react';\nimport { Navigate } from 'react-router-dom';\nimport { Loading } from '../../ui/components/loading';\nimport type { AppOptions } from '../config/types';\n\nconst NavigateCompat = Navigate as unknown as ComponentType<{\n replace?: boolean;\n to: string;\n}>;\n\n/**\n * Wraps a lazily imported component in Suspense so each built-in app (and each of its routes)\n * is only downloaded when it is first rendered.\n */\nfunction lazyElement(loader: () => Promise<{ default: ComponentType }>): JSX.Element {\n const Component = lazy(loader);\n\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// Desk\nconst deskRoot = lazyElement(() => import('../../apps/desk/root').then((m) => ({ default: m.Root })));\nconst deskList = lazyElement(() => import('../../apps/desk/list').then((m) => ({ default: m.List })));\nconst deskEditEntity = lazyElement(() =>\n import('../../apps/desk/edit-entity').then((m) => ({ default: m.EditEntity }))\n);\n\n// Asset Manager\nconst assetManagerRoot = lazyElement(() =>\n import('../../apps/asset-manager/root').then((m) => ({ default: m.Root }))\n);\n\n// Explorer\nconst explorerRoot = lazyElement(() => import('../../apps/explorer/root').then((m) => ({ default: m.Root })));\n\n// AI\nconst aiRoot = lazyElement(() => import('../../apps/ai/root').then((m) => ({ default: m.Root })));\nconst aiPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginsPage }))\n);\nconst aiInstalledPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.InstalledPluginsPage }))\n);\nconst aiPluginDetailPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginDetailPage }))\n);\nconst aiAgentChatPage = lazyElement(() =>\n import('../../apps/ai/agent/chat-page').then((m) => ({ default: m.AgentChatPage }))\n);\nconst aiAutomationsPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationsPage }))\n);\nconst aiRunHistoryPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.RunHistoryPage }))\n);\nconst aiApprovalsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ApprovalsPage })));\nconst aiActivityPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ActivityPage })));\nconst aiActivityItemPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.ActivityItemPage }))\n);\nconst aiCreateAutomationPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.CreateAutomationPage }))\n);\nconst aiAutomationDetailPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationDetailPage }))\n);\nconst aiRunsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunsPage })));\nconst aiRunDetailPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunDetailPage })));\nconst aiSkillsPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillsPage }))\n);\nconst aiCreateSkillPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.CreateSkillPage }))\n);\nconst aiSkillDetailPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillDetailPage }))\n);\n\nexport const builtInApps: AppOptions[] = [\n {\n name: 'ai',\n icon: <BotIcon strokeWidth={1.5} />,\n title: 'AI',\n component: aiRoot,\n routes: [\n { path: 'plugins', component: aiPluginsPage },\n { path: 'plugins/installed', component: aiInstalledPluginsPage },\n { path: 'plugins/:pluginId', component: aiPluginDetailPage },\n {\n component: <NavigateCompat replace to=\"agent\" />,\n path: '',\n },\n {\n component: aiAgentChatPage,\n path: 'agent',\n },\n {\n component: aiAgentChatPage,\n path: 'agent/chats/:chatId',\n },\n {\n component: aiAutomationsPage,\n path: 'automations',\n },\n {\n component: aiRunHistoryPage,\n path: 'runs',\n },\n {\n component: aiApprovalsPage,\n path: 'approvals',\n },\n {\n component: aiActivityPage,\n path: 'activity',\n },\n {\n component: aiActivityItemPage,\n path: 'activity/:itemId',\n },\n {\n component: aiCreateAutomationPage,\n path: 'automations/new',\n },\n {\n component: aiAutomationDetailPage,\n path: 'automations/:automationId',\n },\n {\n component: aiRunsPage,\n path: 'automations/:automationId/runs',\n },\n {\n component: aiRunDetailPage,\n path: 'automations/:automationId/runs/:runId',\n },\n {\n component: aiSkillsPage,\n path: 'skills',\n },\n {\n component: aiCreateSkillPage,\n path: 'skills/new',\n },\n {\n component: aiSkillDetailPage,\n path: 'skills/:skillId',\n },\n ],\n },\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: deskRoot,\n routes: [\n {\n path: 'list/:entity',\n component: deskList,\n children: [\n {\n path: 'edit/:id',\n component: deskEditEntity, // Not used, left here as an example of how to nest routes in apps\n },\n ],\n },\n ],\n },\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: assetManagerRoot,\n routes: [],\n },\n {\n name: 'explorer',\n icon: <SquarePlayIcon strokeWidth={1.5} />,\n title: 'Explorer',\n component: explorerRoot,\n routes: [],\n },\n];\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { apiPaths } from '../api-paths';\nimport type { ProjectSchemaError, ProjectUiConfig } from './types';\n\nexport type ProjectSchemasState = {\n projects: ProjectUiConfig[];\n errors: { [projectId: string]: ProjectSchemaError };\n isLoading: boolean;\n};\n\ntype FetchOutcome = { ok: true; project: ProjectUiConfig } | { ok: false; projectId: string; error: ProjectSchemaError };\n\nasync function fetchProjectSchema(projectId: string): Promise<FetchOutcome> {\n try {\n const response = await fetch(apiPaths(projectId).schema, { credentials: 'include', mode: 'cors' });\n\n if (!response.ok) {\n let message = response.statusText || `Request failed with status ${String(response.status)}`;\n\n try {\n const body = (await response.json()) as { error?: string; message?: string };\n message = body.error ?? body.message ?? message;\n } catch {\n // keep the status text\n }\n\n return { ok: false, projectId, error: { status: response.status, message } };\n }\n\n const project = (await response.json()) as ProjectUiConfig;\n\n return { ok: true, project: { ...project, projectId: project.projectId || projectId } };\n } catch (error) {\n return {\n ok: false,\n projectId,\n error: { status: 0, message: error instanceof Error ? error.message : 'Network error' },\n };\n }\n}\n\nexport function toProjectSchemasState(outcomes: FetchOutcome[] | undefined, isLoading: boolean): ProjectSchemasState {\n const projects: ProjectUiConfig[] = [];\n const errors: { [projectId: string]: ProjectSchemaError } = {};\n\n for (const outcome of outcomes ?? []) {\n if (outcome.ok) {\n projects.push(outcome.project);\n } else {\n errors[outcome.projectId] = outcome.error;\n }\n }\n\n return { projects, errors, isLoading };\n}\n\n/**\n * Loads the deployed schema of every project the Studio can open. Fetching\n * starts once the user is known (the endpoint needs a session) and the result\n * is kept for the lifetime of the page: schemas only change on deploy.\n */\nexport function useProjectSchemas(projectIds: string[], userId: string | undefined): ProjectSchemasState {\n const key = userId && projectIds.length > 0 ? ['project-schemas', userId, ...projectIds] : null;\n const { data, isLoading } = useSWR(key, () => Promise.all(projectIds.map((projectId) => fetchProjectSchema(projectId))), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemasState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** State of a single project's schema, in the same shape as the multi-project hook. */\nexport function toProjectSchemaState(outcome: FetchOutcome | undefined, isLoading: boolean): ProjectSchemasState {\n return toProjectSchemasState(outcome ? [outcome] : undefined, isLoading);\n}\n\n/**\n * Hosted mode: loads only the project currently open. Each project has its own\n * SWR key, so switching back to a project reuses the schema already fetched.\n */\nexport function useProjectSchema(projectId: string | undefined, userId: string | undefined): ProjectSchemasState {\n const key = userId && projectId ? ['project-schema', userId, projectId] : null;\n const { data, isLoading } = useSWR(key, () => fetchProjectSchema(projectId ?? ''), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemaState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** True for the SWR keys that hold `projectId`'s schema (single- and multi-project hooks). */\nexport function isProjectSchemaKey(key: unknown, projectId: string): boolean {\n return (\n Array.isArray(key) &&\n (key[0] === 'project-schema' || key[0] === 'project-schemas') &&\n key.slice(2).includes(projectId)\n );\n}\n\n/** Refetches the deployed schema of `projectId`, e.g. after the agent deployed a schema change. */\nexport function revalidateProjectSchema(projectId: string): Promise<unknown> {\n return mutate((key) => isProjectSchemaKey(key, projectId));\n}\n","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport { builtInApps } from '../apps/built-in-apps';\nimport type { AppOptions, ProjectSchemaError, ProjectSummary, ProjectUiConfig, StudioMode } from './types';\nimport type { Entity } from '../types';\nimport { useProjectSchema, useProjectSchemas } from './use-project-schemas';\n\nexport interface ConfigContext {\n /** `projects` when the host passed `projectIds`, `hosted` when the Studio listed the user's projects itself. */\n mode: StudioMode;\n /** The Studio apps shown in the app bar, in order. */\n apps: AppOptions[];\n /** Kept for callers that read `contributions.apps`; same list as `apps`. */\n contributions: {\n apps: AppOptions[];\n };\n currentProjectId?: string;\n /** The project named by the `:projectId` route param, once its schema has loaded. */\n currentProject?: ProjectUiConfig;\n currentProjectSchema: Entity[];\n /** Projects whose schema loaded, in `projectIds` order. */\n projects: ProjectUiConfig[];\n /** Every project id the Studio can open, loaded or not. */\n projectIds: string[];\n /** Hosted mode: name, avatar, role and team of each project, known before any schema loads. */\n projectSummaries: ProjectSummary[];\n /** Per project id: why its schema could not be loaded. */\n schemaErrors: { [projectId: string]: ProjectSchemaError };\n isLoadingSchemas: boolean;\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n mode: 'projects',\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId: undefined,\n currentProject: undefined,\n currentProjectSchema: [],\n projects: [],\n projectIds: [],\n projectSummaries: [],\n schemaErrors: {},\n isLoadingSchemas: false,\n});\n\n/** Appends the reserved asset and tag entities to a deployed schema. */\nexport function upsertReservedEntities(schema: Entity[]): Entity[] {\n const withoutReserved = schema.filter((entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name);\n\n return [...withoutReserved, assetSchema, tagSchema];\n}\n\nexport function ConfigProvider({\n projectIds,\n projectSummaries = [],\n mode = 'projects',\n userId,\n children,\n}: {\n projectIds: string[];\n projectSummaries?: ProjectSummary[];\n mode?: StudioMode;\n /** Hosted mode: the signed-in user's id, known before the per-project `/users/me` call. */\n userId?: string;\n children: React.ReactNode;\n}): JSX.Element {\n /**\n * Getting the projectId from the URL via react-router-dom's useParams hook triggers a rerender of this Context\n * every time the URL changes.\n */\n const { projectId: currentProjectId } = useParams<{ projectId: string }>();\n const [, auth] = useAuth();\n const schemaUserId = auth.user?.id ?? userId;\n // Project mode loads every project up front (short, host-defined list); hosted mode only the one open.\n const allSchemas = useProjectSchemas(mode === 'projects' ? projectIds : [], schemaUserId);\n const currentSchema = useProjectSchema(\n mode === 'hosted' && currentProjectId && projectIds.includes(currentProjectId) ? currentProjectId : undefined,\n schemaUserId\n );\n const { projects: loadedProjects, errors, isLoading } = mode === 'hosted' ? currentSchema : allSchemas;\n const projects = useMemo(\n () =>\n projectIds\n .map((projectId) => loadedProjects.find((project) => project.projectId === projectId))\n .filter((project): project is ProjectUiConfig => project !== undefined)\n .map((project) => ({ ...project, schema: upsertReservedEntities(project.schema) })),\n [loadedProjects, projectIds]\n );\n\n const value = useMemo<ConfigContext>(() => {\n const currentProject = projects.find((project) => project.projectId === currentProjectId);\n\n return {\n mode,\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId,\n currentProject,\n currentProjectSchema: currentProject?.schema ?? [],\n projects,\n projectIds,\n projectSummaries,\n schemaErrors: errors,\n isLoadingSchemas: isLoading,\n };\n }, [currentProjectId, errors, isLoading, mode, projectIds, projectSummaries, projects]);\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/ui/components/loading.tsx","../src/core/apps/built-in-apps.tsx","../src/core/config/use-project-schemas.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","Loading","resolvedTheme","useTheme","jsx","jsxs","NavigateCompat","Navigate","lazyElement","loader","Component","lazy","Suspense","deskRoot","m","deskList","deskEditEntity","assetManagerRoot","explorerRoot","aiRoot","aiPluginsPage","aiInstalledPluginsPage","aiPluginDetailPage","aiAgentChatPage","aiAutomationsPage","aiRunHistoryPage","aiApprovalsPage","aiActivityPage","aiActivityItemPage","aiCreateAutomationPage","aiAutomationDetailPage","aiRunsPage","aiRunDetailPage","aiSkillsPage","aiCreateSkillPage","aiSkillDetailPage","builtInApps","BotIcon","LayoutIcon","FileStackIcon","SquarePlayIcon","fetchProjectSchema","projectId","response","apiPaths","message","body","project","error","toProjectSchemasState","outcomes","isLoading","projects","errors","outcome","useProjectSchemas","projectIds","userId","key","data","useSWR","toProjectSchemaState","useProjectSchema","isProjectSchemaKey","revalidateProjectSchema","mutate","ConfigContext","createContext","upsertReservedEntities","schema","entity","ConfigProvider","projectSummaries","mode","children","currentProjectId","useParams","auth","useAuth","schemaUserId","allSchemas","currentSchema","loadedProjects","useMemo","value","currentProject","useConfig","useContext"],"mappings":"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","file":"chunk-LN55VJ35.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\n display: 'originalFilename',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'path',\n label: 'Asset',\n scope: 'global',\n options: {\n size: 140,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'assetPreviewField',\n defaultValue: '',\n },\n {\n name: 'originalFilename',\n label: 'Filename',\n scope: 'global',\n options: {\n size: 320,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'width',\n label: 'Width',\n scope: 'global',\n options: {\n size: 90,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'height',\n label: 'Height',\n scope: 'global',\n options: {\n size: 100,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'mimeType',\n label: 'Mime Type',\n scope: 'global',\n options: {\n size: 160,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n hidden: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'url',\n label: 'URL',\n scope: 'global',\n hidden: true,\n readOnly: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'tags',\n label: 'Tags',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n previewType: 'tags',\n options: {\n size: 300,\n },\n relationship: {\n mode: 'multiple',\n field: 'name',\n entity: '_tag',\n },\n },\n ],\n};\n","import type { Entity } from '../core/types';\n\nexport const tagSchema: Entity = {\n name: '_tag',\n plural: '_tags',\n display: 'name',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'name',\n label: 'Tag Name',\n scope: 'global',\n options: {\n size: 220,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'assets',\n label: 'Assets',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n relationship: {\n mode: 'multiple',\n field: 'originalFilename',\n entity: '_asset',\n },\n },\n ],\n};\n","import type { JSX } from 'react';\nimport { useTheme } from '../theme-context';\n\nexport function Loading(): JSX.Element {\n const { resolvedTheme } = useTheme();\n\n return (\n <div className=\"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background\">\n <div className=\"fk:flex fk:flex-col fk:items-center\">\n {resolvedTheme === 'dark' ? (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"#020817\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"white\"\n />\n </svg>\n ) : (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"white\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"#020817\"\n />\n </svg>\n )}\n <div className=\"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse\">Loading...</div>\n </div>\n </div>\n );\n}\n","import { lazy, Suspense } from 'react';\nimport type { ComponentType, JSX } from 'react';\nimport {\n Bot as BotIcon,\n FileStack as FileStackIcon,\n Layout as LayoutIcon,\n SquarePlay as SquarePlayIcon,\n} from 'lucide-react';\nimport { Navigate } from 'react-router-dom';\nimport { Loading } from '../../ui/components/loading';\nimport type { AppOptions } from '../config/types';\n\nconst NavigateCompat = Navigate as unknown as ComponentType<{\n replace?: boolean;\n to: string;\n}>;\n\n/**\n * Wraps a lazily imported component in Suspense so each built-in app (and each of its routes)\n * is only downloaded when it is first rendered.\n */\nfunction lazyElement(loader: () => Promise<{ default: ComponentType }>): JSX.Element {\n const Component = lazy(loader);\n\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// Desk\nconst deskRoot = lazyElement(() => import('../../apps/desk/root').then((m) => ({ default: m.Root })));\nconst deskList = lazyElement(() => import('../../apps/desk/list').then((m) => ({ default: m.List })));\nconst deskEditEntity = lazyElement(() =>\n import('../../apps/desk/edit-entity').then((m) => ({ default: m.EditEntity }))\n);\n\n// Asset Manager\nconst assetManagerRoot = lazyElement(() =>\n import('../../apps/asset-manager/root').then((m) => ({ default: m.Root }))\n);\n\n// Explorer\nconst explorerRoot = lazyElement(() => import('../../apps/explorer/root').then((m) => ({ default: m.Root })));\n\n// AI\nconst aiRoot = lazyElement(() => import('../../apps/ai/root').then((m) => ({ default: m.Root })));\nconst aiPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginsPage }))\n);\nconst aiInstalledPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.InstalledPluginsPage }))\n);\nconst aiPluginDetailPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginDetailPage }))\n);\nconst aiAgentChatPage = lazyElement(() =>\n import('../../apps/ai/agent/chat-page').then((m) => ({ default: m.AgentChatPage }))\n);\nconst aiAutomationsPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationsPage }))\n);\nconst aiRunHistoryPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.RunHistoryPage }))\n);\nconst aiApprovalsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ApprovalsPage })));\nconst aiActivityPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ActivityPage })));\nconst aiActivityItemPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.ActivityItemPage }))\n);\nconst aiCreateAutomationPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.CreateAutomationPage }))\n);\nconst aiAutomationDetailPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationDetailPage }))\n);\nconst aiRunsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunsPage })));\nconst aiRunDetailPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunDetailPage })));\nconst aiSkillsPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillsPage }))\n);\nconst aiCreateSkillPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.CreateSkillPage }))\n);\nconst aiSkillDetailPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillDetailPage }))\n);\n\nexport const builtInApps: AppOptions[] = [\n {\n name: 'ai',\n icon: <BotIcon strokeWidth={1.5} />,\n title: 'AI',\n component: aiRoot,\n routes: [\n { path: 'plugins', component: aiPluginsPage },\n { path: 'plugins/installed', component: aiInstalledPluginsPage },\n { path: 'plugins/:pluginId', component: aiPluginDetailPage },\n {\n component: <NavigateCompat replace to=\"agent\" />,\n path: '',\n },\n {\n component: aiAgentChatPage,\n path: 'agent',\n },\n {\n component: aiAgentChatPage,\n path: 'agent/chats/:chatId',\n },\n {\n component: aiAutomationsPage,\n path: 'automations',\n },\n {\n component: aiRunHistoryPage,\n path: 'runs',\n },\n {\n component: aiApprovalsPage,\n path: 'approvals',\n },\n {\n component: aiActivityPage,\n path: 'activity',\n },\n {\n component: aiActivityItemPage,\n path: 'activity/:itemId',\n },\n {\n component: aiCreateAutomationPage,\n path: 'automations/new',\n },\n {\n component: aiAutomationDetailPage,\n path: 'automations/:automationId',\n },\n {\n component: aiRunsPage,\n path: 'automations/:automationId/runs',\n },\n {\n component: aiRunDetailPage,\n path: 'automations/:automationId/runs/:runId',\n },\n {\n component: aiSkillsPage,\n path: 'skills',\n },\n {\n component: aiCreateSkillPage,\n path: 'skills/new',\n },\n {\n component: aiSkillDetailPage,\n path: 'skills/:skillId',\n },\n ],\n },\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: deskRoot,\n routes: [\n {\n path: 'list/:entity',\n component: deskList,\n children: [\n {\n path: 'edit/:id',\n component: deskEditEntity, // Not used, left here as an example of how to nest routes in apps\n },\n ],\n },\n ],\n },\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: assetManagerRoot,\n routes: [],\n },\n {\n name: 'explorer',\n icon: <SquarePlayIcon strokeWidth={1.5} />,\n title: 'Explorer',\n component: explorerRoot,\n routes: [],\n },\n];\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { apiPaths } from '../api-paths';\nimport type { ProjectSchemaError, ProjectUiConfig } from './types';\n\nexport type ProjectSchemasState = {\n projects: ProjectUiConfig[];\n errors: { [projectId: string]: ProjectSchemaError };\n isLoading: boolean;\n};\n\ntype FetchOutcome = { ok: true; project: ProjectUiConfig } | { ok: false; projectId: string; error: ProjectSchemaError };\n\nasync function fetchProjectSchema(projectId: string): Promise<FetchOutcome> {\n try {\n const response = await fetch(apiPaths(projectId).schema, { credentials: 'include', mode: 'cors' });\n\n if (!response.ok) {\n let message = response.statusText || `Request failed with status ${String(response.status)}`;\n\n try {\n const body = (await response.json()) as { error?: string; message?: string };\n message = body.error ?? body.message ?? message;\n } catch {\n // keep the status text\n }\n\n return { ok: false, projectId, error: { status: response.status, message } };\n }\n\n const project = (await response.json()) as ProjectUiConfig;\n\n return { ok: true, project: { ...project, projectId: project.projectId || projectId } };\n } catch (error) {\n return {\n ok: false,\n projectId,\n error: { status: 0, message: error instanceof Error ? error.message : 'Network error' },\n };\n }\n}\n\nexport function toProjectSchemasState(outcomes: FetchOutcome[] | undefined, isLoading: boolean): ProjectSchemasState {\n const projects: ProjectUiConfig[] = [];\n const errors: { [projectId: string]: ProjectSchemaError } = {};\n\n for (const outcome of outcomes ?? []) {\n if (outcome.ok) {\n projects.push(outcome.project);\n } else {\n errors[outcome.projectId] = outcome.error;\n }\n }\n\n return { projects, errors, isLoading };\n}\n\n/**\n * Loads the deployed schema of every project the Studio can open. Fetching\n * starts once the user is known (the endpoint needs a session) and the result\n * is kept for the lifetime of the page: schemas only change on deploy.\n */\nexport function useProjectSchemas(projectIds: string[], userId: string | undefined): ProjectSchemasState {\n const key = userId && projectIds.length > 0 ? ['project-schemas', userId, ...projectIds] : null;\n const { data, isLoading } = useSWR(key, () => Promise.all(projectIds.map((projectId) => fetchProjectSchema(projectId))), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemasState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** State of a single project's schema, in the same shape as the multi-project hook. */\nexport function toProjectSchemaState(outcome: FetchOutcome | undefined, isLoading: boolean): ProjectSchemasState {\n return toProjectSchemasState(outcome ? [outcome] : undefined, isLoading);\n}\n\n/**\n * Hosted mode: loads only the project currently open. Each project has its own\n * SWR key, so switching back to a project reuses the schema already fetched.\n */\nexport function useProjectSchema(projectId: string | undefined, userId: string | undefined): ProjectSchemasState {\n const key = userId && projectId ? ['project-schema', userId, projectId] : null;\n const { data, isLoading } = useSWR(key, () => fetchProjectSchema(projectId ?? ''), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemaState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** True for the SWR keys that hold `projectId`'s schema (single- and multi-project hooks). */\nexport function isProjectSchemaKey(key: unknown, projectId: string): boolean {\n return (\n Array.isArray(key) &&\n (key[0] === 'project-schema' || key[0] === 'project-schemas') &&\n key.slice(2).includes(projectId)\n );\n}\n\n/** Refetches the deployed schema of `projectId`, e.g. after the agent deployed a schema change. */\nexport function revalidateProjectSchema(projectId: string): Promise<unknown> {\n return mutate((key) => isProjectSchemaKey(key, projectId));\n}\n","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport { builtInApps } from '../apps/built-in-apps';\nimport type { AppOptions, ProjectSchemaError, ProjectSummary, ProjectUiConfig, StudioMode } from './types';\nimport type { Entity } from '../types';\nimport { useProjectSchema, useProjectSchemas } from './use-project-schemas';\n\nexport interface ConfigContext {\n /** `projects` when the host passed `projectIds`, `hosted` when the Studio listed the user's projects itself. */\n mode: StudioMode;\n /** The Studio apps shown in the app bar, in order. */\n apps: AppOptions[];\n /** Kept for callers that read `contributions.apps`; same list as `apps`. */\n contributions: {\n apps: AppOptions[];\n };\n currentProjectId?: string;\n /** The project named by the `:projectId` route param, once its schema has loaded. */\n currentProject?: ProjectUiConfig;\n currentProjectSchema: Entity[];\n /** Projects whose schema loaded, in `projectIds` order. */\n projects: ProjectUiConfig[];\n /** Every project id the Studio can open, loaded or not. */\n projectIds: string[];\n /** Hosted mode: name, avatar, role and team of each project, known before any schema loads. */\n projectSummaries: ProjectSummary[];\n /** Per project id: why its schema could not be loaded. */\n schemaErrors: { [projectId: string]: ProjectSchemaError };\n isLoadingSchemas: boolean;\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n mode: 'projects',\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId: undefined,\n currentProject: undefined,\n currentProjectSchema: [],\n projects: [],\n projectIds: [],\n projectSummaries: [],\n schemaErrors: {},\n isLoadingSchemas: false,\n});\n\n/** Appends the reserved asset and tag entities to a deployed schema. */\nexport function upsertReservedEntities(schema: Entity[]): Entity[] {\n const withoutReserved = schema.filter((entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name);\n\n return [...withoutReserved, assetSchema, tagSchema];\n}\n\nexport function ConfigProvider({\n projectIds,\n projectSummaries = [],\n mode = 'projects',\n userId,\n children,\n}: {\n projectIds: string[];\n projectSummaries?: ProjectSummary[];\n mode?: StudioMode;\n /** Hosted mode: the signed-in user's id, known before the per-project `/users/me` call. */\n userId?: string;\n children: React.ReactNode;\n}): JSX.Element {\n /**\n * Getting the projectId from the URL via react-router-dom's useParams hook triggers a rerender of this Context\n * every time the URL changes.\n */\n const { projectId: currentProjectId } = useParams<{ projectId: string }>();\n const [, auth] = useAuth();\n const schemaUserId = auth.user?.id ?? userId;\n // Project mode loads every project up front (short, host-defined list); hosted mode only the one open.\n const allSchemas = useProjectSchemas(mode === 'projects' ? projectIds : [], schemaUserId);\n const currentSchema = useProjectSchema(\n mode === 'hosted' && currentProjectId && projectIds.includes(currentProjectId) ? currentProjectId : undefined,\n schemaUserId\n );\n const { projects: loadedProjects, errors, isLoading } = mode === 'hosted' ? currentSchema : allSchemas;\n const projects = useMemo(\n () =>\n projectIds\n .map((projectId) => loadedProjects.find((project) => project.projectId === projectId))\n .filter((project): project is ProjectUiConfig => project !== undefined)\n .map((project) => ({ ...project, schema: upsertReservedEntities(project.schema) })),\n [loadedProjects, projectIds]\n );\n\n const value = useMemo<ConfigContext>(() => {\n const currentProject = projects.find((project) => project.projectId === currentProjectId);\n\n return {\n mode,\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId,\n currentProject,\n currentProjectSchema: currentProject?.schema ?? [],\n projects,\n projectIds,\n projectSummaries,\n schemaErrors: errors,\n isLoadingSchemas: isLoading,\n };\n }, [currentProjectId, errors, isLoading, mode, projectIds, projectSummaries, projects]);\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {q as q$1,o,r}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {q as q$1,o,r}from'./chunk-KWS3NAYS.js';import {f}from'./chunk-LN55VJ35.js';import {e}from'./chunk-NNA4MLFC.js';import {useCallback}from'react';import {toast}from'sonner';import {useApolloClient}from'@apollo/client/react';function E(i){let{currentProjectSchema:t}=f();return useCallback(a=>{t&&q$1(o(i,t),a);},[i,t])}var g=["image/jpeg","image/png","image/webp","image/vnd.microsoft.icon","image/bmp","image/gif","image/tiff","image/svg+xml","image/avif","image/heic","image/heif","image/heic-sequence","image/heif-sequence","image/apng","audio/aac","audio/mpeg","audio/wav","audio/webm","audio/midi","audio/x-midi","audio/ogg","video/x-msvideo","video/mp4","video/mpeg","video/webm","video/quicktime","video/ogg","video/mp2t","video/3gpp","video/3gpp2","application/x-7z-compressed","application/zip","application/vnd.amazon.ebook","application/octet-stream","application/epub+zip","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-fontobject","application/gzip","application/x-gzip","application/java-archive","application/json","application/ld+json","text/javascript","application/vnd.oasis.opendocument.presentation","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.text","application/ogg","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.rar","application/x-tar","application/vnd.visio","application/xhtml+xml","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/xml"];function F(i,t){if(!i.type)return true;let a=t?t.split(",").map(e=>e.trim()).filter(Boolean):g;return a.length===0?true:a.some(e=>e.endsWith("/*")?i.type.startsWith(e.slice(0,-1)):i.type===e)}async function x(i,t){let a=new URLSearchParams({filename:i.name}),e$1=await fetch(`${e(t).assets}?${a.toString()}`,{method:"POST",headers:{"Content-Type":i.type||"application/octet-stream"},body:i});if(!e$1.ok)throw new Error(`Upload failed for ${i.name}`);let n=await e$1.json(),o={_id:n._id,path:n.path??"",originalFilename:n.originalFilename??i.name,size:n.size??i.size,mimeType:n.mimeType??i.type,lqip:n.lqip??"",width:n.width??0,height:n.height??0};return {pathname:o.path,lqip:o.lqip||void 0,originalFilename:o.originalFilename,size:o.size,mimeType:o.mimeType,width:o.width||void 0,height:o.height||void 0,_id:o._id,asset:o}}async function h(i,t){let{projectId:a,accept:e,maxBytes:n=4*1024*1024,onUploadStart:o}=t,l=[];for(let p of Array.from(i)){if(p.size>n){toast.error(`File size too big (max ${(n/(1024*1024)).toFixed(0)}MB): ${p.name}`);continue}if(!F(p,e)){toast.error(`Unsupported file type: ${p.name}`);continue}l.push(p);}if(l.length===0)return [];o?.();try{let p=await Promise.all(l.map(async f=>x(f,a)));return p.length>0&&toast.success(`Uploaded ${p.length} file${p.length>1?"s":""}`),p}catch(p){return console.error(p),toast.error("Upload failed. Please try again."),[]}}async function b(i){let{accept:t,multiple:a=true}=i,e=document.createElement("input");e.type="file",e.accept=t??g.join(","),e.multiple=a,e.style.display="none",document.body.appendChild(e);try{let n=await new Promise(o=>{e.addEventListener("change",()=>o(e.files),{once:!0}),e.addEventListener("cancel",()=>o(null),{once:!0}),e.click();});return !n||n.length===0?[]:h(n,i)}finally{document.body.removeChild(e);}}function q(){let i=useApolloClient();return useCallback(async t=>{let a=t.files?await h(t.files,t):await b(t);return a.length>0&&await r(i,"GetAssets").catch(e=>{console.error("Error refreshing asset lists after upload:",e);}),a},[i])}export{E as a,x as b,q as c};//# sourceMappingURL=chunk-NOFQHWES.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-NOFQHWES.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"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","file":"chunk-IAA4CEBW.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"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","file":"chunk-NOFQHWES.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import'./index.css';import {A,C,B,p,o as o$1,h as h$1,i}from'./chunk-
|
|
1
|
+
import'./index.css';import {A,C,B,p,o as o$1,h as h$1,i}from'./chunk-KWS3NAYS.js';import {d,c}from'./chunk-P6BZ4QP7.js';import {b}from'./chunk-7SK5YPHT.js';import {f}from'./chunk-LN55VJ35.js';import {ma}from'./chunk-YCCFUGWJ.js';import {a,d as d$1,c as c$1,e as e$1,g as g$1}from'./chunk-HDOIOXMP.js';import {e,g,h,j,o,n,k}from'./chunk-SZEGGBOC.js';import {b as b$1}from'./chunk-6NRQMG26.js';import {PencilIcon,Trash2Icon,Ellipsis,Settings2,RefreshCw,Loader2,Trash2}from'lucide-react';import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {find,propEq}from'ramda';import {gql}from'@apollo/client';import {useApolloClient}from'@apollo/client/react';import {toast}from'sonner';function Me({entityName:l,entityNamePlural:a,row:r,options:s={canDelete:true,canEdit:true}}){let f=A(),E=b(),c=r.original._id,D=(s.canDelete??true)&&E,p=s.canEdit??true;function h$1(){f({type:"EditEntity",payload:{entityId:c,entityNamePlural:a}});}function d(){f({type:"DeleteEntity",payload:{entityId:c,entityName:l}});}return jsxs("div",{className:"fk:flex",children:[p&&jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1",onClick:h$1,variant:"ghost",children:[jsx(PencilIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Edit"})]}),D&&!p&&jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1",onClick:d,variant:"ghost",children:[jsx(Trash2Icon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Delete"})]}),p&&D&&jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0",variant:"ghost",children:[jsx(Ellipsis,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Additional actions"})]})}),jsxs(h,{align:"end",className:"w-[160px]",children:[jsxs(j,{onClick:h$1,children:[jsx(PencilIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Edit"]}),jsx(o,{}),jsxs(j,{className:"fk:text-destructive",onClick:d,children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete"]})]})]})]})}function Y({table:l}){return jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(b$1,{className:"fk:hidden fk:h-8 fk:lg:flex",size:"sm",variant:"outline",children:[jsx(Settings2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"View"]})}),jsxs(h,{align:"end",className:"fk:w-[150px]",children:[jsx(n,{children:"Toggle columns"}),jsx(o,{}),l.getAllColumns().filter(a=>typeof a.accessorFn<"u"&&a.getCanHide()).map(a=>jsx(k,{checked:a.getIsVisible(),className:"capitalize",onCheckedChange:r=>{a.toggleVisibility(!!r);},children:a.id},a.id))]})]})}function Ue({entityName:l,isReloading:a$1=false,onReload:r,table:s}){let f$1=A(),E=d(),c$2=c(),D=useApolloClient(),{currentProject:p$1,currentProjectId:h}=f(),d$2=p$1?.schema??[],w=p$1?.scopes,[ee,te,ae]=C(),[b$2,B$1]=useState(false),y=b(),m=s.getSelectedRowModel().rows.map(e=>e.original._id);function oe(){f$1({type:"AddEntity",payload:{entityName:l}});}function ne(e){E({type:"setScope",payload:{projectId:h,scope:e}});}async function le(e){if(e.length===0)return;let u=h$1(l,d$2,e);await new Promise((se,re)=>{te(gql`
|
|
2
2
|
${u}
|
|
3
|
-
`),ae({variables:{where:i(e)},update(x){for(let ce of e)x.evict({id:ce});},onCompleted:()=>{se();},onError:x=>{re(x);}}),ee(true);});}function ie(){let e=l==="_asset"?"asset":l.toLowerCase();f$1({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${m.length} ${e}${m.length>1?"s":""}`,dialogMessage:m.length>1?`Are you sure you want to delete the selected ${e}s? They will be deleted permanently.`:`Are you sure you want to delete the selected ${e}? The item will be deleted permanently.`,dialogCancelTitle:"Cancel",dialogActionLabel:"Delete",isDestructive:true,dialogActionSubmit:async()=>{B$1(true);try{let u=[...m];await le(u),s.resetRowSelection(),await p(D,o$1(l,d$2),u),toast.success(u.length>1?"Items successfully deleted.":"Item successfully deleted.");}catch{toast.error("Failed to delete selected items.");}finally{B$1(false);}},dialogActionCancel:()=>{}}}});}return jsxs("div",{className:"fk:flex fk:items-center fk:justify-between",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[w&&w.length>0?jsxs(a,{defaultValue:c$2.scope,onValueChange:e=>{ne(e);},value:c$2.scope,children:[jsxs(d$1,{className:"fk:w-48!",id:"project",size:"sm",children:[jsx("span",{className:"fk:text-muted-foreground",children:"Scope:"}),jsx(c$1,{children:(find(propEq(c$2.scope??"","name"))(w)||null)?.label})]}),jsx(e$1,{children:w.map(e=>jsx(g$1,{value:e.name,children:e.label},e.name))})]}):null,jsx(Y,{table:s}),r?jsx(b$1,{"aria-label":"Reload",className:"fk:h-8",disabled:b$2||a$1,onClick:r,size:"icon-sm",variant:"outline",children:jsx(RefreshCw,{className:a$1?"fk:animate-spin":void 0})}):null,jsx(B,{table:s})]}),m.length>0?jsx(ma,{disabled:!y,children:jsxs(b$1,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:b$2||!y,onClick:ie,size:"sm",variant:"destructive",children:[b$2?jsx(Loader2,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete (",m.length,")"]})}):null,jsx(ma,{disabled:!y,children:jsx(b$1,{className:"fk:ml-auto fk:h-8 fk:lg:flex",disabled:b$2||!y,onClick:oe,size:"sm",variant:"default",children:"Create"})})]})}export{Me as a,Y as b,Ue as c};//# sourceMappingURL=chunk-
|
|
4
|
-
//# sourceMappingURL=chunk-
|
|
3
|
+
`),ae({variables:{where:i(e)},update(x){for(let ce of e)x.evict({id:ce});},onCompleted:()=>{se();},onError:x=>{re(x);}}),ee(true);});}function ie(){let e=l==="_asset"?"asset":l.toLowerCase();f$1({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${m.length} ${e}${m.length>1?"s":""}`,dialogMessage:m.length>1?`Are you sure you want to delete the selected ${e}s? They will be deleted permanently.`:`Are you sure you want to delete the selected ${e}? The item will be deleted permanently.`,dialogCancelTitle:"Cancel",dialogActionLabel:"Delete",isDestructive:true,dialogActionSubmit:async()=>{B$1(true);try{let u=[...m];await le(u),s.resetRowSelection(),await p(D,o$1(l,d$2),u),toast.success(u.length>1?"Items successfully deleted.":"Item successfully deleted.");}catch{toast.error("Failed to delete selected items.");}finally{B$1(false);}},dialogActionCancel:()=>{}}}});}return jsxs("div",{className:"fk:flex fk:items-center fk:justify-between",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[w&&w.length>0?jsxs(a,{defaultValue:c$2.scope,onValueChange:e=>{ne(e);},value:c$2.scope,children:[jsxs(d$1,{className:"fk:w-48!",id:"project",size:"sm",children:[jsx("span",{className:"fk:text-muted-foreground",children:"Scope:"}),jsx(c$1,{children:(find(propEq(c$2.scope??"","name"))(w)||null)?.label})]}),jsx(e$1,{children:w.map(e=>jsx(g$1,{value:e.name,children:e.label},e.name))})]}):null,jsx(Y,{table:s}),r?jsx(b$1,{"aria-label":"Reload",className:"fk:h-8",disabled:b$2||a$1,onClick:r,size:"icon-sm",variant:"outline",children:jsx(RefreshCw,{className:a$1?"fk:animate-spin":void 0})}):null,jsx(B,{table:s})]}),m.length>0?jsx(ma,{disabled:!y,children:jsxs(b$1,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:b$2||!y,onClick:ie,size:"sm",variant:"destructive",children:[b$2?jsx(Loader2,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete (",m.length,")"]})}):null,jsx(ma,{disabled:!y,children:jsx(b$1,{className:"fk:ml-auto fk:h-8 fk:lg:flex",disabled:b$2||!y,onClick:oe,size:"sm",variant:"default",children:"Create"})})]})}export{Me as a,Y as b,Ue as c};//# sourceMappingURL=chunk-NYKATVPZ.js.map
|
|
4
|
+
//# sourceMappingURL=chunk-NYKATVPZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-grid/data-table-row-actions.tsx","../src/data-grid/data-table-view-options.tsx","../src/data-grid/data-table-toolbar.tsx"],"names":["DataTableRowActions","entityName","entityNamePlural","row","options","actionDispatch","useDispatch","canMutate","useCanMutate","entityId","canDelete","canEdit","handleEdit","handleDelete","jsxs","Button","jsx","PencilIcon","Trash2Icon","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DataTableViewOptions","table","Settings2","DropdownMenuLabel","column","DropdownMenuCheckboxItem","value","DataTableToolbar","isReloading","onReload","appDispatch","useAppDispatch","appContext","useAppContext","apolloClient","useApolloClient","currentProject","currentProjectId","useConfig","schema","scopes","runMutation","setMutation","setOptions","useEntityMutation","isDeleting","setIsDeleting","useState","selectedIds","handleCreate","handleScopeChange","deleteSelected","ids","mutation","getEntityDeleteMutation","resolve","reject","gql","getEntityDeleteWhere","cache","id","error","handleBatchDelete","itemLabel","idsToDelete","scheduleEntityListRemoval","getEntityListQueryName","toast","Select","SelectTrigger","SelectValue","find","propEq","SelectContent","scopeItem","SelectItem","RefreshCw","DataTableSortedBy","PermissionTooltip","Loader2","Trash2"],"mappings":"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","file":"chunk-MPLNRUP3.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Ellipsis, PencilIcon, Trash2Icon } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\nimport { useDispatch } from '../entities/actions-context';\nimport { useCanMutate } from '../core/permissions';\n\ninterface DataTableRowActionsProps<TData> {\n entityName: string;\n entityNamePlural: string;\n row: Row<TData>;\n options?: {\n canDelete?: boolean;\n canEdit?: boolean;\n };\n}\n\nexport function DataTableRowActions<TData>({\n entityName,\n entityNamePlural,\n row,\n options = { canDelete: true, canEdit: true },\n}: DataTableRowActionsProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const canMutate = useCanMutate();\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const entityId = row.original._id;\n // Read-only roles keep the pencil (the drawer doubles as their read view)\n // but lose the delete affordance entirely.\n const canDelete = (options.canDelete ?? true) && canMutate;\n const canEdit = options.canEdit ?? true;\n\n function handleEdit(): void {\n actionDispatch({ type: 'EditEntity', payload: { entityId, entityNamePlural } });\n }\n\n function handleDelete(): void {\n actionDispatch({ type: 'DeleteEntity', payload: { entityId, entityName } });\n }\n\n return (\n <div className=\"fk:flex\">\n {canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleEdit} variant=\"ghost\">\n <PencilIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Edit</span>\n </Button>\n )}\n {canDelete && !canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleDelete} variant=\"ghost\">\n <Trash2Icon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Delete</span>\n </Button>\n )}\n {canEdit && canDelete && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0\" variant=\"ghost\">\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Additional actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem onClick={handleEdit}>\n <PencilIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"fk:text-destructive\" onClick={handleDelete}>\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>): JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:hidden fk:h-8 fk:lg:flex\" size=\"sm\" variant=\"outline\">\n <Settings2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n checked={column.getIsVisible()}\n className=\"capitalize\"\n key={column.id}\n onCheckedChange={(value) => {\n column.toggleVisibility(Boolean(value));\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport type { Table } from '@tanstack/react-table';\nimport { Loader2, RefreshCw, Trash2 } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { toast } from 'sonner';\nimport { Button } from '../ui/primitives/button';\nimport { PermissionTooltip } from '../ui/components/permission-tooltip';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/primitives/select';\nimport { useDispatch } from '../entities/actions-context';\nimport { useAppContext, useAppDispatch } from '../core/app-context';\nimport { useCanMutate } from '../core/permissions';\nimport { useConfig } from '../core/config/config-context';\nimport { DataTableViewOptions } from './data-table-view-options';\nimport { DataTableSortedBy } from './data-table-sorted-by';\nimport { useEntityMutation } from '../graphql-client/use-entity-mutation';\nimport { getEntityDeleteMutation, getEntityDeleteWhere } from '../graphql-client/queries';\nimport { getEntityListQueryName, scheduleEntityListRemoval } from '../graphql-client/refetch-entity-lists';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isReloading?: boolean;\n onReload?: () => void;\n table: Table<TData>;\n}\n\nexport function DataTableToolbar<TData>({\n entityName,\n isReloading = false,\n onReload,\n table,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const appDispatch = useAppDispatch();\n const appContext = useAppContext();\n const apolloClient = useApolloClient();\n const { currentProject, currentProjectId } = useConfig();\n const schema = currentProject?.schema ?? [];\n const scopes = currentProject?.scopes;\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [isDeleting, setIsDeleting] = useState(false);\n const canMutate = useCanMutate();\n\n // Collect selected entity ids from the table\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const selectedIds: string[] = table.getSelectedRowModel().rows.map((row) => row.original._id as string);\n\n function handleCreate(): void {\n actionDispatch({ type: 'AddEntity', payload: { entityName } });\n }\n\n function handleScopeChange(value: string): void {\n appDispatch({ type: 'setScope', payload: { projectId: currentProjectId, scope: value } });\n }\n\n async function deleteSelected(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n\n const mutation = getEntityDeleteMutation(entityName, schema, ids);\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n\n setOptions({\n variables: { where: getEntityDeleteWhere(ids) },\n update(cache: { evict: (arg0: { id: string }) => void }) {\n for (const id of ids) {\n cache.evict({ id });\n }\n },\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n\n runMutation(true);\n });\n }\n\n function handleBatchDelete(): void {\n const itemLabel = entityName === '_asset' ? 'asset' : entityName.toLowerCase();\n\n actionDispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} ${itemLabel}${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected ${itemLabel}s? They will be deleted permanently.`\n : `Are you sure you want to delete the selected ${itemLabel}? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionSubmit: async () => {\n setIsDeleting(true);\n\n try {\n const idsToDelete = [...selectedIds];\n\n await deleteSelected(idsToDelete);\n\n table.resetRowSelection();\n // Drop rows immediately, then soft-refetch counts/pages.\n await scheduleEntityListRemoval(\n apolloClient,\n getEntityListQueryName(entityName, schema),\n idsToDelete\n );\n toast.success(idsToDelete.length > 1 ? 'Items successfully deleted.' : 'Item successfully deleted.');\n } catch {\n toast.error('Failed to delete selected items.');\n } finally {\n setIsDeleting(false);\n }\n },\n dialogActionCancel: () => {\n // no-op\n },\n },\n },\n });\n }\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n {scopes && scopes.length > 0 ? (\n <Select\n defaultValue={appContext.scope}\n onValueChange={(value) => {\n handleScopeChange(value);\n }}\n value={appContext.scope}\n >\n <SelectTrigger className=\"fk:w-48!\" id=\"project\" size=\"sm\">\n <span className=\"fk:text-muted-foreground\">Scope:</span>\n <SelectValue>\n {\n ((find(propEq(appContext.scope ?? '', 'name'))(scopes) as { name: string; label: string }) || null)\n ?.label\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {scopes.map((scopeItem) => (\n <SelectItem key={scopeItem.name} value={scopeItem.name}>\n {scopeItem.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n <DataTableViewOptions table={table} />\n {onReload ? (\n <Button\n aria-label=\"Reload\"\n className=\"fk:h-8\"\n disabled={isDeleting || isReloading}\n onClick={onReload}\n size=\"icon-sm\"\n variant=\"outline\"\n >\n <RefreshCw className={isReloading ? 'fk:animate-spin' : undefined} />\n </Button>\n ) : null}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:mr-2 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleBatchDelete}\n size=\"sm\"\n variant=\"destructive\"\n >\n {isDeleting ? (\n <Loader2 className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" />\n ) : (\n <Trash2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Delete ({selectedIds.length})\n </Button>\n </PermissionTooltip>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:ml-auto fk:h-8 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleCreate}\n size=\"sm\"\n variant=\"default\"\n >\n Create\n </Button>\n </PermissionTooltip>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data-grid/data-table-row-actions.tsx","../src/data-grid/data-table-view-options.tsx","../src/data-grid/data-table-toolbar.tsx"],"names":["DataTableRowActions","entityName","entityNamePlural","row","options","actionDispatch","useDispatch","canMutate","useCanMutate","entityId","canDelete","canEdit","handleEdit","handleDelete","jsxs","Button","jsx","PencilIcon","Trash2Icon","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DataTableViewOptions","table","Settings2","DropdownMenuLabel","column","DropdownMenuCheckboxItem","value","DataTableToolbar","isReloading","onReload","appDispatch","useAppDispatch","appContext","useAppContext","apolloClient","useApolloClient","currentProject","currentProjectId","useConfig","schema","scopes","runMutation","setMutation","setOptions","useEntityMutation","isDeleting","setIsDeleting","useState","selectedIds","handleCreate","handleScopeChange","deleteSelected","ids","mutation","getEntityDeleteMutation","resolve","reject","gql","getEntityDeleteWhere","cache","id","error","handleBatchDelete","itemLabel","idsToDelete","scheduleEntityListRemoval","getEntityListQueryName","toast","Select","SelectTrigger","SelectValue","find","propEq","SelectContent","scopeItem","SelectItem","RefreshCw","DataTableSortedBy","PermissionTooltip","Loader2","Trash2"],"mappings":"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","file":"chunk-NYKATVPZ.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Ellipsis, PencilIcon, Trash2Icon } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\nimport { useDispatch } from '../entities/actions-context';\nimport { useCanMutate } from '../core/permissions';\n\ninterface DataTableRowActionsProps<TData> {\n entityName: string;\n entityNamePlural: string;\n row: Row<TData>;\n options?: {\n canDelete?: boolean;\n canEdit?: boolean;\n };\n}\n\nexport function DataTableRowActions<TData>({\n entityName,\n entityNamePlural,\n row,\n options = { canDelete: true, canEdit: true },\n}: DataTableRowActionsProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const canMutate = useCanMutate();\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const entityId = row.original._id;\n // Read-only roles keep the pencil (the drawer doubles as their read view)\n // but lose the delete affordance entirely.\n const canDelete = (options.canDelete ?? true) && canMutate;\n const canEdit = options.canEdit ?? true;\n\n function handleEdit(): void {\n actionDispatch({ type: 'EditEntity', payload: { entityId, entityNamePlural } });\n }\n\n function handleDelete(): void {\n actionDispatch({ type: 'DeleteEntity', payload: { entityId, entityName } });\n }\n\n return (\n <div className=\"fk:flex\">\n {canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleEdit} variant=\"ghost\">\n <PencilIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Edit</span>\n </Button>\n )}\n {canDelete && !canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleDelete} variant=\"ghost\">\n <Trash2Icon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Delete</span>\n </Button>\n )}\n {canEdit && canDelete && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0\" variant=\"ghost\">\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Additional actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem onClick={handleEdit}>\n <PencilIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"fk:text-destructive\" onClick={handleDelete}>\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>): JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:hidden fk:h-8 fk:lg:flex\" size=\"sm\" variant=\"outline\">\n <Settings2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n checked={column.getIsVisible()}\n className=\"capitalize\"\n key={column.id}\n onCheckedChange={(value) => {\n column.toggleVisibility(Boolean(value));\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport type { Table } from '@tanstack/react-table';\nimport { Loader2, RefreshCw, Trash2 } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { toast } from 'sonner';\nimport { Button } from '../ui/primitives/button';\nimport { PermissionTooltip } from '../ui/components/permission-tooltip';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/primitives/select';\nimport { useDispatch } from '../entities/actions-context';\nimport { useAppContext, useAppDispatch } from '../core/app-context';\nimport { useCanMutate } from '../core/permissions';\nimport { useConfig } from '../core/config/config-context';\nimport { DataTableViewOptions } from './data-table-view-options';\nimport { DataTableSortedBy } from './data-table-sorted-by';\nimport { useEntityMutation } from '../graphql-client/use-entity-mutation';\nimport { getEntityDeleteMutation, getEntityDeleteWhere } from '../graphql-client/queries';\nimport { getEntityListQueryName, scheduleEntityListRemoval } from '../graphql-client/refetch-entity-lists';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isReloading?: boolean;\n onReload?: () => void;\n table: Table<TData>;\n}\n\nexport function DataTableToolbar<TData>({\n entityName,\n isReloading = false,\n onReload,\n table,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const appDispatch = useAppDispatch();\n const appContext = useAppContext();\n const apolloClient = useApolloClient();\n const { currentProject, currentProjectId } = useConfig();\n const schema = currentProject?.schema ?? [];\n const scopes = currentProject?.scopes;\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [isDeleting, setIsDeleting] = useState(false);\n const canMutate = useCanMutate();\n\n // Collect selected entity ids from the table\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const selectedIds: string[] = table.getSelectedRowModel().rows.map((row) => row.original._id as string);\n\n function handleCreate(): void {\n actionDispatch({ type: 'AddEntity', payload: { entityName } });\n }\n\n function handleScopeChange(value: string): void {\n appDispatch({ type: 'setScope', payload: { projectId: currentProjectId, scope: value } });\n }\n\n async function deleteSelected(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n\n const mutation = getEntityDeleteMutation(entityName, schema, ids);\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n\n setOptions({\n variables: { where: getEntityDeleteWhere(ids) },\n update(cache: { evict: (arg0: { id: string }) => void }) {\n for (const id of ids) {\n cache.evict({ id });\n }\n },\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n\n runMutation(true);\n });\n }\n\n function handleBatchDelete(): void {\n const itemLabel = entityName === '_asset' ? 'asset' : entityName.toLowerCase();\n\n actionDispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} ${itemLabel}${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected ${itemLabel}s? They will be deleted permanently.`\n : `Are you sure you want to delete the selected ${itemLabel}? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionSubmit: async () => {\n setIsDeleting(true);\n\n try {\n const idsToDelete = [...selectedIds];\n\n await deleteSelected(idsToDelete);\n\n table.resetRowSelection();\n // Drop rows immediately, then soft-refetch counts/pages.\n await scheduleEntityListRemoval(\n apolloClient,\n getEntityListQueryName(entityName, schema),\n idsToDelete\n );\n toast.success(idsToDelete.length > 1 ? 'Items successfully deleted.' : 'Item successfully deleted.');\n } catch {\n toast.error('Failed to delete selected items.');\n } finally {\n setIsDeleting(false);\n }\n },\n dialogActionCancel: () => {\n // no-op\n },\n },\n },\n });\n }\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n {scopes && scopes.length > 0 ? (\n <Select\n defaultValue={appContext.scope}\n onValueChange={(value) => {\n handleScopeChange(value);\n }}\n value={appContext.scope}\n >\n <SelectTrigger className=\"fk:w-48!\" id=\"project\" size=\"sm\">\n <span className=\"fk:text-muted-foreground\">Scope:</span>\n <SelectValue>\n {\n ((find(propEq(appContext.scope ?? '', 'name'))(scopes) as { name: string; label: string }) || null)\n ?.label\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {scopes.map((scopeItem) => (\n <SelectItem key={scopeItem.name} value={scopeItem.name}>\n {scopeItem.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n <DataTableViewOptions table={table} />\n {onReload ? (\n <Button\n aria-label=\"Reload\"\n className=\"fk:h-8\"\n disabled={isDeleting || isReloading}\n onClick={onReload}\n size=\"icon-sm\"\n variant=\"outline\"\n >\n <RefreshCw className={isReloading ? 'fk:animate-spin' : undefined} />\n </Button>\n ) : null}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:mr-2 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleBatchDelete}\n size=\"sm\"\n variant=\"destructive\"\n >\n {isDeleting ? (\n <Loader2 className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" />\n ) : (\n <Trash2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Delete ({selectedIds.length})\n </Button>\n </PermissionTooltip>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:ml-auto fk:h-8 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleCreate}\n size=\"sm\"\n variant=\"default\"\n >\n Create\n </Button>\n </PermissionTooltip>\n </div>\n );\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {g as g$1,f}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {g as g$1,f}from'./chunk-CKNFYN3O.js';import {a,b,c,e}from'./chunk-USNXQOMJ.js';import {b as b$1}from'./chunk-6NRQMG26.js';import {BellIcon}from'lucide-react';import {Link}from'react-router-dom';import v from'swr';import {jsx,jsxs}from'react/jsx-runtime';function g(t){let{data:o}=v(t?g$1(t).activitySummary():null,f,{refreshInterval:3e4});return o}function n(t){return t>99?"99+":t.toString()}function x({projectId:t}){let o=g(t),e$1=o?.needsActionCount??0,r=o?.unreadCount??0,f=e$1>0?`Activity: ${n(e$1)} waiting for you`:r>0?`Activity: ${n(r)} unread`:"Activity";return jsx(a,{children:jsxs(b,{children:[jsx(c,{asChild:true,children:jsx(b$1,{asChild:true,"aria-label":f,className:"fk:relative fk:h-8 fk:w-8 fk:rounded-full",size:"icon",variant:"ghost",children:jsxs(Link,{to:`/${t}/ai/activity`,children:[jsx(BellIcon,{className:"fk:size-4"}),e$1>0?jsx("span",{className:"fk:absolute fk:-right-1 fk:-top-1 fk:flex fk:h-4 fk:min-w-4 fk:items-center fk:justify-center fk:rounded-full fk:bg-amber-500 fk:px-1 fk:text-[0.625rem] fk:font-semibold fk:leading-none fk:text-white",children:n(e$1)}):r>0?jsx("span",{className:"fk:absolute fk:right-1 fk:top-1 fk:size-2 fk:rounded-full fk:bg-primary"}):null]})})}),jsx(e,{children:f})]})})}export{g as a,x as b};//# sourceMappingURL=chunk-PWQPA2QL.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-PWQPA2QL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/ai/activity-nav-button.tsx"],"names":["useActivitySummary","projectId","data","useSWR","paths","fetcher","formatCount","count","ActivityNavButton","summary","needsAction","unread","label","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","Button","Link","BellIcon","TooltipContent"],"mappings":"0RAaO,SAASA,CAAAA,CAAmBC,CAAAA,CAA4D,CAC7F,GAAM,CAAE,IAAA,CAAAC,CAAK,CAAA,CAAIC,EAAwBF,CAAAA,CAAYG,GAAAA,CAAMH,CAAS,CAAA,CAAE,iBAAgB,CAAI,IAAA,CAAMI,EAAS,CACvG,eAAA,CAAiB,GACnB,CAAC,CAAA,CAED,OAAOH,CACT,CAEA,SAASI,CAAAA,CAAYC,CAAAA,CAAuB,CAC1C,OAAOA,CAAAA,CAAQ,EAAA,CAAK,KAAA,CAAQA,CAAAA,CAAM,UACpC,CAGO,SAASC,CAAAA,CAAkB,CAAE,UAAAP,CAAU,CAAA,CAAuC,CACnF,IAAMQ,EAAUT,CAAAA,CAAmBC,CAAS,CAAA,CACtCS,GAAAA,CAAcD,GAAS,gBAAA,EAAoB,CAAA,CAC3CE,CAAAA,CAASF,CAAAA,EAAS,aAAe,CAAA,CACjCG,CAAAA,CACJF,IAAc,CAAA,CACV,CAAA,UAAA,EAAaJ,EAAYI,GAAW,CAAC,CAAA,gBAAA,CAAA,CACrCC,CAAAA,CAAS,EACP,CAAA,UAAA,EAAaL,CAAAA,CAAYK,CAAM,CAAC,UAChC,UAAA,CAER,OACEE,GAAAA,CAACC,CAAAA,CAAA,CACC,QAAA,CAAAC,IAAAA,CAACC,CAAAA,CAAA,CACC,UAAAH,GAAAA,CAACI,CAAAA,CAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAAJ,GAAAA,CAACK,GAAAA,CAAA,CAAO,QAAO,IAAA,CAAC,YAAA,CAAYN,CAAAA,CAAO,SAAA,CAAU,4CAA4C,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,CAC3G,QAAA,CAAAG,KAACI,IAAAA,CAAA,CAAK,EAAA,CAAI,CAAA,CAAA,EAAIlB,CAAS,CAAA,YAAA,CAAA,CACrB,QAAA,CAAA,CAAAY,GAAAA,CAACO,QAAAA,CAAA,CAAS,SAAA,CAAU,WAAA,CAAY,CAAA,CAC/BV,GAAAA,CAAc,EACbG,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,yMAAA,CACb,QAAA,CAAAP,EAAYI,GAAW,CAAA,CAC1B,CAAA,CACEC,CAAAA,CAAS,EACXE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,yEAAA,CAA0E,EACxF,IAAA,CAAA,CACN,CAAA,CACF,CAAA,CACF,CAAA,CACAA,IAACQ,CAAAA,CAAA,CAAgB,SAAAT,CAAAA,CAAM,CAAA,CAAA,CACzB,EACF,CAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/apps/ai/activity-nav-button.tsx"],"names":["useActivitySummary","projectId","data","useSWR","paths","fetcher","formatCount","count","ActivityNavButton","summary","needsAction","unread","label","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","Button","Link","BellIcon","TooltipContent"],"mappings":"0RAaO,SAASA,CAAAA,CAAmBC,CAAAA,CAA4D,CAC7F,GAAM,CAAE,IAAA,CAAAC,CAAK,CAAA,CAAIC,EAAwBF,CAAAA,CAAYG,GAAAA,CAAMH,CAAS,CAAA,CAAE,iBAAgB,CAAI,IAAA,CAAMI,EAAS,CACvG,eAAA,CAAiB,GACnB,CAAC,CAAA,CAED,OAAOH,CACT,CAEA,SAASI,CAAAA,CAAYC,CAAAA,CAAuB,CAC1C,OAAOA,CAAAA,CAAQ,EAAA,CAAK,KAAA,CAAQA,CAAAA,CAAM,UACpC,CAGO,SAASC,CAAAA,CAAkB,CAAE,UAAAP,CAAU,CAAA,CAAuC,CACnF,IAAMQ,EAAUT,CAAAA,CAAmBC,CAAS,CAAA,CACtCS,GAAAA,CAAcD,GAAS,gBAAA,EAAoB,CAAA,CAC3CE,CAAAA,CAASF,CAAAA,EAAS,aAAe,CAAA,CACjCG,CAAAA,CACJF,IAAc,CAAA,CACV,CAAA,UAAA,EAAaJ,EAAYI,GAAW,CAAC,CAAA,gBAAA,CAAA,CACrCC,CAAAA,CAAS,EACP,CAAA,UAAA,EAAaL,CAAAA,CAAYK,CAAM,CAAC,UAChC,UAAA,CAER,OACEE,GAAAA,CAACC,CAAAA,CAAA,CACC,QAAA,CAAAC,IAAAA,CAACC,CAAAA,CAAA,CACC,UAAAH,GAAAA,CAACI,CAAAA,CAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAAJ,GAAAA,CAACK,GAAAA,CAAA,CAAO,QAAO,IAAA,CAAC,YAAA,CAAYN,CAAAA,CAAO,SAAA,CAAU,4CAA4C,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,CAC3G,QAAA,CAAAG,KAACI,IAAAA,CAAA,CAAK,EAAA,CAAI,CAAA,CAAA,EAAIlB,CAAS,CAAA,YAAA,CAAA,CACrB,QAAA,CAAA,CAAAY,GAAAA,CAACO,QAAAA,CAAA,CAAS,SAAA,CAAU,WAAA,CAAY,CAAA,CAC/BV,GAAAA,CAAc,EACbG,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,yMAAA,CACb,QAAA,CAAAP,EAAYI,GAAW,CAAA,CAC1B,CAAA,CACEC,CAAAA,CAAS,EACXE,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,yEAAA,CAA0E,EACxF,IAAA,CAAA,CACN,CAAA,CACF,CAAA,CACF,CAAA,CACAA,IAACQ,CAAAA,CAAA,CAAgB,SAAAT,CAAAA,CAAM,CAAA,CAAA,CACzB,EACF,CAEJ","file":"chunk-PWQPA2QL.js","sourcesContent":["import type { JSX } from 'react';\nimport { BellIcon } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport useSWR from 'swr';\nimport { Button } from '../../ui/primitives/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { fetcher, paths } from './api';\nimport type { ActivitySummary } from './types';\n\n/**\n * The project's Activity badge counts. `ActivityNotifier` refreshes the same\n * SWR key on every poll, so every reader stays in sync with one request.\n */\nexport function useActivitySummary(projectId: string | undefined): ActivitySummary | undefined {\n const { data } = useSWR<ActivitySummary>(projectId ? paths(projectId).activitySummary() : null, fetcher, {\n refreshInterval: 30_000,\n });\n\n return data;\n}\n\nfunction formatCount(count: number): string {\n return count > 99 ? '99+' : count.toString();\n}\n\n/** Navbar shortcut to Activity, so pending items are visible from every app. */\nexport function ActivityNavButton({ projectId }: { projectId: string }): JSX.Element {\n const summary = useActivitySummary(projectId);\n const needsAction = summary?.needsActionCount ?? 0;\n const unread = summary?.unreadCount ?? 0;\n const label =\n needsAction > 0\n ? `Activity: ${formatCount(needsAction)} waiting for you`\n : unread > 0\n ? `Activity: ${formatCount(unread)} unread`\n : 'Activity';\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button asChild aria-label={label} className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" size=\"icon\" variant=\"ghost\">\n <Link to={`/${projectId}/ai/activity`}>\n <BellIcon className=\"fk:size-4\" />\n {needsAction > 0 ? (\n <span className=\"fk:absolute fk:-right-1 fk:-top-1 fk:flex fk:h-4 fk:min-w-4 fk:items-center fk:justify-center fk:rounded-full fk:bg-amber-500 fk:px-1 fk:text-[0.625rem] fk:font-semibold fk:leading-none fk:text-white\">\n {formatCount(needsAction)}\n </span>\n ) : unread > 0 ? (\n <span className=\"fk:absolute fk:right-1 fk:top-1 fk:size-2 fk:rounded-full fk:bg-primary\" />\n ) : null}\n </Link>\n </Button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"]}
|