@bwg-ui/core 1.3.5 → 1.3.7

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.
Files changed (74) hide show
  1. package/dist/chunks/{CMSearchIntfGwP01-CuGDAfFM.cjs → CMSearchIntfGwP01-0t3umcc_.cjs} +1 -1
  2. package/dist/chunks/{CMSearchIntfGwP01-DBpDpgQr.js → CMSearchIntfGwP01-DCHZJn2H.js} +1 -1
  3. package/dist/chunks/{MenuReport-yw8tZDUk.cjs → MenuReport-C70mGz2g.cjs} +1 -1
  4. package/dist/chunks/{MenuReport-CCbCy7yt.js → MenuReport-IBdoU2S3.js} +2 -2
  5. package/dist/chunks/common-components-DNgQR-Ge.cjs +1109 -0
  6. package/dist/chunks/{common-components-DtzVj5lz.js → common-components-DeYL3J6X.js} +13058 -13574
  7. package/dist/chunks/layout-components-Bf9IsLUS.cjs +38 -0
  8. package/dist/chunks/{layout-components-ljht1sHh.js → layout-components-DnuV2Psp.js} +831 -759
  9. package/dist/chunks/provider-Bi5OYngn.cjs +1 -0
  10. package/dist/chunks/{provider-Kxea5IoZ.js → provider-Bx4VpaFf.js} +90 -74
  11. package/dist/components/common/BwgGrid.d.ts +31 -8
  12. package/dist/components/common/BwgGrid.d.ts.map +1 -1
  13. package/dist/components/common/BwgView.d.ts.map +1 -1
  14. package/dist/components/common/index.cjs +1 -1
  15. package/dist/components/common/index.js +1 -1
  16. package/dist/components/core/BwgEmpSearch.d.ts +2 -2
  17. package/dist/components/core/BwgEmpSearch.d.ts.map +1 -1
  18. package/dist/components/core/BwgMaskedDate.d.ts.map +1 -1
  19. package/dist/components/core/BwgMaskedRange.d.ts.map +1 -1
  20. package/dist/components/core/index.cjs +1 -1
  21. package/dist/components/core/index.js +211 -208
  22. package/dist/components/guide/index.cjs +1 -1
  23. package/dist/components/guide/index.js +2 -2
  24. package/dist/components/layout/AppWrapper.d.ts +5 -1
  25. package/dist/components/layout/AppWrapper.d.ts.map +1 -1
  26. package/dist/components/layout/BwgCoreLogin.d.ts.map +1 -1
  27. package/dist/components/layout/BwgPortal01.d.ts.map +1 -1
  28. package/dist/components/layout/extension/ContentWrapper.d.ts.map +1 -1
  29. package/dist/components/layout/index.cjs +1 -1
  30. package/dist/components/layout/index.js +1 -1
  31. package/dist/components/pages/board/CMMyBoardM01.d.ts.map +1 -1
  32. package/dist/components/pages/rsrc/CMPopuMstrM01.d.ts.map +1 -1
  33. package/dist/components/popup/SearchOrganizationP01.d.ts.map +1 -1
  34. package/dist/components/popup/SearchOrganizationP02.d.ts.map +1 -1
  35. package/dist/components/popup/index.cjs +1 -1
  36. package/dist/components/popup/index.js +1 -1
  37. package/dist/index.cjs +1 -1
  38. package/dist/index.js +273 -271
  39. package/dist/provider/contexts/PageContentContext.d.ts +23 -0
  40. package/dist/provider/contexts/PageContentContext.d.ts.map +1 -0
  41. package/dist/provider/contexts/index.d.ts +1 -0
  42. package/dist/provider/contexts/index.d.ts.map +1 -1
  43. package/dist/provider/index.cjs +1 -1
  44. package/dist/provider/index.js +21 -19
  45. package/dist/public/realgrid/css/realgrid-style-custom.css +6 -10
  46. package/dist/stores/index.cjs +1 -1
  47. package/dist/stores/index.js +1 -1
  48. package/dist/styles/assets/images/backgrounds/kiam_login_bg.png +0 -0
  49. package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
  50. package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
  51. package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
  52. package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
  53. package/dist/styles/components_02.css +35 -0
  54. package/dist/styles/global.css +9 -1
  55. package/dist/styles/index.css +3 -0
  56. package/dist/styles/layout.css +14 -4
  57. package/dist/styles/layout_02.css +99 -0
  58. package/dist/styles/login.css +7 -44
  59. package/dist/styles/login_02.css +35 -0
  60. package/dist/utils/apiUtils.d.ts.map +1 -1
  61. package/dist/utils/index.cjs +1 -1
  62. package/dist/utils/index.d.ts +16 -22
  63. package/dist/utils/index.d.ts.map +1 -1
  64. package/dist/utils/index.js +1253 -1222
  65. package/dist/utils/messageUtils.d.ts +36 -48
  66. package/dist/utils/messageUtils.d.ts.map +1 -1
  67. package/dist/utils/modalUtils.d.ts +68 -0
  68. package/dist/utils/modalUtils.d.ts.map +1 -0
  69. package/dist/utils/notificationUtils.d.ts +50 -41
  70. package/dist/utils/notificationUtils.d.ts.map +1 -1
  71. package/package.json +1 -1
  72. package/dist/chunks/common-components-CbkWoYfX.cjs +0 -1111
  73. package/dist/chunks/layout-components-BzLAGXiu.cjs +0 -38
  74. package/dist/chunks/provider-r4mkv5Zs.cjs +0 -1
@@ -1,24 +1,26 @@
1
- import { A as o, B as r, C as a, n as u, S as i, o as d, q as C, f as c, b as v, j as S, h as t, k as P, i as m, g as n, l as p, m as B, r as g, e as h, c as l, p as L, u as w } from "../chunks/provider-Kxea5IoZ.js";
1
+ import { A as o, B as a, C as r, P as u, o as i, S as d, p as C, r as t, f as v, b as P, j as c, h as n, k as S, i as g, g as m, l as p, n as B, s as h, m as l, e as L, c as w, q as A, u as f } from "../chunks/provider-Bx4VpaFf.js";
2
2
  export {
3
3
  o as AuthProvider,
4
- r as BwgViewProvider,
5
- a as CommonCodeProvider,
6
- u as ScreenProtectProvider,
7
- i as SearchBoxProvider,
8
- d as ServiceCodeProvider,
9
- C as useAllServiceCodes,
10
- c as useAuth,
11
- v as useBwgView,
12
- S as useCodeColor,
13
- t as useCodeList,
14
- P as useCodeListByOption,
15
- m as useCodeName,
16
- n as useCommonCode,
4
+ a as BwgViewProvider,
5
+ r as CommonCodeProvider,
6
+ u as PageContentProvider,
7
+ i as ScreenProtectProvider,
8
+ d as SearchBoxProvider,
9
+ C as ServiceCodeProvider,
10
+ t as useAllServiceCodes,
11
+ v as useAuth,
12
+ P as useBwgView,
13
+ c as useCodeColor,
14
+ n as useCodeList,
15
+ S as useCodeListByOption,
16
+ g as useCodeName,
17
+ m as useCommonCode,
17
18
  p as useGridLookup,
18
19
  B as useLock,
19
- g as useLogServiceCodeConfig,
20
- h as usePopup,
21
- l as useSearchBox,
22
- L as useServiceCode,
23
- w as useServiceCodeValue
20
+ h as useLogServiceCodeConfig,
21
+ l as usePageContent,
22
+ L as usePopup,
23
+ w as useSearchBox,
24
+ A as useServiceCode,
25
+ f as useServiceCodeValue
24
26
  };
@@ -101,7 +101,6 @@ THEME : Realgrid style 재정의
101
101
  .rg-fixed-row {
102
102
  background-color: none;
103
103
  }
104
-
105
104
  .rg-fixed-body .rg-data-row {
106
105
  background-color: none;
107
106
  }
@@ -515,26 +514,23 @@ THEME : Realgrid style 재정의
515
514
 
516
515
  /* 250822 고현아 추가 */
517
516
  .rg-rowbarcontainer .rg-table tr td.rg-rowindicator-focus {
517
+ /* background: none; */
518
518
  background-color: #e1efff;
519
519
  border-top: 1px solid #85c2fe;
520
520
  border-bottom: 1px solid #85c2fe;
521
521
  }
522
522
 
523
523
  .rg-rowbarcontainer .rg-table tr td.rg-rowindicator-select {
524
- background-color: #e1efff;
525
- border-top: 1px solid #85c2fe;
526
- border-bottom: 1px solid #85c2fe;
524
+ background: none;
527
525
  }
528
526
  .rg-focused-cell {
529
- background: none !important;
530
- border-top: 1px solid #85c2fe !important;
531
- border-bottom: 1px solid #85c2fe !important;
527
+ border: 1px solid #85c2fe;
532
528
  }
533
529
 
