@flexkit/studio 0.0.32 → 0.0.33

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.
@@ -1,2 +1,2 @@
1
- import'./index.css';import {f}from'./chunk-QSROLDUU.js';import {b}from'./chunk-XFY7MZJN.js';import {n,w,r,q,s,u,b as b$2}from'./chunk-KHPTVIYT.js';import {a,d,c,e,g}from'./chunk-XU2JGXYC.js';import'./chunk-5FHCSAK2.js';import'./chunk-WDRCARCP.js';import {b as b$1}from'./chunk-EYGOJ2ZN.js';import'./chunk-WIUPQHZ5.js';import {a as a$1}from'./chunk-O2QMYUPS.js';import {useState,useMemo,useRef}from'react';import {LoaderCircle,Search,X}from'lucide-react';import {Command}from'cmdk';import {useNavigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';var i="all";function ee(r){let n=r.replace(/([A-Z])/g," $1");return n.charAt(0).toUpperCase()+n.slice(1).trim()}function te(r){return r.filter(n=>n.attributes.some(a=>a.searchable))}function re(r,n){return n===i?r.map(a=>a.plural):r.filter(a=>a.plural===n).map(a=>a.plural)}function ne(r,n){return n===i?i:r.some(a=>a.plural===n)?n:i}function ae(r,n){return {searchRequests:{searches:r.map(a=>({collection:a}))},commonParams:{q:n}}}function oe(r){return r.menu?.label??ee(r.plural)}function be({onSelect:r$1,searchPlaceholder:n$1="Search...",noResultsMsg:a$2="Nothing found",className:V,onSearchChange:y,projectId:D,schema:v}){let[G,l]=useState(false),[s$1,S]=useState(""),[M,X$1]=useState(i),f$1=useMemo(()=>te(v),[v]),m=ne(f$1,M),C=useMemo(()=>re(f$1,m),[f$1,m]),j=useMemo(()=>ae(C,s$1),[C,s$1]),u$1=useRef(null),{results:k,isLoading:d$1}=f(D,j),z=G&&(k.length>0||!d$1),F=useNavigate();function J(e){S(e),e.length>0&&l(true),e.length===0&&l(false),y&&y(e);}function U(e){X$1(e),s$1.length>0&&l(true);}function q$1(){S(""),l(false),u$1.current&&(u$1.current.value="");let e=new URL(window.location.href);e.searchParams.has("id")&&(e.searchParams.delete("id"),F(e.pathname+e.search));}return jsxs(b,{children:[jsxs(a,{onValueChange:U,value:m,children:[jsx(d,{"aria-label":"Filter search by entity",className:"fk:w-36 fk:h-9 fk:py-1 fk:rounded-r-none fk:border-border fk:shadow-none",children:jsx(c,{})}),jsxs(e,{children:[jsx(g,{value:i,children:"All"}),f$1.map(e=>jsx(g,{value:e.plural,children:oe(e)},e.plural))]})]}),jsxs(n,{className:"fk:relative fk:overflow-visible fk:h-auto fk:justify-center fk:rounded-none fk:bg-transparent",onBlur:()=>{setTimeout(()=>{l(false);},300);},onKeyDown:e=>{e.key==="Escape"&&(e.preventDefault(),l(false));},shouldFilter:false,children:[jsxs("div",{className:a$1("fk:flex fk:items-center fk:border-y fk:border-r fk:border-border fk:rounded-r-md fk:bg-background fk:pl-3 fk:pr-2 fk:h-9 fk:md:w-25 fk:lg:w-75","fk:outline-none fk:transition-[color,box-shadow] fk:has-[input:focus-visible]:border-ring fk:has-[input:focus-visible]:ring-[3px] fk:has-[input:focus-visible]:ring-ring/50"),children:[d$1?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin"}):jsx(Search,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50"}),jsx(Command.Input,{className:a$1("fk:flex fk:h-9 fk:w-full fk:rounded-none fk:bg-transparent fk:py-1 fk:text-sm fk:outline-hidden fk:placeholder:text-muted-foreground fk:disabled:cursor-not-allowed fk:disabled:opacity-50",V),placeholder:n$1,onMouseDown:()=>{(u$1.current?.value.length??0)>0&&l(true);},onValueChange:J,ref:u$1,value:s$1}),s$1&&jsx(b$1,{"aria-label":"Clear search",className:"fk:flex fk:items-center fk:justify-center fk:ml-2 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent",onClick:q$1,type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})})]}),jsx("div",{className:"fk:relative fk:max-w-150",children:jsx("div",{className:a$1("fk:mt-1 fk:animate-in fk:fade-in-0 fk:zoom-in-95 fk:absolute fk:top-0 fk:z-50 fk:w-full fk:rounded-md fk:bg-popover fk:outline-hidden fk:drop-shadow-md fk:border fk:border-border",z?"fk:block":"fk:hidden"),children:jsxs(w,{className:"fk:max-h-55 fk:overflow-auto",children:[!d$1&&jsx(r,{children:a$2}),jsx(q,{children:jsxs(s,{children:[k.length>0&&jsx(u,{"aria-hidden":"true",className:"fk:hidden!",value:"-"}),k.map(e=>jsxs(u,{className:"fk:flex",value:e._id,onSelect:H=>{r$1({entityName:e._entityName,entityNamePlural:e._entityNamePlural,entityId:H});},children:[jsx("span",{className:"fk:basis-full",children:e[Object.keys(e)[3]]}),jsx(b$2,{className:"fk:py-px fk:text-[0.6875rem] fk:leading-3 fk:bg-teal-400",children:e._entityName})]},e._id))]})})]})})})]})]})}export{be as Search};//# sourceMappingURL=search-X5V3YOTZ.js.map
2
- //# sourceMappingURL=search-X5V3YOTZ.js.map
1
+ import'./index.css';import {f}from'./chunk-MLYKIVZC.js';import {b}from'./chunk-XFY7MZJN.js';import {n,w,r,q,s,u,b as b$2}from'./chunk-KHPTVIYT.js';import {a,d,c,e,g}from'./chunk-XU2JGXYC.js';import'./chunk-2OBWJ6UY.js';import'./chunk-WDRCARCP.js';import {b as b$1}from'./chunk-EYGOJ2ZN.js';import'./chunk-WIUPQHZ5.js';import {a as a$1}from'./chunk-O2QMYUPS.js';import {useState,useMemo,useRef}from'react';import {LoaderCircle,Search,X}from'lucide-react';import {Command}from'cmdk';import {useNavigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';var i="all";function ee(r){let n=r.replace(/([A-Z])/g," $1");return n.charAt(0).toUpperCase()+n.slice(1).trim()}function te(r){return r.filter(n=>n.attributes.some(a=>a.searchable))}function re(r,n){return n===i?r.map(a=>a.plural):r.filter(a=>a.plural===n).map(a=>a.plural)}function ne(r,n){return n===i?i:r.some(a=>a.plural===n)?n:i}function ae(r,n){return {searchRequests:{searches:r.map(a=>({collection:a}))},commonParams:{q:n}}}function oe(r){return r.menu?.label??ee(r.plural)}function be({onSelect:r$1,searchPlaceholder:n$1="Search...",noResultsMsg:a$2="Nothing found",className:V,onSearchChange:y,projectId:D,schema:v}){let[G,l]=useState(false),[s$1,S]=useState(""),[M,X$1]=useState(i),f$1=useMemo(()=>te(v),[v]),m=ne(f$1,M),C=useMemo(()=>re(f$1,m),[f$1,m]),j=useMemo(()=>ae(C,s$1),[C,s$1]),u$1=useRef(null),{results:k,isLoading:d$1}=f(D,j),z=G&&(k.length>0||!d$1),F=useNavigate();function J(e){S(e),e.length>0&&l(true),e.length===0&&l(false),y&&y(e);}function U(e){X$1(e),s$1.length>0&&l(true);}function q$1(){S(""),l(false),u$1.current&&(u$1.current.value="");let e=new URL(window.location.href);e.searchParams.has("id")&&(e.searchParams.delete("id"),F(e.pathname+e.search));}return jsxs(b,{children:[jsxs(a,{onValueChange:U,value:m,children:[jsx(d,{"aria-label":"Filter search by entity",className:"fk:w-36 fk:h-9 fk:py-1 fk:rounded-r-none fk:border-border fk:shadow-none",children:jsx(c,{})}),jsxs(e,{children:[jsx(g,{value:i,children:"All"}),f$1.map(e=>jsx(g,{value:e.plural,children:oe(e)},e.plural))]})]}),jsxs(n,{className:"fk:relative fk:overflow-visible fk:h-auto fk:justify-center fk:rounded-none fk:bg-transparent",onBlur:()=>{setTimeout(()=>{l(false);},300);},onKeyDown:e=>{e.key==="Escape"&&(e.preventDefault(),l(false));},shouldFilter:false,children:[jsxs("div",{className:a$1("fk:flex fk:items-center fk:border-y fk:border-r fk:border-border fk:rounded-r-md fk:bg-background fk:pl-3 fk:pr-2 fk:h-9 fk:md:w-25 fk:lg:w-75","fk:outline-none fk:transition-[color,box-shadow] fk:has-[input:focus-visible]:border-ring fk:has-[input:focus-visible]:ring-[3px] fk:has-[input:focus-visible]:ring-ring/50"),children:[d$1?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin"}):jsx(Search,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50"}),jsx(Command.Input,{className:a$1("fk:flex fk:h-9 fk:w-full fk:rounded-none fk:bg-transparent fk:py-1 fk:text-sm fk:outline-hidden fk:placeholder:text-muted-foreground fk:disabled:cursor-not-allowed fk:disabled:opacity-50",V),placeholder:n$1,onMouseDown:()=>{(u$1.current?.value.length??0)>0&&l(true);},onValueChange:J,ref:u$1,value:s$1}),s$1&&jsx(b$1,{"aria-label":"Clear search",className:"fk:flex fk:items-center fk:justify-center fk:ml-2 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent",onClick:q$1,type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})})]}),jsx("div",{className:"fk:relative fk:max-w-150",children:jsx("div",{className:a$1("fk:mt-1 fk:animate-in fk:fade-in-0 fk:zoom-in-95 fk:absolute fk:top-0 fk:z-50 fk:w-full fk:rounded-md fk:bg-popover fk:outline-hidden fk:drop-shadow-md fk:border fk:border-border",z?"fk:block":"fk:hidden"),children:jsxs(w,{className:"fk:max-h-55 fk:overflow-auto",children:[!d$1&&jsx(r,{children:a$2}),jsx(q,{children:jsxs(s,{children:[k.length>0&&jsx(u,{"aria-hidden":"true",className:"fk:hidden!",value:"-"}),k.map(e=>jsxs(u,{className:"fk:flex",value:e._id,onSelect:H=>{r$1({entityName:e._entityName,entityNamePlural:e._entityNamePlural,entityId:H});},children:[jsx("span",{className:"fk:basis-full",children:e[Object.keys(e)[3]]}),jsx(b$2,{className:"fk:py-px fk:text-[0.6875rem] fk:leading-3 fk:bg-teal-400",children:e._entityName})]},e._id))]})})]})})})]})]})}export{be as Search};//# sourceMappingURL=search-FTC7ELZX.js.map
2
+ //# sourceMappingURL=search-FTC7ELZX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/components/search.tsx"],"names":["ALL_COLLECTIONS","capitalize","str","withSpaces","getSearchableEntities","schema","entity","attr","getCollections","entities","selectedCollection","resolveCollection","buildSearchRequest","collections","q","collection","entityLabel","Search","onSelect","searchPlaceholder","noResultsMsg","className","onSearchChange","projectId","isOpen","setIsOpen","useState","inputValue","setInputValue","setSelectedCollection","searchableEntities","useMemo","resolvedCollection","searchQuery","inputRef","useRef","results","isLoading","useSearch","showDropdown","navigate","useNavigate","handleOnSearchChange","handleEntityChange","value","handleClear","url","jsxs","ButtonGroup","Select","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem","Command","cn","LoaderCircle","SearchIcon","CommandPrimitive","Button","XIcon","ScrollArea","CommandEmpty","CommandList","CommandGroup","CommandItem","item","entityId","Badge"],"mappings":"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","file":"search-X5V3YOTZ.js","sourcesContent":["'use client';\n\nimport { useRef, useState, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { LoaderCircle, Search as SearchIcon, X as XIcon } from 'lucide-react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { useNavigate } from 'react-router-dom';\nimport { useSearch } from '../../core/use-search';\nimport { cn } from '../lib/utils';\nimport { Badge } from '../primitives/badge';\nimport { Button } from '../primitives/button';\nimport { ButtonGroup } from '../primitives/button-group';\nimport { Command, CommandEmpty, CommandGroup, CommandItem, CommandList } from '../primitives/command';\nimport { ScrollArea } from '../primitives/scroll-area';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../primitives/select';\nimport type { Entity, SearchRequestProps } from '../../core/types';\n\nexport type ComboBoxItemType = {\n value: string;\n label: string;\n};\n\nexport interface SearchProps {\n onSelect: ({\n entityName,\n entityNamePlural,\n entityId,\n }: {\n entityName: string;\n entityNamePlural: string;\n entityId: string;\n }) => void;\n searchPlaceholder?: string;\n noResultsMsg?: string;\n className?: string;\n onSearchChange?: (e: string) => void;\n projectId: string;\n schema: Entity[];\n}\n\nconst ALL_COLLECTIONS = 'all';\n\nfunction capitalize(str: string): string {\n const withSpaces = str.replace(/([A-Z])/g, ' $1');\n\n return withSpaces.charAt(0).toUpperCase() + withSpaces.slice(1).trim();\n}\n\nfunction getSearchableEntities(schema: Entity[]): Entity[] {\n return schema.filter((entity) => entity.attributes.some((attr) => attr.searchable));\n}\n\nfunction getCollections(entities: Entity[], selectedCollection: string): string[] {\n if (selectedCollection === ALL_COLLECTIONS) {\n return entities.map((entity) => entity.plural);\n }\n\n return entities.filter((entity) => entity.plural === selectedCollection).map((entity) => entity.plural);\n}\n\nfunction resolveCollection(entities: Entity[], selectedCollection: string): string {\n if (selectedCollection === ALL_COLLECTIONS) {\n return ALL_COLLECTIONS;\n }\n\n if (entities.some((entity) => entity.plural === selectedCollection)) {\n return selectedCollection;\n }\n\n return ALL_COLLECTIONS;\n}\n\nfunction buildSearchRequest(collections: string[], q: string): SearchRequestProps {\n return {\n searchRequests: {\n searches: collections.map((collection) => ({\n collection,\n })),\n },\n commonParams: {\n q,\n },\n };\n}\n\nfunction entityLabel(entity: Entity): string {\n return entity.menu?.label ?? capitalize(entity.plural);\n}\n\nexport function Search({\n onSelect,\n searchPlaceholder = 'Search...',\n noResultsMsg = 'Nothing found',\n className,\n onSearchChange,\n projectId,\n schema,\n}: SearchProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const [selectedCollection, setSelectedCollection] = useState(ALL_COLLECTIONS);\n const searchableEntities = useMemo(() => getSearchableEntities(schema), [schema]);\n const resolvedCollection = resolveCollection(searchableEntities, selectedCollection);\n const collections = useMemo(\n () => getCollections(searchableEntities, resolvedCollection),\n [searchableEntities, resolvedCollection]\n );\n const searchQuery = useMemo(() => buildSearchRequest(collections, inputValue), [collections, inputValue]);\n const inputRef = useRef<HTMLInputElement>(null);\n const { results, isLoading } = useSearch(projectId, searchQuery);\n const showDropdown = isOpen && (results.length > 0 || !isLoading);\n const navigate = useNavigate();\n\n function handleOnSearchChange(q: string): void {\n setInputValue(q);\n // TODO: Add debounce\n if (q.length > 0) {\n setIsOpen(true);\n }\n\n if (q.length === 0) {\n setIsOpen(false);\n }\n\n if (onSearchChange) {\n onSearchChange(q);\n }\n }\n\n function handleEntityChange(value: string): void {\n setSelectedCollection(value);\n\n if (inputValue.length > 0) {\n setIsOpen(true);\n }\n }\n\n function handleClear(): void {\n setInputValue('');\n setIsOpen(false);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n\n // Remove id from URL if present\n const url = new URL(window.location.href);\n\n if (url.searchParams.has('id')) {\n url.searchParams.delete('id');\n navigate(url.pathname + url.search);\n }\n }\n\n // TODO: handle error\n\n return (\n <ButtonGroup>\n <Select onValueChange={handleEntityChange} value={resolvedCollection}>\n <SelectTrigger\n aria-label=\"Filter search by entity\"\n className=\"fk:w-36 fk:h-9 fk:py-1 fk:rounded-r-none fk:border-border fk:shadow-none\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL_COLLECTIONS}>All</SelectItem>\n {searchableEntities.map((entity) => (\n <SelectItem key={entity.plural} value={entity.plural}>\n {entityLabel(entity)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Command\n className=\"fk:relative fk:overflow-visible fk:h-auto fk:justify-center fk:rounded-none fk:bg-transparent\"\n onBlur={() => {\n // close after a delay to allow any click event from the results list to be handled\n setTimeout(() => {\n setIsOpen(false);\n }, 300);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setIsOpen(false);\n }\n }}\n shouldFilter={false}\n >\n <div\n className={cn(\n 'fk:flex fk:items-center fk:border-y fk:border-r fk:border-border fk:rounded-r-md fk:bg-background fk:pl-3 fk:pr-2 fk:h-9 fk:md:w-25 fk:lg:w-75',\n 'fk:outline-none fk:transition-[color,box-shadow] fk:has-[input:focus-visible]:border-ring fk:has-[input:focus-visible]:ring-[3px] fk:has-[input:focus-visible]:ring-ring/50'\n )}\n >\n {isLoading ? (\n <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <CommandPrimitive.Input\n className={cn(\n 'fk:flex fk:h-9 fk:w-full fk:rounded-none fk:bg-transparent fk:py-1 fk:text-sm fk:outline-hidden fk:placeholder:text-muted-foreground fk:disabled:cursor-not-allowed fk:disabled:opacity-50',\n className\n )}\n placeholder={searchPlaceholder}\n onMouseDown={() => {\n if ((inputRef.current?.value.length ?? 0) > 0) setIsOpen(true);\n }}\n onValueChange={handleOnSearchChange}\n ref={inputRef}\n value={inputValue}\n />\n {inputValue && (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:flex fk:items-center fk:justify-center fk:ml-2 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent\"\n onClick={handleClear}\n type=\"button\"\n >\n <XIcon className=\"fk:h-4 fk:w-4\" />\n </Button>\n )}\n </div>\n <div className=\"fk:relative fk:max-w-150\">\n <div\n className={cn(\n 'fk:mt-1 fk:animate-in fk:fade-in-0 fk:zoom-in-95 fk:absolute fk:top-0 fk:z-50 fk:w-full fk:rounded-md fk:bg-popover fk:outline-hidden fk:drop-shadow-md fk:border fk:border-border',\n showDropdown ? 'fk:block' : 'fk:hidden'\n )}\n >\n <ScrollArea className=\"fk:max-h-55 fk:overflow-auto\">\n {!isLoading && <CommandEmpty>{noResultsMsg}</CommandEmpty>}\n <CommandList>\n <CommandGroup>\n {results.length > 0 && <CommandItem aria-hidden=\"true\" className=\"fk:hidden!\" value=\"-\" />}\n {results.map((item) => (\n <CommandItem\n className=\"fk:flex\"\n key={item._id}\n value={item._id}\n onSelect={(entityId) => {\n onSelect({ entityName: item._entityName, entityNamePlural: item._entityNamePlural, entityId });\n }}\n >\n <span className=\"fk:basis-full\">{item[Object.keys(item)[3]]}</span>\n <Badge className=\"fk:py-px fk:text-[0.6875rem] fk:leading-3 fk:bg-teal-400\">\n {item._entityName}\n </Badge>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </ScrollArea>\n </div>\n </div>\n </Command>\n </ButtonGroup>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/ui/components/search.tsx"],"names":["ALL_COLLECTIONS","capitalize","str","withSpaces","getSearchableEntities","schema","entity","attr","getCollections","entities","selectedCollection","resolveCollection","buildSearchRequest","collections","q","collection","entityLabel","Search","onSelect","searchPlaceholder","noResultsMsg","className","onSearchChange","projectId","isOpen","setIsOpen","useState","inputValue","setInputValue","setSelectedCollection","searchableEntities","useMemo","resolvedCollection","searchQuery","inputRef","useRef","results","isLoading","useSearch","showDropdown","navigate","useNavigate","handleOnSearchChange","handleEntityChange","value","handleClear","url","jsxs","ButtonGroup","Select","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem","Command","cn","LoaderCircle","SearchIcon","CommandPrimitive","Button","XIcon","ScrollArea","CommandEmpty","CommandList","CommandGroup","CommandItem","item","entityId","Badge"],"mappings":"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","file":"search-FTC7ELZX.js","sourcesContent":["'use client';\n\nimport { useRef, useState, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { LoaderCircle, Search as SearchIcon, X as XIcon } from 'lucide-react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { useNavigate } from 'react-router-dom';\nimport { useSearch } from '../../core/use-search';\nimport { cn } from '../lib/utils';\nimport { Badge } from '../primitives/badge';\nimport { Button } from '../primitives/button';\nimport { ButtonGroup } from '../primitives/button-group';\nimport { Command, CommandEmpty, CommandGroup, CommandItem, CommandList } from '../primitives/command';\nimport { ScrollArea } from '../primitives/scroll-area';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../primitives/select';\nimport type { Entity, SearchRequestProps } from '../../core/types';\n\nexport type ComboBoxItemType = {\n value: string;\n label: string;\n};\n\nexport interface SearchProps {\n onSelect: ({\n entityName,\n entityNamePlural,\n entityId,\n }: {\n entityName: string;\n entityNamePlural: string;\n entityId: string;\n }) => void;\n searchPlaceholder?: string;\n noResultsMsg?: string;\n className?: string;\n onSearchChange?: (e: string) => void;\n projectId: string;\n schema: Entity[];\n}\n\nconst ALL_COLLECTIONS = 'all';\n\nfunction capitalize(str: string): string {\n const withSpaces = str.replace(/([A-Z])/g, ' $1');\n\n return withSpaces.charAt(0).toUpperCase() + withSpaces.slice(1).trim();\n}\n\nfunction getSearchableEntities(schema: Entity[]): Entity[] {\n return schema.filter((entity) => entity.attributes.some((attr) => attr.searchable));\n}\n\nfunction getCollections(entities: Entity[], selectedCollection: string): string[] {\n if (selectedCollection === ALL_COLLECTIONS) {\n return entities.map((entity) => entity.plural);\n }\n\n return entities.filter((entity) => entity.plural === selectedCollection).map((entity) => entity.plural);\n}\n\nfunction resolveCollection(entities: Entity[], selectedCollection: string): string {\n if (selectedCollection === ALL_COLLECTIONS) {\n return ALL_COLLECTIONS;\n }\n\n if (entities.some((entity) => entity.plural === selectedCollection)) {\n return selectedCollection;\n }\n\n return ALL_COLLECTIONS;\n}\n\nfunction buildSearchRequest(collections: string[], q: string): SearchRequestProps {\n return {\n searchRequests: {\n searches: collections.map((collection) => ({\n collection,\n })),\n },\n commonParams: {\n q,\n },\n };\n}\n\nfunction entityLabel(entity: Entity): string {\n return entity.menu?.label ?? capitalize(entity.plural);\n}\n\nexport function Search({\n onSelect,\n searchPlaceholder = 'Search...',\n noResultsMsg = 'Nothing found',\n className,\n onSearchChange,\n projectId,\n schema,\n}: SearchProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const [selectedCollection, setSelectedCollection] = useState(ALL_COLLECTIONS);\n const searchableEntities = useMemo(() => getSearchableEntities(schema), [schema]);\n const resolvedCollection = resolveCollection(searchableEntities, selectedCollection);\n const collections = useMemo(\n () => getCollections(searchableEntities, resolvedCollection),\n [searchableEntities, resolvedCollection]\n );\n const searchQuery = useMemo(() => buildSearchRequest(collections, inputValue), [collections, inputValue]);\n const inputRef = useRef<HTMLInputElement>(null);\n const { results, isLoading } = useSearch(projectId, searchQuery);\n const showDropdown = isOpen && (results.length > 0 || !isLoading);\n const navigate = useNavigate();\n\n function handleOnSearchChange(q: string): void {\n setInputValue(q);\n // TODO: Add debounce\n if (q.length > 0) {\n setIsOpen(true);\n }\n\n if (q.length === 0) {\n setIsOpen(false);\n }\n\n if (onSearchChange) {\n onSearchChange(q);\n }\n }\n\n function handleEntityChange(value: string): void {\n setSelectedCollection(value);\n\n if (inputValue.length > 0) {\n setIsOpen(true);\n }\n }\n\n function handleClear(): void {\n setInputValue('');\n setIsOpen(false);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n\n // Remove id from URL if present\n const url = new URL(window.location.href);\n\n if (url.searchParams.has('id')) {\n url.searchParams.delete('id');\n navigate(url.pathname + url.search);\n }\n }\n\n // TODO: handle error\n\n return (\n <ButtonGroup>\n <Select onValueChange={handleEntityChange} value={resolvedCollection}>\n <SelectTrigger\n aria-label=\"Filter search by entity\"\n className=\"fk:w-36 fk:h-9 fk:py-1 fk:rounded-r-none fk:border-border fk:shadow-none\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL_COLLECTIONS}>All</SelectItem>\n {searchableEntities.map((entity) => (\n <SelectItem key={entity.plural} value={entity.plural}>\n {entityLabel(entity)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Command\n className=\"fk:relative fk:overflow-visible fk:h-auto fk:justify-center fk:rounded-none fk:bg-transparent\"\n onBlur={() => {\n // close after a delay to allow any click event from the results list to be handled\n setTimeout(() => {\n setIsOpen(false);\n }, 300);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setIsOpen(false);\n }\n }}\n shouldFilter={false}\n >\n <div\n className={cn(\n 'fk:flex fk:items-center fk:border-y fk:border-r fk:border-border fk:rounded-r-md fk:bg-background fk:pl-3 fk:pr-2 fk:h-9 fk:md:w-25 fk:lg:w-75',\n 'fk:outline-none fk:transition-[color,box-shadow] fk:has-[input:focus-visible]:border-ring fk:has-[input:focus-visible]:ring-[3px] fk:has-[input:focus-visible]:ring-ring/50'\n )}\n >\n {isLoading ? (\n <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <CommandPrimitive.Input\n className={cn(\n 'fk:flex fk:h-9 fk:w-full fk:rounded-none fk:bg-transparent fk:py-1 fk:text-sm fk:outline-hidden fk:placeholder:text-muted-foreground fk:disabled:cursor-not-allowed fk:disabled:opacity-50',\n className\n )}\n placeholder={searchPlaceholder}\n onMouseDown={() => {\n if ((inputRef.current?.value.length ?? 0) > 0) setIsOpen(true);\n }}\n onValueChange={handleOnSearchChange}\n ref={inputRef}\n value={inputValue}\n />\n {inputValue && (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:flex fk:items-center fk:justify-center fk:ml-2 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent\"\n onClick={handleClear}\n type=\"button\"\n >\n <XIcon className=\"fk:h-4 fk:w-4\" />\n </Button>\n )}\n </div>\n <div className=\"fk:relative fk:max-w-150\">\n <div\n className={cn(\n 'fk:mt-1 fk:animate-in fk:fade-in-0 fk:zoom-in-95 fk:absolute fk:top-0 fk:z-50 fk:w-full fk:rounded-md fk:bg-popover fk:outline-hidden fk:drop-shadow-md fk:border fk:border-border',\n showDropdown ? 'fk:block' : 'fk:hidden'\n )}\n >\n <ScrollArea className=\"fk:max-h-55 fk:overflow-auto\">\n {!isLoading && <CommandEmpty>{noResultsMsg}</CommandEmpty>}\n <CommandList>\n <CommandGroup>\n {results.length > 0 && <CommandItem aria-hidden=\"true\" className=\"fk:hidden!\" value=\"-\" />}\n {results.map((item) => (\n <CommandItem\n className=\"fk:flex\"\n key={item._id}\n value={item._id}\n onSelect={(entityId) => {\n onSelect({ entityName: item._entityName, entityNamePlural: item._entityNamePlural, entityId });\n }}\n >\n <span className=\"fk:basis-full\">{item[Object.keys(item)[3]]}</span>\n <Badge className=\"fk:py-px fk:text-[0.6875rem] fk:leading-3 fk:bg-teal-400\">\n {item._entityName}\n </Badge>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </ScrollArea>\n </div>\n </div>\n </Command>\n </ButtonGroup>\n );\n}\n"]}
@@ -38,6 +38,7 @@ type MappedEntityItem = {
38
38
  type ImageValue = {
39
39
  _id: string;
40
40
  path: string;
41
+ url?: string;
41
42
  size: number;
42
43
  mimeType: string;
43
44
  originalFilename: string;
package/dist/ui.d.ts CHANGED
@@ -9,7 +9,7 @@ import { FieldValues, FieldPath, ControllerProps } from 'react-hook-form';
9
9
  import { Command as Command$1 } from 'cmdk';
10
10
  import * as ResizablePrimitive from 'react-resizable-panels';
11
11
  export { PanelImperativeHandle } from 'react-resizable-panels';
12
- import { w as SingleProject } from './types.d-710RgZFw.js';
12
+ import { w as SingleProject } from './types.d-C12xWeN_.js';
13
13
  import { ToasterProps } from 'sonner';
14
14
  export { toast } from 'sonner';
15
15
  import { FileUIPart, SourceDocumentUIPart, UIMessage, ChatStatus, ToolUIPart, DynamicToolUIPart } from 'ai';
@@ -1,2 +1,2 @@
1
- import'./index.css';import {b as b$1}from'./chunk-LKBCPAXQ.js';import {a,b as b$3,c as c$1}from'./chunk-2FFSI7IK.js';import {b,r,c,e,f,l,m,i,h,n}from'./chunk-JCHD4EGB.js';import'./chunk-5FHCSAK2.js';import'./chunk-WDRCARCP.js';import {b as b$2}from'./chunk-EYGOJ2ZN.js';import'./chunk-WIUPQHZ5.js';import'./chunk-O2QMYUPS.js';import v from'boring-avatars';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var A=["#06d9b6","#a4f479","#d4d323","#fb468f","#0ec4f1"];function F({projectId:D}){let{theme:r$1,setTheme:t}=b(),[C,n$1]=b$1();return C?jsx(r,{className:"fk:h-8 fk:w-8 fk:rounded-full"}):jsxs(c,{children:[jsx(e,{asChild:true,children:jsx(b$2,{className:"fk:relative fk:h-8 fk:w-8 fk:rounded-full",variant:"ghost",children:jsxs(a,{className:"fk:h-8 fk:w-8",children:[n$1.user?.avatar_url?jsx(b$3,{alt:n$1.user.display_name,src:n$1.user.avatar_url}):null,jsx(c$1,{className:"fk:bg-transparent",children:jsx(v,{className:"fk:size-8",colors:A,name:n$1.user?.id??"user",size:32,variant:"marble"})})]})})}),jsxs(f,{align:"end",className:"fk:w-56",forceMount:true,children:[jsx(l,{className:"font-normal",children:jsxs("div",{className:"fk:flex fk:flex-col fk:space-y-1",children:[jsx("p",{className:"fk:text-sm fk:font-medium fk:leading-none",children:n$1.user?.display_name}),jsx("p",{className:"fk:text-xs fk:leading-none fk:text-muted-foreground",children:n$1.user?.email})]})}),jsx(m,{}),jsx(l,{children:"Theme"}),jsxs(i,{checked:r$1==="system",onCheckedChange:()=>{t("system");},children:[jsx(Monitor,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"System"})]}),jsxs(i,{checked:r$1==="dark",onCheckedChange:()=>{t("dark");},children:[jsx(Moon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Dark"})]}),jsxs(i,{checked:r$1==="light",onCheckedChange:()=>{t("light");},children:[jsx(Sun,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Light"})]}),jsx(m,{}),jsxs(h,{onClick:()=>{n$1.logout(D).then(()=>{}).catch(()=>{});},children:["Log out",jsx(n,{children:"\u21E7\u2318Q"})]})]})]})}export{F as UserNav};//# sourceMappingURL=user-nav-XVY7JTX6.js.map
2
- //# sourceMappingURL=user-nav-XVY7JTX6.js.map
1
+ import'./index.css';import {b as b$1}from'./chunk-ORY5DLME.js';import {a,b as b$3,c as c$1}from'./chunk-2FFSI7IK.js';import {b,r,c,e,f,l,m,i,h,n}from'./chunk-JCHD4EGB.js';import'./chunk-2OBWJ6UY.js';import'./chunk-WDRCARCP.js';import {b as b$2}from'./chunk-EYGOJ2ZN.js';import'./chunk-WIUPQHZ5.js';import'./chunk-O2QMYUPS.js';import v from'boring-avatars';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var A=["#06d9b6","#a4f479","#d4d323","#fb468f","#0ec4f1"];function F({projectId:D}){let{theme:r$1,setTheme:t}=b(),[C,n$1]=b$1();return C?jsx(r,{className:"fk:h-8 fk:w-8 fk:rounded-full"}):jsxs(c,{children:[jsx(e,{asChild:true,children:jsx(b$2,{className:"fk:relative fk:h-8 fk:w-8 fk:rounded-full",variant:"ghost",children:jsxs(a,{className:"fk:h-8 fk:w-8",children:[n$1.user?.avatar_url?jsx(b$3,{alt:n$1.user.display_name,src:n$1.user.avatar_url}):null,jsx(c$1,{className:"fk:bg-transparent",children:jsx(v,{className:"fk:size-8",colors:A,name:n$1.user?.id??"user",size:32,variant:"marble"})})]})})}),jsxs(f,{align:"end",className:"fk:w-56",forceMount:true,children:[jsx(l,{className:"font-normal",children:jsxs("div",{className:"fk:flex fk:flex-col fk:space-y-1",children:[jsx("p",{className:"fk:text-sm fk:font-medium fk:leading-none",children:n$1.user?.display_name}),jsx("p",{className:"fk:text-xs fk:leading-none fk:text-muted-foreground",children:n$1.user?.email})]})}),jsx(m,{}),jsx(l,{children:"Theme"}),jsxs(i,{checked:r$1==="system",onCheckedChange:()=>{t("system");},children:[jsx(Monitor,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"System"})]}),jsxs(i,{checked:r$1==="dark",onCheckedChange:()=>{t("dark");},children:[jsx(Moon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Dark"})]}),jsxs(i,{checked:r$1==="light",onCheckedChange:()=>{t("light");},children:[jsx(Sun,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Light"})]}),jsx(m,{}),jsxs(h,{onClick:()=>{n$1.logout(D).then(()=>{}).catch(()=>{});},children:["Log out",jsx(n,{children:"\u21E7\u2318Q"})]})]})]})}export{F as UserNav};//# sourceMappingURL=user-nav-Z7GBLYQA.js.map
2
+ //# sourceMappingURL=user-nav-Z7GBLYQA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["AVATAR_COLORS","UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","BoringAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"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","file":"user-nav-XVY7JTX6.js","sourcesContent":["import type { JSX } from 'react';\nimport BoringAvatar from 'boring-avatars';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../theme-context';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\nconst AVATAR_COLORS = ['#06d9b6', '#a4f479', '#d4d323', '#fb468f', '#0ec4f1'];\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk:h-8 fk:w-8 fk:rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk:h-8 fk:w-8\">\n {auth.user?.avatar_url ? <AvatarImage alt={auth.user.display_name} src={auth.user.avatar_url} /> : null}\n <AvatarFallback className=\"fk:bg-transparent\">\n <BoringAvatar\n className=\"fk:size-8\"\n colors={AVATAR_COLORS}\n name={auth.user?.id ?? 'user'}\n size={32}\n variant=\"marble\"\n />\n </AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk:flex fk:flex-col fk:space-y-1\">\n <p className=\"fk:text-sm fk:font-medium fk:leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk:text-xs fk:leading-none fk:text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["AVATAR_COLORS","UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","BoringAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"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","file":"user-nav-Z7GBLYQA.js","sourcesContent":["import type { JSX } from 'react';\nimport BoringAvatar from 'boring-avatars';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../theme-context';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\nconst AVATAR_COLORS = ['#06d9b6', '#a4f479', '#d4d323', '#fb468f', '#0ec4f1'];\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk:h-8 fk:w-8 fk:rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk:h-8 fk:w-8\">\n {auth.user?.avatar_url ? <AvatarImage alt={auth.user.display_name} src={auth.user.avatar_url} /> : null}\n <AvatarFallback className=\"fk:bg-transparent\">\n <BoringAvatar\n className=\"fk:size-8\"\n colors={AVATAR_COLORS}\n name={auth.user?.id ?? 'user'}\n size={32}\n variant=\"marble\"\n />\n </AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk:flex fk:flex-col fk:space-y-1\">\n <p className=\"fk:text-sm fk:font-medium fk:leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk:text-xs fk:leading-none fk:text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexkit/studio",
3
- "version": "0.0.32",
3
+ "version": "0.0.33",
4
4
  "description": "Flexkit Studio - Build custom internal tools like PIMs, CRMs, and ERPs with a flexible React UI and a graph-backed API",
