@flexkit/studio 0.2.17 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/activity-nav-button-V5DFHADL.js +2 -0
- package/dist/{activity-nav-button-7SVTTHBQ.js.map → activity-nav-button-V5DFHADL.js.map} +1 -1
- package/dist/chat-page-LAK4TFN4.js +4 -0
- package/dist/chat-page-LAK4TFN4.js.map +1 -0
- package/dist/chunk-2NXQF2F7.js +2 -0
- package/dist/chunk-2NXQF2F7.js.map +1 -0
- package/dist/chunk-4IEOAKKK.js +2 -0
- package/dist/chunk-4IEOAKKK.js.map +1 -0
- package/dist/{chunk-3C2EG3SI.js → chunk-54AXLGAK.js} +2 -2
- package/dist/{chunk-3C2EG3SI.js.map → chunk-54AXLGAK.js.map} +1 -1
- package/dist/chunk-6RRB47OZ.js +8 -0
- package/dist/chunk-6RRB47OZ.js.map +1 -0
- package/dist/chunk-A7XHA2P6.js +3 -0
- package/dist/chunk-A7XHA2P6.js.map +1 -0
- package/dist/chunk-BMO7JFAX.js +2 -0
- package/dist/chunk-BMO7JFAX.js.map +1 -0
- package/dist/{chunk-U5D3EDCY.js → chunk-BMX4URYN.js} +2 -2
- package/dist/{chunk-U5D3EDCY.js.map → chunk-BMX4URYN.js.map} +1 -1
- package/dist/chunk-CLCIE5RF.js +2 -0
- package/dist/chunk-CLCIE5RF.js.map +1 -0
- package/dist/{chunk-RYKUNA7Z.js → chunk-DFLAX7EE.js} +2 -2
- package/dist/{chunk-RYKUNA7Z.js.map → chunk-DFLAX7EE.js.map} +1 -1
- package/dist/chunk-DGIY4SKN.js +7 -0
- package/dist/chunk-DGIY4SKN.js.map +1 -0
- package/dist/chunk-DHVKE36X.js +3 -0
- package/dist/chunk-DHVKE36X.js.map +1 -0
- package/dist/chunk-EMFHKTAV.js +2 -0
- package/dist/chunk-EMFHKTAV.js.map +1 -0
- package/dist/chunk-ERDARDGB.js +2 -0
- package/dist/chunk-ERDARDGB.js.map +1 -0
- package/dist/chunk-H2RWSC56.js +3 -0
- package/dist/chunk-H2RWSC56.js.map +1 -0
- package/dist/{chunk-FDN23BPI.js → chunk-HCJAM5LG.js} +2 -2
- package/dist/{chunk-FDN23BPI.js.map → chunk-HCJAM5LG.js.map} +1 -1
- package/dist/chunk-ME55YNBF.js +30 -0
- package/dist/chunk-ME55YNBF.js.map +1 -0
- package/dist/chunk-OOYCTZ3C.js +379 -0
- package/dist/chunk-OOYCTZ3C.js.map +1 -0
- package/dist/chunk-QWQHXMXW.js +2 -0
- package/dist/{chunk-FNWEP2NM.js.map → chunk-QWQHXMXW.js.map} +1 -1
- package/dist/{chunk-ALCK2BJY.js → chunk-UOR437J2.js} +2 -2
- package/dist/{chunk-ALCK2BJY.js.map → chunk-UOR437J2.js.map} +1 -1
- package/dist/{chunk-3KMR2CXS.js → chunk-V6RB45UU.js} +2 -2
- package/dist/{chunk-3KMR2CXS.js.map → chunk-V6RB45UU.js.map} +1 -1
- package/dist/chunk-VMWUMFUL.js +4 -0
- package/dist/chunk-VMWUMFUL.js.map +1 -0
- package/dist/chunk-XMOSCJOI.js +2 -0
- package/dist/chunk-XMOSCJOI.js.map +1 -0
- package/dist/chunk-XNHSHVG2.js +7 -0
- package/dist/chunk-XNHSHVG2.js.map +1 -0
- package/dist/chunk-YDVO6XWD.js +2 -0
- package/dist/chunk-YDVO6XWD.js.map +1 -0
- package/dist/chunk-ZKA2HKNI.js +2 -0
- package/dist/chunk-ZKA2HKNI.js.map +1 -0
- package/dist/entry-3JSFO4OU.js +2 -0
- package/dist/entry-3JSFO4OU.js.map +1 -0
- package/dist/index.css +712 -246
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/list-SY3L2ACH.js +3 -0
- package/dist/list-SY3L2ACH.js.map +1 -0
- package/dist/list-Z2C74QDN.js +2 -0
- package/dist/{list-EXNTXASK.js.map → list-Z2C74QDN.js.map} +1 -1
- package/dist/pages-INCA54HE.js +5 -0
- package/dist/{pages-NWZLOKQM.js.map → pages-INCA54HE.js.map} +1 -1
- package/dist/plugin-pages-WO3MCJKC.js +2 -0
- package/dist/{plugin-pages-2KMZFNFB.js.map → plugin-pages-WO3MCJKC.js.map} +1 -1
- package/dist/record-links-CTB4SC4J.js +2 -0
- package/dist/record-links-CTB4SC4J.js.map +1 -0
- package/dist/root-6MSWGFZX.js +2 -0
- package/dist/root-6MSWGFZX.js.map +1 -0
- package/dist/root-B4D3C37Q.js +2 -0
- package/dist/root-B4D3C37Q.js.map +1 -0
- package/dist/root-DOOWSYWY.js +23 -0
- package/dist/root-DOOWSYWY.js.map +1 -0
- package/dist/root-JA2LFGNX.js +2 -0
- package/dist/root-JA2LFGNX.js.map +1 -0
- package/dist/root-OGX4DUTM.js +2 -0
- package/dist/root-OGX4DUTM.js.map +1 -0
- package/dist/{root-BRCN3D2D.js → root-XHXX3SZG.js} +3 -3
- package/dist/{root-BRCN3D2D.js.map → root-XHXX3SZG.js.map} +1 -1
- package/dist/search-Z4M4R4NJ.js +2 -0
- package/dist/{search-7IJJYUSR.js.map → search-Z4M4R4NJ.js.map} +1 -1
- package/dist/skills-pages-TP2XQPCQ.js +2 -0
- package/dist/{skills-pages-4ELHNJVY.js.map → skills-pages-TP2XQPCQ.js.map} +1 -1
- package/dist/source-5J56KIFA.js +2 -0
- package/dist/source-5J56KIFA.js.map +1 -0
- package/dist/spec-renderer-3GAVSV52.js +2 -0
- package/dist/{spec-renderer-EX7SCFWH.js.map → spec-renderer-3GAVSV52.js.map} +1 -1
- package/dist/ui.d.ts +15 -5
- package/dist/ui.js +1 -1
- package/package.json +13 -5
- package/dist/activity-nav-button-7SVTTHBQ.js +0 -2
- package/dist/chat-page-X3MIN6YC.js +0 -4
- package/dist/chat-page-X3MIN6YC.js.map +0 -1
- package/dist/chunk-7ZFUS62K.js +0 -3
- package/dist/chunk-7ZFUS62K.js.map +0 -1
- package/dist/chunk-D6H64Z37.js +0 -8
- package/dist/chunk-D6H64Z37.js.map +0 -1
- package/dist/chunk-FNWEP2NM.js +0 -2
- package/dist/chunk-NLRSLQUT.js +0 -3
- package/dist/chunk-NLRSLQUT.js.map +0 -1
- package/dist/chunk-P6BZ4QP7.js +0 -2
- package/dist/chunk-P6BZ4QP7.js.map +0 -1
- package/dist/chunk-PKAWL5W4.js +0 -4
- package/dist/chunk-PKAWL5W4.js.map +0 -1
- package/dist/chunk-RNMAR527.js +0 -384
- package/dist/chunk-RNMAR527.js.map +0 -1
- package/dist/chunk-YCCFUGWJ.js +0 -7
- package/dist/chunk-YCCFUGWJ.js.map +0 -1
- package/dist/list-EXNTXASK.js +0 -2
- package/dist/pages-NWZLOKQM.js +0 -5
- package/dist/plugin-pages-2KMZFNFB.js +0 -2
- package/dist/root-A6FK3OR6.js +0 -2
- package/dist/root-A6FK3OR6.js.map +0 -1
- package/dist/root-CUNQWMK4.js +0 -23
- package/dist/root-CUNQWMK4.js.map +0 -1
- package/dist/root-SCCUPXFD.js +0 -2
- package/dist/root-SCCUPXFD.js.map +0 -1
- package/dist/search-7IJJYUSR.js +0 -2
- package/dist/skills-pages-4ELHNJVY.js +0 -2
- package/dist/spec-renderer-EX7SCFWH.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"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","file":"chunk-3KMR2CXS.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"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","file":"chunk-V6RB45UU.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import'./index.css';import {f as f$1,e as e$2}from'./chunk-XNHSHVG2.js';import {r,q,h as h$1,i}from'./chunk-OOYCTZ3C.js';import {b}from'./chunk-ZZRA4567.js';import {c}from'./chunk-BMO7JFAX.js';import {d,c as c$1}from'./chunk-XMOSCJOI.js';import {t}from'./chunk-A7XHA2P6.js';import {f}from'./chunk-H2RWSC56.js';import {na}from'./chunk-DGIY4SKN.js';import {e,g,h,j,o,n,k}from'./chunk-SZEGGBOC.js';import {a,d as d$1,c as c$2,e as e$1,g as g$1}from'./chunk-HDOIOXMP.js';import {b as b$1}from'./chunk-6NRQMG26.js';import {PencilIcon,Trash2Icon,Ellipsis,Settings2,RefreshCw,Loader2,Trash2}from'lucide-react';import {jsxs,jsx}from'react/jsx-runtime';import {lazy,useState,Suspense}from'react';import {find,propEq}from'ramda';import {gql}from'@apollo/client';import {useApolloClient}from'@apollo/client/react';import {toast}from'sonner';function Be({entityName:e$1,entityNamePlural:a,row:c$1,options:i={canDelete:true,canEdit:true}}){let m=c(),N=b(),p=c$1.original._id,D=(i.canDelete??true)&&N,f=i.canEdit??true;function h$1(){m({type:"EditEntity",payload:{entityId:p,entityNamePlural:a}});}function d(){m({type:"DeleteEntity",payload:{entityId:p,entityName:e$1}});}return jsxs("div",{className:"fk:flex",children:[f&&jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1",onClick:h$1,variant:"ghost",children:[jsx(PencilIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Edit"})]}),D&&!f&&jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1",onClick:d,variant:"ghost",children:[jsx(Trash2Icon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Delete"})]}),f&&D&&jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0",variant:"ghost",children:[jsx(Ellipsis,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Additional actions"})]})}),jsxs(h,{align:"end",className:"w-[160px]",children:[jsxs(j,{onClick:h$1,children:[jsx(PencilIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Edit"]}),jsx(o,{}),jsxs(j,{className:"fk:text-destructive",onClick:d,children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete"]})]})]})]})}function Z({table:e$1}){return jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(b$1,{className:"fk:hidden fk:h-8 fk:lg:flex",size:"sm",variant:"outline",children:[jsx(Settings2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"View"]})}),jsxs(h,{align:"end",className:"fk:w-[150px]",children:[jsx(n,{children:"Toggle columns"}),jsx(o,{}),e$1.getAllColumns().filter(a=>typeof a.accessorFn<"u"&&a.getCanHide()).map(a=>jsx(k,{checked:a.getIsVisible(),className:"capitalize",onCheckedChange:c=>{a.toggleVisibility(!!c);},children:a.id},a.id))]})]})}var Ce=lazy(()=>import('./record-links-CTB4SC4J.js').then(e=>({default:e.EntityKnowledgeButton}))),ve=lazy(()=>import('./entry-3JSFO4OU.js').then(e=>({default:e.EntityGraphButton})));function at({entityName:e,isReloading:a$1=false,onReload:c$3,table:i$1}){let m=c(),N=d(),p=c$1(),D=useApolloClient(),{currentProject:f$2,currentProjectId:h}=f(),d$2=f$2?.schema??[],w=f$2?.scopes,[ae,ne,le]=f$1(),[b$2,P]=useState(false),y=b(),r$1=i$1.getSelectedRowModel().rows.map(t=>t.original._id);function se(){m({type:"AddEntity",payload:{entityName:e}});}function ie(t){N({type:"setScope",payload:{projectId:h,scope:t}});}async function re(t){if(t.length===0)return;let u=h$1(e,d$2,t);await new Promise((pe,fe)=>{ne(gql`
|
|
2
|
+
${u}
|
|
3
|
+
`),le({variables:{where:i(t)},update(x){for(let me of t)x.evict({id:me});},onCompleted:()=>{pe();},onError:x=>{fe(x);}}),ae(true);});}function ce(){let t=e==="_asset"?"asset":e.toLowerCase();m({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${r$1.length} ${t}${r$1.length>1?"s":""}`,dialogMessage:r$1.length>1?`Are you sure you want to delete the selected ${t}s? They will be deleted permanently.`:`Are you sure you want to delete the selected ${t}? The item will be deleted permanently.`,dialogCancelTitle:"Cancel",dialogActionLabel:"Delete",isDestructive:true,dialogActionSubmit:async()=>{P(true);try{let u=[...r$1];await re(u),i$1.resetRowSelection(),await r(D,q(e,d$2),u),toast.success(u.length>1?"Items successfully deleted.":"Item successfully deleted.");}catch{toast.error("Failed to delete selected items.");}finally{P(false);}},dialogActionCancel:()=>{}}}});}return jsxs("div",{className:"fk:flex fk:items-center fk:justify-between",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[w&&w.length>0?jsxs(a,{defaultValue:p.scope,onValueChange:t=>{ie(t);},value:p.scope,children:[jsxs(d$1,{className:"fk:w-48!",id:"project",size:"sm",children:[jsx("span",{className:"fk:text-muted-foreground",children:"Scope:"}),jsx(c$2,{children:(find(propEq(p.scope??"","name"))(w)||null)?.label})]}),jsx(e$1,{children:w.map(t=>jsx(g$1,{value:t.name,children:t.label},t.name))})]}):null,jsx(Z,{table:i$1}),c$3?jsx(b$1,{"aria-label":"Reload",className:"fk:h-8",disabled:b$2||a$1,onClick:c$3,size:"icon-sm",variant:"outline",children:jsx(RefreshCw,{className:a$1?"fk:animate-spin":void 0})}):null,jsx(e$2,{table:i$1})]}),r$1.length>0?jsx(na,{disabled:!y,children:jsxs(b$1,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:b$2||!y,onClick:ce,size:"sm",variant:"destructive",children:[b$2?jsx(Loader2,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete (",r$1.length,")"]})}):null,e&&t(e)?jsx(Suspense,{fallback:null,children:jsx(Ce,{entityName:e})}):null,e?jsx(Suspense,{fallback:null,children:jsx(ve,{entityName:e,selectedIds:r$1})}):null,jsx(na,{disabled:!y,children:jsx(b$1,{className:"fk:h-8 fk:lg:flex",disabled:b$2||!y,onClick:se,size:"sm",variant:"default",children:"Create"})})]})}export{Be as a,Z as b,at as c};//# sourceMappingURL=chunk-VMWUMFUL.js.map
|
|
4
|
+
//# sourceMappingURL=chunk-VMWUMFUL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-grid/data-table-row-actions.tsx","../src/data-grid/data-table-view-options.tsx","../src/data-grid/data-table-toolbar.tsx"],"names":["DataTableRowActions","entityName","entityNamePlural","row","options","actionDispatch","useDispatch","canMutate","useCanMutate","entityId","canDelete","canEdit","handleEdit","handleDelete","jsxs","Button","jsx","PencilIcon","Trash2Icon","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DataTableViewOptions","table","Settings2","DropdownMenuLabel","column","DropdownMenuCheckboxItem","value","EntityKnowledgeButton","lazy","m","EntityGraphButton","DataTableToolbar","isReloading","onReload","appDispatch","useAppDispatch","appContext","useAppContext","apolloClient","useApolloClient","currentProject","currentProjectId","useConfig","schema","scopes","runMutation","setMutation","setOptions","useEntityMutation","isDeleting","setIsDeleting","useState","selectedIds","handleCreate","handleScopeChange","deleteSelected","ids","mutation","getEntityDeleteMutation","resolve","reject","gql","getEntityDeleteWhere","cache","id","error","handleBatchDelete","itemLabel","idsToDelete","scheduleEntityListRemoval","getEntityListQueryName","toast","Select","SelectTrigger","SelectValue","find","propEq","SelectContent","scopeItem","SelectItem","RefreshCw","DataTableSortedBy","PermissionTooltip","Loader2","Trash2","isKnowledgeLinkableEntity","Suspense"],"mappings":"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","file":"chunk-VMWUMFUL.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Ellipsis, PencilIcon, Trash2Icon } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\nimport { useDispatch } from '../entities/actions-context';\nimport { useCanMutate } from '../core/permissions';\n\ninterface DataTableRowActionsProps<TData> {\n entityName: string;\n entityNamePlural: string;\n row: Row<TData>;\n options?: {\n canDelete?: boolean;\n canEdit?: boolean;\n };\n}\n\nexport function DataTableRowActions<TData>({\n entityName,\n entityNamePlural,\n row,\n options = { canDelete: true, canEdit: true },\n}: DataTableRowActionsProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const canMutate = useCanMutate();\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const entityId = row.original._id;\n // Read-only roles keep the pencil (the drawer doubles as their read view)\n // but lose the delete affordance entirely.\n const canDelete = (options.canDelete ?? true) && canMutate;\n const canEdit = options.canEdit ?? true;\n\n function handleEdit(): void {\n actionDispatch({ type: 'EditEntity', payload: { entityId, entityNamePlural } });\n }\n\n function handleDelete(): void {\n actionDispatch({ type: 'DeleteEntity', payload: { entityId, entityName } });\n }\n\n return (\n <div className=\"fk:flex\">\n {canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleEdit} variant=\"ghost\">\n <PencilIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Edit</span>\n </Button>\n )}\n {canDelete && !canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleDelete} variant=\"ghost\">\n <Trash2Icon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Delete</span>\n </Button>\n )}\n {canEdit && canDelete && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0\" variant=\"ghost\">\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Additional actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem onClick={handleEdit}>\n <PencilIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"fk:text-destructive\" onClick={handleDelete}>\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>): JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:hidden fk:h-8 fk:lg:flex\" size=\"sm\" variant=\"outline\">\n <Settings2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n checked={column.getIsVisible()}\n className=\"capitalize\"\n key={column.id}\n onCheckedChange={(value) => {\n column.toggleVisibility(Boolean(value));\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { lazy, Suspense, useState } from 'react';\nimport type { JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport type { Table } from '@tanstack/react-table';\nimport { Loader2, RefreshCw, Trash2 } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { toast } from 'sonner';\nimport { Button } from '../ui/primitives/button';\nimport { PermissionTooltip } from '../ui/components/permission-tooltip';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/primitives/select';\nimport { useDispatch } from '../entities/actions-context';\nimport { useAppContext, useAppDispatch } from '../core/app-context';\nimport { useCanMutate } from '../core/permissions';\nimport { useConfig } from '../core/config/config-context';\nimport { DataTableViewOptions } from './data-table-view-options';\nimport { DataTableSortedBy } from './data-table-sorted-by';\nimport { useEntityMutation } from '../graphql-client/use-entity-mutation';\nimport { getEntityDeleteMutation, getEntityDeleteWhere } from '../graphql-client/queries';\nimport { getEntityListQueryName, scheduleEntityListRemoval } from '../graphql-client/refetch-entity-lists';\nimport { isKnowledgeLinkableEntity } from '../apps/knowledge/knowledge';\n\n// Loaded on demand: the Knowledge module should only download when a list of\n// a linkable entity is in view, the way the record drawer loads its panel.\nconst EntityKnowledgeButton = lazy(() =>\n import('../apps/knowledge/record-links').then((m) => ({ default: m.EntityKnowledgeButton }))\n);\nconst EntityGraphButton = lazy(() => import('../apps/graph/entry').then((m) => ({ default: m.EntityGraphButton })));\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isReloading?: boolean;\n onReload?: () => void;\n table: Table<TData>;\n}\n\nexport function DataTableToolbar<TData>({\n entityName,\n isReloading = false,\n onReload,\n table,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const appDispatch = useAppDispatch();\n const appContext = useAppContext();\n const apolloClient = useApolloClient();\n const { currentProject, currentProjectId } = useConfig();\n const schema = currentProject?.schema ?? [];\n const scopes = currentProject?.scopes;\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [isDeleting, setIsDeleting] = useState(false);\n const canMutate = useCanMutate();\n\n // Collect selected entity ids from the table\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const selectedIds: string[] = table.getSelectedRowModel().rows.map((row) => row.original._id as string);\n\n function handleCreate(): void {\n actionDispatch({ type: 'AddEntity', payload: { entityName } });\n }\n\n function handleScopeChange(value: string): void {\n appDispatch({ type: 'setScope', payload: { projectId: currentProjectId, scope: value } });\n }\n\n async function deleteSelected(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n\n const mutation = getEntityDeleteMutation(entityName, schema, ids);\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n\n setOptions({\n variables: { where: getEntityDeleteWhere(ids) },\n update(cache: { evict: (arg0: { id: string }) => void }) {\n for (const id of ids) {\n cache.evict({ id });\n }\n },\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n\n runMutation(true);\n });\n }\n\n function handleBatchDelete(): void {\n const itemLabel = entityName === '_asset' ? 'asset' : entityName.toLowerCase();\n\n actionDispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} ${itemLabel}${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected ${itemLabel}s? They will be deleted permanently.`\n : `Are you sure you want to delete the selected ${itemLabel}? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionSubmit: async () => {\n setIsDeleting(true);\n\n try {\n const idsToDelete = [...selectedIds];\n\n await deleteSelected(idsToDelete);\n\n table.resetRowSelection();\n // Drop rows immediately, then soft-refetch counts/pages.\n await scheduleEntityListRemoval(apolloClient, getEntityListQueryName(entityName, schema), idsToDelete);\n toast.success(idsToDelete.length > 1 ? 'Items successfully deleted.' : 'Item successfully deleted.');\n } catch {\n toast.error('Failed to delete selected items.');\n } finally {\n setIsDeleting(false);\n }\n },\n dialogActionCancel: () => {\n // no-op\n },\n },\n },\n });\n }\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n {scopes && scopes.length > 0 ? (\n <Select\n defaultValue={appContext.scope}\n onValueChange={(value) => {\n handleScopeChange(value);\n }}\n value={appContext.scope}\n >\n <SelectTrigger className=\"fk:w-48!\" id=\"project\" size=\"sm\">\n <span className=\"fk:text-muted-foreground\">Scope:</span>\n <SelectValue>\n {\n ((find(propEq(appContext.scope ?? '', 'name'))(scopes) as { name: string; label: string }) || null)\n ?.label\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {scopes.map((scopeItem) => (\n <SelectItem key={scopeItem.name} value={scopeItem.name}>\n {scopeItem.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n <DataTableViewOptions table={table} />\n {onReload ? (\n <Button\n aria-label=\"Reload\"\n className=\"fk:h-8\"\n disabled={isDeleting || isReloading}\n onClick={onReload}\n size=\"icon-sm\"\n variant=\"outline\"\n >\n <RefreshCw className={isReloading ? 'fk:animate-spin' : undefined} />\n </Button>\n ) : null}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:mr-2 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleBatchDelete}\n size=\"sm\"\n variant=\"destructive\"\n >\n {isDeleting ? (\n <Loader2 className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" />\n ) : (\n <Trash2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Delete ({selectedIds.length})\n </Button>\n </PermissionTooltip>\n ) : null}\n {entityName && isKnowledgeLinkableEntity(entityName) ? (\n <Suspense fallback={null}>\n <EntityKnowledgeButton entityName={entityName} />\n </Suspense>\n ) : null}\n {entityName ? (\n <Suspense fallback={null}>\n <EntityGraphButton entityName={entityName} selectedIds={selectedIds} />\n </Suspense>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleCreate}\n size=\"sm\"\n variant=\"default\"\n >\n Create\n </Button>\n </PermissionTooltip>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import'./index.css';import {createContext,useReducer,useContext}from'react';import {jsx}from'react/jsx-runtime';var u="core.context.scope:",r={breadcrumbs:[],isRouteLoading:false,pageTitle:"",scope:"",relationships:{}},s=createContext(r),a=createContext(()=>{});function A(t,p){let{type:o,payload:e}=p;switch(o){case "setScope":return typeof localStorage<"u"&&e.projectId&&localStorage.setItem(`${u}${e.projectId}`,e.scope),{...t,scope:e.scope};case "setRelationship":return {...t,relationships:{...t.relationships,...e}};default:throw Error(`Unknown action: ${o}`)}}function d({children:t}){let[p,o]=useReducer(A,r);return jsx(s.Provider,{value:p,children:jsx(a.Provider,{value:o,children:t})})}function h(){return useContext(s)}function x(){return useContext(a)}export{u as a,d as b,h as c,x as d};//# sourceMappingURL=chunk-XMOSCJOI.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-XMOSCJOI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/app-context.tsx"],"names":["SCOPE_STORAGE_KEY","initialState","AppContext","createContext","AppDispatchContext","reducer","state","action","type","payload","AppProvider","children","dispatch","useReducer","jsx","useAppContext","useContext","useAppDispatch"],"mappings":"gHAMO,IAAMA,CAAAA,CAAoB,qBAAA,CAE3BC,CAAAA,CAAe,CACnB,WAAA,CAAa,EAAC,CACd,cAAA,CAAgB,MAChB,SAAA,CAAW,EAAA,CACX,KAAA,CAAO,EAAA,CACP,cAAe,EACjB,CAAA,CAEMC,CAAAA,CAAaC,cAA8BF,CAAY,CAAA,CAEvDG,CAAAA,CAAqBD,aAAAA,CAAgE,IAAM,CAEjG,CAAC,EAED,SAASE,CAAAA,CAAQC,CAAAA,CAAuBC,CAAAA,CAAgE,CACtG,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAA,CAAAC,CAAQ,CAAA,CAAIF,CAAAA,CAE1B,OAAQC,CAAAA,EACN,KAAK,UAAA,CACH,OAAI,OAAO,aAAiB,GAAA,EAAeC,CAAAA,CAAQ,SAAA,EACjD,YAAA,CAAa,QAAQ,CAAA,EAAGT,CAAiB,CAAA,EAAGS,CAAAA,CAAQ,SAAS,CAAA,CAAA,CAAIA,CAAAA,CAAQ,KAAK,CAAA,CAGzE,CACL,GAAGH,CAAAA,CACH,KAAA,CAAOG,CAAAA,CAAQ,KACjB,CAAA,CACF,KAAK,iBAAA,CACH,OAAO,CACL,GAAGH,CAAAA,CACH,aAAA,CAAe,CAAE,GAAGA,CAAAA,CAAM,aAAA,CAAe,GAAGG,CAAQ,CACtD,CAAA,CACF,QACE,MAAM,MAAM,CAAA,gBAAA,EAAmBD,CAAc,CAAA,CAAE,CACnD,CACF,CAEO,SAASE,CAAAA,CAAY,CAAE,SAAAC,CAAS,CAAA,CAAyC,CAC9E,GAAM,CAACL,CAAAA,CAAOM,CAAQ,CAAA,CAAIC,UAAAA,CAAWR,EAASJ,CAAY,CAAA,CAE1D,OACEa,GAAAA,CAACZ,EAAW,QAAA,CAAX,CAAoB,KAAA,CAAOI,CAAAA,CAC1B,SAAAQ,GAAAA,CAACV,CAAAA,CAAmB,QAAA,CAAnB,CAA4B,MAAOQ,CAAAA,CAAW,QAAA,CAAAD,CAAAA,CAAS,CAAA,CAC1D,CAEJ,CAEO,SAASI,CAAAA,EAAgC,CAC9C,OAAOC,UAAAA,CAAWd,CAAU,CAC9B,CAEO,SAASe,CAAAA,EAAmE,CACjF,OAAOD,UAAAA,CAAWZ,CAAkB,CACtC","file":"chunk-XMOSCJOI.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"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import'./index.css';import {b}from'./chunk-CAZ6EUR2.js';import {b as b$2}from'./chunk-2DXR5NJV.js';import {u,o,p}from'./chunk-OOYCTZ3C.js';import {g as g$1,b as b$5}from'./chunk-2HYQVMP3.js';import {Tc,Uc,Vc,$,aa,da,ea,ba,fa,o as o$1}from'./chunk-DGIY4SKN.js';import {e,g,h,j}from'./chunk-SZEGGBOC.js';import {c as c$1,h as h$1,i,k,l,b as b$4}from'./chunk-32ZU4MLE.js';import {a,b as b$3,c,d,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$1}from'./chunk-6NRQMG26.js';import {a as a$1}from'./chunk-O2QMYUPS.js';import {AlertCircle,X,ChevronDown,ArrowUp,ArrowDown,Star,CircleCheck,CircleX,Check,Copy}from'lucide-react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useRef,useState,useEffect,useCallback,useMemo}from'react';import {useReactTable,getSortedRowModel,getPaginationRowModel,getFilteredRowModel,getCoreRowModel,flexRender}from'@tanstack/react-table';import {useVirtualizer}from'@tanstack/react-virtual';import {gql}from'@apollo/client';import {useMutation}from'@apollo/client/react';import {getText,getSchema,getTextSerializersFromSchema}from'@tiptap/core';import {Node}from'@tiptap/pm/model';import {TiptapLink,TiptapImage,UploadImagesPlugin,TaskList,TaskItem,HorizontalRule,StarterKit,CodeBlockLowlight,Youtube,Twitter,Mathematics,CharacterCount,Placeholder,AIHighlight,TiptapUnderline,HighlightExtension,TextStyle,Color,CustomKeymap,GlobalDragHandle}from'novel';import {Markdown}from'tiptap-markdown';import {cx}from'class-variance-authority';import {createLowlight,common}from'lowlight';import {defaultStyles,FileIcon}from'react-file-icon';import {isValid,format}from'date-fns';function Xr(){return jsxs(Tc,{variant:"destructive",children:[jsx(AlertCircle,{className:"fk:h-4 fk:w-4"}),jsx(Uc,{children:"Project Paused"}),jsxs(Vc,{children:["This project has been paused. To troubleshoot this error, please"," ",jsx("a",{className:"fk:text-blue-500 fk:underline",href:"https://flexkit.io/docs/errors/project-paused",target:"_blank",rel:"noopener noreferrer",children:"follow these steps"}),"."]})]})}function Kr(){let{schemaErrorMessage:e}=u();if(!e)return jsx(Fragment,{});let[t,n,...r]=e.split(`
|
|
2
|
+
`);return jsxs(Tc,{className:"fk:mb-4",variant:"destructive",children:[jsx(AlertCircle,{className:"fk:h-4 fk:w-4"}),jsx(Uc,{children:"Schema mismatch"}),jsxs(Vc,{children:[jsx("p",{children:t}),n?jsx("p",{className:"fk:mt-1",children:n}):null,r.length>0?jsx("ul",{className:"fk:mt-2 fk:list-disc fk:pl-4",children:r.map(o=>jsx("li",{children:o.replace(/^- /,"")},o))}):null]})]})}function lt({scrollHeight:e,scrollTop:t,clientHeight:n}){if(n<=0)return false;let r=t>0?Math.max(600,n):1;return e-t-n<r}var ln=36,cn=15,fn=2,ut=40;function pt(e){if(!e)return;let t=e.split(/\s+/);if(t.includes("fk:h-20"))return 80;if(t.includes("fk:h-10"))return 40;if(t.includes("fk:h-9"))return 36}function un(e,t){return e??pt(t)??ln}function lo({classNames:e,columns:t,data:n,entityName:r,hasMore:o=false,initialSelectionState:l,isLoadingMore:s=false,onEntitySelectionChange:b$1,onLoadMore:u$1,onScroll:k,onSortingChange:S,pageSize:M,rowHeightEstimate:g,rowAdditionState:i,rowDeletionState:T,scrollToTopKey:X,sorting:de,toolbarComponent:j}){let y=useRef(null),{schemaErrorMessage:N}=u(),[C,me]=useState(l??{}),[Ot,Ut]=useState({}),[zt,Bt]=useState([]),[Xt,jt]=useState([]),$t=de??Xt;useEffect(()=>{y.current?.scrollTo({top:0,left:0});},[r,X]),useEffect(()=>{if(!l)return;let a=Object.keys(C).sort().join(","),c=Object.keys(l).sort().join(",");a!==c&&me(l);},[l,C]);function Jt(a){if(S){S(a);return}jt(a);}let V=useReactTable({data:n,columns:t,state:{sorting:$t,columnVisibility:Ot,rowSelection:C,columnFilters:zt},initialState:{pagination:{pageSize:M??50}},enableRowSelection:true,onRowSelectionChange:Kt,onSortingChange:Jt,onColumnFiltersChange:Bt,onColumnVisibilityChange:Ut,getCoreRowModel:getCoreRowModel(),getFilteredRowModel:getFilteredRowModel(),getPaginationRowModel:getPaginationRowModel(),getSortedRowModel:getSortedRowModel(),getRowId:a=>a._id,manualFiltering:true,manualPagination:true,manualSorting:true,meta:{getRowBackground:a=>mn(a,T,i)}}),{rows:$$1}=V.getRowModel(),Pe=un(g,e?.row),qt=pt(e?.row)!=null,Le=useVirtualizer({count:$$1.length,estimateSize:()=>Pe,getItemKey:a=>$$1[a]?.id??a,getScrollElement:()=>y.current,overscan:cn,scrollMargin:ut}),F=V.getVisibleLeafColumns(),Ie=V.getHeaderGroups(),R=Ie.length===1,K=useVirtualizer({horizontal:true,count:F.length,estimateSize:a=>F[a].getSize(),getItemKey:a=>F[a].id,getScrollElement:()=>y.current,overscan:fn,enabled:R}),Gt=JSON.stringify(F.map(a=>[a.id,a.getSize()]));useEffect(()=>{K.measure();},[Gt,K]);let H=K.getVirtualItems(),W=R?H[0]?.index??0:0,_e=R?(H[H.length-1]?.index??-1)+1:F.length,Y=R?H[0]?.start??0:0,Q=R?Math.max(0,K.getTotalSize()-(H[H.length-1]?.end??0)):0,Ve=Le.getVirtualItems(),{paddingTop:Fe,paddingBottom:He}=dn(Ve,Le.getTotalSize(),ut),pe=useRef(u$1),Oe=useRef(o),ge=useRef(s);pe.current=u$1,Oe.current=o,ge.current=s;let ke=useCallback(a=>{if(!pe.current||!Oe.current||ge.current)return;let c=a??y.current;c&<(c)&&(ge.current=true,pe.current());},[]),Ue=b();useEffect(()=>{Ue&&ke();},[ke,$$1.length,o,s,Ue]);function Kt(a){let c=Object.keys(typeof a=="function"?a(C):a);me(a),b$1?.(c);}function Wt(a){k?.(a),ke(a.currentTarget);}return N?jsx(Fragment,{}):jsxs("div",{className:a$1("fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4",e?.wrapper),children:[j&&j(V),jsx("div",{className:"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1 fk:-mb-px",children:jsx(a,{delayDuration:400,children:jsxs($,{className:a$1("fk:grid fk:pb-20",e?.table),"aria-colcount":F.length,style:{minWidth:V.getTotalSize()},containerClassName:e?.tableContainer,onScroll:Wt,ref:y,children:[jsx(aa,{className:"fk:sticky fk:top-0 fk:z-20 fk:grid",children:Ie.map(a=>jsxs(da,{className:"fk:flex fk:w-full",children:[Y>0?jsx(le,{width:Y,header:true}):null,(R?a.headers.slice(W,_e):a.headers).map((c,P)=>jsxs(ea,{"aria-colindex":R?W+P+1:void 0,className:a$1("fk:flex fk:shrink-0 fk:items-center",c.column.id==="actions"&&"fk:pl-0"),colSpan:c.colSpan,style:c.getSize()?{width:`${c.getSize().toString()}px`}:{},children:[c.isPlaceholder?null:flexRender(c.column.columnDef.header,c.getContext()),s?jsx("div",{"aria-hidden":true,className:"fk:pointer-events-none fk:absolute fk:top-10.25 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-4",children:jsx("div",{className:"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground"})}):null]},c.id)),Q>0?jsx(le,{width:Q,header:true}):null]},a.id))}),jsx(ba,{className:"fk:grid fk:relative",children:$$1.length===0?jsx(da,{children:jsx(fa,{className:"fk:h-24 fk:text-center",colSpan:t.length,children:"No results."})}):jsxs(Fragment,{children:[Fe>0?jsx(dt,{height:Fe}):null,Ve.map(a=>{let c=$$1[a.index];return jsxs(da,{className:a$1(V.options.meta.getRowBackground(c),"fk:flex fk:w-full fk:overflow-hidden fk:transition-none",!qt&&g==null&&"fk:h-9",e?.row),"data-index":a.index,"data-state":c.getIsSelected()&&"selected",style:{height:`${Pe.toString()}px`},children:[Y>0?jsx(le,{width:Y}):null,c.getVisibleCells().slice(W,_e).map((P,Yt)=>jsx(fa,{className:a$1("fk:flex fk:shrink-0 fk:items-center fk:truncate",P.column.id==="actions"&&"fk:pl-1!"),"aria-colindex":W+Yt+1,style:{width:P.column.getSize()},children:flexRender(P.column.columnDef.cell,P.getContext())},P.id)),Q>0?jsx(le,{width:Q}):null]},a.key)}),He>0?jsx(dt,{height:He}):null]})})]})})})]})}function dn(e,t,n){if(e.length===0)return {paddingTop:0,paddingBottom:0};let r=e[0]?.start??0,o=e[e.length-1]?.end??0;return {paddingTop:Math.max(0,r-n),paddingBottom:Math.max(0,t-(o-n))}}function le({width:e,header:t=false}){return jsx(t?"th":"td",{"aria-hidden":true,style:{width:e,flexShrink:0,padding:0,border:0}})}function dt({height:e}){return jsx("tr",{"aria-hidden":true,className:"fk:pointer-events-none fk:border-0",style:{display:"block",height:`${e.toString()}px`},children:jsx("td",{className:"fk:p-0 fk:border-0"})})}function mn(e,t,n){return t?.includes(e.original._id)?"fk:bg-row-removed fk:hover:bg-row-removed-hover":n?.some(r=>r._id===e.original._id)?"fk:bg-row-added fk:hover:bg-row-added-hover":""}function po({table:e}){let[t]=e.getState().sorting;if(!t)return null;let r=e.getColumn(t.id)?.columnDef.meta?.label??t.id,o=t.desc?"desc":"asc";return jsxs(b$1,{"aria-label":`Clear sorting by ${r}`,className:"fk:h-8 fk:px-2 fk:lg:px-3 fk:text-success fk:border-none",onClick:()=>{e.resetSorting();},size:"sm",variant:"outline",children:["Sorted by ",r," ",o,jsx(X,{className:"fk:ml-1 fk:h-4 fk:w-4"})]})}function So(){let[e,t]=useState(false),[n,r]=useState(gql`
|
|
3
|
+
mutation updateEntity($any: Any) {
|
|
4
|
+
any
|
|
5
|
+
}
|
|
6
|
+
`),[o$1,l]=useState({}),[s,{data:b,loading:u,error:k}]=useMutation(n,o$1),S=o(k),{isProjectDisabled:M,isProjectReadOnly:g}=(()=>{if(S?.statusCode===403){let i=p(S.bodyText);if(i&&typeof i.code=="string"){if(i.code==="PROJECT_PAUSED")return {isProjectDisabled:true,isProjectReadOnly:false};if(i.code==="READ_ONLY_MODE")return {isProjectDisabled:false,isProjectReadOnly:true}}return {isProjectDisabled:true,isProjectReadOnly:false}}return {isProjectDisabled:false,isProjectReadOnly:false}})();return useEffect(()=>{e&&(s(),t(false));},[e,s]),[t,r,l,{data:b,loading:u,error:k,isProjectDisabled:M,isProjectReadOnly:g}]}function Se({column:e$1,title:t,className:n}){if(!e$1.getCanSort())return jsx("div",{className:a$1("fk:flex fk:items-center",n),children:t});let r=e$1.getIsSorted()==="asc",o=e$1.getIsSorted()==="desc";return jsxs("div",{className:a$1("fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-1",n),children:[jsx("span",{className:"fk:truncate",children:t}),jsxs(e,{children:[jsx(g,{asChild:true,children:jsx("button",{"aria-label":`Sort ${t}`,className:"fk:inline-flex fk:shrink-0 fk:items-center fk:justify-center fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:outline-hidden fk:hover:bg-accent fk:hover:text-accent-foreground fk:focus-visible:ring-1 fk:focus-visible:ring-ring fk:corner-squircle",type:"button",children:jsx(ChevronDown,{className:"fk:h-3.5 fk:w-3.5"})})}),jsxs(h,{align:"end",className:"fk:w-44",children:[jsxs(j,{"aria-checked":r,className:a$1(r&&"fk:bg-accent fk:text-accent-foreground"),onSelect:()=>{if(r){e$1.clearSorting();return}e$1.toggleSorting(false);},role:"menuitemcheckbox",children:[jsx(ArrowUp,{className:a$1("fk:h-4 fk:w-4",r&&"fk:text-white")}),"Sort Ascending"]}),jsxs(j,{"aria-checked":o,className:a$1(o&&"fk:bg-accent fk:text-accent-foreground"),onSelect:()=>{if(o){e$1.clearSorting();return}e$1.toggleSorting(true);},role:"menuitemcheckbox",children:[jsx(ArrowDown,{className:a$1("fk:h-4 fk:w-4",o&&"fk:text-white")}),"Sort Descending"]})]})]})]})}function xe({value:e}){return jsx("div",{className:"fk:flex fk:w-full fk:justify-center",children:e?jsx(CircleCheck,{className:"fk:w-4 fk:h-4 fk:text-emerald-500"}):jsx(CircleX,{className:"fk:w-4 fk:h-4 fk:text-muted-foreground"})})}var ht=500,En=3e3;function w({value:e}){let t=useRef(null),n=useRef(null),[r,o]=useState(false),[l,s]=useState(false);useEffect(()=>()=>{n.current&&clearTimeout(n.current);},[]);function b(){let g=t.current;return g?g.scrollWidth>g.clientWidth:false}async function u(g){if(g.preventDefault(),g.stopPropagation(),!!e){try{await navigator.clipboard.writeText(e);}catch{return}o(true),s(true),n.current&&clearTimeout(n.current),n.current=setTimeout(()=>{o(false),s(false);},En);}}function k(){b();}function S(g){if(!r){if(g){s(b());return}s(false);}}if(!e)return jsx("div",{className:"fk:truncate"});let M=e.length>ht?`${e.slice(0,ht)}\u2026`:e;return jsxs(b$3,{open:l,onOpenChange:S,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:corner-squircle","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:u,onPointerEnter:k,type:"button",children:[jsx("span",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:pr-4",ref:t,children:e}),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:corner-squircle","fk:transition-opacity fk:duration-100",r?"fk:opacity-100 fk:text-foreground":"fk:opacity-0 fk:group-hover/copyable:opacity-100 fk:group-focus-visible/copyable:opacity-100"),children:r?jsx(Check,{className:"fk:size-3"}):jsx(Copy,{className:"fk:size-3"})})]})}),jsx(e$1,{className:"fk:max-w-xs fk:wrap-break-word",children:r?"Copied to clipboard":M})]})}function B({value:e}){let t=typeof e=="object"||Array.isArray(e)?JSON.stringify(e):e;return t=t==="null"||t==null?"":String(t),jsx(w,{value:t})}var Zn=AIHighlight,er=Placeholder,tr=TiptapLink.configure({HTMLAttributes:{class:cx("fk:text-muted-foreground fk:underline fk:underline-offset-[3px] fk:hover:text-primary fk:transition-colors fk:cursor-pointer")}}),nr=Markdown.configure({html:true,tightLists:true,tightListClass:"tight",bulletListMarker:"-",linkify:false,breaks:false,transformPastedText:false,transformCopiedText:false}),rr=TiptapImage.extend({addProseMirrorPlugins(){return [UploadImagesPlugin({imageClass:cx("fk:opacity-40 fk:rounded-lg fk:border fk:border-stone-200 fk:corner-squircle")})]}}).configure({allowBase64:true,HTMLAttributes:{class:cx("fk:rounded-lg fk:border fk:border-muted fk:corner-squircle")}}),or=TaskList.configure({HTMLAttributes:{class:cx("fk:not-prose fk:pl-2 ")}}),ir=TaskItem.configure({HTMLAttributes:{class:cx("fk:flex gap-2 fk:items-start fk:my-2")},nested:true}),ar=HorizontalRule.configure({HTMLAttributes:{class:cx("mt-4 mb-6 border-t border-muted-foreground")}}),sr=StarterKit.configure({bulletList:{HTMLAttributes:{class:cx("fk:list-disc fk:list-outside fk:leading-3 fk:-mt-2")}},orderedList:{HTMLAttributes:{class:cx("fk:list-decimal fk:list-outside fk:leading-3 fk:-mt-2")}},listItem:{HTMLAttributes:{class:cx("fk:leading-normal fk:-mb-2")}},blockquote:{HTMLAttributes:{class:cx("fk:border-l-4 fk:border-primary")}},codeBlock:false,code:{HTMLAttributes:{class:cx("fk:rounded-md fk:bg-muted fk:px-1.5 fk:py-1 fk:font-mono fk:font-medium fk:corner-squircle"),spellcheck:"false"}},horizontalRule:false,dropcursor:{color:"#DBEAFE",width:4},gapcursor:false}),lr=CodeBlockLowlight.configure({lowlight:createLowlight(common)}),cr=Youtube.configure({HTMLAttributes:{class:cx("fk:rounded-lg fk:border fk:border-muted fk:corner-squircle")},inline:false}),fr=Twitter.configure({HTMLAttributes:{class:cx("fk:not-prose")},inline:false}),ur=Mathematics.configure({HTMLAttributes:{class:cx("fk:text-foreground fk:rounded-sm fk:p-1 fk:hover:bg-muted fk:cursor-pointer fk:corner-squircle")},katexOptions:{throwOnError:false}}),dr=CharacterCount.configure(),Tt=[sr,er,tr,rr,or,ir,ar,Zn,lr,cr,fr,ur,dr,TiptapUnderline,nr,HighlightExtension,TextStyle,Color,CustomKeymap,GlobalDragHandle];var ve;function hr(){let e=getSchema(Tt);return {schema:e,textSerializers:getTextSerializersFromSchema(e)}}function yt(e,t=100){if(!e)return "";try{let n=JSON.parse(e);return ve??=hr(),getText(Node.fromJSON(ve.schema,n),{textSerializers:ve.textSerializers}).substring(0,t)}catch{return e.substring(0,t)}}function St({value:e}){let t=useMemo(()=>yt(e),[e]);return jsx(w,{value:t})}var wt=250,xr=25e5,v=new Map,Ce=new Map,Ae=new Set,xt=new Map;function ce(e){if(xt.has(e))return;let t=new Image;t.decoding="async",t.src=e,xt.set(e,t);}function fe(e){let t=v.get(e);t&&v.set(e,{...t,lastUsedAt:Date.now()});}function vr(){if(v.size<=wt)return;let e=Array.from(v.entries()).sort((n,r)=>n[1].lastUsedAt-r[1].lastUsedAt),t=Math.max(1,Math.ceil(wt*.1));for(let n=0;n<t&&n<e.length;n+=1){let[r,o]=e[n];v.delete(r),URL.revokeObjectURL(o.objectUrl);}}async function Cr(e){if(Ae.has(e)){ce(e);return}if(v.has(e)){fe(e);return}let t=Ce.get(e);if(t){await t;return}let n=(async()=>{try{let r=await fetch(e,{mode:"cors",cache:"force-cache"});if(!r.ok){ce(e);return}let o=await r.blob();if(o.size>xr)return;let l=URL.createObjectURL(o);v.set(e,{objectUrl:l,byteSize:o.size,lastUsedAt:Date.now()}),vr();}catch(r){r instanceof TypeError&&Ae.add(e),ce(e);}})();Ce.set(e,n),await n,Ce.delete(e);}function vt(e){let t=useMemo(()=>{if(!e)return null;let o=v.get(e);return o?(fe(e),o.objectUrl):null},[e]),[n,r]=useState(t);return useEffect(()=>{if(!e){r(null);return}if(Ae.has(e)){ce(e),r(null);return}let o=v.get(e);if(o){fe(e),r(o.objectUrl);return}r(null);let l=false;return Cr(e).then(()=>{let s=v.get(e);s&&(l||(fe(e),r(s.objectUrl)));}),()=>{l=true;}},[e]),n}var De="fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]";function Ct({value:e}){return Array.isArray(e)?jsx(Mr,{value:e}):jsx(Er,{value:e})}function Er({value:e}){let t=e?.path??"",n=!!t,r=n&&/\.(png|jpe?g|gif|webp|avif|svg)$/i.test(t),o=u=>{let[k]=u.split("?"),S=k.split(".");return S.length>1?S.pop().toLowerCase():"file"},l=n?t.endsWith(".svg")?`${b$5}${t}`:`${b$5}${t}?w=84&h=84&f=webp`:null,s=n?t.endsWith(".svg")?`${b$5}${t}`:`${b$5}${t}?w=624&h=624&f=webp`:"",b=vt(l);return n?jsx("div",{className:"fk:z-10",children:r?jsxs(b$3,{children:[jsx(c,{asChild:true,children:jsx("img",{alt:"asset",className:`fk:w-7 fk:h-7 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${De} fk:corner-squircle`,decoding:"async",src:b??void 0})}),jsx(d,{children:jsx(e$1,{children:jsx("img",{alt:"asset",className:`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${De} fk:corner-squircle`,decoding:"async",src:s})})})]}):jsxs(b$3,{children:[jsx(c,{asChild:true,children:jsx("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 fk:corner-squircle",children:(()=>{let u=o(t),k=defaultStyles[u];return jsx(FileIcon,{extension:u,...k||{}})})()})}),jsx(d,{children:jsx(e$1,{children:jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Preview not available"})})})]})}):null}function Mr({value:e}){let t=e.filter(o=>!!o.path).slice(0,3),n=Math.max(e[0]?.totalCount??0,e.length);if(t.length===0)return n>0?jsx("div",{className:"fk:flex fk:items-center",children:jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:n===1?"1 asset":`${n} assets`})}):null;let r=n-t.length;return jsxs("div",{className:"fk:flex fk:items-center",children:[jsx("div",{className:"fk:flex fk:-space-x-2",children:t.map(o=>jsx("img",{alt:"asset",className:`fk:h-7 fk:w-7 fk:overflow-hidden fk:rounded-md fk:object-contain ${De} fk:corner-squircle`,decoding:"async",src:`${b$5}${o.path}?w=84&h=84&f=webp`},o._id))}),r>0?jsxs("span",{className:"fk:ml-2 fk:text-xs fk:text-muted-foreground",children:["+",r]}):null]})}function Me({value:e}){if(e==null||e===""||typeof e!="string")return jsx(w,{value:""});let t=new Date(e);if(!isValid(t))return jsx(w,{value:""});let n=format(t,"MMM d, yyyy")+" at "+format(t,"HH:mm");return jsx(w,{value:n})}function Rr(e){return "groupLabel"in e}function Pr(e){return e.flatMap(t=>Rr(t)?t.items:[t])}function Lr(e,t){if(!t)return e;let n=Pr(t).find(r=>String(r.value)===e);return n?n.label:e}function Et({value:e,options:t}){if(e==null)return jsx(w,{value:""});let n=String(e),r=Lr(n,t?.list);return jsx(w,{value:r})}function Nt({value:e}){return !e||!e.split(",").length?null:jsx("div",{className:"fk:flex fk:flex-wrap fk:gap-1 fk:max-w-full truncate",children:e.split(",").map(t=>jsx(b$4,{className:"fk:px-2.5 fk:py-0 fk:font-normal fk:text-[0.6875rem] fk:leading-4",variant:"secondary",children:t},t))})}function Rt(e,t=5){let n=Number.isFinite(t)&&t>=1?Math.floor(t):5,r=typeof e=="string"&&e.trim()!==""?Number(e):e;if(typeof r!="number"||!Number.isFinite(r))return null;let o=Math.min(n,Math.max(0,Math.round(r)));return {filled:o,max:n,label:`${String(o)} out of ${String(n)} stars`}}function Pt({value:e,options:t}){let n=Rt(e,t?.max);return n?jsx("span",{"aria-label":n.label,className:"fk:inline-flex fk:items-center fk:gap-0.5",role:"img",title:n.label,children:Array.from({length:n.max},(r,o)=>jsx(Star,{"aria-hidden":true,className:o<n.filled?"fk:h-3.5 fk:w-3.5 fk:fill-amber-400 fk:text-amber-400":"fk:h-3.5 fk:w-3.5 fk:fill-transparent fk:text-muted-foreground/40",strokeWidth:1.5},o))}):jsx("span",{})}var _r=/\.(png|jpe?g|gif|webp|avif|svg)$/i;function Lt(e){try{let{pathname:t}=new URL(e);return t.split("/").pop()||t}catch{let[t]=e.split("?");return t}}function It(e){return e.originalFilename?e.originalFilename:e.path?e.path:e.url?Lt(e.url):""}function _t(e){let t=It(e),[n]=t.split("?"),r=n.split(".");return r.length>1?r.pop().toLowerCase():"file"}function Vt(e){return e.mimeType?e.mimeType.startsWith("image/"):_r.test(It(e))}function Re(e,t){if(!e||!t||Lt(e).toLowerCase().endsWith(".svg"))return e;let n=new URLSearchParams({f:"webp",h:String(t.height),w:String(t.width)}),r=e.includes("?")?"&":"?";return `${e}${r}${n.toString()}`}var Or=FileIcon,Ft="fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]";function Ht({value:e}){let[t,n]=useState(false),r=e?.url??"";if(!e||!r&&!e.path&&!e.originalFilename)return null;if(!(Vt(e)&&!!r)){let u=_t(e),k=defaultStyles[u];return jsx("div",{className:"fk:z-10",children:jsx(a,{children:jsxs(b$3,{children:[jsx(c,{asChild:true,children:jsx("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 fk:corner-squircle",children:jsx(Or,{extension:u,...k||{}})})}),jsx(d,{children:jsx(e$1,{children:jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Preview not available"})})})]})})})}let l$1=Re(r,{width:84,height:84}),s=Re(r,{width:624,height:624});function b(u){u.stopPropagation(),n(true);}return jsx("div",{className:"fk:z-10",children:jsxs(a,{children:[jsxs(b$3,{children:[jsx(c,{asChild:true,children:jsx("img",{src:l$1,alt:"asset",className:`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${Ft} fk:corner-squircle`,onClick:b})}),jsx(d,{children:jsx(e$1,{children:jsx("img",{src:s,alt:"asset",className:`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${Ft} fk:corner-squircle`})})})]}),jsx(c$1,{open:t,onOpenChange:n,children:jsxs(h$1,{className:"fk:sm:max-w-4xl fk:p-3",children:[jsxs(i,{children:[jsx(k,{className:"fk:sr-only",children:"Asset preview"}),jsx(l,{className:"fk:sr-only",children:"Enlarged asset preview"})]}),jsx("img",{src:r,alt:"asset",className:"fk:max-h-[85vh] fk:w-full fk:overflow-hidden fk:rounded-md fk:object-contain fk:corner-squircle"})]})})]})})}var Ur=new Set(["text","number","datetime","switch","select"]);function Xi({attributesSchema:e,checkboxSelect:t,actionsComponent:n,enableColumnSorting:r=false}){let[,o]=g$1(),l=b$2(e,o.user?.spaces),s={datetime:"datetime",editor:"editor",asset:"asset",number:"text",relationship:"text",select:"select",switch:"boolean",text:"text",textarea:"text"},b={boolean:xe,date:B,datetime:Me,editor:St,asset:Ct,number:B,relationship:B,select:Et,switch:xe,text:B,textarea:B,tags:Nt,rating:Pt,assetPreviewField:Ht},u=l.map(i=>{if(i.name==="_updatedAt")return null;let T=(i.inputType==="relationship"&&i.relationship?.entity==="_asset"?"asset":void 0)??i.previewType??s[i.inputType],X=b[T]??b.text;if(i.hidden===true)return null;let de=T==="tags",j=r&&i.scope==="global"&&Ur.has(i.inputType);return {accessorKey:i.name,filterFn:(y,N,C)=>de?true:(Array.isArray(C)?C:[C]).includes(y.getValue(N)),header:({column:y})=>j?jsx(Se,{column:y,title:i.label}):jsx("div",{className:"fk:flex fk:items-center",children:i.label}),cell:({row:y})=>{let N=X;return T==="select"||T==="rating"?jsx(N,{value:y.getValue(i.name),options:i.options}):T==="assetPreviewField"?jsx(N,{value:y.original}):jsx(N,{value:y.getValue(i.name)})},enableSorting:j,enableHiding:true,meta:{label:i.label},size:i.options?.size??150}}).filter(i=>i!==null),k={id:"actions",cell:({row:i})=>n?n(i):null,size:80},S={accessorKey:"_updatedAt",header:({column:i})=>r?jsx(Se,{column:i,title:"Updated At"}):jsx("div",{className:"fk:flex fk:items-center",children:"Updated At"}),cell:({row:i})=>jsx(Me,{value:i.getValue("_updatedAt")}),enableSorting:r,enableHiding:false,meta:{label:"Updated At"},size:220},M={id:"select",cell:({row:i,table:T})=>jsx(o$1,{"aria-label":"Select row",checked:i.getIsSelected(),onCheckedChange:X=>{T.toggleAllPageRowsSelected(false),i.toggleSelected(!!X);}}),enableSorting:false,enableHiding:false,size:50},g={id:"select",header:({table:i})=>jsx(o$1,{className:"fk:dark:bg-white/15","aria-label":"Select all",checked:i.getIsAllPageRowsSelected()||i.getIsSomePageRowsSelected()&&"indeterminate",onCheckedChange:T=>{i.toggleAllPageRowsSelected(!!T);}}),cell:({row:i})=>jsx(o$1,{"aria-label":"Select row",checked:i.getIsSelected(),onCheckedChange:T=>{i.toggleSelected(!!T);}}),enableSorting:false,enableHiding:false,size:50};return [...t==="single"?[M]:[],...t==="multiple"?[g]:[],...n?[k]:[],...u,S]}export{Xr as a,Kr as b,lt as c,lo as d,po as e,So as f,Tt as g,It as h,_t as i,Vt as j,Re as k,Se as l,Xi as m};//# sourceMappingURL=chunk-XNHSHVG2.js.map
|
|
7
|
+
//# sourceMappingURL=chunk-XNHSHVG2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/error/project-disabled.tsx","../src/core/error/schema-error.tsx","../src/data-grid/should-load-more.ts","../src/data-grid/data-table.tsx","../src/data-grid/data-table-sorted-by.tsx","../src/graphql-client/use-entity-mutation.ts","../src/data-grid/data-table-column-header.tsx","../src/data-grid/preview-components/boolean.tsx","../src/data-grid/preview-components/copyable-truncated-text.tsx","../src/data-grid/preview-components/text.tsx","../src/form/fields/editor/extensions.ts","../src/data-grid/preview-components/editor-text.ts","../src/data-grid/preview-components/editor.tsx","../src/ui/hooks/use-cached-image-src.ts","../src/data-grid/preview-components/asset.tsx","../src/data-grid/preview-components/datetime.tsx","../src/data-grid/preview-components/select.tsx","../src/data-grid/preview-components/tags.tsx","../src/data-grid/preview-components/rating-state.ts","../src/data-grid/preview-components/rating.tsx","../src/apps/asset-manager/data-grid/asset-url.ts","../src/apps/asset-manager/data-grid/preview-components/asset.tsx","../src/data-grid/columns.tsx"],"names":["ProjectDisabled","jsxs","Alert","jsx","AlertCircle","AlertTitle","AlertDescription","SchemaError","schemaErrorMessage","useGraphQLError","Fragment","summary","deployHint","details","detail","shouldLoadMore","scrollHeight","scrollTop","clientHeight","threshold","DEFAULT_ROW_HEIGHT_PX","ROW_OVERSCAN","COLUMN_OVERSCAN","STICKY_HEADER_HEIGHT_PX","inferRowHeightEstimate","rowClassName","tokens","resolveRowHeightPx","rowHeightEstimate","DataTable","classNames","columns","data","entityName","hasMore","initialSelectionState","isLoadingMore","onEntitySelectionChange","onLoadMore","onScroll","onSortingChange","pageSize","rowAdditionState","rowDeletionState","scrollToTopKey","sortingProp","toolbarComponent","scrollRef","useRef","rowSelection","setRowSelection","useState","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","useEffect","currentSelection","nextSelection","handleSortingChange","updater","table","useReactTable","handleRowSelectionChange","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","row","getRowClassnames","rows","rowHeightPx","hasExplicitRowHeightClass","rowVirtualizer","useVirtualizer","index","visibleColumns","headerGroups","virtualizeColumns","columnVirtualizer","columnSizesKey","column","virtualColumns","firstColumn","lastColumn","paddingLeft","paddingRight","virtualItems","paddingTop","paddingBottom","getVirtualBodySpacers","onLoadMoreRef","hasMoreRef","isLoadingMoreRef","checkLoadMore","useCallback","container","scrollElement","isAppActive","useIsAppActive","updaterFn","selectedIds","handleScroll","event","cn","TooltipProvider","Table","TableHeader","headerGroup","TableRow","VirtualColumnSpacer","header","TableHead","flexRender","TableBody","TableCell","VirtualRowSpacer","virtualRow","cell","totalSize","scrollMargin","firstStart","lastEnd","width","height","line","DataTableSortedBy","sort","label","direction","Button","X","useEntityMutation","runMutation","setRunMutation","mutation","setMutation","gql","options","setOptions","mutateFunction","loading","error","useMutation","serverError","getServerError","isProjectDisabled","isProjectReadOnly","responseBody","parseErrorBody","DataTableColumnHeader","title","className","isSortedAsc","isSortedDesc","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","ArrowUp","ArrowDown","Boolean","value","CircleCheck","CircleX","TOOLTIP_MAX_LENGTH","COPIED_DISMISS_MS","CopyableTruncatedText","textRef","dismissTimeoutRef","copied","setCopied","tooltipOpen","setTooltipOpen","measureTruncation","element","handleClick","handlePointerEnter","handleTooltipOpenChange","open","tooltipText","Tooltip","TooltipTrigger","CheckIcon","CopyIcon","TooltipContent","Text","displayValue","aiHighlight","AIHighlight","placeholder","Placeholder","tiptapLink","TiptapLink","cx","markdownExtension","Markdown","tiptapImage","TiptapImage","UploadImagesPlugin","taskList","TaskList","taskItem","TaskItem","horizontalRule","HorizontalRule","starterKit","StarterKit","codeBlockLowlight","CodeBlockLowlight","createLowlight","common","youtube","Youtube","twitter","Twitter","mathematics","Mathematics","characterCount","CharacterCount","defaultExtensions","TiptapUnderline","HighlightExtension","TextStyle","Color","CustomKeymap","GlobalDragHandle","serializer","createSerializer","schema","getSchema","getTextSerializersFromSchema","getEditorPreviewText","maxLength","document","getText","Node","Editor","textValue","useMemo","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","cached","src","setSrc","isStale","next","transparentImageBackground","Asset","AssetStack","SingleAsset","path","hasPath","isImage","getExtensionFromPath","p","clean","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","cachedThumbnailSrc","TooltipPortal","ext","style","defaultStyles","FileTypeIcon","assets","asset","totalCount","overflowCount","DateTime","date","isValid","format","isGroupedSelectList","option","flattenSelectList","list","resolveSelectLabel","match","item","Select","stringValue","Tags","tag","Badge","getRatingState","max","total","numeric","filled","Rating","state","_","Star","IMAGE_EXTENSION","getFilenameFromUrl","pathname","getAssetFilename","getExtensionFromAsset","filename","isImageAsset","getAssetImageUrl","size","params","separator","FileTypeIconCompat","isZoomOpen","setIsZoomOpen","thumbnailUrl","handleThumbnailClick","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","SORTABLE_INPUT_TYPES","useGridColumnsDefinition","attributesSchema","checkboxSelect","actionsComponent","enableColumnSorting","auth","useAuth","visibleAttributesSchema","filterAttributesForSpaces","inputTypeToPreviewFieldMap","previewFieldComponentsMap","cols","attribute","previewType","previewComponent","isTagsPreview","canSort","id","PreviewComponent","actions","updatedAt","singleCheckboxSelect","Checkbox","multipleCheckboxSelect"],"mappings":"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","file":"chunk-XNHSHVG2.js","sourcesContent":["import type { JSX } from 'react';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '../../ui/primitives/alert';\n\nexport function ProjectDisabled(): JSX.Element {\n return (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"fk:h-4 fk:w-4\" />\n <AlertTitle>Project Paused</AlertTitle>\n <AlertDescription>\n This project has been paused. To troubleshoot this error, please{' '}\n <a\n className=\"fk:text-blue-500 fk:underline\"\n href=\"https://flexkit.io/docs/errors/project-paused\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n follow these steps\n </a>\n .\n </AlertDescription>\n </Alert>\n );\n}\n","import type { JSX } from 'react';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '../../ui/primitives/alert';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\n\nexport function SchemaError(): JSX.Element {\n const { schemaErrorMessage } = useGraphQLError();\n\n if (!schemaErrorMessage) {\n return <></>;\n }\n\n const [summary, deployHint, ...details] = schemaErrorMessage.split('\\n');\n\n return (\n <Alert className=\"fk:mb-4\" variant=\"destructive\">\n <AlertCircle className=\"fk:h-4 fk:w-4\" />\n <AlertTitle>Schema mismatch</AlertTitle>\n <AlertDescription>\n <p>{summary}</p>\n {deployHint ? <p className=\"fk:mt-1\">{deployHint}</p> : null}\n {details.length > 0 ? (\n <ul className=\"fk:mt-2 fk:list-disc fk:pl-4\">\n {details.map((detail) => (\n <li key={detail}>{detail.replace(/^- /, '')}</li>\n ))}\n </ul>\n ) : null}\n </AlertDescription>\n </Alert>\n );\n}\n","/** Fill short viewports immediately; prefetch ahead only once the user scrolls. */\nexport function shouldLoadMore({\n scrollHeight,\n scrollTop,\n clientHeight,\n}: {\n scrollHeight: number;\n scrollTop: number;\n clientHeight: number;\n}): boolean {\n if (clientHeight <= 0) {\n return false;\n }\n\n // Applying the scrolling threshold at the top requests a second page on\n // mount even when the first page already fills the viewport.\n const threshold = scrollTop > 0 ? Math.max(600, clientHeight) : 1;\n\n return scrollHeight - scrollTop - clientHeight < threshold;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { JSX, ReactElement, UIEvent } from 'react';\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n OnChangeFn,\n Updater,\n Row,\n RowSelectionState,\n SortingState,\n Table,\n TableMeta,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n Table as TablePrimitive,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/primitives/table';\nimport { cn } from '../ui/lib/utils';\nimport { TooltipProvider } from '../ui/primitives/tooltip';\nimport type { AttributeValue } from '../graphql-client/types';\nimport type { MultipleRelationshipConnection } from '../core/types';\nimport { useGraphQLError } from '../graphql-client/graphql-context';\nimport { shouldLoadMore } from './should-load-more';\nimport { useIsAppActive } from '../core/apps/app-active';\n\ninterface DataTableProps<TData extends AttributeValue, TValue> {\n classNames?: {\n wrapper?: string;\n table?: string;\n tableContainer?: string;\n row?: string;\n };\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n initialSelectionState?: RowSelectionState;\n isLoadingMore?: boolean;\n onEntitySelectionChange?: (rowSelection: string[]) => void;\n onLoadMore?: () => void;\n onScroll?: (event: UIEvent<HTMLDivElement>) => void;\n onSortingChange?: OnChangeFn<SortingState>;\n pageSize?: number;\n rowHeightEstimate?: number;\n rowAdditionState?: MultipleRelationshipConnection;\n rowDeletionState?: string[];\n scrollToTopKey?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: Table<AttributeValue>) => ReactElement;\n}\n\ninterface ExtendedDataTable extends TableMeta<unknown> {\n getRowBackground: (row: Row<AttributeValue>) => string;\n}\n\n// Matches default `fk:h-9` rows (text-sm / 28px assets + cell padding + border).\nconst DEFAULT_ROW_HEIGHT_PX = 36;\nconst ROW_OVERSCAN = 15;\nconst COLUMN_OVERSCAN = 2;\n// Matches `fk:h-10` on TableHead. The header lives in the same scroll\n// container as the rows, so item measurements must start after it.\nconst STICKY_HEADER_HEIGHT_PX = 40;\n\nfunction inferRowHeightEstimate(rowClassName?: string): number | undefined {\n if (!rowClassName) {\n return undefined;\n }\n\n const tokens = rowClassName.split(/\\s+/);\n\n if (tokens.includes('fk:h-20')) {\n return 80;\n }\n\n if (tokens.includes('fk:h-10')) {\n return 40;\n }\n\n if (tokens.includes('fk:h-9')) {\n return 36;\n }\n\n return undefined;\n}\n\nfunction resolveRowHeightPx(rowHeightEstimate?: number, rowClassName?: string): number {\n return rowHeightEstimate ?? inferRowHeightEstimate(rowClassName) ?? DEFAULT_ROW_HEIGHT_PX;\n}\n\nexport function DataTable<TData extends AttributeValue, TValue>({\n classNames,\n columns,\n data,\n entityName,\n hasMore = false,\n initialSelectionState,\n isLoadingMore = false,\n onEntitySelectionChange,\n onLoadMore,\n onScroll,\n onSortingChange,\n pageSize,\n rowHeightEstimate,\n rowAdditionState,\n rowDeletionState,\n scrollToTopKey,\n sorting: sortingProp,\n toolbarComponent,\n}: DataTableProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState(initialSelectionState ?? {});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0, left: 0 });\n }, [entityName, scrollToTopKey]);\n\n useEffect(() => {\n if (!initialSelectionState) {\n return;\n }\n\n const currentSelection = Object.keys(rowSelection).sort().join(',');\n const nextSelection = Object.keys(initialSelectionState).sort().join(',');\n\n if (currentSelection === nextSelection) {\n return;\n }\n\n setRowSelection(initialSelectionState);\n }, [initialSelectionState, rowSelection]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: handleRowSelectionChange,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` (Asset Manager toolbar); keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n meta: {\n getRowBackground: (row: Row<AttributeValue>) => getRowClassnames(row, rowDeletionState, rowAdditionState),\n },\n });\n\n const { rows } = table.getRowModel();\n const rowHeightPx = resolveRowHeightPx(rowHeightEstimate, classNames?.row);\n const hasExplicitRowHeightClass = inferRowHeightEstimate(classNames?.row) != null;\n // Fixed row heights: skip dynamic measurement so infinite-scroll appends keep\n // identical spacing (estimate corrections were causing a brief taller jump).\n const rowVirtualizer = useVirtualizer({\n count: rows.length,\n estimateSize: () => rowHeightPx,\n getItemKey: (index) => rows[index]?.id ?? index,\n getScrollElement: () => scrollRef.current,\n overscan: ROW_OVERSCAN,\n scrollMargin: STICKY_HEADER_HEIGHT_PX,\n });\n\n const visibleColumns = table.getVisibleLeafColumns();\n const headerGroups = table.getHeaderGroups();\n // Grouped headers span multiple leaf columns; keep their existing layout.\n const virtualizeColumns = headerGroups.length === 1;\n const columnVirtualizer = useVirtualizer({\n horizontal: true,\n count: visibleColumns.length,\n estimateSize: (index) => visibleColumns[index].getSize(),\n getItemKey: (index) => visibleColumns[index].id,\n getScrollElement: () => scrollRef.current,\n overscan: COLUMN_OVERSCAN,\n enabled: virtualizeColumns,\n });\n // Visibility/size changes invalidate cached offsets even when the count stays\n // the same (e.g. navigating between two equally wide entity schemas).\n const columnSizesKey = JSON.stringify(visibleColumns.map((column) => [column.id, column.getSize()]));\n useEffect(() => {\n columnVirtualizer.measure();\n }, [columnSizesKey, columnVirtualizer]);\n const virtualColumns = columnVirtualizer.getVirtualItems();\n const firstColumn = virtualizeColumns ? (virtualColumns[0]?.index ?? 0) : 0;\n const lastColumn = virtualizeColumns\n ? (virtualColumns[virtualColumns.length - 1]?.index ?? -1) + 1\n : visibleColumns.length;\n const paddingLeft = virtualizeColumns ? (virtualColumns[0]?.start ?? 0) : 0;\n const paddingRight = virtualizeColumns\n ? Math.max(0, columnVirtualizer.getTotalSize() - (virtualColumns[virtualColumns.length - 1]?.end ?? 0))\n : 0;\n\n const virtualItems = rowVirtualizer.getVirtualItems();\n const { paddingTop, paddingBottom } = getVirtualBodySpacers(\n virtualItems,\n rowVirtualizer.getTotalSize(),\n STICKY_HEADER_HEIGHT_PX\n );\n\n // Keep load-more inputs in refs so callback identity churn from parents\n // (e.g. Apollo fetchMore) cannot re-trigger the effect every render.\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n if (!shouldLoadMore(scrollElement)) {\n return;\n }\n\n // Optimistic guard until the parent's isLoadingMore prop catches up.\n isLoadingMoreRef.current = true;\n onLoadMoreRef.current();\n }, []);\n\n // Re-check when rows/hasMore/loading settle (not when parent callback\n // identities change) and when the app comes back to the front: behind the\n // active app the table has no height, so `shouldLoadMore` waits.\n const isAppActive = useIsAppActive();\n\n useEffect(() => {\n if (isAppActive) {\n checkLoadMore();\n }\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore, isAppActive]);\n\n function handleRowSelectionChange(updaterFn: Updater<RowSelectionState>): void {\n const selectedIds = typeof updaterFn === 'function' ? Object.keys(updaterFn(rowSelection)) : Object.keys(updaterFn);\n\n setRowSelection(updaterFn);\n onEntitySelectionChange?.(selectedIds);\n }\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n onScroll?.(event);\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className={cn('fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4', classNames?.wrapper)}>\n {toolbarComponent && toolbarComponent(table)}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1 fk:-mb-px\">\n <TooltipProvider delayDuration={400}>\n <TablePrimitive\n className={cn('fk:grid fk:pb-20', classNames?.table)}\n aria-colcount={visibleColumns.length}\n style={{ minWidth: table.getTotalSize() }}\n containerClassName={classNames?.tableContainer}\n onScroll={handleScroll}\n ref={scrollRef}\n >\n <TableHeader className=\"fk:sticky fk:top-0 fk:z-20 fk:grid\">\n {headerGroups.map((headerGroup) => (\n <TableRow className=\"fk:flex fk:w-full\" key={headerGroup.id}>\n {paddingLeft > 0 ? <VirtualColumnSpacer width={paddingLeft} header /> : null}\n {(virtualizeColumns ? headerGroup.headers.slice(firstColumn, lastColumn) : headerGroup.headers).map(\n (header, index) => {\n return (\n <TableHead\n aria-colindex={virtualizeColumns ? firstColumn + index + 1 : undefined}\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center',\n header.column.id === 'actions' && 'fk:pl-0'\n )}\n colSpan={header.colSpan}\n key={header.id}\n style={header.getSize() ? { width: `${header.getSize().toString()}px` } : {}}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-10.25 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-4\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n </TableHead>\n );\n }\n )}\n {paddingRight > 0 ? <VirtualColumnSpacer width={paddingRight} header /> : null}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody className=\"fk:grid fk:relative\">\n {rows.length === 0 ? (\n <TableRow>\n <TableCell className=\"fk:h-24 fk:text-center\" colSpan={columns.length}>\n No results.\n </TableCell>\n </TableRow>\n ) : (\n <>\n {paddingTop > 0 ? <VirtualRowSpacer height={paddingTop} /> : null}\n {virtualItems.map((virtualRow) => {\n const row = rows[virtualRow.index];\n\n return (\n <TableRow\n className={cn(\n (table.options.meta as ExtendedDataTable).getRowBackground(row),\n 'fk:flex fk:w-full fk:overflow-hidden fk:transition-none',\n !hasExplicitRowHeightClass && rowHeightEstimate == null && 'fk:h-9',\n classNames?.row\n )}\n data-index={virtualRow.index}\n data-state={row.getIsSelected() && 'selected'}\n key={virtualRow.key}\n style={{\n height: `${rowHeightPx.toString()}px`,\n }}\n >\n {paddingLeft > 0 ? <VirtualColumnSpacer width={paddingLeft} /> : null}\n {row\n .getVisibleCells()\n .slice(firstColumn, lastColumn)\n .map((cell, index) => (\n <TableCell\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center fk:truncate',\n cell.column.id === 'actions' && 'fk:pl-1!'\n )}\n aria-colindex={firstColumn + index + 1}\n key={cell.id}\n style={{\n width: cell.column.getSize(),\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n {paddingRight > 0 ? <VirtualColumnSpacer width={paddingRight} /> : null}\n </TableRow>\n );\n })}\n {paddingBottom > 0 ? <VirtualRowSpacer height={paddingBottom} /> : null}\n </>\n )}\n </TableBody>\n </TablePrimitive>\n </TooltipProvider>\n </div>\n </div>\n );\n}\n\nfunction getVirtualBodySpacers(\n virtualItems: { start: number; end: number }[],\n totalSize: number,\n scrollMargin: number\n): { paddingTop: number; paddingBottom: number } {\n if (virtualItems.length === 0) {\n return { paddingTop: 0, paddingBottom: 0 };\n }\n\n const firstStart = virtualItems[0]?.start ?? 0;\n const lastEnd = virtualItems[virtualItems.length - 1]?.end ?? 0;\n\n // Measurements include scrollMargin so range math sees the header; tbody\n // spacers must not, because the header is already in thead.\n return {\n paddingTop: Math.max(0, firstStart - scrollMargin),\n paddingBottom: Math.max(0, totalSize - (lastEnd - scrollMargin)),\n };\n}\n\nfunction VirtualColumnSpacer({ width, header = false }: { width: number; header?: boolean }): JSX.Element {\n const Component = header ? 'th' : 'td';\n\n return <Component aria-hidden style={{ width, flexShrink: 0, padding: 0, border: 0 }} />;\n}\n\nfunction VirtualRowSpacer({ height }: { height: number }): JSX.Element {\n return (\n <tr\n aria-hidden\n className=\"fk:pointer-events-none fk:border-0\"\n style={{ display: 'block', height: `${height.toString()}px` }}\n >\n <td className=\"fk:p-0 fk:border-0\" />\n </tr>\n );\n}\n\nfunction getRowClassnames(\n row: Row<AttributeValue>,\n rowDeletionState?: string[],\n rowAdditionState?: MultipleRelationshipConnection\n): string {\n if (rowDeletionState?.includes(row.original._id)) {\n return 'fk:bg-row-removed fk:hover:bg-row-removed-hover';\n }\n\n if (rowAdditionState?.some((line) => line._id === row.original._id)) {\n return 'fk:bg-row-added fk:hover:bg-row-added-hover';\n }\n\n return '';\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { X } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\n\ninterface DataTableSortedByProps<TData> {\n table: Table<TData>;\n}\n\ntype ColumnMeta = {\n label?: string;\n};\n\nexport function DataTableSortedBy<TData>({ table }: DataTableSortedByProps<TData>): JSX.Element | null {\n const [sort] = table.getState().sorting;\n\n if (!sort) {\n return null;\n }\n\n const column = table.getColumn(sort.id);\n const label = (column?.columnDef.meta as ColumnMeta | undefined)?.label ?? sort.id;\n const direction = sort.desc ? 'desc' : 'asc';\n\n return (\n <Button\n aria-label={`Clear sorting by ${label}`}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3 fk:text-success fk:border-none\"\n onClick={() => {\n table.resetSorting();\n }}\n size=\"sm\"\n variant=\"outline\"\n >\n Sorted by {label} {direction}\n <X className=\"fk:ml-1 fk:h-4 fk:w-4\" />\n </Button>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport { gql } from '@apollo/client';\nimport type { DocumentNode, ErrorLike } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport type { MutationHookOptions } from '@apollo/client/react';\nimport { getServerError, parseErrorBody } from './error-utils';\n\ntype EntityMutationResponse = [\n Dispatch<SetStateAction<boolean>>,\n Dispatch<SetStateAction<DocumentNode>>,\n Dispatch<SetStateAction<object>>,\n {\n data: unknown;\n loading: boolean;\n error: ErrorLike | undefined;\n isProjectDisabled: boolean;\n isProjectReadOnly: boolean;\n },\n];\n\nexport function useEntityMutation(): EntityMutationResponse {\n const [runMutation, setRunMutation] = useState(false);\n const [mutation, setMutation] = useState(gql`\n mutation updateEntity($any: Any) {\n any\n }\n `);\n const [options, setOptions] = useState<MutationHookOptions>({});\n const [mutateFunction, { data, loading, error }] = useMutation(mutation, options);\n\n // Parse 403 error response to determine the specific error code\n const serverError = getServerError(error);\n\n const { isProjectDisabled, isProjectReadOnly } = (() => {\n if (serverError?.statusCode === 403) {\n const responseBody = parseErrorBody<{ code?: string }>(serverError.bodyText);\n\n if (responseBody && typeof responseBody.code === 'string') {\n if (responseBody.code === 'PROJECT_PAUSED') {\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n if (responseBody.code === 'READ_ONLY_MODE') {\n return {\n isProjectDisabled: false,\n isProjectReadOnly: true,\n };\n }\n }\n\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n return {\n isProjectDisabled: false,\n isProjectReadOnly: false,\n };\n })();\n\n useEffect(() => {\n if (runMutation) {\n void mutateFunction();\n setRunMutation(false);\n }\n }, [runMutation, mutateFunction]);\n\n return [setRunMutation, setMutation, setOptions, { data, loading, error, isProjectDisabled, isProjectReadOnly }];\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ArrowDown, ArrowUp, ChevronDown } from 'lucide-react';\nimport type { Column } from '@tanstack/react-table';\nimport { cn } from '../ui/lib/utils';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableColumnHeaderProps<TData, TValue> {\n column: Column<TData, TValue>;\n title: string;\n className?: string;\n}\n\nexport function DataTableColumnHeader<TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>): JSX.Element {\n if (!column.getCanSort()) {\n return <div className={cn('fk:flex fk:items-center', className)}>{title}</div>;\n }\n\n const isSortedAsc = column.getIsSorted() === 'asc';\n const isSortedDesc = column.getIsSorted() === 'desc';\n\n return (\n <div className={cn('fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-1', className)}>\n <span className=\"fk:truncate\">{title}</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n aria-label={`Sort ${title}`}\n className=\"fk:inline-flex fk:shrink-0 fk:items-center fk:justify-center fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:outline-hidden fk:hover:bg-accent fk:hover:text-accent-foreground fk:focus-visible:ring-1 fk:focus-visible:ring-ring fk:corner-squircle\"\n type=\"button\"\n >\n <ChevronDown className=\"fk:h-3.5 fk:w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-44\">\n <DropdownMenuItem\n aria-checked={isSortedAsc}\n className={cn(isSortedAsc && 'fk:bg-accent fk:text-accent-foreground')}\n onSelect={() => {\n if (isSortedAsc) {\n column.clearSorting();\n\n return;\n }\n\n column.toggleSorting(false);\n }}\n role=\"menuitemcheckbox\"\n >\n <ArrowUp className={cn('fk:h-4 fk:w-4', isSortedAsc && 'fk:text-white')} />\n Sort Ascending\n </DropdownMenuItem>\n <DropdownMenuItem\n aria-checked={isSortedDesc}\n className={cn(isSortedDesc && 'fk:bg-accent fk:text-accent-foreground')}\n onSelect={() => {\n if (isSortedDesc) {\n column.clearSorting();\n\n return;\n }\n\n column.toggleSorting(true);\n }}\n role=\"menuitemcheckbox\"\n >\n <ArrowDown className={cn('fk:h-4 fk:w-4', isSortedDesc && 'fk:text-white')} />\n Sort Descending\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import { CircleCheck, CircleX } from 'lucide-react';\n\nexport function Boolean({ value }: { value: boolean }) {\n return (\n <div className=\"fk:flex fk:w-full fk:justify-center\">\n {value ? (\n <CircleCheck className=\"fk:w-4 fk:h-4 fk:text-emerald-500\" />\n ) : (\n <CircleX className=\"fk:w-4 fk:h-4 fk:text-muted-foreground\" />\n )}\n </div>\n );\n}\n","'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, 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 [copied, setCopied] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n useEffect(() => {\n return () => {\n if (dismissTimeoutRef.current) {\n clearTimeout(dismissTimeoutRef.current);\n }\n };\n }, []);\n\n function measureTruncation(): boolean {\n const element = textRef.current;\n\n if (!element) {\n return false;\n }\n\n return element.scrollWidth > element.clientWidth;\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 handlePointerEnter(): void {\n measureTruncation();\n }\n\n function handleTooltipOpenChange(open: boolean): void {\n if (copied) {\n return;\n }\n\n if (open) {\n setTooltipOpen(measureTruncation());\n\n return;\n }\n\n setTooltipOpen(false);\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 <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 fk:corner-squircle',\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 onPointerEnter={handlePointerEnter}\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 fk:corner-squircle',\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 );\n}\n","import { CopyableTruncatedText } from './copyable-truncated-text';\n\nexport function Text({ value }: { value: string | object | unknown[] }) {\n let displayValue = typeof value === 'object' || Array.isArray(value) ? JSON.stringify(value) : value;\n displayValue = displayValue === 'null' || displayValue == null ? '' : String(displayValue);\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n","import {\n AIHighlight,\n CharacterCount,\n CodeBlockLowlight,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n HighlightExtension,\n HorizontalRule,\n Placeholder,\n StarterKit,\n TaskItem,\n TaskList,\n TextStyle,\n TiptapImage,\n TiptapLink,\n TiptapUnderline,\n Twitter,\n Youtube,\n Mathematics,\n UploadImagesPlugin,\n} from 'novel';\nimport { Markdown } from 'tiptap-markdown';\nimport { cx } from 'class-variance-authority';\nimport { common, createLowlight } from 'lowlight';\n\n//TODO I am using cx here to get tailwind autocomplete working, idk if someone else can write a regex to just capture the class key in objects\nconst aiHighlight = AIHighlight;\n//You can overwrite the placeholder with your own configuration\nconst placeholder = Placeholder;\nconst tiptapLink = TiptapLink.configure({\n HTMLAttributes: {\n 'class': cx(\n 'fk:text-muted-foreground fk:underline fk:underline-offset-[3px] fk:hover:text-primary fk:transition-colors fk:cursor-pointer'\n ),\n },\n});\n\nconst markdownExtension = Markdown.configure({\n html: true,\n tightLists: true,\n tightListClass: 'tight',\n bulletListMarker: '-',\n linkify: false,\n breaks: false,\n transformPastedText: false,\n transformCopiedText: false,\n});\n\nconst tiptapImage = TiptapImage.extend({\n addProseMirrorPlugins() {\n return [\n UploadImagesPlugin({\n imageClass: cx('fk:opacity-40 fk:rounded-lg fk:border fk:border-stone-200 fk:corner-squircle'),\n }),\n ];\n },\n}).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cx('fk:rounded-lg fk:border fk:border-muted fk:corner-squircle'),\n },\n});\n\nconst taskList = TaskList.configure({\n HTMLAttributes: {\n class: cx('fk:not-prose fk:pl-2 '),\n },\n});\nconst taskItem = TaskItem.configure({\n HTMLAttributes: {\n 'class': cx('fk:flex gap-2 fk:items-start fk:my-2'),\n },\n nested: true,\n});\n\nconst horizontalRule = HorizontalRule.configure({\n HTMLAttributes: {\n 'class': cx('mt-4 mb-6 border-t border-muted-foreground'),\n },\n});\n\nconst starterKit = StarterKit.configure({\n bulletList: {\n HTMLAttributes: {\n 'class': cx('fk:list-disc fk:list-outside fk:leading-3 fk:-mt-2'),\n },\n },\n orderedList: {\n HTMLAttributes: {\n 'class': cx('fk:list-decimal fk:list-outside fk:leading-3 fk:-mt-2'),\n },\n },\n listItem: {\n HTMLAttributes: {\n 'class': cx('fk:leading-normal fk:-mb-2'),\n },\n },\n blockquote: {\n HTMLAttributes: {\n 'class': cx('fk:border-l-4 fk:border-primary'),\n },\n },\n codeBlock: false,\n code: {\n HTMLAttributes: {\n 'class': cx('fk:rounded-md fk:bg-muted fk:px-1.5 fk:py-1 fk:font-mono fk:font-medium fk:corner-squircle'),\n spellcheck: 'false',\n },\n },\n horizontalRule: false,\n dropcursor: {\n color: '#DBEAFE',\n width: 4,\n },\n gapcursor: false,\n});\n\nconst codeBlockLowlight = CodeBlockLowlight.configure({\n // configure lowlight: common / all / use highlightJS in case there is a need to specify certain language grammars only\n // common: covers 37 language grammars which should be good enough in most cases\n lowlight: createLowlight(common),\n});\n\nconst youtube = Youtube.configure({\n HTMLAttributes: {\n 'class': cx('fk:rounded-lg fk:border fk:border-muted fk:corner-squircle'),\n },\n inline: false,\n});\n\nconst twitter = Twitter.configure({\n HTMLAttributes: {\n 'class': cx('fk:not-prose'),\n },\n inline: false,\n});\n\nconst mathematics = Mathematics.configure({\n HTMLAttributes: {\n 'class': cx('fk:text-foreground fk:rounded-sm fk:p-1 fk:hover:bg-muted fk:cursor-pointer fk:corner-squircle'),\n },\n katexOptions: {\n throwOnError: false,\n },\n});\n\nconst characterCount = CharacterCount.configure();\n\nexport const defaultExtensions: readonly unknown[] = [\n starterKit,\n placeholder,\n tiptapLink,\n tiptapImage,\n taskList,\n taskItem,\n horizontalRule,\n aiHighlight,\n codeBlockLowlight,\n youtube,\n twitter,\n mathematics,\n characterCount,\n TiptapUnderline,\n markdownExtension,\n HighlightExtension,\n TextStyle,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n];\n","import { getSchema, getText, getTextSerializersFromSchema } from '@tiptap/core';\nimport type { Extensions } from '@tiptap/core';\nimport { Node } from '@tiptap/pm/model';\nimport { defaultExtensions } from '../../form/fields/editor/extensions';\n\n// generateText builds this schema for every call. Grid cells share the same\n// extensions, so compile once, on the first rich-text preview that needs it.\nlet serializer: ReturnType<typeof createSerializer> | undefined;\n\nfunction createSerializer() {\n const schema = getSchema(defaultExtensions as Extensions);\n\n return { schema, textSerializers: getTextSerializersFromSchema(schema) };\n}\n\nexport function getEditorPreviewText(value: string | undefined, maxLength = 100): string {\n if (!value) {\n return '';\n }\n\n try {\n const document = JSON.parse(value);\n serializer ??= createSerializer();\n\n return getText(Node.fromJSON(serializer.schema, document), {\n textSerializers: serializer.textSerializers,\n }).substring(0, maxLength);\n } catch {\n return value.substring(0, maxLength);\n }\n}\n","import { useMemo } from 'react';\nimport { getEditorPreviewText } from './editor-text';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\n/**\n * Renders a preview of the editor content.\n */\nexport function Editor({ value }: { value: string }) {\n const textValue = useMemo(() => getEditorPreviewText(value), [value]);\n\n return <CopyableTruncatedText value={textValue} />;\n}\n","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, 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 {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} fk:corner-squircle`}\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} fk:corner-squircle`}\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 fk:corner-squircle\">\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 </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} fk:corner-squircle`}\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","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","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","import { Badge } from '../../ui/primitives/badge';\n\nexport function Tags({ value }: { value: string }) {\n if (!value || !value.split(',').length) {\n return null;\n }\n\n return (\n <div className=\"fk:flex fk:flex-wrap fk:gap-1 fk:max-w-full truncate\">\n {value.split(',').map((tag) => (\n <Badge\n className=\"fk:px-2.5 fk:py-0 fk:font-normal fk:text-[0.6875rem] fk:leading-4\"\n key={tag}\n variant=\"secondary\"\n >\n {tag}\n </Badge>\n ))}\n </div>\n );\n}\n","export const DEFAULT_RATING_MAX = 5;\n\nexport type RatingState = {\n /** Number of filled stars. */\n filled: number;\n /** Total number of stars. */\n max: number;\n /** Accessible description, e.g. \"4 out of 5 stars\". */\n label: string;\n};\n\n/**\n * Turns a stored value into what the stars show. Non-numeric, missing and\n * empty values yield `null` (render nothing); numbers are rounded and clamped\n * to `[0, max]`. `max` comes from `options.max` and falls back to five.\n */\nexport function getRatingState(value: unknown, max: number | undefined = DEFAULT_RATING_MAX): RatingState | null {\n const total = Number.isFinite(max) && (max as number) >= 1 ? Math.floor(max as number) : DEFAULT_RATING_MAX;\n const numeric = typeof value === 'string' && value.trim() !== '' ? Number(value) : value;\n\n if (typeof numeric !== 'number' || !Number.isFinite(numeric)) {\n return null;\n }\n\n const filled = Math.min(total, Math.max(0, Math.round(numeric)));\n\n return { filled, max: total, label: `${String(filled)} out of ${String(total)} stars` };\n}\n","import type { JSX } from 'react';\nimport { Star } from 'lucide-react';\nimport type { NumberOptions } from '../../core/types';\nimport { getRatingState } from './rating-state';\n\ntype Props = {\n value: number | string | null | undefined;\n options?: NumberOptions;\n};\n\n/** Filled stars for a numeric attribute (`previewType: 'rating'`); `options.max` sets the count. */\nexport function Rating({ value, options }: Props): JSX.Element {\n const state = getRatingState(value, options?.max);\n\n if (!state) {\n return <span />;\n }\n\n return (\n <span aria-label={state.label} className=\"fk:inline-flex fk:items-center fk:gap-0.5\" role=\"img\" title={state.label}>\n {Array.from({ length: state.max }, (_, index) => (\n <Star\n aria-hidden\n className={\n index < state.filled\n ? 'fk:h-3.5 fk:w-3.5 fk:fill-amber-400 fk:text-amber-400'\n : 'fk:h-3.5 fk:w-3.5 fk:fill-transparent fk:text-muted-foreground/40'\n }\n key={index}\n strokeWidth={1.5}\n />\n ))}\n </span>\n );\n}\n","const IMAGE_EXTENSION = /\\.(png|jpe?g|gif|webp|avif|svg)$/i;\n\nexport type AssetUrlFields = {\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n url?: string | null;\n};\n\nfunction getFilenameFromUrl(url: string): string {\n try {\n const { pathname } = new URL(url);\n const segment = pathname.split('/').pop();\n\n return segment || pathname;\n } catch {\n const [pathname] = url.split('?');\n\n return pathname;\n }\n}\n\nexport function getAssetFilename(asset: AssetUrlFields): string {\n if (asset.originalFilename) {\n return asset.originalFilename;\n }\n\n if (asset.path) {\n return asset.path;\n }\n\n if (asset.url) {\n return getFilenameFromUrl(asset.url);\n }\n\n return '';\n}\n\nexport function getExtensionFromAsset(asset: AssetUrlFields): string {\n const filename = getAssetFilename(asset);\n const [clean] = filename.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n}\n\nexport function isImageAsset(asset: AssetUrlFields): boolean {\n if (asset.mimeType) {\n return asset.mimeType.startsWith('image/');\n }\n\n return IMAGE_EXTENSION.test(getAssetFilename(asset));\n}\n\nexport function getAssetImageUrl(url: string, size?: { height: number; width: number }): string {\n if (!url || !size) {\n return url;\n }\n\n if (getFilenameFromUrl(url).toLowerCase().endsWith('.svg')) {\n return url;\n }\n\n const params = new URLSearchParams({\n f: 'webp',\n h: String(size.height),\n w: String(size.width),\n });\n const separator = url.includes('?') ? '&' : '?';\n\n return `${url}${separator}${params.toString()}`;\n}\n","import { useState, type ComponentType, type JSX, type MouseEvent } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Tooltip,\n TooltipContent,\n TooltipPortal,\n TooltipProvider,\n TooltipTrigger,\n} from '../../../../ui';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetImageUrl, getExtensionFromAsset, isImageAsset, type AssetUrlFields } from '../asset-url';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: AssetUrlFields }): JSX.Element | null {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const url = value?.url ?? '';\n\n if (!value || (!url && !value.path && !value.originalFilename)) {\n return null;\n }\n\n const isImage = isImageAsset(value) && Boolean(url);\n\n if (!isImage) {\n const ext = getExtensionFromAsset(value);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\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 fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\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 </TooltipProvider>\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 84, height: 84 });\n const fullUrl = getAssetImageUrl(url, { width: 624, height: 624 });\n\n function handleThumbnailClick(event: MouseEvent<HTMLImageElement>): void {\n event.stopPropagation();\n setIsZoomOpen(true);\n }\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n src={thumbnailUrl}\n alt=\"asset\"\n className={`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n src={fullUrl}\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n <Dialog open={isZoomOpen} onOpenChange={setIsZoomOpen}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <img\n src={url}\n alt=\"asset\"\n className={`fk:max-h-[85vh] fk:w-full fk:overflow-hidden fk:rounded-md fk:object-contain fk:corner-squircle`}\n />\n </DialogContent>\n </Dialog>\n </TooltipProvider>\n </div>\n );\n}\n","import { ComponentType } from 'react';\nimport type { JSX } from 'react';\nimport type { CellContext, Column, ColumnDef, Row, Table } from '@tanstack/react-table';\nimport type { Attribute, InputType, NumberOptions, SelectOptions } from '../core/types';\nimport type { AttributeValue } from '../graphql-client/types';\nimport { useAuth } from '../auth/auth-context';\nimport { filterAttributesForSpaces } from '../core/spaces';\nimport { Checkbox } from '../ui/primitives/checkbox';\nimport { Boolean as BooleanPrefiewField } from './preview-components/boolean';\nimport { Text as TextPreviewField } from './preview-components/text';\nimport { Editor as EditorPreviewField } from './preview-components/editor';\nimport { Asset as AssetPreviewField } from './preview-components/asset';\nimport { DateTime as DateTimePreviewField } from './preview-components/datetime';\nimport { Select as SelectPreviewField } from './preview-components/select';\nimport { Tags as TagsPreviewField } from './preview-components/tags';\nimport { Rating as RatingPreviewField } from './preview-components/rating';\nimport { Asset as AssetManagerAssetPreviewField } from '../apps/asset-manager/data-grid/preview-components/asset';\nimport { DataTableColumnHeader } from './data-table-column-header';\n\nconst SORTABLE_INPUT_TYPES = new Set<InputType>([\n 'text',\n 'number',\n 'datetime',\n 'switch',\n 'select',\n]);\n\ntype Props<TData> = {\n attributesSchema: Attribute[];\n checkboxSelect?: 'single' | 'multiple'; // whether to include a checkbox column for row selection\n actionsComponent?: (row: Row<TData>) => JSX.Element; // a component to be displayed in the actions column of the grid\n enableColumnSorting?: boolean;\n};\n\ntype ColumnDefinition<TData extends AttributeValue, TValue> = ColumnDef<TData, TValue> & { id?: string; size: number };\n\nexport function useGridColumnsDefinition<TData extends AttributeValue, TValue>({\n attributesSchema,\n checkboxSelect,\n actionsComponent,\n enableColumnSorting = false,\n}: Props<TData>): ColumnDefinition<TData, TValue>[] {\n const [, auth] = useAuth();\n // Space-bound attributes are filtered out for non-members; their values are\n // null-ed by the server anyway, this just avoids rendering empty columns.\n const visibleAttributesSchema = filterAttributesForSpaces(attributesSchema, auth.user?.spaces);\n const inputTypeToPreviewFieldMap = {\n 'datetime': 'datetime',\n 'editor': 'editor',\n 'asset': 'asset',\n 'number': 'text',\n 'relationship': 'text',\n 'select': 'select',\n 'switch': 'boolean',\n 'text': 'text',\n 'textarea': 'text',\n };\n const previewFieldComponentsMap = {\n 'boolean': BooleanPrefiewField,\n 'date': TextPreviewField,\n 'datetime': DateTimePreviewField,\n 'editor': EditorPreviewField,\n 'asset': AssetPreviewField,\n 'number': TextPreviewField,\n 'relationship': TextPreviewField,\n 'select': SelectPreviewField,\n 'switch': BooleanPrefiewField,\n 'text': TextPreviewField,\n 'textarea': TextPreviewField,\n 'tags': TagsPreviewField,\n 'rating': RatingPreviewField,\n // Asset Manager rows render the whole record (path, mime type, ...).\n 'assetPreviewField': AssetManagerAssetPreviewField,\n };\n\n const cols = visibleAttributesSchema\n .map((attribute) => {\n // System timestamp column is always appended last; skip schema duplicates.\n if (attribute.name === '_updatedAt') {\n return null;\n }\n\n const previewType =\n (attribute.inputType === 'relationship' && attribute.relationship?.entity === '_asset' ? 'asset' : undefined) ??\n attribute.previewType ??\n inputTypeToPreviewFieldMap[attribute.inputType as keyof typeof inputTypeToPreviewFieldMap];\n // Unknown preview types (e.g. custom ones from older configs) fall back to text.\n const previewComponent =\n (previewFieldComponentsMap[previewType as keyof typeof previewFieldComponentsMap] as\n | ComponentType<{ value: TData }>\n | undefined) ?? previewFieldComponentsMap['text'];\n\n if (attribute.hidden === true) {\n return null;\n }\n\n const isTagsPreview = previewType === 'tags';\n // Only global scalars appear on Neo4j GraphQL `{entity}Sort`. Local fields are\n // emitted as relationships (e.g. brand.metaTitle → brand_metaTitle) and cannot be sorted.\n const canSort =\n enableColumnSorting &&\n attribute.scope === 'global' &&\n SORTABLE_INPUT_TYPES.has(attribute.inputType);\n\n return {\n accessorKey: attribute.name,\n filterFn: (row: Row<TData>, id: string, value: string | string[]) => {\n if (isTagsPreview) {\n return true;\n }\n\n const selectedValues = Array.isArray(value) ? value : [value];\n\n return selectedValues.includes(row.getValue(id));\n },\n header: ({ column }: { column: Column<TData, TValue> }) =>\n canSort ? (\n <DataTableColumnHeader column={column} title={attribute.label} />\n ) : (\n <div className=\"fk:flex fk:items-center\">{attribute.label}</div>\n ),\n cell: ({ row }: CellContext<TData, TValue>) => {\n const PreviewComponent = previewComponent as ComponentType<{\n value: TData;\n options?: SelectOptions | NumberOptions;\n }>;\n\n // Select needs its option list; rating reads the star count from options.max.\n if (previewType === 'select' || previewType === 'rating') {\n return (\n <PreviewComponent\n value={row.getValue(attribute.name)}\n options={attribute.options as SelectOptions | NumberOptions | undefined}\n />\n );\n }\n\n if (previewType === 'assetPreviewField') {\n return <PreviewComponent value={row.original} />;\n }\n\n return <PreviewComponent value={row.getValue(attribute.name)} />;\n },\n enableSorting: canSort,\n enableHiding: true,\n meta: {\n label: attribute.label,\n },\n size: attribute.options?.size ?? 150,\n };\n })\n .filter((column) => column !== null);\n\n const actions = {\n id: 'actions',\n cell: ({ row }: CellContext<TData, TValue>) => (actionsComponent ? actionsComponent(row) : null),\n size: 80,\n };\n\n const updatedAt = {\n accessorKey: '_updatedAt',\n header: ({ column }: { column: Column<TData, TValue> }) =>\n enableColumnSorting ? (\n <DataTableColumnHeader column={column} title=\"Updated At\" />\n ) : (\n <div className=\"fk:flex fk:items-center\">Updated At</div>\n ),\n cell: ({ row }: CellContext<TData, TValue>) => (\n <DateTimePreviewField value={row.getValue('_updatedAt')} />\n ),\n enableSorting: enableColumnSorting,\n enableHiding: false,\n meta: {\n label: 'Updated At',\n },\n size: 220,\n };\n\n const singleCheckboxSelect = {\n id: 'select',\n cell: ({ row, table }: CellContext<TData, TValue>) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(false);\n row.toggleSelected(Boolean(value));\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 50,\n };\n\n const multipleCheckboxSelect = {\n id: 'select',\n header: ({ table }: { table: Table<unknown> }) => (\n <Checkbox\n className=\"fk:dark:bg-white/15\"\n aria-label=\"Select all\"\n checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate')}\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(Boolean(value));\n }}\n />\n ),\n cell: ({ row }: CellContext<TData, TValue>) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 50,\n };\n\n return [\n ...(checkboxSelect === 'single' ? [singleCheckboxSelect] : []),\n ...(checkboxSelect === 'multiple' ? [multipleCheckboxSelect] : []),\n ...(actionsComponent ? [actions] : []),\n ...cols,\n updatedAt,\n ];\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/attribute-scope.ts"],"names":["getAttributeScope","attribute"],"mappings":"oBAEO,SAASA,CAAAA,CAAkBC,EAAiC,CACjE,OAAIA,EAAU,QAAA,GAAa,OAAA,CAClB,QAAA,CAGFA,CAAAA,CAAU,KACnB","file":"chunk-YDVO6XWD.js","sourcesContent":["import type { Attribute, ScopeType } from './types';\n\nexport function getAttributeScope(attribute: Attribute): ScopeType {\n if (attribute.dataType === 'asset') {\n return 'global';\n }\n\n return attribute.scope;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import'./index.css';import {e,c,b,a,g,h as h$1,m as m$1,k as k$1,n}from'./chunk-4IEOAKKK.js';import {m as m$2,w as w$1}from'./chunk-OOYCTZ3C.js';import {b as b$3}from'./chunk-ZZRA4567.js';import {c as c$3}from'./chunk-BMO7JFAX.js';import {c as c$4}from'./chunk-XMOSCJOI.js';import {u,t,v,r as r$1,w,l as l$1,j,p as p$2,s,q as q$2}from'./chunk-A7XHA2P6.js';import {a as a$2}from'./chunk-ERDARDGB.js';import {f}from'./chunk-H2RWSC56.js';import {na,p,q,r,t as t$2,u as u$1,v as v$1,qa,s as s$1}from'./chunk-DGIY4SKN.js';import {t as t$1}from'./chunk-SZEGGBOC.js';import {b as b$2,c as c$1,h,i,k,l,m,o,p as p$1,q as q$1,r as r$2,t as t$3}from'./chunk-32ZU4MLE.js';import {a as a$1,b as b$4,c as c$2,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$1}from'./chunk-6NRQMG26.js';import {useState,useMemo,useDeferredValue}from'react';import {BookOpenTextIcon,PaperclipIcon,ChevronRightIcon,LayersIcon,XIcon,PlusIcon,Unlink2Icon,LoaderCircle,SearchIcon}from'lucide-react';import {Link}from'react-router-dom';import H from'swr';import Qe from'swr/infinite';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var Be=50;function fe({disabled:n,label:l,onClick:o}){return jsxs(b$4,{children:[jsx(c$2,{asChild:true,children:jsx(b$1,{"aria-label":l,className:"fk:size-7 fk:shrink-0",disabled:n,size:"icon",variant:"ghost",onClick:o,children:jsx(Unlink2Icon,{className:"fk:size-4"})})}),jsx(e$1,{children:l})]})}function Xe({api:n$1,attachedIds:l$2,onAttached:o,onOpenChange:a,open:s$2,projectId:u,target:r,targetLabel:c$2}){let[p,h$2]=useState(""),m=useDeferredValue(p.trim()),[y,f]=useState(null),b$1=(k,K)=>!s$2||K&&!K.hasMore?null:c(u).sources({limit:Be,offset:k*Be,search:m||void 0}),{data:v,error:w,isLoading:x,setSize:i$1,size:d}=Qe(b$1,b,{keepPreviousData:true}),g=useMemo(()=>s(v?.flatMap(k=>k.sources)??[],l$2),[l$2,v]),L=v?.[v.length-1]?.hasMore??false,C=v!==void 0&&d>v.length;async function A(k){f(k.id);try{let K=await n$1.linkSource(k.id,r);qa.success(K.linked?`Attached "${k.title}".`:`"${k.title}" was already attached.`),o(k),a(!1);}catch(K){qa.error(h$1(K,"The document could not be attached."));}finally{f(null);}}let R;return w?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):x&&!v?R=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-3 fk:py-2",children:[jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"})]}):g.length===0&&!L?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground",children:m?"No documents match your search.":"Every document is attached already, or there are none yet. Add documents in Knowledge first."}):R=jsxs("ul",{className:"fk:flex fk:max-h-80 fk:flex-col fk:overflow-y-auto fk:-mx-2",children:[g.map(k=>{let K=l$1(k),B=y===k.id;return jsx("li",{children:jsxs("button",{className:"fk:flex fk:w-full fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-2 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:disabled:opacity-60 fk:corner-squircle",disabled:y!==null,type:"button",onClick:()=>{A(k);},children:[jsx(m$1,{source:k}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:k.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[j(k)," \xB7 ",K.detail]})]}),B?jsx(LoaderCircle,{className:"fk:size-4 fk:shrink-0 fk:animate-spin fk:text-muted-foreground"}):jsx(k$1,{label:K.label,tone:K.tone})]})},k.id)}),L&&!C?jsx("li",{"aria-hidden":true,children:jsx(n,{onVisible:()=>{i$1(k=>k+1);}})}):null,C?jsx("li",{className:"fk:flex fk:justify-center fk:py-2",children:jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin fk:text-muted-foreground"})}):null]}),jsx(c$1,{open:s$2,onOpenChange:a,children:jsxs(h,{className:"fk:sm:max-w-lg",children:[jsxs(i,{children:[jsx(k,{children:"Attach a document"}),jsx(l,{children:r.recordId===void 0?`Documents attached to every ${c$2} are searched before the rest of Knowledge when a question is about one of them, or about ${c$2} in general.`:`Documents attached to ${c$2} are searched before the rest of Knowledge when a question is about it.`})]}),jsxs("div",{className:"fk:relative",children:[jsx(SearchIcon,{className:"fk:pointer-events-none fk:absolute fk:left-2.5 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground"}),jsx(s$1,{"aria-label":"Search documents",autoFocus:true,className:"fk:pl-8",placeholder:"Search documents by title",value:p,onChange:k=>h$2(k.target.value)})]}),R]})})}function re({projectId:n,renderAction:l,sources:o}){return jsx("ul",{className:"fk:flex fk:flex-col fk:gap-1 fk:-mx-2",children:o.map(a=>{let s=l$1(a);return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1.5 fk:corner-squircle",children:[jsxs(Link,{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-3 fk:rounded-md fk:hover:underline fk:underline-offset-2",to:p$2(n,a.id),children:[jsx(m$1,{source:a}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:a.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[j(a)," \xB7 ",s.detail]})]})]}),jsx(k$1,{label:s.label,tone:s.tone}),l?.(a)]},a.id)})})}function yt({entityName:n}){let{api:l,projectId:o}=e(),{currentProject:a$1}=f(),[s,u$1]=useState(false),r=u(a$1?.schema??[],n),c$1=!!r&&t(n),{data:p,error:h}=H(o&&c$1?c(o).entitySources(n):null,b);if(!l||!o||!r||!c$1||h instanceof a&&h.status===404)return null;let m=p?.sources.length??0;return jsxs(Fragment,{children:[jsxs(b$1,{"aria-label":`Knowledge for every ${v(r)}`,className:"fk:mr-2 fk:h-8","data-knowledge-entity-button":true,size:"sm",variant:"outline",onClick:()=>u$1(true),children:[jsx(BookOpenTextIcon,{}),"Knowledge",m>0?jsx(b$2,{className:"fk:corner-squircle",variant:"secondary",children:m}):null]}),jsx(Ue,{api:l,entityLabel:v(r),entityName:n,open:s,projectId:o,onOpenChange:u$1})]})}function Ue({api:n,entityLabel:l$1,entityName:o,onOpenChange:a,open:s,projectId:u}){let r=b$3(),[c$2,p]=useState(false),[h$2,m]=useState(null),{data:y,error:f,isLoading:b$4,mutate:v}=H(c(u).entitySources(o),b),w=y?.sources??[],x=useMemo(()=>({entity:o}),[o]);async function i$1(g$1){m(g$1.id);try{await n.unlinkSource(g$1.id,x),qa.success(`"${g$1.title}" no longer applies to every ${l$1}.`),await v({sources:w.filter(L=>L.id!==g$1.id)},{revalidate:!1}),g();}catch(L){qa.error(h$1(L,"The document could not be detached."));}finally{m(null);}}let d;return f?d=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):b$4&&!y?d=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):w.length===0?d=jsxs("p",{className:"fk:text-sm fk:text-muted-foreground",children:["No documents apply to every ",l$1," yet. Attach a guide, a policy or a spec that holds for all of them and the agent searches it first when asked about any ",l$1,", or about ",l$1," in general."]}):d=jsx(re,{projectId:u,sources:w,renderAction:g=>r?jsx(fe,{disabled:h$2!==null,label:`Detach ${g.title}`,onClick:()=>{i$1(g);}}):null}),jsx(c$1,{open:s,onOpenChange:a,children:jsxs(h,{className:"fk:sm:max-w-lg","data-knowledge-entity-dialog":true,children:[jsxs(i,{children:[jsxs(k,{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenTextIcon,{className:"fk:size-4 fk:text-muted-foreground"}),"Knowledge for every ",l$1,y?jsx(b$2,{className:"fk:corner-squircle",variant:"outline",children:w.length}):null]}),jsxs(l,{children:["Documents attached here apply to every ",l$1,"; each record can hold its own on top."]})]}),jsx("div",{className:"fk:max-h-80 fk:overflow-y-auto",children:d}),jsx("div",{className:"fk:flex fk:justify-end",children:jsx(na,{disabled:!r,children:jsxs(b$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>p(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})})}),jsx(Xe,{api:n,attachedIds:w.map(g=>g.id),open:c$2,projectId:u,target:x,targetLabel:l$1,onAttached:g$1=>{v({sources:w.some(L=>L.id===g$1.id)?w:[...w,g$1]},{revalidate:false}),g();},onOpenChange:p})]})})}function bt({entityName:n,recordId:l,recordLabel:o}){let{api:a$2,projectId:s}=e(),{currentProject:u$1}=f(),r$1=b$3(),[c$1,p$1]=useState(false),[h,m]=useState(false),[y,f$1]=useState(null),b$4=useMemo(()=>({entity:n,recordId:l}),[n,l]),v$1=u(u$1?.schema??[],n),w=v$1?v(v$1):n,x=t(n),{data:i,error:d,isLoading:g$1,mutate:L}=H(s&&x?c(s).recordSources(b$4):null,b);if(!a$2||!s||!x||d instanceof a&&d.status===404)return null;let C=i?.sources??[],A=i?.inherited??[],R=C.map(N=>N.id),k=a$2;async function K(N){f$1(N.id);try{await k.unlinkSource(N.id,b$4),qa.success(`Detached "${N.title}".`),await L({sources:C.filter($=>$.id!==N.id),inherited:A},{revalidate:!1}),g();}catch($){qa.error(h$1($,"The document could not be detached."));}finally{f$1(null);}}let B;return d?B=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The attached documents could not be loaded."}):g$1&&!i?B=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):B=jsxs("div",{className:"fk:flex fk:flex-col fk:gap-4",children:[C.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:A.length>0?"No documents attached to this record itself; the ones below apply to every record of its type.":"No documents attached. Attach a manual, spec or contract and the agent will use it alongside the record's data when asked about this record."}):jsx(re,{projectId:s,sources:C,renderAction:N=>r$1?jsx(fe,{disabled:y!==null,label:`Detach ${N.title}`,onClick:()=>{K(N);}}):null}),A.length>0?jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1","data-knowledge-inherited":true,children:[jsxs("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:["Applies to every ",w]}),jsx(re,{projectId:s,sources:A})]}):null]}),jsx(a$1,{children:jsxs(p,{className:`fk:z-10 fk:flex fk:shrink-0 fk:flex-col fk:border-t fk:bg-background ${c$1?"fk:h-1/2":""}`,"data-knowledge-record-panel":true,open:c$1,onOpenChange:p$1,children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pl-4 fk:pr-10 fk:py-2",children:[jsx(q,{asChild:true,children:jsxs("button",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2 fk:rounded-md fk:py-1 fk:text-left fk:text-sm fk:font-semibold fk:tracking-tight fk:hover:text-foreground/80 fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring",type:"button",children:[jsx(ChevronRightIcon,{className:`fk:size-4 fk:shrink-0 fk:text-muted-foreground fk:transition-transform ${c$1?"fk:rotate-90":""}`}),jsx(BookOpenTextIcon,{className:"fk:size-4 fk:shrink-0 fk:text-muted-foreground"}),"Knowledge",i?jsx(b$2,{className:"fk:corner-squircle",variant:"outline",children:C.length+A.length}):null]})}),c$1?jsx(na,{disabled:!r$1,children:jsxs(b$1,{disabled:!r$1,size:"sm",variant:"outline",onClick:()=>m(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})}):null]}),jsx(r,{className:"fk:min-h-0 fk:flex-1 fk:overflow-y-auto fk:px-10 fk:pb-6",children:B}),jsx(Xe,{api:a$2,attachedIds:R,open:h,projectId:s,target:b$4,targetLabel:o||`this ${n}`,onAttached:N=>{L({sources:C.some($=>$.id===N.id)?C:[...C,N],inherited:A.filter($=>$.id!==N.id)},{revalidate:false}),g();},onOpenChange:m})]})})}function Ze(n,l,o){let{scope:a}=c$4(),s=n.links.map(r=>r.recordId),{data:u}=w$1({entityNamePlural:n.entityPlural,schema:l,scope:a,selection:"display",includeCount:false,variables:{where:{_id:{in:s}},limit:s.length}});return useMemo(()=>{let r={};for(let c of u??[]){let p=c[o.name];typeof p=="string"&&p.trim()&&(r[c._id]=p);}return r},[u,o])}function Ye(n){let{currentProject:l}=f(),o=useMemo(()=>l?.schema??[],[l]),a=m$2(o,n.group.entityPlural),s=a$2(a);return !a||!s?jsx(Je,{...n,entityLabel:a?v(a):n.group.entityPlural,labels:{}}):jsx(et,{...n,displayAttribute:s,schema:o,entityLabel:v(a)})}function et({displayAttribute:n,entityLabel:l,schema:o,...a}){let s=Ze(a.group,o,n);return jsx(Je,{...a,entityLabel:l,labels:s})}function Je({canMutate:n,detachingKey:l,entityLabel:o,group:a,labels:s,onDetach:u}){let r=c$3();return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1",children:[jsx("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:o}),jsx("ul",{className:"fk:flex fk:flex-col fk:-mx-2",children:a.links.map(c=>{let p=q$2(c,s[c.recordId]),h=`${c.entity}:${c.recordId}`;return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1 fk:corner-squircle",children:[jsx("button",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-left fk:text-sm fk:hover:underline fk:underline-offset-2",title:c.recordId,type:"button",onClick:()=>r({type:"EditEntity",payload:{entityId:c.recordId,entityNamePlural:a.entityPlural}}),children:p}),n?jsx(fe,{disabled:l!==null,label:`Detach from ${p}`,onClick:()=>u(c)}):null]},h)})})]})}function vt({api:n,projectId:l,source:o}){let a=b$3(),[s,u]=useState(null),{data:r,error:c$1,isLoading:p,mutate:h}=H(c(l).links(o.id),b),m=useMemo(()=>r?.links??[],[r]),y=useMemo(()=>r?.entities??[],[r]),f=useMemo(()=>r$1(m),[m]);async function b$1(i){u(`${i.entity}:${i.recordId}`);try{await n.unlinkSource(o.id,{entity:i.entity,recordId:i.recordId}),qa.success("Detached."),await h({links:m.filter(d=>d.entity!==i.entity||d.recordId!==i.recordId),entities:y},{revalidate:!1}),g();}catch(d){qa.error(h$1(d,"The document could not be detached."));}finally{u(null);}}async function v$1(i){u(`${i.entity}:*`);try{await n.unlinkSource(o.id,{entity:i.entity}),qa.success("Detached."),await h({links:m,entities:y.filter(d=>d.entity!==i.entity)},{revalidate:!1}),g();}catch(d){qa.error(h$1(d,"The document could not be detached."));}finally{u(null);}}async function w(i){u(`${i.name}:+`);try{let d=await n.linkSource(o.id,{entity:i.name});qa.success(d.linked?`Applies to every ${v(i)} now.`:`Already applied to every ${v(i)}.`),await h({links:m,entities:y.some(g=>g.entity===i.name)?y:[...y,{entity:i.name,entityPlural:i.plural}]},{revalidate:!1}),g();}catch(d){qa.error(h$1(d,"The document could not be attached."));}finally{u(null);}}let x;return c$1?x=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The linked records could not be loaded."}):p&&!r?x=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-6 fk:w-1/2"}),jsx(t$1,{className:"fk:h-6 fk:w-1/3"})]}):f.length===0?x=jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:'Not attached to any record. Open a record in the Desk and use "Attach document" so the agent searches this document before the rest of Knowledge when asked about that record.'}):x=jsx("div",{className:"fk:flex fk:flex-col fk:gap-4",children:f.map(i=>jsx(Ye,{canMutate:a,detachingKey:s,group:i,onDetach:d=>{b$1(d);}},i.entityPlural))}),jsxs(Fragment,{children:[jsx(tt,{busy:s!==null,canMutate:a,entities:y,isLoading:p&&!r,onAttach:i=>{w(i);},onDetach:i=>{v$1(i);}}),jsxs("div",{className:"fk:mt-2 fk:flex fk:items-center fk:gap-2",children:[jsx(PaperclipIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Linked records"}),m.length>0?jsx(b$2,{className:"fk:corner-squircle",variant:"outline",children:m.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"When a question is about one of these records, the agent searches this document before the rest."}),x]})}function tt({busy:n,canMutate:l,entities:o$1,isLoading:a,onAttach:s,onDetach:u$2}){let{currentProject:r}=f(),c=useMemo(()=>r?.schema??[],[r]),[p,h]=useState(false),m$1=useMemo(()=>w(c,o$1),[o$1,c]),y=f=>{let b=u(c,f.entity);return b?v(b):f.entityPlural};return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3","data-knowledge-applies-to":true,children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(LayersIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Applies to"}),o$1.length>0?jsx(b$2,{className:"fk:corner-squircle",variant:"outline",children:o$1.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Attach this document to a whole entity type and the agent searches it before the rest of Knowledge for every record of that type, and for questions about the type in general."}),a?jsx(t$1,{className:"fk:h-7 fk:w-1/3"}):jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[o$1.map(f=>{let b=y(f);return jsxs(b$2,{className:"fk:gap-1 fk:py-1 fk:pl-2.5 fk:pr-1 fk:corner-squircle",variant:"secondary",children:[jsx("span",{className:"fk:capitalize",children:b}),l?jsxs(b$4,{children:[jsx(c$2,{asChild:true,children:jsx("button",{"aria-label":`No longer apply to every ${b}`,className:"fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:hover:text-foreground fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring fk:disabled:opacity-50",disabled:n,type:"button",onClick:()=>u$2(f),children:jsx(XIcon,{className:"fk:size-3"})})}),jsxs(e$1,{children:["No longer apply to every ",b]})]}):null]},f.entity)}),jsxs(t$2,{open:p,onOpenChange:h,children:[jsx(na,{disabled:!l,children:jsx(u$1,{asChild:true,children:jsxs(b$1,{className:"fk:h-7",disabled:!l||m$1.length===0,size:"sm",variant:"outline",children:[jsx(PlusIcon,{}),"Add entity type"]})})}),jsx(v$1,{align:"start",className:"fk:w-64 fk:p-0",children:jsxs(m,{children:[jsx(o,{placeholder:"Search entity types"}),jsxs(p$1,{children:[jsx(q$1,{children:"No entity type matches."}),jsx(r$2,{children:m$1.map(f=>jsx(t$3,{keywords:[v(f),f.name,f.plural],value:f.name,onSelect:()=>{h(false),s(f);},children:jsx("span",{className:"fk:capitalize",children:v(f)})},f.name))})]})]})})]})]})]})}export{yt as a,bt as b,vt as c};//# sourceMappingURL=chunk-ZKA2HKNI.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-ZKA2HKNI.js.map
|