{"version":3,"file":"table-grid.mjs","sources":["../../../../../../packages/components/table-v2/src/table-grid.tsx"],"sourcesContent":["import { computed, defineComponent, inject, ref, unref } from 'vue'\nimport { DynamicSizeGrid, FixedSizeGrid } from '@bigin/components/virtual-list'\nimport { isNumber, isObject } from '@bigin/utils'\nimport { Header } from './components'\nimport { 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 '@bigin/components/virtual-list'\nimport type { TableV2HeaderInstance } from './components'\nimport type { TableV2GridProps } from './grid'\n\nconst COMPONENT_NAME = 'BTableV2Grid'\n\nconst useTableGrid = (props: TableV2GridProps) => {\n  const headerRef = ref<TableV2HeaderInstance>()\n  const bodyRef = ref<DynamicSizeGridInstance>()\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 (!header$ || !body$) return\n\n    if (isObject(leftOrOptions)) {\n      header$.scrollToLeft(leftOrOptions.scrollLeft)\n      body$.scrollTo(leftOrOptions)\n    } else {\n      header$.scrollToLeft(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    unref(bodyRef)?.scrollToItem(row, 1, strategy)\n  }\n\n  function forceUpdate() {\n    unref(bodyRef)?.$forceUpdate()\n    unref(headerRef)?.$forceUpdate()\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  }\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    } = useTableGrid(props)\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            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"],"names":["COMPONENT_NAME","useTableGrid","props","headerRef","ref","bodyRef","totalHeight","computed","data","rowHeight","estimatedRowHeight","length","fixedRowHeight","fixedData","headerHeight","sum","gridHeight","height","Math","max","unref","hasHeader","itemKey","rowIndex","rowKey","onItemRendered","rowCacheStart","rowCacheEnd","rowVisibleStart","rowVisibleEnd","onRowsRendered","resetAfterRowIndex","index","forceUpdate","value","scrollTo","leftOrOptions","top","header$","body$","isObject","scrollToLeft","scrollLeft","scrollTop","scrollToTop","scrollToRow","row","strategy","scrollToItem","$forceUpdate","TableGrid","defineComponent","name","tableV2GridProps","setup","slots","expose","ns","inject","TableV2InjectionKey","getColumnWidth","bodyWidth","cache","columns","useIsScrolling","scrollbarAlwaysOn","scrollbarEndGap","scrollbarStartGap","style","headerWidth","width","getRowHeight","onScroll","isDynamicRowEnabled","isNumber","Grid","DynamicSizeGrid","FixedSizeGrid","_headerHeight","_createVNode","e","class","default","params","rowData","Header","min","dynamic","header","fixed"],"mappings":"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"}