5
5
  "keywords": [
6
6
  "flexkit",
@@ -1,2 +0,0 @@
1
- import'./index.css';import {createContext,useMemo,useContext}from'react';import {path,has}from'ramda';import {useParams}from'react-router-dom';import {jsx}from'react/jsx-runtime';var c={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:"_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 d={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"}}]};var T=createContext({contributions:{apps:[]},currentProjectId:void 0,currentProjectSchema:[],getContributionPointConfig:()=>[],plugins:[],projects:[]}),l=n=>Object.prototype.hasOwnProperty.call(n,"projectId"),g=n=>Object.prototype.hasOwnProperty.call(n,"contributes");function F({config:n,children:o}){let{projectId:i}=useParams(),t=useMemo(()=>{let e=s=>[...s.filter(P=>P.name!==c.name&&P.name!==d.name),c,d];return n.map(s=>({...s,schema:e(s.schema)}))},[n]),p=useMemo(()=>r(["plugins"],t),[t]),y=useMemo(()=>r(["plugins"],t.filter(e=>e.projectId===i)),[t,i]),f=useMemo(()=>p.filter(e=>!l(e)&&g(e)),[p]),u=useMemo(()=>y.filter(e=>!l(e)&&g(e)),[y]),O=useMemo(()=>({contributions:{apps:m("apps",[],u)},currentProjectId:i,currentProjectSchema:t.find(e=>e.projectId===i)?.schema??[],getContributionPointConfig:(e,s=[])=>m(e,s,u),plugins:f,projects:p.filter(e=>l(e))}),[f,i,u,t,p]);return jsx(T.Provider,{value:O,children:o})}function R(){return useContext(T)}function r(n,o){return Array.isArray(o)?o.reduce((i,t)=>path(n,t)?[...i,t,...r(n,path(n,t)??[])]:[...i,t],[]):[o]}function m(n,o=[],i){let t=["contributes",n,...o];return r(t.flat(),i).filter(p=>has("component",p))}function N(n){let i=r(["plugins"],n).filter(t=>!l(t)&&g(t));return m("apps",[],i)}export{c as a,d as b,F as c,R as d,N as e};//# sourceMappingURL=chunk-5FHCSAK2.js.map
2
- //# sourceMappingURL=chunk-5FHCSAK2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","ConfigContext","createContext","hasProjectIdProperty","configItem","hasContributesProperty","ConfigProvider","config","children","currentProjectId","useParams","enhancedConfig","useMemo","upsertReservedEntities","schema","entity","project","globalFlattenedConfig","flattenConfigByProperty","currentProjectFlattenedConfig","item","allPlugins","currentProjectPlugins","globalConfig","_getContributionPointConfig","contributionPoint","subPath","jsx","useConfig","useContext","property","acc","curr","path","pathArray","has","getApps","plugins"],"mappings":"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","file":"chunk-5FHCSAK2.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: '_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","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { has, path } from 'ramda';\nimport { useParams } from 'react-router-dom';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport type { AppOptions, PluginOptions, ProjectOptions } from './types';\nimport type { Entity } from '../types';\n\ntype Contributes = NonNullable<PluginOptions['contributes']>;\nexport interface ConfigContext {\n contributions: {\n apps: AppOptions[] | [];\n };\n currentProjectId?: string;\n currentProjectSchema: Entity[];\n getContributionPointConfig: <T extends keyof Contributes>(\n contributionPoint: T,\n subPath?: string[]\n ) => Contributes[T][] | [];\n plugins: PluginOptions[];\n projects: ProjectOptions[];\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n contributions: {\n apps: [],\n },\n currentProjectId: undefined,\n currentProjectSchema: [],\n getContributionPointConfig: () => [],\n plugins: [] as PluginOptions[],\n projects: [] as ProjectOptions[],\n});\nconst hasProjectIdProperty = (configItem: ProjectOptions | PluginOptions): boolean =>\n Object.prototype.hasOwnProperty.call(configItem, 'projectId');\nconst hasContributesProperty = (configItem: ProjectOptions | PluginOptions): boolean =>\n Object.prototype.hasOwnProperty.call(configItem, 'contributes');\n\nexport function ConfigProvider({\n config,\n children,\n}: {\n config: ProjectOptions[];\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 enhancedConfig = useMemo(() => {\n const upsertReservedEntities = (schema: Entity[]): Entity[] => {\n const withoutReserved = schema.filter(\n (entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name\n );\n\n return [...withoutReserved, assetSchema, tagSchema];\n };\n\n return config.map((project) => ({\n ...project,\n schema: upsertReservedEntities(project.schema),\n }));\n }, [config]);\n\n const globalFlattenedConfig = useMemo(() => flattenConfigByProperty(['plugins'], enhancedConfig), [enhancedConfig]);\n const currentProjectFlattenedConfig = useMemo(\n () =>\n flattenConfigByProperty(\n ['plugins'],\n enhancedConfig.filter((item) => item.projectId === currentProjectId)\n ),\n [enhancedConfig, currentProjectId]\n );\n const allPlugins = useMemo(\n () =>\n globalFlattenedConfig.filter(\n (item: ProjectOptions | PluginOptions) => !hasProjectIdProperty(item) && hasContributesProperty(item)\n ) as PluginOptions[],\n [globalFlattenedConfig]\n );\n const currentProjectPlugins = useMemo(\n () =>\n currentProjectFlattenedConfig.filter(\n (item: ProjectOptions | PluginOptions) => !hasProjectIdProperty(item) && hasContributesProperty(item)\n ) as PluginOptions[],\n [currentProjectFlattenedConfig]\n );\n\n const globalConfig = useMemo(\n () => ({\n contributions: {\n apps: _getContributionPointConfig('apps', [], currentProjectPlugins) as AppOptions[] | [],\n },\n currentProjectId,\n currentProjectSchema: enhancedConfig.find((item) => item.projectId === currentProjectId)?.schema ?? [],\n getContributionPointConfig: <T extends keyof Contributes>(\n contributionPoint: T,\n subPath: string[] = []\n ): Contributes[T][] =>\n _getContributionPointConfig(contributionPoint, subPath, currentProjectPlugins) as Contributes[T][],\n plugins: allPlugins,\n projects: globalFlattenedConfig.filter((item: ProjectOptions | PluginOptions) =>\n hasProjectIdProperty(item)\n ) as ProjectOptions[],\n }),\n [allPlugins, currentProjectId, currentProjectPlugins, enhancedConfig, globalFlattenedConfig]\n );\n\n return <ConfigContext.Provider value={globalConfig}>{children}</ConfigContext.Provider>;\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n\nfunction flattenConfigByProperty(\n property: string[],\n config: (ProjectOptions | PluginOptions)[]\n): (ProjectOptions | PluginOptions)[] | [] {\n if (!Array.isArray(config)) {\n return [config];\n }\n\n return config.reduce<(ProjectOptions | PluginOptions)[]>((acc, curr) => {\n if (path(property, curr)) {\n return [...acc, curr, ...flattenConfigByProperty(property, path(property, curr) ?? [])];\n }\n\n return [...acc, curr];\n }, []);\n}\n\nfunction _getContributionPointConfig<T extends keyof Contributes>(\n contributionPoint: T,\n subPath: string[] = [],\n config: PluginOptions[]\n): Contributes[T] {\n const pathArray = ['contributes', contributionPoint, ...subPath];\n\n return flattenConfigByProperty(pathArray.flat(), config).filter((item) => has('component', item)) as Contributes[T];\n}\n\nexport function getApps(config: ProjectOptions[]): AppOptions[] | [] {\n const flattenedConfig = flattenConfigByProperty(['plugins'], config);\n const plugins = flattenedConfig.filter(\n (item: ProjectOptions | PluginOptions) => !hasProjectIdProperty(item) && hasContributesProperty(item)\n ) as PluginOptions[];\n return _getContributionPointConfig('apps', [], plugins) as AppOptions[] | [];\n}\n"]}