@gbmtech/aurora-ui 0.4.72 → 0.4.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/alert-dialog.cjs +1 -1
- package/dist/cjs/components/app-layout/index.cjs +1 -1
- package/dist/cjs/components/app-layout/index.cjs.map +1 -1
- package/dist/cjs/components/app-layout/sidebar/index.cjs +1 -1
- package/dist/cjs/components/app-layout/sidebar/index.cjs.map +1 -1
- package/dist/cjs/components/app-layout/sidebar/sidebar.cjs +1 -1
- package/dist/cjs/components/avatar.cjs +1 -1
- package/dist/cjs/components/badge.cjs +1 -1
- package/dist/cjs/components/breadcrumb.cjs +1 -1
- package/dist/cjs/components/button.cjs +1 -1
- package/dist/cjs/components/button.cjs.map +1 -1
- package/dist/cjs/components/button.d.ts.map +1 -1
- package/dist/cjs/components/command.cjs +1 -1
- package/dist/cjs/components/context-menu.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-action-bar.cjs +1 -1
- package/dist/cjs/components/date-picker-with-range.cjs +1 -1
- package/dist/cjs/components/date-picker-with-range.cjs.map +1 -1
- package/dist/cjs/components/dialog.cjs +1 -1
- package/dist/cjs/components/dropdown-menu.cjs +1 -1
- package/dist/cjs/components/faceted.cjs +1 -1
- package/dist/cjs/components/form.cjs +1 -1
- package/dist/cjs/components/input-otp.cjs +1 -1
- package/dist/cjs/components/multi-select.cjs +1 -1
- package/dist/cjs/components/multi-select.cjs.map +1 -1
- package/dist/cjs/components/pagination.cjs +1 -1
- package/dist/cjs/components/select.cjs +1 -1
- package/dist/cjs/components/separator.cjs +1 -1
- package/dist/cjs/components/sheet/sheet.cjs +1 -1
- package/dist/cjs/components/sortable.cjs +1 -1
- package/dist/cjs/components/table-expandable.cjs +1 -1
- package/dist/cjs/components/table.cjs +1 -1
- package/dist/cjs/components/tabs/tabs-root.cjs +1 -1
- package/dist/cjs/components/time-picker-input.cjs +1 -1
- package/dist/cjs/components/time-picker-input.cjs.map +1 -1
- package/dist/cjs/components/tooltip.cjs +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/lib/composition.cjs +1 -1
- package/dist/cjs/lib/data-table.cjs +1 -1
- package/dist/cjs/lib/index.cjs +1 -1
- package/dist/cjs/lib/parsers.cjs +1 -1
- package/dist/cjs/primitive/input.cjs +1 -1
- package/dist/esm/components/alert-dialog.js +1 -1
- package/dist/esm/components/alert-dialog.js.map +1 -1
- package/dist/esm/components/app-layout/app-layout-breadcrumb.js +1 -1
- package/dist/esm/components/app-layout/app-layout-breadcrumb.js.map +1 -1
- package/dist/esm/components/app-layout/app-layout-content.js +1 -1
- package/dist/esm/components/app-layout/app-layout-content.js.map +1 -1
- package/dist/esm/components/app-layout/app-layout-filters.js +1 -1
- package/dist/esm/components/app-layout/app-layout-filters.js.map +1 -1
- package/dist/esm/components/app-layout/app-layout-header.js +1 -1
- package/dist/esm/components/app-layout/app-layout-header.js.map +1 -1
- package/dist/esm/components/app-layout/app-layout-provider.js +1 -1
- package/dist/esm/components/app-layout/app-layout-provider.js.map +1 -1
- package/dist/esm/components/app-layout/app-layout.js +1 -1
- package/dist/esm/components/app-layout/app-layout.js.map +1 -1
- package/dist/esm/components/app-layout/sidebar/app-sidebar.js +1 -1
- package/dist/esm/components/app-layout/sidebar/app-sidebar.js.map +1 -1
- package/dist/esm/components/app-layout/sidebar/index.js +1 -2
- package/dist/esm/components/app-layout/sidebar/logo.js +1 -1
- package/dist/esm/components/app-layout/sidebar/logo.js.map +1 -1
- package/dist/esm/components/app-layout/sidebar/nav-modules.js +1 -1
- package/dist/esm/components/app-layout/sidebar/nav-modules.js.map +1 -1
- package/dist/esm/components/app-layout/sidebar/nav-sub-item.js +1 -1
- package/dist/esm/components/app-layout/sidebar/nav-sub-item.js.map +1 -1
- package/dist/esm/components/app-layout/sidebar/nav-user.js +1 -1
- package/dist/esm/components/app-layout/sidebar/nav-user.js.map +1 -1
- package/dist/esm/components/app-layout/sidebar/sidebar-icons.js +1 -1
- package/dist/esm/components/app-layout/sidebar/sidebar-icons.js.map +1 -1
- package/dist/esm/components/app-layout/sidebar/sidebar.js +1 -1
- package/dist/esm/components/app-layout/sidebar/sidebar.js.map +1 -1
- package/dist/esm/components/autocomplete/autocomplete-content.js +1 -1
- package/dist/esm/components/autocomplete/autocomplete-content.js.map +1 -1
- package/dist/esm/components/autocomplete/autocomplete-context.js +1 -1
- package/dist/esm/components/autocomplete/autocomplete-context.js.map +1 -1
- package/dist/esm/components/autocomplete/autocomplete-empty.js +1 -1
- package/dist/esm/components/autocomplete/autocomplete-empty.js.map +1 -1
- package/dist/esm/components/autocomplete/autocomplete-input.js +1 -1
- package/dist/esm/components/autocomplete/autocomplete-input.js.map +1 -1
- package/dist/esm/components/autocomplete/autocomplete-item.js +1 -1
- package/dist/esm/components/autocomplete/autocomplete-item.js.map +1 -1
- package/dist/esm/components/autocomplete/autocomplete-list.js +1 -1
- package/dist/esm/components/autocomplete/autocomplete-list.js.map +1 -1
- package/dist/esm/components/autocomplete/autocomplete.js +1 -1
- package/dist/esm/components/autocomplete/autocomplete.js.map +1 -1
- package/dist/esm/components/avatar.js +1 -1
- package/dist/esm/components/avatar.js.map +1 -1
- package/dist/esm/components/badge.js +1 -1
- package/dist/esm/components/badge.js.map +1 -1
- package/dist/esm/components/breadcrumb.js +1 -1
- package/dist/esm/components/breadcrumb.js.map +1 -1
- package/dist/esm/components/button.d.ts.map +1 -1
- package/dist/esm/components/button.js +1 -1
- package/dist/esm/components/button.js.map +1 -1
- package/dist/esm/components/calendar.js +1 -1
- package/dist/esm/components/calendar.js.map +1 -1
- package/dist/esm/components/checkbox.js +1 -1
- package/dist/esm/components/checkbox.js.map +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/combobox.js.map +1 -1
- package/dist/esm/components/command.js +1 -1
- package/dist/esm/components/command.js.map +1 -1
- package/dist/esm/components/context-menu.js +1 -1
- package/dist/esm/components/context-menu.js.map +1 -1
- package/dist/esm/components/data-table/data-table-action-bar.js +1 -1
- package/dist/esm/components/data-table/data-table-action-bar.js.map +1 -1
- package/dist/esm/components/data-table/data-table-advanced-toolbar.js +1 -1
- package/dist/esm/components/data-table/data-table-advanced-toolbar.js.map +1 -1
- package/dist/esm/components/data-table/data-table-column-header.js +1 -1
- package/dist/esm/components/data-table/data-table-column-header.js.map +1 -1
- package/dist/esm/components/data-table/data-table-date-filter.js +1 -1
- package/dist/esm/components/data-table/data-table-date-filter.js.map +1 -1
- package/dist/esm/components/data-table/data-table-faceted-filter.js +1 -1
- package/dist/esm/components/data-table/data-table-faceted-filter.js.map +1 -1
- package/dist/esm/components/data-table/data-table-filter-list.js +1 -1
- package/dist/esm/components/data-table/data-table-filter-list.js.map +1 -1
- package/dist/esm/components/data-table/data-table-filter-menu.js +1 -1
- package/dist/esm/components/data-table/data-table-filter-menu.js.map +1 -1
- package/dist/esm/components/data-table/data-table-pagination.js +1 -1
- package/dist/esm/components/data-table/data-table-pagination.js.map +1 -1
- package/dist/esm/components/data-table/data-table-range-filter.js +1 -1
- package/dist/esm/components/data-table/data-table-range-filter.js.map +1 -1
- package/dist/esm/components/data-table/data-table-skeleton.js +1 -1
- package/dist/esm/components/data-table/data-table-skeleton.js.map +1 -1
- package/dist/esm/components/data-table/data-table-slider-filter.js +1 -1
- package/dist/esm/components/data-table/data-table-slider-filter.js.map +1 -1
- package/dist/esm/components/data-table/data-table-sort-list.js +1 -1
- package/dist/esm/components/data-table/data-table-sort-list.js.map +1 -1
- package/dist/esm/components/data-table/data-table-toolbar.js +1 -1
- package/dist/esm/components/data-table/data-table-toolbar.js.map +1 -1
- package/dist/esm/components/data-table/data-table-view-options.js +1 -1
- package/dist/esm/components/data-table/data-table-view-options.js.map +1 -1
- package/dist/esm/components/data-table/data-table.js +1 -1
- package/dist/esm/components/data-table/data-table.js.map +1 -1
- package/dist/esm/components/date-picker-with-range.js +1 -1
- package/dist/esm/components/date-picker-with-range.js.map +1 -1
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/date-picker.js.map +1 -1
- package/dist/esm/components/date-time-picker-with-range.js +1 -1
- package/dist/esm/components/date-time-picker-with-range.js.map +1 -1
- package/dist/esm/components/datetime-picker/datetime-picker.js +1 -1
- package/dist/esm/components/datetime-picker/datetime-picker.js.map +1 -1
- package/dist/esm/components/datetime-picker/month-year-picker.js +1 -1
- package/dist/esm/components/datetime-picker/month-year-picker.js.map +1 -1
- package/dist/esm/components/datetime-picker/time-item.js +1 -1
- package/dist/esm/components/datetime-picker/time-item.js.map +1 -1
- package/dist/esm/components/dialog.js +1 -1
- package/dist/esm/components/dialog.js.map +1 -1
- package/dist/esm/components/dropdown-menu.js +1 -1
- package/dist/esm/components/dropdown-menu.js.map +1 -1
- package/dist/esm/components/faceted.js +1 -1
- package/dist/esm/components/faceted.js.map +1 -1
- package/dist/esm/components/form.js +1 -1
- package/dist/esm/components/form.js.map +1 -1
- package/dist/esm/components/icons/rumo.js +1 -1
- package/dist/esm/components/icons/rumo.js.map +1 -1
- package/dist/esm/components/icons/vli.js +1 -1
- package/dist/esm/components/icons/vli.js.map +1 -1
- package/dist/esm/components/input-otp.js +1 -1
- package/dist/esm/components/input-otp.js.map +1 -1
- package/dist/esm/components/input-password.js +1 -1
- package/dist/esm/components/input-password.js.map +1 -1
- package/dist/esm/components/input.js +1 -1
- package/dist/esm/components/input.js.map +1 -1
- package/dist/esm/components/label.js +1 -1
- package/dist/esm/components/label.js.map +1 -1
- package/dist/esm/components/mask-input.js +1 -1
- package/dist/esm/components/mask-input.js.map +1 -1
- package/dist/esm/components/multi-select.js +1 -1
- package/dist/esm/components/multi-select.js.map +1 -1
- package/dist/esm/components/pagination.js +1 -1
- package/dist/esm/components/pagination.js.map +1 -1
- package/dist/esm/components/popover.js +1 -1
- package/dist/esm/components/popover.js.map +1 -1
- package/dist/esm/components/radio-group.js +1 -1
- package/dist/esm/components/radio-group.js.map +1 -1
- package/dist/esm/components/scroll-area.js +1 -1
- package/dist/esm/components/scroll-area.js.map +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/select.js.map +1 -1
- package/dist/esm/components/separator.js +1 -1
- package/dist/esm/components/separator.js.map +1 -1
- package/dist/esm/components/sheet/sheet-content-variants.js +1 -1
- package/dist/esm/components/sheet/sheet-content-variants.js.map +1 -1
- package/dist/esm/components/sheet/sheet.js +1 -1
- package/dist/esm/components/sheet/sheet.js.map +1 -1
- package/dist/esm/components/skeleton.js +1 -1
- package/dist/esm/components/skeleton.js.map +1 -1
- package/dist/esm/components/slider.js +1 -1
- package/dist/esm/components/slider.js.map +1 -1
- package/dist/esm/components/sortable.js +3 -3
- package/dist/esm/components/sortable.js.map +1 -1
- package/dist/esm/components/spinner.js +1 -1
- package/dist/esm/components/spinner.js.map +1 -1
- package/dist/esm/components/switch.js +1 -1
- package/dist/esm/components/switch.js.map +1 -1
- package/dist/esm/components/table-expandable.js +1 -1
- package/dist/esm/components/table-expandable.js.map +1 -1
- package/dist/esm/components/table.js +1 -1
- package/dist/esm/components/table.js.map +1 -1
- package/dist/esm/components/tabs/index.js +1 -1
- package/dist/esm/components/tabs/index.js.map +1 -1
- package/dist/esm/components/tabs/tabs-content.js +1 -1
- package/dist/esm/components/tabs/tabs-content.js.map +1 -1
- package/dist/esm/components/tabs/tabs-list.js +1 -1
- package/dist/esm/components/tabs/tabs-list.js.map +1 -1
- package/dist/esm/components/tabs/tabs-root.js +1 -1
- package/dist/esm/components/tabs/tabs-root.js.map +1 -1
- package/dist/esm/components/tabs/tabs-trigger.js +1 -1
- package/dist/esm/components/tabs/tabs-trigger.js.map +1 -1
- package/dist/esm/components/textarea.js +1 -1
- package/dist/esm/components/textarea.js.map +1 -1
- package/dist/esm/components/theme-provider.js +1 -1
- package/dist/esm/components/theme-provider.js.map +1 -1
- package/dist/esm/components/theme-toggle.js +1 -1
- package/dist/esm/components/theme-toggle.js.map +1 -1
- package/dist/esm/components/time-picker-input.js +1 -1
- package/dist/esm/components/time-picker-input.js.map +1 -1
- package/dist/esm/components/time-picker.js +1 -1
- package/dist/esm/components/time-picker.js.map +1 -1
- package/dist/esm/components/title.js +1 -1
- package/dist/esm/components/title.js.map +1 -1
- package/dist/esm/components/tokens-grid.js +1 -1
- package/dist/esm/components/tokens-grid.js.map +1 -1
- package/dist/esm/components/tooltip.js +1 -1
- package/dist/esm/components/tooltip.js.map +1 -1
- package/dist/esm/hooks/use-callback-ref.js +1 -1
- package/dist/esm/hooks/use-callback-ref.js.map +1 -1
- package/dist/esm/hooks/use-data-table.js +1 -1
- package/dist/esm/hooks/use-data-table.js.map +1 -1
- package/dist/esm/hooks/use-debounce.js +1 -1
- package/dist/esm/hooks/use-debounce.js.map +1 -1
- package/dist/esm/hooks/use-debounced-callback.js +1 -1
- package/dist/esm/hooks/use-debounced-callback.js.map +1 -1
- package/dist/esm/hooks/use-mobile.js +1 -1
- package/dist/esm/hooks/use-mobile.js.map +1 -1
- package/dist/esm/lib/composition.js +1 -1
- package/dist/esm/lib/composition.js.map +1 -1
- package/dist/esm/lib/data-table.js +1 -1
- package/dist/esm/lib/data-table.js.map +1 -1
- package/dist/esm/lib/id.js +1 -1
- package/dist/esm/lib/id.js.map +1 -1
- package/dist/esm/lib/parsers.js +1 -1
- package/dist/esm/lib/parsers.js.map +1 -1
- package/dist/esm/lib/utils.js +1 -1
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/primitive/input.js +1 -1
- package/dist/esm/primitive/input.js.map +1 -1
- package/package.json +8 -8
- package/dist/esm/components/app-layout/sidebar/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components\\data-table\\data-table-filter-menu.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-filter-menu.tsx"],"sourcesContent":["\r\n\r\nimport {\r\n Calendar as CalendarIcon,\r\n Check,\r\n FunnelSimple,\r\n SealCheck,\r\n TextAlignLeft,\r\n X,\r\n} from '@phosphor-icons/react'\r\nimport type { Column, Table } from '@tanstack/react-table'\r\nimport { useQueryState } from 'nuqs'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '@/components/button'\r\nimport { Calendar } from '@/components/calendar'\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n} from '@/components/command'\r\nimport { DataTableRangeFilter } from '@/components/data-table/data-table-range-filter'\r\nimport { Input } from '@/components/input'\r\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/popover'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '@/components/select'\r\nimport { useDebouncedCallback } from '@/hooks/use-debounced-callback'\r\nimport { getDefaultFilterOperator, getFilterOperators } from '@/lib/data-table'\r\nimport { formatDate } from '@/lib/format'\r\nimport { generateId } from '@/lib/id'\r\nimport { getFiltersStateParser } from '@/lib/parsers'\r\nimport { cn } from '@/lib/utils'\r\nimport type { ExtendedColumnFilter, FilterOperator } from '@/types/data-table'\r\n\r\nconst FILTERS_KEY = 'filters'\r\nconst DEBOUNCE_MS = 300\r\nconst THROTTLE_MS = 50\r\nconst OPEN_MENU_SHORTCUT = 'f'\r\nconst REMOVE_FILTER_SHORTCUTS = ['backspace', 'delete']\r\n\r\ninterface DataTableFilterMenuProps<TData>\r\n extends React.ComponentProps<typeof PopoverContent> {\r\n table: Table<TData>\r\n debounceMs?: number\r\n throttleMs?: number\r\n shallow?: boolean\r\n}\r\n\r\nexport function DataTableFilterMenu<TData>({\r\n table,\r\n debounceMs = DEBOUNCE_MS,\r\n throttleMs = THROTTLE_MS,\r\n shallow = true,\r\n align = 'start',\r\n ...props\r\n}: DataTableFilterMenuProps<TData>) {\r\n const id = React.useId()\r\n\r\n const columns = React.useMemo(() => {\r\n return table\r\n .getAllColumns()\r\n .filter(column => column.columnDef.enableColumnFilter)\r\n }, [table])\r\n\r\n const [open, setOpen] = React.useState(false)\r\n const [selectedColumn, setSelectedColumn] =\r\n React.useState<Column<TData> | null>(null)\r\n const [inputValue, setInputValue] = React.useState('')\r\n const triggerRef = React.useRef<HTMLButtonElement>(null)\r\n const inputRef = React.useRef<HTMLInputElement>(null)\r\n\r\n const onOpenChange = React.useCallback((open: boolean) => {\r\n setOpen(open)\r\n\r\n if (!open) {\r\n setTimeout(() => {\r\n setSelectedColumn(null)\r\n setInputValue('')\r\n }, 100)\r\n }\r\n }, [])\r\n\r\n const onInputKeyDown = React.useCallback(\r\n (event: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (\r\n REMOVE_FILTER_SHORTCUTS.includes(event.key.toLowerCase()) &&\r\n !inputValue &&\r\n selectedColumn\r\n ) {\r\n event.preventDefault()\r\n setSelectedColumn(null)\r\n }\r\n },\r\n [inputValue, selectedColumn]\r\n )\r\n\r\n const [filters, setFilters] = useQueryState(\r\n FILTERS_KEY,\r\n getFiltersStateParser<TData>(columns.map(field => field.id))\r\n .withDefault([])\r\n .withOptions({\r\n clearOnDefault: true,\r\n shallow,\r\n throttleMs,\r\n })\r\n )\r\n const debouncedSetFilters = useDebouncedCallback(setFilters, debounceMs)\r\n\r\n const onFilterAdd = React.useCallback(\r\n (column: Column<TData>, value: string) => {\r\n if (!value.trim() && column.columnDef.meta?.variant !== 'boolean') {\r\n return\r\n }\r\n\r\n const filterValue =\r\n column.columnDef.meta?.variant === 'multiSelect' ? [value] : value\r\n\r\n const newFilter: ExtendedColumnFilter<TData> = {\r\n id: column.id as Extract<keyof TData, string>,\r\n value: filterValue,\r\n variant: column.columnDef.meta?.variant ?? 'text',\r\n operator: getDefaultFilterOperator(\r\n column.columnDef.meta?.variant ?? 'text'\r\n ),\r\n filterId: generateId({ length: 8 }),\r\n }\r\n\r\n debouncedSetFilters([...filters, newFilter])\r\n setOpen(false)\r\n\r\n setTimeout(() => {\r\n setSelectedColumn(null)\r\n setInputValue('')\r\n }, 100)\r\n },\r\n [filters, debouncedSetFilters]\r\n )\r\n\r\n const onFilterRemove = React.useCallback(\r\n (filterId: string) => {\r\n const updatedFilters = filters.filter(\r\n filter => filter.filterId !== filterId\r\n )\r\n debouncedSetFilters(updatedFilters)\r\n requestAnimationFrame(() => {\r\n triggerRef.current?.focus()\r\n })\r\n },\r\n [filters, debouncedSetFilters]\r\n )\r\n\r\n const onFilterUpdate = React.useCallback(\r\n (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => {\r\n debouncedSetFilters(prevFilters => {\r\n const updatedFilters = prevFilters.map(filter => {\r\n if (filter.filterId === filterId) {\r\n return { ...filter, ...updates } as ExtendedColumnFilter<TData>\r\n }\r\n return filter\r\n })\r\n return updatedFilters\r\n })\r\n },\r\n [debouncedSetFilters]\r\n )\r\n\r\n const onFiltersReset = React.useCallback(() => {\r\n debouncedSetFilters([])\r\n }, [debouncedSetFilters])\r\n\r\n React.useEffect(() => {\r\n function onKeyDown(event: KeyboardEvent) {\r\n if (\r\n event.target instanceof HTMLInputElement ||\r\n event.target instanceof HTMLTextAreaElement\r\n ) {\r\n return\r\n }\r\n\r\n if (\r\n event.key.toLowerCase() === OPEN_MENU_SHORTCUT &&\r\n !event.ctrlKey &&\r\n !event.metaKey &&\r\n !event.shiftKey\r\n ) {\r\n event.preventDefault()\r\n setOpen(true)\r\n }\r\n\r\n if (\r\n event.key.toLowerCase() === OPEN_MENU_SHORTCUT &&\r\n event.shiftKey &&\r\n !open &&\r\n filters.length > 0\r\n ) {\r\n event.preventDefault()\r\n onFilterRemove(filters[filters.length - 1]?.filterId ?? '')\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', onKeyDown)\r\n return () => window.removeEventListener('keydown', onKeyDown)\r\n }, [open, filters, onFilterRemove])\r\n\r\n const onTriggerKeyDown = React.useCallback(\r\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\r\n if (\r\n REMOVE_FILTER_SHORTCUTS.includes(event.key.toLowerCase()) &&\r\n filters.length > 0\r\n ) {\r\n event.preventDefault()\r\n onFilterRemove(filters[filters.length - 1]?.filterId ?? '')\r\n }\r\n },\r\n [filters, onFilterRemove]\r\n )\r\n\r\n return (\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {filters.map(filter => (\r\n <DataTableFilterItem\r\n key={filter.filterId}\r\n filter={filter}\r\n filterItemId={`${id}-filter-${filter.filterId}`}\r\n columns={columns}\r\n onFilterUpdate={onFilterUpdate}\r\n onFilterRemove={onFilterRemove}\r\n />\r\n ))}\r\n {filters.length > 0 && (\r\n <Button\r\n aria-label=\"Reset all filters\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-8\"\r\n onClick={onFiltersReset}\r\n >\r\n <X />\r\n </Button>\r\n )}\r\n <Popover open={open} onOpenChange={onOpenChange}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n aria-label=\"Open filter command menu\"\r\n variant=\"outline\"\r\n size={filters.length > 0 ? 'icon' : 'sm'}\r\n className={cn(filters.length > 0 && 'size-8', 'h-10')}\r\n ref={triggerRef}\r\n onKeyDown={onTriggerKeyDown}\r\n >\r\n <FunnelSimple />\r\n {filters.length > 0 ? null : 'Filter'}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n align={align}\r\n className=\"w-full max-w-[var(--radix-popover-content-available-width)] origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n {...props}\r\n >\r\n <Command loop className=\"[&_[cmdk-input-wrapper]_svg]:hidden\">\r\n <CommandInput\r\n ref={inputRef}\r\n placeholder={\r\n selectedColumn\r\n ? (selectedColumn.columnDef.meta?.label ?? selectedColumn.id)\r\n : 'Search fields...'\r\n }\r\n value={inputValue}\r\n onValueChange={setInputValue}\r\n onKeyDown={onInputKeyDown}\r\n />\r\n <CommandList>\r\n {selectedColumn ? (\r\n <>\r\n {selectedColumn.columnDef.meta?.options && (\r\n <CommandEmpty>No options found.</CommandEmpty>\r\n )}\r\n <FilterValueSelector\r\n column={selectedColumn}\r\n value={inputValue}\r\n onSelect={value => onFilterAdd(selectedColumn, value)}\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <CommandEmpty>No fields found.</CommandEmpty>\r\n <CommandGroup>\r\n {columns.map(column => (\r\n <CommandItem\r\n key={column.id}\r\n value={column.id}\r\n onSelect={() => {\r\n setSelectedColumn(column)\r\n setInputValue('')\r\n requestAnimationFrame(() => {\r\n inputRef.current?.focus()\r\n })\r\n }}\r\n >\r\n {column.columnDef.meta?.icon && (\r\n <column.columnDef.meta.icon />\r\n )}\r\n <span className=\"truncate\">\r\n {column.columnDef.meta?.label ?? column.id}\r\n </span>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </>\r\n )}\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n )\r\n}\r\n\r\ninterface DataTableFilterItemProps<TData> {\r\n filter: ExtendedColumnFilter<TData>\r\n filterItemId: string\r\n columns: Column<TData>[]\r\n onFilterUpdate: (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => void\r\n onFilterRemove: (filterId: string) => void\r\n}\r\n\r\nfunction DataTableFilterItem<TData>({\r\n filter,\r\n filterItemId,\r\n columns,\r\n onFilterUpdate,\r\n onFilterRemove,\r\n}: DataTableFilterItemProps<TData>) {\r\n {\r\n const [showFieldSelector, setShowFieldSelector] = React.useState(false)\r\n const [showOperatorSelector, setShowOperatorSelector] =\r\n React.useState(false)\r\n const [showValueSelector, setShowValueSelector] = React.useState(false)\r\n\r\n const column = columns.find(column => column.id === filter.id)\r\n if (!column) return null\r\n\r\n const operatorListboxId = `${filterItemId}-operator-listbox`\r\n const inputId = `${filterItemId}-input`\r\n\r\n const columnMeta = column.columnDef.meta\r\n const filterOperators = getFilterOperators(filter.variant)\r\n\r\n const onItemKeyDown = React.useCallback(\r\n (event: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (\r\n event.target instanceof HTMLInputElement ||\r\n event.target instanceof HTMLTextAreaElement\r\n ) {\r\n return\r\n }\r\n\r\n if (showFieldSelector || showOperatorSelector || showValueSelector) {\r\n return\r\n }\r\n\r\n if (REMOVE_FILTER_SHORTCUTS.includes(event.key.toLowerCase())) {\r\n event.preventDefault()\r\n onFilterRemove(filter.filterId)\r\n }\r\n },\r\n [\r\n filter.filterId,\r\n showFieldSelector,\r\n showOperatorSelector,\r\n showValueSelector,\r\n onFilterRemove,\r\n ]\r\n )\r\n\r\n return (\r\n <div\r\n key={filter.filterId}\r\n role=\"listitem\"\r\n id={filterItemId}\r\n className=\"flex h-10 items-center rounded-md bg-background\"\r\n onKeyDown={onItemKeyDown}\r\n >\r\n <Popover open={showFieldSelector} onOpenChange={setShowFieldSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"rounded-none rounded-l-md border border-r-0 font-normal dark:bg-input/30\"\r\n >\r\n {columnMeta?.icon && (\r\n <columnMeta.icon className=\"text-muted-foreground\" />\r\n )}\r\n {columnMeta?.label ?? column.id}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n align=\"start\"\r\n className=\"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n <Command loop>\r\n <CommandInput placeholder=\"Search fields...\" />\r\n <CommandList>\r\n <CommandEmpty>No fields found.</CommandEmpty>\r\n <CommandGroup>\r\n {columns.map(column => (\r\n <CommandItem\r\n key={column.id}\r\n value={column.id}\r\n onSelect={() => {\r\n onFilterUpdate(filter.filterId, {\r\n id: column.id as Extract<keyof TData, string>,\r\n variant: column.columnDef.meta?.variant ?? 'text',\r\n operator: getDefaultFilterOperator(\r\n column.columnDef.meta?.variant ?? 'text'\r\n ),\r\n value: '',\r\n })\r\n\r\n setShowFieldSelector(false)\r\n }}\r\n >\r\n {column.columnDef.meta?.icon && (\r\n <column.columnDef.meta.icon />\r\n )}\r\n <span className=\"truncate\">\r\n {column.columnDef.meta?.label ?? column.id}\r\n </span>\r\n <Check\r\n className={cn(\r\n 'ml-auto',\r\n column.id === filter.id ? 'opacity-100' : 'opacity-0'\r\n )}\r\n />\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n <Select\r\n open={showOperatorSelector}\r\n onOpenChange={setShowOperatorSelector}\r\n value={filter.operator}\r\n onValueChange={(value: FilterOperator) =>\r\n onFilterUpdate(filter.filterId, {\r\n operator: value,\r\n value:\r\n value === 'isEmpty' || value === 'isNotEmpty'\r\n ? ''\r\n : filter.value,\r\n })\r\n }\r\n >\r\n <SelectTrigger\r\n aria-controls={operatorListboxId}\r\n className=\"h-10 rounded-none border-r-0 px-2.5 lowercase [&[data-size]]:h-10 [&_svg]:hidden\"\r\n >\r\n <SelectValue placeholder={filter.operator} />\r\n </SelectTrigger>\r\n <SelectContent\r\n id={operatorListboxId}\r\n className=\"origin-[var(--radix-select-content-transform-origin)]\"\r\n >\r\n {filterOperators.map(operator => (\r\n <SelectItem\r\n key={operator.value}\r\n className=\"lowercase\"\r\n value={operator.value}\r\n >\r\n {operator.label}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n {onFilterInputRender({\r\n filter,\r\n column,\r\n inputId,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n })}\r\n <Button\r\n aria-controls={filterItemId}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-full rounded-none rounded-r-md border border-l-0 px-1.5 font-normal dark:bg-input/30\"\r\n onClick={() => onFilterRemove(filter.filterId)}\r\n >\r\n <X className=\"size-3.5\" />\r\n </Button>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\ninterface FilterValueSelectorProps<TData> {\r\n column: Column<TData>\r\n value: string\r\n onSelect: (value: string) => void\r\n}\r\n\r\nfunction FilterValueSelector<TData>({\r\n column,\r\n value,\r\n onSelect,\r\n}: FilterValueSelectorProps<TData>) {\r\n const variant = column.columnDef.meta?.variant ?? 'text'\r\n\r\n switch (variant) {\r\n case 'boolean':\r\n return (\r\n <CommandGroup>\r\n <CommandItem value=\"true\" onSelect={() => onSelect('true')}>\r\n True\r\n </CommandItem>\r\n <CommandItem value=\"false\" onSelect={() => onSelect('false')}>\r\n False\r\n </CommandItem>\r\n </CommandGroup>\r\n )\r\n\r\n case 'select':\r\n case 'multiSelect':\r\n return (\r\n <CommandGroup>\r\n {column.columnDef.meta?.options?.map(option => (\r\n <CommandItem\r\n key={option.value}\r\n value={option.value}\r\n onSelect={() => onSelect(option.value)}\r\n >\r\n {option.icon && <option.icon />}\r\n <span className=\"truncate\">{option.label}</span>\r\n {option.count && (\r\n <span className=\"ml-auto font-mono text-xs\">\r\n {option.count}\r\n </span>\r\n )}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n )\r\n\r\n case 'date':\r\n case 'dateRange':\r\n return (\r\n <Calendar\r\n initialFocus\r\n mode=\"single\"\r\n selected={value ? new Date(value) : undefined}\r\n onSelect={date => onSelect(date?.getTime().toString() ?? '')}\r\n />\r\n )\r\n\r\n default: {\r\n const isEmpty = !value.trim()\r\n\r\n return (\r\n <CommandGroup>\r\n <CommandItem\r\n value={value}\r\n onSelect={() => onSelect(value)}\r\n disabled={isEmpty}\r\n >\r\n {isEmpty ? (\r\n <>\r\n <TextAlignLeft />\r\n <span>Type to add filter...</span>\r\n </>\r\n ) : (\r\n <>\r\n <SealCheck />\r\n <span className=\"truncate\">Filter by "{value}"</span>\r\n </>\r\n )}\r\n </CommandItem>\r\n </CommandGroup>\r\n )\r\n }\r\n }\r\n}\r\n\r\nfunction onFilterInputRender<TData>({\r\n filter,\r\n column,\r\n inputId,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n}: {\r\n filter: ExtendedColumnFilter<TData>\r\n column: Column<TData>\r\n inputId: string\r\n onFilterUpdate: (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => void\r\n showValueSelector: boolean\r\n setShowValueSelector: (value: boolean) => void\r\n}) {\r\n if (filter.operator === 'isEmpty' || filter.operator === 'isNotEmpty') {\r\n return (\r\n <div\r\n id={inputId}\r\n role=\"status\"\r\n aria-label={`${column.columnDef.meta?.label} filter is ${\r\n filter.operator === 'isEmpty' ? 'empty' : 'not empty'\r\n }`}\r\n aria-live=\"polite\"\r\n className=\"h-full w-16 rounded-none border bg-transparent px-1.5 py-0.5 text-muted-foreground dark:bg-input/30\"\r\n />\r\n )\r\n }\r\n\r\n switch (filter.variant) {\r\n case 'text':\r\n case 'number':\r\n case 'range': {\r\n if (\r\n (filter.variant === 'range' && filter.operator === 'isBetween') ||\r\n filter.operator === 'isBetween'\r\n ) {\r\n return (\r\n <DataTableRangeFilter\r\n filter={filter}\r\n column={column}\r\n inputId={inputId}\r\n onFilterUpdate={onFilterUpdate}\r\n className=\"size-full max-w-28 gap-0 [&_[data-slot='range-min']]:border-r-0 [&_input]:rounded-none [&_input]:px-1.5\"\r\n />\r\n )\r\n }\r\n\r\n const isNumber = filter.variant === 'number' || filter.variant === 'range'\r\n\r\n return (\r\n <Input\r\n id={inputId}\r\n type={isNumber ? 'number' : 'text'}\r\n inputMode={isNumber ? 'numeric' : undefined}\r\n placeholder={column.columnDef.meta?.placeholder ?? 'Enter value...'}\r\n className=\"h-full w-24 rounded-none px-1.5\"\r\n defaultValue={typeof filter.value === 'string' ? filter.value : ''}\r\n onChange={event =>\r\n onFilterUpdate(filter.filterId, { value: event.target.value })\r\n }\r\n />\r\n )\r\n }\r\n\r\n case 'boolean': {\r\n const inputListboxId = `${inputId}-listbox`\r\n\r\n return (\r\n <Select\r\n open={showValueSelector}\r\n onOpenChange={setShowValueSelector}\r\n value={typeof filter.value === 'string' ? filter.value : 'true'}\r\n onValueChange={(value: 'true' | 'false') =>\r\n onFilterUpdate(filter.filterId, { value })\r\n }\r\n >\r\n <SelectTrigger\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n className=\"rounded-none bg-transparent px-1.5 py-0.5 [&_svg]:hidden\"\r\n >\r\n <SelectValue placeholder={filter.value ? 'True' : 'False'} />\r\n </SelectTrigger>\r\n <SelectContent id={inputListboxId}>\r\n <SelectItem value=\"true\">True</SelectItem>\r\n <SelectItem value=\"false\">False</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n case 'select':\r\n case 'multiSelect': {\r\n const inputListboxId = `${inputId}-listbox`\r\n\r\n const options = column.columnDef.meta?.options ?? []\r\n const selectedValues = Array.isArray(filter.value)\r\n ? filter.value\r\n : [filter.value]\r\n\r\n const selectedOptions = options.filter(option =>\r\n selectedValues.includes(option.value)\r\n )\r\n\r\n return (\r\n <Popover open={showValueSelector} onOpenChange={setShowValueSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-full min-w-16 rounded-none border px-1.5 font-normal dark:bg-input/30\"\r\n >\r\n {selectedOptions.length === 0 ? (\r\n filter.variant === 'multiSelect' ? (\r\n 'Select options...'\r\n ) : (\r\n 'Select option...'\r\n )\r\n ) : (\r\n <>\r\n <div className=\"-space-x-2 flex items-center rtl:space-x-reverse\">\r\n {selectedOptions.map(selectedOption =>\r\n selectedOption.icon ? (\r\n <div\r\n key={selectedOption.value}\r\n className=\"rounded-full border bg-background p-0.5\"\r\n >\r\n <selectedOption.icon className=\"size-3.5\" />\r\n </div>\r\n ) : null\r\n )}\r\n </div>\r\n <span className=\"truncate\">\r\n {selectedOptions.length > 1\r\n ? `${selectedOptions.length} selected`\r\n : selectedOptions[0]?.label}\r\n </span>\r\n </>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n id={inputListboxId}\r\n align=\"start\"\r\n className=\"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n <Command>\r\n <CommandInput placeholder=\"Search options...\" />\r\n <CommandList>\r\n <CommandEmpty>No options found.</CommandEmpty>\r\n <CommandGroup>\r\n {options.map(option => (\r\n <CommandItem\r\n key={option.value}\r\n value={option.value}\r\n onSelect={() => {\r\n const value =\r\n filter.variant === 'multiSelect'\r\n ? selectedValues.includes(option.value)\r\n ? selectedValues.filter(v => v !== option.value)\r\n : [...selectedValues, option.value]\r\n : option.value\r\n onFilterUpdate(filter.filterId, { value })\r\n }}\r\n >\r\n {option.icon && <option.icon />}\r\n <span className=\"truncate\">{option.label}</span>\r\n {filter.variant === 'multiSelect' && (\r\n <Check\r\n className={cn(\r\n 'ml-auto',\r\n selectedValues.includes(option.value)\r\n ? 'opacity-100'\r\n : 'opacity-0'\r\n )}\r\n />\r\n )}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n }\r\n\r\n case 'date':\r\n case 'dateRange': {\r\n const inputListboxId = `${inputId}-listbox`\r\n\r\n const dateValue = Array.isArray(filter.value)\r\n ? filter.value.filter(Boolean)\r\n : [filter.value, filter.value].filter(Boolean)\r\n\r\n const displayValue =\r\n filter.operator === 'isBetween' && dateValue.length === 2\r\n ? `${formatDate(new Date(Number(dateValue[0])))} - ${formatDate(\r\n new Date(Number(dateValue[1]))\r\n )}`\r\n : dateValue[0]\r\n ? formatDate(new Date(Number(dateValue[0])))\r\n : 'Pick date...'\r\n\r\n return (\r\n <Popover open={showValueSelector} onOpenChange={setShowValueSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\r\n 'h-full rounded-none border px-1.5 font-normal dark:bg-input/30',\r\n !filter.value && 'text-muted-foreground'\r\n )}\r\n >\r\n <CalendarIcon className=\"size-3.5\" />\r\n <span className=\"truncate\">{displayValue}</span>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n id={inputListboxId}\r\n align=\"start\"\r\n className=\"w-auto origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n {filter.operator === 'isBetween' ? (\r\n <Calendar\r\n mode=\"range\"\r\n initialFocus\r\n selected={\r\n dateValue.length === 2\r\n ? {\r\n from: new Date(Number(dateValue[0])),\r\n to: new Date(Number(dateValue[1])),\r\n }\r\n : {\r\n from: new Date(),\r\n to: new Date(),\r\n }\r\n }\r\n onSelect={date => {\r\n onFilterUpdate(filter.filterId, {\r\n value: date\r\n ? [\r\n (date.from?.getTime() ?? '').toString(),\r\n (date.to?.getTime() ?? '').toString(),\r\n ]\r\n : [],\r\n })\r\n }}\r\n />\r\n ) : (\r\n <Calendar\r\n mode=\"single\"\r\n initialFocus\r\n selected={\r\n dateValue[0] ? new Date(Number(dateValue[0])) : undefined\r\n }\r\n onSelect={date => {\r\n onFilterUpdate(filter.filterId, {\r\n value: (date?.getTime() ?? '').toString(),\r\n })\r\n }}\r\n />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n }\r\n\r\n default:\r\n return null\r\n }\r\n}\r\n"],"names":["REMOVE_FILTER_SHORTCUTS","DataTableFilterMenu","table","debounceMs","throttleMs","shallow","align","props","id","React","columns","column","open","setOpen","selectedColumn","setSelectedColumn","inputValue","setInputValue","triggerRef","inputRef","onOpenChange","setTimeout","onInputKeyDown","event","filters","setFilters","useQueryState","getFiltersStateParser","field","debouncedSetFilters","useDebouncedCallback","onFilterAdd","value","filterValue","getDefaultFilterOperator","generateId","onFilterRemove","filterId","filter","requestAnimationFrame","onFilterUpdate","updates","prevFilters","onFiltersReset","onKeyDown","HTMLInputElement","HTMLTextAreaElement","window","onTriggerKeyDown","DataTableFilterItem","Button","X","Popover","PopoverTrigger","cn","FunnelSimple","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","FilterValueSelector","CommandGroup","CommandItem","filterItemId","showFieldSelector","setShowFieldSelector","showOperatorSelector","setShowOperatorSelector","showValueSelector","setShowValueSelector","operatorListboxId","inputId","columnMeta","filterOperators","getFilterOperators","onItemKeyDown","Check","Select","SelectTrigger","SelectValue","SelectContent","operator","SelectItem","onFilterInputRender","DataTableRangeFilter","isNumber","Input","undefined","inputListboxId","options","selectedValues","Array","selectedOptions","option","selectedOption","v","dateValue","Boolean","displayValue","formatDate","Date","Number","CalendarIcon","Calendar","date","onSelect","isEmpty","TextAlignLeft","SealCheck"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components\\data-table\\data-table-filter-menu.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-filter-menu.tsx"],"sourcesContent":["\r\n\r\nimport {\r\n Calendar as CalendarIcon,\r\n Check,\r\n FunnelSimple,\r\n SealCheck,\r\n TextAlignLeft,\r\n X,\r\n} from '@phosphor-icons/react'\r\nimport type { Column, Table } from '@tanstack/react-table'\r\nimport { useQueryState } from 'nuqs'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '@/components/button'\r\nimport { Calendar } from '@/components/calendar'\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n} from '@/components/command'\r\nimport { DataTableRangeFilter } from '@/components/data-table/data-table-range-filter'\r\nimport { Input } from '@/components/input'\r\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/popover'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '@/components/select'\r\nimport { useDebouncedCallback } from '@/hooks/use-debounced-callback'\r\nimport { getDefaultFilterOperator, getFilterOperators } from '@/lib/data-table'\r\nimport { formatDate } from '@/lib/format'\r\nimport { generateId } from '@/lib/id'\r\nimport { getFiltersStateParser } from '@/lib/parsers'\r\nimport { cn } from '@/lib/utils'\r\nimport type { ExtendedColumnFilter, FilterOperator } from '@/types/data-table'\r\n\r\nconst FILTERS_KEY = 'filters'\r\nconst DEBOUNCE_MS = 300\r\nconst THROTTLE_MS = 50\r\nconst OPEN_MENU_SHORTCUT = 'f'\r\nconst REMOVE_FILTER_SHORTCUTS = ['backspace', 'delete']\r\n\r\ninterface DataTableFilterMenuProps<TData>\r\n extends React.ComponentProps<typeof PopoverContent> {\r\n table: Table<TData>\r\n debounceMs?: number\r\n throttleMs?: number\r\n shallow?: boolean\r\n}\r\n\r\nexport function DataTableFilterMenu<TData>({\r\n table,\r\n debounceMs = DEBOUNCE_MS,\r\n throttleMs = THROTTLE_MS,\r\n shallow = true,\r\n align = 'start',\r\n ...props\r\n}: DataTableFilterMenuProps<TData>) {\r\n const id = React.useId()\r\n\r\n const columns = React.useMemo(() => {\r\n return table\r\n .getAllColumns()\r\n .filter(column => column.columnDef.enableColumnFilter)\r\n }, [table])\r\n\r\n const [open, setOpen] = React.useState(false)\r\n const [selectedColumn, setSelectedColumn] =\r\n React.useState<Column<TData> | null>(null)\r\n const [inputValue, setInputValue] = React.useState('')\r\n const triggerRef = React.useRef<HTMLButtonElement>(null)\r\n const inputRef = React.useRef<HTMLInputElement>(null)\r\n\r\n const onOpenChange = React.useCallback((open: boolean) => {\r\n setOpen(open)\r\n\r\n if (!open) {\r\n setTimeout(() => {\r\n setSelectedColumn(null)\r\n setInputValue('')\r\n }, 100)\r\n }\r\n }, [])\r\n\r\n const onInputKeyDown = React.useCallback(\r\n (event: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (\r\n REMOVE_FILTER_SHORTCUTS.includes(event.key.toLowerCase()) &&\r\n !inputValue &&\r\n selectedColumn\r\n ) {\r\n event.preventDefault()\r\n setSelectedColumn(null)\r\n }\r\n },\r\n [inputValue, selectedColumn]\r\n )\r\n\r\n const [filters, setFilters] = useQueryState(\r\n FILTERS_KEY,\r\n getFiltersStateParser<TData>(columns.map(field => field.id))\r\n .withDefault([])\r\n .withOptions({\r\n clearOnDefault: true,\r\n shallow,\r\n throttleMs,\r\n })\r\n )\r\n const debouncedSetFilters = useDebouncedCallback(setFilters, debounceMs)\r\n\r\n const onFilterAdd = React.useCallback(\r\n (column: Column<TData>, value: string) => {\r\n if (!value.trim() && column.columnDef.meta?.variant !== 'boolean') {\r\n return\r\n }\r\n\r\n const filterValue =\r\n column.columnDef.meta?.variant === 'multiSelect' ? [value] : value\r\n\r\n const newFilter: ExtendedColumnFilter<TData> = {\r\n id: column.id as Extract<keyof TData, string>,\r\n value: filterValue,\r\n variant: column.columnDef.meta?.variant ?? 'text',\r\n operator: getDefaultFilterOperator(\r\n column.columnDef.meta?.variant ?? 'text'\r\n ),\r\n filterId: generateId({ length: 8 }),\r\n }\r\n\r\n debouncedSetFilters([...filters, newFilter])\r\n setOpen(false)\r\n\r\n setTimeout(() => {\r\n setSelectedColumn(null)\r\n setInputValue('')\r\n }, 100)\r\n },\r\n [filters, debouncedSetFilters]\r\n )\r\n\r\n const onFilterRemove = React.useCallback(\r\n (filterId: string) => {\r\n const updatedFilters = filters.filter(\r\n filter => filter.filterId !== filterId\r\n )\r\n debouncedSetFilters(updatedFilters)\r\n requestAnimationFrame(() => {\r\n triggerRef.current?.focus()\r\n })\r\n },\r\n [filters, debouncedSetFilters]\r\n )\r\n\r\n const onFilterUpdate = React.useCallback(\r\n (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => {\r\n debouncedSetFilters(prevFilters => {\r\n const updatedFilters = prevFilters.map(filter => {\r\n if (filter.filterId === filterId) {\r\n return { ...filter, ...updates } as ExtendedColumnFilter<TData>\r\n }\r\n return filter\r\n })\r\n return updatedFilters\r\n })\r\n },\r\n [debouncedSetFilters]\r\n )\r\n\r\n const onFiltersReset = React.useCallback(() => {\r\n debouncedSetFilters([])\r\n }, [debouncedSetFilters])\r\n\r\n React.useEffect(() => {\r\n function onKeyDown(event: KeyboardEvent) {\r\n if (\r\n event.target instanceof HTMLInputElement ||\r\n event.target instanceof HTMLTextAreaElement\r\n ) {\r\n return\r\n }\r\n\r\n if (\r\n event.key.toLowerCase() === OPEN_MENU_SHORTCUT &&\r\n !event.ctrlKey &&\r\n !event.metaKey &&\r\n !event.shiftKey\r\n ) {\r\n event.preventDefault()\r\n setOpen(true)\r\n }\r\n\r\n if (\r\n event.key.toLowerCase() === OPEN_MENU_SHORTCUT &&\r\n event.shiftKey &&\r\n !open &&\r\n filters.length > 0\r\n ) {\r\n event.preventDefault()\r\n onFilterRemove(filters[filters.length - 1]?.filterId ?? '')\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', onKeyDown)\r\n return () => window.removeEventListener('keydown', onKeyDown)\r\n }, [open, filters, onFilterRemove])\r\n\r\n const onTriggerKeyDown = React.useCallback(\r\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\r\n if (\r\n REMOVE_FILTER_SHORTCUTS.includes(event.key.toLowerCase()) &&\r\n filters.length > 0\r\n ) {\r\n event.preventDefault()\r\n onFilterRemove(filters[filters.length - 1]?.filterId ?? '')\r\n }\r\n },\r\n [filters, onFilterRemove]\r\n )\r\n\r\n return (\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {filters.map(filter => (\r\n <DataTableFilterItem\r\n key={filter.filterId}\r\n filter={filter}\r\n filterItemId={`${id}-filter-${filter.filterId}`}\r\n columns={columns}\r\n onFilterUpdate={onFilterUpdate}\r\n onFilterRemove={onFilterRemove}\r\n />\r\n ))}\r\n {filters.length > 0 && (\r\n <Button\r\n aria-label=\"Reset all filters\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-8\"\r\n onClick={onFiltersReset}\r\n >\r\n <X />\r\n </Button>\r\n )}\r\n <Popover open={open} onOpenChange={onOpenChange}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n aria-label=\"Open filter command menu\"\r\n variant=\"outline\"\r\n size={filters.length > 0 ? 'icon' : 'sm'}\r\n className={cn(filters.length > 0 && 'size-8', 'h-10')}\r\n ref={triggerRef}\r\n onKeyDown={onTriggerKeyDown}\r\n >\r\n <FunnelSimple />\r\n {filters.length > 0 ? null : 'Filter'}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n align={align}\r\n className=\"w-full max-w-[var(--radix-popover-content-available-width)] origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n {...props}\r\n >\r\n <Command loop className=\"[&_[cmdk-input-wrapper]_svg]:hidden\">\r\n <CommandInput\r\n ref={inputRef}\r\n placeholder={\r\n selectedColumn\r\n ? (selectedColumn.columnDef.meta?.label ?? selectedColumn.id)\r\n : 'Search fields...'\r\n }\r\n value={inputValue}\r\n onValueChange={setInputValue}\r\n onKeyDown={onInputKeyDown}\r\n />\r\n <CommandList>\r\n {selectedColumn ? (\r\n <>\r\n {selectedColumn.columnDef.meta?.options && (\r\n <CommandEmpty>No options found.</CommandEmpty>\r\n )}\r\n <FilterValueSelector\r\n column={selectedColumn}\r\n value={inputValue}\r\n onSelect={value => onFilterAdd(selectedColumn, value)}\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <CommandEmpty>No fields found.</CommandEmpty>\r\n <CommandGroup>\r\n {columns.map(column => (\r\n <CommandItem\r\n key={column.id}\r\n value={column.id}\r\n onSelect={() => {\r\n setSelectedColumn(column)\r\n setInputValue('')\r\n requestAnimationFrame(() => {\r\n inputRef.current?.focus()\r\n })\r\n }}\r\n >\r\n {column.columnDef.meta?.icon && (\r\n <column.columnDef.meta.icon />\r\n )}\r\n <span className=\"truncate\">\r\n {column.columnDef.meta?.label ?? column.id}\r\n </span>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </>\r\n )}\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n )\r\n}\r\n\r\ninterface DataTableFilterItemProps<TData> {\r\n filter: ExtendedColumnFilter<TData>\r\n filterItemId: string\r\n columns: Column<TData>[]\r\n onFilterUpdate: (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => void\r\n onFilterRemove: (filterId: string) => void\r\n}\r\n\r\nfunction DataTableFilterItem<TData>({\r\n filter,\r\n filterItemId,\r\n columns,\r\n onFilterUpdate,\r\n onFilterRemove,\r\n}: DataTableFilterItemProps<TData>) {\r\n {\r\n const [showFieldSelector, setShowFieldSelector] = React.useState(false)\r\n const [showOperatorSelector, setShowOperatorSelector] =\r\n React.useState(false)\r\n const [showValueSelector, setShowValueSelector] = React.useState(false)\r\n\r\n const column = columns.find(column => column.id === filter.id)\r\n if (!column) return null\r\n\r\n const operatorListboxId = `${filterItemId}-operator-listbox`\r\n const inputId = `${filterItemId}-input`\r\n\r\n const columnMeta = column.columnDef.meta\r\n const filterOperators = getFilterOperators(filter.variant)\r\n\r\n const onItemKeyDown = React.useCallback(\r\n (event: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (\r\n event.target instanceof HTMLInputElement ||\r\n event.target instanceof HTMLTextAreaElement\r\n ) {\r\n return\r\n }\r\n\r\n if (showFieldSelector || showOperatorSelector || showValueSelector) {\r\n return\r\n }\r\n\r\n if (REMOVE_FILTER_SHORTCUTS.includes(event.key.toLowerCase())) {\r\n event.preventDefault()\r\n onFilterRemove(filter.filterId)\r\n }\r\n },\r\n [\r\n filter.filterId,\r\n showFieldSelector,\r\n showOperatorSelector,\r\n showValueSelector,\r\n onFilterRemove,\r\n ]\r\n )\r\n\r\n return (\r\n <div\r\n key={filter.filterId}\r\n role=\"listitem\"\r\n id={filterItemId}\r\n className=\"flex h-10 items-center rounded-md bg-background\"\r\n onKeyDown={onItemKeyDown}\r\n >\r\n <Popover open={showFieldSelector} onOpenChange={setShowFieldSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"rounded-none rounded-l-md border border-r-0 font-normal dark:bg-input/30\"\r\n >\r\n {columnMeta?.icon && (\r\n <columnMeta.icon className=\"text-muted-foreground\" />\r\n )}\r\n {columnMeta?.label ?? column.id}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n align=\"start\"\r\n className=\"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n <Command loop>\r\n <CommandInput placeholder=\"Search fields...\" />\r\n <CommandList>\r\n <CommandEmpty>No fields found.</CommandEmpty>\r\n <CommandGroup>\r\n {columns.map(column => (\r\n <CommandItem\r\n key={column.id}\r\n value={column.id}\r\n onSelect={() => {\r\n onFilterUpdate(filter.filterId, {\r\n id: column.id as Extract<keyof TData, string>,\r\n variant: column.columnDef.meta?.variant ?? 'text',\r\n operator: getDefaultFilterOperator(\r\n column.columnDef.meta?.variant ?? 'text'\r\n ),\r\n value: '',\r\n })\r\n\r\n setShowFieldSelector(false)\r\n }}\r\n >\r\n {column.columnDef.meta?.icon && (\r\n <column.columnDef.meta.icon />\r\n )}\r\n <span className=\"truncate\">\r\n {column.columnDef.meta?.label ?? column.id}\r\n </span>\r\n <Check\r\n className={cn(\r\n 'ml-auto',\r\n column.id === filter.id ? 'opacity-100' : 'opacity-0'\r\n )}\r\n />\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n <Select\r\n open={showOperatorSelector}\r\n onOpenChange={setShowOperatorSelector}\r\n value={filter.operator}\r\n onValueChange={(value: FilterOperator) =>\r\n onFilterUpdate(filter.filterId, {\r\n operator: value,\r\n value:\r\n value === 'isEmpty' || value === 'isNotEmpty'\r\n ? ''\r\n : filter.value,\r\n })\r\n }\r\n >\r\n <SelectTrigger\r\n aria-controls={operatorListboxId}\r\n className=\"h-10 rounded-none border-r-0 px-2.5 lowercase [&[data-size]]:h-10 [&_svg]:hidden\"\r\n >\r\n <SelectValue placeholder={filter.operator} />\r\n </SelectTrigger>\r\n <SelectContent\r\n id={operatorListboxId}\r\n className=\"origin-[var(--radix-select-content-transform-origin)]\"\r\n >\r\n {filterOperators.map(operator => (\r\n <SelectItem\r\n key={operator.value}\r\n className=\"lowercase\"\r\n value={operator.value}\r\n >\r\n {operator.label}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n {onFilterInputRender({\r\n filter,\r\n column,\r\n inputId,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n })}\r\n <Button\r\n aria-controls={filterItemId}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-full rounded-none rounded-r-md border border-l-0 px-1.5 font-normal dark:bg-input/30\"\r\n onClick={() => onFilterRemove(filter.filterId)}\r\n >\r\n <X className=\"size-3.5\" />\r\n </Button>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\ninterface FilterValueSelectorProps<TData> {\r\n column: Column<TData>\r\n value: string\r\n onSelect: (value: string) => void\r\n}\r\n\r\nfunction FilterValueSelector<TData>({\r\n column,\r\n value,\r\n onSelect,\r\n}: FilterValueSelectorProps<TData>) {\r\n const variant = column.columnDef.meta?.variant ?? 'text'\r\n\r\n switch (variant) {\r\n case 'boolean':\r\n return (\r\n <CommandGroup>\r\n <CommandItem value=\"true\" onSelect={() => onSelect('true')}>\r\n True\r\n </CommandItem>\r\n <CommandItem value=\"false\" onSelect={() => onSelect('false')}>\r\n False\r\n </CommandItem>\r\n </CommandGroup>\r\n )\r\n\r\n case 'select':\r\n case 'multiSelect':\r\n return (\r\n <CommandGroup>\r\n {column.columnDef.meta?.options?.map(option => (\r\n <CommandItem\r\n key={option.value}\r\n value={option.value}\r\n onSelect={() => onSelect(option.value)}\r\n >\r\n {option.icon && <option.icon />}\r\n <span className=\"truncate\">{option.label}</span>\r\n {option.count && (\r\n <span className=\"ml-auto font-mono text-xs\">\r\n {option.count}\r\n </span>\r\n )}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n )\r\n\r\n case 'date':\r\n case 'dateRange':\r\n return (\r\n <Calendar\r\n initialFocus\r\n mode=\"single\"\r\n selected={value ? new Date(value) : undefined}\r\n onSelect={date => onSelect(date?.getTime().toString() ?? '')}\r\n />\r\n )\r\n\r\n default: {\r\n const isEmpty = !value.trim()\r\n\r\n return (\r\n <CommandGroup>\r\n <CommandItem\r\n value={value}\r\n onSelect={() => onSelect(value)}\r\n disabled={isEmpty}\r\n >\r\n {isEmpty ? (\r\n <>\r\n <TextAlignLeft />\r\n <span>Type to add filter...</span>\r\n </>\r\n ) : (\r\n <>\r\n <SealCheck />\r\n <span className=\"truncate\">Filter by "{value}"</span>\r\n </>\r\n )}\r\n </CommandItem>\r\n </CommandGroup>\r\n )\r\n }\r\n }\r\n}\r\n\r\nfunction onFilterInputRender<TData>({\r\n filter,\r\n column,\r\n inputId,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n}: {\r\n filter: ExtendedColumnFilter<TData>\r\n column: Column<TData>\r\n inputId: string\r\n onFilterUpdate: (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => void\r\n showValueSelector: boolean\r\n setShowValueSelector: (value: boolean) => void\r\n}) {\r\n if (filter.operator === 'isEmpty' || filter.operator === 'isNotEmpty') {\r\n return (\r\n <div\r\n id={inputId}\r\n role=\"status\"\r\n aria-label={`${column.columnDef.meta?.label} filter is ${\r\n filter.operator === 'isEmpty' ? 'empty' : 'not empty'\r\n }`}\r\n aria-live=\"polite\"\r\n className=\"h-full w-16 rounded-none border bg-transparent px-1.5 py-0.5 text-muted-foreground dark:bg-input/30\"\r\n />\r\n )\r\n }\r\n\r\n switch (filter.variant) {\r\n case 'text':\r\n case 'number':\r\n case 'range': {\r\n if (\r\n (filter.variant === 'range' && filter.operator === 'isBetween') ||\r\n filter.operator === 'isBetween'\r\n ) {\r\n return (\r\n <DataTableRangeFilter\r\n filter={filter}\r\n column={column}\r\n inputId={inputId}\r\n onFilterUpdate={onFilterUpdate}\r\n className=\"size-full max-w-28 gap-0 [&_[data-slot='range-min']]:border-r-0 [&_input]:rounded-none [&_input]:px-1.5\"\r\n />\r\n )\r\n }\r\n\r\n const isNumber = filter.variant === 'number' || filter.variant === 'range'\r\n\r\n return (\r\n <Input\r\n id={inputId}\r\n type={isNumber ? 'number' : 'text'}\r\n inputMode={isNumber ? 'numeric' : undefined}\r\n placeholder={column.columnDef.meta?.placeholder ?? 'Enter value...'}\r\n className=\"h-full w-24 rounded-none px-1.5\"\r\n defaultValue={typeof filter.value === 'string' ? filter.value : ''}\r\n onChange={event =>\r\n onFilterUpdate(filter.filterId, { value: event.target.value })\r\n }\r\n />\r\n )\r\n }\r\n\r\n case 'boolean': {\r\n const inputListboxId = `${inputId}-listbox`\r\n\r\n return (\r\n <Select\r\n open={showValueSelector}\r\n onOpenChange={setShowValueSelector}\r\n value={typeof filter.value === 'string' ? filter.value : 'true'}\r\n onValueChange={(value: 'true' | 'false') =>\r\n onFilterUpdate(filter.filterId, { value })\r\n }\r\n >\r\n <SelectTrigger\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n className=\"rounded-none bg-transparent px-1.5 py-0.5 [&_svg]:hidden\"\r\n >\r\n <SelectValue placeholder={filter.value ? 'True' : 'False'} />\r\n </SelectTrigger>\r\n <SelectContent id={inputListboxId}>\r\n <SelectItem value=\"true\">True</SelectItem>\r\n <SelectItem value=\"false\">False</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n case 'select':\r\n case 'multiSelect': {\r\n const inputListboxId = `${inputId}-listbox`\r\n\r\n const options = column.columnDef.meta?.options ?? []\r\n const selectedValues = Array.isArray(filter.value)\r\n ? filter.value\r\n : [filter.value]\r\n\r\n const selectedOptions = options.filter(option =>\r\n selectedValues.includes(option.value)\r\n )\r\n\r\n return (\r\n <Popover open={showValueSelector} onOpenChange={setShowValueSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-full min-w-16 rounded-none border px-1.5 font-normal dark:bg-input/30\"\r\n >\r\n {selectedOptions.length === 0 ? (\r\n filter.variant === 'multiSelect' ? (\r\n 'Select options...'\r\n ) : (\r\n 'Select option...'\r\n )\r\n ) : (\r\n <>\r\n <div className=\"-space-x-2 flex items-center rtl:space-x-reverse\">\r\n {selectedOptions.map(selectedOption =>\r\n selectedOption.icon ? (\r\n <div\r\n key={selectedOption.value}\r\n className=\"rounded-full border bg-background p-0.5\"\r\n >\r\n <selectedOption.icon className=\"size-3.5\" />\r\n </div>\r\n ) : null\r\n )}\r\n </div>\r\n <span className=\"truncate\">\r\n {selectedOptions.length > 1\r\n ? `${selectedOptions.length} selected`\r\n : selectedOptions[0]?.label}\r\n </span>\r\n </>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n id={inputListboxId}\r\n align=\"start\"\r\n className=\"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n <Command>\r\n <CommandInput placeholder=\"Search options...\" />\r\n <CommandList>\r\n <CommandEmpty>No options found.</CommandEmpty>\r\n <CommandGroup>\r\n {options.map(option => (\r\n <CommandItem\r\n key={option.value}\r\n value={option.value}\r\n onSelect={() => {\r\n const value =\r\n filter.variant === 'multiSelect'\r\n ? selectedValues.includes(option.value)\r\n ? selectedValues.filter(v => v !== option.value)\r\n : [...selectedValues, option.value]\r\n : option.value\r\n onFilterUpdate(filter.filterId, { value })\r\n }}\r\n >\r\n {option.icon && <option.icon />}\r\n <span className=\"truncate\">{option.label}</span>\r\n {filter.variant === 'multiSelect' && (\r\n <Check\r\n className={cn(\r\n 'ml-auto',\r\n selectedValues.includes(option.value)\r\n ? 'opacity-100'\r\n : 'opacity-0'\r\n )}\r\n />\r\n )}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n }\r\n\r\n case 'date':\r\n case 'dateRange': {\r\n const inputListboxId = `${inputId}-listbox`\r\n\r\n const dateValue = Array.isArray(filter.value)\r\n ? filter.value.filter(Boolean)\r\n : [filter.value, filter.value].filter(Boolean)\r\n\r\n const displayValue =\r\n filter.operator === 'isBetween' && dateValue.length === 2\r\n ? `${formatDate(new Date(Number(dateValue[0])))} - ${formatDate(\r\n new Date(Number(dateValue[1]))\r\n )}`\r\n : dateValue[0]\r\n ? formatDate(new Date(Number(dateValue[0])))\r\n : 'Pick date...'\r\n\r\n return (\r\n <Popover open={showValueSelector} onOpenChange={setShowValueSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\r\n 'h-full rounded-none border px-1.5 font-normal dark:bg-input/30',\r\n !filter.value && 'text-muted-foreground'\r\n )}\r\n >\r\n <CalendarIcon className=\"size-3.5\" />\r\n <span className=\"truncate\">{displayValue}</span>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n id={inputListboxId}\r\n align=\"start\"\r\n className=\"w-auto origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n {filter.operator === 'isBetween' ? (\r\n <Calendar\r\n mode=\"range\"\r\n initialFocus\r\n selected={\r\n dateValue.length === 2\r\n ? {\r\n from: new Date(Number(dateValue[0])),\r\n to: new Date(Number(dateValue[1])),\r\n }\r\n : {\r\n from: new Date(),\r\n to: new Date(),\r\n }\r\n }\r\n onSelect={date => {\r\n onFilterUpdate(filter.filterId, {\r\n value: date\r\n ? [\r\n (date.from?.getTime() ?? '').toString(),\r\n (date.to?.getTime() ?? '').toString(),\r\n ]\r\n : [],\r\n })\r\n }}\r\n />\r\n ) : (\r\n <Calendar\r\n mode=\"single\"\r\n initialFocus\r\n selected={\r\n dateValue[0] ? new Date(Number(dateValue[0])) : undefined\r\n }\r\n onSelect={date => {\r\n onFilterUpdate(filter.filterId, {\r\n value: (date?.getTime() ?? '').toString(),\r\n })\r\n }}\r\n />\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n }\r\n\r\n default:\r\n return null\r\n }\r\n}\r\n"],"names":["REMOVE_FILTER_SHORTCUTS","DataTableFilterMenu","table","debounceMs","throttleMs","shallow","align","props","id","React","columns","column","open","setOpen","selectedColumn","setSelectedColumn","inputValue","setInputValue","triggerRef","inputRef","onOpenChange","setTimeout","onInputKeyDown","event","filters","setFilters","useQueryState","getFiltersStateParser","field","debouncedSetFilters","useDebouncedCallback","onFilterAdd","value","filterValue","getDefaultFilterOperator","generateId","onFilterRemove","filterId","filter","requestAnimationFrame","onFilterUpdate","updates","prevFilters","onFiltersReset","onKeyDown","HTMLInputElement","HTMLTextAreaElement","window","onTriggerKeyDown","DataTableFilterItem","Button","X","Popover","PopoverTrigger","cn","FunnelSimple","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","FilterValueSelector","CommandGroup","CommandItem","filterItemId","showFieldSelector","setShowFieldSelector","showOperatorSelector","setShowOperatorSelector","showValueSelector","setShowValueSelector","operatorListboxId","inputId","columnMeta","filterOperators","getFilterOperators","Check","Select","SelectTrigger","SelectValue","SelectContent","operator","SelectItem","onFilterInputRender","DataTableRangeFilter","isNumber","Input","undefined","inputListboxId","options","selectedValues","Array","selectedOptions","option","selectedOption","v","dateValue","Boolean","displayValue","formatDate","Date","Number","CalendarIcon","Calendar","date","onSelect","isEmpty","TextAlignLeft","SealCheck"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{jsx as e,jsxs as a}from"react/jsx-runtime";import{CaretDoubleLeftIcon as i,CaretDoubleRightIcon as t,CaretLeftIcon as l,CaretRightIcon as s}from"@phosphor-icons/react";import{Button as n}from"../button.js";import{Select as o,SelectContent as r,SelectItem as c,SelectTrigger as d,SelectValue as g}from"../select.js";import{cn as m}from"../../lib/utils.js";function p({table:p,pageSizeOptions:h=[10,20,30,40,50],className:u,...x}){return a("div",{className:m("flex w-full flex-col-reverse items-center justify-between gap-4 overflow-auto p-1 sm:flex-row sm:gap-8",u),...x,children:[a("div",{className:"flex-1 whitespace-nowrap text-muted-foreground text-sm",children:[p.getFilteredSelectedRowModel().rows.length," de"," ",p.getFilteredRowModel().rows.length," linhas selecionadas."]}),a("div",{className:"flex flex-col-reverse items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8",children:[a("div",{className:"flex items-center space-x-2",children:[e("p",{className:"whitespace-nowrap font-medium text-sm",children:"Linhas por p\xe1gina"}),a(o,{value:`${p.getState().pagination.pageSize}`,onValueChange:e=>{p.setPageSize(Number(e))},children:[e(d,{className:"h-10 w-[5.5rem] [&[data-size]]:h-10",children:e(g,{placeholder:p.getState().pagination.pageSize})}),e(r,{side:"top",children:h.map(a=>e(c,{value:`${a}`,children:a},a))})]})]}),a("div",{className:"flex items-center justify-center font-medium text-sm",children:["P\xe1gina ",p.getState().pagination.pageIndex+1," de"," ",p.getPageCount()]}),a("div",{className:"flex items-center space-x-2",children:[e(n,{"aria-label":"Go to first page",variant:"outline",size:"icon",className:"hidden size-10 lg:flex",onClick:()=>p.setPageIndex(0),disabled:!p.getCanPreviousPage(),children:e(i,{})}),e(n,{"aria-label":"Go to previous page",variant:"outline",size:"icon",className:"size-10",onClick:()=>p.previousPage(),disabled:!p.getCanPreviousPage(),children:e(l,{})}),e(n,{"aria-label":"Go to next page",variant:"outline",size:"icon",className:"size-10",onClick:()=>p.nextPage(),disabled:!p.getCanNextPage(),children:e(s,{})}),e(n,{"aria-label":"Go to last page",variant:"outline",size:"icon",className:"hidden size-10 lg:flex",onClick:()=>p.setPageIndex(p.getPageCount()-1),disabled:!p.getCanNextPage(),children:e(t,{})})]})]})]})}export{p as DataTablePagination};
|
|
2
2
|
//# sourceMappingURL=data-table-pagination.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components\\data-table\\data-table-pagination.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-pagination.tsx"],"sourcesContent":["import {\r\n CaretDoubleLeftIcon,\r\n CaretDoubleRightIcon,\r\n CaretLeftIcon,\r\n CaretRightIcon,\r\n} from '@phosphor-icons/react'\r\nimport type { Table } from '@tanstack/react-table'\r\n\r\nimport { Button } from '@/components/button'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '@/components/select'\r\nimport { cn } from '@/lib/utils'\r\n\r\ninterface DataTablePaginationProps<TData> extends React.ComponentProps<'div'> {\r\n table: Table<TData>\r\n pageSizeOptions?: number[]\r\n}\r\n\r\nexport function DataTablePagination<TData>({\r\n table,\r\n pageSizeOptions = [10, 20, 30, 40, 50],\r\n className,\r\n ...props\r\n}: DataTablePaginationProps<TData>) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex w-full flex-col-reverse items-center justify-between gap-4 overflow-auto p-1 sm:flex-row sm:gap-8',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex-1 whitespace-nowrap text-muted-foreground text-sm\">\r\n {table.getFilteredSelectedRowModel().rows.length} de{' '}\r\n {table.getFilteredRowModel().rows.length} linhas selecionadas.\r\n </div>\r\n <div className=\"flex flex-col-reverse items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8\">\r\n <div className=\"flex items-center space-x-2\">\r\n <p className=\"whitespace-nowrap font-medium text-sm\">\r\n Linhas por página\r\n </p>\r\n <Select\r\n value={`${table.getState().pagination.pageSize}`}\r\n onValueChange={value => {\r\n table.setPageSize(Number(value))\r\n }}\r\n >\r\n <SelectTrigger className=\"h-10 w-[5.5rem] [&[data-size]]:h-10\">\r\n <SelectValue placeholder={table.getState().pagination.pageSize} />\r\n </SelectTrigger>\r\n <SelectContent side=\"top\">\r\n {pageSizeOptions.map(pageSize => (\r\n <SelectItem key={pageSize} value={`${pageSize}`}>\r\n {pageSize}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n <div className=\"flex items-center justify-center font-medium text-sm\">\r\n Página {table.getState().pagination.pageIndex + 1} de{' '}\r\n {table.getPageCount()}\r\n </div>\r\n <div className=\"flex items-center space-x-2\">\r\n <Button\r\n aria-label=\"Go to first page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"hidden size-10 lg:flex\"\r\n onClick={() => table.setPageIndex(0)}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <CaretDoubleLeftIcon />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to previous page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-10\"\r\n onClick={() => table.previousPage()}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <CaretLeftIcon />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to next page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-10\"\r\n onClick={() => table.nextPage()}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <CaretRightIcon />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to last page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"hidden size-10 lg:flex\"\r\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <CaretDoubleRightIcon />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["DataTablePagination","table","pageSizeOptions","className","props","cn","Select","value","Number","SelectTrigger","SelectValue","SelectContent","pageSize","SelectItem","Button","CaretDoubleLeftIcon","CaretLeftIcon","CaretRightIcon","CaretDoubleRightIcon"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components\\data-table\\data-table-pagination.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-pagination.tsx"],"sourcesContent":["import {\r\n CaretDoubleLeftIcon,\r\n CaretDoubleRightIcon,\r\n CaretLeftIcon,\r\n CaretRightIcon,\r\n} from '@phosphor-icons/react'\r\nimport type { Table } from '@tanstack/react-table'\r\n\r\nimport { Button } from '@/components/button'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '@/components/select'\r\nimport { cn } from '@/lib/utils'\r\n\r\ninterface DataTablePaginationProps<TData> extends React.ComponentProps<'div'> {\r\n table: Table<TData>\r\n pageSizeOptions?: number[]\r\n}\r\n\r\nexport function DataTablePagination<TData>({\r\n table,\r\n pageSizeOptions = [10, 20, 30, 40, 50],\r\n className,\r\n ...props\r\n}: DataTablePaginationProps<TData>) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex w-full flex-col-reverse items-center justify-between gap-4 overflow-auto p-1 sm:flex-row sm:gap-8',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div className=\"flex-1 whitespace-nowrap text-muted-foreground text-sm\">\r\n {table.getFilteredSelectedRowModel().rows.length} de{' '}\r\n {table.getFilteredRowModel().rows.length} linhas selecionadas.\r\n </div>\r\n <div className=\"flex flex-col-reverse items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8\">\r\n <div className=\"flex items-center space-x-2\">\r\n <p className=\"whitespace-nowrap font-medium text-sm\">\r\n Linhas por página\r\n </p>\r\n <Select\r\n value={`${table.getState().pagination.pageSize}`}\r\n onValueChange={value => {\r\n table.setPageSize(Number(value))\r\n }}\r\n >\r\n <SelectTrigger className=\"h-10 w-[5.5rem] [&[data-size]]:h-10\">\r\n <SelectValue placeholder={table.getState().pagination.pageSize} />\r\n </SelectTrigger>\r\n <SelectContent side=\"top\">\r\n {pageSizeOptions.map(pageSize => (\r\n <SelectItem key={pageSize} value={`${pageSize}`}>\r\n {pageSize}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n <div className=\"flex items-center justify-center font-medium text-sm\">\r\n Página {table.getState().pagination.pageIndex + 1} de{' '}\r\n {table.getPageCount()}\r\n </div>\r\n <div className=\"flex items-center space-x-2\">\r\n <Button\r\n aria-label=\"Go to first page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"hidden size-10 lg:flex\"\r\n onClick={() => table.setPageIndex(0)}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <CaretDoubleLeftIcon />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to previous page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-10\"\r\n onClick={() => table.previousPage()}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <CaretLeftIcon />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to next page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"size-10\"\r\n onClick={() => table.nextPage()}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <CaretRightIcon />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to last page\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"hidden size-10 lg:flex\"\r\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <CaretDoubleRightIcon />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["DataTablePagination","table","pageSizeOptions","className","props","cn","Select","value","Number","SelectTrigger","SelectValue","SelectContent","pageSize","SelectItem","Button","CaretDoubleLeftIcon","CaretLeftIcon","CaretRightIcon","CaretDoubleRightIcon"],"mappings":"0WAuBO,SAASA,EAA2B,CACzCC,MAAAA,CAAK,CACLC,gBAAAA,EAAkB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAG,CACtCC,UAAAA,CAAS,CACT,GAAGC,EAC6B,EAChC,OACE,EAAC,OACC,UAAWC,EACT,yGACAF,GAED,GAAGC,CAAK,C,UAET,EAAC,OAAI,UAAU,yD,UACZH,EAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CAAC,MAAI,IACpDA,EAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,wB,GAE3C,EAAC,OAAI,UAAU,yE,UACb,EAAC,OAAI,UAAU,8B,UACb,EAAC,KAAE,UAAU,wC,SAAwC,sB,GAGrD,EAACK,EAAMA,CACL,MAAO,CAAC,EAAEL,EAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAChD,cAAeM,AAAAA,IACbN,EAAM,WAAW,CAACO,OAAOD,GAC3B,E,UAEA,EAACE,EAAaA,CAAC,UAAU,sC,SACvB,EAACC,EAAWA,CAAC,YAAaT,EAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,A,KAEhE,EAACU,EAAaA,CAAC,KAAK,M,SACjBT,EAAgB,GAAG,CAACU,AAAAA,GACnB,EAACC,EAAUA,CAAgB,MAAO,CAAC,EAAED,EAAS,CAAC,C,SAC5CA,C,EADcA,G,SAOzB,EAAC,OAAI,UAAU,uD,UAAuD,aAC5DX,EAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAG,EAAE,MAAI,IACrDA,EAAM,YAAY,G,GAErB,EAAC,OAAI,UAAU,8B,UACb,EAACa,EAAMA,CACL,aAAW,mBACX,QAAQ,UACR,KAAK,OACL,UAAU,yBACV,QAAS,IAAMb,EAAM,YAAY,CAAC,GAClC,SAAU,CAACA,EAAM,kBAAkB,G,SAEnC,EAACc,EAAmBA,CAAAA,E,GAEtB,EAACD,EAAMA,CACL,aAAW,sBACX,QAAQ,UACR,KAAK,OACL,UAAU,UACV,QAAS,IAAMb,EAAM,YAAY,GACjC,SAAU,CAACA,EAAM,kBAAkB,G,SAEnC,EAACe,EAAaA,CAAAA,E,GAEhB,EAACF,EAAMA,CACL,aAAW,kBACX,QAAQ,UACR,KAAK,OACL,UAAU,UACV,QAAS,IAAMb,EAAM,QAAQ,GAC7B,SAAU,CAACA,EAAM,cAAc,G,SAE/B,EAACgB,EAAcA,CAAAA,E,GAEjB,EAACH,EAAMA,CACL,aAAW,kBACX,QAAQ,UACR,KAAK,OACL,UAAU,yBACV,QAAS,IAAMb,EAAM,YAAY,CAACA,EAAM,YAAY,GAAK,GACzD,SAAU,CAACA,EAAM,cAAc,G,SAE/B,EAACiB,EAAoBA,CAAAA,E,WAMjC,Q"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
import
|
|
2
|
+
import{jsx as e,jsxs as a}from"react/jsx-runtime";import{useCallback as r,useMemo as l}from"react";import{Input as t}from"../input.js";import{cn as i}from"../../lib/utils.js";function u({filter:u,column:m,inputId:n,onFilterUpdate:o,className:d,...s}){let c=m.columnDef.meta,[v,f]=l(()=>{let e=m.columnDef.meta?.range;if(e)return e;let a=m.getFacetedMinMaxValues();return a?[a[0],a[1]]:[0,100]},[m]),g=r(e=>{if(void 0===e||""===e)return"";let a=Number(e);return Number.isNaN(a)?"":a.toLocaleString(void 0,{maximumFractionDigits:0})},[]),p=l(()=>Array.isArray(u.value)?u.value.map(g):[g(u.value),""],[u.value,g]),b=r((e,a)=>{let r=Number(e),l=Array.isArray(u.value)?u.value:["",""],t=a?l[1]??"":l[0]??"";(""===e||!Number.isNaN(r)&&(a?r>=v&&r<=(Number(t)||f):r<=f&&r>=(Number(t)||v)))&&o(u.filterId,{value:a?[e,t]:[t,e]})},[u.filterId,u.value,v,f,o]);return a("div",{"data-slot":"range",className:i("flex w-full items-center gap-2",d),...s,children:[e(t,{id:`${n}-min`,type:"number","aria-label":`${c?.label} minimum value`,"aria-valuemin":v,"aria-valuemax":f,"data-slot":"range-min",inputMode:"numeric",placeholder:v.toString(),min:v,max:f,className:"h-10 w-full rounded",defaultValue:p[0],onChange:e=>b(e.target.value,!0)}),e("span",{className:"sr-only shrink-0 text-muted-foreground",children:"to"}),e(t,{id:`${n}-max`,type:"number","aria-label":`${c?.label} maximum value`,"aria-valuemin":v,"aria-valuemax":f,"data-slot":"range-max",inputMode:"numeric",placeholder:f.toString(),min:v,max:f,className:"h-10 w-full rounded",defaultValue:p[1],onChange:e=>b(e.target.value)})]})}export{u as DataTableRangeFilter};
|
|
3
3
|
//# sourceMappingURL=data-table-range-filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components\\data-table\\data-table-range-filter.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-range-filter.tsx"],"sourcesContent":["\r\n\r\nimport type { Column } from '@tanstack/react-table'\r\nimport * as React from 'react'\r\n\r\nimport { Input } from '@/components/input'\r\nimport { cn } from '@/lib/utils'\r\nimport type { ExtendedColumnFilter } from '@/types/data-table'\r\n\r\ninterface DataTableRangeFilterProps<TData> extends React.ComponentProps<'div'> {\r\n filter: ExtendedColumnFilter<TData>\r\n column: Column<TData>\r\n inputId: string\r\n onFilterUpdate: (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => void\r\n}\r\n\r\nexport function DataTableRangeFilter<TData>({\r\n filter,\r\n column,\r\n inputId,\r\n onFilterUpdate,\r\n className,\r\n ...props\r\n}: DataTableRangeFilterProps<TData>) {\r\n const meta = column.columnDef.meta\r\n\r\n const [min, max] = React.useMemo(() => {\r\n const range = column.columnDef.meta?.range\r\n if (range) return range\r\n\r\n const values = column.getFacetedMinMaxValues()\r\n if (!values) return [0, 100]\r\n\r\n return [values[0], values[1]]\r\n }, [column])\r\n\r\n const formatValue = React.useCallback(\r\n (value: string | number | undefined) => {\r\n if (value === undefined || value === '') return ''\r\n const numValue = Number(value)\r\n return Number.isNaN(numValue)\r\n ? ''\r\n : numValue.toLocaleString(undefined, {\r\n maximumFractionDigits: 0,\r\n })\r\n },\r\n []\r\n )\r\n\r\n const value = React.useMemo(() => {\r\n if (Array.isArray(filter.value)) return filter.value.map(formatValue)\r\n return [formatValue(filter.value), '']\r\n }, [filter.value, formatValue])\r\n\r\n const onRangeValueChange = React.useCallback(\r\n (value: string, isMin?: boolean) => {\r\n const numValue = Number(value)\r\n const currentValues = Array.isArray(filter.value)\r\n ? filter.value\r\n : ['', '']\r\n const otherValue = isMin\r\n ? (currentValues[1] ?? '')\r\n : (currentValues[0] ?? '')\r\n\r\n if (\r\n value === '' ||\r\n (!Number.isNaN(numValue) &&\r\n (isMin\r\n ? numValue >= min && numValue <= (Number(otherValue) || max)\r\n : numValue <= max && numValue >= (Number(otherValue) || min)))\r\n ) {\r\n onFilterUpdate(filter.filterId, {\r\n value: isMin ? [value, otherValue] : [otherValue, value],\r\n })\r\n }\r\n },\r\n [filter.filterId, filter.value, min, max, onFilterUpdate]\r\n )\r\n\r\n return (\r\n <div\r\n data-slot=\"range\"\r\n className={cn('flex w-full items-center gap-2', className)}\r\n {...props}\r\n >\r\n <Input\r\n id={`${inputId}-min`}\r\n type=\"number\"\r\n aria-label={`${meta?.label} minimum value`}\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n data-slot=\"range-min\"\r\n inputMode=\"numeric\"\r\n placeholder={min.toString()}\r\n min={min}\r\n max={max}\r\n className=\"h-10 w-full rounded\"\r\n defaultValue={value[0]}\r\n onChange={event => onRangeValueChange(event.target.value, true)}\r\n />\r\n <span className=\"sr-only shrink-0 text-muted-foreground\">to</span>\r\n <Input\r\n id={`${inputId}-max`}\r\n type=\"number\"\r\n aria-label={`${meta?.label} maximum value`}\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n data-slot=\"range-max\"\r\n inputMode=\"numeric\"\r\n placeholder={max.toString()}\r\n min={min}\r\n max={max}\r\n className=\"h-10 w-full rounded\"\r\n defaultValue={value[1]}\r\n onChange={event => onRangeValueChange(event.target.value)}\r\n />\r\n </div>\r\n )\r\n}\r\n"],"names":["DataTableRangeFilter","filter","column","inputId","onFilterUpdate","className","props","meta","min","max","React","range","values","formatValue","value","undefined","numValue","Number","Array","onRangeValueChange","isMin","currentValues","otherValue","cn","Input","event"],"mappings":";+
|
|
1
|
+
{"version":3,"file":"components\\data-table\\data-table-range-filter.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-range-filter.tsx"],"sourcesContent":["\r\n\r\nimport type { Column } from '@tanstack/react-table'\r\nimport * as React from 'react'\r\n\r\nimport { Input } from '@/components/input'\r\nimport { cn } from '@/lib/utils'\r\nimport type { ExtendedColumnFilter } from '@/types/data-table'\r\n\r\ninterface DataTableRangeFilterProps<TData> extends React.ComponentProps<'div'> {\r\n filter: ExtendedColumnFilter<TData>\r\n column: Column<TData>\r\n inputId: string\r\n onFilterUpdate: (\r\n filterId: string,\r\n updates: Partial<Omit<ExtendedColumnFilter<TData>, 'filterId'>>\r\n ) => void\r\n}\r\n\r\nexport function DataTableRangeFilter<TData>({\r\n filter,\r\n column,\r\n inputId,\r\n onFilterUpdate,\r\n className,\r\n ...props\r\n}: DataTableRangeFilterProps<TData>) {\r\n const meta = column.columnDef.meta\r\n\r\n const [min, max] = React.useMemo(() => {\r\n const range = column.columnDef.meta?.range\r\n if (range) return range\r\n\r\n const values = column.getFacetedMinMaxValues()\r\n if (!values) return [0, 100]\r\n\r\n return [values[0], values[1]]\r\n }, [column])\r\n\r\n const formatValue = React.useCallback(\r\n (value: string | number | undefined) => {\r\n if (value === undefined || value === '') return ''\r\n const numValue = Number(value)\r\n return Number.isNaN(numValue)\r\n ? ''\r\n : numValue.toLocaleString(undefined, {\r\n maximumFractionDigits: 0,\r\n })\r\n },\r\n []\r\n )\r\n\r\n const value = React.useMemo(() => {\r\n if (Array.isArray(filter.value)) return filter.value.map(formatValue)\r\n return [formatValue(filter.value), '']\r\n }, [filter.value, formatValue])\r\n\r\n const onRangeValueChange = React.useCallback(\r\n (value: string, isMin?: boolean) => {\r\n const numValue = Number(value)\r\n const currentValues = Array.isArray(filter.value)\r\n ? filter.value\r\n : ['', '']\r\n const otherValue = isMin\r\n ? (currentValues[1] ?? '')\r\n : (currentValues[0] ?? '')\r\n\r\n if (\r\n value === '' ||\r\n (!Number.isNaN(numValue) &&\r\n (isMin\r\n ? numValue >= min && numValue <= (Number(otherValue) || max)\r\n : numValue <= max && numValue >= (Number(otherValue) || min)))\r\n ) {\r\n onFilterUpdate(filter.filterId, {\r\n value: isMin ? [value, otherValue] : [otherValue, value],\r\n })\r\n }\r\n },\r\n [filter.filterId, filter.value, min, max, onFilterUpdate]\r\n )\r\n\r\n return (\r\n <div\r\n data-slot=\"range\"\r\n className={cn('flex w-full items-center gap-2', className)}\r\n {...props}\r\n >\r\n <Input\r\n id={`${inputId}-min`}\r\n type=\"number\"\r\n aria-label={`${meta?.label} minimum value`}\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n data-slot=\"range-min\"\r\n inputMode=\"numeric\"\r\n placeholder={min.toString()}\r\n min={min}\r\n max={max}\r\n className=\"h-10 w-full rounded\"\r\n defaultValue={value[0]}\r\n onChange={event => onRangeValueChange(event.target.value, true)}\r\n />\r\n <span className=\"sr-only shrink-0 text-muted-foreground\">to</span>\r\n <Input\r\n id={`${inputId}-max`}\r\n type=\"number\"\r\n aria-label={`${meta?.label} maximum value`}\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n data-slot=\"range-max\"\r\n inputMode=\"numeric\"\r\n placeholder={max.toString()}\r\n min={min}\r\n max={max}\r\n className=\"h-10 w-full rounded\"\r\n defaultValue={value[1]}\r\n onChange={event => onRangeValueChange(event.target.value)}\r\n />\r\n </div>\r\n )\r\n}\r\n"],"names":["DataTableRangeFilter","filter","column","inputId","onFilterUpdate","className","props","meta","min","max","React","range","values","formatValue","value","undefined","numValue","Number","Array","onRangeValueChange","isMin","currentValues","otherValue","cn","Input","event"],"mappings":";+KAmBO,SAASA,EAA4B,CAC1CC,OAAAA,CAAM,CACNC,OAAAA,CAAM,CACNC,QAAAA,CAAO,CACPC,eAAAA,CAAc,CACdC,UAAAA,CAAS,CACT,GAAGC,EAC8B,EACjC,IAAMC,EAAOL,EAAO,SAAS,CAAC,IAAI,CAE5B,CAACM,EAAKC,EAAI,CAAGC,EAAc,KAC/B,IAAMC,EAAQT,EAAO,SAAS,CAAC,IAAI,EAAE,MACrC,GAAIS,EAAO,OAAOA,EAElB,IAAMC,EAASV,EAAO,sBAAsB,UAC5C,EAEO,CAACU,CAAM,CAAC,EAAE,CAAEA,CAAM,CAAC,EAAE,CAAC,CAFT,CAAC,EAAG,IAAI,EAG3B,CAACV,EAAO,EAELW,EAAcH,EAClB,IACE,GAAII,SAAAA,GAAuBA,KAAAA,EAAc,MAAO,GAChD,IAAME,EAAWC,OAAOH,GACxB,OAAOG,OAAO,KAAK,CAACD,GAChB,GACAA,EAAS,cAAc,CAACD,OAAW,CACjC,sBAAuB,CACzB,EACN,EACA,EAAE,EAGED,EAAQJ,EAAc,IAC1B,MAAU,OAAO,CAACT,EAAO,KAAK,EAAUA,EAAO,KAAK,CAAC,GAAG,CAACY,GAClD,CAACA,EAAYZ,EAAO,KAAK,EAAG,GAAG,CACrC,CAACA,EAAO,KAAK,CAAEY,EAAY,EAExBM,EAAqBT,EACzB,CAACI,EAAeM,KACd,IAAMJ,EAAWC,OAAOH,GAClBO,EAAgBH,MAAM,OAAO,CAACjB,EAAO,KAAK,EAC5CA,EAAO,KAAK,CACZ,CAAC,GAAI,GAAG,CACNqB,EAAaF,EACdC,CAAa,CAAC,EAAE,EAAI,GACpBA,CAAa,CAAC,EAAE,EAAI,EAGvBP,CAAAA,CAAAA,KAAAA,GACC,CAACG,OAAO,KAAK,CAACD,IACZI,CAAAA,EACGJ,GAAYR,GAAOQ,GAAaC,CAAAA,OAAOK,IAAeb,CAAE,EACxDO,GAAYP,GAAOO,GAAaC,CAAAA,OAAOK,IAAed,CAAE,EAAC,GAE/DJ,EAAeH,EAAO,QAAQ,CAAE,CAC9B,MAAOmB,EAAQ,CAACN,EAAOQ,EAAW,CAAG,CAACA,EAAYR,EAAM,EAG9D,EACA,CAACb,EAAO,QAAQ,CAAEA,EAAO,KAAK,CAAEO,EAAKC,EAAKL,EAAe,EAG3D,OACE,EAAC,OACC,YAAU,QACV,UAAWmB,EAAG,iCAAkClB,GAC/C,GAAGC,CAAK,C,UAET,EAACkB,EAAKA,CACJ,GAAI,CAAC,EAAErB,EAAQ,IAAI,CAAC,CACpB,KAAK,SACL,aAAY,CAAC,EAAEI,GAAM,MAAM,cAAc,CAAC,CAC1C,gBAAeC,EACf,gBAAeC,EACf,YAAU,YACV,UAAU,UACV,YAAaD,EAAI,QAAQ,GACzB,IAAKA,EACL,IAAKC,EACL,UAAU,sBACV,aAAcK,CAAK,CAAC,EAAE,CACtB,SAAUW,GAASN,EAAmBM,EAAM,MAAM,CAAC,KAAK,CAAE,G,GAE5D,EAAC,QAAK,UAAU,yC,SAAyC,I,GACzD,EAACD,EAAKA,CACJ,GAAI,CAAC,EAAErB,EAAQ,IAAI,CAAC,CACpB,KAAK,SACL,aAAY,CAAC,EAAEI,GAAM,MAAM,cAAc,CAAC,CAC1C,gBAAeC,EACf,gBAAeC,EACf,YAAU,YACV,UAAU,UACV,YAAaA,EAAI,QAAQ,GACzB,IAAKD,EACL,IAAKC,EACL,UAAU,sBACV,aAAcK,CAAK,CAAC,EAAE,CACtB,SAAUW,GAASN,EAAmBM,EAAM,MAAM,CAAC,KAAK,C,KAIhE,Q"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{jsx as e,jsxs as l}from"react/jsx-runtime";import{Skeleton as a}from"../skeleton.js";import{Table as s,TableBody as r,TableCell as t,TableHead as m,TableHeader as i,TableRow as n}from"../table.js";import{cn as c}from"../../lib/utils.js";function h({columnCount:h,rowCount:d=10,filterCount:o=0,cellWidths:f=["auto"],withViewOptions:u=!0,withPagination:p=!0,shrinkZero:g=!1,className:N,...w}){let v=Array.from({length:h},(e,l)=>f[l%f.length]??"auto");return l("div",{className:c("flex w-full flex-col gap-2.5 overflow-auto",N),...w,children:[l("div",{className:"flex w-full items-center justify-between gap-2 overflow-auto p-1",children:[e("div",{className:"flex flex-1 items-center gap-2",children:o>0?Array.from({length:o}).map((l,s)=>e(a,{className:"h-7 w-[4.5rem]"},s)):null}),u?e(a,{className:"ml-auto hidden h-7 w-[4.5rem] lg:flex"}):null]}),e("div",{className:"rounded-md border",children:l(s,{children:[e(i,{children:Array.from({length:1}).map((l,s)=>e(n,{className:"hover:bg-transparent",children:Array.from({length:h}).map((l,s)=>e(m,{style:{width:v[s],minWidth:g?v[s]:"auto"},children:e(a,{className:"h-6 w-full"})},s))},s))}),e(r,{children:Array.from({length:d}).map((l,s)=>e(n,{className:"hover:bg-transparent",children:Array.from({length:h}).map((l,s)=>e(t,{style:{width:v[s],minWidth:g?v[s]:"auto"},children:e(a,{className:"h-6 w-full"})},s))},s))})]})}),p?l("div",{className:"flex w-full items-center justify-between gap-4 overflow-auto p-1 sm:gap-8",children:[e(a,{className:"h-7 w-40 shrink-0"}),l("div",{className:"flex items-center gap-4 sm:gap-6 lg:gap-8",children:[l("div",{className:"flex items-center gap-2",children:[e(a,{className:"h-7 w-24"}),e(a,{className:"h-7 w-[4.5rem]"})]}),e("div",{className:"flex items-center justify-center font-medium text-sm",children:e(a,{className:"h-7 w-20"})}),l("div",{className:"flex items-center gap-2",children:[e(a,{className:"hidden size-7 lg:block"}),e(a,{className:"size-7"}),e(a,{className:"size-7"}),e(a,{className:"hidden size-7 lg:block"})]})]})]}):null]})}export{h as DataTableSkeleton};
|
|
2
2
|
//# sourceMappingURL=data-table-skeleton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components\\data-table\\data-table-skeleton.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-skeleton.tsx"],"sourcesContent":["import { Skeleton } from '@/components/skeleton'\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from '@/components/table'\r\nimport { cn } from '@/lib/utils'\r\n\r\ninterface DataTableSkeletonProps extends React.ComponentProps<'div'> {\r\n columnCount: number\r\n rowCount?: number\r\n filterCount?: number\r\n cellWidths?: string[]\r\n withViewOptions?: boolean\r\n withPagination?: boolean\r\n shrinkZero?: boolean\r\n}\r\n\r\nexport function DataTableSkeleton({\r\n columnCount,\r\n rowCount = 10,\r\n filterCount = 0,\r\n cellWidths = ['auto'],\r\n withViewOptions = true,\r\n withPagination = true,\r\n shrinkZero = false,\r\n className,\r\n ...props\r\n}: DataTableSkeletonProps) {\r\n const cozyCellWidths = Array.from(\r\n { length: columnCount },\r\n (_, index) => cellWidths[index % cellWidths.length] ?? 'auto'\r\n )\r\n\r\n return (\r\n <div\r\n className={cn('flex w-full flex-col gap-2.5 overflow-auto', className)}\r\n {...props}\r\n >\r\n <div className=\"flex w-full items-center justify-between gap-2 overflow-auto p-1\">\r\n <div className=\"flex flex-1 items-center gap-2\">\r\n {filterCount > 0\r\n ? Array.from({ length: filterCount }).map((_, i) => (\r\n <Skeleton key={i} className=\"h-7 w-[4.5rem]\" />\r\n ))\r\n : null}\r\n </div>\r\n {withViewOptions ? (\r\n <Skeleton className=\"ml-auto hidden h-7 w-[4.5rem] lg:flex\" />\r\n ) : null}\r\n </div>\r\n <div className=\"rounded-md border\">\r\n <Table>\r\n <TableHeader>\r\n {Array.from({ length: 1 }).map((_, i) => (\r\n <TableRow key={i} className=\"hover:bg-transparent\">\r\n {Array.from({ length: columnCount }).map((_, j) => (\r\n <TableHead\r\n key={j}\r\n style={{\r\n width: cozyCellWidths[j],\r\n minWidth: shrinkZero ? cozyCellWidths[j] : 'auto',\r\n }}\r\n >\r\n <Skeleton className=\"h-6 w-full\" />\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n <TableBody>\r\n {Array.from({ length: rowCount }).map((_, i) => (\r\n <TableRow key={i} className=\"hover:bg-transparent\">\r\n {Array.from({ length: columnCount }).map((_, j) => (\r\n <TableCell\r\n key={j}\r\n style={{\r\n width: cozyCellWidths[j],\r\n minWidth: shrinkZero ? cozyCellWidths[j] : 'auto',\r\n }}\r\n >\r\n <Skeleton className=\"h-6 w-full\" />\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n {withPagination ? (\r\n <div className=\"flex w-full items-center justify-between gap-4 overflow-auto p-1 sm:gap-8\">\r\n <Skeleton className=\"h-7 w-40 shrink-0\" />\r\n <div className=\"flex items-center gap-4 sm:gap-6 lg:gap-8\">\r\n <div className=\"flex items-center gap-2\">\r\n <Skeleton className=\"h-7 w-24\" />\r\n <Skeleton className=\"h-7 w-[4.5rem]\" />\r\n </div>\r\n <div className=\"flex items-center justify-center font-medium text-sm\">\r\n <Skeleton className=\"h-7 w-20\" />\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Skeleton className=\"hidden size-7 lg:block\" />\r\n <Skeleton className=\"size-7\" />\r\n <Skeleton className=\"size-7\" />\r\n <Skeleton className=\"hidden size-7 lg:block\" />\r\n </div>\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n"],"names":["DataTableSkeleton","columnCount","rowCount","filterCount","cellWidths","withViewOptions","withPagination","shrinkZero","className","props","cozyCellWidths","Array","_","index","cn","i","Skeleton","Table","TableHeader","TableRow","j","TableHead","TableBody","TableCell"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components\\data-table\\data-table-skeleton.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-skeleton.tsx"],"sourcesContent":["import { Skeleton } from '@/components/skeleton'\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from '@/components/table'\r\nimport { cn } from '@/lib/utils'\r\n\r\ninterface DataTableSkeletonProps extends React.ComponentProps<'div'> {\r\n columnCount: number\r\n rowCount?: number\r\n filterCount?: number\r\n cellWidths?: string[]\r\n withViewOptions?: boolean\r\n withPagination?: boolean\r\n shrinkZero?: boolean\r\n}\r\n\r\nexport function DataTableSkeleton({\r\n columnCount,\r\n rowCount = 10,\r\n filterCount = 0,\r\n cellWidths = ['auto'],\r\n withViewOptions = true,\r\n withPagination = true,\r\n shrinkZero = false,\r\n className,\r\n ...props\r\n}: DataTableSkeletonProps) {\r\n const cozyCellWidths = Array.from(\r\n { length: columnCount },\r\n (_, index) => cellWidths[index % cellWidths.length] ?? 'auto'\r\n )\r\n\r\n return (\r\n <div\r\n className={cn('flex w-full flex-col gap-2.5 overflow-auto', className)}\r\n {...props}\r\n >\r\n <div className=\"flex w-full items-center justify-between gap-2 overflow-auto p-1\">\r\n <div className=\"flex flex-1 items-center gap-2\">\r\n {filterCount > 0\r\n ? Array.from({ length: filterCount }).map((_, i) => (\r\n <Skeleton key={i} className=\"h-7 w-[4.5rem]\" />\r\n ))\r\n : null}\r\n </div>\r\n {withViewOptions ? (\r\n <Skeleton className=\"ml-auto hidden h-7 w-[4.5rem] lg:flex\" />\r\n ) : null}\r\n </div>\r\n <div className=\"rounded-md border\">\r\n <Table>\r\n <TableHeader>\r\n {Array.from({ length: 1 }).map((_, i) => (\r\n <TableRow key={i} className=\"hover:bg-transparent\">\r\n {Array.from({ length: columnCount }).map((_, j) => (\r\n <TableHead\r\n key={j}\r\n style={{\r\n width: cozyCellWidths[j],\r\n minWidth: shrinkZero ? cozyCellWidths[j] : 'auto',\r\n }}\r\n >\r\n <Skeleton className=\"h-6 w-full\" />\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n <TableBody>\r\n {Array.from({ length: rowCount }).map((_, i) => (\r\n <TableRow key={i} className=\"hover:bg-transparent\">\r\n {Array.from({ length: columnCount }).map((_, j) => (\r\n <TableCell\r\n key={j}\r\n style={{\r\n width: cozyCellWidths[j],\r\n minWidth: shrinkZero ? cozyCellWidths[j] : 'auto',\r\n }}\r\n >\r\n <Skeleton className=\"h-6 w-full\" />\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n {withPagination ? (\r\n <div className=\"flex w-full items-center justify-between gap-4 overflow-auto p-1 sm:gap-8\">\r\n <Skeleton className=\"h-7 w-40 shrink-0\" />\r\n <div className=\"flex items-center gap-4 sm:gap-6 lg:gap-8\">\r\n <div className=\"flex items-center gap-2\">\r\n <Skeleton className=\"h-7 w-24\" />\r\n <Skeleton className=\"h-7 w-[4.5rem]\" />\r\n </div>\r\n <div className=\"flex items-center justify-center font-medium text-sm\">\r\n <Skeleton className=\"h-7 w-20\" />\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Skeleton className=\"hidden size-7 lg:block\" />\r\n <Skeleton className=\"size-7\" />\r\n <Skeleton className=\"size-7\" />\r\n <Skeleton className=\"hidden size-7 lg:block\" />\r\n </div>\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n"],"names":["DataTableSkeleton","columnCount","rowCount","filterCount","cellWidths","withViewOptions","withPagination","shrinkZero","className","props","cozyCellWidths","Array","_","index","cn","i","Skeleton","Table","TableHeader","TableRow","j","TableHead","TableBody","TableCell"],"mappings":"oPAqBO,SAASA,EAAkB,CAChCC,YAAAA,CAAW,CACXC,SAAAA,EAAW,EAAE,CACbC,YAAAA,EAAc,CAAC,CACfC,WAAAA,EAAa,CAAC,OAAO,CACrBC,gBAAAA,EAAkB,EAAI,CACtBC,eAAAA,EAAiB,EAAI,CACrBC,WAAAA,EAAa,EAAK,CAClBC,UAAAA,CAAS,CACT,GAAGC,EACoB,EACvB,IAAMC,EAAiBC,MAAM,IAAI,CAC/B,CAAE,OAAQV,CAAY,EACtB,CAACW,EAAGC,IAAUT,CAAU,CAACS,EAAQT,EAAW,MAAM,CAAC,EAAI,QAGzD,OACE,EAAC,OACC,UAAWU,EAAG,6CAA8CN,GAC3D,GAAGC,CAAK,C,UAET,EAAC,OAAI,UAAU,mE,UACb,EAAC,OAAI,UAAU,iC,SACZN,EAAc,EACXQ,MAAM,IAAI,CAAC,CAAE,OAAQR,CAAY,GAAG,GAAG,CAAC,CAACS,EAAGG,IAC1C,EAACC,EAAQA,CAAS,UAAU,gB,EAAbD,IAEjB,I,GAELV,EACC,EAACW,EAAQA,CAAC,UAAU,uC,GAClB,K,GAEN,EAAC,OAAI,UAAU,oB,SACb,EAACC,EAAKA,C,UACJ,EAACC,EAAWA,C,SACTP,MAAM,IAAI,CAAC,CAAE,OAAQ,CAAE,GAAG,GAAG,CAAC,CAACC,EAAGG,IACjC,EAACI,EAAQA,CAAS,UAAU,uB,SACzBR,MAAM,IAAI,CAAC,CAAE,OAAQV,CAAY,GAAG,GAAG,CAAC,CAACW,EAAGQ,IAC3C,EAACC,EAASA,CAER,MAAO,CACL,MAAOX,CAAc,CAACU,EAAE,CACxB,SAAUb,EAAaG,CAAc,CAACU,EAAE,CAAG,MAC7C,E,SAEA,EAACJ,EAAQA,CAAC,UAAU,Y,IANfI,G,EAHIL,G,GAenB,EAACO,EAASA,C,SACPX,MAAM,IAAI,CAAC,CAAE,OAAQT,CAAS,GAAG,GAAG,CAAC,CAACU,EAAGG,IACxC,EAACI,EAAQA,CAAS,UAAU,uB,SACzBR,MAAM,IAAI,CAAC,CAAE,OAAQV,CAAY,GAAG,GAAG,CAAC,CAACW,EAAGQ,IAC3C,EAACG,EAASA,CAER,MAAO,CACL,MAAOb,CAAc,CAACU,EAAE,CACxB,SAAUb,EAAaG,CAAc,CAACU,EAAE,CAAG,MAC7C,E,SAEA,EAACJ,EAAQA,CAAC,UAAU,Y,IANfI,G,EAHIL,G,QAiBtBT,EACC,EAAC,OAAI,UAAU,4E,UACb,EAACU,EAAQA,CAAC,UAAU,mB,GACpB,EAAC,OAAI,UAAU,4C,UACb,EAAC,OAAI,UAAU,0B,UACb,EAACA,EAAQA,CAAC,UAAU,U,GACpB,EAACA,EAAQA,CAAC,UAAU,gB,MAEtB,EAAC,OAAI,UAAU,uD,SACb,EAACA,EAAQA,CAAC,UAAU,U,KAEtB,EAAC,OAAI,UAAU,0B,UACb,EAACA,EAAQA,CAAC,UAAU,wB,GACpB,EAACA,EAAQA,CAAC,UAAU,Q,GACpB,EAACA,EAAQA,CAAC,UAAU,Q,GACpB,EAACA,EAAQA,CAAC,UAAU,wB,YAIxB,K,EAGV,Q"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
import
|
|
2
|
+
import{Fragment as e,jsx as r,jsxs as t}from"react/jsx-runtime";import{useCallback as a,useId as i,useMemo as l}from"react";import{Button as n}from"../button.js";import{Input as o}from"../input.js";import{Label as m}from"../label.js";import{Popover as s,PopoverContent as c,PopoverTrigger as u}from"../popover.js";import{Separator as d}from"../separator.js";import{Slider as p}from"../slider.js";import{cn as h}from"../../lib/utils.js";import{PlusCircle as f,XCircle as g}from"@phosphor-icons/react";function b(e){return Array.isArray(e)&&2===e.length&&"number"==typeof e[0]&&"number"==typeof e[1]}function v({column:v,title:x}){let N=i(),y=b(v.getFilterValue())?v.getFilterValue():void 0,F=v.columnDef.meta?.range,$=v.columnDef.meta?.unit,{min:j,max:C,step:V}=l(()=>{let e=0,r=100;if(F&&b(F))[e,r]=F;else{let t=v.getFacetedMinMaxValues();if(t&&Array.isArray(t)&&2===t.length){let[a,i]=t;"number"==typeof a&&"number"==typeof i&&(e=a,r=i)}}let t=r-e;return{min:e,max:r,step:t<=20?1:t<=100?Math.ceil(t/20):Math.ceil(t/50)}},[v,F]),M=l(()=>y??[j,C],[y,j,C]),A=a(e=>e.toLocaleString(void 0,{maximumFractionDigits:0}),[]),S=a(e=>{let r=Number(e.target.value);!Number.isNaN(r)&&r>=j&&r<=M[1]&&v.setFilterValue([r,M[1]])},[v,j,M]),D=a(e=>{let r=Number(e.target.value);!Number.isNaN(r)&&r<=C&&r>=M[0]&&v.setFilterValue([M[0],r])},[v,C,M]),w=a(e=>{Array.isArray(e)&&2===e.length&&v.setFilterValue(e)},[v]),L=a(e=>{e.target instanceof HTMLDivElement&&e.stopPropagation(),v.setFilterValue(void 0)},[v]);return t(s,{children:[r(u,{asChild:!0,children:t(n,{variant:"outline",size:"sm",children:[y?r("div",{role:"button","aria-label":`Clear ${x} filter`,tabIndex:0,className:"rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-500",onClick:L,children:r(g,{})}):r(f,{}),r("span",{children:x}),y?t(e,{children:[r(d,{orientation:"vertical",className:"mx-0.5 data-[orientation=vertical]:h-4"}),A(y[0])," -"," ",A(y[1]),$?` ${$}`:""]}):null]})}),t(c,{align:"start",className:"flex w-auto flex-col gap-4",children:[t("div",{className:"flex flex-col gap-3",children:[r("p",{className:"font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",children:x}),t("div",{className:"flex items-center gap-4",children:[r(m,{htmlFor:`${N}-from`,className:"sr-only",children:"From"}),t("div",{className:"relative",children:[r(o,{id:`${N}-from`,type:"number","aria-valuemin":j,"aria-valuemax":C,inputMode:"numeric",pattern:"[0-9]*",placeholder:j.toString(),min:j,max:C,value:M[0]?.toString(),onChange:S,className:h("h-10 w-24",$&&"pr-8")}),$&&r("span",{className:"absolute top-0 right-0 bottom-0 flex items-center rounded-r-md bg-accent px-2 text-muted-foreground text-sm",children:$})]}),r(m,{htmlFor:`${N}-to`,className:"sr-only",children:"to"}),t("div",{className:"relative",children:[r(o,{id:`${N}-to`,type:"number","aria-valuemin":j,"aria-valuemax":C,inputMode:"numeric",pattern:"[0-9]*",placeholder:C.toString(),min:j,max:C,value:M[1]?.toString(),onChange:D,className:h("h-10 w-24",$&&"pr-8")}),$&&r("span",{className:"absolute top-0 right-0 bottom-0 flex items-center rounded-r-md bg-accent px-2 text-muted-foreground text-sm",children:$})]})]}),t(m,{htmlFor:`${N}-slider`,className:"sr-only",children:[x," slider"]}),r(p,{id:`${N}-slider`,min:j,max:C,step:V,value:M,onValueChange:w})]}),r(n,{"aria-label":`Clear ${x} filter`,variant:"outline",size:"sm",onClick:L,children:"Limpar"})]})]})}export{v as DataTableSliderFilter};
|
|
3
3
|
//# sourceMappingURL=data-table-slider-filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components\\data-table\\data-table-slider-filter.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-slider-filter.tsx"],"sourcesContent":["\r\n\r\nimport type { Column } from '@tanstack/react-table'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '@/components/button'\r\nimport { Input } from '@/components/input'\r\nimport { Label } from '@/components/label'\r\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/popover'\r\nimport { Separator } from '@/components/separator'\r\nimport { Slider } from '@/components/slider'\r\nimport { cn } from '@/lib/utils'\r\nimport { PlusCircle, XCircle } from '@phosphor-icons/react'\r\n\r\ninterface Range {\r\n min: number\r\n max: number\r\n}\r\n\r\ntype RangeValue = [number, number]\r\n\r\nfunction getIsValidRange(value: unknown): value is RangeValue {\r\n return (\r\n Array.isArray(value) &&\r\n value.length === 2 &&\r\n typeof value[0] === 'number' &&\r\n typeof value[1] === 'number'\r\n )\r\n}\r\n\r\ninterface DataTableSliderFilterProps<TData> {\r\n column: Column<TData, unknown>\r\n title?: string\r\n}\r\n\r\nexport function DataTableSliderFilter<TData>({\r\n column,\r\n title,\r\n}: DataTableSliderFilterProps<TData>) {\r\n const id = React.useId()\r\n\r\n const columnFilterValue = getIsValidRange(column.getFilterValue())\r\n ? (column.getFilterValue() as RangeValue)\r\n : undefined\r\n\r\n const defaultRange = column.columnDef.meta?.range\r\n const unit = column.columnDef.meta?.unit\r\n\r\n const { min, max, step } = React.useMemo<Range & { step: number }>(() => {\r\n let minValue = 0\r\n let maxValue = 100\r\n\r\n if (defaultRange && getIsValidRange(defaultRange)) {\r\n ;[minValue, maxValue] = defaultRange\r\n } else {\r\n const values = column.getFacetedMinMaxValues()\r\n if (values && Array.isArray(values) && values.length === 2) {\r\n const [facetMinValue, facetMaxValue] = values\r\n if (\r\n typeof facetMinValue === 'number' &&\r\n typeof facetMaxValue === 'number'\r\n ) {\r\n minValue = facetMinValue\r\n maxValue = facetMaxValue\r\n }\r\n }\r\n }\r\n\r\n const rangeSize = maxValue - minValue\r\n const step =\r\n rangeSize <= 20\r\n ? 1\r\n : rangeSize <= 100\r\n ? Math.ceil(rangeSize / 20)\r\n : Math.ceil(rangeSize / 50)\r\n\r\n return { min: minValue, max: maxValue, step }\r\n }, [column, defaultRange])\r\n\r\n const range = React.useMemo((): RangeValue => {\r\n return columnFilterValue ?? [min, max]\r\n }, [columnFilterValue, min, max])\r\n\r\n const formatValue = React.useCallback((value: number) => {\r\n return value.toLocaleString(undefined, { maximumFractionDigits: 0 })\r\n }, [])\r\n\r\n const onFromInputChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const numValue = Number(event.target.value)\r\n if (!Number.isNaN(numValue) && numValue >= min && numValue <= range[1]) {\r\n column.setFilterValue([numValue, range[1]])\r\n }\r\n },\r\n [column, min, range]\r\n )\r\n\r\n const onToInputChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const numValue = Number(event.target.value)\r\n if (!Number.isNaN(numValue) && numValue <= max && numValue >= range[0]) {\r\n column.setFilterValue([range[0], numValue])\r\n }\r\n },\r\n [column, max, range]\r\n )\r\n\r\n const onSliderValueChange = React.useCallback(\r\n (value: RangeValue) => {\r\n if (Array.isArray(value) && value.length === 2) {\r\n column.setFilterValue(value)\r\n }\r\n },\r\n [column]\r\n )\r\n\r\n const onReset = React.useCallback(\r\n (event: React.MouseEvent) => {\r\n if (event.target instanceof HTMLDivElement) {\r\n event.stopPropagation()\r\n }\r\n column.setFilterValue(undefined)\r\n },\r\n [column]\r\n )\r\n\r\n return (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button variant=\"outline\" size=\"sm\">\r\n {columnFilterValue ? (\r\n <div\r\n role=\"button\"\r\n aria-label={`Clear ${title} filter`}\r\n tabIndex={0}\r\n className=\"rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-500\"\r\n onClick={onReset}\r\n >\r\n <XCircle />\r\n </div>\r\n ) : (\r\n <PlusCircle />\r\n )}\r\n <span>{title}</span>\r\n {columnFilterValue ? (\r\n <>\r\n <Separator\r\n orientation=\"vertical\"\r\n className=\"mx-0.5 data-[orientation=vertical]:h-4\"\r\n />\r\n {formatValue(columnFilterValue[0])} -{' '}\r\n {formatValue(columnFilterValue[1])}\r\n {unit ? ` ${unit}` : ''}\r\n </>\r\n ) : null}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent align=\"start\" className=\"flex w-auto flex-col gap-4\">\r\n <div className=\"flex flex-col gap-3\">\r\n <p className=\"font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\r\n {title}\r\n </p>\r\n <div className=\"flex items-center gap-4\">\r\n <Label htmlFor={`${id}-from`} className=\"sr-only\">\r\n From\r\n </Label>\r\n <div className=\"relative\">\r\n <Input\r\n id={`${id}-from`}\r\n type=\"number\"\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n placeholder={min.toString()}\r\n min={min}\r\n max={max}\r\n value={range[0]?.toString()}\r\n onChange={onFromInputChange}\r\n className={cn('h-10 w-24', unit && 'pr-8')}\r\n />\r\n {unit && (\r\n <span className=\"absolute top-0 right-0 bottom-0 flex items-center rounded-r-md bg-accent px-2 text-muted-foreground text-sm\">\r\n {unit}\r\n </span>\r\n )}\r\n </div>\r\n <Label htmlFor={`${id}-to`} className=\"sr-only\">\r\n to\r\n </Label>\r\n <div className=\"relative\">\r\n <Input\r\n id={`${id}-to`}\r\n type=\"number\"\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n placeholder={max.toString()}\r\n min={min}\r\n max={max}\r\n value={range[1]?.toString()}\r\n onChange={onToInputChange}\r\n className={cn('h-10 w-24', unit && 'pr-8')}\r\n />\r\n {unit && (\r\n <span className=\"absolute top-0 right-0 bottom-0 flex items-center rounded-r-md bg-accent px-2 text-muted-foreground text-sm\">\r\n {unit}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <Label htmlFor={`${id}-slider`} className=\"sr-only\">\r\n {title} slider\r\n </Label>\r\n <Slider\r\n id={`${id}-slider`}\r\n min={min}\r\n max={max}\r\n step={step}\r\n value={range}\r\n onValueChange={onSliderValueChange}\r\n />\r\n </div>\r\n <Button\r\n aria-label={`Clear ${title} filter`}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onReset}\r\n >\r\n Limpar\r\n </Button>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n"],"names":["getIsValidRange","value","Array","DataTableSliderFilter","column","title","id","React","columnFilterValue","undefined","defaultRange","unit","min","max","step","minValue","maxValue","values","facetMinValue","facetMaxValue","rangeSize","Math","range","formatValue","onFromInputChange","event","numValue","Number","onToInputChange","onSliderValueChange","onReset","HTMLDivElement","Popover","PopoverTrigger","Button","XCircle","PlusCircle","Separator","PopoverContent","Label","Input","cn","Slider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components\\data-table\\data-table-slider-filter.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-slider-filter.tsx"],"sourcesContent":["\r\n\r\nimport type { Column } from '@tanstack/react-table'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '@/components/button'\r\nimport { Input } from '@/components/input'\r\nimport { Label } from '@/components/label'\r\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/popover'\r\nimport { Separator } from '@/components/separator'\r\nimport { Slider } from '@/components/slider'\r\nimport { cn } from '@/lib/utils'\r\nimport { PlusCircle, XCircle } from '@phosphor-icons/react'\r\n\r\ninterface Range {\r\n min: number\r\n max: number\r\n}\r\n\r\ntype RangeValue = [number, number]\r\n\r\nfunction getIsValidRange(value: unknown): value is RangeValue {\r\n return (\r\n Array.isArray(value) &&\r\n value.length === 2 &&\r\n typeof value[0] === 'number' &&\r\n typeof value[1] === 'number'\r\n )\r\n}\r\n\r\ninterface DataTableSliderFilterProps<TData> {\r\n column: Column<TData, unknown>\r\n title?: string\r\n}\r\n\r\nexport function DataTableSliderFilter<TData>({\r\n column,\r\n title,\r\n}: DataTableSliderFilterProps<TData>) {\r\n const id = React.useId()\r\n\r\n const columnFilterValue = getIsValidRange(column.getFilterValue())\r\n ? (column.getFilterValue() as RangeValue)\r\n : undefined\r\n\r\n const defaultRange = column.columnDef.meta?.range\r\n const unit = column.columnDef.meta?.unit\r\n\r\n const { min, max, step } = React.useMemo<Range & { step: number }>(() => {\r\n let minValue = 0\r\n let maxValue = 100\r\n\r\n if (defaultRange && getIsValidRange(defaultRange)) {\r\n ;[minValue, maxValue] = defaultRange\r\n } else {\r\n const values = column.getFacetedMinMaxValues()\r\n if (values && Array.isArray(values) && values.length === 2) {\r\n const [facetMinValue, facetMaxValue] = values\r\n if (\r\n typeof facetMinValue === 'number' &&\r\n typeof facetMaxValue === 'number'\r\n ) {\r\n minValue = facetMinValue\r\n maxValue = facetMaxValue\r\n }\r\n }\r\n }\r\n\r\n const rangeSize = maxValue - minValue\r\n const step =\r\n rangeSize <= 20\r\n ? 1\r\n : rangeSize <= 100\r\n ? Math.ceil(rangeSize / 20)\r\n : Math.ceil(rangeSize / 50)\r\n\r\n return { min: minValue, max: maxValue, step }\r\n }, [column, defaultRange])\r\n\r\n const range = React.useMemo((): RangeValue => {\r\n return columnFilterValue ?? [min, max]\r\n }, [columnFilterValue, min, max])\r\n\r\n const formatValue = React.useCallback((value: number) => {\r\n return value.toLocaleString(undefined, { maximumFractionDigits: 0 })\r\n }, [])\r\n\r\n const onFromInputChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const numValue = Number(event.target.value)\r\n if (!Number.isNaN(numValue) && numValue >= min && numValue <= range[1]) {\r\n column.setFilterValue([numValue, range[1]])\r\n }\r\n },\r\n [column, min, range]\r\n )\r\n\r\n const onToInputChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const numValue = Number(event.target.value)\r\n if (!Number.isNaN(numValue) && numValue <= max && numValue >= range[0]) {\r\n column.setFilterValue([range[0], numValue])\r\n }\r\n },\r\n [column, max, range]\r\n )\r\n\r\n const onSliderValueChange = React.useCallback(\r\n (value: RangeValue) => {\r\n if (Array.isArray(value) && value.length === 2) {\r\n column.setFilterValue(value)\r\n }\r\n },\r\n [column]\r\n )\r\n\r\n const onReset = React.useCallback(\r\n (event: React.MouseEvent) => {\r\n if (event.target instanceof HTMLDivElement) {\r\n event.stopPropagation()\r\n }\r\n column.setFilterValue(undefined)\r\n },\r\n [column]\r\n )\r\n\r\n return (\r\n <Popover>\r\n <PopoverTrigger asChild>\r\n <Button variant=\"outline\" size=\"sm\">\r\n {columnFilterValue ? (\r\n <div\r\n role=\"button\"\r\n aria-label={`Clear ${title} filter`}\r\n tabIndex={0}\r\n className=\"rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-500\"\r\n onClick={onReset}\r\n >\r\n <XCircle />\r\n </div>\r\n ) : (\r\n <PlusCircle />\r\n )}\r\n <span>{title}</span>\r\n {columnFilterValue ? (\r\n <>\r\n <Separator\r\n orientation=\"vertical\"\r\n className=\"mx-0.5 data-[orientation=vertical]:h-4\"\r\n />\r\n {formatValue(columnFilterValue[0])} -{' '}\r\n {formatValue(columnFilterValue[1])}\r\n {unit ? ` ${unit}` : ''}\r\n </>\r\n ) : null}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent align=\"start\" className=\"flex w-auto flex-col gap-4\">\r\n <div className=\"flex flex-col gap-3\">\r\n <p className=\"font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\r\n {title}\r\n </p>\r\n <div className=\"flex items-center gap-4\">\r\n <Label htmlFor={`${id}-from`} className=\"sr-only\">\r\n From\r\n </Label>\r\n <div className=\"relative\">\r\n <Input\r\n id={`${id}-from`}\r\n type=\"number\"\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n placeholder={min.toString()}\r\n min={min}\r\n max={max}\r\n value={range[0]?.toString()}\r\n onChange={onFromInputChange}\r\n className={cn('h-10 w-24', unit && 'pr-8')}\r\n />\r\n {unit && (\r\n <span className=\"absolute top-0 right-0 bottom-0 flex items-center rounded-r-md bg-accent px-2 text-muted-foreground text-sm\">\r\n {unit}\r\n </span>\r\n )}\r\n </div>\r\n <Label htmlFor={`${id}-to`} className=\"sr-only\">\r\n to\r\n </Label>\r\n <div className=\"relative\">\r\n <Input\r\n id={`${id}-to`}\r\n type=\"number\"\r\n aria-valuemin={min}\r\n aria-valuemax={max}\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n placeholder={max.toString()}\r\n min={min}\r\n max={max}\r\n value={range[1]?.toString()}\r\n onChange={onToInputChange}\r\n className={cn('h-10 w-24', unit && 'pr-8')}\r\n />\r\n {unit && (\r\n <span className=\"absolute top-0 right-0 bottom-0 flex items-center rounded-r-md bg-accent px-2 text-muted-foreground text-sm\">\r\n {unit}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <Label htmlFor={`${id}-slider`} className=\"sr-only\">\r\n {title} slider\r\n </Label>\r\n <Slider\r\n id={`${id}-slider`}\r\n min={min}\r\n max={max}\r\n step={step}\r\n value={range}\r\n onValueChange={onSliderValueChange}\r\n />\r\n </div>\r\n <Button\r\n aria-label={`Clear ${title} filter`}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onReset}\r\n >\r\n Limpar\r\n </Button>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n"],"names":["getIsValidRange","value","Array","DataTableSliderFilter","column","title","id","React","columnFilterValue","undefined","defaultRange","unit","min","max","step","minValue","maxValue","values","facetMinValue","facetMaxValue","rangeSize","Math","range","formatValue","onFromInputChange","event","numValue","Number","onToInputChange","onSliderValueChange","onReset","HTMLDivElement","Popover","PopoverTrigger","Button","XCircle","PlusCircle","Separator","PopoverContent","Label","Input","cn","Slider"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
import
|
|
2
|
+
import{jsx as e,jsxs as i}from"react/jsx-runtime";import{ArrowsDownUpIcon as n,CaretUpDownIcon as a,DotsSixVerticalIcon as r,TrashIcon as t}from"@phosphor-icons/react";import{useCallback as l,useEffect as o,useId as s,useMemo as d,useRef as c,useState as m}from"react";import{Badge as h}from"../badge.js";import{Button as p}from"../button.js";import{Command as u,CommandEmpty as g,CommandGroup as f,CommandInput as v,CommandItem as x,CommandList as b}from"../command.js";import{Popover as w,PopoverContent as N,PopoverTrigger as y}from"../popover.js";import{Select as C,SelectContent as k,SelectItem as z,SelectTrigger as L,SelectValue as j}from"../select.js";import{Sortable as S,SortableContent as D,SortableItem as T,SortableItemHandle as E,SortableOverlay as I}from"../sortable.js";import{dataTableConfig as K}from"../../lib/data-table-config.js";import{cn as M}from"../../lib/utils.js";let O=["backspace","delete"];function A({table:a,...r}){let t=s(),u=s(),g=s(),[f,v]=m(!1),x=c(null),b=a.getState().sorting,C=a.setSorting,{columnLabels:k,columns:z}=d(()=>{let e=new Map,i=new Set(b.map(e=>e.id)),n=[];for(let r of a.getAllColumns()){if(!r.getCanSort())continue;let a=r.columnDef.meta?.label??r.id;e.set(r.id,a),i.has(r.id)||n.push({id:r.id,label:a})}return{columnLabels:e,columns:n}},[b,a]),L=l(()=>{let e=z[0];e&&C(i=>[...i,{id:e.id,desc:!1}])},[z,C]),j=l((e,i)=>{C(n=>n?n.map(n=>n.id===e?{...n,...i}:n):n)},[C]),T=l(e=>{C(i=>i.filter(i=>i.id!==e))},[C]),E=l(()=>C(a.initialState.sorting),[C,a.initialState.sorting]);o(()=>{function e(e){!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)&&("s"!==e.key.toLowerCase()||e.ctrlKey||e.metaKey||e.shiftKey||(e.preventDefault(),v(!0)),"s"===e.key.toLowerCase()&&e.shiftKey&&b.length>0&&(e.preventDefault(),E()))}return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[b.length,E]);let K=l(e=>{O.includes(e.key.toLowerCase())&&b.length>0&&(e.preventDefault(),E())},[b.length,E]);return i(S,{value:b,onValueChange:C,getItemValue:e=>e.id,children:[i(w,{open:f,onOpenChange:v,children:[e(y,{asChild:!0,children:i(p,{variant:"outline",size:"sm",onKeyDown:K,children:[e(n,{}),"Ordenar",b.length>0&&e(h,{variant:"secondary",className:"h-[18.24px] rounded-[3.2px] px-[5.12px] font-mono font-normal text-[10.4px]",children:b.length})]})}),i(N,{"aria-labelledby":u,"aria-describedby":g,className:"flex w-full max-w-[var(--radix-popover-content-available-width)] origin-[var(--radix-popover-content-transform-origin)] flex-col gap-3.5 p-4 sm:min-w-[380px]",...r,children:[i("div",{className:"flex flex-col gap-1",children:[e("h4",{id:u,className:"font-medium leading-none",children:b.length>0?"Ordenar por":"Nenhuma ordena\xe7\xe3o aplicada"}),e("p",{id:g,className:M("text-gray-500 text-sm",b.length>0&&"sr-only"),children:b.length>0?"Modifique a ordena\xe7\xe3o para organizar suas linhas.":"Adicione uma ordena\xe7\xe3o para organizar suas linhas."})]}),b.length>0&&e(D,{asChild:!0,children:e("div",{role:"list",className:"flex max-h-[300px] flex-col gap-2 overflow-y-auto p-1",children:b.map(i=>e($,{sort:i,sortItemId:`${t}-sort-${i.id}`,columns:z,columnLabels:k,onSortUpdate:j,onSortRemove:T},i.id))})}),i("div",{className:"flex w-full items-center gap-2",children:[e(p,{size:"sm",className:"rounded",ref:x,onClick:L,disabled:0===z.length,children:"Adicionar"}),b.length>0&&e(p,{variant:"outline",size:"sm",className:"rounded",onClick:E,children:"Resetar"})]})]})]}),e(I,{children:i("div",{className:"flex items-center gap-2",children:[e("div",{className:"h-10 w-[180px] rounded-sm bg-primary/10"}),e("div",{className:"h-10 w-24 rounded-sm bg-primary/10"}),e("div",{className:"size-8 shrink-0 rounded-sm bg-primary/10"}),e("div",{className:"size-8 shrink-0 rounded-sm bg-primary/10"})]})})]})}function $({sort:n,sortItemId:o,columns:s,columnLabels:d,onSortUpdate:c,onSortRemove:h}){let S=`${o}-field-listbox`,D=`${o}-field-trigger`,I=`${o}-direction-listbox`,[M,A]=m(!1),[$,H]=m(!1),V=l(e=>{!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)&&(M||$||O.includes(e.key.toLowerCase())&&(e.preventDefault(),h(n.id)))},[n.id,M,$,h]);return e(T,{value:n.id,asChild:!0,children:i("div",{role:"listitem",id:o,tabIndex:-1,className:"flex items-center gap-2",onKeyDown:V,children:[i(w,{open:M,onOpenChange:A,children:[e(y,{asChild:!0,children:i(p,{id:D,role:"combobox","aria-controls":S,variant:"outline",size:"sm",className:"w-44 justify-between rounded font-normal",children:[e("span",{className:"truncate",children:d.get(n.id)}),e(a,{className:"opacity-50"})]})}),e(N,{id:S,className:"w-[var(--radix-popover-trigger-width)] origin-[var(--radix-popover-content-transform-origin)] p-0",children:i(u,{children:[e(v,{placeholder:"Buscar campo..."}),i(b,{children:[e(g,{children:"Nenhum campo encontrado."}),e(f,{children:s.map(i=>e(x,{value:i.id,onSelect:e=>c(n.id,{id:e}),children:e("span",{className:"truncate",children:i.label})},i.id))})]})]})})]}),i(C,{open:$,onOpenChange:H,value:n.desc?"desc":"asc",onValueChange:e=>c(n.id,{desc:"desc"===e}),children:[e(L,{"aria-controls":I,className:"h-10 w-24 rounded [&[data-size]]:h-10",children:e(j,{})}),e(k,{id:I,className:"min-w-[var(--radix-select-trigger-width)] origin-[var(--radix-select-content-transform-origin)]",children:K.sortOrders.map(i=>e(z,{value:i.value,children:i.label},i.value))})]}),e(p,{"aria-controls":o,variant:"outline",size:"icon",className:"size-10 shrink-0 rounded",onClick:()=>h(n.id),children:e(t,{weight:"bold"})}),e(E,{asChild:!0,children:e(p,{variant:"outline",size:"icon",className:"size-10 shrink-0 rounded",children:e(r,{weight:"bold"})})})]})})}export{A as DataTableSortList};
|
|
3
3
|
//# sourceMappingURL=data-table-sort-list.js.map
|