fix(core): handle modal overlay click event correctly (#8063)

1. overlay click + hide is brought back. this is because modal (ormobile menu)'s `onPointerDownOutside` is bound to document.body. Code in e58af08f63/packages/frontend/core/src/modules/explorer/views/tree/node.tsx (L353-L356) will stop the event from bubbling to the document element.
2. when Menu's set to modal=true, the parent is set to pointer-events: none as well. changed menu to modal false instead.

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/T2klNLEk0wxLh4NRDzhk/3e50281f-839d-4463-af00-dff2fce8202b.png)
This commit is contained in:
pengx17
2024-09-03 12:00:00 +00:00
parent ae3b13bfb4
commit d00f86c3ce
4 changed files with 30 additions and 6 deletions

View File

@@ -41,6 +41,7 @@ export const RenameModal = ({
return ( return (
<Menu <Menu
rootOptions={{ rootOptions={{
modal: true,
open: open, open: open,
onOpenChange: onOpenChange, onOpenChange: onOpenChange,
}} }}

View File

@@ -10,7 +10,7 @@ export const DesktopMenu = ({
children, children,
items, items,
portalOptions, portalOptions,
rootOptions: { onOpenChange, defaultOpen, ...rootOptions } = {}, rootOptions: { onOpenChange, defaultOpen, modal, ...rootOptions } = {},
contentOptions: { contentOptions: {
className = '', className = '',
style: contentStyle = {}, style: contentStyle = {},
@@ -30,9 +30,18 @@ export const DesktopMenu = ({
<DropdownMenu.Root <DropdownMenu.Root
onOpenChange={handleOpenChange} onOpenChange={handleOpenChange}
defaultOpen={defaultOpen} defaultOpen={defaultOpen}
modal={modal ?? false}
{...rootOptions} {...rootOptions}
> >
<DropdownMenu.Trigger asChild>{children}</DropdownMenu.Trigger> <DropdownMenu.Trigger
asChild
onClick={e => {
e.stopPropagation();
e.preventDefault();
}}
>
{children}
</DropdownMenu.Trigger>
<DropdownMenu.Portal {...portalOptions}> <DropdownMenu.Portal {...portalOptions}>
<DropdownMenu.Content <DropdownMenu.Content

View File

@@ -9,7 +9,7 @@ import * as Dialog from '@radix-ui/react-dialog';
import * as VisuallyHidden from '@radix-ui/react-visually-hidden'; import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
import { assignInlineVars } from '@vanilla-extract/dynamic'; import { assignInlineVars } from '@vanilla-extract/dynamic';
import clsx from 'clsx'; import clsx from 'clsx';
import type { CSSProperties } from 'react'; import type { CSSProperties, MouseEvent } from 'react';
import { forwardRef, useCallback, useEffect, useState } from 'react'; import { forwardRef, useCallback, useEffect, useState } from 'react';
import { isMobile } from '../../utils/env'; import { isMobile } from '../../utils/env';
@@ -139,6 +139,7 @@ export const ModalInner = forwardRef<HTMLDivElement, ModalProps>(
overlayOptions: { overlayOptions: {
className: overlayClassName, className: overlayClassName,
style: overlayStyle, style: overlayStyle,
onClick: onOverlayClick,
...otherOverlayOptions ...otherOverlayOptions
} = {}, } = {},
closeButtonOptions, closeButtonOptions,
@@ -189,6 +190,19 @@ export const ModalInner = forwardRef<HTMLDivElement, ModalProps>(
[onEscapeKeyDown, persistent] [onEscapeKeyDown, persistent]
); );
const handleOverlayClick = useCallback(
(e: MouseEvent<HTMLDivElement>) => {
onOverlayClick?.(e);
if (persistent) {
e.preventDefault();
} else {
e.stopPropagation();
onOpenChange?.(false);
}
},
[onOpenChange, onOverlayClick, persistent]
);
if (!container) { if (!container) {
return; return;
} }
@@ -211,6 +225,7 @@ export const ModalInner = forwardRef<HTMLDivElement, ModalProps>(
style={{ style={{
...overlayStyle, ...overlayStyle,
}} }}
onClick={handleOverlayClick}
{...otherOverlayOptions} {...otherOverlayOptions}
/> />
<div <div

View File

@@ -126,10 +126,9 @@ export const addCustomProperty = async (
}) })
.locator('.selected') .locator('.selected')
).toBeVisible(); ).toBeVisible();
await page.keyboard.press('Escape', { await page.keyboard.press('Escape');
delay: 100,
});
} }
await page.waitForTimeout(500);
}; };
export const expectPropertyOrdering = async ( export const expectPropertyOrdering = async (