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

This commit is contained in:
2026-10-16 23:24:32 +09:00
6 changed files with 25 additions and 12 deletions
@@ -40,7 +40,7 @@ export const CARD_HELP: Record<"structure" | "labor" | "area", CardHelp> = {
features: [
SAVE,
take("도면"),
["수정", "도면 상세(전체 편집 화면)를 엶 — 파일 불러오기(DXF · DWG)는 여기"],
["수정", "도면 상세(전체 편집 화면)를 엶 — 파일 업로드(DXF · DWG)는 여기"],
clear("도면"),
FOLD,
],
@@ -98,7 +98,7 @@ export const CARD_HELP: Record<"structure" | "labor" | "area", CardHelp> = {
/** 상세에만 있는 단추 줄(49-7) — 카드 도움말 글 한 벌 뒤에 더함 */
const DETAIL_ONLY: Record<keyof typeof CARD_HELP, [string, string][]> = {
structure: [["파일 불러오기", "DXF · DWG 파일을 도면으로 불러옴(상세 머리 📂)"]],
structure: [["파일 업로드", "DXF · DWG 파일을 도면으로 불러옴(상세 머리 [파일 업로드])"]],
labor: [],
area: [["도면으로 보내기", "고른 범위를 도면 표로 보냄(상세 머리)"]],
};
@@ -39,7 +39,7 @@ export interface DrawingTemplateOptions {
projectId?: string | null;
/** 저장 안 한 고침이 생기면 true — CAD 편집 · 작도 영역 값 바꿈. */
onChanged?: (dirty: boolean) => void;
/** 페이지 제목 줄 안의 빈 칸 — 있으면 작도 영역 칸 · 파일 불러오기를 거기 한 줄로 놓는다. */
/** 페이지 제목 줄 안의 빈 칸 — 있으면 작도 영역 칸 · [파일 업로드]를 거기 한 줄로 놓는다. */
headerSlot?: HTMLElement;
/** CAD 좌측 패널(특성 · 도면층)을 접힌 채로 연다 — 누르면 펼침(구조물 도면 미리보기). */
panelsCollapsed?: boolean;
@@ -51,7 +51,7 @@ export interface DrawingTemplateOptions {
noArea?: boolean;
/** B07 도각을 외곽 좌하단 (0,0) 에 얹음 — 잠금 층 · 보여주기만(돌려줄 때 뺌 · 저장 안 됨). */
frame?: boolean;
/** 파일 불러오기(📂) 단추를 안 둠 — 집계표 카드 미리보기(불러오기는 도면 상세에서만). */
/** [파일 업로드] 단추를 안 둠 — 집계표 카드 미리보기(불러오기는 도면 상세에서만). */
noImport?: boolean;
/** 장id(82-1) — 자동백업 칸을 장마다 나눔(1장 = 빈 값 · 옛 칸 그대로) */
sheet?: string;
@@ -321,11 +321,13 @@ export function mountDrawingTemplate(
.finally(() => (importButton.disabled = false));
});
const importButton = createButton({
label: "📂",
variant: "ghost",
label: "파일 업로드",
variant: "filled",
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);
}
@@ -85,7 +85,7 @@ function mountStructure(
originMarker: true, // 좌표 0,0 기준점 십자
noArea: true, // 작도 영역 칸 없음
frame: true, // 도각 = 보여주기만 · 외곽 좌하단 (0,0)(56장)
noImport: true, // 파일 불러오기는 도면 상세에서만(47-2)
noImport: true, // 파일 업로드는 도면 상세에서만(47-2)
pickTabs: true,
...hooks,
});
@@ -343,3 +343,4 @@
28. 내용이 많으니 나의 요청이 누락없이 잘 반영되게 꼼꼼히 분석 업무를 먼저하고 상세계획서를 작성할 것. 이후 코드작업은 너가 브레인이 되어 제어해야함. 이때 코더 워크트리들의 클리어 명령 주기적인 주입과 업무에 맞는 모델변경을 안하는걸로 보임. 다시 브레인과 브레인 메모리 파일을 다시 읽어보고 진행할 것.
236. (원문 · 10-16) 지금 데스크탑측이 임시배포인데 외부엑셀과 매칭에서 되려 과거 로직인 데스크탑측 로직이 유사 로직 찾아주는 기능이 더 좋은것같은데 확인해보고 중요한건 엑셀정보를 보면 일위대가에 연결된 단가산출을 보면 출처나 옵션 로직이 있으니 단계적으로 확인한다면 정합성을 올리는 좋은 정보가 될것같아. 이것도 이전에 검토 했던 내용이야. 검토 후 계획서에 반영해줘.
237. (원문 · 10-16 · 요구 235 보고의 「정해 줄 것」 1~3 답) 1. 자동으로 하지말고 일닼은 전극으로 필요시 사용자가 변경. 레미콘은 별도계상일텐데 나중에 프로젝트에선 선택하거나 사급을 결정. / 2.옛별칭의 의미를 모름 / 3.상세도 있음의 웜래 요청을 보여줘
238. (원문 · 10-16 · 237 답 덧) 1. 옛 별칭은 내가 테스트 하면서 한것같음. 지워도 상관없음. / 2. 여기서 상세도는 상세화면에도 같은 종류의 버튼이 있다는 말임.
+11 -1
View File
@@ -117,7 +117,7 @@ def test_도움말_제목_옆_네_절():
def test_미리보기_파일_불러오기_없음():
"""47-2 — 도면 카드 미리보기엔 📂 없음 · 도면 상세(전체 편집)는 그대로."""
"""47-2 — 도면 카드 미리보기엔 [파일 업로드] 없음 · 도면 상세(전체 편집)는 그대로."""
drawing = _text("M02_MasterTemplete_Drawing.ts")
assert "const canImport = !readOnly && options.noImport !== true;" in drawing
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 "tr:has(+ tr.m02-labrow__optrow.is-dragunder) > td[rowspan]" 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) · 시스템 관리자 ·
* 나무에 item1(구조물 조합)이 있음
* 부르는 법: orca eval --expression "$(cat 이 파일)" (async 식 · JSON 글을 돌려줌 · 20초 안)
@@ -6,7 +6,7 @@
* 기대 수치:
* - cards = 3(도면 정보 · 일위대가 · 면적산출) · 카드마다 nextToTitle = 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 () => {
const w = (ms) => new Promise((r) => setTimeout(r, ms));
@@ -20,7 +20,7 @@
};
const vis = (b) => b && !b.hidden && b.offsetParent !== null;
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"]'));
if (!node) return JSON.stringify({ error: "item1 없음 — 폴더를 펼쳐 둘 것" });
node.click();