- 새 Hopyo_Import.ts(머리 막대 층 · 안 이은 줄 배지 · [끝내기] · 떠남 지움) · Hopyo_Wizard.ts 지움 - Hopyo_Side.ts = 올림 · 층 작은 고름(둘 이상일 때만) · 작업 중 줄 · 다른 엑셀 물음 - Hopyo_Sheet.ts = 몸(buildHopyoSheet) + 모달 껍데기 · 만들기 셋 → 새 Hopyo_SheetMake.ts · [삭제] 걷음 · 찾기 · 체크 부품으로 - 흠 셋: 안 이은 줄 0 오표시(빈 호표 번) · 맞춤 셈 중 멈춤(3 초 저절로 다시) · 좁은 판 줄 짓눌림(시트 아래 줄 판 자리) - 시험: 785-4 지킴 시험 새로 · 낡은 마법사 · 모달 [삭제] · 좁은 꼴 인자 대조를 새 파일 · 새 길로 고침(Wizard 삭제 · SheetMake 이동 · narrow 걷음)
86 lines
3.9 KiB
TypeScript
86 lines
3.9 KiB
TypeScript
/* =============================================================================
|
|
* M02_MasterTemplete_Hopyo_SheetSk.ts
|
|
* 엑셀 보기 창 오른쪽 판 바꾸기(PLAN 780-2 · 요구 627) — 탭 따라:
|
|
* · 일위대가표 = 호표 목록(`Hopyo_Sheet` 판 그대로) · 단가산출표 · 단가산출 상세 = 단가산출 목록
|
|
* (`sangeunStep` 한 벌 · 같은 캐시 · [확인] → [확인한 것 옮기기] · [줄 n] = 시트 아래 줄 판 `lines` — 785-4)
|
|
* · 목록 블록 줄 누름 → 지금 탭의 그 블록 자리(단가산출표 = 목록 행 · 상세 = 블록 범위 · [◂ 뒤로] 쌓임)
|
|
* · 시트 칸 고름 → 그 행 블록을 목록에서 강조(`SheetNav.blockAt`)
|
|
* · 단가산출 칸은 처음 단가산출 탭에 올 때 지음(판정 셈이 무거움) · 만들 층 ≠ 파일 층 · 쓰기 권한 없음 = 보기만
|
|
* ========================================================================== */
|
|
|
|
import { el } from "@ui/ui_template_elements";
|
|
import type { HopyoScope } from "./M02_MasterTemplete_Hopyo_Api";
|
|
import type { SheetNav } from "./M02_MasterTemplete_Hopyo_SheetNav";
|
|
import { sangeunStep, type SkStep } from "./M02_MasterTemplete_Hopyo_WizardSk";
|
|
|
|
export interface SheetSkOptions {
|
|
scope: HopyoScope;
|
|
key: string;
|
|
파일: string;
|
|
target: HopyoScope;
|
|
canWrite: boolean;
|
|
nav: SheetNav;
|
|
/** 호표 목록 판 — 단가산출 탭이면 숨김 · 그 뒤에 단가산출 판을 붙임 */
|
|
side: HTMLElement;
|
|
/** 시트 아래 줄 판 자리 */
|
|
lines: HTMLElement;
|
|
/** 판정 · 옮김 뒤(부르는 쪽 끝내기 글) */
|
|
onChange?: () => void;
|
|
}
|
|
|
|
const sameLayer = (a: HopyoScope, b: HopyoScope): boolean =>
|
|
a.layer === b.layer && (a.owner ?? null) === (b.owner ?? null);
|
|
|
|
export function createSheetSk(opt: SheetSkOptions) {
|
|
const root = el("div", { className: "m02-hopyo-sheet__side m02-hopyo-sheet__sk" });
|
|
root.setAttribute("data-hopyo-sk-side", "");
|
|
root.hidden = true;
|
|
opt.side.after(root);
|
|
let step: SkStep | null = null;
|
|
let sheet = "";
|
|
|
|
/** 단가산출 칸 — 처음 필요할 때 지음 */
|
|
function ensure(): SkStep {
|
|
if (!step) {
|
|
const readOnly = !opt.canWrite || !sameLayer(opt.scope, opt.target);
|
|
step = sangeunStep(opt.scope, opt.key, opt.파일, opt.onChange, { lines: opt.lines, onRow, readOnly }); // prettier-ignore
|
|
root.append(step.root);
|
|
}
|
|
return step;
|
|
}
|
|
|
|
/** 블록 줄 누름 — 지금 탭에서 그 블록 자리 · 없으면 다른 단가산출 탭 */
|
|
function onRow(no: number): void {
|
|
const list = opt.nav.role(sheet) === "단가산출표";
|
|
const spot = list
|
|
? (opt.nav.spotOf(no, "단가산출표") ?? opt.nav.spotOf(no, "단가산출상세"))
|
|
: (opt.nav.spotOf(no, "단가산출상세") ?? opt.nav.spotOf(no, "단가산출표"));
|
|
if (spot) opt.nav.jumpTo(spot.시트, spot.행);
|
|
}
|
|
|
|
return {
|
|
root,
|
|
/** 아직 안 옮긴 블록 수 · 판정 전 null */
|
|
count: (): ReturnType<SkStep["count"]> => step?.count() ?? null,
|
|
/** 그 블록으로 뜀 — 단가산출 상세(없으면 목록) 그 자리 · 줄 판 열림(안 이은 줄 창 [단가산출 걸음에서 확인]) */
|
|
show(번: number): void {
|
|
const spot = opt.nav.spotOf(번, "단가산출상세") ?? opt.nav.spotOf(번, "단가산출표");
|
|
if (spot) opt.nav.jumpTo(spot.시트, spot.행);
|
|
ensure().show(번);
|
|
},
|
|
/** 시트 고름 · 탭 바꿈 — 판 바꾸기 · 강조 */
|
|
at(sel: { 시트: string; 칸: string }): void {
|
|
sheet = sel.시트;
|
|
const role = opt.nav.role(sel.시트);
|
|
const sk = role === "단가산출표" || role === "단가산출상세";
|
|
opt.side.hidden = sk;
|
|
root.hidden = !sk;
|
|
opt.side.parentElement?.classList.toggle("is-sk", sk);
|
|
if (!sk) return;
|
|
ensure().mark(opt.nav.blockAt(sel.시트, Number(/\d+/.exec(sel.칸)?.[0] ?? 0)));
|
|
},
|
|
};
|
|
}
|
|
|
|
export type SheetSk = ReturnType<typeof createSheetSk>;
|