@owp/core 2.5.22 → 2.5.24

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 (173) hide show
  1. package/dist/_virtual/index15.js +2 -2
  2. package/dist/_virtual/index16.js +4 -4
  3. package/dist/_virtual/index17.js +4 -4
  4. package/dist/_virtual/index18.js +4 -4
  5. package/dist/_virtual/index19.js +4 -4
  6. package/dist/_virtual/index5.js +2 -2
  7. package/dist/components/OwpCommonCode/OwpCommonCodeQuerySelector.js +15 -13
  8. package/dist/components/OwpCommonCode/OwpCommonCodeQuerySelector.js.map +1 -1
  9. package/dist/components/OwpCommonCode/OwpCommonCodeSelector.js +21 -19
  10. package/dist/components/OwpCommonCode/OwpCommonCodeSelector.js.map +1 -1
  11. package/dist/components/OwpExportExcelButton/OwpExportExcelButton.js +1 -1
  12. package/dist/components/OwpExportExcelButton/OwpExportExcelButton.js.map +1 -1
  13. package/dist/components/OwpLanguageSwitcherSelect/OwpLanguageSwitcherSelect.js +1 -1
  14. package/dist/components/OwpLanguageSwitcherSelect/OwpLanguageSwitcherSelect.js.map +1 -1
  15. package/dist/components/OwpLoading/OwpLoading.js +1 -1
  16. package/dist/components/OwpLoading/OwpLoading.js.map +1 -1
  17. package/dist/components/OwpMrtTable/OwpMrtTable.js +21 -21
  18. package/dist/components/OwpMrtTable/OwpMrtTable.js.map +1 -1
  19. package/dist/components/OwpOptionSelector/OwpOptionSelector.js +14 -12
  20. package/dist/components/OwpOptionSelector/OwpOptionSelector.js.map +1 -1
  21. package/dist/components/OwpPageTitle/OwpPageTitle.js +1 -1
  22. package/dist/components/OwpPageTitle/OwpPageTitle.js.map +1 -1
  23. package/dist/components/OwpPicker/OwpDatePicker.js +81 -82
  24. package/dist/components/OwpPicker/OwpDatePicker.js.map +1 -1
  25. package/dist/components/OwpPicker/OwpTimePicker.js +82 -83
  26. package/dist/components/OwpPicker/OwpTimePicker.js.map +1 -1
  27. package/dist/components/OwpPicker/OwpWeekDatePicker.js +24 -25
  28. package/dist/components/OwpPicker/OwpWeekDatePicker.js.map +1 -1
  29. package/dist/components/OwpSearchFilter/OwpSearchFilter.js +1 -1
  30. package/dist/components/OwpSearchFilter/OwpSearchFilter.js.map +1 -1
  31. package/dist/components/OwpSection/OwpSection.js +1 -1
  32. package/dist/components/OwpSection/OwpSection.js.map +1 -1
  33. package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js +155 -157
  34. package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js.map +1 -1
  35. package/dist/components/OwpSelectorBase/OwpSelectorSelect.js +95 -81
  36. package/dist/components/OwpSelectorBase/OwpSelectorSelect.js.map +1 -1
  37. package/dist/components/OwpSuspense/OwpSuspense.js +43 -43
  38. package/dist/components/OwpSuspense/OwpSuspense.js.map +1 -1
  39. package/dist/components/OwpTable/OwpDataTable.js +13 -12
  40. package/dist/components/OwpTable/OwpDataTable.js.map +1 -1
  41. package/dist/components/OwpTable/OwpFieldTable.js +64 -78
  42. package/dist/components/OwpTable/OwpFieldTable.js.map +1 -1
  43. package/dist/components/OwpTable/OwpTable.js +56 -55
  44. package/dist/components/OwpTable/OwpTable.js.map +1 -1
  45. package/dist/components/OwpTable/internal/OwpTableBase.js +20 -19
  46. package/dist/components/OwpTable/internal/OwpTableBase.js.map +1 -1
  47. package/dist/components/OwpTable/internal/defaultTableStyle.js +6 -7
  48. package/dist/components/OwpTable/internal/defaultTableStyle.js.map +1 -1
  49. package/dist/components/OwpTable/utils/tableSx.js +16 -6
  50. package/dist/components/OwpTable/utils/tableSx.js.map +1 -1
  51. package/dist/components/OwpTreeGrid/OwpTreeGrid.js +105 -104
  52. package/dist/components/OwpTreeGrid/OwpTreeGrid.js.map +1 -1
  53. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js +55 -56
  54. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js.map +1 -1
  55. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js +10 -10
  56. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js +253 -252
  57. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js.map +1 -1
  58. package/dist/constants/table.js +5 -0
  59. package/dist/constants/table.js.map +1 -0
  60. package/dist/constants.js +25 -23
  61. package/dist/constants.js.map +1 -1
  62. package/dist/contexts/OwpUiProvider.js +5 -5
  63. package/dist/contexts/OwpUiProvider.js.map +1 -1
  64. package/dist/hooks/{useAccessTokenGuard.js → internal/useAccessTokenGuard.js} +2 -2
  65. package/dist/hooks/internal/useAccessTokenGuard.js.map +1 -0
  66. package/dist/hooks/{useCurrentLanguage.js → internal/useCurrentLanguage.js} +2 -2
  67. package/dist/hooks/internal/useCurrentLanguage.js.map +1 -0
  68. package/dist/hooks/internal/useHeaderWrapState.js.map +1 -0
  69. package/dist/hooks/internal/useNavbar.js +24 -0
  70. package/dist/hooks/internal/useNavbar.js.map +1 -0
  71. package/dist/hooks/{useNavigationActiveRouteRemount.js → internal/useNavigationActiveRouteRemount.js} +1 -1
  72. package/dist/hooks/internal/useNavigationActiveRouteRemount.js.map +1 -0
  73. package/dist/hooks/{useShortcuts.js → internal/useShortcuts.js} +3 -3
  74. package/dist/hooks/internal/useShortcuts.js.map +1 -0
  75. package/dist/hooks/internal/useThemeMediaQuery.js.map +1 -0
  76. package/dist/hooks/internal/useTimeout.js.map +1 -0
  77. package/dist/hooks/useInitApp.js.map +1 -1
  78. package/dist/hooks.js +53 -81
  79. package/dist/hooks.js.map +1 -1
  80. package/dist/layout/Layout.js +1 -1
  81. package/dist/layout/Layout.js.map +1 -1
  82. package/dist/layout/components/layouts/NavbarToggleFabLayout.js +2 -2
  83. package/dist/layout/components/layouts/NavbarToggleFabLayout.js.map +1 -1
  84. package/dist/layout/components/layouts/NavbarWrapperLayout.js +2 -2
  85. package/dist/layout/components/layouts/NavbarWrapperLayout.js.map +1 -1
  86. package/dist/layout/components/navbar/NavbarToggleButton.js +2 -2
  87. package/dist/layout/components/navbar/NavbarToggleButton.js.map +1 -1
  88. package/dist/layout/components/navbar/style/NavbarStyle.js +1 -1
  89. package/dist/layout/components/navbar/style/NavbarStyle.js.map +1 -1
  90. package/dist/layout/components/navbar/style/NavbarStyleContent.js +1 -1
  91. package/dist/layout/components/navbar/style/NavbarStyleContent.js.map +1 -1
  92. package/dist/layout/components/navigation/Navigation.js +2 -2
  93. package/dist/layout/components/navigation/Navigation.js.map +1 -1
  94. package/dist/layout/components/navigation/vertical/types/NavVerticalCollapse.js +1 -1
  95. package/dist/layout/components/navigation/vertical/types/NavVerticalCollapse.js.map +1 -1
  96. package/dist/layout/components/navigation/vertical/types/NavVerticalGroup.js +1 -1
  97. package/dist/layout/components/navigation/vertical/types/NavVerticalGroup.js.map +1 -1
  98. package/dist/layout/components/navigation/vertical/types/NavVerticalItem.js +1 -1
  99. package/dist/layout/components/navigation/vertical/types/NavVerticalItem.js.map +1 -1
  100. package/dist/layout/components/toggles/LanguageSwitcherToggle.js +1 -1
  101. package/dist/layout/components/toggles/LanguageSwitcherToggle.js.map +1 -1
  102. package/dist/layout/components/toggles/NavigationSearchToggle.js +3 -3
  103. package/dist/layout/components/toggles/NavigationShortcutsToggle.js +1 -1
  104. package/dist/layout/components/toggles/NavigationShortcutsToggle.js.map +1 -1
  105. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/constants.js +1 -1
  106. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/constants.js +1 -1
  107. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/constants.js +1 -1
  108. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/constants.js +1 -1
  109. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/renderers/index.js +1 -1
  110. package/dist/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +1 -1
  111. package/dist/node_modules/.pnpm/react-overlays@5.2.1_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/react-overlays/esm/Portal.js +1 -1
  112. package/dist/owp-app.css +1 -1
  113. package/dist/types/components/OwpCommonCode/OwpCommonCodeQuerySelector.d.ts +5 -3
  114. package/dist/types/components/OwpCommonCode/OwpCommonCodeSelector.d.ts +5 -3
  115. package/dist/types/components/OwpOptionSelector/OwpOptionSelector.d.ts +4 -1
  116. package/dist/types/components/OwpSelectorBase/types/index.d.ts +1 -1
  117. package/dist/types/components/OwpSelectorBase/types/types.d.ts +3 -0
  118. package/dist/types/components/OwpTable/internal/defaultTableStyle.d.ts +0 -1
  119. package/dist/types/components/OwpTable/utils/tableSx.d.ts +15 -0
  120. package/dist/types/constants/index.d.ts +1 -0
  121. package/dist/types/constants/table.d.ts +1 -0
  122. package/dist/types/hooks/index.d.ts +0 -10
  123. package/dist/types/hooks/{useNavbar.d.ts → internal/useNavbar.d.ts} +1 -1
  124. package/dist/types/utils/treeGridUtil.d.ts +0 -14
  125. package/dist/utils/{exceljsBrowser.js → internal/exceljsBrowser.js} +1 -1
  126. package/dist/utils/internal/exceljsBrowser.js.map +1 -0
  127. package/dist/utils/internal/jszipBrowser.js.map +1 -0
  128. package/dist/utils/internal/treeGridBodyRowsEvent.js.map +1 -0
  129. package/dist/utils/treeGridExportExcelUtil.js +1 -1
  130. package/dist/utils/treeGridExportExcelUtil.js.map +1 -1
  131. package/dist/utils/treeGridUtil.js +1 -6
  132. package/dist/utils/treeGridUtil.js.map +1 -1
  133. package/dist/utils/zipUtil.js +1 -1
  134. package/dist/utils/zipUtil.js.map +1 -1
  135. package/dist/utils.js +70 -75
  136. package/package.json +1 -1
  137. package/dist/hooks/useAccessTokenGuard.js.map +0 -1
  138. package/dist/hooks/useCurrentLanguage.js.map +0 -1
  139. package/dist/hooks/useDebounce.js +0 -24
  140. package/dist/hooks/useDebounce.js.map +0 -1
  141. package/dist/hooks/useDeepCompareEffect.js +0 -38
  142. package/dist/hooks/useDeepCompareEffect.js.map +0 -1
  143. package/dist/hooks/useHeaderWrapState.js.map +0 -1
  144. package/dist/hooks/useNavbar.js +0 -24
  145. package/dist/hooks/useNavbar.js.map +0 -1
  146. package/dist/hooks/useNavigationActiveRouteRemount.js.map +0 -1
  147. package/dist/hooks/usePrevious.js +0 -14
  148. package/dist/hooks/usePrevious.js.map +0 -1
  149. package/dist/hooks/useShortcuts.js.map +0 -1
  150. package/dist/hooks/useThemeMediaQuery.js.map +0 -1
  151. package/dist/hooks/useTimeout.js.map +0 -1
  152. package/dist/types/hooks/useDebounce.d.ts +0 -7
  153. package/dist/types/hooks/useDeepCompareEffect.d.ts +0 -22
  154. package/dist/types/hooks/usePrevious.d.ts +0 -5
  155. package/dist/types/utils/dayjsBrowser.d.ts +0 -1
  156. package/dist/utils/exceljsBrowser.js.map +0 -1
  157. package/dist/utils/jszipBrowser.js.map +0 -1
  158. package/dist/utils/treeGridBodyRowsEvent.js.map +0 -1
  159. /package/dist/hooks/{useHeaderWrapState.js → internal/useHeaderWrapState.js} +0 -0
  160. /package/dist/hooks/{useThemeMediaQuery.js → internal/useThemeMediaQuery.js} +0 -0
  161. /package/dist/hooks/{useTimeout.js → internal/useTimeout.js} +0 -0
  162. /package/dist/types/hooks/{useAccessTokenGuard.d.ts → internal/useAccessTokenGuard.d.ts} +0 -0
  163. /package/dist/types/hooks/{useCurrentLanguage.d.ts → internal/useCurrentLanguage.d.ts} +0 -0
  164. /package/dist/types/hooks/{useHeaderWrapState.d.ts → internal/useHeaderWrapState.d.ts} +0 -0
  165. /package/dist/types/hooks/{useNavigationActiveRouteRemount.d.ts → internal/useNavigationActiveRouteRemount.d.ts} +0 -0
  166. /package/dist/types/hooks/{useShortcuts.d.ts → internal/useShortcuts.d.ts} +0 -0
  167. /package/dist/types/hooks/{useThemeMediaQuery.d.ts → internal/useThemeMediaQuery.d.ts} +0 -0
  168. /package/dist/types/hooks/{useTimeout.d.ts → internal/useTimeout.d.ts} +0 -0
  169. /package/dist/types/utils/{exceljsBrowser.d.ts → internal/exceljsBrowser.d.ts} +0 -0
  170. /package/dist/types/utils/{jszipBrowser.d.ts → internal/jszipBrowser.d.ts} +0 -0
  171. /package/dist/types/utils/{treeGridBodyRowsEvent.d.ts → internal/treeGridBodyRowsEvent.d.ts} +0 -0
  172. /package/dist/utils/{jszipBrowser.js → internal/jszipBrowser.js} +0 -0
  173. /package/dist/utils/{treeGridBodyRowsEvent.js → internal/treeGridBodyRowsEvent.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"treeGridUtil.js","sources":["../../src/utils/treeGridUtil.ts"],"sourcesContent":["import {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n} from '@/constants/treeGrid';\nimport { parseTreeGridXmlToJson } from '@/components/OwpTreeGrid/internal/treeGridLayout';\nimport { emitTreeGridBodyRowsChanged } from '@/utils/treeGridBodyRowsEvent';\nimport { isPlainObject } from 'es-toolkit';\nimport { get, isArray, isEmpty, lowerCase, omit, without } from 'es-toolkit/compat';\n\nexport {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n};\n\ntype TreeGridInsertPosition = 'above' | 'below' | 'top' | 'last';\n\ntype TreeGridAddRowOptions<T> = {\n canSelect?: boolean;\n insertPosition?: TreeGridInsertPosition;\n parent?: TRow & T;\n anchorRow?: TRow & T;\n initialValues?: T;\n};\n\ntype TreeGridColumnVisibilityOptions = {\n targetKey: string;\n canVisible: boolean;\n};\n\ntype TreeGridHighlightTargetOption = {\n row: TRow;\n col: string;\n backgroundColor?: string;\n};\ntype TreeGridAddedRowMetadata = TRow & {\n [TREEGRID_ADDED_ROW_BY_ID_FLAG]?: boolean | number;\n [TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY]?: Record<string, string>;\n [TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?: Record<\n string,\n { className: unknown; color: unknown }\n >;\n};\n\ntype TreeGridChangeStatus = 'Added' | 'Changed';\ntype TreeGridChangedRow = Record<string, unknown>;\n\nconst TREEGRID_CHANGE_STATUSES: TreeGridChangeStatus[] = ['Added', 'Changed'];\nconst TREEGRID_DATA_KEY_PREFIXES = ['OWP', 'IPX'];\nconst TREEGRID_TIME_DATE_FORMAT_PATTERN = /^H{1,2}(?::m{1,2})?(?::s{1,2})?$/;\nexport const TREEGRID_ADDED_ROW_BY_ID_FLAG = '__owpAddedByAddTreeGridRowById';\nexport const TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY = '__owpAddedRowHighlightColumns';\nconst TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY = '__owpAddedRowInitialValueKeys';\nexport const TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY = '__owpAddedRowBaselineValues';\nconst TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY = '__owpCellStyleBaselineValues';\n\nconst normalizeTreeGridStringValues = (value: unknown) => {\n if (!isArray(value)) {\n return [];\n }\n\n return value.filter((item): item is string => typeof item === 'string' && item !== '');\n};\n\nconst normalizeTreeGridAddedRowHighlightColumns = normalizeTreeGridStringValues;\n\n/**\n * addTreeGridRowById 생성 행 마킹\n * @param row 대상 행\n */\nexport const markTreeGridRowAddedById = (row: TRow | null | undefined) => {\n if (!row) {\n return;\n }\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BY_ID_FLAG] = 1;\n};\n\n/**\n * addTreeGridRowById 생성 행 여부\n * @param row 대상 행\n */\nexport const isTreeGridRowAddedById = (row: TRow | null | undefined) => {\n const addedById = (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_BY_ID_FLAG];\n\n return !!row && addedById !== 0 && addedById !== false && addedById !== undefined;\n};\n\n/**\n * addTreeGridRowById 생성 행 하이라이트 컬럼 누적\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const appendTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n\n if (currentColumns.includes(col)) {\n return;\n }\n\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = [...currentColumns, col];\n};\n\n/**\n * addTreeGridRowById 생성 행 하이라이트 컬럼 제거\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const removeTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n const nextColumns = currentColumns.filter((column) => column !== col);\n\n if (nextColumns.length) {\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = nextColumns;\n return;\n }\n\n delete targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY];\n};\n\n/**\n * addTreeGridRowById 생성 행 하이라이트 컬럼 조회\n * @param row 대상 행\n */\nexport const getTreeGridAddedRowHighlightColumns = (row: TRow | null | undefined) => {\n return normalizeTreeGridAddedRowHighlightColumns(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n};\n\n/**\n * TreeGrid 셀 비교 값 조회\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const getTreeGridCellComparableValue = (\n grid: TGrid,\n row: TRow,\n col: string,\n) => {\n const cellType = grid.GetType?.(row, col) || grid.Cols?.[col]?.Type || '';\n const rawValue =\n grid.GetValue?.(row, col) ?? (row as unknown as Record<string, unknown>)[col];\n\n if (cellType === 'Enum' || cellType === 'Select') {\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n }\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null) {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 셀 fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * addTreeGridRowById 생성 행 기준값 저장\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n */\nconst markTreeGridAddedRowBaselineValues = (grid: TGrid, row: TRow) => {\n const baselineValues = Object.fromEntries(\n Object.keys(grid.Cols ?? {}).map((col) => [\n col,\n getTreeGridCellComparableValue(grid, row, col),\n ]),\n );\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY] = baselineValues;\n};\n\n/**\n * addTreeGridRowById 생성 행 기준값 조회\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const getTreeGridAddedRowBaselineValue = (\n row: TRow | null | undefined,\n col: string,\n) => {\n return (row as TreeGridAddedRowMetadata | null)?.[\n TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY\n ]?.[col];\n};\n\n/**\n * TreeGrid 셀 하이라이트 전 스타일 저장\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst preserveTreeGridCellStyleBaseline = (grid: TGrid, row: TRow, col: string) => {\n const targetRow = row as TreeGridAddedRowMetadata;\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY] ??= {};\n\n if (targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col]) {\n return;\n }\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY][col] = {\n className: grid.GetAttribute(row, col, 'Class'),\n color: grid.GetAttribute(row, col, 'Color'),\n };\n};\n\n/**\n * TreeGrid 셀 하이라이트 전 스타일 조회\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst getTreeGridCellStyleBaseline = (row: TRow, col: string) => {\n return (row as TreeGridAddedRowMetadata)[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col];\n};\n\n/**\n * TreeGrid 엑셀 내보내기 유틸 로더\n */\nconst loadExportTreeGridExcel = async () => {\n const { exportTreeGridExcel } = await import('./treeGridExportExcelUtil');\n\n return exportTreeGridExcel;\n};\n\n/**\n * TreeGrid 데이터 행 목록 추출\n * @param grid TreeGrid 인스턴스\n */\nconst getDataRows = (grid: TGrid | undefined) => {\n return Object.values(grid?.Rows ?? {}).filter((item) => item.Kind === 'Data');\n};\n\n/**\n * TreeGrid 시간 전용 Date 포맷 여부\n * @param format TreeGrid 날짜 포맷\n */\nconst isTreeGridTimeDateFormat = (format: unknown) =>\n typeof format === 'string' && TREEGRID_TIME_DATE_FORMAT_PATTERN.test(format.trim());\n\n/**\n * TreeGrid 시간 전용 Date 컬럼 여부\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst isTreeGridTimeDateColumn = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n const column = grid.Cols?.[col];\n\n return (\n column?.Type === 'Date' &&\n (isTreeGridTimeDateFormat(rowRecord[`${col}EditFormat`]) ||\n isTreeGridTimeDateFormat(rowRecord[`${col}Format`]) ||\n isTreeGridTimeDateFormat(column.EditFormat) ||\n isTreeGridTimeDateFormat(column.Format))\n );\n};\n\n/**\n * TreeGrid 시간 전용 Date 표시 값 조회\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst getTreeGridTimeDateDisplayValue = (grid: TGrid, row: TRow, col: string) => {\n const rawValue = (row as unknown as Record<string, unknown>)[col];\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null && `${displayValue}` !== '') {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 셀 fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * TreeGrid 외부 반환 행 Date 시간 값 정규화\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n */\nexport const normalizeTreeGridExternalRow = <T>(grid: TGrid, row: TRow & T) => {\n const normalizedRow = { ...row } as TRow & T;\n\n Object.keys(grid.Cols ?? {}).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, row, col)) {\n return;\n }\n\n (normalizedRow as Record<string, unknown>)[col] = getTreeGridTimeDateDisplayValue(grid, row, col);\n });\n\n return normalizedRow;\n};\n\n/**\n * TreeGrid 외부 반환 행 목록 Date 시간 값 정규화\n * @param grid TreeGrid 인스턴스\n * @param rows 대상 행 목록\n */\nexport const normalizeTreeGridExternalRows = <T>(grid: TGrid, rows: Array<TRow & T>) =>\n rows.map((row) => normalizeTreeGridExternalRow(grid, row));\n\n/**\n * 신규 행 추가 대상 계산\n * @param grid TreeGrid 인스턴스\n * @param options 행 추가 옵션\n */\nconst resolveRowInsertionTarget = <T>(grid: TGrid, options?: TreeGridAddRowOptions<T>) => {\n const insertPosition = options?.insertPosition ?? 'top';\n const parent = options?.parent;\n const anchorRow = options?.anchorRow;\n\n let resolvedParent = parent ?? (anchorRow ? anchorRow.parentNode : null) ?? grid.GetFirst();\n let next = null;\n\n switch (insertPosition) {\n case 'top':\n next = grid.GetFirst();\n break;\n\n case 'last':\n resolvedParent = grid.GetNext(grid.GetLast(), grid.RowCount > 0 ? grid.RowCount + 1 : 0);\n next = resolvedParent;\n break;\n\n case 'above':\n next = anchorRow ?? grid.GetFirst();\n break;\n\n case 'below':\n next = anchorRow?.nextSibling ?? grid.GetFirst();\n break;\n }\n\n return { resolvedParent, next };\n};\n\n/**\n * 신규 행 초기값 반영\n * @param grid TreeGrid 인스턴스\n * @param row 생성된 TreeGrid 행\n * @param initialValues 신규 행 초기값\n */\nconst assignInitialRowValues = <T>(grid: TGrid, row: TRow, initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return;\n }\n\n const initialValueKeys = Object.keys(initialValues as Record<string, unknown>).filter(Boolean);\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY] = initialValueKeys;\n\n Object.entries(initialValues as Record<string, unknown>).forEach(([rowKey, rowValue]) => {\n if (grid.Cols?.[rowKey]?.Type === 'Date' && typeof rowValue === 'string') {\n grid.SetString(row, rowKey, rowValue, 0);\n return;\n }\n\n (row as unknown as Record<string, unknown>)[rowKey] = rowValue;\n });\n};\n\n/**\n * 변경 데이터 컬럼 키 여부 확인\n * @param key 컬럼 키\n */\nconst isTreeGridDataKey = (key: string) => {\n return TREEGRID_DATA_KEY_PREFIXES.some((prefix) => key.startsWith(prefix));\n};\n\n/**\n * TreeGrid 숨김 값 여부\n * @param value Visible 속성값\n */\nconst isHiddenTreeGridValue = (value: unknown) => {\n return value === 0 || value === false || value === '0';\n};\n\n/**\n * TreeGrid 표시 컬럼 여부\n * @param grid TreeGrid 인스턴스\n * @param key 컬럼 키\n */\nconst isVisibleTreeGridColumn = (grid: TGrid | undefined, key: string) => {\n return !isHiddenTreeGridValue(grid?.Cols?.[key]?.Visible);\n};\n\n/**\n * addTreeGridRowById 생성 행 초기값 키 여부\n * @param row 대상 행\n * @param key 컬럼 키\n */\nconst isTreeGridAddedRowInitialValueKey = (row: TRow | null | undefined, key: string) => {\n return normalizeTreeGridStringValues(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY],\n ).includes(key);\n};\n\n/**\n * TreeGrid 변경 행 원본 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 변경 행 데이터\n */\nconst getLiveTreeGridChangedRow = (grid: TGrid | undefined, row: TreeGridChangedRow) => {\n return typeof row.id === 'string'\n ? (grid?.Rows as unknown as Record<string, TRow> | undefined)?.[row.id]\n : null;\n};\n\n/**\n * 추가 행 데이터 키 포함 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 변경 행 데이터\n * @param key 컬럼 키\n */\nconst shouldIncludeAddedRowDataKey = (\n grid: TGrid | undefined,\n row: TreeGridChangedRow,\n key: string,\n) => {\n if (!isTreeGridDataKey(key) || isEmpty(row[key])) {\n return false;\n }\n\n if (isVisibleTreeGridColumn(grid, key)) {\n return true;\n }\n\n return isTreeGridAddedRowInitialValueKey(getLiveTreeGridChangedRow(grid, row), key);\n};\n\n/**\n * 추가 행 데이터 정규화\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 변경 행 데이터\n */\nconst normalizeAddedRow = <T>(grid: TGrid | undefined, row: TreeGridChangedRow) => {\n return Object.fromEntries(\n without(Object.keys(row), 'id')\n .filter((key) => shouldIncludeAddedRowDataKey(grid, row, key))\n .map((key) => [key, row[key]]),\n ) as T;\n};\n\n/**\n * 변경 상태별 행 데이터 반환\n * @param rows TreeGrid 변경 행 목록\n * @param status 조회할 변경 상태\n */\nconst getChangedRowsByStatus = <T>(\n grid: TGrid | undefined,\n rows: TreeGridChangedRow[],\n status: TreeGridChangeStatus,\n) => {\n return rows\n .filter((row) => get(row, status) === '1' && row.Deleted !== '1')\n .map((row) =>\n status === 'Changed' ? omit(row, ['id', 'Changed']) : normalizeAddedRow<T>(grid, row),\n )\n .filter((row) => !isEmpty(row));\n};\n\n/**\n * TreeGrid 변경 행 Date 시간 값 정규화\n * @param grid TreeGrid 인스턴스\n * @param rows 변경 행 목록\n */\nconst normalizeTreeGridChangedRows = (grid: TGrid | undefined, rows: TreeGridChangedRow[]) => {\n if (!grid) {\n return rows;\n }\n\n return rows.map((row) => {\n const liveRow =\n typeof row.id === 'string'\n ? (grid.Rows as unknown as Record<string, TRow>)[row.id]\n : null;\n\n if (!liveRow) {\n return row;\n }\n\n const normalizedRow = { ...row };\n\n Object.keys(row).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, liveRow, col)) {\n return;\n }\n\n normalizedRow[col] = getTreeGridTimeDateDisplayValue(grid, liveRow, col);\n });\n\n return normalizedRow;\n });\n};\n\n/**\n * TreeGrid 인스턴스 ID 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridById = (gridId: string) => {\n return Grids[gridId];\n};\n\n/**\n * TreeGrid 데이터 행 목록 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridDataRowsById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n return grid ? (normalizeTreeGridExternalRows<T>(grid, getDataRows(grid) as Array<TRow & T>) as T) : [];\n};\n\n/**\n * TreeGrid Body 데이터 교체 후 재로드\n * @param gridId TreeGrid 인스턴스 ID\n * @param rows 새로 반영할 행 데이터\n */\nexport const reloadTreeGridBodyById = (gridId: string, rows: unknown) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n // @ts-expect-error - Data property not defined in type\n const currentData = grid.Data.Data;\n\n // @ts-expect-error - Data property not defined in type\n grid.Data.Data = {\n ...currentData,\n Data: { Body: [rows || []] },\n Url: '',\n };\n grid.ReloadBody();\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * 행을 특정 위치에 추가\n * @param gridId TreeGrid 인스턴스 ID\n * @param options.canSelect 행 선택 가능 여부\n * @param options.parent 부모 행\n * @param options.anchorRow above/below용 기준 행\n * @param options.insertPosition 행 삽입 위치\n * @param options.initialValues 신규 행 초기값\n */\nexport const addTreeGridRowById = <T>(\n gridId: string,\n options?: TreeGridAddRowOptions<T>,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const canSelect = options?.canSelect;\n const initialValues = options?.initialValues;\n const { resolvedParent, next } = resolveRowInsertionTarget(grid, options);\n\n const newRow = grid.AddRow(resolvedParent, next, 1);\n\n markTreeGridRowAddedById(newRow);\n assignInitialRowValues(grid, newRow, initialValues);\n markTreeGridAddedRowBaselineValues(grid, newRow);\n\n newRow.CanEdit = 1;\n newRow.CanDelete = 1;\n newRow.CanSelect = canSelect ? 1 : 0;\n\n grid.Focus(newRow);\n grid.RefreshRow(newRow);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * TreeGrid 추가/수정 데이터 행 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridRowChangesById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n const changesData = parseTreeGridXmlToJson(grid?.GetXmlData('changes,allcols,nogrid,noio'));\n\n if (!isArray(changesData)) {\n return { added: [], changed: [] };\n }\n\n return Object.fromEntries(\n TREEGRID_CHANGE_STATUSES.map((status) => [\n lowerCase(status),\n getChangedRowsByStatus<T>(\n grid,\n normalizeTreeGridChangedRows(grid, changesData as TreeGridChangedRow[]),\n status,\n ),\n ]),\n ) as { added: T[]; changed: T[] };\n};\n\n/**\n * TreeGrid 데이터 엑셀 내보내기\n * @param gridId TreeGrid 인스턴스 ID\n * @param title 다운로드 파일명\n */\nexport const exportTreeGridToExcelById = (gridId: string, title?: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n void loadExportTreeGridExcel().then((exportTreeGridExcel) =>\n exportTreeGridExcel(grid, { exportName: title ?? '' }),\n );\n};\n\n/**\n * TreeGrid 현재 선택 행 목록 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridSelectedRowsById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n const selectedRows = grid?.GetSelRows();\n\n return grid && selectedRows\n ? (normalizeTreeGridExternalRows<T>(grid, selectedRows as Array<TRow & T>) as T)\n : [];\n};\n\n/**\n * TreeGrid 컬럼 표시 여부 변경\n * @param gridId TreeGrid 인스턴스 ID\n * @param options.targetKey 표시 상태를 변경할 컬럼 키\n * @param options.canVisible 컬럼 표시 여부\n */\nexport const setTreeGridColumnVisibilityById = (\n gridId: string,\n options: TreeGridColumnVisibilityOptions,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid || !options?.targetKey) {\n return;\n }\n\n const targetKey = options?.targetKey;\n const canVisible = options?.canVisible;\n\n if (canVisible) {\n grid.ShowCol(targetKey);\n return;\n }\n grid.HideCol(targetKey);\n};\n\n/**\n * 특정 셀 강조 스타일 적용\n * @param gridId TreeGrid 인스턴스 ID\n * @param targetOption.row 강조할 대상 행\n * @param targetOption.col 강조할 대상 컬럼\n */\nexport const highlightTreeGridCellById = (\n gridId: string,\n targetOption: TreeGridHighlightTargetOption,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n preserveTreeGridCellStyleBaseline(grid, row, col);\n grid.SetValue(row, `${col}Class`, TREEGRID_CELL_CHANGED_CLASS);\n grid.SetValue(row, `${col}Color`, targetOption.backgroundColor ?? TREEGRID_CELL_HIGHLIGHT_COLOR);\n grid.RefreshCell(row, col);\n};\n\n/**\n * 특정 셀 강조 스타일 제거\n * @param gridId TreeGrid 인스턴스 ID\n * @param targetOption.row 강조 해제 대상 행\n * @param targetOption.col 강조 해제 대상 컬럼\n */\nexport const clearTreeGridCellHighlightById = (\n gridId: string,\n targetOption: Pick<TreeGridHighlightTargetOption, 'row' | 'col'>,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n const styleBaseline = getTreeGridCellStyleBaseline(row, col);\n\n grid.SetValue(row, `${col}Class`, styleBaseline?.className ?? '');\n grid.SetValue(row, `${col}Color`, styleBaseline?.color ?? '');\n grid.RefreshCell(row, col);\n};\n\n/**\n * TreeGrid 현재 선택 상태 전체 해제\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const resetTreeGridSelectionById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionDeselectAll(1, 0);\n};\n\n/**\n * 여러 TreeGrid 선택 상태 전체 해제\n * @param gridIds TreeGrid 인스턴스 ID 목록\n */\nexport const resetTreeGridSelectionsByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridSelectionById);\n};\n\n/**\n * TreeGrid 변경 사항 및 선택 상태 초기화\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const resetTreeGridChangesById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionUndoAll(1, 0);\n resetTreeGridSelectionById(gridId);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * 여러 TreeGrid 변경 사항 및 선택 상태 초기화\n * @param gridIds TreeGrid 인스턴스 ID 목록\n */\nexport const resetTreeGridChangesByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridChangesById);\n};\n\n/**\n * TreeGrid Enum 컬럼 옵션 반영\n * @param gridId TreeGrid 인스턴스 ID\n * @param columnName Enum을 적용할 컬럼명\n * @param options Enum 옵션 목록\n * @param valueKey Enum 값으로 사용할 필드명\n * @param labelKeys Enum 라벨로 사용할 필드 우선순위 목록\n */\nexport const setTreeGridColumnEnumOptionsById = <T extends object>(\n gridId: string,\n columnName: string,\n options: T[] | undefined,\n valueKey: keyof T & string,\n labelKeys: Array<keyof T & string>,\n) => {\n if (!options?.length) {\n return;\n }\n\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const enumValues = options\n .map((item) => {\n const option = item as Record<string, unknown>;\n const labelValue = labelKeys\n .map((labelKey) => option[labelKey])\n .find((value) => value !== undefined && value !== null && value !== '');\n\n return `${labelValue ?? ''}`;\n })\n .join('|');\n const enumKeys = options\n .map((item) => `${(item as Record<string, unknown>)[valueKey] ?? ''}`)\n .join('|');\n\n grid.SetAttribute(null, columnName, 'Type', 'Enum', 0, 0);\n grid.SetAttribute(null, columnName, 'Enum', `|${enumValues}`, 0, 0);\n grid.SetAttribute(null, columnName, 'EnumKeys', `|${enumKeys}`, 1, 0);\n};\n"],"names":["TREEGRID_CHANGE_STATUSES","TREEGRID_DATA_KEY_PREFIXES","TREEGRID_TIME_DATE_FORMAT_PATTERN","TREEGRID_ADDED_ROW_BY_ID_FLAG","TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY","TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY","TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY","TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY","normalizeTreeGridStringValues","__name","value","isArray","item","normalizeTreeGridAddedRowHighlightColumns","markTreeGridRowAddedById","row","isTreeGridRowAddedById","addedById","appendTreeGridAddedRowHighlightColumn","col","targetRow","currentColumns","removeTreeGridAddedRowHighlightColumn","nextColumns","column","getTreeGridAddedRowHighlightColumns","getTreeGridCellComparableValue","grid","cellType","_a","_c","_b","rawValue","_d","displayValue","_e","markTreeGridAddedRowBaselineValues","baselineValues","getTreeGridAddedRowBaselineValue","preserveTreeGridCellStyleBaseline","getTreeGridCellStyleBaseline","loadExportTreeGridExcel","exportTreeGridExcel","getDataRows","isTreeGridTimeDateFormat","format","isTreeGridTimeDateColumn","rowRecord","getTreeGridTimeDateDisplayValue","normalizeTreeGridExternalRow","normalizedRow","normalizeTreeGridExternalRows","rows","resolveRowInsertionTarget","options","insertPosition","parent","anchorRow","resolvedParent","next","assignInitialRowValues","initialValues","isPlainObject","initialValueKeys","rowKey","rowValue","isTreeGridDataKey","key","prefix","isHiddenTreeGridValue","isVisibleTreeGridColumn","isTreeGridAddedRowInitialValueKey","getLiveTreeGridChangedRow","shouldIncludeAddedRowDataKey","isEmpty","normalizeAddedRow","without","getChangedRowsByStatus","status","get","omit","normalizeTreeGridChangedRows","liveRow","getTreeGridById","gridId","getTreeGridDataRowsById","reloadTreeGridBodyById","currentData","emitTreeGridBodyRowsChanged","addTreeGridRowById","canSelect","newRow","getTreeGridRowChangesById","changesData","parseTreeGridXmlToJson","lowerCase","exportTreeGridToExcelById","title","getTreeGridSelectedRowsById","selectedRows","setTreeGridColumnVisibilityById","targetKey","highlightTreeGridCellById","targetOption","TREEGRID_CELL_CHANGED_CLASS","TREEGRID_CELL_HIGHLIGHT_COLOR","clearTreeGridCellHighlightById","styleBaseline","resetTreeGridSelectionById","resetTreeGridSelectionsByIds","gridIds","resetTreeGridChangesById","resetTreeGridChangesByIds","setTreeGridColumnEnumOptionsById","columnName","valueKey","labelKeys","enumValues","option","labelKey","enumKeys"],"mappings":"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"}
