import { useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { DropResult, OnDragEndResponder, ResponderProvided, } from '@hello-pangea/dnd'; import { IconMinus, IconPlus } from '@/ui/display/icon'; import { AppTooltip } from '@/ui/display/tooltip/AppTooltip'; import { IconInfoCircle } from '@/ui/input/constants/icons'; import { DraggableItem } from '@/ui/layout/draggable-list/components/DraggableItem'; import { DraggableList } from '@/ui/layout/draggable-list/components/DraggableList'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { StyledDropdownMenuSubheader } from '@/ui/layout/dropdown/components/StyledDropdownMenuSubheader'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { MenuItemDraggable } from '@/ui/navigation/menu-item/components/MenuItemDraggable'; import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata'; import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { isDefined } from '~/utils/isDefined'; type ViewFieldsVisibilityDropdownSectionProps = { fields: Omit, 'size'>[]; onVisibilityChange: ( field: Omit, 'size' | 'position'>, ) => void; title: string; isDraggable: boolean; onDragEnd?: OnDragEndResponder; }; export const ViewFieldsVisibilityDropdownSection = ({ fields, onVisibilityChange, title, isDraggable, onDragEnd, }: ViewFieldsVisibilityDropdownSectionProps) => { const handleOnDrag = (result: DropResult, provided: ResponderProvided) => { onDragEnd?.(result, provided); }; const [openToolTipIndex, setOpenToolTipIndex] = useState(); const handleInfoButtonClick = (index: number) => { if (index === openToolTipIndex) setOpenToolTipIndex(undefined); else setOpenToolTipIndex(index); }; const getIconButtons = ( index: number, field: Omit, 'size' | 'position'>, ) => { if (field.infoTooltipContent) { return [ { Icon: IconInfoCircle, onClick: () => handleInfoButtonClick(index), isActive: openToolTipIndex === index, }, { Icon: field.isVisible ? IconMinus : IconPlus, onClick: () => onVisibilityChange(field), }, ]; } if (!field.infoTooltipContent) { return [ { Icon: field.isVisible ? IconMinus : IconPlus, onClick: () => onVisibilityChange(field), }, ]; } }; const ref = useRef(null); useListenClickOutside({ refs: [ref], callback: () => { setOpenToolTipIndex(undefined); }, }); return (
{title} {isDraggable ? ( {[...fields] .sort((a, b) => a.position - b.position) .map((field, index) => ( } /> ))} } /> ) : ( fields.map((field, index) => ( )) )} {isDefined(openToolTipIndex) && createPortal( , document.body, )}
); };