Files
xk-admin/apps/web-antd/src/components/canvas-spreadsheet/commands/FillRangeCommand.ts
李琦 a38da5ce92
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
1. Excel交互组件封装优化
2026-06-26 12:52:26 +08:00

65 lines
1.5 KiB
TypeScript

import type { CellRange, SpreadsheetCommand } from '../types';
export function createFillRangeCommand(
persistBatch: (
changes: Array<{ row: number; col: number; value: unknown }>,
) => void | Promise<void>,
before: Array<{ row: number; col: number; value: unknown }>,
after: Array<{ row: number; col: number; value: unknown }>,
): SpreadsheetCommand {
return {
label: 'fillRange',
undo: () => persistBatch(before),
redo: () => persistBatch(after),
};
}
export function normalizeRange(range: CellRange): CellRange {
return {
startRow: Math.min(range.startRow, range.endRow),
startCol: Math.min(range.startCol, range.endCol),
endRow: Math.max(range.startRow, range.endRow),
endCol: Math.max(range.startCol, range.endCol),
};
}
export function iterateRange(
range: CellRange,
fn: (row: number, col: number) => void,
) {
const r = normalizeRange(range);
for (let row = r.startRow; row <= r.endRow; row += 1) {
for (let col = r.startCol; col <= r.endCol; col += 1) {
fn(row, col);
}
}
}
export function iterateRanges(
ranges: CellRange[],
fn: (row: number, col: number) => void,
) {
for (const range of ranges) {
iterateRange(range, fn);
}
}
export function rangesContainCell(
ranges: CellRange[],
row: number,
col: number,
): boolean {
for (const range of ranges) {
const r = normalizeRange(range);
if (
row >= r.startRow &&
row <= r.endRow &&
col >= r.startCol &&
col <= r.endCol
) {
return true;
}
}
return false;
}