@flexkit/studio 0.2.10 → 0.2.11

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 (60) hide show
  1. package/dist/activity-nav-button-LZESIQL2.js +2 -0
  2. package/dist/{activity-nav-button-EP6GYASE.js.map → activity-nav-button-LZESIQL2.js.map} +1 -1
  3. package/dist/chat-page-3YSJP7FC.js +4 -0
  4. package/dist/chat-page-3YSJP7FC.js.map +1 -0
  5. package/dist/{chunk-6SAZGEAA.js → chunk-22DXYOXX.js} +2 -2
  6. package/dist/{chunk-6SAZGEAA.js.map → chunk-22DXYOXX.js.map} +1 -1
  7. package/dist/chunk-2HSIWUH3.js +3 -0
  8. package/dist/chunk-2HSIWUH3.js.map +1 -0
  9. package/dist/chunk-7JSGAY3E.js +2 -0
  10. package/dist/chunk-7JSGAY3E.js.map +1 -0
  11. package/dist/chunk-B4WSTNZ3.js +8 -0
  12. package/dist/chunk-B4WSTNZ3.js.map +1 -0
  13. package/dist/{chunk-YLZV43AR.js → chunk-GDTOP4MU.js} +3 -3
  14. package/dist/{chunk-YLZV43AR.js.map → chunk-GDTOP4MU.js.map} +1 -1
  15. package/dist/{chunk-WQUCLXMU.js → chunk-HYSTMQD7.js} +2 -2
  16. package/dist/{chunk-WQUCLXMU.js.map → chunk-HYSTMQD7.js.map} +1 -1
  17. package/dist/chunk-KXAGLQ2B.js +2 -0
  18. package/dist/chunk-KXAGLQ2B.js.map +1 -0
  19. package/dist/{chunk-IPLOSXZS.js → chunk-OI6GA6PE.js} +3 -3
  20. package/dist/{chunk-IPLOSXZS.js.map → chunk-OI6GA6PE.js.map} +1 -1
  21. package/dist/{chunk-SV5KK5K6.js → chunk-TPLL535V.js} +3 -3
  22. package/dist/{chunk-SV5KK5K6.js.map → chunk-TPLL535V.js.map} +1 -1
  23. package/dist/{chunk-AMEYKXZV.js → chunk-YODWX4WT.js} +2 -2
  24. package/dist/{chunk-AMEYKXZV.js.map → chunk-YODWX4WT.js.map} +1 -1
  25. package/dist/{chunk-RXP6EQNE.js → chunk-YSMRXGVX.js} +2 -2
  26. package/dist/{chunk-RXP6EQNE.js.map → chunk-YSMRXGVX.js.map} +1 -1
  27. package/dist/index.css +13 -0
  28. package/dist/index.js +1 -1
  29. package/dist/{list-AJ76FKMO.js → list-N5WCJSJC.js} +2 -2
  30. package/dist/{list-AJ76FKMO.js.map → list-N5WCJSJC.js.map} +1 -1
  31. package/dist/pages-65QNO7ME.js +5 -0
  32. package/dist/{pages-LZKWC2H3.js.map → pages-65QNO7ME.js.map} +1 -1
  33. package/dist/plugin-pages-F5K745MZ.js +2 -0
  34. package/dist/{plugin-pages-YJFH66UO.js.map → plugin-pages-F5K745MZ.js.map} +1 -1
  35. package/dist/{root-GD6WNTP5.js → root-4E3YUTQU.js} +3 -3
  36. package/dist/{root-GD6WNTP5.js.map → root-4E3YUTQU.js.map} +1 -1
  37. package/dist/root-DK5C7DYH.js +2 -0
  38. package/dist/{root-VJPSB2DG.js.map → root-DK5C7DYH.js.map} +1 -1
  39. package/dist/{root-2UU3C6EP.js → root-MMAJEVBH.js} +3 -3
  40. package/dist/{root-2UU3C6EP.js.map → root-MMAJEVBH.js.map} +1 -1
  41. package/dist/{root-APTYXHHX.js → root-WYRLSQPK.js} +2 -2
  42. package/dist/{root-APTYXHHX.js.map → root-WYRLSQPK.js.map} +1 -1
  43. package/dist/{search-5X4N4M3X.js → search-EK4XBDGL.js} +2 -2
  44. package/dist/{search-5X4N4M3X.js.map → search-EK4XBDGL.js.map} +1 -1
  45. package/dist/skills-pages-O35YZMMC.js +2 -0
  46. package/dist/{skills-pages-V4BILOOI.js.map → skills-pages-O35YZMMC.js.map} +1 -1
  47. package/package.json +3 -3
  48. package/dist/activity-nav-button-EP6GYASE.js +0 -2
  49. package/dist/chat-page-N2PGTH56.js +0 -4
  50. package/dist/chat-page-N2PGTH56.js.map +0 -1
  51. package/dist/chunk-HZJNNJOK.js +0 -2
  52. package/dist/chunk-HZJNNJOK.js.map +0 -1
  53. package/dist/chunk-L66FPBO7.js +0 -8
  54. package/dist/chunk-L66FPBO7.js.map +0 -1
  55. package/dist/chunk-ROCYIGFD.js +0 -3
  56. package/dist/chunk-ROCYIGFD.js.map +0 -1
  57. package/dist/pages-LZKWC2H3.js +0 -5
  58. package/dist/plugin-pages-YJFH66UO.js +0 -2
  59. package/dist/root-VJPSB2DG.js +0 -2
  60. package/dist/skills-pages-V4BILOOI.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/asset-manager/tag-query.ts","../src/apps/asset-manager/sidebar.tsx","../src/apps/asset-manager/data-grid/asset-drop-zone.tsx","../src/apps/asset-manager/data-grid/asset-tag-dialogs.tsx","../src/apps/asset-manager/data-grid/asset-row-actions.tsx","../src/apps/asset-manager/data-grid/asset-grid.tsx","../src/apps/asset-manager/data-grid/data-table-toolbar.tsx","../src/apps/asset-manager/data-grid/use-asset-manager-upload.ts","../src/apps/asset-manager/data-grid/view-mode.ts","../src/apps/asset-manager/list.tsx","../src/apps/asset-manager/root.tsx"],"names":["tagQueryVariables","tagQueryOptions","Sidebar","scope","useAppContext","schema","useConfig","runMutation","setMutation","setOptions","useEntityMutation","newTagName","setNewTagName","useState","isDialogOpen","setIsDialogOpen","isDeleteOpen","setIsDeleteOpen","tagToDelete","setTagToDelete","isEditOpen","setIsEditOpen","tagToEdit","setTagToEdit","editTagName","setEditTagName","isSubmitting","setIsSubmitting","isDeleting","setIsDeleting","canMutate","useCanMutate","entityName","entityNamePlural","data","isLoading","useEntityQuery","tags","item","it","handleCreate","useCallback","name","_id","mutation","getEntityCreateMutation","entityQuery","getEntityQuery","refreshQuery","gql","resolve","handleDelete","getEntityDeleteMutation","reject","error","handleRename","dataToMutate","originalData","getEntityUpdateMutation","jsxs","jsx","TagIcon","TooltipProvider","Tooltip","TooltipTrigger","Dialog","DialogTrigger","Button","PlusIcon","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","DialogFooter","Loader2","TooltipContent","PermissionTooltip","ScrollArea","tag","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","hasFileDrag","event","AssetDropZone","children","disabled","onDropFiles","dragDepthRef","useRef","isDragActive","setIsDragActive","clearDragState","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","files","TAG_UPDATE_RESPONSE_FIELDS","AssetTagDialogs","assetIds","mode","onModeChange","onCompleted","patchAssets","usePatchEntityList","selectedTagIds","setSelectedTagIds","tagsData","allTags","useMemo","resetSelection","handleOpenChange","open","applyMutationResult","patches","asset","tagNames","handleAddTags","id","handleRemoveTags","isRemove","actionLabel","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","prev","CommandSeparator","LoaderCircle","AssetRowActions","overlay","row","copiedField","setCopiedField","tagDialogMode","setTagDialogMode","dispatch","useDispatch","assetId","assetUrl","assetSchema","copyToClipboard","field","text","Fragment","EllipsisIcon","CheckIcon","CopyIcon","LinkIcon","MinusIcon","Trash2Icon","FileTypeIconCompat","FileTypeIcon","transparentImageBackground","getLoadMoreThreshold","clientHeight","formatAssetSize","bytes","AssetGrid","columns","hasMore","isLoadingMore","onLoadMore","onSortingChange","pageSize","sortingProp","toolbarComponent","scrollRef","schemaErrorMessage","useGraphQLError","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","useEffect","handleSortingChange","updater","table","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","rows","onLoadMoreRef","hasMoreRef","isLoadingMoreRef","checkLoadMore","container","scrollElement","scrollHeight","scrollTop","handleScroll","_","index","Skeleton","AssetGridCard","filename","getAssetFilename","mimeType","sizeLabel","metaLine","Checkbox","value","AssetGridMedia","isZoomOpen","setIsZoomOpen","isZoomImageLoaded","setIsZoomImageLoaded","url","isImageAsset","ext","getExtensionFromAsset","style","defaultStyles","thumbnailUrl","getAssetImageUrl","zoomUrl","handleThumbnailClick","handleZoomOpenChange","mimeTypes","ImagePlayIcon","ImageIcon","FilePlayIcon","LayersIcon","SplinePointerIcon","DataTableToolbar","isUploading","viewMode","onUploadClick","onViewModeChange","onSearchLoadingChange","onSearchWhereChange","isFiltered","projectId","useParams","search","setSearch","textWhereRef","filterWhereRef","getBaseSearchRequest","baseSearchRequest","searchQuery","setSearchQuery","results","useSearch","lastWhereRef","trimmedSearch","committedSearchQuery","isSearchPending","debouncedSetSearchQuery","debounce","query","selectedIds","t","tagOptions","emitCombinedWhere","clauses","combinedWhere","whereKey","clearSearch","handleBatchDelete","safeResults","nextWhere","r","tagClauses","orClauses","columnFiltersKey","mimeFilter","f","mimeValues","tagsFilter","tagValues","orTags","SearchIcon","ResetIcon","DataTableFacetedFilter","DataTableSortedBy","ListChecks","ToggleGroup","ToggleGroupItem","LayoutGrid","List","fn","ms","timeoutId","debounced","args","MAX_UPLOAD_BYTES","useAssetManagerUpload","uploadAssets","useUploadAssets","setIsUploading","runUpload","VIEW_MODE_STORAGE_KEY","getStoredViewMode","stored","setStoredViewMode","defaultSort","useLocation","entityId","currentProject","setSorting","setViewMode","columnsDefinition","useGridColumnsDefinition","searchWhere","setSearchWhere","isSearchLoading","setIsSearchLoading","uploadFiles","uploadFromDialog","where","whereBase","graphqlSort","primarySort","desc","entry","variables","handleViewModeChange","fetchMore","count","isProjectDisabled","isInitialLoading","rowsCount","handleLoadMore","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","DataTable","Outlet","column","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle"],"mappings":"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","file":"root-2UU3C6EP.js","sourcesContent":["// All mounted tag menus use the same operation and variables so Apollo can\n// share an in-flight request and reuse the cached result.\nexport const tagQueryVariables = { where: {}, limit: 500, offset: 0, sort: [{ name: 'ASC' }] };\nexport const tagQueryOptions = { selection: 'display' as const, includeCount: false };\n","import { JSX, useCallback, useState } from 'react';\nimport { Loader2, PlusIcon, TagIcon, Ellipsis } from 'lucide-react';\nimport {\n Button,\n Input,\n ScrollArea,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n DialogTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PermissionTooltip,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../ui';\nimport { gql } from '@apollo/client';\nimport { useAppContext } from '../../core/app-context';\nimport { useCanMutate } from '../../core/permissions';\nimport { useEntityMutation } from '../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport {\n getEntityDeleteMutation,\n getEntityCreateMutation,\n getEntityQuery,\n getEntityUpdateMutation,\n} from '../../graphql-client/queries';\nimport { useConfig } from '../../core/config/config-context';\nimport type { FormEntityItem } from '../../graphql-client/types';\n\nimport { tagQueryOptions, tagQueryVariables } from './tag-query';\n\ntype TagItem = { _id: string; name: string };\n\nexport function Sidebar(): JSX.Element {\n const { scope } = useAppContext();\n const { currentProjectSchema: schema } = useConfig();\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [newTagName, setNewTagName] = useState<string>('');\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState<boolean>(false);\n const [tagToDelete, setTagToDelete] = useState<TagItem | null>(null);\n const [isEditOpen, setIsEditOpen] = useState<boolean>(false);\n const [tagToEdit, setTagToEdit] = useState<TagItem | null>(null);\n const [editTagName, setEditTagName] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\n const canMutate = useCanMutate();\n\n const entityName = '_tag';\n const entityNamePlural = '_tags';\n const { data, isLoading } = useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const tags: TagItem[] = (Array.isArray(data) ? (data as unknown[]) : []).map((item) => {\n const it = item as { _id: string; name: string };\n return { _id: it._id, name: it.name };\n });\n\n const handleCreate = useCallback(async (): Promise<void> => {\n const name = newTagName.trim();\n\n if (!name) {\n return;\n }\n\n setIsSubmitting(true);\n const _id = typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}`;\n const entityData: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const mutation = getEntityCreateMutation(entityNamePlural, schema, entityData, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setNewTagName('');\n setIsDialogOpen(false);\n resolve();\n },\n });\n runMutation(true);\n });\n setIsSubmitting(false);\n }, [entityNamePlural, runMutation, schema, scope, setMutation, setOptions, newTagName]);\n\n const handleDelete = useCallback(\n async (_id: string): Promise<void> => {\n setIsDeleting(true);\n const mutation = getEntityDeleteMutation(entityName, schema, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: _id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n runMutation(true);\n });\n setIsDeleting(false);\n },\n [entityName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions]\n );\n\n const handleRename = useCallback(async (): Promise<void> => {\n const name = editTagName.trim();\n\n if (!name || !tagToEdit) {\n return;\n }\n\n setIsSubmitting(true);\n\n const dataToMutate: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const originalData: FormEntityItem = {};\n const mutation = getEntityUpdateMutation(\n entityNamePlural,\n tagToEdit._id,\n scope,\n schema,\n originalData,\n dataToMutate\n );\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: tagToEdit._id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setIsEditOpen(false);\n setTagToEdit(null);\n setEditTagName('');\n resolve();\n },\n });\n runMutation(true);\n });\n\n setIsSubmitting(false);\n }, [editTagName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions, tagToEdit]);\n\n return (\n <div className=\"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6\">\n <TagIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight\">Tags</span>\n {canMutate ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogTrigger asChild>\n <Button variant=\"secondary\" size=\"icon\" className=\"fk:ml-auto fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Create a new tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={newTagName}\n placeholder=\"New tag name\"\n onChange={(e) => setNewTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleCreate();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button disabled={isSubmitting} onClick={handleCreate} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Add\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add tag</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"fk:ml-auto\">\n <PermissionTooltip disabled>\n <Button disabled variant=\"secondary\" size=\"icon\" className=\"fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </PermissionTooltip>\n </div>\n )}\n </div>\n\n <ScrollArea className=\"fk:h-full\">\n <div className=\"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2\">\n {isLoading ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">Loading...</div>\n ) : tags.length === 0 ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">No tags yet</div>\n ) : (\n tags.map((tag) => (\n <div\n key={tag._id}\n className=\"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1 fk:corner-squircle\"\n >\n <span className=\"fk:text-sm\">{tag.name}</span>\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${tag.name}`}\n disabled={!canMutate}\n title={canMutate ? `Actions for ${tag.name}` : undefined}\n variant=\"ghost\"\n size=\"icon\"\n className=\"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground\"\n >\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem\n onClick={() => {\n setTagToEdit(tag);\n setEditTagName(tag.name);\n setIsEditOpen(true);\n }}\n >\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n onClick={() => {\n setTagToDelete(tag);\n setIsDeleteOpen(true);\n }}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n <Dialog open={isEditOpen} onOpenChange={setIsEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Rename an existing tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={editTagName}\n placeholder=\"Tag name\"\n onChange={(e) => setEditTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleRename();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n disabled={isSubmitting}\n variant=\"secondary\"\n onClick={() => {\n setIsEditOpen(false);\n setTagToEdit(null);\n }}\n >\n Cancel\n </Button>\n <Button disabled={isSubmitting} onClick={handleRename} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog open={isDeleteOpen} onOpenChange={setIsDeleteOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Confirm deletion of a tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:text-sm fk:text-muted-foreground\">\n Are you sure you want to delete the tag{' '}\n <span className=\"fk:font-semibold fk:text-foreground\">{tagToDelete?.name}</span>?\n </div>\n <DialogFooter>\n <Button\n disabled={isDeleting}\n variant=\"secondary\"\n onClick={() => {\n setIsDeleteOpen(false);\n setTagToDelete(null);\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isDeleting}\n variant=\"destructive\"\n onClick={() => {\n if (!tagToDelete) {\n return;\n }\n\n void (async () => {\n await handleDelete(tagToDelete._id);\n setIsDeleteOpen(false);\n setTagToDelete(null);\n })();\n }}\n >\n {isDeleting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","import { useRef, useState, type DragEvent, type JSX, type ReactNode } from 'react';\n\ninterface AssetDropZoneProps {\n children: ReactNode;\n disabled?: boolean;\n onDropFiles: (files: File[]) => void;\n}\n\nfunction hasFileDrag(event: DragEvent<HTMLDivElement>): boolean {\n return Array.from(event.dataTransfer.types).includes('Files');\n}\n\nexport function AssetDropZone({ children, disabled = false, onDropFiles }: AssetDropZoneProps): JSX.Element {\n const dragDepthRef = useRef(0);\n const [isDragActive, setIsDragActive] = useState(false);\n\n function clearDragState(): void {\n dragDepthRef.current = 0;\n setIsDragActive(false);\n }\n\n function handleDragEnter(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current += 1;\n\n if (!disabled) {\n setIsDragActive(true);\n }\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = disabled ? 'none' : 'copy';\n }\n\n function handleDragLeave(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n\n if (dragDepthRef.current === 0) {\n setIsDragActive(false);\n }\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n clearDragState();\n\n if (disabled) {\n return;\n }\n\n const files = Array.from(event.dataTransfer.files);\n\n if (files.length === 0) {\n return;\n }\n\n onDropFiles(files);\n }\n\n return (\n <div\n className=\"fk:relative fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <div className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">{children}</div>\n {isDragActive ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:inset-0 fk:z-30 fk:flex fk:items-center fk:justify-center fk:rounded-md fk:border-2 fk:border-dashed fk:border-primary fk:bg-background/80 fk:corner-squircle\"\n >\n <p className=\"fk:text-sm fk:font-medium fk:text-foreground\">Drop files to upload</p>\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useState, type JSX } from 'react';\nimport { LoaderCircle } from 'lucide-react';\nimport {\n Button,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../../ui';\nimport { gql } from '@apollo/client';\nimport { getEntityUpdateMutation } from '../../../graphql-client/queries';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useEntityMutation } from '../../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { usePatchEntityList } from '../../../graphql-client/use-patch-entity-list';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ntype TagItem = {\n _id: string;\n name: string;\n};\n\ntype WhereClause = { [key: string]: unknown };\n\ntype AssetTagMutationAsset = {\n _id?: string;\n _updatedAt?: string;\n tags?: TagItem[] | null;\n};\n\ntype AssetTagMutationData = {\n update_assets?: {\n _assets?: AssetTagMutationAsset[] | null;\n } | null;\n};\n\nexport type AssetTagDialogMode = 'add' | 'remove' | null;\n\nconst TAG_UPDATE_RESPONSE_FIELDS = `_updatedAt\n tags(limit: 3, offset: 0) {\n _id\n name\n }\n`;\n\ninterface AssetTagDialogsProps {\n assetIds: string[];\n mode: AssetTagDialogMode;\n onModeChange: (mode: AssetTagDialogMode) => void;\n onCompleted?: () => void;\n}\n\nexport function AssetTagDialogs({\n assetIds,\n mode,\n onModeChange,\n onCompleted,\n}: AssetTagDialogsProps): JSX.Element {\n const { scope } = useAppContext();\n const patchAssets = usePatchEntityList('_assets');\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const { currentProjectSchema: schema } = useConfig();\n const [selectedTagIds, setSelectedTagIds] = useState<string[]>([]);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((tag) => ({\n _id: (tag as TagItem)._id,\n name: (tag as TagItem).name,\n }));\n }, [tagsData]);\n\n const resetSelection = useCallback((): void => {\n setSelectedTagIds([]);\n }, []);\n\n const handleOpenChange = useCallback(\n (open: boolean): void => {\n if (!open && !isSubmitting) {\n onModeChange(null);\n resetSelection();\n }\n },\n [isSubmitting, onModeChange, resetSelection]\n );\n\n const applyMutationResult = useCallback(\n (data: unknown): void => {\n const assets = (data as AssetTagMutationData | null | undefined)?.update_assets?._assets ?? [];\n const patches = assets\n .filter((asset): asset is AssetTagMutationAsset & { _id: string } => typeof asset?._id === 'string')\n .map((asset) => {\n const tagNames = (Array.isArray(asset.tags) ? asset.tags : [])\n .map((tag) => tag.name)\n .filter(Boolean)\n .slice(0, 3)\n .join(', ');\n\n return {\n _id: asset._id,\n attributes: {\n tags: tagNames,\n ...(typeof asset._updatedAt === 'string' ? { _updatedAt: asset._updatedAt } : {}),\n },\n };\n });\n\n if (patches.length > 0) {\n patchAssets(patches);\n }\n },\n [patchAssets]\n );\n\n const handleAddTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n connect: selectedTagIds.map((id) => ({ _id: id })),\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const handleRemoveTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n disconnect: selectedTagIds,\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const isRemove = mode === 'remove';\n let actionLabel = isRemove ? 'Remove tag(s)' : 'Add tag(s)';\n\n if (assetIds.length > 1) {\n actionLabel = isRemove ? 'Remove tag(s) from selected assets' : 'Add tag(s) to selected assets';\n }\n\n return (\n <CommandDialog open={mode !== null} onOpenChange={handleOpenChange}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-75\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedTagIds.includes(tag._id);\n\n return (\n <CommandItem\n disabled={isSubmitting}\n key={tag._id}\n onSelect={() => {\n if (isSubmitting) {\n return;\n }\n\n setSelectedTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button\n className=\"fk:w-full\"\n disabled={selectedTagIds.length === 0 || isSubmitting}\n onClick={isRemove ? handleRemoveTags : handleAddTags}\n >\n {isSubmitting ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {actionLabel}\n </Button>\n </div>\n </CommandDialog>\n );\n}\n","import { useState, type JSX } from 'react';\nimport {\n Check as CheckIcon,\n Copy as CopyIcon,\n Ellipsis as EllipsisIcon,\n Link as LinkIcon,\n MinusIcon,\n TagIcon,\n Trash2 as Trash2Icon,\n} from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { assetSchema } from '../../../entities/assets-schema';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../../ui';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\n\ntype AssetRow = {\n _id?: string;\n url?: string | null;\n};\n\ninterface AssetRowActionsProps<TData> {\n overlay?: boolean;\n row: Row<TData>;\n}\n\nexport function AssetRowActions<TData>({ overlay = false, row }: AssetRowActionsProps<TData>): JSX.Element {\n const [copiedField, setCopiedField] = useState<'id' | 'url' | null>(null);\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const dispatch = useDispatch();\n const canMutate = useCanMutate();\n const asset = row.original as AssetRow;\n const assetId = asset._id ?? '';\n const assetUrl = asset.url ?? '';\n\n function handleDelete(): void {\n dispatch({ type: 'DeleteEntity', payload: { entityId: assetId, entityName: assetSchema.name } });\n }\n\n function copyToClipboard(field: 'id' | 'url', text: string): void {\n void navigator.clipboard.writeText(text);\n setCopiedField(field);\n window.setTimeout(() => setCopiedField(null), 1500);\n }\n\n // Pure white glyph; parent wrapper applies mix-blend-difference so it inverts over the asset.\n // A light hover fill also inverts, so the hit area reads as a contrast disc on any asset.\n const triggerClassName = overlay\n ? 'fk:flex fk:h-7 fk:w-7 fk:p-0 fk:text-white fk:group-hover:bg-background/10 fk:group-hover:text-white! fk:data-[state=open]:bg-background/15'\n : 'fk:flex fk:h-8 fk:w-8 fk:p-0 fk:data-[state=open]:bg-muted';\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className={triggerClassName} onClick={(event) => event.stopPropagation()} variant=\"ghost\">\n <EllipsisIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-45\">\n <DropdownMenuItem\n disabled={!assetId}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('id', assetId);\n }}\n >\n {copiedField === 'id' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <CopyIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy ID\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetUrl}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('url', assetUrl);\n }}\n >\n {copiedField === 'url' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <LinkIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy URL\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('add');\n }}\n >\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Add tag\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('remove');\n }}\n >\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n handleDelete();\n }}\n >\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n {tagDialogMode !== null ? (\n <AssetTagDialogs assetIds={assetId ? [assetId] : []} mode={tagDialogMode} onModeChange={setTagDialogMode} />\n ) : null}\n </>\n );\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type JSX,\n type MouseEvent,\n type ReactElement,\n type UIEvent,\n} from 'react';\nimport {\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n Table as ReactTable,\n Row,\n RowSelectionState,\n SortingState,\n Updater,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useGraphQLError } from '../../../graphql-client/graphql-context';\nimport type { AttributeValue } from '../../../graphql-client/types';\nimport {\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Skeleton,\n} from '../../../ui';\nimport { LoaderCircle } from 'lucide-react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetFilename, getAssetImageUrl, getExtensionFromAsset, isImageAsset } from './asset-url';\nimport { AssetRowActions } from './asset-row-actions';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\ntype AssetRecord = {\n _id?: string;\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n size?: number | null;\n url?: string | null;\n};\n\ninterface AssetGridProps<TData extends AttributeValue, TValue> {\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n isLoading?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n onSortingChange?: (updater: Updater<SortingState>) => void;\n pageSize?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: ReactTable<AttributeValue>) => ReactElement;\n}\n\nfunction getLoadMoreThreshold(clientHeight: number): number {\n return Math.max(600, clientHeight);\n}\n\nfunction formatAssetSize(bytes: number | null | undefined): string {\n if (bytes == null || Number.isNaN(bytes)) {\n return '';\n }\n\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function AssetGrid<TData extends AttributeValue, TValue>({\n columns,\n data,\n entityName,\n hasMore = false,\n isLoading = false,\n isLoadingMore = false,\n onLoadMore,\n onSortingChange,\n pageSize,\n sorting: sortingProp,\n toolbarComponent,\n}: AssetGridProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0 });\n }, [entityName]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` from the toolbar; keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n });\n\n const { rows } = table.getRowModel();\n\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n const { scrollHeight, scrollTop, clientHeight } = scrollElement;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n if (distanceFromBottom >= getLoadMoreThreshold(clientHeight)) {\n return;\n }\n\n onLoadMoreRef.current();\n }, []);\n\n useEffect(() => {\n checkLoadMore();\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore]);\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4\">\n {toolbarComponent ? toolbarComponent(table) : null}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1\">\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-0 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-40\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n <div\n className=\"fk:h-full fk:overflow-auto fk:pt-px fk:pb-20 fk:-ml-0.5 fk:pr-3\"\n onScroll={handleScroll}\n ref={scrollRef}\n >\n {isLoading ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3\">\n {Array.from({ length: pageSize ?? 50 }, (_, index) => (\n <div className=\"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle\" key={`skeleton-${index}`}>\n <Skeleton className=\"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle\" />\n <Skeleton className=\"fk:mt-2 fk:h-3 fk:w-[75%]\" />\n <Skeleton className=\"fk:mt-1.5 fk:h-3 fk:w-[50%]\" />\n </div>\n ))}\n </div>\n ) : null}\n {!isLoading && rows.length === 0 ? (\n <div className=\"fk:flex fk:h-24 fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground\">\n No results.\n </div>\n ) : null}\n {!isLoading && rows.length > 0 ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3\">\n {rows.map((row) => (\n <AssetGridCard key={row.id} row={row} />\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction AssetGridCard({ row }: { row: Row<AttributeValue> }): JSX.Element {\n const asset = row.original as AssetRecord;\n const filename = getAssetFilename(asset) || 'Untitled';\n const mimeType = asset.mimeType ?? '';\n const sizeLabel = formatAssetSize(asset.size);\n const isSelected = row.getIsSelected();\n const metaLine = [mimeType, sizeLabel].filter(Boolean).join(' · ');\n\n return (\n <div\n className={`fk:relative fk:rounded-md fk:border fk:p-2 fk:transition-colors ${\n isSelected\n ? 'fk:border-primary fk:ring-1 fk:ring-primary/40 fk:bg-muted/40'\n : 'fk:border-border fk:bg-background fk:hover:border-muted-foreground/30'\n } fk:corner-squircle`}\n data-state={isSelected ? 'selected' : undefined}\n >\n <div className=\"fk:absolute fk:left-3 fk:top-3 fk:z-10 fk:mix-blend-difference\">\n <Checkbox\n className=\"fk:border-white!\"\n aria-label={`Select ${filename}`}\n checked={isSelected}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n <div className=\"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference\">\n <AssetRowActions overlay row={row} />\n </div>\n <AssetGridMedia asset={asset} filename={filename} />\n <div className=\"fk:mt-2 fk:truncate fk:text-xs fk:font-medium\" title={filename}>\n {filename}\n </div>\n {metaLine ? (\n <div className=\"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground\" title={metaLine}>\n {metaLine}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction AssetGridMedia({ asset, filename }: { asset: AssetRecord; filename: string }): JSX.Element {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const [isZoomImageLoaded, setIsZoomImageLoaded] = useState(false);\n const url = asset.url ?? '';\n\n if (!url && !asset.path) {\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:corner-squircle\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">No preview</span>\n </div>\n );\n }\n\n const isImage = isImageAsset(asset);\n\n if (!isImage || !url) {\n const ext = getExtensionFromAsset(asset);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:[&>svg]:h-12 fk:[&>svg]:w-auto fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 320, height: 320 });\n const zoomUrl = url;\n\n function handleThumbnailClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n setIsZoomImageLoaded(false);\n setIsZoomOpen(true);\n }\n\n function handleZoomOpenChange(open: boolean): void {\n setIsZoomOpen(open);\n\n if (!open) {\n setIsZoomImageLoaded(false);\n }\n }\n\n return (\n <>\n <button\n className={`fk:aspect-square fk:w-full fk:cursor-zoom-in fk:overflow-hidden fk:rounded-sm fk:border-0 fk:p-0 ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n type=\"button\"\n >\n <img alt={filename} className=\"fk:h-full fk:w-full fk:object-contain\" src={thumbnailUrl} />\n </button>\n <Dialog open={isZoomOpen} onOpenChange={handleZoomOpenChange}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <div className=\"fk:relative fk:flex fk:h-[min(85vh,56rem)] fk:w-full fk:items-center fk:justify-center fk:overflow-hidden fk:rounded-md fk:corner-squircle\">\n {!isZoomImageLoaded ? (\n <LoaderCircle\n aria-label=\"Loading image\"\n className=\"fk:absolute fk:h-8 fk:w-8 fk:animate-spin fk:text-muted-foreground\"\n />\n ) : null}\n <img\n alt={filename}\n className={`fk:max-h-full fk:max-w-full fk:object-contain fk:transition-opacity ${\n isZoomImageLoaded ? 'fk:opacity-100' : 'fk:opacity-0'\n }`}\n onError={() => setIsZoomImageLoaded(true)}\n onLoad={() => setIsZoomImageLoaded(true)}\n src={zoomUrl}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","'use client';\n\nimport { JSX, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FilePlayIcon,\n ImageIcon,\n ImagePlayIcon,\n LayersIcon,\n LayoutGrid,\n List,\n ListChecks,\n MinusIcon,\n SplinePointerIcon,\n TagIcon,\n Trash2Icon,\n LoaderCircle,\n Search as SearchIcon,\n X as ResetIcon,\n} from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport type { Table as ReactTable } from '@tanstack/react-table';\nimport type { SearchRequestProps } from '../../../core/types';\nimport { DataTableFacetedFilter } from '../../../data-grid/data-table-faceted-filter';\nimport { DataTableSortedBy } from '../../../data-grid/data-table-sorted-by';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useSearch } from '../../../core/use-search';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n PermissionTooltip,\n ToggleGroup,\n ToggleGroupItem,\n} from '../../../ui';\nimport type { AssetViewMode } from './view-mode';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isUploading?: boolean;\n table: ReactTable<TData>;\n viewMode: AssetViewMode;\n onUploadClick?: () => void;\n onViewModeChange: (mode: AssetViewMode) => void;\n onSearchLoadingChange?: (isLoading: boolean) => void;\n onSearchWhereChange?: (where: WhereClause) => void;\n}\n\ntype WhereClause = { [key: string]: unknown };\n\nconst mimeTypes = [\n {\n value: 'image/gif',\n label: 'GIF',\n icon: ImagePlayIcon,\n },\n {\n value: 'image/jpeg',\n label: 'JPEG',\n icon: ImageIcon,\n },\n {\n value: 'video/mp4',\n label: 'MP4',\n icon: FilePlayIcon,\n },\n {\n value: 'image/png',\n label: 'PNG',\n icon: LayersIcon,\n },\n {\n value: 'image/svg+xml',\n label: 'SVG',\n icon: SplinePointerIcon,\n },\n {\n value: 'image/webp',\n label: 'WebP',\n icon: ImageIcon,\n },\n];\n\nexport function DataTableToolbar<TData>({\n entityName,\n isUploading = false,\n table,\n viewMode,\n onUploadClick,\n onViewModeChange,\n onSearchLoadingChange,\n onSearchWhereChange,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0;\n const { projectId } = useParams();\n const dispatch = useDispatch();\n const { scope } = useAppContext();\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const { currentProjectSchema: schema } = useConfig();\n const canMutate = useCanMutate();\n const [search, setSearch] = useState('');\n const textWhereRef = useRef<WhereClause>({});\n const filterWhereRef = useRef<WhereClause>({});\n\n function getBaseSearchRequest(): SearchRequestProps {\n return {\n searchRequests: {\n searches: [{ collection: '_assets' }, { collection: '_tags' }],\n },\n commonParams: { q: '' },\n };\n }\n\n const baseSearchRequest = useMemo(() => getBaseSearchRequest(), []);\n const [searchQuery, setSearchQuery] = useState<SearchRequestProps>(baseSearchRequest);\n const { results, isLoading } = useSearch(projectId ?? '', searchQuery);\n const lastWhereRef = useRef<string>('');\n const trimmedSearch = search.trim();\n const committedSearchQuery = searchQuery.commonParams.q ?? '';\n const isSearchPending = trimmedSearch.length > 0 && (isLoading || committedSearchQuery !== trimmedSearch);\n\n const debouncedSetSearchQuery = useMemo(\n () =>\n debounce((query: string) => {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: query } });\n }, 300),\n [baseSearchRequest]\n );\n\n useEffect(() => {\n return () => {\n debouncedSetSearchQuery.cancel();\n };\n }, [debouncedSetSearchQuery]);\n\n // Collect selected entity ids from the table\n const selectedIds: string[] = table\n .getSelectedRowModel()\n .rows.map((row) => (row.original as unknown as { _id: string })._id);\n\n // Load tags for the selector (full tags collection, not derived from loaded assets)\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((t) => ({ _id: (t as { _id: string })._id, name: (t as { name: string }).name }));\n }, [tagsData]);\n\n const tagOptions = useMemo(() => {\n return allTags.map((t) => ({ value: t._id, label: t.name }));\n }, [allTags]);\n\n const emitCombinedWhere = useCallback((): void => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const clauses: WhereClause[] = [];\n\n if (Object.keys(textWhereRef.current).length > 0) {\n clauses.push(textWhereRef.current);\n }\n\n if (Object.keys(filterWhereRef.current).length > 0) {\n clauses.push(filterWhereRef.current);\n }\n\n const combinedWhere = clauses.length === 0 ? {} : clauses.length === 1 ? clauses[0] : { AND: clauses };\n const whereKey = JSON.stringify(combinedWhere);\n\n if (lastWhereRef.current !== whereKey) {\n lastWhereRef.current = whereKey;\n onSearchWhereChange(combinedWhere);\n }\n }, [onSearchWhereChange]);\n\n function clearSearch(): void {\n debouncedSetSearchQuery.cancel();\n setSearch('');\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n textWhereRef.current = {};\n emitCombinedWhere();\n }\n\n async function handleBatchDelete(): Promise<void> {\n dispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} asset${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected assets? They will be deleted permanently.`\n : `Are you sure you want to delete the selected asset? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionCancel: () => {},\n dialogActionSubmit: () => {\n // One DeleteEntity action → one GraphQL mutation with `_id: { in: [...] }`.\n dispatch({\n type: 'DeleteEntity',\n _id: `delete-batch-${Date.now()}`,\n payload: { entityId: selectedIds, entityName, silent: true },\n });\n\n table.resetRowSelection();\n },\n },\n },\n });\n }\n\n useEffect(() => {\n onSearchLoadingChange?.(isSearchPending);\n }, [isSearchPending, onSearchLoadingChange]);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n if (trimmedSearch.length === 0) {\n textWhereRef.current = {};\n emitCombinedWhere();\n\n return;\n }\n\n // Wait for debounce + search results before applying text filters (avoids empty-table flash).\n if (isSearchPending) {\n return;\n }\n\n const safeResults = results ?? [];\n let nextWhere: WhereClause = {};\n\n if (safeResults.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else {\n // Prefer `_id: { in: [...] }` over one OR-eq per hit. Large OR trees break\n // offset pagination and were re-triggering endless fetchMore requests.\n const assetIds = safeResults.filter((r) => r._entityNamePlural === '_assets').map((r) => r._id);\n const tagClauses = safeResults\n .filter((r) => r._entityNamePlural === '_tags')\n .map((r) => ({ tags: { some: { _id: { eq: r._id } } } }));\n\n const orClauses: WhereClause[] = [];\n\n if (assetIds.length > 0) {\n orClauses.push({ _id: { in: assetIds } });\n }\n\n orClauses.push(...tagClauses);\n\n if (orClauses.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else if (orClauses.length === 1) {\n nextWhere = orClauses[0] as WhereClause;\n } else {\n nextWhere = { OR: orClauses };\n }\n }\n\n textWhereRef.current = nextWhere;\n emitCombinedWhere();\n }, [emitCombinedWhere, isSearchPending, onSearchWhereChange, results, trimmedSearch]);\n\n // Watch column filter changes (e.g., mime type) and push server-side where\n const columnFiltersKey = JSON.stringify(table.getState().columnFilters);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const mimeFilter = table.getState().columnFilters.find((f) => f.id === 'mimeType');\n const mimeValues = (Array.isArray(mimeFilter?.value) ? (mimeFilter?.value as unknown[]) : []) as string[];\n\n const tagsFilter = table.getState().columnFilters.find((f) => f.id === 'tags');\n const tagValues = (Array.isArray(tagsFilter?.value) ? (tagsFilter?.value as unknown[]) : []) as string[];\n\n const clauses: WhereClause[] = [];\n\n if (mimeValues.length > 0) {\n clauses.push({ mimeType: { in: mimeValues } } as WhereClause);\n }\n\n if (tagValues.length > 0) {\n const orTags = tagValues.map((id) => ({ tags: { some: { _id: { eq: id } } } }));\n clauses.push(orTags.length === 1 ? orTags[0] : { OR: orTags });\n }\n\n if (clauses.length === 0) {\n filterWhereRef.current = {};\n } else if (clauses.length === 1) {\n filterWhereRef.current = clauses[0] as WhereClause;\n } else {\n filterWhereRef.current = { AND: clauses } as WhereClause;\n }\n\n emitCombinedWhere();\n }, [columnFiltersKey, emitCombinedWhere, onSearchWhereChange, table]);\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between fk:pr-3\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n <div className=\"fk:relative\">\n {isLoading ? (\n <LoaderCircle className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <Input\n placeholder=\"Search assets...\"\n name=\"search-assets\"\n value={search}\n onChange={(e) => {\n const { value } = e.target;\n setSearch(value);\n\n if (value.trim().length === 0) {\n clearSearch();\n\n return;\n }\n\n debouncedSetSearchQuery(value.trim());\n }}\n className=\"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7\"\n />\n {search ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle\"\n onClick={clearSearch}\n type=\"button\"\n >\n <ResetIcon className=\"fk:h-4 fk:w-4\" />\n </Button>\n ) : null}\n </div>\n {table.getColumn('mimeType') && (\n <DataTableFacetedFilter column={table.getColumn('mimeType')} options={mimeTypes} title=\"File type\" />\n )}\n {table.getColumn('tags') && (\n <DataTableFacetedFilter column={table.getColumn('tags')} options={tagOptions} title=\"Tags\" />\n )}\n {isFiltered && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n table.resetColumnFilters();\n filterWhereRef.current = {};\n emitCombinedWhere();\n }}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3\"\n >\n Reset\n <ResetIcon className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n )}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8 fk:mr-2 fk:lg:flex\" disabled={!canMutate} size=\"sm\" variant=\"secondary\">\n Actions <ListChecks className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[240px]\">\n <DropdownMenuItem onClick={() => setTagDialogMode('add')}>\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Add tag\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTagDialogMode('remove')}>\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleBatchDelete} className=\"fk:text-destructive\">\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Delete asset{selectedIds.length > 1 ? 's' : ''} (\n {selectedIds.length})\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-2\">\n <ToggleGroup\n size=\"sm\"\n type=\"single\"\n value={viewMode}\n onValueChange={(value) => {\n if (value === 'list' || value === 'grid') {\n onViewModeChange(value);\n }\n }}\n >\n <ToggleGroupItem aria-label=\"Grid view\" value=\"grid\">\n <LayoutGrid className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem aria-label=\"List view\" value=\"list\">\n <List className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n <PermissionTooltip disabled={!canMutate}>\n <Button\n aria-busy={isUploading}\n className=\"fk:h-8 fk:lg:flex\"\n disabled={!canMutate || isUploading}\n onClick={onUploadClick}\n size=\"sm\"\n variant=\"default\"\n >\n {isUploading ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n Upload assets\n </Button>\n </PermissionTooltip>\n </div>\n\n {tagDialogMode !== null ? (\n <AssetTagDialogs\n assetIds={selectedIds}\n mode={tagDialogMode}\n onCompleted={() => table.resetRowSelection()}\n onModeChange={setTagDialogMode}\n />\n ) : null}\n </div>\n );\n}\n\ntype DebouncedFn<TArgs extends unknown[]> = ((...args: TArgs) => void) & {\n cancel: () => void;\n};\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300): DebouncedFn<TArgs> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = function (this: unknown, ...args: TArgs) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n fn.apply(this, args);\n }, ms);\n } as DebouncedFn<TArgs>;\n\n debounced.cancel = () => {\n if (timeoutId === undefined) {\n return;\n }\n\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n return debounced;\n}\n","import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useUploadAssets } from '../../../core/upload';\n\nconst MAX_UPLOAD_BYTES = 4 * 1024 * 1024;\n\nexport function useAssetManagerUpload(): {\n canMutate: boolean;\n isUploading: boolean;\n uploadFiles: (files: File[]) => Promise<void>;\n uploadFromDialog: () => Promise<void>;\n} {\n const { projectId } = useParams();\n const uploadAssets = useUploadAssets();\n const canMutate = useCanMutate();\n const [isUploading, setIsUploading] = useState(false);\n\n async function runUpload(files?: File[]): Promise<void> {\n if (!canMutate || isUploading) {\n return;\n }\n\n if (files && files.length === 0) {\n return;\n }\n\n try {\n await uploadAssets({\n files,\n maxBytes: MAX_UPLOAD_BYTES,\n multiple: true,\n onUploadStart: () => {\n setIsUploading(true);\n },\n projectId,\n });\n } finally {\n setIsUploading(false);\n }\n }\n\n return {\n canMutate,\n isUploading,\n uploadFiles: (files) => runUpload(files),\n uploadFromDialog: () => runUpload(),\n };\n}\n","export type AssetViewMode = 'list' | 'grid';\n\nconst VIEW_MODE_STORAGE_KEY = 'flexkit-asset-manager:viewMode';\n\nexport function getStoredViewMode(): AssetViewMode {\n if (typeof localStorage === 'undefined') {\n return 'grid';\n }\n\n try {\n const stored = localStorage.getItem(VIEW_MODE_STORAGE_KEY);\n\n if (stored === 'list' || stored === 'grid') {\n return stored;\n }\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n\n return 'grid';\n}\n\nexport function setStoredViewMode(mode: AssetViewMode): void {\n if (typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n localStorage.setItem(VIEW_MODE_STORAGE_KEY, mode);\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n}\n","import { useCallback, useMemo, useState, type JSX } from 'react';\nimport { useLocation, Outlet } from 'react-router-dom';\nimport type { ColumnDef, SortingState, Updater } from '@tanstack/react-table';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { DataTable } from '../../data-grid/data-table';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton } from '../../ui';\nimport { AssetDropZone } from './data-grid/asset-drop-zone';\nimport { AssetGrid } from './data-grid/asset-grid';\nimport { DataTableToolbar } from './data-grid/data-table-toolbar';\nimport { AssetRowActions } from './data-grid/asset-row-actions';\nimport { useAssetManagerUpload } from './data-grid/use-asset-manager-upload';\nimport { getStoredViewMode, setStoredViewMode, type AssetViewMode } from './data-grid/view-mode';\n\ntype WhereClause = { [key: string]: unknown };\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\n\nexport function List(): JSX.Element {\n const entityName = '_assets';\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const [sorting, setSorting] = useState<SortingState>([]);\n const [viewMode, setViewMode] = useState<AssetViewMode>(() => getStoredViewMode());\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: assetSchema.attributes,\n actionsComponent: (row) => <AssetRowActions row={row} />,\n checkboxSelect: 'multiple',\n enableColumnSorting: true,\n });\n\n const [searchWhere, setSearchWhere] = useState<WhereClause>({});\n const [isSearchLoading, setIsSearchLoading] = useState(false);\n const { canMutate, isUploading, uploadFiles, uploadFromDialog } = useAssetManagerUpload();\n\n const where = useMemo(() => {\n const whereBase = entityId ? { _id: { eq: entityId } } : { NOT: { path: { eq: null } } };\n\n if (!searchWhere || Object.keys(searchWhere).length === 0) {\n return whereBase;\n }\n\n if (entityId) {\n return whereBase; // ignore search when a single asset is selected via id\n }\n\n return { AND: [whereBase, searchWhere] } as WhereClause;\n }, [entityId, searchWhere]);\n\n const graphqlSort = useMemo(() => {\n if (sorting.length === 0) {\n return defaultSort;\n }\n\n const primarySort = sorting.map(({ id, desc }) => ({ [id]: desc ? 'DESC' : 'ASC' }));\n const hasIdSort = primarySort.some((entry) => '_id' in entry);\n\n if (hasIdSort) {\n return primarySort;\n }\n\n // Tie-break so offset pages stay stable when sort values collide.\n return [...primarySort, { _id: 'DESC' }];\n }, [sorting]);\n\n const variables = useMemo(() => ({ where, offset: 0, limit: pageSize, sort: graphqlSort }), [where, graphqlSort]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n setSorting(updater);\n }\n\n function handleViewModeChange(mode: AssetViewMode): void {\n setViewMode(mode);\n setStoredViewMode(mode);\n }\n\n const { isLoading, isLoadingMore, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n selection: 'list',\n });\n\n const isInitialLoading = isSearchLoading || (isLoading && (data == null || data.length === 0));\n\n const rowsCount = data?.length ?? 0;\n const hasMore = !isSearchLoading && count > 0 && rowsCount > 0 && rowsCount < count;\n\n const handleLoadMore = useCallback(() => {\n fetchMore({\n variables: {\n // Offset is tracked inside useEntityQuery from page windows; value here is ignored.\n offset: 0,\n limit: pageSize,\n },\n });\n }, [fetchMore]);\n\n const loadingData = useMemo(\n () => Array.from({ length: pageSize }, (_, index) => ({ _id: `loading-${index}` }) as AttributeValue),\n []\n );\n const loadingColumns = useMemo(() => getLoadingColumns(columnsDefinition), [columnsDefinition]);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <SchemaError />\n <div className=\"fk:mb-4 fk:flex fk:items-center fk:gap-2 fk:pr-3\">\n <h2 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Asset Manager</h2>\n {!isInitialLoading ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {count.toLocaleString()} {count === 1 ? 'record' : 'records'}\n </span>\n ) : null}\n </div>\n {!schemaErrorMessage ? (\n <AssetDropZone disabled={!canMutate || isUploading} onDropFiles={uploadFiles}>\n {viewMode === 'list' ? (\n <DataTable\n classNames={{ row: 'fk:h-20' }}\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n ) : (\n <AssetGrid\n columns={columnsDefinition}\n data={isInitialLoading ? [] : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoading={isInitialLoading}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n )}\n </AssetDropZone>\n ) : null}\n <Outlet />\n </div>\n );\n}\n\nfunction getLoadingColumns(columns: ColumnDef<AttributeValue, unknown>[]): ColumnDef<AttributeValue, unknown>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n }));\n}\n","'use client';\n\nimport { JSX } from 'react';\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../../ui';\nimport { Sidebar } from './sidebar';\nimport { List } from './list';\n\nexport function Root(): JSX.Element {\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"fk:h-full\">\n <ResizablePanel className=\"fk:p-3\" defaultSize=\"82%\">\n <div className=\"fk:flex fk:flex-col fk:h-full\">\n <List />\n </div>\n </ResizablePanel>\n <ResizableHandle className=\"fk:hover:bg-blue-500 fk:transition-colors\" withHandle />\n <ResizablePanel defaultSize=\"18%\" minSize=\"10%\">\n <div className=\"fk:sm:hidden fk:md:block\">\n <Sidebar />\n </div>\n </ResizablePanel>\n </ResizablePanelGroup>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/asset-manager/tag-query.ts","../src/apps/asset-manager/sidebar.tsx","../src/apps/asset-manager/data-grid/asset-drop-zone.tsx","../src/apps/asset-manager/data-grid/asset-tag-dialogs.tsx","../src/apps/asset-manager/data-grid/asset-row-actions.tsx","../src/apps/asset-manager/data-grid/asset-grid.tsx","../src/apps/asset-manager/data-grid/data-table-toolbar.tsx","../src/apps/asset-manager/data-grid/use-asset-manager-upload.ts","../src/apps/asset-manager/data-grid/view-mode.ts","../src/apps/asset-manager/list.tsx","../src/apps/asset-manager/root.tsx"],"names":["tagQueryVariables","tagQueryOptions","Sidebar","scope","useAppContext","schema","useConfig","runMutation","setMutation","setOptions","useEntityMutation","newTagName","setNewTagName","useState","isDialogOpen","setIsDialogOpen","isDeleteOpen","setIsDeleteOpen","tagToDelete","setTagToDelete","isEditOpen","setIsEditOpen","tagToEdit","setTagToEdit","editTagName","setEditTagName","isSubmitting","setIsSubmitting","isDeleting","setIsDeleting","canMutate","useCanMutate","entityName","entityNamePlural","data","isLoading","useEntityQuery","tags","item","it","handleCreate","useCallback","name","_id","mutation","getEntityCreateMutation","entityQuery","getEntityQuery","refreshQuery","gql","resolve","handleDelete","getEntityDeleteMutation","reject","error","handleRename","dataToMutate","originalData","getEntityUpdateMutation","jsxs","jsx","TagIcon","TooltipProvider","Tooltip","TooltipTrigger","Dialog","DialogTrigger","Button","PlusIcon","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","DialogFooter","Loader2","TooltipContent","PermissionTooltip","ScrollArea","tag","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","hasFileDrag","event","AssetDropZone","children","disabled","onDropFiles","dragDepthRef","useRef","isDragActive","setIsDragActive","clearDragState","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","files","TAG_UPDATE_RESPONSE_FIELDS","AssetTagDialogs","assetIds","mode","onModeChange","onCompleted","patchAssets","usePatchEntityList","selectedTagIds","setSelectedTagIds","tagsData","allTags","useMemo","resetSelection","handleOpenChange","open","applyMutationResult","patches","asset","tagNames","handleAddTags","id","handleRemoveTags","isRemove","actionLabel","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","prev","CommandSeparator","LoaderCircle","AssetRowActions","overlay","row","copiedField","setCopiedField","tagDialogMode","setTagDialogMode","dispatch","useDispatch","assetId","assetUrl","assetSchema","copyToClipboard","field","text","Fragment","EllipsisIcon","CheckIcon","CopyIcon","LinkIcon","MinusIcon","Trash2Icon","FileTypeIconCompat","FileTypeIcon","transparentImageBackground","getLoadMoreThreshold","clientHeight","formatAssetSize","bytes","AssetGrid","columns","hasMore","isLoadingMore","onLoadMore","onSortingChange","pageSize","sortingProp","toolbarComponent","scrollRef","schemaErrorMessage","useGraphQLError","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","useEffect","handleSortingChange","updater","table","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","rows","onLoadMoreRef","hasMoreRef","isLoadingMoreRef","checkLoadMore","container","scrollElement","scrollHeight","scrollTop","handleScroll","_","index","Skeleton","AssetGridCard","filename","getAssetFilename","mimeType","sizeLabel","metaLine","Checkbox","value","AssetGridMedia","isZoomOpen","setIsZoomOpen","isZoomImageLoaded","setIsZoomImageLoaded","url","isImageAsset","ext","getExtensionFromAsset","style","defaultStyles","thumbnailUrl","getAssetImageUrl","zoomUrl","handleThumbnailClick","handleZoomOpenChange","mimeTypes","ImagePlayIcon","ImageIcon","FilePlayIcon","LayersIcon","SplinePointerIcon","DataTableToolbar","isUploading","viewMode","onUploadClick","onViewModeChange","onSearchLoadingChange","onSearchWhereChange","isFiltered","projectId","useParams","search","setSearch","textWhereRef","filterWhereRef","getBaseSearchRequest","baseSearchRequest","searchQuery","setSearchQuery","results","useSearch","lastWhereRef","trimmedSearch","committedSearchQuery","isSearchPending","debouncedSetSearchQuery","debounce","query","selectedIds","t","tagOptions","emitCombinedWhere","clauses","combinedWhere","whereKey","clearSearch","handleBatchDelete","safeResults","nextWhere","r","tagClauses","orClauses","columnFiltersKey","mimeFilter","f","mimeValues","tagsFilter","tagValues","orTags","SearchIcon","ResetIcon","DataTableFacetedFilter","DataTableSortedBy","ListChecks","ToggleGroup","ToggleGroupItem","LayoutGrid","List","fn","ms","timeoutId","debounced","args","MAX_UPLOAD_BYTES","useAssetManagerUpload","uploadAssets","useUploadAssets","setIsUploading","runUpload","VIEW_MODE_STORAGE_KEY","getStoredViewMode","stored","setStoredViewMode","defaultSort","useLocation","entityId","currentProject","setSorting","setViewMode","columnsDefinition","useGridColumnsDefinition","searchWhere","setSearchWhere","isSearchLoading","setIsSearchLoading","uploadFiles","uploadFromDialog","where","whereBase","graphqlSort","primarySort","desc","entry","variables","handleViewModeChange","fetchMore","count","isProjectDisabled","isInitialLoading","rowsCount","handleLoadMore","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","DataTable","Outlet","column","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle"],"mappings":"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","file":"root-MMAJEVBH.js","sourcesContent":["// All mounted tag menus use the same operation and variables so Apollo can\n// share an in-flight request and reuse the cached result.\nexport const tagQueryVariables = { where: {}, limit: 500, offset: 0, sort: [{ name: 'ASC' }] };\nexport const tagQueryOptions = { selection: 'display' as const, includeCount: false };\n","import { JSX, useCallback, useState } from 'react';\nimport { Loader2, PlusIcon, TagIcon, Ellipsis } from 'lucide-react';\nimport {\n Button,\n Input,\n ScrollArea,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n DialogTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PermissionTooltip,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../ui';\nimport { gql } from '@apollo/client';\nimport { useAppContext } from '../../core/app-context';\nimport { useCanMutate } from '../../core/permissions';\nimport { useEntityMutation } from '../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport {\n getEntityDeleteMutation,\n getEntityCreateMutation,\n getEntityQuery,\n getEntityUpdateMutation,\n} from '../../graphql-client/queries';\nimport { useConfig } from '../../core/config/config-context';\nimport type { FormEntityItem } from '../../graphql-client/types';\n\nimport { tagQueryOptions, tagQueryVariables } from './tag-query';\n\ntype TagItem = { _id: string; name: string };\n\nexport function Sidebar(): JSX.Element {\n const { scope } = useAppContext();\n const { currentProjectSchema: schema } = useConfig();\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [newTagName, setNewTagName] = useState<string>('');\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState<boolean>(false);\n const [tagToDelete, setTagToDelete] = useState<TagItem | null>(null);\n const [isEditOpen, setIsEditOpen] = useState<boolean>(false);\n const [tagToEdit, setTagToEdit] = useState<TagItem | null>(null);\n const [editTagName, setEditTagName] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\n const canMutate = useCanMutate();\n\n const entityName = '_tag';\n const entityNamePlural = '_tags';\n const { data, isLoading } = useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const tags: TagItem[] = (Array.isArray(data) ? (data as unknown[]) : []).map((item) => {\n const it = item as { _id: string; name: string };\n return { _id: it._id, name: it.name };\n });\n\n const handleCreate = useCallback(async (): Promise<void> => {\n const name = newTagName.trim();\n\n if (!name) {\n return;\n }\n\n setIsSubmitting(true);\n const _id = typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}`;\n const entityData: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const mutation = getEntityCreateMutation(entityNamePlural, schema, entityData, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setNewTagName('');\n setIsDialogOpen(false);\n resolve();\n },\n });\n runMutation(true);\n });\n setIsSubmitting(false);\n }, [entityNamePlural, runMutation, schema, scope, setMutation, setOptions, newTagName]);\n\n const handleDelete = useCallback(\n async (_id: string): Promise<void> => {\n setIsDeleting(true);\n const mutation = getEntityDeleteMutation(entityName, schema, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: _id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n runMutation(true);\n });\n setIsDeleting(false);\n },\n [entityName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions]\n );\n\n const handleRename = useCallback(async (): Promise<void> => {\n const name = editTagName.trim();\n\n if (!name || !tagToEdit) {\n return;\n }\n\n setIsSubmitting(true);\n\n const dataToMutate: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const originalData: FormEntityItem = {};\n const mutation = getEntityUpdateMutation(\n entityNamePlural,\n tagToEdit._id,\n scope,\n schema,\n originalData,\n dataToMutate\n );\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: tagToEdit._id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setIsEditOpen(false);\n setTagToEdit(null);\n setEditTagName('');\n resolve();\n },\n });\n runMutation(true);\n });\n\n setIsSubmitting(false);\n }, [editTagName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions, tagToEdit]);\n\n return (\n <div className=\"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6\">\n <TagIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight\">Tags</span>\n {canMutate ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogTrigger asChild>\n <Button variant=\"secondary\" size=\"icon\" className=\"fk:ml-auto fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Create a new tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={newTagName}\n placeholder=\"New tag name\"\n onChange={(e) => setNewTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleCreate();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button disabled={isSubmitting} onClick={handleCreate} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Add\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add tag</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"fk:ml-auto\">\n <PermissionTooltip disabled>\n <Button disabled variant=\"secondary\" size=\"icon\" className=\"fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </PermissionTooltip>\n </div>\n )}\n </div>\n\n <ScrollArea className=\"fk:h-full\">\n <div className=\"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2\">\n {isLoading ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">Loading...</div>\n ) : tags.length === 0 ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">No tags yet</div>\n ) : (\n tags.map((tag) => (\n <div\n key={tag._id}\n className=\"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1 fk:corner-squircle\"\n >\n <span className=\"fk:text-sm\">{tag.name}</span>\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${tag.name}`}\n disabled={!canMutate}\n title={canMutate ? `Actions for ${tag.name}` : undefined}\n variant=\"ghost\"\n size=\"icon\"\n className=\"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground\"\n >\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem\n onClick={() => {\n setTagToEdit(tag);\n setEditTagName(tag.name);\n setIsEditOpen(true);\n }}\n >\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n onClick={() => {\n setTagToDelete(tag);\n setIsDeleteOpen(true);\n }}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n <Dialog open={isEditOpen} onOpenChange={setIsEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Rename an existing tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={editTagName}\n placeholder=\"Tag name\"\n onChange={(e) => setEditTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleRename();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n disabled={isSubmitting}\n variant=\"secondary\"\n onClick={() => {\n setIsEditOpen(false);\n setTagToEdit(null);\n }}\n >\n Cancel\n </Button>\n <Button disabled={isSubmitting} onClick={handleRename} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog open={isDeleteOpen} onOpenChange={setIsDeleteOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Confirm deletion of a tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:text-sm fk:text-muted-foreground\">\n Are you sure you want to delete the tag{' '}\n <span className=\"fk:font-semibold fk:text-foreground\">{tagToDelete?.name}</span>?\n </div>\n <DialogFooter>\n <Button\n disabled={isDeleting}\n variant=\"secondary\"\n onClick={() => {\n setIsDeleteOpen(false);\n setTagToDelete(null);\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isDeleting}\n variant=\"destructive\"\n onClick={() => {\n if (!tagToDelete) {\n return;\n }\n\n void (async () => {\n await handleDelete(tagToDelete._id);\n setIsDeleteOpen(false);\n setTagToDelete(null);\n })();\n }}\n >\n {isDeleting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","import { useRef, useState, type DragEvent, type JSX, type ReactNode } from 'react';\n\ninterface AssetDropZoneProps {\n children: ReactNode;\n disabled?: boolean;\n onDropFiles: (files: File[]) => void;\n}\n\nfunction hasFileDrag(event: DragEvent<HTMLDivElement>): boolean {\n return Array.from(event.dataTransfer.types).includes('Files');\n}\n\nexport function AssetDropZone({ children, disabled = false, onDropFiles }: AssetDropZoneProps): JSX.Element {\n const dragDepthRef = useRef(0);\n const [isDragActive, setIsDragActive] = useState(false);\n\n function clearDragState(): void {\n dragDepthRef.current = 0;\n setIsDragActive(false);\n }\n\n function handleDragEnter(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current += 1;\n\n if (!disabled) {\n setIsDragActive(true);\n }\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = disabled ? 'none' : 'copy';\n }\n\n function handleDragLeave(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n\n if (dragDepthRef.current === 0) {\n setIsDragActive(false);\n }\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n clearDragState();\n\n if (disabled) {\n return;\n }\n\n const files = Array.from(event.dataTransfer.files);\n\n if (files.length === 0) {\n return;\n }\n\n onDropFiles(files);\n }\n\n return (\n <div\n className=\"fk:relative fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <div className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">{children}</div>\n {isDragActive ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:inset-0 fk:z-30 fk:flex fk:items-center fk:justify-center fk:rounded-md fk:border-2 fk:border-dashed fk:border-primary fk:bg-background/80 fk:corner-squircle\"\n >\n <p className=\"fk:text-sm fk:font-medium fk:text-foreground\">Drop files to upload</p>\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useState, type JSX } from 'react';\nimport { LoaderCircle } from 'lucide-react';\nimport {\n Button,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../../ui';\nimport { gql } from '@apollo/client';\nimport { getEntityUpdateMutation } from '../../../graphql-client/queries';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useEntityMutation } from '../../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { usePatchEntityList } from '../../../graphql-client/use-patch-entity-list';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ntype TagItem = {\n _id: string;\n name: string;\n};\n\ntype WhereClause = { [key: string]: unknown };\n\ntype AssetTagMutationAsset = {\n _id?: string;\n _updatedAt?: string;\n tags?: TagItem[] | null;\n};\n\ntype AssetTagMutationData = {\n update_assets?: {\n _assets?: AssetTagMutationAsset[] | null;\n } | null;\n};\n\nexport type AssetTagDialogMode = 'add' | 'remove' | null;\n\nconst TAG_UPDATE_RESPONSE_FIELDS = `_updatedAt\n tags(limit: 3, offset: 0) {\n _id\n name\n }\n`;\n\ninterface AssetTagDialogsProps {\n assetIds: string[];\n mode: AssetTagDialogMode;\n onModeChange: (mode: AssetTagDialogMode) => void;\n onCompleted?: () => void;\n}\n\nexport function AssetTagDialogs({\n assetIds,\n mode,\n onModeChange,\n onCompleted,\n}: AssetTagDialogsProps): JSX.Element {\n const { scope } = useAppContext();\n const patchAssets = usePatchEntityList('_assets');\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const { currentProjectSchema: schema } = useConfig();\n const [selectedTagIds, setSelectedTagIds] = useState<string[]>([]);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((tag) => ({\n _id: (tag as TagItem)._id,\n name: (tag as TagItem).name,\n }));\n }, [tagsData]);\n\n const resetSelection = useCallback((): void => {\n setSelectedTagIds([]);\n }, []);\n\n const handleOpenChange = useCallback(\n (open: boolean): void => {\n if (!open && !isSubmitting) {\n onModeChange(null);\n resetSelection();\n }\n },\n [isSubmitting, onModeChange, resetSelection]\n );\n\n const applyMutationResult = useCallback(\n (data: unknown): void => {\n const assets = (data as AssetTagMutationData | null | undefined)?.update_assets?._assets ?? [];\n const patches = assets\n .filter((asset): asset is AssetTagMutationAsset & { _id: string } => typeof asset?._id === 'string')\n .map((asset) => {\n const tagNames = (Array.isArray(asset.tags) ? asset.tags : [])\n .map((tag) => tag.name)\n .filter(Boolean)\n .slice(0, 3)\n .join(', ');\n\n return {\n _id: asset._id,\n attributes: {\n tags: tagNames,\n ...(typeof asset._updatedAt === 'string' ? { _updatedAt: asset._updatedAt } : {}),\n },\n };\n });\n\n if (patches.length > 0) {\n patchAssets(patches);\n }\n },\n [patchAssets]\n );\n\n const handleAddTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n connect: selectedTagIds.map((id) => ({ _id: id })),\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const handleRemoveTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n disconnect: selectedTagIds,\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const isRemove = mode === 'remove';\n let actionLabel = isRemove ? 'Remove tag(s)' : 'Add tag(s)';\n\n if (assetIds.length > 1) {\n actionLabel = isRemove ? 'Remove tag(s) from selected assets' : 'Add tag(s) to selected assets';\n }\n\n return (\n <CommandDialog open={mode !== null} onOpenChange={handleOpenChange}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-75\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedTagIds.includes(tag._id);\n\n return (\n <CommandItem\n disabled={isSubmitting}\n key={tag._id}\n onSelect={() => {\n if (isSubmitting) {\n return;\n }\n\n setSelectedTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button\n className=\"fk:w-full\"\n disabled={selectedTagIds.length === 0 || isSubmitting}\n onClick={isRemove ? handleRemoveTags : handleAddTags}\n >\n {isSubmitting ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {actionLabel}\n </Button>\n </div>\n </CommandDialog>\n );\n}\n","import { useState, type JSX } from 'react';\nimport {\n Check as CheckIcon,\n Copy as CopyIcon,\n Ellipsis as EllipsisIcon,\n Link as LinkIcon,\n MinusIcon,\n TagIcon,\n Trash2 as Trash2Icon,\n} from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { assetSchema } from '../../../entities/assets-schema';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../../ui';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\n\ntype AssetRow = {\n _id?: string;\n url?: string | null;\n};\n\ninterface AssetRowActionsProps<TData> {\n overlay?: boolean;\n row: Row<TData>;\n}\n\nexport function AssetRowActions<TData>({ overlay = false, row }: AssetRowActionsProps<TData>): JSX.Element {\n const [copiedField, setCopiedField] = useState<'id' | 'url' | null>(null);\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const dispatch = useDispatch();\n const canMutate = useCanMutate();\n const asset = row.original as AssetRow;\n const assetId = asset._id ?? '';\n const assetUrl = asset.url ?? '';\n\n function handleDelete(): void {\n dispatch({ type: 'DeleteEntity', payload: { entityId: assetId, entityName: assetSchema.name } });\n }\n\n function copyToClipboard(field: 'id' | 'url', text: string): void {\n void navigator.clipboard.writeText(text);\n setCopiedField(field);\n window.setTimeout(() => setCopiedField(null), 1500);\n }\n\n // Pure white glyph; parent wrapper applies mix-blend-difference so it inverts over the asset.\n // A light hover fill also inverts, so the hit area reads as a contrast disc on any asset.\n const triggerClassName = overlay\n ? 'fk:flex fk:h-7 fk:w-7 fk:p-0 fk:text-white fk:group-hover:bg-background/10 fk:group-hover:text-white! fk:data-[state=open]:bg-background/15'\n : 'fk:flex fk:h-8 fk:w-8 fk:p-0 fk:data-[state=open]:bg-muted';\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className={triggerClassName} onClick={(event) => event.stopPropagation()} variant=\"ghost\">\n <EllipsisIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-45\">\n <DropdownMenuItem\n disabled={!assetId}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('id', assetId);\n }}\n >\n {copiedField === 'id' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <CopyIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy ID\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetUrl}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('url', assetUrl);\n }}\n >\n {copiedField === 'url' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <LinkIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy URL\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('add');\n }}\n >\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Add tag\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('remove');\n }}\n >\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n handleDelete();\n }}\n >\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n {tagDialogMode !== null ? (\n <AssetTagDialogs assetIds={assetId ? [assetId] : []} mode={tagDialogMode} onModeChange={setTagDialogMode} />\n ) : null}\n </>\n );\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type JSX,\n type MouseEvent,\n type ReactElement,\n type UIEvent,\n} from 'react';\nimport {\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n Table as ReactTable,\n Row,\n RowSelectionState,\n SortingState,\n Updater,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useGraphQLError } from '../../../graphql-client/graphql-context';\nimport type { AttributeValue } from '../../../graphql-client/types';\nimport {\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Skeleton,\n} from '../../../ui';\nimport { LoaderCircle } from 'lucide-react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetFilename, getAssetImageUrl, getExtensionFromAsset, isImageAsset } from './asset-url';\nimport { AssetRowActions } from './asset-row-actions';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\ntype AssetRecord = {\n _id?: string;\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n size?: number | null;\n url?: string | null;\n};\n\ninterface AssetGridProps<TData extends AttributeValue, TValue> {\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n isLoading?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n onSortingChange?: (updater: Updater<SortingState>) => void;\n pageSize?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: ReactTable<AttributeValue>) => ReactElement;\n}\n\nfunction getLoadMoreThreshold(clientHeight: number): number {\n return Math.max(600, clientHeight);\n}\n\nfunction formatAssetSize(bytes: number | null | undefined): string {\n if (bytes == null || Number.isNaN(bytes)) {\n return '';\n }\n\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function AssetGrid<TData extends AttributeValue, TValue>({\n columns,\n data,\n entityName,\n hasMore = false,\n isLoading = false,\n isLoadingMore = false,\n onLoadMore,\n onSortingChange,\n pageSize,\n sorting: sortingProp,\n toolbarComponent,\n}: AssetGridProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0 });\n }, [entityName]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` from the toolbar; keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n });\n\n const { rows } = table.getRowModel();\n\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n const { scrollHeight, scrollTop, clientHeight } = scrollElement;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n if (distanceFromBottom >= getLoadMoreThreshold(clientHeight)) {\n return;\n }\n\n onLoadMoreRef.current();\n }, []);\n\n useEffect(() => {\n checkLoadMore();\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore]);\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4\">\n {toolbarComponent ? toolbarComponent(table) : null}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1\">\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-0 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-40\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n <div\n className=\"fk:h-full fk:overflow-auto fk:pt-px fk:pb-20 fk:-ml-0.5 fk:pr-3\"\n onScroll={handleScroll}\n ref={scrollRef}\n >\n {isLoading ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3\">\n {Array.from({ length: pageSize ?? 50 }, (_, index) => (\n <div className=\"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle\" key={`skeleton-${index}`}>\n <Skeleton className=\"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle\" />\n <Skeleton className=\"fk:mt-2 fk:h-3 fk:w-[75%]\" />\n <Skeleton className=\"fk:mt-1.5 fk:h-3 fk:w-[50%]\" />\n </div>\n ))}\n </div>\n ) : null}\n {!isLoading && rows.length === 0 ? (\n <div className=\"fk:flex fk:h-24 fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground\">\n No results.\n </div>\n ) : null}\n {!isLoading && rows.length > 0 ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3\">\n {rows.map((row) => (\n <AssetGridCard key={row.id} row={row} />\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction AssetGridCard({ row }: { row: Row<AttributeValue> }): JSX.Element {\n const asset = row.original as AssetRecord;\n const filename = getAssetFilename(asset) || 'Untitled';\n const mimeType = asset.mimeType ?? '';\n const sizeLabel = formatAssetSize(asset.size);\n const isSelected = row.getIsSelected();\n const metaLine = [mimeType, sizeLabel].filter(Boolean).join(' · ');\n\n return (\n <div\n className={`fk:relative fk:rounded-md fk:border fk:p-2 fk:transition-colors ${\n isSelected\n ? 'fk:border-primary fk:ring-1 fk:ring-primary/40 fk:bg-muted/40'\n : 'fk:border-border fk:bg-background fk:hover:border-muted-foreground/30'\n } fk:corner-squircle`}\n data-state={isSelected ? 'selected' : undefined}\n >\n <div className=\"fk:absolute fk:left-3 fk:top-3 fk:z-10 fk:mix-blend-difference\">\n <Checkbox\n className=\"fk:border-white!\"\n aria-label={`Select ${filename}`}\n checked={isSelected}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n <div className=\"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference\">\n <AssetRowActions overlay row={row} />\n </div>\n <AssetGridMedia asset={asset} filename={filename} />\n <div className=\"fk:mt-2 fk:truncate fk:text-xs fk:font-medium\" title={filename}>\n {filename}\n </div>\n {metaLine ? (\n <div className=\"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground\" title={metaLine}>\n {metaLine}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction AssetGridMedia({ asset, filename }: { asset: AssetRecord; filename: string }): JSX.Element {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const [isZoomImageLoaded, setIsZoomImageLoaded] = useState(false);\n const url = asset.url ?? '';\n\n if (!url && !asset.path) {\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:corner-squircle\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">No preview</span>\n </div>\n );\n }\n\n const isImage = isImageAsset(asset);\n\n if (!isImage || !url) {\n const ext = getExtensionFromAsset(asset);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:[&>svg]:h-12 fk:[&>svg]:w-auto fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 320, height: 320 });\n const zoomUrl = url;\n\n function handleThumbnailClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n setIsZoomImageLoaded(false);\n setIsZoomOpen(true);\n }\n\n function handleZoomOpenChange(open: boolean): void {\n setIsZoomOpen(open);\n\n if (!open) {\n setIsZoomImageLoaded(false);\n }\n }\n\n return (\n <>\n <button\n className={`fk:aspect-square fk:w-full fk:cursor-zoom-in fk:overflow-hidden fk:rounded-sm fk:border-0 fk:p-0 ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n type=\"button\"\n >\n <img alt={filename} className=\"fk:h-full fk:w-full fk:object-contain\" src={thumbnailUrl} />\n </button>\n <Dialog open={isZoomOpen} onOpenChange={handleZoomOpenChange}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <div className=\"fk:relative fk:flex fk:h-[min(85vh,56rem)] fk:w-full fk:items-center fk:justify-center fk:overflow-hidden fk:rounded-md fk:corner-squircle\">\n {!isZoomImageLoaded ? (\n <LoaderCircle\n aria-label=\"Loading image\"\n className=\"fk:absolute fk:h-8 fk:w-8 fk:animate-spin fk:text-muted-foreground\"\n />\n ) : null}\n <img\n alt={filename}\n className={`fk:max-h-full fk:max-w-full fk:object-contain fk:transition-opacity ${\n isZoomImageLoaded ? 'fk:opacity-100' : 'fk:opacity-0'\n }`}\n onError={() => setIsZoomImageLoaded(true)}\n onLoad={() => setIsZoomImageLoaded(true)}\n src={zoomUrl}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","'use client';\n\nimport { JSX, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FilePlayIcon,\n ImageIcon,\n ImagePlayIcon,\n LayersIcon,\n LayoutGrid,\n List,\n ListChecks,\n MinusIcon,\n SplinePointerIcon,\n TagIcon,\n Trash2Icon,\n LoaderCircle,\n Search as SearchIcon,\n X as ResetIcon,\n} from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport type { Table as ReactTable } from '@tanstack/react-table';\nimport type { SearchRequestProps } from '../../../core/types';\nimport { DataTableFacetedFilter } from '../../../data-grid/data-table-faceted-filter';\nimport { DataTableSortedBy } from '../../../data-grid/data-table-sorted-by';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useSearch } from '../../../core/use-search';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n PermissionTooltip,\n ToggleGroup,\n ToggleGroupItem,\n} from '../../../ui';\nimport type { AssetViewMode } from './view-mode';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isUploading?: boolean;\n table: ReactTable<TData>;\n viewMode: AssetViewMode;\n onUploadClick?: () => void;\n onViewModeChange: (mode: AssetViewMode) => void;\n onSearchLoadingChange?: (isLoading: boolean) => void;\n onSearchWhereChange?: (where: WhereClause) => void;\n}\n\ntype WhereClause = { [key: string]: unknown };\n\nconst mimeTypes = [\n {\n value: 'image/gif',\n label: 'GIF',\n icon: ImagePlayIcon,\n },\n {\n value: 'image/jpeg',\n label: 'JPEG',\n icon: ImageIcon,\n },\n {\n value: 'video/mp4',\n label: 'MP4',\n icon: FilePlayIcon,\n },\n {\n value: 'image/png',\n label: 'PNG',\n icon: LayersIcon,\n },\n {\n value: 'image/svg+xml',\n label: 'SVG',\n icon: SplinePointerIcon,\n },\n {\n value: 'image/webp',\n label: 'WebP',\n icon: ImageIcon,\n },\n];\n\nexport function DataTableToolbar<TData>({\n entityName,\n isUploading = false,\n table,\n viewMode,\n onUploadClick,\n onViewModeChange,\n onSearchLoadingChange,\n onSearchWhereChange,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0;\n const { projectId } = useParams();\n const dispatch = useDispatch();\n const { scope } = useAppContext();\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const { currentProjectSchema: schema } = useConfig();\n const canMutate = useCanMutate();\n const [search, setSearch] = useState('');\n const textWhereRef = useRef<WhereClause>({});\n const filterWhereRef = useRef<WhereClause>({});\n\n function getBaseSearchRequest(): SearchRequestProps {\n return {\n searchRequests: {\n searches: [{ collection: '_assets' }, { collection: '_tags' }],\n },\n commonParams: { q: '' },\n };\n }\n\n const baseSearchRequest = useMemo(() => getBaseSearchRequest(), []);\n const [searchQuery, setSearchQuery] = useState<SearchRequestProps>(baseSearchRequest);\n const { results, isLoading } = useSearch(projectId ?? '', searchQuery);\n const lastWhereRef = useRef<string>('');\n const trimmedSearch = search.trim();\n const committedSearchQuery = searchQuery.commonParams.q ?? '';\n const isSearchPending = trimmedSearch.length > 0 && (isLoading || committedSearchQuery !== trimmedSearch);\n\n const debouncedSetSearchQuery = useMemo(\n () =>\n debounce((query: string) => {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: query } });\n }, 300),\n [baseSearchRequest]\n );\n\n useEffect(() => {\n return () => {\n debouncedSetSearchQuery.cancel();\n };\n }, [debouncedSetSearchQuery]);\n\n // Collect selected entity ids from the table\n const selectedIds: string[] = table\n .getSelectedRowModel()\n .rows.map((row) => (row.original as unknown as { _id: string })._id);\n\n // Load tags for the selector (full tags collection, not derived from loaded assets)\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((t) => ({ _id: (t as { _id: string })._id, name: (t as { name: string }).name }));\n }, [tagsData]);\n\n const tagOptions = useMemo(() => {\n return allTags.map((t) => ({ value: t._id, label: t.name }));\n }, [allTags]);\n\n const emitCombinedWhere = useCallback((): void => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const clauses: WhereClause[] = [];\n\n if (Object.keys(textWhereRef.current).length > 0) {\n clauses.push(textWhereRef.current);\n }\n\n if (Object.keys(filterWhereRef.current).length > 0) {\n clauses.push(filterWhereRef.current);\n }\n\n const combinedWhere = clauses.length === 0 ? {} : clauses.length === 1 ? clauses[0] : { AND: clauses };\n const whereKey = JSON.stringify(combinedWhere);\n\n if (lastWhereRef.current !== whereKey) {\n lastWhereRef.current = whereKey;\n onSearchWhereChange(combinedWhere);\n }\n }, [onSearchWhereChange]);\n\n function clearSearch(): void {\n debouncedSetSearchQuery.cancel();\n setSearch('');\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n textWhereRef.current = {};\n emitCombinedWhere();\n }\n\n async function handleBatchDelete(): Promise<void> {\n dispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} asset${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected assets? They will be deleted permanently.`\n : `Are you sure you want to delete the selected asset? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionCancel: () => {},\n dialogActionSubmit: () => {\n // One DeleteEntity action → one GraphQL mutation with `_id: { in: [...] }`.\n dispatch({\n type: 'DeleteEntity',\n _id: `delete-batch-${Date.now()}`,\n payload: { entityId: selectedIds, entityName, silent: true },\n });\n\n table.resetRowSelection();\n },\n },\n },\n });\n }\n\n useEffect(() => {\n onSearchLoadingChange?.(isSearchPending);\n }, [isSearchPending, onSearchLoadingChange]);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n if (trimmedSearch.length === 0) {\n textWhereRef.current = {};\n emitCombinedWhere();\n\n return;\n }\n\n // Wait for debounce + search results before applying text filters (avoids empty-table flash).\n if (isSearchPending) {\n return;\n }\n\n const safeResults = results ?? [];\n let nextWhere: WhereClause = {};\n\n if (safeResults.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else {\n // Prefer `_id: { in: [...] }` over one OR-eq per hit. Large OR trees break\n // offset pagination and were re-triggering endless fetchMore requests.\n const assetIds = safeResults.filter((r) => r._entityNamePlural === '_assets').map((r) => r._id);\n const tagClauses = safeResults\n .filter((r) => r._entityNamePlural === '_tags')\n .map((r) => ({ tags: { some: { _id: { eq: r._id } } } }));\n\n const orClauses: WhereClause[] = [];\n\n if (assetIds.length > 0) {\n orClauses.push({ _id: { in: assetIds } });\n }\n\n orClauses.push(...tagClauses);\n\n if (orClauses.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else if (orClauses.length === 1) {\n nextWhere = orClauses[0] as WhereClause;\n } else {\n nextWhere = { OR: orClauses };\n }\n }\n\n textWhereRef.current = nextWhere;\n emitCombinedWhere();\n }, [emitCombinedWhere, isSearchPending, onSearchWhereChange, results, trimmedSearch]);\n\n // Watch column filter changes (e.g., mime type) and push server-side where\n const columnFiltersKey = JSON.stringify(table.getState().columnFilters);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const mimeFilter = table.getState().columnFilters.find((f) => f.id === 'mimeType');\n const mimeValues = (Array.isArray(mimeFilter?.value) ? (mimeFilter?.value as unknown[]) : []) as string[];\n\n const tagsFilter = table.getState().columnFilters.find((f) => f.id === 'tags');\n const tagValues = (Array.isArray(tagsFilter?.value) ? (tagsFilter?.value as unknown[]) : []) as string[];\n\n const clauses: WhereClause[] = [];\n\n if (mimeValues.length > 0) {\n clauses.push({ mimeType: { in: mimeValues } } as WhereClause);\n }\n\n if (tagValues.length > 0) {\n const orTags = tagValues.map((id) => ({ tags: { some: { _id: { eq: id } } } }));\n clauses.push(orTags.length === 1 ? orTags[0] : { OR: orTags });\n }\n\n if (clauses.length === 0) {\n filterWhereRef.current = {};\n } else if (clauses.length === 1) {\n filterWhereRef.current = clauses[0] as WhereClause;\n } else {\n filterWhereRef.current = { AND: clauses } as WhereClause;\n }\n\n emitCombinedWhere();\n }, [columnFiltersKey, emitCombinedWhere, onSearchWhereChange, table]);\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between fk:pr-3\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n <div className=\"fk:relative\">\n {isLoading ? (\n <LoaderCircle className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <Input\n placeholder=\"Search assets...\"\n name=\"search-assets\"\n value={search}\n onChange={(e) => {\n const { value } = e.target;\n setSearch(value);\n\n if (value.trim().length === 0) {\n clearSearch();\n\n return;\n }\n\n debouncedSetSearchQuery(value.trim());\n }}\n className=\"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7\"\n />\n {search ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle\"\n onClick={clearSearch}\n type=\"button\"\n >\n <ResetIcon className=\"fk:h-4 fk:w-4\" />\n </Button>\n ) : null}\n </div>\n {table.getColumn('mimeType') && (\n <DataTableFacetedFilter column={table.getColumn('mimeType')} options={mimeTypes} title=\"File type\" />\n )}\n {table.getColumn('tags') && (\n <DataTableFacetedFilter column={table.getColumn('tags')} options={tagOptions} title=\"Tags\" />\n )}\n {isFiltered && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n table.resetColumnFilters();\n filterWhereRef.current = {};\n emitCombinedWhere();\n }}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3\"\n >\n Reset\n <ResetIcon className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n )}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8 fk:mr-2 fk:lg:flex\" disabled={!canMutate} size=\"sm\" variant=\"secondary\">\n Actions <ListChecks className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[240px]\">\n <DropdownMenuItem onClick={() => setTagDialogMode('add')}>\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Add tag\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTagDialogMode('remove')}>\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleBatchDelete} className=\"fk:text-destructive\">\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Delete asset{selectedIds.length > 1 ? 's' : ''} (\n {selectedIds.length})\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-2\">\n <ToggleGroup\n size=\"sm\"\n type=\"single\"\n value={viewMode}\n onValueChange={(value) => {\n if (value === 'list' || value === 'grid') {\n onViewModeChange(value);\n }\n }}\n >\n <ToggleGroupItem aria-label=\"Grid view\" value=\"grid\">\n <LayoutGrid className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem aria-label=\"List view\" value=\"list\">\n <List className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n <PermissionTooltip disabled={!canMutate}>\n <Button\n aria-busy={isUploading}\n className=\"fk:h-8 fk:lg:flex\"\n disabled={!canMutate || isUploading}\n onClick={onUploadClick}\n size=\"sm\"\n variant=\"default\"\n >\n {isUploading ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n Upload assets\n </Button>\n </PermissionTooltip>\n </div>\n\n {tagDialogMode !== null ? (\n <AssetTagDialogs\n assetIds={selectedIds}\n mode={tagDialogMode}\n onCompleted={() => table.resetRowSelection()}\n onModeChange={setTagDialogMode}\n />\n ) : null}\n </div>\n );\n}\n\ntype DebouncedFn<TArgs extends unknown[]> = ((...args: TArgs) => void) & {\n cancel: () => void;\n};\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300): DebouncedFn<TArgs> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = function (this: unknown, ...args: TArgs) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n fn.apply(this, args);\n }, ms);\n } as DebouncedFn<TArgs>;\n\n debounced.cancel = () => {\n if (timeoutId === undefined) {\n return;\n }\n\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n return debounced;\n}\n","import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useUploadAssets } from '../../../core/upload';\n\nconst MAX_UPLOAD_BYTES = 4 * 1024 * 1024;\n\nexport function useAssetManagerUpload(): {\n canMutate: boolean;\n isUploading: boolean;\n uploadFiles: (files: File[]) => Promise<void>;\n uploadFromDialog: () => Promise<void>;\n} {\n const { projectId } = useParams();\n const uploadAssets = useUploadAssets();\n const canMutate = useCanMutate();\n const [isUploading, setIsUploading] = useState(false);\n\n async function runUpload(files?: File[]): Promise<void> {\n if (!canMutate || isUploading) {\n return;\n }\n\n if (files && files.length === 0) {\n return;\n }\n\n try {\n await uploadAssets({\n files,\n maxBytes: MAX_UPLOAD_BYTES,\n multiple: true,\n onUploadStart: () => {\n setIsUploading(true);\n },\n projectId,\n });\n } finally {\n setIsUploading(false);\n }\n }\n\n return {\n canMutate,\n isUploading,\n uploadFiles: (files) => runUpload(files),\n uploadFromDialog: () => runUpload(),\n };\n}\n","export type AssetViewMode = 'list' | 'grid';\n\nconst VIEW_MODE_STORAGE_KEY = 'flexkit-asset-manager:viewMode';\n\nexport function getStoredViewMode(): AssetViewMode {\n if (typeof localStorage === 'undefined') {\n return 'grid';\n }\n\n try {\n const stored = localStorage.getItem(VIEW_MODE_STORAGE_KEY);\n\n if (stored === 'list' || stored === 'grid') {\n return stored;\n }\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n\n return 'grid';\n}\n\nexport function setStoredViewMode(mode: AssetViewMode): void {\n if (typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n localStorage.setItem(VIEW_MODE_STORAGE_KEY, mode);\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n}\n","import { useCallback, useMemo, useState, type JSX } from 'react';\nimport { useLocation, Outlet } from 'react-router-dom';\nimport type { ColumnDef, SortingState, Updater } from '@tanstack/react-table';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { DataTable } from '../../data-grid/data-table';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton } from '../../ui';\nimport { AssetDropZone } from './data-grid/asset-drop-zone';\nimport { AssetGrid } from './data-grid/asset-grid';\nimport { DataTableToolbar } from './data-grid/data-table-toolbar';\nimport { AssetRowActions } from './data-grid/asset-row-actions';\nimport { useAssetManagerUpload } from './data-grid/use-asset-manager-upload';\nimport { getStoredViewMode, setStoredViewMode, type AssetViewMode } from './data-grid/view-mode';\n\ntype WhereClause = { [key: string]: unknown };\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\n\nexport function List(): JSX.Element {\n const entityName = '_assets';\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const [sorting, setSorting] = useState<SortingState>([]);\n const [viewMode, setViewMode] = useState<AssetViewMode>(() => getStoredViewMode());\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: assetSchema.attributes,\n actionsComponent: (row) => <AssetRowActions row={row} />,\n checkboxSelect: 'multiple',\n enableColumnSorting: true,\n });\n\n const [searchWhere, setSearchWhere] = useState<WhereClause>({});\n const [isSearchLoading, setIsSearchLoading] = useState(false);\n const { canMutate, isUploading, uploadFiles, uploadFromDialog } = useAssetManagerUpload();\n\n const where = useMemo(() => {\n const whereBase = entityId ? { _id: { eq: entityId } } : { NOT: { path: { eq: null } } };\n\n if (!searchWhere || Object.keys(searchWhere).length === 0) {\n return whereBase;\n }\n\n if (entityId) {\n return whereBase; // ignore search when a single asset is selected via id\n }\n\n return { AND: [whereBase, searchWhere] } as WhereClause;\n }, [entityId, searchWhere]);\n\n const graphqlSort = useMemo(() => {\n if (sorting.length === 0) {\n return defaultSort;\n }\n\n const primarySort = sorting.map(({ id, desc }) => ({ [id]: desc ? 'DESC' : 'ASC' }));\n const hasIdSort = primarySort.some((entry) => '_id' in entry);\n\n if (hasIdSort) {\n return primarySort;\n }\n\n // Tie-break so offset pages stay stable when sort values collide.\n return [...primarySort, { _id: 'DESC' }];\n }, [sorting]);\n\n const variables = useMemo(() => ({ where, offset: 0, limit: pageSize, sort: graphqlSort }), [where, graphqlSort]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n setSorting(updater);\n }\n\n function handleViewModeChange(mode: AssetViewMode): void {\n setViewMode(mode);\n setStoredViewMode(mode);\n }\n\n const { isLoading, isLoadingMore, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n selection: 'list',\n });\n\n const isInitialLoading = isSearchLoading || (isLoading && (data == null || data.length === 0));\n\n const rowsCount = data?.length ?? 0;\n const hasMore = !isSearchLoading && count > 0 && rowsCount > 0 && rowsCount < count;\n\n const handleLoadMore = useCallback(() => {\n fetchMore({\n variables: {\n // Offset is tracked inside useEntityQuery from page windows; value here is ignored.\n offset: 0,\n limit: pageSize,\n },\n });\n }, [fetchMore]);\n\n const loadingData = useMemo(\n () => Array.from({ length: pageSize }, (_, index) => ({ _id: `loading-${index}` }) as AttributeValue),\n []\n );\n const loadingColumns = useMemo(() => getLoadingColumns(columnsDefinition), [columnsDefinition]);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <SchemaError />\n <div className=\"fk:mb-4 fk:flex fk:items-center fk:gap-2 fk:pr-3\">\n <h2 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Asset Manager</h2>\n {!isInitialLoading ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {count.toLocaleString()} {count === 1 ? 'record' : 'records'}\n </span>\n ) : null}\n </div>\n {!schemaErrorMessage ? (\n <AssetDropZone disabled={!canMutate || isUploading} onDropFiles={uploadFiles}>\n {viewMode === 'list' ? (\n <DataTable\n classNames={{ row: 'fk:h-20' }}\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n ) : (\n <AssetGrid\n columns={columnsDefinition}\n data={isInitialLoading ? [] : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoading={isInitialLoading}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n )}\n </AssetDropZone>\n ) : null}\n <Outlet />\n </div>\n );\n}\n\nfunction getLoadingColumns(columns: ColumnDef<AttributeValue, unknown>[]): ColumnDef<AttributeValue, unknown>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n }));\n}\n","'use client';\n\nimport { JSX } from 'react';\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../../ui';\nimport { Sidebar } from './sidebar';\nimport { List } from './list';\n\nexport function Root(): JSX.Element {\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"fk:h-full\">\n <ResizablePanel className=\"fk:p-3\" defaultSize=\"82%\">\n <div className=\"fk:flex fk:flex-col fk:h-full\">\n <List />\n </div>\n </ResizablePanel>\n <ResizableHandle className=\"fk:hover:bg-blue-500 fk:transition-colors\" withHandle />\n <ResizablePanel defaultSize=\"18%\" minSize=\"10%\">\n <div className=\"fk:sm:hidden fk:md:block\">\n <Sidebar />\n </div>\n </ResizablePanel>\n </ResizablePanelGroup>\n );\n}\n"]}