From 94c7d29b11a978b4a724577d4c637f5ee678c8e0 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 7 Nov 2026 13:18:48 +0900 Subject: [PATCH] fix(est): name copied projects when saving --- tools/est-test/PLAN.md | 2 ++ tools/est-test/README.md | 2 ++ tools/est-test/native-actions.js | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/tools/est-test/PLAN.md b/tools/est-test/PLAN.md index 301aead26..6f5071343 100644 --- a/tools/est-test/PLAN.md +++ b/tools/est-test/PLAN.md @@ -1,4 +1,6 @@ ## Codex · EST 독립 테스트 앱 (2026-11-04) +- [x] 다른 이름으로 저장할 때 작업 이름 입력 → 원본·복사본 구분과 저장 취소 확인. + - 자체 검증: Tailscale HTTP Edge에서 빈 이름 차단, 별도 이름·ID의 사본 저장과 기존 파일 보존 확인. - [x] Tailscale HTTP 접속의 새 항목·첨부·공정 생성 오류 수정 → 실제 원격 주소에서 생성과 저장 확인. - 자체 검증: Tailscale HTTP Edge의 비보안 컨텍스트에서 UUID·공정·첨부 생성·JSON 저장 확인. 관련 시험 31개 통과. - [x] EST 백업 EBKX 파일 열기 → 실무 백업 읽기·JSON 저장·재열기 확인. diff --git a/tools/est-test/README.md b/tools/est-test/README.md index 7c41ec5ae..775e21041 100644 --- a/tools/est-test/README.md +++ b/tools/est-test/README.md @@ -24,6 +24,8 @@ 저장은 이 폴더의 `data/`에 작업을 보관하고 `.estweb.json` 파일도 내려받습니다. 브라우저 임시 저장은 같은 탭에서 복원하는 용도입니다. JSON은 모든 웹 업무와 원본 압축 파일·바이너리를 보관하는 전체 저장 형식입니다. ESTX 수정 저장은 아래 지원 조건을 따릅니다. +`다른 이름으로 저장`은 작업 이름을 입력받아 별도 작업으로 저장하며 기존 작업은 유지합니다. + 작업모드의 `첨부파일`에서 파일을 추가·내려받기·삭제할 수 있습니다. 파일은 작업 JSON에 포함되며 이 앱의 저장 요청은 전체 256MB 이하입니다. 제한을 초과하는 파일은 읽기 전에 추가를 차단합니다. 첨부파일이 있는 작업은 JSON으로 저장해야 하며, 첨부파일이 빠진 ESTX가 만들어지지 않도록 ESTX 저장을 차단합니다. ## 추가 입출력·문서 기능 (2026-11-06) diff --git a/tools/est-test/native-actions.js b/tools/est-test/native-actions.js index c76d9184d..2c54e0184 100644 --- a/tools/est-test/native-actions.js +++ b/tools/est-test/native-actions.js @@ -144,7 +144,20 @@ const EstActions = (() => { if (confirm("현재 작업을 REA 샘플로 바꾸시겠습니까?")) EstApp.setProject(await api("/api/sample")); } else if (name === "open") EstApp.byId("open-file").click(); - else if (name === "save" || name === "save-as") await EstApp.save(name === "save-as"); + else if (name === "save") await EstApp.save(); + else if (name === "save-as") + form( + "다른 이름으로 저장", + [{ name: "name", label: "작업 이름", value: project.name }], + async (values) => { + const nextName = values.name.trim(); + const input = document.querySelector('#dialog-content [name="name"]'); + input.setCustomValidity(nextName ? "" : "작업 이름을 입력하세요."); + if (!input.reportValidity()) throw Error("작업 이름을 입력하세요."); + EstApp.change(() => (project.name = nextName), false); + await EstApp.save(true); + }, + ); else if (name === "undo") await undo(); else if (name === "redo") await undo(true); else if (name === "add-row") insertRow();