element-plus
Version:
A Component Library for Vue 3
124 lines (121 loc) • 4.13 kB
JavaScript
import { getCurrentInstance, shallowRef, ref, computed, unref, watch } from 'vue';
import { debounce } from 'lodash-unified';
import '../../../../utils/index.mjs';
import { FixedDir } from '../constants.mjs';
import { isNumber } from '@vueuse/core';
const useRow = (props, { mainTableRef, leftTableRef, rightTableRef, onMaybeEndReached }) => {
const vm = getCurrentInstance();
const { emit } = vm;
const isResetting = shallowRef(false);
const hoveringRowKey = shallowRef(null);
const expandedRowKeys = ref(props.defaultExpandedRowKeys || []);
const lastRenderedRowIndex = ref(-1);
const resetIndex = shallowRef(null);
const rowHeights = ref({});
const pendingRowHeights = ref({});
const leftTableHeights = shallowRef({});
const mainTableHeights = shallowRef({});
const rightTableHeights = shallowRef({});
const isDynamic = computed(() => isNumber(props.estimatedRowHeight));
function onRowsRendered(params) {
var _a;
(_a = props.onRowsRendered) == null ? void 0 : _a.call(props, params);
if (params.rowCacheEnd > unref(lastRenderedRowIndex)) {
lastRenderedRowIndex.value = params.rowCacheEnd;
}
}
function onRowHovered({ hovered, rowKey }) {
hoveringRowKey.value = hovered ? rowKey : null;
}
function onRowExpanded({
expanded,
rowData,
rowIndex,
rowKey
}) {
var _a, _b;
const _expandedRowKeys = [...unref(expandedRowKeys)];
const currentKeyIndex = _expandedRowKeys.indexOf(rowKey);
if (expanded) {
if (currentKeyIndex === -1)
_expandedRowKeys.push(rowKey);
} else {
if (currentKeyIndex > -1)
_expandedRowKeys.splice(currentKeyIndex, 1);
}
expandedRowKeys.value = _expandedRowKeys;
emit("update:expandedRowKeys", _expandedRowKeys);
(_a = props.onRowExpand) == null ? void 0 : _a.call(props, {
expanded,
rowData,
rowIndex,
rowKey
});
(_b = props.onExpandedRowsChange) == null ? void 0 : _b.call(props, _expandedRowKeys);
}
const flushingRowHeights = debounce(() => {
var _a, _b, _c, _d;
isResetting.value = true;
rowHeights.value = { ...unref(rowHeights), ...unref(pendingRowHeights) };
resetAfterIndex(unref(resetIndex), false);
pendingRowHeights.value = {};
resetIndex.value = null;
(_a = mainTableRef.value) == null ? void 0 : _a.forceUpdate();
(_b = leftTableRef.value) == null ? void 0 : _b.forceUpdate();
(_c = rightTableRef.value) == null ? void 0 : _c.forceUpdate();
(_d = vm.proxy) == null ? void 0 : _d.$forceUpdate();
isResetting.value = false;
}, 0);
function resetAfterIndex(index, forceUpdate = false) {
if (!unref(isDynamic))
return;
[mainTableRef, leftTableRef, rightTableRef].forEach((tableRef) => {
const table = unref(tableRef);
if (table)
table.resetAfterRowIndex(index, forceUpdate);
});
}
function resetHeights(rowKey, height, rowIdx) {
const resetIdx = unref(resetIndex);
if (resetIdx === null) {
resetIndex.value = rowIdx;
} else {
if (resetIdx > rowIdx) {
resetIndex.value = rowIdx;
}
}
pendingRowHeights.value[rowKey] = height;
}
function onRowHeightChange({ rowKey, height, rowIndex }, fixedDir) {
if (!fixedDir) {
mainTableHeights.value[rowKey] = height;
} else {
if (fixedDir === FixedDir.RIGHT) {
rightTableHeights.value[rowKey] = height;
} else {
leftTableHeights.value[rowKey] = height;
}
}
const maximumHeight = Math.max(...[leftTableHeights, rightTableHeights, mainTableHeights].map((records) => records.value[rowKey] || 0));
if (unref(rowHeights)[rowKey] !== maximumHeight) {
resetHeights(rowKey, maximumHeight, rowIndex);
flushingRowHeights();
}
}
watch(lastRenderedRowIndex, () => onMaybeEndReached());
return {
hoveringRowKey,
expandedRowKeys,
lastRenderedRowIndex,
isDynamic,
isResetting,
rowHeights,
resetAfterIndex,
onRowExpanded,
onRowHovered,
onRowsRendered,
onRowHeightChange
};
};
export { useRow };
//# sourceMappingURL=use-row.mjs.map