1
+ {"version":3,"file":"treeGridUtil.js","sources":["../../src/utils/treeGridUtil.ts"],"sourcesContent":["import {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n} from '@/constants/treeGrid';\nimport { parseTreeGridXmlToJson } from '@/components/OwpTreeGrid/internal/treeGridLayout';\nimport { emitTreeGridBodyRowsChanged } from '@/utils/internal/treeGridBodyRowsEvent';\nimport { isPlainObject } from 'es-toolkit';\nimport { get, isArray, isEmpty, lowerCase, omit, without } from 'es-toolkit/compat';\n\nexport {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n};\n\ntype TreeGridInsertPosition = 'above' | 'below' | 'top' | 'last';\n\ntype TreeGridAddRowOptions<T> = {\n canSelect?: boolean;\n insertPosition?: TreeGridInsertPosition;\n parent?: TRow & T;\n anchorRow?: TRow & T;\n initialValues?: T;\n};\n\ntype TreeGridColumnVisibilityOptions = {\n targetKey: string;\n canVisible: boolean;\n};\n\ntype TreeGridHighlightTargetOption = {\n row: TRow;\n col: string;\n backgroundColor?: string;\n};\ntype TreeGridAddedRowMetadata = TRow & {\n [TREEGRID_ADDED_ROW_BY_ID_FLAG]?: boolean | number;\n [TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY]?: Record<string, string>;\n [TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?: Record<\n string,\n { className: unknown; color: unknown }\n >;\n};\n\ntype TreeGridChangeStatus = 'Added' | 'Changed';\ntype TreeGridChangedRow = Record<string, unknown>;\n\nconst TREEGRID_CHANGE_STATUSES: TreeGridChangeStatus[] = ['Added', 'Changed'];\nconst TREEGRID_DATA_KEY_PREFIXES = ['OWP', 'IPX'];\nconst TREEGRID_TIME_DATE_FORMAT_PATTERN = /^H{1,2}(?::m{1,2})?(?::s{1,2})?$/;\nconst TREEGRID_ADDED_ROW_BY_ID_FLAG = '__owpAddedByAddTreeGridRowById';\nconst TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY = '__owpAddedRowHighlightColumns';\nconst TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY = '__owpAddedRowInitialValueKeys';\nconst TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY = '__owpAddedRowBaselineValues';\nconst TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY = '__owpCellStyleBaselineValues';\n\nconst normalizeTreeGridStringValues = (value: unknown) => {\n if (!isArray(value)) {\n return [];\n }\n\n return value.filter((item): item is string => typeof item === 'string' && item !== '');\n};\n\nconst normalizeTreeGridAddedRowHighlightColumns = normalizeTreeGridStringValues;\n\n/**\n * addTreeGridRowById 생성 행 마킹\n * @param row 대상 행\n */\nconst markTreeGridRowAddedById = (row: TRow | null | undefined) => {\n if (!row) {\n return;\n }\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BY_ID_FLAG] = 1;\n};\n\n/**\n * addTreeGridRowById 생성 행 여부\n * @param row 대상 행\n */\nexport const isTreeGridRowAddedById = (row: TRow | null | undefined) => {\n const addedById = (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_BY_ID_FLAG];\n\n return !!row && addedById !== 0 && addedById !== false && addedById !== undefined;\n};\n\n/**\n * addTreeGridRowById 생성 행 하이라이트 컬럼 누적\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const appendTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n\n if (currentColumns.includes(col)) {\n return;\n }\n\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = [...currentColumns, col];\n};\n\n/**\n * addTreeGridRowById 생성 행 하이라이트 컬럼 제거\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const removeTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n const nextColumns = currentColumns.filter((column) => column !== col);\n\n if (nextColumns.length) {\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = nextColumns;\n return;\n }\n\n delete targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY];\n};\n\n/**\n * addTreeGridRowById 생성 행 하이라이트 컬럼 조회\n * @param row 대상 행\n */\nexport const getTreeGridAddedRowHighlightColumns = (row: TRow | null | undefined) => {\n return normalizeTreeGridAddedRowHighlightColumns(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n};\n\n/**\n * TreeGrid 셀 비교 값 조회\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const getTreeGridCellComparableValue = (\n grid: TGrid,\n row: TRow,\n col: string,\n) => {\n const cellType = grid.GetType?.(row, col) || grid.Cols?.[col]?.Type || '';\n const rawValue =\n grid.GetValue?.(row, col) ?? (row as unknown as Record<string, unknown>)[col];\n\n if (cellType === 'Enum' || cellType === 'Select') {\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n }\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null) {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 셀 fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * addTreeGridRowById 생성 행 기준값 저장\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n */\nconst markTreeGridAddedRowBaselineValues = (grid: TGrid, row: TRow) => {\n const baselineValues = Object.fromEntries(\n Object.keys(grid.Cols ?? {}).map((col) => [\n col,\n getTreeGridCellComparableValue(grid, row, col),\n ]),\n );\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY] = baselineValues;\n};\n\n/**\n * addTreeGridRowById 생성 행 기준값 조회\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nexport const getTreeGridAddedRowBaselineValue = (\n row: TRow | null | undefined,\n col: string,\n) => {\n return (row as TreeGridAddedRowMetadata | null)?.[\n TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY\n ]?.[col];\n};\n\n/**\n * TreeGrid 셀 하이라이트 전 스타일 저장\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst preserveTreeGridCellStyleBaseline = (grid: TGrid, row: TRow, col: string) => {\n const targetRow = row as TreeGridAddedRowMetadata;\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY] ??= {};\n\n if (targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col]) {\n return;\n }\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY][col] = {\n className: grid.GetAttribute(row, col, 'Class'),\n color: grid.GetAttribute(row, col, 'Color'),\n };\n};\n\n/**\n * TreeGrid 셀 하이라이트 전 스타일 조회\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst getTreeGridCellStyleBaseline = (row: TRow, col: string) => {\n return (row as TreeGridAddedRowMetadata)[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col];\n};\n\n/**\n * TreeGrid 엑셀 내보내기 유틸 로더\n */\nconst loadExportTreeGridExcel = async () => {\n const { exportTreeGridExcel } = await import('./treeGridExportExcelUtil');\n\n return exportTreeGridExcel;\n};\n\n/**\n * TreeGrid 데이터 행 목록 추출\n * @param grid TreeGrid 인스턴스\n */\nconst getDataRows = (grid: TGrid | undefined) => {\n return Object.values(grid?.Rows ?? {}).filter((item) => item.Kind === 'Data');\n};\n\n/**\n * TreeGrid 시간 전용 Date 포맷 여부\n * @param format TreeGrid 날짜 포맷\n */\nconst isTreeGridTimeDateFormat = (format: unknown) =>\n typeof format === 'string' && TREEGRID_TIME_DATE_FORMAT_PATTERN.test(format.trim());\n\n/**\n * TreeGrid 시간 전용 Date 컬럼 여부\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst isTreeGridTimeDateColumn = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n const column = grid.Cols?.[col];\n\n return (\n column?.Type === 'Date' &&\n (isTreeGridTimeDateFormat(rowRecord[`${col}EditFormat`]) ||\n isTreeGridTimeDateFormat(rowRecord[`${col}Format`]) ||\n isTreeGridTimeDateFormat(column.EditFormat) ||\n isTreeGridTimeDateFormat(column.Format))\n );\n};\n\n/**\n * TreeGrid 시간 전용 Date 표시 값 조회\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst getTreeGridTimeDateDisplayValue = (grid: TGrid, row: TRow, col: string) => {\n const rawValue = (row as unknown as Record<string, unknown>)[col];\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null && `${displayValue}` !== '') {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 셀 fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * TreeGrid 외부 반환 행 Date 시간 값 정규화\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n */\nconst normalizeTreeGridExternalRow = <T>(grid: TGrid, row: TRow & T) => {\n const normalizedRow = { ...row } as TRow & T;\n\n Object.keys(grid.Cols ?? {}).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, row, col)) {\n return;\n }\n\n (normalizedRow as Record<string, unknown>)[col] = getTreeGridTimeDateDisplayValue(grid, row, col);\n });\n\n return normalizedRow;\n};\n\n/**\n * TreeGrid 외부 반환 행 목록 Date 시간 값 정규화\n * @param grid TreeGrid 인스턴스\n * @param rows 대상 행 목록\n */\nexport const normalizeTreeGridExternalRows = <T>(grid: TGrid, rows: Array<TRow & T>) =>\n rows.map((row) => normalizeTreeGridExternalRow(grid, row));\n\n/**\n * 신규 행 추가 대상 계산\n * @param grid TreeGrid 인스턴스\n * @param options 행 추가 옵션\n */\nconst resolveRowInsertionTarget = <T>(grid: TGrid, options?: TreeGridAddRowOptions<T>) => {\n const insertPosition = options?.insertPosition ?? 'top';\n const parent = options?.parent;\n const anchorRow = options?.anchorRow;\n\n let resolvedParent = parent ?? (anchorRow ? anchorRow.parentNode : null) ?? grid.GetFirst();\n let next = null;\n\n switch (insertPosition) {\n case 'top':\n next = grid.GetFirst();\n break;\n\n case 'last':\n resolvedParent = grid.GetNext(grid.GetLast(), grid.RowCount > 0 ? grid.RowCount + 1 : 0);\n next = resolvedParent;\n break;\n\n case 'above':\n next = anchorRow ?? grid.GetFirst();\n break;\n\n case 'below':\n next = anchorRow?.nextSibling ?? grid.GetFirst();\n break;\n }\n\n return { resolvedParent, next };\n};\n\n/**\n * 신규 행 초기값 반영\n * @param grid TreeGrid 인스턴스\n * @param row 생성된 TreeGrid 행\n * @param initialValues 신규 행 초기값\n */\nconst assignInitialRowValues = <T>(grid: TGrid, row: TRow, initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return;\n }\n\n const initialValueKeys = Object.keys(initialValues as Record<string, unknown>).filter(Boolean);\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY] = initialValueKeys;\n\n Object.entries(initialValues as Record<string, unknown>).forEach(([rowKey, rowValue]) => {\n if (grid.Cols?.[rowKey]?.Type === 'Date' && typeof rowValue === 'string') {\n grid.SetString(row, rowKey, rowValue, 0);\n return;\n }\n\n (row as unknown as Record<string, unknown>)[rowKey] = rowValue;\n });\n};\n\n/**\n * 변경 데이터 컬럼 키 여부 확인\n * @param key 컬럼 키\n */\nconst isTreeGridDataKey = (key: string) => {\n return TREEGRID_DATA_KEY_PREFIXES.some((prefix) => key.startsWith(prefix));\n};\n\n/**\n * TreeGrid 숨김 값 여부\n * @param value Visible 속성값\n */\nconst isHiddenTreeGridValue = (value: unknown) => {\n return value === 0 || value === false || value === '0';\n};\n\n/**\n * TreeGrid 표시 컬럼 여부\n * @param grid TreeGrid 인스턴스\n * @param key 컬럼 키\n */\nconst isVisibleTreeGridColumn = (grid: TGrid | undefined, key: string) => {\n return !isHiddenTreeGridValue(grid?.Cols?.[key]?.Visible);\n};\n\n/**\n * addTreeGridRowById 생성 행 초기값 키 여부\n * @param row 대상 행\n * @param key 컬럼 키\n */\nconst isTreeGridAddedRowInitialValueKey = (row: TRow | null | undefined, key: string) => {\n return normalizeTreeGridStringValues(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY],\n ).includes(key);\n};\n\n/**\n * TreeGrid 변경 행 원본 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 변경 행 데이터\n */\nconst getLiveTreeGridChangedRow = (grid: TGrid | undefined, row: TreeGridChangedRow) => {\n return typeof row.id === 'string'\n ? (grid?.Rows as unknown as Record<string, TRow> | undefined)?.[row.id]\n : null;\n};\n\n/**\n * 추가 행 데이터 키 포함 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 변경 행 데이터\n * @param key 컬럼 키\n */\nconst shouldIncludeAddedRowDataKey = (\n grid: TGrid | undefined,\n row: TreeGridChangedRow,\n key: string,\n) => {\n if (!isTreeGridDataKey(key) || isEmpty(row[key])) {\n return false;\n }\n\n if (isVisibleTreeGridColumn(grid, key)) {\n return true;\n }\n\n return isTreeGridAddedRowInitialValueKey(getLiveTreeGridChangedRow(grid, row), key);\n};\n\n/**\n * 추가 행 데이터 정규화\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 변경 행 데이터\n */\nconst normalizeAddedRow = <T>(grid: TGrid | undefined, row: TreeGridChangedRow) => {\n return Object.fromEntries(\n without(Object.keys(row), 'id')\n .filter((key) => shouldIncludeAddedRowDataKey(grid, row, key))\n .map((key) => [key, row[key]]),\n ) as T;\n};\n\n/**\n * 변경 상태별 행 데이터 반환\n * @param rows TreeGrid 변경 행 목록\n * @param status 조회할 변경 상태\n */\nconst getChangedRowsByStatus = <T>(\n grid: TGrid | undefined,\n rows: TreeGridChangedRow[],\n status: TreeGridChangeStatus,\n) => {\n return rows\n .filter((row) => get(row, status) === '1' && row.Deleted !== '1')\n .map((row) =>\n status === 'Changed' ? omit(row, ['id', 'Changed']) : normalizeAddedRow<T>(grid, row),\n )\n .filter((row) => !isEmpty(row));\n};\n\n/**\n * TreeGrid 변경 행 Date 시간 값 정규화\n * @param grid TreeGrid 인스턴스\n * @param rows 변경 행 목록\n */\nconst normalizeTreeGridChangedRows = (grid: TGrid | undefined, rows: TreeGridChangedRow[]) => {\n if (!grid) {\n return rows;\n }\n\n return rows.map((row) => {\n const liveRow =\n typeof row.id === 'string'\n ? (grid.Rows as unknown as Record<string, TRow>)[row.id]\n : null;\n\n if (!liveRow) {\n return row;\n }\n\n const normalizedRow = { ...row };\n\n Object.keys(row).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, liveRow, col)) {\n return;\n }\n\n normalizedRow[col] = getTreeGridTimeDateDisplayValue(grid, liveRow, col);\n });\n\n return normalizedRow;\n });\n};\n\n/**\n * TreeGrid 인스턴스 ID 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridById = (gridId: string) => {\n return Grids[gridId];\n};\n\n/**\n * TreeGrid 데이터 행 목록 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridDataRowsById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n return grid ? (normalizeTreeGridExternalRows<T>(grid, getDataRows(grid) as Array<TRow & T>) as T) : [];\n};\n\n/**\n * TreeGrid Body 데이터 교체 후 재로드\n * @param gridId TreeGrid 인스턴스 ID\n * @param rows 새로 반영할 행 데이터\n */\nexport const reloadTreeGridBodyById = (gridId: string, rows: unknown) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n // @ts-expect-error - Data property not defined in type\n const currentData = grid.Data.Data;\n\n // @ts-expect-error - Data property not defined in type\n grid.Data.Data = {\n ...currentData,\n Data: { Body: [rows || []] },\n Url: '',\n };\n grid.ReloadBody();\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * 행을 특정 위치에 추가\n * @param gridId TreeGrid 인스턴스 ID\n * @param options.canSelect 행 선택 가능 여부\n * @param options.parent 부모 행\n * @param options.anchorRow above/below용 기준 행\n * @param options.insertPosition 행 삽입 위치\n * @param options.initialValues 신규 행 초기값\n */\nexport const addTreeGridRowById = <T>(\n gridId: string,\n options?: TreeGridAddRowOptions<T>,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const canSelect = options?.canSelect;\n const initialValues = options?.initialValues;\n const { resolvedParent, next } = resolveRowInsertionTarget(grid, options);\n\n const newRow = grid.AddRow(resolvedParent, next, 1);\n\n markTreeGridRowAddedById(newRow);\n assignInitialRowValues(grid, newRow, initialValues);\n markTreeGridAddedRowBaselineValues(grid, newRow);\n\n newRow.CanEdit = 1;\n newRow.CanDelete = 1;\n newRow.CanSelect = canSelect ? 1 : 0;\n\n grid.Focus(newRow);\n grid.RefreshRow(newRow);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * TreeGrid 추가/수정 데이터 행 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridRowChangesById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n const changesData = parseTreeGridXmlToJson(grid?.GetXmlData('changes,allcols,nogrid,noio'));\n\n if (!isArray(changesData)) {\n return { added: [], changed: [] };\n }\n\n return Object.fromEntries(\n TREEGRID_CHANGE_STATUSES.map((status) => [\n lowerCase(status),\n getChangedRowsByStatus<T>(\n grid,\n normalizeTreeGridChangedRows(grid, changesData as TreeGridChangedRow[]),\n status,\n ),\n ]),\n ) as { added: T[]; changed: T[] };\n};\n\n/**\n * TreeGrid 데이터 엑셀 내보내기\n * @param gridId TreeGrid 인스턴스 ID\n * @param title 다운로드 파일명\n */\nexport const exportTreeGridToExcelById = (gridId: string, title?: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n void loadExportTreeGridExcel().then((exportTreeGridExcel) =>\n exportTreeGridExcel(grid, { exportName: title ?? '' }),\n );\n};\n\n/**\n * TreeGrid 현재 선택 행 목록 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const getTreeGridSelectedRowsById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n const selectedRows = grid?.GetSelRows();\n\n return grid && selectedRows\n ? (normalizeTreeGridExternalRows<T>(grid, selectedRows as Array<TRow & T>) as T)\n : [];\n};\n\n/**\n * TreeGrid 컬럼 표시 여부 변경\n * @param gridId TreeGrid 인스턴스 ID\n * @param options.targetKey 표시 상태를 변경할 컬럼 키\n * @param options.canVisible 컬럼 표시 여부\n */\nexport const setTreeGridColumnVisibilityById = (\n gridId: string,\n options: TreeGridColumnVisibilityOptions,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid || !options?.targetKey) {\n return;\n }\n\n const targetKey = options?.targetKey;\n const canVisible = options?.canVisible;\n\n if (canVisible) {\n grid.ShowCol(targetKey);\n return;\n }\n grid.HideCol(targetKey);\n};\n\n/**\n * 특정 셀 강조 스타일 적용\n * @param gridId TreeGrid 인스턴스 ID\n * @param targetOption.row 강조할 대상 행\n * @param targetOption.col 강조할 대상 컬럼\n */\nexport const highlightTreeGridCellById = (\n gridId: string,\n targetOption: TreeGridHighlightTargetOption,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n preserveTreeGridCellStyleBaseline(grid, row, col);\n grid.SetValue(row, `${col}Class`, TREEGRID_CELL_CHANGED_CLASS);\n grid.SetValue(row, `${col}Color`, targetOption.backgroundColor ?? TREEGRID_CELL_HIGHLIGHT_COLOR);\n grid.RefreshCell(row, col);\n};\n\n/**\n * 특정 셀 강조 스타일 제거\n * @param gridId TreeGrid 인스턴스 ID\n * @param targetOption.row 강조 해제 대상 행\n * @param targetOption.col 강조 해제 대상 컬럼\n */\nexport const clearTreeGridCellHighlightById = (\n gridId: string,\n targetOption: Pick<TreeGridHighlightTargetOption, 'row' | 'col'>,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n const styleBaseline = getTreeGridCellStyleBaseline(row, col);\n\n grid.SetValue(row, `${col}Class`, styleBaseline?.className ?? '');\n grid.SetValue(row, `${col}Color`, styleBaseline?.color ?? '');\n grid.RefreshCell(row, col);\n};\n\n/**\n * TreeGrid 현재 선택 상태 전체 해제\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const resetTreeGridSelectionById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionDeselectAll(1, 0);\n};\n\n/**\n * 여러 TreeGrid 선택 상태 전체 해제\n * @param gridIds TreeGrid 인스턴스 ID 목록\n */\nexport const resetTreeGridSelectionsByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridSelectionById);\n};\n\n/**\n * TreeGrid 변경 사항 및 선택 상태 초기화\n * @param gridId TreeGrid 인스턴스 ID\n */\nexport const resetTreeGridChangesById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionUndoAll(1, 0);\n resetTreeGridSelectionById(gridId);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * 여러 TreeGrid 변경 사항 및 선택 상태 초기화\n * @param gridIds TreeGrid 인스턴스 ID 목록\n */\nexport const resetTreeGridChangesByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridChangesById);\n};\n\n/**\n * TreeGrid Enum 컬럼 옵션 반영\n * @param gridId TreeGrid 인스턴스 ID\n * @param columnName Enum을 적용할 컬럼명\n * @param options Enum 옵션 목록\n * @param valueKey Enum 값으로 사용할 필드명\n * @param labelKeys Enum 라벨로 사용할 필드 우선순위 목록\n */\nexport const setTreeGridColumnEnumOptionsById = <T extends object>(\n gridId: string,\n columnName: string,\n options: T[] | undefined,\n valueKey: keyof T & string,\n labelKeys: Array<keyof T & string>,\n) => {\n if (!options?.length) {\n return;\n }\n\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const enumValues = options\n .map((item) => {\n const option = item as Record<string, unknown>;\n const labelValue = labelKeys\n .map((labelKey) => option[labelKey])\n .find((value) => value !== undefined && value !== null && value !== '');\n\n return `${labelValue ?? ''}`;\n })\n .join('|');\n const enumKeys = options\n .map((item) => `${(item as Record<string, unknown>)[valueKey] ?? ''}`)\n .join('|');\n\n grid.SetAttribute(null, columnName, 'Type', 'Enum', 0, 0);\n grid.SetAttribute(null, columnName, 'Enum', `|${enumValues}`, 0, 0);\n grid.SetAttribute(null, columnName, 'EnumKeys', `|${enumKeys}`, 1, 0);\n};\n"],"names":["TREEGRID_CHANGE_STATUSES","TREEGRID_DATA_KEY_PREFIXES","TREEGRID_TIME_DATE_FORMAT_PATTERN","TREEGRID_ADDED_ROW_BY_ID_FLAG","TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY","TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY","TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY","TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY","normalizeTreeGridStringValues","__name","value","isArray","item","normalizeTreeGridAddedRowHighlightColumns","markTreeGridRowAddedById","row","isTreeGridRowAddedById","addedById","appendTreeGridAddedRowHighlightColumn","col","targetRow","currentColumns","removeTreeGridAddedRowHighlightColumn","nextColumns","column","getTreeGridAddedRowHighlightColumns","getTreeGridCellComparableValue","grid","cellType","_a","_c","_b","rawValue","_d","displayValue","_e","markTreeGridAddedRowBaselineValues","baselineValues","getTreeGridAddedRowBaselineValue","preserveTreeGridCellStyleBaseline","getTreeGridCellStyleBaseline","loadExportTreeGridExcel","exportTreeGridExcel","getDataRows","isTreeGridTimeDateFormat","format","isTreeGridTimeDateColumn","rowRecord","getTreeGridTimeDateDisplayValue","normalizeTreeGridExternalRow","normalizedRow","normalizeTreeGridExternalRows","rows","resolveRowInsertionTarget","options","insertPosition","parent","anchorRow","resolvedParent","next","assignInitialRowValues","initialValues","isPlainObject","initialValueKeys","rowKey","rowValue","isTreeGridDataKey","key","prefix","isHiddenTreeGridValue","isVisibleTreeGridColumn","isTreeGridAddedRowInitialValueKey","getLiveTreeGridChangedRow","shouldIncludeAddedRowDataKey","isEmpty","normalizeAddedRow","without","getChangedRowsByStatus","status","get","omit","normalizeTreeGridChangedRows","liveRow","getTreeGridById","gridId","getTreeGridDataRowsById","reloadTreeGridBodyById","currentData","emitTreeGridBodyRowsChanged","addTreeGridRowById","canSelect","newRow","getTreeGridRowChangesById","changesData","parseTreeGridXmlToJson","lowerCase","exportTreeGridToExcelById","title","getTreeGridSelectedRowsById","selectedRows","setTreeGridColumnVisibilityById","targetKey","highlightTreeGridCellById","targetOption","TREEGRID_CELL_CHANGED_CLASS","TREEGRID_CELL_HIGHLIGHT_COLOR","clearTreeGridCellHighlightById","styleBaseline","resetTreeGridSelectionById","resetTreeGridSelectionsByIds","gridIds","resetTreeGridChangesById","resetTreeGridChangesByIds","setTreeGridColumnEnumOptionsById","columnName","valueKey","labelKeys","enumValues","option","labelKey","enumKeys"],"mappings":"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"}
@@ -3,7 +3,7 @@ var i = (e, t) => y(e, "name", { value: t, configurable: !0 });
3
3
  import { owpDayjs as v } from "../dayjs.js";
