@comitor/ui 2.1.0 → 3.0.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.
- package/README.md +63 -24
- package/dist/chart/chart.d.ts +6 -1
- package/dist/chart/chart.js +3 -1
- package/dist/chart/chart.js.map +1 -1
- package/dist/chart/comitor-chart.d.ts +4 -1
- package/dist/chart/comitor-chart.js +3 -1
- package/dist/chart/comitor-chart.js.map +1 -1
- package/dist/components/composite/avatar-group.d.ts +9 -6
- package/dist/components/composite/avatar-group.js +6 -2
- package/dist/components/composite/avatar-group.js.map +1 -1
- package/dist/components/composite/combobox.d.ts +11 -11
- package/dist/components/composite/combobox.js +25 -11
- package/dist/components/composite/combobox.js.map +1 -1
- package/dist/components/composite/command-palette-constants.d.ts +15 -5
- package/dist/components/composite/command-palette-constants.js +3 -2
- package/dist/components/composite/command-palette-constants.js.map +1 -1
- package/dist/components/composite/command-palette.d.ts +2 -2
- package/dist/components/composite/command-palette.js +8 -5
- package/dist/components/composite/command-palette.js.map +1 -1
- package/dist/components/composite/confirm-dialog.d.ts +8 -8
- package/dist/components/composite/confirm-dialog.js +8 -3
- package/dist/components/composite/confirm-dialog.js.map +1 -1
- package/dist/components/composite/copy-button.d.ts +7 -3
- package/dist/components/composite/copy-button.js +7 -3
- package/dist/components/composite/copy-button.js.map +1 -1
- package/dist/components/composite/data-table-constants.d.ts +7 -3
- package/dist/components/composite/data-table-constants.js +2 -9
- package/dist/components/composite/data-table-constants.js.map +1 -1
- package/dist/components/composite/data-table.js +3 -3
- package/dist/components/composite/data-table.js.map +1 -1
- package/dist/components/composite/date-picker-constants.d.ts +32 -9
- package/dist/components/composite/date-picker-constants.js +16 -11
- package/dist/components/composite/date-picker-constants.js.map +1 -1
- package/dist/components/composite/date-picker.d.ts +19 -10
- package/dist/components/composite/date-picker.js +33 -9
- package/dist/components/composite/date-picker.js.map +1 -1
- package/dist/components/composite/filter-chips.d.ts +4 -3
- package/dist/components/composite/filter-chips.js +6 -2
- package/dist/components/composite/filter-chips.js.map +1 -1
- package/dist/components/composite/inline-edit.d.ts +14 -3
- package/dist/components/composite/inline-edit.js +8 -4
- package/dist/components/composite/inline-edit.js.map +1 -1
- package/dist/components/composite/relative-time.d.ts +4 -4
- package/dist/components/composite/relative-time.js +4 -2
- package/dist/components/composite/relative-time.js.map +1 -1
- package/dist/components/composite/route-tabs-nav.d.ts +9 -0
- package/dist/components/composite/route-tabs-nav.js +11 -0
- package/dist/components/composite/route-tabs-nav.js.map +1 -0
- package/dist/components/composite/route-tabs.d.ts +4 -1
- package/dist/components/composite/route-tabs.js +3 -2
- package/dist/components/composite/route-tabs.js.map +1 -1
- package/dist/components/composite/search-filter-bar-constants.d.ts +18 -8
- package/dist/components/composite/search-filter-bar-constants.js +2 -14
- package/dist/components/composite/search-filter-bar-constants.js.map +1 -1
- package/dist/components/composite/search-filter-bar.d.ts +5 -2
- package/dist/components/composite/search-filter-bar.js +2 -2
- package/dist/components/composite/search-filter-bar.js.map +1 -1
- package/dist/components/composite/stat-card.d.ts +1 -1
- package/dist/components/composite/table-pagination-constants.d.ts +16 -11
- package/dist/components/composite/table-pagination-constants.js +2 -12
- package/dist/components/composite/table-pagination-constants.js.map +1 -1
- package/dist/components/composite/table-pagination.d.ts +6 -3
- package/dist/components/composite/table-pagination.js +3 -5
- package/dist/components/composite/table-pagination.js.map +1 -1
- package/dist/components/composite/toast.d.ts +5 -2
- package/dist/components/composite/toast.js +3 -1
- package/dist/components/composite/toast.js.map +1 -1
- package/dist/components/ui/action-bar-constants.d.ts +8 -4
- package/dist/components/ui/action-bar-constants.js +2 -5
- package/dist/components/ui/action-bar-constants.js.map +1 -1
- package/dist/components/ui/action-bar.d.ts +5 -4
- package/dist/components/ui/action-bar.js +47 -3
- package/dist/components/ui/action-bar.js.map +1 -1
- package/dist/components/ui/alert.d.ts +1 -1
- package/dist/components/ui/badge-overflow.d.ts +2 -2
- package/dist/components/ui/badge-overflow.js +4 -2
- package/dist/components/ui/badge-overflow.js.map +1 -1
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/banner.d.ts +6 -5
- package/dist/components/ui/banner.js +3 -1
- package/dist/components/ui/banner.js.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts +11 -4
- package/dist/components/ui/breadcrumb.js +7 -2
- package/dist/components/ui/breadcrumb.js.map +1 -1
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/calendar.d.ts +12 -5
- package/dist/components/ui/calendar.js +38 -3
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/components/ui/carousel.d.ts +4 -3
- package/dist/components/ui/carousel.js +11 -4
- package/dist/components/ui/carousel.js.map +1 -1
- package/dist/components/ui/circular-progress.js +10 -2
- package/dist/components/ui/circular-progress.js.map +1 -1
- package/dist/components/ui/command.d.ts +5 -4
- package/dist/components/ui/command.js +6 -2
- package/dist/components/ui/command.js.map +1 -1
- package/dist/components/ui/cropper-constants.d.ts +8 -3
- package/dist/components/ui/cropper-constants.js +2 -6
- package/dist/components/ui/cropper-constants.js.map +1 -1
- package/dist/components/ui/cropper.d.ts +2 -1
- package/dist/components/ui/cropper.js +2 -2
- package/dist/components/ui/cropper.js.map +1 -1
- package/dist/components/ui/dialog.d.ts +2 -2
- package/dist/components/ui/dialog.js +4 -1
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/item.d.ts +2 -2
- package/dist/components/ui/kanban-constants.d.ts +7 -1
- package/dist/components/ui/kanban-constants.js +2 -17
- package/dist/components/ui/kanban-constants.js.map +1 -1
- package/dist/components/ui/kanban.d.ts +2 -2
- package/dist/components/ui/kanban.js +11 -5
- package/dist/components/ui/kanban.js.map +1 -1
- package/dist/components/ui/key-value-constants.d.ts +7 -3
- package/dist/components/ui/key-value-constants.js +2 -7
- package/dist/components/ui/key-value-constants.js.map +1 -1
- package/dist/components/ui/key-value.d.ts +5 -5
- package/dist/components/ui/key-value.js +72 -78
- package/dist/components/ui/key-value.js.map +1 -1
- package/dist/components/ui/mask-input-constants.d.ts +2 -3
- package/dist/components/ui/mask-input-constants.js +36 -77
- package/dist/components/ui/mask-input-constants.js.map +1 -1
- package/dist/components/ui/mask-input.d.ts +7 -4
- package/dist/components/ui/mask-input.js +22 -22
- package/dist/components/ui/mask-input.js.map +1 -1
- package/dist/components/ui/mention.d.ts +3 -2
- package/dist/components/ui/mention.js +4 -6
- package/dist/components/ui/mention.js.map +1 -1
- package/dist/components/ui/pagination.d.ts +13 -9
- package/dist/components/ui/pagination.js +15 -6
- package/dist/components/ui/pagination.js.map +1 -1
- package/dist/components/ui/phone-input-constants.d.ts +17 -6
- package/dist/components/ui/phone-input-constants.js +2 -5
- package/dist/components/ui/phone-input-constants.js.map +1 -1
- package/dist/components/ui/phone-input.d.ts +18 -11
- package/dist/components/ui/phone-input.js +14 -12
- package/dist/components/ui/phone-input.js.map +1 -1
- package/dist/components/ui/progress.d.ts +2 -2
- package/dist/components/ui/rating.d.ts +2 -1
- package/dist/components/ui/rating.js +8 -4
- package/dist/components/ui/rating.js.map +1 -1
- package/dist/components/ui/scroll-spy.js +3 -1
- package/dist/components/ui/scroll-spy.js.map +1 -1
- package/dist/components/ui/sheet.d.ts +2 -2
- package/dist/components/ui/sheet.js +10 -1
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/slider.d.ts +1 -1
- package/dist/components/ui/slider.js +15 -1
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/sonner.js +2 -0
- package/dist/components/ui/sonner.js.map +1 -1
- package/dist/components/ui/spinner.js +4 -1
- package/dist/components/ui/spinner.js.map +1 -1
- package/dist/components/ui/stepper-constants.d.ts +7 -2
- package/dist/components/ui/stepper-constants.js +2 -5
- package/dist/components/ui/stepper-constants.js.map +1 -1
- package/dist/components/ui/stepper.d.ts +2 -1
- package/dist/components/ui/stepper.js +2 -2
- package/dist/components/ui/stepper.js.map +1 -1
- package/dist/components/ui/tags-input.d.ts +3 -2
- package/dist/components/ui/tags-input.js +4 -2
- package/dist/components/ui/tags-input.js.map +1 -1
- package/dist/components/ui/time-picker-constants.d.ts +12 -9
- package/dist/components/ui/time-picker-constants.js +2 -10
- package/dist/components/ui/time-picker-constants.js.map +1 -1
- package/dist/components/ui/time-picker.d.ts +11 -6
- package/dist/components/ui/time-picker.js +5 -7
- package/dist/components/ui/time-picker.js.map +1 -1
- package/dist/components/ui/toggle-group.js +12 -1
- package/dist/components/ui/toggle-group.js.map +1 -1
- package/dist/components/ui/toggle.d.ts +1 -1
- package/dist/components/ui/tour-constants.d.ts +7 -2
- package/dist/components/ui/tour-constants.js +2 -8
- package/dist/components/ui/tour-constants.js.map +1 -1
- package/dist/components/ui/tour.d.ts +3 -2
- package/dist/components/ui/tour.js +5 -4
- package/dist/components/ui/tour.js.map +1 -1
- package/dist/data-grid/data-grid-cell-variants.js +4 -4
- package/dist/data-grid/data-grid-cell-variants.js.map +1 -1
- package/dist/data-grid/data-grid-column-header.js +1 -1
- package/dist/data-grid/data-grid-column-header.js.map +1 -1
- package/dist/data-grid/data-grid-filter-menu.d.ts +5 -4
- package/dist/data-grid/data-grid-filter-menu.js +13 -8
- package/dist/data-grid/data-grid-filter-menu.js.map +1 -1
- package/dist/data-grid/data-grid-keyboard-shortcuts.d.ts +4 -4
- package/dist/data-grid/data-grid-keyboard-shortcuts.js.map +1 -1
- package/dist/data-grid/data-grid-locale.d.ts +58 -6
- package/dist/data-grid/data-grid-locale.js +41 -9
- package/dist/data-grid/data-grid-locale.js.map +1 -1
- package/dist/data-grid/data-grid-row-height-menu.d.ts +4 -3
- package/dist/data-grid/data-grid-row-height-menu.js.map +1 -1
- package/dist/data-grid/data-grid-sort-menu.d.ts +4 -4
- package/dist/data-grid/data-grid-sort-menu.js +1 -1
- package/dist/data-grid/data-grid-sort-menu.js.map +1 -1
- package/dist/data-grid/data-grid-view-menu.d.ts +4 -4
- package/dist/data-grid/data-grid-view-menu.js.map +1 -1
- package/dist/data-grid/data-grid.d.ts +4 -3
- package/dist/data-grid/data-grid.js +2 -3
- package/dist/data-grid/data-grid.js.map +1 -1
- package/dist/data-grid/index.d.ts +1 -0
- package/dist/data-grid/index.js.map +1 -1
- package/dist/data-grid/messages-en.d.ts +23 -4
- package/dist/data-grid/messages-en.js +20 -0
- package/dist/data-grid/messages-en.js.map +1 -1
- package/dist/data-grid/messages-vi.d.ts +3 -1
- package/dist/data-grid/messages-vi.js +14 -0
- package/dist/data-grid/messages-vi.js.map +1 -1
- package/dist/data-grid/messages.d.ts +29 -3
- package/dist/data-grid/messages.js.map +1 -1
- package/dist/data-grid/sortable.js +16 -19
- package/dist/data-grid/sortable.js.map +1 -1
- package/dist/data-grid/types.d.ts +1 -1
- package/dist/data-grid/use-data-grid-undo-redo.d.ts +5 -4
- package/dist/data-grid/use-data-grid-undo-redo.js +2 -2
- package/dist/data-grid/use-data-grid-undo-redo.js.map +1 -1
- package/dist/data-grid/use-data-grid.d.ts +23 -8
- package/dist/data-grid/use-data-grid.js +8 -6
- package/dist/data-grid/use-data-grid.js.map +1 -1
- package/dist/data-grid/utils.d.ts +24 -4
- package/dist/data-grid/utils.js +15 -5
- package/dist/data-grid/utils.js.map +1 -1
- package/dist/i18n/locale-provider.d.ts +127 -0
- package/dist/i18n/locale-provider.js +47 -0
- package/dist/i18n/locale-provider.js.map +1 -0
- package/dist/i18n/locale.d.ts +27 -0
- package/dist/i18n/locale.js +10 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages.d.ts +116 -0
- package/dist/i18n/messages.js +149 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/i18n/namespaces/action-bar.d.ts +7 -0
- package/dist/i18n/namespaces/action-bar.js +15 -0
- package/dist/i18n/namespaces/action-bar.js.map +1 -0
- package/dist/i18n/namespaces/avatar-group.d.ts +14 -0
- package/dist/i18n/namespaces/avatar-group.js +13 -0
- package/dist/i18n/namespaces/avatar-group.js.map +1 -0
- package/dist/i18n/namespaces/badge-overflow.d.ts +12 -0
- package/dist/i18n/namespaces/badge-overflow.js +11 -0
- package/dist/i18n/namespaces/badge-overflow.js.map +1 -0
- package/dist/i18n/namespaces/banner.d.ts +9 -0
- package/dist/i18n/namespaces/banner.js +7 -0
- package/dist/i18n/namespaces/banner.js.map +1 -0
- package/dist/i18n/namespaces/breadcrumb.d.ts +11 -0
- package/dist/i18n/namespaces/breadcrumb.js +13 -0
- package/dist/i18n/namespaces/breadcrumb.js.map +1 -0
- package/dist/i18n/namespaces/calendar.d.ts +40 -0
- package/dist/i18n/namespaces/calendar.js +25 -0
- package/dist/i18n/namespaces/calendar.js.map +1 -0
- package/dist/i18n/namespaces/carousel.d.ts +15 -0
- package/dist/i18n/namespaces/carousel.js +17 -0
- package/dist/i18n/namespaces/carousel.js.map +1 -0
- package/dist/i18n/namespaces/combobox.d.ts +21 -0
- package/dist/i18n/namespaces/combobox.js +23 -0
- package/dist/i18n/namespaces/combobox.js.map +1 -0
- package/dist/i18n/namespaces/command-palette.d.ts +20 -0
- package/dist/i18n/namespaces/command-palette.js +19 -0
- package/dist/i18n/namespaces/command-palette.js.map +1 -0
- package/dist/i18n/namespaces/command.d.ts +11 -0
- package/dist/i18n/namespaces/command.js +13 -0
- package/dist/i18n/namespaces/command.js.map +1 -0
- package/dist/i18n/namespaces/confirm-dialog.d.ts +13 -0
- package/dist/i18n/namespaces/confirm-dialog.js +15 -0
- package/dist/i18n/namespaces/confirm-dialog.js.map +1 -0
- package/dist/i18n/namespaces/contrast.d.ts +7 -0
- package/dist/i18n/namespaces/contrast.js +13 -0
- package/dist/i18n/namespaces/contrast.js.map +1 -0
- package/dist/i18n/namespaces/copy-button.d.ts +11 -0
- package/dist/i18n/namespaces/copy-button.js +13 -0
- package/dist/i18n/namespaces/copy-button.js.map +1 -0
- package/dist/i18n/namespaces/cropper.d.ts +7 -0
- package/dist/i18n/namespaces/cropper.js +17 -0
- package/dist/i18n/namespaces/cropper.js.map +1 -0
- package/dist/i18n/namespaces/data-table.d.ts +7 -0
- package/dist/i18n/namespaces/data-table.js +23 -0
- package/dist/i18n/namespaces/data-table.js.map +1 -0
- package/dist/i18n/namespaces/date-picker.d.ts +42 -0
- package/dist/i18n/namespaces/date-picker.js +35 -0
- package/dist/i18n/namespaces/date-picker.js.map +1 -0
- package/dist/i18n/namespaces/dialog.d.ts +9 -0
- package/dist/i18n/namespaces/dialog.js +7 -0
- package/dist/i18n/namespaces/dialog.js.map +1 -0
- package/dist/i18n/namespaces/display-axis.d.ts +25 -0
- package/dist/i18n/namespaces/display-axis.js +21 -0
- package/dist/i18n/namespaces/display-axis.js.map +1 -0
- package/dist/i18n/namespaces/file-upload.d.ts +11 -0
- package/dist/i18n/namespaces/file-upload.js +19 -0
- package/dist/i18n/namespaces/file-upload.js.map +1 -0
- package/dist/i18n/namespaces/filter-chips.d.ts +11 -0
- package/dist/i18n/namespaces/filter-chips.js +13 -0
- package/dist/i18n/namespaces/filter-chips.js.map +1 -0
- package/dist/i18n/namespaces/image-upload-field.d.ts +12 -0
- package/dist/i18n/namespaces/image-upload-field.js +23 -0
- package/dist/i18n/namespaces/image-upload-field.js.map +1 -0
- package/dist/i18n/namespaces/inline-edit.d.ts +15 -0
- package/dist/i18n/namespaces/inline-edit.js +17 -0
- package/dist/i18n/namespaces/inline-edit.js.map +1 -0
- package/dist/i18n/namespaces/kanban.d.ts +11 -0
- package/dist/i18n/namespaces/kanban.js +39 -0
- package/dist/i18n/namespaces/kanban.js.map +1 -0
- package/dist/i18n/namespaces/key-value.d.ts +10 -0
- package/dist/i18n/namespaces/key-value.js +19 -0
- package/dist/i18n/namespaces/key-value.js.map +1 -0
- package/dist/i18n/namespaces/mention.d.ts +9 -0
- package/dist/i18n/namespaces/mention.js +7 -0
- package/dist/i18n/namespaces/mention.js.map +1 -0
- package/dist/i18n/namespaces/pagination.d.ts +19 -0
- package/dist/i18n/namespaces/pagination.js +21 -0
- package/dist/i18n/namespaces/pagination.js.map +1 -0
- package/dist/i18n/namespaces/phone-input.d.ts +10 -0
- package/dist/i18n/namespaces/phone-input.js +17 -0
- package/dist/i18n/namespaces/phone-input.js.map +1 -0
- package/dist/i18n/namespaces/rating.d.ts +12 -0
- package/dist/i18n/namespaces/rating.js +12 -0
- package/dist/i18n/namespaces/rating.js.map +1 -0
- package/dist/i18n/namespaces/route-tabs.d.ts +9 -0
- package/dist/i18n/namespaces/route-tabs.js +7 -0
- package/dist/i18n/namespaces/route-tabs.js.map +1 -0
- package/dist/i18n/namespaces/scroll-spy.d.ts +9 -0
- package/dist/i18n/namespaces/scroll-spy.js +7 -0
- package/dist/i18n/namespaces/scroll-spy.js.map +1 -0
- package/dist/i18n/namespaces/search-filter-bar.d.ts +15 -0
- package/dist/i18n/namespaces/search-filter-bar.js +32 -0
- package/dist/i18n/namespaces/search-filter-bar.js.map +1 -0
- package/dist/i18n/namespaces/sheet.d.ts +9 -0
- package/dist/i18n/namespaces/sheet.js +7 -0
- package/dist/i18n/namespaces/sheet.js.map +1 -0
- package/dist/i18n/namespaces/shell.d.ts +21 -0
- package/dist/i18n/namespaces/shell.js +75 -0
- package/dist/i18n/namespaces/shell.js.map +1 -0
- package/dist/i18n/namespaces/spinner.d.ts +9 -0
- package/dist/i18n/namespaces/spinner.js +7 -0
- package/dist/i18n/namespaces/spinner.js.map +1 -0
- package/dist/i18n/namespaces/stepper.d.ts +7 -0
- package/dist/i18n/namespaces/stepper.js +15 -0
- package/dist/i18n/namespaces/stepper.js.map +1 -0
- package/dist/i18n/namespaces/table-pagination.d.ts +7 -0
- package/dist/i18n/namespaces/table-pagination.js +29 -0
- package/dist/i18n/namespaces/table-pagination.js.map +1 -0
- package/dist/i18n/namespaces/tags-input.d.ts +12 -0
- package/dist/i18n/namespaces/tags-input.js +11 -0
- package/dist/i18n/namespaces/tags-input.js.map +1 -0
- package/dist/i18n/namespaces/time-picker.d.ts +15 -0
- package/dist/i18n/namespaces/time-picker.js +25 -0
- package/dist/i18n/namespaces/time-picker.js.map +1 -0
- package/dist/i18n/namespaces/toast.d.ts +16 -0
- package/dist/i18n/namespaces/toast.js +7 -0
- package/dist/i18n/namespaces/toast.js.map +1 -0
- package/dist/i18n/namespaces/tour.d.ts +7 -0
- package/dist/i18n/namespaces/tour.js +21 -0
- package/dist/i18n/namespaces/tour.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/toast-language.d.ts +8 -0
- package/dist/lib/toast-language.js +19 -0
- package/dist/lib/toast-language.js.map +1 -0
- package/dist/shell/app-header.js.map +1 -1
- package/dist/shell/app-shell.d.ts +20 -2
- package/dist/shell/app-shell.js +4 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/contrast-constants.d.ts +9 -1
- package/dist/shell/contrast-constants.js +2 -4
- package/dist/shell/contrast-constants.js.map +1 -1
- package/dist/shell/contrast-toggle.d.ts +4 -1
- package/dist/shell/contrast-toggle.js +2 -2
- package/dist/shell/contrast-toggle.js.map +1 -1
- package/dist/shell/display-axis-constants.d.ts +2 -1
- package/dist/shell/display-axis-constants.js.map +1 -1
- package/dist/shell/display-axis-controls.d.ts +15 -6
- package/dist/shell/display-axis-controls.js +11 -9
- package/dist/shell/display-axis-controls.js.map +1 -1
- package/dist/shell/display-axis-provider.d.ts +1 -1
- package/dist/shell/mobile-menu.js.map +1 -1
- package/dist/shell/notifications-button.d.ts +1 -1
- package/dist/shell/notifications-button.js +3 -2
- package/dist/shell/notifications-button.js.map +1 -1
- package/dist/shell/shell-context.d.ts +4 -1
- package/dist/shell/shell-context.js +2 -4
- package/dist/shell/shell-context.js.map +1 -1
- package/dist/shell/sidebar.d.ts +1 -1
- package/dist/shell/sidebar.js.map +1 -1
- package/dist/shell/theme-toggle.d.ts +6 -3
- package/dist/shell/theme-toggle.js +2 -2
- package/dist/shell/theme-toggle.js.map +1 -1
- package/dist/shell/types.d.ts +14 -8
- package/dist/shell/types.js +2 -35
- package/dist/shell/types.js.map +1 -1
- package/dist/shell/user-menu.d.ts +6 -6
- package/dist/shell/user-menu.js.map +1 -1
- package/dist/shell/utils.d.ts +1 -1
- package/dist/shell/utils.js.map +1 -1
- package/dist/shell/workspace-switcher.js +1 -1
- package/dist/shell/workspace-switcher.js.map +1 -1
- package/dist/uploader/file-upload-constants.d.ts +13 -0
- package/dist/uploader/file-upload-constants.js +4 -16
- package/dist/uploader/file-upload-constants.js.map +1 -1
- package/dist/uploader/file-upload.d.ts +4 -1
- package/dist/uploader/file-upload.js +2 -2
- package/dist/uploader/file-upload.js.map +1 -1
- package/dist/uploader/image-upload-field.d.ts +5 -1
- package/dist/uploader/image-upload-field.js +2 -2
- package/dist/uploader/image-upload-field.js.map +1 -1
- package/dist/uploader/use-file-upload.d.ts +4 -0
- package/dist/uploader/use-file-upload.js +6 -2
- package/dist/uploader/use-file-upload.js.map +1 -1
- package/package.json +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-grid/data-grid-cell-variants.tsx"],"sourcesContent":["\"use client\";\n\nimport { vi } from \"date-fns/locale\";\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 { 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 && 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]\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) {\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, 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\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 ? (\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 <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 {option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\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 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 {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 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)}</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={vi}\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 && 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]\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) {\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, 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\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 ? (\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 <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 {option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\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 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 {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"]}
|
|
@@ -26,7 +26,7 @@ function DataGridColumnHeader({
|
|
|
26
26
|
const label = column.columnDef.meta?.label ? column.columnDef.meta.label : typeof column.columnDef.header === "string" ? column.columnDef.header : column.id;
|
|
27
27
|
const isAnyColumnResizing = table.getState().columnSizingInfo.isResizingColumn;
|
|
28
28
|
const cellVariant = column.columnDef.meta?.cell;
|
|
29
|
-
const columnVariant = getColumnVariant(cellVariant?.variant);
|
|
29
|
+
const columnVariant = getColumnVariant(cellVariant?.variant, msg);
|
|
30
30
|
const pinnedPosition = column.getIsPinned();
|
|
31
31
|
const isPinnedLeft = pinnedPosition === "left";
|
|
32
32
|
const isPinnedRight = pinnedPosition === "right";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-grid/data-grid-column-header.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ColumnSort, Header, SortDirection, SortingState, Table } from \"@tanstack/react-table\";\nimport { ChevronDownIcon, ChevronUpIcon, EyeOffIcon, PinIcon, PinOffIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"../components/ui/dropdown-menu.js\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../components/ui/tooltip.js\";\nimport { cn } from \"../lib/cn.js\";\nimport { useDataGridMessages } from \"./data-grid-locale.js\";\nimport { getColumnVariant } from \"./utils.js\";\n\ninterface DataGridColumnHeaderProps<TData, TValue> extends React.ComponentProps<typeof DropdownMenuTrigger> {\n header: Header<TData, TValue>;\n table: Table<TData>;\n}\n\nexport function DataGridColumnHeader<TData, TValue>({\n header,\n table,\n className,\n onPointerDown,\n ...props\n}: DataGridColumnHeaderProps<TData, TValue>) {\n const msg = useDataGridMessages();\n\n const column = header.column;\n const label = column.columnDef.meta?.label\n ? column.columnDef.meta.label\n : typeof column.columnDef.header === \"string\"\n ? column.columnDef.header\n : column.id;\n\n const isAnyColumnResizing = table.getState().columnSizingInfo.isResizingColumn;\n\n const cellVariant = column.columnDef.meta?.cell;\n const columnVariant = getColumnVariant(cellVariant?.variant);\n\n const pinnedPosition = column.getIsPinned();\n const isPinnedLeft = pinnedPosition === \"left\";\n const isPinnedRight = pinnedPosition === \"right\";\n\n const onSortingChange = React.useCallback(\n (direction: SortDirection) => {\n table.setSorting((prev: SortingState) => {\n const existingSortIndex = prev.findIndex((sort) => sort.id === column.id);\n const newSort: ColumnSort = {\n id: column.id,\n desc: direction === \"desc\"\n };\n\n if (existingSortIndex >= 0) {\n const updated = [...prev];\n updated[existingSortIndex] = newSort;\n return updated;\n } else {\n return [...prev, newSort];\n }\n });\n },\n [column.id, table]\n );\n\n const onSortRemove = React.useCallback(() => {\n table.setSorting((prev: SortingState) => prev.filter((sort) => sort.id !== column.id));\n }, [column.id, table]);\n\n const onLeftPin = React.useCallback(() => {\n column.pin(\"left\");\n }, [column]);\n\n const onRightPin = React.useCallback(() => {\n column.pin(\"right\");\n }, [column]);\n\n const onUnpin = React.useCallback(() => {\n column.pin(false);\n }, [column]);\n\n const onTriggerPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n onPointerDown?.(event);\n if (event.defaultPrevented) return;\n\n if (event.button !== 0) {\n return;\n }\n table.options.meta?.onColumnClick?.(column.id);\n },\n [table.options.meta, column.id, onPointerDown]\n );\n\n return (\n <>\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger\n className={cn(\n \"flex size-full items-center justify-between gap-2 p-2 text-sm hover:bg-accent/40 data-[state=open]:bg-accent/40 [&_svg]:size-4\",\n isAnyColumnResizing && \"pointer-events-none\",\n className\n )}\n onPointerDown={onTriggerPointerDown}\n {...props}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n {columnVariant && (\n <Tooltip delayDuration={100}>\n <TooltipTrigger asChild>\n <columnVariant.icon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </TooltipTrigger>\n {/* `TooltipContent` của gói TỰ portal ra ngoài — cần thiết vì hộp lưới\n có overflow-auto, không portal thì tooltip bị cắt. */}\n <TooltipContent side=\"top\">{columnVariant.label}</TooltipContent>\n </Tooltip>\n )}\n <span className=\"truncate\">{label}</span>\n </div>\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={0} className=\"w-60\">\n {column.getCanSort() && (\n <>\n <DropdownMenuCheckboxItem\n className=\"gap-2 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-muted-foreground\"\n checked={column.getIsSorted() === \"asc\"}\n onSelect={() => onSortingChange(\"asc\")}\n >\n <ChevronUpIcon />\n {msg.column.sortAsc}\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n className=\"gap-2 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-muted-foreground\"\n checked={column.getIsSorted() === \"desc\"}\n onSelect={() => onSortingChange(\"desc\")}\n >\n <ChevronDownIcon />\n {msg.column.sortDesc}\n </DropdownMenuCheckboxItem>\n {column.getIsSorted() && (\n <DropdownMenuItem onSelect={onSortRemove}>\n <XIcon />\n {msg.column.removeSort}\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanPin() && (\n <>\n {column.getCanSort() && <DropdownMenuSeparator />}\n\n {isPinnedLeft ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onUnpin}>\n <PinOffIcon />\n {msg.column.unpinLeft}\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onLeftPin}>\n <PinIcon />\n {msg.column.pinLeft}\n </DropdownMenuItem>\n )}\n {isPinnedRight ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onUnpin}>\n <PinOffIcon />\n {msg.column.unpinRight}\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onRightPin}>\n <PinIcon />\n {msg.column.pinRight}\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanHide() && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"[&_svg]:text-muted-foreground\"\n onSelect={() => column.toggleVisibility(false)}\n >\n <EyeOffIcon />\n {msg.column.hide}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {header.column.getCanResize() && <DataGridColumnResizer header={header} table={table} label={label} />}\n </>\n );\n}\n\nconst DataGridColumnResizer = React.memo(DataGridColumnResizerImpl, (prev, next) => {\n const prevColumn = prev.header.column;\n const nextColumn = next.header.column;\n\n if (prevColumn.getIsResizing() !== nextColumn.getIsResizing() || prevColumn.getSize() !== nextColumn.getSize()) {\n return false;\n }\n\n if (prev.label !== next.label) return false;\n\n return true;\n}) as typeof DataGridColumnResizerImpl;\n\ninterface DataGridColumnResizerProps<TData, TValue> extends DataGridColumnHeaderProps<TData, TValue> {\n label: string;\n}\n\nfunction DataGridColumnResizerImpl<TData, TValue>({ header, table, label }: DataGridColumnResizerProps<TData, TValue>) {\n const msg = useDataGridMessages();\n const defaultColumnDef = table._getDefaultColumnDef();\n\n const onDoubleClick = React.useCallback(() => {\n header.column.resetSize();\n }, [header.column]);\n\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={msg.column.resize(label)}\n aria-valuenow={header.column.getSize()}\n aria-valuemin={defaultColumnDef.minSize}\n aria-valuemax={defaultColumnDef.maxSize}\n tabIndex={0}\n className={cn(\n // Tay kéo chỉ hiện khi rê/focus/đang kéo, nên nó CHỈ mang đúng một màu — `--primary-ink`\n // (bậc NÉT). `--primary` trần là bậc tô NỀN: gold #E8B824 chỉ 1,73:1 với nền trang ở\n // light, tức một tay kéo nhìn thấy được ở dark mà gần như vô hình ở light.\n \"absolute -end-px top-0 z-50 h-full w-0.5 cursor-ew-resize touch-none select-none bg-primary-ink transition-opacity after:absolute after:inset-y-0 after:start-1/2 after:h-full after:w-[18px] after:-translate-x-1/2 after:content-[''] focus:outline-none\",\n header.column.getIsResizing() ? \"opacity-100\" : \"opacity-0 hover:opacity-100 focus:opacity-100\"\n )}\n onDoubleClick={onDoubleClick}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/data-grid/data-grid-column-header.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ColumnSort, Header, SortDirection, SortingState, Table } from \"@tanstack/react-table\";\nimport { ChevronDownIcon, ChevronUpIcon, EyeOffIcon, PinIcon, PinOffIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"../components/ui/dropdown-menu.js\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../components/ui/tooltip.js\";\nimport { cn } from \"../lib/cn.js\";\nimport { useDataGridMessages } from \"./data-grid-locale.js\";\nimport { getColumnVariant } from \"./utils.js\";\n\ninterface DataGridColumnHeaderProps<TData, TValue> extends React.ComponentProps<typeof DropdownMenuTrigger> {\n header: Header<TData, TValue>;\n table: Table<TData>;\n}\n\nexport function DataGridColumnHeader<TData, TValue>({\n header,\n table,\n className,\n onPointerDown,\n ...props\n}: DataGridColumnHeaderProps<TData, TValue>) {\n const msg = useDataGridMessages();\n\n const column = header.column;\n const label = column.columnDef.meta?.label\n ? column.columnDef.meta.label\n : typeof column.columnDef.header === \"string\"\n ? column.columnDef.header\n : column.id;\n\n const isAnyColumnResizing = table.getState().columnSizingInfo.isResizingColumn;\n\n const cellVariant = column.columnDef.meta?.cell;\n const columnVariant = getColumnVariant(cellVariant?.variant, msg);\n\n const pinnedPosition = column.getIsPinned();\n const isPinnedLeft = pinnedPosition === \"left\";\n const isPinnedRight = pinnedPosition === \"right\";\n\n const onSortingChange = React.useCallback(\n (direction: SortDirection) => {\n table.setSorting((prev: SortingState) => {\n const existingSortIndex = prev.findIndex((sort) => sort.id === column.id);\n const newSort: ColumnSort = {\n id: column.id,\n desc: direction === \"desc\"\n };\n\n if (existingSortIndex >= 0) {\n const updated = [...prev];\n updated[existingSortIndex] = newSort;\n return updated;\n } else {\n return [...prev, newSort];\n }\n });\n },\n [column.id, table]\n );\n\n const onSortRemove = React.useCallback(() => {\n table.setSorting((prev: SortingState) => prev.filter((sort) => sort.id !== column.id));\n }, [column.id, table]);\n\n const onLeftPin = React.useCallback(() => {\n column.pin(\"left\");\n }, [column]);\n\n const onRightPin = React.useCallback(() => {\n column.pin(\"right\");\n }, [column]);\n\n const onUnpin = React.useCallback(() => {\n column.pin(false);\n }, [column]);\n\n const onTriggerPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n onPointerDown?.(event);\n if (event.defaultPrevented) return;\n\n if (event.button !== 0) {\n return;\n }\n table.options.meta?.onColumnClick?.(column.id);\n },\n [table.options.meta, column.id, onPointerDown]\n );\n\n return (\n <>\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger\n className={cn(\n \"flex size-full items-center justify-between gap-2 p-2 text-sm hover:bg-accent/40 data-[state=open]:bg-accent/40 [&_svg]:size-4\",\n isAnyColumnResizing && \"pointer-events-none\",\n className\n )}\n onPointerDown={onTriggerPointerDown}\n {...props}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n {columnVariant && (\n <Tooltip delayDuration={100}>\n <TooltipTrigger asChild>\n <columnVariant.icon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </TooltipTrigger>\n {/* `TooltipContent` của gói TỰ portal ra ngoài — cần thiết vì hộp lưới\n có overflow-auto, không portal thì tooltip bị cắt. */}\n <TooltipContent side=\"top\">{columnVariant.label}</TooltipContent>\n </Tooltip>\n )}\n <span className=\"truncate\">{label}</span>\n </div>\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={0} className=\"w-60\">\n {column.getCanSort() && (\n <>\n <DropdownMenuCheckboxItem\n className=\"gap-2 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-muted-foreground\"\n checked={column.getIsSorted() === \"asc\"}\n onSelect={() => onSortingChange(\"asc\")}\n >\n <ChevronUpIcon />\n {msg.column.sortAsc}\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n className=\"gap-2 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-muted-foreground\"\n checked={column.getIsSorted() === \"desc\"}\n onSelect={() => onSortingChange(\"desc\")}\n >\n <ChevronDownIcon />\n {msg.column.sortDesc}\n </DropdownMenuCheckboxItem>\n {column.getIsSorted() && (\n <DropdownMenuItem onSelect={onSortRemove}>\n <XIcon />\n {msg.column.removeSort}\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanPin() && (\n <>\n {column.getCanSort() && <DropdownMenuSeparator />}\n\n {isPinnedLeft ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onUnpin}>\n <PinOffIcon />\n {msg.column.unpinLeft}\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onLeftPin}>\n <PinIcon />\n {msg.column.pinLeft}\n </DropdownMenuItem>\n )}\n {isPinnedRight ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onUnpin}>\n <PinOffIcon />\n {msg.column.unpinRight}\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onSelect={onRightPin}>\n <PinIcon />\n {msg.column.pinRight}\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanHide() && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"[&_svg]:text-muted-foreground\"\n onSelect={() => column.toggleVisibility(false)}\n >\n <EyeOffIcon />\n {msg.column.hide}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {header.column.getCanResize() && <DataGridColumnResizer header={header} table={table} label={label} />}\n </>\n );\n}\n\nconst DataGridColumnResizer = React.memo(DataGridColumnResizerImpl, (prev, next) => {\n const prevColumn = prev.header.column;\n const nextColumn = next.header.column;\n\n if (prevColumn.getIsResizing() !== nextColumn.getIsResizing() || prevColumn.getSize() !== nextColumn.getSize()) {\n return false;\n }\n\n if (prev.label !== next.label) return false;\n\n return true;\n}) as typeof DataGridColumnResizerImpl;\n\ninterface DataGridColumnResizerProps<TData, TValue> extends DataGridColumnHeaderProps<TData, TValue> {\n label: string;\n}\n\nfunction DataGridColumnResizerImpl<TData, TValue>({ header, table, label }: DataGridColumnResizerProps<TData, TValue>) {\n const msg = useDataGridMessages();\n const defaultColumnDef = table._getDefaultColumnDef();\n\n const onDoubleClick = React.useCallback(() => {\n header.column.resetSize();\n }, [header.column]);\n\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={msg.column.resize(label)}\n aria-valuenow={header.column.getSize()}\n aria-valuemin={defaultColumnDef.minSize}\n aria-valuemax={defaultColumnDef.maxSize}\n tabIndex={0}\n className={cn(\n // Tay kéo chỉ hiện khi rê/focus/đang kéo, nên nó CHỈ mang đúng một màu — `--primary-ink`\n // (bậc NÉT). `--primary` trần là bậc tô NỀN: gold #E8B824 chỉ 1,73:1 với nền trang ở\n // light, tức một tay kéo nhìn thấy được ở dark mà gần như vô hình ở light.\n \"absolute -end-px top-0 z-50 h-full w-0.5 cursor-ew-resize touch-none select-none bg-primary-ink transition-opacity after:absolute after:inset-y-0 after:start-1/2 after:h-full after:w-[18px] after:-translate-x-1/2 after:content-[''] focus:outline-none\",\n header.column.getIsResizing() ? \"opacity-100\" : \"opacity-0 hover:opacity-100 focus:opacity-100\"\n )}\n onDoubleClick={onDoubleClick}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n );\n}\n"],"mappings":"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","names":[]}
|