@gbmtech/aurora-ui 0.1.48 → 0.1.49
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/data-table/data-table-date-filter.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-date-filter.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-faceted-filter.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-faceted-filter.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-filter-list.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-filter-list.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-filter-menu.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-filter-menu.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-pagination.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-pagination.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-range-filter.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-range-filter.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-slider-filter.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-slider-filter.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-sort-list.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-sort-list.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-toolbar.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-toolbar.cjs.map +1 -1
- package/dist/cjs/components/data-table/data-table-view-options.cjs +1 -1
- package/dist/cjs/components/data-table/data-table-view-options.cjs.map +1 -1
- package/dist/cjs/components/data-table/index.cjs +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-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/index.js +1 -1
- package/dist/types/components/data-table/data-table-pagination.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components\\data-table\\data-table-filter-list.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-filter-list.tsx"],"sourcesContent":["\r\n\r\nimport {\r\n CalendarBlank,\r\n CaretUpDown,\r\n Check,\r\n DotsSixVertical,\r\n FunnelSimple,\r\n Trash,\r\n} from '@phosphor-icons/react'\r\nimport type { Column, ColumnMeta, Table } from '@tanstack/react-table'\r\nimport { parseAsStringEnum, useQueryState } from 'nuqs'\r\nimport * as React from 'react'\r\n\r\nimport { Badge } from '@/components/badge'\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 {\r\n Faceted,\r\n FacetedBadgeList,\r\n FacetedContent,\r\n FacetedEmpty,\r\n FacetedGroup,\r\n FacetedInput,\r\n FacetedItem,\r\n FacetedList,\r\n FacetedTrigger,\r\n} from '@/components/faceted'\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 {\r\n Sortable,\r\n SortableContent,\r\n SortableItem,\r\n SortableItemHandle,\r\n SortableOverlay,\r\n} from '@/components/sortable'\r\nimport { useDebouncedCallback } from '@/hooks/use-debounced-callback'\r\nimport { getDefaultFilterOperator, getFilterOperators } from '@/lib/data-table'\r\nimport { dataTableConfig } from '@/lib/data-table-config'\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 {\r\n ExtendedColumnFilter,\r\n FilterOperator,\r\n JoinOperator,\r\n} from '@/types/data-table'\r\n\r\nconst FILTERS_KEY = 'filters'\r\nconst JOIN_OPERATOR_KEY = 'joinOperator'\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 DataTableFilterListProps<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 DataTableFilterList<TData>({\r\n table,\r\n debounceMs = DEBOUNCE_MS,\r\n throttleMs = THROTTLE_MS,\r\n shallow = true,\r\n ...props\r\n}: DataTableFilterListProps<TData>) {\r\n const id = React.useId()\r\n const labelId = React.useId()\r\n const descriptionId = React.useId()\r\n const [open, setOpen] = React.useState(false)\r\n const addButtonRef = React.useRef<HTMLButtonElement>(null)\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 [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 [joinOperator, setJoinOperator] = useQueryState(\r\n JOIN_OPERATOR_KEY,\r\n parseAsStringEnum(['e', 'ou']).withDefault('e').withOptions({\r\n clearOnDefault: true,\r\n shallow,\r\n })\r\n )\r\n\r\n const onFilterAdd = React.useCallback(() => {\r\n const column = columns[0]\r\n\r\n if (!column) return\r\n\r\n debouncedSetFilters([\r\n ...filters,\r\n {\r\n id: column.id as Extract<keyof TData, string>,\r\n value: '',\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 }, [columns, filters, debouncedSetFilters])\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 onFilterRemove = React.useCallback(\r\n (filterId: string) => {\r\n const updatedFilters = filters.filter(\r\n filter => filter.filterId !== filterId\r\n )\r\n void setFilters(updatedFilters)\r\n requestAnimationFrame(() => {\r\n addButtonRef.current?.focus()\r\n })\r\n },\r\n [filters, setFilters]\r\n )\r\n\r\n const onFiltersReset = React.useCallback(() => {\r\n void setFilters(null)\r\n void setJoinOperator('e')\r\n }, [setFilters, setJoinOperator])\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 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 }, [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 <Sortable\r\n value={filters}\r\n onValueChange={setFilters}\r\n getItemValue={item => item.filterId}\r\n >\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <Button variant=\"secondary\" size=\"xs\" onKeyDown={onTriggerKeyDown}>\r\n <FunnelSimple weight=\"bold\" />\r\n Filtro\r\n {filters.length > 0 && (\r\n <Badge\r\n variant=\"secondary\"\r\n className=\"h-[18.24px] rounded-[3.2px] px-[5.12px] font-mono font-normal text-[10.4px]\"\r\n >\r\n {filters.length}\r\n </Badge>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n aria-describedby={descriptionId}\r\n aria-labelledby={labelId}\r\n 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\n {...props}\r\n >\r\n <div className=\"flex flex-col gap-1\">\r\n <h4 id={labelId} className=\"font-medium leading-none\">\r\n {filters.length > 0 ? 'Filtros' : 'Nenhum filtro aplicado'}\r\n </h4>\r\n <p\r\n id={descriptionId}\r\n className={cn(\r\n 'text-gray-400 text-sm',\r\n filters.length > 0 && 'sr-only'\r\n )}\r\n >\r\n {filters.length > 0\r\n ? 'Modifique os filtros para filtrar suas linhas.'\r\n : 'Adicione filtros para filtrar suas linhas.'}\r\n </p>\r\n </div>\r\n {filters.length > 0 ? (\r\n <SortableContent asChild>\r\n <div\r\n role=\"list\"\r\n className=\"flex max-h-[300px] flex-col gap-2 overflow-y-auto p-1\"\r\n >\r\n {filters.map((filter, index) => (\r\n <DataTableFilterItem<TData>\r\n key={filter.filterId}\r\n filter={filter}\r\n index={index}\r\n filterItemId={`${id}-filter-${filter.filterId}`}\r\n joinOperator={joinOperator}\r\n setJoinOperator={setJoinOperator}\r\n columns={columns}\r\n onFilterUpdate={onFilterUpdate}\r\n onFilterRemove={onFilterRemove}\r\n />\r\n ))}\r\n </div>\r\n </SortableContent>\r\n ) : null}\r\n <div className=\"flex w-full items-center gap-2\">\r\n <Button\r\n size=\"sm\"\r\n className=\"rounded\"\r\n ref={addButtonRef}\r\n onClick={onFilterAdd}\r\n >\r\n Adicionar filtro\r\n </Button>\r\n {filters.length > 0 ? (\r\n <Button\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n className=\"rounded\"\r\n onClick={onFiltersReset}\r\n >\r\n Resetar filtros\r\n </Button>\r\n ) : null}\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n <SortableOverlay>\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"h-8 min-w-[72px] rounded-sm bg-primary/10\" />\r\n <div className=\"h-8 w-32 rounded-sm bg-primary/10\" />\r\n <div className=\"h-8 w-32 rounded-sm bg-primary/10\" />\r\n <div className=\"h-8 min-w-36 flex-1 rounded-sm bg-primary/10\" />\r\n <div className=\"size-8 shrink-0 rounded-sm bg-primary/10\" />\r\n <div className=\"size-8 shrink-0 rounded-sm bg-primary/10\" />\r\n </div>\r\n </SortableOverlay>\r\n </Sortable>\r\n )\r\n}\r\n\r\ninterface DataTableFilterItemProps<TData> {\r\n filter: ExtendedColumnFilter<TData>\r\n index: number\r\n filterItemId: string\r\n joinOperator: JoinOperator\r\n setJoinOperator: (value: JoinOperator) => void\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 index,\r\n filterItemId,\r\n joinOperator,\r\n setJoinOperator,\r\n columns,\r\n onFilterUpdate,\r\n onFilterRemove,\r\n}: DataTableFilterItemProps<TData>) {\r\n const [showFieldSelector, setShowFieldSelector] = React.useState(false)\r\n const [showOperatorSelector, setShowOperatorSelector] = 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 joinOperatorListboxId = `${filterItemId}-join-operator-listbox`\r\n const fieldListboxId = `${filterItemId}-field-listbox`\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 <SortableItem value={filter.filterId} asChild>\r\n <div\r\n role=\"listitem\"\r\n id={filterItemId}\r\n tabIndex={-1}\r\n className=\"flex items-center gap-2\"\r\n onKeyDown={onItemKeyDown}\r\n >\r\n <div className=\"min-w-[72px] text-center\">\r\n {index === 0 ? (\r\n <span className=\"text-gray-400 text-sm\">Onde</span>\r\n ) : index === 1 ? (\r\n <Select\r\n value={joinOperator}\r\n onValueChange={(value: JoinOperator) => setJoinOperator(value)}\r\n >\r\n <SelectTrigger\r\n aria-label=\"Select join operator\"\r\n aria-controls={joinOperatorListboxId}\r\n className=\"h-8 rounded lowercase [&[data-size]]:h-8\"\r\n >\r\n <SelectValue placeholder={joinOperator} />\r\n </SelectTrigger>\r\n <SelectContent\r\n id={joinOperatorListboxId}\r\n position=\"popper\"\r\n className=\"min-w-(--radix-select-trigger-width) lowercase\"\r\n >\r\n {dataTableConfig.joinOperators.map(joinOperator => (\r\n <SelectItem key={joinOperator} value={joinOperator}>\r\n {joinOperator}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n ) : (\r\n <span className=\"text-gray-400 text-sm\">{joinOperator}</span>\r\n )}\r\n </div>\r\n <Popover open={showFieldSelector} onOpenChange={setShowFieldSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n role=\"combobox\"\r\n aria-controls={fieldListboxId}\r\n variant=\"secondary\"\r\n size=\"xs\"\r\n className=\"w-32 justify-between rounded font-normal\"\r\n >\r\n <span className=\"truncate\">\r\n {columns.find(column => column.id === filter.id)?.columnDef.meta\r\n ?.label ?? 'Selecione o campo'}\r\n </span>\r\n <CaretUpDown className=\"opacity-50\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n id={fieldListboxId}\r\n align=\"start\"\r\n className=\"w-40 origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n <Command>\r\n <CommandInput placeholder=\"Buscar campo...\" />\r\n <CommandList>\r\n <CommandEmpty>Nenhum campo encontrado.</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={value => {\r\n onFilterUpdate(filter.filterId, {\r\n id: value 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 <span className=\"truncate\">\r\n {column.columnDef.meta?.label}\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-8 w-32 rounded lowercase [&[data-size]]:h-8\"\r\n >\r\n <div className=\"truncate\">\r\n <SelectValue placeholder={filter.operator} />\r\n </div>\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 value={operator.value}\r\n className=\"lowercase\"\r\n >\r\n {operator.label}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"min-w-36 flex-1\">\r\n {onFilterInputRender({\r\n filter,\r\n inputId,\r\n column,\r\n columnMeta,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n })}\r\n </div>\r\n <Button\r\n aria-controls={filterItemId}\r\n variant=\"secondary\"\r\n size=\"icon\"\r\n className=\"size-8 rounded\"\r\n onClick={() => onFilterRemove(filter.filterId)}\r\n >\r\n <Trash weight=\"bold\" />\r\n </Button>\r\n <SortableItemHandle asChild>\r\n <Button variant=\"secondary\" size=\"icon\" className=\"size-8 rounded\">\r\n <DotsSixVertical weight=\"bold\" />\r\n </Button>\r\n </SortableItemHandle>\r\n </div>\r\n </SortableItem>\r\n )\r\n}\r\n\r\nfunction onFilterInputRender<TData>({\r\n filter,\r\n inputId,\r\n column,\r\n columnMeta,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n}: {\r\n filter: ExtendedColumnFilter<TData>\r\n inputId: string\r\n column: Column<TData>\r\n columnMeta?: ColumnMeta<TData, unknown>\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={`${columnMeta?.label} filter is ${\r\n filter.operator === 'isEmpty' ? 'empty' : 'not empty'\r\n }`}\r\n aria-live=\"polite\"\r\n className=\"h-8 w-full rounded border bg-transparent 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 />\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' : filter.variant}\r\n aria-label={`${columnMeta?.label} filter value`}\r\n aria-describedby={`${inputId}-description`}\r\n inputMode={isNumber ? 'numeric' : undefined}\r\n placeholder={columnMeta?.placeholder ?? 'Enter a value...'}\r\n className=\"h-8 w-full rounded\"\r\n defaultValue={\r\n typeof filter.value === 'string' ? filter.value : undefined\r\n }\r\n onChange={event =>\r\n onFilterUpdate(filter.filterId, {\r\n value: event.target.value,\r\n })\r\n }\r\n />\r\n )\r\n }\r\n\r\n case 'boolean': {\r\n if (Array.isArray(filter.value)) return null\r\n\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={filter.value}\r\n onValueChange={value =>\r\n onFilterUpdate(filter.filterId, {\r\n value,\r\n })\r\n }\r\n >\r\n <SelectTrigger\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n aria-label={`${columnMeta?.label} boolean filter`}\r\n className=\"h-8 w-full rounded [&[data-size]]:h-8\"\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 multiple = filter.variant === 'multiSelect'\r\n const selectedValues = multiple\r\n ? Array.isArray(filter.value)\r\n ? filter.value\r\n : []\r\n : typeof filter.value === 'string'\r\n ? filter.value\r\n : undefined\r\n\r\n return (\r\n <Faceted\r\n open={showValueSelector}\r\n onOpenChange={setShowValueSelector}\r\n value={selectedValues}\r\n onValueChange={value => {\r\n onFilterUpdate(filter.filterId, {\r\n value,\r\n })\r\n }}\r\n multiple={multiple}\r\n >\r\n <FacetedTrigger asChild>\r\n <Button\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n aria-label={`${columnMeta?.label} filter value${multiple ? 's' : ''}`}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"w-full rounded font-normal\"\r\n >\r\n <FacetedBadgeList\r\n options={columnMeta?.options}\r\n placeholder={\r\n columnMeta?.placeholder ??\r\n `Select option${multiple ? 's' : ''}...`\r\n }\r\n />\r\n </Button>\r\n </FacetedTrigger>\r\n <FacetedContent\r\n id={inputListboxId}\r\n className=\"w-[200px] origin-[var(--radix-popover-content-transform-origin)]\"\r\n >\r\n <FacetedInput\r\n aria-label={`Search ${columnMeta?.label} options`}\r\n placeholder={columnMeta?.placeholder ?? 'Search options...'}\r\n />\r\n <FacetedList>\r\n <FacetedEmpty>No options found.</FacetedEmpty>\r\n <FacetedGroup>\r\n {columnMeta?.options?.map(option => (\r\n <FacetedItem key={option.value} value={option.value}>\r\n {option.icon && <option.icon />}\r\n <span>{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 </FacetedItem>\r\n ))}\r\n </FacetedGroup>\r\n </FacetedList>\r\n </FacetedContent>\r\n </Faceted>\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 : 'Escolha uma data'\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 aria-label={`${columnMeta?.label} date filter`}\r\n variant=\"secondary\"\r\n size=\"xs\"\r\n className={cn(\r\n 'w-full justify-start rounded text-left font-normal',\r\n !filter.value && 'text-gray-400'\r\n )}\r\n >\r\n <CalendarBlank weight=\"bold\" />\r\n <span className=\"truncate text-sm\">{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 aria-label={`Select ${columnMeta?.label} date range`}\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 aria-label={`Select ${columnMeta?.label} date`}\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","DataTableFilterList","table","debounceMs","throttleMs","shallow","props","id","React","labelId","descriptionId","open","setOpen","addButtonRef","columns","column","filters","setFilters","useQueryState","getFiltersStateParser","field","debouncedSetFilters","useDebouncedCallback","joinOperator","setJoinOperator","parseAsStringEnum","onFilterAdd","getDefaultFilterOperator","generateId","onFilterUpdate","filterId","updates","prevFilters","filter","onFilterRemove","requestAnimationFrame","onFiltersReset","onKeyDown","event","HTMLInputElement","HTMLTextAreaElement","window","onTriggerKeyDown","Sortable","item","Popover","PopoverTrigger","Button","FunnelSimple","Badge","PopoverContent","cn","SortableContent","index","DataTableFilterItem","SortableOverlay","filterItemId","showFieldSelector","setShowFieldSelector","showOperatorSelector","setShowOperatorSelector","showValueSelector","setShowValueSelector","joinOperatorListboxId","fieldListboxId","operatorListboxId","inputId","columnMeta","filterOperators","getFilterOperators","onItemKeyDown","SortableItem","Select","value","SelectTrigger","SelectValue","SelectContent","dataTableConfig","SelectItem","CaretUpDown","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","Check","operator","onFilterInputRender","DataTableRangeFilter","isNumber","Input","undefined","Array","inputListboxId","multiple","selectedValues","Faceted","FacetedTrigger","FacetedBadgeList","FacetedContent","FacetedInput","FacetedList","FacetedEmpty","FacetedGroup","option","FacetedItem","dateValue","Boolean","displayValue","formatDate","Date","Number","CalendarBlank","Calendar","date","Trash","SortableItemHandle","DotsSixVertical"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components\\data-table\\data-table-filter-list.js","sources":["webpack://@gbmtech/aurora-ui/./src/components/data-table/data-table-filter-list.tsx"],"sourcesContent":["\r\n\r\nimport {\r\n CalendarBlank,\r\n CaretUpDown,\r\n Check,\r\n DotsSixVertical,\r\n FunnelSimple,\r\n Trash,\r\n} from '@phosphor-icons/react'\r\nimport type { Column, ColumnMeta, Table } from '@tanstack/react-table'\r\nimport { parseAsStringEnum, useQueryState } from 'nuqs'\r\nimport * as React from 'react'\r\n\r\nimport { Badge } from '@/components/badge'\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 {\r\n Faceted,\r\n FacetedBadgeList,\r\n FacetedContent,\r\n FacetedEmpty,\r\n FacetedGroup,\r\n FacetedInput,\r\n FacetedItem,\r\n FacetedList,\r\n FacetedTrigger,\r\n} from '@/components/faceted'\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 {\r\n Sortable,\r\n SortableContent,\r\n SortableItem,\r\n SortableItemHandle,\r\n SortableOverlay,\r\n} from '@/components/sortable'\r\nimport { useDebouncedCallback } from '@/hooks/use-debounced-callback'\r\nimport { getDefaultFilterOperator, getFilterOperators } from '@/lib/data-table'\r\nimport { dataTableConfig } from '@/lib/data-table-config'\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 {\r\n ExtendedColumnFilter,\r\n FilterOperator,\r\n JoinOperator,\r\n} from '@/types/data-table'\r\n\r\nconst FILTERS_KEY = 'filters'\r\nconst JOIN_OPERATOR_KEY = 'joinOperator'\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 DataTableFilterListProps<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 DataTableFilterList<TData>({\r\n table,\r\n debounceMs = DEBOUNCE_MS,\r\n throttleMs = THROTTLE_MS,\r\n shallow = true,\r\n ...props\r\n}: DataTableFilterListProps<TData>) {\r\n const id = React.useId()\r\n const labelId = React.useId()\r\n const descriptionId = React.useId()\r\n const [open, setOpen] = React.useState(false)\r\n const addButtonRef = React.useRef<HTMLButtonElement>(null)\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 [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 [joinOperator, setJoinOperator] = useQueryState(\r\n JOIN_OPERATOR_KEY,\r\n parseAsStringEnum(['e', 'ou']).withDefault('e').withOptions({\r\n clearOnDefault: true,\r\n shallow,\r\n })\r\n )\r\n\r\n const onFilterAdd = React.useCallback(() => {\r\n const column = columns[0]\r\n\r\n if (!column) return\r\n\r\n debouncedSetFilters([\r\n ...filters,\r\n {\r\n id: column.id as Extract<keyof TData, string>,\r\n value: '',\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 }, [columns, filters, debouncedSetFilters])\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 onFilterRemove = React.useCallback(\r\n (filterId: string) => {\r\n const updatedFilters = filters.filter(\r\n filter => filter.filterId !== filterId\r\n )\r\n void setFilters(updatedFilters)\r\n requestAnimationFrame(() => {\r\n addButtonRef.current?.focus()\r\n })\r\n },\r\n [filters, setFilters]\r\n )\r\n\r\n const onFiltersReset = React.useCallback(() => {\r\n void setFilters(null)\r\n void setJoinOperator('e')\r\n }, [setFilters, setJoinOperator])\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 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 }, [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 <Sortable\r\n value={filters}\r\n onValueChange={setFilters}\r\n getItemValue={item => item.filterId}\r\n >\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <Button variant=\"secondary\" size=\"sm\" onKeyDown={onTriggerKeyDown}>\r\n <FunnelSimple weight=\"bold\" />\r\n Filtro\r\n {filters.length > 0 && (\r\n <Badge\r\n variant=\"secondary\"\r\n className=\"h-[18.24px] rounded-[3.2px] px-[5.12px] font-mono font-normal text-[10.4px]\"\r\n >\r\n {filters.length}\r\n </Badge>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n aria-describedby={descriptionId}\r\n aria-labelledby={labelId}\r\n 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\n {...props}\r\n >\r\n <div className=\"flex flex-col gap-1\">\r\n <h4 id={labelId} className=\"font-medium leading-none\">\r\n {filters.length > 0 ? 'Filtros' : 'Nenhum filtro aplicado'}\r\n </h4>\r\n <p\r\n id={descriptionId}\r\n className={cn(\r\n 'text-gray-400 text-sm',\r\n filters.length > 0 && 'sr-only'\r\n )}\r\n >\r\n {filters.length > 0\r\n ? 'Modifique os filtros para filtrar suas linhas.'\r\n : 'Adicione filtros para filtrar suas linhas.'}\r\n </p>\r\n </div>\r\n {filters.length > 0 ? (\r\n <SortableContent asChild>\r\n <div\r\n role=\"list\"\r\n className=\"flex max-h-[300px] flex-col gap-2 overflow-y-auto p-1\"\r\n >\r\n {filters.map((filter, index) => (\r\n <DataTableFilterItem<TData>\r\n key={filter.filterId}\r\n filter={filter}\r\n index={index}\r\n filterItemId={`${id}-filter-${filter.filterId}`}\r\n joinOperator={joinOperator}\r\n setJoinOperator={setJoinOperator}\r\n columns={columns}\r\n onFilterUpdate={onFilterUpdate}\r\n onFilterRemove={onFilterRemove}\r\n />\r\n ))}\r\n </div>\r\n </SortableContent>\r\n ) : null}\r\n <div className=\"flex w-full items-center gap-2\">\r\n <Button\r\n size=\"sm\"\r\n className=\"rounded\"\r\n ref={addButtonRef}\r\n onClick={onFilterAdd}\r\n >\r\n Adicionar filtro\r\n </Button>\r\n {filters.length > 0 ? (\r\n <Button\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n className=\"rounded\"\r\n onClick={onFiltersReset}\r\n >\r\n Resetar filtros\r\n </Button>\r\n ) : null}\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n <SortableOverlay>\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"h-10 min-w-[72px] rounded-sm bg-primary/10\" />\r\n <div className=\"h-10 w-32 rounded-sm bg-primary/10\" />\r\n <div className=\"h-10 w-32 rounded-sm bg-primary/10\" />\r\n <div className=\"h-10 min-w-36 flex-1 rounded-sm bg-primary/10\" />\r\n <div className=\"size-8 shrink-0 rounded-sm bg-primary/10\" />\r\n <div className=\"size-8 shrink-0 rounded-sm bg-primary/10\" />\r\n </div>\r\n </SortableOverlay>\r\n </Sortable>\r\n )\r\n}\r\n\r\ninterface DataTableFilterItemProps<TData> {\r\n filter: ExtendedColumnFilter<TData>\r\n index: number\r\n filterItemId: string\r\n joinOperator: JoinOperator\r\n setJoinOperator: (value: JoinOperator) => void\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 index,\r\n filterItemId,\r\n joinOperator,\r\n setJoinOperator,\r\n columns,\r\n onFilterUpdate,\r\n onFilterRemove,\r\n}: DataTableFilterItemProps<TData>) {\r\n const [showFieldSelector, setShowFieldSelector] = React.useState(false)\r\n const [showOperatorSelector, setShowOperatorSelector] = 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 joinOperatorListboxId = `${filterItemId}-join-operator-listbox`\r\n const fieldListboxId = `${filterItemId}-field-listbox`\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 <SortableItem value={filter.filterId} asChild>\r\n <div\r\n role=\"listitem\"\r\n id={filterItemId}\r\n tabIndex={-1}\r\n className=\"flex items-center gap-2\"\r\n onKeyDown={onItemKeyDown}\r\n >\r\n <div className=\"min-w-[72px] text-center\">\r\n {index === 0 ? (\r\n <span className=\"text-gray-400 text-sm\">Onde</span>\r\n ) : index === 1 ? (\r\n <Select\r\n value={joinOperator}\r\n onValueChange={(value: JoinOperator) => setJoinOperator(value)}\r\n >\r\n <SelectTrigger\r\n aria-label=\"Select join operator\"\r\n aria-controls={joinOperatorListboxId}\r\n className=\"h-10 rounded lowercase [&[data-size]]:h-10\"\r\n >\r\n <SelectValue placeholder={joinOperator} />\r\n </SelectTrigger>\r\n <SelectContent\r\n id={joinOperatorListboxId}\r\n position=\"popper\"\r\n className=\"min-w-(--radix-select-trigger-width) lowercase\"\r\n >\r\n {dataTableConfig.joinOperators.map(joinOperator => (\r\n <SelectItem key={joinOperator} value={joinOperator}>\r\n {joinOperator}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n ) : (\r\n <span className=\"text-gray-400 text-sm\">{joinOperator}</span>\r\n )}\r\n </div>\r\n <Popover open={showFieldSelector} onOpenChange={setShowFieldSelector}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n role=\"combobox\"\r\n aria-controls={fieldListboxId}\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n className=\"w-32 justify-between rounded font-normal\"\r\n >\r\n <span className=\"truncate\">\r\n {columns.find(column => column.id === filter.id)?.columnDef.meta\r\n ?.label ?? 'Selecione o campo'}\r\n </span>\r\n <CaretUpDown className=\"opacity-50\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n id={fieldListboxId}\r\n align=\"start\"\r\n className=\"w-40 origin-[var(--radix-popover-content-transform-origin)] p-0\"\r\n >\r\n <Command>\r\n <CommandInput placeholder=\"Buscar campo...\" />\r\n <CommandList>\r\n <CommandEmpty>Nenhum campo encontrado.</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={value => {\r\n onFilterUpdate(filter.filterId, {\r\n id: value 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 <span className=\"truncate\">\r\n {column.columnDef.meta?.label}\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 w-32 rounded lowercase [&[data-size]]:h-10\"\r\n >\r\n <div className=\"truncate\">\r\n <SelectValue placeholder={filter.operator} />\r\n </div>\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 value={operator.value}\r\n className=\"lowercase\"\r\n >\r\n {operator.label}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"min-w-36 flex-1\">\r\n {onFilterInputRender({\r\n filter,\r\n inputId,\r\n column,\r\n columnMeta,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n })}\r\n </div>\r\n <Button\r\n aria-controls={filterItemId}\r\n variant=\"secondary\"\r\n size=\"icon\"\r\n className=\"size-8 rounded\"\r\n onClick={() => onFilterRemove(filter.filterId)}\r\n >\r\n <Trash weight=\"bold\" />\r\n </Button>\r\n <SortableItemHandle asChild>\r\n <Button variant=\"secondary\" size=\"icon\" className=\"size-8 rounded\">\r\n <DotsSixVertical weight=\"bold\" />\r\n </Button>\r\n </SortableItemHandle>\r\n </div>\r\n </SortableItem>\r\n )\r\n}\r\n\r\nfunction onFilterInputRender<TData>({\r\n filter,\r\n inputId,\r\n column,\r\n columnMeta,\r\n onFilterUpdate,\r\n showValueSelector,\r\n setShowValueSelector,\r\n}: {\r\n filter: ExtendedColumnFilter<TData>\r\n inputId: string\r\n column: Column<TData>\r\n columnMeta?: ColumnMeta<TData, unknown>\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={`${columnMeta?.label} filter is ${\r\n filter.operator === 'isEmpty' ? 'empty' : 'not empty'\r\n }`}\r\n aria-live=\"polite\"\r\n className=\"h-10 w-full rounded border bg-transparent 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 />\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' : filter.variant}\r\n aria-label={`${columnMeta?.label} filter value`}\r\n aria-describedby={`${inputId}-description`}\r\n inputMode={isNumber ? 'numeric' : undefined}\r\n placeholder={columnMeta?.placeholder ?? 'Enter a value...'}\r\n className=\"h-10 w-full rounded\"\r\n defaultValue={\r\n typeof filter.value === 'string' ? filter.value : undefined\r\n }\r\n onChange={event =>\r\n onFilterUpdate(filter.filterId, {\r\n value: event.target.value,\r\n })\r\n }\r\n />\r\n )\r\n }\r\n\r\n case 'boolean': {\r\n if (Array.isArray(filter.value)) return null\r\n\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={filter.value}\r\n onValueChange={value =>\r\n onFilterUpdate(filter.filterId, {\r\n value,\r\n })\r\n }\r\n >\r\n <SelectTrigger\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n aria-label={`${columnMeta?.label} boolean filter`}\r\n className=\"h-10 w-full rounded [&[data-size]]:h-10\"\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 multiple = filter.variant === 'multiSelect'\r\n const selectedValues = multiple\r\n ? Array.isArray(filter.value)\r\n ? filter.value\r\n : []\r\n : typeof filter.value === 'string'\r\n ? filter.value\r\n : undefined\r\n\r\n return (\r\n <Faceted\r\n open={showValueSelector}\r\n onOpenChange={setShowValueSelector}\r\n value={selectedValues}\r\n onValueChange={value => {\r\n onFilterUpdate(filter.filterId, {\r\n value,\r\n })\r\n }}\r\n multiple={multiple}\r\n >\r\n <FacetedTrigger asChild>\r\n <Button\r\n id={inputId}\r\n aria-controls={inputListboxId}\r\n aria-label={`${columnMeta?.label} filter value${multiple ? 's' : ''}`}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"w-full rounded font-normal\"\r\n >\r\n <FacetedBadgeList\r\n options={columnMeta?.options}\r\n placeholder={\r\n columnMeta?.placeholder ??\r\n `Select option${multiple ? 's' : ''}...`\r\n }\r\n />\r\n </Button>\r\n </FacetedTrigger>\r\n <FacetedContent\r\n id={inputListboxId}\r\n className=\"w-[200px] origin-[var(--radix-popover-content-transform-origin)]\"\r\n >\r\n <FacetedInput\r\n aria-label={`Search ${columnMeta?.label} options`}\r\n placeholder={columnMeta?.placeholder ?? 'Search options...'}\r\n />\r\n <FacetedList>\r\n <FacetedEmpty>No options found.</FacetedEmpty>\r\n <FacetedGroup>\r\n {columnMeta?.options?.map(option => (\r\n <FacetedItem key={option.value} value={option.value}>\r\n {option.icon && <option.icon />}\r\n <span>{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 </FacetedItem>\r\n ))}\r\n </FacetedGroup>\r\n </FacetedList>\r\n </FacetedContent>\r\n </Faceted>\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 : 'Escolha uma data'\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 aria-label={`${columnMeta?.label} date filter`}\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n className={cn(\r\n 'w-full justify-start rounded text-left font-normal',\r\n !filter.value && 'text-gray-400'\r\n )}\r\n >\r\n <CalendarBlank weight=\"bold\" />\r\n <span className=\"truncate text-sm\">{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 aria-label={`Select ${columnMeta?.label} date range`}\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 aria-label={`Select ${columnMeta?.label} date`}\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","DataTableFilterList","table","debounceMs","throttleMs","shallow","props","id","React","labelId","descriptionId","open","setOpen","addButtonRef","columns","column","filters","setFilters","useQueryState","getFiltersStateParser","field","debouncedSetFilters","useDebouncedCallback","joinOperator","setJoinOperator","parseAsStringEnum","onFilterAdd","getDefaultFilterOperator","generateId","onFilterUpdate","filterId","updates","prevFilters","filter","onFilterRemove","requestAnimationFrame","onFiltersReset","onKeyDown","event","HTMLInputElement","HTMLTextAreaElement","window","onTriggerKeyDown","Sortable","item","Popover","PopoverTrigger","Button","FunnelSimple","Badge","PopoverContent","cn","SortableContent","index","DataTableFilterItem","SortableOverlay","filterItemId","showFieldSelector","setShowFieldSelector","showOperatorSelector","setShowOperatorSelector","showValueSelector","setShowValueSelector","joinOperatorListboxId","fieldListboxId","operatorListboxId","inputId","columnMeta","filterOperators","getFilterOperators","onItemKeyDown","SortableItem","Select","value","SelectTrigger","SelectValue","SelectContent","dataTableConfig","SelectItem","CaretUpDown","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","Check","operator","onFilterInputRender","DataTableRangeFilter","isNumber","Input","undefined","Array","inputListboxId","multiple","selectedValues","Faceted","FacetedTrigger","FacetedBadgeList","FacetedContent","FacetedInput","FacetedList","FacetedEmpty","FacetedGroup","option","FacetedItem","dateValue","Boolean","displayValue","formatDate","Date","Number","CalendarBlank","Calendar","date","Trash","SortableItemHandle","DotsSixVertical"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
import*as e from"react/jsx-runtime";import*as t from"@phosphor-icons/react";import*as a from"nuqs";import*as n from"react";import*as l from"../button.js";import*as r from"../calendar.js";import*as o from"../command.js";import*as s from"./data-table-range-filter.js";import*as i from"../input.js";import*as c from"../popover.js";import*as m from"../select.js";import*as d from"../../hooks/use-debounced-callback.js";import*as u from"../../lib/data-table.js";import*as p from"../../lib/format.js";import*as f from"../../lib/id.js";import*as x from"../../lib/parsers.js";import*as h from"../../lib/utils.js";let v=["backspace","delete"];function g({table:r,debounceMs:s=300,throttleMs:i=50,shallow:m=!0,align:p="start",...g}){let C=n.useId(),D=n.useMemo(()=>r.getAllColumns().filter(e=>e.columnDef.enableColumnFilter),[r]),[N,S]=n.useState(!1),[w,y]=n.useState(null),[I,k]=n.useState(""),F=n.useRef(null),T=n.useRef(null),E=n.useCallback(e=>{S(e),e||setTimeout(()=>{y(null),k("")},100)},[]),L=n.useCallback(e=>{v.includes(e.key.toLowerCase())&&!I&&w&&(e.preventDefault(),y(null))},[I,w]),[P,z]=(0,a.useQueryState)("filters",(0,x.getFiltersStateParser)(D.map(e=>e.id)).withDefault([]).withOptions({clearOnDefault:!0,shallow:m,throttleMs:i})),B=(0,d.useDebouncedCallback)(z,s),O=n.useCallback((e,t)=>{if(!t.trim()&&e.columnDef.meta?.variant!=="boolean")return;let a=e.columnDef.meta?.variant==="multiSelect"?[t]:t;B([...P,{id:e.id,value:a,variant:e.columnDef.meta?.variant??"text",operator:(0,u.getDefaultFilterOperator)(e.columnDef.meta?.variant??"text"),filterId:(0,f.generateId)({length:8})}]),S(!1),setTimeout(()=>{y(null),k("")},100)},[P,B]),$=n.useCallback(e=>{B(P.filter(t=>t.filterId!==e)),requestAnimationFrame(()=>{F.current?.focus()})},[P,B]),A=n.useCallback((e,t)=>{B(a=>a.map(a=>a.filterId===e?{...a,...t}:a))},[B]),K=n.useCallback(()=>{B([])},[B]);n.useEffect(()=>{function e(e){!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)&&("f"!==e.key.toLowerCase()||e.ctrlKey||e.metaKey||e.shiftKey||(e.preventDefault(),S(!0)),"f"===e.key.toLowerCase()&&e.shiftKey&&!N&&P.length>0&&(e.preventDefault(),$(P[P.length-1]?.filterId??"")))}return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[N,P,$]);let M=n.useCallback(e=>{v.includes(e.key.toLowerCase())&&P.length>0&&(e.preventDefault(),$(P[P.length-1]?.filterId??""))},[P,$]);return(0,e.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[P.map(t=>(0,e.jsx)(j,{filter:t,filterItemId:`${C}-filter-${t.filterId}`,columns:D,onFilterUpdate:A,onFilterRemove:$},t.filterId)),P.length>0&&(0,e.jsx)(l.Button,{"aria-label":"Reset all filters",variant:"outline",size:"icon",className:"size-8",onClick:K,children:(0,e.jsx)(t.X,{})}),(0,e.jsxs)(c.Popover,{open:N,onOpenChange:E,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsxs)(l.Button,{"aria-label":"Open filter command menu",variant:"outline",size:P.length>0?"icon":"sm",className:(0,h.cn)(P.length>0&&"size-8","h-8"),ref:F,onKeyDown:M,children:[(0,e.jsx)(t.FunnelSimple,{}),P.length>0?null:"Filter"]})}),(0,e.jsx)(c.PopoverContent,{align:p,className:"w-full max-w-[var(--radix-popover-content-available-width)] origin-[var(--radix-popover-content-transform-origin)] p-0",...g,children:(0,e.jsxs)(o.Command,{loop:!0,className:"[&_[cmdk-input-wrapper]_svg]:hidden",children:[(0,e.jsx)(o.CommandInput,{ref:T,placeholder:w?w.columnDef.meta?.label??w.id:"Search fields...",value:I,onValueChange:k,onKeyDown:L}),(0,e.jsx)(o.CommandList,{children:w?(0,e.jsxs)(e.Fragment,{children:[w.columnDef.meta?.options&&(0,e.jsx)(o.CommandEmpty,{children:"No options found."}),(0,e.jsx)(b,{column:w,value:I,onSelect:e=>O(w,e)})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(o.CommandEmpty,{children:"No fields found."}),(0,e.jsx)(o.CommandGroup,{children:D.map(t=>(0,e.jsxs)(o.CommandItem,{value:t.id,onSelect:()=>{y(t),k(""),requestAnimationFrame(()=>{T.current?.focus()})},children:[t.columnDef.meta?.icon&&(0,e.jsx)(t.columnDef.meta.icon,{}),(0,e.jsx)("span",{className:"truncate",children:t.columnDef.meta?.label??t.id})]},t.id))})]})})]})})]})]})}function j({filter:a,filterItemId:d,columns:f,onFilterUpdate:x,onFilterRemove:g}){{let[j,b]=n.useState(!1),[C,D]=n.useState(!1),[N,S]=n.useState(!1),w=f.find(e=>e.id===a.id);if(!w)return null;let y=`${d}-operator-listbox`,I=`${d}-input`,k=w.columnDef.meta,F=(0,u.getFilterOperators)(a.variant),T=n.useCallback(e=>{!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)&&(j||C||N||v.includes(e.key.toLowerCase())&&(e.preventDefault(),g(a.filterId)))},[a.filterId,j,C,N,g]);return(0,e.jsxs)("div",{role:"listitem",id:d,className:"flex h-8 items-center rounded-md bg-background",onKeyDown:T,children:[(0,e.jsxs)(c.Popover,{open:j,onOpenChange:b,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsxs)(l.Button,{variant:"ghost",size:"sm",className:"rounded-none rounded-l-md border border-r-0 font-normal dark:bg-input/30",children:[k?.icon&&(0,e.jsx)(k.icon,{className:"text-muted-foreground"}),k?.label??w.id]})}),(0,e.jsx)(c.PopoverContent,{align:"start",className:"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0",children:(0,e.jsxs)(o.Command,{loop:!0,children:[(0,e.jsx)(o.CommandInput,{placeholder:"Search fields..."}),(0,e.jsxs)(o.CommandList,{children:[(0,e.jsx)(o.CommandEmpty,{children:"No fields found."}),(0,e.jsx)(o.CommandGroup,{children:f.map(n=>(0,e.jsxs)(o.CommandItem,{value:n.id,onSelect:()=>{x(a.filterId,{id:n.id,variant:n.columnDef.meta?.variant??"text",operator:(0,u.getDefaultFilterOperator)(n.columnDef.meta?.variant??"text"),value:""}),b(!1)},children:[n.columnDef.meta?.icon&&(0,e.jsx)(n.columnDef.meta.icon,{}),(0,e.jsx)("span",{className:"truncate",children:n.columnDef.meta?.label??n.id}),(0,e.jsx)(t.Check,{className:(0,h.cn)("ml-auto",n.id===a.id?"opacity-100":"opacity-0")})]},n.id))})]})]})})]}),(0,e.jsxs)(m.Select,{open:C,onOpenChange:D,value:a.operator,onValueChange:e=>x(a.filterId,{operator:e,value:"isEmpty"===e||"isNotEmpty"===e?"":a.value}),children:[(0,e.jsx)(m.SelectTrigger,{"aria-controls":y,className:"h-8 rounded-none border-r-0 px-2.5 lowercase [&[data-size]]:h-8 [&_svg]:hidden",children:(0,e.jsx)(m.SelectValue,{placeholder:a.operator})}),(0,e.jsx)(m.SelectContent,{id:y,className:"origin-[var(--radix-select-content-transform-origin)]",children:F.map(t=>(0,e.jsx)(m.SelectItem,{className:"lowercase",value:t.value,children:t.label},t.value))})]}),function({filter:a,column:n,inputId:d,onFilterUpdate:u,showValueSelector:f,setShowValueSelector:x}){if("isEmpty"===a.operator||"isNotEmpty"===a.operator)return(0,e.jsx)("div",{id:d,role:"status","aria-label":`${n.columnDef.meta?.label} filter is ${"isEmpty"===a.operator?"empty":"not empty"}`,"aria-live":"polite",className:"h-full w-16 rounded-none border bg-transparent px-1.5 py-0.5 text-muted-foreground dark:bg-input/30"});switch(a.variant){case"text":case"number":case"range":{if("range"===a.variant&&"isBetween"===a.operator||"isBetween"===a.operator)return(0,e.jsx)(s.DataTableRangeFilter,{filter:a,column:n,inputId:d,onFilterUpdate:u,className:"size-full max-w-28 gap-0 [&_[data-slot='range-min']]:border-r-0 [&_input]:rounded-none [&_input]:px-1.5"});let t="number"===a.variant||"range"===a.variant;return(0,e.jsx)(i.Input,{id:d,type:t?"number":"text",inputMode:t?"numeric":void 0,placeholder:n.columnDef.meta?.placeholder??"Enter value...",className:"h-full w-24 rounded-none px-1.5",defaultValue:"string"==typeof a.value?a.value:"",onChange:e=>u(a.filterId,{value:e.target.value})})}case"boolean":{let t=`${d}-listbox`;return(0,e.jsxs)(m.Select,{open:f,onOpenChange:x,value:"string"==typeof a.value?a.value:"true",onValueChange:e=>u(a.filterId,{value:e}),children:[(0,e.jsx)(m.SelectTrigger,{id:d,"aria-controls":t,className:"rounded-none bg-transparent px-1.5 py-0.5 [&_svg]:hidden",children:(0,e.jsx)(m.SelectValue,{placeholder:a.value?"True":"False"})}),(0,e.jsxs)(m.SelectContent,{id:t,children:[(0,e.jsx)(m.SelectItem,{value:"true",children:"True"}),(0,e.jsx)(m.SelectItem,{value:"false",children:"False"})]})]})}case"select":case"multiSelect":{let r=`${d}-listbox`,s=n.columnDef.meta?.options??[],i=Array.isArray(a.value)?a.value:[a.value],m=s.filter(e=>i.includes(e.value));return(0,e.jsxs)(c.Popover,{open:f,onOpenChange:x,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsx)(l.Button,{id:d,"aria-controls":r,variant:"ghost",size:"sm",className:"h-full min-w-16 rounded-none border px-1.5 font-normal dark:bg-input/30",children:0===m.length?"multiSelect"===a.variant?"Select options...":"Select option...":(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("div",{className:"-space-x-2 flex items-center rtl:space-x-reverse",children:m.map(t=>t.icon?(0,e.jsx)("div",{className:"rounded-full border bg-background p-0.5",children:(0,e.jsx)(t.icon,{className:"size-3.5"})},t.value):null)}),(0,e.jsx)("span",{className:"truncate",children:m.length>1?`${m.length} selected`:m[0]?.label})]})})}),(0,e.jsx)(c.PopoverContent,{id:r,align:"start",className:"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0",children:(0,e.jsxs)(o.Command,{children:[(0,e.jsx)(o.CommandInput,{placeholder:"Search options..."}),(0,e.jsxs)(o.CommandList,{children:[(0,e.jsx)(o.CommandEmpty,{children:"No options found."}),(0,e.jsx)(o.CommandGroup,{children:s.map(n=>(0,e.jsxs)(o.CommandItem,{value:n.value,onSelect:()=>{let e="multiSelect"===a.variant?i.includes(n.value)?i.filter(e=>e!==n.value):[...i,n.value]:n.value;u(a.filterId,{value:e})},children:[n.icon&&(0,e.jsx)(n.icon,{}),(0,e.jsx)("span",{className:"truncate",children:n.label}),"multiSelect"===a.variant&&(0,e.jsx)(t.Check,{className:(0,h.cn)("ml-auto",i.includes(n.value)?"opacity-100":"opacity-0")})]},n.value))})]})]})})]})}case"date":case"dateRange":{let n=`${d}-listbox`,o=Array.isArray(a.value)?a.value.filter(Boolean):[a.value,a.value].filter(Boolean),s="isBetween"===a.operator&&2===o.length?`${(0,p.formatDate)(new Date(Number(o[0])))} - ${(0,p.formatDate)(new Date(Number(o[1])))}`:o[0]?(0,p.formatDate)(new Date(Number(o[0]))):"Pick date...";return(0,e.jsxs)(c.Popover,{open:f,onOpenChange:x,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsxs)(l.Button,{id:d,"aria-controls":n,variant:"ghost",size:"sm",className:(0,h.cn)("h-full rounded-none border px-1.5 font-normal dark:bg-input/30",!a.value&&"text-muted-foreground"),children:[(0,e.jsx)(t.Calendar,{className:"size-3.5"}),(0,e.jsx)("span",{className:"truncate",children:s})]})}),(0,e.jsx)(c.PopoverContent,{id:n,align:"start",className:"w-auto origin-[var(--radix-popover-content-transform-origin)] p-0",children:"isBetween"===a.operator?(0,e.jsx)(r.Calendar,{mode:"range",initialFocus:!0,selected:2===o.length?{from:new Date(Number(o[0])),to:new Date(Number(o[1]))}:{from:new Date,to:new Date},onSelect:e=>{u(a.filterId,{value:e?[(e.from?.getTime()??"").toString(),(e.to?.getTime()??"").toString()]:[]})}}):(0,e.jsx)(r.Calendar,{mode:"single",initialFocus:!0,selected:o[0]?new Date(Number(o[0])):void 0,onSelect:e=>{u(a.filterId,{value:(e?.getTime()??"").toString()})}})})]})}default:return null}}({filter:a,column:w,inputId:I,onFilterUpdate:x,showValueSelector:N,setShowValueSelector:S}),(0,e.jsx)(l.Button,{"aria-controls":d,variant:"ghost",size:"sm",className:"h-full rounded-none rounded-r-md border border-l-0 px-1.5 font-normal dark:bg-input/30",onClick:()=>g(a.filterId),children:(0,e.jsx)(t.X,{className:"size-3.5"})})]},a.filterId)}}function b({column:a,value:n,onSelect:l}){switch(a.columnDef.meta?.variant??"text"){case"boolean":return(0,e.jsxs)(o.CommandGroup,{children:[(0,e.jsx)(o.CommandItem,{value:"true",onSelect:()=>l("true"),children:"True"}),(0,e.jsx)(o.CommandItem,{value:"false",onSelect:()=>l("false"),children:"False"})]});case"select":case"multiSelect":return(0,e.jsx)(o.CommandGroup,{children:a.columnDef.meta?.options?.map(t=>(0,e.jsxs)(o.CommandItem,{value:t.value,onSelect:()=>l(t.value),children:[t.icon&&(0,e.jsx)(t.icon,{}),(0,e.jsx)("span",{className:"truncate",children:t.label}),t.count&&(0,e.jsx)("span",{className:"ml-auto font-mono text-xs",children:t.count})]},t.value))});case"date":case"dateRange":return(0,e.jsx)(r.Calendar,{initialFocus:!0,mode:"single",selected:n?new Date(n):void 0,onSelect:e=>l(e?.getTime().toString()??"")});default:{let a=!n.trim();return(0,e.jsx)(o.CommandGroup,{children:(0,e.jsx)(o.CommandItem,{value:n,onSelect:()=>l(n),disabled:a,children:a?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(t.TextAlignLeft,{}),(0,e.jsx)("span",{children:"Type to add filter..."})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(t.SealCheck,{}),(0,e.jsxs)("span",{className:"truncate",children:['Filter by "',n,'"']})]})})})}}}export{g as DataTableFilterMenu};
|
|
2
|
+
import*as e from"react/jsx-runtime";import*as t from"@phosphor-icons/react";import*as a from"nuqs";import*as n from"react";import*as l from"../button.js";import*as r from"../calendar.js";import*as o from"../command.js";import*as s from"./data-table-range-filter.js";import*as i from"../input.js";import*as c from"../popover.js";import*as m from"../select.js";import*as d from"../../hooks/use-debounced-callback.js";import*as u from"../../lib/data-table.js";import*as p from"../../lib/format.js";import*as f from"../../lib/id.js";import*as x from"../../lib/parsers.js";import*as h from"../../lib/utils.js";let v=["backspace","delete"];function g({table:r,debounceMs:s=300,throttleMs:i=50,shallow:m=!0,align:p="start",...g}){let C=n.useId(),D=n.useMemo(()=>r.getAllColumns().filter(e=>e.columnDef.enableColumnFilter),[r]),[N,S]=n.useState(!1),[w,y]=n.useState(null),[I,k]=n.useState(""),F=n.useRef(null),T=n.useRef(null),E=n.useCallback(e=>{S(e),e||setTimeout(()=>{y(null),k("")},100)},[]),L=n.useCallback(e=>{v.includes(e.key.toLowerCase())&&!I&&w&&(e.preventDefault(),y(null))},[I,w]),[P,z]=(0,a.useQueryState)("filters",(0,x.getFiltersStateParser)(D.map(e=>e.id)).withDefault([]).withOptions({clearOnDefault:!0,shallow:m,throttleMs:i})),B=(0,d.useDebouncedCallback)(z,s),O=n.useCallback((e,t)=>{if(!t.trim()&&e.columnDef.meta?.variant!=="boolean")return;let a=e.columnDef.meta?.variant==="multiSelect"?[t]:t;B([...P,{id:e.id,value:a,variant:e.columnDef.meta?.variant??"text",operator:(0,u.getDefaultFilterOperator)(e.columnDef.meta?.variant??"text"),filterId:(0,f.generateId)({length:8})}]),S(!1),setTimeout(()=>{y(null),k("")},100)},[P,B]),$=n.useCallback(e=>{B(P.filter(t=>t.filterId!==e)),requestAnimationFrame(()=>{F.current?.focus()})},[P,B]),A=n.useCallback((e,t)=>{B(a=>a.map(a=>a.filterId===e?{...a,...t}:a))},[B]),K=n.useCallback(()=>{B([])},[B]);n.useEffect(()=>{function e(e){!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)&&("f"!==e.key.toLowerCase()||e.ctrlKey||e.metaKey||e.shiftKey||(e.preventDefault(),S(!0)),"f"===e.key.toLowerCase()&&e.shiftKey&&!N&&P.length>0&&(e.preventDefault(),$(P[P.length-1]?.filterId??"")))}return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[N,P,$]);let M=n.useCallback(e=>{v.includes(e.key.toLowerCase())&&P.length>0&&(e.preventDefault(),$(P[P.length-1]?.filterId??""))},[P,$]);return(0,e.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[P.map(t=>(0,e.jsx)(j,{filter:t,filterItemId:`${C}-filter-${t.filterId}`,columns:D,onFilterUpdate:A,onFilterRemove:$},t.filterId)),P.length>0&&(0,e.jsx)(l.Button,{"aria-label":"Reset all filters",variant:"outline",size:"icon",className:"size-8",onClick:K,children:(0,e.jsx)(t.X,{})}),(0,e.jsxs)(c.Popover,{open:N,onOpenChange:E,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsxs)(l.Button,{"aria-label":"Open filter command menu",variant:"outline",size:P.length>0?"icon":"sm",className:(0,h.cn)(P.length>0&&"size-8","h-10"),ref:F,onKeyDown:M,children:[(0,e.jsx)(t.FunnelSimple,{}),P.length>0?null:"Filter"]})}),(0,e.jsx)(c.PopoverContent,{align:p,className:"w-full max-w-[var(--radix-popover-content-available-width)] origin-[var(--radix-popover-content-transform-origin)] p-0",...g,children:(0,e.jsxs)(o.Command,{loop:!0,className:"[&_[cmdk-input-wrapper]_svg]:hidden",children:[(0,e.jsx)(o.CommandInput,{ref:T,placeholder:w?w.columnDef.meta?.label??w.id:"Search fields...",value:I,onValueChange:k,onKeyDown:L}),(0,e.jsx)(o.CommandList,{children:w?(0,e.jsxs)(e.Fragment,{children:[w.columnDef.meta?.options&&(0,e.jsx)(o.CommandEmpty,{children:"No options found."}),(0,e.jsx)(b,{column:w,value:I,onSelect:e=>O(w,e)})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(o.CommandEmpty,{children:"No fields found."}),(0,e.jsx)(o.CommandGroup,{children:D.map(t=>(0,e.jsxs)(o.CommandItem,{value:t.id,onSelect:()=>{y(t),k(""),requestAnimationFrame(()=>{T.current?.focus()})},children:[t.columnDef.meta?.icon&&(0,e.jsx)(t.columnDef.meta.icon,{}),(0,e.jsx)("span",{className:"truncate",children:t.columnDef.meta?.label??t.id})]},t.id))})]})})]})})]})]})}function j({filter:a,filterItemId:d,columns:f,onFilterUpdate:x,onFilterRemove:g}){{let[j,b]=n.useState(!1),[C,D]=n.useState(!1),[N,S]=n.useState(!1),w=f.find(e=>e.id===a.id);if(!w)return null;let y=`${d}-operator-listbox`,I=`${d}-input`,k=w.columnDef.meta,F=(0,u.getFilterOperators)(a.variant),T=n.useCallback(e=>{!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)&&(j||C||N||v.includes(e.key.toLowerCase())&&(e.preventDefault(),g(a.filterId)))},[a.filterId,j,C,N,g]);return(0,e.jsxs)("div",{role:"listitem",id:d,className:"flex h-10 items-center rounded-md bg-background",onKeyDown:T,children:[(0,e.jsxs)(c.Popover,{open:j,onOpenChange:b,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsxs)(l.Button,{variant:"ghost",size:"sm",className:"rounded-none rounded-l-md border border-r-0 font-normal dark:bg-input/30",children:[k?.icon&&(0,e.jsx)(k.icon,{className:"text-muted-foreground"}),k?.label??w.id]})}),(0,e.jsx)(c.PopoverContent,{align:"start",className:"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0",children:(0,e.jsxs)(o.Command,{loop:!0,children:[(0,e.jsx)(o.CommandInput,{placeholder:"Search fields..."}),(0,e.jsxs)(o.CommandList,{children:[(0,e.jsx)(o.CommandEmpty,{children:"No fields found."}),(0,e.jsx)(o.CommandGroup,{children:f.map(n=>(0,e.jsxs)(o.CommandItem,{value:n.id,onSelect:()=>{x(a.filterId,{id:n.id,variant:n.columnDef.meta?.variant??"text",operator:(0,u.getDefaultFilterOperator)(n.columnDef.meta?.variant??"text"),value:""}),b(!1)},children:[n.columnDef.meta?.icon&&(0,e.jsx)(n.columnDef.meta.icon,{}),(0,e.jsx)("span",{className:"truncate",children:n.columnDef.meta?.label??n.id}),(0,e.jsx)(t.Check,{className:(0,h.cn)("ml-auto",n.id===a.id?"opacity-100":"opacity-0")})]},n.id))})]})]})})]}),(0,e.jsxs)(m.Select,{open:C,onOpenChange:D,value:a.operator,onValueChange:e=>x(a.filterId,{operator:e,value:"isEmpty"===e||"isNotEmpty"===e?"":a.value}),children:[(0,e.jsx)(m.SelectTrigger,{"aria-controls":y,className:"h-10 rounded-none border-r-0 px-2.5 lowercase [&[data-size]]:h-10 [&_svg]:hidden",children:(0,e.jsx)(m.SelectValue,{placeholder:a.operator})}),(0,e.jsx)(m.SelectContent,{id:y,className:"origin-[var(--radix-select-content-transform-origin)]",children:F.map(t=>(0,e.jsx)(m.SelectItem,{className:"lowercase",value:t.value,children:t.label},t.value))})]}),function({filter:a,column:n,inputId:d,onFilterUpdate:u,showValueSelector:f,setShowValueSelector:x}){if("isEmpty"===a.operator||"isNotEmpty"===a.operator)return(0,e.jsx)("div",{id:d,role:"status","aria-label":`${n.columnDef.meta?.label} filter is ${"isEmpty"===a.operator?"empty":"not empty"}`,"aria-live":"polite",className:"h-full w-16 rounded-none border bg-transparent px-1.5 py-0.5 text-muted-foreground dark:bg-input/30"});switch(a.variant){case"text":case"number":case"range":{if("range"===a.variant&&"isBetween"===a.operator||"isBetween"===a.operator)return(0,e.jsx)(s.DataTableRangeFilter,{filter:a,column:n,inputId:d,onFilterUpdate:u,className:"size-full max-w-28 gap-0 [&_[data-slot='range-min']]:border-r-0 [&_input]:rounded-none [&_input]:px-1.5"});let t="number"===a.variant||"range"===a.variant;return(0,e.jsx)(i.Input,{id:d,type:t?"number":"text",inputMode:t?"numeric":void 0,placeholder:n.columnDef.meta?.placeholder??"Enter value...",className:"h-full w-24 rounded-none px-1.5",defaultValue:"string"==typeof a.value?a.value:"",onChange:e=>u(a.filterId,{value:e.target.value})})}case"boolean":{let t=`${d}-listbox`;return(0,e.jsxs)(m.Select,{open:f,onOpenChange:x,value:"string"==typeof a.value?a.value:"true",onValueChange:e=>u(a.filterId,{value:e}),children:[(0,e.jsx)(m.SelectTrigger,{id:d,"aria-controls":t,className:"rounded-none bg-transparent px-1.5 py-0.5 [&_svg]:hidden",children:(0,e.jsx)(m.SelectValue,{placeholder:a.value?"True":"False"})}),(0,e.jsxs)(m.SelectContent,{id:t,children:[(0,e.jsx)(m.SelectItem,{value:"true",children:"True"}),(0,e.jsx)(m.SelectItem,{value:"false",children:"False"})]})]})}case"select":case"multiSelect":{let r=`${d}-listbox`,s=n.columnDef.meta?.options??[],i=Array.isArray(a.value)?a.value:[a.value],m=s.filter(e=>i.includes(e.value));return(0,e.jsxs)(c.Popover,{open:f,onOpenChange:x,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsx)(l.Button,{id:d,"aria-controls":r,variant:"ghost",size:"sm",className:"h-full min-w-16 rounded-none border px-1.5 font-normal dark:bg-input/30",children:0===m.length?"multiSelect"===a.variant?"Select options...":"Select option...":(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("div",{className:"-space-x-2 flex items-center rtl:space-x-reverse",children:m.map(t=>t.icon?(0,e.jsx)("div",{className:"rounded-full border bg-background p-0.5",children:(0,e.jsx)(t.icon,{className:"size-3.5"})},t.value):null)}),(0,e.jsx)("span",{className:"truncate",children:m.length>1?`${m.length} selected`:m[0]?.label})]})})}),(0,e.jsx)(c.PopoverContent,{id:r,align:"start",className:"w-48 origin-[var(--radix-popover-content-transform-origin)] p-0",children:(0,e.jsxs)(o.Command,{children:[(0,e.jsx)(o.CommandInput,{placeholder:"Search options..."}),(0,e.jsxs)(o.CommandList,{children:[(0,e.jsx)(o.CommandEmpty,{children:"No options found."}),(0,e.jsx)(o.CommandGroup,{children:s.map(n=>(0,e.jsxs)(o.CommandItem,{value:n.value,onSelect:()=>{let e="multiSelect"===a.variant?i.includes(n.value)?i.filter(e=>e!==n.value):[...i,n.value]:n.value;u(a.filterId,{value:e})},children:[n.icon&&(0,e.jsx)(n.icon,{}),(0,e.jsx)("span",{className:"truncate",children:n.label}),"multiSelect"===a.variant&&(0,e.jsx)(t.Check,{className:(0,h.cn)("ml-auto",i.includes(n.value)?"opacity-100":"opacity-0")})]},n.value))})]})]})})]})}case"date":case"dateRange":{let n=`${d}-listbox`,o=Array.isArray(a.value)?a.value.filter(Boolean):[a.value,a.value].filter(Boolean),s="isBetween"===a.operator&&2===o.length?`${(0,p.formatDate)(new Date(Number(o[0])))} - ${(0,p.formatDate)(new Date(Number(o[1])))}`:o[0]?(0,p.formatDate)(new Date(Number(o[0]))):"Pick date...";return(0,e.jsxs)(c.Popover,{open:f,onOpenChange:x,children:[(0,e.jsx)(c.PopoverTrigger,{asChild:!0,children:(0,e.jsxs)(l.Button,{id:d,"aria-controls":n,variant:"ghost",size:"sm",className:(0,h.cn)("h-full rounded-none border px-1.5 font-normal dark:bg-input/30",!a.value&&"text-muted-foreground"),children:[(0,e.jsx)(t.Calendar,{className:"size-3.5"}),(0,e.jsx)("span",{className:"truncate",children:s})]})}),(0,e.jsx)(c.PopoverContent,{id:n,align:"start",className:"w-auto origin-[var(--radix-popover-content-transform-origin)] p-0",children:"isBetween"===a.operator?(0,e.jsx)(r.Calendar,{mode:"range",initialFocus:!0,selected:2===o.length?{from:new Date(Number(o[0])),to:new Date(Number(o[1]))}:{from:new Date,to:new Date},onSelect:e=>{u(a.filterId,{value:e?[(e.from?.getTime()??"").toString(),(e.to?.getTime()??"").toString()]:[]})}}):(0,e.jsx)(r.Calendar,{mode:"single",initialFocus:!0,selected:o[0]?new Date(Number(o[0])):void 0,onSelect:e=>{u(a.filterId,{value:(e?.getTime()??"").toString()})}})})]})}default:return null}}({filter:a,column:w,inputId:I,onFilterUpdate:x,showValueSelector:N,setShowValueSelector:S}),(0,e.jsx)(l.Button,{"aria-controls":d,variant:"ghost",size:"sm",className:"h-full rounded-none rounded-r-md border border-l-0 px-1.5 font-normal dark:bg-input/30",onClick:()=>g(a.filterId),children:(0,e.jsx)(t.X,{className:"size-3.5"})})]},a.filterId)}}function b({column:a,value:n,onSelect:l}){switch(a.columnDef.meta?.variant??"text"){case"boolean":return(0,e.jsxs)(o.CommandGroup,{children:[(0,e.jsx)(o.CommandItem,{value:"true",onSelect:()=>l("true"),children:"True"}),(0,e.jsx)(o.CommandItem,{value:"false",onSelect:()=>l("false"),children:"False"})]});case"select":case"multiSelect":return(0,e.jsx)(o.CommandGroup,{children:a.columnDef.meta?.options?.map(t=>(0,e.jsxs)(o.CommandItem,{value:t.value,onSelect:()=>l(t.value),children:[t.icon&&(0,e.jsx)(t.icon,{}),(0,e.jsx)("span",{className:"truncate",children:t.label}),t.count&&(0,e.jsx)("span",{className:"ml-auto font-mono text-xs",children:t.count})]},t.value))});case"date":case"dateRange":return(0,e.jsx)(r.Calendar,{initialFocus:!0,mode:"single",selected:n?new Date(n):void 0,onSelect:e=>l(e?.getTime().toString()??"")});default:{let a=!n.trim();return(0,e.jsx)(o.CommandGroup,{children:(0,e.jsx)(o.CommandItem,{value:n,onSelect:()=>l(n),disabled:a,children:a?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(t.TextAlignLeft,{}),(0,e.jsx)("span",{children:"Type to add filter..."})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(t.SealCheck,{}),(0,e.jsxs)("span",{className:"truncate",children:['Filter by "',n,'"']})]})})})}}}export{g as DataTableFilterMenu};
|
|
3
3
|
//# sourceMappingURL=data-table-filter-menu.js.map
|
|
@@ -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-8')}\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-8 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-8 rounded-none border-r-0 px-2.5 lowercase [&[data-size]]:h-8 [&_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","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,2 +1,2 @@
|
|
|
1
|
-
import*as e from"react/jsx-runtime";import*as
|
|
1
|
+
import*as e from"react/jsx-runtime";import*as a from"@phosphor-icons/react";import*as s from"../button.js";import*as t from"../select.js";import*as i from"../../lib/utils.js";function l({table:l,pageSizeOptions:n=[10,20,30,40,50],className:r,...o}){return(0,e.jsxs)("div",{className:(0,i.cn)("flex w-full flex-col-reverse items-center justify-between gap-4 overflow-auto p-1 sm:flex-row sm:gap-8",r),...o,children:[(0,e.jsxs)("div",{className:"flex-1 whitespace-nowrap text-muted-foreground text-sm",children:[l.getFilteredSelectedRowModel().rows.length," of"," ",l.getFilteredRowModel().rows.length," row(s) selected."]}),(0,e.jsxs)("div",{className:"flex flex-col-reverse items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8",children:[(0,e.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,e.jsx)("p",{className:"whitespace-nowrap font-medium text-sm",children:"Linhas por p\xe1gina"}),(0,e.jsxs)(t.Select,{value:`${l.getState().pagination.pageSize}`,onValueChange:e=>{l.setPageSize(Number(e))},children:[(0,e.jsx)(t.SelectTrigger,{className:"h-10 w-[5.5rem] [&[data-size]]:h-10",children:(0,e.jsx)(t.SelectValue,{placeholder:l.getState().pagination.pageSize})}),(0,e.jsx)(t.SelectContent,{side:"top",children:n.map(a=>(0,e.jsx)(t.SelectItem,{value:`${a}`,children:a},a))})]})]}),(0,e.jsxs)("div",{className:"flex items-center justify-center font-medium text-sm",children:["P\xe1gina ",l.getState().pagination.pageIndex+1," de"," ",l.getPageCount()]}),(0,e.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,e.jsx)(s.Button,{"aria-label":"Go to first page",variant:"secondary",size:"icon",className:"hidden size-10 lg:flex",onClick:()=>l.setPageIndex(0),disabled:!l.getCanPreviousPage(),children:(0,e.jsx)(a.CaretDoubleLeft,{})}),(0,e.jsx)(s.Button,{"aria-label":"Go to previous page",variant:"secondary",size:"icon",className:"size-10",onClick:()=>l.previousPage(),disabled:!l.getCanPreviousPage(),children:(0,e.jsx)(a.CaretLeft,{})}),(0,e.jsx)(s.Button,{"aria-label":"Go to next page",variant:"secondary",size:"icon",className:"size-10",onClick:()=>l.nextPage(),disabled:!l.getCanNextPage(),children:(0,e.jsx)(a.CaretRight,{})}),(0,e.jsx)(s.Button,{"aria-label":"Go to last page",variant:"secondary",size:"icon",className:"hidden size-10 lg:flex",onClick:()=>l.setPageIndex(l.getPageCount()-1),disabled:!l.getCanNextPage(),children:(0,e.jsx)(a.CaretDoubleRight,{})})]})]})]})}export{l 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 CaretDoubleLeft,\r\n CaretDoubleRight,\r\n CaretLeft,\r\n CaretRight,\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} of{' '}\r\n {table.getFilteredRowModel().rows.length} row(s) selected.\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\"
|
|
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 CaretDoubleLeft,\r\n CaretDoubleRight,\r\n CaretLeft,\r\n CaretRight,\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} of{' '}\r\n {table.getFilteredRowModel().rows.length} row(s) selected.\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=\"secondary\"\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 <CaretDoubleLeft />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to previous page\"\r\n variant=\"secondary\"\r\n size=\"icon\"\r\n className=\"size-10\"\r\n onClick={() => table.previousPage()}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <CaretLeft />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to next page\"\r\n variant=\"secondary\"\r\n size=\"icon\"\r\n className=\"size-10\"\r\n onClick={() => table.nextPage()}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <CaretRight />\r\n </Button>\r\n <Button\r\n aria-label=\"Go to last page\"\r\n variant=\"secondary\"\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 <CaretDoubleRight />\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","CaretDoubleLeft","CaretLeft","CaretRight","CaretDoubleRight"],"mappings":"+KAuBO,SAASA,EAA2B,CACzCC,MAAAA,CAAK,CACLC,gBAAAA,EAAkB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAG,CACtCC,UAAAA,CAAS,CACT,GAAGC,EAC6B,EAChC,MACE,WAAC,OACC,UAAWC,AAAAA,GAAAA,EAAAA,EAAAA,AAAAA,EACT,yGACAF,GAED,GAAGC,CAAK,C,UAET,WAAC,OAAI,UAAU,yD,UACZH,EAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CAAC,MAAI,IACpDA,EAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,oB,GAE3C,WAAC,OAAI,UAAU,yE,UACb,WAAC,OAAI,UAAU,8B,UACb,UAAC,KAAE,UAAU,wC,SAAwC,sB,GAGrD,WAACK,EAAAA,MAAMA,CAAAA,CACL,MAAO,CAAC,EAAEL,EAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAChD,cAAeM,AAAAA,IACbN,EAAM,WAAW,CAACO,OAAOD,GAC3B,E,UAEA,UAACE,EAAAA,aAAaA,CAAAA,CAAC,UAAU,sC,SACvB,UAACC,EAAAA,WAAWA,CAAAA,CAAC,YAAaT,EAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,A,KAEhE,UAACU,EAAAA,aAAaA,CAAAA,CAAC,KAAK,M,SACjBT,EAAgB,GAAG,CAACU,AAAAA,GACnB,UAACC,EAAAA,UAAUA,CAAAA,CAAgB,MAAO,CAAC,EAAED,EAAS,CAAC,C,SAC5CA,C,EADcA,G,SAOzB,WAAC,OAAI,UAAU,uD,UAAuD,aAC5DX,EAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAG,EAAE,MAAI,IACrDA,EAAM,YAAY,G,GAErB,WAAC,OAAI,UAAU,8B,UACb,UAACa,EAAAA,MAAMA,CAAAA,CACL,aAAW,mBACX,QAAQ,YACR,KAAK,OACL,UAAU,yBACV,QAAS,IAAMb,EAAM,YAAY,CAAC,GAClC,SAAU,CAACA,EAAM,kBAAkB,G,SAEnC,UAACc,EAAAA,eAAeA,CAAAA,CAAAA,E,GAElB,UAACD,EAAAA,MAAMA,CAAAA,CACL,aAAW,sBACX,QAAQ,YACR,KAAK,OACL,UAAU,UACV,QAAS,IAAMb,EAAM,YAAY,GACjC,SAAU,CAACA,EAAM,kBAAkB,G,SAEnC,UAACe,EAAAA,SAASA,CAAAA,CAAAA,E,GAEZ,UAACF,EAAAA,MAAMA,CAAAA,CACL,aAAW,kBACX,QAAQ,YACR,KAAK,OACL,UAAU,UACV,QAAS,IAAMb,EAAM,QAAQ,GAC7B,SAAU,CAACA,EAAM,cAAc,G,SAE/B,UAACgB,EAAAA,UAAUA,CAAAA,CAAAA,E,GAEb,UAACH,EAAAA,MAAMA,CAAAA,CACL,aAAW,kBACX,QAAQ,YACR,KAAK,OACL,UAAU,yBACV,QAAS,IAAMb,EAAM,YAAY,CAACA,EAAM,YAAY,GAAK,GACzD,SAAU,CAACA,EAAM,cAAc,G,SAE/B,UAACiB,EAAAA,gBAAgBA,CAAAA,CAAAA,E,WAM7B,Q"}
|