@owp/core 2.5.23 → 2.5.25

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 (155) hide show
  1. package/dist/_virtual/index10.js +2 -2
  2. package/dist/_virtual/index12.js +2 -2
  3. package/dist/_virtual/index13.js +2 -2
  4. package/dist/_virtual/index14.js +2 -2
  5. package/dist/_virtual/index15.js +2 -2
  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 +1 -1
  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/OwpTreeGrid/OwpTreeGrid.js +2 -2
  40. package/dist/components/OwpTreeGrid/OwpTreeGrid.js.map +1 -1
  41. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js +55 -56
  42. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js.map +1 -1
  43. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js +10 -10
  44. package/dist/contexts/OwpUiProvider.js +5 -5
  45. package/dist/contexts/OwpUiProvider.js.map +1 -1
  46. package/dist/hooks/{useAccessTokenGuard.js → internal/useAccessTokenGuard.js} +2 -2
  47. package/dist/hooks/internal/useAccessTokenGuard.js.map +1 -0
  48. package/dist/hooks/{useCurrentLanguage.js → internal/useCurrentLanguage.js} +2 -2
  49. package/dist/hooks/internal/useCurrentLanguage.js.map +1 -0
  50. package/dist/hooks/internal/useHeaderWrapState.js.map +1 -0
  51. package/dist/hooks/internal/useNavbar.js +24 -0
  52. package/dist/hooks/internal/useNavbar.js.map +1 -0
  53. package/dist/hooks/{useNavigationActiveRouteRemount.js → internal/useNavigationActiveRouteRemount.js} +1 -1
  54. package/dist/hooks/internal/useNavigationActiveRouteRemount.js.map +1 -0
  55. package/dist/hooks/{useShortcuts.js → internal/useShortcuts.js} +3 -3
  56. package/dist/hooks/internal/useShortcuts.js.map +1 -0
  57. package/dist/hooks/internal/useThemeMediaQuery.js.map +1 -0
  58. package/dist/hooks/internal/useTimeout.js.map +1 -0
  59. package/dist/hooks/useInitApp.js.map +1 -1
  60. package/dist/hooks.js +53 -81
  61. package/dist/hooks.js.map +1 -1
  62. package/dist/layout/Layout.js +1 -1
  63. package/dist/layout/Layout.js.map +1 -1
  64. package/dist/layout/components/layouts/NavbarToggleFabLayout.js +2 -2
  65. package/dist/layout/components/layouts/NavbarToggleFabLayout.js.map +1 -1
  66. package/dist/layout/components/layouts/NavbarWrapperLayout.js +2 -2
  67. package/dist/layout/components/layouts/NavbarWrapperLayout.js.map +1 -1
  68. package/dist/layout/components/navbar/NavbarToggleButton.js +2 -2
  69. package/dist/layout/components/navbar/NavbarToggleButton.js.map +1 -1
  70. package/dist/layout/components/navbar/style/NavbarStyle.js +1 -1
  71. package/dist/layout/components/navbar/style/NavbarStyle.js.map +1 -1
  72. package/dist/layout/components/navbar/style/NavbarStyleContent.js +1 -1
  73. package/dist/layout/components/navbar/style/NavbarStyleContent.js.map +1 -1
  74. package/dist/layout/components/navigation/Navigation.js +2 -2
  75. package/dist/layout/components/navigation/Navigation.js.map +1 -1
  76. package/dist/layout/components/navigation/vertical/types/NavVerticalCollapse.js +1 -1
  77. package/dist/layout/components/navigation/vertical/types/NavVerticalCollapse.js.map +1 -1
  78. package/dist/layout/components/navigation/vertical/types/NavVerticalGroup.js +1 -1
  79. package/dist/layout/components/navigation/vertical/types/NavVerticalGroup.js.map +1 -1
  80. package/dist/layout/components/navigation/vertical/types/NavVerticalItem.js +1 -1
  81. package/dist/layout/components/navigation/vertical/types/NavVerticalItem.js.map +1 -1
  82. package/dist/layout/components/toggles/LanguageSwitcherToggle.js +1 -1
  83. package/dist/layout/components/toggles/LanguageSwitcherToggle.js.map +1 -1
  84. package/dist/layout/components/toggles/NavigationShortcutsToggle.js +1 -1
  85. package/dist/layout/components/toggles/NavigationShortcutsToggle.js.map +1 -1
  86. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/constants.js +1 -1
  87. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/index.js +1 -1
  88. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE39/index.js +1 -1
  89. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/index.js +1 -1
  90. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/index.js +1 -1
  91. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/GenericBarcode/index.js +1 -1
  92. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/constants.js +1 -1
  93. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/index.js +1 -1
  94. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/MSI/index.js +1 -1
  95. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/codabar/index.js +1 -1
  96. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/pharmacode/index.js +1 -1
  97. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/renderers/index.js +1 -1
  98. package/dist/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +1 -1
  99. package/dist/types/components/OwpCommonCode/OwpCommonCodeQuerySelector.d.ts +5 -3
  100. package/dist/types/components/OwpCommonCode/OwpCommonCodeSelector.d.ts +5 -3
  101. package/dist/types/components/OwpOptionSelector/OwpOptionSelector.d.ts +4 -1
  102. package/dist/types/components/OwpSelectorBase/types/index.d.ts +1 -1
  103. package/dist/types/components/OwpSelectorBase/types/types.d.ts +3 -0
  104. package/dist/types/hooks/index.d.ts +0 -10
  105. package/dist/types/hooks/{useNavbar.d.ts → internal/useNavbar.d.ts} +1 -1
  106. package/dist/types/utils/treeGridUtil.d.ts +0 -14
  107. package/dist/utils/{exceljsBrowser.js → internal/exceljsBrowser.js} +1 -1
  108. package/dist/utils/internal/exceljsBrowser.js.map +1 -0
  109. package/dist/utils/internal/jszipBrowser.js.map +1 -0
  110. package/dist/utils/internal/treeGridBodyRowsEvent.js.map +1 -0
  111. package/dist/utils/treeGridExportExcelUtil.js +1 -1
  112. package/dist/utils/treeGridExportExcelUtil.js.map +1 -1
  113. package/dist/utils/treeGridUtil.js +1 -6
  114. package/dist/utils/treeGridUtil.js.map +1 -1
  115. package/dist/utils/zipUtil.js +1 -1
  116. package/dist/utils/zipUtil.js.map +1 -1
  117. package/dist/utils.js +70 -75
  118. package/package.json +1 -1
  119. package/dist/hooks/useAccessTokenGuard.js.map +0 -1
  120. package/dist/hooks/useCurrentLanguage.js.map +0 -1
  121. package/dist/hooks/useDebounce.js +0 -24
  122. package/dist/hooks/useDebounce.js.map +0 -1
  123. package/dist/hooks/useDeepCompareEffect.js +0 -38
  124. package/dist/hooks/useDeepCompareEffect.js.map +0 -1
  125. package/dist/hooks/useHeaderWrapState.js.map +0 -1
  126. package/dist/hooks/useNavbar.js +0 -24
  127. package/dist/hooks/useNavbar.js.map +0 -1
  128. package/dist/hooks/useNavigationActiveRouteRemount.js.map +0 -1
  129. package/dist/hooks/usePrevious.js +0 -14
  130. package/dist/hooks/usePrevious.js.map +0 -1
  131. package/dist/hooks/useShortcuts.js.map +0 -1
  132. package/dist/hooks/useThemeMediaQuery.js.map +0 -1
  133. package/dist/hooks/useTimeout.js.map +0 -1
  134. package/dist/types/hooks/useDebounce.d.ts +0 -7
  135. package/dist/types/hooks/useDeepCompareEffect.d.ts +0 -22
  136. package/dist/types/hooks/usePrevious.d.ts +0 -5
  137. package/dist/types/utils/dayjsBrowser.d.ts +0 -1
  138. package/dist/utils/exceljsBrowser.js.map +0 -1
  139. package/dist/utils/jszipBrowser.js.map +0 -1
  140. package/dist/utils/treeGridBodyRowsEvent.js.map +0 -1
  141. /package/dist/hooks/{useHeaderWrapState.js → internal/useHeaderWrapState.js} +0 -0
  142. /package/dist/hooks/{useThemeMediaQuery.js → internal/useThemeMediaQuery.js} +0 -0
  143. /package/dist/hooks/{useTimeout.js → internal/useTimeout.js} +0 -0
  144. /package/dist/types/hooks/{useAccessTokenGuard.d.ts → internal/useAccessTokenGuard.d.ts} +0 -0
  145. /package/dist/types/hooks/{useCurrentLanguage.d.ts → internal/useCurrentLanguage.d.ts} +0 -0
  146. /package/dist/types/hooks/{useHeaderWrapState.d.ts → internal/useHeaderWrapState.d.ts} +0 -0
  147. /package/dist/types/hooks/{useNavigationActiveRouteRemount.d.ts → internal/useNavigationActiveRouteRemount.d.ts} +0 -0
  148. /package/dist/types/hooks/{useShortcuts.d.ts → internal/useShortcuts.d.ts} +0 -0
  149. /package/dist/types/hooks/{useThemeMediaQuery.d.ts → internal/useThemeMediaQuery.d.ts} +0 -0
  150. /package/dist/types/hooks/{useTimeout.d.ts → internal/useTimeout.d.ts} +0 -0
  151. /package/dist/types/utils/{exceljsBrowser.d.ts → internal/exceljsBrowser.d.ts} +0 -0
  152. /package/dist/types/utils/{jszipBrowser.d.ts → internal/jszipBrowser.d.ts} +0 -0
  153. /package/dist/types/utils/{treeGridBodyRowsEvent.d.ts → internal/treeGridBodyRowsEvent.d.ts} +0 -0
  154. /package/dist/utils/{jszipBrowser.js → internal/jszipBrowser.js} +0 -0
  155. /package/dist/utils/{treeGridBodyRowsEvent.js → internal/treeGridBodyRowsEvent.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useOwpTreeGridDatePickerEditor.js","sources":["../../../../../src/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.tsx"],"sourcesContent":["import {\n PICKER_INVALID_INPUT_MESSAGE_KEY,\n TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH,\n TIME_PICKER_EDITOR_SECTION_WIDTH,\n TIME_PICKER_SELECTED_ITEM_SX,\n VALUE_DATE_FORMATTER,\n VALUE_MONTH_FORMATTER,\n VALUE_TIME_FORMATTER,\n VALUE_TIME_SECOND_FORMATTER,\n VALUE_YEAR_FORMATTER,\n} from '@/components/OwpPicker/constants';\nimport { getPickerInputMask } from '@/components/OwpPicker/utils';\nimport { OwpTextMaskField, type OwpTextMaskFieldChangeEvent } from '@/components/OwpTextField';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { ensureDayjsBrowserSetup } from '@/utils/dayjsBrowser';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Paper from '@mui/material/Paper';\nimport Popper, { type PopperProps } from '@mui/material/Popper';\nimport { LocalizationProvider, MultiSectionDigitalClock } from '@mui/x-date-pickers';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport { enUS } from 'date-fns/locale/en-US';\nimport { ko } from 'date-fns/locale/ko';\nimport dayjs, { type Dayjs } from '@/dayjs';\nimport {\n type MouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport ReactDatePicker, { registerLocale, setDefaultLocale } from 'react-datepicker';\nimport type { OwpTreeGridDatePickerEditorConfig, OwpTreeGridRowModel } from '../../OwpTreeGrid';\n\nregisterLocale('ko', ko);\nregisterLocale('en', enUS);\nsetDefaultLocale('ko');\nensureDayjsBrowserSetup();\n\nconst DATE_TIME_VALUE_FORMATTER = `${VALUE_DATE_FORMATTER} ${VALUE_TIME_FORMATTER}`;\nconst DATE_TIME_SECOND_VALUE_FORMATTER = `${VALUE_DATE_FORMATTER} ${VALUE_TIME_SECOND_FORMATTER}`;\nconst DATE_PICKER_EDITOR_COLUMNS_SEPARATOR = '\\u001f';\nconst TREE_GRID_DATE_PICKER_EDITOR_CLASS = 'OwpTreeGridDatePickerEditor';\nconst TREE_GRID_TIME_PICKER_EDITOR_CLASS = 'OwpTreeGridTimePickerEditor';\nconst TREE_GRID_TIME_PICKER_EDITOR_BUTTON_HTML =\n '<span class=\"OwpTreeGridTimePickerEditorIcon\" aria-hidden=\"true\"></span>';\nconst DATE_PICKER_EDITOR_MONTH_FORMATTER = 'MM';\nconst DATE_PICKER_EDITOR_DAY_FORMATTER = 'DD';\nconst TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS = new Map<\n string,\n OwpTreeGridDatePickerEditorValueFormat\n>([\n ['yyyy', VALUE_YEAR_FORMATTER],\n ['YYYY', VALUE_YEAR_FORMATTER],\n ['mm', DATE_PICKER_EDITOR_MONTH_FORMATTER],\n ['MM', DATE_PICKER_EDITOR_MONTH_FORMATTER],\n ['dd', DATE_PICKER_EDITOR_DAY_FORMATTER],\n ['DD', DATE_PICKER_EDITOR_DAY_FORMATTER],\n ['yyyy-mm', VALUE_MONTH_FORMATTER],\n ['YYYY-MM', VALUE_MONTH_FORMATTER],\n ['yyyy-mm-dd', VALUE_DATE_FORMATTER],\n ['YYYY-MM-DD', VALUE_DATE_FORMATTER],\n ['HH:mm', VALUE_TIME_FORMATTER],\n ['HH:mm:ss', VALUE_TIME_SECOND_FORMATTER],\n ['yyyy-mm-dd HH:mm', DATE_TIME_VALUE_FORMATTER],\n ['YYYY-MM-DD HH:mm', DATE_TIME_VALUE_FORMATTER],\n ['yyyy-mm-dd HH:mm:ss', DATE_TIME_SECOND_VALUE_FORMATTER],\n ['YYYY-MM-DD HH:mm:ss', DATE_TIME_SECOND_VALUE_FORMATTER],\n]);\ntype OwpTreeGridDatePickerEditorValueFormat =\n | typeof VALUE_YEAR_FORMATTER\n | typeof DATE_PICKER_EDITOR_MONTH_FORMATTER\n | typeof VALUE_MONTH_FORMATTER\n | typeof DATE_PICKER_EDITOR_DAY_FORMATTER\n | typeof VALUE_DATE_FORMATTER\n | typeof VALUE_TIME_FORMATTER\n | typeof VALUE_TIME_SECOND_FORMATTER\n | typeof DATE_TIME_VALUE_FORMATTER\n | typeof DATE_TIME_SECOND_VALUE_FORMATTER;\n\ntype OwpTreeGridDatePickerEditorKind =\n | 'year'\n | 'month'\n | 'day'\n | 'yearMonth'\n | 'date'\n | 'time'\n | 'dateTime';\n\ntype OwpTreeGridDatePickerEditorFormatMeta = {\n kind: OwpTreeGridDatePickerEditorKind;\n valueFormat: OwpTreeGridDatePickerEditorValueFormat;\n inputLength: number;\n digitLength: number;\n};\n\ntype TreeGridDatePickerColumn = TCol & {\n OnClickSide?: string;\n OnClickSideDate?: string;\n};\n\ntype TreeGridDatePickerEditorState<T> = {\n grid: TGrid;\n row: OwpTreeGridRowModel<T>;\n col: string;\n anchorRect: DOMRect;\n value?: string;\n};\n\ninterface UseOwpTreeGridDatePickerEditorParams<T> {\n config?: OwpTreeGridDatePickerEditorConfig;\n treeGridInstanceRef: RefObject<TGrid>;\n isTreeGridReady: boolean;\n onValueChange?: (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string, value: string) => void;\n}\n\n/** DatePicker editor 활성 여부 */\nconst isDatePickerEditorEnabled = (config?: OwpTreeGridDatePickerEditorConfig) =>\n config?.enabled !== false;\n\n/** TreeGrid 날짜 포맷 정규화 */\nconst normalizeTreeGridDateFormat = (format?: string) => format?.trim().replace(/\\s+/g, ' ');\n\n/** TreeGrid 날짜 포맷 Dayjs 변환 */\nconst convertTreeGridDateFormatToDayjs = (format?: string) => {\n const normalizedFormat = normalizeTreeGridDateFormat(format);\n\n if (!normalizedFormat) {\n return null;\n }\n\n return (\n TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS.get(normalizedFormat) ??\n TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS.get(normalizedFormat.toLowerCase()) ??\n null\n );\n};\n\n/** DatePicker editor 포맷 메타 */\nconst getDatePickerEditorFormatMeta = (\n valueFormat: OwpTreeGridDatePickerEditorValueFormat,\n): OwpTreeGridDatePickerEditorFormatMeta => {\n switch (valueFormat) {\n case VALUE_YEAR_FORMATTER:\n return { kind: 'year', valueFormat, inputLength: 4, digitLength: 4 };\n case DATE_PICKER_EDITOR_MONTH_FORMATTER:\n return { kind: 'month', valueFormat, inputLength: 2, digitLength: 2 };\n case VALUE_MONTH_FORMATTER:\n return { kind: 'yearMonth', valueFormat, inputLength: 7, digitLength: 6 };\n case DATE_PICKER_EDITOR_DAY_FORMATTER:\n return { kind: 'day', valueFormat, inputLength: 2, digitLength: 2 };\n case VALUE_TIME_FORMATTER:\n return { kind: 'time', valueFormat, inputLength: 5, digitLength: 4 };\n case VALUE_TIME_SECOND_FORMATTER:\n return { kind: 'time', valueFormat, inputLength: 8, digitLength: 6 };\n case DATE_TIME_VALUE_FORMATTER:\n return { kind: 'dateTime', valueFormat, inputLength: 16, digitLength: 12 };\n case DATE_TIME_SECOND_VALUE_FORMATTER:\n return { kind: 'dateTime', valueFormat, inputLength: 19, digitLength: 14 };\n default:\n return { kind: 'date', valueFormat, inputLength: 10, digitLength: 8 };\n }\n};\n\n/** DatePicker editor 컬럼 포맷 메타 */\nconst resolveDatePickerEditorFormatMeta = <T,>(\n editorState: TreeGridDatePickerEditorState<T> | null,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (!editorState) {\n return getDatePickerEditorFormatMeta(VALUE_DATE_FORMATTER);\n }\n\n const rowRecord = editorState.row as Record<string, unknown>;\n const column = editorState.grid.Cols?.[editorState.col];\n const treeGridFormat =\n rowRecord[`${editorState.col}EditFormat`] ??\n rowRecord[`${editorState.col}Format`] ??\n column?.EditFormat ??\n column?.Format;\n const valueFormat =\n convertTreeGridDateFormatToDayjs(\n typeof treeGridFormat === 'string' ? treeGridFormat : undefined,\n ) ??\n (config?.showTimeInput || config?.showTimeSelect\n ? DATE_TIME_VALUE_FORMATTER\n : VALUE_DATE_FORMATTER);\n\n return getDatePickerEditorFormatMeta(valueFormat);\n};\n\n/** DatePicker editor 입력 마스크 */\nconst formatDatePickerEditorInput = (\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n) => {\n const digits = value.replace(/\\D/g, '').slice(0, formatMeta.digitLength);\n const year = digits.slice(0, 4);\n const month = digits.slice(4, 6);\n const date = digits.slice(6, 8);\n const hour = digits.slice(8, 10);\n const minute = digits.slice(10, 12);\n const second = digits.slice(12, 14);\n\n switch (formatMeta.kind) {\n case 'year':\n case 'month':\n case 'day':\n return digits;\n case 'yearMonth':\n return [year, month].filter(Boolean).join('-');\n case 'time':\n return [digits.slice(0, 2), digits.slice(2, 4), digits.slice(4, 6)].filter(Boolean).join(':');\n case 'dateTime':\n return (\n [year, month, date].filter(Boolean).join('-') +\n (hour ? ` ${hour}` : '') +\n (minute ? `:${minute}` : '') +\n (second ? `:${second}` : '')\n );\n default:\n return [year, month, date].filter(Boolean).join('-');\n }\n};\n\n/** DatePicker editor 입력 완성 여부 */\nconst isCompleteDatePickerEditorInput = (\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n) => value.length === formatMeta.inputLength;\n\n/** DatePicker editor 단독 월/일 파싱 값 */\nconst resolvePartialDatePickerEditorInputValue = (\n col: string,\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (formatMeta.kind === 'month') {\n return `${config?.columnOptions?.[col]?.baseYear ?? dayjs().format(VALUE_YEAR_FORMATTER)}-${value}`;\n }\n\n if (formatMeta.kind === 'day') {\n return `${config?.columnOptions?.[col]?.baseYearMonth ?? dayjs().format(VALUE_MONTH_FORMATTER)}-${value}`;\n }\n\n return value;\n};\n\n/** DatePicker editor 단독 월/일 파싱 포맷 */\nconst resolvePartialDatePickerEditorInputFormat = (\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n) => {\n if (formatMeta.kind === 'month') {\n return VALUE_MONTH_FORMATTER;\n }\n\n if (formatMeta.kind === 'day') {\n return VALUE_DATE_FORMATTER;\n }\n\n return formatMeta.valueFormat;\n};\n\n/** DatePicker editor 선택 값 파싱 */\nconst parseDatePickerEditorValue = (\n col: string,\n value: string | undefined,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (!value) {\n return null;\n }\n\n if (formatMeta.kind === 'year') {\n const normalizedValue = `${value}-01-01`;\n const parsedValue = dayjs(normalizedValue, VALUE_DATE_FORMATTER, true);\n return parsedValue.isValid() && parsedValue.format(VALUE_DATE_FORMATTER) === normalizedValue\n ? parsedValue\n : null;\n }\n\n if (formatMeta.kind === 'yearMonth') {\n const normalizedValue = `${value}-01`;\n const parsedValue = dayjs(normalizedValue, VALUE_DATE_FORMATTER, true);\n return parsedValue.isValid() && parsedValue.format(VALUE_DATE_FORMATTER) === normalizedValue\n ? parsedValue\n : null;\n }\n\n const resolvedValue = resolvePartialDatePickerEditorInputValue(col, value, formatMeta, config);\n const resolvedFormat = resolvePartialDatePickerEditorInputFormat(formatMeta);\n const parsedValue = dayjs(resolvedValue, resolvedFormat, true);\n\n return parsedValue.isValid() && parsedValue.format(resolvedFormat) === resolvedValue\n ? parsedValue\n : null;\n};\n\n/** DatePicker editor react-datepicker 표시 포맷 */\nconst getReactDatePickerDisplayFormat = (formatMeta: OwpTreeGridDatePickerEditorFormatMeta) => {\n switch (formatMeta.kind) {\n case 'year':\n return 'yyyy';\n case 'month':\n return 'MM';\n case 'yearMonth':\n return 'yyyy-MM';\n case 'day':\n return 'dd';\n case 'dateTime':\n return formatMeta.valueFormat === DATE_TIME_SECOND_VALUE_FORMATTER\n ? 'yyyy-MM-dd HH:mm:ss'\n : 'yyyy-MM-dd HH:mm';\n default:\n return 'yyyy-MM-dd';\n }\n};\n\n/** DatePicker editor 입력 유효 여부 */\nconst isValidDatePickerEditorInput = (\n col: string,\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) =>\n isCompleteDatePickerEditorInput(value, formatMeta) &&\n Boolean(parseDatePickerEditorValue(col, value, formatMeta, config));\n\n/** DatePicker editor 초 포함 여부 */\nconst hasDatePickerEditorSeconds = (formatMeta: OwpTreeGridDatePickerEditorFormatMeta) =>\n formatMeta.valueFormat === VALUE_TIME_SECOND_FORMATTER ||\n formatMeta.valueFormat === DATE_TIME_SECOND_VALUE_FORMATTER;\n\n/** DatePicker editor Tab 포커스 이동 */\nconst moveTreeGridDatePickerEditorFocusByTab = (grid: TGrid, isShiftKey: boolean) => {\n const action = isShiftKey ? grid.ActionTabLeft : grid.ActionTabRight;\n\n action?.call(grid, 1, 0);\n};\n\n/** DatePicker editor 대상 셀 포커스 */\nconst focusTreeGridDatePickerEditorCell = (grid: TGrid, row: TRow, col: string) => {\n grid.Focus(row, col, undefined, undefined, 1);\n};\n\n/** TreeGrid class 병합 */\nconst appendTreeGridClass = (className: string | undefined, targetClassName: string) => {\n const classNames = className?.split(/\\s+/).filter(Boolean) ?? [];\n\n if (classNames.includes(targetClassName)) {\n return className;\n }\n\n return [...classNames, targetClassName].join(' ');\n};\n\n/** DatePicker editor 초기 표시 값 */\nconst resolveDatePickerEditorInitialValue = (\n grid: TGrid,\n row: TRow,\n col: string,\n cellElement: HTMLElement,\n) => {\n const stringEditValue = grid.GetStringEdit?.(row, col);\n const stringValue = grid.GetString?.(row, col);\n const rawValue = grid.GetValue?.(row, col);\n const textValue = cellElement.textContent?.trim();\n\n return String(stringEditValue || stringValue || textValue || rawValue || '');\n};\n\n/** DatePicker editor 초기 입력 값 정규화 */\nconst normalizeDatePickerEditorInitialValue = (\n col: string,\n value: string | undefined,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (!value) {\n return '';\n }\n\n if (isValidDatePickerEditorInput(col, value, formatMeta, config)) {\n return value;\n }\n\n const formattedValue = formatDatePickerEditorInput(value, formatMeta);\n\n return isValidDatePickerEditorInput(col, formattedValue, formatMeta, config)\n ? formattedValue\n : value;\n};\n\n/** DatePicker editor 키보드 시작 키 여부 */\nconst isDatePickerEditorStartKey = (key: string, event: Event) => {\n const keyboardEvent = event as KeyboardEvent;\n\n if (keyboardEvent.ctrlKey || keyboardEvent.altKey || keyboardEvent.metaKey) {\n return false;\n }\n\n return (\n /^\\d$/.test(key) ||\n /^\\d$/.test(keyboardEvent.key) ||\n key === 'F2' ||\n key === 'Backspace' ||\n key === 'Delete' ||\n keyboardEvent.key === 'F2' ||\n keyboardEvent.key === 'Backspace' ||\n keyboardEvent.key === 'Delete'\n );\n};\n\n/** DatePicker editor 내부 이벤트 여부 */\nconst isDatePickerEditorEventTarget = (event: Event) => {\n const target = event.target;\n\n return (\n target instanceof Element && Boolean(target.closest(`.${TREE_GRID_DATE_PICKER_EDITOR_CLASS}`))\n );\n};\n\n/** TreeGrid CanEdit 명시 활성 여부 */\nconst isTreeGridCanEditEnabled = (value: unknown) => value === 1 || value === '1';\n\n/** TreeGrid CanEdit 명시 비활성 여부 */\nconst isTreeGridCanEditDisabled = (value: unknown) =>\n value === 0 || value === '0' || value === false;\n\n/** TreeGrid 표시 행 여부 */\nconst isDisplayTreeGridRow = (row: TRow | null | undefined) => {\n if (!row || row.Fixed === 'Foot') {\n return false;\n }\n\n return row.Kind === 'Data' || isTreeGridCanEditEnabled((row as { Added?: unknown }).Added);\n};\n\n/** TreeGrid 날짜 셀 편집 가능 여부 */\nconst isEditableDatePickerCell = <T,>(\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n columns: ReadonlySet<string>,\n) => {\n if (columns.size > 0 && !columns.has(col)) {\n return false;\n }\n\n const column = grid.Cols?.[col];\n const cellCanEdit = (row as Record<string, unknown>)[`${col}CanEdit`];\n const hasCellCanEdit = cellCanEdit !== undefined && cellCanEdit !== null;\n const canEdit = hasCellCanEdit\n ? isTreeGridCanEditEnabled(cellCanEdit)\n : isTreeGridCanEditEnabled(column?.CanEdit);\n\n return (\n column?.Type === 'Date' &&\n isDisplayTreeGridRow(row) &&\n !isTreeGridCanEditDisabled(row.CanEdit) &&\n canEdit &&\n row.Deleted !== 1\n );\n};\n\n/** TreeGrid DatePicker editor 컬럼 설정 */\nconst configureTreeGridDatePickerColumns = (grid: TGrid | null, columns: readonly string[]) => {\n if (!grid) {\n return;\n }\n\n const targetColumns =\n columns.length > 0\n ? columns\n : Object.keys(grid.Cols ?? {}).filter((col) => grid.Cols?.[col]?.Type === 'Date');\n\n targetColumns.forEach((col) => {\n const column = grid.Cols?.[col] as TreeGridDatePickerColumn | undefined;\n\n if (!column || column.Type !== 'Date' || !isTreeGridCanEditEnabled(column.CanEdit)) {\n return;\n }\n\n column.AutoCalendar = 0;\n column.CalendarButtons = 0;\n\n const treeGridFormat = column.EditFormat ?? column.Format;\n const valueFormat =\n convertTreeGridDateFormatToDayjs(\n typeof treeGridFormat === 'string' ? treeGridFormat : undefined,\n ) ?? VALUE_DATE_FORMATTER;\n\n if (getDatePickerEditorFormatMeta(valueFormat).kind === 'time') {\n column.Button = 'Html';\n column.ButtonText = TREE_GRID_TIME_PICKER_EDITOR_BUTTON_HTML;\n column.OnClickSide = 'Focus';\n column.Class = appendTreeGridClass(column.Class, TREE_GRID_TIME_PICKER_EDITOR_CLASS);\n } else {\n column.Button = 'Date';\n column.OnClickSideDate = 'Focus';\n }\n });\n\n grid.Rerender?.(1, 1);\n};\n\n/** OwpTreeGrid Date 셀 React DatePicker editor */\nexport const useOwpTreeGridDatePickerEditor = <T,>({\n config,\n treeGridInstanceRef,\n isTreeGridReady,\n onValueChange,\n}: UseOwpTreeGridDatePickerEditorParams<T>) => {\n const { t, i18n } = useOwpTranslation();\n const [editorState, setEditorState] = useState<TreeGridDatePickerEditorState<T> | null>(null);\n const [inputDraftValue, setInputDraftValue] = useState('');\n const [hasInputCommitError, setHasInputCommitError] = useState(false);\n const editorInputRef = useRef<HTMLInputElement | null>(null);\n const isClosingAfterCommitRef = useRef(false);\n const enabled = isDatePickerEditorEnabled(config);\n const columnsKey = config?.columns?.join(DATE_PICKER_EDITOR_COLUMNS_SEPARATOR) ?? '';\n const columns = useMemo(\n () => (columnsKey ? columnsKey.split(DATE_PICKER_EDITOR_COLUMNS_SEPARATOR) : []),\n [columnsKey],\n );\n const columnSet = useMemo(() => new Set(columns), [columns]);\n const languageId = i18n.resolvedLanguage ?? i18n.language ?? 'kr';\n const datePickerLocale = languageId === 'kr' ? 'ko' : 'en';\n const adapterLocale = languageId === 'kr' ? 'ko' : 'en';\n const allowInput = config?.allowInput !== false;\n const formatMeta = useMemo(\n () => resolveDatePickerEditorFormatMeta(editorState, config),\n [config, editorState],\n );\n\n useEffect(() => {\n if (!enabled || !isTreeGridReady) {\n return;\n }\n\n configureTreeGridDatePickerColumns(treeGridInstanceRef.current, columns);\n }, [columns, enabled, isTreeGridReady, treeGridInstanceRef]);\n\n const closeEditor = useCallback(() => {\n setEditorState(null);\n }, []);\n\n const openDatePickerEditor = useCallback(\n (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string) => {\n focusTreeGridDatePickerEditorCell(grid, row, col);\n\n const cellElement = grid.GetCell(row, col) as HTMLElement | null;\n\n if (!cellElement) {\n return undefined;\n }\n\n const rawEditorState: TreeGridDatePickerEditorState<T> = {\n grid,\n row,\n col,\n anchorRect: cellElement.getBoundingClientRect(),\n value: resolveDatePickerEditorInitialValue(grid, row, col, cellElement),\n };\n const nextFormatMeta = resolveDatePickerEditorFormatMeta(rawEditorState, config);\n const baseEditorState = {\n ...rawEditorState,\n value: normalizeDatePickerEditorInitialValue(\n col,\n rawEditorState.value,\n nextFormatMeta,\n config,\n ),\n };\n isClosingAfterCommitRef.current = false;\n setHasInputCommitError(false);\n setInputDraftValue(baseEditorState.value ?? '');\n setEditorState(baseEditorState);\n\n return 1;\n },\n [config],\n );\n\n const handleDatePickerEditorCellClick = useCallback(\n (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n _x: number,\n _y: number,\n event: Event,\n ) => {\n if (!enabled || !isEditableDatePickerCell(grid, row, col, columnSet)) {\n closeEditor();\n return undefined;\n }\n\n grid.CloseDialog?.();\n event.preventDefault();\n event.stopPropagation();\n\n return openDatePickerEditor(grid, row, col);\n },\n [closeEditor, columnSet, enabled, openDatePickerEditor],\n );\n\n const handleDatePickerEditorButtonClick = useCallback(\n (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string, event: Event) => {\n if (!enabled || !isEditableDatePickerCell(grid, row, col, columnSet)) {\n return undefined;\n }\n\n grid.CloseDialog?.();\n event.preventDefault();\n event.stopPropagation();\n\n return openDatePickerEditor(grid, row, col);\n },\n [columnSet, enabled, openDatePickerEditor],\n );\n\n const handleDatePickerEditorKeyDown = useCallback(\n (grid: TGrid, key: string, event: Event) => {\n if (isDatePickerEditorEventTarget(event)) {\n return 1;\n }\n\n const row = (grid.FRow || grid.ARow) as OwpTreeGridRowModel<T> | null | undefined;\n const col = grid.FCol || grid.ACol;\n\n if (\n !enabled ||\n !row ||\n !col ||\n !isEditableDatePickerCell(grid, row, col, columnSet) ||\n !isDatePickerEditorStartKey(key, event)\n ) {\n return undefined;\n }\n\n grid.CloseDialog?.();\n event.preventDefault();\n event.stopPropagation();\n\n return openDatePickerEditor(grid, row, col);\n },\n [columnSet, enabled, openDatePickerEditor],\n );\n\n const handleDatePickerEditorStartEdit = useCallback(\n (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string) => {\n if (!enabled || !isEditableDatePickerCell(grid, row, col, columnSet)) {\n return undefined;\n }\n\n grid.CloseDialog?.();\n openDatePickerEditor(grid, row, col);\n\n return true;\n },\n [columnSet, enabled, openDatePickerEditor],\n );\n\n const selectedDateValue = useMemo(() => {\n if (!editorState || formatMeta.kind === 'time') {\n return null;\n }\n\n const parsedInputDraftValue = isValidDatePickerEditorInput(\n editorState.col,\n inputDraftValue,\n formatMeta,\n config,\n )\n ? parseDatePickerEditorValue(editorState.col, inputDraftValue, formatMeta, config)\n : null;\n\n if (parsedInputDraftValue) {\n return parsedInputDraftValue.toDate();\n }\n\n return (\n parseDatePickerEditorValue(\n editorState.col,\n editorState.value,\n formatMeta,\n config,\n )?.toDate() ?? null\n );\n }, [config, editorState, formatMeta, inputDraftValue]);\n\n const selectedTimeValue = useMemo(() => {\n if (formatMeta.kind !== 'time') {\n return null;\n }\n\n const draftDateValue = dayjs(inputDraftValue, formatMeta.valueFormat, true);\n\n if (draftDateValue.isValid()) {\n return draftDateValue;\n }\n\n if (!editorState?.value) {\n return null;\n }\n\n const dateValue = dayjs(editorState.value, formatMeta.valueFormat, true);\n\n return dateValue.isValid() ? dateValue : null;\n }, [editorState?.value, formatMeta, inputDraftValue]);\n\n const anchorEl = useMemo<PopperProps['anchorEl']>(() => {\n if (!editorState) {\n return null;\n }\n\n return {\n getBoundingClientRect: () => editorState.anchorRect,\n };\n }, [editorState]);\n const popperContainer = useMemo(() => {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n return document.getElementById('calendar-portal') ?? undefined;\n }, []);\n\n const handleDateSelect = (dateValue: Date | null) => {\n if (!editorState) {\n return;\n }\n\n const nextValue = dateValue ? dayjs(dateValue).format(formatMeta.valueFormat) : '';\n isClosingAfterCommitRef.current = true;\n setInputDraftValue(nextValue);\n\n editorState.grid.SetString(editorState.row, editorState.col, nextValue, 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, nextValue);\n closeEditor();\n };\n\n const handleTimeSelect = (dateValue: Dayjs | null, selectedView?: string) => {\n if (!editorState) {\n return;\n }\n\n const nextValue = dateValue?.isValid() ? dateValue.format(formatMeta.valueFormat) : '';\n const shouldClose =\n selectedView === (hasDatePickerEditorSeconds(formatMeta) ? 'seconds' : 'minutes');\n\n if (shouldClose) {\n isClosingAfterCommitRef.current = true;\n }\n\n setInputDraftValue(nextValue);\n editorState.grid.SetString(editorState.row, editorState.col, nextValue, 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, nextValue);\n setEditorState((prevState) => (prevState ? { ...prevState, value: nextValue } : prevState));\n\n if (shouldClose) {\n closeEditor();\n }\n };\n\n const commitInputValue = useCallback(\n (nextValue: string) => {\n if (!editorState) {\n return;\n }\n\n editorState.grid.SetString(editorState.row, editorState.col, nextValue, 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, nextValue);\n },\n [editorState, onValueChange],\n );\n\n const commitInputDraftValue = useCallback(() => {\n if (\n !editorState ||\n (inputDraftValue !== '' &&\n !isValidDatePickerEditorInput(editorState.col, inputDraftValue, formatMeta, config))\n ) {\n if (editorState && inputDraftValue) {\n setHasInputCommitError(true);\n }\n\n return false;\n }\n\n isClosingAfterCommitRef.current = true;\n setHasInputCommitError(false);\n commitInputValue(inputDraftValue);\n\n return true;\n }, [commitInputValue, config, editorState, formatMeta, inputDraftValue]);\n\n const closeEditorWithInputCommit = useCallback(() => {\n commitInputDraftValue();\n closeEditor();\n }, [closeEditor, commitInputDraftValue]);\n\n const handleInputChange = (event: OwpTextMaskFieldChangeEvent) => {\n if (!editorState) {\n return;\n }\n\n setInputDraftValue(event.target.value);\n setHasInputCommitError(false);\n };\n\n const commitEditorByKey = useCallback(\n (key: string, isShiftKey: boolean) => {\n if (!editorState || (key !== 'Enter' && key !== 'Tab') || !commitInputDraftValue()) {\n return false;\n }\n\n const { grid } = editorState;\n const isTabKey = key === 'Tab';\n\n closeEditor();\n\n if (isTabKey) {\n window.requestAnimationFrame(() => {\n moveTreeGridDatePickerEditorFocusByTab(grid, isShiftKey);\n });\n }\n\n return true;\n },\n [closeEditor, commitInputDraftValue, editorState],\n );\n\n const handleEditorCommitKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLElement>) => {\n if (event.key !== 'Enter' && event.key !== 'Tab') {\n return;\n }\n\n event.preventDefault();\n commitEditorByKey(event.key, event.shiftKey);\n },\n [commitEditorByKey],\n );\n\n const handleInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n event.stopPropagation();\n event.nativeEvent.stopImmediatePropagation();\n\n handleEditorCommitKeyDown(event);\n };\n\n const handleInputClear = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!editorState) {\n return;\n }\n\n isClosingAfterCommitRef.current = true;\n editorState.grid.SetString(editorState.row, editorState.col, '', 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, '');\n setInputDraftValue('');\n setHasInputCommitError(false);\n setEditorState((prevState) => (prevState ? { ...prevState, value: '' } : prevState));\n };\n\n const handleEditorMouseEvent = (event: MouseEvent) => {\n event.stopPropagation();\n };\n\n const handleEditorKeyboardEvent = (event: ReactKeyboardEvent<HTMLElement>) => {\n event.stopPropagation();\n event.nativeEvent.stopImmediatePropagation();\n handleEditorCommitKeyDown(event);\n };\n\n const inputValue = inputDraftValue;\n const editorFocusGrid = editorState?.grid;\n const editorFocusRow = editorState?.row;\n const editorFocusCol = editorState?.col;\n const hasInputError =\n hasInputCommitError &&\n !isClosingAfterCommitRef.current &&\n Boolean(inputValue) &&\n !isValidDatePickerEditorInput(editorState?.col ?? '', inputValue, formatMeta, config);\n const hasSeconds = hasDatePickerEditorSeconds(formatMeta);\n const timePickerEditorWidth = TIME_PICKER_EDITOR_SECTION_WIDTH * (hasSeconds ? 3 : 2);\n const timePickerViews = hasSeconds\n ? (['hours', 'minutes', 'seconds'] as const)\n : (['hours', 'minutes'] as const);\n const timeFormat = hasSeconds ? VALUE_TIME_SECOND_FORMATTER : VALUE_TIME_FORMATTER;\n\n useEffect(() => {\n if (!editorState) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeEditor();\n return;\n }\n\n if (event.key !== 'Enter' && event.key !== 'Tab') {\n return;\n }\n\n if (!isDatePickerEditorEventTarget(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n commitEditorByKey(event.key, event.shiftKey);\n };\n\n window.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown, true);\n };\n }, [closeEditor, commitEditorByKey, editorState]);\n\n useEffect(() => {\n if (!editorFocusGrid || !editorFocusRow || !editorFocusCol || !allowInput) {\n return undefined;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n editorInputRef.current?.focus();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [allowInput, editorFocusCol, editorFocusGrid, editorFocusRow]);\n\n const datePickerEditorElement = editorState ? (\n <Popper\n open\n anchorEl={anchorEl}\n container={popperContainer}\n placement=\"bottom-start\"\n sx={{ zIndex: 1400 }}\n >\n <ClickAwayListener onClickAway={closeEditorWithInputCommit}>\n <Paper\n className={TREE_GRID_DATE_PICKER_EDITOR_CLASS}\n elevation={8}\n onClick={handleEditorMouseEvent}\n onKeyDown={handleEditorKeyboardEvent}\n onKeyUp={handleEditorKeyboardEvent}\n onMouseDown={handleEditorMouseEvent}\n sx={{\n borderRadius: 1,\n lineHeight: 0,\n overflow: 'hidden',\n width: formatMeta.kind === 'time' ? timePickerEditorWidth : 'auto',\n '& .react-datepicker': {\n border: 0,\n display: 'block',\n lineHeight: 'normal',\n },\n '& .react-datepicker__month-container': {\n float: 'none',\n },\n '& .react-datepicker__month': {\n marginBottom: 0,\n },\n }}\n >\n {allowInput && (\n <OwpTextMaskField\n autoFocus\n inputRef={editorInputRef}\n fullWidth\n size=\"small\"\n variant=\"outlined\"\n value={inputValue}\n error={hasInputError}\n helperText={hasInputError ? t(PICKER_INVALID_INPUT_MESSAGE_KEY) : undefined}\n color={isClosingAfterCommitRef.current ? 'primary' : undefined}\n mask={getPickerInputMask(formatMeta.valueFormat)}\n placeholder={formatMeta.valueFormat}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n inputProps={{\n inputMode: 'numeric',\n 'aria-label': formatMeta.valueFormat,\n }}\n endAdornment={\n <InputAdornment\n position=\"end\"\n sx={{\n marginLeft: 0,\n }}\n >\n <IconButton\n size=\"small\"\n aria-label=\"clear-date-picker-editor-value\"\n disabled={!inputValue}\n onClick={handleInputClear}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n sx={{\n margin: 0,\n padding: 0.25,\n }}\n >\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n }\n sx={{\n boxSizing: 'border-box',\n width: formatMeta.kind === 'time' ? timePickerEditorWidth : '100%',\n px: 1,\n py: 1,\n '& .MuiOutlinedInput-root': {\n borderRadius: 0.75,\n fontSize: 13,\n paddingRight: 0.5,\n },\n }}\n />\n )}\n {formatMeta.kind === 'time' ? (\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={adapterLocale}>\n <MultiSectionDigitalClock\n ampm={false}\n value={selectedTimeValue}\n views={timePickerViews}\n onChange={(dateValue, _selectionState, selectedView) =>\n handleTimeSelect(dateValue, selectedView)\n }\n timeSteps={{\n minutes: config?.timeIntervals ?? 1,\n seconds: 1,\n }}\n slotProps={{\n digitalClockSectionItem: {\n sx: TIME_PICKER_SELECTED_ITEM_SX,\n },\n }}\n sx={{\n border: 0,\n width: timePickerEditorWidth,\n '& .MuiMultiSectionDigitalClockSection-root': {\n border: 0,\n boxSizing: 'border-box',\n width: TIME_PICKER_EDITOR_SECTION_WIDTH,\n flex: `0 0 ${TIME_PICKER_EDITOR_SECTION_WIDTH}px`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n },\n '& .MuiMultiSectionDigitalClockSection-item': {\n alignSelf: 'stretch',\n boxSizing: 'border-box',\n width: TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH,\n minWidth: TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH,\n justifyContent: 'center',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n }}\n />\n </LocalizationProvider>\n ) : (\n <ReactDatePicker\n inline\n locale={datePickerLocale}\n selected={selectedDateValue}\n onChange={(dateValue: Date | null) => handleDateSelect(dateValue)}\n showYearPicker={formatMeta.kind === 'year'}\n showMonthYearPicker={formatMeta.kind === 'yearMonth' || formatMeta.kind === 'month'}\n showTimeInput={formatMeta.kind === 'dateTime'}\n timeIntervals={config?.timeIntervals}\n dateFormat={getReactDatePickerDisplayFormat(formatMeta)}\n timeFormat={timeFormat}\n timeCaption={`${t('Common.시간')}: `}\n timeInputLabel={`${t('Common.시간')}: `}\n />\n )}\n </Paper>\n </ClickAwayListener>\n </Popper>\n ) : null;\n\n return {\n datePickerEditorElement,\n handleDatePickerEditorButtonClick,\n handleDatePickerEditorCellClick,\n handleDatePickerEditorKeyDown,\n handleDatePickerEditorStartEdit,\n };\n};\n"],"names":["registerLocale","ko","enUS","setDefaultLocale","ensureDayjsBrowserSetup","DATE_TIME_VALUE_FORMATTER","VALUE_DATE_FORMATTER","VALUE_TIME_FORMATTER","DATE_TIME_SECOND_VALUE_FORMATTER","VALUE_TIME_SECOND_FORMATTER","DATE_PICKER_EDITOR_COLUMNS_SEPARATOR","TREE_GRID_DATE_PICKER_EDITOR_CLASS","TREE_GRID_TIME_PICKER_EDITOR_CLASS","TREE_GRID_TIME_PICKER_EDITOR_BUTTON_HTML","DATE_PICKER_EDITOR_MONTH_FORMATTER","DATE_PICKER_EDITOR_DAY_FORMATTER","TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS","VALUE_YEAR_FORMATTER","VALUE_MONTH_FORMATTER","isDatePickerEditorEnabled","__name","config","normalizeTreeGridDateFormat","format","convertTreeGridDateFormatToDayjs","normalizedFormat","getDatePickerEditorFormatMeta","valueFormat","resolveDatePickerEditorFormatMeta","editorState","rowRecord","column","_a","treeGridFormat","formatDatePickerEditorInput","value","formatMeta","digits","year","month","date","hour","minute","second","isCompleteDatePickerEditorInput","resolvePartialDatePickerEditorInputValue","col","_b","dayjs","_d","_c","resolvePartialDatePickerEditorInputFormat","parseDatePickerEditorValue","normalizedValue","parsedValue","resolvedValue","resolvedFormat","getReactDatePickerDisplayFormat","isValidDatePickerEditorInput","hasDatePickerEditorSeconds","moveTreeGridDatePickerEditorFocusByTab","grid","isShiftKey","action","focusTreeGridDatePickerEditorCell","row","appendTreeGridClass","className","targetClassName","classNames","resolveDatePickerEditorInitialValue","cellElement","stringEditValue","stringValue","rawValue","textValue","normalizeDatePickerEditorInitialValue","formattedValue","isDatePickerEditorStartKey","key","event","keyboardEvent","isDatePickerEditorEventTarget","target","isTreeGridCanEditEnabled","isTreeGridCanEditDisabled","isDisplayTreeGridRow","isEditableDatePickerCell","columns","cellCanEdit","hasCellCanEdit","canEdit","configureTreeGridDatePickerColumns","useOwpTreeGridDatePickerEditor","treeGridInstanceRef","isTreeGridReady","onValueChange","t","i18n","useOwpTranslation","setEditorState","useState","inputDraftValue","setInputDraftValue","hasInputCommitError","setHasInputCommitError","editorInputRef","useRef","isClosingAfterCommitRef","enabled","columnsKey","useMemo","columnSet","languageId","datePickerLocale","adapterLocale","allowInput","useEffect","closeEditor","useCallback","openDatePickerEditor","rawEditorState","nextFormatMeta","baseEditorState","handleDatePickerEditorCellClick","_x","_y","handleDatePickerEditorButtonClick","handleDatePickerEditorKeyDown","handleDatePickerEditorStartEdit","selectedDateValue","parsedInputDraftValue","selectedTimeValue","draftDateValue","dateValue","anchorEl","popperContainer","handleDateSelect","nextValue","handleTimeSelect","selectedView","shouldClose","prevState","commitInputValue","commitInputDraftValue","closeEditorWithInputCommit","handleInputChange","commitEditorByKey","isTabKey","handleEditorCommitKeyDown","handleInputKeyDown","handleInputClear","handleEditorMouseEvent","handleEditorKeyboardEvent","inputValue","editorFocusGrid","editorFocusRow","editorFocusCol","hasInputError","hasSeconds","timePickerEditorWidth","TIME_PICKER_EDITOR_SECTION_WIDTH","timePickerViews","timeFormat","handleKeyDown","animationFrameId","jsx","Popper","ClickAwayListener","jsxs","Paper","OwpTextMaskField","PICKER_INVALID_INPUT_MESSAGE_KEY","getPickerInputMask","InputAdornment","IconButton","ClearIcon","LocalizationProvider","AdapterDayjs","MultiSectionDigitalClock","_selectionState","TIME_PICKER_SELECTED_ITEM_SX","TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH","ReactDatePicker"],"mappings":"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"}
1
+ {"version":3,"file":"useOwpTreeGridDatePickerEditor.js","sources":["../../../../../src/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.tsx"],"sourcesContent":["import {\n PICKER_INVALID_INPUT_MESSAGE_KEY,\n TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH,\n TIME_PICKER_EDITOR_SECTION_WIDTH,\n TIME_PICKER_SELECTED_ITEM_SX,\n VALUE_DATE_FORMATTER,\n VALUE_MONTH_FORMATTER,\n VALUE_TIME_FORMATTER,\n VALUE_TIME_SECOND_FORMATTER,\n VALUE_YEAR_FORMATTER,\n} from '@/components/OwpPicker/constants';\nimport { getPickerInputMask } from '@/components/OwpPicker/utils';\nimport { OwpTextMaskField, type OwpTextMaskFieldChangeEvent } from '@/components/OwpTextField';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Paper from '@mui/material/Paper';\nimport Popper, { type PopperProps } from '@mui/material/Popper';\nimport { LocalizationProvider, MultiSectionDigitalClock } from '@mui/x-date-pickers';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport { enUS } from 'date-fns/locale/en-US';\nimport { ko } from 'date-fns/locale/ko';\nimport dayjs, { type Dayjs } from '@/dayjs';\nimport {\n type MouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport ReactDatePicker, { registerLocale, setDefaultLocale } from 'react-datepicker';\nimport type { OwpTreeGridDatePickerEditorConfig, OwpTreeGridRowModel } from '../../OwpTreeGrid';\n\nregisterLocale('ko', ko);\nregisterLocale('en', enUS);\nsetDefaultLocale('ko');\n\nconst DATE_TIME_VALUE_FORMATTER = `${VALUE_DATE_FORMATTER} ${VALUE_TIME_FORMATTER}`;\nconst DATE_TIME_SECOND_VALUE_FORMATTER = `${VALUE_DATE_FORMATTER} ${VALUE_TIME_SECOND_FORMATTER}`;\nconst DATE_PICKER_EDITOR_COLUMNS_SEPARATOR = '\\u001f';\nconst TREE_GRID_DATE_PICKER_EDITOR_CLASS = 'OwpTreeGridDatePickerEditor';\nconst TREE_GRID_TIME_PICKER_EDITOR_CLASS = 'OwpTreeGridTimePickerEditor';\nconst TREE_GRID_TIME_PICKER_EDITOR_BUTTON_HTML =\n '<span class=\"OwpTreeGridTimePickerEditorIcon\" aria-hidden=\"true\"></span>';\nconst DATE_PICKER_EDITOR_MONTH_FORMATTER = 'MM';\nconst DATE_PICKER_EDITOR_DAY_FORMATTER = 'DD';\nconst TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS = new Map<\n string,\n OwpTreeGridDatePickerEditorValueFormat\n>([\n ['yyyy', VALUE_YEAR_FORMATTER],\n ['YYYY', VALUE_YEAR_FORMATTER],\n ['mm', DATE_PICKER_EDITOR_MONTH_FORMATTER],\n ['MM', DATE_PICKER_EDITOR_MONTH_FORMATTER],\n ['dd', DATE_PICKER_EDITOR_DAY_FORMATTER],\n ['DD', DATE_PICKER_EDITOR_DAY_FORMATTER],\n ['yyyy-mm', VALUE_MONTH_FORMATTER],\n ['YYYY-MM', VALUE_MONTH_FORMATTER],\n ['yyyy-mm-dd', VALUE_DATE_FORMATTER],\n ['YYYY-MM-DD', VALUE_DATE_FORMATTER],\n ['HH:mm', VALUE_TIME_FORMATTER],\n ['HH:mm:ss', VALUE_TIME_SECOND_FORMATTER],\n ['yyyy-mm-dd HH:mm', DATE_TIME_VALUE_FORMATTER],\n ['YYYY-MM-DD HH:mm', DATE_TIME_VALUE_FORMATTER],\n ['yyyy-mm-dd HH:mm:ss', DATE_TIME_SECOND_VALUE_FORMATTER],\n ['YYYY-MM-DD HH:mm:ss', DATE_TIME_SECOND_VALUE_FORMATTER],\n]);\ntype OwpTreeGridDatePickerEditorValueFormat =\n | typeof VALUE_YEAR_FORMATTER\n | typeof DATE_PICKER_EDITOR_MONTH_FORMATTER\n | typeof VALUE_MONTH_FORMATTER\n | typeof DATE_PICKER_EDITOR_DAY_FORMATTER\n | typeof VALUE_DATE_FORMATTER\n | typeof VALUE_TIME_FORMATTER\n | typeof VALUE_TIME_SECOND_FORMATTER\n | typeof DATE_TIME_VALUE_FORMATTER\n | typeof DATE_TIME_SECOND_VALUE_FORMATTER;\n\ntype OwpTreeGridDatePickerEditorKind =\n | 'year'\n | 'month'\n | 'day'\n | 'yearMonth'\n | 'date'\n | 'time'\n | 'dateTime';\n\ntype OwpTreeGridDatePickerEditorFormatMeta = {\n kind: OwpTreeGridDatePickerEditorKind;\n valueFormat: OwpTreeGridDatePickerEditorValueFormat;\n inputLength: number;\n digitLength: number;\n};\n\ntype TreeGridDatePickerColumn = TCol & {\n OnClickSide?: string;\n OnClickSideDate?: string;\n};\n\ntype TreeGridDatePickerEditorState<T> = {\n grid: TGrid;\n row: OwpTreeGridRowModel<T>;\n col: string;\n anchorRect: DOMRect;\n value?: string;\n};\n\ninterface UseOwpTreeGridDatePickerEditorParams<T> {\n config?: OwpTreeGridDatePickerEditorConfig;\n treeGridInstanceRef: RefObject<TGrid>;\n isTreeGridReady: boolean;\n onValueChange?: (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string, value: string) => void;\n}\n\n/** DatePicker editor 활성 여부 */\nconst isDatePickerEditorEnabled = (config?: OwpTreeGridDatePickerEditorConfig) =>\n config?.enabled !== false;\n\n/** TreeGrid 날짜 포맷 정규화 */\nconst normalizeTreeGridDateFormat = (format?: string) => format?.trim().replace(/\\s+/g, ' ');\n\n/** TreeGrid 날짜 포맷 Dayjs 변환 */\nconst convertTreeGridDateFormatToDayjs = (format?: string) => {\n const normalizedFormat = normalizeTreeGridDateFormat(format);\n\n if (!normalizedFormat) {\n return null;\n }\n\n return (\n TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS.get(normalizedFormat) ??\n TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS.get(normalizedFormat.toLowerCase()) ??\n null\n );\n};\n\n/** DatePicker editor 포맷 메타 */\nconst getDatePickerEditorFormatMeta = (\n valueFormat: OwpTreeGridDatePickerEditorValueFormat,\n): OwpTreeGridDatePickerEditorFormatMeta => {\n switch (valueFormat) {\n case VALUE_YEAR_FORMATTER:\n return { kind: 'year', valueFormat, inputLength: 4, digitLength: 4 };\n case DATE_PICKER_EDITOR_MONTH_FORMATTER:\n return { kind: 'month', valueFormat, inputLength: 2, digitLength: 2 };\n case VALUE_MONTH_FORMATTER:\n return { kind: 'yearMonth', valueFormat, inputLength: 7, digitLength: 6 };\n case DATE_PICKER_EDITOR_DAY_FORMATTER:\n return { kind: 'day', valueFormat, inputLength: 2, digitLength: 2 };\n case VALUE_TIME_FORMATTER:\n return { kind: 'time', valueFormat, inputLength: 5, digitLength: 4 };\n case VALUE_TIME_SECOND_FORMATTER:\n return { kind: 'time', valueFormat, inputLength: 8, digitLength: 6 };\n case DATE_TIME_VALUE_FORMATTER:\n return { kind: 'dateTime', valueFormat, inputLength: 16, digitLength: 12 };\n case DATE_TIME_SECOND_VALUE_FORMATTER:\n return { kind: 'dateTime', valueFormat, inputLength: 19, digitLength: 14 };\n default:\n return { kind: 'date', valueFormat, inputLength: 10, digitLength: 8 };\n }\n};\n\n/** DatePicker editor 컬럼 포맷 메타 */\nconst resolveDatePickerEditorFormatMeta = <T,>(\n editorState: TreeGridDatePickerEditorState<T> | null,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (!editorState) {\n return getDatePickerEditorFormatMeta(VALUE_DATE_FORMATTER);\n }\n\n const rowRecord = editorState.row as Record<string, unknown>;\n const column = editorState.grid.Cols?.[editorState.col];\n const treeGridFormat =\n rowRecord[`${editorState.col}EditFormat`] ??\n rowRecord[`${editorState.col}Format`] ??\n column?.EditFormat ??\n column?.Format;\n const valueFormat =\n convertTreeGridDateFormatToDayjs(\n typeof treeGridFormat === 'string' ? treeGridFormat : undefined,\n ) ??\n (config?.showTimeInput || config?.showTimeSelect\n ? DATE_TIME_VALUE_FORMATTER\n : VALUE_DATE_FORMATTER);\n\n return getDatePickerEditorFormatMeta(valueFormat);\n};\n\n/** DatePicker editor 입력 마스크 */\nconst formatDatePickerEditorInput = (\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n) => {\n const digits = value.replace(/\\D/g, '').slice(0, formatMeta.digitLength);\n const year = digits.slice(0, 4);\n const month = digits.slice(4, 6);\n const date = digits.slice(6, 8);\n const hour = digits.slice(8, 10);\n const minute = digits.slice(10, 12);\n const second = digits.slice(12, 14);\n\n switch (formatMeta.kind) {\n case 'year':\n case 'month':\n case 'day':\n return digits;\n case 'yearMonth':\n return [year, month].filter(Boolean).join('-');\n case 'time':\n return [digits.slice(0, 2), digits.slice(2, 4), digits.slice(4, 6)].filter(Boolean).join(':');\n case 'dateTime':\n return (\n [year, month, date].filter(Boolean).join('-') +\n (hour ? ` ${hour}` : '') +\n (minute ? `:${minute}` : '') +\n (second ? `:${second}` : '')\n );\n default:\n return [year, month, date].filter(Boolean).join('-');\n }\n};\n\n/** DatePicker editor 입력 완성 여부 */\nconst isCompleteDatePickerEditorInput = (\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n) => value.length === formatMeta.inputLength;\n\n/** DatePicker editor 단독 월/일 파싱 값 */\nconst resolvePartialDatePickerEditorInputValue = (\n col: string,\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (formatMeta.kind === 'month') {\n return `${config?.columnOptions?.[col]?.baseYear ?? dayjs().format(VALUE_YEAR_FORMATTER)}-${value}`;\n }\n\n if (formatMeta.kind === 'day') {\n return `${config?.columnOptions?.[col]?.baseYearMonth ?? dayjs().format(VALUE_MONTH_FORMATTER)}-${value}`;\n }\n\n return value;\n};\n\n/** DatePicker editor 단독 월/일 파싱 포맷 */\nconst resolvePartialDatePickerEditorInputFormat = (\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n) => {\n if (formatMeta.kind === 'month') {\n return VALUE_MONTH_FORMATTER;\n }\n\n if (formatMeta.kind === 'day') {\n return VALUE_DATE_FORMATTER;\n }\n\n return formatMeta.valueFormat;\n};\n\n/** DatePicker editor 선택 값 파싱 */\nconst parseDatePickerEditorValue = (\n col: string,\n value: string | undefined,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (!value) {\n return null;\n }\n\n if (formatMeta.kind === 'year') {\n const normalizedValue = `${value}-01-01`;\n const parsedValue = dayjs(normalizedValue, VALUE_DATE_FORMATTER, true);\n return parsedValue.isValid() && parsedValue.format(VALUE_DATE_FORMATTER) === normalizedValue\n ? parsedValue\n : null;\n }\n\n if (formatMeta.kind === 'yearMonth') {\n const normalizedValue = `${value}-01`;\n const parsedValue = dayjs(normalizedValue, VALUE_DATE_FORMATTER, true);\n return parsedValue.isValid() && parsedValue.format(VALUE_DATE_FORMATTER) === normalizedValue\n ? parsedValue\n : null;\n }\n\n const resolvedValue = resolvePartialDatePickerEditorInputValue(col, value, formatMeta, config);\n const resolvedFormat = resolvePartialDatePickerEditorInputFormat(formatMeta);\n const parsedValue = dayjs(resolvedValue, resolvedFormat, true);\n\n return parsedValue.isValid() && parsedValue.format(resolvedFormat) === resolvedValue\n ? parsedValue\n : null;\n};\n\n/** DatePicker editor react-datepicker 표시 포맷 */\nconst getReactDatePickerDisplayFormat = (formatMeta: OwpTreeGridDatePickerEditorFormatMeta) => {\n switch (formatMeta.kind) {\n case 'year':\n return 'yyyy';\n case 'month':\n return 'MM';\n case 'yearMonth':\n return 'yyyy-MM';\n case 'day':\n return 'dd';\n case 'dateTime':\n return formatMeta.valueFormat === DATE_TIME_SECOND_VALUE_FORMATTER\n ? 'yyyy-MM-dd HH:mm:ss'\n : 'yyyy-MM-dd HH:mm';\n default:\n return 'yyyy-MM-dd';\n }\n};\n\n/** DatePicker editor 입력 유효 여부 */\nconst isValidDatePickerEditorInput = (\n col: string,\n value: string,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) =>\n isCompleteDatePickerEditorInput(value, formatMeta) &&\n Boolean(parseDatePickerEditorValue(col, value, formatMeta, config));\n\n/** DatePicker editor 초 포함 여부 */\nconst hasDatePickerEditorSeconds = (formatMeta: OwpTreeGridDatePickerEditorFormatMeta) =>\n formatMeta.valueFormat === VALUE_TIME_SECOND_FORMATTER ||\n formatMeta.valueFormat === DATE_TIME_SECOND_VALUE_FORMATTER;\n\n/** DatePicker editor Tab 포커스 이동 */\nconst moveTreeGridDatePickerEditorFocusByTab = (grid: TGrid, isShiftKey: boolean) => {\n const action = isShiftKey ? grid.ActionTabLeft : grid.ActionTabRight;\n\n action?.call(grid, 1, 0);\n};\n\n/** DatePicker editor 대상 셀 포커스 */\nconst focusTreeGridDatePickerEditorCell = (grid: TGrid, row: TRow, col: string) => {\n grid.Focus(row, col, undefined, undefined, 1);\n};\n\n/** TreeGrid class 병합 */\nconst appendTreeGridClass = (className: string | undefined, targetClassName: string) => {\n const classNames = className?.split(/\\s+/).filter(Boolean) ?? [];\n\n if (classNames.includes(targetClassName)) {\n return className;\n }\n\n return [...classNames, targetClassName].join(' ');\n};\n\n/** DatePicker editor 초기 표시 값 */\nconst resolveDatePickerEditorInitialValue = (\n grid: TGrid,\n row: TRow,\n col: string,\n cellElement: HTMLElement,\n) => {\n const stringEditValue = grid.GetStringEdit?.(row, col);\n const stringValue = grid.GetString?.(row, col);\n const rawValue = grid.GetValue?.(row, col);\n const textValue = cellElement.textContent?.trim();\n\n return String(stringEditValue || stringValue || textValue || rawValue || '');\n};\n\n/** DatePicker editor 초기 입력 값 정규화 */\nconst normalizeDatePickerEditorInitialValue = (\n col: string,\n value: string | undefined,\n formatMeta: OwpTreeGridDatePickerEditorFormatMeta,\n config?: OwpTreeGridDatePickerEditorConfig,\n) => {\n if (!value) {\n return '';\n }\n\n if (isValidDatePickerEditorInput(col, value, formatMeta, config)) {\n return value;\n }\n\n const formattedValue = formatDatePickerEditorInput(value, formatMeta);\n\n return isValidDatePickerEditorInput(col, formattedValue, formatMeta, config)\n ? formattedValue\n : value;\n};\n\n/** DatePicker editor 키보드 시작 키 여부 */\nconst isDatePickerEditorStartKey = (key: string, event: Event) => {\n const keyboardEvent = event as KeyboardEvent;\n\n if (keyboardEvent.ctrlKey || keyboardEvent.altKey || keyboardEvent.metaKey) {\n return false;\n }\n\n return (\n /^\\d$/.test(key) ||\n /^\\d$/.test(keyboardEvent.key) ||\n key === 'F2' ||\n key === 'Backspace' ||\n key === 'Delete' ||\n keyboardEvent.key === 'F2' ||\n keyboardEvent.key === 'Backspace' ||\n keyboardEvent.key === 'Delete'\n );\n};\n\n/** DatePicker editor 내부 이벤트 여부 */\nconst isDatePickerEditorEventTarget = (event: Event) => {\n const target = event.target;\n\n return (\n target instanceof Element && Boolean(target.closest(`.${TREE_GRID_DATE_PICKER_EDITOR_CLASS}`))\n );\n};\n\n/** TreeGrid CanEdit 명시 활성 여부 */\nconst isTreeGridCanEditEnabled = (value: unknown) => value === 1 || value === '1';\n\n/** TreeGrid CanEdit 명시 비활성 여부 */\nconst isTreeGridCanEditDisabled = (value: unknown) =>\n value === 0 || value === '0' || value === false;\n\n/** TreeGrid 표시 행 여부 */\nconst isDisplayTreeGridRow = (row: TRow | null | undefined) => {\n if (!row || row.Fixed === 'Foot') {\n return false;\n }\n\n return row.Kind === 'Data' || isTreeGridCanEditEnabled((row as { Added?: unknown }).Added);\n};\n\n/** TreeGrid 날짜 셀 편집 가능 여부 */\nconst isEditableDatePickerCell = <T,>(\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n columns: ReadonlySet<string>,\n) => {\n if (columns.size > 0 && !columns.has(col)) {\n return false;\n }\n\n const column = grid.Cols?.[col];\n const cellCanEdit = (row as Record<string, unknown>)[`${col}CanEdit`];\n const hasCellCanEdit = cellCanEdit !== undefined && cellCanEdit !== null;\n const canEdit = hasCellCanEdit\n ? isTreeGridCanEditEnabled(cellCanEdit)\n : isTreeGridCanEditEnabled(column?.CanEdit);\n\n return (\n column?.Type === 'Date' &&\n isDisplayTreeGridRow(row) &&\n !isTreeGridCanEditDisabled(row.CanEdit) &&\n canEdit &&\n row.Deleted !== 1\n );\n};\n\n/** TreeGrid DatePicker editor 컬럼 설정 */\nconst configureTreeGridDatePickerColumns = (grid: TGrid | null, columns: readonly string[]) => {\n if (!grid) {\n return;\n }\n\n const targetColumns =\n columns.length > 0\n ? columns\n : Object.keys(grid.Cols ?? {}).filter((col) => grid.Cols?.[col]?.Type === 'Date');\n\n targetColumns.forEach((col) => {\n const column = grid.Cols?.[col] as TreeGridDatePickerColumn | undefined;\n\n if (!column || column.Type !== 'Date' || !isTreeGridCanEditEnabled(column.CanEdit)) {\n return;\n }\n\n column.AutoCalendar = 0;\n column.CalendarButtons = 0;\n\n const treeGridFormat = column.EditFormat ?? column.Format;\n const valueFormat =\n convertTreeGridDateFormatToDayjs(\n typeof treeGridFormat === 'string' ? treeGridFormat : undefined,\n ) ?? VALUE_DATE_FORMATTER;\n\n if (getDatePickerEditorFormatMeta(valueFormat).kind === 'time') {\n column.Button = 'Html';\n column.ButtonText = TREE_GRID_TIME_PICKER_EDITOR_BUTTON_HTML;\n column.OnClickSide = 'Focus';\n column.Class = appendTreeGridClass(column.Class, TREE_GRID_TIME_PICKER_EDITOR_CLASS);\n } else {\n column.Button = 'Date';\n column.OnClickSideDate = 'Focus';\n }\n });\n\n grid.Rerender?.(1, 1);\n};\n\n/** OwpTreeGrid Date 셀 React DatePicker editor */\nexport const useOwpTreeGridDatePickerEditor = <T,>({\n config,\n treeGridInstanceRef,\n isTreeGridReady,\n onValueChange,\n}: UseOwpTreeGridDatePickerEditorParams<T>) => {\n const { t, i18n } = useOwpTranslation();\n const [editorState, setEditorState] = useState<TreeGridDatePickerEditorState<T> | null>(null);\n const [inputDraftValue, setInputDraftValue] = useState('');\n const [hasInputCommitError, setHasInputCommitError] = useState(false);\n const editorInputRef = useRef<HTMLInputElement | null>(null);\n const isClosingAfterCommitRef = useRef(false);\n const enabled = isDatePickerEditorEnabled(config);\n const columnsKey = config?.columns?.join(DATE_PICKER_EDITOR_COLUMNS_SEPARATOR) ?? '';\n const columns = useMemo(\n () => (columnsKey ? columnsKey.split(DATE_PICKER_EDITOR_COLUMNS_SEPARATOR) : []),\n [columnsKey],\n );\n const columnSet = useMemo(() => new Set(columns), [columns]);\n const languageId = i18n.resolvedLanguage ?? i18n.language ?? 'kr';\n const datePickerLocale = languageId === 'kr' ? 'ko' : 'en';\n const adapterLocale = languageId === 'kr' ? 'ko' : 'en';\n const allowInput = config?.allowInput !== false;\n const formatMeta = useMemo(\n () => resolveDatePickerEditorFormatMeta(editorState, config),\n [config, editorState],\n );\n\n useEffect(() => {\n if (!enabled || !isTreeGridReady) {\n return;\n }\n\n configureTreeGridDatePickerColumns(treeGridInstanceRef.current, columns);\n }, [columns, enabled, isTreeGridReady, treeGridInstanceRef]);\n\n const closeEditor = useCallback(() => {\n setEditorState(null);\n }, []);\n\n const openDatePickerEditor = useCallback(\n (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string) => {\n focusTreeGridDatePickerEditorCell(grid, row, col);\n\n const cellElement = grid.GetCell(row, col) as HTMLElement | null;\n\n if (!cellElement) {\n return undefined;\n }\n\n const rawEditorState: TreeGridDatePickerEditorState<T> = {\n grid,\n row,\n col,\n anchorRect: cellElement.getBoundingClientRect(),\n value: resolveDatePickerEditorInitialValue(grid, row, col, cellElement),\n };\n const nextFormatMeta = resolveDatePickerEditorFormatMeta(rawEditorState, config);\n const baseEditorState = {\n ...rawEditorState,\n value: normalizeDatePickerEditorInitialValue(\n col,\n rawEditorState.value,\n nextFormatMeta,\n config,\n ),\n };\n isClosingAfterCommitRef.current = false;\n setHasInputCommitError(false);\n setInputDraftValue(baseEditorState.value ?? '');\n setEditorState(baseEditorState);\n\n return 1;\n },\n [config],\n );\n\n const handleDatePickerEditorCellClick = useCallback(\n (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n _x: number,\n _y: number,\n event: Event,\n ) => {\n if (!enabled || !isEditableDatePickerCell(grid, row, col, columnSet)) {\n closeEditor();\n return undefined;\n }\n\n grid.CloseDialog?.();\n event.preventDefault();\n event.stopPropagation();\n\n return openDatePickerEditor(grid, row, col);\n },\n [closeEditor, columnSet, enabled, openDatePickerEditor],\n );\n\n const handleDatePickerEditorButtonClick = useCallback(\n (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string, event: Event) => {\n if (!enabled || !isEditableDatePickerCell(grid, row, col, columnSet)) {\n return undefined;\n }\n\n grid.CloseDialog?.();\n event.preventDefault();\n event.stopPropagation();\n\n return openDatePickerEditor(grid, row, col);\n },\n [columnSet, enabled, openDatePickerEditor],\n );\n\n const handleDatePickerEditorKeyDown = useCallback(\n (grid: TGrid, key: string, event: Event) => {\n if (isDatePickerEditorEventTarget(event)) {\n return 1;\n }\n\n const row = (grid.FRow || grid.ARow) as OwpTreeGridRowModel<T> | null | undefined;\n const col = grid.FCol || grid.ACol;\n\n if (\n !enabled ||\n !row ||\n !col ||\n !isEditableDatePickerCell(grid, row, col, columnSet) ||\n !isDatePickerEditorStartKey(key, event)\n ) {\n return undefined;\n }\n\n grid.CloseDialog?.();\n event.preventDefault();\n event.stopPropagation();\n\n return openDatePickerEditor(grid, row, col);\n },\n [columnSet, enabled, openDatePickerEditor],\n );\n\n const handleDatePickerEditorStartEdit = useCallback(\n (grid: TGrid, row: OwpTreeGridRowModel<T>, col: string) => {\n if (!enabled || !isEditableDatePickerCell(grid, row, col, columnSet)) {\n return undefined;\n }\n\n grid.CloseDialog?.();\n openDatePickerEditor(grid, row, col);\n\n return true;\n },\n [columnSet, enabled, openDatePickerEditor],\n );\n\n const selectedDateValue = useMemo(() => {\n if (!editorState || formatMeta.kind === 'time') {\n return null;\n }\n\n const parsedInputDraftValue = isValidDatePickerEditorInput(\n editorState.col,\n inputDraftValue,\n formatMeta,\n config,\n )\n ? parseDatePickerEditorValue(editorState.col, inputDraftValue, formatMeta, config)\n : null;\n\n if (parsedInputDraftValue) {\n return parsedInputDraftValue.toDate();\n }\n\n return (\n parseDatePickerEditorValue(\n editorState.col,\n editorState.value,\n formatMeta,\n config,\n )?.toDate() ?? null\n );\n }, [config, editorState, formatMeta, inputDraftValue]);\n\n const selectedTimeValue = useMemo(() => {\n if (formatMeta.kind !== 'time') {\n return null;\n }\n\n const draftDateValue = dayjs(inputDraftValue, formatMeta.valueFormat, true);\n\n if (draftDateValue.isValid()) {\n return draftDateValue;\n }\n\n if (!editorState?.value) {\n return null;\n }\n\n const dateValue = dayjs(editorState.value, formatMeta.valueFormat, true);\n\n return dateValue.isValid() ? dateValue : null;\n }, [editorState?.value, formatMeta, inputDraftValue]);\n\n const anchorEl = useMemo<PopperProps['anchorEl']>(() => {\n if (!editorState) {\n return null;\n }\n\n return {\n getBoundingClientRect: () => editorState.anchorRect,\n };\n }, [editorState]);\n const popperContainer = useMemo(() => {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n return document.getElementById('calendar-portal') ?? undefined;\n }, []);\n\n const handleDateSelect = (dateValue: Date | null) => {\n if (!editorState) {\n return;\n }\n\n const nextValue = dateValue ? dayjs(dateValue).format(formatMeta.valueFormat) : '';\n isClosingAfterCommitRef.current = true;\n setInputDraftValue(nextValue);\n\n editorState.grid.SetString(editorState.row, editorState.col, nextValue, 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, nextValue);\n closeEditor();\n };\n\n const handleTimeSelect = (dateValue: Dayjs | null, selectedView?: string) => {\n if (!editorState) {\n return;\n }\n\n const nextValue = dateValue?.isValid() ? dateValue.format(formatMeta.valueFormat) : '';\n const shouldClose =\n selectedView === (hasDatePickerEditorSeconds(formatMeta) ? 'seconds' : 'minutes');\n\n if (shouldClose) {\n isClosingAfterCommitRef.current = true;\n }\n\n setInputDraftValue(nextValue);\n editorState.grid.SetString(editorState.row, editorState.col, nextValue, 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, nextValue);\n setEditorState((prevState) => (prevState ? { ...prevState, value: nextValue } : prevState));\n\n if (shouldClose) {\n closeEditor();\n }\n };\n\n const commitInputValue = useCallback(\n (nextValue: string) => {\n if (!editorState) {\n return;\n }\n\n editorState.grid.SetString(editorState.row, editorState.col, nextValue, 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, nextValue);\n },\n [editorState, onValueChange],\n );\n\n const commitInputDraftValue = useCallback(() => {\n if (\n !editorState ||\n (inputDraftValue !== '' &&\n !isValidDatePickerEditorInput(editorState.col, inputDraftValue, formatMeta, config))\n ) {\n if (editorState && inputDraftValue) {\n setHasInputCommitError(true);\n }\n\n return false;\n }\n\n isClosingAfterCommitRef.current = true;\n setHasInputCommitError(false);\n commitInputValue(inputDraftValue);\n\n return true;\n }, [commitInputValue, config, editorState, formatMeta, inputDraftValue]);\n\n const closeEditorWithInputCommit = useCallback(() => {\n commitInputDraftValue();\n closeEditor();\n }, [closeEditor, commitInputDraftValue]);\n\n const handleInputChange = (event: OwpTextMaskFieldChangeEvent) => {\n if (!editorState) {\n return;\n }\n\n setInputDraftValue(event.target.value);\n setHasInputCommitError(false);\n };\n\n const commitEditorByKey = useCallback(\n (key: string, isShiftKey: boolean) => {\n if (!editorState || (key !== 'Enter' && key !== 'Tab') || !commitInputDraftValue()) {\n return false;\n }\n\n const { grid } = editorState;\n const isTabKey = key === 'Tab';\n\n closeEditor();\n\n if (isTabKey) {\n window.requestAnimationFrame(() => {\n moveTreeGridDatePickerEditorFocusByTab(grid, isShiftKey);\n });\n }\n\n return true;\n },\n [closeEditor, commitInputDraftValue, editorState],\n );\n\n const handleEditorCommitKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLElement>) => {\n if (event.key !== 'Enter' && event.key !== 'Tab') {\n return;\n }\n\n event.preventDefault();\n commitEditorByKey(event.key, event.shiftKey);\n },\n [commitEditorByKey],\n );\n\n const handleInputKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n event.stopPropagation();\n event.nativeEvent.stopImmediatePropagation();\n\n handleEditorCommitKeyDown(event);\n };\n\n const handleInputClear = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!editorState) {\n return;\n }\n\n isClosingAfterCommitRef.current = true;\n editorState.grid.SetString(editorState.row, editorState.col, '', 1);\n onValueChange?.(editorState.grid, editorState.row, editorState.col, '');\n setInputDraftValue('');\n setHasInputCommitError(false);\n setEditorState((prevState) => (prevState ? { ...prevState, value: '' } : prevState));\n };\n\n const handleEditorMouseEvent = (event: MouseEvent) => {\n event.stopPropagation();\n };\n\n const handleEditorKeyboardEvent = (event: ReactKeyboardEvent<HTMLElement>) => {\n event.stopPropagation();\n event.nativeEvent.stopImmediatePropagation();\n handleEditorCommitKeyDown(event);\n };\n\n const inputValue = inputDraftValue;\n const editorFocusGrid = editorState?.grid;\n const editorFocusRow = editorState?.row;\n const editorFocusCol = editorState?.col;\n const hasInputError =\n hasInputCommitError &&\n !isClosingAfterCommitRef.current &&\n Boolean(inputValue) &&\n !isValidDatePickerEditorInput(editorState?.col ?? '', inputValue, formatMeta, config);\n const hasSeconds = hasDatePickerEditorSeconds(formatMeta);\n const timePickerEditorWidth = TIME_PICKER_EDITOR_SECTION_WIDTH * (hasSeconds ? 3 : 2);\n const timePickerViews = hasSeconds\n ? (['hours', 'minutes', 'seconds'] as const)\n : (['hours', 'minutes'] as const);\n const timeFormat = hasSeconds ? VALUE_TIME_SECOND_FORMATTER : VALUE_TIME_FORMATTER;\n\n useEffect(() => {\n if (!editorState) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeEditor();\n return;\n }\n\n if (event.key !== 'Enter' && event.key !== 'Tab') {\n return;\n }\n\n if (!isDatePickerEditorEventTarget(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n commitEditorByKey(event.key, event.shiftKey);\n };\n\n window.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown, true);\n };\n }, [closeEditor, commitEditorByKey, editorState]);\n\n useEffect(() => {\n if (!editorFocusGrid || !editorFocusRow || !editorFocusCol || !allowInput) {\n return undefined;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n editorInputRef.current?.focus();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [allowInput, editorFocusCol, editorFocusGrid, editorFocusRow]);\n\n const datePickerEditorElement = editorState ? (\n <Popper\n open\n anchorEl={anchorEl}\n container={popperContainer}\n placement=\"bottom-start\"\n sx={{ zIndex: 1400 }}\n >\n <ClickAwayListener onClickAway={closeEditorWithInputCommit}>\n <Paper\n className={TREE_GRID_DATE_PICKER_EDITOR_CLASS}\n elevation={8}\n onClick={handleEditorMouseEvent}\n onKeyDown={handleEditorKeyboardEvent}\n onKeyUp={handleEditorKeyboardEvent}\n onMouseDown={handleEditorMouseEvent}\n sx={{\n borderRadius: 1,\n lineHeight: 0,\n overflow: 'hidden',\n width: formatMeta.kind === 'time' ? timePickerEditorWidth : 'auto',\n '& .react-datepicker': {\n border: 0,\n display: 'block',\n lineHeight: 'normal',\n },\n '& .react-datepicker__month-container': {\n float: 'none',\n },\n '& .react-datepicker__month': {\n marginBottom: 0,\n },\n }}\n >\n {allowInput && (\n <OwpTextMaskField\n autoFocus\n inputRef={editorInputRef}\n fullWidth\n size=\"small\"\n variant=\"outlined\"\n value={inputValue}\n error={hasInputError}\n helperText={hasInputError ? t(PICKER_INVALID_INPUT_MESSAGE_KEY) : undefined}\n color={isClosingAfterCommitRef.current ? 'primary' : undefined}\n mask={getPickerInputMask(formatMeta.valueFormat)}\n placeholder={formatMeta.valueFormat}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n inputProps={{\n inputMode: 'numeric',\n 'aria-label': formatMeta.valueFormat,\n }}\n endAdornment={\n <InputAdornment\n position=\"end\"\n sx={{\n marginLeft: 0,\n }}\n >\n <IconButton\n size=\"small\"\n aria-label=\"clear-date-picker-editor-value\"\n disabled={!inputValue}\n onClick={handleInputClear}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n sx={{\n margin: 0,\n padding: 0.25,\n }}\n >\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n }\n sx={{\n boxSizing: 'border-box',\n width: formatMeta.kind === 'time' ? timePickerEditorWidth : '100%',\n px: 1,\n py: 1,\n '& .MuiOutlinedInput-root': {\n borderRadius: 0.75,\n fontSize: 13,\n paddingRight: 0.5,\n },\n }}\n />\n )}\n {formatMeta.kind === 'time' ? (\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale={adapterLocale}>\n <MultiSectionDigitalClock\n ampm={false}\n value={selectedTimeValue}\n views={timePickerViews}\n onChange={(dateValue, _selectionState, selectedView) =>\n handleTimeSelect(dateValue, selectedView)\n }\n timeSteps={{\n minutes: config?.timeIntervals ?? 1,\n seconds: 1,\n }}\n slotProps={{\n digitalClockSectionItem: {\n sx: TIME_PICKER_SELECTED_ITEM_SX,\n },\n }}\n sx={{\n border: 0,\n width: timePickerEditorWidth,\n '& .MuiMultiSectionDigitalClockSection-root': {\n border: 0,\n boxSizing: 'border-box',\n width: TIME_PICKER_EDITOR_SECTION_WIDTH,\n flex: `0 0 ${TIME_PICKER_EDITOR_SECTION_WIDTH}px`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n },\n '& .MuiMultiSectionDigitalClockSection-item': {\n alignSelf: 'stretch',\n boxSizing: 'border-box',\n width: TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH,\n minWidth: TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH,\n justifyContent: 'center',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n }}\n />\n </LocalizationProvider>\n ) : (\n <ReactDatePicker\n inline\n locale={datePickerLocale}\n selected={selectedDateValue}\n onChange={(dateValue: Date | null) => handleDateSelect(dateValue)}\n showYearPicker={formatMeta.kind === 'year'}\n showMonthYearPicker={formatMeta.kind === 'yearMonth' || formatMeta.kind === 'month'}\n showTimeInput={formatMeta.kind === 'dateTime'}\n timeIntervals={config?.timeIntervals}\n dateFormat={getReactDatePickerDisplayFormat(formatMeta)}\n timeFormat={timeFormat}\n timeCaption={`${t('Common.시간')}: `}\n timeInputLabel={`${t('Common.시간')}: `}\n />\n )}\n </Paper>\n </ClickAwayListener>\n </Popper>\n ) : null;\n\n return {\n datePickerEditorElement,\n handleDatePickerEditorButtonClick,\n handleDatePickerEditorCellClick,\n handleDatePickerEditorKeyDown,\n handleDatePickerEditorStartEdit,\n };\n};\n"],"names":["registerLocale","ko","enUS","setDefaultLocale","DATE_TIME_VALUE_FORMATTER","VALUE_DATE_FORMATTER","VALUE_TIME_FORMATTER","DATE_TIME_SECOND_VALUE_FORMATTER","VALUE_TIME_SECOND_FORMATTER","DATE_PICKER_EDITOR_COLUMNS_SEPARATOR","TREE_GRID_DATE_PICKER_EDITOR_CLASS","TREE_GRID_TIME_PICKER_EDITOR_CLASS","TREE_GRID_TIME_PICKER_EDITOR_BUTTON_HTML","DATE_PICKER_EDITOR_MONTH_FORMATTER","DATE_PICKER_EDITOR_DAY_FORMATTER","TREE_GRID_DATE_PICKER_SUPPORTED_FORMATS","VALUE_YEAR_FORMATTER","VALUE_MONTH_FORMATTER","isDatePickerEditorEnabled","__name","config","normalizeTreeGridDateFormat","format","convertTreeGridDateFormatToDayjs","normalizedFormat","getDatePickerEditorFormatMeta","valueFormat","resolveDatePickerEditorFormatMeta","editorState","rowRecord","column","_a","treeGridFormat","formatDatePickerEditorInput","value","formatMeta","digits","year","month","date","hour","minute","second","isCompleteDatePickerEditorInput","resolvePartialDatePickerEditorInputValue","col","_b","dayjs","_d","_c","resolvePartialDatePickerEditorInputFormat","parseDatePickerEditorValue","normalizedValue","parsedValue","resolvedValue","resolvedFormat","getReactDatePickerDisplayFormat","isValidDatePickerEditorInput","hasDatePickerEditorSeconds","moveTreeGridDatePickerEditorFocusByTab","grid","isShiftKey","action","focusTreeGridDatePickerEditorCell","row","appendTreeGridClass","className","targetClassName","classNames","resolveDatePickerEditorInitialValue","cellElement","stringEditValue","stringValue","rawValue","textValue","normalizeDatePickerEditorInitialValue","formattedValue","isDatePickerEditorStartKey","key","event","keyboardEvent","isDatePickerEditorEventTarget","target","isTreeGridCanEditEnabled","isTreeGridCanEditDisabled","isDisplayTreeGridRow","isEditableDatePickerCell","columns","cellCanEdit","hasCellCanEdit","canEdit","configureTreeGridDatePickerColumns","useOwpTreeGridDatePickerEditor","treeGridInstanceRef","isTreeGridReady","onValueChange","t","i18n","useOwpTranslation","setEditorState","useState","inputDraftValue","setInputDraftValue","hasInputCommitError","setHasInputCommitError","editorInputRef","useRef","isClosingAfterCommitRef","enabled","columnsKey","useMemo","columnSet","languageId","datePickerLocale","adapterLocale","allowInput","useEffect","closeEditor","useCallback","openDatePickerEditor","rawEditorState","nextFormatMeta","baseEditorState","handleDatePickerEditorCellClick","_x","_y","handleDatePickerEditorButtonClick","handleDatePickerEditorKeyDown","handleDatePickerEditorStartEdit","selectedDateValue","parsedInputDraftValue","selectedTimeValue","draftDateValue","dateValue","anchorEl","popperContainer","handleDateSelect","nextValue","handleTimeSelect","selectedView","shouldClose","prevState","commitInputValue","commitInputDraftValue","closeEditorWithInputCommit","handleInputChange","commitEditorByKey","isTabKey","handleEditorCommitKeyDown","handleInputKeyDown","handleInputClear","handleEditorMouseEvent","handleEditorKeyboardEvent","inputValue","editorFocusGrid","editorFocusRow","editorFocusCol","hasInputError","hasSeconds","timePickerEditorWidth","TIME_PICKER_EDITOR_SECTION_WIDTH","timePickerViews","timeFormat","handleKeyDown","animationFrameId","jsx","Popper","ClickAwayListener","jsxs","Paper","OwpTextMaskField","PICKER_INVALID_INPUT_MESSAGE_KEY","getPickerInputMask","InputAdornment","IconButton","ClearIcon","LocalizationProvider","AdapterDayjs","MultiSectionDigitalClock","_selectionState","TIME_PICKER_SELECTED_ITEM_SX","TIME_PICKER_EDITOR_SECTION_ITEM_WIDTH","ReactDatePicker"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  var ne = Object.defineProperty;
2
2
  var c = (e, t) => ne(e, "name", { value: t, configurable: !0 });
3
3
  import { getTreeGridTextResourceUrl as re, TREEGRID_CELL_CHANGED_CLASS as W, TREEGRID_CELL_HIGHLIGHT_COLOR as oe, resolveTreeGridColorNumber as ie } from "../../../constants/treeGrid.js";
4
- import { isTreeGridRowAddedById as A, getTreeGridAddedRowHighlightColumns as v, normalizeTreeGridExternalRows as ue, getTreeGridCellComparableValue as j, clearTreeGridCellHighlightById as ce, removeTreeGridAddedRowHighlightColumn as se, highlightTreeGridCellById as de, appendTreeGridAddedRowHighlightColumn as fe, getTreeGridAddedRowBaselineValue as ae } from "../../../utils/treeGridUtil.js";
4
+ import { isTreeGridRowAddedById as A, getTreeGridAddedRowHighlightColumns as v, getTreeGridCellComparableValue as j, clearTreeGridCellHighlightById as ue, removeTreeGridAddedRowHighlightColumn as ce, highlightTreeGridCellById as se, appendTreeGridAddedRowHighlightColumn as de, getTreeGridAddedRowBaselineValue as fe, normalizeTreeGridExternalRows as ae } from "../../../utils/treeGridUtil.js";
5
5
  import { applyTreeGridLayoutToGrid as Ge } from "./treeGridLayout.js";
6
6
  import { countTreeGridPerf as z, logTreeGridPerf as Te, measureTreeGridPerf as Y } from "./utils/perf.js";
7
7
  import { debounce as m } from "../../../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/function/debounce.js";
8
- import { get as le } from "../../../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/object/get.js";
9
- import { isEmpty as Ee } from "../../../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/predicate/isEmpty.js";
8
+ import { isEmpty as le } from "../../../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/predicate/isEmpty.js";
9
+ import { get as Ee } from "../../../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/object/get.js";
10
10
  const ut = 300, Ce = 3, he = {
11
11
  1: {
12
12
  onEnter: "TabDownEdit",
@@ -81,7 +81,7 @@ const ut = 300, Ce = 3, he = {
81
81
  }
82
82
  e.DeleteRowT(t, 3);
83
83
  }
84
- }, "applyTreeGridBeforeRowUndeleteAction"), Be = /* @__PURE__ */ c((e, t, n) => e ? { Url: Oe(t) } : { Data: { Body: [Ee(n) ? [] : n] } }, "buildTreeGridDataSource"), ct = /* @__PURE__ */ c(({
84
+ }, "applyTreeGridBeforeRowUndeleteAction"), Be = /* @__PURE__ */ c((e, t, n) => e ? { Url: Oe(t) } : { Data: { Body: [le(n) ? [] : n] } }, "buildTreeGridDataSource"), ct = /* @__PURE__ */ c(({
85
85
  id: e,
86
86
  layoutUrl: t,
87
87
  layoutData: n,
@@ -101,7 +101,7 @@ const ut = 300, Ce = 3, he = {
101
101
  width: E,
102
102
  height: h,
103
103
  Debug: "Error"
104
- }), "buildTreeGridInitializationOptions"), x = /* @__PURE__ */ c((e) => le(e, "Data.Data.Data.Body.0"), "getTreeGridBodyData"), M = /* @__PURE__ */ c((e) => {
104
+ }), "buildTreeGridInitializationOptions"), x = /* @__PURE__ */ c((e) => Ee(e, "Data.Data.Data.Body.0"), "getTreeGridBodyData"), M = /* @__PURE__ */ c((e) => {
105
105
  if (typeof e == "number")
106
106
  return Number.isFinite(e) && e > 0 ? e : void 0;
107
107
  if (typeof e != "string")
@@ -176,7 +176,7 @@ const ut = 300, Ce = 3, he = {
176
176
  if (r != null && r.has(n))
177
177
  return r.get(n);
178
178
  if (A(t))
179
- return ae(t, n) ?? "";
179
+ return fe(t, n) ?? "";
180
180
  }, "resolveTreeGridCellBaselineValue"), Me = /* @__PURE__ */ c(({
181
181
  gridId: e,
182
182
  grid: t,
@@ -189,14 +189,14 @@ const ut = 300, Ce = 3, he = {
189
189
  return;
190
190
  const E = xe(G, n, r), h = j(t, n, r);
191
191
  if (E !== void 0 && h === E) {
192
- ce(e, { row: n, col: r }), Ve(t, n, r), A(n) && se(n, r);
192
+ ue(e, { row: n, col: r }), Ve(t, n, r), A(n) && ce(n, r);
193
193
  return;
194
194
  }
195
- de(e, {
195
+ se(e, {
196
196
  row: n,
197
197
  col: r,
198
198
  backgroundColor: s
199
- }), A(n) && fe(n, r);
199
+ }), A(n) && de(n, r);
200
200
  }, "syncTreeGridChangedCellHighlight"), $e = /* @__PURE__ */ c((e, t, n) => !t || !n || !_(t) ? !1 : e.CanEdit(t, n) === 1, "isEditableTreeGridCell"), Pe = /* @__PURE__ */ c((e, t, n) => {
201
201
  const r = e.GetAttribute(t, n, "Color");
202
202
  return r != null && r !== "";
@@ -472,7 +472,7 @@ const ut = 300, Ce = 3, he = {
472
472
  const i = o.GetSelRows() ?? [];
473
473
  (d = (u = t.current) == null ? void 0 : u.onSelect) == null || d.call(
474
474
  u,
475
- ue(o, i)
475
+ ae(o, i)
476
476
  );
477
477
  }, 100)
478
478
  ), typeof (T == null ? void 0 : T.onSave) == "function" && window.TGSetEvent("OnSave", e, (o, i, u) => {
@@ -3,10 +3,10 @@ var u = (n, l) => r(n, "name", { value: l, configurable: !0 });
3
3
  import { jsx as e, jsxs as C } from "../node_modules/.pnpm/@emotion_react@11.14.0_@types_react@19.2.14_react@19.2.4/node_modules/@emotion/react/jsx-runtime/dist/emotion-react-jsx-runtime.browser.esm.js";
4
4
  import { OwpAutoLogoutDialog as d } from "../components/OwpAutoLogoutDialog/OwpAutoLogoutDialog.js";
5
5
  import { OwpSnackbarContent as m } from "../components/OwpSnackbarContent/OwpSnackbarContent.js";
6
- import { useAccessTokenGuard as h } from "../hooks/useAccessTokenGuard.js";
7
- import { useGetCurrentLanguage as S } from "../hooks/useCurrentLanguage.js";
8
- import { useOwpTranslation as w } from "../hooks/useOwpTranslation.js";
9
- import { useGetPageLockLoading as O } from "../hooks/usePageLockLoading.js";
6
+ import { useAccessTokenGuard as h } from "../hooks/internal/useAccessTokenGuard.js";
7
+ import { useGetCurrentLanguage as S } from "../hooks/internal/useCurrentLanguage.js";
8
+ import { useGetPageLockLoading as w } from "../hooks/usePageLockLoading.js";
9
+ import { useOwpTranslation as O } from "../hooks/useOwpTranslation.js";
10
10
  import { getI18nextLanguageCode as x } from "../utils/language.js";
11
11
  import I from "../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/Close.js";
12
12
  import T from "@mui/material/IconButton";
@@ -53,7 +53,7 @@ function b({
53
53
  dialogsProviderProps: l,
54
54
  snackbarProviderProps: t
55
55
  }) {
56
- const { env: o } = E(), f = S(), { i18n: c } = w(), s = O(), a = h(), L = {
56
+ const { env: o } = E(), f = S(), { i18n: c } = O(), s = w(), a = h(), L = {
57
57
  ...i,
58
58
  ...t,
59
59
  style: {
@@ -1 +1 @@
1
- {"version":3,"file":"OwpUiProvider.js","sources":["../../src/contexts/OwpUiProvider.tsx"],"sourcesContent":["import { OwpAutoLogoutDialog } from '@/components/OwpAutoLogoutDialog/OwpAutoLogoutDialog';\nimport { OwpLoading } from '@/components/OwpLoading';\nimport { OwpPageLockLoading } from '@/components/OwpPageLockLoading';\nimport { OwpSnackbarContent } from '@/components/OwpSnackbarContent/OwpSnackbarContent';\nimport {\n useAccessTokenGuard,\n useGetCurrentLanguage,\n useGetPageLockLoading,\n useOwpTranslation,\n} from '@/hooks';\nimport { getI18nextLanguageCode } from '@/utils/language';\nimport CloseIcon from '@mui/icons-material/Close';\nimport IconButton from '@mui/material/IconButton';\nimport { DialogsProvider } from '@toolpad/core/useDialogs';\nimport { closeSnackbar, SnackbarKey, SnackbarProvider } from 'notistack';\nimport { ComponentProps, ReactNode, useEffect } from 'react';\nimport { useOwpAppContext } from './OwpAppProvider';\n\ntype OwpDialogsProviderProps = Omit<ComponentProps<typeof DialogsProvider>, 'children'>;\ntype OwpSnackbarProviderProps = Omit<ComponentProps<typeof SnackbarProvider>, 'children'>;\n\nconst defaultSnackbarComponents = {\n default: OwpSnackbarContent,\n success: OwpSnackbarContent,\n info: OwpSnackbarContent,\n warning: OwpSnackbarContent,\n error: OwpSnackbarContent,\n} satisfies NonNullable<OwpSnackbarProviderProps['Components']>;\n\nexport interface OwpUiProviderProps {\n children?: ReactNode;\n dialogsProviderProps?: OwpDialogsProviderProps;\n snackbarProviderProps?: OwpSnackbarProviderProps;\n}\n\nconst defaultSnackbarProviderProps: OwpSnackbarProviderProps = {\n maxSnack: 5,\n autoHideDuration: 3000,\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'center',\n },\n style: {\n fontSize: '1.25rem',\n lineHeight: '1.75rem',\n },\n classes: {\n containerRoot: 'bottom-0 right-0 mb-52 md:mb-68 mr-8 lg:mr-80',\n },\n Components: defaultSnackbarComponents,\n action: (snackbarKey: SnackbarKey) => (\n <IconButton\n aria-label=\"close\"\n onClick={() => closeSnackbar(snackbarKey)}\n size=\"small\"\n sx={{ color: 'inherit' }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n ),\n};\n\n/**\n * Dialog, snackbar provider composition\n * @param dialogsProviderProps DialogsProvider 옵션\n * @param snackbarProviderProps SnackbarProvider 옵션\n */\nexport function OwpUiProvider({\n children,\n dialogsProviderProps,\n snackbarProviderProps,\n}: OwpUiProviderProps) {\n const { env } = useOwpAppContext();\n const currentLanguage = useGetCurrentLanguage();\n const { i18n } = useOwpTranslation();\n const pageLockLoadingProps = useGetPageLockLoading();\n const shouldRedirectToLogin = useAccessTokenGuard();\n const resolvedSnackbarProviderProps: OwpSnackbarProviderProps = {\n ...defaultSnackbarProviderProps,\n ...snackbarProviderProps,\n style: {\n ...defaultSnackbarProviderProps.style,\n ...snackbarProviderProps?.style,\n },\n classes: {\n ...defaultSnackbarProviderProps.classes,\n ...snackbarProviderProps?.classes,\n },\n Components: {\n ...defaultSnackbarProviderProps.Components,\n ...snackbarProviderProps?.Components,\n },\n action: snackbarProviderProps?.action ?? defaultSnackbarProviderProps.action,\n };\n const resolvedAutoLogoutIdleTimeoutMs = Number(env?.autoLogoutIdleTimeoutMs);\n const autoLogoutIdleTimeoutMs = Number.isFinite(resolvedAutoLogoutIdleTimeoutMs)\n ? resolvedAutoLogoutIdleTimeoutMs\n : undefined;\n\n useEffect(() => {\n if (!env?.isI18nEnabled) {\n return;\n }\n\n void i18n.changeLanguage(getI18nextLanguageCode());\n }, [currentLanguage, env, i18n]);\n\n if (shouldRedirectToLogin) {\n return <OwpLoading />;\n }\n\n return (\n <DialogsProvider {...dialogsProviderProps}>\n <SnackbarProvider {...resolvedSnackbarProviderProps}>\n {children}\n <OwpPageLockLoading {...pageLockLoadingProps} />\n {env?.isAutoLogoutEnabled && <OwpAutoLogoutDialog timeout={autoLogoutIdleTimeoutMs} />}\n </SnackbarProvider>\n </DialogsProvider>\n );\n}\n"],"names":["defaultSnackbarComponents","OwpSnackbarContent","defaultSnackbarProviderProps","__name","snackbarKey","jsx","IconButton","closeSnackbar","CloseIcon","OwpUiProvider","children","dialogsProviderProps","snackbarProviderProps","env","useOwpAppContext","currentLanguage","useGetCurrentLanguage","i18n","useOwpTranslation","pageLockLoadingProps","useGetPageLockLoading","shouldRedirectToLogin","useAccessTokenGuard","resolvedSnackbarProviderProps","resolvedAutoLogoutIdleTimeoutMs","autoLogoutIdleTimeoutMs","useEffect","getI18nextLanguageCode","OwpLoading","DialogsProvider","jsxs","SnackbarProvider","OwpPageLockLoading","OwpAutoLogoutDialog"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAMA,IAA4B;AAAA,EAChC,SAASC;AAAA,EACT,SAASA;AAAA,EACT,MAAMA;AAAA,EACN,SAASA;AAAA,EACT,OAAOA;AACT,GAQMC,IAAyD;AAAA,EAC7D,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,OAAO;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,eAAe;AAAA,EAAA;AAAA,EAEjB,YAAYF;AAAA,EACZ,QAAQ,gBAAAG,EAAA,CAACC,MACP,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,SAAS,gBAAAH,EAAA,MAAMI,EAAcH,CAAW,GAA/B;AAAA,MACT,MAAK;AAAA,MACL,IAAI,EAAE,OAAO,UAAA;AAAA,MAEb,UAAA,gBAAAC,EAACG,GAAA,EAAU,UAAS,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA,GAPxB;AAUV;AAOO,SAASC,EAAc;AAAA,EAC5B,UAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,uBAAAC;AACF,GAAuB;AACrB,QAAM,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACVC,IAAkBC,EAAA,GAClB,EAAE,MAAAC,EAAA,IAASC,EAAA,GACXC,IAAuBC,EAAA,GACvBC,IAAwBC,EAAA,GACxBC,IAA0D;AAAA,IAC9D,GAAGrB;AAAA,IACH,GAAGU;AAAA,IACH,OAAO;AAAA,MACL,GAAGV,EAA6B;AAAA,MAChC,GAAGU,KAAA,gBAAAA,EAAuB;AAAA,IAAA;AAAA,IAE5B,SAAS;AAAA,MACP,GAAGV,EAA6B;AAAA,MAChC,GAAGU,KAAA,gBAAAA,EAAuB;AAAA,IAAA;AAAA,IAE5B,YAAY;AAAA,MACV,GAAGV,EAA6B;AAAA,MAChC,GAAGU,KAAA,gBAAAA,EAAuB;AAAA,IAAA;AAAA,IAE5B,SAAQA,KAAA,gBAAAA,EAAuB,WAAUV,EAA6B;AAAA,EAAA,GAElEsB,IAAkC,OAAOX,KAAA,gBAAAA,EAAK,uBAAuB,GACrEY,IAA0B,OAAO,SAASD,CAA+B,IAC3EA,IACA;AAUJ,SARAE,EAAU,MAAM;AACd,IAAKb,KAAA,QAAAA,EAAK,iBAILI,EAAK,eAAeU,GAAwB;AAAA,EACnD,GAAG,CAACZ,GAAiBF,GAAKI,CAAI,CAAC,GAE3BI,sBACMO,GAAA,EAAW,sBAIlBC,GAAA,EAAiB,GAAGlB,GACnB,UAAA,gBAAAmB,EAACC,GAAA,EAAkB,GAAGR,GACnB,UAAA;AAAA,IAAAb;AAAA,IACD,gBAAAL,EAAC2B,GAAA,EAAoB,GAAGb,GAAsB;AAAA,KAC7CN,KAAA,gBAAAA,EAAK,wBAAuB,gBAAAR,EAAC4B,GAAA,EAAoB,SAASR,EAAA,CAAyB;AAAA,EAAA,EAAA,CACtF,EAAA,CACF;AAEJ;AArDgBtB,EAAAM,GAAA;"}
1
+ {"version":3,"file":"OwpUiProvider.js","sources":["../../src/contexts/OwpUiProvider.tsx"],"sourcesContent":["import { OwpAutoLogoutDialog } from '@/components/OwpAutoLogoutDialog/OwpAutoLogoutDialog';\nimport { OwpLoading } from '@/components/OwpLoading';\nimport { OwpPageLockLoading } from '@/components/OwpPageLockLoading';\nimport { OwpSnackbarContent } from '@/components/OwpSnackbarContent/OwpSnackbarContent';\nimport { useAccessTokenGuard } from '@/hooks/internal/useAccessTokenGuard';\nimport { useGetCurrentLanguage } from '@/hooks/internal/useCurrentLanguage';\nimport { useGetPageLockLoading } from '@/hooks/usePageLockLoading';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { getI18nextLanguageCode } from '@/utils/language';\nimport CloseIcon from '@mui/icons-material/Close';\nimport IconButton from '@mui/material/IconButton';\nimport { DialogsProvider } from '@toolpad/core/useDialogs';\nimport { closeSnackbar, SnackbarKey, SnackbarProvider } from 'notistack';\nimport { ComponentProps, ReactNode, useEffect } from 'react';\nimport { useOwpAppContext } from './OwpAppProvider';\n\ntype OwpDialogsProviderProps = Omit<ComponentProps<typeof DialogsProvider>, 'children'>;\ntype OwpSnackbarProviderProps = Omit<ComponentProps<typeof SnackbarProvider>, 'children'>;\n\nconst defaultSnackbarComponents = {\n default: OwpSnackbarContent,\n success: OwpSnackbarContent,\n info: OwpSnackbarContent,\n warning: OwpSnackbarContent,\n error: OwpSnackbarContent,\n} satisfies NonNullable<OwpSnackbarProviderProps['Components']>;\n\nexport interface OwpUiProviderProps {\n children?: ReactNode;\n dialogsProviderProps?: OwpDialogsProviderProps;\n snackbarProviderProps?: OwpSnackbarProviderProps;\n}\n\nconst defaultSnackbarProviderProps: OwpSnackbarProviderProps = {\n maxSnack: 5,\n autoHideDuration: 3000,\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'center',\n },\n style: {\n fontSize: '1.25rem',\n lineHeight: '1.75rem',\n },\n classes: {\n containerRoot: 'bottom-0 right-0 mb-52 md:mb-68 mr-8 lg:mr-80',\n },\n Components: defaultSnackbarComponents,\n action: (snackbarKey: SnackbarKey) => (\n <IconButton\n aria-label=\"close\"\n onClick={() => closeSnackbar(snackbarKey)}\n size=\"small\"\n sx={{ color: 'inherit' }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n ),\n};\n\n/**\n * Dialog, snackbar provider composition\n * @param dialogsProviderProps DialogsProvider 옵션\n * @param snackbarProviderProps SnackbarProvider 옵션\n */\nexport function OwpUiProvider({\n children,\n dialogsProviderProps,\n snackbarProviderProps,\n}: OwpUiProviderProps) {\n const { env } = useOwpAppContext();\n const currentLanguage = useGetCurrentLanguage();\n const { i18n } = useOwpTranslation();\n const pageLockLoadingProps = useGetPageLockLoading();\n const shouldRedirectToLogin = useAccessTokenGuard();\n const resolvedSnackbarProviderProps: OwpSnackbarProviderProps = {\n ...defaultSnackbarProviderProps,\n ...snackbarProviderProps,\n style: {\n ...defaultSnackbarProviderProps.style,\n ...snackbarProviderProps?.style,\n },\n classes: {\n ...defaultSnackbarProviderProps.classes,\n ...snackbarProviderProps?.classes,\n },\n Components: {\n ...defaultSnackbarProviderProps.Components,\n ...snackbarProviderProps?.Components,\n },\n action: snackbarProviderProps?.action ?? defaultSnackbarProviderProps.action,\n };\n const resolvedAutoLogoutIdleTimeoutMs = Number(env?.autoLogoutIdleTimeoutMs);\n const autoLogoutIdleTimeoutMs = Number.isFinite(resolvedAutoLogoutIdleTimeoutMs)\n ? resolvedAutoLogoutIdleTimeoutMs\n : undefined;\n\n useEffect(() => {\n if (!env?.isI18nEnabled) {\n return;\n }\n\n void i18n.changeLanguage(getI18nextLanguageCode());\n }, [currentLanguage, env, i18n]);\n\n if (shouldRedirectToLogin) {\n return <OwpLoading />;\n }\n\n return (\n <DialogsProvider {...dialogsProviderProps}>\n <SnackbarProvider {...resolvedSnackbarProviderProps}>\n {children}\n <OwpPageLockLoading {...pageLockLoadingProps} />\n {env?.isAutoLogoutEnabled && <OwpAutoLogoutDialog timeout={autoLogoutIdleTimeoutMs} />}\n </SnackbarProvider>\n </DialogsProvider>\n );\n}\n"],"names":["defaultSnackbarComponents","OwpSnackbarContent","defaultSnackbarProviderProps","__name","snackbarKey","jsx","IconButton","closeSnackbar","CloseIcon","OwpUiProvider","children","dialogsProviderProps","snackbarProviderProps","env","useOwpAppContext","currentLanguage","useGetCurrentLanguage","i18n","useOwpTranslation","pageLockLoadingProps","useGetPageLockLoading","shouldRedirectToLogin","useAccessTokenGuard","resolvedSnackbarProviderProps","resolvedAutoLogoutIdleTimeoutMs","autoLogoutIdleTimeoutMs","useEffect","getI18nextLanguageCode","OwpLoading","DialogsProvider","jsxs","SnackbarProvider","OwpPageLockLoading","OwpAutoLogoutDialog"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,MAAMA,IAA4B;AAAA,EAChC,SAASC;AAAA,EACT,SAASA;AAAA,EACT,MAAMA;AAAA,EACN,SAASA;AAAA,EACT,OAAOA;AACT,GAQMC,IAAyD;AAAA,EAC7D,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,OAAO;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,eAAe;AAAA,EAAA;AAAA,EAEjB,YAAYF;AAAA,EACZ,QAAQ,gBAAAG,EAAA,CAACC,MACP,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,SAAS,gBAAAH,EAAA,MAAMI,EAAcH,CAAW,GAA/B;AAAA,MACT,MAAK;AAAA,MACL,IAAI,EAAE,OAAO,UAAA;AAAA,MAEb,UAAA,gBAAAC,EAACG,GAAA,EAAU,UAAS,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA,GAPxB;AAUV;AAOO,SAASC,EAAc;AAAA,EAC5B,UAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,uBAAAC;AACF,GAAuB;AACrB,QAAM,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACVC,IAAkBC,EAAA,GAClB,EAAE,MAAAC,EAAA,IAASC,EAAA,GACXC,IAAuBC,EAAA,GACvBC,IAAwBC,EAAA,GACxBC,IAA0D;AAAA,IAC9D,GAAGrB;AAAA,IACH,GAAGU;AAAA,IACH,OAAO;AAAA,MACL,GAAGV,EAA6B;AAAA,MAChC,GAAGU,KAAA,gBAAAA,EAAuB;AAAA,IAAA;AAAA,IAE5B,SAAS;AAAA,MACP,GAAGV,EAA6B;AAAA,MAChC,GAAGU,KAAA,gBAAAA,EAAuB;AAAA,IAAA;AAAA,IAE5B,YAAY;AAAA,MACV,GAAGV,EAA6B;AAAA,MAChC,GAAGU,KAAA,gBAAAA,EAAuB;AAAA,IAAA;AAAA,IAE5B,SAAQA,KAAA,gBAAAA,EAAuB,WAAUV,EAA6B;AAAA,EAAA,GAElEsB,IAAkC,OAAOX,KAAA,gBAAAA,EAAK,uBAAuB,GACrEY,IAA0B,OAAO,SAASD,CAA+B,IAC3EA,IACA;AAUJ,SARAE,EAAU,MAAM;AACd,IAAKb,KAAA,QAAAA,EAAK,iBAILI,EAAK,eAAeU,GAAwB;AAAA,EACnD,GAAG,CAACZ,GAAiBF,GAAKI,CAAI,CAAC,GAE3BI,sBACMO,GAAA,EAAW,sBAIlBC,GAAA,EAAiB,GAAGlB,GACnB,UAAA,gBAAAmB,EAACC,GAAA,EAAkB,GAAGR,GACnB,UAAA;AAAA,IAAAb;AAAA,IACD,gBAAAL,EAAC2B,GAAA,EAAoB,GAAGb,GAAsB;AAAA,KAC7CN,KAAA,gBAAAA,EAAK,wBAAuB,gBAAAR,EAAC4B,GAAA,EAAoB,SAASR,EAAA,CAAyB;AAAA,EAAA,EAAA,CACtF,EAAA,CACF;AAEJ;AArDgBtB,EAAAM,GAAA;"}
@@ -1,7 +1,7 @@
1
1
  var f = Object.defineProperty;
2
2
  var u = (e, t) => f(e, "name", { value: t, configurable: !0 });
3
- import { STORAGE_ACCESS_TOKEN_KEY as A } from "../constants/localStorageKeys.js";
4
- import { useOwpAppContext as E } from "../contexts/OwpAppProvider.js";
3
+ import { STORAGE_ACCESS_TOKEN_KEY as A } from "../../constants/localStorageKeys.js";
4
+ import { useOwpAppContext as E } from "../../contexts/OwpAppProvider.js";
5
5
  import { useRef as l, useEffect as p } from "react";
6
6
  import { useLocation as T, useNavigate as m } from "react-router-dom";
7
7
  const _ = "/auth/login", G = "Message.로그인이 필요합니다.", N = /* @__PURE__ */ u(({
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAccessTokenGuard.js","sources":["../../../src/hooks/internal/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,7 +1,7 @@
1
1
  var n = Object.defineProperty;
2
2
  var e = (t, o) => n(t, "name", { value: o, configurable: !0 });
3
- import { STORAGE_KEYS as a } from "../constants/storageKeys.js";
4
- import { useOwpTranslation as u } from "./useOwpTranslation.js";
3
+ import { STORAGE_KEYS as a } from "../../constants/storageKeys.js";
4
+ import { useOwpTranslation as u } from "../useOwpTranslation.js";
5
5
  import { useAtomValue as m, useSetAtom as g } from "jotai";
6
6
  import { atomWithStorage as i } from "jotai/utils";
7
7
  const r = i(a.currentLanguage, {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCurrentLanguage.js","sources":["../../../src/hooks/internal/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;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHeaderWrapState.js","sources":["../../../src/hooks/internal/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;"}
@@ -0,0 +1,24 @@
1
+ var v = Object.defineProperty;
2
+ var n = (e, t) => v(e, "name", { value: t, configurable: !0 });
3
+ import { useSetAtom as o, useAtomValue as d } from "jotai";
4
+ import { navbarToggleFoldedAtom as g, navbarOpenFoldedAtom as i, navbarCloseFoldedAtom as p, navbarToggleMobileAtom as u, navbarOpenMobileAtom as F, navbarCloseMobileAtom as M, navbarOpenAtom as C, navbarCloseAtom as N, navbarToggleAtom as O, resetNavbarAtom as T, navbarStateAtom as f } from "../../store/atoms/navbarAtoms.js";
5
+ const V = /* @__PURE__ */ n(() => d(f), "useGetNavbar"), h = /* @__PURE__ */ n(() => {
6
+ const e = o(g), t = o(i), a = o(p), l = o(u), s = o(F), r = o(M), b = o(C), m = o(N), c = o(O), A = o(T);
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavbar.js","sources":["../../../src/hooks/internal/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,6 +1,6 @@
1
1
  var h = Object.defineProperty;
2
2
  var a = (e, o) => h(e, "name", { value: o, configurable: !0 });
3
- import { useOwpAppContext as R } from "../contexts/OwpAppProvider.js";
3
+ import { useOwpAppContext as R } from "../../contexts/OwpAppProvider.js";
4
4
  import { useAtomValue as p, atom as v, useSetAtom as A } from "jotai";
5
5
  import { useMemo as l } from "react";
6
6
  import { useLocation as f, useResolvedPath as g, createPath as u } from "react-router-dom";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavigationActiveRouteRemount.js","sources":["../../../src/hooks/internal/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;"}
@@ -1,9 +1,9 @@
1
1
  var u = Object.defineProperty;
2
2
  var t = (o, e) => u(o, "name", { value: e, configurable: !0 });
3
- import { STORAGE_KEYS as s } from "../constants/storageKeys.js";
4
- import { useAtomValue as m, useSetAtom as c } from "jotai";
3
+ import { STORAGE_KEYS as s } from "../../constants/storageKeys.js";
4
+ import { useSetAtom as m, useAtomValue as c } from "jotai";
5
5
  import { atomWithStorage as S } from "jotai/utils";
6
- const r = S(s.currentShortcuts, []), A = /* @__PURE__ */ t(() => m(r), "useGetShortcuts"), a = /* @__PURE__ */ t(() => c(r), "useSetShortcuts");
6
+ const r = S(s.currentShortcuts, []), A = /* @__PURE__ */ t(() => c(r), "useGetShortcuts"), a = /* @__PURE__ */ t(() => m(r), "useSetShortcuts");
7
7
  export {
8
8
  A as useGetShortcuts,
9
9
  a as useSetShortcuts
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShortcuts.js","sources":["../../../src/hooks/internal/useShortcuts.ts"],"sourcesContent":["import { STORAGE_KEYS } from '@/constants/storageKeys';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { atomWithStorage } from 'jotai/utils';\n\nconst currentShortcutsAtom = atomWithStorage<Array<string> | []>(STORAGE_KEYS.currentShortcuts, []);\n\n/**\n * 바로가기 목록 조회 훅\n */\nexport const useGetShortcuts = () => {\n return useAtomValue(currentShortcutsAtom);\n};\n\n/**\n * 바로가기 목록 설정 훅\n */\nexport const useSetShortcuts = () => {\n return useSetAtom(currentShortcutsAtom);\n};\n"],"names":["currentShortcutsAtom","atomWithStorage","STORAGE_KEYS","useGetShortcuts","__name","useAtomValue","useSetShortcuts","useSetAtom"],"mappings":";;;;;AAIA,MAAMA,IAAuBC,EAAoCC,EAAa,kBAAkB,CAAA,CAAE,GAKrFC,IAAkB,gBAAAC,EAAA,MACtBC,EAAaL,CAAoB,GADX,oBAOlBM,IAAkB,gBAAAF,EAAA,MACtBG,EAAWP,CAAoB,GADT;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThemeMediaQuery.js","sources":["../../../src/hooks/internal/useThemeMediaQuery.ts"],"sourcesContent":["import { useTheme, type Theme } from '@mui/material/styles';\nimport { useEffect, useState } from 'react';\n\n/**\n * The useThemeMediaQuery function is a custom hook that returns a boolean indicating whether the current screen matches the specified media query.\n * It takes in a themeCallbackFunc as a parameter, which is a function that returns a string representing the media query to match.\n * It returns a boolean indicating whether the current screen matches the specified media query.\n */\nexport function useThemeMediaQuery(themeCallbackFunc: (theme: Theme) => string) {\n const theme = useTheme();\n\n const query = themeCallbackFunc(theme).replace('@media ', '');\n\n \n function getMatches(q: string) {\n return window.matchMedia(q).matches;\n }\n\n const [matches, setMatches] = useState(getMatches(query));\n\n useEffect(\n () => {\n const mediaQuery = window.matchMedia(query);\n\n \n setMatches(getMatches(query));\n\n \n const handler = (event: MediaQueryListEvent) => setMatches(event.matches);\n\n \n mediaQuery.addEventListener('change', handler);\n\n \n return () => mediaQuery.removeEventListener('change', handler);\n },\n [query], \n );\n\n return matches;\n}\n"],"names":["useThemeMediaQuery","themeCallbackFunc","theme","useTheme","query","getMatches","q","__name","matches","setMatches","useState","useEffect","mediaQuery","handler","event"],"mappings":";;;;AAQO,SAASA,EAAmBC,GAA6C;AAC9E,QAAMC,IAAQC,EAAA,GAERC,IAAQH,EAAkBC,CAAK,EAAE,QAAQ,WAAW,EAAE;AAG5D,WAASG,EAAWC,GAAW;AAC7B,WAAO,OAAO,WAAWA,CAAC,EAAE;AAAA,EAC9B;AAFS,EAAAC,EAAAF,GAAA;AAIT,QAAM,CAACG,GAASC,CAAU,IAAIC,EAASL,EAAWD,CAAK,CAAC;AAExD,SAAAO;AAAA,IACE,MAAM;AACJ,YAAMC,IAAa,OAAO,WAAWR,CAAK;AAG1C,MAAAK,EAAWJ,EAAWD,CAAK,CAAC;AAG5B,YAAMS,IAAU,gBAAAN,EAAA,CAACO,MAA+BL,EAAWK,EAAM,OAAO,GAAxD;AAGhB,aAAAF,EAAW,iBAAiB,UAAUC,CAAO,GAGtC,MAAMD,EAAW,oBAAoB,UAAUC,CAAO;AAAA,IAC/D;AAAA,IACA,CAACT,CAAK;AAAA,EAAA,GAGDI;AACT;AAhCgBD,EAAAP,GAAA;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTimeout.js","sources":["../../../src/hooks/internal/useTimeout.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/**\n * The useTimeout function is a custom hook that sets a timeout for a given callback function.\n * It takes in a callback function and a delay time in milliseconds as parameters.\n * It returns nothing.\n */\nexport function useTimeout(callback: () => void, delay: number) {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n let timer: NodeJS.Timeout | undefined;\n\n if (delay !== null && callback && typeof callback === 'function') {\n timer = setTimeout(callbackRef.current, delay);\n }\n\n return () => {\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, [callback, delay]);\n}\n"],"names":["useTimeout","callback","delay","callbackRef","useRef","useEffect","timer","__name"],"mappings":";;;AAOO,SAASA,EAAWC,GAAsBC,GAAe;AAC9D,QAAMC,IAAcC,EAAOH,CAAQ;AAEnC,EAAAI,EAAU,MAAM;AACd,IAAAF,EAAY,UAAUF;AAAA,EACxB,GAAG,CAACA,CAAQ,CAAC,GAEbI,EAAU,MAAM;AACd,QAAIC;AAEJ,WAAIJ,MAAU,QAAQD,KAAY,OAAOA,KAAa,eACpDK,IAAQ,WAAWH,EAAY,SAASD,CAAK,IAGxC,MAAM;AACX,MAAII,KACF,aAAaA,CAAK;AAAA,IAEtB;AAAA,EACF,GAAG,CAACL,GAAUC,CAAK,CAAC;AACtB;AApBgBK,EAAAP,GAAA;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useInitApp.js","sources":["../../src/hooks/useInitApp.ts"],"sourcesContent":["import { useOwpAppContext } from '@/contexts/OwpAppProvider';\nimport { ensureDayjsBrowserSetup } from '@/utils/dayjsBrowser';\nimport { useEffect, useRef } from 'react';\nimport { useInitCommonCodes } from './internal/useInitCommonCodes';\nimport { usePageLockLoading } from './usePageLockLoading';\nimport { useSetLogoSrc } from './useLogoSrc';\nimport { useSetNavigationList } from './useNavigation';\n\nexport interface UseInitAppOptions {\n logoSrc: string;\n title?: string;\n}\n\nensureDayjsBrowserSetup();\n\n/**\n * 앱 기본 상태 초기화 훅\n * @param logoSrc 초기 로고 경로\n * @param title 문서 제목\n */\nexport const useInitApp = ({ logoSrc, title }: UseInitAppOptions) => {\n const initialLogoSrc = useRef(logoSrc);\n const initialTitle = useRef(title);\n const { env, navigationConfig } = useOwpAppContext();\n const setLogoSrc = useSetLogoSrc();\n const setNavigationList = useSetNavigationList();\n const { setLoading } = usePageLockLoading();\n\n useInitCommonCodes();\n\n useEffect(() => {\n setLogoSrc(initialLogoSrc.current);\n\n if (initialTitle.current) {\n document.title = initialTitle.current;\n }\n\n setLoading({\n loading: false,\n });\n\n if (!env?.isBackendNavigationEnabled) {\n setNavigationList(navigationConfig);\n }\n }, [env, navigationConfig, setLoading, setLogoSrc, setNavigationList]);\n};\n"],"names":["ensureDayjsBrowserSetup","useInitApp","__name","logoSrc","title","initialLogoSrc","useRef","initialTitle","env","navigationConfig","useOwpAppContext","setLogoSrc","useSetLogoSrc","setNavigationList","useSetNavigationList","setLoading","usePageLockLoading","useInitCommonCodes","useEffect"],"mappings":";;;;;;;;;AAaAA,EAAA;AAOO,MAAMC,IAAa,gBAAAC,EAAA,CAAC,EAAE,SAAAC,GAAS,OAAAC,QAA+B;AACnE,QAAMC,IAAiBC,EAAOH,CAAO,GAC/BI,IAAeD,EAAOF,CAAK,GAC3B,EAAE,KAAAI,GAAK,kBAAAC,EAAA,IAAqBC,EAAA,GAC5BC,IAAaC,EAAA,GACbC,IAAoBC,EAAA,GACpB,EAAE,YAAAC,EAAA,IAAeC,EAAA;AAEvB,EAAAC,EAAA,GAEAC,EAAU,MAAM;AACd,IAAAP,EAAWN,EAAe,OAAO,GAE7BE,EAAa,YACf,SAAS,QAAQA,EAAa,UAGhCQ,EAAW;AAAA,MACT,SAAS;AAAA,IAAA,CACV,GAEIP,KAAA,QAAAA,EAAK,8BACRK,EAAkBJ,CAAgB;AAAA,EAEtC,GAAG,CAACD,GAAKC,GAAkBM,GAAYJ,GAAYE,CAAiB,CAAC;AACvE,GAzB0B;"}
1
+ {"version":3,"file":"useInitApp.js","sources":["../../src/hooks/useInitApp.ts"],"sourcesContent":["import { useOwpAppContext } from '@/contexts/OwpAppProvider';\nimport { ensureDayjsBrowserSetup } from '@/dayjs';\nimport { useEffect, useRef } from 'react';\nimport { useInitCommonCodes } from './internal/useInitCommonCodes';\nimport { usePageLockLoading } from './usePageLockLoading';\nimport { useSetLogoSrc } from './useLogoSrc';\nimport { useSetNavigationList } from './useNavigation';\n\nexport interface UseInitAppOptions {\n logoSrc: string;\n title?: string;\n}\n\nensureDayjsBrowserSetup();\n\n/**\n * 앱 기본 상태 초기화 훅\n * @param logoSrc 초기 로고 경로\n * @param title 문서 제목\n */\nexport const useInitApp = ({ logoSrc, title }: UseInitAppOptions) => {\n const initialLogoSrc = useRef(logoSrc);\n const initialTitle = useRef(title);\n const { env, navigationConfig } = useOwpAppContext();\n const setLogoSrc = useSetLogoSrc();\n const setNavigationList = useSetNavigationList();\n const { setLoading } = usePageLockLoading();\n\n useInitCommonCodes();\n\n useEffect(() => {\n setLogoSrc(initialLogoSrc.current);\n\n if (initialTitle.current) {\n document.title = initialTitle.current;\n }\n\n setLoading({\n loading: false,\n });\n\n if (!env?.isBackendNavigationEnabled) {\n setNavigationList(navigationConfig);\n }\n }, [env, navigationConfig, setLoading, setLogoSrc, setNavigationList]);\n};\n"],"names":["ensureDayjsBrowserSetup","useInitApp","__name","logoSrc","title","initialLogoSrc","useRef","initialTitle","env","navigationConfig","useOwpAppContext","setLogoSrc","useSetLogoSrc","setNavigationList","useSetNavigationList","setLoading","usePageLockLoading","useInitCommonCodes","useEffect"],"mappings":";;;;;;;;;AAaAA,EAAA;AAOO,MAAMC,IAAa,gBAAAC,EAAA,CAAC,EAAE,SAAAC,GAAS,OAAAC,QAA+B;AACnE,QAAMC,IAAiBC,EAAOH,CAAO,GAC/BI,IAAeD,EAAOF,CAAK,GAC3B,EAAE,KAAAI,GAAK,kBAAAC,EAAA,IAAqBC,EAAA,GAC5BC,IAAaC,EAAA,GACbC,IAAoBC,EAAA,GACpB,EAAE,YAAAC,EAAA,IAAeC,EAAA;AAEvB,EAAAC,EAAA,GAEAC,EAAU,MAAM;AACd,IAAAP,EAAWN,EAAe,OAAO,GAE7BE,EAAa,YACf,SAAS,QAAQA,EAAa,UAGhCQ,EAAW;AAAA,MACT,SAAS;AAAA,IAAA,CACV,GAEIP,KAAA,QAAAA,EAAK,8BACRK,EAAkBJ,CAAgB;AAAA,EAEtC,GAAG,CAACD,GAAKC,GAAkBM,GAAYJ,GAAYE,CAAiB,CAAC;AACvE,GAzB0B;"}