@bwg-ui/core 1.3.7 → 1.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/dist/chunks/CMPrgrMstrP02-CIPnCdt3.cjs +1 -0
  2. package/dist/chunks/CMPrgrMstrP02-jC3zDeFU.js +154 -0
  3. package/dist/chunks/CMSearchIntfGwP01-D4qj6J2N.cjs +1 -0
  4. package/dist/chunks/{CMSearchIntfGwP01-DCHZJn2H.js → CMSearchIntfGwP01-DzTHXQi3.js} +31 -31
  5. package/dist/chunks/MenuReport-BtP1uAmq.cjs +1 -0
  6. package/dist/chunks/{MenuReport-IBdoU2S3.js → MenuReport-DgMjx5Hs.js} +5 -5
  7. package/dist/chunks/SearchAddressP01-B25Exa9E.cjs +1 -0
  8. package/dist/chunks/SearchAddressP01-B_D3nrkn.js +605 -0
  9. package/dist/chunks/SearchDepartmentP01-D5ihO3l8.cjs +1 -0
  10. package/dist/chunks/SearchDepartmentP01-pUAav3Xp.js +352 -0
  11. package/dist/chunks/SearchDepartmentP02-B3oL1B-h.js +518 -0
  12. package/dist/chunks/SearchDepartmentP02-CWs8sLuu.cjs +1 -0
  13. package/dist/chunks/SearchHolidayP01-SuuyAk9T.js +188 -0
  14. package/dist/chunks/SearchHolidayP01-cJ8Wlkwr.cjs +1 -0
  15. package/dist/chunks/SearchOrganizationP01-3nDwrB08.cjs +1 -0
  16. package/dist/chunks/SearchOrganizationP01-ChwLBfVt.js +420 -0
  17. package/dist/chunks/SearchOrganizationP02-0Suj4DLH.cjs +1 -0
  18. package/dist/chunks/SearchOrganizationP02-DI0V4Bdz.js +516 -0
  19. package/dist/chunks/UploadMultiFileP01-CffgcIXm.cjs +1 -0
  20. package/dist/chunks/UploadMultiFileP01-Cy2LeYfy.js +38 -0
  21. package/dist/chunks/{layout-components-DnuV2Psp.js → layout-components-Cpzy8mH1.js} +1053 -951
  22. package/dist/chunks/layout-components-y9YpQQbx.cjs +38 -0
  23. package/dist/chunks/provider-DrmM0H4o.cjs +1 -0
  24. package/dist/chunks/provider-ff4RVDYo.js +711 -0
  25. package/dist/components/common/ButtonAccessController.d.ts +2 -3
  26. package/dist/components/common/ButtonAccessController.d.ts.map +1 -1
  27. package/dist/components/common/BwgButtonGroup.d.ts +1 -1
  28. package/dist/components/common/BwgButtonGroup.d.ts.map +1 -1
  29. package/dist/components/common/BwgCol.d.ts +1 -1
  30. package/dist/components/common/BwgCol.d.ts.map +1 -1
  31. package/dist/components/common/BwgGrid.d.ts.map +1 -1
  32. package/dist/components/common/BwgModal.d.ts +10 -0
  33. package/dist/components/common/BwgModal.d.ts.map +1 -0
  34. package/dist/components/common/BwgView.d.ts.map +1 -1
  35. package/dist/components/common/index.cjs +1 -1
  36. package/dist/components/common/index.d.ts +2 -1
  37. package/dist/components/common/index.d.ts.map +1 -1
  38. package/dist/components/common/index.js +4887 -28
  39. package/dist/components/core/BwgCmnFileItems.d.ts +47 -0
  40. package/dist/components/core/BwgCmnFileItems.d.ts.map +1 -0
  41. package/dist/components/core/BwgDeptSearch.d.ts +38 -0
  42. package/dist/components/core/BwgDeptSearch.d.ts.map +1 -0
  43. package/dist/components/core/BwgDraggerUploader.d.ts +13 -0
  44. package/dist/components/core/BwgDraggerUploader.d.ts.map +1 -0
  45. package/dist/components/core/BwgEmpSearch.d.ts +12 -4
  46. package/dist/components/core/BwgEmpSearch.d.ts.map +1 -1
  47. package/dist/components/core/BwgUploader.d.ts +6 -92
  48. package/dist/components/core/BwgUploader.d.ts.map +1 -1
  49. package/dist/components/core/BwgUploader_bak.d.ts +98 -0
  50. package/dist/components/core/BwgUploader_bak.d.ts.map +1 -0
  51. package/dist/components/core/BwgXlsxUploader.d.ts +25 -0
  52. package/dist/components/core/BwgXlsxUploader.d.ts.map +1 -0
  53. package/dist/components/core/index.cjs +1 -1
  54. package/dist/components/core/index.d.ts +11 -2
  55. package/dist/components/core/index.d.ts.map +1 -1
  56. package/dist/components/core/index.js +1318 -1164
  57. package/dist/components/guide/index.cjs +1 -1
  58. package/dist/components/guide/index.js +17 -17
  59. package/dist/components/layout/BwgCoreLogin.d.ts.map +1 -1
  60. package/dist/components/layout/BwgPortal01.d.ts.map +1 -1
  61. package/dist/components/layout/custom/ConfigurableSidebar.d.ts.map +1 -1
  62. package/dist/components/layout/index.cjs +1 -1
  63. package/dist/components/layout/index.js +1 -1
  64. package/dist/components/pages/auth/AuthManagement.d.ts +8 -0
  65. package/dist/components/pages/auth/AuthManagement.d.ts.map +1 -0
  66. package/dist/components/pages/auth/AuthSelector.d.ts +28 -0
  67. package/dist/components/pages/auth/AuthSelector.d.ts.map +1 -0
  68. package/dist/components/pages/auth/RoleAuthMapper.d.ts +8 -0
  69. package/dist/components/pages/auth/RoleAuthMapper.d.ts.map +1 -0
  70. package/dist/components/pages/auth/RoleDashBoard.d.ts +13 -0
  71. package/dist/components/pages/auth/RoleDashBoard.d.ts.map +1 -0
  72. package/dist/components/pages/auth/RoleView.d.ts +17 -0
  73. package/dist/components/pages/auth/RoleView.d.ts.map +1 -0
  74. package/dist/components/pages/board/AdminBoard.d.ts +6 -0
  75. package/dist/components/pages/board/AdminBoard.d.ts.map +1 -0
  76. package/dist/components/pages/board/BoardComment.d.ts +8 -0
  77. package/dist/components/pages/board/BoardComment.d.ts.map +1 -0
  78. package/dist/components/pages/board/MyBoard.d.ts +6 -0
  79. package/dist/components/pages/board/MyBoard.d.ts.map +1 -0
  80. package/dist/components/pages/index.d.ts +10 -10
  81. package/dist/components/pages/index.d.ts.map +1 -1
  82. package/dist/components/pages/rsrc/MenuManagement.d.ts +4 -0
  83. package/dist/components/pages/rsrc/MenuManagement.d.ts.map +1 -0
  84. package/dist/components/pages/rsrc/{CMMenuPrntSelectModal.d.ts → MenuSelector.d.ts} +5 -4
  85. package/dist/components/pages/rsrc/MenuSelector.d.ts.map +1 -0
  86. package/dist/components/pages/rsrc/ProgramManagement.d.ts +4 -0
  87. package/dist/components/pages/rsrc/ProgramManagement.d.ts.map +1 -0
  88. package/dist/components/pages/rsrc/{CMMenuPrgrSelectModal.d.ts → ProgramSelector.d.ts} +5 -4
  89. package/dist/components/pages/rsrc/ProgramSelector.d.ts.map +1 -0
  90. package/dist/components/pages/syst/CommonCodeManagement.d.ts +4 -0
  91. package/dist/components/pages/syst/CommonCodeManagement.d.ts.map +1 -0
  92. package/dist/components/pages/syst/CommonCodeTester.d.ts +7 -0
  93. package/dist/components/pages/syst/CommonCodeTester.d.ts.map +1 -0
  94. package/dist/components/pages/types.d.ts +5 -1
  95. package/dist/components/pages/types.d.ts.map +1 -1
  96. package/dist/components/popup/SearchDepartmentP01.d.ts +1 -1
  97. package/dist/components/popup/SearchDepartmentP01.d.ts.map +1 -1
  98. package/dist/components/popup/SearchOrganizationP02.d.ts.map +1 -1
  99. package/dist/components/popup/UploadMultiFileP01.d.ts +14 -0
  100. package/dist/components/popup/UploadMultiFileP01.d.ts.map +1 -0
  101. package/dist/components/popup/config/localPopupRegistry.d.ts.map +1 -1
  102. package/dist/components/popup/index.cjs +1 -1
  103. package/dist/components/popup/index.d.ts +1 -0
  104. package/dist/components/popup/index.d.ts.map +1 -1
  105. package/dist/components/popup/index.js +16 -8
  106. package/dist/index.cjs +186 -1
  107. package/dist/index.js +32378 -290
  108. package/dist/provider/contexts/BwgViewContext.d.ts +8 -1
  109. package/dist/provider/contexts/BwgViewContext.d.ts.map +1 -1
  110. package/dist/provider/contexts/CommonCodeContext.d.ts +15 -28
  111. package/dist/provider/contexts/CommonCodeContext.d.ts.map +1 -1
  112. package/dist/provider/contexts/MenuButtonContentx.d.ts +1 -0
  113. package/dist/provider/contexts/MenuButtonContentx.d.ts.map +1 -0
  114. package/dist/provider/contexts/MenuButtonContext.d.ts +42 -0
  115. package/dist/provider/contexts/MenuButtonContext.d.ts.map +1 -0
  116. package/dist/provider/hooks/index.d.ts +1 -0
  117. package/dist/provider/hooks/index.d.ts.map +1 -1
  118. package/dist/provider/hooks/useFileUploader.d.ts +74 -0
  119. package/dist/provider/hooks/useFileUploader.d.ts.map +1 -0
  120. package/dist/provider/hooks/useSizeConfig.d.ts +2 -2
  121. package/dist/provider/index.cjs +1 -1
  122. package/dist/provider/index.d.ts +1 -0
  123. package/dist/provider/index.d.ts.map +1 -1
  124. package/dist/provider/index.js +8 -7
  125. package/dist/stores/codeStore.d.ts +65 -128
  126. package/dist/stores/codeStore.d.ts.map +1 -1
  127. package/dist/stores/index.cjs +2 -2
  128. package/dist/stores/index.d.ts +3 -3
  129. package/dist/stores/index.d.ts.map +1 -1
  130. package/dist/stores/index.js +815 -1625
  131. package/dist/stores/menuModelStore.d.ts +22 -7
  132. package/dist/stores/menuModelStore.d.ts.map +1 -1
  133. package/dist/stores/menuViewStore.d.ts +3 -3
  134. package/dist/stores/menuViewStore.d.ts.map +1 -1
  135. package/dist/stores/systemStore.d.ts +50 -17
  136. package/dist/stores/systemStore.d.ts.map +1 -1
  137. package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
  138. package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
  139. package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
  140. package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
  141. package/dist/styles/assets/images/menus/ico1-completed.png +0 -0
  142. package/dist/styles/assets/images/menus/ico1-design.png +0 -0
  143. package/dist/styles/assets/images/menus/ico1-dev.png +0 -0
  144. package/dist/styles/assets/images/menus/ico2-completed.png +0 -0
  145. package/dist/styles/assets/images/menus/ico2-design.png +0 -0
  146. package/dist/styles/assets/images/menus/ico2-dev.png +0 -0
  147. package/dist/styles/assets/images/menus/ico3-completed.png +0 -0
  148. package/dist/styles/assets/images/menus/ico3-design.png +0 -0
  149. package/dist/styles/assets/images/menus/ico3-dev.png +0 -0
  150. package/dist/utils/apiUtils.d.ts.map +1 -1
  151. package/dist/utils/colorFormat.d.ts.map +1 -1
  152. package/dist/utils/commonUtils.d.ts +1 -2
  153. package/dist/utils/commonUtils.d.ts.map +1 -1
  154. package/dist/utils/index.cjs +1 -1
  155. package/dist/utils/index.d.ts +9 -3
  156. package/dist/utils/index.d.ts.map +1 -1
  157. package/dist/utils/index.js +1118 -1962
  158. package/dist/utils/serviceConfig.d.ts +9 -3
  159. package/dist/utils/serviceConfig.d.ts.map +1 -1
  160. package/package.json +4 -4
  161. package/dist/chunks/CMSearchIntfGwP01-0t3umcc_.cjs +0 -1
  162. package/dist/chunks/MenuReport-C70mGz2g.cjs +0 -1
  163. package/dist/chunks/common-components-DNgQR-Ge.cjs +0 -1109
  164. package/dist/chunks/common-components-DeYL3J6X.js +0 -52604
  165. package/dist/chunks/layout-components-Bf9IsLUS.cjs +0 -38
  166. package/dist/chunks/provider-Bi5OYngn.cjs +0 -1
  167. package/dist/chunks/provider-Bx4VpaFf.js +0 -465
  168. package/dist/components/pages/board/CMAdminBoardM01.d.ts +0 -6
  169. package/dist/components/pages/board/CMAdminBoardM01.d.ts.map +0 -1
  170. package/dist/components/pages/board/CMBoardS01.d.ts +0 -8
  171. package/dist/components/pages/board/CMBoardS01.d.ts.map +0 -1
  172. package/dist/components/pages/board/CMMyBoardM01.d.ts +0 -6
  173. package/dist/components/pages/board/CMMyBoardM01.d.ts.map +0 -1
  174. package/dist/components/pages/guide/BwgComponentGuideM01.d.ts +0 -3
  175. package/dist/components/pages/guide/BwgComponentGuideM01.d.ts.map +0 -1
  176. package/dist/components/pages/guide/BwgDeveloperGuideM01.d.ts +0 -3
  177. package/dist/components/pages/guide/BwgDeveloperGuideM01.d.ts.map +0 -1
  178. package/dist/components/pages/guide/BwgReactGuideM01.d.ts +0 -3
  179. package/dist/components/pages/guide/BwgReactGuideM01.d.ts.map +0 -1
  180. package/dist/components/pages/rsrc/CMMenuPrgrSelectModal.d.ts.map +0 -1
  181. package/dist/components/pages/rsrc/CMMenuPrntSelectModal.d.ts.map +0 -1
  182. package/dist/components/pages/syst/CMSystCodeM01.d.ts +0 -4
  183. package/dist/components/pages/syst/CMSystCodeM01.d.ts.map +0 -1
