Blame view

Yi.Vben5.Vue3/packages/utils/src/helpers/get-popup-container.ts 2.06 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  /**
   * If the node is holding inside a form, return the form element,
   * otherwise return the parent node of the given element or
   * the document body if the element is not provided.
   */
  export function getPopupContainer(node?: HTMLElement): HTMLElement {
    return (
      node?.closest('form') ?? (node?.parentNode as HTMLElement) ?? document.body
    );
  }
  
  /**
   * VxeTable专用弹窗层
   * 解决问题: https://gitee.com/dapppp/ruoyi-plus-vben5/issues/IB1DM3
   * @param node 触发的元素
   * @param tableId 表格ID,用于区分不同表格(可选)
   * @returns 挂载节点
   */
  export function getVxePopupContainer(
    node?: HTMLElement,
    tableId?: string,
  ): HTMLElement {
    if (!node) return document.body;
  
    // 检查是否在固定列内
    const isInFixedColumn =
      node.closest('.vxe-table--fixed-wrapper') ||
      node.closest('.vxe-table--fixed-left-wrapper') ||
      node.closest('.vxe-table--fixed-right-wrapper');
  
    // 如果在固定列内,则挂载到固定列容器
    if (isInFixedColumn) {
      // 优先查找表格容器及父级容器
      const tableContainer =
        // 查找通用固定列容器
        node.closest('.vxe-table--fixed-wrapper') ||
        // 查找固定列容器(左侧固定列)
        node.closest('.vxe-table--fixed-left-wrapper') ||
        // 查找固定列容器(右侧固定列)
        node.closest('.vxe-table--fixed-right-wrapper');
  
      // 如果指定了tableId,可以查找特定ID的表格
      if (tableId && tableContainer) {
        const specificTable = tableContainer.closest(
          `[data-table-id="${tableId}"]`,
        );
        if (specificTable) {
          return specificTable as HTMLElement;
        }
      }
  
      return tableContainer as HTMLElement;
    }
  
    /**
     * 设置行高度需要特殊处理
     */
    const fixedHeightElement = node.closest('td.col--cs-height');
    if (fixedHeightElement) {
      // 默认为hidden 显示异常
      (fixedHeightElement as HTMLTableCellElement).style.overflow = 'visible';
    }
  
    // 兜底方案:使用元素的父节点或文档体
    return (node.parentNode as HTMLElement) || document.body;
  }