diff --git a/www/src/components/Table/ColumnEditor/index.tsx b/www/src/components/Table/ColumnEditor/index.tsx index d30ecb5f..1fbd94c0 100644 --- a/www/src/components/Table/ColumnEditor/index.tsx +++ b/www/src/components/Table/ColumnEditor/index.tsx @@ -65,13 +65,14 @@ const useStyles = makeStyles(theme => }) ); +// TODO: REMOVE THIS OLD COMPONENT export default function ColumnEditor() { const { tableState, tableActions, selectedColumnHeader, setSelectedColumnHeader, - } = useFiretableContext(); + } = useFiretableContext() as any; const actions = tableActions!.column; const { column, anchorEl } = selectedColumnHeader ?? {}; diff --git a/www/src/components/Table/ColumnHeader.tsx b/www/src/components/Table/ColumnHeader.tsx index 3bbdbb16..61f38e9c 100644 --- a/www/src/components/Table/ColumnHeader.tsx +++ b/www/src/components/Table/ColumnHeader.tsx @@ -90,17 +90,21 @@ const ColumnHeader: Column["headerRenderer"] = ({ column }) => { const classes = useStyles(); const { - setSelectedColumnHeader, tableState, tableActions, userClaims, + columnMenuRef, } = useFiretableContext(); - if (!setSelectedColumnHeader || !tableState || !tableActions) return null; + if (!columnMenuRef || !tableState || !tableActions) return null; const { orderBy } = tableState; const handleClick = ( event: React.MouseEvent - ) => setSelectedColumnHeader({ column, anchorEl: event.currentTarget }); + ) => + columnMenuRef?.current?.setSelectedColumnHeader({ + column, + anchorEl: event.currentTarget, + }); const isSorted = orderBy?.[0]?.key === (column.key as string); const isAsc = isSorted && orderBy?.[0]?.direction === "asc"; diff --git a/www/src/components/Table/ColumnMenu/index.tsx b/www/src/components/Table/ColumnMenu/index.tsx index e8b98fe3..f49c73e4 100644 --- a/www/src/components/Table/ColumnMenu/index.tsx +++ b/www/src/components/Table/ColumnMenu/index.tsx @@ -1,9 +1,6 @@ import React, { useState } from "react"; import { createStyles, makeStyles, Menu } from "@material-ui/core"; - -import MenuContents from "./MenuContents"; - import LockOpenIcon from "@material-ui/icons/LockOpen"; import LockIcon from "@material-ui/icons/Lock"; import VisibilityOffIcon from "@material-ui/icons/VisibilityOff"; @@ -18,12 +15,17 @@ import ReorderIcon from "@material-ui/icons/Reorder"; import ColumnPlusBeforeIcon from "assets/icons/ColumnPlusBefore"; import ColumnPlusAfterIcon from "assets/icons/ColumnPlusAfter"; import ColumnRemoveIcon from "assets/icons/ColumnRemove"; + +import MenuContents from "./MenuContents"; import NameChange from "./NameChange"; import NewColumn from "./NewColumn"; import TypeChange from "./TypeChange"; + import { useFiretableContext } from "contexts/firetableContext"; import { FIELDS } from "constants/fields"; import _find from "lodash/find"; +import { Column } from "react-data-grid"; +import { PopoverProps } from "@material-ui/core"; const INITIAL_MODAL = { type: "", data: {} }; @@ -32,6 +34,18 @@ enum ModalStates { typeChange = "TYPE_CHANGE", new = "NEW_COLUMN", } + +type SelectedColumnHeader = { + column: Column & { [key: string]: any }; + anchorEl: PopoverProps["anchorEl"]; +}; +export type ColumnMenuRef = { + selectedColumnHeader: SelectedColumnHeader | null; + setSelectedColumnHeader: React.Dispatch< + React.SetStateAction + >; +}; + const useStyles = makeStyles(theme => createStyles({ paper: { @@ -44,12 +58,12 @@ const useStyles = makeStyles(theme => export default function ColumnMenu() { const classes = useStyles(); const [modal, setModal] = useState(INITIAL_MODAL); - const { - tableState, - tableActions, - selectedColumnHeader, - setSelectedColumnHeader, - } = useFiretableContext(); + const { tableState, tableActions, columnMenuRef } = useFiretableContext(); + + const [selectedColumnHeader, setSelectedColumnHeader] = useState(); + if (columnMenuRef) + columnMenuRef.current = { selectedColumnHeader, setSelectedColumnHeader }; + if (!tableState || !tableActions) return null; const { orderBy } = tableState; diff --git a/www/src/components/Table/FinalColumnHeader.tsx b/www/src/components/Table/FinalColumnHeader.tsx index ffdfdf1d..56aa64af 100644 --- a/www/src/components/Table/FinalColumnHeader.tsx +++ b/www/src/components/Table/FinalColumnHeader.tsx @@ -39,12 +39,16 @@ const useStyles = makeStyles(theme => const FinalColumnHeader: Column["headerRenderer"] = ({ column }) => { const classes = useStyles(); - const { setSelectedColumnHeader } = useFiretableContext(); - if (!setSelectedColumnHeader) return null; + const { columnMenuRef } = useFiretableContext(); + if (!columnMenuRef) return null; const handleClick = ( event: React.MouseEvent - ) => setSelectedColumnHeader({ column, anchorEl: event.currentTarget }); + ) => + columnMenuRef?.current?.setSelectedColumnHeader({ + column, + anchorEl: event.currentTarget, + }); return ( & { [key: string]: any }; - anchorEl: PopoverProps["anchorEl"]; -}; +import { ColumnMenuRef } from "components/Table/ColumnMenu"; export type Table = { collection: string; @@ -40,16 +36,12 @@ interface FiretableContextProps { createTable: Function; userClaims: any; - // TODO: Investigate if this can be moved out of this context - selectedColumnHeader: SelectedColumnHeader | null; - setSelectedColumnHeader: React.Dispatch< - React.SetStateAction - >; - // A ref to the data grid. Contains data grid functions dataGridRef: React.RefObject; // A ref to the side drawer state. Prevents unnecessary re-renders sideDrawerRef: React.MutableRefObject; + // A ref to the column menu. Prevents unnecessary re-renders + columnMenuRef: React.MutableRefObject; } const firetableContext = React.createContext>( @@ -67,10 +59,6 @@ export const FiretableContextProvider: React.FC = ({ children }) => { const [settings, createTable] = useSettings(); const [userRoles, setUserRoles] = useState(); const [userClaims, setUserClaims] = useState(); - const [ - selectedColumnHeader, - setSelectedColumnHeader, - ] = useState(null); const { currentUser } = useAppContext(); useEffect(() => { @@ -135,6 +123,7 @@ export const FiretableContextProvider: React.FC = ({ children }) => { // A ref to the data grid. Contains data grid functions const dataGridRef = useRef(null); const sideDrawerRef = useRef(); + const columnMenuRef = useRef(); return ( { tables, sections, userClaims, - selectedColumnHeader, - setSelectedColumnHeader, dataGridRef, sideDrawerRef, + columnMenuRef, }} > {children}