From f8302149a91c974a438e2d3771e0a5bb2be1be35 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 30 Sep 2026 13:22:13 +0900 Subject: [PATCH] =?UTF-8?q?refactor(M02):=20=EC=9D=BC=EC=9C=84=EB=8C=80?= =?UTF-8?q?=EA=B0=80=20=EC=A1=B0=ED=95=A9=20=ED=99=94=EB=A9=B4=20=EB=B6=80?= =?UTF-8?q?=ED=92=88=20M01=20=E2=86=92=20M02=20=EC=98=AE=EA=B9=80=20?= =?UTF-8?q?=E2=80=94=20Labor=5FApi(=EC=B8=B5=20=C2=B7=20=ED=82=A4=20?= =?UTF-8?q?=ED=95=98=EB=82=98=20=C2=B7=20=EC=84=B8=20=EC=B8=B5=20=C2=B7=20?= =?UTF-8?q?=EB=82=98=EB=AC=B4=20=C2=B7=20=EB=8B=B4=EC=9D=84=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81)=20=C2=B7=20Pick=20=C2=B7=20Preview=20=C2=B7=20Text?= =?UTF-8?q?=20=C2=B7=20css(PLAN=2027-2b=20=EC=95=9E)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 조합 Api 가 층 길(/api/m02/layers/{layer}/combos) · 키 하나는 /api/m02/combos/key 로 — 회사 · 개인 조합도 읽음 - 로직 고르기 · 미리 보기는 /api/m02/logic-lib(로그인) 로 읽음 - M01 조합 화면 · M02 구조물 조합 쪽 부름을 새 자리로 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01BU9gbNE3aWFUvE61pS2WGt --- M01_MasterData/M01_MasterData_UI_Combo.ts | 10 +- M01_MasterData/M01_MasterData_UI_Combo_Api.ts | 122 ----------- M01_MasterData/M01_MasterData_UI_Side.ts | 2 +- .../M02_MasterTemplete_Combo.ts | 4 +- .../M02_MasterTemplete_ComboPanel.ts | 2 +- .../M02_MasterTemplete_Labor.css | 0 .../M02_MasterTemplete_Labor_Api.ts | 194 ++++++++++++++++++ .../M02_MasterTemplete_Labor_Pick.ts | 17 +- .../M02_MasterTemplete_Labor_Preview.ts | 17 +- .../M02_MasterTemplete_Labor_Text.ts | 2 +- .../M02_MasterTemplete_Structure.ts | 2 +- 11 files changed, 224 insertions(+), 148 deletions(-) delete mode 100644 M01_MasterData/M01_MasterData_UI_Combo_Api.ts rename M01_MasterData/M01_MasterData_UI_Combo.css => M02_MasterTemplete/M02_MasterTemplete_Labor.css (100%) create mode 100644 M02_MasterTemplete/M02_MasterTemplete_Labor_Api.ts rename M01_MasterData/M01_MasterData_UI_Combo_Pick.ts => M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts (90%) rename M01_MasterData/M01_MasterData_UI_Combo_Preview.ts => M02_MasterTemplete/M02_MasterTemplete_Labor_Preview.ts (92%) rename M01_MasterData/M01_MasterData_UI_Combo_Text.ts => M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts (99%) diff --git a/M01_MasterData/M01_MasterData_UI_Combo.ts b/M01_MasterData/M01_MasterData_UI_Combo.ts index 777d569b..2a41d4fc 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo.ts +++ b/M01_MasterData/M01_MasterData_UI_Combo.ts @@ -21,14 +21,14 @@ import { newCombo, type Combo, type ComboSummary, -} from "./M01_MasterData_UI_Combo_Api"; -import { openLogicPicker } from "./M01_MasterData_UI_Combo_Pick"; -import { buildPreview } from "./M01_MasterData_UI_Combo_Preview"; -import { tc } from "./M01_MasterData_UI_Combo_Text"; +} from "../M02_MasterTemplete/M02_MasterTemplete_Labor_Api"; +import { openLogicPicker } from "../M02_MasterTemplete/M02_MasterTemplete_Labor_Pick"; +import { buildPreview } from "../M02_MasterTemplete/M02_MasterTemplete_Labor_Preview"; +import { tc } from "../M02_MasterTemplete/M02_MasterTemplete_Labor_Text"; import type { SideHandle } from "./M01_MasterData_UI_Side"; import "./M01_MasterData_UI_Logic_Style.css"; import "./M01_MasterData_UI_LogicLab_Style.css"; -import "./M01_MasterData_UI_Combo.css"; +import "../M02_MasterTemplete/M02_MasterTemplete_Labor.css"; const FILTER_ID = "조합|"; const blankCombo = (): Combo => ({ diff --git a/M01_MasterData/M01_MasterData_UI_Combo_Api.ts b/M01_MasterData/M01_MasterData_UI_Combo_Api.ts deleted file mode 100644 index f21bf7c1..00000000 --- a/M01_MasterData/M01_MasterData_UI_Combo_Api.ts +++ /dev/null @@ -1,122 +0,0 @@ -/* ============================================================================= - * M01_MasterData_UI_Combo_Api.ts - * 일위대가 조합 화면이 부르는 서버 길 — 조합 마스터 `일위대가조합.json`(키 UA) - * 길 = M02 층 길(`/api/m02/layers/system/combos` · PLAN 27-2a) · 모양 = `_화면_계약.md` 9장 - * ========================================================================== */ - -import { API_BASE_URL } from "@config/config_frontend"; -import { ApiError } from "./M01_MasterData_UI_Logic_Api"; - -/** 담은 로직 한 줄 — 로직 키와 메모뿐(수량·계산은 마스터에 두지 않음 · 계약 9장) */ -export interface ComboLogic { - 로직: string; - 메모: string | null; -} -/** 조합 한 줄 통째 — `_틀.md` 10장 · 키·소유는 서버 것이 이김 */ -export interface Combo { - 키: string; - 이름: string; - 구분: string | null; - 상세구분: string | null; - 단위: string | null; - 담은로직: ComboLogic[]; - 출처: string | null; - 소유: string | null; - /** 이 조합을 본떠 만든 원본 키 — 비면 원본(M02 가 갈라 낸 조합에 채워짐) */ - 본뜬키: string | null; - 비고: string | null; -} -export interface ComboSummary extends Combo { - count: number; - blocked: boolean; - reasons: string[]; -} -/** `GET /combo` 의 `줄` — 담은 로직에 이름을 붙인 것 */ -export interface ComboLine { - 차례: number; - 로직: string; - 메모: string | null; - ok: boolean; - 까닭?: string; - 이름?: string; - 구분?: string; - 상세구분?: string; - 결과단위?: string; -} -export interface ComboOne { - file: string; - version: string; - combo: Combo; - 줄: ComboLine[]; -} -export interface PreviewLine { - 차례: number; - 로직: string; - 이름: string; - ok: boolean; - 까닭?: string; - 갈래?: string; - 결과?: number; - 노무비?: number; - 재료비?: number; - 경비?: number; - 계?: number; -} -export interface PreviewAnswer { - 줄: PreviewLine[]; - 노무비: number; - 재료비: number; - 경비: number; - 계: number; - 멈춤: string[]; -} - -/** 조합 길 = M02 층 길 마스터(`/api/m02/layers/system/combos` · PLAN 27-2a) */ -async function request(path: string, method = "GET", body?: unknown): Promise { - const response = await fetch(`${API_BASE_URL}/m02/layers/system/combos${path}`, { - method, - credentials: "include", - headers: { "Content-Type": "application/json" }, - body: body === undefined ? undefined : JSON.stringify(body), - }); - const data = (await response.json().catch(() => ({}))) as { detail?: unknown } & T; - if (!response.ok) throw new ApiError(response.status, data.detail ?? response.statusText); - return data; -} - -const FILE = "일위대가조합.json"; -const q = (key: string): string => `/${encodeURIComponent(key)}`; - -export const fetchCombos = (): Promise => - request<{ 줄: ComboSummary[] }>("").then((d) => d.줄); - -export const fetchCombo = (key: string): Promise => - request & { 판: string }>(q(key)).then((d) => ({ - ...d, - file: FILE, - version: d.판, - })); - -export const newCombo = (combo: Combo): Promise<{ file: string; version: string; key: string }> => - request<{ 키: string; 판: string }>("", "POST", { combo: { ...combo, 소유: "현장" } }).then( - (d) => ({ file: FILE, version: d.판, key: d.키 }), - ); - -export const editCombo = ( - key: string, - version: string, - combo: Combo, -): Promise<{ file: string; version: string }> => - request<{ 판: string }>(q(key), "PUT", { combo, 판: version }).then((d) => ({ - file: FILE, - version: d.판, - })); - -export const deleteCombo = (key: string, version: string): Promise => - request(`${q(key)}?판=${encodeURIComponent(version)}`, "DELETE"); - -/** 보기만 — 수량(inputs)은 이 부름에만 실림 · 저장 안 함 */ -export const previewCombo = ( - combo: Combo | string, - inputs: Record>, -): Promise => request("/preview", "POST", { combo, inputs }); diff --git a/M01_MasterData/M01_MasterData_UI_Side.ts b/M01_MasterData/M01_MasterData_UI_Side.ts index 3b132e30..39288ea1 100644 --- a/M01_MasterData/M01_MasterData_UI_Side.ts +++ b/M01_MasterData/M01_MasterData_UI_Side.ts @@ -10,7 +10,7 @@ import { attachCollapsible } from "@ui/ui_template_collapsible"; import { t as L } from "@ui/ui_template_locale"; import { fetchFiles, fetchSubsAll, type FileInfo, type SubInfo } from "./M01_MasterData_Api_Fetch"; import { tx } from "./M01_MasterData_UI_Logic_Text"; -import { tc } from "./M01_MasterData_UI_Combo_Text"; +import { tc } from "../M02_MasterTemplete/M02_MasterTemplete_Labor_Text"; import { renderTree, type MakeRow } from "./M01_MasterData_UI_Tree"; /** 컨테이너마다 기억하는 화면 상태 — 찾기 글 · 쪽 · 소요량·계수 표의 용도 대상 거름 (거름은 `m01.filter.*`) */ diff --git a/M02_MasterTemplete/M02_MasterTemplete_Combo.ts b/M02_MasterTemplete/M02_MasterTemplete_Combo.ts index ca2112ad..39262ef5 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Combo.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Combo.ts @@ -14,8 +14,8 @@ import { showToast, } from "@ui/ui_template_elements"; import { openModal } from "@ui/ui_template_modal"; -import { fetchCombo, type ComboLine } from "../M01_MasterData/M01_MasterData_UI_Combo_Api"; -import { openLogicPicker } from "../M01_MasterData/M01_MasterData_UI_Combo_Pick"; +import { fetchCombo, type ComboLine } from "./M02_MasterTemplete_Labor_Api"; +import { openLogicPicker } from "./M02_MasterTemplete_Labor_Pick"; import { branchCombo, type BranchedCombo } from "./M02_MasterTemplete_Api_Fetch"; import { readColumnBase, reasonOf } from "./M02_MasterTemplete_Combo_Api"; import "./M02_MasterTemplete_Combo.css"; diff --git a/M02_MasterTemplete/M02_MasterTemplete_ComboPanel.ts b/M02_MasterTemplete/M02_MasterTemplete_ComboPanel.ts index 6311a601..4d2d418b 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_ComboPanel.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_ComboPanel.ts @@ -19,7 +19,7 @@ import { attachCollapsible } from "@ui/ui_template_collapsible"; import { createWorkflowPanelHandle } from "@ui/ui_template_overlay"; import { createPanelResizer } from "@ui/ui_template_resizer"; import { readStateRaw, stateKey, writeStateRaw } from "../A00_Common/b_page_state"; -import { fetchCombos } from "../M01_MasterData/M01_MasterData_UI_Combo_Api"; +import { fetchCombos } from "./M02_MasterTemplete_Labor_Api"; import { listMaterialCombos, setColumnCombo } from "./M02_MasterTemplete_Api_Fetch"; import { readColumnBase, reasonOf } from "./M02_MasterTemplete_Combo_Api"; import "./M02_MasterTemplete_ComboPanel.css"; diff --git a/M01_MasterData/M01_MasterData_UI_Combo.css b/M02_MasterTemplete/M02_MasterTemplete_Labor.css similarity index 100% rename from M01_MasterData/M01_MasterData_UI_Combo.css rename to M02_MasterTemplete/M02_MasterTemplete_Labor.css diff --git a/M02_MasterTemplete/M02_MasterTemplete_Labor_Api.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Api.ts new file mode 100644 index 00000000..93da186e --- /dev/null +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Api.ts @@ -0,0 +1,194 @@ +/* ============================================================================= + * M02_MasterTemplete_Labor_Api.ts + * 일위대가 조합 서버 길 — 층(마스터 UA · 회사 UC · 개인 UP) 조합 표 `일위대가조합.json` + * 길 = `/api/m02/layers/{layer}/combos`(PLAN 27-2a) · 키 하나 = `/api/m02/combos/key/{키}` · + * 세 층 = `/api/m02/combos/all` · 담을 로직 읽기 = `/api/m02/logic-lib/…` · 모양 = `_화면_계약.md` 9장 + * ========================================================================== */ + +import { API_BASE_URL } from "@config/config_frontend"; +import { + ApiError, + type LogicOne, + type LogicSummary, + type SubBrief, +} from "../M01_MasterData/M01_MasterData_UI_Logic_Api"; +import type { Layer } from "./M02_MasterTemplete_Api_Fetch"; + +/** 담은 로직 한 줄 — 로직 키와 메모뿐(수량·계산은 마스터에 두지 않음 · 계약 9장) */ +export interface ComboLogic { + 로직: string; + 메모: string | null; +} +/** 조합 한 줄 통째 — `_틀.md` 10장 · 키·소유는 서버 것이 이김 */ +export interface Combo { + 키: string; + 이름: string; + 구분: string | null; + 상세구분: string | null; + 단위: string | null; + 담은로직: ComboLogic[]; + 출처: string | null; + 소유: string | null; + /** 이 조합을 본떠 만든 원본 키 — 비면 원본(M02 가 갈라 낸 조합에 채워짐) */ + 본뜬키: string | null; + 비고: string | null; +} +export interface ComboSummary extends Combo { + count: number; + blocked: boolean; + reasons: string[]; +} +/** `GET /combo` 의 `줄` — 담은 로직에 이름을 붙인 것 */ +export interface ComboLine { + 차례: number; + 로직: string; + 메모: string | null; + ok: boolean; + 까닭?: string; + 이름?: string; + 구분?: string; + 상세구분?: string; + 결과단위?: string; +} +export interface ComboOne { + file: string; + version: string; + combo: Combo; + 줄: ComboLine[]; +} +export interface PreviewLine { + 차례: number; + 로직: string; + 이름: string; + ok: boolean; + 까닭?: string; + 갈래?: string; + 결과?: number; + 노무비?: number; + 재료비?: number; + 경비?: number; + 계?: number; +} +export interface PreviewAnswer { + 줄: PreviewLine[]; + 노무비: number; + 재료비: number; + 경비: number; + 계: number; + 멈춤: string[]; +} + +/** 조합 층 — 층 + 주인(회사 `7` · 개인 `7/42` · 없으면 내 것) */ +export interface LaborScope { + layer: Exclude; + owner: string | null; +} +export const SYSTEM_SCOPE: LaborScope = { layer: "system", owner: null }; + +/** 폴더 = [구분] · [구분, 상세구분] — 깊이 2(PLAN 27-2a) */ +export interface ComboList { + 판: string; + 폴더: string[][]; + 줄: ComboSummary[]; +} +export interface ComboLayerList extends ComboList { + layer: LaborScope["layer"]; + owner: string | null; +} +export interface ComboTreeEdit { + op: "add-folder" | "rename" | "move" | "delete"; + 경로?: string[]; + 이름?: string; + 새경로?: string[]; + 키?: string; + 판: string; +} + +async function request(url: string, method = "GET", body?: unknown): Promise { + const response = await fetch(`${API_BASE_URL}/m02${url}`, { + method, + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: body === undefined ? undefined : JSON.stringify(body), + }); + const data = (await response.json().catch(() => ({}))) as { detail?: unknown } & T; + if (!response.ok) throw new ApiError(response.status, data.detail ?? response.statusText); + return data; +} + +const enc = encodeURIComponent; +/** 층 길 — `path` 뒤에 주인 · 더 붙일 물음 */ +const at = (scope: LaborScope, path = "", more: Record = {}): string => { + const params = new URLSearchParams(more); + if (scope.owner) params.set("owner", scope.owner); + const q = params.toString(); + return `/layers/${scope.layer}/combos${path}${q ? `?${q}` : ""}`; +}; + +export const fetchComboList = (scope: LaborScope = SYSTEM_SCOPE): Promise => + request(at(scope)); + +export const fetchCombos = (scope: LaborScope = SYSTEM_SCOPE): Promise => + fetchComboList(scope).then((d) => d.줄); + +/** 세 층 목록 — 고르기(use-combo · 갈라 내기) */ +export const fetchAllCombos = (): Promise => request("/combos/all"); + +/** 키 하나 — 어느 층이든(그 층 읽기 권한) · `version` = 그 층 조합 표 판 */ +export const fetchCombo = (key: string): Promise => + request & LaborScope & { 판: string }>( + `/combos/key/${enc(key)}`, + ).then((d) => ({ ...d, file: "일위대가조합.json", version: d.판 })); + +export const newCombo = ( + combo: Combo, + scope: LaborScope = SYSTEM_SCOPE, +): Promise<{ version: string; key: string }> => + request<{ 키: string; 판: string }>(at(scope), "POST", { combo }).then((d) => ({ + version: d.판, + key: d.키, + })); + +export const editCombo = ( + key: string, + version: string, + combo: Combo, + scope: LaborScope = SYSTEM_SCOPE, +): Promise<{ version: string }> => + request<{ 판: string }>(at(scope, `/${enc(key)}`), "PUT", { combo, 판: version }).then((d) => ({ + version: d.판, + })); + +export const deleteCombo = ( + key: string, + version: string, + scope: LaborScope = SYSTEM_SCOPE, +): Promise => request(at(scope, `/${enc(key)}`, { 판: version }), "DELETE"); + +/** 나무 고침 — 폴더 더하기 · 이름 · 옮기기(폴더 · 조합) · 지우기 → 새 목록 */ +export const editComboTree = ( + body: ComboTreeEdit, + scope: LaborScope = SYSTEM_SCOPE, +): Promise => request(at(scope, "/tree"), "POST", body); + +/** 보기만 — 수량(inputs)은 이 부름에만 실림 · 저장 안 함 */ +export const previewCombo = ( + combo: Combo | string, + inputs: Record>, + scope: LaborScope = SYSTEM_SCOPE, +): Promise => request(at(scope, "/preview"), "POST", { combo, inputs }); + +/* --- 담을 로직(읽기만 · 로그인) — M01 로직 길과 같은 모양 --- */ +export const fetchLibLogics = (): Promise => + request<{ logics: LogicSummary[] }>("/logic-lib/logics").then((d) => d.logics); + +export const fetchLibLogicSubs = (): Promise => + request<{ subs: SubBrief[] }>("/logic-lib/subs").then((d) => d.subs); + +export const fetchLibLogic = (key: string): Promise => + request(`/logic-lib/logic?key=${enc(key)}`); + +export const fetchLibAuto = (key: string): Promise> => + request<{ 값?: Record }>(`/logic-lib/auto?key=${enc(key)}`) + .then((d) => d.값 ?? {}) + .catch(() => ({})); diff --git a/M01_MasterData/M01_MasterData_UI_Combo_Pick.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts similarity index 90% rename from M01_MasterData/M01_MasterData_UI_Combo_Pick.ts rename to M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts index 7567a4d7..ee9acecd 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo_Pick.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * M01_MasterData_UI_Combo_Pick.ts + * M02_MasterTemplete_Labor_Pick.ts * [로직 더하기] 창 — 구분 → 상세구분 → 찾기로 사용자가 로직을 하나씩 고름(자동 추천 없음) * ========================================================================== */ @@ -11,15 +11,14 @@ import { showToast, } from "@ui/ui_template_elements"; import { t as L } from "@ui/ui_template_locale"; +import type { LogicSummary, SubBrief } from "../M01_MasterData/M01_MasterData_UI_Logic_Api"; import { - fetchLogics, - fetchLogicSubs, - type LogicSummary, - type SubBrief, -} from "./M01_MasterData_UI_Logic_Api"; -import { tc } from "./M01_MasterData_UI_Combo_Text"; -import "./M01_MasterData_UI_Logic_Style.css"; // 창 겉틀 — M02 에서 열 때도 이 모듈이 불러옴 -import "./M01_MasterData_UI_Combo.css"; + fetchLibLogics as fetchLogics, + fetchLibLogicSubs as fetchLogicSubs, +} from "./M02_MasterTemplete_Labor_Api"; +import { tc } from "./M02_MasterTemplete_Labor_Text"; +import "../M01_MasterData/M01_MasterData_UI_Logic_Style.css"; // 창 겉틀 +import "./M02_MasterTemplete_Labor.css"; const opts = (values: string[]): { value: string; text: string }[] => [L("M01_All"), ...values].map((v, i) => ({ value: i ? v : "", text: v })); diff --git a/M01_MasterData/M01_MasterData_UI_Combo_Preview.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Preview.ts similarity index 92% rename from M01_MasterData/M01_MasterData_UI_Combo_Preview.ts rename to M02_MasterTemplete/M02_MasterTemplete_Labor_Preview.ts index c5df4e17..aeff66e0 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo_Preview.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Preview.ts @@ -1,14 +1,19 @@ /* ============================================================================= - * M01_MasterData_UI_Combo_Preview.ts - * 조합 미리 보기 — 담은 로직 저마다 받은 입력값을 서버 미리 보기(`POST /combo/preview`)에 실어 비목별 합계를 받음 + * M02_MasterTemplete_Labor_Preview.ts + * 조합 미리 보기 — 담은 로직 저마다 받은 입력값을 서버 미리 보기(`POST …/combos/preview`)에 실어 비목별 합계를 받음 * 입력값(수량)은 이 화면 안에만 두고 조합에 저장하지 않음(계약 9장) * ========================================================================== */ import { createInputField, createSelectField, el } from "@ui/ui_template_elements"; -import { fetchAuto, fetchLogic, type LogicInput } from "./M01_MasterData_UI_Logic_Api"; -import { previewCombo, type Combo } from "./M01_MasterData_UI_Combo_Api"; -import { tc, type ComboTextKey } from "./M01_MasterData_UI_Combo_Text"; -import { formatMoney } from "./M01_MasterData_UI_Logic_Money"; +import type { LogicInput } from "../M01_MasterData/M01_MasterData_UI_Logic_Api"; +import { formatMoney } from "../M01_MasterData/M01_MasterData_UI_Logic_Money"; +import { + fetchLibAuto as fetchAuto, + fetchLibLogic as fetchLogic, + previewCombo, + type Combo, +} from "./M02_MasterTemplete_Labor_Api"; +import { tc, type ComboTextKey } from "./M02_MasterTemplete_Labor_Text"; const COSTS = ["노무비", "재료비", "경비"] as const; const LABEL: Record<(typeof COSTS)[number], ComboTextKey> = { diff --git a/M01_MasterData/M01_MasterData_UI_Combo_Text.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts similarity index 99% rename from M01_MasterData/M01_MasterData_UI_Combo_Text.ts rename to M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts index 9a284d3b..8d6b1a1d 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo_Text.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * M01_MasterData_UI_Combo_Text.ts + * M02_MasterTemplete_Labor_Text.ts * 일위대가 조합 화면 글자 — [한국어, 영어] * ========================================================================== */ diff --git a/M02_MasterTemplete/M02_MasterTemplete_Structure.ts b/M02_MasterTemplete/M02_MasterTemplete_Structure.ts index 8163f1f6..3c75064e 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Structure.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Structure.ts @@ -24,7 +24,7 @@ import { import { openModal } from "@ui/ui_template_modal"; import type { LinkOptions } from "../A00_Common/spreadsheet/spreadsheet_links"; import { fetchComboInputs, searchMaterials } from "../M01_MasterData/M01_MasterData_Api_Fetch"; -import { type ComboSummary, fetchCombos } from "../M01_MasterData/M01_MasterData_UI_Combo_Api"; +import { type ComboSummary, fetchCombos } from "./M02_MasterTemplete_Labor_Api"; import { copyArea, copyMaterial,