@flexkit/studio 0.2.38 → 0.2.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +76 -7
  2. package/dist/{chat-page-DW3FP4UZ.js → chat-page-I2IFVZA3.js} +3 -3
  3. package/dist/{chat-page-DW3FP4UZ.js.map → chat-page-I2IFVZA3.js.map} +1 -1
  4. package/dist/{chunk-DSZJXMN5.js → chunk-2IJWBRN2.js} +2 -2
  5. package/dist/{chunk-DSZJXMN5.js.map → chunk-2IJWBRN2.js.map} +1 -1
  6. package/dist/{chunk-IJECATW3.js → chunk-4JG3OWQW.js} +2 -2
  7. package/dist/{chunk-IJECATW3.js.map → chunk-4JG3OWQW.js.map} +1 -1
  8. package/dist/{chunk-JUWAKQPE.js → chunk-53GVTCXC.js} +3 -3
  9. package/dist/{chunk-JUWAKQPE.js.map → chunk-53GVTCXC.js.map} +1 -1
  10. package/dist/{chunk-WYVXSLB7.js → chunk-CQS6AIOX.js} +2 -2
  11. package/dist/{chunk-WYVXSLB7.js.map → chunk-CQS6AIOX.js.map} +1 -1
  12. package/dist/{chunk-AQBULUC2.js → chunk-DAXVPJJS.js} +4 -4
  13. package/dist/{chunk-AQBULUC2.js.map → chunk-DAXVPJJS.js.map} +1 -1
  14. package/dist/{chunk-LMJEP4VR.js → chunk-DFOPVG7I.js} +2 -2
  15. package/dist/{chunk-LMJEP4VR.js.map → chunk-DFOPVG7I.js.map} +1 -1
  16. package/dist/{chunk-IUWDNPMY.js → chunk-E3KO5NGM.js} +2 -2
  17. package/dist/{chunk-IUWDNPMY.js.map → chunk-E3KO5NGM.js.map} +1 -1
  18. package/dist/chunk-GPMBBJHK.js +7 -0
  19. package/dist/chunk-GPMBBJHK.js.map +1 -0
  20. package/dist/{chunk-3GXM5SSM.js → chunk-GPTSQ2WH.js} +3 -3
  21. package/dist/{chunk-3GXM5SSM.js.map → chunk-GPTSQ2WH.js.map} +1 -1
  22. package/dist/{chunk-GORBKX24.js → chunk-HOAVEDVI.js} +3 -3
  23. package/dist/{chunk-GORBKX24.js.map → chunk-HOAVEDVI.js.map} +1 -1
  24. package/dist/{chunk-KV4OGH5U.js → chunk-HUG2NGZI.js} +2 -2
  25. package/dist/{chunk-KV4OGH5U.js.map → chunk-HUG2NGZI.js.map} +1 -1
  26. package/dist/{chunk-377TM7UG.js → chunk-L62VVHKS.js} +2 -2
  27. package/dist/{chunk-377TM7UG.js.map → chunk-L62VVHKS.js.map} +1 -1
  28. package/dist/{chunk-6J3ZIVDQ.js → chunk-LO37DY2Z.js} +2 -2
  29. package/dist/{chunk-6J3ZIVDQ.js.map → chunk-LO37DY2Z.js.map} +1 -1
  30. package/dist/{chunk-32B35YDF.js → chunk-LWI3HNJL.js} +3 -3
  31. package/dist/{chunk-32B35YDF.js.map → chunk-LWI3HNJL.js.map} +1 -1
  32. package/dist/{chunk-UOTVVZPA.js → chunk-NPMBADZL.js} +3 -3
  33. package/dist/{chunk-UOTVVZPA.js.map → chunk-NPMBADZL.js.map} +1 -1
  34. package/dist/chunk-NPO7ISWV.js +2 -0
  35. package/dist/chunk-NPO7ISWV.js.map +1 -0
  36. package/dist/{chunk-4OGLWOO3.js → chunk-X5QKLF63.js} +3 -3
  37. package/dist/chunk-X5QKLF63.js.map +1 -0
  38. package/dist/{chunk-INZZOKRC.js → chunk-Y7VBTUNI.js} +3 -3
  39. package/dist/{chunk-INZZOKRC.js.map → chunk-Y7VBTUNI.js.map} +1 -1
  40. package/dist/{entry-G2R3W5NU.js → entry-NCKQ45MI.js} +2 -2
  41. package/dist/{entry-G2R3W5NU.js.map → entry-NCKQ45MI.js.map} +1 -1
  42. package/dist/index.d.ts +12 -1
  43. package/dist/index.js +2 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/list-UHHDZ3DM.js +2 -0
  46. package/dist/list-UHHDZ3DM.js.map +1 -0
  47. package/dist/{list-LVXMUJHP.js → list-VWN4IJYC.js} +3 -3
  48. package/dist/{list-LVXMUJHP.js.map → list-VWN4IJYC.js.map} +1 -1
  49. package/dist/{pages-HJHR7DFO.js → pages-LZEKCA4W.js} +3 -3
  50. package/dist/{pages-HJHR7DFO.js.map → pages-LZEKCA4W.js.map} +1 -1
  51. package/dist/{plugin-pages-ZO3TLUYW.js → plugin-pages-LLJPZJWL.js} +2 -2
  52. package/dist/{plugin-pages-ZO3TLUYW.js.map → plugin-pages-LLJPZJWL.js.map} +1 -1
  53. package/dist/{project-selector-OXDEHTJ5.js → project-selector-K3T6H77F.js} +2 -2
  54. package/dist/{project-selector-OXDEHTJ5.js.map → project-selector-K3T6H77F.js.map} +1 -1
  55. package/dist/record-links-CILZYRSE.js +2 -0
  56. package/dist/{record-links-SZQUATM6.js.map → record-links-CILZYRSE.js.map} +1 -1
  57. package/dist/{root-4ATHF5ZZ.js → root-ADEORVTL.js} +2 -2
  58. package/dist/{root-4ATHF5ZZ.js.map → root-ADEORVTL.js.map} +1 -1
  59. package/dist/root-CE6LNBBW.js +23 -0
  60. package/dist/root-CE6LNBBW.js.map +1 -0
  61. package/dist/{root-P537YXFS.js → root-LSBCX6AE.js} +2 -2
  62. package/dist/{root-P537YXFS.js.map → root-LSBCX6AE.js.map} +1 -1
  63. package/dist/{root-MMGPZ4ZF.js → root-PY5SBJ4F.js} +3 -3
  64. package/dist/{root-MMGPZ4ZF.js.map → root-PY5SBJ4F.js.map} +1 -1
  65. package/dist/{root-E4GIVJYA.js → root-XTF6EH63.js} +3 -3
  66. package/dist/{root-E4GIVJYA.js.map → root-XTF6EH63.js.map} +1 -1
  67. package/dist/{root-BRIEXCDH.js → root-Y3D2FTDR.js} +2 -2
  68. package/dist/{root-BRIEXCDH.js.map → root-Y3D2FTDR.js.map} +1 -1
  69. package/dist/{search-57W7MXQ3.js → search-MGY3OWZQ.js} +2 -2
  70. package/dist/{search-57W7MXQ3.js.map → search-MGY3OWZQ.js.map} +1 -1
  71. package/dist/{skills-pages-LUOBTEAP.js → skills-pages-7QYBKBSB.js} +2 -2
  72. package/dist/{skills-pages-LUOBTEAP.js.map → skills-pages-7QYBKBSB.js.map} +1 -1
  73. package/dist/{source-CJPY5PTU.js → source-M746FR3B.js} +2 -2
  74. package/dist/{source-CJPY5PTU.js.map → source-M746FR3B.js.map} +1 -1
  75. package/package.json +4 -4
  76. package/dist/chunk-4OGLWOO3.js.map +0 -1
  77. package/dist/chunk-CCVE7GGO.js +0 -2
  78. package/dist/chunk-CCVE7GGO.js.map +0 -1
  79. package/dist/chunk-GSKQHFQM.js +0 -7
  80. package/dist/chunk-GSKQHFQM.js.map +0 -1
  81. package/dist/list-IRTUEW55.js +0 -2
  82. package/dist/list-IRTUEW55.js.map +0 -1
  83. package/dist/record-links-SZQUATM6.js +0 -2
  84. package/dist/root-BIUU3CXY.js +0 -23
  85. package/dist/root-BIUU3CXY.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-CJPY5PTU.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-M746FR3B.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flexkit/studio",
