@flexkit/desk 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,74 @@
1
+ <div align="center">
2
+ <a href="https://flexkit.io">
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://flexkit.io/public/logos/icon-dark-background.png">
5
+ <img alt="Flexkit logo" src="https://flexkit.io/public/logos/icon-light-background.png" height="128">
6
+ </picture>
7
+ </a>
8
+ <h1>Flexkit Desk</h1>
9
+
10
+ <a href="https://www.npmjs.com/package/@flexkit/desk"><img alt="NPM version" src="https://img.shields.io/npm/v/%40flexkit%2Fdesk?style=for-the-badge&labelColor=%23000000&color=%232563eb"></a>
11
+ <a href="https://github.com/flexkit-io/flexkit/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/npm/l/%40flexkit%2Fdesk?style=for-the-badge&labelColor=%23000000&color=%230ccf6a"></a>
12
+ <a href="https://github.com/orgs/flexkit-io/discussions"><img alt="Join the community on GitHub" src="https://img.shields.io/badge/Join%20the%20comunity-blue.svg?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgNDggNDgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgOEg0MVY0MEg3VjhaIiBmaWxsPSIjMDIwODE3Ij48L3BhdGg+PHBhdGggZD0iTTI0IDBDNDIgMCA0OCA2IDQ4IDI0QzQ4IDQyIDQyIDQ4IDI0IDQ4QzYgNDggMCA0MiAwIDI0QzAgNiA2IDAgMjQgMFpNMTcuNzQ5NCA5LjUyMzgxSDguNzYxOUwxOS4yODMzIDIzLjgzMTNMOC43NjE5IDM4LjcwNzhIMTcuNzQ5NEwyMS4wNDk5IDMzLjY2MzlWMTQuMjU0OUwxNy43NDk0IDkuNTIzODFaTTM4Ljk1NzcgOS41MjM4MUgyOS45NTQyTDI2LjI4NTcgMTQuODIyOVYzMy4wNDA2TDI5Ljk1NDIgMzguNzA3OEgzOC45NTc3TDI4LjM5MDggMjMuODMxM0wzOC45NTc3IDkuNTIzODFaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPjwvc3ZnPg==&labelColor=%23000000"></a>
13
+
14
+ </div>
15
+
16
+ **A plugin for Flexkit Studio that that powers the Desk experience, enabling developers and teams to browse entities, manage attributes, and perform CRUD operations on structured business data.**
17
+
18
+ ## Features
19
+
20
+ - Browse entities and their attributes
21
+ - Perform CRUD operations on entities
22
+ - Manage attributes of entities
23
+ - Manage relationships between entities
24
+ - Manage views of entities
25
+ - Manage filters on entities
26
+ - Manage sorts on entities
27
+
28
+ ![Screenshot](assets/screenshot.png)
29
+
30
+ ## Installation
31
+
32
+ ```shell
33
+ npm install @flexkit/desk
34
+ ```
35
+
36
+ ### Configuring
37
+
38
+ ```ts
39
+ // `flexkit.config.ts`:
40
+ import { defineConfig } from '@flexkit/studio';
41
+ import { Desk } from '@flexkit/desk';
42
+
43
+ export default defineConfig({
44
+ plugins: [Desk()],
45
+ });
46
+ ```
47
+
48
+ ## Contributing
49
+
50
+ Contributions to Flexkit are welcome and highly appreciated. However, before you jump right into it, we would like you to review our [Contribution Guidelines](/contributing.md) to make sure you have a smooth experience contributing to Flexkit.
51
+
52
+ ## Reporting Issues
53
+
54
+ Found a bug? Have a feature request?
55
+
56
+ Open an issue with:
57
+ • Repro steps
58
+ • Expected vs actual behavior
59
+ • Screenshots when helpful
60
+ • Schema snippet (if relevant)
61
+
62
+ ## License
63
+
64
+ This project is licensed under the **MIT license**.
65
+
66
+ See [LICENSE](https://github.com/flexkit-io/flexkit/blob/main/LICENSE) for more information.
67
+
68
+ ---
69
+
70
+ ## Security
71
+
72
+ If you believe you have found a security vulnerability in Flexkit, we encourage you to **_responsibly disclose this and NOT open a public issue_**.
73
+
74
+ Please email us at security@flexkit.io to report any security vulnerabilities.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {Layout}from'lucide-react';import {find,propEq}from'ramda';import {useParams,useLocation,useAppContext,useConfig,getEntitySchema,useEntityQuery,ProjectDisabled,SchemaError,Outlet,useAuth}from'@flexkit/studio';import {Tooltip,TooltipTrigger,SidebarTrigger,TooltipContent,Separator,SidebarProvider,Sidebar,SidebarInset,Skeleton}from'@flexkit/studio/ui';import {jsx,jsxs}from'react/jsx-runtime';import {useCallback}from'react';import {useGridColumnsDefinition,DataTable,DataTableToolbar,DataTableRowActions}from'@flexkit/studio/data-grid';var H="flexkit:sidebar:state";function x(){let[,t]=useAuth(),{projects:o,currentProjectId:r}=useConfig(),{schema:a,menuGroups:f}=find(propEq(r??"","projectId"))(o),u=document.cookie.split("; ").find(p=>p.startsWith(`${H}=`))?.split("=")[1]!=="false";return jsxs(SidebarProvider,{defaultOpen:u,children:[jsx(Sidebar,{schema:a,menuGroups:f}),jsx(SidebarInset,{children:jsx(Outlet,{})})]})}var c=25;function N(){let{entity:t}=useParams(),{search:o}=useLocation(),a=new URLSearchParams(o).get("id"),{scope:f}=useAppContext(),{projects:u,currentProjectId:p}=useConfig(),{schema:h}=find(propEq(p??"","projectId"))(u),n=getEntitySchema(h,t??""),y=useGridColumnsDefinition({attributesSchema:n?.attributes??[],actionsComponent:i=>ft({entityName:n?.name??"",entityNamePlural:t??"",row:i}),checkboxSelect:"multiple"}),C=a?{where:{_id:a}}:{options:{offset:0,limit:c}},{isLoading:l,fetchMore:b,count:d,data:s,isProjectDisabled:D}=useEntityQuery({entityNamePlural:t??"",schema:h,scope:f,variables:C}),E=useCallback(i=>{let S=s?.length??0;if(i&&d>0&&S>0){let{scrollHeight:w,scrollTop:A,clientHeight:I}=i;w-A-I<500&&!l&&S<d&&b({variables:{options:{offset:s?.length??0,limit:c}}});}},[d,s?.length,b,l]),T=Array(c).fill({}),v=ut(y);return D?jsx("div",{className:"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3",children:jsx(ProjectDisabled,{})}):jsxs("div",{className:"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3",children:[jsx(SchemaError,{}),jsxs("div",{className:"fk-flex fk-items-center fk-mb-4 fk-gap-2",children:[jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsx(SidebarTrigger,{className:"-fk-ml-1 fk-w-4 fk-h-4"})}),jsx(TooltipContent,{children:"Toggle Sidebar"})]}),jsx(Separator,{orientation:"vertical",className:"fk-h-4"}),jsx("h2",{className:"fk-text-lg fk-font-semibold fk-leading-none fk-tracking-tight",children:mt(n?.menu?.label??n?.plural??"")})]}),jsx(DataTable,{columns:l?v:y,data:l?T:s??[],entityName:n?.name??"",pageSize:c,onScroll:i=>{E(i.target);},toolbarComponent:i=>jsx(DataTableToolbar,{entityName:n?.name??"",table:i})}),jsx(Outlet,{})]})}function mt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function ft({entityName:t,entityNamePlural:o,row:r}){return jsx(DataTableRowActions,{entityName:t,entityNamePlural:o,row:r})}function ut(t){return t.map(o=>({...o,cell:()=>jsx(Skeleton,{className:"fk-h-4 fk-w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function P(){let{entity:t,id:o}=useParams();return jsxs("div",{className:"flex flex-col",children:["Edit ",t," with id: ",o]})}function Ot(){return {name:"flexkit.desk",contributes:{apps:[{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:jsx(x,{}),routes:[{path:"list/:entity",component:jsx(N,{}),children:[{path:"edit/:id",component:jsx(P,{})}]}]}]}}}export{Ot as Desk};//# sourceMappingURL=index.js.map
1
+ import'./index.css';import {Layout}from'lucide-react';import {find,propEq}from'ramda';import {useParams,useLocation,useAppContext,useConfig,getEntitySchema,useGridColumnsDefinition,useEntityQuery,ProjectDisabled,SchemaError,DataTable,DataTableToolbar,Outlet,useAuth,DataTableRowActions}from'@flexkit/studio';import {Tooltip,TooltipTrigger,SidebarTrigger,TooltipContent,Separator,SidebarProvider,Sidebar,SidebarInset,Skeleton}from'@flexkit/studio/ui';import {jsx,jsxs}from'react/jsx-runtime';import {useCallback}from'react';var H="flexkit:sidebar:state";function x(){let[,t]=useAuth(),{projects:o,currentProjectId:r}=useConfig(),{schema:a,menuGroups:f}=find(propEq(r??"","projectId"))(o),u=document.cookie.split("; ").find(p=>p.startsWith(`${H}=`))?.split("=")[1]!=="false";return jsxs(SidebarProvider,{defaultOpen:u,children:[jsx(Sidebar,{schema:a,menuGroups:f}),jsx(SidebarInset,{children:jsx(Outlet,{})})]})}var c=25;function N(){let{entity:t}=useParams(),{search:o}=useLocation(),a=new URLSearchParams(o).get("id"),{scope:f}=useAppContext(),{projects:u,currentProjectId:p}=useConfig(),{schema:h}=find(propEq(p??"","projectId"))(u),n=getEntitySchema(h,t??""),y=useGridColumnsDefinition({attributesSchema:n?.attributes??[],actionsComponent:i=>ft({entityName:n?.name??"",entityNamePlural:t??"",row:i}),checkboxSelect:"multiple"}),C=a?{where:{_id:a}}:{options:{offset:0,limit:c}},{isLoading:l,fetchMore:b,count:d,data:s,isProjectDisabled:D}=useEntityQuery({entityNamePlural:t??"",schema:h,scope:f,variables:C}),E=useCallback(i=>{let S=s?.length??0;if(i&&d>0&&S>0){let{scrollHeight:w,scrollTop:A,clientHeight:I}=i;w-A-I<500&&!l&&S<d&&b({variables:{options:{offset:s?.length??0,limit:c}}});}},[d,s?.length,b,l]),T=Array(c).fill({}),v=ut(y);return D?jsx("div",{className:"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3",children:jsx(ProjectDisabled,{})}):jsxs("div",{className:"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3",children:[jsx(SchemaError,{}),jsxs("div",{className:"fk-flex fk-items-center fk-mb-4 fk-gap-2",children:[jsxs(Tooltip,{children:[jsx(TooltipTrigger,{asChild:true,children:jsx(SidebarTrigger,{className:"-fk-ml-1 fk-w-4 fk-h-4"})}),jsx(TooltipContent,{children:"Toggle Sidebar"})]}),jsx(Separator,{orientation:"vertical",className:"fk-h-4"}),jsx("h2",{className:"fk-text-lg fk-font-semibold fk-leading-none fk-tracking-tight",children:mt(n?.menu?.label??n?.plural??"")})]}),jsx(DataTable,{columns:l?v:y,data:l?T:s??[],entityName:n?.name??"",pageSize:c,onScroll:i=>{E(i.target);},toolbarComponent:i=>jsx(DataTableToolbar,{entityName:n?.name??"",table:i})}),jsx(Outlet,{})]})}function mt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function ft({entityName:t,entityNamePlural:o,row:r}){return jsx(DataTableRowActions,{entityName:t,entityNamePlural:o,row:r})}function ut(t){return t.map(o=>({...o,cell:()=>jsx(Skeleton,{className:"fk-h-4 fk-w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}function P(){let{entity:t,id:o}=useParams();return jsxs("div",{className:"flex flex-col",children:["Edit ",t," with id: ",o]})}function jt(){return {name:"flexkit.desk",contributes:{apps:[{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:jsx(x,{}),routes:[{path:"list/:entity",component:jsx(N,{}),children:[{path:"edit/:id",component:jsx(P,{})}]}]}]}}}export{jt as Desk};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/root.tsx","../src/list.tsx","../src/edit-entity.tsx","../src/index.tsx"],"names":["SIDEBAR_COOKIE_NAME","Root","auth","useAuth","projects","currentProjectId","useConfig","schema","menuGroups","find","propEq","defaultOpen","row","jsxs","SidebarProvider","jsx","Sidebar","SidebarInset","Outlet","pageSize","List","entityName","useParams","search","useLocation","entityId","scope","useAppContext","entitySchema","getEntitySchema","columnsDefinition","useGridColumnsDefinition","dataRowActions","variables","isLoading","fetchMore","count","data","isProjectDisabled","useEntityQuery","fetchMoreOnBottomReached","useCallback","containerRefElement","rowsCount","scrollHeight","scrollTop","clientHeight","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","Tooltip","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","capitalize","DataTable","e","table","DataTableToolbar","str","entityNamePlural","DataTableRowActions","columns","column","Skeleton","EditEntity","entity","id","Desk","LayoutIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { find, propEq } from 'ramda';\nimport { Outlet, useAuth, useConfig } from '@flexkit/studio';\nimport { Sidebar, SidebarInset, SidebarProvider } from '@flexkit/studio/ui';\nimport type { SingleProject } from '@flexkit/studio';\n\nconst SIDEBAR_COOKIE_NAME = 'flexkit:sidebar:state';\n\nexport function Root(): JSX.Element {\n const [, auth] = useAuth();\n const { projects, currentProjectId } = useConfig();\n const { schema, menuGroups } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const defaultOpen =\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${SIDEBAR_COOKIE_NAME}=`))\n ?.split('=')[1] !== 'false';\n\n return (\n <SidebarProvider defaultOpen={defaultOpen}>\n <Sidebar schema={schema} menuGroups={menuGroups} />\n <SidebarInset>\n <Outlet />\n </SidebarInset>\n </SidebarProvider>\n );\n}\n","import { useCallback } from 'react';\nimport { find, propEq } from 'ramda';\nimport {\n getEntitySchema,\n useAppContext,\n useConfig,\n useLocation,\n useParams,\n Outlet,\n useEntityQuery,\n ProjectDisabled,\n SchemaError,\n} from '@flexkit/studio';\nimport { Skeleton, SidebarTrigger, Separator, Tooltip, TooltipContent, TooltipTrigger } from '@flexkit/studio/ui';\nimport type { ColumnDef, SingleProject, Row } from '@flexkit/studio';\nimport { DataTable, DataTableRowActions, DataTableToolbar, useGridColumnsDefinition } from '@flexkit/studio/data-grid';\n\nconst pageSize = 25;\n\nexport function List(): JSX.Element {\n const { entity: entityName } = useParams();\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { projects, currentProjectId } = useConfig();\n const { schema } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const entitySchema = getEntitySchema(schema, entityName ?? '');\n const columnsDefinition = useGridColumnsDefinition({\n attributesSchema: entitySchema?.attributes ?? [],\n actionsComponent: (row) =>\n dataRowActions({ entityName: entitySchema?.name ?? '', entityNamePlural: entityName ?? '', row }),\n checkboxSelect: 'multiple',\n });\n\n const variables = entityId ? { where: { _id: entityId } } : { options: { offset: 0, limit: pageSize } };\n\n const { isLoading, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n });\n\n // called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useCallback(\n (containerRefElement?: HTMLDivElement | null) => {\n const rowsCount = data?.length ?? 0;\n\n if (containerRefElement && count > 0 && rowsCount > 0) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (scrollHeight - scrollTop - clientHeight < 500 && !isLoading && rowsCount < count) {\n fetchMore({\n variables: {\n options: {\n offset: data?.length ?? 0,\n limit: pageSize,\n },\n },\n });\n }\n }\n },\n [count, data?.length, fetchMore, isLoading]\n );\n\n const loadingData = Array(pageSize).fill({});\n const loadingColumns = getLoadingColumns(columnsDefinition);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3\">\n <SchemaError />\n <div className=\"fk-flex fk-items-center fk-mb-4 fk-gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-fk-ml-1 fk-w-4 fk-h-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk-h-4\" />\n <h2 className=\"fk-text-lg fk-font-semibold fk-leading-none fk-tracking-tight\">\n {capitalize(entitySchema?.menu?.label ?? entitySchema?.plural ?? '')}\n </h2>\n </div>\n <DataTable\n columns={isLoading ? loadingColumns : columnsDefinition}\n data={isLoading ? loadingData : (data ?? [])}\n entityName={entitySchema?.name ?? ''}\n pageSize={pageSize}\n onScroll={(e) => {\n fetchMoreOnBottomReached(e.target as HTMLDivElement);\n }}\n toolbarComponent={(table) => <DataTableToolbar entityName={entitySchema?.name ?? ''} table={table} />}\n />\n <Outlet />\n </div>\n );\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\ntype AttributeValue = {\n _id: string;\n [key: string]: string | AttributeValue | null;\n __typename: string;\n};\n\ntype DataRowActions = {\n entityName: string;\n entityNamePlural: string;\n row: Row<AttributeValue>;\n};\n\nfunction dataRowActions({ entityName, entityNamePlural, row }: DataRowActions): JSX.Element {\n return <DataTableRowActions entityName={entityName} entityNamePlural={entityNamePlural} row={row} />;\n}\n\nfunction getLoadingColumns(columns: object[]): ColumnDef<AttributeValue>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk-h-4 fk-w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n })) as unknown as ColumnDef<AttributeValue>[];\n}\n","import { useParams } from '@flexkit/studio';\n\nexport function EditEntity(): JSX.Element {\n const { entity, id } = useParams();\n\n // Not used, left here as an example of how to nest routes in plugins (see ./index.tsx file)\n return (\n <div className=\"flex flex-col\">\n Edit {entity} with id: {id}\n </div>\n );\n}\n","import { Layout as LayoutIcon } from 'lucide-react';\nimport type { PluginOptions } from '@flexkit/studio';\nimport { Root } from './root';\nimport { List } from './list';\nimport { EditEntity } from './edit-entity';\n\nexport function Desk(): PluginOptions {\n return {\n name: 'flexkit.desk',\n contributes: {\n apps: [\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: <Root />,\n routes: [\n {\n path: 'list/:entity',\n component: <List />,\n children: [\n {\n path: 'edit/:id',\n component: <EditEntity />, // Not used, left here as an example of how to nest routes in plugins\n },\n ],\n },\n ],\n },\n ],\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/root.tsx","../src/list.tsx","../src/edit-entity.tsx","../src/index.tsx"],"names":["SIDEBAR_COOKIE_NAME","Root","auth","useAuth","projects","currentProjectId","useConfig","schema","menuGroups","find","propEq","defaultOpen","row","jsxs","SidebarProvider","jsx","Sidebar","SidebarInset","Outlet","pageSize","List","entityName","useParams","search","useLocation","entityId","scope","useAppContext","entitySchema","getEntitySchema","columnsDefinition","useGridColumnsDefinition","dataRowActions","variables","isLoading","fetchMore","count","data","isProjectDisabled","useEntityQuery","fetchMoreOnBottomReached","useCallback","containerRefElement","rowsCount","scrollHeight","scrollTop","clientHeight","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","Tooltip","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","capitalize","DataTable","e","table","DataTableToolbar","str","entityNamePlural","DataTableRowActions","columns","column","Skeleton","EditEntity","entity","id","Desk","LayoutIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { find, propEq } from 'ramda';\nimport { Outlet, useAuth, useConfig } from '@flexkit/studio';\nimport { Sidebar, SidebarInset, SidebarProvider } from '@flexkit/studio/ui';\nimport type { SingleProject } from '@flexkit/studio';\n\nconst SIDEBAR_COOKIE_NAME = 'flexkit:sidebar:state';\n\nexport function Root(): JSX.Element {\n const [, auth] = useAuth();\n const { projects, currentProjectId } = useConfig();\n const { schema, menuGroups } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const defaultOpen =\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${SIDEBAR_COOKIE_NAME}=`))\n ?.split('=')[1] !== 'false';\n\n return (\n <SidebarProvider defaultOpen={defaultOpen}>\n <Sidebar schema={schema} menuGroups={menuGroups} />\n <SidebarInset>\n <Outlet />\n </SidebarInset>\n </SidebarProvider>\n );\n}\n","import { useCallback } from 'react';\nimport { find, propEq } from 'ramda';\nimport {\n getEntitySchema,\n useAppContext,\n useConfig,\n useLocation,\n useParams,\n Outlet,\n useEntityQuery,\n ProjectDisabled,\n SchemaError,\n DataTable,\n DataTableRowActions,\n DataTableToolbar,\n useGridColumnsDefinition,\n} from '@flexkit/studio';\nimport { Skeleton, SidebarTrigger, Separator, Tooltip, TooltipContent, TooltipTrigger } from '@flexkit/studio/ui';\nimport type { ColumnDef, SingleProject, Row } from '@flexkit/studio';\n\nconst pageSize = 25;\n\nexport function List(): JSX.Element {\n const { entity: entityName } = useParams();\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { projects, currentProjectId } = useConfig();\n const { schema } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const entitySchema = getEntitySchema(schema, entityName ?? '');\n const columnsDefinition = useGridColumnsDefinition({\n attributesSchema: entitySchema?.attributes ?? [],\n actionsComponent: (row) =>\n dataRowActions({ entityName: entitySchema?.name ?? '', entityNamePlural: entityName ?? '', row }),\n checkboxSelect: 'multiple',\n });\n\n const variables = entityId ? { where: { _id: entityId } } : { options: { offset: 0, limit: pageSize } };\n\n const { isLoading, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n });\n\n // called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useCallback(\n (containerRefElement?: HTMLDivElement | null) => {\n const rowsCount = data?.length ?? 0;\n\n if (containerRefElement && count > 0 && rowsCount > 0) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (scrollHeight - scrollTop - clientHeight < 500 && !isLoading && rowsCount < count) {\n fetchMore({\n variables: {\n options: {\n offset: data?.length ?? 0,\n limit: pageSize,\n },\n },\n });\n }\n }\n },\n [count, data?.length, fetchMore, isLoading]\n );\n\n const loadingData = Array(pageSize).fill({});\n const loadingColumns = getLoadingColumns(columnsDefinition);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk-flex fk-flex-col fk-h-full fk-px-4 fk-py-3\">\n <SchemaError />\n <div className=\"fk-flex fk-items-center fk-mb-4 fk-gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-fk-ml-1 fk-w-4 fk-h-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk-h-4\" />\n <h2 className=\"fk-text-lg fk-font-semibold fk-leading-none fk-tracking-tight\">\n {capitalize(entitySchema?.menu?.label ?? entitySchema?.plural ?? '')}\n </h2>\n </div>\n <DataTable\n columns={isLoading ? loadingColumns : columnsDefinition}\n data={isLoading ? loadingData : (data ?? [])}\n entityName={entitySchema?.name ?? ''}\n pageSize={pageSize}\n onScroll={(e) => {\n fetchMoreOnBottomReached(e.target as HTMLDivElement);\n }}\n toolbarComponent={(table) => <DataTableToolbar entityName={entitySchema?.name ?? ''} table={table} />}\n />\n <Outlet />\n </div>\n );\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\ntype AttributeValue = {\n _id: string;\n [key: string]: string | AttributeValue | null;\n __typename: string;\n};\n\ntype DataRowActions = {\n entityName: string;\n entityNamePlural: string;\n row: Row<AttributeValue>;\n};\n\nfunction dataRowActions({ entityName, entityNamePlural, row }: DataRowActions): JSX.Element {\n return <DataTableRowActions entityName={entityName} entityNamePlural={entityNamePlural} row={row} />;\n}\n\nfunction getLoadingColumns(columns: object[]): ColumnDef<AttributeValue>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk-h-4 fk-w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n })) as unknown as ColumnDef<AttributeValue>[];\n}\n","import { useParams } from '@flexkit/studio';\n\nexport function EditEntity(): JSX.Element {\n const { entity, id } = useParams();\n\n // Not used, left here as an example of how to nest routes in plugins (see ./index.tsx file)\n return (\n <div className=\"flex flex-col\">\n Edit {entity} with id: {id}\n </div>\n );\n}\n","import { Layout as LayoutIcon } from 'lucide-react';\nimport type { PluginOptions } from '@flexkit/studio';\nimport { Root } from './root';\nimport { List } from './list';\nimport { EditEntity } from './edit-entity';\n\nexport function Desk(): PluginOptions {\n return {\n name: 'flexkit.desk',\n contributes: {\n apps: [\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: <Root />,\n routes: [\n {\n path: 'list/:entity',\n component: <List />,\n children: [\n {\n path: 'edit/:id',\n component: <EditEntity />, // Not used, left here as an example of how to nest routes in plugins\n },\n ],\n },\n ],\n },\n ],\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,10 +1,19 @@
1
1
  {
2
2
  "name": "@flexkit/desk",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
+ "description": "Core Flexkit Studio plugin that powers the main interface for browsing entities, managing attributes, and performing CRUD operations on structured business data.",
5
+ "keywords": [
6
+ "flexkit",
7
+ "studio",
8
+ "react",
9
+ "node",
10
+ "desk",
11
+ "flexkit-plugin"
12
+ ],
4
13
  "type": "module",
5
14
  "main": "./dist/index.js",
6
15
  "style": "dist/index.css",
7
- "module": "./dist/index.mjs",
16
+ "module": "./dist/index.js",
8
17
  "types": "./dist/index.d.ts",
9
18
  "license": "MIT",
10
19
  "repository": {
@@ -25,7 +34,9 @@
25
34
  ]
26
35
  }
27
36
  },
28
- "sideEffects": false,
37
+ "sideEffects": [
38
+ "**/*.css"
39
+ ],
29
40
  "files": [
30
41
  "dist/**"
31
42
  ],
@@ -42,28 +53,28 @@
42
53
  "tailwindcss": "3.4.10",
43
54
  "tsup": "8.5.0",
44
55
  "typescript": "^5.3.3",
56
+ "@flexkit/studio": "0.0.7",
45
57
  "eslint-config-custom": "0.0.0",
46
58
  "tailwind-config": "0.0.1",
47
- "@flexkit/studio": "0.0.6",
48
59
  "tsconfig": "0.0.0"
49
60
  },
50
61
  "dependencies": {
51
62
  "debug": "^4.3.4",
52
- "lucide-react": "0.544.0",
63
+ "lucide-react": "0.555.0",
53
64
  "ramda": "^0.29.1",
54
65
  "swr": "^2.2.4"
55
66
  },
56
67
  "peerDependencies": {
57
68
  "react": "^18.0.0 || ^19.0.0",
58
69
  "react-dom": "^18.0.0 || ^19.0.0",
59
- "@flexkit/studio": "0.0.6"
70
+ "@flexkit/studio": "0.0.7"
60
71
  },
61
72
  "publishConfig": {
62
73
  "access": "public"
63
74
  },
64
75
  "scripts": {
65
- "build": "tsup src/index.tsx --format esm --dts --external react && tailwindcss -i ./src/styles.css -o dist/index.css",
66
- "dev": "tsup src/index.tsx --format esm --watch --dts --external react && tailwindcss -i ./src/styles.css -o ./dist/index.css --watch",
76
+ "build": "tailwindcss -i ./src/styles.css -o dist/index.css && tsup src/index.tsx --format esm --dts --external react",
77
+ "dev": "tailwindcss -i ./src/styles.css -o ./dist/index.css --watch & tsup src/index.tsx --format esm --watch --dts --external react",
67
78
  "lint": "eslint \"src/**/*.ts*\"",
68
79
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
69
80
  }