From f75fa65e7d733d3b2911ff9ffcbdc2dec5bb27c8 Mon Sep 17 00:00:00 2001 From: Wroud Date: Fri, 28 May 2021 11:38:01 +0300 Subject: [PATCH] fix(plugin-data-spreadsheet-new): CB-994 CB-996 context menu --- webapp/packages/core-blocks/src/useMouse.ts | 4 +++- webapp/packages/core-dialogs/src/Menu/IMenuPanel.ts | 2 ++ .../core-dialogs/src/Menu/MenuPanel/MenuTrigger.tsx | 12 ++++++++++-- .../src/DataGrid/Formatters/CellFormatter.tsx | 13 ++++++++++--- .../src/DataGrid/Formatters/Menu/CellMenu.tsx | 10 ++++++---- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/webapp/packages/core-blocks/src/useMouse.ts b/webapp/packages/core-blocks/src/useMouse.ts index 5c56909521..bc4e6ad046 100644 --- a/webapp/packages/core-blocks/src/useMouse.ts +++ b/webapp/packages/core-blocks/src/useMouse.ts @@ -32,6 +32,7 @@ export function useMouse(options: IOptions): IMouseHook { if (!reference.current) { + state.mouseEnter = false; return; } @@ -57,10 +58,11 @@ export function useMouse(options: IOptions): IMouseHook { + state.mouseEnter = false; element.removeEventListener('mouseenter', mouseOverHandler); element.removeEventListener('mouseleave', mouseOutHandler); }; - }); + }, []); return { state, reference }; } diff --git a/webapp/packages/core-dialogs/src/Menu/IMenuPanel.ts b/webapp/packages/core-dialogs/src/Menu/IMenuPanel.ts index bc51fdbdbb..dfff022226 100644 --- a/webapp/packages/core-dialogs/src/Menu/IMenuPanel.ts +++ b/webapp/packages/core-dialogs/src/Menu/IMenuPanel.ts @@ -41,4 +41,6 @@ export type MenuTriggerProps = PropsWithChildren<{ style?: Style[]; placement?: MenuInitialState['placement']; modal?: boolean; + visible?: boolean; + onVisibleSwitch?: (visible: boolean) => void; }> & Omit, 'style'>; diff --git a/webapp/packages/core-dialogs/src/Menu/MenuPanel/MenuTrigger.tsx b/webapp/packages/core-dialogs/src/Menu/MenuPanel/MenuTrigger.tsx index fb02eb8ddf..c905d693f2 100644 --- a/webapp/packages/core-dialogs/src/Menu/MenuPanel/MenuTrigger.tsx +++ b/webapp/packages/core-dialogs/src/Menu/MenuPanel/MenuTrigger.tsx @@ -8,7 +8,7 @@ import { observer, useObserver } from 'mobx-react-lite'; import { - forwardRef, Ref, useCallback + forwardRef, Ref, useCallback, useEffect } from 'react'; import { MenuButton, @@ -16,6 +16,7 @@ import { } from 'reakit/Menu'; import styled, { use } from 'reshadow'; +import { useObjectRef } from '@cloudbeaver/core-blocks'; import { useStyles, Style } from '@cloudbeaver/core-theming'; import type { @@ -32,10 +33,17 @@ export const MenuTrigger: React.FC = function MenuTrigger({ children, style = [], placement, + visible, + onVisibleSwitch, modal, ...props }) { - const menu = useMenuState({ modal, placement }); + const propsRef = useObjectRef({ onVisibleSwitch, visible }, { onVisibleSwitch }); + const menu = useMenuState({ modal, placement, visible }); + + useEffect(() => { + propsRef.onVisibleSwitch?.(menu.visible); + }, [menu.visible]); return styled(useStyles(menuPanelStyles, ...style))( <> diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/CellFormatter.tsx b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/CellFormatter.tsx index 594f977f83..ef76a7c339 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/CellFormatter.tsx +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/CellFormatter.tsx @@ -7,7 +7,7 @@ */ import { observer } from 'mobx-react-lite'; -import { useCallback, useContext, useEffect, useRef } from 'react'; +import { useCallback, useContext, useEffect, useRef, useState } from 'react'; import type { FormatterProps } from 'react-data-grid'; import styled from 'reshadow'; @@ -35,6 +35,7 @@ export const CellFormatter: React.FC = observer(function CellFor const formatter = context?.model.source.getAction(context.resultIndex, ResultSetFormatAction); const rawValue = row[column.key]; const classes = getClasses(rawValue); + const [menuVisible, setMenuVisible] = useState(false); const value = formatter?.toString(rawValue) ?? String(rawValue); const handleClose = useCallback(() => { @@ -68,8 +69,14 @@ export const CellFormatter: React.FC = observer(function CellFor {value} - {(isCellSelected || cellContext?.mouse.state.mouseEnter) && context && ( - + {(isCellSelected || cellContext?.mouse.state.mouseEnter || menuVisible) && context && ( + )} ); diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/Menu/CellMenu.tsx b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/Menu/CellMenu.tsx index 7c3b706be9..aafcabcd9b 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/Menu/CellMenu.tsx +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Formatters/Menu/CellMenu.tsx @@ -24,14 +24,16 @@ interface Props { resultIndex: number; row: number; column: number; + onStateSwitch?: (state: boolean) => void; } -export const CellMenu = observer(function TreeNodeMenu({ +export const CellMenu: React.FC = observer(function TreeNodeMenu({ model, resultIndex, row, column, -}: Props) { + onStateSwitch, +}) { const dataGridContextMenuService = useService(DataGridContextMenuService); const { panel, hidden } = useMemo( @@ -50,8 +52,8 @@ export const CellMenu = observer(function TreeNodeMenu({ } return styled(cellMenuStyles)( - e.stopPropagation()}> - + e.stopPropagation()} onDoubleClick={e => e.stopPropagation()}> +