@flexkit/studio 0.0.27 → 0.0.29

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.
Files changed (94) hide show
  1. package/dist/asset-TS7J5GA5.js +2 -0
  2. package/dist/{asset-REAMGMQL.js.map → asset-TS7J5GA5.js.map} +1 -1
  3. package/dist/chunk-73RMWG53.js +2 -0
  4. package/dist/{chunk-X3S7TRCM.js.map → chunk-73RMWG53.js.map} +1 -1
  5. package/dist/chunk-7MSX5T2Z.js +2 -0
  6. package/dist/chunk-7MSX5T2Z.js.map +1 -0
  7. package/dist/chunk-CPUC4QXH.js +2 -0
  8. package/dist/chunk-CPUC4QXH.js.map +1 -0
  9. package/dist/chunk-DWK4NNLB.js +2 -0
  10. package/dist/chunk-DWK4NNLB.js.map +1 -0
  11. package/dist/chunk-EOCJR5EY.js +2 -0
  12. package/dist/chunk-EOCJR5EY.js.map +1 -0
  13. package/dist/chunk-FVFRTCEB.js +2 -0
  14. package/dist/chunk-FVFRTCEB.js.map +1 -0
  15. package/dist/chunk-HAQICAOQ.js +2 -0
  16. package/dist/chunk-HAQICAOQ.js.map +1 -0
  17. package/dist/chunk-IXO2LU47.js +2 -0
  18. package/dist/{chunk-TBCSVE5L.js.map → chunk-IXO2LU47.js.map} +1 -1
  19. package/dist/{chunk-NNRD7YZU.js → chunk-LL2Z4TD3.js} +2 -2
  20. package/dist/{chunk-NNRD7YZU.js.map → chunk-LL2Z4TD3.js.map} +1 -1
  21. package/dist/chunk-N52AF6GE.js +2 -0
  22. package/dist/chunk-N52AF6GE.js.map +1 -0
  23. package/dist/chunk-R7N3MDOP.js +2 -0
  24. package/dist/chunk-R7N3MDOP.js.map +1 -0
  25. package/dist/chunk-V6R4AWQS.js +2 -0
  26. package/dist/chunk-V6R4AWQS.js.map +1 -0
  27. package/dist/chunk-W3TUEJJL.js +2 -0
  28. package/dist/chunk-W3TUEJJL.js.map +1 -0
  29. package/dist/chunk-WXMCINGZ.js +2 -0
  30. package/dist/{chunk-27Y2SQ67.js.map → chunk-WXMCINGZ.js.map} +1 -1
  31. package/dist/{chunk-2PEDKE5Z.js → chunk-WZ533Y4O.js} +2 -2
  32. package/dist/{chunk-2PEDKE5Z.js.map → chunk-WZ533Y4O.js.map} +1 -1
  33. package/dist/chunk-YA4ACPM5.js +2 -0
  34. package/dist/{chunk-KR7CLPY2.js.map → chunk-YA4ACPM5.js.map} +1 -1
  35. package/dist/chunk-ZEZ6TRCO.js +2 -0
  36. package/dist/chunk-ZEZ6TRCO.js.map +1 -0
  37. package/dist/datetime-NQTYGZIC.js +2 -0
  38. package/dist/{datetime-TWONUNXS.js.map → datetime-NQTYGZIC.js.map} +1 -1
  39. package/dist/editor-YIRZQR3D.js +2 -0
  40. package/dist/{editor-NFRMIYVJ.js.map → editor-YIRZQR3D.js.map} +1 -1
  41. package/dist/index.css +222 -44
  42. package/dist/index.d.ts +75 -9
  43. package/dist/index.js +221 -209
  44. package/dist/index.js.map +1 -1
  45. package/dist/{search-6ASIDGYA.js → search-UFFZBRQV.js} +2 -2
  46. package/dist/{search-6ASIDGYA.js.map → search-UFFZBRQV.js.map} +1 -1
  47. package/dist/select-A6I27JQU.js +2 -0
  48. package/dist/select-A6I27JQU.js.map +1 -0
  49. package/dist/switch-AFZGXSR3.js +2 -0
  50. package/dist/{switch-KVO3JRNX.js.map → switch-AFZGXSR3.js.map} +1 -1
  51. package/dist/text-2RL2L5FT.js +2 -0
  52. package/dist/{text-FIBUDNGR.js.map → text-2RL2L5FT.js.map} +1 -1
  53. package/dist/text-6F4QTCNT.js +2 -0
  54. package/dist/{text-ODG7ABSW.js.map → text-6F4QTCNT.js.map} +1 -1
  55. package/dist/textarea-2A4TLWZS.js +2 -0
  56. package/dist/{textarea-M4YPSJEC.js.map → textarea-2A4TLWZS.js.map} +1 -1
  57. package/dist/{types.d-DiA0h3ut.d.ts → types.d-6y0oZ2Hh.d.ts} +36 -4
  58. package/dist/ui.d.ts +16 -4
  59. package/dist/ui.js +1 -1
  60. package/dist/ui.js.map +1 -1
  61. package/dist/user-nav-4JKIFZLB.js +2 -0
  62. package/dist/user-nav-4JKIFZLB.js.map +1 -0
  63. package/package.json +5 -3
  64. package/dist/asset-REAMGMQL.js +0 -2
  65. package/dist/chunk-27Y2SQ67.js +0 -2
  66. package/dist/chunk-4KGH7PU7.js +0 -2
  67. package/dist/chunk-4KGH7PU7.js.map +0 -1
  68. package/dist/chunk-553TQFSU.js +0 -2
  69. package/dist/chunk-553TQFSU.js.map +0 -1
  70. package/dist/chunk-7NQ6QCJD.js +0 -2
  71. package/dist/chunk-7NQ6QCJD.js.map +0 -1
  72. package/dist/chunk-AALMEPYG.js +0 -2
  73. package/dist/chunk-AALMEPYG.js.map +0 -1
  74. package/dist/chunk-CWHDJ7Q4.js +0 -2
  75. package/dist/chunk-CWHDJ7Q4.js.map +0 -1
  76. package/dist/chunk-KR7CLPY2.js +0 -2
  77. package/dist/chunk-QXCD5JR4.js +0 -2
  78. package/dist/chunk-QXCD5JR4.js.map +0 -1
  79. package/dist/chunk-TBCSVE5L.js +0 -2
  80. package/dist/chunk-UUGIVWK4.js +0 -2
  81. package/dist/chunk-UUGIVWK4.js.map +0 -1
  82. package/dist/chunk-X3S7TRCM.js +0 -2
  83. package/dist/chunk-ZSJAPCIZ.js +0 -2
  84. package/dist/chunk-ZSJAPCIZ.js.map +0 -1
  85. package/dist/chunk-ZSSNAIMU.js +0 -2
  86. package/dist/chunk-ZSSNAIMU.js.map +0 -1
  87. package/dist/datetime-TWONUNXS.js +0 -2
  88. package/dist/editor-NFRMIYVJ.js +0 -2
  89. package/dist/switch-KVO3JRNX.js +0 -2
  90. package/dist/text-FIBUDNGR.js +0 -2
  91. package/dist/text-ODG7ABSW.js +0 -2
  92. package/dist/textarea-M4YPSJEC.js +0 -2
  93. package/dist/user-nav-O5G4M2VA.js +0 -2
  94. package/dist/user-nav-O5G4M2VA.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/hooks/use-cached-image-src.ts","../src/data-grid/preview-components/asset.tsx"],"names":["MAX_CACHE_ENTRIES","MAX_SINGLE_BLOB_BYTES","blobUrlCache","inFlightLoads","corsBlockedUrls","preloadedImages","ensurePreloaded","url","img","touch","entry","evictIfNeeded","entries","a","b","evictCount","i","loadToCache","existing","promise","res","blob","objectUrl","err","useCachedImageSrc","initial","useMemo","cached","src","setSrc","useState","useEffect","isStale","next","transparentImageBackground","Asset","value","jsx","AssetStack","SingleAsset","path","hasPath","isImage","getExtensionFromPath","p","clean","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","cachedThumbnailSrc","TooltipProvider","jsxs","Tooltip","TooltipTrigger","TooltipPortal","TooltipContent","ext","style","defaultStyles","FileTypeIcon","assets","asset","totalCount","overflowCount"],"mappings":"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","file":"chunk-N52AF6GE.js","sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\ntype CacheEntry = {\n objectUrl: string;\n byteSize: number;\n lastUsedAt: number;\n};\n\nconst MAX_CACHE_ENTRIES = 250;\nconst MAX_SINGLE_BLOB_BYTES = 2_500_000; // ~2.5MB\n\nconst blobUrlCache = new Map<string, CacheEntry>();\nconst inFlightLoads = new Map<string, Promise<void>>();\nconst corsBlockedUrls = new Set<string>();\nconst preloadedImages = new Map<string, HTMLImageElement>();\n\nfunction ensurePreloaded(url: string): void {\n if (preloadedImages.has(url)) {\n return;\n }\n\n const img = new Image();\n img.decoding = 'async';\n img.src = url;\n preloadedImages.set(url, img);\n}\n\nfunction touch(url: string): void {\n const entry = blobUrlCache.get(url);\n\n if (!entry) {\n return;\n }\n\n blobUrlCache.set(url, { ...entry, lastUsedAt: Date.now() });\n}\n\nfunction evictIfNeeded(): void {\n if (blobUrlCache.size <= MAX_CACHE_ENTRIES) {\n return;\n }\n\n const entries = Array.from(blobUrlCache.entries()).sort((a, b) => a[1].lastUsedAt - b[1].lastUsedAt);\n const evictCount = Math.max(1, Math.ceil(MAX_CACHE_ENTRIES * 0.1));\n\n for (let i = 0; i < evictCount && i < entries.length; i += 1) {\n const [url, entry] = entries[i];\n blobUrlCache.delete(url);\n\n URL.revokeObjectURL(entry.objectUrl);\n }\n}\n\nasync function loadToCache(url: string): Promise<void> {\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n\n return;\n }\n\n if (blobUrlCache.has(url)) {\n touch(url);\n\n return;\n }\n\n const existing = inFlightLoads.get(url);\n\n if (existing) {\n await existing;\n\n return;\n }\n\n const promise = (async () => {\n try {\n const res = await fetch(url, {\n mode: 'cors',\n cache: 'force-cache',\n });\n\n if (!res.ok) {\n ensurePreloaded(url);\n\n return;\n }\n\n const blob = await res.blob();\n\n if (blob.size > MAX_SINGLE_BLOB_BYTES) {\n return;\n }\n\n const objectUrl = URL.createObjectURL(blob);\n blobUrlCache.set(url, { objectUrl, byteSize: blob.size, lastUsedAt: Date.now() });\n evictIfNeeded();\n } catch (err: unknown) {\n // Most common failure is CORS (TypeError: Failed to fetch). If so, avoid retrying.\n if (err instanceof TypeError) {\n corsBlockedUrls.add(url);\n }\n\n ensurePreloaded(url);\n }\n })();\n\n inFlightLoads.set(url, promise);\n\n await promise;\n\n inFlightLoads.delete(url);\n}\n\n/**\n * Keeps a stable, in-memory cached image src across virtualized unmount/remount cycles.\n * Falls back to the original URL if the image can’t be fetched (e.g. due to CORS).\n */\nexport function useCachedImageSrc(url: string | null | undefined): string | null {\n const initial = useMemo(() => {\n if (!url) {\n return null;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (!cached) {\n return null;\n }\n\n touch(url);\n\n return cached.objectUrl;\n }, [url]);\n\n const [src, setSrc] = useState<string | null>(initial);\n\n useEffect(() => {\n if (!url) {\n setSrc(null);\n\n return;\n }\n\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n setSrc(null);\n\n return;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (cached) {\n touch(url);\n setSrc(cached.objectUrl);\n\n return;\n }\n\n setSrc(null);\n let isStale = false;\n\n loadToCache(url).then(() => {\n const next = blobUrlCache.get(url);\n\n if (!next) {\n return;\n }\n\n if (isStale) {\n return;\n }\n\n touch(url);\n setSrc(next.objectUrl);\n });\n\n return () => {\n isStale = true;\n };\n }, [url]);\n\n return src;\n}\n","import type { JSX } from 'react';\nimport { Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { IMAGES_BASE_URL } from '../../core/api-paths';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { useCachedImageSrc } from '../../ui/hooks/use-cached-image-src';\n\nexport type Asset = {\n _id: string;\n path: string;\n /** Total connected assets; the fetched array is bounded by the query's `first`. */\n totalCount?: number;\n};\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: Asset | Asset[] }) {\n if (Array.isArray(value)) {\n return <AssetStack value={value} />;\n }\n\n return <SingleAsset value={value} />;\n}\n\nfunction SingleAsset({ value }: { value: Asset }) {\n const path = value?.path ?? '';\n const hasPath = Boolean(path);\n const isImage = hasPath && /\\.(png|jpe?g|gif|webp|avif|svg)$/i.test(path);\n\n const getExtensionFromPath = (p: string): string => {\n const [clean] = p.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n };\n\n const thumbnaillUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=84&h=84&f=webp`\n : null;\n\n const fullUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=624&h=624&f=webp`\n : '';\n\n const cachedThumbnailSrc = useCachedImageSrc(thumbnaillUrl);\n\n if (!hasPath) {\n return null;\n }\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n {isImage ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n alt=\"asset\"\n className={`fk:w-7 fk:h-7 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground}`}\n decoding=\"async\"\n src={cachedThumbnailSrc ?? undefined}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground}`}\n decoding=\"async\"\n src={fullUrl}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto\">\n {(() => {\n const ext = getExtensionFromPath(path);\n const style = (\n defaultStyles as Record<string, Record<string, string | number | boolean | undefined>>\n )[ext];\n\n return <FileTypeIcon extension={ext} {...(style || {})} />;\n })()}\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk:text-sm fk:text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n );\n}\n\nfunction AssetStack({ value }: { value: Asset[] }): JSX.Element | null {\n const assets = value.filter((asset) => Boolean(asset.path)).slice(0, 3);\n // Queries bound connection edges, so the array length undercounts; the\n // aggregate total travels on each item as totalCount.\n const totalCount = Math.max(value[0]?.totalCount ?? 0, value.length);\n\n // All fetched edges can lack `path` (still-processing uploads, incomplete\n // nodes) while totalCount > 0 — especially likely now that list queries\n // only fetch the first 3 edges. Show a count so the cell is not blank.\n if (assets.length === 0) {\n if (totalCount > 0) {\n return (\n <div className=\"fk:flex fk:items-center\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n {totalCount === 1 ? '1 asset' : `${totalCount} assets`}\n </span>\n </div>\n );\n }\n\n return null;\n }\n\n const overflowCount = totalCount - assets.length;\n\n return (\n <div className=\"fk:flex fk:items-center\">\n <div className=\"fk:flex fk:-space-x-2\">\n {assets.map((asset) => (\n <img\n alt=\"asset\"\n className={`fk:h-7 fk:w-7 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground}`}\n decoding=\"async\"\n key={asset._id}\n src={`${IMAGES_BASE_URL}${asset.path}?w=84&h=84&f=webp`}\n />\n ))}\n </div>\n {overflowCount > 0 ? (\n <span className=\"fk:ml-2 fk:text-xs fk:text-muted-foreground\">+{overflowCount}</span>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a}from'./chunk-ZEZ6TRCO.js';import {isValid,format}from'date-fns';import {jsx}from'react/jsx-runtime';function d({value:t}){if(t==null||t===""||typeof t!="string")return jsx(a,{value:""});let e=new Date(t);if(!isValid(e))return jsx(a,{value:""});let i=format(e,"MMM d, yyyy")+" at "+format(e,"HH:mm");return jsx(a,{value:i})}export{d as a};//# sourceMappingURL=chunk-R7N3MDOP.js.map
