Files
IronCalc/webapp/src/components/util.ts
Nicolás Hatcher b7f7e73824 FIX: Ranges selected should be absolute.
Sheet1!$D$1 rather than Sheet1!D1

There reason is that if we extend a formula that has those will behave in
surprising ways.
2025-01-01 18:08:52 +01:00

82 lines
2.3 KiB
TypeScript

import type { Area, Cell } from "./types";
import { type SelectedView, columnNameFromNumber } from "@ironcalc/wasm";
/**
* Returns true if the keypress should start editing
*/
export function isEditingKey(key: string): boolean {
if (key.length !== 1) {
return false;
}
const code = key.codePointAt(0) ?? 0;
if (code > 0 && code < 255) {
return true;
}
return false;
}
export type NavigationKey =
| "ArrowRight"
| "ArrowLeft"
| "ArrowDown"
| "ArrowUp"
| "Home"
| "End";
export const isNavigationKey = (key: string): key is NavigationKey =>
["ArrowRight", "ArrowLeft", "ArrowDown", "ArrowUp", "Home", "End"].includes(
key
);
export const getCellAddress = (selectedArea: Area, selectedCell: Cell) => {
const isSingleCell =
selectedArea.rowStart === selectedArea.rowEnd &&
selectedArea.columnEnd === selectedArea.columnStart;
return isSingleCell
? `${columnNameFromNumber(selectedCell.column)}${selectedCell.row}`
: `${columnNameFromNumber(selectedArea.columnStart)}${
selectedArea.rowStart
}:${columnNameFromNumber(selectedArea.columnEnd)}${selectedArea.rowEnd}`;
};
export function rangeToStr(
range: {
sheet: number;
rowStart: number;
rowEnd: number;
columnStart: number;
columnEnd: number;
},
referenceSheet: number,
referenceName: string
): string {
const { sheet, rowStart, rowEnd, columnStart, columnEnd } = range;
const sheetName = sheet === referenceSheet ? "" : `'${referenceName}'!`;
if (rowStart === rowEnd && columnStart === columnEnd) {
return `${sheetName}${columnNameFromNumber(columnStart)}${rowStart}`;
}
return `${sheetName}${columnNameFromNumber(
columnStart
)}${rowStart}:${columnNameFromNumber(columnEnd)}${rowEnd}`;
}
// Returns the full range of the selected view as a string in absolute form
// e.g. 'Sheet1!$A$1:$B$2' or 'Sheet1!$A$1'
export function getFullRangeToString(
selectedView: SelectedView,
worksheetNames: string[]
): string {
const [rowStart, columnStart, rowEnd, columnEnd] = selectedView.range;
const sheetName = `${worksheetNames[selectedView.sheet]}`;
if (rowStart === rowEnd && columnStart === columnEnd) {
return `${sheetName}!$${columnNameFromNumber(columnStart)}$${rowStart}`;
}
return `${sheetName}!$${columnNameFromNumber(
columnStart
)}$${rowStart}:$${columnNameFromNumber(columnEnd)}$${rowEnd}`;
}