tav-ui
Version:
1 lines • 14.6 kB
Source Map (JSON)
{"version":3,"file":"useTableScroll2.mjs","sources":["../../../../../../../../packages/components/table/src/hooks/useTableScroll.ts"],"sourcesContent":["import { computed, nextTick, ref, unref, watch } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport { useWindowSizeFn } from '@tav-ui/hooks/event/useWindowSizeFn'\nimport { getViewportOffset } from '@tav-ui/utils/domUtils'\nimport { isBoolean } from '@tav-ui/utils/is'\nimport { useModalContext } from '@tav-ui/components/modal/src/hooks/useModalContext'\nimport { useKeepScroll } from '@tav-ui/hooks/event/useKeepScroll'\nimport type { ComputedRef, Ref } from 'vue'\nimport type { BasicColumn, BasicTableProps, TableRowSelection } from '../types/table'\n\ntype Nullable<T> = T | null\ntype Recordable<T = any> = Record<string, T>\ninterface ComponentElRef<T extends HTMLElement = HTMLDivElement> {\n $el: T\n}\ntype ComponentRef<T extends HTMLElement = HTMLDivElement> = ComponentElRef<T> | null\n\nexport function useTableScroll(\n propsRef: ComputedRef<BasicTableProps>,\n tableElRef: Ref<ComponentRef>,\n columnsRef: ComputedRef<BasicColumn[]>,\n rowSelectionRef: ComputedRef<TableRowSelection | null>,\n getDataSourceRef: ComputedRef<Recordable[]>,\n slots: any,\n wrapRef: Ref<HTMLElement | null>,\n formRef: Ref<HTMLElement | null>,\n actionRef: Ref<HTMLElement | null>\n) {\n const tableHeightRef: Ref<Nullable<number>> = ref(null)\n\n const modalFn = useModalContext()\n\n // Greater than animation time 280\n const debounceRedoHeight = useDebounceFn(redoHeight, 100)\n\n const getCanResize = computed(() => {\n const { canResize, scroll } = unref(propsRef)\n return canResize && !(scroll || {}).y\n })\n\n watch(\n () => [unref(getCanResize), unref(getDataSourceRef)?.length],\n () => {\n debounceRedoHeight()\n },\n {\n flush: 'post',\n }\n )\n\n function redoHeight() {\n nextTick(() => {\n calcTableHeight()\n })\n }\n\n function setHeight(height: number) {\n tableHeightRef.value = height\n // Solve the problem of modal adaptive height calculation when the form is placed in the modal\n modalFn?.redoModalHeight?.()\n }\n\n // No need to repeat queries\n // let paginationEl: HTMLElement | null\n let footerEl: HTMLElement | null\n let bodyEl: HTMLElement | null\n const keepScrollIns = ref<{ onScroll: () => void; scrollFn: () => void } | null>(null)\n async function calcTableHeight() {\n const {\n resizeHeightOffset,\n pagination,\n maxHeight,\n isCanResizeParent,\n formRefMarginTopDistance,\n tablePaddingDistance,\n } = unref(propsRef)\n // const tableData = unref(getDataSourceRef)\n const table = unref(tableElRef)\n if (!table) return\n // debugger;\n const tableEl: Element = table.$el\n if (!tableEl) return\n\n if (!bodyEl) {\n bodyEl = tableEl.querySelector('.ant-table-body')\n if (!bodyEl) return\n }\n if (unref(propsRef).keepScrollTop) {\n keepScrollIns.value = useKeepScroll({ scrollEl: bodyEl })\n }\n const hasScrollBarY = bodyEl.scrollHeight > bodyEl.clientHeight\n const hasScrollBarX = bodyEl.scrollWidth > bodyEl.clientWidth\n if (hasScrollBarY) {\n tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.remove('hide-scrollbar-y')\n } else {\n !tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.add('hide-scrollbar-y')\n }\n if (hasScrollBarX) {\n tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.remove('hide-scrollbar-x')\n } else {\n !tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.add('hide-scrollbar-x')\n }\n bodyEl!.style.height = '100%'\n // if (!unref(getCanResize) || tableData.length === 0) return;\n if (isCanResizeParent) {\n // console.log(isCanResizeParent, 'isCanResizeParent111111')\n bodyEl!.style.height = '100%'\n if (!unref(getCanResize)) return\n } else {\n // console.log(isCanResizeParent, 'isCanResizeParent22222')\n bodyEl!.style.height = 'unset'\n if (!unref(getCanResize)) return\n }\n await nextTick()\n //Add a delay to get the correct bottomIncludeBody paginationHeight footerHeight headerHeight\n const headEl = tableEl.querySelector('.ant-table-thead')\n if (!headEl) return\n // Table height from bottom\n // hack:底部padding + table底部padding\n // Pager height\n let paginationHeight = 32 // 默认高度?\n if (!isBoolean(pagination)) {\n // paginationEl = tableEl.querySelector('.ant-pagination') as HTMLElement\n paginationHeight = 32\n } else {\n paginationHeight = 0\n }\n let footerHeight = 0\n if (!isBoolean(pagination)) {\n if (!footerEl) {\n footerEl = tableEl.querySelector('.ant-table-footer') as HTMLElement\n } else {\n const offsetHeight = footerEl.offsetHeight\n footerHeight += offsetHeight || 0\n }\n }\n let headerHeight = 0\n if (headEl) {\n headerHeight = (headEl as HTMLElement).offsetHeight\n }\n let bottomIncludeBody = 0\n let height = 0\n const tablePadding = tablePaddingDistance\n if (unref(wrapRef) && isCanResizeParent) {\n const formMargin = formRefMarginTopDistance\n const TableMargin = 0\n const wrapHeight = unref(wrapRef)?.offsetHeight ?? 0\n let formHeight = unref(formRef)?.offsetHeight ?? 0\n const actionHeight = unref(actionRef)?.offsetHeight ?? 0\n formHeight = formHeight > actionHeight ? formHeight : actionHeight\n if (formHeight && formMargin) {\n formHeight += formMargin\n }\n let paginationMargin = 0\n if (isBoolean(pagination) && !pagination) {\n paginationMargin = 0\n }\n const headerCellHeight =\n (tableEl.querySelector('.ant-table-title') as HTMLElement)?.offsetHeight ?? 0\n //表格高度 - formHeight (搜素或者自定义的slots) - 0 - TableMargin(外间距) - 内间距\n bottomIncludeBody =\n wrapHeight -\n formHeight -\n headerCellHeight -\n (tablePadding ? tablePadding : 0) -\n paginationMargin -\n TableMargin\n height = bottomIncludeBody - paginationHeight - footerHeight - headerHeight\n } else {\n // Table height from bottom\n bottomIncludeBody = getViewportOffset(headEl).bottomIncludeBody\n height =\n bottomIncludeBody -\n (resizeHeightOffset || 0) -\n (tablePadding ? tablePadding : 0) -\n paginationHeight -\n footerHeight -\n headerHeight\n }\n height = (height > maxHeight! ? (maxHeight as number) : height) ?? height\n setHeight(height)\n // debugger\n // console.log(bodyEl!.style.height, 'beforeCHange')\n if (isCanResizeParent) {\n bodyEl!.style.height = `${height}px`\n } else {\n if (!slots.footer) {\n bodyEl!.style.height = `${height}px`\n }\n }\n }\n const fnInit = () => {\n calcTableHeight()\n nextTick(() => {\n debounceRedoHeight()\n })\n }\n useWindowSizeFn(calcTableHeight, 280)\n\n const getScrollX = computed(() => {\n let width = 0\n if (unref(rowSelectionRef)) {\n width += 60\n }\n\n // TODO props ?? 0;\n const NORMAL_WIDTH = 150\n\n const columns = unref(columnsRef).filter((item) => !item.defaultHidden)\n columns.forEach((item) => {\n width += Number.parseInt(item.width as string) || 0\n })\n const unsetWidthColumns = columns.filter((item) => !Reflect.has(item, 'width'))\n\n const len = unsetWidthColumns.length\n if (len !== 0) {\n width += len * NORMAL_WIDTH\n }\n\n const table = unref(tableElRef)\n const tableWidth = table?.$el?.offsetWidth ?? 0\n return tableWidth > width ? '100%' : width\n })\n const getScrollRef = computed(() => {\n const tableHeight = unref(tableHeightRef)\n const { canResize, scroll } = unref(propsRef)\n return {\n x: unref(getScrollX),\n y: canResize ? tableHeight || 1 : null,\n scrollToFirstRowOnChange: true,\n ...scroll,\n }\n })\n return { getScrollRef, redoHeight, fnInit, keepScrollIns }\n}\n"],"names":[],"mappings":"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"}