3
- "version": "0.2.38",
4
- "description": "Flexkit Studio - Build custom internal tools like PIMs, CRMs, and ERPs with a flexible React UI and a graph-backed API",
3
+ "version": "0.2.40",
4
+ "description": "Flexkit Studio - the React workspace for Flexkit, the AI operating system for e-commerce: connected business data, context, automations and agents",
5
5
  "keywords": [
6
6
  "flexkit",
7
7
  "studio",
@@ -170,8 +170,8 @@
170
170
  "use-stick-to-bottom": "1.1.6",
171
171
  "uuid": "^9.0.1",
172
172
  "zod": "4.4.3",
173
- "@flexkit/schema": "0.2.15",
174
- "@flexkit/agent-protocol": "^0.3.14"
173
+ "@flexkit/agent-protocol": "^0.3.14",
174
+ "@flexkit/schema": "0.2.15"
175
175
  },
176
176
  "peerDependencies": {
177
177
  "react": "^19.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graphql-client/error-utils.ts","../src/graphql-client/graphql-context.tsx","../src/entities/actions-context.tsx"],"names":["hasCause","error","getServerError","ServerError","possibleServerError","getErrorMessage","message","parseErrorBody","bodyText","getGraphQLSchemaMismatchMessage","messages","getGraphQLValidationMessages","isMissingCountStoreFieldMessage","isMissingGraphQLFieldError","fieldName","CombinedGraphQLErrors","isSchemaValidationError","directMessage","isSchemaValidationMessage","serverError","responseBody","getServerErrorResult","getErrorCauseResponse","item","result","cause","causeMessage","extensions","ApolloProviderCompat","ApolloProvider","GraphQLErrorContext","createContext","useGraphQLError","ctx","useContext","USER_QUERY_CONTEXT","createErrorLink","setSchemaErrorMessage","ErrorLink","operation","schemaMismatchMessage","locations","path","CombinedProtocolErrors","responseError","errors","responseMessage","firstError","firstErrorMessage","additiveLink","currentProjectId","from","HttpLink","client","ApolloClient","InMemoryCache","responseObject","defaultDataIdFromObject","GraphQLProvider","children","useConfig","schemaErrorMessage","useState","useMemo","apolloClient","jsx","ActionsContext","EntityDispatchContext","actionsReducer","actions","action","actionType","uniqBy","props","ActionsProvider","entityActions","dispatchEntityActions","useReducer","useActions","useDispatch"],"mappings":"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","file":"chunk-4OGLWOO3.js","sourcesContent":["import type { ErrorLike } from '@apollo/client';\nimport { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';\n\ntype ErrorWithCause = ErrorLike & { cause?: unknown };\ntype ErrorWithMessage = {\n message?: unknown;\n};\ntype ServerErrorWithResult = ServerError & {\n result?: unknown;\n};\ntype GraphQLErrorResponse = {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n};\ntype GraphQLErrorItem = {\n extensions?: {\n code?: unknown;\n };\n message?: unknown;\n};\n\nfunction hasCause(error: ErrorLike): error is ErrorWithCause {\n if (!error) {\n return false;\n }\n\n return 'cause' in (error as ErrorWithCause);\n}\n\nexport function getServerError(error?: ErrorLike): ServerError | null {\n if (!error) {\n return null;\n }\n\n if (ServerError.is(error)) {\n return error;\n }\n\n if (hasCause(error)) {\n const possibleServerError = error.cause;\n\n if (ServerError.is(possibleServerError)) {\n return possibleServerError;\n }\n }\n\n return null;\n}\n\nfunction getErrorMessage(error: unknown): string | null {\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const { message } = error as ErrorWithMessage;\n\n return typeof message === 'string' ? message : null;\n}\n\nexport function parseErrorBody<T>(bodyText: string | undefined): T | null {\n if (!bodyText) {\n return null;\n }\n\n try {\n return JSON.parse(bodyText) as T;\n } catch {\n return null;\n }\n}\n\nexport function getGraphQLSchemaMismatchMessage(error?: ErrorLike): string | null {\n if (!error) {\n return null;\n }\n\n const messages = getGraphQLValidationMessages(error).filter((message) => !isMissingCountStoreFieldMessage(message));\n\n if (messages.length === 0) {\n return null;\n }\n\n return [\n 'The deployed schema is out of sync with your local Flexkit schema.',\n 'Run `flexkit deploy` using the CLI to apply your latest schema changes.',\n ...messages.map((message) => `- ${message}`),\n ].join('\\n');\n}\n\nexport function isMissingGraphQLFieldError(error: ErrorLike | undefined, fieldName: string): boolean {\n if (!error) {\n return false;\n }\n\n return getGraphQLValidationMessages(error).some((message) => {\n return message.includes(`Cannot query field \"${fieldName}\"`);\n });\n}\n\nfunction getGraphQLValidationMessages(error: ErrorLike): string[] {\n if (CombinedGraphQLErrors.is(error)) {\n return error.errors.filter(isSchemaValidationError).map(({ message }) => message);\n }\n\n const directMessage = getErrorMessage(error);\n\n if (directMessage && isSchemaValidationMessage(directMessage)) {\n return [directMessage];\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode !== 400) {\n return [];\n }\n\n const responseBody =\n parseErrorBody<GraphQLErrorResponse>(serverError.bodyText) ??\n getServerErrorResult(serverError) ??\n getErrorCauseResponse(error);\n\n if (!responseBody) {\n return [];\n }\n\n if (Array.isArray(responseBody.errors)) {\n return responseBody.errors.filter(isSchemaValidationError).map((item) => item.message);\n }\n\n if (typeof responseBody.message === 'string' && isSchemaValidationMessage(responseBody.message)) {\n return [responseBody.message];\n }\n\n if (typeof responseBody.error === 'string' && isSchemaValidationMessage(responseBody.error)) {\n return [responseBody.error];\n }\n\n return [];\n}\n\nfunction getServerErrorResult(serverError: ServerError): GraphQLErrorResponse | null {\n const { result } = serverError as ServerErrorWithResult;\n\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n return result as GraphQLErrorResponse;\n}\n\nfunction getErrorCauseResponse(error: ErrorLike): GraphQLErrorResponse | null {\n if (!hasCause(error)) {\n return null;\n }\n\n const { cause } = error;\n const causeMessage = getErrorMessage(cause);\n\n if (causeMessage && isSchemaValidationMessage(causeMessage)) {\n return { message: causeMessage };\n }\n\n if (!cause || typeof cause !== 'object') {\n return null;\n }\n\n const { result } = cause as { result?: unknown };\n\n if (result && typeof result === 'object') {\n return result as GraphQLErrorResponse;\n }\n\n return null;\n}\n\nfunction isSchemaValidationError(error: unknown): error is GraphQLErrorItem & { message: string } {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { extensions, message } = error as GraphQLErrorItem;\n const code = extensions?.code;\n\n if (code === 'GRAPHQL_VALIDATION_FAILED' && typeof message === 'string') {\n return true;\n }\n\n return typeof message === 'string' && isSchemaValidationMessage(message);\n}\n\nfunction isSchemaValidationMessage(message: string): boolean {\n return (\n message.startsWith('Cannot query field ') ||\n message.startsWith('Unknown type ') ||\n message.startsWith('Cannot query field \"') ||\n message.includes('GRAPHQL_VALIDATION_FAILED')\n );\n}\n\nfunction isMissingCountStoreFieldMessage(message: string): boolean {\n return /Cannot query field \"[_A-Za-z][_0-9A-Za-z]*Total\" on type \"Query\"/.test(message);\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ApolloClient, InMemoryCache, defaultDataIdFromObject, from, HttpLink } from '@apollo/client';\nimport type { ApolloLink } from '@apollo/client';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { CombinedGraphQLErrors, CombinedProtocolErrors } from '@apollo/client/errors';\nimport { getGraphQLSchemaMismatchMessage, getServerError, parseErrorBody } from './error-utils';\nimport { useConfig } from '../core/config/config-context';\nimport React, { createContext, useContext, useMemo, useState } from 'react';\n\nconst ApolloProviderCompat = ApolloProvider as unknown as React.ComponentType<{\n children?: React.ReactNode;\n client: ApolloClient;\n}>;\n\ntype GraphQLErrorContextValue = {\n schemaErrorMessage: string | null;\n setSchemaErrorMessage: React.Dispatch<React.SetStateAction<string | null>>;\n};\n\nconst GraphQLErrorContext = createContext<GraphQLErrorContextValue | undefined>(undefined);\n\nfunction useGraphQLError(): GraphQLErrorContextValue {\n const ctx = useContext(GraphQLErrorContext);\n\n if (!ctx) {\n throw new Error('useGraphQLError must be used within GraphQLProvider');\n }\n\n return ctx;\n}\n\n/**\n * Context flag for operations the user writes themselves (the Graph app's\n * Query view): any error there, a mismatch or a 400, is a typo, not a\n * deployment that drifted from the local schema, so it must not raise the\n * schema banner. The caller shows the error itself.\n */\nexport const USER_QUERY_CONTEXT = { userQuery: true } as const;\n\nfunction createErrorLink(setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return new ErrorLink(({ error, operation }) => {\n if (operation.getContext().userQuery === true) {\n return;\n }\n\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(error);\n\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach(({ message, locations, path }) => {\n console.warn(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`);\n });\n } else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach(({ message, extensions }) => {\n console.warn(`[Protocol error]: Message: ${message}, Extensions: ${JSON.stringify(extensions)}`);\n });\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode === 400) {\n const responseBody = parseErrorBody<Record<string, unknown>>(serverError.bodyText);\n let message: string | null = null;\n\n if (responseBody && typeof responseBody === 'object') {\n const {\n error: responseError,\n errors,\n message: responseMessage,\n } = responseBody as {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n };\n\n if (typeof responseMessage === 'string') {\n message = responseMessage;\n } else if (Array.isArray(errors)) {\n const [firstError] = errors as { message?: unknown }[];\n\n if (firstError && typeof firstError.message === 'string') {\n const { message: firstErrorMessage } = firstError;\n message = firstErrorMessage;\n }\n } else if (typeof responseError === 'string') {\n message = responseError;\n } else {\n message = JSON.stringify(responseBody);\n }\n } else {\n message = serverError.bodyText;\n }\n\n setSchemaErrorMessage(\n message ?? 'There is an error in the deployed Flexkit schema. Fix flexkit.config.ts and run flexkit deploy.'\n );\n }\n\n if (serverError) {\n console.warn(`[Network error]: ${serverError.message}`);\n\n return;\n }\n\n if (error) {\n console.warn(`[Network error]: ${error.message}`);\n }\n });\n}\n\nfunction additiveLink(currentProjectId: string, setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return from([\n createErrorLink(setSchemaErrorMessage),\n new HttpLink({ uri: `/api/flexkit/${currentProjectId}/graphql` }),\n ]);\n}\n\nfunction client(\n currentProjectId: string | undefined,\n setSchemaErrorMessage: (msg: string | null) => void\n): ApolloClient {\n return new ApolloClient({\n link: additiveLink(currentProjectId ?? '', setSchemaErrorMessage),\n cache: new InMemoryCache({\n dataIdFromObject: (responseObject) => {\n return responseObject._id ? (responseObject._id as string) : defaultDataIdFromObject(responseObject);\n },\n }),\n });\n}\n\nexport function GraphQLProvider({ children }: { children: React.ReactNode }): JSX.Element {\n const { currentProjectId } = useConfig();\n const [schemaErrorMessage, setSchemaErrorMessage] = useState<string | null>(null);\n const ctx = useMemo(() => ({ schemaErrorMessage, setSchemaErrorMessage }), [schemaErrorMessage]);\n const apolloClient = useMemo(() => client(currentProjectId, setSchemaErrorMessage), [currentProjectId]);\n\n return (\n <GraphQLErrorContext.Provider value={ctx}>\n <ApolloProviderCompat client={apolloClient}>{children}</ApolloProviderCompat>\n </GraphQLErrorContext.Provider>\n );\n}\n\nexport { useGraphQLError };\n","'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport { props, uniqBy } from 'ramda';\nimport type {\n Action,\n ActionAddEntity,\n ActionAlertDialog,\n ActionDeleteEntity,\n ActionEditEntity,\n ActionEditRelationship,\n} from './types';\n\nconst ActionsContext = createContext<Action[] | []>([]);\nconst EntityDispatchContext = createContext<Dispatch<Action>>(() => undefined);\n\nfunction actionsReducer(actions: Action[], action: Action): Action[] {\n const actionType = action.type;\n\n if (!action._id) {\n action._id = Date.now().toString();\n }\n\n switch (actionType) {\n case 'DeleteEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionDeleteEntity[]), action]);\n }\n case 'AddEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAddEntity[]), action]);\n }\n case 'EditEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditEntity[]), action]);\n }\n case 'EditRelationship': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditRelationship[]), action]);\n }\n case 'AlertDialog': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAlertDialog[]), action]);\n }\n case 'Dismiss': {\n return actions.filter((item) => item._id !== action._id);\n }\n default: {\n throw Error(`Unknown action: ${actionType as string}`);\n }\n }\n}\n\nfunction ActionsProvider({ children }: { children: ReactNode }): JSX.Element {\n const [entityActions, dispatchEntityActions] = useReducer(actionsReducer, []);\n\n return (\n <ActionsContext.Provider value={entityActions}>\n <EntityDispatchContext.Provider value={dispatchEntityActions}>{children}</EntityDispatchContext.Provider>\n </ActionsContext.Provider>\n );\n}\n\nfunction useActions(): Action[] {\n return useContext(ActionsContext);\n}\n\nfunction useDispatch(): Dispatch<Action> {\n return useContext(EntityDispatchContext);\n}\n\nexport { ActionsProvider, useActions, useDispatch };\n"]}
