@bwg-ui/core 1.1.10 → 1.1.12

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 (139) hide show
  1. package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs +3 -0
  2. package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs.map +1 -0
  3. package/dist/chunks/{BwgLargeUploader-B5EtYKUz.js → BwgLargeUploader-Nx2-wiD8.js} +802 -776
  4. package/dist/chunks/BwgLargeUploader-Nx2-wiD8.js.map +1 -0
  5. package/dist/chunks/{FileUtils-CaU9Bzu2.js → FileUtils-Bbz3AvQn.js} +2 -2
  6. package/dist/chunks/{FileUtils-CaU9Bzu2.js.map → FileUtils-Bbz3AvQn.js.map} +1 -1
  7. package/dist/chunks/FileUtils-D73GVmB8.cjs +2 -0
  8. package/dist/chunks/{FileUtils-BweAWoJt.cjs.map → FileUtils-D73GVmB8.cjs.map} +1 -1
  9. package/dist/chunks/SSOHandler-CZHPiuEh.js +25397 -0
  10. package/dist/chunks/SSOHandler-CZHPiuEh.js.map +1 -0
  11. package/dist/chunks/SSOHandler-rq0OGrpX.cjs +236 -0
  12. package/dist/chunks/SSOHandler-rq0OGrpX.cjs.map +1 -0
  13. package/dist/chunks/{SearchBoxContext-CY4tAQcg.js → SearchBoxContext-BxtHF9BO.js} +2 -2
  14. package/dist/chunks/{SearchBoxContext-CY4tAQcg.js.map → SearchBoxContext-BxtHF9BO.js.map} +1 -1
  15. package/dist/chunks/SearchBoxContext-Cpr9xa1S.cjs +2 -0
  16. package/dist/chunks/{SearchBoxContext-DDBY44Wr.cjs.map → SearchBoxContext-Cpr9xa1S.cjs.map} +1 -1
  17. package/dist/chunks/TabContainer-B7-6AQXV.js +254 -0
  18. package/dist/chunks/TabContainer-B7-6AQXV.js.map +1 -0
  19. package/dist/chunks/TabContainer-Dx2PVShz.cjs +36 -0
  20. package/dist/chunks/TabContainer-Dx2PVShz.cjs.map +1 -0
  21. package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs +2 -0
  22. package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.map +1 -0
  23. package/dist/chunks/_commonjsHelpers-DaMA6jEr.js +9 -0
  24. package/dist/chunks/_commonjsHelpers-DaMA6jEr.js.map +1 -0
  25. package/dist/chunks/apiUtils-C45AWfu-.js +957 -0
  26. package/dist/chunks/apiUtils-C45AWfu-.js.map +1 -0
  27. package/dist/chunks/apiUtils-Cbg6NQLv.cjs +4 -0
  28. package/dist/chunks/apiUtils-Cbg6NQLv.cjs.map +1 -0
  29. package/dist/chunks/codeStore-BGLhSpAM.cjs +2 -0
  30. package/dist/chunks/{codeStore-KPL92rcv.cjs.map → codeStore-BGLhSpAM.cjs.map} +1 -1
  31. package/dist/chunks/{codeStore-IIp25egq.js → codeStore-BzT5wSd9.js} +2 -2
  32. package/dist/chunks/{codeStore-IIp25egq.js.map → codeStore-BzT5wSd9.js.map} +1 -1
  33. package/dist/chunks/commonUtils-BH6QwGUb.cjs +2 -0
  34. package/dist/chunks/commonUtils-BH6QwGUb.cjs.map +1 -0
  35. package/dist/chunks/{commonUtils-Cvx6_eK2.js → commonUtils-Bb16Yqjk.js} +24 -25
  36. package/dist/chunks/commonUtils-Bb16Yqjk.js.map +1 -0
  37. package/dist/chunks/envUtils-C9Gf5aek.js.map +1 -1
  38. package/dist/chunks/envUtils-CduTHoHu.cjs.map +1 -1
  39. package/dist/chunks/favoriteStore-3YceyayF.cjs +2 -0
  40. package/dist/chunks/favoriteStore-3YceyayF.cjs.map +1 -0
  41. package/dist/chunks/favoriteStore-C9utQ6sm.js +112 -0
  42. package/dist/chunks/favoriteStore-C9utQ6sm.js.map +1 -0
  43. package/dist/chunks/{popupStore-D8RI04bU.js → popupStore-DmFbkkjd.js} +19 -18
  44. package/dist/chunks/popupStore-DmFbkkjd.js.map +1 -0
  45. package/dist/chunks/popupStore-DnWLaQ70.cjs +2 -0
  46. package/dist/chunks/popupStore-DnWLaQ70.cjs.map +1 -0
  47. package/dist/chunks/usePopup-C8FrbrDD.cjs +2 -0
  48. package/dist/chunks/{UtilsContext-JSHHfnWl.js.map → usePopup-C8FrbrDD.cjs.map} +1 -1
  49. package/dist/chunks/{UtilsContext-JSHHfnWl.js → usePopup-pfh-ajfP.js} +82 -82
  50. package/dist/chunks/usePopup-pfh-ajfP.js.map +1 -0
  51. package/dist/components/common/BwgDetail.d.ts +5 -0
  52. package/dist/components/common/BwgDetail.d.ts.map +1 -0
  53. package/dist/components/common/BwgDrawer.d.ts.map +1 -1
  54. package/dist/components/common/BwgEditor.d.ts +7 -0
  55. package/dist/components/common/BwgEditor.d.ts.map +1 -0
  56. package/dist/components/common/BwgView.d.ts.map +1 -1
  57. package/dist/components/common/index.cjs +1 -1
  58. package/dist/components/common/index.d.ts +3 -1
  59. package/dist/components/common/index.d.ts.map +1 -1
  60. package/dist/components/common/index.js +27 -25
  61. package/dist/components/core/BwgDatePicker.d.ts +1 -1
  62. package/dist/components/core/BwgDatePicker.d.ts.map +1 -1
  63. package/dist/components/core/BwgRangePicker.d.ts +1 -1
  64. package/dist/components/core/BwgRangePicker.d.ts.map +1 -1
  65. package/dist/components/core/BwgUploader.d.ts.map +1 -1
  66. package/dist/components/core/index.cjs +1 -1
  67. package/dist/components/core/index.js +1 -1
  68. package/dist/components/layout/ErrorBound.d.ts +29 -0
  69. package/dist/components/layout/ErrorBound.d.ts.map +1 -0
  70. package/dist/components/layout/TabContainer.d.ts +9 -0
  71. package/dist/components/layout/TabContainer.d.ts.map +1 -0
  72. package/dist/components/layout/index.cjs +1 -1
  73. package/dist/components/layout/index.d.ts +3 -1
  74. package/dist/components/layout/index.d.ts.map +1 -1
  75. package/dist/components/layout/index.js +6 -4
  76. package/dist/index.cjs +1 -1
  77. package/dist/index.js +304 -299
  78. package/dist/provider/index.cjs +1 -1
  79. package/dist/provider/index.js +2 -2
  80. package/dist/stores/favoriteStore.d.ts.map +1 -1
  81. package/dist/stores/index.cjs +1 -1
  82. package/dist/stores/index.cjs.map +1 -1
  83. package/dist/stores/index.d.ts +3 -1
  84. package/dist/stores/index.d.ts.map +1 -1
  85. package/dist/stores/index.js +18 -16
  86. package/dist/stores/index.js.map +1 -1
  87. package/dist/stores/loadingStore.d.ts +9 -0
  88. package/dist/stores/loadingStore.d.ts.map +1 -0
  89. package/dist/stores/menuViewStore.d.ts +28 -3
  90. package/dist/stores/menuViewStore.d.ts.map +1 -1
  91. package/dist/stores/popupStore.d.ts.map +1 -1
  92. package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
  93. package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
  94. package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
  95. package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
  96. package/dist/utils/apiUtils.d.ts +3 -2
  97. package/dist/utils/apiUtils.d.ts.map +1 -1
  98. package/dist/utils/index.cjs +1 -1
  99. package/dist/utils/index.d.ts +1 -0
  100. package/dist/utils/index.d.ts.map +1 -1
  101. package/dist/utils/index.js +3 -3
  102. package/dist/utils/notificationUtils.d.ts +0 -1
  103. package/dist/utils/notificationUtils.d.ts.map +1 -1
  104. package/package.json +6 -7
  105. package/dist/chunks/BwgLargeUploader-B5EtYKUz.js.map +0 -1
  106. package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs +0 -3
  107. package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs.map +0 -1
  108. package/dist/chunks/FileUtils-BweAWoJt.cjs +0 -2
  109. package/dist/chunks/PublicLayout-3v46YZdi.cjs +0 -36
  110. package/dist/chunks/PublicLayout-3v46YZdi.cjs.map +0 -1
  111. package/dist/chunks/PublicLayout-B4wGo0ut.js +0 -139
  112. package/dist/chunks/PublicLayout-B4wGo0ut.js.map +0 -1
  113. package/dist/chunks/SSOHandler-C72Do3RD.js +0 -15717
  114. package/dist/chunks/SSOHandler-C72Do3RD.js.map +0 -1
  115. package/dist/chunks/SSOHandler-ColywAGZ.cjs +0 -184
  116. package/dist/chunks/SSOHandler-ColywAGZ.cjs.map +0 -1
  117. package/dist/chunks/SearchBoxContext-DDBY44Wr.cjs +0 -2
  118. package/dist/chunks/UtilsContext-C4tlOndT.cjs +0 -2
  119. package/dist/chunks/UtilsContext-C4tlOndT.cjs.map +0 -1
  120. package/dist/chunks/_commonjsHelpers-C6fGbg64.js +0 -7
  121. package/dist/chunks/_commonjsHelpers-C6fGbg64.js.map +0 -1
  122. package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs +0 -2
  123. package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs.map +0 -1
  124. package/dist/chunks/codeStore-KPL92rcv.cjs +0 -2
  125. package/dist/chunks/commonUtils-Cvx6_eK2.js.map +0 -1
  126. package/dist/chunks/commonUtils-DaFg0y7C.cjs +0 -2
  127. package/dist/chunks/commonUtils-DaFg0y7C.cjs.map +0 -1
  128. package/dist/chunks/menuViewStore-DuS0VmkB.cjs +0 -3
  129. package/dist/chunks/menuViewStore-DuS0VmkB.cjs.map +0 -1
  130. package/dist/chunks/menuViewStore-OKcSQq-s.js +0 -343
  131. package/dist/chunks/menuViewStore-OKcSQq-s.js.map +0 -1
  132. package/dist/chunks/popupStore-BEoWGajT.cjs +0 -2
  133. package/dist/chunks/popupStore-BEoWGajT.cjs.map +0 -1
  134. package/dist/chunks/popupStore-D8RI04bU.js.map +0 -1
  135. package/dist/chunks/serviceConfig-9dHegQIK.cjs +0 -3
  136. package/dist/chunks/serviceConfig-9dHegQIK.cjs.map +0 -1
  137. package/dist/chunks/serviceConfig-Dhe7neaj.js +0 -709
  138. package/dist/chunks/serviceConfig-Dhe7neaj.js.map +0 -1
  139. package/scripts/gen-component-registry.js +0 -138
