import { useMemo, useCallback } from "react"; import { Popover, Switch, Stack, Text, Group, Divider, UnstyledButton } from "@mantine/core"; import { IconEye, IconEyeOff } from "@tabler/icons-react"; import { Table } from "@tanstack/react-table"; import { IBaseRow, IBaseProperty } from "@/features/base/types/base.types"; import { propertyTypes } from "@/features/base/components/property/property-type-picker"; import { useTranslation } from "react-i18next"; import cellClasses from "@/features/base/styles/cells.module.css"; type ViewFieldVisibilityProps = { opened: boolean; onClose: () => void; table: Table; onPersist: () => void; children: React.ReactNode; }; export function ViewFieldVisibility({ opened, onClose, table, onPersist, children, }: ViewFieldVisibilityProps) { const { t } = useTranslation(); const columns = useMemo(() => { return table .getAllLeafColumns() .filter((col) => col.id !== "__row_number"); }, [table]); const allVisible = columns.every((col) => col.getIsVisible()); const noneVisible = columns.filter((col) => col.getCanHide()).every((col) => !col.getIsVisible()); const handleToggle = useCallback( (columnId: string, visible: boolean) => { const col = table.getColumn(columnId); if (!col) return; col.toggleVisibility(visible); onPersist(); }, [table, onPersist], ); const handleShowAll = useCallback(() => { columns.forEach((col) => { if (col.getCanHide()) { col.toggleVisibility(true); } }); onPersist(); }, [columns, onPersist]); const handleHideAll = useCallback(() => { columns.forEach((col) => { if (col.getCanHide()) { col.toggleVisibility(false); } }); onPersist(); }, [columns, onPersist]); return ( {children} {t("Fields")} {t("Show all")} {t("Hide all")} {columns.map((col) => { const property = col.columnDef.meta?.property as IBaseProperty | undefined; if (!property) return null; const canHide = col.getCanHide(); const isVisible = col.getIsVisible(); const typeConfig = propertyTypes.find((pt) => pt.type === property.type); const TypeIcon = typeConfig?.icon; return ( { if (canHide) { handleToggle(col.id, !isVisible); } }} style={{ opacity: canHide ? 1 : 0.5 }} > {TypeIcon && } {property.name} {}} styles={{ track: { cursor: canHide ? "pointer" : "not-allowed" } }} /> ); })} ); }