@comitor/ui 3.5.0 → 3.6.1

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 (51) hide show
  1. package/README.md +4 -2
  2. package/dist/data-grid/data-grid-cell-variants.js +6 -1
  3. package/dist/data-grid/data-grid-cell-variants.js.map +1 -1
  4. package/dist/data-grid/types.d.ts +10 -0
  5. package/dist/data-grid/use-data-grid.d.ts +2 -2
  6. package/dist/data-grid/use-data-grid.js +30 -13
  7. package/dist/data-grid/use-data-grid.js.map +1 -1
  8. package/dist/editor/bubble-toolbar.d.ts +20 -1
  9. package/dist/editor/bubble-toolbar.js +12 -172
  10. package/dist/editor/bubble-toolbar.js.map +1 -1
  11. package/dist/editor/editor-core.d.ts +28 -0
  12. package/dist/editor/editor-core.js +354 -0
  13. package/dist/editor/editor-core.js.map +1 -0
  14. package/dist/editor/editor-types.d.ts +3 -0
  15. package/dist/editor/editor-types.js +1 -0
  16. package/dist/editor/editor-types.js.map +1 -0
  17. package/dist/editor/fixed-toolbar.d.ts +19 -0
  18. package/dist/editor/fixed-toolbar.js +106 -0
  19. package/dist/editor/fixed-toolbar.js.map +1 -0
  20. package/dist/editor/image-upload.d.ts +3 -57
  21. package/dist/editor/image-upload.js +3 -2
  22. package/dist/editor/image-upload.js.map +1 -1
  23. package/dist/editor/index.d.ts +3 -2
  24. package/dist/editor/index.js +4 -4
  25. package/dist/editor/index.js.map +1 -1
  26. package/dist/editor/markdown-editor-classes.js +6 -4
  27. package/dist/editor/markdown-editor-classes.js.map +1 -1
  28. package/dist/editor/markdown-editor-constants.d.ts +8 -2
  29. package/dist/editor/markdown-editor-constants.js.map +1 -1
  30. package/dist/editor/markdown-editor.d.ts +14 -91
  31. package/dist/editor/markdown-editor.js +23 -315
  32. package/dist/editor/markdown-editor.js.map +1 -1
  33. package/dist/editor/markdown-extensions.d.ts +40 -15
  34. package/dist/editor/markdown-extensions.js +143 -24
  35. package/dist/editor/markdown-extensions.js.map +1 -1
  36. package/dist/editor/rich-text-editor.d.ts +48 -0
  37. package/dist/editor/rich-text-editor.js +33 -0
  38. package/dist/editor/rich-text-editor.js.map +1 -0
  39. package/dist/editor/slash-commands.d.ts +4 -1
  40. package/dist/editor/slash-commands.js +7 -2
  41. package/dist/editor/slash-commands.js.map +1 -1
  42. package/dist/editor/toolbar-actions.d.ts +44 -0
  43. package/dist/editor/toolbar-actions.js +173 -0
  44. package/dist/editor/toolbar-actions.js.map +1 -0
  45. package/dist/editor/toolbar-button.d.ts +15 -0
  46. package/dist/editor/toolbar-button.js +47 -0
  47. package/dist/editor/toolbar-button.js.map +1 -0
  48. package/dist/editor-types-BMST7-VR.d.ts +171 -0
  49. package/dist/i18n/namespaces/markdown-editor.js +6 -0
  50. package/dist/i18n/namespaces/markdown-editor.js.map +1 -1
  51. package/package.json +1 -1
package/README.md CHANGED
@@ -129,7 +129,7 @@ Package có **8 entry**, tách theo peer optional mà mỗi tầng kéo theo:
129
129
  | `@comitor/ui/chart` | Lớp shadcn bọc recharts + `Comitor*Chart` + `CHART_COLORS` | `recharts` (~100KB) |
130
130
  | `@comitor/ui/data-grid` | `DataGrid` — lưới sửa trực tiếp kiểu bảng tính: ảo hoá dòng, chọn vùng bằng bàn phím, copy/paste với Excel, ghim cột, lọc/sắp xếp nhiều tiêu chí, hoàn tác/làm lại | `@tanstack/react-table` (peer); kèm `@tanstack/react-virtual` + `@dnd-kit/*` (dependency của gói) |
131
131
  | `@comitor/ui/uploader` | `FileUpload` (tệp tài liệu) · `ImageUploadField` (ảnh đại diện, logo) · `useFileUpload` | `@uppy/core`, `@uppy/xhr-upload` (~13KB gzip) |
132
- | `@comitor/ui/editor` | `MarkdownEditor` — trình soạn kiểu Linear, lưu bằng markdown: gõ tắt, menu `/`, `@` nhắc người, thanh định dạng nổi, ảnh, bảng, khối mã tô màu | `@tiptap/*` + `lowlight` (~234KB gzip — nạp lười nếu trang không cần ngay) |
132
+ | `@comitor/ui/editor` | `MarkdownEditor` — trình soạn kiểu Linear, lưu bằng markdown · `RichTextEditor` — lưu HTML, thanh công cụ cố định kiểu CMS. Chung: gõ tắt, menu `/`, `@` nhắc người, ảnh, bảng, khối mã tô màu, `toolbar="bubble" \| "fixed"` | `@tiptap/*` + `lowlight` (~234KB gzip — nạp lười nếu trang không cần ngay) |
133
133
  | `@comitor/ui/form` | Binding shadcn ⇄ react-hook-form | `react-hook-form` |
134
134
  | `@comitor/ui/tokens` | Token dạng object TS — cho nơi không có Tailwind: canvas, email HTML, PDF | không có |
135
135
 
@@ -187,7 +187,7 @@ riêng kèm demo, bảng prop và cạm bẫy của nó:
187
187
  | **chart** · 4 file · `@comitor/ui/chart` | Lớp shadcn bọc recharts, cùng ba bản dựng sẵn theo brand. ⚠ Ba wrapper `Comitor*Chart` **mặc định TẮT** hiệu ứng vẽ dần (`isAnimationActive = false`) — bật lại là biểu đồ kẹt ở khung đầu: có trục, có lưới, KHÔNG có dữ liệu. Mặc định đó KHÔNG áp cho `<ChartContainer>` + recharts do app tự lắp | https://design-system.comitor.ai/components/chart |
188
188
  | **data-grid** · 32 file · `@comitor/ui/data-grid` | `DataGrid` — lưới sửa trực tiếp kiểu bảng tính, cho màn nhập liệu hàng loạt. Port từ [tablecn](https://www.tablecn.com/data-grid) (MIT) sang primitive + token của gói. ⚠ Là tầng DUY NHẤT có peer **`@tanstack/react-table`**, có thêm prop `locale` riêng (xem dưới), và mọi thứ trong nó là client component | [docs/data-grid.md](docs/data-grid.md) |
189
189
  | **uploader** · 5 file · `@comitor/ui/uploader` | `FileUpload` (tệp) · `ImageUploadField` (ảnh) · `useFileUpload` — kéo thả, xem trước, tiến độ. Peer optional: `@uppy/core` + `@uppy/xhr-upload` | https://design-system.comitor.ai/components |
190
- | **editor** · 11 file · `@comitor/ui/editor` | `MarkdownEditor` — soạn trực tiếp trên bản đã định dạng, giá trị vào/ra là markdown (GFM). Dựng trên Tiptap 3 (ProseMirror). ⚠ Định dạng LƯU là hợp đồng: nhắc người là `[@Tên](mention:<id>)`, ảnh lưu `src` app trả về (không phải URL đã ký), gạch chân cố ý không có. Peer optional: bộ `@tiptap/*` + `lowlight` | [docs/editor.md](docs/editor.md) |
190
+ | **editor** · 17 file · `@comitor/ui/editor` | `MarkdownEditor` — soạn trực tiếp trên bản đã định dạng, giá trị vào/ra là markdown (GFM); `RichTextEditor` — cùng lõi, giá trị là HTML, lược đồ có thêm gạch chân và ô bảng nhiều khối, mặc định thanh cố định. Dựng trên Tiptap 3 (ProseMirror). ⚠ Định dạng LƯU là hợp đồng: nhắc người là `[@Tên](mention:<id>)` / `<span data-type="mention">`, ảnh lưu `src` app trả về (không phải URL đã ký), markdown cố ý không có gạch chân. ⚠ HTML đã lưu hiển thị lại bằng `RichTextEditor editable={false}`, không `dangerouslySetInnerHTML`. Peer optional: bộ `@tiptap/*` + `lowlight` | [docs/editor.md](docs/editor.md) |
191
191
  | **form** · `@comitor/ui/form` | Binding shadcn ⇄ react-hook-form | https://design-system.comitor.ai/components/form |
192
192
 
193
193
  **Ngôn ngữ — mặc định TIẾNG ANH, tiếng Việt dựng sẵn (từ `3.0.0`).** Mọi chuỗi hiển thị của gói —
@@ -313,6 +313,8 @@ Mỗi bản publish đi qua cùng một chuỗi cổng (`prepublishOnly` nối c
313
313
  - **`test:editor-markdown`** — markdown là định dạng LƯU của `MarkdownEditor`, nên phép đo là tài liệu →
314
314
  markdown → tài liệu phải ra đúng tài liệu ban đầu, trên CHÍNH lược đồ trong `dist/`. Lỗi loại này không lộ
315
315
  ra lúc gõ mà ở lần mở sau. Trên lược đồ gốc của Tiptap (chưa vá) cổng trượt 16/46 — [docs/editor.md](docs/editor.md) §5.
316
+ Từ `3.6.0` nó canh cả lược đồ HTML của `RichTextEditor`: thứ GHI xuống (`src` gốc, tên chụp) không được lẫn
317
+ thứ chỉ để VẼ (URL đã ký, tên sống).
316
318
  - **`test:a11y-gate`** tự kiểm chính cổng màu (cổng còn bắt đủ không); **`test:nav-active`** khoá
317
319
  toàn bộ luật active matching của sidebar dưới dạng hàm thuần (§4.1).
318
320
  - **`test:grid-render`** render THẬT `DataGrid` bằng `react-dom/server` rồi soi HTML ra được. Nó
@@ -742,7 +742,12 @@ function SelectCell({
742
742
  const [value, setValue] = React.useState(initialValue);
743
743
  const containerRef = React.useRef(null);
744
744
  const cellOpts = cell.column.columnDef.meta?.cell;
745
+ const rowId = cell.row.id;
745
746
  const options = React.useMemo(() => cellOpts?.variant === "select" ? cellOpts.options : [], [cellOpts]);
747
+ const editOptions = React.useMemo(
748
+ () => isEditing && cellOpts?.variant === "select" ? cellOpts.getOptions?.(rowId) ?? options : options,
749
+ [isEditing, cellOpts, rowId, options]
750
+ );
746
751
  const optionByValue = React.useMemo(() => new Map(options.map((option) => [option.value, option])), [options]);
747
752
  const prevInitialValueRef = React.useRef(initialValue);
748
753
  if (initialValue !== prevInitialValueRef.current) {
@@ -825,7 +830,7 @@ function SelectCell({
825
830
  alignOffset: -8,
826
831
  sideOffset: -8,
827
832
  className: "min-w-[calc(var(--radix-select-trigger-width)+16px)]",
828
- children: /* @__PURE__ */ jsx(SelectGroup, { children: options.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: renderValue ? renderValue(option.value, option) : option.label }, option.value)) })
833
+ children: /* @__PURE__ */ jsx(SelectGroup, { children: editOptions.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: renderValue ? renderValue(option.value, option) : option.label }, option.value)) })
829
834
  }
830
835
  )
