feat(z01): 좌측 패널을 B03~B09 도킹 사이드바 양식으로(상자 둘 — 기초단가 · 마스터 트리) · 기초단가 다섯(노임·기계·자재·유가·요율) 표 + 칸 고치기(editable 만 · 못 고치는 칸은 까닭·산출근거) · 덮개 판정은 서버 state 만(원본 바뀜·주인 없음은 줄째 또렷이 · 단추 글자에 값) · 요율 알림 · 고친 것 모아 보기(서버 정렬) · 공용 오버레이에 진행단계·프로젝트 이름 끄기 선택(브레인)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
This commit is contained in:
2026-09-15 21:55:33 +09:00
co-authored by Claude Opus 5
parent 5ae246146c
commit 81a1c013d2
9 changed files with 929 additions and 325 deletions
+47 -3
View File
@@ -140,10 +140,54 @@ export const ui_locales_b3 = {
B01_Dashboard_SystemSettings: ["시스템 설정", "System Settings"],
B01_Dashboard_MasterData: ["마스터 데이터", "Master Data"],
Z01_MasterData_Title: ["마스터 데이터", "Master Data"],
Z01_MasterData_Subtitle: [
"로직·기초값을 표로 봄 — 읽기 전용",
"Browse logic and base values — read only",
Z01_MasterData_Tree: ["마스터 트리", "Master tree"],
Z01_MasterData_BasePrices: ["기초단가", "Base prices"],
Z01_MasterData_Base_labor: ["노임단가", "Labor"],
Z01_MasterData_Base_machine: ["기계단가", "Machine"],
Z01_MasterData_Base_material: ["자재단가", "Material"],
Z01_MasterData_Base_oil: ["유가", "Fuel"],
Z01_MasterData_Base_rate: ["요율", "Rates"],
Z01_MasterData_Overrides: ["고친 것 모아 보기", "Edited values"],
Z01_MasterData_Rate_Notice: [
"법이 정한 값 — 고치면 갱신 때 주인을 잃기 쉬움",
"Values set by law — edits may lose their row when the law is updated",
],
Z01_MasterData_Edit_Can: [
"고칠 수 있는 칸 — 눌러 고치고 Enter 로 저장 (Esc 취소)",
"Editable — click, type, Enter to save (Esc cancels)",
],
Z01_MasterData_Edit_Locked: ["못 고치는 칸", "Not editable"],
Z01_MasterData_Edit_NotListed: ["고칠 수 있는 칸 목록에 없음", "Not in the editable list"],
Z01_MasterData_Edit_RevertTo: ["원래 값 {value} 으로 되돌리기", "Revert to original {value}"],
Z01_MasterData_Edit_TakeSource: ["새 원본 값 {value} 으로 받기", "Take new source value {value}"],
Z01_MasterData_Edit_OriginalWas: ["고칠 때 원본 {value}", "source when edited {value}"],
Z01_MasterData_Edit_Invalid: ["수로 못 읽음 — 저장 안 함", "Not a number — not saved"],
Z01_MasterData_Edit_Saved: ["저장했음 — 덮개 파일에 쌓임", "Saved to the override file"],
Z01_MasterData_Edit_Reverted: ["덮개를 뺐음 — 원본 값을 씀", "Override removed — using source"],
Z01_MasterData_Edit_Failed: ["저장 못 함", "Save failed"],
Z01_MasterData_Formula: ["산출근거", "Basis"],
Z01_MasterData_State_Edited: ["고쳐짐 — 원래 값 {value}", "Edited — original {value}"],
Z01_MasterData_State_SourceChanged: [
"⚠ 고친 뒤 원본이 바뀜 — 고친 값을 그대로 씀 · 새 원본 값 {value}",
"⚠ Source changed after edit — edited value still used · new source {value}",
],
Z01_MasterData_State_Orphan: [
"⚠ 주인 없음 — 갱신으로 그 줄이 사라짐",
"⚠ Orphan — the row disappeared on update",
],
Z01_MasterData_State_Missing: [
"⚠ 서버가 판정(state)을 안 줌 — 버그",
"⚠ Server sent no state — bug",
],
Z01_MasterData_List_State: ["상태", "State"],
Z01_MasterData_List_Row: ["줄", "Row"],
Z01_MasterData_List_Column: ["칸", "Column"],
Z01_MasterData_List_Value: ["고친 값", "Edited value"],
Z01_MasterData_List_Original: ["고칠 때 원본", "Source when edited"],
Z01_MasterData_List_Current: ["지금 원본", "Current source"],
Z01_MasterData_List_SourceChanged: ["⚠ 원본 바뀜", "⚠ Source changed"],
Z01_MasterData_List_Orphan: ["⚠ 주인 없음", "⚠ Orphan"],
Z01_MasterData_List_Edited: ["고쳐짐", "Edited"],
Z01_MasterData_AdminOnly: ["시스템 관리자만 볼 수 있음", "System administrators only"],
Z01_MasterData_LoadFailed: ["마스터 데이터를 못 읽음", "Failed to load master data"],
Z01_MasterData_PickTable: ["왼쪽에서 표를 고를 것", "Pick a table on the left"],
+19 -17
View File
@@ -13,9 +13,12 @@ const PROGRESS_OVERLAY_POSITION_KEY = "frd_workflow_progress_overlay_pos";
export interface WorkflowOverlayOptions {
title: string;
progressContent: HTMLElement;
/** 없으면 진행단계 패널을 안 세움 — 워크플로 밖 화면(Z01 마스터 데이터)용. */
progressContent?: HTMLElement;
optionsContent?: HTMLElement;
showTitlePanel?: boolean;
/** false 면 제목 줄 오른쪽 프로젝트 이름을 안 붙임 — 프로젝트와 무관한 화면용. */
showProjectName?: boolean;
onOptionsOpenChange?: (isOpen: boolean) => void;
}
@@ -239,15 +242,6 @@ export function createWorkflowOverlays(options: WorkflowOverlayOptions): Workflo
const root = document.createElement("div");
root.className = "ui-workflow-overlay";
const progressBody = document.createElement("div");
progressBody.append(options.progressContent);
const progressPanel = createPanel(
"progress",
t("Workflow_Progress_Title"),
progressBody,
PROGRESS_OVERLAY_STATE_KEY,
);
let setTitleOpen = (_isOpen: boolean): void => {};
if (options.showTitlePanel !== false) {
const titleBody = document.createElement("div");
@@ -258,16 +252,24 @@ export function createWorkflowOverlays(options: WorkflowOverlayOptions): Workflo
titleBody,
TITLE_OVERLAY_STATE_KEY,
options.onOptionsOpenChange,
createProjectNameTag(),
options.showProjectName === false ? undefined : createProjectNameTag(),
);
root.append(titlePanel.root);
setTitleOpen = titlePanel.setOpen;
}
root.append(progressPanel.root);
let setProgressOpen = (_isOpen: boolean): void => {};
if (options.progressContent) {
const progressBody = document.createElement("div");
progressBody.append(options.progressContent);
const progressPanel = createPanel(
"progress",
t("Workflow_Progress_Title"),
progressBody,
PROGRESS_OVERLAY_STATE_KEY,
);
root.append(progressPanel.root);
setProgressOpen = progressPanel.setOpen;
}
return {
root,
setTitleOpen,
setProgressOpen: progressPanel.setOpen,
};
return { root, setTitleOpen, setProgressOpen };
}