UNPKG

@antv/s2

Version:

effective spreadsheet render core lib

82 lines 2.58 kB
import { isEmpty } from 'lodash'; /** * 是否在 视窗索引范围中 * @param x * @param y * @param indexes */ export const isXYInRange = (x, y, indexes) => { const [xMin, xMax, yMin, yMax] = indexes; return x >= xMin && x <= xMax && y >= yMin && y <= yMax; }; export const allIndexes = (indexes) => { const [minI, maxI, minJ, maxJ] = indexes; const r = []; for (let i = minI; i <= maxI; i += 1) { for (let j = minJ; j <= maxJ; j += 1) { r.push([i, j]); } } return r; }; /** * 计算两个 indexes 的 diff,获取 sourceIndexes -> targetIndexes 过程中新增的和移除的index * @param sourceIndexes * @param targetIndexes */ export const diffIndexes = (sourceIndexes, targetIndexes) => { const add = []; const remove = []; // source 为空 if (isEmpty(sourceIndexes)) { if (isEmpty(targetIndexes)) { // 都为空 return { add, remove }; } // target 不为空 return { add: allIndexes(targetIndexes), remove }; } // source 不为空,target 为空 if (isEmpty(targetIndexes)) { return { add, remove: allIndexes(sourceIndexes) }; } const [sourceMinI, sourceMaxI, sourceMinJ, sourceMaxJ] = sourceIndexes; const [targetMinI, targetMaxI, targetMinJ, targetMaxJ] = targetIndexes; // sourceIndexes -> targetIndexes 过程中,remove 掉的单元格 for (let i = sourceMinI; i <= sourceMaxI; i++) { for (let j = sourceMinJ; j <= sourceMaxJ; j++) { if (!isXYInRange(i, j, targetIndexes)) { remove.push([i, j]); } } } // sourceIndexes -> targetIndexes 过程中,add 新增的单元格 for (let i = targetMinI; i <= targetMaxI; i += 1) { for (let j = targetMinJ; j <= targetMaxJ; j += 1) { if (!isXYInRange(i, j, sourceIndexes)) { add.push([i, j]); } } } return { add, remove, }; }; /** * 计算 Panel 下所有子 Group的 Indexes Diff */ export const diffPanelIndexes = (sourceIndexes, targetIndexes) => { const allAdd = []; const allRemove = []; Object.keys(targetIndexes || {}).forEach((key) => { const { add, remove } = diffIndexes((sourceIndexes === null || sourceIndexes === void 0 ? void 0 : sourceIndexes[key]) || [], targetIndexes[key]); allAdd.push(...add); allRemove.push(...remove); }); return { add: allAdd, remove: allRemove, }; }; //# sourceMappingURL=indexes.js.map