import { Button } from "@repo/shadcn-ui/components/button"; import { Checkbox } from "@repo/shadcn-ui/components/checkbox"; import { Field, FieldLabel, FieldLegend, FieldSet } from "@repo/shadcn-ui/components/field"; import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, } from "@repo/shadcn-ui/components/input-group"; import type { Table as TableModel } from "@tanstack/react-table"; import { useId, useState } from "react"; import type { EntityColumnGroup, EntityColumnMetadata, EntityColumnOption, } from "../lib/entity-column-configuration"; import { groupColumnOptions } from "../lib/entity-column-configuration"; import { entityListLabels } from "../lib/entity-list"; import { SearchIcon, XIcon } from "../lib/icons"; import { FormBody, FormDialog } from "./form-dialog"; export function EntityTableColumnsDialog({ table, locale, open, onOpenChange, columnGroups = [], columnMetadata = [], onResetColumns, }: { table: TableModel; locale: string; open: boolean; onOpenChange: (open: boolean) => void; columnGroups?: readonly EntityColumnGroup[] | undefined; columnMetadata?: readonly (EntityColumnMetadata & { id: string })[] | undefined; onResetColumns?: (() => void) | undefined; }) { const id = useId(); const labels = entityListLabels(locale); const [search, setSearch] = useState(""); const metadata = new Map([...columnMetadata].reverse().map((column) => [column.id, column])); // La selección es un control interno del picker, no una columna de datos configurable. const options: EntityColumnOption[] = table .getAllLeafColumns() .filter((column) => column.id !== "selection") .map((column) => ({ ...metadata.get(column.id), id: column.id, label: String(column.columnDef.header), visible: column.getIsVisible(), hideable: column.getCanHide(), })); const groups = groupColumnOptions(options, columnGroups, search); const visible = options.filter((column) => column.visible).length; const matches = groups.reduce((total, group) => total + group.options.length, 0); function changeOpen(nextOpen: boolean) { setSearch(""); onOpenChange(nextOpen); } return (
{labels.searchColumns} setSearch(event.target.value)} placeholder={labels.searchColumns} value={search} /> { setSearch(""); document.getElementById(`${id}-search`)?.focus(); }} size="icon-sm" >

{labels.visibleColumns(visible, options.length)}

{labels.requiredColumnHelp} {search.trim() && (

{labels.matchingColumns(matches)}

)} {matches === 0 &&

{labels.noMatchingColumns}

} {groups.map(({ group, options: groupOptions }) => (
{(group || columnGroups.length > 0) && ( {group?.label ?? labels.otherColumns} )} {group?.description && (

{group.description}

)} {groupOptions.map((column) => ( ))}
))}
); }