831
836
  ] }) : value && renderValue ? (
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data-grid/data-grid-cell-variants.tsx"],"sourcesContent":["\"use client\";\n\nimport { Check, Upload, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Badge, badgeVariants } from \"../components/ui/badge.js\";\nimport { Button } from \"../components/ui/button.js\";\nimport { Calendar } from \"../components/ui/calendar.js\";\nimport { Checkbox } from \"../components/ui/checkbox.js\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator\n} from \"../components/ui/command.js\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"../components/ui/popover.js\";\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from \"../components/ui/select.js\";\nimport { Skeleton } from \"../components/ui/skeleton.js\";\nimport { Textarea } from \"../components/ui/textarea.js\";\nimport { cn } from \"../lib/cn.js\";\nimport { DataGridCellWrapper } from \"./data-grid-cell-wrapper.js\";\nimport { useDataGridDateLocale, useDataGridMessages } from \"./data-grid-locale.js\";\nimport { toastError, toastMessage } from \"./toast.js\";\nimport type { DataGridCellProps, FileCellData } from \"./types.js\";\nimport { useBadgeOverflow } from \"./use-badge-overflow.js\";\nimport { useDebouncedCallback } from \"./use-debounced-callback.js\";\nimport {\n formatDateForDisplay,\n formatDateToString,\n formatFileSize,\n generateFileId,\n getCellKey,\n getFileIcon,\n getLineCount,\n getUrlHref,\n parseLocalDate\n} from \"./utils.js\";\n\nexport function ShortTextCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isEditing,\n isFocused,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue);\n const cellRef = React.useRef<HTMLDivElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const prevIsEditingRef = React.useRef(false);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue);\n if (cellRef.current && !isEditing) {\n cellRef.current.textContent = initialValue;\n }\n }\n\n const onBlur = React.useCallback(() => {\n // Read the current value directly from the DOM to avoid stale state\n const currentValue = cellRef.current?.textContent ?? \"\";\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, rowIndex, columnId, initialValue, readOnly]);\n\n const onInput = React.useCallback((event: React.FormEvent<HTMLDivElement>) => {\n const currentValue = event.currentTarget.textContent ?? \"\";\n setValue(currentValue);\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Enter\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent ?? \"\";\n if (currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue\n });\n }\n tableMeta?.onCellEditingStop?.({ moveToNextRow: true });\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent ?? \"\";\n if (currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue\n });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue);\n cellRef.current?.blur();\n }\n } else if (isFocused && !readOnly && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Handle typing to pre-fill the value when editing starts.\n // ⚠ Khác bản gốc (3.1.0): `!readOnly` như `LongTextCell` / `UrlCell` đã có. Thiếu nó, gõ một\n // chữ lên ô chỉ đọc (lưới `readOnly`, hay cột `meta.readOnly`) không mở trình sửa và không\n // ghi dữ liệu, nhưng vẫn THAY chữ đang hiện trong ô bằng phím vừa gõ.\n setValue(event.key);\n\n queueMicrotask(() => {\n if (cellRef.current && cellRef.current.contentEditable === \"true\") {\n cellRef.current.textContent = event.key;\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n },\n [isEditing, isFocused, readOnly, initialValue, tableMeta, rowIndex, columnId]\n );\n\n React.useEffect(() => {\n const wasEditing = prevIsEditingRef.current;\n prevIsEditingRef.current = isEditing;\n\n if (isEditing && !wasEditing && cellRef.current) {\n cellRef.current.focus();\n\n if (!cellRef.current.textContent && value) {\n cellRef.current.textContent = value;\n }\n\n if (cellRef.current.textContent) {\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n }\n }, [isEditing, value]);\n\n const displayValue = !isEditing ? (value ?? \"\") : \"\";\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n <div\n role=\"textbox\"\n data-slot=\"grid-cell-content\"\n contentEditable={isEditing}\n tabIndex={-1}\n ref={cellRef}\n onBlur={onBlur}\n onInput={onInput}\n suppressContentEditableWarning\n className={cn(\"size-full overflow-hidden outline-none\", {\n \"whitespace-nowrap [&_*]:inline [&_*]:whitespace-nowrap [&_br]:hidden\": isEditing\n })}\n >\n {displayValue}\n </div>\n </DataGridCellWrapper>\n );\n}\n\nexport function LongTextCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue ?? \"\");\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const pendingCharRef = React.useRef<string | null>(null);\n const sideOffset = -(containerRef.current?.clientHeight ?? 0);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue ?? \"\");\n }\n\n const debouncedSave = useDebouncedCallback((newValue: string) => {\n if (!readOnly) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValue });\n }\n }, 300);\n\n const onSave = React.useCallback(() => {\n // Immediately save any pending changes and close the popover\n if (!readOnly && value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, value, initialValue, rowIndex, columnId, readOnly]);\n\n const onCancel = React.useCallback(() => {\n // Restore the original value\n setValue(initialValue ?? \"\");\n if (!readOnly) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: initialValue });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, initialValue, rowIndex, columnId, readOnly]);\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n // Immediately save any pending changes when closing\n if (!readOnly && value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, value, initialValue, rowIndex, columnId, readOnly]\n );\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onOpenAutoFocus\"]> =\n React.useCallback((event) => {\n event.preventDefault();\n if (textareaRef.current) {\n textareaRef.current.focus();\n const length = textareaRef.current.value.length;\n textareaRef.current.setSelectionRange(length, length);\n\n // Insert pending character using execCommand so it's part of undo history\n // Use requestAnimationFrame to ensure focus has fully settled\n if (pendingCharRef.current) {\n const char = pendingCharRef.current;\n pendingCharRef.current = null;\n requestAnimationFrame(() => {\n if (textareaRef.current && document.activeElement === textareaRef.current) {\n document.execCommand(\"insertText\", false, char);\n textareaRef.current.scrollTop = textareaRef.current.scrollHeight;\n }\n });\n } else {\n textareaRef.current.scrollTop = textareaRef.current.scrollHeight;\n }\n }\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isFocused && !isEditing && !readOnly && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Store the character to be inserted after textarea focuses\n // This ensures it's part of the textarea's undo history\n pendingCharRef.current = event.key;\n }\n },\n [isFocused, isEditing, readOnly]\n );\n\n const onBlur = React.useCallback(() => {\n // Immediately save any pending changes on blur\n if (!readOnly && value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, value, initialValue, rowIndex, columnId, readOnly]);\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = event.target.value;\n setValue(newValue);\n debouncedSave(newValue);\n },\n [debouncedSave]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onCancel();\n } else if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n onSave();\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n // Save any pending changes\n if (value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n return;\n }\n // Stop propagation to prevent grid navigation\n event.stopPropagation();\n },\n [onSave, onCancel, value, initialValue, tableMeta, rowIndex, columnId]\n );\n\n return (\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n <span data-slot=\"grid-cell-content\">{value}</span>\n </DataGridCellWrapper>\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={sideOffset}\n className=\"w-[400px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Textarea\n placeholder={msg.cell.longTextPlaceholder}\n aria-label={msg.cell.longTextPlaceholder}\n className=\"max-h-[300px] min-h-[150px] resize-none overflow-y-auto rounded-none border-0 shadow-none focus-visible:ring-1 focus-visible:ring-ring/30\"\n ref={textareaRef}\n value={value}\n onBlur={onBlur}\n onChange={onChange}\n onKeyDown={onKeyDown}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function NumberCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const initialValue = cell.getValue() as number;\n const [value, setValue] = React.useState(String(initialValue ?? \"\"));\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const cellOpts = cell.column.columnDef.meta?.cell;\n const numberCellOpts = cellOpts?.variant === \"number\" ? cellOpts : null;\n const min = numberCellOpts?.min;\n const max = numberCellOpts?.max;\n const step = numberCellOpts?.step;\n\n const prevIsEditingRef = React.useRef(false);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(String(initialValue ?? \"\"));\n }\n\n const onBlur = React.useCallback(() => {\n const numValue = value === \"\" ? null : Number(value);\n if (!readOnly && numValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: numValue });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, rowIndex, columnId, initialValue, value, readOnly]);\n\n const onChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Enter\") {\n event.preventDefault();\n const numValue = value === \"\" ? null : Number(value);\n if (numValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: numValue });\n }\n tableMeta?.onCellEditingStop?.({ moveToNextRow: true });\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n const numValue = value === \"\" ? null : Number(value);\n if (numValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: numValue });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(String(initialValue ?? \"\"));\n inputRef.current?.blur();\n }\n } else if (isFocused && !readOnly) {\n // ⚠ Khác bản gốc (3.1.0): `!readOnly` — xem `ShortTextCell`; ở đây Backspace còn xoá trắng\n // số đang hiện của một ô chỉ đọc.\n // Handle Backspace to start editing with empty value\n if (event.key === \"Backspace\") {\n setValue(\"\");\n } else if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Handle typing to pre-fill the value when editing starts\n setValue(event.key);\n }\n }\n },\n [isEditing, isFocused, readOnly, initialValue, tableMeta, rowIndex, columnId, value]\n );\n\n React.useEffect(() => {\n const wasEditing = prevIsEditingRef.current;\n prevIsEditingRef.current = isEditing;\n\n // Only focus when we start editing (transition from false to true)\n if (isEditing && !wasEditing && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isEditing]);\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <input\n type=\"number\"\n ref={inputRef}\n value={value}\n min={min}\n max={max}\n step={step}\n className=\"w-full border-none bg-transparent p-0 outline-none focus-visible:outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n onBlur={onBlur}\n onChange={onChange}\n />\n ) : (\n <span data-slot=\"grid-cell-content\">{value}</span>\n )}\n </DataGridCellWrapper>\n );\n}\n\nexport function UrlCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isEditing,\n isFocused,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue ?? \"\");\n const cellRef = React.useRef<HTMLDivElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const prevIsEditingRef = React.useRef(false);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue ?? \"\");\n if (cellRef.current && !isEditing) {\n cellRef.current.textContent = initialValue ?? \"\";\n }\n }\n\n const onBlur = React.useCallback(() => {\n const currentValue = cellRef.current?.textContent?.trim() ?? \"\";\n\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue || null\n });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, rowIndex, columnId, initialValue, readOnly]);\n\n const onInput = React.useCallback((event: React.FormEvent<HTMLDivElement>) => {\n const currentValue = event.currentTarget.textContent ?? \"\";\n setValue(currentValue);\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Enter\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent?.trim() ?? \"\";\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue || null\n });\n }\n tableMeta?.onCellEditingStop?.({ moveToNextRow: true });\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent?.trim() ?? \"\";\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue || null\n });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue ?? \"\");\n cellRef.current?.blur();\n }\n } else if (isFocused && !readOnly && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Handle typing to pre-fill the value when editing starts\n setValue(event.key);\n\n queueMicrotask(() => {\n if (cellRef.current && cellRef.current.contentEditable === \"true\") {\n cellRef.current.textContent = event.key;\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n },\n [isEditing, isFocused, initialValue, tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onLinkClick = React.useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (isEditing) {\n event.preventDefault();\n return;\n }\n\n // Check if URL was rejected due to dangerous protocol\n const href = getUrlHref(value);\n if (!href) {\n event.preventDefault();\n toastError(msg.cell.invalidUrlTitle, msg.cell.invalidUrlDescription);\n return;\n }\n\n // Stop propagation to prevent grid from interfering with link navigation\n event.stopPropagation();\n },\n [isEditing, value, msg]\n );\n\n React.useEffect(() => {\n const wasEditing = prevIsEditingRef.current;\n prevIsEditingRef.current = isEditing;\n\n if (isEditing && !wasEditing && cellRef.current) {\n cellRef.current.focus();\n\n if (!cellRef.current.textContent && value) {\n cellRef.current.textContent = value;\n }\n\n if (cellRef.current.textContent) {\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n }\n }, [isEditing, value]);\n\n const displayValue = !isEditing ? (value ?? \"\") : \"\";\n const urlHref = displayValue ? getUrlHref(displayValue) : \"\";\n const isDangerousUrl = displayValue && !urlHref;\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {!isEditing && displayValue ? (\n <div data-slot=\"grid-cell-content\" className=\"size-full overflow-hidden\">\n <a\n data-focused={isFocused && !isDangerousUrl ? \"\" : undefined}\n data-invalid={isDangerousUrl ? \"\" : undefined}\n href={urlHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"truncate text-link-ink underline decoration-link-ink underline-offset-2 hover:text-link-ink-hover hover:decoration-link-ink-hover data-[invalid]:cursor-not-allowed data-[focused]:text-foreground data-[invalid]:text-destructive-ink data-[focused]:decoration-foreground/50 data-[invalid]:decoration-destructive-ink data-[focused]:hover:decoration-foreground/70 data-[invalid]:hover:decoration-destructive-ink\"\n onClick={onLinkClick}\n >\n {displayValue}\n </a>\n </div>\n ) : (\n <div\n role=\"textbox\"\n data-slot=\"grid-cell-content\"\n contentEditable={isEditing}\n tabIndex={-1}\n ref={cellRef}\n onBlur={onBlur}\n onInput={onInput}\n suppressContentEditableWarning\n className={cn(\"size-full overflow-hidden outline-none focus-visible:outline-none\", {\n \"whitespace-nowrap [&_*]:inline [&_*]:whitespace-nowrap [&_br]:hidden\": isEditing\n })}\n >\n {displayValue}\n </div>\n )}\n </DataGridCellWrapper>\n );\n}\n\nexport function CheckboxCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: Omit<DataGridCellProps<TData>, \"isEditing\">) {\n const initialValue = cell.getValue() as boolean;\n const [value, setValue] = React.useState(Boolean(initialValue));\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(Boolean(initialValue));\n }\n\n const onCheckedChange = React.useCallback(\n (checked: boolean) => {\n if (readOnly) return;\n setValue(checked);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: checked });\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isFocused && !readOnly && (event.key === \" \" || event.key === \"Enter\")) {\n event.preventDefault();\n event.stopPropagation();\n onCheckedChange(!value);\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isFocused, value, onCheckedChange, tableMeta, readOnly]\n );\n\n const onWrapperClick = React.useCallback(\n (event: React.MouseEvent) => {\n if (isFocused && !readOnly) {\n event.preventDefault();\n event.stopPropagation();\n onCheckedChange(!value);\n }\n },\n [isFocused, value, onCheckedChange, readOnly]\n );\n\n const onCheckboxClick = React.useCallback((event: React.MouseEvent) => {\n event.stopPropagation();\n }, []);\n\n const onCheckboxMouseDown = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n }, []);\n\n const onCheckboxDoubleClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n }, []);\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={false}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n className=\"flex size-full justify-center\"\n onClick={onWrapperClick}\n onKeyDown={onWrapperKeyDown}\n >\n <Checkbox\n checked={value}\n onCheckedChange={onCheckedChange}\n disabled={readOnly}\n onClick={onCheckboxClick}\n onMouseDown={onCheckboxMouseDown}\n onDoubleClick={onCheckboxDoubleClick}\n />\n </DataGridCellWrapper>\n );\n}\n\nexport function SelectCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const initialValue = (cell.getValue() ?? undefined) as string | undefined;\n\n const [value, setValue] = React.useState(initialValue);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const cellOpts = cell.column.columnDef.meta?.cell;\n const options = React.useMemo(() => (cellOpts?.variant === \"select\" ? cellOpts.options : []), [cellOpts]);\n const optionByValue = React.useMemo(() => new Map(options.map((option) => [option.value, option])), [options]);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue);\n }\n\n const onValueChange = React.useCallback(\n (newValue: string) => {\n if (readOnly) return;\n setValue(newValue);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValue });\n tableMeta?.onCellEditingStop?.();\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue);\n tableMeta?.onCellEditingStop?.();\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, initialValue, tableMeta]\n );\n\n const displayLabel = value ? (optionByValue.get(value)?.label ?? value) : null;\n // ⚠ Khác bản gốc (3.2.0): `renderValue` cho app vẽ giá trị bằng component của chính nó\n // (StatusPill…) thay cho Badge xám — xem JSDoc ở `CellOpts`.\n const renderValue = cellOpts?.variant === \"select\" ? cellOpts.renderValue : undefined;\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Select value={value} onValueChange={onValueChange} open={isEditing} onOpenChange={onOpenChange}>\n <SelectTrigger\n aria-label={cell.column.columnDef.meta?.label ?? columnId}\n className=\"size-full items-start border-none bg-transparent p-0 shadow-none focus:ring-0 focus-visible:ring-0 [&>span]:line-clamp-none [&_svg]:hidden\"\n >\n {displayLabel && !renderValue ? (\n // span (không dùng <Badge> vì Badge render <div>, đặt trong <button> là HTML sai)\n <span className={cn(badgeVariants({ variant: \"secondary\" }), \"whitespace-pre-wrap px-1.5 py-px\")}>\n <SelectValue />\n </span>\n ) : (\n // Có `renderValue` thì mỗi mục đã tự vẽ bằng nó, và `SelectValue` nhân bản ĐÚNG phần\n // ItemText của mục đang chọn — bọc thêm Badge là hai lớp chip lồng nhau.\n <SelectValue />\n )}\n </SelectTrigger>\n <SelectContent\n data-grid-cell-editor=\"\"\n // compensate for the wrapper padding\n align=\"start\"\n alignOffset={-8}\n sideOffset={-8}\n className=\"min-w-[calc(var(--radix-select-trigger-width)+16px)]\"\n >\n <SelectGroup>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {renderValue ? renderValue(option.value, option) : option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n ) : value && renderValue ? (\n // KHÔNG gắn `grid-cell-content`: wrapper áp `line-clamp-*` lên slot đó, tức\n // `display: -webkit-box` — phá bố cục flex của component app đặt vào. `relative` giữ các\n // bản đo đặt `absolute` (BadgeOverflow) ở trong ô thay vì bám vào dòng.\n <div data-slot=\"grid-cell-value\" className=\"relative flex min-w-0 items-center overflow-hidden\">\n {renderValue(value, optionByValue.get(value) ?? { value, label: value })}\n </div>\n ) : displayLabel ? (\n <Badge data-slot=\"grid-cell-content\" variant=\"secondary\" className=\"whitespace-pre-wrap px-1.5 py-px\">\n {displayLabel}\n </Badge>\n ) : null}\n </DataGridCellWrapper>\n );\n}\n\nexport function MultiSelectCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const cellValue = React.useMemo(() => {\n const value = cell.getValue() as string[];\n return value ?? [];\n }, [cell]);\n\n const cellKey = getCellKey(rowIndex, columnId);\n const prevCellKeyRef = React.useRef(cellKey);\n\n const [selectedValues, setSelectedValues] = React.useState<string[]>(cellValue);\n const [searchValue, setSearchValue] = React.useState(\"\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const cellOpts = cell.column.columnDef.meta?.cell;\n const options = React.useMemo(() => (cellOpts?.variant === \"multi-select\" ? cellOpts.options : []), [cellOpts]);\n const optionByValue = React.useMemo(() => new Map(options.map((option) => [option.value, option])), [options]);\n const renderValue = cellOpts?.variant === \"multi-select\" ? cellOpts.renderValue : undefined;\n const sideOffset = -(containerRef.current?.clientHeight ?? 0);\n\n const prevCellValueRef = React.useRef(cellValue);\n if (cellValue !== prevCellValueRef.current) {\n prevCellValueRef.current = cellValue;\n setSelectedValues(cellValue);\n }\n\n if (prevCellKeyRef.current !== cellKey) {\n prevCellKeyRef.current = cellKey;\n setSearchValue(\"\");\n }\n\n const onValueChange = React.useCallback(\n (value: string) => {\n if (readOnly) return;\n let newValues: string[] = [];\n setSelectedValues((curr) => {\n newValues = curr.includes(value) ? curr.filter((v) => v !== value) : [...curr, value];\n return newValues;\n });\n queueMicrotask(() => {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValues });\n inputRef.current?.focus();\n });\n setSearchValue(\"\");\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const removeValue = React.useCallback(\n (valueToRemove: string, event?: React.MouseEvent) => {\n if (readOnly) return;\n event?.stopPropagation();\n event?.preventDefault();\n let newValues: string[] = [];\n setSelectedValues((curr) => {\n newValues = curr.filter((v) => v !== valueToRemove);\n return newValues;\n });\n queueMicrotask(() => {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValues });\n inputRef.current?.focus();\n });\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const clearAll = React.useCallback(() => {\n if (readOnly) return;\n setSelectedValues([]);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: [] });\n queueMicrotask(() => inputRef.current?.focus());\n }, [tableMeta, rowIndex, columnId, readOnly]);\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n setSearchValue(\"\");\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onOpenAutoFocus\"]> =\n React.useCallback((event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && event.key === \"Escape\") {\n event.preventDefault();\n setSelectedValues(cellValue);\n setSearchValue(\"\");\n tableMeta?.onCellEditingStop?.();\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n setSearchValue(\"\");\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, cellValue, tableMeta]\n );\n\n const onInputKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\" && searchValue === \"\") {\n event.preventDefault();\n let newValues: string[] | null = null;\n setSelectedValues((curr) => {\n if (curr.length === 0) return curr;\n newValues = curr.slice(0, -1);\n return newValues;\n });\n queueMicrotask(() => {\n if (newValues !== null) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValues });\n }\n inputRef.current?.focus();\n });\n }\n if (event.key === \"Escape\") {\n event.stopPropagation();\n }\n },\n [searchValue, tableMeta, rowIndex, columnId]\n );\n\n const displayLabels = selectedValues.map((val) => optionByValue.get(val)?.label ?? val).filter(Boolean);\n\n const selectedValuesSet = React.useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const lineCount = getLineCount(rowHeight);\n\n const { visibleItems: visibleLabels, hiddenCount: hiddenBadgeCount } = useBadgeOverflow({\n items: displayLabels,\n getLabel: (label) => label,\n containerRef,\n lineCount\n });\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <div className=\"absolute inset-0\" />\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"w-[300px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Command className=\"[&_[data-slot=command-input-wrapper]]:h-auto [&_[data-slot=command-input-wrapper]]:gap-0 [&_[data-slot=command-input-wrapper]]:border-none [&_[data-slot=command-input-wrapper]]:p-0 [&_[data-slot=command-input-wrapper]_svg]:hidden\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-1 border-b px-3 py-1.5\">\n {selectedValues.map((value) => {\n const label = optionByValue.get(value)?.label ?? value;\n\n return (\n <Badge key={value} variant=\"secondary\" className=\"gap-1 px-1.5 py-px\">\n {label}\n <button\n type=\"button\"\n aria-label={`${msg.cell.clearAll}: ${label}`}\n onClick={(event) => removeValue(value, event)}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <X aria-hidden=\"true\" className=\"size-3\" />\n </button>\n </Badge>\n );\n })}\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\n onKeyDown={onInputKeyDown}\n placeholder={msg.cell.optionSearchPlaceholder}\n aria-label={msg.cell.optionSearchPlaceholder}\n className=\"h-auto flex-1 p-0\"\n />\n </div>\n <CommandList className=\"max-h-full\">\n <CommandEmpty>{msg.cell.optionEmpty}</CommandEmpty>\n <CommandGroup className=\"max-h-[300px] scroll-py-1 overflow-y-auto overflow-x-hidden\">\n {options.map((option) => {\n const isSelected = selectedValuesSet.has(option.value);\n\n return (\n <CommandItem key={option.value} value={option.label} onSelect={() => onValueChange(option.value)}>\n <div\n className={cn(\n \"flex size-4 items-center justify-center rounded-sm border border-choice-edge\",\n isSelected ? \"border-control-on bg-control-on text-control-check\" : \"[&_svg]:invisible\"\n )}\n >\n <Check className=\"size-3\" />\n </div>\n <span>{option.label}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n {selectedValues.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem onSelect={clearAll} className=\"justify-center text-muted-foreground\">\n {msg.cell.clearAll}\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : null}\n {selectedValues.length > 0 && renderValue ? (\n // ⚠ Khác bản gốc (3.2.0): app vẽ cả tập giá trị (AvatarGroup, StatusPill…) — xem `CellOpts`.\n // Hook gập \"+N\" ở trên vẫn chạy (hook không được gọi có điều kiện), chỉ là không dùng.\n <div data-slot=\"grid-cell-value\" className=\"relative flex min-w-0 items-center overflow-hidden\">\n {renderValue(\n selectedValues,\n selectedValues.map((val) => optionByValue.get(val) ?? { value: val, label: val })\n )}\n </div>\n ) : displayLabels.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1 overflow-hidden\">\n {visibleLabels.map((label, index) => (\n <Badge key={selectedValues[index]} variant=\"secondary\" className=\"px-1.5 py-px\">\n {label}\n </Badge>\n ))}\n {hiddenBadgeCount > 0 && (\n <Badge variant=\"outline\" className=\"px-1.5 py-px text-muted-foreground\">\n +{hiddenBadgeCount}\n </Badge>\n )}\n </div>\n ) : null}\n </DataGridCellWrapper>\n );\n}\n\nexport function DateCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n // Locale date-fns của lưới: tên thứ/tháng trong lịch và dạng ngày ngắn trong ô đi cùng ngôn ngữ.\n const dateLocale = useDataGridDateLocale();\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue ?? \"\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue ?? \"\");\n }\n\n // Parse date as local time to avoid timezone shifts\n const selectedDate = value ? (parseLocalDate(value) ?? undefined) : undefined;\n\n const onDateSelect = React.useCallback(\n (date: Date | undefined) => {\n if (!date || readOnly) return;\n\n // Format using local date components to avoid timezone issues\n const formattedDate = formatDateToString(date);\n setValue(formattedDate);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: formattedDate });\n tableMeta?.onCellEditingStop?.();\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue);\n tableMeta?.onCellEditingStop?.();\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, initialValue, tableMeta]\n );\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <span data-slot=\"grid-cell-content\">{formatDateForDisplay(value, dateLocale)}</span>\n </PopoverAnchor>\n {isEditing && (\n <PopoverContent data-grid-cell-editor=\"\" align=\"start\" alignOffset={-8} className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n locale={dateLocale}\n autoFocus\n defaultMonth={selectedDate ?? new Date()}\n selected={selectedDate}\n onSelect={(date) => {\n if (date) onDateSelect(date);\n }}\n />\n </PopoverContent>\n )}\n </Popover>\n </DataGridCellWrapper>\n );\n}\n\nexport function FileCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const cellValue = React.useMemo(() => (cell.getValue() as FileCellData[]) ?? [], [cell]);\n\n const cellKey = getCellKey(rowIndex, columnId);\n const prevCellKeyRef = React.useRef(cellKey);\n\n const labelId = React.useId();\n const descriptionId = React.useId();\n\n const [files, setFiles] = React.useState<FileCellData[]>(cellValue);\n const [uploadingFiles, setUploadingFiles] = React.useState<Set<string>>(new Set());\n const [deletingFiles, setDeletingFiles] = React.useState<Set<string>>(new Set());\n const [isDraggingOver, setIsDraggingOver] = React.useState(false);\n const [isDragging, setIsDragging] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const isUploading = uploadingFiles.size > 0;\n const isDeleting = deletingFiles.size > 0;\n const isPending = isUploading || isDeleting;\n const containerRef = React.useRef<HTMLDivElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n const dropzoneRef = React.useRef<HTMLDivElement>(null);\n const cellOpts = cell.column.columnDef.meta?.cell;\n const sideOffset = -(containerRef.current?.clientHeight ?? 0);\n\n const fileCellOpts = cellOpts?.variant === \"file\" ? cellOpts : null;\n const maxFileSize = fileCellOpts?.maxFileSize ?? 10 * 1024 * 1024;\n const maxFiles = fileCellOpts?.maxFiles ?? 10;\n const accept = fileCellOpts?.accept;\n const multiple = fileCellOpts?.multiple ?? false;\n\n const acceptedTypes = React.useMemo(() => (accept ? accept.split(\",\").map((t) => t.trim()) : null), [accept]);\n\n const prevCellValueRef = React.useRef(cellValue);\n if (cellValue !== prevCellValueRef.current) {\n prevCellValueRef.current = cellValue;\n for (const file of files) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n setFiles(cellValue);\n setError(null);\n }\n\n if (prevCellKeyRef.current !== cellKey) {\n prevCellKeyRef.current = cellKey;\n setError(null);\n }\n\n const validateFile = React.useCallback(\n (file: File): string | null => {\n if (maxFileSize && file.size > maxFileSize) {\n return msg.file.tooLarge(formatFileSize(maxFileSize));\n }\n if (acceptedTypes) {\n const fileExtension = `.${file.name.split(\".\").pop()}`;\n const isAccepted = acceptedTypes.some((type) => {\n if (type.endsWith(\"/*\")) {\n const baseType = type.slice(0, -2);\n return file.type.startsWith(`${baseType}/`);\n }\n if (type.startsWith(\".\")) {\n return fileExtension.toLowerCase() === type.toLowerCase();\n }\n return file.type === type;\n });\n if (!isAccepted) {\n return msg.file.wrongType;\n }\n }\n return null;\n },\n [maxFileSize, acceptedTypes, msg]\n );\n\n const addFiles = React.useCallback(\n async (newFiles: File[], skipUpload = false) => {\n if (readOnly || isPending) return;\n setError(null);\n\n if (maxFiles && files.length + newFiles.length > maxFiles) {\n const errorMessage = msg.file.tooMany(maxFiles);\n setError(errorMessage);\n toastMessage(errorMessage);\n setTimeout(() => {\n setError(null);\n }, 2000);\n return;\n }\n\n const rejectedFiles: Array<{ name: string; reason: string }> = [];\n const filesToValidate: File[] = [];\n\n for (const file of newFiles) {\n const validationError = validateFile(file);\n if (validationError) {\n rejectedFiles.push({ name: file.name, reason: validationError });\n continue;\n }\n filesToValidate.push(file);\n }\n\n if (rejectedFiles.length > 0) {\n const firstError = rejectedFiles[0];\n if (firstError) {\n setError(firstError.reason);\n\n const truncatedName = firstError.name.length > 20 ? `${firstError.name.slice(0, 20)}...` : firstError.name;\n\n if (rejectedFiles.length === 1) {\n toastMessage(firstError.reason, msg.file.rejectedOne(truncatedName));\n } else {\n toastMessage(firstError.reason, msg.file.rejectedMany(truncatedName, rejectedFiles.length - 1));\n }\n\n setTimeout(() => {\n setError(null);\n }, 2000);\n }\n }\n\n if (filesToValidate.length > 0) {\n if (!skipUpload) {\n const tempFiles = filesToValidate.map((f) => ({\n id: generateFileId(),\n name: f.name,\n size: f.size,\n type: f.type,\n url: undefined\n }));\n const filesWithTemp = [...files, ...tempFiles];\n setFiles(filesWithTemp);\n\n const uploadingIds = new Set(tempFiles.map((f) => f.id));\n setUploadingFiles(uploadingIds);\n\n let uploadedFiles: FileCellData[] = [];\n\n if (tableMeta?.onFilesUpload) {\n try {\n uploadedFiles = await tableMeta.onFilesUpload({\n files: filesToValidate,\n rowIndex,\n columnId\n });\n } catch (error) {\n toastError(error instanceof Error ? error.message : msg.file.uploadFailed(filesToValidate.length));\n setFiles((prev) => prev.filter((f) => !uploadingIds.has(f.id)));\n setUploadingFiles(new Set());\n return;\n }\n } else {\n uploadedFiles = filesToValidate.map((f, i) => ({\n id: tempFiles[i]?.id ?? generateFileId(),\n name: f.name,\n size: f.size,\n type: f.type,\n url: URL.createObjectURL(f)\n }));\n }\n\n const finalFiles = filesWithTemp\n .map((f) => {\n if (uploadingIds.has(f.id)) {\n return uploadedFiles.find((uf) => uf.name === f.name) ?? f;\n }\n return f;\n })\n .filter((f) => f.url !== undefined);\n\n setFiles(finalFiles);\n setUploadingFiles(new Set());\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: finalFiles });\n } else {\n const newFilesData: FileCellData[] = filesToValidate.map((f) => ({\n id: generateFileId(),\n name: f.name,\n size: f.size,\n type: f.type,\n url: URL.createObjectURL(f)\n }));\n const updatedFiles = [...files, ...newFilesData];\n setFiles(updatedFiles);\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: updatedFiles\n });\n }\n }\n },\n [files, maxFiles, validateFile, tableMeta, rowIndex, columnId, readOnly, isPending, msg]\n );\n\n const removeFile = React.useCallback(\n async (fileId: string) => {\n if (readOnly || isPending) return;\n setError(null);\n\n const fileToRemove = files.find((f) => f.id === fileId);\n if (!fileToRemove) return;\n\n setDeletingFiles((prev) => new Set(prev).add(fileId));\n\n if (tableMeta?.onFilesDelete) {\n try {\n await tableMeta.onFilesDelete({\n fileIds: [fileId],\n rowIndex,\n columnId\n });\n } catch (error) {\n toastError(error instanceof Error ? error.message : msg.file.deleteFailed(fileToRemove.name));\n setDeletingFiles((prev) => {\n const next = new Set(prev);\n next.delete(fileId);\n return next;\n });\n return;\n }\n }\n\n if (fileToRemove.url?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(fileToRemove.url);\n }\n\n const updatedFiles = files.filter((f) => f.id !== fileId);\n setFiles(updatedFiles);\n setDeletingFiles((prev) => {\n const next = new Set(prev);\n next.delete(fileId);\n return next;\n });\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: updatedFiles });\n },\n [files, tableMeta, rowIndex, columnId, readOnly, isPending, msg]\n );\n\n const clearAll = React.useCallback(async () => {\n if (readOnly || isPending) return;\n setError(null);\n\n const fileIds = files.map((f) => f.id);\n setDeletingFiles(new Set(fileIds));\n\n if (tableMeta?.onFilesDelete && files.length > 0) {\n try {\n await tableMeta.onFilesDelete({\n fileIds,\n rowIndex,\n columnId\n });\n } catch (error) {\n toastError(error instanceof Error ? error.message : msg.file.deleteFailedMany);\n setDeletingFiles(new Set());\n return;\n }\n }\n\n for (const file of files) {\n if (file.url?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(file.url);\n }\n }\n setFiles([]);\n setDeletingFiles(new Set());\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: [] });\n }, [files, tableMeta, rowIndex, columnId, readOnly, isPending, msg]);\n\n const onCellDragEnter = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer.types.includes(\"Files\")) {\n setIsDraggingOver(true);\n }\n }, []);\n\n const onCellDragLeave = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n const x = event.clientX;\n const y = event.clientY;\n\n if (x <= rect.left || x >= rect.right || y <= rect.top || y >= rect.bottom) {\n setIsDraggingOver(false);\n }\n }, []);\n\n const onCellDragOver = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const onCellDrop = React.useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setIsDraggingOver(false);\n\n const droppedFiles = Array.from(event.dataTransfer.files);\n if (droppedFiles.length > 0) {\n addFiles(droppedFiles, false);\n }\n },\n [addFiles]\n );\n\n const onDropzoneDragEnter = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const onDropzoneDragLeave = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n const x = event.clientX;\n const y = event.clientY;\n\n if (x <= rect.left || x >= rect.right || y <= rect.top || y >= rect.bottom) {\n setIsDragging(false);\n }\n }, []);\n\n const onDropzoneDragOver = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const onDropzoneDrop = React.useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(false);\n\n const droppedFiles = Array.from(event.dataTransfer.files);\n addFiles(droppedFiles, false);\n },\n [addFiles]\n );\n\n const onDropzoneClick = React.useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n const onDropzoneKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onDropzoneClick();\n }\n },\n [onDropzoneClick]\n );\n\n const onFileInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFiles = Array.from(event.target.files ?? []);\n addFiles(selectedFiles, false);\n event.target.value = \"\";\n },\n [addFiles]\n );\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n setError(null);\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n setError(null);\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onEscapeKeyDown: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onEscapeKeyDown\"]> =\n React.useCallback((event) => {\n // Prevent the escape key from propagating to the data grid's keyboard handler\n // which would call blurCell() and remove focus from the cell\n event.stopPropagation();\n }, []);\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onOpenAutoFocus\"]> =\n React.useCallback((event) => {\n event.preventDefault();\n queueMicrotask(() => {\n dropzoneRef.current?.focus();\n });\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setFiles(cellValue);\n setError(null);\n tableMeta?.onCellEditingStop?.();\n } else if (event.key === \" \") {\n event.preventDefault();\n onDropzoneClick();\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n } else if (isFocused && event.key === \"Enter\") {\n event.preventDefault();\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, cellValue, tableMeta, onDropzoneClick, rowIndex, columnId]\n );\n\n React.useEffect(() => {\n return () => {\n for (const file of files) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n };\n }, [files]);\n\n const lineCount = getLineCount(rowHeight);\n\n const { visibleItems: visibleFiles, hiddenCount: hiddenFileCount } = useBadgeOverflow({\n items: files,\n getLabel: (file) => file.name,\n containerRef,\n lineCount,\n cacheKeyPrefix: \"file\",\n iconSize: 12,\n maxWidth: 100\n });\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n className={cn({\n \"ring-1 ring-primary/80 ring-inset\": isDraggingOver\n })}\n onDragEnter={onCellDragEnter}\n onDragLeave={onCellDragLeave}\n onDragOver={onCellDragOver}\n onDrop={onCellDrop}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <div className=\"absolute inset-0\" />\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"w-[400px] rounded-none p-0\"\n onEscapeKeyDown={onEscapeKeyDown}\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <div className=\"flex flex-col gap-2 p-3\">\n <span id={labelId} className=\"sr-only\">\n {msg.file.uploadLabel}\n </span>\n <div\n role=\"region\"\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n aria-invalid={!!error}\n aria-disabled={isPending}\n data-dragging={isDragging ? \"\" : undefined}\n data-invalid={error ? \"\" : undefined}\n data-disabled={isPending ? \"\" : undefined}\n tabIndex={isDragging || isPending ? -1 : 0}\n className=\"flex cursor-pointer flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed p-6 outline-none transition-colors hover:bg-accent/30 focus-visible:border-primary-ink focus-visible:outline-none data-[disabled]:pointer-events-none data-[dragging]:border-primary-ink data-[invalid]:border-destructive-ink data-[dragging]:bg-accent/30 data-[disabled]:opacity-50\"\n ref={dropzoneRef}\n onClick={onDropzoneClick}\n onDragEnter={onDropzoneDragEnter}\n onDragLeave={onDropzoneDragLeave}\n onDragOver={onDropzoneDragOver}\n onDrop={onDropzoneDrop}\n onKeyDown={onDropzoneKeyDown}\n >\n <Upload aria-hidden=\"true\" className=\"size-8 text-muted-foreground\" />\n <div className=\"text-center text-sm\">\n <p className=\"font-medium\">{isDragging ? msg.file.dropHere : msg.file.dragHere}</p>\n <p className=\"text-muted-foreground text-xs\">{msg.file.browse}</p>\n </div>\n <p id={descriptionId} className=\"text-muted-foreground text-xs\">\n {msg.file.limits(maxFileSize ? formatFileSize(maxFileSize) : undefined, maxFiles)}\n </p>\n </div>\n <input\n type=\"file\"\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n multiple={multiple}\n accept={accept}\n className=\"sr-only\"\n ref={fileInputRef}\n onChange={onFileInputChange}\n />\n {files.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium text-muted-foreground text-xs\">{msg.file.count(files.length)}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-muted-foreground text-xs\"\n onClick={clearAll}\n disabled={isPending}\n >\n {msg.file.clearAll}\n </Button>\n </div>\n <div className=\"max-h-[200px] space-y-1 overflow-y-auto\">\n {files.map((file) => {\n const FileIcon = getFileIcon(file.type);\n const isFileUploading = uploadingFiles.has(file.id);\n const isFileDeleting = deletingFiles.has(file.id);\n const isFilePending = isFileUploading || isFileDeleting;\n\n return (\n <div\n key={file.id}\n data-pending={isFilePending ? \"\" : undefined}\n className=\"flex items-center gap-2 rounded-md border bg-muted/50 px-2 py-1.5 data-[pending]:opacity-60\"\n >\n {FileIcon && <FileIcon className=\"size-4 shrink-0 text-muted-foreground\" />}\n <div className=\"flex-1 overflow-hidden\">\n <p className=\"truncate text-sm\">{file.name}</p>\n <p className=\"text-muted-foreground text-xs\">\n {isFileUploading\n ? msg.file.uploading\n : isFileDeleting\n ? msg.file.deleting\n : formatFileSize(file.size)}\n </p>\n </div>\n <Button\n type=\"button\"\n aria-label={`${msg.file.remove}: ${file.name}`}\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-5 rounded-sm\"\n onClick={() => removeFile(file.id)}\n disabled={isPending}\n >\n <X aria-hidden=\"true\" className=\"size-3\" />\n </Button>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n ) : null}\n {isDraggingOver ? (\n <div className=\"flex items-center justify-center gap-2 text-primary-ink text-sm\">\n <Upload aria-hidden=\"true\" className=\"size-4\" />\n <span>{msg.file.dropHere}</span>\n </div>\n ) : files.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1 overflow-hidden\">\n {visibleFiles.map((file) => {\n const isUploading = uploadingFiles.has(file.id);\n\n if (isUploading) {\n return (\n <Skeleton\n key={file.id}\n className=\"h-5 shrink-0 px-1.5\"\n style={{\n width: `${Math.min(file.name.length * 8 + 30, 100)}px`\n }}\n />\n );\n }\n\n const FileIcon = getFileIcon(file.type);\n\n return (\n <Badge key={file.id} variant=\"secondary\" className=\"gap-1 px-1.5 py-px\">\n {FileIcon && <FileIcon className=\"size-3 shrink-0\" />}\n <span className=\"max-w-[100px] truncate\">{file.name}</span>\n </Badge>\n );\n })}\n {hiddenFileCount > 0 && (\n <Badge variant=\"outline\" className=\"px-1.5 py-px text-muted-foreground\">\n +{hiddenFileCount}\n </Badge>\n )}\n </div>\n ) : null}\n </DataGridCellWrapper>\n );\n}\n"],"mappings":"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","names":["isSelected","error","isUploading"]}
1
+ {"version":3,"sources":["../../src/data-grid/data-grid-cell-variants.tsx"],"sourcesContent":["\"use client\";\n\nimport { Check, Upload, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Badge, badgeVariants } from \"../components/ui/badge.js\";\nimport { Button } from \"../components/ui/button.js\";\nimport { Calendar } from \"../components/ui/calendar.js\";\nimport { Checkbox } from \"../components/ui/checkbox.js\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator\n} from \"../components/ui/command.js\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"../components/ui/popover.js\";\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from \"../components/ui/select.js\";\nimport { Skeleton } from \"../components/ui/skeleton.js\";\nimport { Textarea } from \"../components/ui/textarea.js\";\nimport { cn } from \"../lib/cn.js\";\nimport { DataGridCellWrapper } from \"./data-grid-cell-wrapper.js\";\nimport { useDataGridDateLocale, useDataGridMessages } from \"./data-grid-locale.js\";\nimport { toastError, toastMessage } from \"./toast.js\";\nimport type { DataGridCellProps, FileCellData } from \"./types.js\";\nimport { useBadgeOverflow } from \"./use-badge-overflow.js\";\nimport { useDebouncedCallback } from \"./use-debounced-callback.js\";\nimport {\n formatDateForDisplay,\n formatDateToString,\n formatFileSize,\n generateFileId,\n getCellKey,\n getFileIcon,\n getLineCount,\n getUrlHref,\n parseLocalDate\n} from \"./utils.js\";\n\nexport function ShortTextCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isEditing,\n isFocused,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue);\n const cellRef = React.useRef<HTMLDivElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const prevIsEditingRef = React.useRef(false);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue);\n if (cellRef.current && !isEditing) {\n cellRef.current.textContent = initialValue;\n }\n }\n\n const onBlur = React.useCallback(() => {\n // Read the current value directly from the DOM to avoid stale state\n const currentValue = cellRef.current?.textContent ?? \"\";\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, rowIndex, columnId, initialValue, readOnly]);\n\n const onInput = React.useCallback((event: React.FormEvent<HTMLDivElement>) => {\n const currentValue = event.currentTarget.textContent ?? \"\";\n setValue(currentValue);\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Enter\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent ?? \"\";\n if (currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue\n });\n }\n tableMeta?.onCellEditingStop?.({ moveToNextRow: true });\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent ?? \"\";\n if (currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue\n });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue);\n cellRef.current?.blur();\n }\n } else if (isFocused && !readOnly && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Handle typing to pre-fill the value when editing starts.\n // ⚠ Khác bản gốc (3.1.0): `!readOnly` như `LongTextCell` / `UrlCell` đã có. Thiếu nó, gõ một\n // chữ lên ô chỉ đọc (lưới `readOnly`, hay cột `meta.readOnly`) không mở trình sửa và không\n // ghi dữ liệu, nhưng vẫn THAY chữ đang hiện trong ô bằng phím vừa gõ.\n setValue(event.key);\n\n queueMicrotask(() => {\n if (cellRef.current && cellRef.current.contentEditable === \"true\") {\n cellRef.current.textContent = event.key;\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n },\n [isEditing, isFocused, readOnly, initialValue, tableMeta, rowIndex, columnId]\n );\n\n React.useEffect(() => {\n const wasEditing = prevIsEditingRef.current;\n prevIsEditingRef.current = isEditing;\n\n if (isEditing && !wasEditing && cellRef.current) {\n cellRef.current.focus();\n\n if (!cellRef.current.textContent && value) {\n cellRef.current.textContent = value;\n }\n\n if (cellRef.current.textContent) {\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n }\n }, [isEditing, value]);\n\n const displayValue = !isEditing ? (value ?? \"\") : \"\";\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n <div\n role=\"textbox\"\n data-slot=\"grid-cell-content\"\n contentEditable={isEditing}\n tabIndex={-1}\n ref={cellRef}\n onBlur={onBlur}\n onInput={onInput}\n suppressContentEditableWarning\n className={cn(\"size-full overflow-hidden outline-none\", {\n \"whitespace-nowrap [&_*]:inline [&_*]:whitespace-nowrap [&_br]:hidden\": isEditing\n })}\n >\n {displayValue}\n </div>\n </DataGridCellWrapper>\n );\n}\n\nexport function LongTextCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue ?? \"\");\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const pendingCharRef = React.useRef<string | null>(null);\n const sideOffset = -(containerRef.current?.clientHeight ?? 0);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue ?? \"\");\n }\n\n const debouncedSave = useDebouncedCallback((newValue: string) => {\n if (!readOnly) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValue });\n }\n }, 300);\n\n const onSave = React.useCallback(() => {\n // Immediately save any pending changes and close the popover\n if (!readOnly && value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, value, initialValue, rowIndex, columnId, readOnly]);\n\n const onCancel = React.useCallback(() => {\n // Restore the original value\n setValue(initialValue ?? \"\");\n if (!readOnly) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: initialValue });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, initialValue, rowIndex, columnId, readOnly]);\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n // Immediately save any pending changes when closing\n if (!readOnly && value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, value, initialValue, rowIndex, columnId, readOnly]\n );\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onOpenAutoFocus\"]> =\n React.useCallback((event) => {\n event.preventDefault();\n if (textareaRef.current) {\n textareaRef.current.focus();\n const length = textareaRef.current.value.length;\n textareaRef.current.setSelectionRange(length, length);\n\n // Insert pending character using execCommand so it's part of undo history\n // Use requestAnimationFrame to ensure focus has fully settled\n if (pendingCharRef.current) {\n const char = pendingCharRef.current;\n pendingCharRef.current = null;\n requestAnimationFrame(() => {\n if (textareaRef.current && document.activeElement === textareaRef.current) {\n document.execCommand(\"insertText\", false, char);\n textareaRef.current.scrollTop = textareaRef.current.scrollHeight;\n }\n });\n } else {\n textareaRef.current.scrollTop = textareaRef.current.scrollHeight;\n }\n }\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isFocused && !isEditing && !readOnly && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Store the character to be inserted after textarea focuses\n // This ensures it's part of the textarea's undo history\n pendingCharRef.current = event.key;\n }\n },\n [isFocused, isEditing, readOnly]\n );\n\n const onBlur = React.useCallback(() => {\n // Immediately save any pending changes on blur\n if (!readOnly && value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, value, initialValue, rowIndex, columnId, readOnly]);\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = event.target.value;\n setValue(newValue);\n debouncedSave(newValue);\n },\n [debouncedSave]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onCancel();\n } else if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n onSave();\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n // Save any pending changes\n if (value !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n return;\n }\n // Stop propagation to prevent grid navigation\n event.stopPropagation();\n },\n [onSave, onCancel, value, initialValue, tableMeta, rowIndex, columnId]\n );\n\n return (\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n <span data-slot=\"grid-cell-content\">{value}</span>\n </DataGridCellWrapper>\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={sideOffset}\n className=\"w-[400px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Textarea\n placeholder={msg.cell.longTextPlaceholder}\n aria-label={msg.cell.longTextPlaceholder}\n className=\"max-h-[300px] min-h-[150px] resize-none overflow-y-auto rounded-none border-0 shadow-none focus-visible:ring-1 focus-visible:ring-ring/30\"\n ref={textareaRef}\n value={value}\n onBlur={onBlur}\n onChange={onChange}\n onKeyDown={onKeyDown}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function NumberCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const initialValue = cell.getValue() as number;\n const [value, setValue] = React.useState(String(initialValue ?? \"\"));\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const cellOpts = cell.column.columnDef.meta?.cell;\n const numberCellOpts = cellOpts?.variant === \"number\" ? cellOpts : null;\n const min = numberCellOpts?.min;\n const max = numberCellOpts?.max;\n const step = numberCellOpts?.step;\n\n const prevIsEditingRef = React.useRef(false);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(String(initialValue ?? \"\"));\n }\n\n const onBlur = React.useCallback(() => {\n const numValue = value === \"\" ? null : Number(value);\n if (!readOnly && numValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: numValue });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, rowIndex, columnId, initialValue, value, readOnly]);\n\n const onChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Enter\") {\n event.preventDefault();\n const numValue = value === \"\" ? null : Number(value);\n if (numValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: numValue });\n }\n tableMeta?.onCellEditingStop?.({ moveToNextRow: true });\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n const numValue = value === \"\" ? null : Number(value);\n if (numValue !== initialValue) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: numValue });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(String(initialValue ?? \"\"));\n inputRef.current?.blur();\n }\n } else if (isFocused && !readOnly) {\n // ⚠ Khác bản gốc (3.1.0): `!readOnly` — xem `ShortTextCell`; ở đây Backspace còn xoá trắng\n // số đang hiện của một ô chỉ đọc.\n // Handle Backspace to start editing with empty value\n if (event.key === \"Backspace\") {\n setValue(\"\");\n } else if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Handle typing to pre-fill the value when editing starts\n setValue(event.key);\n }\n }\n },\n [isEditing, isFocused, readOnly, initialValue, tableMeta, rowIndex, columnId, value]\n );\n\n React.useEffect(() => {\n const wasEditing = prevIsEditingRef.current;\n prevIsEditingRef.current = isEditing;\n\n // Only focus when we start editing (transition from false to true)\n if (isEditing && !wasEditing && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isEditing]);\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <input\n type=\"number\"\n ref={inputRef}\n value={value}\n min={min}\n max={max}\n step={step}\n className=\"w-full border-none bg-transparent p-0 outline-none focus-visible:outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n onBlur={onBlur}\n onChange={onChange}\n />\n ) : (\n <span data-slot=\"grid-cell-content\">{value}</span>\n )}\n </DataGridCellWrapper>\n );\n}\n\nexport function UrlCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isEditing,\n isFocused,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue ?? \"\");\n const cellRef = React.useRef<HTMLDivElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const prevIsEditingRef = React.useRef(false);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue ?? \"\");\n if (cellRef.current && !isEditing) {\n cellRef.current.textContent = initialValue ?? \"\";\n }\n }\n\n const onBlur = React.useCallback(() => {\n const currentValue = cellRef.current?.textContent?.trim() ?? \"\";\n\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue || null\n });\n }\n tableMeta?.onCellEditingStop?.();\n }, [tableMeta, rowIndex, columnId, initialValue, readOnly]);\n\n const onInput = React.useCallback((event: React.FormEvent<HTMLDivElement>) => {\n const currentValue = event.currentTarget.textContent ?? \"\";\n setValue(currentValue);\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Enter\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent?.trim() ?? \"\";\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue || null\n });\n }\n tableMeta?.onCellEditingStop?.({ moveToNextRow: true });\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n const currentValue = cellRef.current?.textContent?.trim() ?? \"\";\n if (!readOnly && currentValue !== initialValue) {\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: currentValue || null\n });\n }\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue ?? \"\");\n cellRef.current?.blur();\n }\n } else if (isFocused && !readOnly && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // Handle typing to pre-fill the value when editing starts\n setValue(event.key);\n\n queueMicrotask(() => {\n if (cellRef.current && cellRef.current.contentEditable === \"true\") {\n cellRef.current.textContent = event.key;\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n });\n }\n },\n [isEditing, isFocused, initialValue, tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onLinkClick = React.useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (isEditing) {\n event.preventDefault();\n return;\n }\n\n // Check if URL was rejected due to dangerous protocol\n const href = getUrlHref(value);\n if (!href) {\n event.preventDefault();\n toastError(msg.cell.invalidUrlTitle, msg.cell.invalidUrlDescription);\n return;\n }\n\n // Stop propagation to prevent grid from interfering with link navigation\n event.stopPropagation();\n },\n [isEditing, value, msg]\n );\n\n React.useEffect(() => {\n const wasEditing = prevIsEditingRef.current;\n prevIsEditingRef.current = isEditing;\n\n if (isEditing && !wasEditing && cellRef.current) {\n cellRef.current.focus();\n\n if (!cellRef.current.textContent && value) {\n cellRef.current.textContent = value;\n }\n\n if (cellRef.current.textContent) {\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(cellRef.current);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n }\n }, [isEditing, value]);\n\n const displayValue = !isEditing ? (value ?? \"\") : \"\";\n const urlHref = displayValue ? getUrlHref(displayValue) : \"\";\n const isDangerousUrl = displayValue && !urlHref;\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {!isEditing && displayValue ? (\n <div data-slot=\"grid-cell-content\" className=\"size-full overflow-hidden\">\n <a\n data-focused={isFocused && !isDangerousUrl ? \"\" : undefined}\n data-invalid={isDangerousUrl ? \"\" : undefined}\n href={urlHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"truncate text-link-ink underline decoration-link-ink underline-offset-2 hover:text-link-ink-hover hover:decoration-link-ink-hover data-[invalid]:cursor-not-allowed data-[focused]:text-foreground data-[invalid]:text-destructive-ink data-[focused]:decoration-foreground/50 data-[invalid]:decoration-destructive-ink data-[focused]:hover:decoration-foreground/70 data-[invalid]:hover:decoration-destructive-ink\"\n onClick={onLinkClick}\n >\n {displayValue}\n </a>\n </div>\n ) : (\n <div\n role=\"textbox\"\n data-slot=\"grid-cell-content\"\n contentEditable={isEditing}\n tabIndex={-1}\n ref={cellRef}\n onBlur={onBlur}\n onInput={onInput}\n suppressContentEditableWarning\n className={cn(\"size-full overflow-hidden outline-none focus-visible:outline-none\", {\n \"whitespace-nowrap [&_*]:inline [&_*]:whitespace-nowrap [&_br]:hidden\": isEditing\n })}\n >\n {displayValue}\n </div>\n )}\n </DataGridCellWrapper>\n );\n}\n\nexport function CheckboxCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: Omit<DataGridCellProps<TData>, \"isEditing\">) {\n const initialValue = cell.getValue() as boolean;\n const [value, setValue] = React.useState(Boolean(initialValue));\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(Boolean(initialValue));\n }\n\n const onCheckedChange = React.useCallback(\n (checked: boolean) => {\n if (readOnly) return;\n setValue(checked);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: checked });\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isFocused && !readOnly && (event.key === \" \" || event.key === \"Enter\")) {\n event.preventDefault();\n event.stopPropagation();\n onCheckedChange(!value);\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isFocused, value, onCheckedChange, tableMeta, readOnly]\n );\n\n const onWrapperClick = React.useCallback(\n (event: React.MouseEvent) => {\n if (isFocused && !readOnly) {\n event.preventDefault();\n event.stopPropagation();\n onCheckedChange(!value);\n }\n },\n [isFocused, value, onCheckedChange, readOnly]\n );\n\n const onCheckboxClick = React.useCallback((event: React.MouseEvent) => {\n event.stopPropagation();\n }, []);\n\n const onCheckboxMouseDown = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n }, []);\n\n const onCheckboxDoubleClick = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n }, []);\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={false}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n className=\"flex size-full justify-center\"\n onClick={onWrapperClick}\n onKeyDown={onWrapperKeyDown}\n >\n <Checkbox\n checked={value}\n onCheckedChange={onCheckedChange}\n disabled={readOnly}\n onClick={onCheckboxClick}\n onMouseDown={onCheckboxMouseDown}\n onDoubleClick={onCheckboxDoubleClick}\n />\n </DataGridCellWrapper>\n );\n}\n\nexport function SelectCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const initialValue = (cell.getValue() ?? undefined) as string | undefined;\n\n const [value, setValue] = React.useState(initialValue);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const cellOpts = cell.column.columnDef.meta?.cell;\n const rowId = cell.row.id;\n const options = React.useMemo(() => (cellOpts?.variant === \"select\" ? cellOpts.options : []), [cellOpts]);\n // Danh sách MỜI chọn lúc sửa — riêng từng dòng khi cột khai `getOptions` (3.6.1); lúc nghỉ vẫn là `options`.\n const editOptions = React.useMemo(\n () => (isEditing && cellOpts?.variant === \"select\" ? (cellOpts.getOptions?.(rowId) ?? options) : options),\n [isEditing, cellOpts, rowId, options]\n );\n const optionByValue = React.useMemo(() => new Map(options.map((option) => [option.value, option])), [options]);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue);\n }\n\n const onValueChange = React.useCallback(\n (newValue: string) => {\n if (readOnly) return;\n setValue(newValue);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValue });\n tableMeta?.onCellEditingStop?.();\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue);\n tableMeta?.onCellEditingStop?.();\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, initialValue, tableMeta]\n );\n\n const displayLabel = value ? (optionByValue.get(value)?.label ?? value) : null;\n // ⚠ Khác bản gốc (3.2.0): `renderValue` cho app vẽ giá trị bằng component của chính nó\n // (StatusPill…) thay cho Badge xám — xem JSDoc ở `CellOpts`.\n const renderValue = cellOpts?.variant === \"select\" ? cellOpts.renderValue : undefined;\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Select value={value} onValueChange={onValueChange} open={isEditing} onOpenChange={onOpenChange}>\n <SelectTrigger\n aria-label={cell.column.columnDef.meta?.label ?? columnId}\n className=\"size-full items-start border-none bg-transparent p-0 shadow-none focus:ring-0 focus-visible:ring-0 [&>span]:line-clamp-none [&_svg]:hidden\"\n >\n {displayLabel && !renderValue ? (\n // span (không dùng <Badge> vì Badge render <div>, đặt trong <button> là HTML sai)\n <span className={cn(badgeVariants({ variant: \"secondary\" }), \"whitespace-pre-wrap px-1.5 py-px\")}>\n <SelectValue />\n </span>\n ) : (\n // Có `renderValue` thì mỗi mục đã tự vẽ bằng nó, và `SelectValue` nhân bản ĐÚNG phần\n // ItemText của mục đang chọn — bọc thêm Badge là hai lớp chip lồng nhau.\n <SelectValue />\n )}\n </SelectTrigger>\n <SelectContent\n data-grid-cell-editor=\"\"\n // compensate for the wrapper padding\n align=\"start\"\n alignOffset={-8}\n sideOffset={-8}\n className=\"min-w-[calc(var(--radix-select-trigger-width)+16px)]\"\n >\n <SelectGroup>\n {editOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {renderValue ? renderValue(option.value, option) : option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n ) : value && renderValue ? (\n // KHÔNG gắn `grid-cell-content`: wrapper áp `line-clamp-*` lên slot đó, tức\n // `display: -webkit-box` — phá bố cục flex của component app đặt vào. `relative` giữ các\n // bản đo đặt `absolute` (BadgeOverflow) ở trong ô thay vì bám vào dòng.\n <div data-slot=\"grid-cell-value\" className=\"relative flex min-w-0 items-center overflow-hidden\">\n {renderValue(value, optionByValue.get(value) ?? { value, label: value })}\n </div>\n ) : displayLabel ? (\n <Badge data-slot=\"grid-cell-content\" variant=\"secondary\" className=\"whitespace-pre-wrap px-1.5 py-px\">\n {displayLabel}\n </Badge>\n ) : null}\n </DataGridCellWrapper>\n );\n}\n\nexport function MultiSelectCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const cellValue = React.useMemo(() => {\n const value = cell.getValue() as string[];\n return value ?? [];\n }, [cell]);\n\n const cellKey = getCellKey(rowIndex, columnId);\n const prevCellKeyRef = React.useRef(cellKey);\n\n const [selectedValues, setSelectedValues] = React.useState<string[]>(cellValue);\n const [searchValue, setSearchValue] = React.useState(\"\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const cellOpts = cell.column.columnDef.meta?.cell;\n const options = React.useMemo(() => (cellOpts?.variant === \"multi-select\" ? cellOpts.options : []), [cellOpts]);\n const optionByValue = React.useMemo(() => new Map(options.map((option) => [option.value, option])), [options]);\n const renderValue = cellOpts?.variant === \"multi-select\" ? cellOpts.renderValue : undefined;\n const sideOffset = -(containerRef.current?.clientHeight ?? 0);\n\n const prevCellValueRef = React.useRef(cellValue);\n if (cellValue !== prevCellValueRef.current) {\n prevCellValueRef.current = cellValue;\n setSelectedValues(cellValue);\n }\n\n if (prevCellKeyRef.current !== cellKey) {\n prevCellKeyRef.current = cellKey;\n setSearchValue(\"\");\n }\n\n const onValueChange = React.useCallback(\n (value: string) => {\n if (readOnly) return;\n let newValues: string[] = [];\n setSelectedValues((curr) => {\n newValues = curr.includes(value) ? curr.filter((v) => v !== value) : [...curr, value];\n return newValues;\n });\n queueMicrotask(() => {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValues });\n inputRef.current?.focus();\n });\n setSearchValue(\"\");\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const removeValue = React.useCallback(\n (valueToRemove: string, event?: React.MouseEvent) => {\n if (readOnly) return;\n event?.stopPropagation();\n event?.preventDefault();\n let newValues: string[] = [];\n setSelectedValues((curr) => {\n newValues = curr.filter((v) => v !== valueToRemove);\n return newValues;\n });\n queueMicrotask(() => {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValues });\n inputRef.current?.focus();\n });\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const clearAll = React.useCallback(() => {\n if (readOnly) return;\n setSelectedValues([]);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: [] });\n queueMicrotask(() => inputRef.current?.focus());\n }, [tableMeta, rowIndex, columnId, readOnly]);\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n setSearchValue(\"\");\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onOpenAutoFocus\"]> =\n React.useCallback((event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && event.key === \"Escape\") {\n event.preventDefault();\n setSelectedValues(cellValue);\n setSearchValue(\"\");\n tableMeta?.onCellEditingStop?.();\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n setSearchValue(\"\");\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, cellValue, tableMeta]\n );\n\n const onInputKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\" && searchValue === \"\") {\n event.preventDefault();\n let newValues: string[] | null = null;\n setSelectedValues((curr) => {\n if (curr.length === 0) return curr;\n newValues = curr.slice(0, -1);\n return newValues;\n });\n queueMicrotask(() => {\n if (newValues !== null) {\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: newValues });\n }\n inputRef.current?.focus();\n });\n }\n if (event.key === \"Escape\") {\n event.stopPropagation();\n }\n },\n [searchValue, tableMeta, rowIndex, columnId]\n );\n\n const displayLabels = selectedValues.map((val) => optionByValue.get(val)?.label ?? val).filter(Boolean);\n\n const selectedValuesSet = React.useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const lineCount = getLineCount(rowHeight);\n\n const { visibleItems: visibleLabels, hiddenCount: hiddenBadgeCount } = useBadgeOverflow({\n items: displayLabels,\n getLabel: (label) => label,\n containerRef,\n lineCount\n });\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <div className=\"absolute inset-0\" />\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"w-[300px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Command className=\"[&_[data-slot=command-input-wrapper]]:h-auto [&_[data-slot=command-input-wrapper]]:gap-0 [&_[data-slot=command-input-wrapper]]:border-none [&_[data-slot=command-input-wrapper]]:p-0 [&_[data-slot=command-input-wrapper]_svg]:hidden\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-1 border-b px-3 py-1.5\">\n {selectedValues.map((value) => {\n const label = optionByValue.get(value)?.label ?? value;\n\n return (\n <Badge key={value} variant=\"secondary\" className=\"gap-1 px-1.5 py-px\">\n {label}\n <button\n type=\"button\"\n aria-label={`${msg.cell.clearAll}: ${label}`}\n onClick={(event) => removeValue(value, event)}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <X aria-hidden=\"true\" className=\"size-3\" />\n </button>\n </Badge>\n );\n })}\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\n onKeyDown={onInputKeyDown}\n placeholder={msg.cell.optionSearchPlaceholder}\n aria-label={msg.cell.optionSearchPlaceholder}\n className=\"h-auto flex-1 p-0\"\n />\n </div>\n <CommandList className=\"max-h-full\">\n <CommandEmpty>{msg.cell.optionEmpty}</CommandEmpty>\n <CommandGroup className=\"max-h-[300px] scroll-py-1 overflow-y-auto overflow-x-hidden\">\n {options.map((option) => {\n const isSelected = selectedValuesSet.has(option.value);\n\n return (\n <CommandItem key={option.value} value={option.label} onSelect={() => onValueChange(option.value)}>\n <div\n className={cn(\n \"flex size-4 items-center justify-center rounded-sm border border-choice-edge\",\n isSelected ? \"border-control-on bg-control-on text-control-check\" : \"[&_svg]:invisible\"\n )}\n >\n <Check className=\"size-3\" />\n </div>\n <span>{option.label}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n {selectedValues.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem onSelect={clearAll} className=\"justify-center text-muted-foreground\">\n {msg.cell.clearAll}\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : null}\n {selectedValues.length > 0 && renderValue ? (\n // ⚠ Khác bản gốc (3.2.0): app vẽ cả tập giá trị (AvatarGroup, StatusPill…) — xem `CellOpts`.\n // Hook gập \"+N\" ở trên vẫn chạy (hook không được gọi có điều kiện), chỉ là không dùng.\n <div data-slot=\"grid-cell-value\" className=\"relative flex min-w-0 items-center overflow-hidden\">\n {renderValue(\n selectedValues,\n selectedValues.map((val) => optionByValue.get(val) ?? { value: val, label: val })\n )}\n </div>\n ) : displayLabels.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1 overflow-hidden\">\n {visibleLabels.map((label, index) => (\n <Badge key={selectedValues[index]} variant=\"secondary\" className=\"px-1.5 py-px\">\n {label}\n </Badge>\n ))}\n {hiddenBadgeCount > 0 && (\n <Badge variant=\"outline\" className=\"px-1.5 py-px text-muted-foreground\">\n +{hiddenBadgeCount}\n </Badge>\n )}\n </div>\n ) : null}\n </DataGridCellWrapper>\n );\n}\n\nexport function DateCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n // Locale date-fns của lưới: tên thứ/tháng trong lịch và dạng ngày ngắn trong ô đi cùng ngôn ngữ.\n const dateLocale = useDataGridDateLocale();\n const initialValue = cell.getValue() as string;\n const [value, setValue] = React.useState(initialValue ?? \"\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const prevInitialValueRef = React.useRef(initialValue);\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue;\n setValue(initialValue ?? \"\");\n }\n\n // Parse date as local time to avoid timezone shifts\n const selectedDate = value ? (parseLocalDate(value) ?? undefined) : undefined;\n\n const onDateSelect = React.useCallback(\n (date: Date | undefined) => {\n if (!date || readOnly) return;\n\n // Format using local date components to avoid timezone issues\n const formattedDate = formatDateToString(date);\n setValue(formattedDate);\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: formattedDate });\n tableMeta?.onCellEditingStop?.();\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && event.key === \"Escape\") {\n event.preventDefault();\n setValue(initialValue);\n tableMeta?.onCellEditingStop?.();\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, initialValue, tableMeta]\n );\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n onKeyDown={onWrapperKeyDown}\n >\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <span data-slot=\"grid-cell-content\">{formatDateForDisplay(value, dateLocale)}</span>\n </PopoverAnchor>\n {isEditing && (\n <PopoverContent data-grid-cell-editor=\"\" align=\"start\" alignOffset={-8} className=\"w-auto p-0\">\n <Calendar\n mode=\"single\"\n locale={dateLocale}\n autoFocus\n defaultMonth={selectedDate ?? new Date()}\n selected={selectedDate}\n onSelect={(date) => {\n if (date) onDateSelect(date);\n }}\n />\n </PopoverContent>\n )}\n </Popover>\n </DataGridCellWrapper>\n );\n}\n\nexport function FileCell<TData>({\n cell,\n tableMeta,\n rowIndex,\n columnId,\n rowHeight,\n isFocused,\n isEditing,\n isSelected,\n isSearchMatch,\n isActiveSearchMatch,\n readOnly\n}: DataGridCellProps<TData>) {\n const msg = useDataGridMessages();\n const cellValue = React.useMemo(() => (cell.getValue() as FileCellData[]) ?? [], [cell]);\n\n const cellKey = getCellKey(rowIndex, columnId);\n const prevCellKeyRef = React.useRef(cellKey);\n\n const labelId = React.useId();\n const descriptionId = React.useId();\n\n const [files, setFiles] = React.useState<FileCellData[]>(cellValue);\n const [uploadingFiles, setUploadingFiles] = React.useState<Set<string>>(new Set());\n const [deletingFiles, setDeletingFiles] = React.useState<Set<string>>(new Set());\n const [isDraggingOver, setIsDraggingOver] = React.useState(false);\n const [isDragging, setIsDragging] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const isUploading = uploadingFiles.size > 0;\n const isDeleting = deletingFiles.size > 0;\n const isPending = isUploading || isDeleting;\n const containerRef = React.useRef<HTMLDivElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n const dropzoneRef = React.useRef<HTMLDivElement>(null);\n const cellOpts = cell.column.columnDef.meta?.cell;\n const sideOffset = -(containerRef.current?.clientHeight ?? 0);\n\n const fileCellOpts = cellOpts?.variant === \"file\" ? cellOpts : null;\n const maxFileSize = fileCellOpts?.maxFileSize ?? 10 * 1024 * 1024;\n const maxFiles = fileCellOpts?.maxFiles ?? 10;\n const accept = fileCellOpts?.accept;\n const multiple = fileCellOpts?.multiple ?? false;\n\n const acceptedTypes = React.useMemo(() => (accept ? accept.split(\",\").map((t) => t.trim()) : null), [accept]);\n\n const prevCellValueRef = React.useRef(cellValue);\n if (cellValue !== prevCellValueRef.current) {\n prevCellValueRef.current = cellValue;\n for (const file of files) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n setFiles(cellValue);\n setError(null);\n }\n\n if (prevCellKeyRef.current !== cellKey) {\n prevCellKeyRef.current = cellKey;\n setError(null);\n }\n\n const validateFile = React.useCallback(\n (file: File): string | null => {\n if (maxFileSize && file.size > maxFileSize) {\n return msg.file.tooLarge(formatFileSize(maxFileSize));\n }\n if (acceptedTypes) {\n const fileExtension = `.${file.name.split(\".\").pop()}`;\n const isAccepted = acceptedTypes.some((type) => {\n if (type.endsWith(\"/*\")) {\n const baseType = type.slice(0, -2);\n return file.type.startsWith(`${baseType}/`);\n }\n if (type.startsWith(\".\")) {\n return fileExtension.toLowerCase() === type.toLowerCase();\n }\n return file.type === type;\n });\n if (!isAccepted) {\n return msg.file.wrongType;\n }\n }\n return null;\n },\n [maxFileSize, acceptedTypes, msg]\n );\n\n const addFiles = React.useCallback(\n async (newFiles: File[], skipUpload = false) => {\n if (readOnly || isPending) return;\n setError(null);\n\n if (maxFiles && files.length + newFiles.length > maxFiles) {\n const errorMessage = msg.file.tooMany(maxFiles);\n setError(errorMessage);\n toastMessage(errorMessage);\n setTimeout(() => {\n setError(null);\n }, 2000);\n return;\n }\n\n const rejectedFiles: Array<{ name: string; reason: string }> = [];\n const filesToValidate: File[] = [];\n\n for (const file of newFiles) {\n const validationError = validateFile(file);\n if (validationError) {\n rejectedFiles.push({ name: file.name, reason: validationError });\n continue;\n }\n filesToValidate.push(file);\n }\n\n if (rejectedFiles.length > 0) {\n const firstError = rejectedFiles[0];\n if (firstError) {\n setError(firstError.reason);\n\n const truncatedName = firstError.name.length > 20 ? `${firstError.name.slice(0, 20)}...` : firstError.name;\n\n if (rejectedFiles.length === 1) {\n toastMessage(firstError.reason, msg.file.rejectedOne(truncatedName));\n } else {\n toastMessage(firstError.reason, msg.file.rejectedMany(truncatedName, rejectedFiles.length - 1));\n }\n\n setTimeout(() => {\n setError(null);\n }, 2000);\n }\n }\n\n if (filesToValidate.length > 0) {\n if (!skipUpload) {\n const tempFiles = filesToValidate.map((f) => ({\n id: generateFileId(),\n name: f.name,\n size: f.size,\n type: f.type,\n url: undefined\n }));\n const filesWithTemp = [...files, ...tempFiles];\n setFiles(filesWithTemp);\n\n const uploadingIds = new Set(tempFiles.map((f) => f.id));\n setUploadingFiles(uploadingIds);\n\n let uploadedFiles: FileCellData[] = [];\n\n if (tableMeta?.onFilesUpload) {\n try {\n uploadedFiles = await tableMeta.onFilesUpload({\n files: filesToValidate,\n rowIndex,\n columnId\n });\n } catch (error) {\n toastError(error instanceof Error ? error.message : msg.file.uploadFailed(filesToValidate.length));\n setFiles((prev) => prev.filter((f) => !uploadingIds.has(f.id)));\n setUploadingFiles(new Set());\n return;\n }\n } else {\n uploadedFiles = filesToValidate.map((f, i) => ({\n id: tempFiles[i]?.id ?? generateFileId(),\n name: f.name,\n size: f.size,\n type: f.type,\n url: URL.createObjectURL(f)\n }));\n }\n\n const finalFiles = filesWithTemp\n .map((f) => {\n if (uploadingIds.has(f.id)) {\n return uploadedFiles.find((uf) => uf.name === f.name) ?? f;\n }\n return f;\n })\n .filter((f) => f.url !== undefined);\n\n setFiles(finalFiles);\n setUploadingFiles(new Set());\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: finalFiles });\n } else {\n const newFilesData: FileCellData[] = filesToValidate.map((f) => ({\n id: generateFileId(),\n name: f.name,\n size: f.size,\n type: f.type,\n url: URL.createObjectURL(f)\n }));\n const updatedFiles = [...files, ...newFilesData];\n setFiles(updatedFiles);\n tableMeta?.onDataUpdate?.({\n rowIndex,\n columnId,\n value: updatedFiles\n });\n }\n }\n },\n [files, maxFiles, validateFile, tableMeta, rowIndex, columnId, readOnly, isPending, msg]\n );\n\n const removeFile = React.useCallback(\n async (fileId: string) => {\n if (readOnly || isPending) return;\n setError(null);\n\n const fileToRemove = files.find((f) => f.id === fileId);\n if (!fileToRemove) return;\n\n setDeletingFiles((prev) => new Set(prev).add(fileId));\n\n if (tableMeta?.onFilesDelete) {\n try {\n await tableMeta.onFilesDelete({\n fileIds: [fileId],\n rowIndex,\n columnId\n });\n } catch (error) {\n toastError(error instanceof Error ? error.message : msg.file.deleteFailed(fileToRemove.name));\n setDeletingFiles((prev) => {\n const next = new Set(prev);\n next.delete(fileId);\n return next;\n });\n return;\n }\n }\n\n if (fileToRemove.url?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(fileToRemove.url);\n }\n\n const updatedFiles = files.filter((f) => f.id !== fileId);\n setFiles(updatedFiles);\n setDeletingFiles((prev) => {\n const next = new Set(prev);\n next.delete(fileId);\n return next;\n });\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: updatedFiles });\n },\n [files, tableMeta, rowIndex, columnId, readOnly, isPending, msg]\n );\n\n const clearAll = React.useCallback(async () => {\n if (readOnly || isPending) return;\n setError(null);\n\n const fileIds = files.map((f) => f.id);\n setDeletingFiles(new Set(fileIds));\n\n if (tableMeta?.onFilesDelete && files.length > 0) {\n try {\n await tableMeta.onFilesDelete({\n fileIds,\n rowIndex,\n columnId\n });\n } catch (error) {\n toastError(error instanceof Error ? error.message : msg.file.deleteFailedMany);\n setDeletingFiles(new Set());\n return;\n }\n }\n\n for (const file of files) {\n if (file.url?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(file.url);\n }\n }\n setFiles([]);\n setDeletingFiles(new Set());\n tableMeta?.onDataUpdate?.({ rowIndex, columnId, value: [] });\n }, [files, tableMeta, rowIndex, columnId, readOnly, isPending, msg]);\n\n const onCellDragEnter = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer.types.includes(\"Files\")) {\n setIsDraggingOver(true);\n }\n }, []);\n\n const onCellDragLeave = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n const x = event.clientX;\n const y = event.clientY;\n\n if (x <= rect.left || x >= rect.right || y <= rect.top || y >= rect.bottom) {\n setIsDraggingOver(false);\n }\n }, []);\n\n const onCellDragOver = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const onCellDrop = React.useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setIsDraggingOver(false);\n\n const droppedFiles = Array.from(event.dataTransfer.files);\n if (droppedFiles.length > 0) {\n addFiles(droppedFiles, false);\n }\n },\n [addFiles]\n );\n\n const onDropzoneDragEnter = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const onDropzoneDragLeave = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n const x = event.clientX;\n const y = event.clientY;\n\n if (x <= rect.left || x >= rect.right || y <= rect.top || y >= rect.bottom) {\n setIsDragging(false);\n }\n }, []);\n\n const onDropzoneDragOver = React.useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const onDropzoneDrop = React.useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(false);\n\n const droppedFiles = Array.from(event.dataTransfer.files);\n addFiles(droppedFiles, false);\n },\n [addFiles]\n );\n\n const onDropzoneClick = React.useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n const onDropzoneKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onDropzoneClick();\n }\n },\n [onDropzoneClick]\n );\n\n const onFileInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFiles = Array.from(event.target.files ?? []);\n addFiles(selectedFiles, false);\n event.target.value = \"\";\n },\n [addFiles]\n );\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && !readOnly) {\n setError(null);\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else {\n setError(null);\n tableMeta?.onCellEditingStop?.();\n }\n },\n [tableMeta, rowIndex, columnId, readOnly]\n );\n\n const onEscapeKeyDown: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onEscapeKeyDown\"]> =\n React.useCallback((event) => {\n // Prevent the escape key from propagating to the data grid's keyboard handler\n // which would call blurCell() and remove focus from the cell\n event.stopPropagation();\n }, []);\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>[\"onOpenAutoFocus\"]> =\n React.useCallback((event) => {\n event.preventDefault();\n queueMicrotask(() => {\n dropzoneRef.current?.focus();\n });\n }, []);\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setFiles(cellValue);\n setError(null);\n tableMeta?.onCellEditingStop?.();\n } else if (event.key === \" \") {\n event.preventDefault();\n onDropzoneClick();\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n } else if (isFocused && event.key === \"Enter\") {\n event.preventDefault();\n tableMeta?.onCellEditingStart?.(rowIndex, columnId);\n } else if (isFocused && event.key === \"Tab\") {\n event.preventDefault();\n tableMeta?.onCellEditingStop?.({\n direction: event.shiftKey ? \"left\" : \"right\"\n });\n }\n },\n [isEditing, isFocused, cellValue, tableMeta, onDropzoneClick, rowIndex, columnId]\n );\n\n React.useEffect(() => {\n return () => {\n for (const file of files) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n };\n }, [files]);\n\n const lineCount = getLineCount(rowHeight);\n\n const { visibleItems: visibleFiles, hiddenCount: hiddenFileCount } = useBadgeOverflow({\n items: files,\n getLabel: (file) => file.name,\n containerRef,\n lineCount,\n cacheKeyPrefix: \"file\",\n iconSize: 12,\n maxWidth: 100\n });\n\n return (\n <DataGridCellWrapper<TData>\n ref={containerRef}\n cell={cell}\n tableMeta={tableMeta}\n rowIndex={rowIndex}\n columnId={columnId}\n rowHeight={rowHeight}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n isSearchMatch={isSearchMatch}\n isActiveSearchMatch={isActiveSearchMatch}\n readOnly={readOnly}\n className={cn({\n \"ring-1 ring-primary/80 ring-inset\": isDraggingOver\n })}\n onDragEnter={onCellDragEnter}\n onDragLeave={onCellDragLeave}\n onDragOver={onCellDragOver}\n onDrop={onCellDrop}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Popover open={isEditing} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <div className=\"absolute inset-0\" />\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"w-[400px] rounded-none p-0\"\n onEscapeKeyDown={onEscapeKeyDown}\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <div className=\"flex flex-col gap-2 p-3\">\n <span id={labelId} className=\"sr-only\">\n {msg.file.uploadLabel}\n </span>\n <div\n role=\"region\"\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n aria-invalid={!!error}\n aria-disabled={isPending}\n data-dragging={isDragging ? \"\" : undefined}\n data-invalid={error ? \"\" : undefined}\n data-disabled={isPending ? \"\" : undefined}\n tabIndex={isDragging || isPending ? -1 : 0}\n className=\"flex cursor-pointer flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed p-6 outline-none transition-colors hover:bg-accent/30 focus-visible:border-primary-ink focus-visible:outline-none data-[disabled]:pointer-events-none data-[dragging]:border-primary-ink data-[invalid]:border-destructive-ink data-[dragging]:bg-accent/30 data-[disabled]:opacity-50\"\n ref={dropzoneRef}\n onClick={onDropzoneClick}\n onDragEnter={onDropzoneDragEnter}\n onDragLeave={onDropzoneDragLeave}\n onDragOver={onDropzoneDragOver}\n onDrop={onDropzoneDrop}\n onKeyDown={onDropzoneKeyDown}\n >\n <Upload aria-hidden=\"true\" className=\"size-8 text-muted-foreground\" />\n <div className=\"text-center text-sm\">\n <p className=\"font-medium\">{isDragging ? msg.file.dropHere : msg.file.dragHere}</p>\n <p className=\"text-muted-foreground text-xs\">{msg.file.browse}</p>\n </div>\n <p id={descriptionId} className=\"text-muted-foreground text-xs\">\n {msg.file.limits(maxFileSize ? formatFileSize(maxFileSize) : undefined, maxFiles)}\n </p>\n </div>\n <input\n type=\"file\"\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n multiple={multiple}\n accept={accept}\n className=\"sr-only\"\n ref={fileInputRef}\n onChange={onFileInputChange}\n />\n {files.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium text-muted-foreground text-xs\">{msg.file.count(files.length)}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-muted-foreground text-xs\"\n onClick={clearAll}\n disabled={isPending}\n >\n {msg.file.clearAll}\n </Button>\n </div>\n <div className=\"max-h-[200px] space-y-1 overflow-y-auto\">\n {files.map((file) => {\n const FileIcon = getFileIcon(file.type);\n const isFileUploading = uploadingFiles.has(file.id);\n const isFileDeleting = deletingFiles.has(file.id);\n const isFilePending = isFileUploading || isFileDeleting;\n\n return (\n <div\n key={file.id}\n data-pending={isFilePending ? \"\" : undefined}\n className=\"flex items-center gap-2 rounded-md border bg-muted/50 px-2 py-1.5 data-[pending]:opacity-60\"\n >\n {FileIcon && <FileIcon className=\"size-4 shrink-0 text-muted-foreground\" />}\n <div className=\"flex-1 overflow-hidden\">\n <p className=\"truncate text-sm\">{file.name}</p>\n <p className=\"text-muted-foreground text-xs\">\n {isFileUploading\n ? msg.file.uploading\n : isFileDeleting\n ? msg.file.deleting\n : formatFileSize(file.size)}\n </p>\n </div>\n <Button\n type=\"button\"\n aria-label={`${msg.file.remove}: ${file.name}`}\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-5 rounded-sm\"\n onClick={() => removeFile(file.id)}\n disabled={isPending}\n >\n <X aria-hidden=\"true\" className=\"size-3\" />\n </Button>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n ) : null}\n {isDraggingOver ? (\n <div className=\"flex items-center justify-center gap-2 text-primary-ink text-sm\">\n <Upload aria-hidden=\"true\" className=\"size-4\" />\n <span>{msg.file.dropHere}</span>\n </div>\n ) : files.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1 overflow-hidden\">\n {visibleFiles.map((file) => {\n const isUploading = uploadingFiles.has(file.id);\n\n if (isUploading) {\n return (\n <Skeleton\n key={file.id}\n className=\"h-5 shrink-0 px-1.5\"\n style={{\n width: `${Math.min(file.name.length * 8 + 30, 100)}px`\n }}\n />\n );\n }\n\n const FileIcon = getFileIcon(file.type);\n\n return (\n <Badge key={file.id} variant=\"secondary\" className=\"gap-1 px-1.5 py-px\">\n {FileIcon && <FileIcon className=\"size-3 shrink-0\" />}\n <span className=\"max-w-[100px] truncate\">{file.name}</span>\n </Badge>\n );\n })}\n {hiddenFileCount > 0 && (\n <Badge variant=\"outline\" className=\"px-1.5 py-px text-muted-foreground\">\n +{hiddenFileCount}\n </Badge>\n )}\n </div>\n ) : null}\n </DataGridCellWrapper>\n );\n}\n"],"mappings":"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","names":["isSelected","error","isUploading"]}