feat(ui_template): 항목 고르기 모달 — 시험 · 글자 대비 · 새로 가져올 때 넣은 값 유지 · 편집 화면 높이 (PLAN 25-2d)
- test_item_picker_detail: 복사본 창구(가짜 · 약속 길 · 403 까닭) · 입력 목록 · 카드 순수 함수 · 한 벌 지킴 · 원본 층에 안 씀 - 자동값 · 확인 표시 글자 대비 4.5 이상 · 고르기 값은 원래 모양(숫자)으로 저장 - 새로 가져오기 = 원본에서 온 문서만 덮고 입력값은 남김 - 모달 폭 두 클래스로(공용 모달 폭에 안 밀림) · CAD · 시트 편집 높이 채움 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EauA2ATmqNRbeV48s9CcBr
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
/* 항목 고르기 모달 — 왼쪽 나무 · 오른쪽 폴더 모양 · 아래 단추 */
|
||||
.ui-item-picker {
|
||||
/* 공용 모달(.ui-modal)의 폭 · 높이보다 앞서게 — 불러오는 차례에 따라 뒤집히지 않도록 두 클래스 */
|
||||
.ui-modal.ui-item-picker {
|
||||
width: min(1320px, 96vw);
|
||||
max-height: 94vh;
|
||||
}
|
||||
@@ -141,22 +142,40 @@
|
||||
|
||||
.ui-item-picker__edit-sheet,
|
||||
.ui-item-picker__edit-cad {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.ui-item-picker__edit-inputs {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
padding: var(--spacing-8);
|
||||
overflow: auto;
|
||||
/* 도면 부품(.m02-drawing)이 남는 높이를 채움 — M02 메인 칸과 같은 자리 규칙 */
|
||||
.ui-item-picker__edit-cad > .m02-drawing {
|
||||
flex: 1 1 0;
|
||||
}
|
||||
|
||||
.ui-item-picker__edit-inputs .m02-struct__card {
|
||||
.ui-item-picker__edit-sheet > .ss {
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.ui-item-picker__edit-inputs {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
padding: var(--spacing-8);
|
||||
}
|
||||
|
||||
.ui-item-picker__edit-inputs > .m02-struct__card {
|
||||
flex: 1 1 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.ui-item-picker__edit-inputs .m02-inputs__wrap {
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.ui-item-picker__name {
|
||||
margin: 0;
|
||||
font-size: var(--text-body);
|
||||
|
||||
@@ -45,7 +45,7 @@ export interface ProjectItemInfo {
|
||||
|
||||
/** `{층}_{주인 슬러그}_{키}` — 서버 `snapshot_folder_name` 과 같은 글(owner 없음 = none · `/` = `-`) */
|
||||
export const folderOf = (row: PickerRow): string =>
|
||||
`${layerOf(row)}_${(ownerOf(row) ?? "none").replace("/", "-")}_${row.key}`;
|
||||
`${layerOf(row)}_${(ownerOf(row) ?? "none").replace(/\//g, "-")}_${row.key}`;
|
||||
|
||||
interface Reply {
|
||||
status: number;
|
||||
@@ -207,8 +207,14 @@ export function projectItems(projectId: string): ProjectItems {
|
||||
if (reply.status >= 400) throw new Error(reasonOf(reply));
|
||||
return reply.body as ProjectItemInfo;
|
||||
}
|
||||
delete fakeLoad(projectId)[info.폴더];
|
||||
return client.importItem(row);
|
||||
// 원본에서 온 문서(도면 · 면적 · 재료)만 새로 덮음 — 사용자가 넣은 값(입력값 · 고른자재)은 그대로
|
||||
const kept = fakeLoad(projectId)[info.폴더]?.parts;
|
||||
const fresh = await client.importItem(row);
|
||||
const item = fakeLoad(projectId)[fresh.폴더];
|
||||
for (const part of ["입력값", "고른자재"] as const)
|
||||
if (kept?.[part] !== undefined && item) item.parts[part] = kept[part];
|
||||
fakeSave(projectId);
|
||||
return fresh;
|
||||
},
|
||||
masterChanged: async (row, info) => {
|
||||
if (!fake) return info.마스터바뀜 === true;
|
||||
|
||||
Reference in New Issue
Block a user