fix: Fixed an issue where the z-index setting of the pop-up component was abnormal in the pop-up container (#45864)

* fix: Fixed an issue where the z-index setting of the pop-up component was abnormal in the pop-up container

* feat: optimize code

* feat: optimize code

* feat: optimize code

* feat: optimize code

* feat: optimize code

* Update components/popconfirm/index.tsx

Signed-off-by: kiner-tang(文辉) <1127031143@qq.com>

---------

Signed-off-by: kiner-tang(文辉) <1127031143@qq.com>
This commit is contained in:
kiner-tang(文辉) 2023-11-14 18:01:23 +08:00 committed by GitHub
parent a5649f1695
commit 2777d2c39f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 21 additions and 16 deletions

View File

@ -150,6 +150,7 @@ const consumerComponent: Record<ZIndexConsumer, React.FC<{ rootClassName: string
options={options} options={options}
open open
/> />
<ColorPicker {...props} open rootClassName={`${rootClassName} comp-item comp-ColorPicker`} />
</> </>
), ),
Dropdown: (props) => ( Dropdown: (props) => (
@ -166,7 +167,6 @@ const consumerComponent: Record<ZIndexConsumer, React.FC<{ rootClassName: string
<button type="button">test</button> <button type="button">test</button>
</Dropdown> </Dropdown>
), ),
ColorPicker: (props) => <ColorPicker {...props} open />,
DatePicker: ({ rootClassName, ...props }) => ( DatePicker: ({ rootClassName, ...props }) => (
<> <>
<DatePicker {...props} rootClassName={`${rootClassName} comp-item comp-DatePicker`} open /> <DatePicker {...props} rootClassName={`${rootClassName} comp-item comp-DatePicker`} open />
@ -183,8 +183,12 @@ const consumerComponent: Record<ZIndexConsumer, React.FC<{ rootClassName: string
function getConsumerSelector(baseSelector: string, consumer: ZIndexConsumer): string { function getConsumerSelector(baseSelector: string, consumer: ZIndexConsumer): string {
let selector = baseSelector; let selector = baseSelector;
if (consumer === 'SelectLike') { if (consumer === 'SelectLike') {
selector = ['Select', 'Cascader', 'TreeSelect', 'AutoComplete'] selector = ['Select', 'Cascader', 'TreeSelect', 'AutoComplete', 'ColorPicker']
.map((item) => `${baseSelector}.comp-${item}.ant-slide-up`) .map((item) =>
item === 'ColorPicker'
? `${baseSelector}.ant-popover-placement-bottomLeft`
: `${baseSelector}.comp-${item}.ant-slide-up`,
)
.join(','); .join(',');
} else if (consumer === 'DatePicker') { } else if (consumer === 'DatePicker') {
selector = ['DatePicker', 'TimePicker'] selector = ['DatePicker', 'TimePicker']
@ -192,8 +196,6 @@ function getConsumerSelector(baseSelector: string, consumer: ZIndexConsumer): st
.join(','); .join(',');
} else if (['Menu'].includes(consumer)) { } else if (['Menu'].includes(consumer)) {
selector = `${baseSelector}.ant-menu-submenu-placement-rightTop`; selector = `${baseSelector}.ant-menu-submenu-placement-rightTop`;
} else if (consumer === 'ColorPicker') {
selector = `${baseSelector}.ant-popover-placement-bottomLeft`;
} }
return selector; return selector;
} }
@ -268,21 +270,29 @@ describe('Test useZIndex hooks', () => {
}); });
comps = document.querySelectorAll(selector2); comps = document.querySelectorAll(selector2);
comps.forEach((comp) => { comps.forEach((comp) => {
const isColorPicker = (comp as HTMLDivElement).className.includes('comp-ColorPicker');
const consumerOffset = isColorPicker
? 1000 + containerBaseZIndexOffset.Popover
: consumerBaseZIndexOffset[key as ZIndexConsumer];
expect((comp as HTMLDivElement).style.zIndex).toBe( expect((comp as HTMLDivElement).style.zIndex).toBe(
String( String(
1000 + 1000 +
containerBaseZIndexOffset[containerKey as ZIndexContainer] + containerBaseZIndexOffset[containerKey as ZIndexContainer] +
consumerBaseZIndexOffset[key as ZIndexConsumer], consumerOffset,
), ),
); );
}); });
comps = document.querySelectorAll(selector3); comps = document.querySelectorAll(selector3);
comps.forEach((comp) => { comps.forEach((comp) => {
const isColorPicker = (comp as HTMLDivElement).className.includes('comp-ColorPicker');
const consumerOffset = isColorPicker
? 1000 + containerBaseZIndexOffset.Popover
: consumerBaseZIndexOffset[key as ZIndexConsumer];
expect((comp as HTMLDivElement).style.zIndex).toBe( expect((comp as HTMLDivElement).style.zIndex).toBe(
String( String(
(1000 + containerBaseZIndexOffset[containerKey as ZIndexContainer]) * 2 + (1000 + containerBaseZIndexOffset[containerKey as ZIndexContainer]) * 2 +
consumerBaseZIndexOffset[key as ZIndexConsumer], consumerOffset,
), ),
); );
}); });
@ -296,6 +306,7 @@ describe('Test useZIndex hooks', () => {
(document.querySelector(selector1) as HTMLDivElement).style.zIndex, (document.querySelector(selector1) as HTMLDivElement).style.zIndex,
).toBeFalsy(); ).toBeFalsy();
} }
expect((document.querySelector(selector2) as HTMLDivElement).style.zIndex).toBe( expect((document.querySelector(selector2) as HTMLDivElement).style.zIndex).toBe(
String( String(
1000 + 1000 +

View File

@ -5,7 +5,7 @@ import zIndexContext from '../zindexContext';
export type ZIndexContainer = 'Modal' | 'Drawer' | 'Popover' | 'Popconfirm' | 'Tooltip' | 'Tour'; export type ZIndexContainer = 'Modal' | 'Drawer' | 'Popover' | 'Popconfirm' | 'Tooltip' | 'Tour';
export type ZIndexConsumer = 'SelectLike' | 'Dropdown' | 'ColorPicker' | 'DatePicker' | 'Menu'; export type ZIndexConsumer = 'SelectLike' | 'Dropdown' | 'DatePicker' | 'Menu';
export const containerBaseZIndexOffset: Record<ZIndexContainer, number> = { export const containerBaseZIndexOffset: Record<ZIndexContainer, number> = {
Modal: 0, Modal: 0,
@ -18,7 +18,6 @@ export const containerBaseZIndexOffset: Record<ZIndexContainer, number> = {
export const consumerBaseZIndexOffset: Record<ZIndexConsumer, number> = { export const consumerBaseZIndexOffset: Record<ZIndexConsumer, number> = {
SelectLike: 50, SelectLike: 50,
Dropdown: 50, Dropdown: 50,
ColorPicker: 30,
DatePicker: 50, DatePicker: 50,
Menu: 50, Menu: 50,
}; };

View File

@ -32,7 +32,6 @@ import type {
} from './interface'; } from './interface';
import useStyle from './style/index'; import useStyle from './style/index';
import { customizePrefixCls, genAlphaColor, generateColor, getAlphaColor } from './util'; import { customizePrefixCls, genAlphaColor, generateColor, getAlphaColor } from './util';
import { useZIndex } from '../_util/hooks/useZIndex';
export type ColorPickerProps = Omit< export type ColorPickerProps = Omit<
RcColorPickerProps, RcColorPickerProps,
@ -232,7 +231,6 @@ const ColorPicker: CompoundedComponent = (props) => {
const mergedStyle: React.CSSProperties = { ...colorPicker?.style, ...style }; const mergedStyle: React.CSSProperties = { ...colorPicker?.style, ...style };
// ============================ zIndex ============================ // ============================ zIndex ============================
const [zIndex] = useZIndex('ColorPicker');
return wrapSSR( return wrapSSR(
<Popover <Popover
@ -254,7 +252,6 @@ const ColorPicker: CompoundedComponent = (props) => {
</NoFormStyle> </NoFormStyle>
} }
overlayClassName={mergePopupCls} overlayClassName={mergePopupCls}
zIndex={zIndex}
{...popoverProps} {...popoverProps}
> >
{children || ( {children || (

View File

@ -813,7 +813,7 @@ Array [
</button>, </button>,
<div <div
class="ant-popover ant-zoom-big-appear ant-zoom-big-appear-prepare ant-zoom-big ant-popover-placement-top" class="ant-popover ant-zoom-big-appear ant-zoom-big-appear-prepare ant-zoom-big ant-popover-placement-top"
style="--arrow-x: 0px; --arrow-y: 0px; left: -1000vw; top: -1000vh; box-sizing: border-box;" style="--arrow-x: 0px; --arrow-y: 0px; left: -1000vw; top: -1000vh; box-sizing: border-box; z-index: 2140;"
> >
<div <div
class="ant-popover-arrow" class="ant-popover-arrow"

View File

@ -50,8 +50,6 @@ const Popover = React.forwardRef<TooltipRef, PopoverProps>((props, ref) => {
const overlayCls = classNames(overlayClassName, hashId); const overlayCls = classNames(overlayClassName, hashId);
// ============================ zIndex ============================
return wrapSSR( return wrapSSR(
<Tooltip <Tooltip
placement={placement} placement={placement}

View File

@ -300,7 +300,7 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
const content = ( const content = (
<RcTooltip <RcTooltip
{...otherProps} {...otherProps}
zIndex={injectFromPopover ? otherProps.zIndex : zIndex} zIndex={zIndex}
showArrow={mergedShowArrow} showArrow={mergedShowArrow}
placement={placement} placement={placement}
mouseEnterDelay={mouseEnterDelay} mouseEnterDelay={mouseEnterDelay}