feat(M02): 도면 상세 머리 📂 → 글 단추 [파일 업로드] — 구조물 조합 층 단추 꼴 · 실무자료와 같은 종류 · 도움말 글 · 시험 (362-2)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014utrjfoW831Vc5wJUd13kL
This commit is contained in:
@@ -40,7 +40,7 @@ export const CARD_HELP: Record<"structure" | "labor" | "area", CardHelp> = {
|
|||||||
features: [
|
features: [
|
||||||
SAVE,
|
SAVE,
|
||||||
take("도면"),
|
take("도면"),
|
||||||
["수정", "도면 상세(전체 편집 화면)를 엶 — 파일 불러오기(DXF · DWG)는 여기"],
|
["수정", "도면 상세(전체 편집 화면)를 엶 — 파일 업로드(DXF · DWG)는 여기"],
|
||||||
clear("도면"),
|
clear("도면"),
|
||||||
FOLD,
|
FOLD,
|
||||||
],
|
],
|
||||||
@@ -98,7 +98,7 @@ export const CARD_HELP: Record<"structure" | "labor" | "area", CardHelp> = {
|
|||||||
|
|
||||||
/** 상세에만 있는 단추 줄(49-7) — 카드 도움말 글 한 벌 뒤에 더함 */
|
/** 상세에만 있는 단추 줄(49-7) — 카드 도움말 글 한 벌 뒤에 더함 */
|
||||||
const DETAIL_ONLY: Record<keyof typeof CARD_HELP, [string, string][]> = {
|
const DETAIL_ONLY: Record<keyof typeof CARD_HELP, [string, string][]> = {
|
||||||
structure: [["파일 불러오기", "DXF · DWG 파일을 도면으로 불러옴(상세 머리 📂)"]],
|
structure: [["파일 업로드", "DXF · DWG 파일을 도면으로 불러옴(상세 머리 [파일 업로드])"]],
|
||||||
labor: [],
|
labor: [],
|
||||||
area: [["도면으로 보내기", "고른 범위를 도면 표로 보냄(상세 머리)"]],
|
area: [["도면으로 보내기", "고른 범위를 도면 표로 보냄(상세 머리)"]],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export interface DrawingTemplateOptions {
|
|||||||
projectId?: string | null;
|
projectId?: string | null;
|
||||||
/** 저장 안 한 고침이 생기면 true — CAD 편집 · 작도 영역 값 바꿈. */
|
/** 저장 안 한 고침이 생기면 true — CAD 편집 · 작도 영역 값 바꿈. */
|
||||||
onChanged?: (dirty: boolean) => void;
|
onChanged?: (dirty: boolean) => void;
|
||||||
/** 페이지 제목 줄 안의 빈 칸 — 있으면 작도 영역 칸 · 파일 불러오기를 거기 한 줄로 놓는다. */
|
/** 페이지 제목 줄 안의 빈 칸 — 있으면 작도 영역 칸 · [파일 업로드]를 거기 한 줄로 놓는다. */
|
||||||
headerSlot?: HTMLElement;
|
headerSlot?: HTMLElement;
|
||||||
/** CAD 좌측 패널(특성 · 도면층)을 접힌 채로 연다 — 누르면 펼침(구조물 도면 미리보기). */
|
/** CAD 좌측 패널(특성 · 도면층)을 접힌 채로 연다 — 누르면 펼침(구조물 도면 미리보기). */
|
||||||
panelsCollapsed?: boolean;
|
panelsCollapsed?: boolean;
|
||||||
@@ -51,7 +51,7 @@ export interface DrawingTemplateOptions {
|
|||||||
noArea?: boolean;
|
noArea?: boolean;
|
||||||
/** B07 도각을 외곽 좌하단 (0,0) 에 얹음 — 잠금 층 · 보여주기만(돌려줄 때 뺌 · 저장 안 됨). */
|
/** B07 도각을 외곽 좌하단 (0,0) 에 얹음 — 잠금 층 · 보여주기만(돌려줄 때 뺌 · 저장 안 됨). */
|
||||||
frame?: boolean;
|
frame?: boolean;
|
||||||
/** 파일 불러오기(📂) 단추를 안 둠 — 집계표 카드 미리보기(불러오기는 도면 상세에서만). */
|
/** [파일 업로드] 단추를 안 둠 — 집계표 카드 미리보기(불러오기는 도면 상세에서만). */
|
||||||
noImport?: boolean;
|
noImport?: boolean;
|
||||||
/** 장id(82-1) — 자동백업 칸을 장마다 나눔(1장 = 빈 값 · 옛 칸 그대로) */
|
/** 장id(82-1) — 자동백업 칸을 장마다 나눔(1장 = 빈 값 · 옛 칸 그대로) */
|
||||||
sheet?: string;
|
sheet?: string;
|
||||||
@@ -321,11 +321,13 @@ export function mountDrawingTemplate(
|
|||||||
.finally(() => (importButton.disabled = false));
|
.finally(() => (importButton.disabled = false));
|
||||||
});
|
});
|
||||||
const importButton = createButton({
|
const importButton = createButton({
|
||||||
label: "📂",
|
label: "파일 업로드",
|
||||||
variant: "ghost",
|
variant: "filled",
|
||||||
onClick: () => fileInput.click(),
|
onClick: () => fileInput.click(),
|
||||||
});
|
});
|
||||||
importButton.title = importButton.ariaLabel = "파일 불러오기 (DXF · DWG)";
|
// 구조물 조합 층 단추([마스터])와 같은 꼴 — 실무자료 [파일 업로드]와 같은 종류(362-2)
|
||||||
|
importButton.classList.add("m02-layers__btn");
|
||||||
|
importButton.title = importButton.ariaLabel = "파일 업로드 (DXF · DWG)";
|
||||||
actions.append(importButton, fileInput);
|
actions.append(importButton, fileInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ function mountStructure(
|
|||||||
originMarker: true, // 좌표 0,0 기준점 십자
|
originMarker: true, // 좌표 0,0 기준점 십자
|
||||||
noArea: true, // 작도 영역 칸 없음
|
noArea: true, // 작도 영역 칸 없음
|
||||||
frame: true, // 도각 = 보여주기만 · 외곽 좌하단 (0,0)(56장)
|
frame: true, // 도각 = 보여주기만 · 외곽 좌하단 (0,0)(56장)
|
||||||
noImport: true, // 파일 불러오기는 도면 상세에서만(47-2)
|
noImport: true, // 파일 업로드는 도면 상세에서만(47-2)
|
||||||
pickTabs: true,
|
pickTabs: true,
|
||||||
...hooks,
|
...hooks,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ def test_도움말_제목_옆_네_절():
|
|||||||
|
|
||||||
|
|
||||||
def test_미리보기_파일_불러오기_없음():
|
def test_미리보기_파일_불러오기_없음():
|
||||||
"""47-2 — 도면 카드 미리보기엔 📂 없음 · 도면 상세(전체 편집)는 그대로."""
|
"""47-2 — 도면 카드 미리보기엔 [파일 업로드] 없음 · 도면 상세(전체 편집)는 그대로."""
|
||||||
drawing = _text("M02_MasterTemplete_Drawing.ts")
|
drawing = _text("M02_MasterTemplete_Drawing.ts")
|
||||||
assert "const canImport = !readOnly && options.noImport !== true;" in drawing
|
assert "const canImport = !readOnly && options.noImport !== true;" in drawing
|
||||||
assert "noImport: true," in _text("M02_MasterTemplete_DrawingCard.ts")
|
assert "noImport: true," in _text("M02_MasterTemplete_DrawingCard.ts")
|
||||||
@@ -178,3 +178,13 @@ def test_옵션_줄_구분_이름_별칭_병합():
|
|||||||
assert ".m02-labrow__row.is-open:has(+ .m02-labrow__optrow:hover)" in css
|
assert ".m02-labrow__row.is-open:has(+ .m02-labrow__optrow:hover)" in css
|
||||||
assert "tr:has(+ tr.m02-labrow__optrow.is-dragunder) > td[rowspan]" in css
|
assert "tr:has(+ tr.m02-labrow__optrow.is-dragunder) > td[rowspan]" in css
|
||||||
assert ".m02-labrow__optrow.is-selected > td:first-child" not in css
|
assert ".m02-labrow__optrow.is-selected > td:first-child" not in css
|
||||||
|
|
||||||
|
|
||||||
|
def test_도면_상세_머리_파일_업로드_단추():
|
||||||
|
"""362-2 — 도면 상세 머리 📂 → 글 단추 [파일 업로드](구조물 조합 층 단추 꼴 · 실무자료와 같은 종류)."""
|
||||||
|
drawing = _text("M02_MasterTemplete_Drawing.ts")
|
||||||
|
assert 'label: "파일 업로드",' in drawing and 'variant: "filled",' in drawing
|
||||||
|
assert 'importButton.classList.add("m02-layers__btn");' in drawing
|
||||||
|
assert '"파일 업로드 (DXF · DWG)"' in drawing
|
||||||
|
assert "📂" not in drawing and "파일 불러오기 (DXF" not in drawing
|
||||||
|
assert "📂" not in _text("M02_MasterTemplete_CardHelp.ts")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* 47-1 · 47-2 — 구조물 조합 카드 셋 [?] = 제목 바로 옆 · 도움말 네 절 · 도면 미리보기 📂 없음 · 도면 상세 📂 있음
|
/* 47-1 · 47-2 — 구조물 조합 카드 셋 [?] = 제목 바로 옆 · 도움말 네 절 · 도면 미리보기 [파일 업로드] 없음 · 도면 상세 [파일 업로드] 있음
|
||||||
* 시작 화면: M02 마스터 템플릿 · 마스터 층(#/m02-master-template?open=구조물조합&root=master) · 시스템 관리자 ·
|
* 시작 화면: M02 마스터 템플릿 · 마스터 층(#/m02-master-template?open=구조물조합&root=master) · 시스템 관리자 ·
|
||||||
* 나무에 item1(구조물 조합)이 있음
|
* 나무에 item1(구조물 조합)이 있음
|
||||||
* 부르는 법: orca eval --expression "$(cat 이 파일)" (async 식 · JSON 글을 돌려줌 · 20초 안)
|
* 부르는 법: orca eval --expression "$(cat 이 파일)" (async 식 · JSON 글을 돌려줌 · 20초 안)
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* 기대 수치:
|
* 기대 수치:
|
||||||
* - cards = 3(도면 정보 · 일위대가 · 면적산출) · 카드마다 nextToTitle = true(? 가 제목 글 바로 다음) ·
|
* - cards = 3(도면 정보 · 일위대가 · 면적산출) · 카드마다 nextToTitle = true(? 가 제목 글 바로 다음) ·
|
||||||
* inTools = false · parts = ["about","keys","features","steps"] · opened = true · closed = true
|
* inTools = false · parts = ["about","keys","features","steps"] · opened = true · closed = true
|
||||||
* - previewImport = 0(카드 미리보기 📂) · detailImport = 1(도면 상세 📂) · back = true(카드 화면으로 돌아옴)
|
* - previewImport = 0(카드 미리보기 [파일 업로드]) · detailImport = 1(도면 상세 [파일 업로드]) · back = true(카드 화면으로 돌아옴)
|
||||||
*/
|
*/
|
||||||
(async () => {
|
(async () => {
|
||||||
const w = (ms) => new Promise((r) => setTimeout(r, ms));
|
const w = (ms) => new Promise((r) => setTimeout(r, ms));
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
};
|
};
|
||||||
const vis = (b) => b && !b.hidden && b.offsetParent !== null;
|
const vis = (b) => b && !b.hidden && b.offsetParent !== null;
|
||||||
const imports = () =>
|
const imports = () =>
|
||||||
[...document.querySelectorAll('button[title="파일 불러오기 (DXF · DWG)"]')].filter(vis).length;
|
[...document.querySelectorAll('button[title="파일 업로드 (DXF · DWG)"]')].filter(vis).length;
|
||||||
const node = await until(() => document.querySelector('[data-node="i|item1"]'));
|
const node = await until(() => document.querySelector('[data-node="i|item1"]'));
|
||||||
if (!node) return JSON.stringify({ error: "item1 없음 — 폴더를 펼쳐 둘 것" });
|
if (!node) return JSON.stringify({ error: "item1 없음 — 폴더를 펼쳐 둘 것" });
|
||||||
node.click();
|
node.click();
|
||||||
|
|||||||
Reference in New Issue
Block a user