{"version":3,"file":"table-grid.mjs","names":["computed","defineComponent","inject","nextTick","onActivated","provide","ref","unref","watch","createVNode","_createVNode","DynamicSizeGrid","FixedSizeGrid","isNumber","isObject","Header","TABLE_V2_GRID_INJECTION_KEY","TableV2InjectionKey","tableV2GridProps","sum","COMPONENT_NAME","useTableGrid","props","headerRef","bodyRef","scrollLeft","totalHeight","data","rowHeight","estimatedRowHeight","length","fixedRowHeight","fixedData","headerHeight","gridHeight","height","Math","max","hasHeader","itemKey","rowIndex","rowKey","onItemRendered","rowCacheStart","rowCacheEnd","rowVisibleStart","rowVisibleEnd","onRowsRendered","resetAfterRowIndex","index","forceUpdate","value","scrollTo","leftOrOptions","top","header$","body$","scrollToLeft","scrollTop","scrollToTop","scrollToRow","row","strategy","body","prevScrollLeft","scrollToItem","$forceUpdate","bodyWidth","resetAfter","columnIndex","TableGrid","name","setup","slots","expose","ns","states","round","getColumnWidth","cache","columns","useIsScrolling","scrollbarAlwaysOn","scrollbarEndGap","scrollbarStartGap","style","headerWidth","width","getRowHeight","onScroll","isDynamicRowEnabled","Grid","_headerHeight","e","class","default","params","rowData","min","dynamic","header","fixed"],"sources":["../../../../../../packages/components/table-v2/src/table-grid.tsx"],"sourcesContent":["import {\n  computed,\n  defineComponent,\n  inject,\n  nextTick,\n  onActivated,\n  provide,\n  ref,\n  unref,\n  watch,\n} from 'vue'\nimport {\n  DynamicSizeGrid,\n  FixedSizeGrid,\n} from '@element-plus/components/virtual-list'\nimport { isNumber, isObject } from '@element-plus/utils'\nimport { Header } from './components'\nimport { TABLE_V2_GRID_INJECTION_KEY, TableV2InjectionKey } from './tokens'\nimport { tableV2GridProps } from './grid'\nimport { sum } from './utils'\n\nimport type { UnwrapRef } from 'vue'\nimport type {\n  DynamicSizeGridInstance,\n  GridDefaultSlotParams,\n  GridItemKeyGetter,\n  GridItemRenderedEvtParams,\n  GridScrollOptions,\n  ResetAfterIndex,\n  Alignment as ScrollStrategy,\n} from '@element-plus/components/virtual-list'\nimport type { TableV2HeaderInstance } from './components'\nimport type { TableV2GridProps } from './grid'\n\nconst COMPONENT_NAME = 'ElTableV2Grid'\n\nconst useTableGrid = (props: TableV2GridProps) => {\n  const headerRef = ref<TableV2HeaderInstance>()\n  const bodyRef = ref<DynamicSizeGridInstance>()\n  const scrollLeft = ref(0)\n\n  const totalHeight = computed(() => {\n    const { data, rowHeight, estimatedRowHeight } = props\n\n    if (estimatedRowHeight) {\n      return\n    }\n\n    return data.length * (rowHeight as number)\n  })\n\n  const fixedRowHeight = computed(() => {\n    const { fixedData, rowHeight } = props\n\n    return (fixedData?.length || 0) * (rowHeight as number)\n  })\n\n  const headerHeight = computed(() => sum(props.headerHeight))\n\n  const gridHeight = computed(() => {\n    const { height } = props\n    return Math.max(0, height - unref(headerHeight) - unref(fixedRowHeight))\n  })\n\n  const hasHeader = computed(() => {\n    return unref(headerHeight) + unref(fixedRowHeight) > 0\n  })\n\n  const itemKey: GridItemKeyGetter = ({ data, rowIndex }) =>\n    data[rowIndex][props.rowKey]\n\n  function onItemRendered({\n    rowCacheStart,\n    rowCacheEnd,\n    rowVisibleStart,\n    rowVisibleEnd,\n  }: GridItemRenderedEvtParams) {\n    props.onRowsRendered?.({\n      rowCacheStart,\n      rowCacheEnd,\n      rowVisibleStart,\n      rowVisibleEnd,\n    })\n  }\n\n  function resetAfterRowIndex(index: number, forceUpdate: boolean) {\n    bodyRef.value?.resetAfterRowIndex(index, forceUpdate)\n  }\n\n  function scrollTo(x: number, y: number): void\n  function scrollTo(options: GridScrollOptions): void\n  function scrollTo(leftOrOptions: number | GridScrollOptions, top?: number) {\n    const header$ = unref(headerRef)\n    const body$ = unref(bodyRef)\n\n    if (isObject(leftOrOptions)) {\n      header$?.scrollToLeft(leftOrOptions.scrollLeft)\n      scrollLeft.value = leftOrOptions.scrollLeft!\n      body$?.scrollTo(leftOrOptions)\n    } else {\n      header$?.scrollToLeft(leftOrOptions)\n      scrollLeft.value = leftOrOptions\n      body$?.scrollTo({\n        scrollLeft: leftOrOptions,\n        scrollTop: top,\n      })\n    }\n  }\n\n  function scrollToTop(scrollTop: number) {\n    unref(bodyRef)?.scrollTo({\n      scrollTop,\n    })\n  }\n\n  function scrollToRow(row: number, strategy: ScrollStrategy) {\n    const body = unref(bodyRef)\n    if (!body) return\n\n    const prevScrollLeft = scrollLeft.value\n\n    body.scrollToItem(row, 0, strategy)\n\n    if (prevScrollLeft) {\n      scrollTo({\n        scrollLeft: prevScrollLeft,\n      })\n    }\n  }\n\n  function forceUpdate() {\n    unref(bodyRef)?.$forceUpdate()\n    unref(headerRef)?.$forceUpdate()\n  }\n\n  watch(\n    () => props.bodyWidth,\n    () => {\n      if (isNumber(props.estimatedRowHeight))\n        bodyRef.value?.resetAfter({ columnIndex: 0 }, false)\n    }\n  )\n\n  return {\n    bodyRef,\n    forceUpdate,\n    fixedRowHeight,\n    gridHeight,\n    hasHeader,\n    headerHeight,\n    headerRef,\n    totalHeight,\n\n    itemKey,\n    onItemRendered,\n    resetAfterRowIndex,\n    scrollTo,\n    scrollToTop,\n    scrollToRow,\n    scrollLeft,\n  }\n}\n\nconst TableGrid = defineComponent({\n  name: COMPONENT_NAME,\n  props: tableV2GridProps,\n  setup(props, { slots, expose }) {\n    const { ns } = inject(TableV2InjectionKey)!\n\n    const {\n      bodyRef,\n      fixedRowHeight,\n      gridHeight,\n      hasHeader,\n      headerRef,\n      headerHeight,\n      totalHeight,\n\n      forceUpdate,\n      itemKey,\n      onItemRendered,\n      resetAfterRowIndex,\n      scrollTo,\n      scrollToTop,\n      scrollToRow,\n      scrollLeft,\n    } = useTableGrid(props)\n\n    provide(TABLE_V2_GRID_INJECTION_KEY, scrollLeft)\n\n    onActivated(async () => {\n      await nextTick()\n      const scrollTop = bodyRef.value?.states.scrollTop\n      scrollTop && scrollToTop(Math.round(scrollTop) + 1)\n    })\n\n    expose({\n      forceUpdate,\n      /**\n       * @description fetch total height\n       */\n      totalHeight,\n      /**\n       * @description scroll to a position\n       */\n      scrollTo,\n      /**\n       * @description scroll vertically to position y\n       */\n      scrollToTop,\n      /**\n       * @description scroll to a given row\n       * @params row {Number} which row to scroll to\n       * @params strategy {ScrollStrategy} use what strategy to scroll to\n       */\n      scrollToRow,\n      /**\n       * @description reset rendered state after row index\n       */\n      resetAfterRowIndex,\n    })\n\n    const getColumnWidth = () => props.bodyWidth\n\n    return () => {\n      const {\n        cache,\n        columns,\n        data,\n        fixedData,\n        useIsScrolling,\n        scrollbarAlwaysOn,\n        scrollbarEndGap,\n        scrollbarStartGap,\n        style,\n        rowHeight,\n        bodyWidth,\n        estimatedRowHeight,\n        headerWidth,\n        height,\n        width,\n\n        getRowHeight,\n        onScroll,\n      } = props\n\n      const isDynamicRowEnabled = isNumber(estimatedRowHeight)\n      const Grid = isDynamicRowEnabled ? DynamicSizeGrid : FixedSizeGrid\n      const _headerHeight = unref(headerHeight)\n\n      return (\n        <div role=\"table\" class={[ns.e('table'), props.class]} style={style}>\n          <Grid\n            ref={bodyRef}\n            // special attrs\n            data={data}\n            useIsScrolling={useIsScrolling}\n            itemKey={itemKey}\n            // column attrs\n            columnCache={0}\n            columnWidth={isDynamicRowEnabled ? getColumnWidth : bodyWidth}\n            totalColumn={1}\n            // row attrs\n            totalRow={data.length}\n            rowCache={cache}\n            rowHeight={isDynamicRowEnabled ? getRowHeight : rowHeight}\n            // DOM attrs\n            width={width}\n            height={unref(gridHeight)}\n            class={ns.e('body')}\n            role=\"rowgroup\"\n            scrollbarStartGap={scrollbarStartGap}\n            scrollbarEndGap={scrollbarEndGap}\n            scrollbarAlwaysOn={scrollbarAlwaysOn}\n            // handlers\n            onScroll={onScroll}\n            onItemRendered={onItemRendered}\n            perfMode={false}\n          >\n            {{\n              default: (params: GridDefaultSlotParams) => {\n                const rowData = data[params.rowIndex]\n                return slots.row?.({\n                  ...params,\n                  columns,\n                  rowData,\n                })\n              },\n            }}\n          </Grid>\n          {unref(hasHeader) && (\n            <Header\n              ref={headerRef}\n              class={ns.e('header-wrapper')}\n              columns={columns}\n              headerData={data}\n              headerHeight={props.headerHeight}\n              fixedHeaderData={fixedData}\n              rowWidth={headerWidth}\n              rowHeight={rowHeight}\n              width={width}\n              height={Math.min(_headerHeight + unref(fixedRowHeight), height)}\n            >\n              {{\n                dynamic: slots.header,\n                fixed: slots.row,\n              }}\n            </Header>\n          )}\n        </div>\n      )\n    }\n  },\n})\n\nexport default TableGrid\n\nexport type TableGridRowSlotParams = {\n  columns: TableV2GridProps['columns']\n  rowData: any\n} & GridDefaultSlotParams\n\nexport type TableGridInstance = InstanceType<typeof TableGrid> &\n  UnwrapRef<{\n    forceUpdate: () => void\n    /**\n     * @description fetch total height\n     */\n    totalHeight: number\n\n    /**\n     * @description scrollTo a position\n     * @param { number | ScrollToOptions } arg1\n     * @param { number } arg2\n     */\n    scrollTo(leftOrOptions: number | GridScrollOptions, top?: number): void\n\n    /**\n     * @description scroll vertically to position y\n     */\n    scrollToTop(scrollTop: number): void\n    /**\n     * @description scroll to a given row\n     * @params row {Number} which row to scroll to\n     * @params @optional strategy {ScrollStrategy} use what strategy to scroll to\n     */\n    scrollToRow(row: number, strategy: ScrollStrategy): void\n    /**\n     * @description reset rendered state after row index\n     * @param { number } rowIndex\n     * @param { boolean } forceUpdate\n     */\n    resetAfterRowIndex: ResetAfterIndex\n  }>\n"],"mappings":"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"}