|
@@ -0,0 +1,55 @@
|
|
|
+import type { ComputedRef, Ref } from 'vue';
|
|
|
+import { nextTick, unref } from 'vue';
|
|
|
+import { warn } from '/@/utils/log';
|
|
|
+
|
|
|
+export function useTableScrollTo(
|
|
|
+ tableElRef: Ref<ComponentRef>,
|
|
|
+ getDataSourceRef: ComputedRef<Recordable[]>,
|
|
|
+) {
|
|
|
+ let bodyEl: HTMLElement | null;
|
|
|
+
|
|
|
+ async function findTargetRowToScroll(targetRowData: Recordable) {
|
|
|
+ const { id } = targetRowData;
|
|
|
+ const targetRowEl: HTMLElement | null | undefined = bodyEl?.querySelector(
|
|
|
+ `[data-row-key="${id}"]`,
|
|
|
+ );
|
|
|
+ //Add a delay to get new dataSource
|
|
|
+ await nextTick();
|
|
|
+ bodyEl?.scrollTo({
|
|
|
+ top: targetRowEl?.offsetTop ?? 0,
|
|
|
+ behavior: 'smooth',
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function scrollTo(pos: string): void {
|
|
|
+ const table = unref(tableElRef);
|
|
|
+ if (!table) return;
|
|
|
+
|
|
|
+ const tableEl: Element = table.$el;
|
|
|
+ if (!tableEl) return;
|
|
|
+
|
|
|
+ if (!bodyEl) {
|
|
|
+ bodyEl = tableEl.querySelector('.ant-table-body');
|
|
|
+ if (!bodyEl) return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const dataSource = unref(getDataSourceRef);
|
|
|
+ if (!dataSource) return;
|
|
|
+
|
|
|
+ // judge pos type
|
|
|
+ if (pos === 'top') {
|
|
|
+ findTargetRowToScroll(dataSource[0]);
|
|
|
+ } else if (pos === 'bottom') {
|
|
|
+ findTargetRowToScroll(dataSource[dataSource.length - 1]);
|
|
|
+ } else {
|
|
|
+ const targetRowData = dataSource.find((data) => data.id === pos);
|
|
|
+ if (targetRowData) {
|
|
|
+ findTargetRowToScroll(targetRowData);
|
|
|
+ } else {
|
|
|
+ warn(`id: ${pos} doesn't exist`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return { scrollTo };
|
|
|
+}
|