mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 04:18:54 +00:00
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.

This commit is contained in:
@@ -41,6 +41,7 @@ export const RenameModal = ({
|
|||||||
return (
|
return (
|
||||||
<Menu
|
<Menu
|
||||||
rootOptions={{
|
rootOptions={{
|
||||||
|
modal: true,
|
||||||
open: open,
|
open: open,
|
||||||
onOpenChange: onOpenChange,
|
onOpenChange: onOpenChange,
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
Reference in New Issue
Block a user