feat(B07): 목록에서 연 도면 = 탭 — 열기 · 닫기 · 전환 · 이전/다음 · 탭 전환 때 미저장 편집 지킴(82-4)

- 공용 탭 줄: 마지막 한 탭 닫기 없음 · 지금 탭 미저장 점 · 탭 하나만 저장 표시 지움

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPJGtfXo6GMbcpiboQC4uK
This commit is contained in:
2026-10-08 12:12:58 +09:00
co-authored by Claude Opus 5.5
parent b15a945bf8
commit 4e18bca4e4
5 changed files with 82 additions and 18 deletions
+14 -5
View File
@@ -61,8 +61,10 @@ export interface CadTabs<D> {
select: (id: string) => Promise<boolean>;
/** 지금 장을 받아 두고 모든 탭 */
collect: () => Promise<CadTab<D>[]>;
/** 저장 뒤 — 받아 둔 편집본 · 미저장 표시를 지움(`keepDrawings` = 편집본은 둠) */
markClean: (keepDrawings?: boolean) => void;
/** 저장 뒤 — 받아 둔 편집본 · 미저장 표시를 지움(`tab` 없으면 모두 · `keepDrawings` = 편집본은 둠) */
markClean: (tab?: CadTab<D>, keepDrawings?: boolean) => void;
/** 지금 탭에 미저장 점(●) — 페이지 편집 통지(참만 · 거짓은 저장 뒤 `markClean`) */
markDirty: () => void;
/** 미저장 탭이 있나(지금 탭은 페이지 표시로) */
anyDirty: () => boolean;
}
@@ -227,7 +229,8 @@ export function createCadTabs<D>(options: CadTabsOptions<D>): CadTabs<D> {
rename(tab, label);
});
}
if ((features.remove || features.close) && !tab.fixed) {
// 닫기는 마지막 한 탭이면 없음(볼 장이 하나는 남음)
if ((features.remove || (features.close && list.length > 1)) && !tab.fixed) {
const x = document.createElement("button");
x.type = "button";
x.className = "cad-tabs__x";
@@ -318,13 +321,19 @@ export function createCadTabs<D>(options: CadTabsOptions<D>): CadTabs<D> {
await stash();
return list;
},
markClean: (keepDrawings = false) => {
for (const tab of list) {
markClean: (only, keepDrawings = false) => {
for (const tab of only ? [only] : list) {
tab.dirty = false;
if (!keepDrawings) delete tab.drawing;
}
render();
},
markDirty: () => {
const now = active();
if (!now || now.dirty) return;
now.dirty = true;
render();
},
anyDirty: () => list.some((tab) => tab.dirty),
};
}