@bwg-ui/core 1.1.8 → 1.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{SSOHandler-B5rmYk8s.js → SSOHandler-DNvCpRTu.js} +2 -2
- package/dist/chunks/{SSOHandler-B5rmYk8s.js.map → SSOHandler-DNvCpRTu.js.map} +1 -1
- package/dist/chunks/{SSOHandler-DjL0sH7k.cjs → SSOHandler-Qm_2PekO.cjs} +2 -2
- package/dist/chunks/{SSOHandler-DjL0sH7k.cjs.map → SSOHandler-Qm_2PekO.cjs.map} +1 -1
- package/dist/chunks/{menuViewStore-BwR3vgPM.js → menuViewStore-BhfgX53f.js} +31 -27
- package/dist/chunks/menuViewStore-BhfgX53f.js.map +1 -0
- package/dist/chunks/menuViewStore-w4fLSR6N.cjs +3 -0
- package/dist/chunks/menuViewStore-w4fLSR6N.cjs.map +1 -0
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +2 -2
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.d.ts +3 -1
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +1 -1
- package/dist/stores/menuViewStore.d.ts +3 -1
- package/dist/stores/menuViewStore.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/menuViewStore-BJak0NMm.cjs +0 -3
- package/dist/chunks/menuViewStore-BJak0NMm.cjs.map +0 -1
- package/dist/chunks/menuViewStore-BwR3vgPM.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { create as
|
|
1
|
+
import { create as b } from "zustand";
|
|
2
2
|
import { V as u, am as d } from "./serviceConfig-lAlRNVIw.js";
|
|
3
3
|
import { i as P } from "./envUtils-C9Gf5aek.js";
|
|
4
4
|
import { message as i } from "antd";
|
|
5
|
-
const
|
|
5
|
+
const N = b((r, a) => ({
|
|
6
6
|
favorites: [],
|
|
7
7
|
isLoading: !1,
|
|
8
8
|
error: null,
|
|
@@ -110,20 +110,20 @@ const L = g((r, a) => ({
|
|
|
110
110
|
}
|
|
111
111
|
})), v = {
|
|
112
112
|
DEFAULT_PRNT_GBCD: 1
|
|
113
|
-
},
|
|
114
|
-
let f = [],
|
|
115
|
-
const
|
|
113
|
+
}, p = (r) => r && typeof r == "object" && typeof r.menuId == "string" && typeof r.menuNm == "string" && typeof r.crprCd == "string", g = (r) => Array.isArray(r) && r.every(p);
|
|
114
|
+
let f = [], I = [];
|
|
115
|
+
const T = (r) => {
|
|
116
116
|
if (r && typeof r == "object") {
|
|
117
117
|
const a = r;
|
|
118
|
-
if (a.menus &&
|
|
119
|
-
if (
|
|
118
|
+
if (a.menus && g(a.menus)) return a.menus;
|
|
119
|
+
if (g(r)) return r;
|
|
120
120
|
}
|
|
121
121
|
return console.warn("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."), [];
|
|
122
|
-
},
|
|
122
|
+
}, h = (r, a) => !!a && r.crprCd === a.crprCd && r.userId === a.userId && (r.prntGbcd ?? v.DEFAULT_PRNT_GBCD) === (a.prntGbcd ?? v.DEFAULT_PRNT_GBCD), F = (r) => {
|
|
123
123
|
if (f.length === r.length && f.every(
|
|
124
124
|
(n, s) => n.menuId === r[s]?.menuId && n.menuPrntId === r[s]?.menuPrntId
|
|
125
125
|
))
|
|
126
|
-
return
|
|
126
|
+
return I;
|
|
127
127
|
if (!r.length) return [];
|
|
128
128
|
const a = /* @__PURE__ */ new Map(), e = [];
|
|
129
129
|
r.forEach((n) => n?.menuId && a.set(n.menuId, { ...n, children: [] })), r.forEach((n) => {
|
|
@@ -134,8 +134,8 @@ const h = (r) => {
|
|
|
134
134
|
...s,
|
|
135
135
|
children: s.children && s.children.length ? t(s.children) : void 0
|
|
136
136
|
})), o = t(e);
|
|
137
|
-
return f = [...r],
|
|
138
|
-
}, A =
|
|
137
|
+
return f = [...r], I = o, o;
|
|
138
|
+
}, A = b((r, a) => ({
|
|
139
139
|
// 📊 초기 상태값
|
|
140
140
|
menuList: [],
|
|
141
141
|
flatMenuList: [],
|
|
@@ -150,13 +150,13 @@ const h = (r) => {
|
|
|
150
150
|
userId: t,
|
|
151
151
|
prntGbcd: o ?? v.DEFAULT_PRNT_GBCD
|
|
152
152
|
};
|
|
153
|
-
if (
|
|
153
|
+
if (h(n, a()._lastFetchParams)) {
|
|
154
154
|
console.log("✅ 중복 fetch 차단", n);
|
|
155
155
|
return;
|
|
156
156
|
}
|
|
157
157
|
r({ isLoading: !0, error: null, _lastFetchParams: n });
|
|
158
158
|
try {
|
|
159
|
-
const s = await u(d("AUTH_MENU"), n), c =
|
|
159
|
+
const s = await u(d("AUTH_MENU"), n), c = T(s), l = F(c);
|
|
160
160
|
r({
|
|
161
161
|
flatMenuList: c,
|
|
162
162
|
// 평면 리스트 저장
|
|
@@ -187,7 +187,7 @@ const h = (r) => {
|
|
|
187
187
|
}
|
|
188
188
|
})), M = {
|
|
189
189
|
MAX_TABS: 15
|
|
190
|
-
},
|
|
190
|
+
}, S = b((r, a) => ({
|
|
191
191
|
// 📊 초기 상태값
|
|
192
192
|
activeMenuId: null,
|
|
193
193
|
activeMenuItem: null,
|
|
@@ -196,6 +196,7 @@ const h = (r) => {
|
|
|
196
196
|
maxTabs: M.MAX_TABS,
|
|
197
197
|
tabProtectFlag: {},
|
|
198
198
|
tabParams: {},
|
|
199
|
+
componentLabelMap: {},
|
|
199
200
|
// 🔧 탭 추가 (메뉴 아이템 객체로)
|
|
200
201
|
// 사이드바에서 메뉴 클릭 시 호출되는 메인 함수
|
|
201
202
|
openTabFromMenu: (e, t) => {
|
|
@@ -233,10 +234,10 @@ const h = (r) => {
|
|
|
233
234
|
const o = A.getState().findMenuById(e);
|
|
234
235
|
o ? a().openTabFromMenu(o, t) : (console.warn("❌ 메뉴 ID를 찾을 수 없음:", e), i.warning("메뉴 ID를 찾을 수 없습니다."));
|
|
235
236
|
},
|
|
236
|
-
openTabByComponentId: (e, t
|
|
237
|
-
const { tabs:
|
|
237
|
+
openTabByComponentId: (e, t) => {
|
|
238
|
+
const { tabs: o, activeMenuId: n } = a(), s = o.find((m) => m.key === e), c = a().componentLabelMap[e] ?? e, l = {
|
|
238
239
|
crprCd: "",
|
|
239
|
-
menuNm:
|
|
240
|
+
menuNm: c,
|
|
240
241
|
menuId: e,
|
|
241
242
|
scrnId: e,
|
|
242
243
|
scrnPath: e,
|
|
@@ -249,9 +250,9 @@ const h = (r) => {
|
|
|
249
250
|
menuPrntId: "",
|
|
250
251
|
children: []
|
|
251
252
|
};
|
|
252
|
-
if (
|
|
253
|
-
if (
|
|
254
|
-
r({ activeMenuId: l.menuId, activeMenuItem: l }), a().setTabParams(l.menuId,
|
|
253
|
+
if (s)
|
|
254
|
+
if (n !== l.menuId)
|
|
255
|
+
r({ activeMenuId: l.menuId, activeMenuItem: l }), a().setTabParams(l.menuId, t || {});
|
|
255
256
|
else {
|
|
256
257
|
console.warn("❌ 유효하지 않은 메뉴정보", e), i.warning("유효하지 않은 메뉴정보입니다.");
|
|
257
258
|
return;
|
|
@@ -260,18 +261,18 @@ const h = (r) => {
|
|
|
260
261
|
const m = {
|
|
261
262
|
key: e,
|
|
262
263
|
gubun: "C",
|
|
263
|
-
label:
|
|
264
|
+
label: c,
|
|
264
265
|
menuItem: l,
|
|
265
266
|
closable: !0
|
|
266
267
|
};
|
|
267
268
|
r({
|
|
268
|
-
tabs: [...
|
|
269
|
+
tabs: [...o, m],
|
|
269
270
|
// 탭 목록에 추가
|
|
270
271
|
activeMenuId: e,
|
|
271
272
|
// 새 탭을 활성화
|
|
272
273
|
activeMenuItem: l
|
|
273
274
|
// 현재 프로그램으로 설정
|
|
274
|
-
}), a().setTabParams(e,
|
|
275
|
+
}), a().setTabParams(e, t || {});
|
|
275
276
|
}
|
|
276
277
|
},
|
|
277
278
|
// 🔧 탭 제거
|
|
@@ -324,16 +325,19 @@ const h = (r) => {
|
|
|
324
325
|
const o = { ...t.tabProtectFlag };
|
|
325
326
|
return delete o[e], { tabProtectFlag: o };
|
|
326
327
|
}),
|
|
328
|
+
// 탭 파라미터 설정
|
|
327
329
|
setTabParams: (e, t) => r((o) => {
|
|
328
330
|
const n = o.tabParams[e] || {}, s = { ...t || {} };
|
|
329
331
|
return Object.keys(n).length === Object.keys(s).length && Object.keys(s).every((l) => n[l] === s[l]) ? o : {
|
|
330
332
|
tabParams: { ...o.tabParams, [e]: s }
|
|
331
333
|
};
|
|
332
|
-
})
|
|
334
|
+
}),
|
|
335
|
+
// 컴포넌트 라벨 맵 설정
|
|
336
|
+
setComponentLabelMap: (e, t) => r({ componentLabelMap: e })
|
|
333
337
|
}));
|
|
334
338
|
export {
|
|
335
|
-
|
|
336
|
-
|
|
339
|
+
S as a,
|
|
340
|
+
N as b,
|
|
337
341
|
A as u
|
|
338
342
|
};
|
|
339
|
-
//# sourceMappingURL=menuViewStore-
|
|
343
|
+
//# sourceMappingURL=menuViewStore-BhfgX53f.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menuViewStore-BhfgX53f.js","sources":["../../src/stores/favoriteStore.ts","../../src/stores/menuModelStore.ts","../../src/stores/menuViewStore.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport { callService } from \"../utils/apiUtils\";\r\nimport { getServiceCode } from \"../utils/serviceConfig\";\r\nimport type { MenuItem } from \"./menuModelStore\";\r\nimport { isLocal } from \"@/utils\";\r\n\r\n// 즐겨찾기 메뉴 타입 정의\r\nexport interface FavoriteMenuItem extends MenuItem {\r\n addedAt: string; // 즐겨찾기 추가 시간\r\n userId: string; // 사용자 ID\r\n}\r\n\r\n// 즐겨찾기 스토어 타입 정의\r\nexport interface FavoriteStore {\r\n favorites: FavoriteMenuItem[];\r\n isLoading: boolean;\r\n error: string | null;\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: (params: { crprCd: string; userId: string }) => Promise<void>;\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: (menuItem: MenuItem, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: (menuId: string, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => boolean;\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => void;\r\n}\r\n\r\n// 즐겨찾기 스토어 생성\r\nexport const useFavoriteStore = create<FavoriteStore>((set, get) => ({\r\n favorites: [],\r\n isLoading: false,\r\n error: null,\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: async ({ crprCd, userId }) => {\r\n console.log(\"즐겨찾기 메뉴 요청:\", { crprCd, userId });\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n // 서버에서 즐겨찾기 메뉴 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n crprCd,\r\n userId,\r\n });\r\n\r\n let favoritesList: FavoriteMenuItem[] = [];\r\n\r\n if (data?.favorites && Array.isArray(data.favorites)) {\r\n favoritesList = data.favorites;\r\n } else if (Array.isArray(data)) {\r\n favoritesList = data;\r\n } else {\r\n console.warn(\"즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다.\");\r\n favoritesList = [];\r\n }\r\n\r\n console.log(\"즐겨찾기 메뉴 로드 완료:\", favoritesList);\r\n\r\n // 개발 모드에서 테스트용 즐겨찾기 데이터 추가\r\n if (isLocal && favoritesList.length === 0) {\r\n const testFavorites: FavoriteMenuItem[] = [\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST001\",\r\n menuNm: \"API 테스트\",\r\n scrnId: \"TEST001\",\r\n menuNo: 1,\r\n scrnPath: \"/dev/ApiTest\",\r\n menuLvl: 3,\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST002\",\r\n menuNm: \"프로젝트 개요\",\r\n scrnId: \"DOCS001\",\r\n menuNo: 2,\r\n scrnPath: \"/docs/ProjectOverview\",\r\n menuLvl: 3,\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n ];\r\n set({ favorites: testFavorites, isLoading: false, error: null });\r\n console.log(\"개발 모드: 테스트용 즐겨찾기 데이터 추가\");\r\n } else {\r\n set({ favorites: favoritesList, isLoading: false, error: null });\r\n }\r\n } catch (error) {\r\n console.error(\"즐겨찾기 메뉴 로드 실패:\", error);\r\n set({\r\n error: error instanceof Error ? error.message : \"즐겨찾기 로드 실패\",\r\n isLoading: false,\r\n });\r\n }\r\n },\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: async (menuItem: MenuItem, userId: string) => {\r\n const { favorites } = get();\r\n\r\n // 이미 즐겨찾기에 있는지 확인\r\n if (favorites.some((fav) => fav.menuId === menuItem.menuId)) {\r\n console.log(\"이미 즐겨찾기에 추가된 메뉴입니다:\", menuItem.menuNm);\r\n return;\r\n }\r\n\r\n try {\r\n // 서버에 즐겨찾기 추가 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"add\",\r\n crprCd: menuItem.crprCd,\r\n userId,\r\n menuId: menuItem.menuId,\r\n menuNm: menuItem.menuNm,\r\n scrnPath: menuItem.scrnPath,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const newFavorite: FavoriteMenuItem = {\r\n ...menuItem,\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n };\r\n\r\n set({ favorites: [...favorites, newFavorite] });\r\n console.log(\"즐겨찾기 추가 완료:\", menuItem.menuNm);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 추가 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: async (menuId: string, userId: string) => {\r\n const { favorites } = get();\r\n\r\n try {\r\n // 서버에 즐겨찾기 제거 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"remove\",\r\n crprCd: \"100\", // 기본값\r\n userId,\r\n menuId,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const updatedFavorites = favorites.filter((fav) => fav.menuId !== menuId);\r\n set({ favorites: updatedFavorites });\r\n console.log(\"즐겨찾기 제거 완료:\", menuId);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 제거 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => {\r\n const { favorites } = get();\r\n return favorites.some((fav) => fav.menuId === menuId);\r\n },\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => {\r\n set({ favorites: [], isLoading: false, error: null });\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\n// 필요에 맞게 경로 조정\r\nimport { callService } from \"@/utils/apiUtils\";\r\nimport { getServiceCode } from \"@/utils/serviceConfig\";\r\n\r\n/* ──── Constants ──── */\r\nconst MENU_CONSTANTS = {\r\n DEFAULT_ACTIVE_MENU: \"1\",\r\n DEFAULT_PRNT_GBCD: 1,\r\n COMPANY_CODE: \"100\",\r\n MENU_PARENT_ROOT: \"-\",\r\n MENU_TYPE: { MAIN: \"CMPRGRM\", SUB: \"CMPRGRS\", PROGRAM: \"CMPRGRP\" } as const,\r\n} as const;\r\n\r\n/* ──── Types (이 파일 전용) ──── */\r\nexport interface MenuItem {\r\n crprCd: string;\r\n menuGbCd: string;\r\n menuPrntId: string;\r\n menuId: string;\r\n menuNm: string;\r\n menuNo?: number;\r\n scrnId?: string;\r\n scrnPath?: string;\r\n prsnInfoYn?: \"Y\" | \"N\";\r\n rootMenu: string;\r\n iconCd?: string;\r\n children?: MenuItem[];\r\n}\r\n\r\nexport type FetchMenuParams = {\r\n crprCd: string;\r\n userId: string;\r\n prntGbcd: number;\r\n};\r\n\r\nexport interface MenuApiResponse {\r\n menus?: MenuItem[];\r\n [k: string]: any;\r\n}\r\n\r\n/* 런타임 타입가드 */\r\nconst isMenuItem = (v: any): v is MenuItem =>\r\n v &&\r\n typeof v === \"object\" &&\r\n typeof v.menuId === \"string\" &&\r\n typeof v.menuNm === \"string\" &&\r\n typeof v.crprCd === \"string\";\r\n\r\nconst isMenuItemArray = (v: any): v is MenuItem[] =>\r\n Array.isArray(v) && v.every(isMenuItem);\r\n\r\n/* ──── State Shape ──── */\r\ntype MenuModelState = {\r\n // 📊 State (상태)\r\n // 계층형 메뉴 트리 구조 (부모-자식 관계)\r\n menuList: MenuItem[];\r\n // 평면화된 메뉴 리스트 (검색/조회용)\r\n flatMenuList: MenuItem[];\r\n // 메뉴 데이터 로딩 상태\r\n isLoading: boolean;\r\n // 에러 메시지\r\n error: string | null;\r\n // 마지막 조회 파라미터 (중복 요청 방지)\r\n _lastFetchParams: FetchMenuParams | null;\r\n\r\n // 🔧 Actions (액션 함수들)\r\n // 서버에서 메뉴 데이터 조회\r\n fetchMenu: (p: FetchMenuParams) => Promise<void>;\r\n // 메뉴 데이터 초기화\r\n clearMenu: () => void;\r\n // 메뉴 ID로 특정 메뉴 찾기\r\n findMenuById: (menuId: string) => MenuItem | null;\r\n};\r\n\r\n/* ──── Local Memoization Cache ──── */\r\nlet _lastFlat: MenuItem[] = [];\r\nlet _cachedTree: MenuItem[] = [];\r\n\r\n/* ──── Helpers ──── */\r\nconst parseMenuResponse = (data: unknown): MenuItem[] => {\r\n if (data && typeof data === \"object\") {\r\n const r = data as MenuApiResponse;\r\n if (r.menus && isMenuItemArray(r.menus)) return r.menus;\r\n if (isMenuItemArray(data)) return data;\r\n }\r\n console.warn(\"⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다.\");\r\n return [];\r\n};\r\n\r\nconst sameParams = (a: FetchMenuParams, b: FetchMenuParams | null) =>\r\n !!b &&\r\n a.crprCd === b.crprCd &&\r\n a.userId === b.userId &&\r\n (a.prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD) ===\r\n (b.prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD);\r\n\r\nconst buildHierarchy = (flat: MenuItem[]): MenuItem[] => {\r\n if (\r\n _lastFlat.length === flat.length &&\r\n _lastFlat.every(\r\n (x, i) =>\r\n x.menuId === flat[i]?.menuId && x.menuPrntId === flat[i]?.menuPrntId\r\n )\r\n )\r\n return _cachedTree;\r\n\r\n if (!flat.length) return [];\r\n\r\n const map = new Map<string, MenuItem>();\r\n const roots: MenuItem[] = [];\r\n\r\n flat.forEach((m) => m?.menuId && map.set(m.menuId, { ...m, children: [] }));\r\n flat.forEach((m) => {\r\n const cur = map.get(m.menuId);\r\n if (!cur) return;\r\n if (m.menuPrntId && m.menuPrntId !== \"\" && m.menuPrntId !== \"-\") {\r\n const p = map.get(m.menuPrntId);\r\n p?.children?.push(cur);\r\n } else {\r\n roots.push(cur);\r\n }\r\n });\r\n\r\n const sortRec = (arr: MenuItem[]): MenuItem[] =>\r\n arr\r\n .sort((a, b) => (a?.menuNo ?? 0) - (b?.menuNo ?? 0))\r\n .map((x) => ({\r\n ...x,\r\n children:\r\n x.children && x.children.length ? sortRec(x.children) : undefined,\r\n }));\r\n\r\n const out = sortRec(roots);\r\n _lastFlat = [...flat];\r\n _cachedTree = out;\r\n return out;\r\n};\r\n\r\n/* ──── Store ──── */\r\nexport const useMenuModelStore = create<MenuModelState>((set, get) => ({\r\n // 📊 초기 상태값\r\n menuList: [],\r\n flatMenuList: [],\r\n isLoading: false,\r\n error: null,\r\n _lastFetchParams: null,\r\n\r\n // 🔧 메뉴 모델 조회\r\n // 서버에서 사용자별 메뉴 권한 데이터를 가져와서 트리/플랫 구조로 저장\r\n fetchMenu: async ({ crprCd, userId, prntGbcd }: FetchMenuParams) => {\r\n const p = {\r\n crprCd,\r\n userId,\r\n prntGbcd: prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD,\r\n };\r\n // 중복 요청 방지\r\n if (sameParams(p, get()._lastFetchParams)) {\r\n console.log(\"✅ 중복 fetch 차단\", p);\r\n return;\r\n }\r\n set({ isLoading: true, error: null, _lastFetchParams: p });\r\n try {\r\n // API 호출하여 메뉴 데이터 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_MENU\"), p);\r\n const flat = parseMenuResponse(data); // 응답 데이터 파싱\r\n const tree = buildHierarchy(flat); // 계층 구조 생성\r\n set({\r\n flatMenuList: flat, // 평면 리스트 저장\r\n menuList: tree, // 트리 구조 저장\r\n isLoading: false,\r\n error: null,\r\n });\r\n } catch (e: any) {\r\n set({ isLoading: false, error: e?.message ?? \"메뉴 로드 실패\" });\r\n }\r\n },\r\n\r\n // 🔧 메뉴 모델 초기화\r\n // 로그아웃 시나 사용자 변경 시 메뉴 모델 클리어\r\n clearMenu: () => {\r\n set({\r\n menuList: [],\r\n flatMenuList: [],\r\n error: null,\r\n _lastFetchParams: null,\r\n });\r\n },\r\n\r\n // 🔧 메뉴 ID로 메뉴 아이템 찾기\r\n // URL 파라미터나 프로그래밍 방식으로 특정 메뉴를 찾을 때 사용\r\n findMenuById: (menuId: string) => {\r\n const { flatMenuList } = get();\r\n return flatMenuList.find((m) => m.menuId === menuId) ?? null;\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\nimport React from \"react\";\r\nimport { MenuItem, useMenuModelStore } from \"./menuModelStore\";\r\nimport { message } from \"antd\";\r\n\r\n/* ──── Constants (UI 측에도 독립적으로 존재) ──── */\r\nconst MENU_CONSTANTS = {\r\n DEFAULT_ACTIVE_MENU: \"1\",\r\n MAX_TABS: 15,\r\n} as const;\r\n\r\n/* ──── Types (이 파일 전용) ──── */\r\nexport interface TabItem {\r\n key: string; // menuId\r\n label: string; // menuNm\r\n gubun: \"M\" | \"C\"; // menuId or componentPath\r\n menuItem: MenuItem;\r\n\r\n closable: boolean;\r\n}\r\n\r\n/* ──── State Shape ──── */\r\ntype MenuViewState = {\r\n // 📊 UI State (화면 상태)\r\n // 현재 활성화된 메뉴 ID\r\n activeMenuId: string | undefined | null;\r\n // 현재 활성화된 메뉴 정보\r\n activeMenuItem: MenuItem | null;\r\n // 열린 탭 목록\r\n tabs: TabItem[];\r\n // 사이드바 접힘/펼침 상태\r\n sidebarCollapsed: boolean;\r\n // 최대 탭 개수\r\n maxTabs: number;\r\n tabProtectFlag: Record<string, boolean>;\r\n // 탭 파라미터\r\n tabParams: Record<string, Record<string, any>>;\r\n // 컴포넌트 라벨 맵\r\n componentLabelMap: Record<string, string>;\r\n\r\n /* 🛠 UI Actions (UI 액션 함수들) */\r\n // 메뉴 아이템으로 탭 추가\r\n openTabFromMenu: (menuItem: MenuItem, params?: Record<string, any>) => void;\r\n // 메뉴 ID로 탭 추가 (URL 파라미터 처리용)\r\n openTabByMenuId: (menuId: string, params?: Record<string, any>) => void;\r\n // 컴포넌트 ID로 탭 추가\r\n openTabByComponentId: (cpntId: string, params?: Record<string, any>) => void;\r\n // 활성 탭 변경\r\n focusTab: (tabKey: string) => void;\r\n // 탭 제거\r\n closeTab: (tabKey: string) => void;\r\n // 모든 탭 제거\r\n closeAllTabs: () => void;\r\n // 사이드바 토글\r\n toggleSidebar: () => void;\r\n // 탭 순서 변경\r\n reorderTabs: (keys: string[]) => void;\r\n // 개인정보 포함여부에 따른 탭 잠금 Flag 설정\r\n setProtectFlagForKey: (key: string) => void;\r\n // 개인정보 포함여부에 따른 탭 잠금 해제\r\n clearProtectFlagForKey: (key: string) => void;\r\n // 탭 파라미터 설정\r\n setTabParams: (key: string, params: Record<string, any>) => void;\r\n //컴포넌트 라벨 맵 설정\r\n setComponentLabelMap: (map: Record<string, string>, merge?: boolean) => void;\r\n};\r\n\r\n/* ──── Store ──── */\r\nexport const useMenuViewStore = create<MenuViewState>((set, get) => ({\r\n // 📊 초기 상태값\r\n activeMenuId: null,\r\n activeMenuItem: null,\r\n tabs: [],\r\n sidebarCollapsed: false,\r\n maxTabs: MENU_CONSTANTS.MAX_TABS,\r\n tabProtectFlag: {},\r\n tabParams: {},\r\n componentLabelMap: {},\r\n // 🔧 탭 추가 (메뉴 아이템 객체로)\r\n // 사이드바에서 메뉴 클릭 시 호출되는 메인 함수\r\n openTabFromMenu: (menuItem, params) => {\r\n const { tabs, activeMenuId } = get();\r\n const exists = tabs.find((t) => t.key === menuItem.menuId);\r\n\r\n // 새 탭 생성\r\n if (!exists) {\r\n // 2. 최대 탭 개수 확인\r\n if (tabs.length > MENU_CONSTANTS.MAX_TABS) {\r\n console.warn(\"❌ 최대 탭 개수를 초과했습니다.\");\r\n message.warning(\r\n `최대 ${MENU_CONSTANTS.MAX_TABS}개의 탭만 열 수 있습니다.\\n기존 탭을 닫고 다시 시도해주세요.`\r\n );\r\n return;\r\n }\r\n const newTab: TabItem = {\r\n key: menuItem.menuId,\r\n label: menuItem.menuNm,\r\n gubun: \"M\",\r\n menuItem: menuItem as MenuItem,\r\n closable: true,\r\n };\r\n set({\r\n tabs: [...tabs, newTab], // 탭 목록에 추가\r\n activeMenuId: menuItem.menuId, // 새 탭을 활성화\r\n activeMenuItem: menuItem, // 현재 프로그램으로 설정\r\n });\r\n get().setTabParams(menuItem.menuId, params || {});\r\n console.log(\"✅ 새 탭 추가 - activeMenuItem:\", menuItem);\r\n\r\n // 개인정보 메뉴만 Protect\r\n if (menuItem?.prsnInfoYn === \"Y\") {\r\n get().setProtectFlagForKey(menuItem.menuId);\r\n }\r\n } else if (activeMenuId !== menuItem.menuId) {\r\n // 이미 존재하는 탭이면 활성화만\r\n set({ activeMenuId: menuItem.menuId, activeMenuItem: menuItem });\r\n console.log(\"✅ 기존 탭 활성화 - activeMenuItem:\", menuItem);\r\n get().setTabParams(menuItem.menuId, params || {});\r\n // 개인정보 메뉴만 Protect\r\n if (menuItem?.prsnInfoYn === \"Y\") {\r\n get().setProtectFlagForKey(menuItem.menuId);\r\n }\r\n } else {\r\n console.warn(\"❌ 유효하지 않은 메뉴정보\", menuItem.menuId);\r\n message.warning(\"유효하지 않은 메뉴정보입니다.\");\r\n }\r\n },\r\n // 🔧 탭 추가 (메뉴 ID로)\r\n // URL 파라미터로 메뉴 열기 시 사용 (예: ?menuId=CM000301)\r\n openTabByMenuId: (menuId, params) => {\r\n const target = useMenuModelStore.getState().findMenuById(menuId);\r\n if (!target) {\r\n console.warn(\"❌ 메뉴 ID를 찾을 수 없음:\", menuId);\r\n message.warning(\"메뉴 ID를 찾을 수 없습니다.\");\r\n } else {\r\n get().openTabFromMenu(target, params); // 찾은 메뉴로 탭 추가\r\n }\r\n },\r\n openTabByComponentId: (cpntId, params) => {\r\n const { tabs, activeMenuId } = get();\r\n const exists = tabs.find((t) => t.key === cpntId);\r\n const cpntNm = get().componentLabelMap[cpntId] ?? cpntId;\r\n\r\n const menuItem = {\r\n crprCd: \"\",\r\n menuNm: cpntNm,\r\n menuId: cpntId,\r\n scrnId: cpntId,\r\n scrnPath: cpntId,\r\n menuNo: undefined,\r\n menuLvl: 0,\r\n prsnInfoYn: \"N\" as const,\r\n rootMenu: \"\",\r\n iconCd: \"\",\r\n menuGbCd: \"\",\r\n menuPrntId: \"\",\r\n children: [],\r\n };\r\n // 새 탭 생성\r\n if (!exists) {\r\n const newTab: TabItem = {\r\n key: cpntId,\r\n gubun: \"C\",\r\n label: cpntNm,\r\n menuItem,\r\n closable: true,\r\n };\r\n\r\n set({\r\n tabs: [...tabs, newTab], // 탭 목록에 추가\r\n activeMenuId: cpntId, // 새 탭을 활성화\r\n activeMenuItem: menuItem, // 현재 프로그램으로 설정\r\n });\r\n get().setTabParams(cpntId, params || {});\r\n } else if (activeMenuId !== menuItem.menuId) {\r\n // 이미 존재하는 탭이면 활성화만\r\n set({ activeMenuId: menuItem.menuId, activeMenuItem: menuItem });\r\n get().setTabParams(menuItem.menuId, params || {});\r\n } else {\r\n console.warn(\"❌ 유효하지 않은 메뉴정보\", cpntId);\r\n message.warning(\"유효하지 않은 메뉴정보입니다.\");\r\n return;\r\n }\r\n },\r\n // 🔧 탭 제거\r\n // X 버튼 클릭 시 탭을 닫고 관련 상태도 정리\r\n closeTab: (tabKey) => {\r\n const { tabs, activeMenuId } = get();\r\n const removed = tabs.find((t) => t.key === tabKey);\r\n const nextTabs = tabs.filter((t) => t.key !== tabKey);\r\n\r\n // 닫힌 탭이 현재 활성 탭이면 다음 탭으로 이동\r\n let nextActive = activeMenuId;\r\n if (activeMenuId === tabKey) {\r\n const idx = tabs.findIndex((t) => t.key === tabKey);\r\n nextActive = nextTabs.length\r\n ? nextTabs[Math.min(idx, nextTabs.length - 1)]?.key ?? null\r\n : null;\r\n }\r\n\r\n set({\r\n tabs: nextTabs,\r\n });\r\n\r\n if (nextActive) get().focusTab(nextActive);\r\n },\r\n // 🔧 활성 탭 변경\r\n // 탭 헤더 클릭 시 해당 탭으로 전환\r\n focusTab: (tabKey) => {\r\n const { tabs } = get();\r\n const target = tabs.find((t) => t.key === tabKey);\r\n\r\n if (target) {\r\n if (target.menuItem.prsnInfoYn === \"Y\") {\r\n set({\r\n activeMenuId: tabKey,\r\n activeMenuItem: target.menuItem,\r\n });\r\n console.log(\r\n \"✅ 탭 포커스 (개인정보) - activeMenuItem:\",\r\n target.menuItem\r\n );\r\n get().setProtectFlagForKey(tabKey);\r\n } else {\r\n set({\r\n activeMenuId: tabKey,\r\n activeMenuItem: target.menuItem,\r\n });\r\n console.log(\"✅ 탭 포커스 (일반) - activeMenuItem:\", target.menuItem);\r\n get().clearProtectFlagForKey(tabKey);\r\n }\r\n } else {\r\n set({ activeMenuId: tabKey, activeMenuItem: null });\r\n console.warn(\"❌ 탭을 찾을 수 없음:\", tabKey);\r\n }\r\n },\r\n\r\n // 🔧 모든 탭 제거\r\n // 로그아웃이나 전체 초기화 시 사용\r\n closeAllTabs: () =>\r\n set({ tabs: [], activeMenuId: null, activeMenuItem: null }),\r\n\r\n // 🔧 사이드바 토글\r\n // 햄버거 메뉴 클릭 시 사이드바 접기/펼치기\r\n toggleSidebar: () => set((s) => ({ sidebarCollapsed: !s.sidebarCollapsed })),\r\n\r\n // useMenuViewStore.ts\r\n reorderTabs: (keys: string[]) =>\r\n set((state) => {\r\n const map = new Map(state.tabs.map((t) => [t.key, t]));\r\n return { tabs: keys.map((k) => map.get(k)!).filter(Boolean) };\r\n }),\r\n // 개인정보 포함여부에 따른 탭 잠금 Flag 설정\r\n setProtectFlagForKey: (key: string) =>\r\n set((s) => ({\r\n tabProtectFlag: { ...s.tabProtectFlag, [key]: true },\r\n })),\r\n // 개인정보 포함여부에 따른 탭 잠금 해제\r\n clearProtectFlagForKey: (key: string) =>\r\n set((s) => {\r\n const newFlags = { ...s.tabProtectFlag };\r\n delete newFlags[key];\r\n return { tabProtectFlag: newFlags };\r\n }),\r\n // 탭 파라미터 설정\r\n setTabParams: (key, params) =>\r\n set((state) => {\r\n const prev = state.tabParams[key] || {};\r\n const next = { ...(params || {}) }; // 새 객체 (불변 보장)\r\n\r\n // shallow equal이면 스킵(불필요 렌더 방지)\r\n const isShallowEqual =\r\n Object.keys(prev).length === Object.keys(next).length &&\r\n Object.keys(next).every((k) => prev[k] === next[k]);\r\n if (isShallowEqual) return state;\r\n\r\n return {\r\n tabParams: { ...state.tabParams, [key]: next },\r\n };\r\n }),\r\n // 컴포넌트 라벨 맵 설정\r\n setComponentLabelMap: (map: Record<string, string>, merge?: boolean) =>\r\n set({ componentLabelMap: map }),\r\n}));\r\n"],"names":["useFavoriteStore","create","set","get","crprCd","userId","data","callService","getServiceCode","favoritesList","isLocal","testFavorites","error","menuItem","favorites","fav","newFavorite","menuId","updatedFavorites","MENU_CONSTANTS","isMenuItem","v","isMenuItemArray","_lastFlat","_cachedTree","parseMenuResponse","r","sameParams","a","b","buildHierarchy","flat","x","i","map","roots","m","cur","sortRec","arr","out","useMenuModelStore","prntGbcd","p","tree","e","flatMenuList","useMenuViewStore","params","tabs","activeMenuId","t","message","newTab","target","cpntId","exists","cpntNm","tabKey","nextTabs","nextActive","idx","s","keys","state","k","key","newFlags","prev","next","merge"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";const M=require("zustand"),i=require("./serviceConfig-Cc8jfw_Y.cjs"),P=require("./envUtils-CduTHoHu.cjs"),u=require("antd"),T=M.create((r,a)=>({favorites:[],isLoading:!1,error:null,fetchFavorites:async({crprCd:e,userId:t})=>{console.log("즐겨찾기 메뉴 요청:",{crprCd:e,userId:t}),r({isLoading:!0,error:null});try{const o=await i.callService(i.getServiceCode("AUTH_BMRK"),{crprCd:e,userId:t});let n=[];if(o?.favorites&&Array.isArray(o.favorites)?n=o.favorites:Array.isArray(o)?n=o:(console.warn("즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다."),n=[]),console.log("즐겨찾기 메뉴 로드 완료:",n),P.isLocal&&n.length===0){const s=[{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST001",menuNm:"API 테스트",scrnId:"TEST001",menuNo:1,scrnPath:"/dev/ApiTest",menuLvl:3,rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:t},{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST002",menuNm:"프로젝트 개요",scrnId:"DOCS001",menuNo:2,scrnPath:"/docs/ProjectOverview",menuLvl:3,rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:t}];r({favorites:s,isLoading:!1,error:null}),console.log("개발 모드: 테스트용 즐겨찾기 데이터 추가")}else r({favorites:n,isLoading:!1,error:null})}catch(o){console.error("즐겨찾기 메뉴 로드 실패:",o),r({error:o instanceof Error?o.message:"즐겨찾기 로드 실패",isLoading:!1})}},addFavorite:async(e,t)=>{const{favorites:o}=a();if(o.some(n=>n.menuId===e.menuId)){console.log("이미 즐겨찾기에 추가된 메뉴입니다:",e.menuNm);return}try{await i.callService(i.getServiceCode("AUTH_BMRK"),{action:"add",crprCd:e.crprCd,userId:t,menuId:e.menuId,menuNm:e.menuNm,scrnPath:e.scrnPath});const n={...e,addedAt:new Date().toISOString(),userId:t};r({favorites:[...o,n]}),console.log("즐겨찾기 추가 완료:",e.menuNm)}catch(n){throw console.error("즐겨찾기 추가 실패:",n),n}},removeFavorite:async(e,t)=>{const{favorites:o}=a();try{await i.callService(i.getServiceCode("AUTH_BMRK"),{action:"remove",crprCd:"100",userId:t,menuId:e});const n=o.filter(s=>s.menuId!==e);r({favorites:n}),console.log("즐겨찾기 제거 완료:",e)}catch(n){throw console.error("즐겨찾기 제거 실패:",n),n}},isFavorite:e=>{const{favorites:t}=a();return t.some(o=>o.menuId===e)},clearFavorites:()=>{r({favorites:[],isLoading:!1,error:null})}})),v={DEFAULT_PRNT_GBCD:1},F=r=>r&&typeof r=="object"&&typeof r.menuId=="string"&&typeof r.menuNm=="string"&&typeof r.crprCd=="string",g=r=>Array.isArray(r)&&r.every(F);let m=[],b=[];const h=r=>{if(r&&typeof r=="object"){const a=r;if(a.menus&&g(a.menus))return a.menus;if(g(r))return r}return console.warn("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."),[]},p=(r,a)=>!!a&&r.crprCd===a.crprCd&&r.userId===a.userId&&(r.prntGbcd??v.DEFAULT_PRNT_GBCD)===(a.prntGbcd??v.DEFAULT_PRNT_GBCD),A=r=>{if(m.length===r.length&&m.every((n,s)=>n.menuId===r[s]?.menuId&&n.menuPrntId===r[s]?.menuPrntId))return b;if(!r.length)return[];const a=new Map,e=[];r.forEach(n=>n?.menuId&&a.set(n.menuId,{...n,children:[]})),r.forEach(n=>{const s=a.get(n.menuId);s&&(n.menuPrntId&&n.menuPrntId!==""&&n.menuPrntId!=="-"?a.get(n.menuPrntId)?.children?.push(s):e.push(s))});const t=n=>n.sort((s,c)=>(s?.menuNo??0)-(c?.menuNo??0)).map(s=>({...s,children:s.children&&s.children.length?t(s.children):void 0})),o=t(e);return m=[...r],b=o,o},I=M.create((r,a)=>({menuList:[],flatMenuList:[],isLoading:!1,error:null,_lastFetchParams:null,fetchMenu:async({crprCd:e,userId:t,prntGbcd:o})=>{const n={crprCd:e,userId:t,prntGbcd:o??v.DEFAULT_PRNT_GBCD};if(p(n,a()._lastFetchParams)){console.log("✅ 중복 fetch 차단",n);return}r({isLoading:!0,error:null,_lastFetchParams:n});try{const s=await i.callService(i.getServiceCode("AUTH_MENU"),n),c=h(s),l=A(c);r({flatMenuList:c,menuList:l,isLoading:!1,error:null})}catch(s){r({isLoading:!1,error:s?.message??"메뉴 로드 실패"})}},clearMenu:()=>{r({menuList:[],flatMenuList:[],error:null,_lastFetchParams:null})},findMenuById:e=>{const{flatMenuList:t}=a();return t.find(o=>o.menuId===e)??null}})),f={MAX_TABS:15},y=M.create((r,a)=>({activeMenuId:null,activeMenuItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:f.MAX_TABS,tabProtectFlag:{},tabParams:{},componentLabelMap:{},openTabFromMenu:(e,t)=>{const{tabs:o,activeMenuId:n}=a();if(o.find(c=>c.key===e.menuId))n!==e.menuId?(r({activeMenuId:e.menuId,activeMenuItem:e}),console.log("✅ 기존 탭 활성화 - activeMenuItem:",e),a().setTabParams(e.menuId,t||{}),e?.prsnInfoYn==="Y"&&a().setProtectFlagForKey(e.menuId)):(console.warn("❌ 유효하지 않은 메뉴정보",e.menuId),u.message.warning("유효하지 않은 메뉴정보입니다."));else{if(o.length>f.MAX_TABS){console.warn("❌ 최대 탭 개수를 초과했습니다."),u.message.warning(`최대 ${f.MAX_TABS}개의 탭만 열 수 있습니다.
|
|
2
|
+
기존 탭을 닫고 다시 시도해주세요.`);return}const c={key:e.menuId,label:e.menuNm,gubun:"M",menuItem:e,closable:!0};r({tabs:[...o,c],activeMenuId:e.menuId,activeMenuItem:e}),a().setTabParams(e.menuId,t||{}),console.log("✅ 새 탭 추가 - activeMenuItem:",e),e?.prsnInfoYn==="Y"&&a().setProtectFlagForKey(e.menuId)}},openTabByMenuId:(e,t)=>{const o=I.getState().findMenuById(e);o?a().openTabFromMenu(o,t):(console.warn("❌ 메뉴 ID를 찾을 수 없음:",e),u.message.warning("메뉴 ID를 찾을 수 없습니다."))},openTabByComponentId:(e,t)=>{const{tabs:o,activeMenuId:n}=a(),s=o.find(d=>d.key===e),c=a().componentLabelMap[e]??e,l={crprCd:"",menuNm:c,menuId:e,scrnId:e,scrnPath:e,menuNo:void 0,menuLvl:0,prsnInfoYn:"N",rootMenu:"",iconCd:"",menuGbCd:"",menuPrntId:"",children:[]};if(s)if(n!==l.menuId)r({activeMenuId:l.menuId,activeMenuItem:l}),a().setTabParams(l.menuId,t||{});else{console.warn("❌ 유효하지 않은 메뉴정보",e),u.message.warning("유효하지 않은 메뉴정보입니다.");return}else{const d={key:e,gubun:"C",label:c,menuItem:l,closable:!0};r({tabs:[...o,d],activeMenuId:e,activeMenuItem:l}),a().setTabParams(e,t||{})}},closeTab:e=>{const{tabs:t,activeMenuId:o}=a();t.find(c=>c.key===e);const n=t.filter(c=>c.key!==e);let s=o;if(o===e){const c=t.findIndex(l=>l.key===e);s=n.length?n[Math.min(c,n.length-1)]?.key??null:null}r({tabs:n}),s&&a().focusTab(s)},focusTab:e=>{const{tabs:t}=a(),o=t.find(n=>n.key===e);o?o.menuItem.prsnInfoYn==="Y"?(r({activeMenuId:e,activeMenuItem:o.menuItem}),console.log("✅ 탭 포커스 (개인정보) - activeMenuItem:",o.menuItem),a().setProtectFlagForKey(e)):(r({activeMenuId:e,activeMenuItem:o.menuItem}),console.log("✅ 탭 포커스 (일반) - activeMenuItem:",o.menuItem),a().clearProtectFlagForKey(e)):(r({activeMenuId:e,activeMenuItem:null}),console.warn("❌ 탭을 찾을 수 없음:",e))},closeAllTabs:()=>r({tabs:[],activeMenuId:null,activeMenuItem:null}),toggleSidebar:()=>r(e=>({sidebarCollapsed:!e.sidebarCollapsed})),reorderTabs:e=>r(t=>{const o=new Map(t.tabs.map(n=>[n.key,n]));return{tabs:e.map(n=>o.get(n)).filter(Boolean)}}),setProtectFlagForKey:e=>r(t=>({tabProtectFlag:{...t.tabProtectFlag,[e]:!0}})),clearProtectFlagForKey:e=>r(t=>{const o={...t.tabProtectFlag};return delete o[e],{tabProtectFlag:o}}),setTabParams:(e,t)=>r(o=>{const n=o.tabParams[e]||{},s={...t||{}};return Object.keys(n).length===Object.keys(s).length&&Object.keys(s).every(l=>n[l]===s[l])?o:{tabParams:{...o.tabParams,[e]:s}}}),setComponentLabelMap:(e,t)=>r({componentLabelMap:e})}));exports.useFavoriteStore=T;exports.useMenuModelStore=I;exports.useMenuViewStore=y;
|
|
3
|
+
//# sourceMappingURL=menuViewStore-w4fLSR6N.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menuViewStore-w4fLSR6N.cjs","sources":["../../src/stores/favoriteStore.ts","../../src/stores/menuModelStore.ts","../../src/stores/menuViewStore.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport { callService } from \"../utils/apiUtils\";\r\nimport { getServiceCode } from \"../utils/serviceConfig\";\r\nimport type { MenuItem } from \"./menuModelStore\";\r\nimport { isLocal } from \"@/utils\";\r\n\r\n// 즐겨찾기 메뉴 타입 정의\r\nexport interface FavoriteMenuItem extends MenuItem {\r\n addedAt: string; // 즐겨찾기 추가 시간\r\n userId: string; // 사용자 ID\r\n}\r\n\r\n// 즐겨찾기 스토어 타입 정의\r\nexport interface FavoriteStore {\r\n favorites: FavoriteMenuItem[];\r\n isLoading: boolean;\r\n error: string | null;\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: (params: { crprCd: string; userId: string }) => Promise<void>;\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: (menuItem: MenuItem, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: (menuId: string, userId: string) => Promise<void>;\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => boolean;\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => void;\r\n}\r\n\r\n// 즐겨찾기 스토어 생성\r\nexport const useFavoriteStore = create<FavoriteStore>((set, get) => ({\r\n favorites: [],\r\n isLoading: false,\r\n error: null,\r\n\r\n // 즐겨찾기 메뉴 가져오기\r\n fetchFavorites: async ({ crprCd, userId }) => {\r\n console.log(\"즐겨찾기 메뉴 요청:\", { crprCd, userId });\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n // 서버에서 즐겨찾기 메뉴 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n crprCd,\r\n userId,\r\n });\r\n\r\n let favoritesList: FavoriteMenuItem[] = [];\r\n\r\n if (data?.favorites && Array.isArray(data.favorites)) {\r\n favoritesList = data.favorites;\r\n } else if (Array.isArray(data)) {\r\n favoritesList = data;\r\n } else {\r\n console.warn(\"즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다.\");\r\n favoritesList = [];\r\n }\r\n\r\n console.log(\"즐겨찾기 메뉴 로드 완료:\", favoritesList);\r\n\r\n // 개발 모드에서 테스트용 즐겨찾기 데이터 추가\r\n if (isLocal && favoritesList.length === 0) {\r\n const testFavorites: FavoriteMenuItem[] = [\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST001\",\r\n menuNm: \"API 테스트\",\r\n scrnId: \"TEST001\",\r\n menuNo: 1,\r\n scrnPath: \"/dev/ApiTest\",\r\n menuLvl: 3,\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n {\r\n crprCd: \"100\",\r\n menuGbCd: \"CMPRGRP\",\r\n menuPrntId: \"FAV001\",\r\n menuId: \"FAV_TEST002\",\r\n menuNm: \"프로젝트 개요\",\r\n scrnId: \"DOCS001\",\r\n menuNo: 2,\r\n scrnPath: \"/docs/ProjectOverview\",\r\n menuLvl: 3,\r\n rootMenu: \"FAV001\",\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n },\r\n ];\r\n set({ favorites: testFavorites, isLoading: false, error: null });\r\n console.log(\"개발 모드: 테스트용 즐겨찾기 데이터 추가\");\r\n } else {\r\n set({ favorites: favoritesList, isLoading: false, error: null });\r\n }\r\n } catch (error) {\r\n console.error(\"즐겨찾기 메뉴 로드 실패:\", error);\r\n set({\r\n error: error instanceof Error ? error.message : \"즐겨찾기 로드 실패\",\r\n isLoading: false,\r\n });\r\n }\r\n },\r\n\r\n // 즐겨찾기 추가\r\n addFavorite: async (menuItem: MenuItem, userId: string) => {\r\n const { favorites } = get();\r\n\r\n // 이미 즐겨찾기에 있는지 확인\r\n if (favorites.some((fav) => fav.menuId === menuItem.menuId)) {\r\n console.log(\"이미 즐겨찾기에 추가된 메뉴입니다:\", menuItem.menuNm);\r\n return;\r\n }\r\n\r\n try {\r\n // 서버에 즐겨찾기 추가 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"add\",\r\n crprCd: menuItem.crprCd,\r\n userId,\r\n menuId: menuItem.menuId,\r\n menuNm: menuItem.menuNm,\r\n scrnPath: menuItem.scrnPath,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const newFavorite: FavoriteMenuItem = {\r\n ...menuItem,\r\n addedAt: new Date().toISOString(),\r\n userId,\r\n };\r\n\r\n set({ favorites: [...favorites, newFavorite] });\r\n console.log(\"즐겨찾기 추가 완료:\", menuItem.menuNm);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 추가 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 제거\r\n removeFavorite: async (menuId: string, userId: string) => {\r\n const { favorites } = get();\r\n\r\n try {\r\n // 서버에 즐겨찾기 제거 요청\r\n await callService(getServiceCode(\"AUTH_BMRK\"), {\r\n action: \"remove\",\r\n crprCd: \"100\", // 기본값\r\n userId,\r\n menuId,\r\n });\r\n\r\n // 로컬 상태 업데이트\r\n const updatedFavorites = favorites.filter((fav) => fav.menuId !== menuId);\r\n set({ favorites: updatedFavorites });\r\n console.log(\"즐겨찾기 제거 완료:\", menuId);\r\n } catch (error) {\r\n console.error(\"즐겨찾기 제거 실패:\", error);\r\n throw error;\r\n }\r\n },\r\n\r\n // 즐겨찾기 여부 확인\r\n isFavorite: (menuId: string) => {\r\n const { favorites } = get();\r\n return favorites.some((fav) => fav.menuId === menuId);\r\n },\r\n\r\n // 즐겨찾기 초기화\r\n clearFavorites: () => {\r\n set({ favorites: [], isLoading: false, error: null });\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\n// 필요에 맞게 경로 조정\r\nimport { callService } from \"@/utils/apiUtils\";\r\nimport { getServiceCode } from \"@/utils/serviceConfig\";\r\n\r\n/* ──── Constants ──── */\r\nconst MENU_CONSTANTS = {\r\n DEFAULT_ACTIVE_MENU: \"1\",\r\n DEFAULT_PRNT_GBCD: 1,\r\n COMPANY_CODE: \"100\",\r\n MENU_PARENT_ROOT: \"-\",\r\n MENU_TYPE: { MAIN: \"CMPRGRM\", SUB: \"CMPRGRS\", PROGRAM: \"CMPRGRP\" } as const,\r\n} as const;\r\n\r\n/* ──── Types (이 파일 전용) ──── */\r\nexport interface MenuItem {\r\n crprCd: string;\r\n menuGbCd: string;\r\n menuPrntId: string;\r\n menuId: string;\r\n menuNm: string;\r\n menuNo?: number;\r\n scrnId?: string;\r\n scrnPath?: string;\r\n prsnInfoYn?: \"Y\" | \"N\";\r\n rootMenu: string;\r\n iconCd?: string;\r\n children?: MenuItem[];\r\n}\r\n\r\nexport type FetchMenuParams = {\r\n crprCd: string;\r\n userId: string;\r\n prntGbcd: number;\r\n};\r\n\r\nexport interface MenuApiResponse {\r\n menus?: MenuItem[];\r\n [k: string]: any;\r\n}\r\n\r\n/* 런타임 타입가드 */\r\nconst isMenuItem = (v: any): v is MenuItem =>\r\n v &&\r\n typeof v === \"object\" &&\r\n typeof v.menuId === \"string\" &&\r\n typeof v.menuNm === \"string\" &&\r\n typeof v.crprCd === \"string\";\r\n\r\nconst isMenuItemArray = (v: any): v is MenuItem[] =>\r\n Array.isArray(v) && v.every(isMenuItem);\r\n\r\n/* ──── State Shape ──── */\r\ntype MenuModelState = {\r\n // 📊 State (상태)\r\n // 계층형 메뉴 트리 구조 (부모-자식 관계)\r\n menuList: MenuItem[];\r\n // 평면화된 메뉴 리스트 (검색/조회용)\r\n flatMenuList: MenuItem[];\r\n // 메뉴 데이터 로딩 상태\r\n isLoading: boolean;\r\n // 에러 메시지\r\n error: string | null;\r\n // 마지막 조회 파라미터 (중복 요청 방지)\r\n _lastFetchParams: FetchMenuParams | null;\r\n\r\n // 🔧 Actions (액션 함수들)\r\n // 서버에서 메뉴 데이터 조회\r\n fetchMenu: (p: FetchMenuParams) => Promise<void>;\r\n // 메뉴 데이터 초기화\r\n clearMenu: () => void;\r\n // 메뉴 ID로 특정 메뉴 찾기\r\n findMenuById: (menuId: string) => MenuItem | null;\r\n};\r\n\r\n/* ──── Local Memoization Cache ──── */\r\nlet _lastFlat: MenuItem[] = [];\r\nlet _cachedTree: MenuItem[] = [];\r\n\r\n/* ──── Helpers ──── */\r\nconst parseMenuResponse = (data: unknown): MenuItem[] => {\r\n if (data && typeof data === \"object\") {\r\n const r = data as MenuApiResponse;\r\n if (r.menus && isMenuItemArray(r.menus)) return r.menus;\r\n if (isMenuItemArray(data)) return data;\r\n }\r\n console.warn(\"⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다.\");\r\n return [];\r\n};\r\n\r\nconst sameParams = (a: FetchMenuParams, b: FetchMenuParams | null) =>\r\n !!b &&\r\n a.crprCd === b.crprCd &&\r\n a.userId === b.userId &&\r\n (a.prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD) ===\r\n (b.prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD);\r\n\r\nconst buildHierarchy = (flat: MenuItem[]): MenuItem[] => {\r\n if (\r\n _lastFlat.length === flat.length &&\r\n _lastFlat.every(\r\n (x, i) =>\r\n x.menuId === flat[i]?.menuId && x.menuPrntId === flat[i]?.menuPrntId\r\n )\r\n )\r\n return _cachedTree;\r\n\r\n if (!flat.length) return [];\r\n\r\n const map = new Map<string, MenuItem>();\r\n const roots: MenuItem[] = [];\r\n\r\n flat.forEach((m) => m?.menuId && map.set(m.menuId, { ...m, children: [] }));\r\n flat.forEach((m) => {\r\n const cur = map.get(m.menuId);\r\n if (!cur) return;\r\n if (m.menuPrntId && m.menuPrntId !== \"\" && m.menuPrntId !== \"-\") {\r\n const p = map.get(m.menuPrntId);\r\n p?.children?.push(cur);\r\n } else {\r\n roots.push(cur);\r\n }\r\n });\r\n\r\n const sortRec = (arr: MenuItem[]): MenuItem[] =>\r\n arr\r\n .sort((a, b) => (a?.menuNo ?? 0) - (b?.menuNo ?? 0))\r\n .map((x) => ({\r\n ...x,\r\n children:\r\n x.children && x.children.length ? sortRec(x.children) : undefined,\r\n }));\r\n\r\n const out = sortRec(roots);\r\n _lastFlat = [...flat];\r\n _cachedTree = out;\r\n return out;\r\n};\r\n\r\n/* ──── Store ──── */\r\nexport const useMenuModelStore = create<MenuModelState>((set, get) => ({\r\n // 📊 초기 상태값\r\n menuList: [],\r\n flatMenuList: [],\r\n isLoading: false,\r\n error: null,\r\n _lastFetchParams: null,\r\n\r\n // 🔧 메뉴 모델 조회\r\n // 서버에서 사용자별 메뉴 권한 데이터를 가져와서 트리/플랫 구조로 저장\r\n fetchMenu: async ({ crprCd, userId, prntGbcd }: FetchMenuParams) => {\r\n const p = {\r\n crprCd,\r\n userId,\r\n prntGbcd: prntGbcd ?? MENU_CONSTANTS.DEFAULT_PRNT_GBCD,\r\n };\r\n // 중복 요청 방지\r\n if (sameParams(p, get()._lastFetchParams)) {\r\n console.log(\"✅ 중복 fetch 차단\", p);\r\n return;\r\n }\r\n set({ isLoading: true, error: null, _lastFetchParams: p });\r\n try {\r\n // API 호출하여 메뉴 데이터 가져오기\r\n const data = await callService(getServiceCode(\"AUTH_MENU\"), p);\r\n const flat = parseMenuResponse(data); // 응답 데이터 파싱\r\n const tree = buildHierarchy(flat); // 계층 구조 생성\r\n set({\r\n flatMenuList: flat, // 평면 리스트 저장\r\n menuList: tree, // 트리 구조 저장\r\n isLoading: false,\r\n error: null,\r\n });\r\n } catch (e: any) {\r\n set({ isLoading: false, error: e?.message ?? \"메뉴 로드 실패\" });\r\n }\r\n },\r\n\r\n // 🔧 메뉴 모델 초기화\r\n // 로그아웃 시나 사용자 변경 시 메뉴 모델 클리어\r\n clearMenu: () => {\r\n set({\r\n menuList: [],\r\n flatMenuList: [],\r\n error: null,\r\n _lastFetchParams: null,\r\n });\r\n },\r\n\r\n // 🔧 메뉴 ID로 메뉴 아이템 찾기\r\n // URL 파라미터나 프로그래밍 방식으로 특정 메뉴를 찾을 때 사용\r\n findMenuById: (menuId: string) => {\r\n const { flatMenuList } = get();\r\n return flatMenuList.find((m) => m.menuId === menuId) ?? null;\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\nimport React from \"react\";\r\nimport { MenuItem, useMenuModelStore } from \"./menuModelStore\";\r\nimport { message } from \"antd\";\r\n\r\n/* ──── Constants (UI 측에도 독립적으로 존재) ──── */\r\nconst MENU_CONSTANTS = {\r\n DEFAULT_ACTIVE_MENU: \"1\",\r\n MAX_TABS: 15,\r\n} as const;\r\n\r\n/* ──── Types (이 파일 전용) ──── */\r\nexport interface TabItem {\r\n key: string; // menuId\r\n label: string; // menuNm\r\n gubun: \"M\" | \"C\"; // menuId or componentPath\r\n menuItem: MenuItem;\r\n\r\n closable: boolean;\r\n}\r\n\r\n/* ──── State Shape ──── */\r\ntype MenuViewState = {\r\n // 📊 UI State (화면 상태)\r\n // 현재 활성화된 메뉴 ID\r\n activeMenuId: string | undefined | null;\r\n // 현재 활성화된 메뉴 정보\r\n activeMenuItem: MenuItem | null;\r\n // 열린 탭 목록\r\n tabs: TabItem[];\r\n // 사이드바 접힘/펼침 상태\r\n sidebarCollapsed: boolean;\r\n // 최대 탭 개수\r\n maxTabs: number;\r\n tabProtectFlag: Record<string, boolean>;\r\n // 탭 파라미터\r\n tabParams: Record<string, Record<string, any>>;\r\n // 컴포넌트 라벨 맵\r\n componentLabelMap: Record<string, string>;\r\n\r\n /* 🛠 UI Actions (UI 액션 함수들) */\r\n // 메뉴 아이템으로 탭 추가\r\n openTabFromMenu: (menuItem: MenuItem, params?: Record<string, any>) => void;\r\n // 메뉴 ID로 탭 추가 (URL 파라미터 처리용)\r\n openTabByMenuId: (menuId: string, params?: Record<string, any>) => void;\r\n // 컴포넌트 ID로 탭 추가\r\n openTabByComponentId: (cpntId: string, params?: Record<string, any>) => void;\r\n // 활성 탭 변경\r\n focusTab: (tabKey: string) => void;\r\n // 탭 제거\r\n closeTab: (tabKey: string) => void;\r\n // 모든 탭 제거\r\n closeAllTabs: () => void;\r\n // 사이드바 토글\r\n toggleSidebar: () => void;\r\n // 탭 순서 변경\r\n reorderTabs: (keys: string[]) => void;\r\n // 개인정보 포함여부에 따른 탭 잠금 Flag 설정\r\n setProtectFlagForKey: (key: string) => void;\r\n // 개인정보 포함여부에 따른 탭 잠금 해제\r\n clearProtectFlagForKey: (key: string) => void;\r\n // 탭 파라미터 설정\r\n setTabParams: (key: string, params: Record<string, any>) => void;\r\n //컴포넌트 라벨 맵 설정\r\n setComponentLabelMap: (map: Record<string, string>, merge?: boolean) => void;\r\n};\r\n\r\n/* ──── Store ──── */\r\nexport const useMenuViewStore = create<MenuViewState>((set, get) => ({\r\n // 📊 초기 상태값\r\n activeMenuId: null,\r\n activeMenuItem: null,\r\n tabs: [],\r\n sidebarCollapsed: false,\r\n maxTabs: MENU_CONSTANTS.MAX_TABS,\r\n tabProtectFlag: {},\r\n tabParams: {},\r\n componentLabelMap: {},\r\n // 🔧 탭 추가 (메뉴 아이템 객체로)\r\n // 사이드바에서 메뉴 클릭 시 호출되는 메인 함수\r\n openTabFromMenu: (menuItem, params) => {\r\n const { tabs, activeMenuId } = get();\r\n const exists = tabs.find((t) => t.key === menuItem.menuId);\r\n\r\n // 새 탭 생성\r\n if (!exists) {\r\n // 2. 최대 탭 개수 확인\r\n if (tabs.length > MENU_CONSTANTS.MAX_TABS) {\r\n console.warn(\"❌ 최대 탭 개수를 초과했습니다.\");\r\n message.warning(\r\n `최대 ${MENU_CONSTANTS.MAX_TABS}개의 탭만 열 수 있습니다.\\n기존 탭을 닫고 다시 시도해주세요.`\r\n );\r\n return;\r\n }\r\n const newTab: TabItem = {\r\n key: menuItem.menuId,\r\n label: menuItem.menuNm,\r\n gubun: \"M\",\r\n menuItem: menuItem as MenuItem,\r\n closable: true,\r\n };\r\n set({\r\n tabs: [...tabs, newTab], // 탭 목록에 추가\r\n activeMenuId: menuItem.menuId, // 새 탭을 활성화\r\n activeMenuItem: menuItem, // 현재 프로그램으로 설정\r\n });\r\n get().setTabParams(menuItem.menuId, params || {});\r\n console.log(\"✅ 새 탭 추가 - activeMenuItem:\", menuItem);\r\n\r\n // 개인정보 메뉴만 Protect\r\n if (menuItem?.prsnInfoYn === \"Y\") {\r\n get().setProtectFlagForKey(menuItem.menuId);\r\n }\r\n } else if (activeMenuId !== menuItem.menuId) {\r\n // 이미 존재하는 탭이면 활성화만\r\n set({ activeMenuId: menuItem.menuId, activeMenuItem: menuItem });\r\n console.log(\"✅ 기존 탭 활성화 - activeMenuItem:\", menuItem);\r\n get().setTabParams(menuItem.menuId, params || {});\r\n // 개인정보 메뉴만 Protect\r\n if (menuItem?.prsnInfoYn === \"Y\") {\r\n get().setProtectFlagForKey(menuItem.menuId);\r\n }\r\n } else {\r\n console.warn(\"❌ 유효하지 않은 메뉴정보\", menuItem.menuId);\r\n message.warning(\"유효하지 않은 메뉴정보입니다.\");\r\n }\r\n },\r\n // 🔧 탭 추가 (메뉴 ID로)\r\n // URL 파라미터로 메뉴 열기 시 사용 (예: ?menuId=CM000301)\r\n openTabByMenuId: (menuId, params) => {\r\n const target = useMenuModelStore.getState().findMenuById(menuId);\r\n if (!target) {\r\n console.warn(\"❌ 메뉴 ID를 찾을 수 없음:\", menuId);\r\n message.warning(\"메뉴 ID를 찾을 수 없습니다.\");\r\n } else {\r\n get().openTabFromMenu(target, params); // 찾은 메뉴로 탭 추가\r\n }\r\n },\r\n openTabByComponentId: (cpntId, params) => {\r\n const { tabs, activeMenuId } = get();\r\n const exists = tabs.find((t) => t.key === cpntId);\r\n const cpntNm = get().componentLabelMap[cpntId] ?? cpntId;\r\n\r\n const menuItem = {\r\n crprCd: \"\",\r\n menuNm: cpntNm,\r\n menuId: cpntId,\r\n scrnId: cpntId,\r\n scrnPath: cpntId,\r\n menuNo: undefined,\r\n menuLvl: 0,\r\n prsnInfoYn: \"N\" as const,\r\n rootMenu: \"\",\r\n iconCd: \"\",\r\n menuGbCd: \"\",\r\n menuPrntId: \"\",\r\n children: [],\r\n };\r\n // 새 탭 생성\r\n if (!exists) {\r\n const newTab: TabItem = {\r\n key: cpntId,\r\n gubun: \"C\",\r\n label: cpntNm,\r\n menuItem,\r\n closable: true,\r\n };\r\n\r\n set({\r\n tabs: [...tabs, newTab], // 탭 목록에 추가\r\n activeMenuId: cpntId, // 새 탭을 활성화\r\n activeMenuItem: menuItem, // 현재 프로그램으로 설정\r\n });\r\n get().setTabParams(cpntId, params || {});\r\n } else if (activeMenuId !== menuItem.menuId) {\r\n // 이미 존재하는 탭이면 활성화만\r\n set({ activeMenuId: menuItem.menuId, activeMenuItem: menuItem });\r\n get().setTabParams(menuItem.menuId, params || {});\r\n } else {\r\n console.warn(\"❌ 유효하지 않은 메뉴정보\", cpntId);\r\n message.warning(\"유효하지 않은 메뉴정보입니다.\");\r\n return;\r\n }\r\n },\r\n // 🔧 탭 제거\r\n // X 버튼 클릭 시 탭을 닫고 관련 상태도 정리\r\n closeTab: (tabKey) => {\r\n const { tabs, activeMenuId } = get();\r\n const removed = tabs.find((t) => t.key === tabKey);\r\n const nextTabs = tabs.filter((t) => t.key !== tabKey);\r\n\r\n // 닫힌 탭이 현재 활성 탭이면 다음 탭으로 이동\r\n let nextActive = activeMenuId;\r\n if (activeMenuId === tabKey) {\r\n const idx = tabs.findIndex((t) => t.key === tabKey);\r\n nextActive = nextTabs.length\r\n ? nextTabs[Math.min(idx, nextTabs.length - 1)]?.key ?? null\r\n : null;\r\n }\r\n\r\n set({\r\n tabs: nextTabs,\r\n });\r\n\r\n if (nextActive) get().focusTab(nextActive);\r\n },\r\n // 🔧 활성 탭 변경\r\n // 탭 헤더 클릭 시 해당 탭으로 전환\r\n focusTab: (tabKey) => {\r\n const { tabs } = get();\r\n const target = tabs.find((t) => t.key === tabKey);\r\n\r\n if (target) {\r\n if (target.menuItem.prsnInfoYn === \"Y\") {\r\n set({\r\n activeMenuId: tabKey,\r\n activeMenuItem: target.menuItem,\r\n });\r\n console.log(\r\n \"✅ 탭 포커스 (개인정보) - activeMenuItem:\",\r\n target.menuItem\r\n );\r\n get().setProtectFlagForKey(tabKey);\r\n } else {\r\n set({\r\n activeMenuId: tabKey,\r\n activeMenuItem: target.menuItem,\r\n });\r\n console.log(\"✅ 탭 포커스 (일반) - activeMenuItem:\", target.menuItem);\r\n get().clearProtectFlagForKey(tabKey);\r\n }\r\n } else {\r\n set({ activeMenuId: tabKey, activeMenuItem: null });\r\n console.warn(\"❌ 탭을 찾을 수 없음:\", tabKey);\r\n }\r\n },\r\n\r\n // 🔧 모든 탭 제거\r\n // 로그아웃이나 전체 초기화 시 사용\r\n closeAllTabs: () =>\r\n set({ tabs: [], activeMenuId: null, activeMenuItem: null }),\r\n\r\n // 🔧 사이드바 토글\r\n // 햄버거 메뉴 클릭 시 사이드바 접기/펼치기\r\n toggleSidebar: () => set((s) => ({ sidebarCollapsed: !s.sidebarCollapsed })),\r\n\r\n // useMenuViewStore.ts\r\n reorderTabs: (keys: string[]) =>\r\n set((state) => {\r\n const map = new Map(state.tabs.map((t) => [t.key, t]));\r\n return { tabs: keys.map((k) => map.get(k)!).filter(Boolean) };\r\n }),\r\n // 개인정보 포함여부에 따른 탭 잠금 Flag 설정\r\n setProtectFlagForKey: (key: string) =>\r\n set((s) => ({\r\n tabProtectFlag: { ...s.tabProtectFlag, [key]: true },\r\n })),\r\n // 개인정보 포함여부에 따른 탭 잠금 해제\r\n clearProtectFlagForKey: (key: string) =>\r\n set((s) => {\r\n const newFlags = { ...s.tabProtectFlag };\r\n delete newFlags[key];\r\n return { tabProtectFlag: newFlags };\r\n }),\r\n // 탭 파라미터 설정\r\n setTabParams: (key, params) =>\r\n set((state) => {\r\n const prev = state.tabParams[key] || {};\r\n const next = { ...(params || {}) }; // 새 객체 (불변 보장)\r\n\r\n // shallow equal이면 스킵(불필요 렌더 방지)\r\n const isShallowEqual =\r\n Object.keys(prev).length === Object.keys(next).length &&\r\n Object.keys(next).every((k) => prev[k] === next[k]);\r\n if (isShallowEqual) return state;\r\n\r\n return {\r\n tabParams: { ...state.tabParams, [key]: next },\r\n };\r\n }),\r\n // 컴포넌트 라벨 맵 설정\r\n setComponentLabelMap: (map: Record<string, string>, merge?: boolean) =>\r\n set({ componentLabelMap: map }),\r\n}));\r\n"],"names":["useFavoriteStore","create","set","get","crprCd","userId","data","callService","getServiceCode","favoritesList","isLocal","testFavorites","error","menuItem","favorites","fav","newFavorite","menuId","updatedFavorites","MENU_CONSTANTS","isMenuItem","v","isMenuItemArray","_lastFlat","_cachedTree","parseMenuResponse","r","sameParams","a","b","buildHierarchy","flat","x","i","map","roots","m","cur","sortRec","arr","out","useMenuModelStore","prntGbcd","p","tree","e","flatMenuList","useMenuViewStore","params","tabs","activeMenuId","t","message","newTab","target","cpntId","exists","cpntNm","tabKey","nextTabs","nextActive","idx","s","keys","state","k","key","newFlags","prev","next","merge"],"mappings":"yIAmCaA,EAAmBC,EAAAA,OAAsB,CAACC,EAAKC,KAAS,CACnE,UAAW,CAAA,EACX,UAAW,GACX,MAAO,KAGP,eAAgB,MAAO,CAAE,OAAAC,EAAQ,OAAAC,KAAa,CAC5C,QAAQ,IAAI,cAAe,CAAE,OAAAD,EAAQ,OAAAC,EAAQ,EAC7CH,EAAI,CAAE,UAAW,GAAM,MAAO,KAAM,EAEpC,GAAI,CAEF,MAAMI,EAAO,MAAMC,EAAAA,YAAYC,EAAAA,eAAe,WAAW,EAAG,CAC1D,OAAAJ,EACA,OAAAC,CAAA,CACD,EAED,IAAII,EAAoC,CAAA,EAcxC,GAZIH,GAAM,WAAa,MAAM,QAAQA,EAAK,SAAS,EACjDG,EAAgBH,EAAK,UACZ,MAAM,QAAQA,CAAI,EAC3BG,EAAgBH,GAEhB,QAAQ,KAAK,+BAA+B,EAC5CG,EAAgB,CAAA,GAGlB,QAAQ,IAAI,iBAAkBA,CAAa,EAGvCC,WAAWD,EAAc,SAAW,EAAG,CACzC,MAAME,EAAoC,CACxC,CACE,OAAQ,MACR,SAAU,UACV,WAAY,SACZ,OAAQ,cACR,OAAQ,UACR,OAAQ,UACR,OAAQ,EACR,SAAU,eACV,QAAS,EACT,SAAU,SACV,QAAS,IAAI,KAAA,EAAO,YAAA,EACpB,OAAAN,CAAA,EAEF,CACE,OAAQ,MACR,SAAU,UACV,WAAY,SACZ,OAAQ,cACR,OAAQ,UACR,OAAQ,UACR,OAAQ,EACR,SAAU,wBACV,QAAS,EACT,SAAU,SACV,QAAS,IAAI,KAAA,EAAO,YAAA,EACpB,OAAAA,CAAA,CACF,EAEFH,EAAI,CAAE,UAAWS,EAAe,UAAW,GAAO,MAAO,KAAM,EAC/D,QAAQ,IAAI,yBAAyB,CACvC,MACET,EAAI,CAAE,UAAWO,EAAe,UAAW,GAAO,MAAO,KAAM,CAEnE,OAASG,EAAO,CACd,QAAQ,MAAM,iBAAkBA,CAAK,EACrCV,EAAI,CACF,MAAOU,aAAiB,MAAQA,EAAM,QAAU,aAChD,UAAW,EAAA,CACZ,CACH,CACF,EAGA,YAAa,MAAOC,EAAoBR,IAAmB,CACzD,KAAM,CAAE,UAAAS,CAAA,EAAcX,EAAA,EAGtB,GAAIW,EAAU,KAAMC,GAAQA,EAAI,SAAWF,EAAS,MAAM,EAAG,CAC3D,QAAQ,IAAI,sBAAuBA,EAAS,MAAM,EAClD,MACF,CAEA,GAAI,CAEF,MAAMN,EAAAA,YAAYC,iBAAe,WAAW,EAAG,CAC7C,OAAQ,MACR,OAAQK,EAAS,OACjB,OAAAR,EACA,OAAQQ,EAAS,OACjB,OAAQA,EAAS,OACjB,SAAUA,EAAS,QAAA,CACpB,EAGD,MAAMG,EAAgC,CACpC,GAAGH,EACH,QAAS,IAAI,KAAA,EAAO,YAAA,EACpB,OAAAR,CAAA,EAGFH,EAAI,CAAE,UAAW,CAAC,GAAGY,EAAWE,CAAW,EAAG,EAC9C,QAAQ,IAAI,cAAeH,EAAS,MAAM,CAC5C,OAASD,EAAO,CACd,cAAQ,MAAM,cAAeA,CAAK,EAC5BA,CACR,CACF,EAGA,eAAgB,MAAOK,EAAgBZ,IAAmB,CACxD,KAAM,CAAE,UAAAS,CAAA,EAAcX,EAAA,EAEtB,GAAI,CAEF,MAAMI,EAAAA,YAAYC,iBAAe,WAAW,EAAG,CAC7C,OAAQ,SACR,OAAQ,MACR,OAAAH,EACA,OAAAY,CAAA,CACD,EAGD,MAAMC,EAAmBJ,EAAU,OAAQC,GAAQA,EAAI,SAAWE,CAAM,EACxEf,EAAI,CAAE,UAAWgB,EAAkB,EACnC,QAAQ,IAAI,cAAeD,CAAM,CACnC,OAASL,EAAO,CACd,cAAQ,MAAM,cAAeA,CAAK,EAC5BA,CACR,CACF,EAGA,WAAaK,GAAmB,CAC9B,KAAM,CAAE,UAAAH,CAAA,EAAcX,EAAA,EACtB,OAAOW,EAAU,KAAMC,GAAQA,EAAI,SAAWE,CAAM,CACtD,EAGA,eAAgB,IAAM,CACpBf,EAAI,CAAE,UAAW,CAAA,EAAI,UAAW,GAAO,MAAO,KAAM,CACtD,CACF,EAAE,EC9KIiB,EAAiB,CAErB,kBAAmB,CAIrB,EA8BMC,EAAcC,GAClBA,GACA,OAAOA,GAAM,UACb,OAAOA,EAAE,QAAW,UACpB,OAAOA,EAAE,QAAW,UACpB,OAAOA,EAAE,QAAW,SAEhBC,EAAmBD,GACvB,MAAM,QAAQA,CAAC,GAAKA,EAAE,MAAMD,CAAU,EA0BxC,IAAIG,EAAwB,CAAA,EACxBC,EAA0B,CAAA,EAG9B,MAAMC,EAAqBnB,GAA8B,CACvD,GAAIA,GAAQ,OAAOA,GAAS,SAAU,CACpC,MAAMoB,EAAIpB,EACV,GAAIoB,EAAE,OAASJ,EAAgBI,EAAE,KAAK,SAAUA,EAAE,MAClD,GAAIJ,EAAgBhB,CAAI,EAAG,OAAOA,CACpC,CACA,eAAQ,KAAK,2BAA2B,EACjC,CAAA,CACT,EAEMqB,EAAa,CAACC,EAAoBC,IACtC,CAAC,CAACA,GACFD,EAAE,SAAWC,EAAE,QACfD,EAAE,SAAWC,EAAE,SACdD,EAAE,UAAYT,EAAe,sBAC3BU,EAAE,UAAYV,EAAe,mBAE5BW,EAAkBC,GAAiC,CACvD,GACER,EAAU,SAAWQ,EAAK,QAC1BR,EAAU,MACR,CAACS,EAAGC,IACFD,EAAE,SAAWD,EAAKE,CAAC,GAAG,QAAUD,EAAE,aAAeD,EAAKE,CAAC,GAAG,UAAA,EAG9D,OAAOT,EAET,GAAI,CAACO,EAAK,OAAQ,MAAO,CAAA,EAEzB,MAAMG,MAAU,IACVC,EAAoB,CAAA,EAE1BJ,EAAK,QAASK,GAAMA,GAAG,QAAUF,EAAI,IAAIE,EAAE,OAAQ,CAAE,GAAGA,EAAG,SAAU,CAAA,CAAC,CAAG,CAAC,EAC1EL,EAAK,QAASK,GAAM,CAClB,MAAMC,EAAMH,EAAI,IAAIE,EAAE,MAAM,EACvBC,IACDD,EAAE,YAAcA,EAAE,aAAe,IAAMA,EAAE,aAAe,IAChDF,EAAI,IAAIE,EAAE,UAAU,GAC3B,UAAU,KAAKC,CAAG,EAErBF,EAAM,KAAKE,CAAG,EAElB,CAAC,EAED,MAAMC,EAAWC,GACfA,EACG,KAAK,CAACX,EAAGC,KAAOD,GAAG,QAAU,IAAMC,GAAG,QAAU,EAAE,EAClD,IAAKG,IAAO,CACX,GAAGA,EACH,SACEA,EAAE,UAAYA,EAAE,SAAS,OAASM,EAAQN,EAAE,QAAQ,EAAI,MAAA,EAC1D,EAEAQ,EAAMF,EAAQH,CAAK,EACzB,OAAAZ,EAAY,CAAC,GAAGQ,CAAI,EACpBP,EAAcgB,EACPA,CACT,EAGaC,EAAoBxC,EAAAA,OAAuB,CAACC,EAAKC,KAAS,CAErE,SAAU,CAAA,EACV,aAAc,CAAA,EACd,UAAW,GACX,MAAO,KACP,iBAAkB,KAIlB,UAAW,MAAO,CAAE,OAAAC,EAAQ,OAAAC,EAAQ,SAAAqC,KAAgC,CAClE,MAAMC,EAAI,CACR,OAAAvC,EACA,OAAAC,EACA,SAAUqC,GAAYvB,EAAe,iBAAA,EAGvC,GAAIQ,EAAWgB,EAAGxC,EAAA,EAAM,gBAAgB,EAAG,CACzC,QAAQ,IAAI,gBAAiBwC,CAAC,EAC9B,MACF,CACAzC,EAAI,CAAE,UAAW,GAAM,MAAO,KAAM,iBAAkByC,EAAG,EACzD,GAAI,CAEF,MAAMrC,EAAO,MAAMC,EAAAA,YAAYC,EAAAA,eAAe,WAAW,EAAGmC,CAAC,EACvDZ,EAAON,EAAkBnB,CAAI,EAC7BsC,EAAOd,EAAeC,CAAI,EAChC7B,EAAI,CACF,aAAc6B,EACd,SAAUa,EACV,UAAW,GACX,MAAO,IAAA,CACR,CACH,OAASC,EAAQ,CACf3C,EAAI,CAAE,UAAW,GAAO,MAAO2C,GAAG,SAAW,WAAY,CAC3D,CACF,EAIA,UAAW,IAAM,CACf3C,EAAI,CACF,SAAU,CAAA,EACV,aAAc,CAAA,EACd,MAAO,KACP,iBAAkB,IAAA,CACnB,CACH,EAIA,aAAee,GAAmB,CAChC,KAAM,CAAE,aAAA6B,CAAA,EAAiB3C,EAAA,EACzB,OAAO2C,EAAa,KAAMV,GAAMA,EAAE,SAAWnB,CAAM,GAAK,IAC1D,CACF,EAAE,EC7LIE,EAAiB,CAErB,SAAU,EACZ,EA2Da4B,EAAmB9C,EAAAA,OAAsB,CAACC,EAAKC,KAAS,CAEnE,aAAc,KACd,eAAgB,KAChB,KAAM,CAAA,EACN,iBAAkB,GAClB,QAASgB,EAAe,SACxB,eAAgB,CAAA,EAChB,UAAW,CAAA,EACX,kBAAmB,CAAA,EAGnB,gBAAiB,CAACN,EAAUmC,IAAW,CACrC,KAAM,CAAE,KAAAC,EAAM,aAAAC,CAAA,EAAiB/C,EAAA,EAI/B,GAHe8C,EAAK,KAAME,GAAMA,EAAE,MAAQtC,EAAS,MAAM,EA+B9CqC,IAAiBrC,EAAS,QAEnCX,EAAI,CAAE,aAAcW,EAAS,OAAQ,eAAgBA,EAAU,EAC/D,QAAQ,IAAI,+BAAgCA,CAAQ,EACpDV,EAAA,EAAM,aAAaU,EAAS,OAAQmC,GAAU,CAAA,CAAE,EAE5CnC,GAAU,aAAe,KAC3BV,IAAM,qBAAqBU,EAAS,MAAM,IAG5C,QAAQ,KAAK,iBAAkBA,EAAS,MAAM,EAC9CuC,EAAAA,QAAQ,QAAQ,kBAAkB,OAvCvB,CAEX,GAAIH,EAAK,OAAS9B,EAAe,SAAU,CACzC,QAAQ,KAAK,oBAAoB,EACjCiC,EAAAA,QAAQ,QACN,MAAMjC,EAAe,QAAQ;AAAA,oBAAA,EAE/B,MACF,CACA,MAAMkC,EAAkB,CACtB,IAAKxC,EAAS,OACd,MAAOA,EAAS,OAChB,MAAO,IACP,SAAAA,EACA,SAAU,EAAA,EAEZX,EAAI,CACF,KAAM,CAAC,GAAG+C,EAAMI,CAAM,EACtB,aAAcxC,EAAS,OACvB,eAAgBA,CAAA,CACjB,EACDV,EAAA,EAAM,aAAaU,EAAS,OAAQmC,GAAU,CAAA,CAAE,EAChD,QAAQ,IAAI,6BAA8BnC,CAAQ,EAG9CA,GAAU,aAAe,KAC3BV,IAAM,qBAAqBU,EAAS,MAAM,CAE9C,CAaF,EAGA,gBAAiB,CAACI,EAAQ+B,IAAW,CACnC,MAAMM,EAASb,EAAkB,SAAA,EAAW,aAAaxB,CAAM,EAC1DqC,EAIHnD,IAAM,gBAAgBmD,EAAQN,CAAM,GAHpC,QAAQ,KAAK,oBAAqB/B,CAAM,EACxCmC,EAAAA,QAAQ,QAAQ,mBAAmB,EAIvC,EACA,qBAAsB,CAACG,EAAQP,IAAW,CACxC,KAAM,CAAE,KAAAC,EAAM,aAAAC,CAAA,EAAiB/C,EAAA,EACzBqD,EAASP,EAAK,KAAME,GAAMA,EAAE,MAAQI,CAAM,EAC1CE,EAAStD,EAAA,EAAM,kBAAkBoD,CAAM,GAAKA,EAE5C1C,EAAW,CACf,OAAQ,GACR,OAAQ4C,EACR,OAAQF,EACR,OAAQA,EACR,SAAUA,EACV,OAAQ,OACR,QAAS,EACT,WAAY,IACZ,SAAU,GACV,OAAQ,GACR,SAAU,GACV,WAAY,GACZ,SAAU,CAAA,CAAC,EAGb,GAAKC,EAeL,GAAWN,IAAiBrC,EAAS,OAEnCX,EAAI,CAAE,aAAcW,EAAS,OAAQ,eAAgBA,EAAU,EAC/DV,EAAA,EAAM,aAAaU,EAAS,OAAQmC,GAAU,CAAA,CAAE,MAC3C,CACL,QAAQ,KAAK,iBAAkBO,CAAM,EACrCH,EAAAA,QAAQ,QAAQ,kBAAkB,EAClC,MACF,KAvBa,CACX,MAAMC,EAAkB,CACtB,IAAKE,EACL,MAAO,IACP,MAAOE,EACP,SAAA5C,EACA,SAAU,EAAA,EAGZX,EAAI,CACF,KAAM,CAAC,GAAG+C,EAAMI,CAAM,EACtB,aAAcE,EACd,eAAgB1C,CAAA,CACjB,EACDV,EAAA,EAAM,aAAaoD,EAAQP,GAAU,CAAA,CAAE,CACzC,CASF,EAGA,SAAWU,GAAW,CACpB,KAAM,CAAE,KAAAT,EAAM,aAAAC,CAAA,EAAiB/C,EAAA,EACf8C,EAAK,KAAME,GAAMA,EAAE,MAAQO,CAAM,EACjD,MAAMC,EAAWV,EAAK,OAAQE,GAAMA,EAAE,MAAQO,CAAM,EAGpD,IAAIE,EAAaV,EACjB,GAAIA,IAAiBQ,EAAQ,CAC3B,MAAMG,EAAMZ,EAAK,UAAWE,GAAMA,EAAE,MAAQO,CAAM,EAClDE,EAAaD,EAAS,OAClBA,EAAS,KAAK,IAAIE,EAAKF,EAAS,OAAS,CAAC,CAAC,GAAG,KAAO,KACrD,IACN,CAEAzD,EAAI,CACF,KAAMyD,CAAA,CACP,EAEGC,GAAYzD,IAAM,SAASyD,CAAU,CAC3C,EAGA,SAAWF,GAAW,CACpB,KAAM,CAAE,KAAAT,CAAA,EAAS9C,EAAA,EACXmD,EAASL,EAAK,KAAME,GAAMA,EAAE,MAAQO,CAAM,EAE5CJ,EACEA,EAAO,SAAS,aAAe,KACjCpD,EAAI,CACF,aAAcwD,EACd,eAAgBJ,EAAO,QAAA,CACxB,EACD,QAAQ,IACN,mCACAA,EAAO,QAAA,EAETnD,EAAA,EAAM,qBAAqBuD,CAAM,IAEjCxD,EAAI,CACF,aAAcwD,EACd,eAAgBJ,EAAO,QAAA,CACxB,EACD,QAAQ,IAAI,iCAAkCA,EAAO,QAAQ,EAC7DnD,EAAA,EAAM,uBAAuBuD,CAAM,IAGrCxD,EAAI,CAAE,aAAcwD,EAAQ,eAAgB,KAAM,EAClD,QAAQ,KAAK,gBAAiBA,CAAM,EAExC,EAIA,aAAc,IACZxD,EAAI,CAAE,KAAM,CAAA,EAAI,aAAc,KAAM,eAAgB,KAAM,EAI5D,cAAe,IAAMA,EAAK4D,IAAO,CAAE,iBAAkB,CAACA,EAAE,gBAAA,EAAmB,EAG3E,YAAcC,GACZ7D,EAAK8D,GAAU,CACb,MAAM9B,EAAM,IAAI,IAAI8B,EAAM,KAAK,IAAKb,GAAM,CAACA,EAAE,IAAKA,CAAC,CAAC,CAAC,EACrD,MAAO,CAAE,KAAMY,EAAK,IAAKE,GAAM/B,EAAI,IAAI+B,CAAC,CAAE,EAAE,OAAO,OAAO,CAAA,CAC5D,CAAC,EAEH,qBAAuBC,GACrBhE,EAAK4D,IAAO,CACV,eAAgB,CAAE,GAAGA,EAAE,eAAgB,CAACI,CAAG,EAAG,EAAA,CAAK,EACnD,EAEJ,uBAAyBA,GACvBhE,EAAK4D,GAAM,CACT,MAAMK,EAAW,CAAE,GAAGL,EAAE,cAAA,EACxB,cAAOK,EAASD,CAAG,EACZ,CAAE,eAAgBC,CAAA,CAC3B,CAAC,EAEH,aAAc,CAACD,EAAKlB,IAClB9C,EAAK8D,GAAU,CACb,MAAMI,EAAOJ,EAAM,UAAUE,CAAG,GAAK,CAAA,EAC/BG,EAAO,CAAE,GAAIrB,GAAU,EAAC,EAM9B,OAFE,OAAO,KAAKoB,CAAI,EAAE,SAAW,OAAO,KAAKC,CAAI,EAAE,QAC/C,OAAO,KAAKA,CAAI,EAAE,MAAOJ,GAAMG,EAAKH,CAAC,IAAMI,EAAKJ,CAAC,CAAC,EACzBD,EAEpB,CACL,UAAW,CAAE,GAAGA,EAAM,UAAW,CAACE,CAAG,EAAGG,CAAA,CAAK,CAEjD,CAAC,EAEH,qBAAsB,CAACnC,EAA6BoC,IAClDpE,EAAI,CAAE,kBAAmBgC,EAAK,CAClC,EAAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../chunks/SSOHandler-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../chunks/SSOHandler-Qm_2PekO.cjs"),r=require("../../chunks/BwgSpace-b0hmM1Ht.cjs"),o=require("../../chunks/realFormat-Cha7OTd9.cjs");exports.BwgButtonGroup=e.BwgButtonGroup;exports.BwgCmptArea=e.BwgCmptArea;exports.BwgCol=e.BwgCol;exports.BwgConfigProvider=e.BwgConfigProvider;exports.BwgDrawer=e.BwgDrawer;exports.BwgGrid=e.BwgGrid;exports.BwgInfoArea=e.BwgInfoArea;exports.BwgPopup=e.BwgPopup;exports.BwgRow=e.BwgRow;exports.BwgTable=e.BwgTable;exports.BwgTabs=e.BwgTabs;exports.BwgTitleBox=e.BwgTitleBox;exports.BwgView=e.BwgView;exports.ContentBox=e.ContentBox;exports.ContentLayOut=e.ContentLayOut;exports.GlobalConfigProvider=e.GlobalConfigProvider;exports.QuickServiceToggle=e.QuickServiceToggle;exports.SSOHandler=e.SSOHandler;exports.SearchBox=e.SearchBox;exports.createBwgGridRenderer=e.createBwgGridRenderer;exports.BwgSpace=r.BwgSpace;exports.realFormat=o.realFormat;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as r, a as o, b as s, c as B, d as g, e as w, f as t, g as i, h as n, i as l, j as p, k as d, l as f, C, m as c, G as m, Q as x, n as S, S as u, o as G } from "../../chunks/SSOHandler-
|
|
1
|
+
import { B as r, a as o, b as s, c as B, d as g, e as w, f as t, g as i, h as n, i as l, j as p, k as d, l as f, C, m as c, G as m, Q as x, n as S, S as u, o as G } from "../../chunks/SSOHandler-DNvCpRTu.js";
|
|
2
2
|
import { B as T } from "../../chunks/BwgSpace-CnLM4qcg.js";
|
|
3
3
|
import { r as P } from "../../chunks/realFormat-DRGLFabQ.js";
|
|
4
4
|
export {
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./stores/index.cjs"),t=require("./chunks/SSOHandler-DjL0sH7k.cjs"),p=require("./chunks/BwgSpace-b0hmM1Ht.cjs"),S=require("./chunks/realFormat-Cha7OTd9.cjs"),a=require("./chunks/BwgLargeUploader-1yDku10l.cjs"),l=require("./chunks/PublicLayout-3v46YZdi.cjs"),C=require("./chunks/LoadingOverlay-NX9Mo_6n.cjs"),e=require("./chunks/commonUtils-DaFg0y7C.cjs"),r=require("./chunks/serviceConfig-Cc8jfw_Y.cjs"),o=require("./chunks/FileUtils-CmK-zHC5.cjs"),g=require("./chunks/envUtils-CduTHoHu.cjs"),u=require("./chunks/menuViewStore-BJak0NMm.cjs"),c=require("./chunks/codeStore-BG8S_mdS.cjs"),w=require("./chunks/popupStore-BGubYHZh.cjs"),d=require("./chunks/AuthContext-CXng9fj0.cjs"),s=require("./chunks/UtilsContext-DczQBfFi.cjs"),m=require("./chunks/ScreenProtectContext-CVuXrJm6.cjs"),i=require("./chunks/SearchBoxContext-mcPWk862.cjs");exports.useCode=n.useCode;exports.useFavorite=n.useFavorite;exports.useMenuModel=n.useMenuModel;exports.useMenuView=n.useMenuView;exports.usePopupState=n.usePopupState;exports.useUser=n.useUser;exports.BwgButtonGroup=t.BwgButtonGroup;exports.BwgCmptArea=t.BwgCmptArea;exports.BwgCol=t.BwgCol;exports.BwgConfigProvider=t.BwgConfigProvider;exports.BwgDrawer=t.BwgDrawer;exports.BwgGrid=t.BwgGrid;exports.BwgInfoArea=t.BwgInfoArea;exports.BwgPopup=t.BwgPopup;exports.BwgRow=t.BwgRow;exports.BwgTable=t.BwgTable;exports.BwgTabs=t.BwgTabs;exports.BwgTitleBox=t.BwgTitleBox;exports.BwgView=t.BwgView;exports.ContentBox=t.ContentBox;exports.ContentLayOut=t.ContentLayOut;exports.GlobalConfigProvider=t.GlobalConfigProvider;exports.QuickServiceToggle=t.QuickServiceToggle;exports.SSOHandler=t.SSOHandler;exports.SearchBox=t.SearchBox;exports.createBwgGridRenderer=t.createBwgGridRenderer;exports.BwgSpace=p.BwgSpace;exports.realFormat=S.realFormat;exports.BwgButton=a.BwgButton;exports.BwgCheck=a.BwgCheck;exports.BwgCheckList=a.BwgCheckList;exports.BwgDatePicker=a.BwgDatePicker;exports.BwgForm=a.BwgForm;exports.BwgFormItem=a.BwgFormItem;exports.BwgInput=a.BwgInput;exports.BwgLargeUploader=a.BwgLargeUploader;exports.BwgMaskedInput=a.BwgMaskedInput;exports.BwgMaskedPicker=a.BwgMaskedPicker;exports.BwgMultiSelect=a.BwgMultiSelect;exports.BwgNumber=a.BwgNumber;exports.BwgRadio=a.BwgRadio;exports.BwgRangePicker=a.BwgRangePicker;exports.BwgSearch=a.BwgSearch;exports.BwgSelect=a.BwgSelect;exports.BwgTextArea=a.BwgTextArea;exports.BwgUploader=a.BwgUploader;exports.ProgressOverlay=l.ProgressOverlay;exports.ProtectedLayout=l.ProtectedLayout;exports.PublicLayout=l.PublicLayout;exports.LoadingOverlay=C.LoadingOverlay;exports.average=e.average;exports.calculateAge=e.calculateAge;exports.chunk=e.chunk;exports.clamp=e.clamp;exports.clearLocalStorage=e.clearLocalStorage;exports.clearSessionStorage=e.clearSessionStorage;exports.copyToClipboard=e.copyToClipboard;exports.count=e.count;exports.debounce=e.debounce;exports.deepClone=e.deepClone;exports.delay=e.delay;exports.difference=e.difference;exports.downloadFile=e.downloadFile;exports.duplicates=e.duplicates;exports.entries=e.entries;exports.find=e.find;exports.findLast=e.findLast;exports.flattenArray=e.flattenArray;exports.flattenDeep=e.flattenDeep;exports.formatDate=e.formatDate;exports.formatDateKST=e.formatDateKST;exports.formatDateKorean=e.formatDateKorean;exports.formatDateTimeKorean=e.formatDateTimeKorean;exports.formatTimeKorean=e.formatTimeKorean;exports.generateRandomColor=e.generateRandomColor;exports.getAllKeys=e.getAllKeys;exports.getCurrentDate=e.getCurrentDate;exports.getCurrentDateString=e.getCurrentDateString;exports.getDateDiff=e.getDateDiff;exports.getDateRange=e.getDateRange;exports.getDateRangeForPicker=e.getDateRangeForPicker;exports.getDeviceType=e.getDeviceType;exports.getLocalStorage=e.getLocalStorage;exports.getMonthEnd=e.getMonthEnd;exports.getMonthStart=e.getMonthStart;exports.getRelativeTime=e.getRelativeTime;exports.getSessionStorage=e.getSessionStorage;exports.getWeekEnd=e.getWeekEnd;exports.getWeekStart=e.getWeekStart;exports.groupBy=e.groupBy;exports.has=e.has;exports.includes=e.includes;exports.intersection=e.intersection;exports.isArray=e.isArray;exports.isBoolean=e.isBoolean;exports.isDesktop=e.isDesktop;exports.isEqual=e.isEqual;exports.isFunction=e.isFunction;exports.isInViewport=e.isInViewport;exports.isMobile=e.isMobile;exports.isNull=e.isNull;exports.isNullOrUndefined=e.isNullOrUndefined;exports.isNumber=e.isNumber;exports.isObject=e.isObject;exports.isString=e.isString;exports.isTablet=e.isTablet;exports.isThisMonth=e.isThisMonth;exports.isThisWeek=e.isThisWeek;exports.isToday=e.isToday;exports.isUndefined=e.isUndefined;exports.isValidDate=e.isValidDate;exports.keys=e.keys;exports.lastIndexOf=e.lastIndexOf;exports.map=e.map;exports.max=e.max;exports.merge=e.merge;exports.min=e.min;exports.omit=e.omit;exports.pick=e.pick;exports.random=e.random;exports.randomChoice=e.randomChoice;exports.randomFromArray=e.randomFromArray;exports.randomInt=e.randomInt;exports.randomMultiple=e.randomMultiple;exports.range=e.range;exports.remove=e.remove;exports.removeAt=e.removeAt;exports.removeEmptyStrings=e.removeEmptyStrings;exports.removeLocalStorage=e.removeLocalStorage;exports.removeNullValues=e.removeNullValues;exports.removeSessionStorage=e.removeSessionStorage;exports.removeWhere=e.removeWhere;exports.round=e.round;exports.scrollToElement=e.scrollToElement;exports.scrollToTop=e.scrollToTop;exports.set=e.set;exports.setLocalStorage=e.setLocalStorage;exports.setSessionStorage=e.setSessionStorage;exports.shuffle=e.shuffle;exports.size=e.size;exports.sortBy=e.sortBy;exports.sortNumbers=e.sortNumbers;exports.sum=e.sum;exports.throttle=e.throttle;exports.union=e.union;exports.unique=e.unique;exports.uniqueBy=e.uniqueBy;exports.values=e.values;exports.apiDelete=r.apiDelete;exports.apiGet=r.apiGet;exports.apiPatch=r.apiPatch;exports.apiPost=r.apiPost;exports.apiPut=r.apiPut;exports.base64Decode=r.base64Decode;exports.base64Encode=r.base64Encode;exports.br2nl=r.br2nl;exports.bxmDecrypt=r.bxmDecrypt;exports.bxmEncrypt=r.bxmEncrypt;exports.callService=r.callService;exports.capitalize=r.capitalize;exports.capitalizeWords=r.capitalizeWords;exports.center=r.center;exports.closeNotification=r.closeNotification;exports.countChar=r.countChar;exports.countWords=r.countWords;exports.destroyNotifications=r.destroyNotifications;exports.encryptSha256=r.encryptSha256;exports.extractNumbers=r.extractNumbers;exports.findPattern=r.findPattern;exports.formatPhoneNumber=r.formatPhoneNumber;exports.generateAlphanumericUID=r.generateAlphanumericUID;exports.generateCustomUID=r.generateCustomUID;exports.generateGUID=r.generateGUID;exports.generateGUIDWithoutHyphens=r.generateGUIDWithoutHyphens;exports.generateLongUID=r.generateLongUID;exports.generateNumericUID=r.generateNumericUID;exports.generateRandomString=r.generateRandomString;exports.generateShortUID=r.generateShortUID;exports.generateTimestampUID=r.generateTimestampUID;exports.generateUID=r.generateUID;exports.getAllServiceCodes=r.getAllServiceCodes;exports.getClientIp=r.getClientIp;exports.getCrprCd=r.getCrprCd;exports.getDepartmentInfo=r.getDepartmentInfo;exports.getDisplayName=r.getDisplayName;exports.getDprtCd=r.getDprtCd;exports.getDprtNm=r.getDprtNm;exports.getEmplNo=r.getEmplNo;exports.getGuid=r.getGuid;exports.getRoleList=r.getRoleList;exports.getServiceCode=r.getServiceCode;exports.getUserDvsn=r.getUserDvsn;exports.getUserId=r.getUserId;exports.getUserInfo=r.getUserInfo;exports.getUserNm=r.getUserNm;exports.hasAllRoles=r.hasAllRoles;exports.hasAnyRole=r.hasAnyRole;exports.hasRole=r.hasRole;exports.hasUserInfo=r.hasUserInfo;exports.isEmpty=r.isEmpty;exports.isLoggedIn=r.isLoggedIn;exports.isSafeEmpty=r.isSafeEmpty;exports.isValidEmail=r.isValidEmail;exports.isValidUrl=r.isValidUrl;exports.md5Hash=r.md5Hash;exports.nl2br=r.nl2br;exports.notificationService=r.notificationService;exports.padLeft=r.padLeft;exports.padRight=r.padRight;exports.removeHtmlTags=r.removeHtmlTags;exports.removeSpecialChars=r.removeSpecialChars;exports.reverse=r.reverse;exports.setClientIp=r.setClientIp;exports.setServiceCodeOverrides=r.setServiceCodeOverrides;exports.sha256Hash=r.sha256Hash;exports.showError=r.showError;exports.showInfo=r.showInfo;exports.showSuccess=r.showSuccess;exports.showWarning=r.showWarning;exports.simpleDecrypt=r.simpleDecrypt;exports.simpleEncrypt=r.simpleEncrypt;exports.toCamelCase=r.toCamelCase;exports.toKebabCase=r.toKebabCase;exports.toSnakeCase=r.toSnakeCase;exports.truncate=r.truncate;exports.useUserStore=r.useUserStore;exports.verifyClientIp=r.verifyClientIp;exports.THEME_COOKIE_NAME=o.THEME_COOKIE_NAME;exports.closeAllMessages=o.closeAllMessages;exports.closeMessage=o.closeMessage;exports.convertImageFormat=o.convertImageFormat;exports.deleteCookie=o.deleteCookie;exports.downloadByFileKey=o.downloadByFileKey;exports.generateSrcSet=o.generateSrcSet;exports.getAvatarImage=o.getAvatarImage;exports.getBackgroundImage=o.getBackgroundImage;exports.getCookie=o.getCookie;exports.getDefaultBackgroundImage=o.getDefaultBackgroundImage;exports.getIconImage=o.getIconImage;exports.getLogoImage=o.getLogoImage;exports.getOptimizedImageUrl=o.getOptimizedImageUrl;exports.handleImageError=o.handleImageError;exports.preloadImage=o.preloadImage;exports.resizeImage=o.resizeImage;exports.setCookie=o.setCookie;exports.showApiError=o.showApiError;exports.showDuplicateError=o.showDuplicateError;exports.showLoading=o.showLoading;exports.showRequiredError=o.showRequiredError;exports.showSaveError=o.showSaveError;exports.showSaveSuccess=o.showSaveSuccess;exports.useImageLoader=o.useImageLoader;exports.getEnvCode=g.getEnvCode;exports.isDev=g.isDev;exports.isLocal=g.isLocal;exports.isProd=g.isProd;exports.useFavoriteStore=u.useFavoriteStore;exports.useMenuModelStore=u.useMenuModelStore;exports.useMenuViewStore=u.useMenuViewStore;exports.useCodeStore=c.useCodeStore;exports.useColorStore=c.useColorStore;exports.useOptionStore=c.useOptionStore;exports.usePopupStore=w.usePopupStore;exports.AuthProvider=d.AuthProvider;exports.useAuth=d.useAuth;exports.CommonCodeProvider=s.CommonCodeProvider;exports.UtilsProvider=s.UtilsProvider;exports.useApiUtils=s.useApiUtils;exports.useArrayUtils=s.useArrayUtils;exports.useCodeColor=s.useCodeColor;exports.useCodeList=s.useCodeList;exports.useCodeListByOption=s.useCodeListByOption;exports.useCodeName=s.useCodeName;exports.useCommonCode=s.useCommonCode;exports.useCommonUtils=s.useCommonUtils;exports.useDateUtils=s.useDateUtils;exports.useGridLookup=s.useGridLookup;exports.usePopup=s.usePopup;exports.usePopupContext=s.usePopupContext;exports.useStringUtils=s.useStringUtils;exports.useUtils=s.useUtils;exports.ScreenProtectProvider=m.ScreenProtectProvider;exports.useLock=m.useLock;exports.SearchBoxProvider=i.SearchBoxProvider;exports.ServiceCodeProvider=i.ServiceCodeProvider;exports.useAllServiceCodes=i.useAllServiceCodes;exports.useLogServiceCodeConfig=i.useLogServiceCodeConfig;exports.useSearchBox=i.useSearchBox;exports.useServiceCode=i.useServiceCode;exports.useServiceCodeValue=i.useServiceCodeValue;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./stores/index.cjs"),t=require("./chunks/SSOHandler-Qm_2PekO.cjs"),p=require("./chunks/BwgSpace-b0hmM1Ht.cjs"),S=require("./chunks/realFormat-Cha7OTd9.cjs"),a=require("./chunks/BwgLargeUploader-1yDku10l.cjs"),l=require("./chunks/PublicLayout-3v46YZdi.cjs"),C=require("./chunks/LoadingOverlay-NX9Mo_6n.cjs"),e=require("./chunks/commonUtils-DaFg0y7C.cjs"),r=require("./chunks/serviceConfig-Cc8jfw_Y.cjs"),o=require("./chunks/FileUtils-CmK-zHC5.cjs"),g=require("./chunks/envUtils-CduTHoHu.cjs"),u=require("./chunks/menuViewStore-w4fLSR6N.cjs"),c=require("./chunks/codeStore-BG8S_mdS.cjs"),w=require("./chunks/popupStore-BGubYHZh.cjs"),d=require("./chunks/AuthContext-CXng9fj0.cjs"),s=require("./chunks/UtilsContext-DczQBfFi.cjs"),m=require("./chunks/ScreenProtectContext-CVuXrJm6.cjs"),i=require("./chunks/SearchBoxContext-mcPWk862.cjs");exports.useCode=n.useCode;exports.useFavorite=n.useFavorite;exports.useMenuModel=n.useMenuModel;exports.useMenuView=n.useMenuView;exports.usePopupState=n.usePopupState;exports.useUser=n.useUser;exports.BwgButtonGroup=t.BwgButtonGroup;exports.BwgCmptArea=t.BwgCmptArea;exports.BwgCol=t.BwgCol;exports.BwgConfigProvider=t.BwgConfigProvider;exports.BwgDrawer=t.BwgDrawer;exports.BwgGrid=t.BwgGrid;exports.BwgInfoArea=t.BwgInfoArea;exports.BwgPopup=t.BwgPopup;exports.BwgRow=t.BwgRow;exports.BwgTable=t.BwgTable;exports.BwgTabs=t.BwgTabs;exports.BwgTitleBox=t.BwgTitleBox;exports.BwgView=t.BwgView;exports.ContentBox=t.ContentBox;exports.ContentLayOut=t.ContentLayOut;exports.GlobalConfigProvider=t.GlobalConfigProvider;exports.QuickServiceToggle=t.QuickServiceToggle;exports.SSOHandler=t.SSOHandler;exports.SearchBox=t.SearchBox;exports.createBwgGridRenderer=t.createBwgGridRenderer;exports.BwgSpace=p.BwgSpace;exports.realFormat=S.realFormat;exports.BwgButton=a.BwgButton;exports.BwgCheck=a.BwgCheck;exports.BwgCheckList=a.BwgCheckList;exports.BwgDatePicker=a.BwgDatePicker;exports.BwgForm=a.BwgForm;exports.BwgFormItem=a.BwgFormItem;exports.BwgInput=a.BwgInput;exports.BwgLargeUploader=a.BwgLargeUploader;exports.BwgMaskedInput=a.BwgMaskedInput;exports.BwgMaskedPicker=a.BwgMaskedPicker;exports.BwgMultiSelect=a.BwgMultiSelect;exports.BwgNumber=a.BwgNumber;exports.BwgRadio=a.BwgRadio;exports.BwgRangePicker=a.BwgRangePicker;exports.BwgSearch=a.BwgSearch;exports.BwgSelect=a.BwgSelect;exports.BwgTextArea=a.BwgTextArea;exports.BwgUploader=a.BwgUploader;exports.ProgressOverlay=l.ProgressOverlay;exports.ProtectedLayout=l.ProtectedLayout;exports.PublicLayout=l.PublicLayout;exports.LoadingOverlay=C.LoadingOverlay;exports.average=e.average;exports.calculateAge=e.calculateAge;exports.chunk=e.chunk;exports.clamp=e.clamp;exports.clearLocalStorage=e.clearLocalStorage;exports.clearSessionStorage=e.clearSessionStorage;exports.copyToClipboard=e.copyToClipboard;exports.count=e.count;exports.debounce=e.debounce;exports.deepClone=e.deepClone;exports.delay=e.delay;exports.difference=e.difference;exports.downloadFile=e.downloadFile;exports.duplicates=e.duplicates;exports.entries=e.entries;exports.find=e.find;exports.findLast=e.findLast;exports.flattenArray=e.flattenArray;exports.flattenDeep=e.flattenDeep;exports.formatDate=e.formatDate;exports.formatDateKST=e.formatDateKST;exports.formatDateKorean=e.formatDateKorean;exports.formatDateTimeKorean=e.formatDateTimeKorean;exports.formatTimeKorean=e.formatTimeKorean;exports.generateRandomColor=e.generateRandomColor;exports.getAllKeys=e.getAllKeys;exports.getCurrentDate=e.getCurrentDate;exports.getCurrentDateString=e.getCurrentDateString;exports.getDateDiff=e.getDateDiff;exports.getDateRange=e.getDateRange;exports.getDateRangeForPicker=e.getDateRangeForPicker;exports.getDeviceType=e.getDeviceType;exports.getLocalStorage=e.getLocalStorage;exports.getMonthEnd=e.getMonthEnd;exports.getMonthStart=e.getMonthStart;exports.getRelativeTime=e.getRelativeTime;exports.getSessionStorage=e.getSessionStorage;exports.getWeekEnd=e.getWeekEnd;exports.getWeekStart=e.getWeekStart;exports.groupBy=e.groupBy;exports.has=e.has;exports.includes=e.includes;exports.intersection=e.intersection;exports.isArray=e.isArray;exports.isBoolean=e.isBoolean;exports.isDesktop=e.isDesktop;exports.isEqual=e.isEqual;exports.isFunction=e.isFunction;exports.isInViewport=e.isInViewport;exports.isMobile=e.isMobile;exports.isNull=e.isNull;exports.isNullOrUndefined=e.isNullOrUndefined;exports.isNumber=e.isNumber;exports.isObject=e.isObject;exports.isString=e.isString;exports.isTablet=e.isTablet;exports.isThisMonth=e.isThisMonth;exports.isThisWeek=e.isThisWeek;exports.isToday=e.isToday;exports.isUndefined=e.isUndefined;exports.isValidDate=e.isValidDate;exports.keys=e.keys;exports.lastIndexOf=e.lastIndexOf;exports.map=e.map;exports.max=e.max;exports.merge=e.merge;exports.min=e.min;exports.omit=e.omit;exports.pick=e.pick;exports.random=e.random;exports.randomChoice=e.randomChoice;exports.randomFromArray=e.randomFromArray;exports.randomInt=e.randomInt;exports.randomMultiple=e.randomMultiple;exports.range=e.range;exports.remove=e.remove;exports.removeAt=e.removeAt;exports.removeEmptyStrings=e.removeEmptyStrings;exports.removeLocalStorage=e.removeLocalStorage;exports.removeNullValues=e.removeNullValues;exports.removeSessionStorage=e.removeSessionStorage;exports.removeWhere=e.removeWhere;exports.round=e.round;exports.scrollToElement=e.scrollToElement;exports.scrollToTop=e.scrollToTop;exports.set=e.set;exports.setLocalStorage=e.setLocalStorage;exports.setSessionStorage=e.setSessionStorage;exports.shuffle=e.shuffle;exports.size=e.size;exports.sortBy=e.sortBy;exports.sortNumbers=e.sortNumbers;exports.sum=e.sum;exports.throttle=e.throttle;exports.union=e.union;exports.unique=e.unique;exports.uniqueBy=e.uniqueBy;exports.values=e.values;exports.apiDelete=r.apiDelete;exports.apiGet=r.apiGet;exports.apiPatch=r.apiPatch;exports.apiPost=r.apiPost;exports.apiPut=r.apiPut;exports.base64Decode=r.base64Decode;exports.base64Encode=r.base64Encode;exports.br2nl=r.br2nl;exports.bxmDecrypt=r.bxmDecrypt;exports.bxmEncrypt=r.bxmEncrypt;exports.callService=r.callService;exports.capitalize=r.capitalize;exports.capitalizeWords=r.capitalizeWords;exports.center=r.center;exports.closeNotification=r.closeNotification;exports.countChar=r.countChar;exports.countWords=r.countWords;exports.destroyNotifications=r.destroyNotifications;exports.encryptSha256=r.encryptSha256;exports.extractNumbers=r.extractNumbers;exports.findPattern=r.findPattern;exports.formatPhoneNumber=r.formatPhoneNumber;exports.generateAlphanumericUID=r.generateAlphanumericUID;exports.generateCustomUID=r.generateCustomUID;exports.generateGUID=r.generateGUID;exports.generateGUIDWithoutHyphens=r.generateGUIDWithoutHyphens;exports.generateLongUID=r.generateLongUID;exports.generateNumericUID=r.generateNumericUID;exports.generateRandomString=r.generateRandomString;exports.generateShortUID=r.generateShortUID;exports.generateTimestampUID=r.generateTimestampUID;exports.generateUID=r.generateUID;exports.getAllServiceCodes=r.getAllServiceCodes;exports.getClientIp=r.getClientIp;exports.getCrprCd=r.getCrprCd;exports.getDepartmentInfo=r.getDepartmentInfo;exports.getDisplayName=r.getDisplayName;exports.getDprtCd=r.getDprtCd;exports.getDprtNm=r.getDprtNm;exports.getEmplNo=r.getEmplNo;exports.getGuid=r.getGuid;exports.getRoleList=r.getRoleList;exports.getServiceCode=r.getServiceCode;exports.getUserDvsn=r.getUserDvsn;exports.getUserId=r.getUserId;exports.getUserInfo=r.getUserInfo;exports.getUserNm=r.getUserNm;exports.hasAllRoles=r.hasAllRoles;exports.hasAnyRole=r.hasAnyRole;exports.hasRole=r.hasRole;exports.hasUserInfo=r.hasUserInfo;exports.isEmpty=r.isEmpty;exports.isLoggedIn=r.isLoggedIn;exports.isSafeEmpty=r.isSafeEmpty;exports.isValidEmail=r.isValidEmail;exports.isValidUrl=r.isValidUrl;exports.md5Hash=r.md5Hash;exports.nl2br=r.nl2br;exports.notificationService=r.notificationService;exports.padLeft=r.padLeft;exports.padRight=r.padRight;exports.removeHtmlTags=r.removeHtmlTags;exports.removeSpecialChars=r.removeSpecialChars;exports.reverse=r.reverse;exports.setClientIp=r.setClientIp;exports.setServiceCodeOverrides=r.setServiceCodeOverrides;exports.sha256Hash=r.sha256Hash;exports.showError=r.showError;exports.showInfo=r.showInfo;exports.showSuccess=r.showSuccess;exports.showWarning=r.showWarning;exports.simpleDecrypt=r.simpleDecrypt;exports.simpleEncrypt=r.simpleEncrypt;exports.toCamelCase=r.toCamelCase;exports.toKebabCase=r.toKebabCase;exports.toSnakeCase=r.toSnakeCase;exports.truncate=r.truncate;exports.useUserStore=r.useUserStore;exports.verifyClientIp=r.verifyClientIp;exports.THEME_COOKIE_NAME=o.THEME_COOKIE_NAME;exports.closeAllMessages=o.closeAllMessages;exports.closeMessage=o.closeMessage;exports.convertImageFormat=o.convertImageFormat;exports.deleteCookie=o.deleteCookie;exports.downloadByFileKey=o.downloadByFileKey;exports.generateSrcSet=o.generateSrcSet;exports.getAvatarImage=o.getAvatarImage;exports.getBackgroundImage=o.getBackgroundImage;exports.getCookie=o.getCookie;exports.getDefaultBackgroundImage=o.getDefaultBackgroundImage;exports.getIconImage=o.getIconImage;exports.getLogoImage=o.getLogoImage;exports.getOptimizedImageUrl=o.getOptimizedImageUrl;exports.handleImageError=o.handleImageError;exports.preloadImage=o.preloadImage;exports.resizeImage=o.resizeImage;exports.setCookie=o.setCookie;exports.showApiError=o.showApiError;exports.showDuplicateError=o.showDuplicateError;exports.showLoading=o.showLoading;exports.showRequiredError=o.showRequiredError;exports.showSaveError=o.showSaveError;exports.showSaveSuccess=o.showSaveSuccess;exports.useImageLoader=o.useImageLoader;exports.getEnvCode=g.getEnvCode;exports.isDev=g.isDev;exports.isLocal=g.isLocal;exports.isProd=g.isProd;exports.useFavoriteStore=u.useFavoriteStore;exports.useMenuModelStore=u.useMenuModelStore;exports.useMenuViewStore=u.useMenuViewStore;exports.useCodeStore=c.useCodeStore;exports.useColorStore=c.useColorStore;exports.useOptionStore=c.useOptionStore;exports.usePopupStore=w.usePopupStore;exports.AuthProvider=d.AuthProvider;exports.useAuth=d.useAuth;exports.CommonCodeProvider=s.CommonCodeProvider;exports.UtilsProvider=s.UtilsProvider;exports.useApiUtils=s.useApiUtils;exports.useArrayUtils=s.useArrayUtils;exports.useCodeColor=s.useCodeColor;exports.useCodeList=s.useCodeList;exports.useCodeListByOption=s.useCodeListByOption;exports.useCodeName=s.useCodeName;exports.useCommonCode=s.useCommonCode;exports.useCommonUtils=s.useCommonUtils;exports.useDateUtils=s.useDateUtils;exports.useGridLookup=s.useGridLookup;exports.usePopup=s.usePopup;exports.usePopupContext=s.usePopupContext;exports.useStringUtils=s.useStringUtils;exports.useUtils=s.useUtils;exports.ScreenProtectProvider=m.ScreenProtectProvider;exports.useLock=m.useLock;exports.SearchBoxProvider=i.SearchBoxProvider;exports.ServiceCodeProvider=i.ServiceCodeProvider;exports.useAllServiceCodes=i.useAllServiceCodes;exports.useLogServiceCodeConfig=i.useLogServiceCodeConfig;exports.useSearchBox=i.useSearchBox;exports.useServiceCode=i.useServiceCode;exports.useServiceCodeValue=i.useServiceCodeValue;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCode as s, useFavorite as o, useMenuModel as r, useMenuView as t, usePopupState as i, useUser as n } from "./stores/index.js";
|
|
2
|
-
import { B as l, a as u, b as m, c as d, d as c, e as p, f as S, g as f, h as C, i as h, j as w, k as B, l as v, C as D, m as I, G as y, Q as b, n as x, S as k, o as U } from "./chunks/SSOHandler-
|
|
2
|
+
import { B as l, a as u, b as m, c as d, d as c, e as p, f as S, g as f, h as C, i as h, j as w, k as B, l as v, C as D, m as I, G as y, Q as b, n as x, S as k, o as U } from "./chunks/SSOHandler-DNvCpRTu.js";
|
|
3
3
|
import { B as L } from "./chunks/BwgSpace-CnLM4qcg.js";
|
|
4
4
|
import { r as E } from "./chunks/realFormat-DRGLFabQ.js";
|
|
5
5
|
import { o as M, j as N, k as R, g as O, a as F, B as G, f as V, q as K, d as W, e as j, n as q, m as H, i as z, h as Q, c as _, b as J, l as X, p as Y } from "./chunks/BwgLargeUploader-DsaIHpYz.js";
|
|
@@ -9,7 +9,7 @@ import { Y as ta, t as ia, J as na, a9 as ga, aa as la, ab as ua, ac as ma, _ as
|
|
|
9
9
|
import { Q as Xe, R as Ye, S as Ze, T as $e, U as as, b as es, a as ss, c as os, d as rs, e as ts, V as is, f as ns, g as gs, h as ls, ae as us, i as ms, j as ds, af as cs, k as ps, l as Ss, m as fs, n as Cs, o as hs, p as ws, q as Bs, r as vs, s as Ds, t as Is, u as ys, v as bs, w as xs, x as ks, al as Us, W as Ps, _ as Ls, $ as As, a0 as Es, a1 as Ts, a2 as Ms, a3 as Ns, X as Rs, a4 as Os, am as Fs, a5 as Gs, a6 as Vs, a7 as Ks, a8 as Ws, a9 as js, aa as qs, ab as Hs, ac as zs, y as Qs, ad as _s, z as Js, A as Xs, B as Ys, C as Zs, D as $s, ag as ao, E as eo, F as so, G as oo, H as ro, I as to, Y as io, an as no, J as go, ah as lo, ai as uo, aj as mo, ak as co, K as po, L as So, M as fo, N as Co, O as ho, P as wo, ao as Bo, Z as vo } from "./chunks/serviceConfig-lAlRNVIw.js";
|
|
10
10
|
import { T as Io, n as yo, m as bo, c as xo, j as ko, x as Uo, g as Po, a as Lo, b as Ao, k as Eo, d as To, e as Mo, f as No, h as Ro, i as Oo, p as Fo, r as Go, s as Vo, o as Ko, v as Wo, l as jo, w as qo, t as Ho, q as zo, u as Qo } from "./chunks/FileUtils-DsA-Sw37.js";
|
|
11
11
|
import { g as Jo, a as Xo, i as Yo, b as Zo } from "./chunks/envUtils-C9Gf5aek.js";
|
|
12
|
-
import { b as ar, u as er, a as sr } from "./chunks/menuViewStore-
|
|
12
|
+
import { b as ar, u as er, a as sr } from "./chunks/menuViewStore-BhfgX53f.js";
|
|
13
13
|
import { u as rr, b as tr, a as ir } from "./chunks/codeStore-rU4v3QIA.js";
|
|
14
14
|
import { u as gr } from "./chunks/popupStore-BJ_IYrdY.js";
|
|
15
15
|
import { A as ur, u as mr } from "./chunks/AuthContext-Ei2P-z4d.js";
|
package/dist/stores/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../chunks/codeStore-BG8S_mdS.cjs"),o=require("../chunks/serviceConfig-Cc8jfw_Y.cjs"),u=require("../chunks/popupStore-BGubYHZh.cjs"),e=require("../chunks/menuViewStore-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../chunks/codeStore-BG8S_mdS.cjs"),o=require("../chunks/serviceConfig-Cc8jfw_Y.cjs"),u=require("../chunks/popupStore-BGubYHZh.cjs"),e=require("../chunks/menuViewStore-w4fLSR6N.cjs"),s=()=>t.useCodeStore.getState(),r=()=>u.usePopupStore.getState(),S=()=>o.useUserStore.getState(),n=()=>e.useFavoriteStore.getState(),i=()=>e.useMenuModelStore.getState(),p=()=>e.useMenuViewStore.getState();exports.useCodeStore=t.useCodeStore;exports.useColorStore=t.useColorStore;exports.useOptionStore=t.useOptionStore;exports.useUserStore=o.useUserStore;exports.usePopupStore=u.usePopupStore;exports.useFavoriteStore=e.useFavoriteStore;exports.useMenuModelStore=e.useMenuModelStore;exports.useMenuViewStore=e.useMenuViewStore;exports.useCode=s;exports.useFavorite=n;exports.useMenuModel=i;exports.useMenuView=p;exports.usePopupState=r;exports.useUser=S;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/stores/index.d.ts
CHANGED
|
@@ -26,9 +26,10 @@ export declare const useMenuView: () => {
|
|
|
26
26
|
maxTabs: number;
|
|
27
27
|
tabProtectFlag: Record<string, boolean>;
|
|
28
28
|
tabParams: Record<string, Record<string, any>>;
|
|
29
|
+
componentLabelMap: Record<string, string>;
|
|
29
30
|
openTabFromMenu: (menuItem: import('./menuModelStore').MenuItem, params?: Record<string, any>) => void;
|
|
30
31
|
openTabByMenuId: (menuId: string, params?: Record<string, any>) => void;
|
|
31
|
-
openTabByComponentId: (cpntId: string,
|
|
32
|
+
openTabByComponentId: (cpntId: string, params?: Record<string, any>) => void;
|
|
32
33
|
focusTab: (tabKey: string) => void;
|
|
33
34
|
closeTab: (tabKey: string) => void;
|
|
34
35
|
closeAllTabs: () => void;
|
|
@@ -37,6 +38,7 @@ export declare const useMenuView: () => {
|
|
|
37
38
|
setProtectFlagForKey: (key: string) => void;
|
|
38
39
|
clearProtectFlagForKey: (key: string) => void;
|
|
39
40
|
setTabParams: (key: string, params: Record<string, any>) => void;
|
|
41
|
+
setComponentLabelMap: (map: Record<string, string>, merge?: boolean) => void;
|
|
40
42
|
};
|
|
41
43
|
export type { MenuItem } from './menuModelStore';
|
|
42
44
|
export type { TabItem } from './menuViewStore';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,eAAO,MAAM,OAAO,4CAAgC,CAAC;AACrD,eAAO,MAAM,aAAa,yCAAiC,CAAC;AAC5D,eAAO,MAAM,OAAO,uCAAgC,CAAC;AACrD,eAAO,MAAM,WAAW,+CAAoC,CAAC;AAC7D,eAAO,MAAM,YAAY;;;;;;;;;CAAqC,CAAC;AAC/D,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,eAAO,MAAM,OAAO,4CAAgC,CAAC;AACrD,eAAO,MAAM,aAAa,yCAAiC,CAAC;AAC5D,eAAO,MAAM,OAAO,uCAAgC,CAAC;AACrD,eAAO,MAAM,WAAW,+CAAoC,CAAC;AAC7D,eAAO,MAAM,YAAY;;;;;;;;;CAAqC,CAAC;AAC/D,eAAO,MAAM,WAAW;;;;;;;;;2EAGxB,CAAC;4CAEQ,CAAC;iDACuB,CAAC;;;;;;;;;6DAOsb,CAAC;CAb7Z,CAAC;AAG7D,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EACV,eAAe,EACf,cAAc,EACd,SAAS,EACT,QAAQ,GACT,MAAM,aAAa,CAAC"}
|
package/dist/stores/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { u as e } from "../chunks/codeStore-rU4v3QIA.js";
|
|
|
2
2
|
import { b as C, a as b } from "../chunks/codeStore-rU4v3QIA.js";
|
|
3
3
|
import { ao as t } from "../chunks/serviceConfig-lAlRNVIw.js";
|
|
4
4
|
import { u as o } from "../chunks/popupStore-BJ_IYrdY.js";
|
|
5
|
-
import { b as s, u as r, a as u } from "../chunks/menuViewStore-
|
|
5
|
+
import { b as s, u as r, a as u } from "../chunks/menuViewStore-BhfgX53f.js";
|
|
6
6
|
const i = () => e.getState(), m = () => o.getState(), c = () => t.getState(), g = () => s.getState(), M = () => r.getState(), f = () => u.getState();
|
|
7
7
|
export {
|
|
8
8
|
i as useCode,
|
|
@@ -14,9 +14,10 @@ type MenuViewState = {
|
|
|
14
14
|
maxTabs: number;
|
|
15
15
|
tabProtectFlag: Record<string, boolean>;
|
|
16
16
|
tabParams: Record<string, Record<string, any>>;
|
|
17
|
+
componentLabelMap: Record<string, string>;
|
|
17
18
|
openTabFromMenu: (menuItem: MenuItem, params?: Record<string, any>) => void;
|
|
18
19
|
openTabByMenuId: (menuId: string, params?: Record<string, any>) => void;
|
|
19
|
-
openTabByComponentId: (cpntId: string,
|
|
20
|
+
openTabByComponentId: (cpntId: string, params?: Record<string, any>) => void;
|
|
20
21
|
focusTab: (tabKey: string) => void;
|
|
21
22
|
closeTab: (tabKey: string) => void;
|
|
22
23
|
closeAllTabs: () => void;
|
|
@@ -25,6 +26,7 @@ type MenuViewState = {
|
|
|
25
26
|
setProtectFlagForKey: (key: string) => void;
|
|
26
27
|
clearProtectFlagForKey: (key: string) => void;
|
|
27
28
|
setTabParams: (key: string, params: Record<string, any>) => void;
|
|
29
|
+
setComponentLabelMap: (map: Record<string, string>, merge?: boolean) => void;
|
|
28
30
|
};
|
|
29
31
|
export declare const useMenuViewStore: import('zustand').UseBoundStore<import('zustand').StoreApi<MenuViewState>>;
|
|
30
32
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menuViewStore.d.ts","sourceRoot":"","sources":["../../src/stores/menuViewStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAqB,MAAM,kBAAkB,CAAC;AAU/D,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,KAAK,aAAa,GAAG;IAGnB,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAExC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEhC,IAAI,EAAE,OAAO,EAAE,CAAC;IAEhB,gBAAgB,EAAE,OAAO,CAAC;IAE1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"menuViewStore.d.ts","sourceRoot":"","sources":["../../src/stores/menuViewStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAqB,MAAM,kBAAkB,CAAC;AAU/D,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,KAAK,aAAa,GAAG;IAGnB,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAExC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEhC,IAAI,EAAE,OAAO,EAAE,CAAC;IAEhB,gBAAgB,EAAE,OAAO,CAAC;IAE1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAExC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAE/C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI1C,eAAe,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAE5E,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAExE,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAE7E,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC,YAAY,EAAE,MAAM,IAAI,CAAC;IAEzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAE1B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAEtC,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5C,sBAAsB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9C,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAEjE,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9E,CAAC;AAGF,eAAO,MAAM,gBAAgB,4EAuN1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";const M=require("zustand"),l=require("./serviceConfig-Cc8jfw_Y.cjs"),b=require("./envUtils-CduTHoHu.cjs"),u=require("antd"),T=M.create((r,a)=>({favorites:[],isLoading:!1,error:null,fetchFavorites:async({crprCd:e,userId:t})=>{console.log("즐겨찾기 메뉴 요청:",{crprCd:e,userId:t}),r({isLoading:!0,error:null});try{const o=await l.callService(l.getServiceCode("AUTH_BMRK"),{crprCd:e,userId:t});let n=[];if(o?.favorites&&Array.isArray(o.favorites)?n=o.favorites:Array.isArray(o)?n=o:(console.warn("즐겨찾기 데이터가 비어있거나 예상과 다른 구조입니다."),n=[]),console.log("즐겨찾기 메뉴 로드 완료:",n),b.isLocal&&n.length===0){const s=[{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST001",menuNm:"API 테스트",scrnId:"TEST001",menuNo:1,scrnPath:"/dev/ApiTest",menuLvl:3,rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:t},{crprCd:"100",menuGbCd:"CMPRGRP",menuPrntId:"FAV001",menuId:"FAV_TEST002",menuNm:"프로젝트 개요",scrnId:"DOCS001",menuNo:2,scrnPath:"/docs/ProjectOverview",menuLvl:3,rootMenu:"FAV001",addedAt:new Date().toISOString(),userId:t}];r({favorites:s,isLoading:!1,error:null}),console.log("개발 모드: 테스트용 즐겨찾기 데이터 추가")}else r({favorites:n,isLoading:!1,error:null})}catch(o){console.error("즐겨찾기 메뉴 로드 실패:",o),r({error:o instanceof Error?o.message:"즐겨찾기 로드 실패",isLoading:!1})}},addFavorite:async(e,t)=>{const{favorites:o}=a();if(o.some(n=>n.menuId===e.menuId)){console.log("이미 즐겨찾기에 추가된 메뉴입니다:",e.menuNm);return}try{await l.callService(l.getServiceCode("AUTH_BMRK"),{action:"add",crprCd:e.crprCd,userId:t,menuId:e.menuId,menuNm:e.menuNm,scrnPath:e.scrnPath});const n={...e,addedAt:new Date().toISOString(),userId:t};r({favorites:[...o,n]}),console.log("즐겨찾기 추가 완료:",e.menuNm)}catch(n){throw console.error("즐겨찾기 추가 실패:",n),n}},removeFavorite:async(e,t)=>{const{favorites:o}=a();try{await l.callService(l.getServiceCode("AUTH_BMRK"),{action:"remove",crprCd:"100",userId:t,menuId:e});const n=o.filter(s=>s.menuId!==e);r({favorites:n}),console.log("즐겨찾기 제거 완료:",e)}catch(n){throw console.error("즐겨찾기 제거 실패:",n),n}},isFavorite:e=>{const{favorites:t}=a();return t.some(o=>o.menuId===e)},clearFavorites:()=>{r({favorites:[],isLoading:!1,error:null})}})),v={DEFAULT_PRNT_GBCD:1},F=r=>r&&typeof r=="object"&&typeof r.menuId=="string"&&typeof r.menuNm=="string"&&typeof r.crprCd=="string",g=r=>Array.isArray(r)&&r.every(F);let f=[],I=[];const h=r=>{if(r&&typeof r=="object"){const a=r;if(a.menus&&g(a.menus))return a.menus;if(g(r))return r}return console.warn("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."),[]},A=(r,a)=>!!a&&r.crprCd===a.crprCd&&r.userId===a.userId&&(r.prntGbcd??v.DEFAULT_PRNT_GBCD)===(a.prntGbcd??v.DEFAULT_PRNT_GBCD),y=r=>{if(f.length===r.length&&f.every((n,s)=>n.menuId===r[s]?.menuId&&n.menuPrntId===r[s]?.menuPrntId))return I;if(!r.length)return[];const a=new Map,e=[];r.forEach(n=>n?.menuId&&a.set(n.menuId,{...n,children:[]})),r.forEach(n=>{const s=a.get(n.menuId);s&&(n.menuPrntId&&n.menuPrntId!==""&&n.menuPrntId!=="-"?a.get(n.menuPrntId)?.children?.push(s):e.push(s))});const t=n=>n.sort((s,c)=>(s?.menuNo??0)-(c?.menuNo??0)).map(s=>({...s,children:s.children&&s.children.length?t(s.children):void 0})),o=t(e);return f=[...r],I=o,o},P=M.create((r,a)=>({menuList:[],flatMenuList:[],isLoading:!1,error:null,_lastFetchParams:null,fetchMenu:async({crprCd:e,userId:t,prntGbcd:o})=>{const n={crprCd:e,userId:t,prntGbcd:o??v.DEFAULT_PRNT_GBCD};if(A(n,a()._lastFetchParams)){console.log("✅ 중복 fetch 차단",n);return}r({isLoading:!0,error:null,_lastFetchParams:n});try{const s=await l.callService(l.getServiceCode("AUTH_MENU"),n),c=h(s),i=y(c);r({flatMenuList:c,menuList:i,isLoading:!1,error:null})}catch(s){r({isLoading:!1,error:s?.message??"메뉴 로드 실패"})}},clearMenu:()=>{r({menuList:[],flatMenuList:[],error:null,_lastFetchParams:null})},findMenuById:e=>{const{flatMenuList:t}=a();return t.find(o=>o.menuId===e)??null}})),m={MAX_TABS:15},S=M.create((r,a)=>({activeMenuId:null,activeMenuItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:m.MAX_TABS,tabProtectFlag:{},tabParams:{},openTabFromMenu:(e,t)=>{const{tabs:o,activeMenuId:n}=a();if(o.find(c=>c.key===e.menuId))n!==e.menuId?(r({activeMenuId:e.menuId,activeMenuItem:e}),console.log("✅ 기존 탭 활성화 - activeMenuItem:",e),a().setTabParams(e.menuId,t||{}),e?.prsnInfoYn==="Y"&&a().setProtectFlagForKey(e.menuId)):(console.warn("❌ 유효하지 않은 메뉴정보",e.menuId),u.message.warning("유효하지 않은 메뉴정보입니다."));else{if(o.length>m.MAX_TABS){console.warn("❌ 최대 탭 개수를 초과했습니다."),u.message.warning(`최대 ${m.MAX_TABS}개의 탭만 열 수 있습니다.
|
|
2
|
-
기존 탭을 닫고 다시 시도해주세요.`);return}const c={key:e.menuId,label:e.menuNm,gubun:"M",menuItem:e,closable:!0};r({tabs:[...o,c],activeMenuId:e.menuId,activeMenuItem:e}),a().setTabParams(e.menuId,t||{}),console.log("✅ 새 탭 추가 - activeMenuItem:",e),e?.prsnInfoYn==="Y"&&a().setProtectFlagForKey(e.menuId)}},openTabByMenuId:(e,t)=>{const o=P.getState().findMenuById(e);o?a().openTabFromMenu(o,t):(console.warn("❌ 메뉴 ID를 찾을 수 없음:",e),u.message.warning("메뉴 ID를 찾을 수 없습니다."))},openTabByComponentId:(e,t,o)=>{const{tabs:n,activeMenuId:s}=a(),c=n.find(d=>d.key===e),i={crprCd:"",menuNm:t||e,menuId:e,scrnId:e,scrnPath:e,menuNo:void 0,menuLvl:0,prsnInfoYn:"N",rootMenu:"",iconCd:"",menuGbCd:"",menuPrntId:"",children:[]};if(c)if(s!==i.menuId)r({activeMenuId:i.menuId,activeMenuItem:i}),a().setTabParams(i.menuId,o||{});else{console.warn("❌ 유효하지 않은 메뉴정보",e),u.message.warning("유효하지 않은 메뉴정보입니다.");return}else{const d={key:e,gubun:"C",label:t||e,menuItem:i,closable:!0};r({tabs:[...n,d],activeMenuId:e,activeMenuItem:i}),a().setTabParams(e,o||{})}},closeTab:e=>{const{tabs:t,activeMenuId:o}=a();t.find(c=>c.key===e);const n=t.filter(c=>c.key!==e);let s=o;if(o===e){const c=t.findIndex(i=>i.key===e);s=n.length?n[Math.min(c,n.length-1)]?.key??null:null}r({tabs:n}),s&&a().focusTab(s)},focusTab:e=>{const{tabs:t}=a(),o=t.find(n=>n.key===e);o?o.menuItem.prsnInfoYn==="Y"?(r({activeMenuId:e,activeMenuItem:o.menuItem}),console.log("✅ 탭 포커스 (개인정보) - activeMenuItem:",o.menuItem),a().setProtectFlagForKey(e)):(r({activeMenuId:e,activeMenuItem:o.menuItem}),console.log("✅ 탭 포커스 (일반) - activeMenuItem:",o.menuItem),a().clearProtectFlagForKey(e)):(r({activeMenuId:e,activeMenuItem:null}),console.warn("❌ 탭을 찾을 수 없음:",e))},closeAllTabs:()=>r({tabs:[],activeMenuId:null,activeMenuItem:null}),toggleSidebar:()=>r(e=>({sidebarCollapsed:!e.sidebarCollapsed})),reorderTabs:e=>r(t=>{const o=new Map(t.tabs.map(n=>[n.key,n]));return{tabs:e.map(n=>o.get(n)).filter(Boolean)}}),setProtectFlagForKey:e=>r(t=>({tabProtectFlag:{...t.tabProtectFlag,[e]:!0}})),clearProtectFlagForKey:e=>r(t=>{const o={...t.tabProtectFlag};return delete o[e],{tabProtectFlag:o}}),setTabParams:(e,t)=>r(o=>{const n=o.tabParams[e]||{},s={...t||{}};return Object.keys(n).length===Object.keys(s).length&&Object.keys(s).every(i=>n[i]===s[i])?o:{tabParams:{...o.tabParams,[e]:s}}})}));exports.useFavoriteStore=T;exports.useMenuModelStore=P;exports.useMenuViewStore=S;
|
|
3
|
-
//# sourceMappingURL=menuViewStore-BJak0NMm.cjs.map
|