534
- .rg-focused-row {
530
+ .rg-data-row.rg-focused-row {
535
531
  background: #e1efff !important;
536
- border-top: 1px solid #85c2fe !important;
537
- border-bottom: 1px solid #85c2fe !important;
532
+ border-top: 1px solid #85c2fe;
533
+ border-bottom: 1px solid #85c2fe;
538
534
  }
539
535
  .rg-selection-cell {
540
536
  background: none !important;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("zustand"),I=require("../utils/index.cjs"),L=require("antd"),V=require("../chunks/layout-components-BzLAGXiu.cjs"),k=require("react"),Q=require("axios");function ee(r,n){let e;try{e=r()}catch{return}return{getItem:o=>{var t;const a=d=>d===null?null:JSON.parse(d,void 0),c=(t=e.getItem(o))!=null?t:null;return c instanceof Promise?c.then(a):a(c)},setItem:(o,t)=>e.setItem(o,JSON.stringify(t,void 0)),removeItem:o=>e.removeItem(o)}}const G=r=>n=>{try{const e=r(n);return e instanceof Promise?e:{then(s){return G(s)(e)},catch(s){return this}}}catch(e){return{then(s){return this},catch(s){return G(s)(e)}}}},te=(r,n)=>(e,s,o)=>{let t={storage:ee(()=>localStorage),partialize:C=>C,version:0,merge:(C,N)=>({...N,...C}),...n},a=!1;const c=new Set,d=new Set;let i=t.storage;if(!i)return r((...C)=>{console.warn(`[zustand persist middleware] Unable to update item '${t.name}', the given storage is currently unavailable.`),e(...C)},s,o);const l=()=>{const C=t.partialize({...s()});return i.setItem(t.name,{state:C,version:t.version})},h=o.setState;o.setState=(C,N)=>(h(C,N),l());const m=r((...C)=>(e(...C),l()),s,o);o.getInitialState=()=>m;let u;const f=()=>{var C,N;if(!i)return;a=!1,c.forEach(g=>{var M;return g((M=s())!=null?M:m)});const S=((N=t.onRehydrateStorage)==null?void 0:N.call(t,(C=s())!=null?C:m))||void 0;return G(i.getItem.bind(i))(t.name).then(g=>{if(g)if(typeof g.version=="number"&&g.version!==t.version){if(t.migrate){const M=t.migrate(g.state,g.version);return M instanceof Promise?M.then(A=>[!0,A]):[!0,M]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,g.state];return[!1,void 0]}).then(g=>{var M;const[A,Z]=g;if(u=t.merge(Z,(M=s())!=null?M:m),e(u,!0),A)return l()}).then(()=>{S?.(u,void 0),u=s(),a=!0,d.forEach(g=>g(u))}).catch(g=>{S?.(void 0,g)})};return o.persist={setOptions:C=>{t={...t,...C},C.storage&&(i=C.storage)},clearStorage:()=>{i?.removeItem(t.name)},getOptions:()=>t,rehydrate:()=>f(),hasHydrated:()=>a,onHydrate:C=>(c.add(C),()=>{c.delete(C)}),onFinishHydration:C=>(d.add(C),()=>{d.delete(C)})},t.skipHydration||f(),u||m},v=te,P=b.create()(v((r,n)=>({user:null,hrInfo:null,buttonAuths:{},componentSize:1,gridSize:2,spacingSize:2,enableProtectWrapper:!0,gridLayouts:{},theme:"modern",isLoggedIn:()=>!!n().user,setLoginUser:(e,s)=>{r({user:e,hrInfo:s??null}),console.log("사용자 로그인:",e,s)},clearLoginUser:()=>{r({user:null,hrInfo:null,buttonAuths:{}}),console.log("사용자 로그아웃")},updateUser:(e,s)=>{const o=n().user,t=n().hrInfo;o&&r({user:{...o,...e}}),t&&r({hrInfo:{...t,...s}})},setComponentSize:e=>{r({componentSize:e}),console.log("컴포넌트 사이즈 변경:",e)},setGridSize:e=>{r({gridSize:e}),console.log("그리드 사이즈 변경:",e)},setSpacingSize:e=>{r({spacingSize:e}),console.log("여백 사이즈 변경:",e)},setEnableProtectWrapper:e=>{r({enableProtectWrapper:e})},setTheme:e=>{r({theme:e}),console.log("테마 변경:",e)},getButtonAuth:(e,s)=>{const o=`${e}_${s}`;return n().buttonAuths[o]||null},setButtonAuth:(e,s,o)=>{const t=`${e}_${s}`;r(a=>({buttonAuths:{...a.buttonAuths,[t]:o}}))},clearButtonAuths:()=>{r({buttonAuths:{}})},getGridLayouts:e=>n().gridLayouts[e]||[],getGridLayout:(e,s,o)=>n().getGridLayouts(e).find(c=>c.menuId===s&&c.gridId===o)||null,saveGridLayout:(e,s,o,t)=>{const a={...n().gridLayouts};a[e]||(a[e]=[]);const c=a[e].findIndex(i=>i.menuId===s&&i.gridId===o),d={menuId:s,gridId:o,layout:t};c>=0?a[e][c]=d:a[e].push(d),r({gridLayouts:a}),console.log(`[UserStore] 그리드 레이아웃 저장 완료: ${e}/${s}/${o}`)},removeGridLayout:(e,s,o)=>{const t={...n().gridLayouts};t[e]&&(t[e]=t[e].filter(a=>!(a.menuId===s&&a.gridId===o)),r({gridLayouts:t}),console.log(`[UserStore] 그리드 레이아웃 삭제 완료: ${e}/${s}/${o}`))},clearGridLayouts:e=>{const s={...n().gridLayouts};delete s[e],r({gridLayouts:s}),console.log(`[UserStore] ${e}의 모든 그리드 레이아웃 삭제 완료`)},clearAllGridLayouts:()=>{r({gridLayouts:{}}),console.log("[UserStore] 전체 그리드 레이아웃 삭제 완료")}}),{name:"user-storage",partialize:r=>({user:r.user,hrInfo:r.hrInfo,componentSize:r.componentSize,gridSize:r.gridSize,spacingSize:r.spacingSize,enableProtectWrapper:r.enableProtectWrapper,gridLayouts:r.gridLayouts,theme:r.theme})})),E={CACHE_SIZE_LIMIT:1e3},p={codeCache:new Map,nameCache:new Map,optionCache:new Map,colorCache:new Map,loadedGroups:new Set,cacheHits:new Map,clearCache(){this.codeCache.clear(),this.nameCache.clear(),this.optionCache.clear(),this.colorCache.clear(),this.loadedGroups.clear(),this.cacheHits.clear()},cleanupCache(){const r=Array.from(this.cacheHits.entries());r.sort((e,s)=>e[1]-s[1]),r.slice(0,Math.floor(r.length*.3)).forEach(([e])=>{this.codeCache.delete(e),this.nameCache.delete(e),this.optionCache.delete(e),this.colorCache.delete(e),this.cacheHits.delete(e)})},isGroupLoaded(r){return this.loadedGroups.has(r)},markGroupLoaded(r){this.loadedGroups.add(r)}},O=r=>{console.log("대규모 데이터 변환 시작:",r);const n={};if(r&&r.code&&Array.isArray(r.code)){const e=r.code,s=r.opt||[],o=new Map;s.forEach(t=>{t.cmmnCd&&t.enblYn==="Y"&&(o.has(t.cmmnCd)||o.set(t.cmmnCd,[]),o.get(t.cmmnCd).push(t))}),e.forEach(t=>{if(t&&t.cmmnCdGrp&&t.cmmnCd&&t.enblYn==="Y"){const a=t.cmmnCdGrp;n[a]||(n[a]={});const d=(o.get(t.cmmnCd)||[]).reduce((i,l)=>(l.optnCd&&l.optnNm&&(i[l.optnCd]=l.optnNm),i),{});n[a][t.cmmnCd]={codeValue:t.cmmnCd,codeNm:t.cmmnCdNm,groupCode:t.cmmnCdGrp,commonCode:t.cmmnCd,labelColor:t.cmmnCdClr,systemCodeYn:t.syscdYn,sortOrder:parseInt(t.sortOrd)||1,enabled:t.enblYn==="Y",options:Object.keys(d).length>0?d:null,originalData:t}}})}return console.log("대규모 데이터 변환 완료:",n),n},y=b.create()(v((r,n)=>({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set,fetchSystemCodes:async()=>{r({isLoading:!0,error:null});try{console.log("시스템 공통코드 데이터 가져오기 시작: SCMSIGN00301");const e=await I.callService(I.getServiceCode("SRCH_CODE"),{crprCd:"100"});console.log("시스템 공통코드 응답:",e),console.log("시스템 공통코드목록:",e.code),console.log("시스템 공통코드옵션목록:",e.opt);const s=O(e),t={...n().codeData||{},...s};p.clearCache();const a=new Set(Object.keys(t));a.forEach(c=>{p.markGroupLoaded(c)}),r({codeData:t,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:a}),console.log("시스템 공통코드 데이터 가져오기 완료")}catch(e){console.error("시스템 공통코드 데이터 가져오기 실패:",e),r({isLoading:!1,error:e instanceof Error?e.message:"시스템 공통코드 데이터 가져오기 실패"})}},fetchBusinessCodes:async()=>{r({isLoading:!0,error:null});try{console.log("업무 공통코드 데이터 가져오기 시작: SCMSIGN00302");const e=await I.callService("SCMSIGN00302",{sysCd:__SYS_CD__});console.log("업무 공통코드 응답:",e),console.log("업무 공통코드목록:",e.code),console.log("업무 공통코드옵션목록:",e.opt);const s=O(e),t={...n().codeData||{},...s};p.clearCache();const a=new Set(Object.keys(t));a.forEach(c=>{p.markGroupLoaded(c)}),r({codeData:t,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:a}),console.log("업무 공통코드 데이터 가져오기 완료")}catch(e){console.error("업무 공통코드 데이터 가져오기 실패:",e),r({isLoading:!1,error:e instanceof Error?e.message:"업무 공통코드 데이터 가져오기 실패"})}},fetchData:async()=>{r({isLoading:!0,error:null});try{console.log("전체 공통코드 데이터 가져오기 시작 (시스템 + 업무)");const[e,s]=await Promise.all([I.callService(I.getServiceCode("SRCH_CODE"),{crprCd:"100"}),I.callService("SCMSIGN00302",{sysCd:__SYS_CD__})]);console.log("시스템 공통코드 응답:",e),console.log("업무 공통코드 응답:",s);const o=O(e),t=O(s),a={...o,...t};p.clearCache();const c=new Set(Object.keys(a));c.forEach(d=>{p.markGroupLoaded(d)}),r({codeData:a,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:c}),console.log("전체 공통코드 데이터 가져오기 완료")}catch(e){console.error("전체 공통코드 데이터 가져오기 실패:",e),r({isLoading:!1,error:e instanceof Error?e.message:"전체 공통코드 데이터 가져오기 실패"})}},loadSpecificGroup:async e=>{const{codeData:s,loadedGroups:o}=n();if(!s||o.has(e))return;const t=new Set(o).add(e);r({loadedGroups:t}),p.markGroupLoaded(e)},setData:e=>{p.clearCache();const s=new Set(Object.keys(e));s.forEach(o=>{p.markGroupLoaded(o)}),r({codeData:e,lastUpdated:new Date,loadedGroups:s})},clearData:()=>{p.clearCache(),r({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set})},getLoadedGroups:()=>Array.from(n().loadedGroups)}),{name:"large-data-storage",partialize:r=>({codeData:r.codeData,lastUpdated:r.lastUpdated,loadedGroups:Array.from(r.loadedGroups)})})),D=b.create()(v((r,n)=>({get codeData(){return y.getState().codeData},get isLoading(){return y.getState().isLoading},get error(){return y.getState().error},get lastUpdated(){return y.getState().lastUpdated},fetchCommonCodes:async()=>{await y.getState().fetchData()},getCodeList:(e,s)=>{const{enabledOnly:o=!0,systemCodeOnly:t=!1,sortByOrder:a=!1,excludeParentCode:c=!1}=s||{},d=`simpleCodeList_${e}_${o}_${t}_${a}_${c}`;if(p.optionCache.has(d)){const f=p.cacheHits.get(d)||0;return p.cacheHits.set(d,f+1),p.optionCache.get(d)}const i=y.getState().codeData;if(!i)return[];if(!p.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],h=i[e];h&&Object.values(h).forEach(f=>{if(!(o&&!f.enabled)&&!(t&&f.systemCodeYn!=="Y"))if(c){const C=e.length,N=f.codeValue.substring(C);N.length>0&&l.push({...f,codeValue:N})}else l.push(f)});let m;a?m=l.sort((f,C)=>f.sortOrder!==C.sortOrder?f.sortOrder-C.sortOrder:f.codeValue.localeCompare(C.codeValue)):m=l.sort((f,C)=>f.codeValue.localeCompare(C.codeValue));const u=m.map(f=>({label:f.codeNm,value:f.codeValue,tagColor:f.labelColor}));return p.optionCache.size>=E.CACHE_SIZE_LIMIT&&p.cleanupCache(),p.optionCache.set(d,u),p.cacheHits.set(d,1),u},getCodeName:e=>{if(p.nameCache.has(e)){const o=p.cacheHits.get(`name_${e}`)||0;return p.cacheHits.set(`name_${e}`,o+1),p.nameCache.get(e)}const s=y.getState().codeData;if(!s)return null;for(const o of Object.values(s))for(const t of Object.values(o))if(t.codeValue===e)return p.nameCache.set(e,t.codeNm),p.cacheHits.set(`name_${e}`,1),t.codeNm;return null},getCodeColor:e=>{if(p.colorCache.has(e)){const o=p.cacheHits.get(`color_${e}`)||0;return p.cacheHits.set(`color_${e}`,o+1),p.colorCache.get(e)}const s=y.getState().codeData;if(!s)return null;for(const o of Object.values(s))for(const t of Object.values(o))if(t.codeValue===e)return p.colorCache.set(e,t.labelColor||""),p.cacheHits.set(`color_${e}`,1),t.labelColor;return null},getGridLookup:e=>{const s=`gridLookup_${e}`;if(p.optionCache.has(s)){const i=p.cacheHits.get(s)||0;return p.cacheHits.set(s,i+1),p.optionCache.get(s)}const o=y.getState().codeData;if(!o)return{labels:[],values:[],lookupDisplay:!0};const t=o[e];if(!t)return{labels:[],values:[],lookupDisplay:!0};const a=[],c=[];Object.values(t).filter(i=>i.enabled).sort((i,l)=>i.sortOrder-l.sortOrder).forEach(i=>{a.push(i.codeNm),c.push(i.codeValue)});const d={labels:a,values:c,lookupDisplay:!0};return p.optionCache.set(s,d),p.cacheHits.set(s,1),d},getCodeByOption:(e,s,o)=>{const t=`codeByOption_${e}_${s}_${o}`;if(p.codeCache.has(t)){const l=p.cacheHits.get(t)||0;return p.cacheHits.set(t,l+1),p.codeCache.get(t)}const a=y.getState().codeData;if(!a)return[];const c=[],d=a[e];d&&Object.values(d).forEach(l=>{l.enabled&&l.options&&l.options[s]===o&&c.push({...l,codeNm:l.options[s]||l.codeNm})});const i=c.sort((l,h)=>l.codeValue.localeCompare(h.codeValue));return p.codeCache.size>=E.CACHE_SIZE_LIMIT&&p.cleanupCache(),p.codeCache.set(t,i),p.cacheHits.set(t,1),i},getCodeListByOption:(e,s,o)=>{const{enabledOnly:t=!0,systemCodeOnly:a=!1,sortByOrder:c=!1}=o||{},d=`codeListByOption_${e}_${s}_${t}_${a}_${c}`;if(p.codeCache.has(d)){const u=p.cacheHits.get(d)||0;return p.cacheHits.set(d,u+1),p.codeCache.get(d)}const i=y.getState().codeData;if(!i)return[];if(!p.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],h=i[e];h&&Object.values(h).forEach(u=>{t&&!u.enabled||a&&u.systemCodeYn!=="Y"||u.options&&u.options[s]&&l.push({label:u.options[s],value:u.commonCode,tagColor:u.labelColor})});let m;return c?m=l.sort((u,f)=>u.value.localeCompare(f.value)):m=l.sort((u,f)=>u.value.localeCompare(f.value)),p.codeCache.size>=E.CACHE_SIZE_LIMIT&&p.cleanupCache(),p.codeCache.set(d,m),p.cacheHits.set(d,1),m},getAvailableGroupCodes:()=>{const e="available_group_codes";if(p.nameCache.has(e)){const t=p.cacheHits.get(e)||0;return p.cacheHits.set(e,t+1),JSON.parse(p.nameCache.get(e))}const s=y.getState().codeData;if(!s)return[];const o=Object.keys(s).sort();return p.nameCache.set(e,JSON.stringify(o)),p.cacheHits.set(e,1),o},clearCodes:()=>{y.getState().clearData()}}),{name:"code-storage",partialize:r=>({})})),oe=b.create()(v((r,n)=>({get codeData(){return y.getState().codeData},get isLoading(){return y.getState().isLoading},get error(){return y.getState().error},get lastUpdated(){return y.getState().lastUpdated},fetchCommonCodes:async()=>{await y.getState().fetchData()},getOptionValue:(e,s)=>{const o=`option_${e}_${s}`;if(p.optionCache.has(o)){const c=p.cacheHits.get(o)||0;return p.cacheHits.set(o,c+1),p.optionCache.get(o)}const t=y.getState().codeData;if(!t)return null;const a=t[e];if(a&&a[s]){const c=a[s].options;return p.optionCache.set(o,c),p.cacheHits.set(o,1),c}return null},getOptionByKey:(e,s,o)=>{const t=`option_${e}_${s}_${o}`;if(p.optionCache.has(t)){const d=p.cacheHits.get(t)||0;return p.cacheHits.set(t,d+1),p.optionCache.get(t)}const a=n().getOptionValue(e,s),c=a?a[o]:null;return p.optionCache.set(t,c),p.cacheHits.set(t,1),c},clearCodes:()=>{y.getState().clearData()}}),{name:"option-storage",partialize:r=>({})})),se=b.create()(v((r,n)=>({get codeData(){return y.getState().codeData},get isLoading(){return y.getState().isLoading},get error(){return y.getState().error},get lastUpdated(){return y.getState().lastUpdated},fetchCommonCodes:async()=>{await y.getState().fetchData()},getColorCode:e=>{if(p.colorCache.has(e)){const o=p.cacheHits.get(`color_${e}`)||0;return p.cacheHits.set(`color_${e}`,o+1),p.colorCache.get(e)}const s=y.getState().codeData;if(!s)return null;for(const o of Object.values(s))for(const t of Object.values(o))if(t.codeValue===e)return p.colorCache.set(e,t.labelColor||""),p.cacheHits.set(`color_${e}`,1),t.labelColor;return null},getColorMapping:()=>{const e="color_mapping";if(p.optionCache.has(e)){const t=p.cacheHits.get(e)||0;return p.cacheHits.set(e,t+1),p.optionCache.get(e)}const s=y.getState().codeData;if(!s)return[];const o=[];return Object.values(s).forEach(t=>{Object.values(t).forEach(a=>{a.labelColor&&o.push({code:a.codeValue,color:a.labelColor})})}),p.optionCache.set(e,o),p.cacheHits.set(e,1),o},clearCodes:()=>{y.getState().clearData()}}),{name:"color-storage",partialize:r=>({})})),re=(r,n)=>({nodes:{},rootIds:[],loadedFor:void 0,loading:!1,error:void 0,treeNodes:[],isMenuBookmarked:e=>Object.values(n().nodes).some(s=>s.type==="M"&&s.menuId===e),getPrntBkmkIdByMenuId:e=>{const s=F(n().nodes,e);return s?n().nodes[s]?.prntBkmkId??"-":"-"},getNodeByMenuId:e=>{const s=F(n().nodes,e);if(!s)return null;const o=n().nodes[s];return o?.type==="M"?o:null},getFolderTree:e=>{const{nodes:s,rootIds:o}=n(),t=c=>e?c.toLowerCase().includes(e.toLowerCase()):!0,a=c=>{const d=s[c];if(!d||d.type!=="F")return null;const i=d,l=(i.children||[]).map(m=>s[m]).filter(m=>!!m&&m.type==="F").map(m=>a(m.bkmkId)).filter(Boolean);return t(i.bkmkNm)||l.length>0?{key:i.bkmkId,title:`📁 ${i.bkmkNm}`,children:l.length?l:void 0}:null};return o.map(c=>a(c)).filter(Boolean)},loadFavorites:async(e,s=!1)=>{console.log("loadFavorites ::::: ",e,s);const o=n();if(!(!s&&o.loadedFor===e&&Object.keys(o.nodes).length)){r({loading:!0,error:void 0});try{const t=await I.callService("SCMBKMK00101",{userId:e}),a=Array.isArray(t?.sub)?t.sub:[],c=ne(a),d=w(c.nodes,c.rootIds);r({...c,treeNodes:d,loadedFor:e,loading:!1})}catch(t){throw r({loading:!1,error:t?.message||"즐겨찾기 로드 실패"}),t}}},loadFavoritesIfNeeded:async e=>{const s=n();(s.loadedFor!==e||Object.keys(s.nodes).length===0)&&await n().loadFavorites(e)},clearFavorites:()=>{r({nodes:{},rootIds:[],treeNodes:[],loadedFor:void 0,loading:!1,error:void 0}),console.log("📚 북마크 스토어 초기화 완료")},addNode:async e=>{const s=K(n()),o=ae();r(t=>{const a=e.sortOrdr??x(t,e.prntBkmkId),c={...t,nodes:{...t.nodes,[o]:e.type==="F"?{bkmkId:o,type:"F",prntBkmkId:e.prntBkmkId||"-",sortOrdr:a,bkmkNm:e.bkmkNm??"새 폴더",children:[],sysCd:e.sysCd,userId:e.userId}:{bkmkId:o,type:"M",prntBkmkId:e.prntBkmkId,sortOrdr:a,menuId:e.menuId??"",menuNm:e.menuNm,sysCd:e.sysCd,userId:e.userId}},rootIds:t.rootIds.slice(),treeNodes:t.treeNodes};return ce(c,o,e.prntBkmkId),c.treeNodes=w(c.nodes,c.rootIds),c});try{let t=o;const a=x(n(),e.prntBkmkId),c=await I.callService("SCMBKMK00102",{iudFlag:"I",type:e.type,sysCd:e.sysCd,userId:e.userId,bkmkId:o,bkmkNm:e.bkmkNm,prntBkmkId:e.prntBkmkId,menuId:e.menuId,sortOrdr:a,chngId:I.getUserId()});return t=String(c?.bkmkId??c?.itemId??o),r(d=>{const i=le(d,o,t);return{...i,treeNodes:w(i.nodes,i.rootIds)}}),t}catch(t){throw r(s),t}},moveNode:async({bkmkId:e,newPrntBkmkId:s,sortOrdr:o,userId:t})=>{const a=n(),c=structuredClone(a.nodes),d=[...a.rootIds],i=c[e];if(!i)return;if(s!=="-"){const u=c[s];if(!u||u.type!=="F")throw new Error("부모는 폴더만 가능합니다.")}const l=i.prntBkmkId??"-",h=l==="-"?d:c[l].children||=[];{const u=h.indexOf(e);u>=0&&h.splice(u,1)}const m=s==="-"?d:c[s].children||=[];m.splice(Math.max(0,Math.min(o,m.length)),0,e),i.prntBkmkId=s,r({nodes:c,rootIds:d}),j(c,d,s),j(c,d,l);try{await I.callService("SCMBKMK00104",{bkmkId:e,prntBkmkId:s,sortOrdr:o,chngId:t})}catch(u){throw r(a),u}},removeNode:async e=>{const s=K(n());r(o=>{if(!o.nodes[e])return o;const t={...o,nodes:{...o.nodes},rootIds:o.rootIds.slice(),treeNodes:o.treeNodes};return X(t,e),t.treeNodes=w(t.nodes,t.rootIds),t});try{await I.callService("SCMBKMK00103",{bkmkId:e})}catch(o){throw r(s),o}},editNode:async({bkmkId:e,userId:s,bkmkNm:o,prntBkmkId:t,sortOrdr:a})=>{const c=K(n());r(d=>{const i={...d,nodes:{...d.nodes}},l=i.nodes[e];return l?.type==="F"&&typeof o=="string"&&(i.nodes[e]={...l,bkmkNm:o}),i});try{await I.callService("SCMBKMK00102",{iudFlag:"U",userId:s,bkmkId:e,bkmkNm:o,prntBkmkId:t,sortOrdr:a,chngId:I.getUserId()})}catch(d){throw r(c),d}},addFolder:async(e,s,o,t)=>await n().addNode({type:"F",bkmkNm:e,prntBkmkId:s,sysCd:o,userId:t}),addMenuToFolder:async(e,s)=>F(n().nodes,s.menuId)?"이미 북마크에 저장된 메뉴입니다.":await n().addNode({type:"M",prntBkmkId:e,sysCd:"KH",userId:I.getUserId(),menuId:s.menuId,menuNm:s.menuNm}),toggleMenuFavorite:async(e,s)=>{if(!e)return;const o=n(),t=Object.values(o.nodes).find(c=>c.type==="M"&&c.menuId===s.menuId);if(t){await n().removeNode(t.bkmkId);return}let a=z(o);a||(await n().loadFavorites(e,!0),a=z(n())),a&&await n().addNode({type:"M",prntBkmkId:a,sysCd:"KH",userId:I.getUserId(),menuId:s.menuId,menuNm:s.menuNm})},removeMenuByMenuId:async e=>{const s=n(),o=F(s.nodes,e);o&&await n().removeNode(o)},removeMenu:async e=>{await n().removeNode(e)},removeFolder:async e=>{await n().removeNode(e)},editFolder:async(e,s,o,t,a)=>{await n().editNode({bkmkId:e,userId:s,bkmkNm:o,prntBkmkId:t,sortOrdr:a})},convertToAntTreeData:(e,s,o,t=!1)=>{const a=d=>o?d.toLowerCase().includes(o.toLowerCase()):!0,c=d=>{const i=e[d];if(!i||t&&i.type!=="F")return null;if(i.type==="F"){const l=i,h=(l.children||[]).map(u=>c(u)).filter(Boolean);return a(l.bkmkNm)||h.length>0?{key:l.bkmkId,type:"F",title:`📁 ${l.bkmkNm}`,bkmkNm:l.bkmkNm,prntBkmkId:l.prntBkmkId,sortOrdr:l.sortOrdr,fullPath:l.fullPath,children:h.length?h:void 0}:null}else{const l=i,h=l.menuNm?`${l.menuNm} (${l.menuId})`:l.menuId;return a(h)?{key:l.bkmkId,type:"M",title:`📄 ${h}`,prntBkmkId:l.prntBkmkId,sortOrdr:l.sortOrdr,fullPath:l.fullPath,isLeaf:!0}:null}};return s.map(c).filter(Boolean)}}),R=b.create(re);function ne(r){const n={},e=[],s=o=>{o.forEach(t=>{const a={type:t.type,bkmkId:t.bkmkId??t.BKMK_ID??t.id,prntBkmkId:t.prntBkmkId??t.PRNT_BKMK_ID??"-",sortOrdr:Number(t.sortOrdr??t.SORT_ORDR??0),sysCd:t.sysCd??t.SYS_CD,userId:t.userId??t.USER_ID,fullPath:t.fullPath??t.FULL_PATH};if(t.type==="F"){n[a.bkmkId]={...a,bkmkNm:t.bkmkNm??t.BKMK_NM??t.name??a.bkmkId,children:[]};const c=Array.isArray(t.children)?t.children:[];s(c)}else n[a.bkmkId]={...a,menuId:t.menuId??t.MENU_ID??"",menuNm:t.menuNm??t.MENU_NM}})};return s(r),Object.values(n).forEach(o=>{if(o.prntBkmkId&&o.prntBkmkId!=="-"){const t=n[o.prntBkmkId];t?.type==="F"&&t.children.push(o.bkmkId)}else o.type==="F"&&e.push(o.bkmkId)}),e.sort((o,t)=>(n[o].sortOrdr??0)-(n[t].sortOrdr??0)),Object.values(n).forEach(o=>{o.type==="F"&&o.children.sort((a,c)=>(n[a].sortOrdr??0)-(n[c].sortOrdr??0))}),{nodes:n,rootIds:e}}function K(r){return{...r,nodes:JSON.parse(JSON.stringify(r.nodes)),rootIds:r.rootIds.slice()}}function ae(){return`tmp_${I.generateUID()}`}function x(r,n){if(!n||n==="-")return r.rootIds.length;const e=r.nodes[n];return e?e.children.length:0}function ce(r,n,e){const s=r.nodes[n];if(s)if(e&&e!=="-"){const o=r.nodes[e];if(!o||o.type!=="F")return;s.prntBkmkId=e,o.children=[...o.children,n]}else s.prntBkmkId="-",r.rootIds=[...r.rootIds,n]}function de(r,n){const e=r.nodes[n];if(!e)return;const s=e.prntBkmkId;if(s&&s!=="-"){const o=r.nodes[s];o?.type==="F"&&(o.children=o.children.filter(t=>t!==n))}else r.rootIds=r.rootIds.filter(o=>o!==n)}function X(r,n){const e=r.nodes[n];if(!e)return;e.type==="F"&&e.children.slice().forEach(a=>X(r,a)),de(r,n);const{[n]:s,...o}=r.nodes;r.nodes=o}function le(r,n,e){if(n===e)return r;const s=r.nodes[n];if(!s)return r;const o=JSON.parse(JSON.stringify(s));o.bkmkId=e;const t={...r.nodes,[e]:o};delete t[n];let a=r.rootIds;if(o.prntBkmkId&&o.prntBkmkId!=="-"){const c=t[o.prntBkmkId];c?.type==="F"&&(t[o.prntBkmkId]={...c,children:c.children.map(d=>d===n?e:d)})}else a=r.rootIds.map(c=>c===n?e:c);return{...r,nodes:t,rootIds:a}}function z(r){return r.rootIds.find(n=>r.nodes[n]?.type==="F")??null}function w(r,n){const e={};Object.values(r).forEach(d=>{const i=d.bkmkId,l=d.prntBkmkId;!i||!l||l==="-"||l===i||(e[l]??=[]).push(i)});const s=new Set,o=d=>{if(s.has(d))return null;const i=r[d];if(!i)return null;s.add(d);try{if(i.type==="F"){const h=i,m=e[d]??[];return{type:"F",bkmkId:d,bkmkNm:h.bkmkNm,prntBkmkId:h.prntBkmkId,children:m.map(o).filter(Boolean)}}const l=i;return{type:"M",bkmkId:d,bkmkNm:l.menuNm,menuId:l.menuId,menuNm:l.menuNm,prntBkmkId:l.prntBkmkId}}finally{s.delete(d)}},t=Object.values(r).filter(d=>d.prntBkmkId==="-"&&d.type==="M").map(d=>d.bkmkId),a=Object.values(r).filter(d=>d.prntBkmkId==="-"&&d.type==="F").map(d=>d.bkmkId);return Array.from(new Set([...n,...t,...a])).map(o).filter(Boolean)}function F(r,n){for(const e of Object.values(r))if(e.type==="M"&&e.menuId===n)return e.bkmkId;return null}function j(r,n,e){(!e||e==="-"?n:r[e].children||[]).forEach((o,t)=>{const a=r[o];a&&(a.sortOrdr=t)})}const H={DEFAULT_PRNT_GBCD:1},pe=r=>r&&typeof r=="object"&&typeof r.menuId=="string"&&typeof r.menuNm=="string",Y=r=>Array.isArray(r)&&r.every(pe);let B=[],q=[];const ie=r=>{if(r&&typeof r=="object"){const n=r;if(n.menus&&Y(n.menus))return n.menus;if(Y(r))return r}return console.warn("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."),[]},ue=(r,n)=>!!n&&r.crprCd===n.crprCd&&r.userId===n.userId&&(r.prntGbcd??H.DEFAULT_PRNT_GBCD)===(n.prntGbcd??H.DEFAULT_PRNT_GBCD),me=r=>{if(B.length===r.length&&B.every((t,a)=>t.menuId===r[a]?.menuId&&t.menuPrntId===r[a]?.menuPrntId))return q;if(!r.length)return[];const n=new Map,e=[];r.forEach(t=>t?.menuId&&n.set(t.menuId,{...t,children:[]})),r.forEach(t=>{const a=n.get(t.menuId);a&&(t.menuPrntId&&t.menuPrntId!==""&&t.menuPrntId!=="-"?n.get(t.menuPrntId)?.children?.push(a):e.push(a))});const s=t=>t.sort((a,c)=>(a?.menuNo??0)-(c?.menuNo??0)).map(a=>({...a,children:a.children&&a.children.length?s(a.children):void 0})),o=s(e);return B=[...r],q=o,o},_=b.create((r,n)=>({menuList:[],flatMenuList:[],isLoading:!1,error:null,_lastFetchParams:null,fetchMenu:async({crprCd:e,userId:s,prntGbcd:o})=>{const t={crprCd:e,userId:s,prntGbcd:o??H.DEFAULT_PRNT_GBCD};if(ue(t,n()._lastFetchParams)){console.log("✅ 중복 fetch 차단",t);return}r({isLoading:!0,error:null,_lastFetchParams:t});try{const a=await I.callService(I.getServiceCode("AUTH_MENU"),t),c=ie(a),d=me(c);r({flatMenuList:c,menuList:d,isLoading:!1,error:null})}catch(a){r({isLoading:!1,error:a?.message??"메뉴 로드 실패"})}},clearMenu:()=>{r({menuList:[],flatMenuList:[],error:null,_lastFetchParams:null})},findMenuById:e=>{const{flatMenuList:s}=n();return s.find(o=>o.menuId===e)??null}})),T={MAX_TABS:15},U=b.create((r,n)=>({activeMenuId:null,activeMenuItem:null,activeDetailItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:T.MAX_TABS,tabProtectFlag:{},tabParams:{},componentLabelMap:{},pinnedTabs:new Set,refreshTabKey:{},clearMenuViewStore:()=>{r({activeMenuId:null,activeMenuItem:null,activeDetailItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:T.MAX_TABS,tabProtectFlag:{},tabParams:{},componentLabelMap:{},pinnedTabs:new Set,refreshTabKey:{}})},openTabFromMenu:(e,s,o)=>{const{tabs:t}=n(),a=t.find(i=>i.key===e.menuId),c=o?.skipRefreshModal??!1;if(a){if(c){n().focusTab(e.menuId),n().setTabParams(e.menuId,s||{}),e?.prsnInfoYn==="Y"&&n().setProtectFlagForKey(e.menuId);return}L.Modal.confirm({title:`[${e.menuNm}] 메뉴이동 알림`,content:"이미 열린 화면입니다. 새로고침 하시겠습니까?",centered:!0,okText:"예",cancelText:"아니오",onOk:()=>{n().refreshTab(e.menuId),n().focusTab(e.menuId),n().setTabParams(e.menuId,s||{}),e?.prsnInfoYn==="Y"&&n().setProtectFlagForKey(e.menuId)},onCancel:()=>{n().focusTab(e.menuId),n().setTabParams(e.menuId,s||{}),e?.prsnInfoYn==="Y"&&n().setProtectFlagForKey(e.menuId)}});return}if(t.length>=T.MAX_TABS){console.warn("❌ 최대 탭 개수를 초과했습니다."),L.message.warning(`최대 ${T.MAX_TABS}개의 탭만 열 수 있습니다.
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("zustand"),I=require("../utils/index.cjs"),L=require("antd"),V=require("../chunks/layout-components-Bf9IsLUS.cjs"),k=require("react"),Q=require("axios");function ee(r,n){let e;try{e=r()}catch{return}return{getItem:o=>{var t;const a=d=>d===null?null:JSON.parse(d,void 0),c=(t=e.getItem(o))!=null?t:null;return c instanceof Promise?c.then(a):a(c)},setItem:(o,t)=>e.setItem(o,JSON.stringify(t,void 0)),removeItem:o=>e.removeItem(o)}}const G=r=>n=>{try{const e=r(n);return e instanceof Promise?e:{then(s){return G(s)(e)},catch(s){return this}}}catch(e){return{then(s){return this},catch(s){return G(s)(e)}}}},te=(r,n)=>(e,s,o)=>{let t={storage:ee(()=>localStorage),partialize:C=>C,version:0,merge:(C,N)=>({...N,...C}),...n},a=!1;const c=new Set,d=new Set;let i=t.storage;if(!i)return r((...C)=>{console.warn(`[zustand persist middleware] Unable to update item '${t.name}', the given storage is currently unavailable.`),e(...C)},s,o);const l=()=>{const C=t.partialize({...s()});return i.setItem(t.name,{state:C,version:t.version})},h=o.setState;o.setState=(C,N)=>(h(C,N),l());const m=r((...C)=>(e(...C),l()),s,o);o.getInitialState=()=>m;let u;const f=()=>{var C,N;if(!i)return;a=!1,c.forEach(g=>{var M;return g((M=s())!=null?M:m)});const S=((N=t.onRehydrateStorage)==null?void 0:N.call(t,(C=s())!=null?C:m))||void 0;return G(i.getItem.bind(i))(t.name).then(g=>{if(g)if(typeof g.version=="number"&&g.version!==t.version){if(t.migrate){const M=t.migrate(g.state,g.version);return M instanceof Promise?M.then(A=>[!0,A]):[!0,M]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,g.state];return[!1,void 0]}).then(g=>{var M;const[A,Z]=g;if(u=t.merge(Z,(M=s())!=null?M:m),e(u,!0),A)return l()}).then(()=>{S?.(u,void 0),u=s(),a=!0,d.forEach(g=>g(u))}).catch(g=>{S?.(void 0,g)})};return o.persist={setOptions:C=>{t={...t,...C},C.storage&&(i=C.storage)},clearStorage:()=>{i?.removeItem(t.name)},getOptions:()=>t,rehydrate:()=>f(),hasHydrated:()=>a,onHydrate:C=>(c.add(C),()=>{c.delete(C)}),onFinishHydration:C=>(d.add(C),()=>{d.delete(C)})},t.skipHydration||f(),u||m},v=te,P=b.create()(v((r,n)=>({user:null,hrInfo:null,buttonAuths:{},componentSize:1,gridSize:2,spacingSize:2,enableProtectWrapper:!0,gridLayouts:{},theme:"modern",isLoggedIn:()=>!!n().user,setLoginUser:(e,s)=>{r({user:e,hrInfo:s??null}),console.log("사용자 로그인:",e,s)},clearLoginUser:()=>{r({user:null,hrInfo:null,buttonAuths:{}}),console.log("사용자 로그아웃")},updateUser:(e,s)=>{const o=n().user,t=n().hrInfo;o&&r({user:{...o,...e}}),t&&r({hrInfo:{...t,...s}})},setComponentSize:e=>{r({componentSize:e}),console.log("컴포넌트 사이즈 변경:",e)},setGridSize:e=>{r({gridSize:e}),console.log("그리드 사이즈 변경:",e)},setSpacingSize:e=>{r({spacingSize:e}),console.log("여백 사이즈 변경:",e)},setEnableProtectWrapper:e=>{r({enableProtectWrapper:e})},setTheme:e=>{r({theme:e}),console.log("테마 변경:",e)},getButtonAuth:(e,s)=>{const o=`${e}_${s}`;return n().buttonAuths[o]||null},setButtonAuth:(e,s,o)=>{const t=`${e}_${s}`;r(a=>({buttonAuths:{...a.buttonAuths,[t]:o}}))},clearButtonAuths:()=>{r({buttonAuths:{}})},getGridLayouts:e=>n().gridLayouts[e]||[],getGridLayout:(e,s,o)=>n().getGridLayouts(e).find(c=>c.menuId===s&&c.gridId===o)||null,saveGridLayout:(e,s,o,t)=>{const a={...n().gridLayouts};a[e]||(a[e]=[]);const c=a[e].findIndex(i=>i.menuId===s&&i.gridId===o),d={menuId:s,gridId:o,layout:t};c>=0?a[e][c]=d:a[e].push(d),r({gridLayouts:a}),console.log(`[UserStore] 그리드 레이아웃 저장 완료: ${e}/${s}/${o}`)},removeGridLayout:(e,s,o)=>{const t={...n().gridLayouts};t[e]&&(t[e]=t[e].filter(a=>!(a.menuId===s&&a.gridId===o)),r({gridLayouts:t}),console.log(`[UserStore] 그리드 레이아웃 삭제 완료: ${e}/${s}/${o}`))},clearGridLayouts:e=>{const s={...n().gridLayouts};delete s[e],r({gridLayouts:s}),console.log(`[UserStore] ${e}의 모든 그리드 레이아웃 삭제 완료`)},clearAllGridLayouts:()=>{r({gridLayouts:{}}),console.log("[UserStore] 전체 그리드 레이아웃 삭제 완료")}}),{name:"user-storage",partialize:r=>({user:r.user,hrInfo:r.hrInfo,componentSize:r.componentSize,gridSize:r.gridSize,spacingSize:r.spacingSize,enableProtectWrapper:r.enableProtectWrapper,gridLayouts:r.gridLayouts,theme:r.theme})})),E={CACHE_SIZE_LIMIT:1e3},p={codeCache:new Map,nameCache:new Map,optionCache:new Map,colorCache:new Map,loadedGroups:new Set,cacheHits:new Map,clearCache(){this.codeCache.clear(),this.nameCache.clear(),this.optionCache.clear(),this.colorCache.clear(),this.loadedGroups.clear(),this.cacheHits.clear()},cleanupCache(){const r=Array.from(this.cacheHits.entries());r.sort((e,s)=>e[1]-s[1]),r.slice(0,Math.floor(r.length*.3)).forEach(([e])=>{this.codeCache.delete(e),this.nameCache.delete(e),this.optionCache.delete(e),this.colorCache.delete(e),this.cacheHits.delete(e)})},isGroupLoaded(r){return this.loadedGroups.has(r)},markGroupLoaded(r){this.loadedGroups.add(r)}},O=r=>{console.log("대규모 데이터 변환 시작:",r);const n={};if(r&&r.code&&Array.isArray(r.code)){const e=r.code,s=r.opt||[],o=new Map;s.forEach(t=>{t.cmmnCd&&t.enblYn==="Y"&&(o.has(t.cmmnCd)||o.set(t.cmmnCd,[]),o.get(t.cmmnCd).push(t))}),e.forEach(t=>{if(t&&t.cmmnCdGrp&&t.cmmnCd&&t.enblYn==="Y"){const a=t.cmmnCdGrp;n[a]||(n[a]={});const d=(o.get(t.cmmnCd)||[]).reduce((i,l)=>(l.optnCd&&l.optnNm&&(i[l.optnCd]=l.optnNm),i),{});n[a][t.cmmnCd]={codeValue:t.cmmnCd,codeNm:t.cmmnCdNm,groupCode:t.cmmnCdGrp,commonCode:t.cmmnCd,labelColor:t.cmmnCdClr,systemCodeYn:t.syscdYn,sortOrder:parseInt(t.sortOrd)||1,enabled:t.enblYn==="Y",options:Object.keys(d).length>0?d:null,originalData:t}}})}return console.log("대규모 데이터 변환 완료:",n),n},y=b.create()(v((r,n)=>({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set,fetchSystemCodes:async()=>{r({isLoading:!0,error:null});try{console.log("시스템 공통코드 데이터 가져오기 시작: SCMSIGN00301");const e=await I.callService(I.getServiceCode("SRCH_CODE"),{crprCd:"100"});console.log("시스템 공통코드 응답:",e),console.log("시스템 공통코드목록:",e.code),console.log("시스템 공통코드옵션목록:",e.opt);const s=O(e),t={...n().codeData||{},...s};p.clearCache();const a=new Set(Object.keys(t));a.forEach(c=>{p.markGroupLoaded(c)}),r({codeData:t,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:a}),console.log("시스템 공통코드 데이터 가져오기 완료")}catch(e){console.error("시스템 공통코드 데이터 가져오기 실패:",e),r({isLoading:!1,error:e instanceof Error?e.message:"시스템 공통코드 데이터 가져오기 실패"})}},fetchBusinessCodes:async()=>{r({isLoading:!0,error:null});try{console.log("업무 공통코드 데이터 가져오기 시작: SCMSIGN00302");const e=await I.callService("SCMSIGN00302",{sysCd:__SYS_CD__});console.log("업무 공통코드 응답:",e),console.log("업무 공통코드목록:",e.code),console.log("업무 공통코드옵션목록:",e.opt);const s=O(e),t={...n().codeData||{},...s};p.clearCache();const a=new Set(Object.keys(t));a.forEach(c=>{p.markGroupLoaded(c)}),r({codeData:t,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:a}),console.log("업무 공통코드 데이터 가져오기 완료")}catch(e){console.error("업무 공통코드 데이터 가져오기 실패:",e),r({isLoading:!1,error:e instanceof Error?e.message:"업무 공통코드 데이터 가져오기 실패"})}},fetchData:async()=>{r({isLoading:!0,error:null});try{console.log("전체 공통코드 데이터 가져오기 시작 (시스템 + 업무)");const[e,s]=await Promise.all([I.callService(I.getServiceCode("SRCH_CODE"),{crprCd:"100"}),I.callService("SCMSIGN00302",{sysCd:__SYS_CD__})]);console.log("시스템 공통코드 응답:",e),console.log("업무 공통코드 응답:",s);const o=O(e),t=O(s),a={...o,...t};p.clearCache();const c=new Set(Object.keys(a));c.forEach(d=>{p.markGroupLoaded(d)}),r({codeData:a,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:c}),console.log("전체 공통코드 데이터 가져오기 완료")}catch(e){console.error("전체 공통코드 데이터 가져오기 실패:",e),r({isLoading:!1,error:e instanceof Error?e.message:"전체 공통코드 데이터 가져오기 실패"})}},loadSpecificGroup:async e=>{const{codeData:s,loadedGroups:o}=n();if(!s||o.has(e))return;const t=new Set(o).add(e);r({loadedGroups:t}),p.markGroupLoaded(e)},setData:e=>{p.clearCache();const s=new Set(Object.keys(e));s.forEach(o=>{p.markGroupLoaded(o)}),r({codeData:e,lastUpdated:new Date,loadedGroups:s})},clearData:()=>{p.clearCache(),r({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set})},getLoadedGroups:()=>Array.from(n().loadedGroups)}),{name:"large-data-storage",partialize:r=>({codeData:r.codeData,lastUpdated:r.lastUpdated,loadedGroups:Array.from(r.loadedGroups)})})),D=b.create()(v((r,n)=>({get codeData(){return y.getState().codeData},get isLoading(){return y.getState().isLoading},get error(){return y.getState().error},get lastUpdated(){return y.getState().lastUpdated},fetchCommonCodes:async()=>{await y.getState().fetchData()},getCodeList:(e,s)=>{const{enabledOnly:o=!0,systemCodeOnly:t=!1,sortByOrder:a=!1,excludeParentCode:c=!1}=s||{},d=`simpleCodeList_${e}_${o}_${t}_${a}_${c}`;if(p.optionCache.has(d)){const f=p.cacheHits.get(d)||0;return p.cacheHits.set(d,f+1),p.optionCache.get(d)}const i=y.getState().codeData;if(!i)return[];if(!p.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],h=i[e];h&&Object.values(h).forEach(f=>{if(!(o&&!f.enabled)&&!(t&&f.systemCodeYn!=="Y"))if(c){const C=e.length,N=f.codeValue.substring(C);N.length>0&&l.push({...f,codeValue:N})}else l.push(f)});let m;a?m=l.sort((f,C)=>f.sortOrder!==C.sortOrder?f.sortOrder-C.sortOrder:f.codeValue.localeCompare(C.codeValue)):m=l.sort((f,C)=>f.codeValue.localeCompare(C.codeValue));const u=m.map(f=>({label:f.codeNm,value:f.codeValue,tagColor:f.labelColor}));return p.optionCache.size>=E.CACHE_SIZE_LIMIT&&p.cleanupCache(),p.optionCache.set(d,u),p.cacheHits.set(d,1),u},getCodeName:e=>{if(p.nameCache.has(e)){const o=p.cacheHits.get(`name_${e}`)||0;return p.cacheHits.set(`name_${e}`,o+1),p.nameCache.get(e)}const s=y.getState().codeData;if(!s)return null;for(const o of Object.values(s))for(const t of Object.values(o))if(t.codeValue===e)return p.nameCache.set(e,t.codeNm),p.cacheHits.set(`name_${e}`,1),t.codeNm;return null},getCodeColor:e=>{if(p.colorCache.has(e)){const o=p.cacheHits.get(`color_${e}`)||0;return p.cacheHits.set(`color_${e}`,o+1),p.colorCache.get(e)}const s=y.getState().codeData;if(!s)return null;for(const o of Object.values(s))for(const t of Object.values(o))if(t.codeValue===e)return p.colorCache.set(e,t.labelColor||""),p.cacheHits.set(`color_${e}`,1),t.labelColor;return null},getGridLookup:e=>{const s=`gridLookup_${e}`;if(p.optionCache.has(s)){const i=p.cacheHits.get(s)||0;return p.cacheHits.set(s,i+1),p.optionCache.get(s)}const o=y.getState().codeData;if(!o)return{labels:[],values:[],lookupDisplay:!0};const t=o[e];if(!t)return{labels:[],values:[],lookupDisplay:!0};const a=[],c=[];Object.values(t).filter(i=>i.enabled).sort((i,l)=>i.sortOrder-l.sortOrder).forEach(i=>{a.push(i.codeNm),c.push(i.codeValue)});const d={labels:a,values:c,lookupDisplay:!0};return p.optionCache.set(s,d),p.cacheHits.set(s,1),d},getCodeByOption:(e,s,o)=>{const t=`codeByOption_${e}_${s}_${o}`;if(p.codeCache.has(t)){const l=p.cacheHits.get(t)||0;return p.cacheHits.set(t,l+1),p.codeCache.get(t)}const a=y.getState().codeData;if(!a)return[];const c=[],d=a[e];d&&Object.values(d).forEach(l=>{l.enabled&&l.options&&l.options[s]===o&&c.push({...l,codeNm:l.options[s]||l.codeNm})});const i=c.sort((l,h)=>l.codeValue.localeCompare(h.codeValue));return p.codeCache.size>=E.CACHE_SIZE_LIMIT&&p.cleanupCache(),p.codeCache.set(t,i),p.cacheHits.set(t,1),i},getCodeListByOption:(e,s,o)=>{const{enabledOnly:t=!0,systemCodeOnly:a=!1,sortByOrder:c=!1}=o||{},d=`codeListByOption_${e}_${s}_${t}_${a}_${c}`;if(p.codeCache.has(d)){const u=p.cacheHits.get(d)||0;return p.cacheHits.set(d,u+1),p.codeCache.get(d)}const i=y.getState().codeData;if(!i)return[];if(!p.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],h=i[e];h&&Object.values(h).forEach(u=>{t&&!u.enabled||a&&u.systemCodeYn!=="Y"||u.options&&u.options[s]&&l.push({label:u.options[s],value:u.commonCode,tagColor:u.labelColor})});let m;return c?m=l.sort((u,f)=>u.value.localeCompare(f.value)):m=l.sort((u,f)=>u.value.localeCompare(f.value)),p.codeCache.size>=E.CACHE_SIZE_LIMIT&&p.cleanupCache(),p.codeCache.set(d,m),p.cacheHits.set(d,1),m},getAvailableGroupCodes:()=>{const e="available_group_codes";if(p.nameCache.has(e)){const t=p.cacheHits.get(e)||0;return p.cacheHits.set(e,t+1),JSON.parse(p.nameCache.get(e))}const s=y.getState().codeData;if(!s)return[];const o=Object.keys(s).sort();return p.nameCache.set(e,JSON.stringify(o)),p.cacheHits.set(e,1),o},clearCodes:()=>{y.getState().clearData()}}),{name:"code-storage",partialize:r=>({})})),oe=b.create()(v((r,n)=>({get codeData(){return y.getState().codeData},get isLoading(){return y.getState().isLoading},get error(){return y.getState().error},get lastUpdated(){return y.getState().lastUpdated},fetchCommonCodes:async()=>{await y.getState().fetchData()},getOptionValue:(e,s)=>{const o=`option_${e}_${s}`;if(p.optionCache.has(o)){const c=p.cacheHits.get(o)||0;return p.cacheHits.set(o,c+1),p.optionCache.get(o)}const t=y.getState().codeData;if(!t)return null;const a=t[e];if(a&&a[s]){const c=a[s].options;return p.optionCache.set(o,c),p.cacheHits.set(o,1),c}return null},getOptionByKey:(e,s,o)=>{const t=`option_${e}_${s}_${o}`;if(p.optionCache.has(t)){const d=p.cacheHits.get(t)||0;return p.cacheHits.set(t,d+1),p.optionCache.get(t)}const a=n().getOptionValue(e,s),c=a?a[o]:null;return p.optionCache.set(t,c),p.cacheHits.set(t,1),c},clearCodes:()=>{y.getState().clearData()}}),{name:"option-storage",partialize:r=>({})})),se=b.create()(v((r,n)=>({get codeData(){return y.getState().codeData},get isLoading(){return y.getState().isLoading},get error(){return y.getState().error},get lastUpdated(){return y.getState().lastUpdated},fetchCommonCodes:async()=>{await y.getState().fetchData()},getColorCode:e=>{if(p.colorCache.has(e)){const o=p.cacheHits.get(`color_${e}`)||0;return p.cacheHits.set(`color_${e}`,o+1),p.colorCache.get(e)}const s=y.getState().codeData;if(!s)return null;for(const o of Object.values(s))for(const t of Object.values(o))if(t.codeValue===e)return p.colorCache.set(e,t.labelColor||""),p.cacheHits.set(`color_${e}`,1),t.labelColor;return null},getColorMapping:()=>{const e="color_mapping";if(p.optionCache.has(e)){const t=p.cacheHits.get(e)||0;return p.cacheHits.set(e,t+1),p.optionCache.get(e)}const s=y.getState().codeData;if(!s)return[];const o=[];return Object.values(s).forEach(t=>{Object.values(t).forEach(a=>{a.labelColor&&o.push({code:a.codeValue,color:a.labelColor})})}),p.optionCache.set(e,o),p.cacheHits.set(e,1),o},clearCodes:()=>{y.getState().clearData()}}),{name:"color-storage",partialize:r=>({})})),re=(r,n)=>({nodes:{},rootIds:[],loadedFor:void 0,loading:!1,error:void 0,treeNodes:[],isMenuBookmarked:e=>Object.values(n().nodes).some(s=>s.type==="M"&&s.menuId===e),getPrntBkmkIdByMenuId:e=>{const s=F(n().nodes,e);return s?n().nodes[s]?.prntBkmkId??"-":"-"},getNodeByMenuId:e=>{const s=F(n().nodes,e);if(!s)return null;const o=n().nodes[s];return o?.type==="M"?o:null},getFolderTree:e=>{const{nodes:s,rootIds:o}=n(),t=c=>e?c.toLowerCase().includes(e.toLowerCase()):!0,a=c=>{const d=s[c];if(!d||d.type!=="F")return null;const i=d,l=(i.children||[]).map(m=>s[m]).filter(m=>!!m&&m.type==="F").map(m=>a(m.bkmkId)).filter(Boolean);return t(i.bkmkNm)||l.length>0?{key:i.bkmkId,title:`📁 ${i.bkmkNm}`,children:l.length?l:void 0}:null};return o.map(c=>a(c)).filter(Boolean)},loadFavorites:async(e,s=!1)=>{console.log("loadFavorites ::::: ",e,s);const o=n();if(!(!s&&o.loadedFor===e&&Object.keys(o.nodes).length)){r({loading:!0,error:void 0});try{const t=await I.callService("SCMBKMK00101",{userId:e}),a=Array.isArray(t?.sub)?t.sub:[],c=ne(a),d=w(c.nodes,c.rootIds);r({...c,treeNodes:d,loadedFor:e,loading:!1})}catch(t){throw r({loading:!1,error:t?.message||"즐겨찾기 로드 실패"}),t}}},loadFavoritesIfNeeded:async e=>{const s=n();(s.loadedFor!==e||Object.keys(s.nodes).length===0)&&await n().loadFavorites(e)},clearFavorites:()=>{r({nodes:{},rootIds:[],treeNodes:[],loadedFor:void 0,loading:!1,error:void 0}),console.log("📚 북마크 스토어 초기화 완료")},addNode:async e=>{const s=K(n()),o=ae();r(t=>{const a=e.sortOrdr??x(t,e.prntBkmkId),c={...t,nodes:{...t.nodes,[o]:e.type==="F"?{bkmkId:o,type:"F",prntBkmkId:e.prntBkmkId||"-",sortOrdr:a,bkmkNm:e.bkmkNm??"새 폴더",children:[],sysCd:e.sysCd,userId:e.userId}:{bkmkId:o,type:"M",prntBkmkId:e.prntBkmkId,sortOrdr:a,menuId:e.menuId??"",menuNm:e.menuNm,sysCd:e.sysCd,userId:e.userId}},rootIds:t.rootIds.slice(),treeNodes:t.treeNodes};return ce(c,o,e.prntBkmkId),c.treeNodes=w(c.nodes,c.rootIds),c});try{let t=o;const a=x(n(),e.prntBkmkId),c=await I.callService("SCMBKMK00102",{iudFlag:"I",type:e.type,sysCd:e.sysCd,userId:e.userId,bkmkId:o,bkmkNm:e.bkmkNm,prntBkmkId:e.prntBkmkId,menuId:e.menuId,sortOrdr:a,chngId:I.getUserId()});return t=String(c?.bkmkId??c?.itemId??o),r(d=>{const i=le(d,o,t);return{...i,treeNodes:w(i.nodes,i.rootIds)}}),t}catch(t){throw r(s),t}},moveNode:async({bkmkId:e,newPrntBkmkId:s,sortOrdr:o,userId:t})=>{const a=n(),c=structuredClone(a.nodes),d=[...a.rootIds],i=c[e];if(!i)return;if(s!=="-"){const u=c[s];if(!u||u.type!=="F")throw new Error("부모는 폴더만 가능합니다.")}const l=i.prntBkmkId??"-",h=l==="-"?d:c[l].children||=[];{const u=h.indexOf(e);u>=0&&h.splice(u,1)}const m=s==="-"?d:c[s].children||=[];m.splice(Math.max(0,Math.min(o,m.length)),0,e),i.prntBkmkId=s,r({nodes:c,rootIds:d}),j(c,d,s),j(c,d,l);try{await I.callService("SCMBKMK00104",{bkmkId:e,prntBkmkId:s,sortOrdr:o,chngId:t})}catch(u){throw r(a),u}},removeNode:async e=>{const s=K(n());r(o=>{if(!o.nodes[e])return o;const t={...o,nodes:{...o.nodes},rootIds:o.rootIds.slice(),treeNodes:o.treeNodes};return X(t,e),t.treeNodes=w(t.nodes,t.rootIds),t});try{await I.callService("SCMBKMK00103",{bkmkId:e})}catch(o){throw r(s),o}},editNode:async({bkmkId:e,userId:s,bkmkNm:o,prntBkmkId:t,sortOrdr:a})=>{const c=K(n());r(d=>{const i={...d,nodes:{...d.nodes}},l=i.nodes[e];return l?.type==="F"&&typeof o=="string"&&(i.nodes[e]={...l,bkmkNm:o}),i});try{await I.callService("SCMBKMK00102",{iudFlag:"U",userId:s,bkmkId:e,bkmkNm:o,prntBkmkId:t,sortOrdr:a,chngId:I.getUserId()})}catch(d){throw r(c),d}},addFolder:async(e,s,o,t)=>await n().addNode({type:"F",bkmkNm:e,prntBkmkId:s,sysCd:o,userId:t}),addMenuToFolder:async(e,s)=>F(n().nodes,s.menuId)?"이미 북마크에 저장된 메뉴입니다.":await n().addNode({type:"M",prntBkmkId:e,sysCd:"KH",userId:I.getUserId(),menuId:s.menuId,menuNm:s.menuNm}),toggleMenuFavorite:async(e,s)=>{if(!e)return;const o=n(),t=Object.values(o.nodes).find(c=>c.type==="M"&&c.menuId===s.menuId);if(t){await n().removeNode(t.bkmkId);return}let a=z(o);a||(await n().loadFavorites(e,!0),a=z(n())),a&&await n().addNode({type:"M",prntBkmkId:a,sysCd:"KH",userId:I.getUserId(),menuId:s.menuId,menuNm:s.menuNm})},removeMenuByMenuId:async e=>{const s=n(),o=F(s.nodes,e);o&&await n().removeNode(o)},removeMenu:async e=>{await n().removeNode(e)},removeFolder:async e=>{await n().removeNode(e)},editFolder:async(e,s,o,t,a)=>{await n().editNode({bkmkId:e,userId:s,bkmkNm:o,prntBkmkId:t,sortOrdr:a})},convertToAntTreeData:(e,s,o,t=!1)=>{const a=d=>o?d.toLowerCase().includes(o.toLowerCase()):!0,c=d=>{const i=e[d];if(!i||t&&i.type!=="F")return null;if(i.type==="F"){const l=i,h=(l.children||[]).map(u=>c(u)).filter(Boolean);return a(l.bkmkNm)||h.length>0?{key:l.bkmkId,type:"F",title:`📁 ${l.bkmkNm}`,bkmkNm:l.bkmkNm,prntBkmkId:l.prntBkmkId,sortOrdr:l.sortOrdr,fullPath:l.fullPath,children:h.length?h:void 0}:null}else{const l=i,h=l.menuNm?`${l.menuNm} (${l.menuId})`:l.menuId;return a(h)?{key:l.bkmkId,type:"M",title:`📄 ${h}`,prntBkmkId:l.prntBkmkId,sortOrdr:l.sortOrdr,fullPath:l.fullPath,isLeaf:!0}:null}};return s.map(c).filter(Boolean)}}),R=b.create(re);function ne(r){const n={},e=[],s=o=>{o.forEach(t=>{const a={type:t.type,bkmkId:t.bkmkId??t.BKMK_ID??t.id,prntBkmkId:t.prntBkmkId??t.PRNT_BKMK_ID??"-",sortOrdr:Number(t.sortOrdr??t.SORT_ORDR??0),sysCd:t.sysCd??t.SYS_CD,userId:t.userId??t.USER_ID,fullPath:t.fullPath??t.FULL_PATH};if(t.type==="F"){n[a.bkmkId]={...a,bkmkNm:t.bkmkNm??t.BKMK_NM??t.name??a.bkmkId,children:[]};const c=Array.isArray(t.children)?t.children:[];s(c)}else n[a.bkmkId]={...a,menuId:t.menuId??t.MENU_ID??"",menuNm:t.menuNm??t.MENU_NM}})};return s(r),Object.values(n).forEach(o=>{if(o.prntBkmkId&&o.prntBkmkId!=="-"){const t=n[o.prntBkmkId];t?.type==="F"&&t.children.push(o.bkmkId)}else o.type==="F"&&e.push(o.bkmkId)}),e.sort((o,t)=>(n[o].sortOrdr??0)-(n[t].sortOrdr??0)),Object.values(n).forEach(o=>{o.type==="F"&&o.children.sort((a,c)=>(n[a].sortOrdr??0)-(n[c].sortOrdr??0))}),{nodes:n,rootIds:e}}function K(r){return{...r,nodes:JSON.parse(JSON.stringify(r.nodes)),rootIds:r.rootIds.slice()}}function ae(){return`tmp_${I.generateUID()}`}function x(r,n){if(!n||n==="-")return r.rootIds.length;const e=r.nodes[n];return e?e.children.length:0}function ce(r,n,e){const s=r.nodes[n];if(s)if(e&&e!=="-"){const o=r.nodes[e];if(!o||o.type!=="F")return;s.prntBkmkId=e,o.children=[...o.children,n]}else s.prntBkmkId="-",r.rootIds=[...r.rootIds,n]}function de(r,n){const e=r.nodes[n];if(!e)return;const s=e.prntBkmkId;if(s&&s!=="-"){const o=r.nodes[s];o?.type==="F"&&(o.children=o.children.filter(t=>t!==n))}else r.rootIds=r.rootIds.filter(o=>o!==n)}function X(r,n){const e=r.nodes[n];if(!e)return;e.type==="F"&&e.children.slice().forEach(a=>X(r,a)),de(r,n);const{[n]:s,...o}=r.nodes;r.nodes=o}function le(r,n,e){if(n===e)return r;const s=r.nodes[n];if(!s)return r;const o=JSON.parse(JSON.stringify(s));o.bkmkId=e;const t={...r.nodes,[e]:o};delete t[n];let a=r.rootIds;if(o.prntBkmkId&&o.prntBkmkId!=="-"){const c=t[o.prntBkmkId];c?.type==="F"&&(t[o.prntBkmkId]={...c,children:c.children.map(d=>d===n?e:d)})}else a=r.rootIds.map(c=>c===n?e:c);return{...r,nodes:t,rootIds:a}}function z(r){return r.rootIds.find(n=>r.nodes[n]?.type==="F")??null}function w(r,n){const e={};Object.values(r).forEach(d=>{const i=d.bkmkId,l=d.prntBkmkId;!i||!l||l==="-"||l===i||(e[l]??=[]).push(i)});const s=new Set,o=d=>{if(s.has(d))return null;const i=r[d];if(!i)return null;s.add(d);try{if(i.type==="F"){const h=i,m=e[d]??[];return{type:"F",bkmkId:d,bkmkNm:h.bkmkNm,prntBkmkId:h.prntBkmkId,children:m.map(o).filter(Boolean)}}const l=i;return{type:"M",bkmkId:d,bkmkNm:l.menuNm,menuId:l.menuId,menuNm:l.menuNm,prntBkmkId:l.prntBkmkId}}finally{s.delete(d)}},t=Object.values(r).filter(d=>d.prntBkmkId==="-"&&d.type==="M").map(d=>d.bkmkId),a=Object.values(r).filter(d=>d.prntBkmkId==="-"&&d.type==="F").map(d=>d.bkmkId);return Array.from(new Set([...n,...t,...a])).map(o).filter(Boolean)}function F(r,n){for(const e of Object.values(r))if(e.type==="M"&&e.menuId===n)return e.bkmkId;return null}function j(r,n,e){(!e||e==="-"?n:r[e].children||[]).forEach((o,t)=>{const a=r[o];a&&(a.sortOrdr=t)})}const H={DEFAULT_PRNT_GBCD:1},pe=r=>r&&typeof r=="object"&&typeof r.menuId=="string"&&typeof r.menuNm=="string",Y=r=>Array.isArray(r)&&r.every(pe);let B=[],q=[];const ie=r=>{if(r&&typeof r=="object"){const n=r;if(n.menus&&Y(n.menus))return n.menus;if(Y(r))return r}return console.warn("⚠️ 메뉴 응답이 비어있거나 예상과 다릅니다."),[]},ue=(r,n)=>!!n&&r.crprCd===n.crprCd&&r.userId===n.userId&&(r.prntGbcd??H.DEFAULT_PRNT_GBCD)===(n.prntGbcd??H.DEFAULT_PRNT_GBCD),me=r=>{if(B.length===r.length&&B.every((t,a)=>t.menuId===r[a]?.menuId&&t.menuPrntId===r[a]?.menuPrntId))return q;if(!r.length)return[];const n=new Map,e=[];r.forEach(t=>t?.menuId&&n.set(t.menuId,{...t,children:[]})),r.forEach(t=>{const a=n.get(t.menuId);a&&(t.menuPrntId&&t.menuPrntId!==""&&t.menuPrntId!=="-"?n.get(t.menuPrntId)?.children?.push(a):e.push(a))});const s=t=>t.sort((a,c)=>(a?.menuNo??0)-(c?.menuNo??0)).map(a=>({...a,children:a.children&&a.children.length?s(a.children):void 0})),o=s(e);return B=[...r],q=o,o},_=b.create((r,n)=>({menuList:[],flatMenuList:[],isLoading:!1,error:null,_lastFetchParams:null,fetchMenu:async({crprCd:e,userId:s,prntGbcd:o})=>{const t={crprCd:e,userId:s,prntGbcd:o??H.DEFAULT_PRNT_GBCD};if(ue(t,n()._lastFetchParams)){console.log("✅ 중복 fetch 차단",t);return}r({isLoading:!0,error:null,_lastFetchParams:t});try{const a=await I.callService(I.getServiceCode("AUTH_MENU"),t),c=ie(a),d=me(c);r({flatMenuList:c,menuList:d,isLoading:!1,error:null})}catch(a){r({isLoading:!1,error:a?.message??"메뉴 로드 실패"})}},clearMenu:()=>{r({menuList:[],flatMenuList:[],error:null,_lastFetchParams:null})},findMenuById:e=>{const{flatMenuList:s}=n();return s.find(o=>o.menuId===e)??null}})),T={MAX_TABS:15},U=b.create((r,n)=>({activeMenuId:null,activeMenuItem:null,activeDetailItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:T.MAX_TABS,tabProtectFlag:{},tabParams:{},componentLabelMap:{},pinnedTabs:new Set,refreshTabKey:{},clearMenuViewStore:()=>{r({activeMenuId:null,activeMenuItem:null,activeDetailItem:null,tabs:[],sidebarCollapsed:!1,maxTabs:T.MAX_TABS,tabProtectFlag:{},tabParams:{},componentLabelMap:{},pinnedTabs:new Set,refreshTabKey:{}})},openTabFromMenu:(e,s,o)=>{const{tabs:t}=n(),a=t.find(i=>i.key===e.menuId),c=o?.skipRefreshModal??!1;if(a){if(c){n().focusTab(e.menuId),n().setTabParams(e.menuId,s||{}),e?.prsnInfoYn==="Y"&&n().setProtectFlagForKey(e.menuId);return}L.Modal.confirm({title:`[${e.menuNm}] 메뉴이동 알림`,content:"이미 열린 화면입니다. 새로고침 하시겠습니까?",centered:!0,okText:"예",cancelText:"아니오",onOk:()=>{n().refreshTab(e.menuId),n().focusTab(e.menuId),n().setTabParams(e.menuId,s||{}),e?.prsnInfoYn==="Y"&&n().setProtectFlagForKey(e.menuId)},onCancel:()=>{n().focusTab(e.menuId),n().setTabParams(e.menuId,s||{}),e?.prsnInfoYn==="Y"&&n().setProtectFlagForKey(e.menuId)}});return}if(t.length>=T.MAX_TABS){console.warn("❌ 최대 탭 개수를 초과했습니다."),L.message.warning(`최대 ${T.MAX_TABS}개의 탭만 열 수 있습니다.
2
2
  기존 탭을 닫고 다시 시도해주세요.`);return}const d={key:e.menuId,label:e.menuNm,gubun:"M",menuItem:e,closable:!0};r({tabs:[...t,d],activeMenuId:e.menuId,activeMenuItem:e}),n().setTabParams(e.menuId,s||{}),e?.prsnInfoYn==="Y"&&n().setProtectFlagForKey(e.menuId)},openTabByMenuId:(e,s,o)=>{const t=_.getState().findMenuById(e);t?n().openTabFromMenu(t,s,o):L.message.warning("메뉴 ID를 찾을 수 없습니다.")},openDetailView:(e,s,o)=>{const{tabs:t}=n();if(t.find(c=>c.key===e.viewId))n().focusTab(e.viewId);else{const c={key:e.viewId,label:e.viewLabel,gubun:"C",componentItem:{scrnPath:s,prsnInfoYn:o,prntInfo:e.prntInfo},closable:!0};r({tabs:[...t,c],activeMenuId:e.viewId,activeDetailItem:e}),n().setTabParams(e.viewId,e.viewParams||{})}},closeTab:e=>{const{tabs:s,activeMenuId:o,pinnedTabs:t}=n();if(t.has(e))return;s.find(d=>d.key===e);const a=s.filter(d=>d.key!==e);let c=o;if(o===e){const d=s.findIndex(i=>i.key===e);c=a.length?a[Math.min(d,a.length-1)]?.key??null:null}r({tabs:a}),c&&n().focusTab(c)},focusTab:e=>{const{tabs:s}=n(),o=s.find(t=>t.key===e);if(o){const t=o.gubun==="C"?{viewId:o.key,viewLabel:o.label,prntInfo:o.componentItem?.prntInfo}:null;o.menuItem?.prsnInfoYn==="Y"?(r({activeMenuId:e,activeMenuItem:o.menuItem,activeDetailItem:t}),console.log("✅ 탭 포커스 (개인정보) - activeMenuItem:",o.menuItem),n().setProtectFlagForKey(e)):(r({activeMenuId:e,activeMenuItem:o.menuItem,activeDetailItem:t}),n().clearProtectFlagForKey(e))}else r({activeMenuId:e,activeMenuItem:null,activeDetailItem:null}),console.warn("❌ 탭을 찾을 수 없음:",e)},closeAllTabs:()=>r({tabs:[],activeMenuId:null,activeMenuItem:null,activeDetailItem:null}),toggleSidebar:()=>r(e=>({sidebarCollapsed:!e.sidebarCollapsed})),reorderTabs:e=>r(s=>{const o=new Map(s.tabs.map(t=>[t.key,t]));return{tabs:e.map(t=>o.get(t)).filter(Boolean)}}),setProtectFlagForKey:e=>r(s=>({tabProtectFlag:{...s.tabProtectFlag,[e]:!0}})),clearProtectFlagForKey:e=>r(s=>{const o={...s.tabProtectFlag};return delete o[e],{tabProtectFlag:o}}),setTabParams:(e,s)=>r(o=>{const t=o.tabParams[e]||{},a={...s||{}};return Object.keys(t).length===Object.keys(a).length&&Object.keys(a).every(d=>t[d]===a[d])?o:{tabParams:{...o.tabParams,[e]:a}}}),setComponentLabelMap:(e,s)=>r({componentLabelMap:e}),togglePinTab:e=>r(s=>{const o=new Set(s.pinnedTabs);return o.has(e)?o.delete(e):o.add(e),{pinnedTabs:o}}),refreshTab:e=>r(s=>({refreshTabKey:{...s.refreshTabKey,[e]:Date.now()}})),closeOtherTabs:e=>{const{tabs:s,activeMenuId:o}=n();if(!s.find(d=>d.key===e))return;const a=n().pinnedTabs;s.filter(d=>d.key!==e&&!a.has(d.key)).forEach(d=>n().closeTab(d.key)),o!==e&&n().focusTab(e)},closeRightTabs:e=>{const{tabs:s}=n(),o=s.findIndex(c=>c.key===e);if(o<0)return;const t=n().pinnedTabs;s.slice(o+1).filter(c=>!t.has(c.key)).forEach(c=>n().closeTab(c.key))}})),W=b.create((r,n)=>({popups:[],activePopupId:null,isLoading:!1,error:null,zIndexSeed:1e3,openPopup:async(e,s,o)=>{r({isLoading:!0,error:null});try{let t=null;const a=await I.callService(I.getServiceCode("SRCH_POPU"),{crprCd:I.getUserInfo()?.crprCd,popuCd:e});t=a?.mstr;const c=a?.dtls||[];if(!t||!t.popuUrl){const u=`팝업 정보를 찾을 수 없습니다: ${e}`;throw console.error(u),new Error(u)}const i=(u=>`/src/pages/views/popup/${u}`)(t.popuUrl),l=n().zIndexSeed+1,h={popupId:`popup_${Date.now()}_${I.generateUID()}`,popupCode:e,popupTitle:o?.title||t.popuNm||"팝업",popupUrl:i,popupParams:s,width:t.popuWdth||800,height:t.popuHght||600,resizable:!0,draggable:!0,buttonList:c,config:o,zIndex:l},m=n().popups.find(u=>u.popupCode===e);if(m){r({activePopupId:m.popupId,popups:n().popups.map(u=>u.popupId===m.popupId?{...u,config:o}:u),isLoading:!1});return}r(u=>({popups:[...u.popups,h],activePopupId:h.popupId,isLoading:!1,zIndexSeed:l}))}catch(t){r({error:t instanceof Error?t.message:"팝업 열기 실패",isLoading:!1})}},openCorePopup:(e,s)=>{const o=`popup_${Date.now()}_${I.generateUID()}`,t=n().zIndexSeed+1,c=V.localPopupRegistry[e]?.defaultConfig||{},d={...c,...s,buttons:s?.buttons!==void 0?s.buttons:c.buttons,callback:s?.callback!==void 0?s.callback:c.callback},i=s?.defaultParams||{},l=n().popups.find(m=>m.popupCode===e&&m.isLocal);if(l){const m=n().zIndexSeed+1;r({activePopupId:l.popupId,zIndexSeed:m}),r(u=>({popups:u.popups.map(f=>f.popupId===l.popupId?{...f,config:d,zIndex:m,close:()=>{n().closePopup(l.popupId)}}:f)}));return}const h={popupId:o,popupCode:e,popupTitle:d.title||e,popupUrl:"",popupParams:i,width:d.width||1e3,height:d.height||700,resizable:d.resizable!==void 0?d.resizable:!0,draggable:d.draggable!==void 0?d.draggable:!0,buttonList:[],config:d,isLocal:!0,zIndex:t,close:()=>{n().closePopup(o)}};r(m=>({popups:[...m.popups,h],activePopupId:o,zIndexSeed:t}))},closePopup:e=>{const{popups:s,activePopupId:o}=n(),t=s.filter(c=>c.popupId!==e);let a=o;o===e&&(a=t.length>0?t[t.length-1].popupId:null),r({popups:t,activePopupId:a})},closeAllPopups:()=>{r({popups:[],activePopupId:null})},setActivePopup:e=>{const s=n().zIndexSeed+1;r(o=>({activePopupId:e,zIndexSeed:s,popups:o.popups.map(t=>t.popupId===e?{...t,zIndex:s}:t)}))},updatePopupConfig:(e,s)=>{r(o=>({popups:o.popups.map(t=>t.popupId===e?{...t,config:{...t.config,...s}}:t)}))}})),$=b.create()(v((r,n)=>({systemMap:[],fetchSystemMap:async()=>{r({systemMap:[{sysCd:"KE",appItCd:"ERPS",appCd:"SAP",systemNm:"K-ERP",appNm:"SAP"},{sysCd:"KE",appItCd:"KERP",appCd:"FI",systemNm:"K-ERP",appNm:"재무회계"},{sysCd:"KE",appItCd:"KERP",appCd:"FM",systemNm:"K-ERP",appNm:"예산관리"},{sysCd:"KE",appItCd:"KERP",appCd:"MM",systemNm:"K-ERP",appNm:"구매계약"},{sysCd:"KE",appItCd:"KERP",appCd:"SD",systemNm:"K-ERP",appNm:"영업관리"},{sysCd:"CH",appItCd:"KERP",appCd:"PMN",systemNm:"K-ERP",appNm:"파트너관리"},{sysCd:"FB",appItCd:"FBK",appCd:"FBK",systemNm:"펌뱅킹",appNm:"펌뱅킹"},{sysCd:"IA",appItCd:"IAC",appCd:"IAC",systemNm:"내부회계",appNm:"내부회계"},{sysCd:"ET",appItCd:"ETAX",appCd:"ETAX",systemNm:"전자세금계산서",appNm:"전자세금계산서"},{sysCd:"HR",appItCd:"KHR",appCd:"HR",systemNm:"K-HR",appNm:"HR 솔루션"},{sysCd:"YT",appItCd:"KHYT",appCd:"YT",systemNm:"K-HR 연말정산",appNm:"연말정산"},{sysCd:"CM",appItCd:"KCM",appCd:"CM",systemNm:"K-HR 프레임워크 공통",appNm:"프레임워크 공통"},{sysCd:"PA",appItCd:"KHPE",appCd:"PE",systemNm:"K-HR 평정",appNm:"평정"},{sysCd:"OT",appItCd:"POF",appCd:"POF",systemNm:"시간외(PC-OFF)",appNm:"시간외(PC-OFF)"},{sysCd:"DC",appItCd:"CDT",appCd:"CDT",systemNm:"전자계약",appNm:"전자계약"},{sysCd:"KS",appItCd:"KSCM",appCd:"KSCM",systemNm:"KS-공통",appNm:"KS-공통"},{sysCd:"KS",appItCd:"EAUD",appCd:"EAUD",systemNm:"K-업무지원",appNm:"e-감사"},{sysCd:"KS",appItCd:"INR",appCd:"INR",systemNm:"K-업무지원",appNm:"청렴신고"},{sysCd:"KS",appItCd:"ITSM",appCd:"ITAM",systemNm:"K-업무지원",appNm:"ITAM"},{sysCd:"KS",appItCd:"CMM",appCd:"CMM",systemNm:"K-업무지원",appNm:"차량/회의실"},{sysCd:"KS",appItCd:"OAM",appCd:"OAM",systemNm:"K-업무지원",appNm:"OA전산물품관리"},{sysCd:"KS",appItCd:"KSGA",appCd:"GAM",systemNm:"K-업무지원",appNm:"총무관리"},{sysCd:"KS",appItCd:"KSGA",appCd:"ACM",systemNm:"K-업무지원",appNm:"출입관리"},{sysCd:"KS",appItCd:"KSGA",appCd:"IVM",systemNm:"K-업무지원",appNm:"비품관리"},{sysCd:"KS",appItCd:"KSGA",appCd:"SGS",systemNm:"K-업무지원",appNm:"인장서비스"},{sysCd:"KS",appItCd:"HIS",appCd:"HIS",systemNm:"K-업무지원",appNm:"사료관리"},{sysCd:"KS",appItCd:"WFAX",appCd:"WFAX",systemNm:"K-업무지원",appNm:"웹펙스서비스"},{sysCd:"KS",appItCd:"SMS",appCd:"SMS",systemNm:"K-업무지원",appNm:"메시지서비스"},{sysCd:"KS",appItCd:"BID",appCd:"BID",systemNm:"K-업무지원",appNm:"경영공시"},{sysCd:"KS",appItCd:"PAM",appCd:"PAM",systemNm:"K-업무지원",appNm:"언론미디어"},{sysCd:"KS",appItCd:"DAC",appCd:"DAC",systemNm:"K-업무지원",appNm:"심의자문위원회"},{sysCd:"KS",appItCd:"IPR",appCd:"IPR",systemNm:"K-업무지원",appNm:"지식재산권신청"},{sysCd:"KS",appItCd:"ISB",appCd:"ISB",systemNm:"K-업무지원",appNm:"정보공유게시판"},{sysCd:"DE",appItCd:"BCOM",appCd:"BCOM",systemNm:"온통",appNm:"온통"},{sysCd:"TS",appItCd:"ITSM",appCd:"ITSM",systemNm:"ITSM",appNm:"ITSM"},{sysCd:"EP",appItCd:"EPOP",appCd:"EPOP",systemNm:"국민신문고",appNm:"국민신문고"},{sysCd:"VC",appItCd:"VOC",appCd:"VOC",systemNm:"VOC",appNm:"VOC"},{sysCd:"CC",appItCd:"CAL",appCd:"CAL",systemNm:"콜센터",appNm:"콜센터"},{sysCd:"LA",appItCd:"LEG",appCd:"LEG",systemNm:"법규포털",appNm:"법규포털"},{sysCd:"IM",appItCd:"IDXM",appCd:"IDXM",systemNm:"지수방법론",appNm:"지수방법론"},{sysCd:"PM",appItCd:"ORM",appCd:"ORM",systemNm:"운영리스크관리",appNm:"운영리스크관리"},{sysCd:"RF",appItCd:"RFID",appCd:"RFID",systemNm:"RFID(비품관리)",appNm:"RFID(비품관리)"},{sysCd:"SL",appItCd:"SGM",appCd:"SGM",systemNm:"인장관리",appNm:"인장관리"},{sysCd:"DM",appItCd:"LBS",appCd:"LBS",systemNm:"도서관리",appNm:"도서관리"},{sysCd:"HE",appItCd:"RMS",appCd:"RMS",systemNm:"원격지원",appNm:"원격지원"},{sysCd:"WF",appItCd:"WFX",appCd:"WFX",systemNm:"WebFax",appNm:"WebFax"},{sysCd:"SM",appItCd:"SMT",appCd:"SMT",systemNm:"SMS",appNm:"SMS"},{sysCd:"SO",appItCd:"SSO",appCd:"SSO",systemNm:"SSO",appNm:"SSO"},{sysCd:"SF",appItCd:"SFO",appCd:"SFO",systemNm:"생체인증(One Pass)",appNm:"생체인증 FIDO"},{sysCd:"SP",appItCd:"SPO",appCd:"SPO",systemNm:"생체인증(장정맥)",appNm:"생체인증 장정맥"},{sysCd:"AG",appItCd:"APG",appCd:"APG",systemNm:"API GW",appNm:"API Gateway"},{sysCd:"AM",appItCd:"APM",appCd:"APM",systemNm:"APM",appNm:"APM"},{sysCd:"JS",appItCd:"BXS",appCd:"BXS",systemNm:"배치스케줄러",appNm:"배치스케줄러"},{sysCd:"DT",appItCd:"PDT",appCd:"PDT",systemNm:"개인정보변환",appNm:"개인정보변환"}]})},setSystemMap:e=>{r({systemMap:e})},clearSystemMap:()=>{r({systemMap:[]})},getBySysCd:e=>n().systemMap.filter(s=>s.sysCd===e),getByAppItCd:e=>n().systemMap.filter(s=>s.appItCd===e),findByAppCd:e=>n().systemMap.find(s=>s.appCd===e),filterSystemMap:e=>{const{sysCd:s,appItCd:o,appCd:t}=e;return n().systemMap.filter(a=>(s?a.sysCd===s:!0)&&(o?a.appItCd===o:!0)&&(t?a.appCd===t:!0))}}),{name:"system-info-store"})),Ce=b.create(r=>({requestCount:0,loading:!1,showLoading:()=>r(n=>{const e=n.requestCount+1;return{requestCount:e,loading:e>0}}),hideLoading:()=>r(n=>{const e=Math.max(0,n.requestCount-1);return{requestCount:e,loading:e>0}})})),fe=b.create(r=>({requestCount:0,loading:!1,showLoading:()=>r(n=>{const e=n.requestCount+1;return{requestCount:e,loading:e>0}}),hideLoading:()=>r(n=>{const e=Math.max(0,n.requestCount-1);return{requestCount:e,loading:e>0}})}));function J(){const[r,n]=k.useState(!1),e=k.useCallback(s=>{const o=s?.getModifierState?.("CapsLock");typeof o=="boolean"&&n(o)},[]);return{capsOn:r,onKeyDown:e}}function he(r){const{loginApi:n,fetchCommonCodes:e,onAfterLogin:s,onError:o,rememberCookie:t={enabled:!0,days:30}}=r,[a,c]=k.useState(!1),{capsOn:d,onKeyDown:i}=J(),l="SCMSIGN00101",h=`${__SYS_CD__}_login_id`,m={id:t?.enabled?I.getCookie(h):void 0,pswr:void 0},u=k.useCallback(async f=>{c(!0);try{const C={crprCd:"100",id:f.id,pswr:await I.encryptSha256(f.pswr)},S=await(n??(g=>I.callService(l,g)))(C);if(S?.userInfo?.userId){if(P.getState().setLoginUser(S.userInfo,S?.hrInfo),localStorage.setItem("LOGIN_USER_ID",S.userInfo.userId),t?.enabled){const g=t.days??30;f.remember?I.setCookie(h,f.id??"",g):I.setCookie(h,"",0)}return e?await e():await D.getState().fetchCommonCodes(),s(S),{user:S.userInfo,response:S}}else throw o({user:S.userInfo,response:S}),new Error("사용자 정보가 유효하지 않습니다.")}catch(C){o(C)}finally{c(!1)}},[l,n,e,s,o,t?.enabled,t?.days]);return{loading:a,capsOn:d,prefills:m,onKeyDown:i,doLogin:u}}function Ie(r){const{loginApi:n,fetchCommonCodes:e,onAfterLogin:s,onError:o}=r,[t,a]=k.useState("LOADING"),c=k.useCallback(async d=>{a("LOADING");try{const i=new URLSearchParams;i.append("ip",I.getClientIp()||"");const l=await Q.post("/api/sso",i);if(l.data.result&&l.data.userId)L.message.success(l.data.message);else if(!l.data.result)throw console.error(l.data.code," ::: ",l.data.message),L.message.error(l.data.message),new Error(l.data.message);const h={crprCd:"100",sysCd:d.sysCd,userId:l.data.userId,id:l.data.userId,pswr:await I.encryptSha256("krx2025!@")},u=await(n??(f=>I.callService("SCMSIGN00199",f)))(h);if(u?.userInfo?.userId)return P.getState().setLoginUser(u.userInfo,u?.hrInfo),localStorage.setItem("LOGIN_USER_ID",u.userInfo.userId),e?await e():await D.getState().fetchCommonCodes(),s(u),a("SUCCESS"),{user:u.userInfo,response:u};throw new Error("INVALID_USER")}catch(i){o?.({msg:i.message}),a("FAIL")}},[n,e,s,o]);return{loginStatus:t,doSsoLogin:c}}function ye(r){return()=>{P.getState().clearLoginUser(),$.getState().clearSystemMap(),D.getState().clearCodes(),_.getState().clearMenu(),U.getState().clearMenuViewStore(),R.getState().clearFavorites(),localStorage.removeItem("LOGIN_USER_ID"),r?.()}}const ge=()=>D.getState(),Se=()=>W.getState(),be=()=>P.getState(),Ne=()=>R.getState(),Me=()=>_.getState(),ke=()=>U.getState(),ve=()=>$.getState();exports.useCapsLock=J;exports.useCode=ge;exports.useCodeStore=D;exports.useColorStore=se;exports.useFavorite=Ne;exports.useFavoriteStore=R;exports.useLoadingStore=Ce;exports.useLogin=he;exports.useLogout=ye;exports.useMenuModel=Me;exports.useMenuModelStore=_;exports.useMenuView=ke;exports.useMenuViewStore=U;exports.useOptionStore=oe;exports.usePopupLoadingStore=fe;exports.usePopupState=Se;exports.usePopupStore=W;exports.useSsoLogin=Ie;exports.useSystemCode=ve;exports.useSystemStore=$;exports.useUser=be;exports.useUserStore=P;
@@ -1,7 +1,7 @@
1
1
  import { create as b } from "zustand";
2
2
  import { callService as S, getServiceCode as w, getUserId as v, generateUID as G, getUserInfo as oe, getCookie as se, encryptSha256 as J, setCookie as z, getClientIp as ne } from "../utils/index.js";
3
3
  import { message as F, Modal as re } from "antd";
4
- import { l as ae } from "../chunks/layout-components-ljht1sHh.js";
4
+ import { l as ae } from "../chunks/layout-components-DnuV2Psp.js";
5
5
  import { useState as U, useCallback as $ } from "react";
6
6
  import de from "axios";
7
7
  function ce(n, r) {
@@ -1,3 +1,3 @@
1
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M11.9998 19.9993V20.9993C11.9998 21.3932 12.0774 21.7833 12.2282 22.1473C12.3789 22.5112 12.5999 22.8419 12.8785 23.1205C13.157 23.399 13.4877 23.62 13.8517 23.7708C14.2156 23.9215 14.6057 23.9991 14.9997 23.9991C15.3936 23.9991 15.7837 23.9215 16.1477 23.7708C16.5116 23.62 16.8423 23.399 17.1209 23.1205C17.3994 22.8419 17.6204 22.5112 17.7712 22.1473C17.9219 21.7833 17.9995 21.3932 17.9995 20.9993V19.9993M20.9994 11.9997C20.9994 14.9996 22.9993 19.9993 22.9993 19.9993H7.00006C7.00006 19.9993 8.99996 15.9995 8.99996 11.9997C8.99996 8.73187 11.7318 6 14.9997 6C18.2675 6 20.9994 8.73187 20.9994 11.9997Z" stroke="#485299" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
3
- </svg>
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M11.9998 19.9993V20.9993C11.9998 21.3932 12.0774 21.7833 12.2282 22.1473C12.3789 22.5112 12.5999 22.8419 12.8785 23.1205C13.157 23.399 13.4877 23.62 13.8517 23.7708C14.2156 23.9215 14.6057 23.9991 14.9997 23.9991C15.3936 23.9991 15.7837 23.9215 16.1477 23.7708C16.5116 23.62 16.8423 23.399 17.1209 23.1205C17.3994 22.8419 17.6204 22.5112 17.7712 22.1473C17.9219 21.7833 17.9995 21.3932 17.9995 20.9993V19.9993M20.9994 11.9997C20.9994 14.9996 22.9993 19.9993 22.9993 19.9993H7.00006C7.00006 19.9993 8.99996 15.9995 8.99996 11.9997C8.99996 8.73187 11.7318 6 14.9997 6C18.2675 6 20.9994 8.73187 20.9994 11.9997Z" stroke="#485299" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
3
+ </svg>
@@ -1,10 +1,10 @@
1
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <g clip-path="url(#clip0_93_4488)">
3
- <path d="M18 7H21C22.1046 7 23 7.89543 23 9V21C23 22.1046 22.1046 23 21 23H18M11 11L7 15M7 15L11 19M7 15L19 15" stroke="#485299" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
4
- </g>
5
- <defs>
6
- <clipPath id="clip0_93_4488">
7
- <rect width="30" height="30" fill="white"/>
8
- </clipPath>
9
- </defs>
10
- </svg>
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_93_4488)">
3
+ <path d="M18 7H21C22.1046 7 23 7.89543 23 9V21C23 22.1046 22.1046 23 21 23H18M11 11L7 15M7 15L11 19M7 15L19 15" stroke="#485299" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
4
+ </g>
5
+ <defs>
6
+ <clipPath id="clip0_93_4488">
7
+ <rect width="30" height="30" fill="white"/>
8
+ </clipPath>
9
+ </defs>
10
+ </svg>
@@ -1,4 +1,4 @@
1
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M14 6H16C16.5523 6 17 6.44772 17 7V7.56879C17 7.99659 17.2871 8.36825 17.6822 8.53228C18.0775 8.69638 18.5377 8.63384 18.8403 8.33123L19.2426 7.92891C19.6331 7.53838 20.2663 7.53838 20.6568 7.92891L22.071 9.34312C22.4616 9.73365 22.4615 10.3668 22.071 10.7573L21.6688 11.1596C21.3661 11.4622 21.3036 11.9225 21.4677 12.3177C21.6317 12.7129 22.0034 13 22.4313 13L23 13C23.5523 13 24 13.4477 24 14V16C24 16.5523 23.5523 17 23 17H22.4312C22.0034 17 21.6318 17.2871 21.4677 17.6822C21.3036 18.0775 21.3661 18.5377 21.6688 18.8403L22.071 19.2426C22.4616 19.6331 22.4616 20.2663 22.071 20.6568L20.6568 22.071C20.2663 22.4616 19.6331 22.4616 19.2426 22.071L18.8403 21.6688C18.5377 21.3661 18.0775 21.3036 17.6822 21.4677C17.2871 21.6318 17 22.0034 17 22.4312V23C17 23.5523 16.5523 24 16 24H14C13.4477 24 13 23.5523 13 23V22.4313C13 22.0034 12.7129 21.6317 12.3177 21.4677C11.9225 21.3036 11.4622 21.3661 11.1596 21.6688L10.7573 22.071C10.3668 22.4616 9.73363 22.4616 9.34311 22.071L7.92889 20.6568C7.53837 20.2663 7.53837 19.6331 7.92889 19.2426L8.33123 18.8403C8.63384 18.5377 8.69638 18.0775 8.53228 17.6822C8.36825 17.2871 7.99659 17 7.56879 17H7C6.44772 17 6 16.5523 6 16V14C6 13.4477 6.44772 13 7 13L7.56877 13C7.99658 13 8.36825 12.7129 8.53229 12.3178C8.6964 11.9225 8.63386 11.4623 8.33123 11.1597L7.92891 10.7573C7.53838 10.3668 7.53838 9.73365 7.92891 9.34313L9.34312 7.92891C9.73365 7.53839 10.3668 7.53839 10.7573 7.92891L11.1597 8.33123C11.4623 8.63386 11.9225 8.6964 12.3178 8.53229C12.7129 8.36825 13 7.99658 13 7.56876V7C13 6.44772 13.4477 6 14 6Z" stroke="#485299" stroke-width="1.5"/>
3
- <path d="M17 15C17 16.1046 16.1046 17 15 17C13.8954 17 13 16.1046 13 15C13 13.8954 13.8954 13 15 13C16.1046 13 17 13.8954 17 15Z" stroke="#485299" stroke-width="1.5"/>
4
- </svg>
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M14 6H16C16.5523 6 17 6.44772 17 7V7.56879C17 7.99659 17.2871 8.36825 17.6822 8.53228C18.0775 8.69638 18.5377 8.63384 18.8403 8.33123L19.2426 7.92891C19.6331 7.53838 20.2663 7.53838 20.6568 7.92891L22.071 9.34312C22.4616 9.73365 22.4615 10.3668 22.071 10.7573L21.6688 11.1596C21.3661 11.4622 21.3036 11.9225 21.4677 12.3177C21.6317 12.7129 22.0034 13 22.4313 13L23 13C23.5523 13 24 13.4477 24 14V16C24 16.5523 23.5523 17 23 17H22.4312C22.0034 17 21.6318 17.2871 21.4677 17.6822C21.3036 18.0775 21.3661 18.5377 21.6688 18.8403L22.071 19.2426C22.4616 19.6331 22.4616 20.2663 22.071 20.6568L20.6568 22.071C20.2663 22.4616 19.6331 22.4616 19.2426 22.071L18.8403 21.6688C18.5377 21.3661 18.0775 21.3036 17.6822 21.4677C17.2871 21.6318 17 22.0034 17 22.4312V23C17 23.5523 16.5523 24 16 24H14C13.4477 24 13 23.5523 13 23V22.4313C13 22.0034 12.7129 21.6317 12.3177 21.4677C11.9225 21.3036 11.4622 21.3661 11.1596 21.6688L10.7573 22.071C10.3668 22.4616 9.73363 22.4616 9.34311 22.071L7.92889 20.6568C7.53837 20.2663 7.53837 19.6331 7.92889 19.2426L8.33123 18.8403C8.63384 18.5377 8.69638 18.0775 8.53228 17.6822C8.36825 17.2871 7.99659 17 7.56879 17H7C6.44772 17 6 16.5523 6 16V14C6 13.4477 6.44772 13 7 13L7.56877 13C7.99658 13 8.36825 12.7129 8.53229 12.3178C8.6964 11.9225 8.63386 11.4623 8.33123 11.1597L7.92891 10.7573C7.53838 10.3668 7.53838 9.73365 7.92891 9.34313L9.34312 7.92891C9.73365 7.53839 10.3668 7.53839 10.7573 7.92891L11.1597 8.33123C11.4623 8.63386 11.9225 8.6964 12.3178 8.53229C12.7129 8.36825 13 7.99658 13 7.56876V7C13 6.44772 13.4477 6 14 6Z" stroke="#485299" stroke-width="1.5"/>
3
+ <path d="M17 15C17 16.1046 16.1046 17 15 17C13.8954 17 13 16.1046 13 15C13 13.8954 13.8954 13 15 13C16.1046 13 17 13.8954 17 15Z" stroke="#485299" stroke-width="1.5"/>
4
+ </svg>
@@ -1,3 +1,3 @@
1
- <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M6.77771 8.1809C6.37747 8.67607 5.62253 8.67607 5.22229 8.18089L2.98627 5.41454C2.4577 4.7606 2.92314 3.78592 3.76399 3.78592L8.23602 3.78592C9.07687 3.78592 9.5423 4.7606 9.01373 5.41454L6.77771 8.1809Z" fill="#B9B9B9"/>
3
- </svg>
1
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M6.77771 8.1809C6.37747 8.67607 5.62253 8.67607 5.22229 8.18089L2.98627 5.41454C2.4577 4.7606 2.92314 3.78592 3.76399 3.78592L8.23602 3.78592C9.07687 3.78592 9.5423 4.7606 9.01373 5.41454L6.77771 8.1809Z" fill="#B9B9B9"/>
3
+ </svg>
@@ -0,0 +1,35 @@
1
+ /* breadcrumb */
2
+ .admin-breadcrumb {
3
+ color: #7e7e7e;
4
+ font-size: 14px;
5
+ }
6
+ .admin-breadcrumb ol {
7
+ align-items: center;
8
+ }
9
+ .admin-breadcrumb .ant-breadcrumb-separator {
10
+ margin-inline: 4px;
11
+ display: flex;
12
+ align-items: center;
13
+ }
14
+ .admin-breadcrumb li:last-child {
15
+ color: #585858;
16
+ font-weight: 600;
17
+ }
18
+ .admin-breadcrumb .ant-breadcrumb-link {
19
+ position: relative;
20
+ display: inline-block;
21
+ cursor: pointer;
22
+ }
23
+ .admin-breadcrumb .ant-breadcrumb-link::after {
24
+ content: '';
25
+ display: block;
26
+ position: absolute;
27
+ bottom: -1px;
28
+ left: 0;
29
+ width: 100%;
30
+ height: 1px;
31
+ background: #a5a5a5;
32
+ }
33
+ .admin-breadcrumb li:last-child .ant-breadcrumb-link::after {
34
+ display: none;
35
+ }
@@ -16,7 +16,9 @@ body {
16
16
  height: 100vh;
17
17
  overflow-y: hidden;
18
18
  }
19
-
19
+ #root:has(.admin-layout) {
20
+ overflow-y: hidden;
21
+ }
20
22
 
21
23
  /* 공통 유틸리티 클래스 */
22
24
  .flex-center {
@@ -69,3 +71,9 @@ body {
69
71
  ::-webkit-scrollbar-thumb:horizontal:hover {
70
72
  background: #555;
71
73
  }
74
+
75
+ @media (max-height: 768px) {
76
+ #root {
77
+ overflow-y: auto;
78
+ }
79
+ }
@@ -3,8 +3,11 @@
3
3
  @import './variables.css';
4
4
  @import './global.css';
5
5
  @import './layout.css';
6
+ @import './layout_02.css';
6
7
  @import './login.css';
8
+ @import './login_02.css';
7
9
  @import './components.css';
10
+ @import './components_02.css';
8
11
  @import './popup.css';
9
12
  @import './size.css';
10
13
  @import './renderers.css';
@@ -1,8 +1,9 @@
1
1
  /* 메인 레이아웃 스타일 */
2
2
  .main-layout {
3
- min-height: 100vh;
3
+ /* min-height: 100vh; */
4
4
  overflow: hidden;
5
5
  min-width: 1280px;
6
+ min-height: 768px;
6
7
  }
7
8
 
8
9
  /* 헤더 스타일 */
@@ -91,7 +92,7 @@
91
92
 
92
93
  /* 사이더 스타일 */
93
94
  .side-wrapper {
94
- height: calc(100vh - 50px); /* 헤더 높이(50px)를 제외 */
95
+ /* height: calc(100vh - 50px); 헤더 높이(50px)를 제외 */
95
96
  overflow: visible; /* 토글 버튼이 짤리지 않도록 visible로 변경 */
96
97
  display: flex;
97
98
  flex-direction: column;
@@ -112,7 +113,8 @@
112
113
  flex: 1;
113
114
  overflow-y: auto; /* 필요할 때만 스크롤바 표시 */
114
115
  overflow-x: hidden;
115
- max-height: calc(100vh - 160px); /* 헤더(50px) + 로고 높이 + 마진 고려 */
116
+ max-height: calc(100vh - 140px); /*헤더(50px) + 로고 높이 + 마진 고려*/
117
+ /* max-height: calc(100vh - 50px); */
116
118
  padding-right: 0px !important; /* 스크롤바 너비만큼 여백 확보 */
117
119
  box-sizing: border-box; /* 패딩을 포함한 박스 모델 */
118
120
  }
@@ -784,7 +786,6 @@
784
786
  /* 반응형 디자인 */
785
787
  @media (max-width: 768px) {
786
788
  .side-wrapper {
787
- height: 100vh;
788
789
  z-index: 1001;
789
790
  transition: left 0.3s ease;
790
791
  }
@@ -811,6 +812,15 @@
811
812
  }
812
813
  }
813
814
 
815
+ @media (max-height: 768px) {
816
+ .sider-menu {
817
+ max-height: 100vh;
818
+ }
819
+ .content-container {
820
+ height: auto;
821
+ }
822
+ }
823
+
814
824
  /* MenuTab 전용 스타일링 */
815
825
  .menu-tab-wrapper {
816
826
  background: var(--bg-primary);
@@ -0,0 +1,99 @@
1
+ /* kiam 레이아웃 */
2
+
3
+ /* 메인 레이아웃 스타일 */
4
+ .admin-layout {
5
+ min-height: 100vh;
6
+ min-width: 1280px;
7
+ }
8
+
9
+ /* 컨텐츠 컨테이너 스타일 */
10
+ .admin-content-container {
11
+ display: flex;
12
+ flex-direction: column;
13
+ flex-grow: 1;
14
+ overflow-y: auto;
15
+ height: calc(100vh - 50px); /* 헤더 높이를 제외 */
16
+ }
17
+
18
+ /* 뷰 컨테이너 스타일 */
19
+ .admin-view-container {
20
+ height: 100%;
21
+ }
22
+
23
+ .admin-page-inner {
24
+ display: flex;
25
+ flex-direction: column;
26
+ height: 100%;
27
+ }
28
+ .page-header {
29
+ padding: 20px 40px;
30
+ border-bottom: 1px solid #ddd;
31
+ background: var(--bg-primary);
32
+ }
33
+ .page-main-content {
34
+ height: inherit;
35
+ flex: 1 1;
36
+ min-height: 0;
37
+ padding: 20px 30px;
38
+ }
39
+
40
+ /* bwgview 스타일 */
41
+ .admin-layout .bwgview-content-layout {
42
+ height: auto;
43
+ padding-bottom: 20px;
44
+ }
45
+
46
+ /* 컨텐츠 영역만 스크롤되는 레이아웃(타이틀영역 고정) */
47
+ .admin-layout.layout-fixed .admin-content-container {
48
+ overflow: hidden;
49
+ }
50
+ .admin-layout.layout-fixed .page-main-content {
51
+ overflow-y: auto;
52
+ }
53
+ .admin-layout.layout-fixed .bwgview-content-layout {
54
+ padding-bottom: 0;
55
+ }
56
+
57
+ .page-title {
58
+ font-size: 20px;
59
+ color: var(--text-high);
60
+ font-weight: 700;
61
+ }
62
+
63
+ /* 헤더 스타일 */
64
+ .header-wrapper {
65
+ height: 50px !important;
66
+ line-height: 50px !important;
67
+ background: var(--header-bg);
68
+ padding: 0 30px 0 20px;
69
+ border-bottom: 1px solid var(--border-color);
70
+ display: flex;
71
+ justify-content: space-between;
72
+ align-items: center;
73
+ z-index: 1000;
74
+ gap: 24px;
75
+ color: var(--header-text);
76
+ }
77
+ .admin-layout .header-wrapper {
78
+ background: var(--bg-primary);
79
+ }
80
+ /* 헤더 gnb */
81
+ .top-menu-wrap > .ant-menu .ant-menu-title-content {
82
+ color: var(--text-primary);
83
+ font-weight: 500;
84
+ }
85
+ .top-menu-wrap > .ant-menu .ant-menu-item:hover::after,
86
+ .top-menu-wrap > .ant-menu .ant-menu-submenu:hover::after,
87
+ .top-menu-wrap > .ant-menu .ant-menu-submenu:hover .ant-menu-submenu-title,
88
+ .top-menu-wrap > .ant-menu .ant-menu-submenu-open::after {
89
+ border-bottom-color: var(--primary-color);
90
+ }
91
+ .top-menu-wrap > .ant-menu .ant-menu-item:hover .ant-menu-title-content,
92
+ .top-menu-wrap > .ant-menu .ant-menu-submenu:hover .ant-menu-submenu-title,
93
+ .top-menu-wrap > .ant-menu .ant-menu-submenu:hover .ant-menu-title-content,
94
+ .top-menu-wrap > .ant-menu .ant-menu-item:not(.ant-menu-item-selected):not(.ant-menu-submenu-selected):hover,
95
+ .top-menu-wrap > .ant-menu .ant-menu-submenu-open > .ant-menu-submenu-title,
96
+ .top-menu-wrap > .ant-menu .ant-menu-submenu-open > .ant-menu-submenu-title .ant-menu-title-content {
97
+ color: var(--primary-color);
98
+ font-weight: 600;
99
+ }
@@ -26,7 +26,7 @@
26
26
  background: url('./assets/images/logos/krx-logo-full.svg') no-repeat
27
27
  center;
28
28
  background-size: 191px 38px;
29
- margin-bottom: 60px;
29
+ margin-bottom: 70px;
30
30
  }
31
31
 
32
32
  .alert_wrap {
@@ -63,46 +63,6 @@
63
63
  -webkit-box-align: center;
64
64
  -ms-flex-align: center;
65
65
  align-items: center;
66
-
67
- input {
68
- display: block;
69
- width: calc(100% - 100px);
70
- height: 42px;
71
- padding: 0 4px;
72
- font-size: 16px;
73
- font-weight: 600;
74
- color: #4e677a;
75
- border: 0;
76
- border-bottom: 1px solid #ced0d6;
77
- }
78
-
79
- &:first-child {
80
- margin-bottom: 24px;
81
- }
82
- }
83
-
84
- .btn-login {
85
- right: 0;
86
- width: 100%;
87
- height: 40px;
88
- margin: 0;
89
- padding: 0;
90
- border: none;
91
- color: #fff;
92
- text-decoration: none !important;
93
- font-size: var(--font-size-md);
94
- font-weight: 600;
95
- background-color: #6449fc;
96
- -webkit-transition: all 0.3s ease;
97
- -moz-transition: all 0.3s ease;
98
- -o-transition: all 0.3s ease;
99
- transition: all 0.3s ease;
100
- border-radius: 50px;
101
- box-shadow: 0 0 5px rgba(97, 56, 218, 0.2);
102
- &:hover,
103
- &:focus {
104
- background-color: #361bca;
105
- }
106
66
  }
107
67
  }
108
68
  }
@@ -139,14 +99,16 @@
139
99
  -webkit-transition: background-color 9999s ease-out;
140
100
  -webkit-box-shadow: 0 0 0px 1000px white inset !important;
141
101
  }
142
-
143
-
144
-
145
102
  .login-btn-wrap {
146
103
  margin-bottom: 0 !important;
147
104
  margin-top: 30px;
148
105
  }
149
106
 
107
+ .login-form .ant-input-outlined:focus,
108
+ .login-form .ant-input-outlined:focus-within {
109
+ border-color: #bdb1ff;
110
+ box-shadow: 0 0 0 2px rgba(100, 73, 252, 0.1);
111
+ }
150
112
 
151
113
  /* 로그인 페이지 반응형 */
152
114
  @media (max-width: 480px) {
@@ -155,3 +117,4 @@
155
117
  margin: 0 20px;
156
118
  }
157
119
  }
120
+