diff --git a/CHANGELOG.md b/CHANGELOG.md index b8a347195acd285d094d1fcb1317f5d1ffe65039..87e6efb1226133e9aec9e2a734c79b4db339d9cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - 修复日历导航栏快速搜索和工具栏行为异常 - 修复列表默认展开异常 - 修复选择视图选中数据回显异常 +- 修复甘特图全屏后滑块详情气泡及编辑器气泡未显示,新增飘窗参数appendTo(指示飘窗的内容将附加在哪一个网页元素上) ### Changed diff --git a/src/control/gantt/gantt.tsx b/src/control/gantt/gantt.tsx index 195e18920b0deb465eef14fe450f9fbaffa6ee7f..e3d32055d7b502c23857c665e7315f5dfd664266 100644 --- a/src/control/gantt/gantt.tsx +++ b/src/control/gantt/gantt.tsx @@ -278,6 +278,82 @@ export const GanttControl = defineComponent({ return layoutPanel; }; + let fullscreen = false; + const oldAllPopover: HTMLElement[] = []; + + /** + * 获取所有需要处理的弹窗元素 + * + * @return {*} {IData} + */ + const getAllPopover = (): IData => { + const allPopover = {}; + // 编辑器气泡父元素 + const elPopover = document.querySelector('.el-popover')?.parentElement; + if (elPopover) Object.assign(allPopover, { elPopover }); + + return allPopover; + }; + + /** + * 将弹窗元素添加到目标容器中 + * + * @param {HTMLElement[]} _popover + * @param {HTMLElement} _target + * @return {*} + */ + const popoverAppendTarget = ( + _popover: HTMLElement[], + _target: HTMLElement, + ): void => { + _popover.forEach( + _element => + _element.parentElement !== _target && _target?.append(_element), + ); + }; + + /** + * 将弹窗元素移动到甘特图容器中 + * + * @return {*} + */ + const popoverAppendGantt = (): void => { + const targetContainer = ganttRef.value?.getElementRefs().rootRef.value; + const allPopoverNode = Object.values(getAllPopover()).filter(_element => { + // 父元素必须为body节点才移动,元素内部气泡不应该移动 + return _element && _element.parentElement === document.body; + }); + oldAllPopover.push(...allPopoverNode); + popoverAppendTarget(allPopoverNode, targetContainer); + }; + + /** + * 将弹窗元素移回body中 + * + * @return {*} + */ + const popoverAppendBody = (): void => { + const allPopoverNode = oldAllPopover.filter(_element => !!_element); + oldAllPopover.length = 0; + popoverAppendTarget(allPopoverNode, document.body); + }; + + /** + * 处理全屏状态变化的回调函数 + * + * @param {boolean} _state + * @return {*} + */ + const handleFullscreenChange = (_state: boolean): void => { + fullscreen = _state; + + if (_state) { + popoverAppendGantt(); + } else { + popoverAppendBody(); + } + }; + /** * 多选时选中节点变更 * @@ -718,6 +794,8 @@ export const GanttControl = defineComponent({ if (overlay) { return; } + const appendTo = + fullscreen && ganttRef.value?.getElementRefs().rootRef.value; const panel = findNodeLayoutPanel(row._nodeId); const component = panel ? renderNodePanel(panel, row._deData!) @@ -733,6 +811,7 @@ export const GanttControl = defineComponent({ noArrow: true, placement: 'bottom', modalClass: ns.e('slider-popover'), + appendTo, }, ); overlay?.present((evt.target as IParams).children[0] as HTMLElement); @@ -876,6 +955,8 @@ export const GanttControl = defineComponent({ if (linkOverlay || !panel) { return; } + const appendTo = + fullscreen && ganttRef.value?.getElementRefs().rootRef.value; const component = renderNodePanel(panel, panelData); linkOverlay = ibiz.overlay.createPopover( (modal: IModal): VNode => { @@ -888,6 +969,7 @@ export const GanttControl = defineComponent({ noArrow: true, autoClose: true, modalClass: ns.e('link-path-popover'), + appendTo, }, ); linkOverlay?.present(evt.currentTarget as HTMLElement); @@ -939,6 +1021,7 @@ export const GanttControl = defineComponent({ handleDrop, onHeaderDragend, handleClickLink, + handleFullscreenChange, }; }, render() { @@ -988,6 +1071,7 @@ export const GanttControl = defineComponent({ onHeaderDragend={this.onHeaderDragend} onMoveSlider={this.onSliderMove} onClickLink={this.handleClickLink} + onFullscreenChange={this.handleFullscreenChange} primaryColor={this.ganttStyle.primaryColor} headerStyle={{ textColor: this.ganttStyle.textColor,