@@ -1,6 +1,6 @@
1
1
  import c from "react";
2
2
  import { message as o } from "antd";
3
- import { V as i, a7 as g } from "./serviceConfig-Dhe7neaj.js";
3
+ import { V as i, a7 as g } from "./apiUtils-C45AWfu-.js";
4
4
  const p = (e) => {
5
5
  try {
6
6
  return new URL((/* @__PURE__ */ Object.assign({}))[`../assets/images/backgrounds/${e}`], import.meta.url).href;
@@ -138,4 +138,4 @@ export {
138
138
  D as w,
139
139
  M as x
140
140
  };
141
- //# sourceMappingURL=FileUtils-CaU9Bzu2.js.map
141
+ //# sourceMappingURL=FileUtils-Bbz3AvQn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileUtils-CaU9Bzu2.js","sources":["../../src/utils/imageUtils.ts","../../src/utils/cookieUtils.ts","../../src/utils/messageUtils.ts","../../src/utils/FileUtils.ts"],"sourcesContent":["import React from 'react'\r\n\r\n/**\r\n * 이미지 관리 유틸리티 함수들\r\n */\r\n\r\n// 이미지 타입 정의\r\nexport interface ImageConfig {\r\n src: string\r\n alt: string\r\n width?: number\r\n height?: number\r\n className?: string\r\n}\r\n\r\n// 배경 이미지 설정 함수\r\nexport const getBackgroundImage = (imageName: string): string => {\r\n // 로컬 이미지가 있는 경우 로컬 이미지 사용\r\n try {\r\n return new URL(`../assets/images/backgrounds/${imageName}`, import.meta.url).href\r\n } catch {\r\n // 로컬 이미지가 없는 경우 기본 이미지 반환\r\n return getDefaultBackgroundImage()\r\n }\r\n}\r\n\r\n// 기본 배경 이미지 (제주도 바다)\r\nexport const getDefaultBackgroundImage = (): string => {\r\n return 'https://images.unsplash.com/photo-1578662996442-48f60103fc96?w=1920&h=1080&fit=crop&crop=center'\r\n}\r\n\r\n// 로고 이미지 가져오기\r\nexport const getLogoImage = (logoName: string): string => {\r\n try {\r\n return new URL(`../assets/images/logos/${logoName}`, import.meta.url).href\r\n } catch {\r\n return '/images/default-logo.png'\r\n }\r\n}\r\n\r\n// 아이콘 이미지 가져오기\r\nexport const getIconImage = (iconName: string, category: string = 'common'): string => {\r\n try {\r\n return new URL(`../assets/images/icons/${category}/${iconName}`, import.meta.url).href\r\n } catch {\r\n return `/images/icons/${category}/default.svg`\r\n }\r\n}\r\n\r\n// 아바타 이미지 가져오기\r\nexport const getAvatarImage = (avatarName: string): string => {\r\n try {\r\n return new URL(`../assets/images/avatars/${avatarName}`, import.meta.url).href\r\n } catch {\r\n return '/images/avatars/default.png'\r\n }\r\n}\r\n\r\n// 이미지 로딩 상태 관리\r\nexport const preloadImage = (src: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image()\r\n img.onload = () => resolve()\r\n img.onerror = () => reject(new Error(`Failed to load image: ${src}`))\r\n img.src = src\r\n })\r\n}\r\n\r\n// 이미지 크기 조정 함수\r\nexport const resizeImage = (src: string, width: number, height: number): string => {\r\n // URL에 크기 파라미터 추가\r\n const url = new URL(src)\r\n url.searchParams.set('w', width.toString())\r\n url.searchParams.set('h', height.toString())\r\n return url.toString()\r\n}\r\n\r\n// 이미지 포맷 변환 함수\r\nexport const convertImageFormat = (src: string, format: 'webp' | 'jpg' | 'png'): string => {\r\n const url = new URL(src)\r\n url.searchParams.set('fm', format)\r\n return url.toString()\r\n}\r\n\r\n// 반응형 이미지 srcset 생성\r\nexport const generateSrcSet = (baseSrc: string, sizes: number[]): string => {\r\n return sizes\r\n .map(size => `${resizeImage(baseSrc, size, size)} ${size}w`)\r\n .join(', ')\r\n}\r\n\r\n// 이미지 최적화 설정\r\nexport const getOptimizedImageUrl = (\r\n src: string, \r\n options: {\r\n width?: number\r\n height?: number\r\n format?: 'webp' | 'jpg' | 'png'\r\n quality?: number\r\n } = {}\r\n): string => {\r\n const url = new URL(src)\r\n \r\n if (options.width) url.searchParams.set('w', options.width.toString())\r\n if (options.height) url.searchParams.set('h', options.height.toString())\r\n if (options.format) url.searchParams.set('fm', options.format)\r\n if (options.quality) url.searchParams.set('q', options.quality.toString())\r\n \r\n return url.toString()\r\n}\r\n\r\n// 이미지 에러 처리\r\nexport const handleImageError = (event: React.SyntheticEvent<HTMLImageElement, Event>): void => {\r\n const img = event.target as HTMLImageElement\r\n img.src = '/images/placeholder.png'\r\n img.alt = '이미지를 불러올 수 없습니다'\r\n}\r\n\r\n// 이미지 로딩 상태 훅\r\nexport const useImageLoader = (src: string) => {\r\n const [isLoading, setIsLoading] = React.useState(true)\r\n const [hasError, setHasError] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n setIsLoading(true)\r\n setHasError(false)\r\n\r\n preloadImage(src)\r\n .then(() => setIsLoading(false))\r\n .catch(() => {\r\n setHasError(true)\r\n setIsLoading(false)\r\n })\r\n }, [src])\r\n\r\n return { isLoading, hasError }\r\n} ","// 쿠키 설정\r\nexport const setCookie = (name: string, value: string, days: number = 30) => {\r\n const expires = new Date();\r\n expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\r\n document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/`;\r\n};\r\n\r\n// 쿠키 가져오기\r\nexport const getCookie = (name: string): string | null => {\r\n const nameEQ = name + '=';\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\r\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\r\n }\r\n return null;\r\n};\r\n\r\n// 쿠키 삭제\r\nexport const deleteCookie = (name: string) => {\r\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`;\r\n};\r\n\r\n// 테마 관련 쿠키 상수\r\nexport const THEME_COOKIE_NAME = 'krx_ui_theme';\r\n","import { message } from 'antd';\r\n\r\n/**\r\n * 성공 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showSuccess = (content: string, duration: number = 3) => {\r\n message.success({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 오류 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showError = (content: string, duration: number = 5) => {\r\n message.error({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 경고 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showWarning = (content: string, duration: number = 4) => {\r\n message.warning({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 정보 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showInfo = (content: string, duration: number = 3) => {\r\n message.info({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 로딩 메시지 표시\r\n * @param content 메시지 내용\r\n * @returns 메시지 키 (닫을 때 사용)\r\n */\r\nexport const showLoading = (content: string = '처리중...') => {\r\n return message.loading({\r\n content,\r\n duration: 0, // 수동으로 닫을 때까지 유지\r\n });\r\n};\r\n\r\n/**\r\n * 메시지 닫기\r\n * @param key 메시지 키\r\n */\r\nexport const closeMessage = (key: string) => {\r\n message.destroy(key);\r\n};\r\n\r\n/**\r\n * 모든 메시지 닫기\r\n */\r\nexport const closeAllMessages = () => {\r\n message.destroy();\r\n};\r\n\r\n/**\r\n * API 오류 메시지 표시 (공통)\r\n * @param error 오류 객체\r\n * @param defaultMessage 기본 오류 메시지\r\n */\r\nexport const showApiError = (\r\n error: any,\r\n defaultMessage: string = '처리 중 오류가 발생했습니다.'\r\n) => {\r\n const errorMessage =\r\n error?.response?.data?.message || error?.message || defaultMessage;\r\n showError(errorMessage);\r\n};\r\n\r\n/**\r\n * 저장 성공 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveSuccess = (type: string = '저장') => {\r\n showSuccess(`${type}이 완료되었습니다.`);\r\n};\r\n\r\n/**\r\n * 저장 실패 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveError = (type: string = '저장') => {\r\n showError(`${type} 중 오류가 발생했습니다.`);\r\n};\r\n\r\n/**\r\n * 중복 체크 실패 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showDuplicateError = (fieldName: string) => {\r\n showError(`이미 사용중인 ${fieldName}입니다.`);\r\n};\r\n\r\n/**\r\n * 필수 입력 항목 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showRequiredError = (fieldName: string) => {\r\n showError(`${fieldName}을(를) 입력해주세요.`);\r\n};\r\n","import { callService } from \"./apiUtils\";\nimport { getUserInfo } from \"./userUtils\";\n\n/**\n * 파일 키를 사용하여 파일 상세 정보를 조회하고, 해당 정보를 바탕으로 다운로드를 시작하는 유틸리티 함수입니다.\n *\n * @param fileKey - 조회할 파일의 키 (fileGrpKey)\n * @returns API 호출 결과 또는 오류\n */\nexport async function downloadByFileKey(fileKey: string): Promise<any> {\n try {\n // 1. fileKey를 매개변수로 파일 상세 정보 조회 서비스 호출\n const fileDetailsResponse = await callService(\"SCMFILE00101\", {\n crprCd: getUserInfo().crprCd,\n sysCd: __SYS_CD__,\n fileKey,\n }).then((res) => {\n let response;\n if (res.sub) {\n response = res.sub[0];\n }\n console.log(res);\n console.log(response);\n if (!response.lgclFileNm) {\n console.error(\"논리파일명이 없습니다.\");\n throw new Error(\"논리 파일명 누락\");\n }\n if (!response.filePath) {\n console.error(\"파일 경로가 없습니다.\");\n throw new Error(\"파일 경로 누락\");\n }\n\n // download api 호출\n const downloadUrl = `api/download?filePath=${encodeURIComponent(\n response.filePath\n )}&logicalName=${encodeURIComponent(response.lgclFileNm)}`;\n window.open(downloadUrl, \"_blank\"); // 새 탭에서 열어 다운로드 트리거\n\n return { success: true, message: \"파일 다운로드 요청 성공\" }; // 다운로드 요청 성공을 나타내는 객체 반환\n });\n\n return fileDetailsResponse; // .then() 블록의 결과 반환\n } catch (error) {\n console.error(\"downloadByFileKey 함수 실행 중 오류 발생:\", error);\n throw error;\n }\n}\n"],"names":["getBackgroundImage","imageName","getDefaultBackgroundImage","getLogoImage","logoName","getIconImage","iconName","category","getAvatarImage","avatarName","preloadImage","src","resolve","reject","img","resizeImage","width","height","url","convertImageFormat","format","generateSrcSet","baseSrc","sizes","size","getOptimizedImageUrl","options","handleImageError","event","useImageLoader","isLoading","setIsLoading","React","hasError","setHasError","setCookie","name","value","days","expires","getCookie","nameEQ","ca","i","c","deleteCookie","THEME_COOKIE_NAME","showSuccess","content","duration","message","showError","showLoading","closeMessage","key","closeAllMessages","showApiError","error","defaultMessage","errorMessage","showSaveSuccess","type","showSaveError","showDuplicateError","fieldName","showRequiredError","downloadByFileKey","fileKey","callService","getUserInfo","res","response","downloadUrl"],"mappings":"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"}
1
+ {"version":3,"file":"FileUtils-Bbz3AvQn.js","sources":["../../src/utils/imageUtils.ts","../../src/utils/cookieUtils.ts","../../src/utils/messageUtils.ts","../../src/utils/FileUtils.ts"],"sourcesContent":["import React from 'react'\r\n\r\n/**\r\n * 이미지 관리 유틸리티 함수들\r\n */\r\n\r\n// 이미지 타입 정의\r\nexport interface ImageConfig {\r\n src: string\r\n alt: string\r\n width?: number\r\n height?: number\r\n className?: string\r\n}\r\n\r\n// 배경 이미지 설정 함수\r\nexport const getBackgroundImage = (imageName: string): string => {\r\n // 로컬 이미지가 있는 경우 로컬 이미지 사용\r\n try {\r\n return new URL(`../assets/images/backgrounds/${imageName}`, import.meta.url).href\r\n } catch {\r\n // 로컬 이미지가 없는 경우 기본 이미지 반환\r\n return getDefaultBackgroundImage()\r\n }\r\n}\r\n\r\n// 기본 배경 이미지 (제주도 바다)\r\nexport const getDefaultBackgroundImage = (): string => {\r\n return 'https://images.unsplash.com/photo-1578662996442-48f60103fc96?w=1920&h=1080&fit=crop&crop=center'\r\n}\r\n\r\n// 로고 이미지 가져오기\r\nexport const getLogoImage = (logoName: string): string => {\r\n try {\r\n return new URL(`../assets/images/logos/${logoName}`, import.meta.url).href\r\n } catch {\r\n return '/images/default-logo.png'\r\n }\r\n}\r\n\r\n// 아이콘 이미지 가져오기\r\nexport const getIconImage = (iconName: string, category: string = 'common'): string => {\r\n try {\r\n return new URL(`../assets/images/icons/${category}/${iconName}`, import.meta.url).href\r\n } catch {\r\n return `/images/icons/${category}/default.svg`\r\n }\r\n}\r\n\r\n// 아바타 이미지 가져오기\r\nexport const getAvatarImage = (avatarName: string): string => {\r\n try {\r\n return new URL(`../assets/images/avatars/${avatarName}`, import.meta.url).href\r\n } catch {\r\n return '/images/avatars/default.png'\r\n }\r\n}\r\n\r\n// 이미지 로딩 상태 관리\r\nexport const preloadImage = (src: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image()\r\n img.onload = () => resolve()\r\n img.onerror = () => reject(new Error(`Failed to load image: ${src}`))\r\n img.src = src\r\n })\r\n}\r\n\r\n// 이미지 크기 조정 함수\r\nexport const resizeImage = (src: string, width: number, height: number): string => {\r\n // URL에 크기 파라미터 추가\r\n const url = new URL(src)\r\n url.searchParams.set('w', width.toString())\r\n url.searchParams.set('h', height.toString())\r\n return url.toString()\r\n}\r\n\r\n// 이미지 포맷 변환 함수\r\nexport const convertImageFormat = (src: string, format: 'webp' | 'jpg' | 'png'): string => {\r\n const url = new URL(src)\r\n url.searchParams.set('fm', format)\r\n return url.toString()\r\n}\r\n\r\n// 반응형 이미지 srcset 생성\r\nexport const generateSrcSet = (baseSrc: string, sizes: number[]): string => {\r\n return sizes\r\n .map(size => `${resizeImage(baseSrc, size, size)} ${size}w`)\r\n .join(', ')\r\n}\r\n\r\n// 이미지 최적화 설정\r\nexport const getOptimizedImageUrl = (\r\n src: string, \r\n options: {\r\n width?: number\r\n height?: number\r\n format?: 'webp' | 'jpg' | 'png'\r\n quality?: number\r\n } = {}\r\n): string => {\r\n const url = new URL(src)\r\n \r\n if (options.width) url.searchParams.set('w', options.width.toString())\r\n if (options.height) url.searchParams.set('h', options.height.toString())\r\n if (options.format) url.searchParams.set('fm', options.format)\r\n if (options.quality) url.searchParams.set('q', options.quality.toString())\r\n \r\n return url.toString()\r\n}\r\n\r\n// 이미지 에러 처리\r\nexport const handleImageError = (event: React.SyntheticEvent<HTMLImageElement, Event>): void => {\r\n const img = event.target as HTMLImageElement\r\n img.src = '/images/placeholder.png'\r\n img.alt = '이미지를 불러올 수 없습니다'\r\n}\r\n\r\n// 이미지 로딩 상태 훅\r\nexport const useImageLoader = (src: string) => {\r\n const [isLoading, setIsLoading] = React.useState(true)\r\n const [hasError, setHasError] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n setIsLoading(true)\r\n setHasError(false)\r\n\r\n preloadImage(src)\r\n .then(() => setIsLoading(false))\r\n .catch(() => {\r\n setHasError(true)\r\n setIsLoading(false)\r\n })\r\n }, [src])\r\n\r\n return { isLoading, hasError }\r\n} ","// 쿠키 설정\r\nexport const setCookie = (name: string, value: string, days: number = 30) => {\r\n const expires = new Date();\r\n expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\r\n document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/`;\r\n};\r\n\r\n// 쿠키 가져오기\r\nexport const getCookie = (name: string): string | null => {\r\n const nameEQ = name + '=';\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\r\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\r\n }\r\n return null;\r\n};\r\n\r\n// 쿠키 삭제\r\nexport const deleteCookie = (name: string) => {\r\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`;\r\n};\r\n\r\n// 테마 관련 쿠키 상수\r\nexport const THEME_COOKIE_NAME = 'krx_ui_theme';\r\n","import { message } from 'antd';\r\n\r\n/**\r\n * 성공 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showSuccess = (content: string, duration: number = 3) => {\r\n message.success({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 오류 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showError = (content: string, duration: number = 5) => {\r\n message.error({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 경고 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showWarning = (content: string, duration: number = 4) => {\r\n message.warning({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 정보 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showInfo = (content: string, duration: number = 3) => {\r\n message.info({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 로딩 메시지 표시\r\n * @param content 메시지 내용\r\n * @returns 메시지 키 (닫을 때 사용)\r\n */\r\nexport const showLoading = (content: string = '처리중...') => {\r\n return message.loading({\r\n content,\r\n duration: 0, // 수동으로 닫을 때까지 유지\r\n });\r\n};\r\n\r\n/**\r\n * 메시지 닫기\r\n * @param key 메시지 키\r\n */\r\nexport const closeMessage = (key: string) => {\r\n message.destroy(key);\r\n};\r\n\r\n/**\r\n * 모든 메시지 닫기\r\n */\r\nexport const closeAllMessages = () => {\r\n message.destroy();\r\n};\r\n\r\n/**\r\n * API 오류 메시지 표시 (공통)\r\n * @param error 오류 객체\r\n * @param defaultMessage 기본 오류 메시지\r\n */\r\nexport const showApiError = (\r\n error: any,\r\n defaultMessage: string = '처리 중 오류가 발생했습니다.'\r\n) => {\r\n const errorMessage =\r\n error?.response?.data?.message || error?.message || defaultMessage;\r\n showError(errorMessage);\r\n};\r\n\r\n/**\r\n * 저장 성공 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveSuccess = (type: string = '저장') => {\r\n showSuccess(`${type}이 완료되었습니다.`);\r\n};\r\n\r\n/**\r\n * 저장 실패 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveError = (type: string = '저장') => {\r\n showError(`${type} 중 오류가 발생했습니다.`);\r\n};\r\n\r\n/**\r\n * 중복 체크 실패 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showDuplicateError = (fieldName: string) => {\r\n showError(`이미 사용중인 ${fieldName}입니다.`);\r\n};\r\n\r\n/**\r\n * 필수 입력 항목 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showRequiredError = (fieldName: string) => {\r\n showError(`${fieldName}을(를) 입력해주세요.`);\r\n};\r\n","import { callService } from \"./apiUtils\";\r\nimport { getUserInfo } from \"./userUtils\";\r\n\r\n/**\r\n * 파일 키를 사용하여 파일 상세 정보를 조회하고, 해당 정보를 바탕으로 다운로드를 시작하는 유틸리티 함수입니다.\r\n *\r\n * @param fileKey - 조회할 파일의 키 (fileGrpKey)\r\n * @returns API 호출 결과 또는 오류\r\n */\r\nexport async function downloadByFileKey(fileKey: string): Promise<any> {\r\n try {\r\n // 1. fileKey를 매개변수로 파일 상세 정보 조회 서비스 호출\r\n const fileDetailsResponse = await callService(\"SCMFILE00101\", {\r\n crprCd: getUserInfo().crprCd,\r\n sysCd: __SYS_CD__,\r\n fileKey,\r\n }).then((res) => {\r\n let response;\r\n if (res.sub) {\r\n response = res.sub[0];\r\n }\r\n console.log(res);\r\n console.log(response);\r\n if (!response.lgclFileNm) {\r\n console.error(\"논리파일명이 없습니다.\");\r\n throw new Error(\"논리 파일명 누락\");\r\n }\r\n if (!response.filePath) {\r\n console.error(\"파일 경로가 없습니다.\");\r\n throw new Error(\"파일 경로 누락\");\r\n }\r\n\r\n // download api 호출\r\n const downloadUrl = `api/download?filePath=${encodeURIComponent(\r\n response.filePath\r\n )}&logicalName=${encodeURIComponent(response.lgclFileNm)}`;\r\n window.open(downloadUrl, \"_blank\"); // 새 탭에서 열어 다운로드 트리거\r\n\r\n return { success: true, message: \"파일 다운로드 요청 성공\" }; // 다운로드 요청 성공을 나타내는 객체 반환\r\n });\r\n\r\n return fileDetailsResponse; // .then() 블록의 결과 반환\r\n } catch (error) {\r\n console.error(\"downloadByFileKey 함수 실행 중 오류 발생:\", error);\r\n throw error;\r\n }\r\n}\r\n"],"names":["getBackgroundImage","imageName","getDefaultBackgroundImage","getLogoImage","logoName","getIconImage","iconName","category","getAvatarImage","avatarName","preloadImage","src","resolve","reject","img","resizeImage","width","height","url","convertImageFormat","format","generateSrcSet","baseSrc","sizes","size","getOptimizedImageUrl","options","handleImageError","event","useImageLoader","isLoading","setIsLoading","React","hasError","setHasError","setCookie","name","value","days","expires","getCookie","nameEQ","ca","i","c","deleteCookie","THEME_COOKIE_NAME","showSuccess","content","duration","message","showError","showLoading","closeMessage","key","closeAllMessages","showApiError","error","defaultMessage","errorMessage","showSaveSuccess","type","showSaveError","showDuplicateError","fieldName","showRequiredError","downloadByFileKey","fileKey","callService","getUserInfo","res","response","downloadUrl"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("react"),n=require("antd"),g=require("./apiUtils-Cbg6NQLv.cjs");var a=typeof document<"u"?document.currentScript:null;const h=e=>{try{return new URL(Object.assign({})[`../assets/images/backgrounds/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-D73GVmB8.cjs",document.baseURI).href).href}catch{return l()}},l=()=>"https://images.unsplash.com/photo-1578662996442-48f60103fc96?w=1920&h=1080&fit=crop&crop=center",d=e=>{try{return new URL(Object.assign({})[`../assets/images/logos/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-D73GVmB8.cjs",document.baseURI).href).href}catch{return"/images/default-logo.png"}},f=(e,t="common")=>{try{return new URL(Object.assign({})[`../assets/images/icons/${t}/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-D73GVmB8.cjs",document.baseURI).href).href}catch{return`/images/icons/${t}/default.svg`}},w=e=>{try{return new URL(Object.assign({})[`../assets/images/avatars/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-D73GVmB8.cjs",document.baseURI).href).href}catch{return"/images/avatars/default.png"}},u=e=>new Promise((t,r)=>{const s=new Image;s.onload=()=>t(),s.onerror=()=>r(new Error(`Failed to load image: ${e}`)),s.src=e}),m=(e,t,r)=>{const s=new URL(e);return s.searchParams.set("w",t.toString()),s.searchParams.set("h",r.toString()),s.toString()},p=(e,t)=>{const r=new URL(e);return r.searchParams.set("fm",t),r.toString()},I=(e,t)=>t.map(r=>`${m(e,r,r)} ${r}w`).join(", "),U=(e,t={})=>{const r=new URL(e);return t.width&&r.searchParams.set("w",t.width.toString()),t.height&&r.searchParams.set("h",t.height.toString()),t.format&&r.searchParams.set("fm",t.format),t.quality&&r.searchParams.set("q",t.quality.toString()),r.toString()},S=e=>{const t=e.target;t.src="/images/placeholder.png",t.alt="이미지를 불러올 수 없습니다"},R=e=>{const[t,r]=i.useState(!0),[s,o]=i.useState(!1);return i.useEffect(()=>{r(!0),o(!1),u(e).then(()=>r(!1)).catch(()=>{o(!0),r(!1)})},[e]),{isLoading:t,hasError:s}},E=(e,t,r=30)=>{const s=new Date;s.setTime(s.getTime()+r*24*60*60*1e3),document.cookie=`${e}=${t};expires=${s.toUTCString()};path=/`},C=e=>{const t=e+"=",r=document.cookie.split(";");for(let s=0;s<r.length;s++){let o=r[s];for(;o.charAt(0)===" ";)o=o.substring(1,o.length);if(o.indexOf(t)===0)return o.substring(t.length,o.length)}return null},L=e=>{document.cookie=`${e}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`},y="krx_ui_theme",_=(e,t=3)=>{n.message.success({content:e,duration:t})},c=(e,t=5)=>{n.message.error({content:e,duration:t})},k=(e="처리중...")=>n.message.loading({content:e,duration:0}),$=e=>{n.message.destroy(e)},F=()=>{n.message.destroy()},P=(e,t="처리 중 오류가 발생했습니다.")=>{const r=e?.response?.data?.message||e?.message||t;c(r)},T=(e="저장")=>{_(`${e}이 완료되었습니다.`)},b=(e="저장")=>{c(`${e} 중 오류가 발생했습니다.`)},v=e=>{c(`이미 사용중인 ${e}입니다.`)},q=e=>{c(`${e}을(를) 입력해주세요.`)};async function O(e){try{return await g.callService("SCMFILE00101",{crprCd:g.getUserInfo().crprCd,sysCd:__SYS_CD__,fileKey:e}).then(r=>{let s;if(r.sub&&(s=r.sub[0]),console.log(r),console.log(s),!s.lgclFileNm)throw console.error("논리파일명이 없습니다."),new Error("논리 파일명 누락");if(!s.filePath)throw console.error("파일 경로가 없습니다."),new Error("파일 경로 누락");const o=`api/download?filePath=${encodeURIComponent(s.filePath)}&logicalName=${encodeURIComponent(s.lgclFileNm)}`;return window.open(o,"_blank"),{success:!0,message:"파일 다운로드 요청 성공"}})}catch(t){throw console.error("downloadByFileKey 함수 실행 중 오류 발생:",t),t}}exports.THEME_COOKIE_NAME=y;exports.closeAllMessages=F;exports.closeMessage=$;exports.convertImageFormat=p;exports.deleteCookie=L;exports.downloadByFileKey=O;exports.generateSrcSet=I;exports.getAvatarImage=w;exports.getBackgroundImage=h;exports.getCookie=C;exports.getDefaultBackgroundImage=l;exports.getIconImage=f;exports.getLogoImage=d;exports.getOptimizedImageUrl=U;exports.handleImageError=S;exports.preloadImage=u;exports.resizeImage=m;exports.setCookie=E;exports.showApiError=P;exports.showDuplicateError=v;exports.showLoading=k;exports.showRequiredError=q;exports.showSaveError=b;exports.showSaveSuccess=T;exports.useImageLoader=R;
2
+ //# sourceMappingURL=FileUtils-D73GVmB8.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileUtils-BweAWoJt.cjs","sources":["../../src/utils/imageUtils.ts","../../src/utils/cookieUtils.ts","../../src/utils/messageUtils.ts","../../src/utils/FileUtils.ts"],"sourcesContent":["import React from 'react'\r\n\r\n/**\r\n * 이미지 관리 유틸리티 함수들\r\n */\r\n\r\n// 이미지 타입 정의\r\nexport interface ImageConfig {\r\n src: string\r\n alt: string\r\n width?: number\r\n height?: number\r\n className?: string\r\n}\r\n\r\n// 배경 이미지 설정 함수\r\nexport const getBackgroundImage = (imageName: string): string => {\r\n // 로컬 이미지가 있는 경우 로컬 이미지 사용\r\n try {\r\n return new URL(`../assets/images/backgrounds/${imageName}`, import.meta.url).href\r\n } catch {\r\n // 로컬 이미지가 없는 경우 기본 이미지 반환\r\n return getDefaultBackgroundImage()\r\n }\r\n}\r\n\r\n// 기본 배경 이미지 (제주도 바다)\r\nexport const getDefaultBackgroundImage = (): string => {\r\n return 'https://images.unsplash.com/photo-1578662996442-48f60103fc96?w=1920&h=1080&fit=crop&crop=center'\r\n}\r\n\r\n// 로고 이미지 가져오기\r\nexport const getLogoImage = (logoName: string): string => {\r\n try {\r\n return new URL(`../assets/images/logos/${logoName}`, import.meta.url).href\r\n } catch {\r\n return '/images/default-logo.png'\r\n }\r\n}\r\n\r\n// 아이콘 이미지 가져오기\r\nexport const getIconImage = (iconName: string, category: string = 'common'): string => {\r\n try {\r\n return new URL(`../assets/images/icons/${category}/${iconName}`, import.meta.url).href\r\n } catch {\r\n return `/images/icons/${category}/default.svg`\r\n }\r\n}\r\n\r\n// 아바타 이미지 가져오기\r\nexport const getAvatarImage = (avatarName: string): string => {\r\n try {\r\n return new URL(`../assets/images/avatars/${avatarName}`, import.meta.url).href\r\n } catch {\r\n return '/images/avatars/default.png'\r\n }\r\n}\r\n\r\n// 이미지 로딩 상태 관리\r\nexport const preloadImage = (src: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image()\r\n img.onload = () => resolve()\r\n img.onerror = () => reject(new Error(`Failed to load image: ${src}`))\r\n img.src = src\r\n })\r\n}\r\n\r\n// 이미지 크기 조정 함수\r\nexport const resizeImage = (src: string, width: number, height: number): string => {\r\n // URL에 크기 파라미터 추가\r\n const url = new URL(src)\r\n url.searchParams.set('w', width.toString())\r\n url.searchParams.set('h', height.toString())\r\n return url.toString()\r\n}\r\n\r\n// 이미지 포맷 변환 함수\r\nexport const convertImageFormat = (src: string, format: 'webp' | 'jpg' | 'png'): string => {\r\n const url = new URL(src)\r\n url.searchParams.set('fm', format)\r\n return url.toString()\r\n}\r\n\r\n// 반응형 이미지 srcset 생성\r\nexport const generateSrcSet = (baseSrc: string, sizes: number[]): string => {\r\n return sizes\r\n .map(size => `${resizeImage(baseSrc, size, size)} ${size}w`)\r\n .join(', ')\r\n}\r\n\r\n// 이미지 최적화 설정\r\nexport const getOptimizedImageUrl = (\r\n src: string, \r\n options: {\r\n width?: number\r\n height?: number\r\n format?: 'webp' | 'jpg' | 'png'\r\n quality?: number\r\n } = {}\r\n): string => {\r\n const url = new URL(src)\r\n \r\n if (options.width) url.searchParams.set('w', options.width.toString())\r\n if (options.height) url.searchParams.set('h', options.height.toString())\r\n if (options.format) url.searchParams.set('fm', options.format)\r\n if (options.quality) url.searchParams.set('q', options.quality.toString())\r\n \r\n return url.toString()\r\n}\r\n\r\n// 이미지 에러 처리\r\nexport const handleImageError = (event: React.SyntheticEvent<HTMLImageElement, Event>): void => {\r\n const img = event.target as HTMLImageElement\r\n img.src = '/images/placeholder.png'\r\n img.alt = '이미지를 불러올 수 없습니다'\r\n}\r\n\r\n// 이미지 로딩 상태 훅\r\nexport const useImageLoader = (src: string) => {\r\n const [isLoading, setIsLoading] = React.useState(true)\r\n const [hasError, setHasError] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n setIsLoading(true)\r\n setHasError(false)\r\n\r\n preloadImage(src)\r\n .then(() => setIsLoading(false))\r\n .catch(() => {\r\n setHasError(true)\r\n setIsLoading(false)\r\n })\r\n }, [src])\r\n\r\n return { isLoading, hasError }\r\n} ","// 쿠키 설정\r\nexport const setCookie = (name: string, value: string, days: number = 30) => {\r\n const expires = new Date();\r\n expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\r\n document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/`;\r\n};\r\n\r\n// 쿠키 가져오기\r\nexport const getCookie = (name: string): string | null => {\r\n const nameEQ = name + '=';\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\r\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\r\n }\r\n return null;\r\n};\r\n\r\n// 쿠키 삭제\r\nexport const deleteCookie = (name: string) => {\r\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`;\r\n};\r\n\r\n// 테마 관련 쿠키 상수\r\nexport const THEME_COOKIE_NAME = 'krx_ui_theme';\r\n","import { message } from 'antd';\r\n\r\n/**\r\n * 성공 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showSuccess = (content: string, duration: number = 3) => {\r\n message.success({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 오류 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showError = (content: string, duration: number = 5) => {\r\n message.error({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 경고 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showWarning = (content: string, duration: number = 4) => {\r\n message.warning({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 정보 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showInfo = (content: string, duration: number = 3) => {\r\n message.info({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 로딩 메시지 표시\r\n * @param content 메시지 내용\r\n * @returns 메시지 키 (닫을 때 사용)\r\n */\r\nexport const showLoading = (content: string = '처리중...') => {\r\n return message.loading({\r\n content,\r\n duration: 0, // 수동으로 닫을 때까지 유지\r\n });\r\n};\r\n\r\n/**\r\n * 메시지 닫기\r\n * @param key 메시지 키\r\n */\r\nexport const closeMessage = (key: string) => {\r\n message.destroy(key);\r\n};\r\n\r\n/**\r\n * 모든 메시지 닫기\r\n */\r\nexport const closeAllMessages = () => {\r\n message.destroy();\r\n};\r\n\r\n/**\r\n * API 오류 메시지 표시 (공통)\r\n * @param error 오류 객체\r\n * @param defaultMessage 기본 오류 메시지\r\n */\r\nexport const showApiError = (\r\n error: any,\r\n defaultMessage: string = '처리 중 오류가 발생했습니다.'\r\n) => {\r\n const errorMessage =\r\n error?.response?.data?.message || error?.message || defaultMessage;\r\n showError(errorMessage);\r\n};\r\n\r\n/**\r\n * 저장 성공 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveSuccess = (type: string = '저장') => {\r\n showSuccess(`${type}이 완료되었습니다.`);\r\n};\r\n\r\n/**\r\n * 저장 실패 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveError = (type: string = '저장') => {\r\n showError(`${type} 중 오류가 발생했습니다.`);\r\n};\r\n\r\n/**\r\n * 중복 체크 실패 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showDuplicateError = (fieldName: string) => {\r\n showError(`이미 사용중인 ${fieldName}입니다.`);\r\n};\r\n\r\n/**\r\n * 필수 입력 항목 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showRequiredError = (fieldName: string) => {\r\n showError(`${fieldName}을(를) 입력해주세요.`);\r\n};\r\n","import { callService } from \"./apiUtils\";\nimport { getUserInfo } from \"./userUtils\";\n\n/**\n * 파일 키를 사용하여 파일 상세 정보를 조회하고, 해당 정보를 바탕으로 다운로드를 시작하는 유틸리티 함수입니다.\n *\n * @param fileKey - 조회할 파일의 키 (fileGrpKey)\n * @returns API 호출 결과 또는 오류\n */\nexport async function downloadByFileKey(fileKey: string): Promise<any> {\n try {\n // 1. fileKey를 매개변수로 파일 상세 정보 조회 서비스 호출\n const fileDetailsResponse = await callService(\"SCMFILE00101\", {\n crprCd: getUserInfo().crprCd,\n sysCd: __SYS_CD__,\n fileKey,\n }).then((res) => {\n let response;\n if (res.sub) {\n response = res.sub[0];\n }\n console.log(res);\n console.log(response);\n if (!response.lgclFileNm) {\n console.error(\"논리파일명이 없습니다.\");\n throw new Error(\"논리 파일명 누락\");\n }\n if (!response.filePath) {\n console.error(\"파일 경로가 없습니다.\");\n throw new Error(\"파일 경로 누락\");\n }\n\n // download api 호출\n const downloadUrl = `api/download?filePath=${encodeURIComponent(\n response.filePath\n )}&logicalName=${encodeURIComponent(response.lgclFileNm)}`;\n window.open(downloadUrl, \"_blank\"); // 새 탭에서 열어 다운로드 트리거\n\n return { success: true, message: \"파일 다운로드 요청 성공\" }; // 다운로드 요청 성공을 나타내는 객체 반환\n });\n\n return fileDetailsResponse; // .then() 블록의 결과 반환\n } catch (error) {\n console.error(\"downloadByFileKey 함수 실행 중 오류 발생:\", error);\n throw error;\n }\n}\n"],"names":["getBackgroundImage","imageName","_documentCurrentScript","getDefaultBackgroundImage","getLogoImage","logoName","getIconImage","iconName","category","getAvatarImage","avatarName","preloadImage","src","resolve","reject","img","resizeImage","width","height","url","convertImageFormat","format","generateSrcSet","baseSrc","sizes","size","getOptimizedImageUrl","options","handleImageError","event","useImageLoader","isLoading","setIsLoading","React","hasError","setHasError","setCookie","name","value","days","expires","getCookie","nameEQ","ca","i","c","deleteCookie","THEME_COOKIE_NAME","showSuccess","content","duration","message","showError","showLoading","closeMessage","key","closeAllMessages","showApiError","error","defaultMessage","errorMessage","showSaveSuccess","type","showSaveError","showDuplicateError","fieldName","showRequiredError","downloadByFileKey","fileKey","callService","getUserInfo","res","response","downloadUrl"],"mappings":"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"}
1
+ {"version":3,"file":"FileUtils-D73GVmB8.cjs","sources":["../../src/utils/imageUtils.ts","../../src/utils/cookieUtils.ts","../../src/utils/messageUtils.ts","../../src/utils/FileUtils.ts"],"sourcesContent":["import React from 'react'\r\n\r\n/**\r\n * 이미지 관리 유틸리티 함수들\r\n */\r\n\r\n// 이미지 타입 정의\r\nexport interface ImageConfig {\r\n src: string\r\n alt: string\r\n width?: number\r\n height?: number\r\n className?: string\r\n}\r\n\r\n// 배경 이미지 설정 함수\r\nexport const getBackgroundImage = (imageName: string): string => {\r\n // 로컬 이미지가 있는 경우 로컬 이미지 사용\r\n try {\r\n return new URL(`../assets/images/backgrounds/${imageName}`, import.meta.url).href\r\n } catch {\r\n // 로컬 이미지가 없는 경우 기본 이미지 반환\r\n return getDefaultBackgroundImage()\r\n }\r\n}\r\n\r\n// 기본 배경 이미지 (제주도 바다)\r\nexport const getDefaultBackgroundImage = (): string => {\r\n return 'https://images.unsplash.com/photo-1578662996442-48f60103fc96?w=1920&h=1080&fit=crop&crop=center'\r\n}\r\n\r\n// 로고 이미지 가져오기\r\nexport const getLogoImage = (logoName: string): string => {\r\n try {\r\n return new URL(`../assets/images/logos/${logoName}`, import.meta.url).href\r\n } catch {\r\n return '/images/default-logo.png'\r\n }\r\n}\r\n\r\n// 아이콘 이미지 가져오기\r\nexport const getIconImage = (iconName: string, category: string = 'common'): string => {\r\n try {\r\n return new URL(`../assets/images/icons/${category}/${iconName}`, import.meta.url).href\r\n } catch {\r\n return `/images/icons/${category}/default.svg`\r\n }\r\n}\r\n\r\n// 아바타 이미지 가져오기\r\nexport const getAvatarImage = (avatarName: string): string => {\r\n try {\r\n return new URL(`../assets/images/avatars/${avatarName}`, import.meta.url).href\r\n } catch {\r\n return '/images/avatars/default.png'\r\n }\r\n}\r\n\r\n// 이미지 로딩 상태 관리\r\nexport const preloadImage = (src: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image()\r\n img.onload = () => resolve()\r\n img.onerror = () => reject(new Error(`Failed to load image: ${src}`))\r\n img.src = src\r\n })\r\n}\r\n\r\n// 이미지 크기 조정 함수\r\nexport const resizeImage = (src: string, width: number, height: number): string => {\r\n // URL에 크기 파라미터 추가\r\n const url = new URL(src)\r\n url.searchParams.set('w', width.toString())\r\n url.searchParams.set('h', height.toString())\r\n return url.toString()\r\n}\r\n\r\n// 이미지 포맷 변환 함수\r\nexport const convertImageFormat = (src: string, format: 'webp' | 'jpg' | 'png'): string => {\r\n const url = new URL(src)\r\n url.searchParams.set('fm', format)\r\n return url.toString()\r\n}\r\n\r\n// 반응형 이미지 srcset 생성\r\nexport const generateSrcSet = (baseSrc: string, sizes: number[]): string => {\r\n return sizes\r\n .map(size => `${resizeImage(baseSrc, size, size)} ${size}w`)\r\n .join(', ')\r\n}\r\n\r\n// 이미지 최적화 설정\r\nexport const getOptimizedImageUrl = (\r\n src: string, \r\n options: {\r\n width?: number\r\n height?: number\r\n format?: 'webp' | 'jpg' | 'png'\r\n quality?: number\r\n } = {}\r\n): string => {\r\n const url = new URL(src)\r\n \r\n if (options.width) url.searchParams.set('w', options.width.toString())\r\n if (options.height) url.searchParams.set('h', options.height.toString())\r\n if (options.format) url.searchParams.set('fm', options.format)\r\n if (options.quality) url.searchParams.set('q', options.quality.toString())\r\n \r\n return url.toString()\r\n}\r\n\r\n// 이미지 에러 처리\r\nexport const handleImageError = (event: React.SyntheticEvent<HTMLImageElement, Event>): void => {\r\n const img = event.target as HTMLImageElement\r\n img.src = '/images/placeholder.png'\r\n img.alt = '이미지를 불러올 수 없습니다'\r\n}\r\n\r\n// 이미지 로딩 상태 훅\r\nexport const useImageLoader = (src: string) => {\r\n const [isLoading, setIsLoading] = React.useState(true)\r\n const [hasError, setHasError] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n setIsLoading(true)\r\n setHasError(false)\r\n\r\n preloadImage(src)\r\n .then(() => setIsLoading(false))\r\n .catch(() => {\r\n setHasError(true)\r\n setIsLoading(false)\r\n })\r\n }, [src])\r\n\r\n return { isLoading, hasError }\r\n} ","// 쿠키 설정\r\nexport const setCookie = (name: string, value: string, days: number = 30) => {\r\n const expires = new Date();\r\n expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\r\n document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/`;\r\n};\r\n\r\n// 쿠키 가져오기\r\nexport const getCookie = (name: string): string | null => {\r\n const nameEQ = name + '=';\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\r\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\r\n }\r\n return null;\r\n};\r\n\r\n// 쿠키 삭제\r\nexport const deleteCookie = (name: string) => {\r\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`;\r\n};\r\n\r\n// 테마 관련 쿠키 상수\r\nexport const THEME_COOKIE_NAME = 'krx_ui_theme';\r\n","import { message } from 'antd';\r\n\r\n/**\r\n * 성공 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showSuccess = (content: string, duration: number = 3) => {\r\n message.success({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 오류 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showError = (content: string, duration: number = 5) => {\r\n message.error({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 경고 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showWarning = (content: string, duration: number = 4) => {\r\n message.warning({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 정보 메시지 표시\r\n * @param content 메시지 내용\r\n * @param duration 표시 시간 (초)\r\n */\r\nexport const showInfo = (content: string, duration: number = 3) => {\r\n message.info({\r\n content,\r\n duration,\r\n });\r\n};\r\n\r\n/**\r\n * 로딩 메시지 표시\r\n * @param content 메시지 내용\r\n * @returns 메시지 키 (닫을 때 사용)\r\n */\r\nexport const showLoading = (content: string = '처리중...') => {\r\n return message.loading({\r\n content,\r\n duration: 0, // 수동으로 닫을 때까지 유지\r\n });\r\n};\r\n\r\n/**\r\n * 메시지 닫기\r\n * @param key 메시지 키\r\n */\r\nexport const closeMessage = (key: string) => {\r\n message.destroy(key);\r\n};\r\n\r\n/**\r\n * 모든 메시지 닫기\r\n */\r\nexport const closeAllMessages = () => {\r\n message.destroy();\r\n};\r\n\r\n/**\r\n * API 오류 메시지 표시 (공통)\r\n * @param error 오류 객체\r\n * @param defaultMessage 기본 오류 메시지\r\n */\r\nexport const showApiError = (\r\n error: any,\r\n defaultMessage: string = '처리 중 오류가 발생했습니다.'\r\n) => {\r\n const errorMessage =\r\n error?.response?.data?.message || error?.message || defaultMessage;\r\n showError(errorMessage);\r\n};\r\n\r\n/**\r\n * 저장 성공 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveSuccess = (type: string = '저장') => {\r\n showSuccess(`${type}이 완료되었습니다.`);\r\n};\r\n\r\n/**\r\n * 저장 실패 메시지 표시\r\n * @param type 저장 타입 ('등록', '수정', '삭제' 등)\r\n */\r\nexport const showSaveError = (type: string = '저장') => {\r\n showError(`${type} 중 오류가 발생했습니다.`);\r\n};\r\n\r\n/**\r\n * 중복 체크 실패 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showDuplicateError = (fieldName: string) => {\r\n showError(`이미 사용중인 ${fieldName}입니다.`);\r\n};\r\n\r\n/**\r\n * 필수 입력 항목 메시지 표시\r\n * @param fieldName 필드명\r\n */\r\nexport const showRequiredError = (fieldName: string) => {\r\n showError(`${fieldName}을(를) 입력해주세요.`);\r\n};\r\n","import { callService } from \"./apiUtils\";\r\nimport { getUserInfo } from \"./userUtils\";\r\n\r\n/**\r\n * 파일 키를 사용하여 파일 상세 정보를 조회하고, 해당 정보를 바탕으로 다운로드를 시작하는 유틸리티 함수입니다.\r\n *\r\n * @param fileKey - 조회할 파일의 키 (fileGrpKey)\r\n * @returns API 호출 결과 또는 오류\r\n */\r\nexport async function downloadByFileKey(fileKey: string): Promise<any> {\r\n try {\r\n // 1. fileKey를 매개변수로 파일 상세 정보 조회 서비스 호출\r\n const fileDetailsResponse = await callService(\"SCMFILE00101\", {\r\n crprCd: getUserInfo().crprCd,\r\n sysCd: __SYS_CD__,\r\n fileKey,\r\n }).then((res) => {\r\n let response;\r\n if (res.sub) {\r\n response = res.sub[0];\r\n }\r\n console.log(res);\r\n console.log(response);\r\n if (!response.lgclFileNm) {\r\n console.error(\"논리파일명이 없습니다.\");\r\n throw new Error(\"논리 파일명 누락\");\r\n }\r\n if (!response.filePath) {\r\n console.error(\"파일 경로가 없습니다.\");\r\n throw new Error(\"파일 경로 누락\");\r\n }\r\n\r\n // download api 호출\r\n const downloadUrl = `api/download?filePath=${encodeURIComponent(\r\n response.filePath\r\n )}&logicalName=${encodeURIComponent(response.lgclFileNm)}`;\r\n window.open(downloadUrl, \"_blank\"); // 새 탭에서 열어 다운로드 트리거\r\n\r\n return { success: true, message: \"파일 다운로드 요청 성공\" }; // 다운로드 요청 성공을 나타내는 객체 반환\r\n });\r\n\r\n return fileDetailsResponse; // .then() 블록의 결과 반환\r\n } catch (error) {\r\n console.error(\"downloadByFileKey 함수 실행 중 오류 발생:\", error);\r\n throw error;\r\n }\r\n}\r\n"],"names":["getBackgroundImage","imageName","_documentCurrentScript","getDefaultBackgroundImage","getLogoImage","logoName","getIconImage","iconName","category","getAvatarImage","avatarName","preloadImage","src","resolve","reject","img","resizeImage","width","height","url","convertImageFormat","format","generateSrcSet","baseSrc","sizes","size","getOptimizedImageUrl","options","handleImageError","event","useImageLoader","isLoading","setIsLoading","React","hasError","setHasError","setCookie","name","value","days","expires","getCookie","nameEQ","ca","i","c","deleteCookie","THEME_COOKIE_NAME","showSuccess","content","duration","message","showError","showLoading","closeMessage","key","closeAllMessages","showApiError","error","defaultMessage","errorMessage","showSaveSuccess","type","showSaveError","showDuplicateError","fieldName","showRequiredError","downloadByFileKey","fileKey","callService","getUserInfo","res","response","downloadUrl"],"mappings":"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"}