@@ -1,2 +0,0 @@
1
- import'./index.css';import {e,d,a,c,b as b$1}from'./chunk-4OGLWOO3.js';import {f}from'./chunk-DSZJXMN5.js';import {r,s,i,k,j}from'./chunk-GORBKX24.js';import {b}from'./chunk-INZZOKRC.js';import {useState,useRef,useMemo,useEffect,useCallback}from'react';import {uniqBy,prop}from'ramda';import {gql,NetworkStatus}from'@apollo/client';import {useQuery}from'@apollo/client/react';var q=null,z=new Set,St=[],Y=new Set,H=new Set,W=new Set;function $t(t,e){if(t==="_asset"||t==="_assets")return `Get${r(b.plural)}`;let r$1=e.find(o=>o.plural===t),n=e.find(o=>o.name===t),i=r$1?.plural??n?.plural??t;return `Get${r(i)}`}function Qt(t){return Y.add(t),()=>{Y.delete(t);}}function Pt(t){return H.add(t),()=>{H.delete(t);}}function vt(t){return W.add(t),()=>{W.delete(t);}}function zt(t,e,r){let n=new Set(r.filter(Boolean));if(n.size>0)for(let i of H)i(e,n);return qt(t,e)}function Yt(t,e){let r=e.filter(n=>!!n._id);if(r.length!==0)for(let n of W)n(t,r);}function qt(t,e){return z.add(e),new Promise((r,n)=>{St.push({resolve:r,reject:n}),q&&clearTimeout(q),q=setTimeout(()=>{let i=new Set(z),o=St.splice(0);z.clear(),q=null,Promise.all([...Y].map(s=>Promise.resolve(s(i)))).then(()=>{for(let{resolve:s}of o)s();}).catch(s=>{console.error("Error refreshing entity lists:",s);for(let{reject:h}of o)h(s);});},50);})}function oe({entityNamePlural:t,schema:e$1,scope:r$1,variables:n,isForm:i$1,selection:o="full",includeCount:s$1=true,fetchPolicy:h}){let[b,l]=useState({count:0,results:[]}),[_,O]=useState(false),[U,Z]=useState(false),[N,xt]=useState(null),k=useRef(false),P=useRef(false),m=useRef(0),v=useRef(null),M=useRef(null),c$1=f(),A=`${t}Total`,Tt=s(e$1,t),V=n?.where===void 0&&(Tt?.spaces?.length??0)===0&&(N?.field!==A||N.schema!==e$1)?"total":"aggregate",jt=useMemo(()=>gql(i(t,r$1,e$1,{selection:o,countMode:V,includeCount:s$1,defaultScope:c$1}).query),[t,r$1,e$1,o,V,s$1,c$1]),tt=useMemo(()=>gql(i(t,r$1,e$1,{selection:o,includeCount:false,defaultScope:c$1}).query),[t,r$1,e$1,o,c$1]),{schemaErrorMessage:B,setSchemaErrorMessage:G}=e(),{loading:I,data:E,fetchMore:et,refetch:rt,error:nt,networkStatus:w}=useQuery(jt,{variables:n,notifyOnNetworkStatusChange:true,fetchPolicy:h}),st=useRef(et),K=useRef(rt),ot=useRef(tt),it=useRef(w),ut=useRef(n);st.current=et,K.current=rt,ot.current=tt,ut.current=n;let J=s$1&&d(nt,A),ct=V==="total"&&J,R=J?void 0:nt,x=J&&!E?.[t],at=a(R),S=c(R),{isProjectDisabled:Dt,isProjectReadOnly:_t}=(()=>{if(at?.statusCode===403){let u=b$1(at.bodyText);if(u&&typeof u.code=="string"){if(u.code==="PROJECT_PAUSED")return {isProjectDisabled:true,isProjectReadOnly:false};if(u.code==="READ_ONLY_MODE")return {isProjectDisabled:false,isProjectReadOnly:true}}return {isProjectDisabled:true,isProjectReadOnly:false}}return {isProjectDisabled:false,isProjectReadOnly:false}})();useEffect(()=>{ct&&xt({field:A,schema:e$1});},[e$1,ct,A]);let At=useCallback(u=>{if(k.current||P.current)return;k.current=true,O(true);let{limit:d}=u.variables,y=m.current;st.current({...u,query:ot.current,variables:{...ut.current,...u.variables,offset:y,limit:d}}).then(({data:Q})=>{let f=D({data:Q,entityNamePlural:t,isForm:i$1,schema:e$1,scope:r$1,defaultScope:c$1}),p=f.results.length;m.current=y+(p===0?0:Math.min(p,d)),l(a=>{let L=uniqBy(prop("_id"),[...a.results,...f.results]);return L.length===a.results.length?{count:a.results.length,results:a.results}:{count:f.count||a.count,results:L}});}).catch(Q=>{console.error("Error fetching more data:",Q);}).finally(()=>{k.current=false,O(false);});},[c$1,t,i$1,e$1,r$1]),It=useCallback(u=>{if(P.current)return Promise.resolve();let d=u?.preserve===true;return P.current=true,k.current=false,O(false),d||(v.current=null,M.current=null,m.current=0,Z(true),l({count:0,results:[]})),K.current().then(({data:y})=>{let Q=JSON.stringify({entityNamePlural:t,scope:r$1,selection:o,includeCount:s$1,variables:n}),f=D({data:y,entityNamePlural:t,isForm:i$1,schema:e$1,scope:r$1,defaultScope:c$1});v.current=Q,M.current=null,m.current=F(n)+f.results.length,l(f);}).catch(y=>{console.error("Error reloading data:",y);}).finally(()=>{P.current=false,Z(false);})},[c$1,t,i$1,e$1,r$1,o,s$1,n]);return useEffect(()=>{if(S){G(S);return}E&&B&&!R&&G(null);},[E,R,B,S,G]),useEffect(()=>{if(R||S||x)return;let u=JSON.stringify({entityNamePlural:t,scope:r$1,selection:o,includeCount:s$1,variables:n});if(v.current===u)return;if(I&&M.current!==u){M.current=u,m.current=0,l({count:0,results:[]});return}if(I)return;let d=D({data:E,entityNamePlural:t,isForm:i$1,schema:e$1,scope:r$1,defaultScope:c$1});v.current=u,M.current=null,m.current=F(n)+d.results.length,l(d);},[c$1,E,R,t,i$1,I,x,e$1,S,r$1,o,s$1,n]),useEffect(()=>{let u=it.current;if(it.current=w,R||S||P.current||x||u!==NetworkStatus.refetch||w!==NetworkStatus.ready||!E)return;let d=JSON.stringify({entityNamePlural:t,scope:r$1,selection:o,includeCount:s$1,variables:n}),y=D({data:E,entityNamePlural:t,isForm:i$1,schema:e$1,scope:r$1,defaultScope:c$1});v.current=d,M.current=null,m.current=F(n)+y.results.length,l(y);},[c$1,E,R,t,i$1,x,w,e$1,S,r$1,o,s$1,n]),useEffect(()=>{if(i$1)return;let u=`Get${r(t)}`,d=Qt(f=>{if(!(!f.has(u)||k.current||P.current))return K.current().then(({data:p})=>{let a=JSON.stringify({entityNamePlural:t,scope:r$1,selection:o,includeCount:s$1,variables:n}),L=D({data:p,entityNamePlural:t,isForm:i$1,schema:e$1,scope:r$1,defaultScope:c$1});v.current=a,M.current=null,m.current=F(n)+L.results.length,l(L);}).catch(p=>{console.error("Error soft-refreshing entity list:",p);})}),y=Pt((f,p)=>{f===u&&l(a=>{let L=a.results.filter(ft=>{let dt=typeof ft._id=="string"?ft._id:void 0;return !dt||!p.has(dt)}),lt=a.results.length-L.length;return lt===0?a:{count:Math.max(0,a.count-lt),results:L}});}),Q=vt((f,p)=>{f===u&&l(a=>Vt(a,p,n?.sort));});return ()=>{d(),y(),Q();}},[c$1,t,i$1,e$1,r$1,o,s$1,n]),{isLoading:I&&w!==NetworkStatus.refetch||U||x,isLoadingMore:_,fetchMore:At,reload:It,count:b.count,data:b.results,isProjectDisabled:Dt,isProjectReadOnly:_t,schemaErrorMessage:B}}function F(t){let e=t?.offset;return typeof e=="number"&&Number.isFinite(e)?e:0}function D(t){let e=t.entityNamePlural;return t.data?.[e]?t.isForm?k(t.entityNamePlural,t.scope,t.data,t.schema,t.defaultScope):j(t.entityNamePlural,t.scope,t.data,t.schema):{count:0,results:[]}}function Vt(t,e,r){let n=new Map(e.map(s=>[s._id,s])),i=false,o=t.results.map(s=>{let h=typeof s._id=="string"?s._id:void 0;if(!h)return s;let b=n.get(h);return b?(i=true,{...s,...b.attributes}):s});return i?{count:t.count,results:Bt(o,r)}:t}function Bt(t,e){if(!Array.isArray(e)||e.length===0)return t;let[r]=e;if(!r||typeof r!="object")return t;let[n]=Object.entries(r),[i,o]=n??[];if(!i||o!=="ASC"&&o!=="DESC")return t;let s=o==="DESC"?-1:1;return [...t].sort((h,b)=>{let l=h[i],_=b[i],O=typeof l=="string"?l:"",U=typeof _=="string"?_:"";return O.localeCompare(U)*s})}export{$t as a,zt as b,Yt as c,qt as d,oe as e};//# sourceMappingURL=chunk-CCVE7GGO.js.map
2
- //# sourceMappingURL=chunk-CCVE7GGO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graphql-client/refetch-entity-lists.ts","../src/graphql-client/use-entity-query.ts"],"names":["refetchTimer","pendingQueryNames","pendingResolvers","listeners","removalListeners","patchListeners","getEntityListQueryName","entityNameOrPlural","schema","getOperationEntityName","assetSchema","byPlural","entity","byName","plural","subscribeEntityListRefetch","listener","subscribeEntityListRemoval","subscribeEntityListPatch","scheduleEntityListRemoval","apolloClient","queryName","entityIds","ids","scheduleEntityListRefetch","scheduleEntityListPatch","patches","nextPatches","patch","_apolloClient","resolve","reject","names","resolvers","finish","error","fail","useEntityQuery","entityNamePlural","scope","variables","isForm","selection","includeCount","fetchPolicy","result","setResult","useState","isLoadingMore","setIsLoadingMore","isReloading","setIsReloading","unsupportedTotalCount","setUnsupportedTotalCount","isLoadingMoreRef","useRef","isReloadingRef","nextOffsetRef","syncedQueryKeyRef","pendingQueryKeyRef","defaultScope","useDefaultScope","totalCountField","entitySchema","getEntitySchema","countMode","queryDocument","useMemo","gql","getEntityQuery","fetchMoreDocument","schemaErrorMessage","setSchemaErrorMessage","useGraphQLError","isLoading","data","fetchNextPage","refetch","networkStatus","useQuery","fetchNextPageRef","refetchRef","fetchMoreDocumentRef","previousNetworkStatusRef","variablesRef","isMissingTotalCountField","isMissingGraphQLFieldError","shouldFallbackToAggregate","effectiveError","isTotalCountFallbackLoading","serverError","getServerError","schemaMismatchMessage","getGraphQLSchemaMismatchMessage","isProjectDisabled","isProjectReadOnly","responseBody","parseErrorBody","useEffect","fetchMore","useCallback","args","limit","offset","res","mappedFetchMoreResults","mapResults","pageLength","prevRows","merged","uniqBy","prop","fetchError","reload","options","preserve","queryKey","mapped","getVariablesOffset","previousStatus","NetworkStatus","listQueryName","unsubscribeRefetch","queryNames","unsubscribeRemoval","prev","nextResults","row","rowId","removedCount","unsubscribePatch","applyEntityListPatches","mapQueryResultForFormFields","mapQueryResult","sort","patchById","didPatch","sortEntityListResults","results","primarySort","primarySortEntry","sortField","sortDirection","direction","left","right","leftValue","rightValue","leftText","rightText"],"mappings":"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","file":"chunk-CCVE7GGO.js","sourcesContent":["import type { ApolloClient } from '@apollo/client';\nimport type { Schema } from '../core/types';\nimport { assetSchema } from '../entities/assets-schema';\nimport { getOperationEntityName } from './queries';\n\ntype EntityListRefreshListener = (queryNames: ReadonlySet<string>) => void | Promise<void>;\ntype EntityListRemovalListener = (queryName: string, entityIds: ReadonlySet<string>) => void;\ntype EntityListPatchListener = (queryName: string, patches: EntityListRowPatch[]) => void;\n\nexport type EntityListRowPatch = {\n _id: string;\n attributes: { [key: string]: string };\n};\n\nlet refetchTimer: ReturnType<typeof setTimeout> | null = null;\nconst pendingQueryNames = new Set<string>();\nconst pendingResolvers: Array<{ resolve: () => void; reject: (error: unknown) => void }> = [];\nconst listeners = new Set<EntityListRefreshListener>();\nconst removalListeners = new Set<EntityListRemovalListener>();\nconst patchListeners = new Set<EntityListPatchListener>();\n\nexport function getEntityListQueryName(entityNameOrPlural: string, schema: Schema): string {\n if (entityNameOrPlural === '_asset' || entityNameOrPlural === '_assets') {\n return `Get${getOperationEntityName(assetSchema.plural)}`;\n }\n\n const byPlural = schema.find((entity) => entity.plural === entityNameOrPlural);\n const byName = schema.find((entity) => entity.name === entityNameOrPlural);\n const plural = byPlural?.plural ?? byName?.plural ?? entityNameOrPlural;\n\n return `Get${getOperationEntityName(plural)}`;\n}\n\n/**\n * Subscribe to soft list refreshes. Listeners should refetch their own query and\n * remap local paginated state (useEntityQuery ignores Apollo cache writes after sync).\n */\nexport function subscribeEntityListRefetch(listener: EntityListRefreshListener): () => void {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n}\n\n/**\n * Subscribe to optimistic row removals (e.g. after delete) before the soft-refetch lands.\n */\nexport function subscribeEntityListRemoval(listener: EntityListRemovalListener): () => void {\n removalListeners.add(listener);\n\n return () => {\n removalListeners.delete(listener);\n };\n}\n\n/**\n * Subscribe to in-place row patches (e.g. tag connect/disconnect) without a full list refetch.\n */\nexport function subscribeEntityListPatch(listener: EntityListPatchListener): () => void {\n patchListeners.add(listener);\n\n return () => {\n patchListeners.delete(listener);\n };\n}\n\n/**\n * Immediately drop rows from mounted lists, then soft-refetch to sync counts/pages.\n */\nexport function scheduleEntityListRemoval(\n apolloClient: ApolloClient,\n queryName: string,\n entityIds: string[]\n): Promise<void> {\n const ids = new Set(entityIds.filter(Boolean));\n\n if (ids.size > 0) {\n for (const listener of removalListeners) {\n listener(queryName, ids);\n }\n }\n\n return scheduleEntityListRefetch(apolloClient, queryName);\n}\n\n/**\n * Patch mounted list rows in place. Use when a mutation cannot change list cardinality\n * (e.g. tag connect/disconnect) so we avoid a full GetAssets soft-refetch.\n */\nexport function scheduleEntityListPatch(queryName: string, patches: EntityListRowPatch[]): void {\n const nextPatches = patches.filter((patch) => Boolean(patch._id));\n\n if (nextPatches.length === 0) {\n return;\n }\n\n for (const listener of patchListeners) {\n listener(queryName, nextPatches);\n }\n}\n\n/**\n * Ask mounted entity lists to soft-refresh. Debounced so batch deletes coalesce.\n */\nexport function scheduleEntityListRefetch(_apolloClient: ApolloClient, queryName: string): Promise<void> {\n pendingQueryNames.add(queryName);\n\n return new Promise<void>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n if (refetchTimer) {\n clearTimeout(refetchTimer);\n }\n\n refetchTimer = setTimeout(() => {\n const names = new Set(pendingQueryNames);\n const resolvers = pendingResolvers.splice(0);\n pendingQueryNames.clear();\n refetchTimer = null;\n\n void Promise.all([...listeners].map((listener) => Promise.resolve(listener(names))))\n .then(() => {\n for (const { resolve: finish } of resolvers) {\n finish();\n }\n })\n .catch((error: unknown) => {\n console.error('Error refreshing entity lists:', error);\n\n for (const { reject: fail } of resolvers) {\n fail(error);\n }\n });\n }, 50);\n });\n}\n","import { useDefaultScope } from '../core/default-scope';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { prop, uniqBy } from 'ramda';\nimport { gql, NetworkStatus } from '@apollo/client';\nimport type { OperationVariables } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n getGraphQLSchemaMismatchMessage,\n getServerError,\n isMissingGraphQLFieldError,\n parseErrorBody,\n} from './error-utils';\nimport {\n getEntityQuery,\n getEntitySchema,\n getOperationEntityName,\n mapQueryResult,\n mapQueryResultForFormFields,\n} from './queries';\nimport {\n subscribeEntityListPatch,\n subscribeEntityListRefetch,\n subscribeEntityListRemoval,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\nimport { useGraphQLError } from './graphql-context';\nimport type {\n EntityQueryAggregate,\n EntityQueryResults,\n FormEntityItem,\n MappedEntityQueryResults,\n MappedEntityItem,\n MappedFormEntityQueryResults,\n UseEntityQueryParams,\n ImageValue,\n} from './types';\n\ntype FetchMoreOptions = {\n // `offset` is accepted for call-site compatibility but overridden by nextOffsetRef.\n // `where`/`sort` are inherited from the active query unless overridden here.\n variables: OperationVariables & { offset: number; limit: number };\n};\ntype Results = (MappedEntityQueryResults | MappedFormEntityQueryResults) | { count: 0; results: [] };\n\nexport function useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables,\n isForm,\n selection = 'full',\n includeCount = true,\n fetchPolicy,\n}: UseEntityQueryParams): {\n count: number;\n data: MappedEntityItem[] | FormEntityItem[] | ImageValue[] | undefined;\n fetchMore: (args: FetchMoreOptions) => void;\n isLoading: boolean;\n isLoadingMore: boolean;\n isProjectDisabled: boolean;\n isProjectReadOnly: boolean;\n reload: (options?: { preserve?: boolean }) => Promise<void>;\n schemaErrorMessage: string | null;\n} {\n const [result, setResult] = useState<Results>({\n count: 0,\n results: [],\n });\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [isReloading, setIsReloading] = useState(false);\n const [unsupportedTotalCount, setUnsupportedTotalCount] = useState<{\n field: string;\n schema: UseEntityQueryParams['schema'];\n } | null>(null);\n const isLoadingMoreRef = useRef(false);\n const isReloadingRef = useRef(false);\n // Next offset for fetchMore — advanced by each requested page window, not by the\n // deduplicated row count. Using unique rows.length as offset collapses when pages\n // overlap (unstable sorts / tied timestamps) into irregular steps like 25→35→42.\n const nextOffsetRef = useRef(0);\n // Tracks the query identity we last synced into local result state.\n // fetchMore updates Apollo `data` without changing this identity; syncing those\n // updates would wipe accumulated pages and retrigger infinite load-more.\n // Must include entity/scope — variables alone collide across entity navigations.\n const syncedQueryKeyRef = useRef<string | null>(null);\n const pendingQueryKeyRef = useRef<string | null>(null);\n const defaultScope = useDefaultScope();\n const totalCountField = `${entityNamePlural}Total`;\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const canUseTotalCount =\n variables?.where === undefined &&\n (entitySchema?.spaces?.length ?? 0) === 0 &&\n (unsupportedTotalCount?.field !== totalCountField || unsupportedTotalCount.schema !== schema);\n const countMode = canUseTotalCount ? 'total' : 'aggregate';\n const queryDocument = useMemo(\n () =>\n gql(getEntityQuery(entityNamePlural, scope, schema, { selection, countMode, includeCount, defaultScope }).query),\n [entityNamePlural, scope, schema, selection, countMode, includeCount, defaultScope]\n );\n // fetchMore pages skip the top-level aggregate count (a filtered label scan\n // on the server); the total from the first page still stands.\n const fetchMoreDocument = useMemo(\n () => gql(getEntityQuery(entityNamePlural, scope, schema, { selection, includeCount: false, defaultScope }).query),\n [entityNamePlural, scope, schema, selection, defaultScope]\n );\n const { schemaErrorMessage, setSchemaErrorMessage } = useGraphQLError();\n const {\n loading: isLoading,\n data,\n fetchMore: fetchNextPage,\n refetch,\n error,\n networkStatus,\n } = useQuery<EntityQueryResults & EntityQueryAggregate>(queryDocument, {\n variables,\n notifyOnNetworkStatusChange: true,\n fetchPolicy,\n });\n const fetchNextPageRef = useRef(fetchNextPage);\n const refetchRef = useRef(refetch);\n const fetchMoreDocumentRef = useRef(fetchMoreDocument);\n const previousNetworkStatusRef = useRef(networkStatus);\n const variablesRef = useRef(variables);\n fetchNextPageRef.current = fetchNextPage;\n refetchRef.current = refetch;\n fetchMoreDocumentRef.current = fetchMoreDocument;\n variablesRef.current = variables;\n\n // Parse 403 error response to determine the specific error code\n const isMissingTotalCountField = includeCount && isMissingGraphQLFieldError(error, totalCountField);\n const shouldFallbackToAggregate = countMode === 'total' && isMissingTotalCountField;\n const effectiveError = isMissingTotalCountField ? undefined : error;\n const isTotalCountFallbackLoading = isMissingTotalCountField && !data?.[entityNamePlural];\n const serverError = getServerError(effectiveError);\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(effectiveError);\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 (!shouldFallbackToAggregate) {\n return;\n }\n\n setUnsupportedTotalCount({ field: totalCountField, schema });\n }, [schema, shouldFallbackToAggregate, totalCountField]);\n\n const fetchMore = useCallback(\n (args: FetchMoreOptions): void => {\n if (isLoadingMoreRef.current || isReloadingRef.current) {\n return;\n }\n\n isLoadingMoreRef.current = true;\n setIsLoadingMore(true);\n\n const { limit } = args.variables;\n const offset = nextOffsetRef.current;\n\n fetchNextPageRef\n .current({\n ...args,\n query: fetchMoreDocumentRef.current,\n variables: {\n // fetchMore uses a count-free document, so Apollo will not inherit\n // the original operation's where/sort unless we pass them again.\n ...variablesRef.current,\n ...args.variables,\n offset,\n limit,\n },\n })\n .then(({ data: res }) => {\n const mappedFetchMoreResults = mapResults({\n data: res,\n entityNamePlural,\n isForm,\n schema,\n scope,\n defaultScope,\n });\n // Advance by the fetched page window (capped at limit), not by how many unique\n // rows survived client-side merge. Cap protects against Apollo returning a\n // merged cache blob larger than the requested page.\n const pageLength = mappedFetchMoreResults.results.length;\n nextOffsetRef.current = offset + (pageLength === 0 ? 0 : Math.min(pageLength, limit));\n\n setResult((prevRows) => {\n const merged = uniqBy(prop('_id'), [\n ...prevRows.results,\n ...mappedFetchMoreResults.results,\n ]) as Results['results'];\n\n // Empty/duplicate pages must end pagination, otherwise load-more loops forever\n // when aggregate count is ahead of rows that the where-clause can actually return.\n if (merged.length === prevRows.results.length) {\n return {\n count: prevRows.results.length,\n results: prevRows.results,\n } as Results;\n }\n\n // Count-free pagination pages report 0; the first page's total stands.\n return {\n count: mappedFetchMoreResults.count || prevRows.count,\n results: merged,\n } as Results;\n });\n })\n .catch((fetchError: unknown) => {\n console.error('Error fetching more data:', fetchError);\n })\n .finally(() => {\n isLoadingMoreRef.current = false;\n setIsLoadingMore(false);\n });\n },\n [defaultScope, entityNamePlural, isForm, schema, scope]\n );\n\n const reload = useCallback(\n (options?: { preserve?: boolean }): Promise<void> => {\n if (isReloadingRef.current) {\n return Promise.resolve();\n }\n\n const preserve = options?.preserve === true;\n\n isReloadingRef.current = true;\n isLoadingMoreRef.current = false;\n setIsLoadingMore(false);\n\n if (!preserve) {\n syncedQueryKeyRef.current = null;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = 0;\n setIsReloading(true);\n setResult({ count: 0, results: [] });\n }\n\n return refetchRef\n .current()\n .then(({ data: res }) => {\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data: res, entityNamePlural, isForm, schema, scope, defaultScope });\n\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n })\n .catch((fetchError: unknown) => {\n console.error('Error reloading data:', fetchError);\n })\n .finally(() => {\n isReloadingRef.current = false;\n setIsReloading(false);\n });\n },\n [defaultScope, entityNamePlural, isForm, schema, scope, selection, includeCount, variables]\n );\n\n useEffect(() => {\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (data && schemaErrorMessage && !effectiveError) {\n setSchemaErrorMessage(null);\n }\n }, [data, effectiveError, schemaErrorMessage, schemaMismatchMessage, setSchemaErrorMessage]);\n\n useEffect(() => {\n if (effectiveError || schemaMismatchMessage || isTotalCountFallbackLoading) {\n return;\n }\n\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n\n // Already synced for this query identity — ignore Apollo `data` updates from fetchMore.\n if (syncedQueryKeyRef.current === queryKey) {\n return;\n }\n\n if (isLoading && pendingQueryKeyRef.current !== queryKey) {\n pendingQueryKeyRef.current = queryKey;\n nextOffsetRef.current = 0;\n setResult({ count: 0, results: [] });\n\n return;\n }\n\n if (isLoading) {\n return;\n }\n\n const mapped = mapResults({ data, entityNamePlural, isForm, schema, scope, defaultScope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n }, [\n defaultScope,\n data,\n effectiveError,\n entityNamePlural,\n isForm,\n isLoading,\n isTotalCountFallbackLoading,\n schema,\n schemaMismatchMessage,\n scope,\n selection,\n includeCount,\n variables,\n ]);\n\n // After an Apollo refetch (delete/upload), replace accumulated pages with the\n // fresh first page. fetchMore uses NetworkStatus.fetchMore and is ignored.\n useEffect(() => {\n const previousStatus = previousNetworkStatusRef.current;\n previousNetworkStatusRef.current = networkStatus;\n\n if (effectiveError || schemaMismatchMessage || isReloadingRef.current || isTotalCountFallbackLoading) {\n return;\n }\n\n if (previousStatus !== NetworkStatus.refetch || networkStatus !== NetworkStatus.ready || !data) {\n return;\n }\n\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data, entityNamePlural, isForm, schema, scope, defaultScope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n }, [\n defaultScope,\n data,\n effectiveError,\n entityNamePlural,\n isForm,\n isTotalCountFallbackLoading,\n networkStatus,\n schema,\n schemaMismatchMessage,\n scope,\n selection,\n includeCount,\n variables,\n ]);\n\n // Soft-refresh after mutations (tags, deletes, uploads). Local paginated state\n // ignores Apollo cache writes, so we must refetch and remap explicitly.\n useEffect(() => {\n if (isForm) {\n return;\n }\n\n const listQueryName = `Get${getOperationEntityName(entityNamePlural)}`;\n\n const unsubscribeRefetch = subscribeEntityListRefetch((queryNames) => {\n if (!queryNames.has(listQueryName) || isLoadingMoreRef.current || isReloadingRef.current) {\n return;\n }\n\n return refetchRef\n .current()\n .then(({ data: res }) => {\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data: res, entityNamePlural, isForm, schema, scope, defaultScope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n })\n .catch((fetchError: unknown) => {\n console.error('Error soft-refreshing entity list:', fetchError);\n });\n });\n\n const unsubscribeRemoval = subscribeEntityListRemoval((queryName, entityIds) => {\n if (queryName !== listQueryName) {\n return;\n }\n\n setResult((prev) => {\n const nextResults = prev.results.filter((row) => {\n const rowId = typeof row._id === 'string' ? row._id : undefined;\n\n return !rowId || !entityIds.has(rowId);\n });\n const removedCount = prev.results.length - nextResults.length;\n\n if (removedCount === 0) {\n return prev;\n }\n\n return {\n count: Math.max(0, prev.count - removedCount),\n results: nextResults,\n } as Results;\n });\n });\n\n const unsubscribePatch = subscribeEntityListPatch((queryName, patches) => {\n if (queryName !== listQueryName) {\n return;\n }\n\n setResult((prev) => applyEntityListPatches(prev, patches, variables?.sort));\n });\n\n return () => {\n unsubscribeRefetch();\n unsubscribeRemoval();\n unsubscribePatch();\n };\n }, [defaultScope, entityNamePlural, isForm, schema, scope, selection, includeCount, variables]);\n\n return {\n // Refetch keeps existing rows visible; only initial load / explicit reload show as loading.\n isLoading:\n (isLoading && networkStatus !== NetworkStatus.refetch) || isReloading || isTotalCountFallbackLoading,\n isLoadingMore,\n fetchMore,\n reload,\n count: result.count,\n data: result.results,\n isProjectDisabled,\n isProjectReadOnly,\n schemaErrorMessage,\n };\n}\n\nfunction getVariablesOffset(variables: OperationVariables | undefined): number {\n const offset = variables?.offset;\n\n return typeof offset === 'number' && Number.isFinite(offset) ? offset : 0;\n}\n\nfunction mapResults(\n args: {\n data: (EntityQueryResults & EntityQueryAggregate) | undefined;\n defaultScope: string;\n } & UseEntityQueryParams\n): MappedEntityQueryResults | MappedFormEntityQueryResults {\n const entityNamePlural = args.entityNamePlural as keyof FormEntityItem;\n\n if (!args.data?.[entityNamePlural]) {\n return { count: 0, results: [] };\n }\n\n return args.isForm\n ? mapQueryResultForFormFields(args.entityNamePlural, args.scope, args.data, args.schema, args.defaultScope)\n : mapQueryResult(args.entityNamePlural, args.scope, args.data, args.schema);\n}\n\nfunction applyEntityListPatches(\n prev: Results,\n patches: EntityListRowPatch[],\n sort: unknown\n): Results {\n const patchById = new Map(patches.map((patch) => [patch._id, patch]));\n let didPatch = false;\n const nextResults = prev.results.map((row) => {\n const rowId = typeof row._id === 'string' ? row._id : undefined;\n\n if (!rowId) {\n return row;\n }\n\n const patch = patchById.get(rowId);\n\n if (!patch) {\n return row;\n }\n\n didPatch = true;\n\n return {\n ...row,\n ...patch.attributes,\n };\n });\n\n if (!didPatch) {\n return prev;\n }\n\n return {\n count: prev.count,\n results: sortEntityListResults(nextResults, sort),\n } as Results;\n}\n\nfunction sortEntityListResults<T extends { [key: string]: unknown }>(results: T[], sort: unknown): T[] {\n if (!Array.isArray(sort) || sort.length === 0) {\n return results;\n }\n\n const [primarySort] = sort;\n\n if (!primarySort || typeof primarySort !== 'object') {\n return results;\n }\n\n const [primarySortEntry] = Object.entries(primarySort as { [key: string]: unknown });\n const [sortField, sortDirection] = primarySortEntry ?? [];\n\n if (!sortField || (sortDirection !== 'ASC' && sortDirection !== 'DESC')) {\n return results;\n }\n\n const direction = sortDirection === 'DESC' ? -1 : 1;\n\n return [...results].sort((left, right) => {\n const leftValue = left[sortField];\n const rightValue = right[sortField];\n const leftText = typeof leftValue === 'string' ? leftValue : '';\n const rightText = typeof rightValue === 'string' ? rightValue : '';\n\n return leftText.localeCompare(rightText) * direction;\n });\n}\n"]}
@@ -1,7 +0,0 @@
1
- import'./index.css';import {b}from'./chunk-CAZ6EUR2.js';import {b as b$2}from'./chunk-2DXR5NJV.js';import {e as e$1,a as a$2,b as b$1}from'./chunk-4OGLWOO3.js';import {g as g$2,b as b$5}from'./chunk-MBBE4RND.js';import {Y,Z,aa,ba,_,ca,n}from'./chunk-RULCANNM.js';import {e as e$2,g as g$1,h,j}from'./chunk-A4DPLZZF.js';import {e,f,g}from'./chunk-G5N6HEPW.js';import {b as b$4}from'./chunk-5JUG4BEF.js';import {k,p,q,s,t}from'./chunk-S7Z6KKIN.js';import {a,b as b$3,c as c$1,d,e as e$3}from'./chunk-N33S7BSG.js';import {a as a$1,c}from'./chunk-X3SHNHHM.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(e,{variant:"destructive",children:[jsx(AlertCircle,{className:"fk:h-4 fk:w-4"}),jsx(f,{children:"Project Paused"}),jsxs(g,{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$2}=e$1();if(!e$2)return jsx(Fragment,{});let[t,n,...r]=e$2.split(`
2
- `);return jsxs(e,{className:"fk:mb-4",variant:"destructive",children:[jsx(AlertCircle,{className:"fk:h-4 fk:w-4"}),jsx(f,{children:"Schema mismatch"}),jsxs(g,{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,onScroll:k,onSortingChange:S,pageSize:M,rowHeightEstimate:g,rowAdditionState:i,rowDeletionState:T,scrollToTopKey:X,sorting:de,toolbarComponent:j}){let y=useRef(null),{schemaErrorMessage:N}=e$1(),[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:$}=V.getRowModel(),Pe=un(g,e?.row),qt=pt(e?.row)!=null,Le=useVirtualizer({count:$.length,estimateSize:()=>Pe,getItemKey:a=>$[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$1=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),Oe=useRef(o),ge=useRef(s);pe.current=u,Oe.current=o,ge.current=s;let ke=useCallback(a=>{if(!pe.current||!Oe.current||ge.current)return;let c=a??y.current;c&&lt(c)&&(ge.current=true,pe.current());},[]),Ue=b();useEffect(()=>{Ue&&ke();},[ke,$.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(Y,{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(Z,{className:"fk:sticky fk:top-0 fk:z-20 fk:grid",children:Ie.map(a=>jsxs(aa,{className:"fk:flex fk:w-full",children:[Y$1>0?jsx(le,{width:Y$1,header:true}):null,(R?a.headers.slice(W,_e):a.headers).map((c,P)=>jsxs(ba,{"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(_,{className:"fk:grid fk:relative",children:$.length===0?jsx(aa,{children:jsx(ca,{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=$[a.index];return jsxs(aa,{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$1>0?jsx(le,{width:Y$1}):null,c.getVisibleCells().slice(W,_e).map((P,Yt)=>jsx(ca,{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(c,{"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,l]=useState({}),[s,{data:b,loading:u,error:k}]=useMutation(n,o),S=a$2(k),{isProjectDisabled:M,isProjectReadOnly:g}=(()=>{if(S?.statusCode===403){let i=b$1(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,title:t,className:n}){if(!e.getCanSort())return jsx("div",{className:a$1("fk:flex fk:items-center",n),children:t});let r=e.getIsSorted()==="asc",o=e.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$2,{children:[jsx(g$1,{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.clearSorting();return}e.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.clearSorting();return}e.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$1,{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$3,{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$1,{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$3,{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$1,{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$3,{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$1,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$1,{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$3,{children:jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:"Preview not available"})})})]})})})}let l=Re(r,{width:84,height:84}),s$1=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$1,{asChild:true,children:jsx("img",{src:l,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$3,{children:jsx("img",{src:s$1,alt:"asset",className:`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${Ft} fk:corner-squircle`})})})]}),jsx(k,{open:t$1,onOpenChange:n,children:jsxs(p,{className:"fk:sm:max-w-4xl fk:p-3",children:[jsxs(q,{children:[jsx(s,{className:"fk:sr-only",children:"Asset preview"}),jsx(t,{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$1,enableColumnSorting:r=false}){let[,o]=g$2(),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$1?n$1(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(n,{"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(n,{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(n,{"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$1?[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-GSKQHFQM.js.map
7
- //# sourceMappingURL=chunk-GSKQHFQM.js.map