4
4
  import { t as E } from "i18next";
5
5
  import { enqueueSnackbar as d } from "notistack";
6
- import { loadJSZip as m } from "./jszipBrowser.js";
6
+ import { loadJSZip as m } from "./internal/jszipBrowser.js";
7
7
  const l = {
8
8
  type: "pdf",
9
9
  fileExtension: "application/pdf",
@@ -1 +1 @@
1
- {"version":3,"file":"zipUtil.js","sources":["../../src/utils/zipUtil.ts"],"sourcesContent":["import dayjs from '@/dayjs';\nimport { t } from 'i18next';\nimport type JSZip from 'jszip';\nimport { enqueueSnackbar } from 'notistack';\nimport { loadJSZip } from './jszipBrowser';\n\ntype BlobInfoData = {\n blob: Blob;\n fileName: string;\n};\n\nexport interface SaveAsZipFileOptions {\n type?: string;\n fileExtension?: string;\n fileTitle?: string;\n archiveExtension?: string;\n appendDatetime?: boolean;\n preserveFileNames?: boolean;\n}\n\nconst DEFAULT_ZIP_OPTIONS: Required<SaveAsZipFileOptions> = {\n type: 'pdf',\n fileExtension: 'application/pdf',\n fileTitle: 'archive',\n archiveExtension: 'zip',\n appendDatetime: false,\n preserveFileNames: false,\n};\n\n/**\n * 파일명 안전 문자 변환\n * @param fileName 원본 파일명\n */\nconst sanitizeFileName = (fileName: string) => fileName.replace(/[.*+?^${}()|[\\]\\\\]/g, '_');\n\n/**\n * ZIP 경고 메시지 출력\n * @param message 경고 메시지\n */\nconst showZipWarning = (message: string) => {\n enqueueSnackbar(\n t(`Message.${message}`, {\n defaultValue: message,\n }),\n { variant: 'warning' },\n );\n};\n\n/**\n * ZIP 저장 옵션 정규화\n * @param options 저장 옵션\n */\nconst normalizeZipOptions = (options?: SaveAsZipFileOptions) => {\n return {\n type: options?.type ?? DEFAULT_ZIP_OPTIONS.type,\n fileExtension: options?.fileExtension ?? DEFAULT_ZIP_OPTIONS.fileExtension,\n fileTitle: options?.fileTitle ?? DEFAULT_ZIP_OPTIONS.fileTitle,\n archiveExtension: options?.archiveExtension ?? DEFAULT_ZIP_OPTIONS.archiveExtension,\n appendDatetime: options?.appendDatetime ?? DEFAULT_ZIP_OPTIONS.appendDatetime,\n preserveFileNames: options?.preserveFileNames ?? DEFAULT_ZIP_OPTIONS.preserveFileNames,\n };\n};\n\n/**\n * ZIP 내부 파일명 생성\n * @param index 파일 순서\n * @param fileName 파일명\n * @param fileExtension 파일 확장자\n */\nconst createZipEntryFileName = (index: number, fileName: string, fileExtension: string) => {\n return `${sanitizeFileName(`${index + 1}_${fileName}`)}.${fileExtension}`;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n */\nconst normalizeArchiveExtension = (archiveExtension: string) => {\n return archiveExtension.replace(/^\\.+/, '') || DEFAULT_ZIP_OPTIONS.archiveExtension;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n * @param archiveExtension 아카이브 확장자\n */\nconst createArchiveFileName = (\n fileTitle: string,\n appendDatetime: boolean,\n archiveExtension: string,\n) => {\n return `${sanitizeFileName(fileTitle)}${appendDatetime ? `-${dayjs().format('YYYY_MM_DD_HH_mm_ss')}` : ''}.${normalizeArchiveExtension(archiveExtension)}`;\n};\n\n/**\n * ZIP 엔트리 일치 여부 확인\n * @param fileName ZIP 엔트리 파일명\n * @param matcher 엔트리 식별자\n */\nconst isMatchedZipEntry = (\n fileName: string,\n matcher: string | RegExp | ((fileName: string) => boolean),\n) => {\n if (typeof matcher === 'string') {\n return fileName === matcher;\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(fileName);\n }\n\n return matcher(fileName);\n};\n\n/**\n * ZIP 소스 ArrayBuffer 변환\n * @param source ZIP 소스\n */\nconst toZipArrayBuffer = async (source: Blob | ArrayBuffer) => {\n return source instanceof Blob ? source.arrayBuffer() : source;\n};\n\n/**\n * ZIP 엔트리 텍스트 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryText = async (\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<string | null> => {\n const JSZip = await loadJSZip();\n const zip = await JSZip.loadAsync(await toZipArrayBuffer(source));\n const zipFile = Object.values(zip.files).find(\n (entry) => !entry.dir && isMatchedZipEntry(entry.name, matcher),\n );\n\n if (!zipFile) {\n return null;\n }\n\n return zipFile.async('string');\n};\n\n/**\n * ZIP 엔트리 JSON 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryJson = async <T>(\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<T | null> => {\n const text = await readZipEntryText(source, matcher);\n\n if (!text) {\n return null;\n }\n\n return JSON.parse(text) as T;\n};\n\n/**\n * ZIP 파일 데이터 추가\n * @param zip ZIP 인스턴스\n * @param data 파일 데이터 목록\n * @param options ZIP 저장 옵션\n */\nconst appendZipFiles = (\n zip: JSZip,\n data: BlobInfoData[],\n options: Required<SaveAsZipFileOptions>,\n) => {\n data.forEach(({ blob, fileName }, index) => {\n if (!blob) {\n return;\n }\n\n zip.file(\n options.preserveFileNames\n ? fileName\n : createZipEntryFileName(index, fileName, options.fileExtension),\n options.preserveFileNames ? blob : new Blob([blob], { type: options.type }),\n );\n });\n};\n\n/**\n * ZIP 파일 저장\n * @param data 저장할 파일 데이터\n * @param options 저장 옵션\n */\nexport const saveAsZipFile = async (\n data: BlobInfoData[],\n options?: SaveAsZipFileOptions,\n) => {\n const normalizedOptions = normalizeZipOptions(options);\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.type) {\n showZipWarning('type 이 선언되지 않았습니다');\n return;\n }\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.fileExtension) {\n showZipWarning('파일 확장자가 선언되지 않았습니다');\n return;\n }\n\n if (!data) {\n showZipWarning('다운로드할 데이터가 없습니다');\n return;\n }\n\n const JSZip = await loadJSZip();\n const zip = new JSZip();\n appendZipFiles(zip, data, normalizedOptions);\n\n const archiveFiles = await zip.generateAsync({ type: 'blob' });\n const url = URL.createObjectURL(archiveFiles);\n const link = document.createElement('a');\n link.href = url;\n link.download = createArchiveFileName(\n normalizedOptions.fileTitle,\n normalizedOptions.appendDatetime,\n normalizedOptions.archiveExtension,\n );\n link.click();\n URL.revokeObjectURL(url);\n};\n"],"names":["DEFAULT_ZIP_OPTIONS","sanitizeFileName","__name","fileName","showZipWarning","message","enqueueSnackbar","t","normalizeZipOptions","options","createZipEntryFileName","index","fileExtension","normalizeArchiveExtension","archiveExtension","createArchiveFileName","fileTitle","appendDatetime","dayjs","isMatchedZipEntry","matcher","toZipArrayBuffer","source","readZipEntryText","zip","loadJSZip","zipFile","entry","readZipEntryJson","text","appendZipFiles","data","blob","saveAsZipFile","normalizedOptions","JSZip","archiveFiles","url","link"],"mappings":"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"}
1
+ {"version":3,"file":"zipUtil.js","sources":["../../src/utils/zipUtil.ts"],"sourcesContent":["import dayjs from '@/dayjs';\nimport { t } from 'i18next';\nimport type JSZip from 'jszip';\nimport { enqueueSnackbar } from 'notistack';\nimport { loadJSZip } from './internal/jszipBrowser';\n\ntype BlobInfoData = {\n blob: Blob;\n fileName: string;\n};\n\nexport interface SaveAsZipFileOptions {\n type?: string;\n fileExtension?: string;\n fileTitle?: string;\n archiveExtension?: string;\n appendDatetime?: boolean;\n preserveFileNames?: boolean;\n}\n\nconst DEFAULT_ZIP_OPTIONS: Required<SaveAsZipFileOptions> = {\n type: 'pdf',\n fileExtension: 'application/pdf',\n fileTitle: 'archive',\n archiveExtension: 'zip',\n appendDatetime: false,\n preserveFileNames: false,\n};\n\n/**\n * 파일명 안전 문자 변환\n * @param fileName 원본 파일명\n */\nconst sanitizeFileName = (fileName: string) => fileName.replace(/[.*+?^${}()|[\\]\\\\]/g, '_');\n\n/**\n * ZIP 경고 메시지 출력\n * @param message 경고 메시지\n */\nconst showZipWarning = (message: string) => {\n enqueueSnackbar(\n t(`Message.${message}`, {\n defaultValue: message,\n }),\n { variant: 'warning' },\n );\n};\n\n/**\n * ZIP 저장 옵션 정규화\n * @param options 저장 옵션\n */\nconst normalizeZipOptions = (options?: SaveAsZipFileOptions) => {\n return {\n type: options?.type ?? DEFAULT_ZIP_OPTIONS.type,\n fileExtension: options?.fileExtension ?? DEFAULT_ZIP_OPTIONS.fileExtension,\n fileTitle: options?.fileTitle ?? DEFAULT_ZIP_OPTIONS.fileTitle,\n archiveExtension: options?.archiveExtension ?? DEFAULT_ZIP_OPTIONS.archiveExtension,\n appendDatetime: options?.appendDatetime ?? DEFAULT_ZIP_OPTIONS.appendDatetime,\n preserveFileNames: options?.preserveFileNames ?? DEFAULT_ZIP_OPTIONS.preserveFileNames,\n };\n};\n\n/**\n * ZIP 내부 파일명 생성\n * @param index 파일 순서\n * @param fileName 파일명\n * @param fileExtension 파일 확장자\n */\nconst createZipEntryFileName = (index: number, fileName: string, fileExtension: string) => {\n return `${sanitizeFileName(`${index + 1}_${fileName}`)}.${fileExtension}`;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n */\nconst normalizeArchiveExtension = (archiveExtension: string) => {\n return archiveExtension.replace(/^\\.+/, '') || DEFAULT_ZIP_OPTIONS.archiveExtension;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n * @param archiveExtension 아카이브 확장자\n */\nconst createArchiveFileName = (\n fileTitle: string,\n appendDatetime: boolean,\n archiveExtension: string,\n) => {\n return `${sanitizeFileName(fileTitle)}${appendDatetime ? `-${dayjs().format('YYYY_MM_DD_HH_mm_ss')}` : ''}.${normalizeArchiveExtension(archiveExtension)}`;\n};\n\n/**\n * ZIP 엔트리 일치 여부 확인\n * @param fileName ZIP 엔트리 파일명\n * @param matcher 엔트리 식별자\n */\nconst isMatchedZipEntry = (\n fileName: string,\n matcher: string | RegExp | ((fileName: string) => boolean),\n) => {\n if (typeof matcher === 'string') {\n return fileName === matcher;\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(fileName);\n }\n\n return matcher(fileName);\n};\n\n/**\n * ZIP 소스 ArrayBuffer 변환\n * @param source ZIP 소스\n */\nconst toZipArrayBuffer = async (source: Blob | ArrayBuffer) => {\n return source instanceof Blob ? source.arrayBuffer() : source;\n};\n\n/**\n * ZIP 엔트리 텍스트 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryText = async (\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<string | null> => {\n const JSZip = await loadJSZip();\n const zip = await JSZip.loadAsync(await toZipArrayBuffer(source));\n const zipFile = Object.values(zip.files).find(\n (entry) => !entry.dir && isMatchedZipEntry(entry.name, matcher),\n );\n\n if (!zipFile) {\n return null;\n }\n\n return zipFile.async('string');\n};\n\n/**\n * ZIP 엔트리 JSON 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryJson = async <T>(\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<T | null> => {\n const text = await readZipEntryText(source, matcher);\n\n if (!text) {\n return null;\n }\n\n return JSON.parse(text) as T;\n};\n\n/**\n * ZIP 파일 데이터 추가\n * @param zip ZIP 인스턴스\n * @param data 파일 데이터 목록\n * @param options ZIP 저장 옵션\n */\nconst appendZipFiles = (\n zip: JSZip,\n data: BlobInfoData[],\n options: Required<SaveAsZipFileOptions>,\n) => {\n data.forEach(({ blob, fileName }, index) => {\n if (!blob) {\n return;\n }\n\n zip.file(\n options.preserveFileNames\n ? fileName\n : createZipEntryFileName(index, fileName, options.fileExtension),\n options.preserveFileNames ? blob : new Blob([blob], { type: options.type }),\n );\n });\n};\n\n/**\n * ZIP 파일 저장\n * @param data 저장할 파일 데이터\n * @param options 저장 옵션\n */\nexport const saveAsZipFile = async (\n data: BlobInfoData[],\n options?: SaveAsZipFileOptions,\n) => {\n const normalizedOptions = normalizeZipOptions(options);\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.type) {\n showZipWarning('type 이 선언되지 않았습니다');\n return;\n }\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.fileExtension) {\n showZipWarning('파일 확장자가 선언되지 않았습니다');\n return;\n }\n\n if (!data) {\n showZipWarning('다운로드할 데이터가 없습니다');\n return;\n }\n\n const JSZip = await loadJSZip();\n const zip = new JSZip();\n appendZipFiles(zip, data, normalizedOptions);\n\n const archiveFiles = await zip.generateAsync({ type: 'blob' });\n const url = URL.createObjectURL(archiveFiles);\n const link = document.createElement('a');\n link.href = url;\n link.download = createArchiveFileName(\n normalizedOptions.fileTitle,\n normalizedOptions.appendDatetime,\n normalizedOptions.archiveExtension,\n );\n link.click();\n URL.revokeObjectURL(url);\n};\n"],"names":["DEFAULT_ZIP_OPTIONS","sanitizeFileName","__name","fileName","showZipWarning","message","enqueueSnackbar","t","normalizeZipOptions","options","createZipEntryFileName","index","fileExtension","normalizeArchiveExtension","archiveExtension","createArchiveFileName","fileTitle","appendDatetime","dayjs","isMatchedZipEntry","matcher","toZipArrayBuffer","source","readZipEntryText","zip","loadJSZip","zipFile","entry","readZipEntryJson","text","appendZipFiles","data","blob","saveAsZipFile","normalizedOptions","JSZip","archiveFiles","url","link"],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -1,104 +1,99 @@
1
1
  import { generateBarcodeUrl as o } from "./utils/barcodeUtil.js";
2
2
  import { buildTreeGridEnumAttributesByCommonCodeList as d, transformCommonCodeBasedOnGroupId as i, transformGridEnumByCommonCodeList as a } from "./utils/commonCodeUtils.js";
3
3
  import { createDateRangeSearchParams as m } from "./utils/createDateRangeSearchParams.js";
4
- import { createFormDataBody as T, normalizeFormDataUploadParams as s } from "./utils/createFormDataBody.js";
5
- import { createJsonBody as G } from "./utils/createJsonBody.js";
6
- import { createJsonString as I } from "./utils/createJsonString.js";
7
- import { exportExcelByBuffer as g, getIndexByLetters as _, getLettersByIndex as L, setCellValue as R, setMergeCells as C } from "./utils/excelUtil.js";
8
- import { fetchFile as D } from "./utils/fetchFile.js";
9
- import { formatDateToYmd as y, getTodayYmd as A } from "./utils/formatDateToYmd.js";
4
+ import { createFormDataBody as s, normalizeFormDataUploadParams as n } from "./utils/createFormDataBody.js";
5
+ import { createJsonBody as E } from "./utils/createJsonBody.js";
6
+ import { createJsonString as x } from "./utils/createJsonString.js";
7
+ import { exportExcelByBuffer as f, getIndexByLetters as C, getLettersByIndex as I, setCellValue as L, setMergeCells as y } from "./utils/excelUtil.js";
8
+ import { fetchFile as u } from "./utils/fetchFile.js";
9
+ import { formatDateToYmd as _, getTodayYmd as A } from "./utils/formatDateToYmd.js";
10
10
  import { formatNumber as h } from "./utils/formatNumber.js";
11
- import { getDisplayValue as c } from "./utils/getDisplayValue.js";
12
- import { getEstimatedTextCellWidth as U } from "./utils/getEstimatedTextCellWidth.js";
11
+ import { getDisplayValue as F } from "./utils/getDisplayValue.js";
12
+ import { getEstimatedTextCellWidth as O } from "./utils/getEstimatedTextCellWidth.js";
13
13
  import { getFormDefaultValues as w } from "./utils/getFormDefaultValues.js";
14
- import { getStartPagePath as N } from "./utils/getStartPagePath.js";
14
+ import { getStartPagePath as H } from "./utils/getStartPagePath.js";
15
15
  import { getTrimmedValue as P } from "./utils/getTrimmedValue.js";
16
- import { isEnterKeyEvent as W } from "./utils/isEnterKeyEvent.js";
17
- import { getApiLanguageCode as z, getI18nextLanguageCode as M } from "./utils/language.js";
18
- import { preloadOnIdle as J } from "./utils/preloadOnIdle.js";
19
- import { generateQrCodeUrl as Z } from "./utils/qrCodeUtil.js";
16
+ import { isEnterKeyEvent as z } from "./utils/isEnterKeyEvent.js";
17
+ import { getApiLanguageCode as J, getI18nextLanguageCode as M } from "./utils/language.js";
18
+ import { preloadOnIdle as Y } from "./utils/preloadOnIdle.js";
19
+ import { generateQrCodeUrl as k } from "./utils/qrCodeUtil.js";
20
20
  import { rebuildValue as Q } from "./utils/rebuildValue.js";
21
21
  import { sanitizePasswordValue as q, sanitizeUserIdValue as X } from "./utils/sanitizeAuthInputValue.js";
22
22
  import { exportTreeGridExcel as ee } from "./utils/treeGridExportExcelUtil.js";
23
23
  import { isTreeGridCheckedValue as oe, toTreeGridBoolValue as te, toTreeGridYnValue as de } from "./utils/treeGridYnUtils.js";
24
- import { TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY as ae, TREEGRID_ADDED_ROW_BY_ID_FLAG as le, TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY as me, addTreeGridRowById as Ee, appendTreeGridAddedRowHighlightColumn as Te, clearTreeGridCellHighlightById as se, exportTreeGridToExcelById as ne, getTreeGridAddedRowBaselineValue as Ge, getTreeGridAddedRowHighlightColumns as pe, getTreeGridById as Ie, getTreeGridCellComparableValue as xe, getTreeGridDataRowsById as ge, getTreeGridRowChangesById as _e, getTreeGridSelectedRowsById as Le, highlightTreeGridCellById as Re, isTreeGridRowAddedById as Ce, markTreeGridRowAddedById as fe, normalizeTreeGridExternalRow as De, normalizeTreeGridExternalRows as Be, reloadTreeGridBodyById as ye, removeTreeGridAddedRowHighlightColumn as Ae, resetTreeGridChangesById as ue, resetTreeGridChangesByIds as he, resetTreeGridSelectionById as Oe, resetTreeGridSelectionsByIds as ce, setTreeGridColumnEnumOptionsById as Fe, setTreeGridColumnVisibilityById as Ue } from "./utils/treeGridUtil.js";
25
- import { readZipEntryJson as we, readZipEntryText as He, saveAsZipFile as Ne } from "./utils/zipUtil.js";
26
- import { OwpUtils as Pe } from "./utils/common/OwpUtils.js";
27
- import { DEFAULT_CELL_ALIGNMENT as We, DEFAULT_HEADER_FILL as Ye, DEFAULT_HEADER_FONT as ze, DEFAULT_THIN_BORDER as Me, DEFAULT_VALUE_FONT as ve, DEFAULT_WRAP_CELL_ALIGNMENT as Je } from "./constants/excel.js";
28
- import { TREEGRID_CELL_CHANGED_CLASS as Ze, TREEGRID_CELL_HIGHLIGHT_COLOR as ke, TREEGRID_INPUT_CELL_COLOR as Qe, TREEGRID_WARNING_CELL_COLOR as je } from "./constants/treeGrid.js";
24
+ import { addTreeGridRowById as ae, appendTreeGridAddedRowHighlightColumn as le, clearTreeGridCellHighlightById as me, exportTreeGridToExcelById as Te, getTreeGridAddedRowBaselineValue as se, getTreeGridAddedRowHighlightColumns as ne, getTreeGridById as pe, getTreeGridCellComparableValue as Ee, getTreeGridDataRowsById as ge, getTreeGridRowChangesById as xe, getTreeGridSelectedRowsById as Ge, highlightTreeGridCellById as fe, isTreeGridRowAddedById as Ce, normalizeTreeGridExternalRows as Ie, reloadTreeGridBodyById as Le, removeTreeGridAddedRowHighlightColumn as ye, resetTreeGridChangesById as Be, resetTreeGridChangesByIds as ue, resetTreeGridSelectionById as Re, resetTreeGridSelectionsByIds as _e, setTreeGridColumnEnumOptionsById as Ae, setTreeGridColumnVisibilityById as De } from "./utils/treeGridUtil.js";
25
+ import { readZipEntryJson as ce, readZipEntryText as Fe, saveAsZipFile as Ve } from "./utils/zipUtil.js";
26
+ import { OwpUtils as Ue } from "./utils/common/OwpUtils.js";
27
+ import { DEFAULT_CELL_ALIGNMENT as Ne, DEFAULT_HEADER_FILL as He, DEFAULT_HEADER_FONT as Se, DEFAULT_THIN_BORDER as Pe, DEFAULT_VALUE_FONT as be, DEFAULT_WRAP_CELL_ALIGNMENT as ze } from "./constants/excel.js";
28
+ import { TREEGRID_CELL_CHANGED_CLASS as Je, TREEGRID_CELL_HIGHLIGHT_COLOR as Me, TREEGRID_INPUT_CELL_COLOR as We, TREEGRID_WARNING_CELL_COLOR as Ye } from "./constants/treeGrid.js";
29
29
  export {
30
- We as DEFAULT_CELL_ALIGNMENT,
31
- Ye as DEFAULT_HEADER_FILL,
32
- ze as DEFAULT_HEADER_FONT,
33
- Me as DEFAULT_THIN_BORDER,
34
- ve as DEFAULT_VALUE_FONT,
35
- Je as DEFAULT_WRAP_CELL_ALIGNMENT,
36
- Pe as OwpUtils,
37
- ae as TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY,
38
- le as TREEGRID_ADDED_ROW_BY_ID_FLAG,
39
- me as TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY,
40
- Ze as TREEGRID_CELL_CHANGED_CLASS,
41
- ke as TREEGRID_CELL_HIGHLIGHT_COLOR,
42
- Qe as TREEGRID_INPUT_CELL_COLOR,
43
- je as TREEGRID_WARNING_CELL_COLOR,
44
- Ee as addTreeGridRowById,
45
- Te as appendTreeGridAddedRowHighlightColumn,
30
+ Ne as DEFAULT_CELL_ALIGNMENT,
31
+ He as DEFAULT_HEADER_FILL,
32
+ Se as DEFAULT_HEADER_FONT,
33
+ Pe as DEFAULT_THIN_BORDER,
34
+ be as DEFAULT_VALUE_FONT,
35
+ ze as DEFAULT_WRAP_CELL_ALIGNMENT,
36
+ Ue as OwpUtils,
37
+ Je as TREEGRID_CELL_CHANGED_CLASS,
38
+ Me as TREEGRID_CELL_HIGHLIGHT_COLOR,
39
+ We as TREEGRID_INPUT_CELL_COLOR,
40
+ Ye as TREEGRID_WARNING_CELL_COLOR,
41
+ ae as addTreeGridRowById,
42
+ le as appendTreeGridAddedRowHighlightColumn,
46
43
  d as buildTreeGridEnumAttributesByCommonCodeList,
47
- se as clearTreeGridCellHighlightById,
44
+ me as clearTreeGridCellHighlightById,
48
45
  m as createDateRangeSearchParams,
49
- T as createFormDataBody,
50
- G as createJsonBody,
51
- I as createJsonString,
52
- g as exportExcelByBuffer,
46
+ s as createFormDataBody,
47
+ E as createJsonBody,
48
+ x as createJsonString,
49
+ f as exportExcelByBuffer,
53
50
  ee as exportTreeGridExcel,
54
- ne as exportTreeGridToExcelById,
55
- D as fetchFile,
56
- y as formatDateToYmd,
51
+ Te as exportTreeGridToExcelById,
52
+ u as fetchFile,
53
+ _ as formatDateToYmd,
57
54
  h as formatNumber,
58
55
  o as generateBarcodeUrl,
59
- Z as generateQrCodeUrl,
60
- z as getApiLanguageCode,
61
- c as getDisplayValue,
62
- U as getEstimatedTextCellWidth,
56
+ k as generateQrCodeUrl,
57
+ J as getApiLanguageCode,
58
+ F as getDisplayValue,
59
+ O as getEstimatedTextCellWidth,
63
60
  w as getFormDefaultValues,
64
61
  M as getI18nextLanguageCode,
65
- _ as getIndexByLetters,
66
- L as getLettersByIndex,
67
- N as getStartPagePath,
62
+ C as getIndexByLetters,
63
+ I as getLettersByIndex,
64
+ H as getStartPagePath,
68
65
  A as getTodayYmd,
69
- Ge as getTreeGridAddedRowBaselineValue,
70
- pe as getTreeGridAddedRowHighlightColumns,
71
- Ie as getTreeGridById,
72
- xe as getTreeGridCellComparableValue,
66
+ se as getTreeGridAddedRowBaselineValue,
67
+ ne as getTreeGridAddedRowHighlightColumns,
68
+ pe as getTreeGridById,
69
+ Ee as getTreeGridCellComparableValue,
73
70
  ge as getTreeGridDataRowsById,
74
- _e as getTreeGridRowChangesById,
75
- Le as getTreeGridSelectedRowsById,
71
+ xe as getTreeGridRowChangesById,
72
+ Ge as getTreeGridSelectedRowsById,
76
73
  P as getTrimmedValue,
77
- Re as highlightTreeGridCellById,
78
- W as isEnterKeyEvent,
74
+ fe as highlightTreeGridCellById,
75
+ z as isEnterKeyEvent,
79
76
  oe as isTreeGridCheckedValue,
80
77
  Ce as isTreeGridRowAddedById,
81
- fe as markTreeGridRowAddedById,
82
- s as normalizeFormDataUploadParams,
83
- De as normalizeTreeGridExternalRow,
84
- Be as normalizeTreeGridExternalRows,
85
- J as preloadOnIdle,
86
- we as readZipEntryJson,
87
- He as readZipEntryText,
78
+ n as normalizeFormDataUploadParams,
79
+ Ie as normalizeTreeGridExternalRows,
80
+ Y as preloadOnIdle,
81
+ ce as readZipEntryJson,
82
+ Fe as readZipEntryText,
88
83
  Q as rebuildValue,
89
- ye as reloadTreeGridBodyById,
90
- Ae as removeTreeGridAddedRowHighlightColumn,
91
- ue as resetTreeGridChangesById,
92
- he as resetTreeGridChangesByIds,
93
- Oe as resetTreeGridSelectionById,
94
- ce as resetTreeGridSelectionsByIds,
84
+ Le as reloadTreeGridBodyById,
85
+ ye as removeTreeGridAddedRowHighlightColumn,
86
+ Be as resetTreeGridChangesById,
87
+ ue as resetTreeGridChangesByIds,
88
+ Re as resetTreeGridSelectionById,
89
+ _e as resetTreeGridSelectionsByIds,
95
90
  q as sanitizePasswordValue,
96
91
  X as sanitizeUserIdValue,
97
- Ne as saveAsZipFile,
98
- R as setCellValue,
99
- C as setMergeCells,
100
- Fe as setTreeGridColumnEnumOptionsById,
101
- Ue as setTreeGridColumnVisibilityById,
92
+ Ve as saveAsZipFile,
93
+ L as setCellValue,
94
+ y as setMergeCells,
95
+ Ae as setTreeGridColumnEnumOptionsById,
96
+ De as setTreeGridColumnVisibilityById,
102
97
  te as toTreeGridBoolValue,
103
98
  de as toTreeGridYnValue,
104
99
  i as transformCommonCodeBasedOnGroupId,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@owp/core",
3
3
  "private": false,
4
- "version": "2.5.22",
4
+ "version": "2.5.24",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAccessTokenGuard.js","sources":["../../src/hooks/useAccessTokenGuard.ts"],"sourcesContent":["import { STORAGE_ACCESS_TOKEN_KEY } from '@/constants/localStorageKeys';\nimport { useOwpAppContext } from '@/contexts/OwpAppProvider';\nimport { useEffect, useRef } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nexport interface UseAccessTokenGuardOptions {\n loginPath?: string;\n isEnabled?: boolean;\n snackbarMessageKey?: string;\n}\n\nconst DEFAULT_LOGIN_PATH = '/auth/login';\nconst DEFAULT_SNACKBAR_MESSAGE_KEY = 'Message.로그인이 필요합니다.';\n\n/**\n * 액세스 토큰 기반 로그인 가드\n * @param loginPath 로그인 라우트 경로\n * @param isEnabled 가드 활성화 여부\n * @param snackbarMessageKey 로그인 필요 안내 메시지 키\n */\nexport const useAccessTokenGuard = ({\n loginPath = DEFAULT_LOGIN_PATH,\n isEnabled,\n snackbarMessageKey = DEFAULT_SNACKBAR_MESSAGE_KEY,\n}: UseAccessTokenGuardOptions = {}) => {\n const { env } = useOwpAppContext();\n const location = useLocation();\n const navigate = useNavigate();\n const accessToken =\n typeof window === 'undefined' ? null : window.localStorage.getItem(STORAGE_ACCESS_TOKEN_KEY);\n const isLoginRoute = location.pathname.startsWith(loginPath);\n const isAccessTokenGuardEnabled = isEnabled ?? env?.isAccessTokenGuardEnabled ?? true;\n const shouldRedirectToLogin = isAccessTokenGuardEnabled && !accessToken && !isLoginRoute;\n const hasHandledRedirectRef = useRef(false);\n\n useEffect(() => {\n if (!shouldRedirectToLogin) {\n hasHandledRedirectRef.current = false;\n return;\n }\n\n if (hasHandledRedirectRef.current) {\n return;\n }\n\n hasHandledRedirectRef.current = true;\n\n navigate(loginPath, {\n replace: true,\n state: snackbarMessageKey\n ? {\n snackbarMessageKey,\n }\n : undefined,\n });\n }, [loginPath, navigate, shouldRedirectToLogin, snackbarMessageKey]);\n\n return shouldRedirectToLogin;\n};\n"],"names":["DEFAULT_LOGIN_PATH","DEFAULT_SNACKBAR_MESSAGE_KEY","useAccessTokenGuard","__name","loginPath","isEnabled","snackbarMessageKey","env","useOwpAppContext","location","useLocation","navigate","useNavigate","accessToken","STORAGE_ACCESS_TOKEN_KEY","isLoginRoute","shouldRedirectToLogin","hasHandledRedirectRef","useRef","useEffect"],"mappings":";;;;;;AAWA,MAAMA,IAAqB,eACrBC,IAA+B,uBAQxBC,IAAsB,gBAAAC,EAAA,CAAC;AAAA,EAClC,WAAAC,IAAYJ;AAAA,EACZ,WAAAK;AAAA,EACA,oBAAAC,IAAqBL;AACvB,IAAgC,OAAO;AACrC,QAAM,EAAE,KAAAM,EAAA,IAAQC,EAAA,GACVC,IAAWC,EAAA,GACXC,IAAWC,EAAA,GACXC,IACJ,OAAO,SAAW,MAAc,OAAO,OAAO,aAAa,QAAQC,CAAwB,GACvFC,IAAeN,EAAS,SAAS,WAAWL,CAAS,GAErDY,KAD4BX,MAAaE,KAAA,gBAAAA,EAAK,8BAA6B,OACtB,CAACM,KAAe,CAACE,GACtEE,IAAwBC,EAAO,EAAK;AAE1C,SAAAC,EAAU,MAAM;AACd,QAAI,CAACH,GAAuB;AAC1B,MAAAC,EAAsB,UAAU;AAChC;AAAA,IACF;AAEA,IAAIA,EAAsB,YAI1BA,EAAsB,UAAU,IAEhCN,EAASP,GAAW;AAAA,MAClB,SAAS;AAAA,MACT,OAAOE,IACH;AAAA,QACE,oBAAAA;AAAA,MAAA,IAEF;AAAA,IAAA,CACL;AAAA,EACH,GAAG,CAACF,GAAWO,GAAUK,GAAuBV,CAAkB,CAAC,GAE5DU;AACT,GAtCmC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCurrentLanguage.js","sources":["../../src/hooks/useCurrentLanguage.ts"],"sourcesContent":["export { FALLBACK_LANGUAGE_LIST } from '@/constants/language';\nimport { STORAGE_KEYS } from '@/constants/storageKeys';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { atomWithStorage } from 'jotai/utils';\n\nexport type CurrentLanguage = { id: 'en' | 'kr' | 'lc'; title: string; flag: string };\n\nconst currentLanguageAtom = atomWithStorage<CurrentLanguage>(STORAGE_KEYS.currentLanguage, {\n id: 'kr',\n title: '한국어',\n flag: 'KR',\n});\n\n/**\n * 언어 목록 조회 훅\n */\nexport const useGetLanguageList = (): CurrentLanguage[] => {\n const { t } = useOwpTranslation();\n return [\n { id: 'kr', title: t('Common.한국어'), flag: 'KR' },\n {\n id: 'en',\n title: t('Common.English'),\n flag: 'EN',\n },\n { id: 'lc', title: t('Common.Etc'), flag: 'LC' },\n ];\n};\n\n/**\n * 현재 언어 조회 훅\n */\nexport const useGetCurrentLanguage = () => {\n return useAtomValue(currentLanguageAtom);\n};\n\n/**\n * 현재 언어 설정 훅\n */\nexport const useSetCurrentLanguage = () => {\n return useSetAtom(currentLanguageAtom);\n};\n"],"names":["currentLanguageAtom","atomWithStorage","STORAGE_KEYS","useGetLanguageList","__name","useOwpTranslation","useGetCurrentLanguage","useAtomValue","useSetCurrentLanguage","useSetAtom"],"mappings":";;;;;;AAQA,MAAMA,IAAsBC,EAAiCC,EAAa,iBAAiB;AAAA,EACzF,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AACR,CAAC,GAKYC,IAAqB,gBAAAC,EAAA,MAAyB;AACzD,QAAM,EAAE,EAAA,IAAMC,EAAA;AACd,SAAO;AAAA,IACL,EAAE,IAAI,MAAM,OAAO,EAAE,YAAY,GAAG,MAAM,KAAA;AAAA,IAC1C;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,gBAAgB;AAAA,MACzB,MAAM;AAAA,IAAA;AAAA,IAER,EAAE,IAAI,MAAM,OAAO,EAAE,YAAY,GAAG,MAAM,KAAA;AAAA,EAAK;AAEnD,GAXkC,uBAgBrBC,IAAwB,gBAAAF,EAAA,MAC5BG,EAAaP,CAAmB,GADJ,0BAOxBQ,IAAwB,gBAAAJ,EAAA,MAC5BK,EAAWT,CAAmB,GADF;"}
@@ -1,24 +0,0 @@
1
- var f = Object.defineProperty;
2
- var o = (e, n) => f(e, "name", { value: n, configurable: !0 });
3
- import { useRef as s, useEffect as t, useCallback as m } from "react";
4
- import { debounce as b } from "../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/function/debounce.js";
5
- function R(e, n) {
6
- const u = s(e);
7
- t(() => {
8
- u.current = e;
9
- }, [e]);
10
- const r = m(
11
- b((...c) => {
12
- u.current(...c);
13
- }, n),
14
- [n]
15
- );
16
- return t(() => () => {
17
- r.cancel();
18
- }, [r]), r;
19
- }
20
- o(R, "useDebounce");
21
- export {
22
- R as useDebounce
23
- };
24
- //# sourceMappingURL=useDebounce.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDebounce.js","sources":["../../src/hooks/useDebounce.ts"],"sourcesContent":["import { debounce } from 'es-toolkit/compat';\nimport { useCallback, useEffect, useRef } from 'react';\n\n/**\n * Debounce hook.\n * @param {T} callback\n * @param {number} delay\n * @returns {T}\n */\nexport function useDebounce<T extends (...args: never[]) => void>(callback: T, delay: number): T {\n const callbackRef = useRef<T>(callback);\n\n \n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n const debouncedFn = useCallback(\n debounce((...args: never[]) => {\n callbackRef.current(...args);\n }, delay),\n [delay],\n );\n\n useEffect(() => {\n \n return () => {\n debouncedFn.cancel();\n };\n }, [debouncedFn]);\n\n return debouncedFn as unknown as T;\n}\n"],"names":["useDebounce","callback","delay","callbackRef","useRef","useEffect","debouncedFn","useCallback","debounce","args","__name"],"mappings":";;;;AASO,SAASA,EAAkDC,GAAaC,GAAkB;AAC/F,QAAMC,IAAcC,EAAUH,CAAQ;AAGtC,EAAAI,EAAU,MAAM;AACd,IAAAF,EAAY,UAAUF;AAAA,EACxB,GAAG,CAACA,CAAQ,CAAC;AAEb,QAAMK,IAAcC;AAAA,IAClBC,EAAS,IAAIC,MAAkB;AAC7B,MAAAN,EAAY,QAAQ,GAAGM,CAAI;AAAA,IAC7B,GAAGP,CAAK;AAAA,IACR,CAACA,CAAK;AAAA,EAAA;AAGR,SAAAG,EAAU,MAED,MAAM;AACX,IAAAC,EAAY,OAAA;AAAA,EACd,GACC,CAACA,CAAW,CAAC,GAETA;AACT;AAvBgBI,EAAAV,GAAA;"}
@@ -1,38 +0,0 @@
1
- var s = Object.defineProperty;
2
- var t = (e, r) => s(e, "name", { value: r, configurable: !0 });
3
- import { useRef as o, useMemo as i, useEffect as u } from "react";
4
- import { isEqual as c } from "../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/predicate/isEqual.js";
5
- function p(e) {
6
- if (!e || !e.length)
7
- throw new Error(
8
- "useDeepCompareEffect should not be used with no dependencies. Use useEffect instead."
9
- );
10
- if (e.every(m))
11
- throw new Error(
12
- "useDeepCompareEffect should not be used with dependencies that are all primitive values. Use useEffect instead."
13
- );
14
- }
15
- t(p, "checkDeps");
16
- function m(e) {
17
- return e == null || /^[sbn]/.test(typeof e);
18
- }
19
- t(m, "isPrimitive");
20
- function f(e) {
21
- const r = o(e), n = o(0);
22
- return c(e, r.current) || (r.current = e, n.current += 1), i(() => r.current, [n.current]);
23
- }
24
- t(f, "useDeepCompareMemoize");
25
- function d(e, r) {
26
- return process.env.NODE_ENV !== "production" && p(r), u(e, f(r));
27
- }
28
- t(d, "useDeepCompareEffect");
29
- function l(e, r) {
30
- return u(e, f(r));
31
- }
32
- t(l, "useDeepCompareEffectNoCheck");
33
- export {
34
- d as useDeepCompareEffect,
35
- l as useDeepCompareEffectNoCheck,
36
- f as useDeepCompareMemoize
37
- };
38
- //# sourceMappingURL=useDeepCompareEffect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDeepCompareEffect.js","sources":["../../src/hooks/useDeepCompareEffect.ts"],"sourcesContent":["import { isEqual as deepEqual } from 'es-toolkit/compat';\nimport { useEffect, useMemo, useRef } from 'react';\n\ntype UseEffectParamsType = Parameters<typeof useEffect>;\ntype EffectCallbackType = UseEffectParamsType[0];\ntype DependencyListType = UseEffectParamsType[1];\n\n// yes, I know it's void, but I like what this communicates about\n// the intent of these functions: It's just like useEffect\ntype UseEffectReturn = ReturnType<typeof useEffect>;\n\n/**\n * The checkDeps function checks if the dependency list is valid for use with useDeepCompareEffect.\n * It throws an error if the dependency list is empty or contains only primitive values.\n */\nfunction checkDeps(deps: DependencyListType) {\n if (!deps || !deps.length) {\n throw new Error(\n 'useDeepCompareEffect should not be used with no dependencies. Use useEffect instead.',\n );\n }\n\n if (deps.every(isPrimitive)) {\n throw new Error(\n 'useDeepCompareEffect should not be used with dependencies that are all primitive values. Use useEffect instead.',\n );\n }\n}\n\n/**\n * The isPrimitive function checks if a value is a primitive type.\n * It returns true if the value is null, undefined, a string, a boolean, or a number.\n */\nfunction isPrimitive(val: unknown) {\n return val == null || /^[sbn]/.test(typeof val);\n}\n\n/**\n * The isPrimitive function checks if a value is a primitive type.\n * It returns true if the value is null, undefined, a string, a boolean, or a number.\n */\nexport function useDeepCompareMemoize<T>(value: T) {\n const ref = useRef<T>(value);\n const signalRef = useRef<number>(0);\n\n if (!deepEqual(value, ref.current)) {\n ref.current = value;\n signalRef.current += 1;\n }\n\n return useMemo(() => ref.current, [signalRef.current]);\n}\n\n/**\n * The isPrimitive function checks if a value is a primitive type.\n * It returns true if the value is null, undefined, a string, a boolean, or a number.\n */\nexport function useDeepCompareEffect(\n callback: EffectCallbackType,\n dependencies: DependencyListType,\n): UseEffectReturn {\n if (process.env.NODE_ENV !== 'production') {\n checkDeps(dependencies);\n }\n\n return useEffect(callback, useDeepCompareMemoize(dependencies));\n}\n\n/**\n * deep compare effect 훅\n * @param callback effect 콜백\n * @param dependencies 의존성 목록\n */\nexport function useDeepCompareEffectNoCheck(\n callback: EffectCallbackType,\n dependencies: DependencyListType,\n): UseEffectReturn {\n return useEffect(callback, useDeepCompareMemoize(dependencies));\n}\n"],"names":["checkDeps","deps","isPrimitive","__name","val","useDeepCompareMemoize","value","ref","useRef","signalRef","deepEqual","useMemo","useDeepCompareEffect","callback","dependencies","useEffect","useDeepCompareEffectNoCheck"],"mappings":";;;;AAeA,SAASA,EAAUC,GAA0B;AAC3C,MAAI,CAACA,KAAQ,CAACA,EAAK;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,MAAIA,EAAK,MAAMC,CAAW;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAGN;AAZSC,EAAAH,GAAA;AAkBT,SAASE,EAAYE,GAAc;AACjC,SAAOA,KAAO,QAAQ,SAAS,KAAK,OAAOA,CAAG;AAChD;AAFSD,EAAAD,GAAA;AAQF,SAASG,EAAyBC,GAAU;AACjD,QAAMC,IAAMC,EAAUF,CAAK,GACrBG,IAAYD,EAAe,CAAC;AAElC,SAAKE,EAAUJ,GAAOC,EAAI,OAAO,MAC/BA,EAAI,UAAUD,GACdG,EAAU,WAAW,IAGhBE,EAAQ,MAAMJ,EAAI,SAAS,CAACE,EAAU,OAAO,CAAC;AACvD;AAVgBN,EAAAE,GAAA;AAgBT,SAASO,EACdC,GACAC,GACiB;AACjB,SAAI,QAAQ,IAAI,aAAa,gBAC3Bd,EAAUc,CAAY,GAGjBC,EAAUF,GAAUR,EAAsBS,CAAY,CAAC;AAChE;AATgBX,EAAAS,GAAA;AAgBT,SAASI,EACdH,GACAC,GACiB;AACjB,SAAOC,EAAUF,GAAUR,EAAsBS,CAAY,CAAC;AAChE;AALgBX,EAAAa,GAAA;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useHeaderWrapState.js","sources":["../../src/hooks/useHeaderWrapState.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState, type RefObject } from 'react';\n\ntype HeaderWrapState = {\n containerRef: RefObject<HTMLDivElement | null>;\n titleRef: RefObject<HTMLDivElement | null>;\n slotsRef: RefObject<HTMLDivElement | null>;\n actionsRef: RefObject<HTMLDivElement | null>;\n isWrapped: boolean;\n};\n\nconst getVisibleElementWidth = (element: HTMLElement | null) => {\n if (!element || element.getClientRects().length === 0) {\n return 0;\n }\n\n return element.offsetWidth;\n};\n\nconst getGroupContentWidth = (element: HTMLElement | null) => {\n if (!element || element.getClientRects().length === 0) {\n return 0;\n }\n\n const visibleChildren = Array.from(element.children).filter(\n (child) => (child as HTMLElement).getClientRects().length > 0,\n ) as HTMLElement[];\n\n if (visibleChildren.length === 0) {\n return element.offsetWidth;\n }\n\n const computedStyle = window.getComputedStyle(element);\n const gap = Number.parseFloat(computedStyle.columnGap || computedStyle.gap || '0') || 0;\n\n return (\n visibleChildren.reduce((totalWidth, child) => totalWidth + child.offsetWidth, 0) +\n gap * Math.max(visibleChildren.length - 1, 0)\n );\n};\n\n/**\n * 헤더 한 줄 배치 가능 여부 계산 훅\n * @param deps 측정 재실행 의존성\n */\nconst useHeaderWrapState = (deps: unknown[] = []): HeaderWrapState => {\n const containerRef = useRef<HTMLDivElement>(null);\n const titleRef = useRef<HTMLDivElement>(null);\n const slotsRef = useRef<HTMLDivElement>(null);\n const actionsRef = useRef<HTMLDivElement>(null);\n const [isWrapped, setIsWrapped] = useState(false);\n\n useLayoutEffect(() => {\n const containerElement = containerRef.current;\n\n if (!containerElement) {\n return undefined;\n }\n\n const updateWrapState = () => {\n const containerStyle = window.getComputedStyle(containerElement);\n const columnGap =\n Number.parseFloat(containerStyle.columnGap || containerStyle.gap || '0') || 0;\n const groupWidths = [\n getVisibleElementWidth(titleRef.current),\n getGroupContentWidth(slotsRef.current),\n getGroupContentWidth(actionsRef.current),\n ].filter((width) => width > 0);\n const requiredWidth =\n groupWidths.reduce((totalWidth, width) => totalWidth + width, 0) +\n columnGap * Math.max(groupWidths.length - 1, 0);\n\n setIsWrapped(requiredWidth > containerElement.clientWidth);\n };\n\n updateWrapState();\n\n const resizeObserver = new ResizeObserver(() => {\n updateWrapState();\n });\n\n [containerElement, titleRef.current, slotsRef.current, actionsRef.current]\n .filter(Boolean)\n .forEach((element) => {\n resizeObserver.observe(element as HTMLElement);\n });\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [deps]);\n\n return {\n containerRef,\n titleRef,\n slotsRef,\n actionsRef,\n isWrapped,\n };\n};\n\nexport { useHeaderWrapState };\n"],"names":["getVisibleElementWidth","__name","element","getGroupContentWidth","visibleChildren","child","computedStyle","gap","totalWidth","useHeaderWrapState","deps","containerRef","useRef","titleRef","slotsRef","actionsRef","isWrapped","setIsWrapped","useState","useLayoutEffect","containerElement","updateWrapState","containerStyle","columnGap","groupWidths","width","requiredWidth","resizeObserver"],"mappings":";;;AAUA,MAAMA,IAAyB,gBAAAC,EAAA,CAACC,MAC1B,CAACA,KAAWA,EAAQ,eAAA,EAAiB,WAAW,IAC3C,IAGFA,EAAQ,aALc,2BAQzBC,IAAuB,gBAAAF,EAAA,CAACC,MAAgC;AAC5D,MAAI,CAACA,KAAWA,EAAQ,eAAA,EAAiB,WAAW;AAClD,WAAO;AAGT,QAAME,IAAkB,MAAM,KAAKF,EAAQ,QAAQ,EAAE;AAAA,IACnD,CAACG,MAAWA,EAAsB,eAAA,EAAiB,SAAS;AAAA,EAAA;AAG9D,MAAID,EAAgB,WAAW;AAC7B,WAAOF,EAAQ;AAGjB,QAAMI,IAAgB,OAAO,iBAAiBJ,CAAO,GAC/CK,IAAM,OAAO,WAAWD,EAAc,aAAaA,EAAc,OAAO,GAAG,KAAK;AAEtF,SACEF,EAAgB,OAAO,CAACI,GAAYH,MAAUG,IAAaH,EAAM,aAAa,CAAC,IAC/EE,IAAM,KAAK,IAAIH,EAAgB,SAAS,GAAG,CAAC;AAEhD,GApB6B,yBA0BvBK,IAAqB,gBAAAR,EAAA,CAACS,IAAkB,OAAwB;AACpE,QAAMC,IAAeC,EAAuB,IAAI,GAC1CC,IAAWD,EAAuB,IAAI,GACtCE,IAAWF,EAAuB,IAAI,GACtCG,IAAaH,EAAuB,IAAI,GACxC,CAACI,GAAWC,CAAY,IAAIC,EAAS,EAAK;AAEhD,SAAAC,EAAgB,MAAM;AACpB,UAAMC,IAAmBT,EAAa;AAEtC,QAAI,CAACS;AACH;AAGF,UAAMC,IAAkB,gBAAApB,EAAA,MAAM;AAC5B,YAAMqB,IAAiB,OAAO,iBAAiBF,CAAgB,GACzDG,IACJ,OAAO,WAAWD,EAAe,aAAaA,EAAe,OAAO,GAAG,KAAK,GACxEE,IAAc;AAAA,QAClBxB,EAAuBa,EAAS,OAAO;AAAA,QACvCV,EAAqBW,EAAS,OAAO;AAAA,QACrCX,EAAqBY,EAAW,OAAO;AAAA,MAAA,EACvC,OAAO,CAACU,MAAUA,IAAQ,CAAC,GACvBC,IACJF,EAAY,OAAO,CAAChB,GAAYiB,MAAUjB,IAAaiB,GAAO,CAAC,IAC/DF,IAAY,KAAK,IAAIC,EAAY,SAAS,GAAG,CAAC;AAEhD,MAAAP,EAAaS,IAAgBN,EAAiB,WAAW;AAAA,IAC3D,GAdwB;AAgBxB,IAAAC,EAAA;AAEA,UAAMM,IAAiB,IAAI,eAAe,MAAM;AAC9C,MAAAN,EAAA;AAAA,IACF,CAAC;AAED,YAACD,GAAkBP,EAAS,SAASC,EAAS,SAASC,EAAW,OAAO,EACtE,OAAO,OAAO,EACd,QAAQ,CAACb,MAAY;AACpB,MAAAyB,EAAe,QAAQzB,CAAsB;AAAA,IAC/C,CAAC,GAEI,MAAM;AACX,MAAAyB,EAAe,WAAA;AAAA,IACjB;AAAA,EACF,GAAG,CAACjB,CAAI,CAAC,GAEF;AAAA,IACL,cAAAC;AAAA,IACA,UAAAE;AAAA,IACA,UAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAC;AAAA,EAAA;AAEJ,GAtD2B;"}
@@ -1,24 +0,0 @@
1
- var v = Object.defineProperty;
2
- var n = (e, t) => v(e, "name", { value: t, configurable: !0 });
3
- import { useAtomValue as d, useSetAtom as o } from "jotai";
4
- import { navbarStateAtom as g, navbarToggleFoldedAtom as i, navbarOpenFoldedAtom as p, navbarCloseFoldedAtom as u, navbarToggleMobileAtom as F, navbarOpenMobileAtom as M, navbarCloseMobileAtom as C, navbarOpenAtom as N, navbarCloseAtom as O, navbarToggleAtom as T, resetNavbarAtom as f } from "../store/atoms/navbarAtoms.js";
5
- const V = /* @__PURE__ */ n(() => d(g), "useGetNavbar"), h = /* @__PURE__ */ n(() => {
6
- const e = o(i), t = o(p), a = o(u), l = o(F), s = o(M), r = o(C), b = o(N), m = o(O), c = o(T), A = o(f);
7
- return {
8
- toggleFolded: e,
9
- openFolded: t,
10
- closeFolded: a,
11
- toggleMobile: l,
12
- openMobile: s,
13
- closeMobile: r,
14
- open: b,
15
- close: m,
16
- toggle: c,
17
- reset: A
18
- };
19
- }, "useNavbarActions");
20
- export {
21
- V as useGetNavbar,
22
- h as useNavbarActions
23
- };
24
- //# sourceMappingURL=useNavbar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useNavbar.js","sources":["../../src/hooks/useNavbar.ts"],"sourcesContent":["import {\n navbarCloseAtom,\n navbarCloseFoldedAtom,\n navbarCloseMobileAtom,\n navbarOpenAtom,\n navbarOpenFoldedAtom,\n navbarOpenMobileAtom,\n navbarStateAtom,\n navbarToggleAtom,\n navbarToggleFoldedAtom,\n navbarToggleMobileAtom,\n resetNavbarAtom,\n} from '@/store/atoms';\nimport { useAtomValue, useSetAtom } from 'jotai';\n\n/**\n * Navbar 상태 조회 훅\n */\nexport const useGetNavbar = () => {\n return useAtomValue(navbarStateAtom);\n};\n\n/**\n * Navbar 액션 훅\n */\nexport const useNavbarActions = () => {\n const toggleFolded = useSetAtom(navbarToggleFoldedAtom);\n const openFolded = useSetAtom(navbarOpenFoldedAtom);\n const closeFolded = useSetAtom(navbarCloseFoldedAtom);\n const toggleMobile = useSetAtom(navbarToggleMobileAtom);\n const openMobile = useSetAtom(navbarOpenMobileAtom);\n const closeMobile = useSetAtom(navbarCloseMobileAtom);\n const open = useSetAtom(navbarOpenAtom);\n const close = useSetAtom(navbarCloseAtom);\n const toggle = useSetAtom(navbarToggleAtom);\n const reset = useSetAtom(resetNavbarAtom);\n\n return {\n toggleFolded,\n openFolded,\n closeFolded,\n toggleMobile,\n openMobile,\n closeMobile,\n open,\n close,\n toggle,\n reset,\n };\n};\n"],"names":["useGetNavbar","__name","useAtomValue","navbarStateAtom","useNavbarActions","toggleFolded","useSetAtom","navbarToggleFoldedAtom","openFolded","navbarOpenFoldedAtom","closeFolded","navbarCloseFoldedAtom","toggleMobile","navbarToggleMobileAtom","openMobile","navbarOpenMobileAtom","closeMobile","navbarCloseMobileAtom","open","navbarOpenAtom","close","navbarCloseAtom","toggle","navbarToggleAtom","reset","resetNavbarAtom"],"mappings":";;;;AAkBO,MAAMA,IAAe,gBAAAC,EAAA,MACnBC,EAAaC,CAAe,GADT,iBAOfC,IAAmB,gBAAAH,EAAA,MAAM;AACpC,QAAMI,IAAeC,EAAWC,CAAsB,GAChDC,IAAaF,EAAWG,CAAoB,GAC5CC,IAAcJ,EAAWK,CAAqB,GAC9CC,IAAeN,EAAWO,CAAsB,GAChDC,IAAaR,EAAWS,CAAoB,GAC5CC,IAAcV,EAAWW,CAAqB,GAC9CC,IAAOZ,EAAWa,CAAc,GAChCC,IAAQd,EAAWe,CAAe,GAClCC,IAAShB,EAAWiB,CAAgB,GACpCC,IAAQlB,EAAWmB,CAAe;AAExC,SAAO;AAAA,IACL,cAAApB;AAAA,IACA,YAAAG;AAAA,IACA,aAAAE;AAAA,IACA,cAAAE;AAAA,IACA,YAAAE;AAAA,IACA,aAAAE;AAAA,IACA,MAAAE;AAAA,IACA,OAAAE;AAAA,IACA,QAAAE;AAAA,IACA,OAAAE;AAAA,EAAA;AAEJ,GAxBgC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useNavigationActiveRouteRemount.js","sources":["../../src/hooks/useNavigationActiveRouteRemount.ts"],"sourcesContent":["import { useOwpAppContext } from '@/contexts/OwpAppProvider';\nimport { atom, useAtomValue, useSetAtom } from 'jotai';\nimport { useMemo } from 'react';\nimport { createPath, type To, useLocation, useResolvedPath } from 'react-router-dom';\n\nconst navigationActiveRouteRemountKeyAtom = atom(0);\n\n/**\n * 네비게이션 active route remount key 조회\n */\nexport const useNavigationActiveRouteRemountKey = () =>\n useAtomValue(navigationActiveRouteRemountKeyAtom);\n\n/**\n * 네비게이션 active route remount 제어값 조회\n * @param to 이동 대상 경로\n */\nexport const useNavigationActiveRouteRemount = (to?: To) => {\n const { env } = useOwpAppContext();\n const location = useLocation();\n const setNavigationActiveRouteRemountKey = useSetAtom(navigationActiveRouteRemountKeyAtom);\n const resolvedTo = useResolvedPath(\n to ?? {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n },\n );\n\n const isNavigationActiveRouteRemountEnabled =\n env?.isNavigationActiveRouteRemountEnabled ?? true;\n\n const shouldRemountRouteOnClick = useMemo(() => {\n if (!to || !isNavigationActiveRouteRemountEnabled) {\n return false;\n }\n\n return (\n createPath(resolvedTo) ===\n createPath({\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n })\n );\n }, [\n isNavigationActiveRouteRemountEnabled,\n location.hash,\n location.pathname,\n location.search,\n resolvedTo,\n to,\n ]);\n\n const remountRoute = () => {\n setNavigationActiveRouteRemountKey((previousValue) => previousValue + 1);\n };\n\n return {\n isNavigationActiveRouteRemountEnabled,\n shouldRemountRouteOnClick,\n remountRoute,\n };\n};\n"],"names":["navigationActiveRouteRemountKeyAtom","atom","useNavigationActiveRouteRemountKey","__name","useAtomValue","useNavigationActiveRouteRemount","to","env","useOwpAppContext","location","useLocation","setNavigationActiveRouteRemountKey","useSetAtom","resolvedTo","useResolvedPath","isNavigationActiveRouteRemountEnabled","shouldRemountRouteOnClick","useMemo","createPath","previousValue"],"mappings":";;;;;;AAKA,MAAMA,IAAsCC,EAAK,CAAC,GAKrCC,IAAqC,gBAAAC,EAAA,MAChDC,EAAaJ,CAAmC,GADA,uCAOrCK,IAAkC,gBAAAF,EAAA,CAACG,MAAY;AAC1D,QAAM,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACVC,IAAWC,EAAA,GACXC,IAAqCC,EAAWZ,CAAmC,GACnFa,IAAaC;AAAA,IACjBR,KAAM;AAAA,MACJ,UAAUG,EAAS;AAAA,MACnB,QAAQA,EAAS;AAAA,MACjB,MAAMA,EAAS;AAAA,IAAA;AAAA,EACjB,GAGIM,KACJR,KAAA,gBAAAA,EAAK,0CAAyC,IAE1CS,IAA4BC,EAAQ,MACpC,CAACX,KAAM,CAACS,IACH,KAIPG,EAAWL,CAAU,MACrBK,EAAW;AAAA,IACT,UAAUT,EAAS;AAAA,IACnB,QAAQA,EAAS;AAAA,IACjB,MAAMA,EAAS;AAAA,EAAA,CAChB,GAEF;AAAA,IACDM;AAAA,IACAN,EAAS;AAAA,IACTA,EAAS;AAAA,IACTA,EAAS;AAAA,IACTI;AAAA,IACAP;AAAA,EAAA,CACD;AAMD,SAAO;AAAA,IACL,uCAAAS;AAAA,IACA,2BAAAC;AAAA,IACA,cAPmB,gBAAAb,EAAA,MAAM;AACzB,MAAAQ,EAAmC,CAACQ,MAAkBA,IAAgB,CAAC;AAAA,IACzE,GAFqB;AAAA,EAOnB;AAEJ,GA9C+C;"}