Files
Aislo/resources/tester/spreadsheet/spreadsheet_grid_test.ts
T

163 lines
4.7 KiB
TypeScript

/* =============================================================================
* spreadsheet_grid_test.ts
* C(격자) 화면 시험 틀 — 병합 · 틀고정 · 숨김 · 폭 · hair 선 · 균등 분할 · 선택 영역 가운데 ·
* [Red] 음수 서식 · 1만 행 스크롤 때 DOM 칸 수를 ORCA 로 확인. D · 엔진이 없으니 이 파일이
* `SpreadsheetContext` 를 최소로 흉내 낸다(엔진 값은 안 씀 — 식 칸이 없음).
* ========================================================================== */
import { createGrid } from "../../../A00_Common/spreadsheet/spreadsheet_grid";
import type {
CalcEngine,
Command,
History,
Sheet,
Workbook,
} from "../../../A00_Common/spreadsheet/spreadsheet_types";
import { colIndex } from "../../../A00_Common/spreadsheet/spreadsheet_address";
import type {
GridHandle,
SpreadsheetContext,
} from "../../../A00_Common/spreadsheet/spreadsheet_view_types";
const sheet: Sheet = {
id: "s1",
이름: "시험",
칸: {
A1: { 값: "□격자 시험 — 병합 · 틀고정 · 숨김 · hair 선", 서식: 1 },
A3: { 값: "공종", 서식: 2 },
B3: { 값: "규격", 서식: 2 },
C3: { 값: "산출 내역", 서식: 2 },
G3: { 값: "단위", 서식: 2 },
H3: { 값: "수량", 서식: 2 },
A4: { 값: "터파기", 서식: 3 },
C4: { 값: "균등 분할 정렬 보기 글", 서식: 4 },
H4: { 값: -12.5, 서식: 6 },
A6: { 값: "선택 영역 가운데(centerContinuous) 보기", 서식: 5 },
A8: { 값: "hair 테두리 칸", 서식: 3 },
B8: { 값: 3.14159, 서식: 7 },
J10000: { 값: "맨 끝 칸(1만 행 스크롤 확인용)" },
},
comments: { H4: "메모 — ROUNDDOWN 끝수 확인" },
병합: ["A1:H1", "B8:C9"],
열: { A: { 폭: 14 }, D: { 숨김: true } },
행: { "1": { 높이: 22 }, "5": { 숨김: true } },
틀고정: { 행: 3, 열: 1 },
보기: { 눈금선: true },
};
const book: Workbook = {
종류: "통합문서",
판: 1,
열: "test",
기본: { 글꼴: "굴림", 크기: 10, 열폭: 8.43, 행높이: 15 },
서식: [
{},
{ 크기: 14, 굵게: true },
{
가로: "center",
세로: "center",
채움: "#F2F2F2",
테두리: {
위: { 선: "thin" },
아래: { 선: "thin" },
왼: { 선: "thin" },
오른: { 선: "thin" },
},
},
{ 세로: "center", 테두리: { 위: { 선: "hair" }, 아래: { 선: "hair" } } },
{ 가로: "distributed", 세로: "center" },
{ 가로: "centerContinuous", 세로: "center" },
{ 형식: "0.00;[Red]-0.00" },
{
형식: "0.0000",
테두리: {
위: { 선: "hair" },
아래: { 선: "hair" },
왼: { 선: "hair" },
오른: { 선: "hair" },
},
},
],
시트: [sheet],
활성: "s1",
};
function noopEngine(): CalcEngine {
return {
update: () => [],
rebuild: () => {},
value: () => null,
precedents: () => [],
snapshot: () => ({}),
};
}
function noopHistory(): History {
return {
push: () => {},
undo: () => null,
redo: () => null,
canUndo: () => false,
canRedo: () => false,
clear: () => {},
};
}
let grid!: GridHandle;
const ctx: SpreadsheetContext = {
root: document.getElementById("app")!,
book,
readOnly: false,
engine: noopEngine(),
history: noopHistory(),
selection: {
시트: "s1",
범위: [{ r0: 2, c0: 2, r1: 2, c1: 2 }],
활성: { r: 2, c: 2 },
기준: { r: 2, c: 2 },
},
sheet: () => sheet,
dispatch: (command: Command) => {
if (command.종류 === "열폭") {
const c0 = command.열[0];
const key = c0 >= 0 ? String.fromCharCode(65 + c0) : "A"; // 시험 데이터가 A~J 안쪽이라 단순 변환으로 충분
sheet.열 = { ...sheet.열, [key]: { ...sheet.열?.[key], 폭: command.폭 ?? undefined } };
} else if (command.종류 === "행높이") {
const r0 = command.행[0];
sheet.행 = {
...sheet.행,
[String(r0 + 1)]: { ...sheet.행?.[String(r0 + 1)], 높이: command.높이 ?? undefined },
};
}
grid.render();
},
undo: () => {},
redo: () => {},
select: () => grid.renderSelection(),
showSheet: () => {},
get grid() {
return grid;
},
editor: {
editing: () => false,
begin: () => {},
commit: () => {},
cancel: () => {},
sync: () => {},
},
} as SpreadsheetContext;
grid = createGrid(ctx);
ctx.root.append(grid.root);
// ORCA 수치 확인용 — 눈에 안 보이는 전역에 걸어 둠(콘솔 · eval 로 셈).
(window as unknown as { __gridTest: unknown }).__gridTest = {
grid,
sheet,
book,
ctx,
colIndex,
countCells: () => grid.root.querySelectorAll(".aislo-cell").length,
};