@@ -0,0 +1,47 @@
1
+ import { UseFileUploaderOptions } from '../../provider';
2
+ import { UploadProps, UploadFile } from 'antd';
3
+ import { ReactElement } from 'react';
4
+ /**
5
+ * ============================================
6
+ * 📁 BwgCmnFileItem.tsx
7
+ * ERP 공통 파일 업로더에 필요한 공통 컴포넌트 및 타입 정의
8
+ * ============================================
9
+ */
10
+ export interface BwgCommonUploaderProps extends UseFileUploaderOptions {
11
+ listType?: 'text' | 'picture';
12
+ buttonText?: string;
13
+ permissions?: {
14
+ fileAdd: boolean;
15
+ draftUpload: boolean;
16
+ fileDelete: boolean;
17
+ };
18
+ uploadProps?: UploadProps;
19
+ }
20
+ /*************************************************************************************
21
+ * DraggableUploadListItem
22
+ * --------------------------------------------
23
+ * - Antd Upload의 파일 리스트 항목을
24
+ * Drag & Drop 으로 순서 변경할 수 있게 만든 컴포넌트
25
+ * - react-dnd 사용
26
+ * - UploadProps의 itemRender 속성에 사용
27
+ *************************************************************************************/
28
+ export interface DraggableUploadListItemProps {
29
+ originNode: ReactElement;
30
+ file: UploadFile;
31
+ fileList: UploadFile[];
32
+ moveFile: (dragUid: string, hoverUid: string) => void;
33
+ onDrop: () => void;
34
+ }
35
+ declare const DraggableUploadListItem: ({ originNode, file, fileList, moveFile, onDrop, }: DraggableUploadListItemProps) => import("react/jsx-runtime").JSX.Element;
36
+ /*************************************************************************************
37
+ * ✅ defaultItemRender : 기본 DnD용 itemRender
38
+ * - Upload의 itemRender에서 공통으로 사용할 수 있는 헬퍼
39
+ *************************************************************************************/
40
+ declare const defaultItemRender: (originNode: ReactElement, file: UploadFile, fileList: UploadFile[], moveFile: (dragUid: string, hoverUid: string) => void, onDrop: () => void) => import("react/jsx-runtime").JSX.Element;
41
+ /*************************************************************************************
42
+ * ✅ defaultIconRender : 기본 파일 아이콘 Render
43
+ * - Antd Upload의 파일 아이콘 Render 기본 구현
44
+ *************************************************************************************/
45
+ declare const defaultIconRender: (file: UploadFile, lt: any) => import("react/jsx-runtime").JSX.Element;
46
+ export { DraggableUploadListItem, defaultItemRender, defaultIconRender };
47
+ //# sourceMappingURL=BwgCmnFileItems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BwgCmnFileItems.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgCmnFileItems.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAUpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAwB,MAAM,OAAO,CAAC;AAG3D;;;;;GAKG;AACH,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;;;;uFAOuF;AACvF,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,YAAY,CAAC;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAOD,QAAA,MAAM,uBAAuB,GAAI,mDAM9B,4BAA4B,4CAwE9B,CAAC;AAEF;;;uFAGuF;AACvF,QAAA,MAAM,iBAAiB,GACrB,YAAY,YAAY,EACxB,MAAM,UAAU,EAChB,UAAU,UAAU,EAAE,EACtB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EACrD,QAAQ,MAAM,IAAI,4CA+BnB,CAAC;AACF;;;uFAGuF;AACvF,QAAA,MAAM,iBAAiB,GAAI,MAAM,UAAU,EAAE,IAAI,GAAG,4CAoBnD,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { OrgDepartment as Department } from '../popup';
2
+ export interface DeptSearchField {
3
+ /** 연결할 Department 객체의 속성명
4
+ * @default deptNm
5
+ */
6
+ value?: keyof Department;
7
+ /** 폼에 저장할 필드명
8
+ * @default deptNm
9
+ */
10
+ fieldName?: string;
11
+ /** placeholder
12
+ * @default 부서명
13
+ */
14
+ placeholder?: string;
15
+ }
16
+ export interface BwgDeptSearchProps {
17
+ /** 라벨
18
+ * @default 부서
19
+ */
20
+ label?: string;
21
+ /** 부서코드 필드명
22
+ * @default deptCd
23
+ */
24
+ deptCdFieldName?: string;
25
+ /** Department 객체를 저장할 필드명
26
+ * @default department
27
+ */
28
+ departmentFieldName?: string;
29
+ /** 표시할 필드 */
30
+ field?: DeptSearchField;
31
+ /** 읽기 전용 */
32
+ readOnly?: boolean;
33
+ /** 완료 함수 */
34
+ onFinish?: () => void;
35
+ }
36
+ declare const BwgDeptSearch: (props: BwgDeptSearchProps) => import("react/jsx-runtime").JSX.Element;
37
+ export default BwgDeptSearch;
38
+ //# sourceMappingURL=BwgDeptSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BwgDeptSearch.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgDeptSearch.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,UAAU,CAAC;IACzB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa;IACb,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAID,QAAA,MAAM,aAAa,GAAI,OAAO,kBAAkB,4CAwI/C,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { FC } from 'react';
2
+ import { BwgCommonUploaderProps } from './BwgCmnFileItems';
3
+ export interface BwgDraggerUploaderProps extends BwgCommonUploaderProps {
4
+ buttonText?: string;
5
+ heights?: {
6
+ root?: number;
7
+ list?: number;
8
+ dragger?: number;
9
+ };
10
+ }
11
+ declare const BwgDraggerUploader: FC<BwgDraggerUploaderProps>;
12
+ export default BwgDraggerUploader;
13
+ //# sourceMappingURL=BwgDraggerUploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BwgDraggerUploader.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgDraggerUploader.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,EAAE,EAA2B,MAAM,OAAO,CAAC;AAGpD,OAAO,EACL,sBAAsB,EAGvB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,QAAA,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CA+DnD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -10,13 +10,21 @@ export interface EmpSearchField {
10
10
  export interface BwgEmpSearchProps {
11
11
  /** 라벨 */
12
12
  label?: string;
13
- /** 사번 필드명 (디폴트: empNo)*/
13
+ /** 사번 필드명
14
+ * @default empNo
15
+ */
14
16
  empNoFieldName?: string;
15
- /** Employee 객체를 저장할 필드명 (디폴트: employee)*/
17
+ /** Employee 객체를 저장할 필드명
18
+ * @default employee
19
+ */
16
20
  employeeFieldName?: string;
17
- /** 표시할 필드 1 (디폴트: 부서명) */
21
+ /** 표시할 필드 1
22
+ * @default 부서명
23
+ */
18
24
  field1?: EmpSearchField;
19
- /** 표시할 필드 2 (디폴트: 사원명) */
25
+ /** 표시할 필드 2
26
+ * @default 사원명
27
+ */
20
28
  field2?: EmpSearchField;
21
29
  /** 읽기 전용 */
22
30
  readOnly?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"BwgEmpSearch.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgEmpSearch.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,QAAQ,CAAC;IACvB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0BAA0B;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAID,QAAA,MAAM,YAAY,GAAI,OAAO,iBAAiB,4CA4I7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"BwgEmpSearch.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgEmpSearch.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,QAAQ,CAAC;IACvB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAID,QAAA,MAAM,YAAY,GAAI,OAAO,iBAAiB,4CA4I7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,98 +1,12 @@
1
- import { UploadFile } from 'antd/es/upload';
2
1
  import { FC } from 'react';
3
- import { BwgFormItemProps } from './BwgFormItem';
4
- export interface BwgUploaderProps {
5
- /**
6
- * Form.Item 속성
7
- */
8
- itemProps?: BwgFormItemProps;
9
- /**
10
- * 선/후처리 서비스에 전달할 파일 그룹 키입니다.
11
- * 선처리 : 파일 목록조회
12
- * 후처리 : 해당 파일 그룹키에 파일목록수정
13
- */
14
- fileGrpKey?: string;
15
- /**
16
- * 파일 업로드 완료 시 호출되는 콜백 함수입니다.
17
- */
18
- onUploadComplete?: (fileDetails: {
19
- fileNameP?: string;
20
- fileNameL?: string;
21
- filePath?: string;
22
- fileSize?: number;
23
- fileExt?: string;
24
- fileGrpKey: string;
25
- fileKey?: string;
26
- }) => void;
27
- /**
28
- * 파일 목록을 조회하는 거래코드.
29
- * 기본값: 'SCMFILE00101'
30
- */
31
- onFetchFilesTrxCd?: string;
32
- /**
33
- * 파일 업로드 후처리 서비스 호출을 위한 trxCd.
34
- * 기본값: 'SCMFILE00102'
35
- */
36
- onSuccessTrxCd?: string;
37
- /**
38
- * 파일 삭제 후처리 서비스 호출을 위한 trxCd.
39
- * 기본값: 'SCMFILE00103'
40
- */
41
- onDeleteFileTrxCd?: string;
42
- /**
43
- * 파일 순서 변경 후처리 서비스 호출을 위한 trxCd.
44
- */
45
- onReorderFilesTrxCd?: string;
46
- /**
47
- * 허용되는 파일 확장자 목록입니다.
48
- */
49
- allowedExtensions?: string[];
50
- /**
51
- * 최대 파일 크기(MB)입니다.
52
- */
53
- maxFileSize?: number;
54
- /**
55
- * 파일 선택 버튼 표시 여부
56
- */
57
- showButton?: boolean;
58
- /**
59
- * 다중 파일 업로드 여부
60
- * @default false
61
- */
62
- multiple?: boolean;
63
- /**
64
- * 파일목록 수정시 새로운 fileGrpKey 채번 여부
65
- */
66
- newFileGrpKeyonModify?: boolean;
67
- /**
68
- * 파일 선택 버튼 텍스트
69
- * @default "파일 선택"
70
- */
2
+ import { BwgCommonUploaderProps } from './BwgCmnFileItems';
3
+ export interface BwgUploaderProps extends BwgCommonUploaderProps {
71
4
  buttonText?: string;
72
- /**
73
- * 서버 업로드를 수행하지 않고 로컬에서만 파일을 보관합니다.
74
- * 이 모드에서는 API 호출을 하지 않으며 선택/제거/정렬 결과의 파일 목록을 그대로 반환합니다.
75
- */
76
- localOnly?: boolean;
77
- /**
78
- * localOnly 모드에서 파일 목록이 변경될 때 호출됩니다.
79
- */
80
- onFilesChange?: (files: UploadFile[]) => void;
5
+ heights?: {
6
+ root?: number;
7
+ list?: number;
8
+ };
81
9
  }
82
- /**
83
- * BwgUploader 컴포넌트
84
- *
85
- * @param fileGrpKey - 파일 그룹 키
86
- * @param onUploadComplete - 파일 업로드 완료 시 콜백
87
- * @param onFetchFilesTrxCd - 파일 목록 조회 트랜잭션 코드
88
- * @param onSuccessTrxCd - 파일 업로드 성공 후처리 트랜잭션 코드
89
- * @param onDeleteFileTrxCd - 파일 삭제 후처리 트랜잭션 코드
90
- * @param onReorderFilesTrxCd - 파일 순서 변경 후처리 트랜잭션 코드
91
- * @param allowedExtensions - 허용 파일 확장자
92
- * @param maxFileSize - 최대 파일 크기
93
- * @param showButton - 파일 선택 버튼 표시 여부
94
- * @param buttonText - 파일 선택 버튼 텍스트
95
- */
96
10
  declare const BwgUploader: FC<BwgUploaderProps>;
97
11
  export default BwgUploader;
98
12
  //# sourceMappingURL=BwgUploader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BwgUploader.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgUploader.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAEL,EAAE,EAKH,MAAM,OAAO,CAAC;AAIf,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAsB9D,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAK,IAAI,CAAC;IACX;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;CAC/C;AAqGD;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAibrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"BwgUploader.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgUploader.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,EAAE,EAA2B,MAAM,OAAO,CAAC;AAGpD,OAAO,EACL,sBAAsB,EAGvB,MAAM,mBAAmB,CAAC;AAO3B,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAgErC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { UploadFile } from 'antd/es/upload';
2
+ import { FC } from 'react';
3
+ import { BwgFormItemProps } from './BwgFormItem';
4
+ export interface BwgUploaderProps {
5
+ /**
6
+ * Form.Item 속성
7
+ */
8
+ itemProps?: BwgFormItemProps;
9
+ /**
10
+ * 선/후처리 서비스에 전달할 파일 그룹 키입니다.
11
+ * 선처리 : 파일 목록조회
12
+ * 후처리 : 해당 파일 그룹키에 파일목록수정
13
+ */
14
+ fileGrpKey?: string;
15
+ /**
16
+ * 파일 업로드 완료 시 호출되는 콜백 함수입니다.
17
+ */
18
+ onUploadComplete?: (fileDetails: {
19
+ fileNameP?: string;
20
+ fileNameL?: string;
21
+ filePath?: string;
22
+ fileSize?: number;
23
+ fileExt?: string;
24
+ fileGrpKey: string;
25
+ fileKey?: string;
26
+ }) => void;
27
+ /**
28
+ * 파일 목록을 조회하는 거래코드.
29
+ * 기본값: 'SCMFILE00101'
30
+ */
31
+ onFetchFilesTrxCd?: string;
32
+ /**
33
+ * 파일 업로드 후처리 서비스 호출을 위한 trxCd.
34
+ * 기본값: 'SCMFILE00102'
35
+ */
36
+ onSuccessTrxCd?: string;
37
+ /**
38
+ * 파일 삭제 후처리 서비스 호출을 위한 trxCd.
39
+ * 기본값: 'SCMFILE00103'
40
+ */
41
+ onDeleteFileTrxCd?: string;
42
+ /**
43
+ * 파일 순서 변경 후처리 서비스 호출을 위한 trxCd.
44
+ */
45
+ onReorderFilesTrxCd?: string;
46
+ /**
47
+ * 허용되는 파일 확장자 목록입니다.
48
+ */
49
+ allowedExtensions?: string[];
50
+ /**
51
+ * 최대 파일 크기(MB)입니다.
52
+ */
53
+ maxFileSize?: number;
54
+ /**
55
+ * 파일 선택 버튼 표시 여부
56
+ */
57
+ showButton?: boolean;
58
+ /**
59
+ * 다중 파일 업로드 여부
60
+ * @default false
61
+ */
62
+ multiple?: boolean;
63
+ /**
64
+ * 파일목록 수정시 새로운 fileGrpKey 채번 여부
65
+ */
66
+ newFileGrpKeyonModify?: boolean;
67
+ /**
68
+ * 파일 선택 버튼 텍스트
69
+ * @default "파일 선택"
70
+ */
71
+ buttonText?: string;
72
+ /**
73
+ * 서버 업로드를 수행하지 않고 로컬에서만 파일을 보관합니다.
74
+ * 이 모드에서는 API 호출을 하지 않으며 선택/제거/정렬 결과의 파일 목록을 그대로 반환합니다.
75
+ */
76
+ localOnly?: boolean;
77
+ /**
78
+ * localOnly 모드에서 파일 목록이 변경될 때 호출됩니다.
79
+ */
80
+ onFilesChange?: (files: UploadFile[]) => void;
81
+ }
82
+ /**
83
+ * BwgUploader 컴포넌트
84
+ *
85
+ * @param fileGrpKey - 파일 그룹 키
86
+ * @param onUploadComplete - 파일 업로드 완료 시 콜백
87
+ * @param onFetchFilesTrxCd - 파일 목록 조회 트랜잭션 코드
88
+ * @param onSuccessTrxCd - 파일 업로드 성공 후처리 트랜잭션 코드
89
+ * @param onDeleteFileTrxCd - 파일 삭제 후처리 트랜잭션 코드
90
+ * @param onReorderFilesTrxCd - 파일 순서 변경 후처리 트랜잭션 코드
91
+ * @param allowedExtensions - 허용 파일 확장자
92
+ * @param maxFileSize - 최대 파일 크기
93
+ * @param showButton - 파일 선택 버튼 표시 여부
94
+ * @param buttonText - 파일 선택 버튼 텍스트
95
+ */
96
+ declare const BwgUploader: FC<BwgUploaderProps>;
97
+ export default BwgUploader;
98
+ //# sourceMappingURL=BwgUploader_bak.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BwgUploader_bak.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgUploader_bak.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAEL,EAAE,EAKH,MAAM,OAAO,CAAC;AAIf,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAsB9D,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAK,IAAI,CAAC;IACX;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;CAC/C;AAqGD;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAibrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface BwgXlsxUploaderProps {
2
+ /**
3
+ * 버튼 라벨
4
+ */
5
+ label?: string;
6
+ /**
7
+ * 업로드된 엑셀 파일을 처리할 배치 작업의 고유 식별자(Job ID)
8
+ */
9
+ jobId: string;
10
+ /**
11
+ * 배치 추가 파라미터
12
+ */
13
+ extraParams?: Record<string, any>;
14
+ /**
15
+ * 실행 완료 시 호출되는 함수
16
+ */
17
+ onFinish?: () => void;
18
+ /**
19
+ * 버튼 비활성화 여부
20
+ */
21
+ disabled?: boolean;
22
+ }
23
+ declare const BwgXlsxUploader: ({ label, jobId, extraParams, onFinish, disabled, }: BwgXlsxUploaderProps) => import("react/jsx-runtime").JSX.Element;
24
+ export default BwgXlsxUploader;
25
+ //# sourceMappingURL=BwgXlsxUploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BwgXlsxUploader.d.ts","sourceRoot":"","sources":["../../../src/components/core/BwgXlsxUploader.tsx"],"names":[],"mappings":"AA4CA,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,eAAe,GAAI,oDAMtB,oBAAoB,4CAqRtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),a=require("antd"),x=require("react"),ae=require("../../stores/index.cjs"),E=require("dayjs"),P=require("@ant-design/icons"),T=require("../../utils/index.cjs"),ie=require("jszip"),Z=require("imask"),X=require("../../chunks/provider-Bi5OYngn.cjs"),G=require("lodash"),J=require("react-dnd"),ce=require("react-dnd-html5-backend"),ue=e=>{const{componentSize:t}=ae.useUserStore(),m=x.useMemo(()=>e.size?e.size:{0:"small",1:"middle",2:"large"}[t],[t,e.size]),i=x.useMemo(()=>({0:12,1:14,2:16})[t],[t]);return n.jsx(a.Button,{...e,size:m,className:"bwg-btn",style:{fontSize:`${i}px`,...e.style},children:e.children})},$=x.memo(({children:e,label:t,name:m,rules:i,initialValue:r,style:l,required:h,...c})=>{const F={fontWeight:"bold"};(i==null||i==null)&&h&&(i=[{required:!0,message:`${t}을(를) 입력해주세요.`}]);const u=Array.isArray(i)&&i.some(j=>j.required===!0),d=()=>typeof t=="string"?n.jsxs("span",{style:F,children:[t,u&&n.jsx("span",{style:{color:"#ff4d4f",marginLeft:"4px"},children:"*"})]}):n.jsx("span",{style:F,children:t});return n.jsx(a.Form.Item,{className:"bwg-form-item",label:t?d():void 0,labelAlign:c.labelAlign||"left",name:m,rules:i,colon:!1,initialValue:r,style:l,...c,children:e})}),de=({itemProps:e,inputProps:t={format:"YN"}})=>{const m=a.Form.useFormInstance(),i=r=>{t.format==="boolean"?m.setFieldValue(e?.name,r.target.checked):m.setFieldValue(e?.name,r.target.checked?"Y":"N"),t.onChange&&t.onChange(r)};return n.jsx($,{...e,getValueProps:r=>({checked:t.format==="boolean"?!!r:r==="Y"}),normalize:r=>typeof r=="boolean"?t.format==="boolean"?r:r?"Y":"N":t.format==="boolean"?!!r:r?"Y":"N",children:n.jsx(a.Checkbox,{...t,onChange:i,children:t?.title})})},fe=({itemProps:e,inputProps:t})=>{const m=a.Form.useFormInstance(),[i,r]=x.useState(e?.initialValue??[]),[l,h]=x.useState([]),c=l.length>0&&l.length==i?.length,F=i?.length>0&&i.length<l.length;x.useEffect(()=>{h(u(t?.options))},[t?.options]),x.useEffect(()=>{r(i)},[i]);const u=C=>{const L=[];return(C||[]).map((k,U)=>{L.push(k.value)}),L},d=C=>{r(C.target.checked?l:[]),m.setFieldValue(e?.name,C.target.checked?l:[])},j=C=>{r(C),m.setFieldValue(e?.name,C),t?.onChange&&typeof t?.onChange=="function"&&t?.onChange(C)};return n.jsx($,{...e,children:n.jsxs(a.ConfigProvider,{theme:{components:{Checkbox:{colorPrimary:"var(--check-primary)",colorPrimaryBorder:"var(--check-primary)",colorPrimaryHover:"var(--check-primary-active)"}}},children:[t?.allCheck&&n.jsx(a.Checkbox,{indeterminate:F,checked:c,onChange:d,children:"전체선택"}),n.jsx(a.Checkbox.Group,{options:t?.options,value:i,onChange:j})]})})},ee={year:{displayFormat:"YYYY",outputFormat:"YYYY"},month:{displayFormat:"YYYY-MM",outputFormat:"YYYYMM"},date:{displayFormat:"YYYY-MM-DD",outputFormat:"YYYYMMDD"},time:{displayFormat:"HH:mm",outputFormat:"HHmm"},datetime:{displayFormat:"YYYY-MM-DD HH:mm",outputFormat:"YYYYMMDDHHmm"}},me=({itemProps:e,inputProps:t,type:m="date",returnType:i="string"})=>{const{displayFormat:r,outputFormat:l}=x.useMemo(()=>ee[m],[m]),h=x.useMemo(()=>Object.values(ee).map(c=>c.outputFormat).sort((c,F)=>{if(c.length===F.length){if(c===l)return-1;if(F===l)return 1}return F.length-c.length}),[l]);return n.jsx($,{...e,getValueProps:c=>({value:c?E.isDayjs(c)?c:E(c,h):null}),normalize:c=>c?i==="dayjs"?c:c.format(l):null,children:n.jsx(a.DatePicker,{...t,picker:m==="datetime"?"date":m,showTime:t?.showTime??(m==="datetime"||m==="time"),format:t?.format??r})})},ge=({fileGrpKey:e,onFetchFilesTrxCd:t="SCMFILE00101",readOnly:m=!1,appCd:i=__APP_CD__})=>{const[r,l]=x.useState([]);x.useEffect(()=>{if(t)if(i!=__APP_CD__){const F=T.getApiDeps().findSystemByAppCd?.(i??__APP_CD__);if(!F||!F.sysCd){console.error("해당 앱코드는 존재하지 않습니다.",i);return}T.callServiceByAppCd({trxCd:t,appCd:i},{crprCd:T.getCrprCd(),sysCd:F.sysCd,fileGrpKey:e}).then(u=>{if(u?.sub){const d=u.sub.map(j=>({uid:j.fileKey,name:j.lgclFileNm,filePath:j.filePath}));l(d)}}).catch(u=>{console.error("파일 목록 조회 서비스 호출에 실패했습니다.",u),a.message.error("파일 목록을 불러오는 중 오류가 발생했습니다.")})}else T.callService(t,{crprCd:T.getUserInfo()?.crprCd,sysCd:__SYS_CD__,fileGrpKey:e}).then(c=>{if(c?.sub){const F=c.sub.map(u=>({uid:u.fileKey,name:u.lgclFileNm,filePath:u.filePath}));l(F)}}).catch(c=>{console.error("파일 목록 조회 서비스 호출에 실패했습니다.",c),a.message.error("파일 목록을 불러오는 중 오류가 발생했습니다.")});else l([])},[e,t,i]);const h=async c=>{try{const u=T.getApiDeps().findSystemByAppCd?.(i??__APP_CD__);if(!u||!u.sysCd){console.error("해당 앱코드는 존재하지 않습니다.",i);return}const j=await fetch("/api/download",{method:"POST",headers:{SYSCD:u.sysCd,"Content-Type":"application/json"},body:JSON.stringify({filePath:c.filePath,logicalName:c.name,fileKey:c.uid})});if(!j.ok){const V=(await j.json().catch(()=>null))?.message||"파일 다운로드에 실패했습니다.";throw new Error(V)}const C=await j.blob(),L=window.URL.createObjectURL(C),k=document.createElement("a");k.href=L,k.setAttribute("download",c.name),document.body.appendChild(k),k.click(),document.body.removeChild(k),window.URL.revokeObjectURL(L)}catch(F){console.error(F),a.message.error(F.message||"파일을 다운로드하는 중 오류가 발생했습니다.")}};return n.jsx(a.Card,{title:"파일 목록",children:n.jsx(a.List,{dataSource:r,renderItem:c=>n.jsx(a.List.Item,{actions:m?[]:[n.jsx(a.Button,{type:"text",icon:n.jsx(P.DownloadOutlined,{}),onClick:()=>h(c)},"download")],children:n.jsx(a.List.Item.Meta,{avatar:n.jsx(P.PaperClipOutlined,{}),title:c.name})})})})},oe=x.forwardRef(({children:e,labelCol:t,style:m,className:i,...r},l)=>n.jsx(a.ConfigProvider,{form:{},children:n.jsx(a.Form,{ref:l,...r,requiredMark:!1,labelCol:t||{flex:"100px"},style:{padding:"10px",...m},className:`bwg-form ${i??""}`,children:e})}));oe.displayName="BwgForm";const he=({itemProps:e,inputProps:t})=>n.jsx($,{...e,children:n.jsx(a.Input,{...t})}),{Text:W}=a.Typography,{Dragger:pe}=a.Upload,ye=[".pdf",".xlsx",".xls",".docx",".doc",".pptx",".ppt",".hwp",".txt",".csv",".jpg",".jpeg",".png",".gif",".zip"],xe=(e,t=2)=>{if(e===0)return"0 Bytes";const m=1024,i=t<0?0:t,r=["Bytes","KB","MB","GB","TB"],l=Math.floor(Math.log(e)/Math.log(m));return parseFloat((e/Math.pow(m,l)).toFixed(i))+" "+r[l]},Fe=({title:e="첨부파일",fileGrpKey:t,onUploadComplete:m,onSuccessTrxCd:i="SCMFILE00102",anotherServiceTrxCd:r="SCMFILE00105",allowedExtensions:l=ye,maxFileSize:h=2048})=>{const[c,F]=x.useState([]),[u,d]=x.useState(!1),[j,C]=x.useState(!1),[L,k]=x.useState(0),U=p=>{if(l&&l.length>0){const D=(R=>{const o=R.lastIndexOf(".");return o===-1?"":R.substring(o).toLowerCase()})(p.name);if(!l.includes(D))return a.message.error(`${p.name} 파일은 허용되지 않는 확장자입니다. (${l.join(", ")}만 가능)`),!1}return!0},V=async()=>{const p=c.filter(S=>S.status!=="done"),v=p.reduce((S,I)=>S+(I.size||0),0),D=2*1024*1024*1024;if(v>D){a.notification.error({message:"업로드 용량 초과",description:"한 번에 업로드할 수 있는 총 파일 용량은 2GB를 초과할 수 없습니다."});return}if(p.length===0){a.message.warning("업로드할 파일이 없거나 모든 파일이 이미 업로드되었습니다.");return}C(!0);let R;try{const S=new ie;p.forEach(I=>{I.originFileObj&&S.file(I.name,I.originFileObj)}),R=await S.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:9}})}catch(S){C(!1),a.message.error("파일을 압축하는 중 오류가 발생했습니다."),console.error("Zipping error:",S);return}C(!1);const o=new FormData;o.append("file",R,"upload.zip"),d(!0),k(0);try{const S=await new Promise((N,_)=>{const O=new XMLHttpRequest;O.open("POST","/api/upload-large",!0),O.upload.onprogress=z=>{if(z.lengthComputable){const K=Math.round(z.loaded/z.total*100);k(K)}},O.onload=()=>{if(O.status>=200&&O.status<300)try{const z=JSON.parse(O.responseText);z.success?N(z):_(new Error(z.message||"파일 업로드에 실패했습니다."))}catch{_(new Error("잘못된 서버 응답입니다."))}else try{const z=JSON.parse(O.responseText);_(new Error(z.message||`서버 오류: ${O.status}`))}catch{_(new Error(`서버 오류: ${O.status}`))}},O.onerror=()=>{_(new Error("네트워크 오류가 발생했습니다."))},O.send(o)});a.message.success(S.message||"압축 파일이 성공적으로 업로드되었습니다.");const I=c.map(N=>p.find(_=>_.uid===N.uid)?{...N,status:"done"}:N);if(F(I),i&&S.uploadedFiles&&Array.isArray(S.uploadedFiles)){const N=T.getUserInfo();S.uploadedFiles.forEach(_=>{const O={crprCd:N?.crprCd,sysCd:__SYS_CD__,fileGrpKey:t,sub:[{crprCd:N?.crprCd,sysCd:__SYS_CD__,fileGrpKey:t,physFileNm:_.fileNameP,lgclFileNm:_.fileNameL,filePath:_.filePath,fileExtn:_.fileExt,fileSize:_.fileSize,mltpYn:"Y"}]};T.callService(i,O).then(z=>{const K=c.map(q=>({crprCd:N?.crprCd,sysCd:__SYS_CD__,fileGrpKey:z.sub[0].fileGrpKey,fileKey:z.sub[0].fileKey,lgclFileNm:q.name,fileSize:q.size,fileExtn:q.name.split(".").pop(),fileType:q.type}));T.callService(r,{sub:K})}).catch(z=>{console.error("후처리 서비스 호출 실패:",z),a.message.error(`${_.fileNameL} 파일의 후처리 작업에 실패했습니다.`)}),m&&m({fileNameP:_.fileNameP,fileNameL:_.fileNameL})})}}catch(S){a.message.error(S.message||"파일 업로드 중 오류가 발생했습니다.");const I=c.map(N=>p.find(_=>_.uid===N.uid)?{...N,status:"error",response:S.message||"파일 업로드 중 오류가 발생했습니다."}:N);F(I)}finally{d(!1)}},B={multiple:!0,fileList:c,beforeUpload:p=>U(p)?h&&p.size>=h*1024*1024?(a.message.error(`대용량 첨부 파일 최대 크기는 ${(h/1024).toFixed(1)}GB입니다.`),a.Upload.LIST_IGNORE):!1:a.Upload.LIST_IGNORE,onChange:({fileList:p})=>{const v=new Map(c.map(D=>[D.uid,D]));p.forEach(D=>{v.set(D.uid,D)}),F(Array.from(v.values()))},onRemove:p=>{const v=c.filter(D=>D.uid!==p.uid);F(v)},showUploadList:!1};return n.jsx(a.Spin,{spinning:u||j,tip:j?"파일 압축 중...":`파일 업로드 중... ${L}%`,children:n.jsxs("div",{className:"bwg-large-uploader-container",children:[n.jsx(a.Card,{title:n.jsx(W,{strong:!0,children:e}),extra:n.jsx(a.Upload,{...B,children:n.jsx(a.Button,{icon:n.jsx(P.UploadOutlined,{}),children:"파일 선택"})}),style:{padding:0},children:n.jsx(pe,{...B,style:{border:"none",background:"transparent",padding:0},children:n.jsx("div",{className:"upload-list-container",children:c.length>0?n.jsx(a.List,{style:{textAlign:"left"},dataSource:c,renderItem:p=>{const v=p.status==="done",D=p.status==="error";let R;return v?R=n.jsx(P.CheckCircleOutlined,{style:{color:"#52c41a",fontSize:14}}):D?R=n.jsx(a.Tooltip,{title:typeof p.response=="string"?p.response:"업로드 실패",children:n.jsx(P.CloseCircleOutlined,{style:{color:"#ff4d4f",fontSize:14}})}):R=n.jsx(P.FileTextOutlined,{style:{fontSize:14}}),n.jsx(a.List.Item,{actions:[n.jsx(W,{type:"secondary",children:xe(p.size||0)},"size"),n.jsx(a.Button,{type:"text",icon:n.jsx(P.DeleteOutlined,{}),onClick:o=>{o.stopPropagation(),B.onRemove?.(p)},disabled:u||j},"delete")],children:n.jsx(a.List.Item.Meta,{avatar:R,title:n.jsx(W,{type:D?"danger":void 0,children:p.name})})},p.uid)}}):n.jsxs(a.Flex,{gap:"middle",align:"center",justify:"center",vertical:!0,style:{padding:"20px 0",minHeight:"120px"},children:[n.jsx(P.InboxOutlined,{style:{fontSize:"32px",color:"#999"}}),n.jsx(W,{type:"secondary",children:"업로드할 파일을 선택하거나 이 영역으로 드래그하세요."})]})})})}),c.length>0&&n.jsxs(a.Flex,{justify:"flex-end",align:"center",gap:"large",style:{marginTop:16},children:[u&&n.jsx("div",{style:{width:"250px"},children:n.jsx(a.Progress,{percent:L,size:"small"})}),n.jsx(a.Button,{type:"primary",onClick:V,disabled:u||j||c.filter(p=>p.status!=="done").length===0,icon:n.jsx(P.CloudUploadOutlined,{}),children:"일괄 업로드"})]})]})})},Ce=e=>{if(typeof e=="string")return e.replace(/0/g,"_");if(Array.isArray(e))return e[0].replace(/0/g,"_");if(typeof e=="object"&&"mask"in e&&"blocks"in e){const{mask:t,blocks:m}=e;return t.split(".").map(i=>{const l=m?.[i]?.maxLength??3;return"_".repeat(l)}).join(".")}return""},Se=({itemProps:e,inputProps:t,mask:m})=>{const i=x.useRef(null),r=a.Form.useFormInstance(),l=x.useMemo(()=>Ce(m),[m]);return x.useEffect(()=>{if(!i.current?.input)return;const h=typeof m=="string"||Array.isArray(m)?{mask:m}:m,c=Z(i.current.input,h);return c.on("accept",()=>{r&&e?.name&&r.setFieldValue(e.name,c.value)}),()=>{c.destroy()}},[m,r,e?.name]),n.jsx($,{...e,children:n.jsx(a.Input,{...t,ref:i,placeholder:l})})},je=e=>{switch(e){case"year":return{format:"YYYY",mask:"0000",outputFormat:"YYYY"};case"month":return{format:"YYYY-MM",mask:"0000-00",outputFormat:"YYYYMM"};case"date":default:return{format:"YYYY-MM-DD",mask:"0000-00-00",outputFormat:"YYYYMMDD"}}},ke=({type:e="date",itemProps:t={name:"calendar"},inputProps:m,pickerProps:i})=>{const{format:r,mask:l,outputFormat:h}=je(e),c=x.useRef(null),F=x.useRef(null),u=x.useRef(null),d=a.Form.useFormInstance(),[j,C]=x.useState(!1),[L,k]=x.useState(!1),U=t?.name,[V,B]=x.useState(null),p=a.Form.useWatch(U,d),v=X.useSizeConfig();x.useEffect(()=>{if(!c.current?.input)return;const o=Z(c.current.input,{mask:l,lazy:!1});return F.current=o,o.on("accept",()=>{const S=o.value;S.length>0&&C(!0);const I=E(S,r,!0);S.length===r.length&&I.isValid()&&(d.setFieldValue(U,I.format(h)),B(I),F.current?.updateValue())}),()=>{o.destroy()}},[r,l]),x.useEffect(()=>{if(!p){B(null);return}let o=null;if(typeof p=="string"&&p.length===h.length&&/^\d+$/.test(p))if(e==="date"){const S=p.substring(0,4),I=p.substring(4,6),N=p.substring(6,8);o=E(`${S}-${I}-${N}`,r,!0)}else if(e==="month"){const S=p.substring(0,4),I=p.substring(4,6);o=E(`${S}-${I}`,r,!0)}else e==="year"&&(o=E(p,r,!0));else o=E(p,r,!0);o&&o.isValid()?B(o):B(null),k(!1)},[p,r,h,e]);const D=o=>{if(!o){d.setFieldValue(U,void 0),B(null),F.current?.updateValue();return}B(o);const S=o.format(h);d.setFieldValue(U,S),F.current&&(F.current.value=o.format(r),F.current.updateValue()),k(!1)},R=o=>{setTimeout(()=>{const S=document.activeElement,I=u.current,N=I?.querySelector(".ant-picker-dropdown");!(I&&(I.contains(S)||I===S||N?.contains(S)))&&!(o!==void 0?o:j)&&console.log("✅ Input과 DatePicker 모두 포커스가 없습니다")},0)};return n.jsx($,{...t,name:void 0,validateStatus:L?"warning":void 0,children:n.jsxs(a.ConfigProvider,{componentSize:v.componentSize,theme:{components:{Input:{addonBg:"#fff"}}},children:[n.jsx(a.Form.Item,{name:U,getValueProps:o=>({value:o?E(o).format(r):void 0}),normalize:o=>o?E(o).format(h):void 0,noStyle:!0,rules:t?.rules??[],children:n.jsx(a.Input,{...m,ref:c,onFocus:()=>{C(!j),F.current?.updateValue()},onBlur:()=>{R()},onKeyDown:o=>{if(o.key==="Backspace"&&C(!0),o.key==="Tab"&&C(!1),o.key==="Enter")if(j){const S=F.current?.value||"",I=E(S,r,!0);S.length===r.length&&I.isValid()?(C(!1),k(!1)):k(!0)}else C(!0)},style:{width:"65%"},allowClear:!0,placeholder:l.replace(/0/g,"_"),suffix:n.jsx(P.CalendarOutlined,{style:{color:"#d9d9d9"}}),autoComplete:"off"})}),n.jsx(a.DatePicker,{...i,open:j,picker:e,format:{format:r,type:"mask"},showNow:!0,value:V,onChange:D,onOpenChange:o=>{C(o),o||R(!1)},renderExtraFooter:()=>L?n.jsxs("div",{style:{color:"#faad14",paddingLeft:"8px",fontSize:"12px",display:"flex",alignItems:"center",gap:"6px",borderTop:"1px solid #f0f0f0",backgroundColor:"#fffbe6"},children:[n.jsx(P.ExclamationCircleOutlined,{}),n.jsx("span",{children:"유효하지 않은 날짜입니다"})]}):null,getPopupContainer:o=>o.parentElement,style:{position:"absolute",top:0,left:0,pointerEvents:"none",opacity:0,width:"100%"}})]})})},{RangePicker:Ye}=a.DatePicker,be=e=>{switch(e){case"year":return{format:"YYYY",mask:"0000",outputFormat:"YYYY"};case"month":return{format:"YYYY-MM",mask:"0000-00",outputFormat:"YYYYMM"};case"date":default:return{format:"YYYY-MM-DD",mask:"0000-00-00",outputFormat:"YYYYMMDD"}}},we=({type:e="date",itemProps:t={name:"dateRange"},inputProps:m,pickerProps:i})=>{const{format:r,mask:l,outputFormat:h}=be(e),c=x.useRef(null),F=x.useRef(null),u=x.useRef(null),d=x.useRef(null),j=x.useRef(null),C=a.Form.useFormInstance(),[L,k]=x.useState(!1),[U,V]=x.useState(!1),[B,p]=x.useState(null),[v,D]=x.useState(!1),R=x.useRef(!1),o=t?.name,[S,I]=x.useState([null,null]),N=a.Form.useWatch(o?Array.isArray(o)?[...o,0]:[o,0]:void 0,C),_=a.Form.useWatch(o?Array.isArray(o)?[...o,1]:[o,1]:void 0,C),O=a.Form.useWatch(o,C),z=X.useSizeConfig();x.useEffect(()=>{if(!c.current?.input)return;const s=Z(c.current.input,{mask:l,lazy:!1});return u.current=s,s.on("accept",()=>{const g=s.value,y=s.unmaskedValue||"";if(console.log("🔵 [시작일] accept 이벤트:",{maskValue:g,unmaskedValue:y,length:g.length,formatLength:r.length}),g.length>0&&(p("start"),k(!0),D(!1)),y.length===h.length){const f=E(g,r,!0);if(f.isValid()){console.log("🔵 [시작일] 입력 완료 및 검증 통과:",{parsed:f.format(r)});const M=f.format(h);R.current=!0;const b=Array.isArray(o)?[...o,0]:[o,0];C.setFieldValue(b,M),I([f,S[1]]),u.current&&u.current.updateValue(),V(!1),setTimeout(()=>{d.current&&(d.current.value="",d.current.unmaskedValue="",d.current.updateValue());const Y=Array.isArray(o)?[...o,1]:[o,1];C.getFieldValue(Y)||C.setFieldValue(Y,void 0),F.current?.focus(),setTimeout(()=>{if(d.current){const A=d.current.value||"";!(d.current.unmaskedValue||"")&&!A.replace(/[^0-9]/g,"")&&(d.current.value="",d.current.updateValue())}},10),p("end"),k(!0),R.current=!1},0)}else i?.allowEmpty?V(!1):(console.log("🔵 [시작일] 검증 실패:",{val:g,parsed:f}),V(!0))}}),()=>{s.destroy()}},[r,l,o]),x.useEffect(()=>{if(!F.current?.input)return;const s=Z(F.current.input,{mask:l,lazy:!1});return d.current=s,s.on("accept",()=>{const g=s.value,y=s.unmaskedValue||"";if(console.log("🟢 [종료일] accept 이벤트:",{maskValue:g,unmaskedValue:y,length:g.length,formatLength:r.length}),y===""||y.length===0){const f=Array.isArray(o)?[...o,1]:[o,1];C.setFieldValue(f,void 0),I([S[0],null]),d.current&&(d.current.value="",d.current.updateValue()),setTimeout(()=>{c.current?.focus(),p("start"),k(!0)},0);return}if(g.length>0&&(p("end"),k(!0)),g.length<r.length){V(!1);return}if(y.length===h.length){const f=E(g,r,!0);if(f.isValid()){const M=f.format(h);console.log("🟢 [종료일] 입력 완료:",{parsed:f.format(r),formatted:M}),R.current=!0;const b=Array.isArray(o)?[...o,1]:[o,1];C.setFieldValue(b,M),I([S[0],f]),d.current?.updateValue(),setTimeout(()=>{R.current=!1},0)}else i?.allowEmpty?V(!1):(console.log("🟢 [종료일] 검증 실패:",{val:g,parsed:f}),V(!0))}}),()=>{s.destroy()}},[r,l,o]),x.useEffect(()=>{console.log("🟡 [useEffect] form 값 변경 감지:",{startFormValue:N,endFormValue:_,formValue:O});const s=N??(Array.isArray(O)?O[0]:null),g=_??(Array.isArray(O)?O[1]:null);if(s===void 0&&g===void 0&&(!O||!Array.isArray(O))){I([null,null]);return}const y=b=>{if(!b)return null;let Y=null;if(typeof b=="string"&&b.length===h.length&&/^\d+$/.test(b))if(e==="date"){const w=b.substring(0,4),A=b.substring(4,6),H=b.substring(6,8);Y=E(`${w}-${A}-${H}`,r,!0)}else if(e==="month"){const w=b.substring(0,4),A=b.substring(4,6);Y=E(`${w}-${A}`,r,!0)}else e==="year"&&(Y=E(b,r,!0));else Y=E(b,r,!0);return Y&&Y.isValid()?Y:null},f=y(s),M=y(g);if(console.log("🟡 [useEffect] 파싱 결과:",{startParsed:f?f.format(r):null,endParsed:M?M.format(r):null,isStartDateFromPicker:v}),I([f,M]),R.current){console.log("🟡 [useEffect] 사용자 입력 중 - 마스크 값 업데이트 스킵"),V(!1);return}if(!v&&u.current){const b=u.current.value||"",Y=f?f.format(r):"",w=u.current.unmaskedValue||"",A=f?f.format(h):"";console.log("🟡 [useEffect] 시작일 마스크 값 체크:",{currentMaskValue:b,expectedMaskValue:Y,unmaskedValue:w,expectedUnmasked:A,shouldUpdate:b===""||b!==Y,canUpdate:w===""||w===A}),(b===""||b!==Y)&&(w===""||w===A?(console.log("🟡 [useEffect] 시작일 마스크 값 업데이트:",{before:b,after:f?f.format(r):""}),f?(u.current.value=f.format(r),u.current.updateValue()):(u.current.value="",u.current.updateValue())):console.log("🟡 [useEffect] 시작일 마스크 값 업데이트 스킵 (사용자 입력 중)"))}if(d.current){const b=d.current.value||"",Y=M?M.format(r):"",w=d.current.unmaskedValue||"",A=M?M.format(h):"";console.log("🟡 [useEffect] 종료일 마스크 값 체크:",{currentMaskValue:b,expectedMaskValue:Y,unmaskedValue:w,expectedUnmasked:A,shouldUpdate:b===""||b!==Y,canUpdate:w===""||w===A}),(b===""||b!==Y)&&(w===""||w===A?(console.log("🟡 [useEffect] 종료일 마스크 값 업데이트:",{before:b,after:Y}),M?(d.current.value=M.format(r),d.current.updateValue()):(d.current.value="",d.current.updateValue())):console.log("🟡 [useEffect] 종료일 마스크 값 업데이트 스킵 (사용자 입력 중)"))}V(!1)},[N,_,O,r,h,e]);const K=s=>{if(console.log("🔴 [RangePicker] 날짜 변경:",{dates:s?[s[0]?s[0].format(r):null,s[1]?s[1].format(r):null]:null,prevRange:[S[0]?S[0].format(r):null,S[1]?S[1].format(r):null]}),!s){I([null,null]);const Y=Array.isArray(o)?[...o,0]:[o,0],w=Array.isArray(o)?[...o,1]:[o,1];C.setFieldValue(Y,void 0),C.setFieldValue(w,void 0),u.current?.updateValue(),d.current?.updateValue();return}const[g,y]=s,f=S[0],M=g&&(!f||!g.isSame(f,e==="year"?"year":e==="month"?"month":"day"));if(console.log("🔴 [RangePicker] 시작일 변경 여부:",{isStartDateChanged:M,startDate:g?g.format(r):null,prevStartDate:f?f.format(r):null}),I([g,y]),M){console.log("🔴 [RangePicker] 시작일 선택됨 - input 비우기"),D(!0),u.current&&(u.current.value="",u.current.updateValue());const Y=g.format(h);console.log("🔴 [RangePicker] form 값 업데이트:",{formatted:Y});const w=Array.isArray(o)?[...o,0]:[o,0];C.setFieldValue(w,Y)}else if(!g&&u.current){D(!1),u.current.value="",u.current.updateValue();const Y=Array.isArray(o)?[...o,0]:[o,0];C.setFieldValue(Y,void 0)}else D(!1);const b=Array.isArray(o)?[...o,1]:[o,1];if(y){const Y=y.format(h);C.setFieldValue(b,Y),d.current&&(d.current.value=y.format(r),d.current.updateValue())}else C.setFieldValue(b,void 0),d.current&&(d.current.value="",d.current.updateValue());V(!1)},q=s=>{setTimeout(()=>{const g=document.activeElement,y=j.current,f=y?.querySelector(".ant-picker-dropdown");!(y&&(y.contains(g)||y===g||f?.contains(g)))&&!(s!==void 0?s:L)&&(console.log("✅ Input과 RangePicker 모두 포커스가 없습니다"),k(!1))},0)};return n.jsx($,{...t,name:void 0,validateStatus:U?"warning":void 0,children:n.jsxs(a.ConfigProvider,{componentSize:z.componentSize,theme:{components:{Input:{addonBg:"#fff"}}},children:[n.jsxs("div",{ref:j,style:{display:"flex",alignItems:"center",gap:"8px",width:"100%"},children:[n.jsx(a.Form.Item,{name:o?Array.isArray(o)?[...o,0]:[o,0]:void 0,getValueProps:s=>{if(!s)return{value:void 0};if(typeof s=="string"&&s.length===h.length&&/^\d+$/.test(s)){if(e==="date"){const g=s.substring(0,4),y=s.substring(4,6),f=s.substring(6,8);return{value:`${g}-${y}-${f}`}}else if(e==="month"){const g=s.substring(0,4),y=s.substring(4,6);return{value:`${g}-${y}`}}else if(e==="year")return{value:s}}return{value:E(s).format(r)}},normalize:s=>s?E(s).format(h):(i?.allowEmpty,void 0),noStyle:!0,rules:t?.rules??[],children:n.jsx(a.Input,{...m,value:void 0,ref:c,onFocus:()=>{if(p("start"),k(!L),D(!1),u.current){const s=Array.isArray(o)?[...o,0]:[o,0];C.getFieldValue(s)||(u.current.value="",u.current.unmaskedValue=""),u.current.updateValue()}},onBlur:()=>{q()},onKeyDown:s=>{if(s.key==="Backspace"&&(p("start"),k(!0)),s.key==="Enter")if(L&&B==="start"){const g=u.current?.value||"";g.length===r.length?E(g,r,!0).isValid()?(k(!1),V(!1)):i?.allowEmpty?V(!1):V(!0):V(!1)}else p("start"),k(!0)},style:{flex:1},allowClear:!0,placeholder:l.replace(/0/g,"_"),suffix:n.jsx(P.CalendarOutlined,{style:{color:"#d9d9d9"}}),autoComplete:"off"})}),n.jsx("span",{style:{color:"#d9d9d9",userSelect:"none"},children:"~"}),n.jsx(a.Form.Item,{name:o?Array.isArray(o)?[...o,1]:[o,1]:void 0,getValueProps:s=>{if(!s)return{value:void 0};if(typeof s=="string"&&s.length===h.length&&/^\d+$/.test(s)){if(e==="date"){const g=s.substring(0,4),y=s.substring(4,6),f=s.substring(6,8);return{value:`${g}-${y}-${f}`}}else if(e==="month"){const g=s.substring(0,4),y=s.substring(4,6);return{value:`${g}-${y}`}}else if(e==="year")return{value:s}}return{value:E(s).format(r)}},normalize:s=>s?E(s).format(h):(i?.allowEmpty,void 0),noStyle:!0,rules:t?.rules??[],children:n.jsx(a.Input,{...m,ref:F,onFocus:()=>{if(p("end"),k(!L),d.current){d.current.updateValue();const s=d.current.value||"";!(d.current.unmaskedValue||"")&&!s.replace(/[^0-9]/g,"")&&(d.current.value="",d.current.updateValue())}},onBlur:()=>{q()},onKeyDown:s=>{if(s.key==="Backspace"){const g=d.current?.value||"",y=d.current?.unmaskedValue||"";if(g===""||y===""||g.replace(/[^0-9]/g,"").length<=1){s.preventDefault();const f=Array.isArray(o)?[...o,1]:[o,1];C.setFieldValue(f,void 0),I([S[0],null]),d.current&&(d.current.value="",d.current.updateValue()),setTimeout(()=>{c.current?.focus(),p("start"),k(!0)},0);return}p("end"),k(!0)}if(s.key==="Tab"&&k(!1),s.key==="Enter")if(L&&B==="end"){const g=d.current?.value||"";g.length===r.length?E(g,r,!0).isValid()?(k(!1),V(!1)):i?.allowEmpty?V(!1):V(!0):V(!1)}else p("end"),k(!0)},style:{flex:1},allowClear:!0,onClear:()=>{const s=Array.isArray(o)?[...o,1]:[o,1];C.setFieldValue(s,void 0),I([S[0],null]),d.current&&(d.current.value="",d.current.updateValue()),setTimeout(()=>{c.current?.focus(),p("start"),k(!0)},0)},placeholder:l.replace(/0/g,"_"),suffix:n.jsx(P.CalendarOutlined,{style:{color:"#d9d9d9"}}),autoComplete:"off"})})]}),n.jsx(Ye,{...i,open:L,picker:e,format:{format:r,type:"mask"},showNow:!0,value:S,onChange:K,onOpenChange:s=>{k(s),s||q(!1)},renderExtraFooter:()=>U?n.jsxs("div",{style:{color:"#faad14",paddingLeft:"8px",fontSize:"12px",display:"flex",alignItems:"center",gap:"6px",borderTop:"1px solid #f0f0f0",backgroundColor:"#fffbe6"},children:[n.jsx(P.ExclamationCircleOutlined,{}),n.jsx("span",{children:"유효하지 않은 날짜입니다"})]}):null,getPopupContainer:s=>s.parentElement,style:{position:"absolute",top:0,left:0,pointerEvents:"none",opacity:0,width:"100%"}})]})})},{Option:te}=a.Select,Ve=({itemProps:e,inputProps:t})=>{const[m,i]=x.useState([]);return x.useEffect(()=>{t?.addField==="ALL"?i([{label:"전체",value:""},...t?.list||[]]):t?.addField==="NULL"?i([{label:"",value:""},...t?.list||[]]):i(t?.list||[])},[t?.list]),n.jsx($,{...e,getValueProps:r=>r?{value:r&&r.indexOf(",")>0?r.split(","):[r]}:{value:[]},normalize:r=>r!=null&&r!=null&&r.length>0?r.toString():"",children:n.jsx(a.Select,{...t,mode:"multiple",children:m.map(r=>{const{value:l,label:h}=r;return t?.printCode?n.jsx(te,{value:l,label:h,children:n.jsx(a.Space,{children:`[${l}] ${h}`})},l):n.jsx(te,{value:l,label:h,children:n.jsx(a.Space,{children:`${h}`})},l)})})})},Ie=({itemProps:e,inputProps:t})=>{const m=r=>{let l=r.toString().split(".");return t?.decimalPoint!=null&&l[1]!=null&&t?.decimalPoint>0?l[1].length>t?.decimalPoint?l[1]="."+l[1].substring(0,t?.decimalPoint):l[1]="."+l[1]:l[1]="",l[0].replace(/\B(?=(\d{3})+(?!\d))/g,",")+l[1]},i=r=>{let l=r.toString().split(".");return t?.decimalPoint!=null&&l[1]!=null&&t?.decimalPoint>0?l[1].length>t?.decimalPoint?l[1]="."+l[1].substring(0,t?.decimalPoint):l[1]="."+l[1]:l[1]="",l[0].replace(/\$\s?|(,*)/g,"")+l[1]};return n.jsx($,{...e,children:n.jsx(a.InputNumber,{...t,formatter:r=>m(r),parser:r=>i(r)})})},Ne=({itemProps:e,inputProps:t})=>n.jsx($,{...e,children:n.jsx(a.Radio.Group,{...t})}),{RangePicker:ve}=a.DatePicker,re={year:{displayFormat:"YYYY",outputFormat:"YYYY"},month:{displayFormat:"YYYY-MM",outputFormat:"YYYYMM"},date:{displayFormat:"YYYY-MM-DD",outputFormat:"YYYYMMDD"},time:{displayFormat:"HH:mm",outputFormat:"HHmm"},datetime:{displayFormat:"YYYY-MM-DD HH:mm",outputFormat:"YYYYMMDDHHmm"}},Le=({itemProps:e,inputProps:t,type:m="date",minDate:i,maxDate:r,returnType:l="string"})=>{const{displayFormat:h,outputFormat:c}=x.useMemo(()=>re[m],[m]),F=x.useMemo(()=>Object.values(re).map(u=>u.outputFormat).sort((u,d)=>{if(u.length===d.length){if(u===c)return-1;if(d===c)return 1}return d.length-u.length}),[c]);return n.jsx($,{...e,getValueProps:u=>({value:u&&u.length>0?[u[0]?E.isDayjs(u[0])?u[0]:E(u[0],F):null,u[1]?E.isDayjs(u[1])?u[1]:E(u[1],F):null]:null}),normalize:u=>u?l==="dayjs"?[u[0]??void 0,u[1]??void 0]:[u[0]?u[0].format(c):void 0,u[1]?u[1].format(c):void 0]:[void 0,void 0],children:n.jsx(ve,{...t,order:!0,minDate:i?E(i,F):void 0,maxDate:r?E(r,F):void 0,picker:m==="datetime"?"date":m,showTime:t?.showTime??(m==="datetime"||m==="time"),format:h})})},ne=a.Input.Search,Me=e=>{const t=a.Form.useFormInstance(),{openPopup:m}=ae.usePopupStore(),i=e.itemProps?.name||[],r=e.popupConfig||{callback(h){Array.isArray(i)&&i.length>1?(t.setFieldValue(i[0],h.code),t.setFieldValue(i[1],h.name)):t.setFieldValue(i,h.code)}},l={...e,placeholder:typeof e.placeholder=="string"?e.placeholder:e.placeholder?.[0]||"",onChange:h=>{Array.isArray(i)&&i.length>1&&t.setFieldValue(i[0],""),e.onChange?.(h)},onSearch:h=>{e.popuCd?m(e.popuCd,e.popupParams,r):e.onSearch?.(h)}};return Array.isArray(i)&&i.length>1?n.jsx($,{...e.itemProps,name:void 0,children:n.jsxs(a.Space.Compact,{block:!0,children:[n.jsx(a.Form.Item,{name:i[0],rules:e.itemProps?.rules,style:{width:"40%",marginBottom:0,marginInlineEnd:0},validateStatus:"",help:"",children:n.jsx(a.Input,{style:{color:"#999",backgroundColor:"#f5f5f5"},placeholder:e.placeholder?.[0]||"",readOnly:!0})}),n.jsx(a.Form.Item,{name:i[1],style:{width:"60%",marginBottom:0},children:n.jsx(ne,{readOnly:e.readOnly,enterButton:n.jsx(a.Button,{icon:n.jsx(P.SearchOutlined,{}),disabled:e.readOnly}),...l})})]})}):n.jsx($,{...e.itemProps,children:n.jsx(ne,{...l})})},Be=({itemProps:e,selectProps:t={options:[],allowClear:!0}})=>{const m=a.Form.useFormInstance(),i=!!m,r=x.useMemo(()=>t?.addField==="ALL"?[{label:"전체",value:""},...t?.options||[]]:t?.addField==="NULL"?[{label:"",value:""},...t?.options||[]]:t?.options||[],[t.options,t.addField]),l=F=>{t.onChange?.(F)},h={...t,allowClear:t.allowClear??!0,options:r,onChange:l,variant:t.variant},c=n.jsx(a.Select,{...h,disabled:t.disabled});return t.copyable&&!i&&console.warn("BwgSelect: copyable 기능은 Form 컨텍스트 내에서만 사용 가능합니다."),t.copyable?n.jsx($,{...e,name:void 0,children:n.jsxs(a.Space.Compact,{block:!0,children:[n.jsx(a.Form.Item,{name:e?.name,rules:e?.rules,style:{width:"100%",marginBottom:0},validateStatus:"",help:"",children:c}),n.jsx(a.Typography.Paragraph,{copyable:{text:i&&m?.getFieldValue(e?.name)?.toString()||"",tooltips:["코드복사","코드복사됨"]},style:{margin:0,backgroundColor:"#f5f5f5",borderRadius:"4px",border:"1px solid #d9d9d9",fontSize:"12px",color:"#666",display:"flex",alignItems:"center",height:"30px",padding:"0 8px"}})]})}):n.jsx($,{...e,children:c})},Ee=({itemProps:e,inputProps:t={format:"YN"}})=>{const m=a.Form.useFormInstance(),i=(r,l)=>{t.format==="boolean"?m.setFieldValue(e?.name,r):m.setFieldValue(e?.name,r?"Y":"N"),t.onChange&&t.onChange(r,l)};return n.jsx($,{...e,getValueProps:r=>({checked:t.format==="boolean"?!!r:r==="Y"}),normalize:r=>typeof r=="boolean"?t.format==="boolean"?r:r?"Y":"N":t.format==="boolean"?!!r:r?"Y":"N",children:n.jsx(a.Switch,{...t,onChange:(r,l)=>i(r,l)})})},{TextArea:De}=a.Input,Ae=({itemProps:e,inputProps:t})=>n.jsx($,{...e,children:n.jsx(De,{...t})}),_e=[".pdf",".xlsx",".xls",".docx",".doc",".pptx",".ppt",".hwp",".txt",".csv",".jpg",".jpeg",".png",".gif",".zip"],se={FILE:"file"},Oe=({originNode:e,file:t,fileList:m,moveFile:i,onDrop:r})=>{const l=x.useRef(null),[{handlerId:h},c]=J.useDrop({accept:se.FILE,collect:j=>({handlerId:j.getHandlerId()}),hover(j,C){if(!l.current)return;const L=j.uid,k=t.uid;if(L===k)return;const U=G.findIndex(m,{uid:k}),V=G.findIndex(m,{uid:L});if(V===-1||U===-1)return;const B=l.current.getBoundingClientRect(),p=C.getClientOffset();if(!p)return;const v=(B.bottom-B.top)/2,D=p.y-B.top;V<U&&D<v||V>U&&D>v||i(L,k)},drop(){r()}}),[{isDragging:F},u]=J.useDrag({type:se.FILE,item:()=>({uid:t.uid,index:G.findIndex(m,{uid:t.uid})}),collect:j=>({isDragging:j.isDragging()})}),d=F?0:1;return u(c(l)),n.jsx("div",{ref:l,style:{opacity:d},"data-handler-id":h,children:e})},Re=({itemProps:e,fileGrpKey:t,onUploadComplete:m,onFetchFilesTrxCd:i="SCMFILE00101",onSuccessTrxCd:r="SCMFILE00102",onDeleteFileTrxCd:l="SCMFILE00103",onReorderFilesTrxCd:h="SCMFILE00104",allowedExtensions:c=_e,maxFileSize:F=200,showButton:u=!0,multiple:d=!1,newFileGrpKeyonModify:j=!1,buttonText:C="파일 선택",localOnly:L=!1,onFilesChange:k})=>{const[U,V]=x.useState([]),B=x.useRef(t),p=x.useRef([]),v=a.Form.useFormInstance(),D=()=>{if(L||p.current.length===0)return;const s=[...p.current];if(p.current=[],r){const g=s.map(y=>({crprCd:T.getUserInfo()?.crprCd,sysCd:__SYS_CD__,fileGrpKey:B.current,physFileNm:y.fileNameP,lgclFileNm:y.fileNameL,filePath:y.filePath,fileExtn:y.fileExt,fileSize:y.fileSize,mltpYn:"N"}));console.log("newFileGrpKeyonModify",j),console.log("newFileGrpKeyonModify",j?0:B.current),T.callService(r,{crprCd:T.getUserInfo()?.crprCd,sysCd:__SYS_CD__,fileGrpKey:j?0:B.current,oldFileGrpKey:B.current,newFileGrpKeyonModify:j,sub:g}).then(y=>{if(y?.sub&&y.sub.length>0){const f=y.sub[0].fileGrpKey;(!B.current||j)&&(B.current=f);const M=new Map;y.sub.forEach(w=>{const A=s.find(H=>H.fileNameL===w.lgclFileNm);A&&M.set(A.tempId,w)});const b=e?.name;(w=>{if(N){const A=v?.getFieldValue(b)||[],H=w(A);v?.setFieldValue(b,H)}else V(A=>w(A))})(w=>w.map(A=>{const H=M.get(A.uid);if(H){const Q=s.find(le=>le.tempId===A.uid);return m&&Q&&m({...Q,fileGrpKey:f,fileKey:H.fileKey}),{...A,name:H.lgclFileNm,fileGrpKey:f,fileKey:H.fileKey,uid:H.fileKey,status:"done",url:`/api/download?filePath=${H.filePath}&logicalName=${H.lgclFileNm}`}}return A}))}}).catch(y=>{console.error("업로드 후처리 서비스 호출 실패:",y),a.message.error("파일 후처리 중 오류가 발생했습니다.");const f=new Set(s.map(Y=>Y.tempId)),M=e?.name;(Y=>{if(N){const w=v?.getFieldValue(M)||[],A=Y(w);v?.setFieldValue(M,A)}else V(w=>Y(w))})(Y=>Y.map(w=>f.has(w.uid)?{...w,status:"error",error:"후처리 실패"}:w))})}},R=x.useRef(G.debounce(D,500)).current;x.useEffect(()=>()=>{R.cancel()},[R]),x.useEffect(()=>{B.current=t},[t]),x.useEffect(()=>{L||t&&i&&T.callService(i,{crprCd:T.getUserInfo()?.crprCd,sysCd:__SYS_CD__,fileGrpKey:t}).then(s=>{if(s?.sub){const g=s.sub.map(f=>({uid:f.fileKey,name:f.lgclFileNm,status:"done",url:`/api/download?filePath=${f.filePath}&logicalName=${f.lgclFileNm}`})),y=e?.name;N?v?.setFieldValue(y,g):V(g)}else{const g=e?.name;N?v?.setFieldValue(g,[]):V([])}}).catch(s=>{console.error("파일 목록 조회 서비스 호출에 실패했습니다.",s),a.message.error("파일 목록을 불러오는 중 오류가 발생했습니다.")})},[t,i]);const o=(s,g)=>{const y=e?.name,f=N?v?.getFieldValue(y)||[]:U,M=G.findIndex(f,{uid:s}),b=G.findIndex(f,{uid:g});if(M<0||b<0)return;const Y=[...f],[w]=Y.splice(M,1);Y.splice(b,0,w),N?v?.setFieldValue(y,Y):V(Y)},S=()=>{if(!L&&t&&h){const s=e?.name,y=(N?v?.getFieldValue(s)||[]:U).map(f=>f.uid);T.callService(h,{crprCd:T.getUserInfo()?.crprCd,sysCd:__SYS_CD__,fileGrpKey:t,reorderedFileKeys:y}).then(()=>{a.message.success("파일 순서가 성공적으로 저장되었습니다.")}).catch(f=>{console.error("파일 순서 저장 서비스 호출 실패:",f),a.message.error("파일 순서 저장 중 오류가 발생했습니다.")})}},I=s=>{const g=e?.name,y=N?v?.getFieldValue(g)||[]:U;if(!d&&y.length>0)return a.message.error("하나의 파일만 업로드할 수 있습니다."),a.Upload.LIST_IGNORE;if(c&&c.length>0){const f=`.${s.name.split(".").pop()?.toLowerCase()}`;if(!c.includes(f))return a.message.error(`${s.name} 파일은 허용되지 않는 확장자입니다. (${c.join(", ")})`),a.Upload.LIST_IGNORE}return F&&!(s.size/1024/1024<F)?(a.message.error(`일반업로드의 최대용량은 ${F}MB입니다.`),a.Upload.LIST_IGNORE):!L},N=!!e?.name,_={name:"file",multiple:d,action:L?void 0:"/api/upload",beforeUpload:I,showUploadList:{showRemoveIcon:u},onChange(s){const{status:g,uid:y}=s.file;if(g==="removed"){if(!L&&l)T.callService(l,{crprCd:T.getUserInfo()?.crprCd,sysCd:__SYS_CD__,fileGrpKey:j?0:B.current,fileKey:y,oldFileGrpKey:B.current,newFileGrpKeyonModify:j}).then(f=>{if(a.message.success("파일이 성공적으로 삭제되었습니다."),j&&(B.current=f.fileGrpKey),N){const M=e?.name;v?.setFieldValue(M,s.fileList)}else V(s.fileList);k?.(s.fileList),m?.({fileGrpKey:f.fileGrpKey})}).catch(f=>{console.error("파일 삭제 서비스 호출에 실패했습니다.",f),a.message.error("파일 삭제 중 오류가 발생했습니다.")});else{if(N){const f=e?.name;v?.setFieldValue(f,s.fileList)}else V(s.fileList);k?.(s.fileList)}return}if(N){const f=e?.name;v?.setFieldValue(f,s.fileList)}else V(s.fileList);if(k?.(s.fileList),g==="done")if(!L&&s.file.response?.success){const{uploadedFiles:f}=s.file.response;f&&Array.isArray(f)&&f.length>0&&(f.forEach(M=>{M.tempId=s.file.uid,p.current.push(M)}),R()),a.message.success(s.file.response.message||`${s.file.name} 파일이 성공적으로 업로드되었습니다.`)}else a.message.error(s.file.response?.message||`${s.file.name} 파일 업로드에 실패했습니다.`);else g==="error"&&a.message.error(s.file.response?.message||`${s.file.name} 파일 업로드 중 오류가 발생했습니다.`)},itemRender(s,g,y){const f=x.cloneElement(s,{href:g.url||void 0,title:void 0});return n.jsx(Oe,{originNode:f,file:g,fileList:y,moveFile:o,onDrop:S},g.uid)}};N||(_.fileList=U);const O=s=>Array.isArray(s)?s:s&&s.fileList,z=e?.name,K=N?a.Form.useWatch?.(z,v):void 0,q=N?K||[]:U;return n.jsx(J.DndProvider,{backend:ce.HTML5Backend,children:n.jsx($,{valuePropName:"fileList",getValueFromEvent:O,...e,children:n.jsx(a.Upload,{headers:{SYSCD:__SYS_CD__},..._,listType:"picture",children:u&&(d||q.length===0)&&n.jsx(a.Button,{icon:n.jsx(P.UploadOutlined,{}),children:C})})})})},Ue=a.Input.Search,ze=e=>{const t=a.Form.useFormInstance(),{openCorePopup:m}=X.usePopup(),i={value:"deptNm",fieldName:"deptNm",placeholder:"부서명"},r={value:"empNm",fieldName:"empNm",placeholder:"사원명 입력"},l=e.field1||i,h=e.field2||r,c=x.useCallback(d=>{t.setFieldValue(e.employeeFieldName||"employee",d),t.setFieldValue(e.empNoFieldName||"empNo",d.empNo??""),t.setFieldValue(l.fieldName,d[l.value||"deptNm"]??""),t.setFieldValue(h.fieldName,d[h.value||"empNm"]??""),e.onFinish?.()},[t,l,h,e.employeeFieldName]),F=x.useCallback(d=>{m("CORE_ORGANIZATION_01",{onSelect:j=>{c(j)},defaultParams:{keyword:d}})},[c,m]),u=x.useCallback(async d=>{const j=d?.trim();if(j)try{const C=await T.callService("SCMUTIL00101",{keyword:j},{showLoading:!1}),L=C?.empList||[];if(C?.empCnt===0){a.message.warning("일치하는 사원을 찾을 수 없어 팝업을 열립니다. 사원을 선택해주세요."),F();return}if(C?.empCnt>1){a.message.info("여러 건이 검색되어 팝업이 열립니다. 사원을 선택해주세요."),F(j);return}const k=L[0];c(k)}catch(C){console.error("사원 검색 서비스 실패:",C),a.message.error("사원 검색 중 오류가 발생했습니다.")}},[c,F]);return n.jsx($,{label:e.label||"사원",name:void 0,children:n.jsxs(a.Space.Compact,{block:!0,children:[n.jsx(a.Form.Item,{name:l.fieldName,style:{width:"40%",marginBottom:0,marginInlineEnd:0},validateStatus:"",help:"",children:n.jsx(a.Input,{style:{color:"#999",backgroundColor:"#f5f5f5"},placeholder:l.placeholder,readOnly:!0})}),n.jsx(a.Form.Item,{name:e.employeeFieldName||"employee",hidden:!0}),n.jsx(a.Form.Item,{name:e.empNoFieldName||"empNo",hidden:!0}),n.jsx(a.Form.Item,{name:h.fieldName,style:{width:"60%",marginBottom:0},children:n.jsx(Ue,{allowClear:!0,readOnly:e.readOnly,placeholder:h.placeholder,enterButton:n.jsx(a.Button,{icon:n.jsx(P.SearchOutlined,{}),disabled:e.readOnly,onClick:()=>{F()}}),onSearch:u,onChange:d=>{t.setFieldValue(l.fieldName,""),t.setFieldValue(e.employeeFieldName||"employee",null),t.setFieldValue(e.empNoFieldName||"empNo","")}})})]})})};exports.BwgButton=ue;exports.BwgCheck=de;exports.BwgCheckList=fe;exports.BwgDatePicker=me;exports.BwgDownload=ge;exports.BwgEmpSearch=ze;exports.BwgForm=oe;exports.BwgFormItem=$;exports.BwgInput=he;exports.BwgLargeUploader=Fe;exports.BwgMaskedDate=ke;exports.BwgMaskedInput=Se;exports.BwgMaskedRange=we;exports.BwgMultiSelect=Ve;exports.BwgNumber=Ie;exports.BwgRadio=Ne;exports.BwgRangePicker=Le;exports.BwgSearch=Me;exports.BwgSelect=Be;exports.BwgSwitch=Ee;exports.BwgTextArea=Ae;exports.BwgUploader=Re;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),s=require("antd"),h=require("react"),ie=require("../../stores/index.cjs"),v=require("dayjs"),Y=require("@ant-design/icons"),$=require("../../utils/index.cjs"),me=require("jszip"),J=require("imask"),G=require("../../chunks/provider-DrmM0H4o.cjs"),Q=require("lodash"),Z=require("react-dnd"),ce=require("react-dnd-html5-backend"),fe=require("antd/es/upload/Dragger"),W=t=>{const{componentSize:r}=ie.useUserStore(),m=h.useMemo(()=>t.size?t.size:{0:"small",1:"middle",2:"large"}[r],[r,t.size]),l=h.useMemo(()=>({0:12,1:14,2:16})[r],[r]);return e.jsx(s.Button,{...t,size:m,className:"bwg-btn",style:{fontSize:`${l}px`,...t.style},children:t.children})},T=h.memo(({children:t,label:r,name:m,rules:l,initialValue:n,style:a,required:d,...c})=>{const g={fontWeight:"bold"};(l==null||l==null)&&d&&(l=[{required:!0,message:`${r}을(를) 입력해주세요.`}]);const i=Array.isArray(l)&&l.some(F=>F.required===!0),u=()=>typeof r=="string"?e.jsxs("span",{style:g,children:[r,i&&e.jsx("span",{style:{color:"#ff4d4f",marginLeft:"4px"},children:"*"})]}):e.jsx("span",{style:g,children:r});return e.jsx(s.Form.Item,{className:"bwg-form-item",label:r?u():void 0,labelAlign:c.labelAlign||"left",name:m,rules:l,colon:!1,initialValue:n,style:a,...c,children:t})}),ge=({itemProps:t,inputProps:r={format:"YN"}})=>{const m=s.Form.useFormInstance(),l=n=>{r.format==="boolean"?m.setFieldValue(t?.name,n.target.checked):m.setFieldValue(t?.name,n.target.checked?"Y":"N"),r.onChange&&r.onChange(n)};return e.jsx(T,{...t,getValueProps:n=>({checked:r.format==="boolean"?!!n:n==="Y"}),normalize:n=>typeof n=="boolean"?r.format==="boolean"?n:n?"Y":"N":r.format==="boolean"?!!n:n?"Y":"N",children:e.jsx(s.Checkbox,{...r,onChange:l,children:r?.title})})},he=({itemProps:t,inputProps:r})=>{const m=s.Form.useFormInstance(),[l,n]=h.useState(t?.initialValue??[]),[a,d]=h.useState([]),c=a.length>0&&a.length==l?.length,g=l?.length>0&&l.length<a.length;h.useEffect(()=>{d(i(r?.options))},[r?.options]),h.useEffect(()=>{n(l)},[l]);const i=x=>{const w=[];return(x||[]).map((C,A)=>{w.push(C.value)}),w},u=x=>{n(x.target.checked?a:[]),m.setFieldValue(t?.name,x.target.checked?a:[])},F=x=>{n(x),m.setFieldValue(t?.name,x),r?.onChange&&typeof r?.onChange=="function"&&r?.onChange(x)};return e.jsx(T,{...t,children:e.jsxs(s.ConfigProvider,{theme:{components:{Checkbox:{colorPrimary:"var(--check-primary)",colorPrimaryBorder:"var(--check-primary)",colorPrimaryHover:"var(--check-primary-active)"}}},children:[r?.allCheck&&e.jsx(s.Checkbox,{indeterminate:g,checked:c,onChange:u,children:"전체선택"}),e.jsx(s.Checkbox.Group,{options:r?.options,value:l,onChange:F})]})})},re={year:{displayFormat:"YYYY",outputFormat:"YYYY"},month:{displayFormat:"YYYY-MM",outputFormat:"YYYYMM"},date:{displayFormat:"YYYY-MM-DD",outputFormat:"YYYYMMDD"},time:{displayFormat:"HH:mm",outputFormat:"HHmm"},datetime:{displayFormat:"YYYY-MM-DD HH:mm",outputFormat:"YYYYMMDDHHmm"}},pe=({itemProps:t,inputProps:r,type:m="date",returnType:l="string"})=>{const{displayFormat:n,outputFormat:a}=h.useMemo(()=>re[m],[m]),d=h.useMemo(()=>Object.values(re).map(c=>c.outputFormat).sort((c,g)=>{if(c.length===g.length){if(c===a)return-1;if(g===a)return 1}return g.length-c.length}),[a]);return e.jsx(T,{...t,getValueProps:c=>({value:c?v.isDayjs(c)?c:v(c,d):null}),normalize:c=>c?l==="dayjs"?c:c.format(a):null,children:e.jsx(s.DatePicker,{...r,picker:m==="datetime"?"date":m,showTime:r?.showTime??(m==="datetime"||m==="time"),format:r?.format??n})})},xe=({fileGrpKey:t,onFetchFilesTrxCd:r="SCMFILE00101",readOnly:m=!1,appCd:l=__APP_CD__})=>{const[n,a]=h.useState([]);h.useEffect(()=>{if(r)if(l!=__APP_CD__){const g=$.getApiDeps().findSystemByAppCd?.(l??__APP_CD__);if(!g||!g.sysCd){console.error("해당 앱코드는 존재하지 않습니다.",l);return}$.callServiceByAppCd({trxCd:r,appCd:l},{crprCd:$.getCrprCd(),sysCd:g.sysCd,fileGrpKey:t}).then(i=>{if(i?.sub){const u=i.sub.map(F=>({uid:F.fileKey,name:F.lgclFileNm,filePath:F.filePath}));a(u)}}).catch(i=>{console.error("파일 목록 조회 서비스 호출에 실패했습니다.",i),s.message.error("파일 목록을 불러오는 중 오류가 발생했습니다.")})}else $.callService(r,{crprCd:$.getUserInfo()?.crprCd,sysCd:__SYS_CD__,fileGrpKey:t}).then(c=>{if(c?.sub){const g=c.sub.map(i=>({uid:i.fileKey,name:i.lgclFileNm,filePath:i.filePath}));a(g)}}).catch(c=>{console.error("파일 목록 조회 서비스 호출에 실패했습니다.",c),s.message.error("파일 목록을 불러오는 중 오류가 발생했습니다.")});else a([])},[t,r,l]);const d=async c=>{try{const i=$.getApiDeps().findSystemByAppCd?.(l??__APP_CD__);if(!i||!i.sysCd){console.error("해당 앱코드는 존재하지 않습니다.",l);return}const F=await fetch("/api/download",{method:"POST",headers:{SYSCD:i.sysCd,"Content-Type":"application/json"},body:JSON.stringify({filePath:c.filePath,logicalName:c.name,fileKey:c.uid})});if(!F.ok){const y=(await F.json().catch(()=>null))?.message||"파일 다운로드에 실패했습니다.";throw new Error(y)}const x=await F.blob(),w=window.URL.createObjectURL(x),C=document.createElement("a");C.href=w,C.setAttribute("download",c.name),document.body.appendChild(C),C.click(),document.body.removeChild(C),window.URL.revokeObjectURL(w)}catch(g){console.error(g),s.message.error(g.message||"파일을 다운로드하는 중 오류가 발생했습니다.")}};return e.jsx(s.Card,{title:"파일 목록",children:e.jsx(s.List,{dataSource:n,renderItem:c=>e.jsx(s.List.Item,{actions:m?[]:[e.jsx(s.Button,{type:"text",icon:e.jsx(Y.DownloadOutlined,{}),onClick:()=>d(c)},"download")],children:e.jsx(s.List.Item.Meta,{avatar:e.jsx(Y.PaperClipOutlined,{}),title:c.name})})})})},ue=h.forwardRef(({children:t,labelCol:r,style:m,className:l,...n},a)=>e.jsx(s.ConfigProvider,{form:{},children:e.jsx(s.Form,{ref:a,...n,requiredMark:!1,labelCol:r||{flex:"100px"},style:{padding:"10px",...m},className:`bwg-form ${l??""}`,children:t})}));ue.displayName="BwgForm";const ye=({itemProps:t,inputProps:r})=>e.jsx(T,{...t,children:e.jsx(s.Input,{...r})}),{Text:K}=s.Typography,{Dragger:Fe}=s.Upload,je=[".pdf",".xlsx",".xls",".docx",".doc",".pptx",".ppt",".hwp",".txt",".csv",".jpg",".jpeg",".png",".gif",".zip"],Ce=(t,r=2)=>{if(t===0)return"0 Bytes";const m=1024,l=r<0?0:r,n=["Bytes","KB","MB","GB","TB"],a=Math.floor(Math.log(t)/Math.log(m));return parseFloat((t/Math.pow(m,a)).toFixed(l))+" "+n[a]},Se=({title:t="첨부파일",fileGrpKey:r,onUploadComplete:m,onSuccessTrxCd:l="SCMFILE00102",anotherServiceTrxCd:n="SCMFILE00105",allowedExtensions:a=je,maxFileSize:d=2048})=>{const[c,g]=h.useState([]),[i,u]=h.useState(!1),[F,x]=h.useState(!1),[w,C]=h.useState(0),A=p=>{if(a&&a.length>0){const L=(R=>{const o=R.lastIndexOf(".");return o===-1?"":R.substring(o).toLowerCase()})(p.name);if(!a.includes(L))return s.message.error(`${p.name} 파일은 허용되지 않는 확장자입니다. (${a.join(", ")}만 가능)`),!1}return!0},y=async()=>{const p=c.filter(S=>S.status!=="done"),P=p.reduce((S,b)=>S+(b.size||0),0),L=2*1024*1024*1024;if(P>L){s.notification.error({message:"업로드 용량 초과",description:"한 번에 업로드할 수 있는 총 파일 용량은 2GB를 초과할 수 없습니다."});return}if(p.length===0){s.message.warning("업로드할 파일이 없거나 모든 파일이 이미 업로드되었습니다.");return}x(!0);let R;try{const S=new me;p.forEach(b=>{b.originFileObj&&S.file(b.name,b.originFileObj)}),R=await S.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:9}})}catch(S){x(!1),s.message.error("파일을 압축하는 중 오류가 발생했습니다."),console.error("Zipping error:",S);return}x(!1);const o=new FormData;o.append("file",R,"upload.zip"),u(!0),C(0);try{const S=await new Promise((O,B)=>{const M=new XMLHttpRequest;M.open("POST","/api/upload-large",!0),M.upload.onprogress=_=>{if(_.lengthComputable){const X=Math.round(_.loaded/_.total*100);C(X)}},M.onload=()=>{if(M.status>=200&&M.status<300)try{const _=JSON.parse(M.responseText);_.success?O(_):B(new Error(_.message||"파일 업로드에 실패했습니다."))}catch{B(new Error("잘못된 서버 응답입니다."))}else try{const _=JSON.parse(M.responseText);B(new Error(_.message||`서버 오류: ${M.status}`))}catch{B(new Error(`서버 오류: ${M.status}`))}},M.onerror=()=>{B(new Error("네트워크 오류가 발생했습니다."))},M.send(o)});s.message.success(S.message||"압축 파일이 성공적으로 업로드되었습니다.");const b=c.map(O=>p.find(B=>B.uid===O.uid)?{...O,status:"done"}:O);if(g(b),l&&S.uploadedFiles&&Array.isArray(S.uploadedFiles)){const O=$.getUserInfo();S.uploadedFiles.forEach(B=>{const M={crprCd:O?.crprCd,sysCd:__SYS_CD__,fileGrpKey:r,sub:[{crprCd:O?.crprCd,sysCd:__SYS_CD__,fileGrpKey:r,physFileNm:B.fileNameP,lgclFileNm:B.fileNameL,filePath:B.filePath,fileExtn:B.fileExt,fileSize:B.fileSize,mltpYn:"Y"}]};$.callService(l,M).then(_=>{const X=c.map(q=>({crprCd:O?.crprCd,sysCd:__SYS_CD__,fileGrpKey:_.sub[0].fileGrpKey,fileKey:_.sub[0].fileKey,lgclFileNm:q.name,fileSize:q.size,fileExtn:q.name.split(".").pop(),fileType:q.type}));$.callService(n,{sub:X})}).catch(_=>{console.error("후처리 서비스 호출 실패:",_),s.message.error(`${B.fileNameL} 파일의 후처리 작업에 실패했습니다.`)}),m&&m({fileNameP:B.fileNameP,fileNameL:B.fileNameL})})}}catch(S){s.message.error(S.message||"파일 업로드 중 오류가 발생했습니다.");const b=c.map(O=>p.find(B=>B.uid===O.uid)?{...O,status:"error",response:S.message||"파일 업로드 중 오류가 발생했습니다."}:O);g(b)}finally{u(!1)}},E={multiple:!0,fileList:c,beforeUpload:p=>A(p)?d&&p.size>=d*1024*1024?(s.message.error(`대용량 첨부 파일 최대 크기는 ${(d/1024).toFixed(1)}GB입니다.`),s.Upload.LIST_IGNORE):!1:s.Upload.LIST_IGNORE,onChange:({fileList:p})=>{const P=new Map(c.map(L=>[L.uid,L]));p.forEach(L=>{P.set(L.uid,L)}),g(Array.from(P.values()))},onRemove:p=>{const P=c.filter(L=>L.uid!==p.uid);g(P)},showUploadList:!1};return e.jsx(s.Spin,{spinning:i||F,tip:F?"파일 압축 중...":`파일 업로드 중... ${w}%`,children:e.jsxs("div",{className:"bwg-large-uploader-container",children:[e.jsx(s.Card,{title:e.jsx(K,{strong:!0,children:t}),extra:e.jsx(s.Upload,{...E,children:e.jsx(s.Button,{icon:e.jsx(Y.UploadOutlined,{}),children:"파일 선택"})}),style:{padding:0},children:e.jsx(Fe,{...E,style:{border:"none",background:"transparent",padding:0},children:e.jsx("div",{className:"upload-list-container",children:c.length>0?e.jsx(s.List,{style:{textAlign:"left"},dataSource:c,renderItem:p=>{const P=p.status==="done",L=p.status==="error";let R;return P?R=e.jsx(Y.CheckCircleOutlined,{style:{color:"#52c41a",fontSize:14}}):L?R=e.jsx(s.Tooltip,{title:typeof p.response=="string"?p.response:"업로드 실패",children:e.jsx(Y.CloseCircleOutlined,{style:{color:"#ff4d4f",fontSize:14}})}):R=e.jsx(Y.FileTextOutlined,{style:{fontSize:14}}),e.jsx(s.List.Item,{actions:[e.jsx(K,{type:"secondary",children:Ce(p.size||0)},"size"),e.jsx(s.Button,{type:"text",icon:e.jsx(Y.DeleteOutlined,{}),onClick:o=>{o.stopPropagation(),E.onRemove?.(p)},disabled:i||F},"delete")],children:e.jsx(s.List.Item.Meta,{avatar:R,title:e.jsx(K,{type:L?"danger":void 0,children:p.name})})},p.uid)}}):e.jsxs(s.Flex,{gap:"middle",align:"center",justify:"center",vertical:!0,style:{padding:"20px 0",minHeight:"120px"},children:[e.jsx(Y.InboxOutlined,{style:{fontSize:"32px",color:"#999"}}),e.jsx(K,{type:"secondary",children:"업로드할 파일을 선택하거나 이 영역으로 드래그하세요."})]})})})}),c.length>0&&e.jsxs(s.Flex,{justify:"flex-end",align:"center",gap:"large",style:{marginTop:16},children:[i&&e.jsx("div",{style:{width:"250px"},children:e.jsx(s.Progress,{percent:w,size:"small"})}),e.jsx(s.Button,{type:"primary",onClick:y,disabled:i||F||c.filter(p=>p.status!=="done").length===0,icon:e.jsx(Y.CloudUploadOutlined,{}),children:"일괄 업로드"})]})]})})},ke=t=>{if(typeof t=="string")return t.replace(/0/g,"_");if(Array.isArray(t))return t[0].replace(/0/g,"_");if(typeof t=="object"&&"mask"in t&&"blocks"in t){const{mask:r,blocks:m}=t;return r.split(".").map(l=>{const a=m?.[l]?.maxLength??3;return"_".repeat(a)}).join(".")}return""},we=({itemProps:t,inputProps:r,mask:m})=>{const l=h.useRef(null),n=s.Form.useFormInstance(),a=h.useMemo(()=>ke(m),[m]);return h.useEffect(()=>{if(!l.current?.input)return;const d=typeof m=="string"||Array.isArray(m)?{mask:m}:m,c=J(l.current.input,d);return c.on("accept",()=>{n&&t?.name&&n.setFieldValue(t.name,c.value)}),()=>{c.destroy()}},[m,n,t?.name]),e.jsx(T,{...t,children:e.jsx(s.Input,{...r,ref:l,placeholder:a})})},be=t=>{switch(t){case"year":return{format:"YYYY",mask:"0000",outputFormat:"YYYY"};case"month":return{format:"YYYY-MM",mask:"0000-00",outputFormat:"YYYYMM"};case"date":default:return{format:"YYYY-MM-DD",mask:"0000-00-00",outputFormat:"YYYYMMDD"}}},Ie=({type:t="date",itemProps:r={name:"calendar"},inputProps:m,pickerProps:l})=>{const{format:n,mask:a,outputFormat:d}=be(t),c=h.useRef(null),g=h.useRef(null),i=h.useRef(null),u=s.Form.useFormInstance(),[F,x]=h.useState(!1),[w,C]=h.useState(!1),A=r?.name,[y,E]=h.useState(null),p=s.Form.useWatch(A,u),P=G.useSizeConfig();h.useEffect(()=>{if(!c.current?.input)return;const o=J(c.current.input,{mask:a,lazy:!1});return g.current=o,o.on("accept",()=>{const S=o.value;S.length>0&&x(!0);const b=v(S,n,!0);S.length===n.length&&b.isValid()&&(u.setFieldValue(A,b.format(d)),E(b),g.current?.updateValue())}),()=>{o.destroy()}},[n,a]),h.useEffect(()=>{if(!p){E(null);return}let o=null;if(typeof p=="string"&&p.length===d.length&&/^\d+$/.test(p))if(t==="date"){const S=p.substring(0,4),b=p.substring(4,6),O=p.substring(6,8);o=v(`${S}-${b}-${O}`,n,!0)}else if(t==="month"){const S=p.substring(0,4),b=p.substring(4,6);o=v(`${S}-${b}`,n,!0)}else t==="year"&&(o=v(p,n,!0));else o=v(p,n,!0);o&&o.isValid()?E(o):E(null),C(!1)},[p,n,d,t]);const L=o=>{if(!o){u.setFieldValue(A,void 0),E(null),g.current?.updateValue();return}E(o);const S=o.format(d);u.setFieldValue(A,S),g.current&&(g.current.value=o.format(n),g.current.updateValue()),C(!1)},R=o=>{setTimeout(()=>{const S=document.activeElement,b=i.current,O=b?.querySelector(".ant-picker-dropdown");!(b&&(b.contains(S)||b===S||O?.contains(S)))&&!(o!==void 0?o:F)&&console.log("✅ Input과 DatePicker 모두 포커스가 없습니다")},0)};return e.jsx(T,{...r,name:void 0,validateStatus:w?"warning":void 0,children:e.jsxs(s.ConfigProvider,{componentSize:P.componentSize,theme:{components:{Input:{addonBg:"#fff"}}},children:[e.jsx(s.Form.Item,{name:A,getValueProps:o=>({value:o?v(o).format(n):void 0}),normalize:o=>o?v(o).format(d):void 0,noStyle:!0,rules:r?.rules??[],children:e.jsx(s.Input,{...m,ref:c,onFocus:()=>{x(!F),g.current?.updateValue()},onBlur:()=>{R()},onKeyDown:o=>{if(o.key==="Backspace"&&x(!0),o.key==="Tab"&&x(!1),o.key==="Enter")if(F){const S=g.current?.value||"",b=v(S,n,!0);S.length===n.length&&b.isValid()?(x(!1),C(!1)):C(!0)}else x(!0)},style:{width:"65%"},allowClear:!0,placeholder:a.replace(/0/g,"_"),suffix:e.jsx(Y.CalendarOutlined,{style:{color:"#d9d9d9"}}),autoComplete:"off"})}),e.jsx(s.DatePicker,{...l,open:F,picker:t,format:{format:n,type:"mask"},showNow:!0,value:y,onChange:L,onOpenChange:o=>{x(o),o||R(!1)},renderExtraFooter:()=>w?e.jsxs("div",{style:{color:"#faad14",paddingLeft:"8px",fontSize:"12px",display:"flex",alignItems:"center",gap:"6px",borderTop:"1px solid #f0f0f0",backgroundColor:"#fffbe6"},children:[e.jsx(Y.ExclamationCircleOutlined,{}),e.jsx("span",{children:"유효하지 않은 날짜입니다"})]}):null,getPopupContainer:o=>o.parentElement,style:{position:"absolute",top:0,left:0,pointerEvents:"none",opacity:0,width:"100%"}})]})})},{RangePicker:Ee}=s.DatePicker,De=t=>{switch(t){case"year":return{format:"YYYY",mask:"0000",outputFormat:"YYYY"};case"month":return{format:"YYYY-MM",mask:"0000-00",outputFormat:"YYYYMM"};case"date":default:return{format:"YYYY-MM-DD",mask:"0000-00-00",outputFormat:"YYYYMMDD"}}},Ye=({type:t="date",itemProps:r={name:"dateRange"},inputProps:m,pickerProps:l})=>{const{format:n,mask:a,outputFormat:d}=De(t),c=h.useRef(null),g=h.useRef(null),i=h.useRef(null),u=h.useRef(null),F=h.useRef(null),x=s.Form.useFormInstance(),[w,C]=h.useState(!1),[A,y]=h.useState(!1),[E,p]=h.useState(null),[P,L]=h.useState(!1),R=h.useRef(!1),o=r?.name,[S,b]=h.useState([null,null]),O=s.Form.useWatch(o?Array.isArray(o)?[...o,0]:[o,0]:void 0,x),B=s.Form.useWatch(o?Array.isArray(o)?[...o,1]:[o,1]:void 0,x),M=s.Form.useWatch(o,x),_=G.useSizeConfig();h.useEffect(()=>{if(!c.current?.input)return;const f=J(c.current.input,{mask:a,lazy:!1});return i.current=f,f.on("accept",()=>{const j=f.value,D=f.unmaskedValue||"";if(console.log("🔵 [시작일] accept 이벤트:",{maskValue:j,unmaskedValue:D,length:j.length,formatLength:n.length}),j.length>0&&(p("start"),C(!0),L(!1)),D.length===d.length){const k=v(j,n,!0);if(k.isValid()){console.log("🔵 [시작일] 입력 완료 및 검증 통과:",{parsed:k.format(n)});const z=k.format(d);R.current=!0;const I=Array.isArray(o)?[...o,0]:[o,0];x.setFieldValue(I,z),b([k,S[1]]),i.current&&i.current.updateValue(),y(!1),setTimeout(()=>{u.current&&(u.current.value="",u.current.unmaskedValue="",u.current.updateValue());const V=Array.isArray(o)?[...o,1]:[o,1];x.getFieldValue(V)||x.setFieldValue(V,void 0),g.current?.focus(),setTimeout(()=>{if(u.current){const H=u.current.value||"";!(u.current.unmaskedValue||"")&&!H.replace(/[^0-9]/g,"")&&(u.current.value="",u.current.updateValue())}},10),p("end"),C(!0),R.current=!1},0)}else l?.allowEmpty?y(!1):(console.log("🔵 [시작일] 검증 실패:",{val:j,parsed:k}),y(!0))}}),()=>{f.destroy()}},[n,a,o]),h.useEffect(()=>{if(!g.current?.input)return;const f=J(g.current.input,{mask:a,lazy:!1});return u.current=f,f.on("accept",()=>{const j=f.value,D=f.unmaskedValue||"";if(console.log("🟢 [종료일] accept 이벤트:",{maskValue:j,unmaskedValue:D,length:j.length,formatLength:n.length}),D===""||D.length===0){const k=Array.isArray(o)?[...o,1]:[o,1];x.setFieldValue(k,void 0),b([S[0],null]),u.current&&(u.current.value="",u.current.updateValue()),setTimeout(()=>{c.current?.focus(),p("start"),C(!0)},0);return}if(j.length>0&&(p("end"),C(!0)),j.length<n.length){y(!1);return}if(D.length===d.length){const k=v(j,n,!0);if(k.isValid()){const z=k.format(d);console.log("🟢 [종료일] 입력 완료:",{parsed:k.format(n),formatted:z}),R.current=!0;const I=Array.isArray(o)?[...o,1]:[o,1];x.setFieldValue(I,z),b([S[0],k]),u.current?.updateValue(),setTimeout(()=>{R.current=!1},0)}else l?.allowEmpty?y(!1):(console.log("🟢 [종료일] 검증 실패:",{val:j,parsed:k}),y(!0))}}),()=>{f.destroy()}},[n,a,o]),h.useEffect(()=>{console.log("🟡 [useEffect] form 값 변경 감지:",{startFormValue:O,endFormValue:B,formValue:M});const f=O??(Array.isArray(M)?M[0]:null),j=B??(Array.isArray(M)?M[1]:null);if(f===void 0&&j===void 0&&(!M||!Array.isArray(M))){b([null,null]);return}const D=I=>{if(!I)return null;let V=null;if(typeof I=="string"&&I.length===d.length&&/^\d+$/.test(I))if(t==="date"){const U=I.substring(0,4),H=I.substring(4,6),ne=I.substring(6,8);V=v(`${U}-${H}-${ne}`,n,!0)}else if(t==="month"){const U=I.substring(0,4),H=I.substring(4,6);V=v(`${U}-${H}`,n,!0)}else t==="year"&&(V=v(I,n,!0));else V=v(I,n,!0);return V&&V.isValid()?V:null},k=D(f),z=D(j);if(console.log("🟡 [useEffect] 파싱 결과:",{startParsed:k?k.format(n):null,endParsed:z?z.format(n):null,isStartDateFromPicker:P}),b([k,z]),R.current){console.log("🟡 [useEffect] 사용자 입력 중 - 마스크 값 업데이트 스킵"),y(!1);return}if(!P&&i.current){const I=i.current.value||"",V=k?k.format(n):"",U=i.current.unmaskedValue||"",H=k?k.format(d):"";console.log("🟡 [useEffect] 시작일 마스크 값 체크:",{currentMaskValue:I,expectedMaskValue:V,unmaskedValue:U,expectedUnmasked:H,shouldUpdate:I===""||I!==V,canUpdate:U===""||U===H}),(I===""||I!==V)&&(U===""||U===H?(console.log("🟡 [useEffect] 시작일 마스크 값 업데이트:",{before:I,after:k?k.format(n):""}),k?(i.current.value=k.format(n),i.current.updateValue()):(i.current.value="",i.current.updateValue())):console.log("🟡 [useEffect] 시작일 마스크 값 업데이트 스킵 (사용자 입력 중)"))}if(u.current){const I=u.current.value||"",V=z?z.format(n):"",U=u.current.unmaskedValue||"",H=z?z.format(d):"";console.log("🟡 [useEffect] 종료일 마스크 값 체크:",{currentMaskValue:I,expectedMaskValue:V,unmaskedValue:U,expectedUnmasked:H,shouldUpdate:I===""||I!==V,canUpdate:U===""||U===H}),(I===""||I!==V)&&(U===""||U===H?(console.log("🟡 [useEffect] 종료일 마스크 값 업데이트:",{before:I,after:V}),z?(u.current.value=z.format(n),u.current.updateValue()):(u.current.value="",u.current.updateValue())):console.log("🟡 [useEffect] 종료일 마스크 값 업데이트 스킵 (사용자 입력 중)"))}y(!1)},[O,B,M,n,d,t]);const X=f=>{if(console.log("🔴 [RangePicker] 날짜 변경:",{dates:f?[f[0]?f[0].format(n):null,f[1]?f[1].format(n):null]:null,prevRange:[S[0]?S[0].format(n):null,S[1]?S[1].format(n):null]}),!f){b([null,null]);const V=Array.isArray(o)?[...o,0]:[o,0],U=Array.isArray(o)?[...o,1]:[o,1];x.setFieldValue(V,void 0),x.setFieldValue(U,void 0),i.current?.updateValue(),u.current?.updateValue();return}const[j,D]=f,k=S[0],z=j&&(!k||!j.isSame(k,t==="year"?"year":t==="month"?"month":"day"));if(console.log("🔴 [RangePicker] 시작일 변경 여부:",{isStartDateChanged:z,startDate:j?j.format(n):null,prevStartDate:k?k.format(n):null}),b([j,D]),z){console.log("🔴 [RangePicker] 시작일 선택됨 - input 비우기"),L(!0),i.current&&(i.current.value="",i.current.updateValue());const V=j.format(d);console.log("🔴 [RangePicker] form 값 업데이트:",{formatted:V});const U=Array.isArray(o)?[...o,0]:[o,0];x.setFieldValue(U,V)}else if(!j&&i.current){L(!1),i.current.value="",i.current.updateValue();const V=Array.isArray(o)?[...o,0]:[o,0];x.setFieldValue(V,void 0)}else L(!1);const I=Array.isArray(o)?[...o,1]:[o,1];if(D){const V=D.format(d);x.setFieldValue(I,V),u.current&&(u.current.value=D.format(n),u.current.updateValue())}else x.setFieldValue(I,void 0),u.current&&(u.current.value="",u.current.updateValue());y(!1)},q=f=>{setTimeout(()=>{const j=document.activeElement,D=F.current,k=D?.querySelector(".ant-picker-dropdown");!(D&&(D.contains(j)||D===j||k?.contains(j)))&&!(f!==void 0?f:w)&&(console.log("✅ Input과 RangePicker 모두 포커스가 없습니다"),C(!1))},0)};return e.jsx(T,{...r,name:void 0,validateStatus:A?"warning":void 0,children:e.jsxs(s.ConfigProvider,{componentSize:_.componentSize,theme:{components:{Input:{addonBg:"#fff"}}},children:[e.jsxs("div",{ref:F,style:{display:"flex",alignItems:"center",gap:"8px",width:"100%"},children:[e.jsx(s.Form.Item,{name:o?Array.isArray(o)?[...o,0]:[o,0]:void 0,getValueProps:f=>{if(!f)return{value:void 0};if(typeof f=="string"&&f.length===d.length&&/^\d+$/.test(f)){if(t==="date"){const j=f.substring(0,4),D=f.substring(4,6),k=f.substring(6,8);return{value:`${j}-${D}-${k}`}}else if(t==="month"){const j=f.substring(0,4),D=f.substring(4,6);return{value:`${j}-${D}`}}else if(t==="year")return{value:f}}return{value:v(f).format(n)}},normalize:f=>f?v(f).format(d):(l?.allowEmpty,void 0),noStyle:!0,rules:r?.rules??[],children:e.jsx(s.Input,{...m,value:void 0,ref:c,onFocus:()=>{if(p("start"),C(!w),L(!1),i.current){const f=Array.isArray(o)?[...o,0]:[o,0];x.getFieldValue(f)||(i.current.value="",i.current.unmaskedValue=""),i.current.updateValue()}},onBlur:()=>{q()},onKeyDown:f=>{if(f.key==="Backspace"&&(p("start"),C(!0)),f.key==="Enter")if(w&&E==="start"){const j=i.current?.value||"";j.length===n.length?v(j,n,!0).isValid()?(C(!1),y(!1)):l?.allowEmpty?y(!1):y(!0):y(!1)}else p("start"),C(!0)},style:{flex:1},allowClear:!0,placeholder:a.replace(/0/g,"_"),suffix:e.jsx(Y.CalendarOutlined,{style:{color:"#d9d9d9"}}),autoComplete:"off"})}),e.jsx("span",{style:{color:"#d9d9d9",userSelect:"none"},children:"~"}),e.jsx(s.Form.Item,{name:o?Array.isArray(o)?[...o,1]:[o,1]:void 0,getValueProps:f=>{if(!f)return{value:void 0};if(typeof f=="string"&&f.length===d.length&&/^\d+$/.test(f)){if(t==="date"){const j=f.substring(0,4),D=f.substring(4,6),k=f.substring(6,8);return{value:`${j}-${D}-${k}`}}else if(t==="month"){const j=f.substring(0,4),D=f.substring(4,6);return{value:`${j}-${D}`}}else if(t==="year")return{value:f}}return{value:v(f).format(n)}},normalize:f=>f?v(f).format(d):(l?.allowEmpty,void 0),noStyle:!0,rules:r?.rules??[],children:e.jsx(s.Input,{...m,ref:g,onFocus:()=>{if(p("end"),C(!w),u.current){u.current.updateValue();const f=u.current.value||"";!(u.current.unmaskedValue||"")&&!f.replace(/[^0-9]/g,"")&&(u.current.value="",u.current.updateValue())}},onBlur:()=>{q()},onKeyDown:f=>{if(f.key==="Backspace"){const j=u.current?.value||"",D=u.current?.unmaskedValue||"";if(j===""||D===""||j.replace(/[^0-9]/g,"").length<=1){f.preventDefault();const k=Array.isArray(o)?[...o,1]:[o,1];x.setFieldValue(k,void 0),b([S[0],null]),u.current&&(u.current.value="",u.current.updateValue()),setTimeout(()=>{c.current?.focus(),p("start"),C(!0)},0);return}p("end"),C(!0)}if(f.key==="Tab"&&C(!1),f.key==="Enter")if(w&&E==="end"){const j=u.current?.value||"";j.length===n.length?v(j,n,!0).isValid()?(C(!1),y(!1)):l?.allowEmpty?y(!1):y(!0):y(!1)}else p("end"),C(!0)},style:{flex:1},allowClear:!0,onClear:()=>{const f=Array.isArray(o)?[...o,1]:[o,1];x.setFieldValue(f,void 0),b([S[0],null]),u.current&&(u.current.value="",u.current.updateValue()),setTimeout(()=>{c.current?.focus(),p("start"),C(!0)},0)},placeholder:a.replace(/0/g,"_"),suffix:e.jsx(Y.CalendarOutlined,{style:{color:"#d9d9d9"}}),autoComplete:"off"})})]}),e.jsx(Ee,{...l,open:w,picker:t,format:{format:n,type:"mask"},showNow:!0,value:S,onChange:X,onOpenChange:f=>{C(f),f||q(!1)},renderExtraFooter:()=>A?e.jsxs("div",{style:{color:"#faad14",paddingLeft:"8px",fontSize:"12px",display:"flex",alignItems:"center",gap:"6px",borderTop:"1px solid #f0f0f0",backgroundColor:"#fffbe6"},children:[e.jsx(Y.ExclamationCircleOutlined,{}),e.jsx("span",{children:"유효하지 않은 날짜입니다"})]}):null,getPopupContainer:f=>f.parentElement,style:{position:"absolute",top:0,left:0,pointerEvents:"none",opacity:0,width:"100%"}})]})})},{Option:se}=s.Select,Ve=({itemProps:t,inputProps:r})=>{const[m,l]=h.useState([]);return h.useEffect(()=>{r?.addField==="ALL"?l([{label:"전체",value:""},...r?.list||[]]):r?.addField==="NULL"?l([{label:"",value:""},...r?.list||[]]):l(r?.list||[])},[r?.list]),e.jsx(T,{...t,getValueProps:n=>n?{value:n&&n.indexOf(",")>0?n.split(","):[n]}:{value:[]},normalize:n=>n!=null&&n!=null&&n.length>0?n.toString():"",children:e.jsx(s.Select,{...r,mode:"multiple",children:m.map(n=>{const{value:a,label:d}=n;return r?.printCode?e.jsx(se,{value:a,label:d,children:e.jsx(s.Space,{children:`[${a}] ${d}`})},a):e.jsx(se,{value:a,label:d,children:e.jsx(s.Space,{children:`${d}`})},a)})})})},ve=({itemProps:t,inputProps:r})=>{const m=n=>{let a=n.toString().split(".");return r?.decimalPoint!=null&&a[1]!=null&&r?.decimalPoint>0?a[1].length>r?.decimalPoint?a[1]="."+a[1].substring(0,r?.decimalPoint):a[1]="."+a[1]:a[1]="",a[0].replace(/\B(?=(\d{3})+(?!\d))/g,",")+a[1]},l=n=>{let a=n.toString().split(".");return r?.decimalPoint!=null&&a[1]!=null&&r?.decimalPoint>0?a[1].length>r?.decimalPoint?a[1]="."+a[1].substring(0,r?.decimalPoint):a[1]="."+a[1]:a[1]="",a[0].replace(/\$\s?|(,*)/g,"")+a[1]};return e.jsx(T,{...t,children:e.jsx(s.InputNumber,{...r,formatter:n=>m(n),parser:n=>l(n)})})},Ne=({itemProps:t,inputProps:r})=>e.jsx(T,{...t,children:e.jsx(s.Radio.Group,{...r})}),{RangePicker:Le}=s.DatePicker,ae={year:{displayFormat:"YYYY",outputFormat:"YYYY"},month:{displayFormat:"YYYY-MM",outputFormat:"YYYYMM"},date:{displayFormat:"YYYY-MM-DD",outputFormat:"YYYYMMDD"},time:{displayFormat:"HH:mm",outputFormat:"HHmm"},datetime:{displayFormat:"YYYY-MM-DD HH:mm",outputFormat:"YYYYMMDDHHmm"}},Be=({itemProps:t,inputProps:r,type:m="date",minDate:l,maxDate:n,returnType:a="string"})=>{const{displayFormat:d,outputFormat:c}=h.useMemo(()=>ae[m],[m]),g=h.useMemo(()=>Object.values(ae).map(i=>i.outputFormat).sort((i,u)=>{if(i.length===u.length){if(i===c)return-1;if(u===c)return 1}return u.length-i.length}),[c]);return e.jsx(T,{...t,getValueProps:i=>({value:i&&i.length>0?[i[0]?v.isDayjs(i[0])?i[0]:v(i[0],g):null,i[1]?v.isDayjs(i[1])?i[1]:v(i[1],g):null]:null}),normalize:i=>i?a==="dayjs"?[i[0]??void 0,i[1]??void 0]:[i[0]?i[0].format(c):void 0,i[1]?i[1].format(c):void 0]:[void 0,void 0],children:e.jsx(Le,{...r,order:!0,minDate:l?v(l,g):void 0,maxDate:n?v(n,g):void 0,picker:m==="datetime"?"date":m,showTime:r?.showTime??(m==="datetime"||m==="time"),format:d})})},oe=s.Input.Search,Me=t=>{const r=s.Form.useFormInstance(),{openPopup:m}=ie.usePopupStore(),l=t.itemProps?.name||[],n=t.popupConfig||{callback(d){Array.isArray(l)&&l.length>1?(r.setFieldValue(l[0],d.code),r.setFieldValue(l[1],d.name)):r.setFieldValue(l,d.code)}},a={...t,placeholder:typeof t.placeholder=="string"?t.placeholder:t.placeholder?.[0]||"",onChange:d=>{Array.isArray(l)&&l.length>1&&r.setFieldValue(l[0],""),t.onChange?.(d)},onSearch:d=>{t.popuCd?m(t.popuCd,t.popupParams,n):t.onSearch?.(d)}};return Array.isArray(l)&&l.length>1?e.jsx(T,{...t.itemProps,name:void 0,children:e.jsxs(s.Space.Compact,{block:!0,children:[e.jsx(s.Form.Item,{name:l[0],rules:t.itemProps?.rules,style:{width:"40%",marginBottom:0,marginInlineEnd:0},validateStatus:"",help:"",children:e.jsx(s.Input,{style:{color:"#999",backgroundColor:"#f5f5f5"},placeholder:t.placeholder?.[0]||"",readOnly:!0})}),e.jsx(s.Form.Item,{name:l[1],style:{width:"60%",marginBottom:0},children:e.jsx(oe,{readOnly:t.readOnly,enterButton:e.jsx(s.Button,{icon:e.jsx(Y.SearchOutlined,{}),disabled:t.readOnly}),...a})})]})}):e.jsx(T,{...t.itemProps,children:e.jsx(oe,{...a})})},Ae=({itemProps:t,selectProps:r={options:[],allowClear:!0}})=>{const m=s.Form.useFormInstance(),l=!!m,n=h.useMemo(()=>r?.addField==="ALL"?[{label:"전체",value:""},...r?.options||[]]:r?.addField==="NULL"?[{label:"",value:""},...r?.options||[]]:r?.options||[],[r.options,r.addField]),a=g=>{r.onChange?.(g)},d={...r,allowClear:r.allowClear??!0,options:n,onChange:a,variant:r.variant},c=e.jsx(s.Select,{...d,disabled:r.disabled});return r.copyable&&!l&&console.warn("BwgSelect: copyable 기능은 Form 컨텍스트 내에서만 사용 가능합니다."),r.copyable?e.jsx(T,{...t,name:void 0,children:e.jsxs(s.Space.Compact,{block:!0,children:[e.jsx(s.Form.Item,{name:t?.name,rules:t?.rules,style:{width:"100%",marginBottom:0},validateStatus:"",help:"",children:c}),e.jsx(s.Typography.Paragraph,{copyable:{text:l&&m?.getFieldValue(t?.name)?.toString()||"",tooltips:["코드복사","코드복사됨"]},style:{margin:0,backgroundColor:"#f5f5f5",borderRadius:"4px",border:"1px solid #d9d9d9",fontSize:"12px",color:"#666",display:"flex",alignItems:"center",height:"30px",padding:"0 8px"}})]})}):e.jsx(T,{...t,children:c})},Oe=({itemProps:t,inputProps:r={format:"YN"}})=>{const m=s.Form.useFormInstance(),l=(n,a)=>{r.format==="boolean"?m.setFieldValue(t?.name,n):m.setFieldValue(t?.name,n?"Y":"N"),r.onChange&&r.onChange(n,a)};return e.jsx(T,{...t,getValueProps:n=>({checked:r.format==="boolean"?!!n:n==="Y"}),normalize:n=>typeof n=="boolean"?r.format==="boolean"?n:n?"Y":"N":r.format==="boolean"?!!n:n?"Y":"N",children:e.jsx(s.Switch,{...r,onChange:(n,a)=>l(n,a)})})},{TextArea:Ue}=s.Input,Te=({itemProps:t,inputProps:r})=>e.jsx(T,{...t,children:e.jsx(Ue,{...r})}),Re=s.Input.Search,Pe=t=>{const r=s.Form.useFormInstance(),{openCorePopup:m}=G.usePopup(),l={value:"deptNm",fieldName:"deptNm",placeholder:"부서명"},n={value:"empNm",fieldName:"empNm",placeholder:"사원명 입력"},a=t.field1||l,d=t.field2||n,c=h.useCallback(u=>{r.setFieldValue(t.employeeFieldName||"employee",u),r.setFieldValue(t.empNoFieldName||"empNo",u.empNo??""),r.setFieldValue(a.fieldName,u[a.value||"deptNm"]??""),r.setFieldValue(d.fieldName,u[d.value||"empNm"]??""),t.onFinish?.()},[r,a,d,t.employeeFieldName]),g=h.useCallback(u=>{m("CORE_ORGANIZATION_01",{onSelect:F=>{c(F)},defaultParams:{keyword:u}})},[c,m]),i=h.useCallback(async u=>{const F=u?.trim();if(F)try{const x=await $.callService("SCMUTIL00101",{keyword:F},{showLoading:!1}),w=x?.empList||[];if(x?.empCnt===0){s.message.warning("일치하는 사원을 찾을 수 없어 팝업을 열립니다. 사원을 선택해주세요."),g();return}if(x?.empCnt>1){s.message.info("여러 건이 검색되어 팝업이 열립니다. 사원을 선택해주세요."),g(F);return}const C=w[0];c(C)}catch(x){console.error("사원 검색 서비스 실패:",x),s.message.error("사원 검색 중 오류가 발생했습니다.")}},[c,g]);return e.jsx(T,{label:t.label||"사원",name:void 0,children:e.jsxs(s.Space.Compact,{block:!0,children:[e.jsx(s.Form.Item,{name:a.fieldName,style:{width:"40%",marginBottom:0,marginInlineEnd:0},validateStatus:"",help:"",children:e.jsx(s.Input,{style:{color:"#999",backgroundColor:"#f5f5f5"},placeholder:a.placeholder,readOnly:!0})}),e.jsx(s.Form.Item,{name:t.employeeFieldName||"employee",hidden:!0}),e.jsx(s.Form.Item,{name:t.empNoFieldName||"empNo",hidden:!0}),e.jsx(s.Form.Item,{name:d.fieldName,style:{width:"60%",marginBottom:0},children:e.jsx(Re,{allowClear:!0,readOnly:t.readOnly,placeholder:d.placeholder,enterButton:e.jsx(s.Button,{icon:e.jsx(Y.SearchOutlined,{}),disabled:t.readOnly,onClick:()=>{g()}}),onSearch:i,onChange:u=>{r.setFieldValue(a.fieldName,""),r.setFieldValue(t.employeeFieldName||"employee",null),r.setFieldValue(t.empNoFieldName||"empNo","")}})})]})})},{Text:le}=s.Typography,N={IDLE:"idle",UPLOADING:"uploading",UPLOADED:"uploaded",EXECUTING:"executing",COMPLETED:"completed",FAILED:"failed"},_e={[N.IDLE]:"엑셀 파일을 선택해 업로드 해 주세요. (xlsx, xls, csv만 가능)",[N.UPLOADING]:"엑셀 업로드 중입니다. 잠시만 기다려 주세요.",[N.UPLOADED]:"엑셀 업로드가 완료되었습니다.",[N.EXECUTING]:"배치 작업 실행 중입니다. 잠시만 기다려 주세요.",[N.COMPLETED]:"배치 작업이 완료되었습니다.",[N.FAILED]:"배치 작업이 실패했습니다."},ze=({label:t="엑셀 업로드",jobId:r,extraParams:m,onFinish:l,disabled:n=!1})=>{const[a,d]=h.useState(N.IDLE),[c,g]=h.useState(null),[i,u]=h.useState(null),F=h.useCallback(async()=>{if(!(!c||!i)){if(!r){s.message.warning("실행 job id(jobId)가 설정되어 있지 않습니다.");return}try{if(!i.filePath){s.message.error("파일 URL 정보가 없습니다.");return}d(N.EXECUTING);const y={crprCd:$.getCrprCd(),sysCd:window.__SYS_CD__||"",fileKey:i.fileKey,filePath:i.filePath,jobId:r},E=await $.callService("SCMUTIL00301",{...y,...m});E?.success?(x(),s.message.success(E?.message||"배치 실행 요청이 성공적으로 완료되었습니다.")):(d(N.FAILED),s.message.error(E?.message||"배치 실행 요청에 실패했습니다."))}catch(y){console.error("배치 실행 요청에 실패했습니다.",y),s.message.error("배치 실행 요청에 실패했습니다."),d(N.FAILED)}}},[c,i,r,m]),x=h.useCallback(async()=>{setTimeout(async()=>{try{const y=await $.callService("SCMUTIL00302",{jobId:r});if(y?.status==="COMPLETED"){d(N.COMPLETED),s.message.success("배치 작업이 완료되었습니다."),l?.();return}else if(y?.status==="FAILED"){d(N.FAILED),s.message.error("배치 작업이 실패했습니다.");return}else{setTimeout(x,1e3);return}}catch(y){console.error("배치 작업 상태 확인 오류:",y),d(N.FAILED),s.message.error("배치 작업 상태 확인 중 오류가 발생했습니다.")}},3e3)},[r,l]),w=h.useMemo(()=>({name:"file",accept:".xlsx, .xls, .csv",listType:"picture",multiple:!1,action:"/api/upload",showUploadList:{showRemoveIcon:!0},beforeUpload:y=>{const E=`.${y.name.split(".").pop()?.toLowerCase()}`;if(![".xlsx",".xls",".csv"].includes(E))return s.message.error(`${y.name} 파일은 허용되지 않는 확장자입니다. (xlsx, xls, csv만 가능)`),s.Upload.LIST_IGNORE},onChange:y=>{const{status:E}=y.file;if(E==="removed"){g(null),d(N.IDLE),u(null);return}if(g(y.file),E==="uploading"){d(N.UPLOADING);return}if(E==="done"){if(y.file.response?.success){d(N.UPLOADED);const p=y.file.response.uploadedFiles[0]||{};u({fileKey:p.fileKey,filePath:p.filePath,fileNameL:p.fileNameL,fileNameP:p.fileNameP,fileSize:p.fileSize,fileExt:p.fileExt})}else d(N.IDLE),s.message.error(y.file.response?.message||`${y.file.name} 파일 업로드에 실패했습니다.`);return}E==="error"&&(d(N.IDLE),s.message.error(y.file.response?.message||`${y.file.name} 파일 업로드 중 오류가 발생했습니다.`))}}),[]),C=h.useMemo(()=>e.jsxs(s.Space,{direction:"vertical",style:{width:400},children:[e.jsxs(s.Space,{children:[a===N.EXECUTING&&e.jsx(s.Spin,{size:"small"}),e.jsx(le,{type:a===N.FAILED?"danger":"secondary",children:_e[a]})]}),a!==N.EXECUTING&&a!==N.COMPLETED&&a!==N.FAILED&&e.jsx(s.Upload,{...w,children:!c&&e.jsx(W,{icon:e.jsx(Y.UploadOutlined,{}),children:"파일 선택"})}),a===N.UPLOADED&&e.jsx(s.Space,{direction:"vertical",children:e.jsx(s.Space,{children:e.jsx(W,{type:"primary",icon:e.jsx(Y.PlayCircleOutlined,{}),onClick:F,disabled:!c,children:"실행하기"})})}),(a===N.COMPLETED||a===N.FAILED)&&e.jsx(s.Space,{direction:"vertical",children:e.jsxs(s.Space,{children:[e.jsx(W,{icon:e.jsx(Y.RedoOutlined,{}),onClick:F,children:"다시 실행하기"}),e.jsx(W,{icon:e.jsx(Y.UploadOutlined,{}),onClick:()=>{d(N.IDLE),g(null),u(null)},children:"다른 파일 업로드"})]})})]}),[a,c,F,w]),A=e.jsx(W,{icon:e.jsx(Y.UploadOutlined,{}),disabled:n,children:t});if(n){const y=e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx(Y.ExclamationCircleFilled,{style:{color:"#faad14",fontSize:16}}),e.jsx("span",{style:{fontWeight:600},children:"'엑셀 업로드' 버튼에 대한 사용 권한이 없습니다."})]}),E=e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:4,paddingLeft:24},children:e.jsx("span",{style:{fontSize:12},children:"관리자에게 문의하세요."})});return e.jsx(s.Popover,{title:y,content:E,placement:"bottom",styles:{body:{backgroundColor:"#fffbe6"}},children:e.jsx("span",{children:A})})}return e.jsx(s.Popover,{content:C,title:e.jsx("div",{style:{display:"flex",alignItems:"center",marginBottom:0},children:e.jsx(le,{strong:!0,children:"엑셀 업로드"})}),trigger:"click",placement:"bottom",children:A})},$e=s.Input.Search,He=t=>{const r=s.Form.useFormInstance(),{openCorePopup:m}=G.usePopup(),l={value:"deptNm",fieldName:"deptNm",placeholder:"부서명"},n=t.field||l,a=h.useCallback(g=>{r.setFieldValue(t.departmentFieldName||"department",g),r.setFieldValue(n.fieldName,g[n.value||"deptNm"]??""),r.setFieldValue(t.deptCdFieldName||"deptCd",g.deptCd??""),t.onFinish?.()},[r,n,t.departmentFieldName,t.deptCdFieldName]),d=h.useCallback(g=>{m("CORE_DEPARTMENT_01",{onSelect:i=>{a(i)},defaultParams:{keyword:g}})},[a,m]),c=h.useCallback(async g=>{const i=g?.trim();if(i)try{const u=await $.callService("SCMUTIL00103",{keyword:i},{showLoading:!1}),F=u?.deptCnt??0,x=u?.deptList||[];if(F===0||x.length===0){s.message.warning("일치하는 부서를 찾을 수 없어 팝업을 열립니다. 부서를 선택해주세요."),d(i);return}if(F>1||x.length>1){s.message.info("여러 건이 검색되어 팝업이 열립니다. 부서를 선택해주세요."),d(i);return}const w=x[0];a(w)}catch(u){console.error("부서 검색 서비스 실패:",u),s.message.error("부서 검색 중 오류가 발생했습니다.")}},[a,d]);return e.jsx(T,{label:t.label||"부서",name:void 0,children:e.jsxs(s.Space.Compact,{block:!0,children:[e.jsx(s.Form.Item,{name:t.deptCdFieldName||"deptCd",style:{width:"40%",marginBottom:0,marginInlineEnd:0},validateStatus:"",help:"",children:e.jsx(s.Input,{style:{color:"#999",backgroundColor:"#f5f5f5"},placeholder:"부서코드",readOnly:!0})}),e.jsx(s.Form.Item,{name:t.departmentFieldName||"department",hidden:!0}),e.jsx(s.Form.Item,{name:n.fieldName,style:{width:"60%",marginBottom:0},children:e.jsx($e,{allowClear:!0,readOnly:t.readOnly,placeholder:n.placeholder,enterButton:e.jsx(s.Button,{icon:e.jsx(Y.SearchOutlined,{}),disabled:t.readOnly,onClick:()=>{d()}}),onSearch:c,onChange:g=>{r.setFieldValue(t.deptCdFieldName||"deptCd",""),r.setFieldValue(t.departmentFieldName||"department",null)}})})]})})},de=({originNode:t,file:r,fileList:m,moveFile:l,onDrop:n})=>{const a=h.useRef(null),[{handlerId:d},c]=Z.useDrop({accept:"file",collect:F=>({handlerId:F.getHandlerId()}),hover(F,x){if(!a.current)return;const w=F.uid,C=r.uid;if(w===C)return;const A=Q.findIndex(m,{uid:C}),y=Q.findIndex(m,{uid:w});if(y===-1||A===-1)return;const E=a.current.getBoundingClientRect(),p=x.getClientOffset();if(!p)return;const P=(E.bottom-E.top)/2,L=p.y-E.top;y<A&&L<P||y>A&&L>P||l(w,C)},drop(){n()}}),[{isDragging:g},i]=Z.useDrag({type:"file",item:()=>({uid:r.uid,index:Q.findIndex(m,{uid:r.uid})}),collect:F=>({isDragging:F.isDragging()})}),u=g?0:1;return i(c(a)),e.jsx("div",{ref:a,style:{opacity:u},"data-handler-id":d,children:t})},ee=(t,r,m,l,n)=>{const a=m[0]?.uid===r.uid,d=h.cloneElement(t,{href:r.url||void 0,title:void 0});return e.jsxs(e.Fragment,{children:[a&&e.jsxs("div",{style:{fontSize:12,color:"var(--text-secondary, #666)",marginBottom:4},children:["총 ",m.length,"건"]}),e.jsx(de,{originNode:d,file:r,fileList:m,moveFile:l,onDrop:n})]})},te=(t,r)=>{const m=String(r||"");return m.startsWith("picture")?t.name.endsWith(".pdf")?e.jsx(Y.FilePdfTwoTone,{}):t.name.endsWith(".docx")||t.name.endsWith(".doc")?e.jsx(Y.FileWordTwoTone,{}):t.name.endsWith(".xlsx")||t.name.endsWith(".xls")?e.jsx(Y.FileExcelTwoTone,{}):t.name.endsWith(".pptx")||t.name.endsWith(".ppt")?e.jsx(Y.FilePptTwoTone,{}):e.jsx(Y.FileTwoTone,{}):m.startsWith("text")?e.jsx(Y.LinkOutlined,{}):e.jsx(Y.FileOutlined,{})},qe=({listType:t="picture",buttonText:r="파일 선택",permissions:m,multiple:l=!1,fileGrpKey:n,uploadProps:a,heights:d,...c})=>{const{defaultUploadProps:g,fileList:i,fetchFileList:u,reorderFiles:F,saveFileOrder:x}=G.useFileUploader({multiple:l,fileGrpKey:n,...c});h.useEffect(()=>{n&&u()},[n]);const w=!!m?.fileAdd,C={...g,listType:t,styles:{root:{height:d?.root},list:{height:d?.list}},iconRender:te,itemRender(A,y,E){return ee(A,y,E,F,x)},...a};return e.jsx(Z.DndProvider,{backend:ce.HTML5Backend,children:e.jsx(s.Upload,{headers:{SYSCD:__SYS_CD__},style:{height:d?.root},...C,children:w&&l||(w&&!l||i.length===0)&&e.jsx(s.Button,{icon:e.jsx(Y.UploadOutlined,{}),children:r})})})},We=({listType:t="picture",permissions:r,multiple:m=!1,fileGrpKey:l,uploadProps:n,heights:a,...d})=>{const{defaultUploadProps:c,fetchFileList:g,reorderFiles:i,saveFileOrder:u}=G.useFileUploader({multiple:m,fileGrpKey:l,...d}),F={...c,listType:t,iconRender:te,itemRender(x,w,C){return ee(x,w,C,i,u)},...n};return h.useEffect(()=>{l&&g()},[l]),e.jsx(Z.DndProvider,{backend:ce.HTML5Backend,children:e.jsxs(fe,{style:{marginBottom:10},height:a?.dragger||100,...F,children:[e.jsx("p",{className:"ant-upload-drag-icon",style:{marginBottom:10},children:e.jsx(Y.InboxOutlined,{style:{fontSize:25}})}),e.jsx("p",{className:"ant-upload-hint",children:"첨부할 파일을 여기에 끌어다 놓거나, 영역을 클릭하여 파일을 직접 선택해주세요."})]})})};exports.BwgButton=W;exports.BwgCheck=ge;exports.BwgCheckList=he;exports.BwgDatePicker=pe;exports.BwgDeptSearch=He;exports.BwgDownload=xe;exports.BwgDraggerUploader=We;exports.BwgEmpSearch=Pe;exports.BwgForm=ue;exports.BwgFormItem=T;exports.BwgInput=ye;exports.BwgLargeUploader=Se;exports.BwgMaskedDate=Ie;exports.BwgMaskedInput=we;exports.BwgMaskedRange=Ye;exports.BwgMultiSelect=Ve;exports.BwgNumber=ve;exports.BwgRadio=Ne;exports.BwgRangePicker=Be;exports.BwgSearch=Me;exports.BwgSelect=Ae;exports.BwgSwitch=Oe;exports.BwgTextArea=Te;exports.BwgUploader=qe;exports.BwgXlsxUploader=ze;exports.DraggableUploadListItem=de;exports.defaultIconRender=te;exports.defaultItemRender=ee;