2
+ //# sourceMappingURL=chunk-R7N3MDOP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data-grid/preview-components/datetime.tsx"],"names":["DateTime","value","jsx","CopyableTruncatedText","date","isValid","displayValue","format"],"mappings":"kIAGO,SAASA,CAAAA,CAAS,CAAE,KAAA,CAAAC,CAAM,CAAA,CAA2C,CAC1E,GAAIA,CAAAA,EAAU,IAAA,EAA+BA,CAAAA,GAAU,EAAA,EAAM,OAAOA,CAAAA,EAAU,QAAA,CAC5E,OAAOC,GAAAA,CAACC,CAAAA,CAAA,CAAsB,KAAA,CAAM,EAAA,CAAG,EAGzC,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAKH,CAAK,CAAA,CAE3B,GAAI,CAACI,OAAAA,CAAQD,CAAI,CAAA,CACf,OAAOF,GAAAA,CAACC,CAAAA,CAAA,CAAsB,KAAA,CAAM,GAAG,CAAA,CAGzC,IAAMG,CAAAA,CAAeC,MAAAA,CAAOH,CAAAA,CAAM,aAAa,CAAA,CAAI,MAAA,CAASG,OAAOH,CAAAA,CAAM,OAAO,CAAA,CAEhF,OAAOF,GAAAA,CAACC,CAAAA,CAAA,CAAsB,KAAA,CAAOG,EAAc,CACrD","file":"chunk-R7N3MDOP.js","sourcesContent":["import { format, isValid } from 'date-fns';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\nexport function DateTime({ value }: { value: string | object | unknown[] }) {\n if (value === null || value === undefined || value === '' || typeof value !== 'string') {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const date = new Date(value);\n\n if (!isValid(date)) {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const displayValue = format(date, 'MMM d, yyyy') + ' at ' + format(date, 'HH:mm');\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n"]}
@@ -0,0 +1,2 @@
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",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},isEditable:true,dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:320},isEditable:true,dataType:"string",inputType:"text",previewType:"text",isPrimary:true,defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},isEditable:true,dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:90},isEditable:true,dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:100},isEditable:true,dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},isEditable:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",isHidden:true,isEditable:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},isEditable:false,isHidden: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",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},isEditable:true,dataType:"string",inputType:"text",previewType:"text",isPrimary:true,defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},isEditable:false,isHidden: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=i=>Object.prototype.hasOwnProperty.call(i,"projectId"),g=i=>Object.prototype.hasOwnProperty.call(i,"contributes");function F({config:i,children:o}){let{projectId:n}=useParams(),t=useMemo(()=>{let e=p=>[...p.filter(b=>b.name!==c.name&&b.name!==d.name),c,d];return i.map(p=>({...p,schema:e(p.schema)}))},[i]),s=useMemo(()=>r(["plugins"],t),[t]),y=useMemo(()=>r(["plugins"],t.filter(e=>e.projectId===n)),[t,n]),f=useMemo(()=>s.filter(e=>!l(e)&&g(e)),[s]),u=useMemo(()=>y.filter(e=>!l(e)&&g(e)),[y]),O=useMemo(()=>({contributions:{apps:m("apps",[],u)},currentProjectId:n,currentProjectSchema:t.find(e=>e.projectId===n)?.schema??[],getContributionPointConfig:(e,p=[])=>m(e,p,u),plugins:f,projects:s.filter(e=>l(e))}),[f,n,u,t,s]);return jsx(T.Provider,{value:O,children:o})}function R(){return useContext(T)}function r(i,o){return Array.isArray(o)?o.reduce((n,t)=>path(i,t)?[...n,t,...r(i,path(i,t)??[])]:[...n,t],[]):[o]}function m(i,o=[],n){let t=["contributes",i,...o];return r(t.flat(),n).filter(s=>has("component",s))}function H(i){let n=r(["plugins"],i).filter(t=>!l(t)&&g(t));return m("apps",[],n)}export{c as a,d as b,F as c,R as d,H as e};//# sourceMappingURL=chunk-V6R4AWQS.js.map
2
+ //# sourceMappingURL=chunk-V6R4AWQS.js.map
@@ -0,0 +1 @@
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-V6R4AWQS.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\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 isEditable: true,\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 isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n isPrimary: true,\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n isEditable: true,\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 isEditable: true,\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 isEditable: true,\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 isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n isHidden: true,\n isEditable: 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 isEditable: false,\n isHidden: 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 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 isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n isPrimary: true,\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n isEditable: false,\n isHidden: 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"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a}from'./chunk-ZEZ6TRCO.js';import {jsx}from'react/jsx-runtime';function s(e){return "groupLabel"in e}function u(e){return e.flatMap(t=>s(t)?t.items:[t])}function o(e,t){if(!t)return e;let n=u(t).find(i=>String(i.value)===e);return n?n.label:e}function p({value:e,options:t}){if(e==null)return jsx(a,{value:""});let n=String(e),i=o(n,t?.list);return jsx(a,{value:i})}export{p as a};//# sourceMappingURL=chunk-W3TUEJJL.js.map
2
+ //# sourceMappingURL=chunk-W3TUEJJL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data-grid/preview-components/select.tsx"],"names":["isGroupedSelectList","option","flattenSelectList","list","resolveSelectLabel","value","match","item","Select","options","jsx","CopyableTruncatedText","stringValue","displayValue"],"mappings":"4FAcA,SAASA,CAAAA,CAAoBC,EAAyE,CACpG,OAAO,eAAgBA,CACzB,CAEA,SAASC,CAAAA,CAAkBC,CAAAA,CAA+C,CACxE,OAAOA,CAAAA,CAAK,QAASF,CAAAA,EACfD,CAAAA,CAAoBC,CAAM,CAAA,CACrBA,CAAAA,CAAO,MAGT,CAACA,CAAM,CACf,CACH,CAEA,SAASG,CAAAA,CAAmBC,CAAAA,CAAeF,EAAiD,CAC1F,GAAI,CAACA,CAAAA,CACH,OAAOE,EAGT,IAAMC,CAAAA,CAAQJ,EAAkBC,CAAI,CAAA,CAAE,KAAMI,CAAAA,EAAS,MAAA,CAAOA,EAAK,KAAK,CAAA,GAAMF,CAAK,CAAA,CAEjF,OAAKC,EAIEA,CAAAA,CAAM,KAAA,CAHJD,CAIX,CAEO,SAASG,EAAO,CACrB,KAAA,CAAAH,EACA,OAAA,CAAAI,CACF,EAGgB,CACd,GAAIJ,GAAU,IAAA,CACZ,OAAOK,IAACC,CAAAA,CAAA,CAAsB,MAAM,EAAA,CAAG,CAAA,CAGzC,IAAMC,CAAAA,CAAc,MAAA,CAAOP,CAAK,CAAA,CAC1BQ,CAAAA,CAAeT,EAAmBQ,CAAAA,CAAaH,CAAAA,EAAS,IAAI,CAAA,CAElE,OAAOC,IAACC,CAAAA,CAAA,CAAsB,KAAA,CAAOE,CAAAA,CAAc,CACrD","file":"chunk-W3TUEJJL.js","sourcesContent":["import type { JSX } from 'react';\nimport type { SelectOptions } from '../../core/types';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\ntype SelectListItem = {\n label: string;\n value: string;\n};\n\ntype GroupedSelectList = {\n groupLabel: string;\n items: SelectListItem[];\n};\n\nfunction isGroupedSelectList(option: SelectListItem | GroupedSelectList): option is GroupedSelectList {\n return 'groupLabel' in option;\n}\n\nfunction flattenSelectList(list: SelectOptions['list']): SelectListItem[] {\n return list.flatMap((option) => {\n if (isGroupedSelectList(option)) {\n return option.items;\n }\n\n return [option];\n });\n}\n\nfunction resolveSelectLabel(value: string, list: SelectOptions['list'] | undefined): string {\n if (!list) {\n return value;\n }\n\n const match = flattenSelectList(list).find((item) => String(item.value) === value);\n\n if (!match) {\n return value;\n }\n\n return match.label;\n}\n\nexport function Select({\n value,\n options,\n}: {\n value: string | number | null | undefined;\n options?: SelectOptions;\n}): JSX.Element {\n if (value === null || value === undefined) {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const stringValue = String(value);\n const displayValue = resolveSelectLabel(stringValue, options?.list);\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a}from'./chunk-7GBAYC7G.js';import {a as a$1}from'./chunk-HAQICAOQ.js';import {c,e,f,h,g,i}from'./chunk-FVFRTCEB.js';import {useId}from'react';import {jsx,jsxs}from'react/jsx-runtime';function L({control:v,fieldSchema:f$1,setValue:t}){let{name:r,label:b,isEditable:h$1,options:l}=f$1,m=useId();function g$1(e,o){t(r,{...o,value:e.currentTarget.value});}function C(e,o){t(r,{...o,disabled:e});}return jsx(c,{control:v,name:r,render:({field:e$1})=>jsxs(e,{children:[jsx(f,{htmlFor:m,children:b}),l?.comment?jsx(h,{children:l.comment}):null,jsx(g,{children:jsx(a,{className:`fk:w-full fk:mt-[0.1875rem] ${!e$1.value?.scope||e$1.value.scope==="default"?"fk:mb-3":""}`,disabled:h$1===false||e$1.value?.disabled,id:m,...e$1,onChange:o=>{g$1(o,e$1.value);},value:e$1.value?.value||""})}),jsx(a$1,{checked:e$1.value?.disabled??false,onChange:o=>{C(o,e$1.value);},scope:e$1.value?.scope}),jsx(i,{})]})})}export{L as a};//# sourceMappingURL=chunk-WXMCINGZ.js.map
2
+ //# sourceMappingURL=chunk-WXMCINGZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/form/fields/text.tsx"],"names":["Text","control","fieldSchema","setValue","name","label","isEditable","options","id","useId","handleInput","event","previousValue","handleCheckbox","checked","value","jsx","FormField","field","jsxs","FormItem","FormLabel","FormDescription","FormControl","Input","DefaultValueSwitch","FormMessage"],"mappings":"6MAQO,SAASA,CAAAA,CAAK,CAAE,OAAA,CAAAC,CAAAA,CAAS,YAAAC,GAAAA,CAAa,QAAA,CAAAC,CAAS,CAAA,CAAyC,CAC7F,GAAM,CAAE,KAAAC,CAAAA,CAAM,KAAA,CAAAC,IAAO,UAAA,CAAAC,GAAAA,CAAY,QAAAC,CAAQ,CAAA,CAAIL,IACvCM,CAAAA,CAAKC,KAAAA,GAEX,SAASC,GAAAA,CACPC,EACAC,CAAAA,CACM,CACNT,EAASC,CAAAA,CAAM,CACb,GAAGQ,CAAAA,CACH,MAAOD,CAAAA,CAAM,aAAA,CAAc,KAC7B,CAAC,EACH,CAEA,SAASE,CAAAA,CAAeC,CAAAA,CAAkBC,CAAAA,CAAyC,CACjFZ,CAAAA,CAASC,CAAAA,CAAM,CACb,GAAGW,CAAAA,CACH,SAAUD,CACZ,CAAC,EACH,CAEA,OACEE,GAAAA,CAACC,CAAAA,CAAA,CACC,OAAA,CAAShB,CAAAA,CACT,KAAMG,CAAAA,CACN,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAAc,GAAM,CAAA,GACfC,IAAAA,CAACC,EAAA,CACC,QAAA,CAAA,CAAAJ,IAACK,CAAAA,CAAA,CAAU,OAAA,CAASb,CAAAA,CAAK,SAAAH,GAAAA,CAAM,CAAA,CAC9BE,GAAS,OAAA,CAAUS,GAAAA,CAACM,EAAA,CAAiB,QAAA,CAAAf,CAAAA,CAAQ,OAAA,CAAQ,EAAqB,IAAA,CAC3ES,GAAAA,CAACO,EAAA,CACC,QAAA,CAAAP,IAACQ,CAAAA,CAAA,CACC,SAAA,CAAW,CAAA,4BAAA,EACT,CAACN,GAAAA,CAAM,KAAA,EAAO,OAASA,GAAAA,CAAM,KAAA,CAAM,QAAU,SAAA,CAAY,SAAA,CAAY,EACvE,CAAA,CAAA,CACA,QAAA,CAAUZ,MAAe,KAAA,EAASY,GAAAA,CAAM,OAAO,QAAA,CAC/C,EAAA,CAAIV,EACH,GAAGU,GAAAA,CACJ,QAAA,CAAWP,CAAAA,EAAU,CACnBD,GAAAA,CAAYC,CAAAA,CAAOO,IAAM,KAAK,EAChC,EACA,KAAA,CAAQA,GAAAA,CAAM,KAAA,EAAO,KAAA,EAAoB,GAC3C,CAAA,CACF,CAAA,CAEAF,IAACS,CAAAA,CAAA,CACC,QAASP,GAAAA,CAAM,KAAA,EAAO,QAAA,EAAY,KAAA,CAClC,SAAWJ,CAAAA,EAAY,CACrBD,EAAeC,CAAAA,CAASI,GAAAA,CAAM,KAAK,EACrC,CAAA,CACA,MAAOA,GAAAA,CAAM,KAAA,EAAO,MACtB,CAAA,CACAF,GAAAA,CAACU,EAAA,EAAY,CAAA,CAAA,CACf,EAEJ,CAEJ","file":"chunk-27Y2SQ67.js","sourcesContent":["import { useId } from 'react';\nimport type { JSX } from 'react';\nimport type { FormFieldValue } from '../../graphql-client/types';\nimport { FormControl, FormDescription, FormField, FormLabel, FormMessage, FormItem } from '../../ui/primitives/form';\nimport { Input } from '../../ui/primitives/input';\nimport type { FormFieldParams } from '../types';\nimport { DefaultValueSwitch } from './default-value-switch';\n\nexport function Text({ control, fieldSchema, setValue }: FormFieldParams<'text'>): JSX.Element {\n const { name, label, isEditable, options } = fieldSchema;\n const id = useId();\n\n function handleInput(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n previousValue: FormFieldValue | undefined\n ): void {\n setValue(name, {\n ...previousValue,\n value: event.currentTarget.value,\n });\n }\n\n function handleCheckbox(checked: boolean, value: FormFieldValue | undefined): void {\n setValue(name, {\n ...value,\n disabled: checked,\n });\n }\n\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }: { field: { value?: FormFieldValue } }) => (\n <FormItem>\n <FormLabel htmlFor={id}>{label}</FormLabel>\n {options?.comment ? <FormDescription>{options.comment}</FormDescription> : null}\n <FormControl>\n <Input\n className={`fk:w-full fk:mt-[0.1875rem] ${\n !field.value?.scope || field.value.scope === 'default' ? 'fk:mb-3' : ''\n }`}\n disabled={isEditable === false || field.value?.disabled}\n id={id}\n {...field}\n onChange={(event) => {\n handleInput(event, field.value);\n }}\n value={(field.value?.value as string) || ''}\n />\n </FormControl>\n\n <DefaultValueSwitch\n checked={field.value?.disabled ?? false}\n onChange={(checked) => {\n handleCheckbox(checked, field.value);\n }}\n scope={field.value?.scope}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/form/fields/text.tsx"],"names":["Text","control","fieldSchema","setValue","name","label","isEditable","options","id","useId","handleInput","event","previousValue","handleCheckbox","checked","value","jsx","FormField","field","jsxs","FormItem","FormLabel","FormDescription","FormControl","Input","DefaultValueSwitch","FormMessage"],"mappings":"oNAQO,SAASA,CAAAA,CAAK,CAAE,OAAA,CAAAC,CAAAA,CAAS,YAAAC,GAAAA,CAAa,QAAA,CAAAC,CAAS,CAAA,CAAyC,CAC7F,GAAM,CAAE,KAAAC,CAAAA,CAAM,KAAA,CAAAC,EAAO,UAAA,CAAAC,GAAAA,CAAY,QAAAC,CAAQ,CAAA,CAAIL,IACvCM,CAAAA,CAAKC,KAAAA,GAEX,SAASC,GAAAA,CACPC,EACAC,CAAAA,CACM,CACNT,EAASC,CAAAA,CAAM,CACb,GAAGQ,CAAAA,CACH,MAAOD,CAAAA,CAAM,aAAA,CAAc,KAC7B,CAAC,EACH,CAEA,SAASE,CAAAA,CAAeC,CAAAA,CAAkBC,CAAAA,CAAyC,CACjFZ,CAAAA,CAASC,CAAAA,CAAM,CACb,GAAGW,CAAAA,CACH,SAAUD,CACZ,CAAC,EACH,CAEA,OACEE,GAAAA,CAACC,CAAAA,CAAA,CACC,OAAA,CAAShB,CAAAA,CACT,KAAMG,CAAAA,CACN,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAAc,GAAM,CAAA,GACfC,IAAAA,CAACC,EAAA,CACC,QAAA,CAAA,CAAAJ,IAACK,CAAAA,CAAA,CAAU,OAAA,CAASb,CAAAA,CAAK,SAAAH,CAAAA,CAAM,CAAA,CAC9BE,GAAS,OAAA,CAAUS,GAAAA,CAACM,EAAA,CAAiB,QAAA,CAAAf,CAAAA,CAAQ,OAAA,CAAQ,EAAqB,IAAA,CAC3ES,GAAAA,CAACO,EAAA,CACC,QAAA,CAAAP,IAACQ,CAAAA,CAAA,CACC,SAAA,CAAW,CAAA,4BAAA,EACT,CAACN,GAAAA,CAAM,KAAA,EAAO,OAASA,GAAAA,CAAM,KAAA,CAAM,QAAU,SAAA,CAAY,SAAA,CAAY,EACvE,CAAA,CAAA,CACA,QAAA,CAAUZ,MAAe,KAAA,EAASY,GAAAA,CAAM,OAAO,QAAA,CAC/C,EAAA,CAAIV,EACH,GAAGU,GAAAA,CACJ,QAAA,CAAWP,CAAAA,EAAU,CACnBD,GAAAA,CAAYC,CAAAA,CAAOO,IAAM,KAAK,EAChC,EACA,KAAA,CAAQA,GAAAA,CAAM,KAAA,EAAO,KAAA,EAAoB,GAC3C,CAAA,CACF,CAAA,CAEAF,IAACS,GAAAA,CAAA,CACC,QAASP,GAAAA,CAAM,KAAA,EAAO,QAAA,EAAY,KAAA,CAClC,SAAWJ,CAAAA,EAAY,CACrBD,EAAeC,CAAAA,CAASI,GAAAA,CAAM,KAAK,EACrC,CAAA,CACA,MAAOA,GAAAA,CAAM,KAAA,EAAO,MACtB,CAAA,CACAF,GAAAA,CAACU,EAAA,EAAY,CAAA,CAAA,CACf,EAEJ,CAEJ","file":"chunk-WXMCINGZ.js","sourcesContent":["import { useId } from 'react';\nimport type { JSX } from 'react';\nimport type { FormFieldValue } from '../../graphql-client/types';\nimport { FormControl, FormDescription, FormField, FormLabel, FormMessage, FormItem } from '../../ui/primitives/form';\nimport { Input } from '../../ui/primitives/input';\nimport type { FormFieldParams } from '../types';\nimport { DefaultValueSwitch } from './default-value-switch';\n\nexport function Text({ control, fieldSchema, setValue }: FormFieldParams<'text'>): JSX.Element {\n const { name, label, isEditable, options } = fieldSchema;\n const id = useId();\n\n function handleInput(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n previousValue: FormFieldValue | undefined\n ): void {\n setValue(name, {\n ...previousValue,\n value: event.currentTarget.value,\n });\n }\n\n function handleCheckbox(checked: boolean, value: FormFieldValue | undefined): void {\n setValue(name, {\n ...value,\n disabled: checked,\n });\n }\n\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }: { field: { value?: FormFieldValue } }) => (\n <FormItem>\n <FormLabel htmlFor={id}>{label}</FormLabel>\n {options?.comment ? <FormDescription>{options.comment}</FormDescription> : null}\n <FormControl>\n <Input\n className={`fk:w-full fk:mt-[0.1875rem] ${\n !field.value?.scope || field.value.scope === 'default' ? 'fk:mb-3' : ''\n }`}\n disabled={isEditable === false || field.value?.disabled}\n id={id}\n {...field}\n onChange={(event) => {\n handleInput(event, field.value);\n }}\n value={(field.value?.value as string) || ''}\n />\n </FormControl>\n\n <DefaultValueSwitch\n checked={field.value?.disabled ?? false}\n onChange={(checked) => {\n handleCheckbox(checked, field.value);\n }}\n scope={field.value?.scope}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n"]}
@@ -1,2 +1,2 @@
1
- import'./index.css';import {d}from'./chunk-UUGIVWK4.js';import {c}from'./chunk-WDRCARCP.js';import {createContext,useReducer,useContext,useMemo}from'react';import {jsx}from'react/jsx-runtime';import v from'swr';import {find,propEq}from'ramda';var D="core.context.scope:",x={breadcrumbs:[],isRouteLoading:false,pageTitle:"",scope:"",relationships:{}},C=createContext(x),b=createContext(()=>{});function O(t,e){let{type:o,payload:r}=e;switch(o){case "setScope":return typeof localStorage<"u"&&r.projectId&&localStorage.setItem(`${D}${r.projectId}`,r.scope),{...t,scope:r.scope};case "setRelationship":return {...t,relationships:{...t.relationships,...r}};default:throw Error(`Unknown action: ${o}`)}}function K({children:t}){let[e,o]=useReducer(O,x);return jsx(C.Provider,{value:e,children:jsx(b.Provider,{value:o,children:t})})}function I(){return useContext(C)}function V(){return useContext(b)}function F(t,e){let{scope:o}=I(),{projects:r,currentProjectId:u}=d(),{schema:i,scopes:l}=find(propEq(u??"","projectId"))(r),s=l?.find(m=>m.isDefault)?.name??"default",a=e?.commonParams.q?JSON.stringify(e):null,{data:n,error:S,isLoading:p}=v(a,()=>fetch(c(t).search,{headers:{"Content-Type":"application/json"},body:JSON.stringify(e),method:"POST",mode:"cors"}).then(m=>m.json()));return {results:useMemo(()=>L(n?.results??[],t,i,o,s)??[],[n,s,t,i,o]),error:S,isLoading:p}}function J(t){return t.find(e=>e.isPrimary)?.name??t[0]?.name}function L(t,e,o,r,u){return t?.filter(i=>i?.hits?.length>0).map(i=>{let l=i,s=l.collection.replace(`${e}_`,"").replace(/_\d+$/,""),a=find(propEq(s,"plural"))(o);if(!a)return [];let n=J(a?.attributes??[]),S=a?.name??s;return l.hits.map(({document:p})=>{let c=p[n],w=(c&&typeof c!="string"?c[r]??c[u]:null)??p[n],E=Object.entries(p).reduce((h,[d,f])=>{if(d!==n&&d!=="id"&&d!=="_updatedAt"){let T=typeof f!="string"?f[r]??f[u]:f;h[d]=T;}return h},{});return {_id:p.id,_entityName:S,_entityNamePlural:s,[n]:w,...E}})}).flat()}export{D as a,K as b,I as c,V as d,F as e};//# sourceMappingURL=chunk-2PEDKE5Z.js.map
2
- //# sourceMappingURL=chunk-2PEDKE5Z.js.map
1
+ import'./index.css';import {d}from'./chunk-V6R4AWQS.js';import {c}from'./chunk-WDRCARCP.js';import {createContext,useReducer,useContext,useMemo}from'react';import {jsx}from'react/jsx-runtime';import v from'swr';import {find,propEq}from'ramda';var D="core.context.scope:",x={breadcrumbs:[],isRouteLoading:false,pageTitle:"",scope:"",relationships:{}},C=createContext(x),b=createContext(()=>{});function O(t,e){let{type:o,payload:r}=e;switch(o){case "setScope":return typeof localStorage<"u"&&r.projectId&&localStorage.setItem(`${D}${r.projectId}`,r.scope),{...t,scope:r.scope};case "setRelationship":return {...t,relationships:{...t.relationships,...r}};default:throw Error(`Unknown action: ${o}`)}}function K({children:t}){let[e,o]=useReducer(O,x);return jsx(C.Provider,{value:e,children:jsx(b.Provider,{value:o,children:t})})}function I(){return useContext(C)}function V(){return useContext(b)}function F(t,e){let{scope:o}=I(),{projects:r,currentProjectId:u}=d(),{schema:i,scopes:l}=find(propEq(u??"","projectId"))(r),s=l?.find(m=>m.isDefault)?.name??"default",a=e?.commonParams.q?JSON.stringify(e):null,{data:n,error:S,isLoading:p}=v(a,()=>fetch(c(t).search,{headers:{"Content-Type":"application/json"},body:JSON.stringify(e),method:"POST",mode:"cors"}).then(m=>m.json()));return {results:useMemo(()=>L(n?.results??[],t,i,o,s)??[],[n,s,t,i,o]),error:S,isLoading:p}}function J(t){return t.find(e=>e.isPrimary)?.name??t[0]?.name}function L(t,e,o,r,u){return t?.filter(i=>i?.hits?.length>0).map(i=>{let l=i,s=l.collection.replace(`${e}_`,"").replace(/_\d+$/,""),a=find(propEq(s,"plural"))(o);if(!a)return [];let n=J(a?.attributes??[]),S=a?.name??s;return l.hits.map(({document:p})=>{let c=p[n],w=(c&&typeof c!="string"?c[r]??c[u]:null)??p[n],E=Object.entries(p).reduce((h,[d,f])=>{if(d!==n&&d!=="id"&&d!=="_updatedAt"){let T=typeof f!="string"?f[r]??f[u]:f;h[d]=T;}return h},{});return {_id:p.id,_entityName:S,_entityNamePlural:s,[n]:w,...E}})}).flat()}export{D as a,K as b,I as c,V as d,F as e};//# sourceMappingURL=chunk-WZ533Y4O.js.map
2
+ //# sourceMappingURL=chunk-WZ533Y4O.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/app-context.tsx","../src/core/use-search.tsx"],"names":["SCOPE_STORAGE_KEY","initialState","AppContext","createContext","AppDispatchContext","reducer","state","action","type","payload","AppProvider","children","dispatch","useReducer","jsx","useAppContext","useContext","useAppDispatch","useSearch","projectId","searchRequest","scope","projects","currentProjectId","useConfig","schema","scopes","find","propEq","defaultScope","s","swrKey","data","error","isLoading","useSWR","apiPaths","res","useMemo","mapResults","getPrimaryAttributeName","schemaAttributes","attr","results","result","item","entityNamePlural","entitySchema","primaryAttributeName","entityName","document","primaryAttribute","primaryAttributeValue","attributes","acc","key","value","scopedValue"],"mappings":"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","file":"chunk-2PEDKE5Z.js","sourcesContent":["'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport type { ActionSetRelationship, ActionSetScope, AppContextType } from './types';\n\nexport const SCOPE_STORAGE_KEY = 'core.context.scope:';\n\nconst initialState = {\n breadcrumbs: [],\n isRouteLoading: false,\n pageTitle: '',\n scope: '',\n relationships: {},\n};\n\nconst AppContext = createContext<AppContextType>(initialState);\n\nconst AppDispatchContext = createContext<Dispatch<ActionSetRelationship | ActionSetScope>>(() => {\n /* void */\n});\n\nfunction reducer(state: AppContextType, action: ActionSetRelationship | ActionSetScope): AppContextType {\n const { type, payload } = action;\n\n switch (type) {\n case 'setScope':\n if (typeof localStorage !== 'undefined' && payload.projectId) {\n localStorage.setItem(`${SCOPE_STORAGE_KEY}${payload.projectId}`, payload.scope);\n }\n\n return {\n ...state,\n scope: payload.scope,\n };\n case 'setRelationship':\n return {\n ...state,\n relationships: { ...state.relationships, ...payload },\n };\n default:\n throw Error(`Unknown action: ${type as string}`);\n }\n}\n\nexport function AppProvider({ children }: { children: ReactNode }): JSX.Element {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AppContext.Provider value={state}>\n <AppDispatchContext.Provider value={dispatch}>{children}</AppDispatchContext.Provider>\n </AppContext.Provider>\n );\n}\n\nexport function useAppContext(): AppContextType {\n return useContext(AppContext);\n}\n\nexport function useAppDispatch(): Dispatch<ActionSetRelationship | ActionSetScope> {\n return useContext(AppDispatchContext);\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport useSWR from 'swr';\nimport { find, propEq } from 'ramda';\nimport { apiPaths } from './api-paths';\nimport { useAppContext } from './app-context';\nimport { useConfig } from './config/config-context';\nimport type { SingleProject } from './config/types';\nimport type {\n Attribute,\n Entity,\n RawResultItem,\n RawSearchResultItems,\n SearchRequestProps,\n SearchResultItem,\n} from './types';\n\nexport function useSearch(\n projectId: string,\n searchRequest: SearchRequestProps | null\n): { results: SearchResultItem[] | []; error: Error; isLoading: boolean } {\n const { scope } = useAppContext();\n const { projects, currentProjectId } = useConfig();\n const { schema, scopes } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const defaultScope = scopes?.find((s) => s.isDefault)?.name ?? 'default';\n const swrKey = searchRequest?.commonParams.q ? JSON.stringify(searchRequest) : null;\n const { data, error, isLoading } = useSWR(swrKey, () =>\n fetch(apiPaths(projectId).search, {\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(searchRequest),\n method: 'POST',\n mode: 'cors',\n }).then((res) => res.json() as Promise<{ results: RawSearchResultItems }>)\n );\n const results = useMemo(\n () => mapResults(data?.results ?? [], projectId, schema, scope, defaultScope) ?? [],\n [data, defaultScope, projectId, schema, scope]\n );\n\n return { results, error, isLoading };\n}\n\n/**\n * Find the name of the attribute of an entity with isPrimary === true.\n * The value of that attribute is returned as the value for the relationship attribute\n */\nfunction getPrimaryAttributeName(schemaAttributes: Attribute[]): string {\n return schemaAttributes.find((attr) => attr.isPrimary)?.name ?? schemaAttributes[0]?.name;\n}\n\nfunction mapResults(\n results: RawSearchResultItems | undefined,\n projectId: string,\n schema: Entity[],\n scope: string,\n defaultScope: string\n): SearchResultItem[] | undefined {\n return results\n ?.filter((result) => (result as RawResultItem)?.hits?.length > 0)\n .map((result) => {\n const item = result as RawResultItem;\n const entityNamePlural = item.collection.replace(`${projectId}_`, '').replace(/_\\d+$/, '');\n const entitySchema = find<Entity>(propEq(entityNamePlural, 'plural'))(schema);\n\n if (!entitySchema) {\n return [];\n }\n\n const primaryAttributeName = getPrimaryAttributeName(entitySchema?.attributes ?? []);\n const entityName = entitySchema?.name ?? entityNamePlural;\n\n // iterate over the hits and return an object with the primary attribute value first and then the rest of the attributes.\n return item.hits.map(({ document }) => {\n const primaryAttribute = document[primaryAttributeName];\n const scopedPrimaryAttribute =\n primaryAttribute && typeof primaryAttribute !== 'string'\n ? (primaryAttribute[scope] ?? primaryAttribute[defaultScope])\n : null;\n const primaryAttributeValue = scopedPrimaryAttribute ?? document[primaryAttributeName];\n const attributes = Object.entries(document).reduce(\n (acc: Omit<SearchResultItem, '_id' | '_entityName' | '_entityNamePlural'>, [key, value]) => {\n if (key !== primaryAttributeName && key !== 'id' && key !== '_updatedAt') {\n const scopedValue = typeof value !== 'string' ? (value[scope] ?? value[defaultScope]) : value;\n\n acc[key] = scopedValue;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n _id: document.id,\n _entityName: entityName,\n _entityNamePlural: entityNamePlural,\n [primaryAttributeName]: primaryAttributeValue as string,\n ...attributes,\n };\n });\n })\n .flat();\n}\n"]}
1
+ {"version":3,"sources":["../src/core/app-context.tsx","../src/core/use-search.tsx"],"names":["SCOPE_STORAGE_KEY","initialState","AppContext","createContext","AppDispatchContext","reducer","state","action","type","payload","AppProvider","children","dispatch","useReducer","jsx","useAppContext","useContext","useAppDispatch","useSearch","projectId","searchRequest","scope","projects","currentProjectId","useConfig","schema","scopes","find","propEq","defaultScope","s","swrKey","data","error","isLoading","useSWR","apiPaths","res","useMemo","mapResults","getPrimaryAttributeName","schemaAttributes","attr","results","result","item","entityNamePlural","entitySchema","primaryAttributeName","entityName","document","primaryAttribute","primaryAttributeValue","attributes","acc","key","value","scopedValue"],"mappings":"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","file":"chunk-WZ533Y4O.js","sourcesContent":["'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport type { ActionSetRelationship, ActionSetScope, AppContextType } from './types';\n\nexport const SCOPE_STORAGE_KEY = 'core.context.scope:';\n\nconst initialState = {\n breadcrumbs: [],\n isRouteLoading: false,\n pageTitle: '',\n scope: '',\n relationships: {},\n};\n\nconst AppContext = createContext<AppContextType>(initialState);\n\nconst AppDispatchContext = createContext<Dispatch<ActionSetRelationship | ActionSetScope>>(() => {\n /* void */\n});\n\nfunction reducer(state: AppContextType, action: ActionSetRelationship | ActionSetScope): AppContextType {\n const { type, payload } = action;\n\n switch (type) {\n case 'setScope':\n if (typeof localStorage !== 'undefined' && payload.projectId) {\n localStorage.setItem(`${SCOPE_STORAGE_KEY}${payload.projectId}`, payload.scope);\n }\n\n return {\n ...state,\n scope: payload.scope,\n };\n case 'setRelationship':\n return {\n ...state,\n relationships: { ...state.relationships, ...payload },\n };\n default:\n throw Error(`Unknown action: ${type as string}`);\n }\n}\n\nexport function AppProvider({ children }: { children: ReactNode }): JSX.Element {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AppContext.Provider value={state}>\n <AppDispatchContext.Provider value={dispatch}>{children}</AppDispatchContext.Provider>\n </AppContext.Provider>\n );\n}\n\nexport function useAppContext(): AppContextType {\n return useContext(AppContext);\n}\n\nexport function useAppDispatch(): Dispatch<ActionSetRelationship | ActionSetScope> {\n return useContext(AppDispatchContext);\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport useSWR from 'swr';\nimport { find, propEq } from 'ramda';\nimport { apiPaths } from './api-paths';\nimport { useAppContext } from './app-context';\nimport { useConfig } from './config/config-context';\nimport type { SingleProject } from './config/types';\nimport type {\n Attribute,\n Entity,\n RawResultItem,\n RawSearchResultItems,\n SearchRequestProps,\n SearchResultItem,\n} from './types';\n\nexport function useSearch(\n projectId: string,\n searchRequest: SearchRequestProps | null\n): { results: SearchResultItem[] | []; error: Error; isLoading: boolean } {\n const { scope } = useAppContext();\n const { projects, currentProjectId } = useConfig();\n const { schema, scopes } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const defaultScope = scopes?.find((s) => s.isDefault)?.name ?? 'default';\n const swrKey = searchRequest?.commonParams.q ? JSON.stringify(searchRequest) : null;\n const { data, error, isLoading } = useSWR(swrKey, () =>\n fetch(apiPaths(projectId).search, {\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(searchRequest),\n method: 'POST',\n mode: 'cors',\n }).then((res) => res.json() as Promise<{ results: RawSearchResultItems }>)\n );\n const results = useMemo(\n () => mapResults(data?.results ?? [], projectId, schema, scope, defaultScope) ?? [],\n [data, defaultScope, projectId, schema, scope]\n );\n\n return { results, error, isLoading };\n}\n\n/**\n * Find the name of the attribute of an entity with isPrimary === true.\n * The value of that attribute is returned as the value for the relationship attribute\n */\nfunction getPrimaryAttributeName(schemaAttributes: Attribute[]): string {\n return schemaAttributes.find((attr) => attr.isPrimary)?.name ?? schemaAttributes[0]?.name;\n}\n\nfunction mapResults(\n results: RawSearchResultItems | undefined,\n projectId: string,\n schema: Entity[],\n scope: string,\n defaultScope: string\n): SearchResultItem[] | undefined {\n return results\n ?.filter((result) => (result as RawResultItem)?.hits?.length > 0)\n .map((result) => {\n const item = result as RawResultItem;\n const entityNamePlural = item.collection.replace(`${projectId}_`, '').replace(/_\\d+$/, '');\n const entitySchema = find<Entity>(propEq(entityNamePlural, 'plural'))(schema);\n\n if (!entitySchema) {\n return [];\n }\n\n const primaryAttributeName = getPrimaryAttributeName(entitySchema?.attributes ?? []);\n const entityName = entitySchema?.name ?? entityNamePlural;\n\n // iterate over the hits and return an object with the primary attribute value first and then the rest of the attributes.\n return item.hits.map(({ document }) => {\n const primaryAttribute = document[primaryAttributeName];\n const scopedPrimaryAttribute =\n primaryAttribute && typeof primaryAttribute !== 'string'\n ? (primaryAttribute[scope] ?? primaryAttribute[defaultScope])\n : null;\n const primaryAttributeValue = scopedPrimaryAttribute ?? document[primaryAttributeName];\n const attributes = Object.entries(document).reduce(\n (acc: Omit<SearchResultItem, '_id' | '_entityName' | '_entityNamePlural'>, [key, value]) => {\n if (key !== primaryAttributeName && key !== 'id' && key !== '_updatedAt') {\n const scopedValue = typeof value !== 'string' ? (value[scope] ?? value[defaultScope]) : value;\n\n acc[key] = scopedValue;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n _id: document.id,\n _entityName: entityName,\n _entityNamePlural: entityNamePlural,\n [primaryAttributeName]: primaryAttributeValue as string,\n ...attributes,\n };\n });\n })\n .flat();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a}from'./chunk-OEWYLKO7.js';import {a as a$1}from'./chunk-HAQICAOQ.js';import {c,e,f,h,g,i}from'./chunk-FVFRTCEB.js';import {jsx,jsxs}from'react/jsx-runtime';function y({control:v,fieldSchema:F,setValue:m}){let{name:l,label:k,isEditable:b,options:t}=F;function h$1(e,o){m(l,{...o,value:e.currentTarget.value});}function g$1(e,o){m(l,{...o,disabled:e});}return jsx(c,{control:v,name:l,render:({field:e$1})=>jsxs(e,{children:[jsxs("div",{className:"fk:flex",children:[jsxs("div",{className:"fk:full-w fk:grid fk:gap-2",children:[jsx(f,{children:k}),t?.comment?jsx(h,{children:t.comment}):null]}),jsx("div",{className:"fk:h-full fk:self-end fk:ml-auto"})]}),jsx(g,{children:jsx(a,{className:`fk:w-full fk:mt-[0.1875rem] ${!e$1.value?.scope||e$1.value.scope==="default"?"fk:mb-3":""}`,disabled:b===false||e$1.value?.disabled,...e$1,onChange:o=>{h$1(o,e$1.value);},value:e$1.value?.value||""})}),jsx(a$1,{checked:e$1.value?.disabled??false,onChange:o=>{g$1(o,e$1.value);},scope:e$1.value?.scope}),jsx(i,{})]})})}export{y as a};//# sourceMappingURL=chunk-YA4ACPM5.js.map
2
+ //# sourceMappingURL=chunk-YA4ACPM5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/form/fields/textarea.tsx"],"names":["Textarea","control","fieldSchema","setValue","name","label","isEditable","options","handleInput","event","previousValue","handleCheckbox","checked","value","jsx","FormField","field","jsxs","FormItem","FormLabel","FormDescription","FormControl","DefaultValueSwitch","FormMessage"],"mappings":"mLAOO,SAASA,EAAS,CAAE,OAAA,CAAAC,EAAS,WAAA,CAAAC,CAAAA,CAAa,SAAAC,CAAS,CAAA,CAA6C,CACrG,GAAM,CAAE,KAAAC,CAAAA,CAAM,KAAA,CAAAC,CAAAA,CAAO,UAAA,CAAAC,IAAY,OAAA,CAAAC,CAAQ,EAAIL,CAAAA,CAE7C,SAASM,IACPC,CAAAA,CACAC,CAAAA,CACM,CACNP,CAAAA,CAASC,CAAAA,CAAM,CACb,GAAGM,CAAAA,CACH,MAAOD,CAAAA,CAAM,aAAA,CAAc,KAC7B,CAAC,EACH,CAEA,SAASE,IAAeC,CAAAA,CAAkBC,CAAAA,CAAyC,CACjFV,CAAAA,CAASC,CAAAA,CAAM,CACb,GAAGS,CAAAA,CACH,SAAUD,CACZ,CAAC,EACH,CAEA,OACEE,IAACC,CAAAA,CAAA,CACC,QAASd,CAAAA,CACT,IAAA,CAAMG,EACN,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAAY,GAAM,IACfC,IAAAA,CAACC,CAAAA,CAAA,CACC,QAAA,CAAA,CAAAD,IAAAA,CAAC,OAAI,SAAA,CAAU,SAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,4BAAA,CACb,QAAA,CAAA,CAAAH,IAACK,CAAAA,CAAA,CAAW,QAAA,CAAAd,CAAAA,CAAM,EACjBE,CAAAA,EAAS,OAAA,CAAUO,IAACM,CAAAA,CAAA,CAAiB,SAAAb,CAAAA,CAAQ,OAAA,CAAQ,EAAqB,IAAA,CAAA,CAC7E,CAAA,CACAO,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAEf,CAAA,CAAA,CACF,CAAA,CACAA,IAACO,CAAAA,CAAA,CACC,QAAA,CAAAP,GAAAA,CAACd,EAAA,CACC,SAAA,CAAW,+BACT,CAACgB,GAAAA,CAAM,OAAO,KAAA,EAASA,GAAAA,CAAM,MAAM,KAAA,GAAU,SAAA,CAAY,UAAY,EACvE,CAAA,CAAA,CACA,SAAUV,GAAAA,GAAe,KAAA,EAASU,IAAM,KAAA,EAAO,QAAA,CAC9C,GAAGA,GAAAA,CACJ,SAAWP,CAAAA,EAAU,CACnBD,IAAYC,CAAAA,CAAOO,GAAAA,CAAM,KAAK,EAChC,CAAA,CACA,MAAQA,GAAAA,CAAM,KAAA,EAAO,OAAoB,EAAA,CAC3C,CAAA,CACF,EACAF,GAAAA,CAACQ,CAAAA,CAAA,CACC,OAAA,CAASN,GAAAA,CAAM,OAAO,QAAA,EAAY,KAAA,CAClC,SAAWJ,CAAAA,EAAY,CACrBD,IAAeC,CAAAA,CAASI,GAAAA,CAAM,KAAK,EACrC,CAAA,CACA,MAAOA,GAAAA,CAAM,KAAA,EAAO,MACtB,CAAA,CACAF,GAAAA,CAACS,EAAA,EAAY,CAAA,CAAA,CACf,EAEJ,CAEJ","file":"chunk-KR7CLPY2.js","sourcesContent":["import type { JSX } from 'react';\nimport type { FormFieldValue } from '../../graphql-client/types';\nimport { FormControl, FormDescription, FormField, FormLabel, FormMessage, FormItem } from '../../ui/primitives/form';\nimport { Textarea as TextareaPrimitive } from '../../ui/primitives/textarea';\nimport type { FormFieldParams } from '../types';\nimport { DefaultValueSwitch } from './default-value-switch';\n\nexport function Textarea({ control, fieldSchema, setValue }: FormFieldParams<'textarea'>): JSX.Element {\n const { name, label, isEditable, options } = fieldSchema;\n\n function handleInput(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n previousValue: FormFieldValue | undefined\n ): void {\n setValue(name, {\n ...previousValue,\n value: event.currentTarget.value,\n });\n }\n\n function handleCheckbox(checked: boolean, value: FormFieldValue | undefined): void {\n setValue(name, {\n ...value,\n disabled: checked,\n });\n }\n\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }: { field: { value?: FormFieldValue } }) => (\n <FormItem>\n <div className=\"fk:flex\">\n <div className=\"fk:full-w fk:grid fk:gap-2\">\n <FormLabel>{label}</FormLabel>\n {options?.comment ? <FormDescription>{options.comment}</FormDescription> : null}\n </div>\n <div className=\"fk:h-full fk:self-end fk:ml-auto\">\n {/* TODO: this should be a slot that can receive user-defined components and system components like Presence and AI Writting Tools */}\n </div>\n </div>\n <FormControl>\n <TextareaPrimitive\n className={`fk:w-full fk:mt-[0.1875rem] ${\n !field.value?.scope || field.value.scope === 'default' ? 'fk:mb-3' : ''\n }`}\n disabled={isEditable === false || field.value?.disabled}\n {...field}\n onChange={(event) => {\n handleInput(event, field.value);\n }}\n value={(field.value?.value as string) || ''}\n />\n </FormControl>\n <DefaultValueSwitch\n checked={field.value?.disabled ?? false}\n onChange={(checked) => {\n handleCheckbox(checked, field.value);\n }}\n scope={field.value?.scope}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/form/fields/textarea.tsx"],"names":["Textarea","control","fieldSchema","setValue","name","label","isEditable","options","handleInput","event","previousValue","handleCheckbox","checked","value","jsx","FormField","field","jsxs","FormItem","FormLabel","FormDescription","FormControl","DefaultValueSwitch","FormMessage"],"mappings":"0LAOO,SAASA,EAAS,CAAE,OAAA,CAAAC,EAAS,WAAA,CAAAC,CAAAA,CAAa,SAAAC,CAAS,CAAA,CAA6C,CACrG,GAAM,CAAE,KAAAC,CAAAA,CAAM,KAAA,CAAAC,CAAAA,CAAO,UAAA,CAAAC,EAAY,OAAA,CAAAC,CAAQ,EAAIL,CAAAA,CAE7C,SAASM,IACPC,CAAAA,CACAC,CAAAA,CACM,CACNP,CAAAA,CAASC,CAAAA,CAAM,CACb,GAAGM,CAAAA,CACH,MAAOD,CAAAA,CAAM,aAAA,CAAc,KAC7B,CAAC,EACH,CAEA,SAASE,IAAeC,CAAAA,CAAkBC,CAAAA,CAAyC,CACjFV,CAAAA,CAASC,CAAAA,CAAM,CACb,GAAGS,CAAAA,CACH,SAAUD,CACZ,CAAC,EACH,CAEA,OACEE,IAACC,CAAAA,CAAA,CACC,QAASd,CAAAA,CACT,IAAA,CAAMG,EACN,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAAY,GAAM,IACfC,IAAAA,CAACC,CAAAA,CAAA,CACC,QAAA,CAAA,CAAAD,IAAAA,CAAC,OAAI,SAAA,CAAU,SAAA,CACb,UAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,4BAAA,CACb,QAAA,CAAA,CAAAH,IAACK,CAAAA,CAAA,CAAW,QAAA,CAAAd,CAAAA,CAAM,EACjBE,CAAAA,EAAS,OAAA,CAAUO,IAACM,CAAAA,CAAA,CAAiB,SAAAb,CAAAA,CAAQ,OAAA,CAAQ,EAAqB,IAAA,CAAA,CAC7E,CAAA,CACAO,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAEf,CAAA,CAAA,CACF,CAAA,CACAA,IAACO,CAAAA,CAAA,CACC,QAAA,CAAAP,GAAAA,CAACd,EAAA,CACC,SAAA,CAAW,+BACT,CAACgB,GAAAA,CAAM,OAAO,KAAA,EAASA,GAAAA,CAAM,MAAM,KAAA,GAAU,SAAA,CAAY,UAAY,EACvE,CAAA,CAAA,CACA,SAAUV,CAAAA,GAAe,KAAA,EAASU,IAAM,KAAA,EAAO,QAAA,CAC9C,GAAGA,GAAAA,CACJ,SAAWP,CAAAA,EAAU,CACnBD,IAAYC,CAAAA,CAAOO,GAAAA,CAAM,KAAK,EAChC,CAAA,CACA,MAAQA,GAAAA,CAAM,KAAA,EAAO,OAAoB,EAAA,CAC3C,CAAA,CACF,EACAF,GAAAA,CAACQ,GAAAA,CAAA,CACC,OAAA,CAASN,GAAAA,CAAM,OAAO,QAAA,EAAY,KAAA,CAClC,SAAWJ,CAAAA,EAAY,CACrBD,IAAeC,CAAAA,CAASI,GAAAA,CAAM,KAAK,EACrC,CAAA,CACA,MAAOA,GAAAA,CAAM,KAAA,EAAO,MACtB,CAAA,CACAF,GAAAA,CAACS,EAAA,EAAY,CAAA,CAAA,CACf,EAEJ,CAEJ","file":"chunk-YA4ACPM5.js","sourcesContent":["import type { JSX } from 'react';\nimport type { FormFieldValue } from '../../graphql-client/types';\nimport { FormControl, FormDescription, FormField, FormLabel, FormMessage, FormItem } from '../../ui/primitives/form';\nimport { Textarea as TextareaPrimitive } from '../../ui/primitives/textarea';\nimport type { FormFieldParams } from '../types';\nimport { DefaultValueSwitch } from './default-value-switch';\n\nexport function Textarea({ control, fieldSchema, setValue }: FormFieldParams<'textarea'>): JSX.Element {\n const { name, label, isEditable, options } = fieldSchema;\n\n function handleInput(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n previousValue: FormFieldValue | undefined\n ): void {\n setValue(name, {\n ...previousValue,\n value: event.currentTarget.value,\n });\n }\n\n function handleCheckbox(checked: boolean, value: FormFieldValue | undefined): void {\n setValue(name, {\n ...value,\n disabled: checked,\n });\n }\n\n return (\n <FormField\n control={control}\n name={name}\n render={({ field }: { field: { value?: FormFieldValue } }) => (\n <FormItem>\n <div className=\"fk:flex\">\n <div className=\"fk:full-w fk:grid fk:gap-2\">\n <FormLabel>{label}</FormLabel>\n {options?.comment ? <FormDescription>{options.comment}</FormDescription> : null}\n </div>\n <div className=\"fk:h-full fk:self-end fk:ml-auto\">\n {/* TODO: this should be a slot that can receive user-defined components and system components like Presence and AI Writting Tools */}\n </div>\n </div>\n <FormControl>\n <TextareaPrimitive\n className={`fk:w-full fk:mt-[0.1875rem] ${\n !field.value?.scope || field.value.scope === 'default' ? 'fk:mb-3' : ''\n }`}\n disabled={isEditable === false || field.value?.disabled}\n {...field}\n onChange={(event) => {\n handleInput(event, field.value);\n }}\n value={(field.value?.value as string) || ''}\n />\n </FormControl>\n <DefaultValueSwitch\n checked={field.value?.disabled ?? false}\n onChange={(checked) => {\n handleCheckbox(checked, field.value);\n }}\n scope={field.value?.scope}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a,b,c,e}from'./chunk-YW2EEXMV.js';import {a as a$1}from'./chunk-O2QMYUPS.js';import {useRef,useState,useEffect}from'react';import {Check,Copy}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var g=500,P=3e3;function D({value:e$1}){let r=useRef(null),n=useRef(null),[h,v]=useState(false),[i,c$1]=useState(false),[x,f]=useState(false);useEffect(()=>{let o=r.current;if(!o)return;function l(){r.current&&v(r.current.scrollWidth>r.current.clientWidth);}l();let u=new ResizeObserver(l);return u.observe(o),()=>{u.disconnect();}},[e$1]),useEffect(()=>()=>{n.current&&clearTimeout(n.current);},[]);async function C(o){if(o.preventDefault(),o.stopPropagation(),!!e$1){try{await navigator.clipboard.writeText(e$1);}catch{return}c$1(true),f(true),n.current&&clearTimeout(n.current),n.current=setTimeout(()=>{c$1(false),f(false);},P);}}function w(o){i||f(o&&h);}if(!e$1)return jsx("div",{className:"fk:truncate"});let E=e$1.length>g?`${e$1.slice(0,g)}\u2026`:e$1;return jsx(a,{delayDuration:400,children:jsxs(b,{open:x,onOpenChange:w,children:[jsx(c,{asChild:true,children:jsxs("button",{"aria-label":"Copy value",className:a$1("fk:group/copyable fk:relative fk:flex fk:w-full fk:min-w-0 fk:items-center fk:rounded-sm fk:border-0 fk:bg-transparent fk:px-0.5 fk:-mx-0.5 fk:py-0.5 fk:text-left fk:text-inherit fk:font-inherit","fk:cursor-pointer fk:transition-[transform,background-color] fk:duration-75 fk:ease-out","fk:hover:bg-muted/50 fk:active:translate-y-px fk:active:scale-[0.98] fk:active:bg-muted/70","fk:focus-visible:outline-hidden fk:focus-visible:ring-1 fk:focus-visible:ring-ring"),onClick:C,type:"button",children:[jsx("span",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:pr-4",ref:r,children:e$1}),jsx("span",{"aria-hidden":true,className:a$1("fk:pointer-events-none fk:absolute fk:right-0.5 fk:top-1/2 fk:flex fk:-translate-y-1/2 fk:items-center fk:justify-center","fk:rounded-sm fk:bg-muted/80 fk:p-0.5 fk:text-muted-foreground fk:shadow-sm fk:ring-1 fk:ring-border/60","fk:transition-opacity fk:duration-100",i?"fk:opacity-100 fk:text-foreground":"fk:opacity-0 fk:group-hover/copyable:opacity-100 fk:group-focus-visible/copyable:opacity-100"),children:i?jsx(Check,{className:"fk:size-3"}):jsx(Copy,{className:"fk:size-3"})})]})}),jsx(e,{className:"fk:max-w-xs fk:wrap-break-word",children:i?"Copied to clipboard":E})]})})}export{D as a};//# sourceMappingURL=chunk-ZEZ6TRCO.js.map
2
+ //# sourceMappingURL=chunk-ZEZ6TRCO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data-grid/preview-components/copyable-truncated-text.tsx"],"names":["TOOLTIP_MAX_LENGTH","COPIED_DISMISS_MS","CopyableTruncatedText","value","textRef","useRef","dismissTimeoutRef","isTruncated","setIsTruncated","useState","copied","setCopied","tooltipOpen","setTooltipOpen","useEffect","element","updateTruncation","observer","handleClick","event","handleTooltipOpenChange","open","jsx","tooltipText","TooltipProvider","jsxs","Tooltip","TooltipTrigger","cn","CheckIcon","CopyIcon","TooltipContent"],"mappings":"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","file":"chunk-ZEZ6TRCO.js","sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { JSX, MouseEvent } from 'react';\nimport { Check as CheckIcon, Copy as CopyIcon } from 'lucide-react';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { cn } from '../../ui/lib/utils';\n\nconst TOOLTIP_MAX_LENGTH = 500;\nconst COPIED_DISMISS_MS = 3000;\n\ntype CopyableTruncatedTextProps = {\n value: string;\n};\n\nexport function CopyableTruncatedText({ value }: CopyableTruncatedTextProps): JSX.Element {\n const textRef = useRef<HTMLSpanElement>(null);\n const dismissTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n const [copied, setCopied] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n useEffect(() => {\n const element = textRef.current;\n\n if (!element) {\n return;\n }\n\n function updateTruncation(): void {\n if (!textRef.current) {\n return;\n }\n\n setIsTruncated(textRef.current.scrollWidth > textRef.current.clientWidth);\n }\n\n updateTruncation();\n\n const observer = new ResizeObserver(updateTruncation);\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [value]);\n\n useEffect(() => {\n return () => {\n if (dismissTimeoutRef.current) {\n clearTimeout(dismissTimeoutRef.current);\n }\n };\n }, []);\n\n async function handleClick(event: MouseEvent<HTMLButtonElement>): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (!value) {\n return;\n }\n\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n return;\n }\n\n setCopied(true);\n setTooltipOpen(true);\n\n if (dismissTimeoutRef.current) {\n clearTimeout(dismissTimeoutRef.current);\n }\n\n dismissTimeoutRef.current = setTimeout(() => {\n setCopied(false);\n setTooltipOpen(false);\n }, COPIED_DISMISS_MS);\n }\n\n function handleTooltipOpenChange(open: boolean): void {\n if (copied) {\n return;\n }\n\n setTooltipOpen(open && isTruncated);\n }\n\n if (!value) {\n return <div className=\"fk:truncate\" />;\n }\n\n const tooltipText =\n value.length > TOOLTIP_MAX_LENGTH ? `${value.slice(0, TOOLTIP_MAX_LENGTH)}…` : value;\n\n return (\n <TooltipProvider delayDuration={400}>\n <Tooltip open={tooltipOpen} onOpenChange={handleTooltipOpenChange}>\n <TooltipTrigger asChild>\n <button\n aria-label=\"Copy value\"\n className={cn(\n 'fk:group/copyable fk:relative fk:flex fk:w-full fk:min-w-0 fk:items-center fk:rounded-sm fk:border-0 fk:bg-transparent fk:px-0.5 fk:-mx-0.5 fk:py-0.5 fk:text-left fk:text-inherit fk:font-inherit',\n 'fk:cursor-pointer fk:transition-[transform,background-color] fk:duration-75 fk:ease-out',\n 'fk:hover:bg-muted/50 fk:active:translate-y-px fk:active:scale-[0.98] fk:active:bg-muted/70',\n 'fk:focus-visible:outline-hidden fk:focus-visible:ring-1 fk:focus-visible:ring-ring'\n )}\n onClick={handleClick}\n type=\"button\"\n >\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:pr-4\" ref={textRef}>\n {value}\n </span>\n <span\n aria-hidden\n className={cn(\n 'fk:pointer-events-none fk:absolute fk:right-0.5 fk:top-1/2 fk:flex fk:-translate-y-1/2 fk:items-center fk:justify-center',\n 'fk:rounded-sm fk:bg-muted/80 fk:p-0.5 fk:text-muted-foreground fk:shadow-sm fk:ring-1 fk:ring-border/60',\n 'fk:transition-opacity fk:duration-100',\n copied\n ? 'fk:opacity-100 fk:text-foreground'\n : 'fk:opacity-0 fk:group-hover/copyable:opacity-100 fk:group-focus-visible/copyable:opacity-100'\n )}\n >\n {copied ? <CheckIcon className=\"fk:size-3\" /> : <CopyIcon className=\"fk:size-3\" />}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"fk:max-w-xs fk:wrap-break-word\">\n {copied ? 'Copied to clipboard' : tooltipText}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';export{a as DateTime}from'./chunk-R7N3MDOP.js';import'./chunk-ZEZ6TRCO.js';import'./chunk-YW2EEXMV.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=datetime-NQTYGZIC.js.map
2
+ //# sourceMappingURL=datetime-NQTYGZIC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"datetime-TWONUNXS.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"datetime-NQTYGZIC.js"}
@@ -0,0 +1,2 @@
1
+ import'./index.css';export{b as Editor}from'./chunk-EOCJR5EY.js';import'./chunk-ZEZ6TRCO.js';import'./chunk-YW2EEXMV.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=editor-YIRZQR3D.js.map
2
+ //# sourceMappingURL=editor-YIRZQR3D.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"editor-NFRMIYVJ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"editor-YIRZQR3D.js"}