Merge remote-tracking branch 'origin/dev' into sub_laptop_7

# Conflicts:
#	M02_MasterTemplete/M02_MasterTemplete_UI_Side.ts
This commit is contained in:
2026-09-28 22:45:08 +09:00
17 changed files with 227 additions and 36 deletions
@@ -7,6 +7,7 @@ const sel = load(path.join(SS, "spreadsheet_selection.ts"));
const ed = load(path.join(SS, "spreadsheet_editor.ts"));
const mouse = load(path.join(SS, "spreadsheet_mouse.ts"));
const addr = load(path.join(SS, "spreadsheet_address.ts"));
const spill = load(path.join(SS, "spreadsheet_spill.ts"));
const sample = require(path.join(SS, "spreadsheet_sample.json"));
const s1 = sample.시트[0];
@@ -69,6 +70,21 @@ const out = {
(t) => ed.textToCell(t, { 서식: 4 }),
),
textToCellNoStyle: ed.textToCell("", {}),
// 긴 글 넘침 — 칸 0..5 폭 50 · 3 은 값 있음 · 칸 2 에서 폭 130 글
spill: (() => {
const row = (full) =>
new Map([0, 1, 2, 3, 4, 5].map((c) => [c, { w: 50, empty: !full.includes(c) }]));
const f = (sp) => sp && [sp.left, sp.right, sp.from, sp.to, sp.clipLeft, sp.clipRight];
return {
left: f(spill.spillOf(row([2, 3]), 2, 50, 130, "left")),
leftFree: f(spill.spillOf(row([2]), 2, 50, 130, "left")),
right: f(spill.spillOf(row([2]), 2, 50, 130, "right")),
center: f(spill.spillOf(row([2]), 2, 50, 130, "center")),
centerBlocked: f(spill.spillOf(row([2, 3]), 2, 50, 130, "center")),
fits: f(spill.spillOf(row([2]), 2, 50, 40, "left")),
edge: f(spill.spillOf(new Map([[2, { w: 50, empty: false }]]), 2, 50, 130, "left")),
};
})(),
// 친 모양대로 숫자 형식 · 식 대문자 · 닫는 괄호 채움(엑셀)
typedFormat: ["50%", "12.5%", "1,234.5", "1,000", "7", "abc", "1e3%"].map(ed.typedFormat),
upperFormula: ["sum(a1:b2)+round(c3,0)", "'시트 a'!a1*true", '"abc"&a1', "내이름*2"].map(
@@ -128,3 +128,14 @@ def test_upper_formula(r):
def test_close_parens(r):
assert r["closeParens"] == ["=(1+2)", "=SUM(1,ROUND(2,0))", None, None, '=")"&(1)']
def test_spill(r):
sp = r["spill"]
assert sp["left"] is None # 오른 칸(3)에 값 → 못 넘침
assert sp["leftFree"] == [0, 100, 2, 4, 0, 0] # 빈 칸 둘 덮음
assert sp["right"] == [100, 0, 0, 2, 0, 0]
assert sp["center"] == [40, 40, 1, 3, 0, 0]
assert sp["centerBlocked"] == [40, 40, 1, 2, 0, 40] # 오른쪽 막힘 → 오른쪽 반 잘라 냄
assert sp["fits"] is None
assert sp["edge"] is None # 판 끝(그린 칸 없음)
@@ -148,6 +148,18 @@ def test_좌측_새로_본떠_지우기는_표_도면_컨테이너_안에_하나
assert "양식: name" in side.split("function copyTemplate")[1] # 복사본 머리 이름 = 새 이름
def test_좌측_고름_표시는_열린_것_한_줄뿐():
"""카드 [도면 수정] 등 무엇으로 열든 편집 칸이 좌측 `paint` 를 부름 — 목록 · 열 줄을 함께 그림."""
side = _text(SIDE)
assert "picked" not in side # 따로 든 고름 상태 없음 — 편집 칸의 지금 열린 것만 봄
assert re.search(r"function paint\(\): void \{\s*paintList\(\);\s*paintColumns\(\);", side)
for fn in ("async function select(", "async function selectColumn("):
body = side.split(fn)[1].split("\n }\n")[0]
assert "paint" not in body, fn # 여기서 한쪽만 그리면 두 줄이 남음
assert re.search(r"sel = next;\s*onOpened\?\.\(\);", _text(MAIN))
assert "() => side.paint()" in _text(M02 / "M02_MasterTemplete_UI_Page.ts")
def test_리본_접힘_모드에서_탭으로_편_것은_밖을_누르면_다시_접힘():
ribbon = _text(ROOT / "B07_DesignDetail/openwebcad/src/ribbon/Ribbon.tsx")
assert "if (collapsed) setPeek(true);" in ribbon # 탭 = 잠깐 펼침(접힘 모드 유지)