diff --git a/client/src/common/menus.ts b/client/src/common/menus.ts index d0d81460dd..97c2d1b11b 100644 --- a/client/src/common/menus.ts +++ b/client/src/common/menus.ts @@ -16,6 +16,7 @@ export interface MenuItemProps { hideOnClick?: boolean; dialog?: React.ReactElement; ref?: React.Ref; + className?: string; render?: | RenderProp & { ref?: React.Ref | undefined }> | React.ReactElement> diff --git a/client/src/components/Chat/Input/Files/Table/ColumnVisibilityDropdown.tsx b/client/src/components/Chat/Input/Files/Table/ColumnVisibilityDropdown.tsx new file mode 100644 index 0000000000..8401db6d38 --- /dev/null +++ b/client/src/components/Chat/Input/Files/Table/ColumnVisibilityDropdown.tsx @@ -0,0 +1,59 @@ +import { useState, useId, useMemo } from 'react'; +import { ListFilter } from 'lucide-react'; +import * as Menu from '@ariakit/react/menu'; +import { useReactTable } from '@tanstack/react-table'; +import { DropdownPopup } from '@librechat/client'; +import { useLocalize, TranslationKeys } from '~/hooks'; +import { cn } from '~/utils'; + +interface ColumnVisibilityDropdownProps { + table: ReturnType>; + contextMap: Record; + isSmallScreen: boolean; +} + +export function ColumnVisibilityDropdown({ + table, + contextMap, + isSmallScreen, +}: ColumnVisibilityDropdownProps) { + const localize = useLocalize(); + const menuId = useId(); + const [isOpen, setIsOpen] = useState(false); + + const dropdownItems = useMemo( + () => + table + .getAllColumns() + .filter((column) => column.getCanHide()) + .map((column) => ({ + label: localize(contextMap[column.id]), + onClick: () => column.toggleVisibility(!column.getIsVisible()), + icon: column.getIsVisible() ? '✓' : '', + id: column.id, + })), + [table, contextMap, localize], + ); + + return ( + +