@owp/core 2.2.2 → 2.2.4

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 (68) 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/OwpMrtTable/OwpMrtTable.js +252 -201
  8. package/dist/components/OwpMrtTable/OwpMrtTable.js.map +1 -1
  9. package/dist/components/OwpMrtTable/OwpMrtTableNoDataOverlay.js +53 -0
  10. package/dist/components/OwpMrtTable/OwpMrtTableNoDataOverlay.js.map +1 -0
  11. package/dist/components/OwpPageTitle/OwpPageTitle.js +74 -18
  12. package/dist/components/OwpPageTitle/OwpPageTitle.js.map +1 -1
  13. package/dist/components/OwpSearchFilter/OwpSearchFilter.js +44 -29
  14. package/dist/components/OwpSearchFilter/OwpSearchFilter.js.map +1 -1
  15. package/dist/components/OwpSection/OwpSection.js +104 -43
  16. package/dist/components/OwpSection/OwpSection.js.map +1 -1
  17. package/dist/components/OwpTreeGrid/OwpTreeGrid.js +291 -192
  18. package/dist/components/OwpTreeGrid/OwpTreeGrid.js.map +1 -1
  19. package/dist/components/OwpTreeGrid/hooks/useOwpTreeGridOverlayFrame.js +48 -46
  20. package/dist/components/OwpTreeGrid/hooks/useOwpTreeGridOverlayFrame.js.map +1 -1
  21. package/dist/components/OwpTreeGrid/perf.js +31 -0
  22. package/dist/components/OwpTreeGrid/perf.js.map +1 -0
  23. package/dist/components/OwpTreeGridResetChangesButton/OwpTreeGridResetChangesButton.js +34 -0
  24. package/dist/components/OwpTreeGridResetChangesButton/OwpTreeGridResetChangesButton.js.map +1 -0
  25. package/dist/hooks/useHeaderWrapState.js +48 -0
  26. package/dist/hooks/useHeaderWrapState.js.map +1 -0
  27. package/dist/hooks.js +40 -38
  28. package/dist/hooks.js.map +1 -1
  29. package/dist/index.js +25 -23
  30. package/dist/index.js.map +1 -1
  31. package/dist/layout/components/navigation/vertical/NavVerticalLayout.js +63 -27
  32. package/dist/layout/components/navigation/vertical/NavVerticalLayout.js.map +1 -1
  33. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/constants.js +1 -1
  34. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/index.js +1 -1
  35. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE39/index.js +1 -1
  36. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/index.js +1 -1
  37. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/constants.js +1 -1
  38. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/index.js +1 -1
  39. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/GenericBarcode/index.js +1 -1
  40. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/index.js +1 -1
  41. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/MSI/index.js +1 -1
  42. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/codabar/index.js +1 -1
  43. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/pharmacode/index.js +1 -1
  44. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/renderers/index.js +1 -1
  45. package/dist/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +1 -1
  46. package/dist/owp-app.css +1 -1
  47. package/dist/types/components/OwpMrtTable/OwpMrtTable.d.ts +2 -0
  48. package/dist/types/components/OwpMrtTable/OwpMrtTableNoDataOverlay.d.ts +14 -0
  49. package/dist/types/components/OwpSection/OwpSection.d.ts +3 -1
  50. package/dist/types/components/OwpTreeGrid/hooks/useOwpTreeGridOverlayFrame.d.ts +2 -1
  51. package/dist/types/components/OwpTreeGrid/perf.d.ts +30 -0
  52. package/dist/types/components/OwpTreeGridResetChangesButton/OwpTreeGridResetChangesButton.d.ts +13 -0
  53. package/dist/types/components/OwpTreeGridResetChangesButton/index.d.ts +1 -0
  54. package/dist/types/hooks/index.d.ts +1 -0
  55. package/dist/types/hooks/useHeaderWrapState.d.ts +14 -0
  56. package/dist/types/index.d.ts +1 -0
  57. package/dist/types/utils/index.d.ts +1 -0
  58. package/dist/types/utils/preloadOnIdle.d.ts +7 -0
  59. package/dist/types/utils/treeGridBodyRowsEvent.d.ts +9 -0
  60. package/dist/utils/preloadOnIdle.js +27 -0
  61. package/dist/utils/preloadOnIdle.js.map +1 -0
  62. package/dist/utils/treeGridBodyRowsEvent.js +14 -0
  63. package/dist/utils/treeGridBodyRowsEvent.js.map +1 -0
  64. package/dist/utils/treeGridUtil.js +79 -72
  65. package/dist/utils/treeGridUtil.js.map +1 -1
  66. package/dist/utils.js +64 -62
  67. package/dist/utils.js.map +1 -1
  68. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OwpTreeGrid.js","sources":["../../../src/components/OwpTreeGrid/OwpTreeGrid.tsx"],"sourcesContent":["import { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { useGetCurrentLanguage } from '@/hooks/useCurrentLanguage';\nimport { debounce, delay, get, isEmpty, isEqual, omit } from 'es-toolkit/compat';\nimport {\n type CSSProperties,\n type Dispatch,\n type RefObject,\n type SetStateAction,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { useOwpTreeGridOverlayFrame } from './hooks/useOwpTreeGridOverlayFrame';\nimport { OwpTreeGridLoadingOverlay } from './OwpTreeGridLoadingOverlay';\nimport { OwpTreeGridNoDataOverlay } from './OwpTreeGridNoDataOverlay';\nimport { applyTreeGridLayoutToGrid } from './utils';\n\ntype TreeGridLayoutScalarValue = string | number;\ntype TreeGridNestedLayoutFields = Record<string, TreeGridLayoutScalarValue>;\ntype TreeGridLayoutFields = Record<string, TreeGridLayoutScalarValue | TreeGridNestedLayoutFields>;\ntype TreeGridSectionFields = Record<string, TreeGridLayoutScalarValue>;\n\nconst TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS = 300;\n\nexport interface OwpTreeGridLayout {\n Header?: TreeGridLayoutFields;\n Toolbar?: TreeGridSectionFields;\n Foot?: TreeGridSectionFields;\n}\n\nexport type OwpTreeGridLayoutConfig = OwpTreeGridLayout;\nexport type THeader = OwpTreeGridLayoutConfig;\nexport type OwpTreeGridBodyData<T> = Record<string, never> | [] | undefined | T[];\nexport type OwpTreeGridData<T> = OwpTreeGridBodyData<T>;\nexport type TData<T> = OwpTreeGridBodyData<T>;\nexport type OwpTreeGridRowModel<T> = TRow & T;\nexport type OwpTreeGridSelectedRows<T> = OwpTreeGridRowModel<T>[];\n\ntype OwpTreeGridSelectHandler<T> = (selectedRows: OwpTreeGridSelectedRows<T>) => void;\ntype OwpTreeGridRowAddHandler<T> = (grid: TGrid, row: OwpTreeGridRowModel<T>) => void;\ntype OwpTreeGridRowDeleteHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n deleteType: number,\n) => void;\ntype OwpTreeGridRowUndeleteHandler<T> = (grid: TGrid, row: OwpTreeGridRowModel<T>) => void;\ntype OwpTreeGridButtonClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n event: Event,\n) => void;\ntype OwpTreeGridRowClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n x: number,\n y: number,\n event: Event,\n) => void;\ntype OwpTreeGridSaveHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n autoupdate: boolean | number,\n) => void;\ntype OwpTreeGridCellValue = unknown;\ntype OwpTreeGridAfterValueChangedHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n value: OwpTreeGridCellValue,\n) => void;\n\nexport interface OwpTreeGridProps<T> {\n id: string;\n className?: string;\n containerStyle?: CSSProperties;\n containerClassName?: string;\n layoutUrl?: string;\n dataUrl?: string;\n layoutOverrides?: OwpTreeGridLayoutConfig;\n data?: OwpTreeGridBodyData<T>;\n style?: CSSProperties;\n height?: string | number;\n width?: string | number;\n useDataUrl?: boolean;\n onSelect?: OwpTreeGridSelectHandler<T>;\n onRowAdd?: OwpTreeGridRowAddHandler<T>;\n onRowDelete?: OwpTreeGridRowDeleteHandler<T>;\n onRowUndelete?: OwpTreeGridRowUndeleteHandler<T>;\n onRowChange?: OwpTreeGridAfterValueChangedHandler<T>;\n onClickButton?: OwpTreeGridButtonClickHandler<T>;\n onReady?: (grid: TGrid) => void;\n onRowClick?: OwpTreeGridRowClickHandler<T>;\n onSave?: OwpTreeGridSaveHandler<T>;\n onAfterValueChanged?: OwpTreeGridAfterValueChangedHandler<T>;\n loading?: boolean;\n showLoading?: boolean;\n}\n\ntype TreeGridEventBindingOptions<T> = Pick<\n OwpTreeGridProps<T>,\n | 'id'\n | 'onSelect'\n | 'onRowClick'\n | 'onRowAdd'\n | 'onRowDelete'\n | 'onRowUndelete'\n | 'onRowChange'\n | 'onClickButton'\n | 'onSave'\n | 'onReady'\n | 'onAfterValueChanged'\n> & {\n treeGridInstanceRef: RefObject<TGrid>;\n latestLayoutOverridesRef: RefObject<OwpTreeGridLayoutConfig | undefined>;\n appliedLayoutOverridesRef: RefObject<OwpTreeGridLayoutConfig | undefined>;\n appliedBodyDataPropRef: RefObject<OwpTreeGridBodyData<T>>;\n hasAppliedInitialLayoutRef: RefObject<boolean>;\n setIsTreeGridReady: Dispatch<SetStateAction<boolean>>;\n};\n\ntype TreeGridInitializationInput<T> = {\n id: string;\n layoutUrl?: string;\n dataUrl?: string;\n bodyData: OwpTreeGridBodyData<T>;\n useDataUrl?: boolean;\n width?: string | number;\n height?: string | number;\n languageId: string;\n};\n\nconst TREE_GRID_TEXT_RESOURCE_URLS = {\n en: '/assets/vendors/Grid/TextEN.xml',\n kr: '/assets/vendors/Grid/TextKR.xml',\n} as const;\n\nconst appendNoCacheQuery = (url: string) => {\n return `${url}?noCache=${Date.now()}`;\n};\n\nconst getTreeGridTextResourceUrl = (languageId: string) => {\n return languageId === 'kr' ? TREE_GRID_TEXT_RESOURCE_URLS.kr : TREE_GRID_TEXT_RESOURCE_URLS.en;\n};\n\nconst resolveTreeGridDataUrl = (dataUrl?: string) => {\n return dataUrl?.includes('assets')\n ? appendNoCacheQuery(dataUrl)\n : // @ts-expect-error - API base URL env is provided by host app\n `${import.meta.env.VITE_API_BASE_URL}/${dataUrl}?noCache=${Date.now()}`;\n};\n\nconst buildTreeGridDataSource = <T,>(\n useDataUrl: boolean | undefined,\n dataUrl: string | undefined,\n bodyData: OwpTreeGridBodyData<T>,\n) => {\n if (useDataUrl) {\n return { Url: resolveTreeGridDataUrl(dataUrl) };\n }\n\n return { Data: { Body: [isEmpty(bodyData) ? [] : bodyData] } };\n};\n\nconst buildTreeGridInitializationOptions = <T,>({\n id,\n layoutUrl,\n dataUrl,\n bodyData,\n useDataUrl,\n width,\n height,\n languageId,\n}: TreeGridInitializationInput<T>) => {\n return {\n id,\n Layout: { Url: appendNoCacheQuery(layoutUrl ?? '') },\n Data: buildTreeGridDataSource(useDataUrl, dataUrl, bodyData),\n Text: {\n Url: getTreeGridTextResourceUrl(languageId),\n },\n width,\n height,\n Debug: 'Error',\n };\n};\n\nconst getTreeGridBodyData = (grid: TGrid | null) => {\n return get(grid, 'Data.Data.Data.Body.0');\n};\n\nconst replaceTreeGridBodyData = <T,>(\n grid: TGrid,\n bodyData: OwpTreeGridBodyData<T>,\n onReloadFinish?: (code: number) => void,\n) => {\n // @ts-expect-error - TreeGrid Data.Data shape is not reflected in bundled types\n const currentDataConfig = grid.Data?.Data;\n\n // @ts-expect-error - TreeGrid Data.Data shape is not reflected in bundled types\n grid.Data.Data = {\n ...currentDataConfig,\n Data: { Body: [bodyData || []] },\n Url: '',\n };\n\n grid.ReloadBody(onReloadFinish);\n};\n\nconst bindTreeGridEvents = <T,>({\n id,\n onSelect,\n onRowClick,\n onRowAdd,\n onRowDelete,\n onRowUndelete,\n onRowChange,\n onClickButton,\n onSave,\n onReady,\n onAfterValueChanged,\n treeGridInstanceRef,\n latestLayoutOverridesRef,\n appliedLayoutOverridesRef,\n appliedBodyDataPropRef,\n hasAppliedInitialLayoutRef,\n setIsTreeGridReady,\n}: TreeGridEventBindingOptions<T>) => {\n const valueChangedHandler = onAfterValueChanged ?? onRowChange;\n\n window.TGSetEvent('OnRowAdd', id, (grid, row) => {\n row.CanEdit = 1;\n row.CanDelete = 1;\n\n onRowAdd?.(grid, row as OwpTreeGridRowModel<T>);\n });\n\n if (typeof onRowClick === 'function') {\n window.TGSetEvent(\n 'OnClick',\n id,\n debounce((grid, row, col, x, y, event) => {\n onRowClick(grid, row as OwpTreeGridRowModel<T>, col, x, y, event);\n }, 300),\n );\n }\n\n if (typeof onClickButton === 'function') {\n window.TGSetEvent(\n 'OnClickButton',\n id,\n debounce((grid, row, col, event) => {\n onClickButton(grid, row as OwpTreeGridRowModel<T>, col, event);\n }, 300),\n );\n }\n\n if (typeof onRowDelete === 'function') {\n window.TGSetEvent('OnRowDelete', id, (grid, row, deleteType) => {\n onRowDelete(grid, row as OwpTreeGridRowModel<T>, deleteType);\n });\n }\n if (typeof onRowUndelete === 'function') {\n window.TGSetEvent('OnRowUndelete', id, (grid, row) => {\n onRowUndelete(grid, row as OwpTreeGridRowModel<T>);\n });\n }\n if (typeof valueChangedHandler === 'function') {\n window.TGSetEvent('OnAfterValueChanged', id, (grid, row, col, value) => {\n valueChangedHandler(grid, row as OwpTreeGridRowModel<T>, col, value);\n });\n }\n if (typeof onSelect === 'function') {\n window.TGSetEvent(\n 'OnSelect',\n id,\n debounce((grid) => {\n const selectedRows = (grid.GetSelRows() ?? []) as OwpTreeGridSelectedRows<T>;\n onSelect(selectedRows);\n }, 100),\n );\n }\n if (typeof onSave === 'function') {\n window.TGSetEvent('OnSave', id, (grid, row, autoupdate) => {\n onSave(grid, row as OwpTreeGridRowModel<T>, autoupdate);\n });\n }\n\n window.TGSetEvent(\n 'OnReady',\n id,\n debounce((grid) => {\n if (!hasAppliedInitialLayoutRef.current) {\n const latestLayoutOverrides = latestLayoutOverridesRef.current;\n\n hasAppliedInitialLayoutRef.current = true;\n applyTreeGridLayoutToGrid(grid, latestLayoutOverrides);\n treeGridInstanceRef.current = grid;\n appliedLayoutOverridesRef.current = latestLayoutOverrides;\n appliedBodyDataPropRef.current = getTreeGridBodyData(grid) as OwpTreeGridBodyData<T>;\n setIsTreeGridReady(true);\n onReady?.(grid);\n }\n }, 100),\n );\n};\n\n/**\n * OwpTreeGrid 컴포넌트\n * @param id 식별자\n * @param containerStyle containerStyle 값\n * @param containerClassName containerClassName 값\n * @param className CSS 클래스명\n * @param style 스타일 객체\n * @param height height 값\n */\nconst OwpTreeGrid = <T,>({\n id = 'treeGridWrapper',\n containerStyle,\n containerClassName,\n className,\n style,\n height = '100%',\n width = '100%',\n layoutUrl,\n dataUrl,\n layoutOverrides,\n data,\n useDataUrl,\n onSelect,\n onRowClick,\n onRowAdd,\n onRowDelete,\n onRowUndelete,\n onRowChange,\n onClickButton,\n onSave,\n onReady,\n onAfterValueChanged,\n loading,\n showLoading = true,\n}: OwpTreeGridProps<T>) => {\n const { t } = useOwpTranslation();\n const treeGridInstanceRef = useRef<TGrid>(null);\n const treeGridContainerRef = useRef<HTMLDivElement | null>(null);\n const latestLayoutOverridesRef = useRef<OwpTreeGridLayoutConfig | undefined>(layoutOverrides);\n const latestBodyDataPropRef = useRef<OwpTreeGridBodyData<T>>(data);\n const stagedBodyDataPropRef = useRef<OwpTreeGridBodyData<T>>(undefined);\n const hasStagedBodyDataPropRef = useRef(false);\n const appliedLayoutOverridesRef = useRef<OwpTreeGridLayoutConfig | undefined>(undefined);\n const appliedBodyDataPropRef = useRef<OwpTreeGridBodyData<T>>(undefined);\n const hasAppliedInitialLayoutRef = useRef(false);\n const bodyReloadSequenceRef = useRef(0);\n const bindingLoadingStartedAtRef = useRef<number | null>(null);\n const bindingLoadingHideTimeoutRef = useRef<number | undefined>(undefined);\n const bodyReloadStartTimeoutRef = useRef<number | undefined>(undefined);\n const [isTreeGridReady, setIsTreeGridReady] = useState(false);\n const [isBindingLoadingVisible, setIsBindingLoadingVisible] = useState(false);\n const currentLanguage = useGetCurrentLanguage();\n const currentLanguageIdRef = useRef(currentLanguage.id);\n const isPendingBodyReload =\n showLoading &&\n data !== undefined &&\n isTreeGridReady &&\n appliedBodyDataPropRef.current !== data;\n const isInternalLoadingVisible = showLoading && (isBindingLoadingVisible || isPendingBodyReload);\n const isLoadingOverlayVisible = (showLoading && loading === true) || isInternalLoadingVisible;\n const isNoDataVisible = !isLoadingOverlayVisible && data !== undefined && isEmpty(data);\n\n latestLayoutOverridesRef.current = layoutOverrides;\n latestBodyDataPropRef.current = data;\n\n const overlayFrame = useOwpTreeGridOverlayFrame({\n visible: isLoadingOverlayVisible || isNoDataVisible,\n containerRef: treeGridContainerRef,\n treeGridInstanceRef,\n });\n\n const clearBindingLoadingHideTimeout = () => {\n if (bindingLoadingHideTimeoutRef.current !== undefined) {\n window.clearTimeout(bindingLoadingHideTimeoutRef.current);\n bindingLoadingHideTimeoutRef.current = undefined;\n }\n };\n\n const clearBodyReloadStartTimeout = () => {\n if (bodyReloadStartTimeoutRef.current !== undefined) {\n window.clearTimeout(bodyReloadStartTimeoutRef.current);\n bodyReloadStartTimeoutRef.current = undefined;\n }\n };\n\n useEffect(() => {\n if (!showLoading) {\n clearBodyReloadStartTimeout();\n clearBindingLoadingHideTimeout();\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n }\n }, [showLoading]);\n\n useEffect(() => {\n if (\n currentLanguage.id !== currentLanguageIdRef.current &&\n !isEmpty(treeGridInstanceRef.current)\n ) {\n treeGridInstanceRef.current?.Dispose();\n treeGridInstanceRef.current = null;\n currentLanguageIdRef.current = currentLanguage.id;\n }\n\n if (!isEmpty(treeGridInstanceRef.current)) {\n return;\n }\n\n bindTreeGridEvents({\n id,\n onSelect,\n onRowClick,\n onRowAdd,\n onRowDelete,\n onRowUndelete,\n onRowChange,\n onClickButton,\n onSave,\n onReady,\n onAfterValueChanged,\n treeGridInstanceRef,\n latestLayoutOverridesRef,\n appliedLayoutOverridesRef,\n appliedBodyDataPropRef,\n hasAppliedInitialLayoutRef,\n setIsTreeGridReady,\n });\n\n window.TreeGrid(\n buildTreeGridInitializationOptions({\n id,\n layoutUrl,\n dataUrl,\n bodyData: data,\n useDataUrl,\n width,\n height,\n languageId: currentLanguage.id,\n }),\n id,\n id,\n );\n\n return () => {\n delay(() => {\n treeGridInstanceRef.current?.Dispose();\n }, 200);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useLayoutEffect(() => {\n const treeGrid = treeGridInstanceRef.current;\n const nextLayoutOverrides = latestLayoutOverridesRef.current;\n const nextBodyData = latestBodyDataPropRef.current;\n\n if (isEmpty(treeGrid) || !isTreeGridReady) {\n return;\n }\n\n const shouldApplyLayoutOverrides =\n appliedLayoutOverridesRef.current !== nextLayoutOverrides &&\n !isEqual(appliedLayoutOverridesRef.current, nextLayoutOverrides);\n const shouldApplyBodyData =\n appliedBodyDataPropRef.current !== nextBodyData &&\n (!hasStagedBodyDataPropRef.current || stagedBodyDataPropRef.current !== nextBodyData);\n\n if (!shouldApplyLayoutOverrides && !shouldApplyBodyData) {\n return;\n }\n\n if (shouldApplyLayoutOverrides) {\n applyTreeGridLayoutToGrid(treeGrid, nextLayoutOverrides, shouldApplyBodyData);\n appliedLayoutOverridesRef.current = nextLayoutOverrides;\n }\n\n if (shouldApplyBodyData) {\n const reloadSequence = bodyReloadSequenceRef.current + 1;\n const runBodyReload = () => {\n const bodyDataToApply = stagedBodyDataPropRef.current;\n\n bodyReloadStartTimeoutRef.current = undefined;\n\n replaceTreeGridBodyData(treeGrid, bodyDataToApply, () => {\n if (bodyReloadSequenceRef.current !== reloadSequence) {\n return;\n }\n\n appliedBodyDataPropRef.current = bodyDataToApply;\n\n if (stagedBodyDataPropRef.current === bodyDataToApply) {\n stagedBodyDataPropRef.current = undefined;\n hasStagedBodyDataPropRef.current = false;\n }\n\n const startedAt = bindingLoadingStartedAtRef.current;\n\n if (!showLoading || startedAt === null) {\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n return;\n }\n\n const remainingVisibleTime = Math.max(\n 0,\n TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS - (Date.now() - startedAt),\n );\n\n clearBindingLoadingHideTimeout();\n\n if (remainingVisibleTime === 0) {\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n return;\n }\n\n bindingLoadingHideTimeoutRef.current = window.setTimeout(() => {\n if (bodyReloadSequenceRef.current !== reloadSequence) {\n return;\n }\n\n bindingLoadingHideTimeoutRef.current = undefined;\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n }, remainingVisibleTime);\n });\n };\n\n bodyReloadSequenceRef.current = reloadSequence;\n stagedBodyDataPropRef.current = nextBodyData;\n hasStagedBodyDataPropRef.current = true;\n\n if (showLoading && nextBodyData !== undefined) {\n clearBodyReloadStartTimeout();\n clearBindingLoadingHideTimeout();\n bindingLoadingStartedAtRef.current = Date.now();\n setIsBindingLoadingVisible(true);\n bodyReloadStartTimeoutRef.current = window.setTimeout(() => {\n if (bodyReloadSequenceRef.current !== reloadSequence) {\n return;\n }\n\n runBodyReload();\n }, 0);\n } else {\n runBodyReload();\n }\n }\n }, [isTreeGridReady, layoutOverrides, data, showLoading]);\n\n useEffect(() => {\n return () => {\n clearBodyReloadStartTimeout();\n clearBindingLoadingHideTimeout();\n };\n }, []);\n\n const resolvedContainerStyle: CSSProperties = {\n height,\n width,\n ...containerStyle,\n };\n\n if (showLoading || isNoDataVisible) {\n resolvedContainerStyle.position =\n containerStyle?.position && containerStyle.position !== 'static'\n ? containerStyle.position\n : 'relative';\n resolvedContainerStyle.isolation = 'isolate';\n }\n\n return (\n <div ref={treeGridContainerRef} className={containerClassName} style={resolvedContainerStyle}>\n <div id={id} className={className} style={omit(style, ['height', 'width'])} />\n <OwpTreeGridNoDataOverlay\n visible={isNoDataVisible}\n message={t('Message.조회된 결과가 없습니다.')}\n overlayFrame={overlayFrame}\n />\n <OwpTreeGridLoadingOverlay visible={isLoadingOverlayVisible} overlayFrame={overlayFrame} />\n </div>\n );\n};\n\nexport { OwpTreeGrid };\n"],"names":["TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS","TREE_GRID_TEXT_RESOURCE_URLS","appendNoCacheQuery","__name","url","getTreeGridTextResourceUrl","languageId","resolveTreeGridDataUrl","dataUrl","buildTreeGridDataSource","useDataUrl","bodyData","isEmpty","buildTreeGridInitializationOptions","id","layoutUrl","width","height","getTreeGridBodyData","grid","get","replaceTreeGridBodyData","onReloadFinish","currentDataConfig","_a","bindTreeGridEvents","onSelect","onRowClick","onRowAdd","onRowDelete","onRowUndelete","onRowChange","onClickButton","onSave","onReady","onAfterValueChanged","treeGridInstanceRef","latestLayoutOverridesRef","appliedLayoutOverridesRef","appliedBodyDataPropRef","hasAppliedInitialLayoutRef","setIsTreeGridReady","valueChangedHandler","row","debounce","col","x","y","event","deleteType","value","selectedRows","autoupdate","latestLayoutOverrides","applyTreeGridLayoutToGrid","OwpTreeGrid","containerStyle","containerClassName","className","style","layoutOverrides","data","loading","showLoading","t","useOwpTranslation","useRef","treeGridContainerRef","latestBodyDataPropRef","stagedBodyDataPropRef","hasStagedBodyDataPropRef","bodyReloadSequenceRef","bindingLoadingStartedAtRef","bindingLoadingHideTimeoutRef","bodyReloadStartTimeoutRef","isTreeGridReady","useState","isBindingLoadingVisible","setIsBindingLoadingVisible","currentLanguage","useGetCurrentLanguage","currentLanguageIdRef","isPendingBodyReload","isLoadingOverlayVisible","isNoDataVisible","overlayFrame","useOwpTreeGridOverlayFrame","clearBindingLoadingHideTimeout","clearBodyReloadStartTimeout","useEffect","delay","useLayoutEffect","treeGrid","nextLayoutOverrides","nextBodyData","shouldApplyLayoutOverrides","isEqual","shouldApplyBodyData","reloadSequence","runBodyReload","bodyDataToApply","startedAt","remainingVisibleTime","resolvedContainerStyle","jsx","omit","OwpTreeGridNoDataOverlay","OwpTreeGridLoadingOverlay"],"mappings":"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"}
1
+ {"version":3,"file":"OwpTreeGrid.js","sources":["../../../src/components/OwpTreeGrid/OwpTreeGrid.tsx"],"sourcesContent":["import { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { useGetCurrentLanguage } from '@/hooks/useCurrentLanguage';\nimport {\n TREE_GRID_BODY_ROWS_CHANGED_EVENT,\n type TreeGridBodyRowsChangedEventDetail,\n} from '@/utils/treeGridBodyRowsEvent';\nimport { debounce, delay, get, isEmpty, isEqual, omit } from 'es-toolkit/compat';\n// Temporary TreeGrid perf instrumentation import. Remove with ./perf after profiling is finished.\nimport {\n countTreeGridPerf,\n getTreeGridPerfTimestamp,\n logTreeGridPerf,\n measureTreeGridPerf,\n} from './perf';\nimport {\n type CSSProperties,\n type Dispatch,\n type RefObject,\n type SetStateAction,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { useOwpTreeGridOverlayFrame } from './hooks/useOwpTreeGridOverlayFrame';\nimport { OwpTreeGridLoadingOverlay } from './OwpTreeGridLoadingOverlay';\nimport { OwpTreeGridNoDataOverlay } from './OwpTreeGridNoDataOverlay';\nimport { applyTreeGridLayoutToGrid } from './utils';\n\ntype TreeGridLayoutScalarValue = string | number;\ntype TreeGridNestedLayoutFields = Record<string, TreeGridLayoutScalarValue>;\ntype TreeGridLayoutFields = Record<string, TreeGridLayoutScalarValue | TreeGridNestedLayoutFields>;\ntype TreeGridSectionFields = Record<string, TreeGridLayoutScalarValue>;\n\nconst TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS = 300;\n\nexport interface OwpTreeGridLayout {\n Header?: TreeGridLayoutFields;\n Toolbar?: TreeGridSectionFields;\n Foot?: TreeGridSectionFields;\n}\n\nexport type OwpTreeGridLayoutConfig = OwpTreeGridLayout;\nexport type THeader = OwpTreeGridLayoutConfig;\nexport type OwpTreeGridBodyData<T> = Record<string, never> | [] | undefined | T[];\nexport type OwpTreeGridData<T> = OwpTreeGridBodyData<T>;\nexport type TData<T> = OwpTreeGridBodyData<T>;\nexport type OwpTreeGridRowModel<T> = TRow & T;\nexport type OwpTreeGridSelectedRows<T> = OwpTreeGridRowModel<T>[];\n\ntype OwpTreeGridSelectHandler<T> = (selectedRows: OwpTreeGridSelectedRows<T>) => void;\ntype OwpTreeGridRowAddHandler<T> = (grid: TGrid, row: OwpTreeGridRowModel<T>) => void;\ntype OwpTreeGridRowDeleteHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n deleteType: number,\n) => void;\ntype OwpTreeGridRowUndeleteHandler<T> = (grid: TGrid, row: OwpTreeGridRowModel<T>) => void;\ntype OwpTreeGridButtonClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n event: Event,\n) => void;\ntype OwpTreeGridRowClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n x: number,\n y: number,\n event: Event,\n) => void;\ntype OwpTreeGridSaveHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n autoupdate: boolean | number,\n) => void;\ntype OwpTreeGridCellValue = unknown;\ntype OwpTreeGridAfterValueChangedHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n value: OwpTreeGridCellValue,\n) => void;\n\nexport interface OwpTreeGridProps<T> {\n id: string;\n className?: string;\n containerStyle?: CSSProperties;\n containerClassName?: string;\n layoutUrl?: string;\n dataUrl?: string;\n layoutOverrides?: OwpTreeGridLayoutConfig;\n data?: OwpTreeGridBodyData<T>;\n style?: CSSProperties;\n height?: string | number;\n width?: string | number;\n useDataUrl?: boolean;\n onSelect?: OwpTreeGridSelectHandler<T>;\n onRowAdd?: OwpTreeGridRowAddHandler<T>;\n onRowDelete?: OwpTreeGridRowDeleteHandler<T>;\n onRowUndelete?: OwpTreeGridRowUndeleteHandler<T>;\n onRowChange?: OwpTreeGridAfterValueChangedHandler<T>;\n onClickButton?: OwpTreeGridButtonClickHandler<T>;\n onReady?: (grid: TGrid) => void;\n onRowClick?: OwpTreeGridRowClickHandler<T>;\n onSave?: OwpTreeGridSaveHandler<T>;\n onAfterValueChanged?: OwpTreeGridAfterValueChangedHandler<T>;\n loading?: boolean;\n showLoading?: boolean;\n}\n\ntype TreeGridEventHandlers<T> = Pick<\n OwpTreeGridProps<T>,\n | 'onSelect'\n | 'onRowClick'\n | 'onRowAdd'\n | 'onRowDelete'\n | 'onRowUndelete'\n | 'onRowChange'\n | 'onClickButton'\n | 'onSave'\n | 'onReady'\n | 'onAfterValueChanged'\n>;\n\ntype TreeGridEventBindingOptions<T> = Pick<OwpTreeGridProps<T>, 'id'> & {\n latestEventHandlersRef: RefObject<TreeGridEventHandlers<T>>;\n treeGridInstanceRef: RefObject<TGrid>;\n treeGridInitStartedAtRef: RefObject<number | null>;\n latestLayoutOverridesRef: RefObject<OwpTreeGridLayoutConfig | undefined>;\n appliedLayoutOverridesRef: RefObject<OwpTreeGridLayoutConfig | undefined>;\n appliedBodyDataPropRef: RefObject<OwpTreeGridBodyData<T>>;\n hasAppliedInitialLayoutRef: RefObject<boolean>;\n syncHasDisplayDataRows: (grid: TGrid | null) => void;\n setIsTreeGridReady: Dispatch<SetStateAction<boolean>>;\n};\n\ntype TreeGridInitializationInput<T> = {\n id: string;\n layoutUrl?: string;\n dataUrl?: string;\n bodyData: OwpTreeGridBodyData<T>;\n useDataUrl?: boolean;\n width?: string | number;\n height?: string | number;\n languageId: string;\n};\n\nconst TREE_GRID_TEXT_RESOURCE_URLS = {\n en: '/assets/vendors/Grid/TextEN.xml',\n kr: '/assets/vendors/Grid/TextKR.xml',\n} as const;\n\nconst appendNoCacheQuery = (url: string) => {\n return `${url}?noCache=${Date.now()}`;\n};\n\nconst getTreeGridTextResourceUrl = (languageId: string) => {\n return languageId === 'kr' ? TREE_GRID_TEXT_RESOURCE_URLS.kr : TREE_GRID_TEXT_RESOURCE_URLS.en;\n};\n\nconst resolveTreeGridDataUrl = (dataUrl?: string) => {\n return dataUrl?.includes('assets')\n ? appendNoCacheQuery(dataUrl)\n : // @ts-expect-error - API base URL env is provided by host app\n `${import.meta.env.VITE_API_BASE_URL}/${dataUrl}?noCache=${Date.now()}`;\n};\n\nconst buildTreeGridDataSource = <T,>(\n useDataUrl: boolean | undefined,\n dataUrl: string | undefined,\n bodyData: OwpTreeGridBodyData<T>,\n) => {\n if (useDataUrl) {\n return { Url: resolveTreeGridDataUrl(dataUrl) };\n }\n\n return { Data: { Body: [isEmpty(bodyData) ? [] : bodyData] } };\n};\n\nconst buildTreeGridInitializationOptions = <T,>({\n id,\n layoutUrl,\n dataUrl,\n bodyData,\n useDataUrl,\n width,\n height,\n languageId,\n}: TreeGridInitializationInput<T>) => {\n return {\n id,\n Layout: { Url: appendNoCacheQuery(layoutUrl ?? '') },\n Data: buildTreeGridDataSource(useDataUrl, dataUrl, bodyData),\n Text: {\n Url: getTreeGridTextResourceUrl(languageId),\n },\n width,\n height,\n Debug: 'Error',\n };\n};\n\nconst getTreeGridBodyData = (grid: TGrid | null) => {\n return get(grid, 'Data.Data.Data.Body.0');\n};\n\nconst getTreeGridBodyDataCount = <T,>(bodyData: OwpTreeGridBodyData<T>) => {\n return Array.isArray(bodyData) ? bodyData.length : 0;\n};\n\nconst isVisibleTreeGridRow = (row: TRow | null | undefined) => {\n const visible = (row as { Visible?: unknown } | null)?.Visible;\n\n return !!row && visible !== 0 && visible !== false && visible !== '0';\n};\n\n/**\n * TreeGrid 추가 행 여부\n * @param row TreeGrid 행\n */\nconst isAddedTreeGridRow = (row: TRow | null | undefined) => {\n const added = (row as { Added?: unknown } | null)?.Added;\n\n return !!row && added !== 0 && added !== false && added !== '0' && added !== undefined;\n};\n\n/**\n * TreeGrid 본문 표시 행 여부\n * @param row TreeGrid 행\n */\nconst isDisplayTreeGridRow = (row: TRow | null | undefined) => {\n if (!row || row.Fixed === 'Foot' || !isVisibleTreeGridRow(row)) {\n return false;\n }\n\n return row.Kind === 'Data' || isAddedTreeGridRow(row);\n};\n\n/**\n * TreeGrid 표시 데이터 행 존재 여부\n * @param grid TreeGrid 인스턴스\n */\nconst hasTreeGridDisplayDataRows = (grid: TGrid | null) => {\n if (!grid) {\n return false;\n }\n\n if (typeof grid.GetFirst === 'function' && typeof grid.GetNext === 'function') {\n let row = grid.GetFirst();\n\n while (row) {\n if (isDisplayTreeGridRow(row)) {\n return true;\n }\n\n row = grid.GetNext(row);\n }\n\n return false;\n }\n\n return Object.values(grid.Rows ?? {}).some((row) => {\n return isDisplayTreeGridRow(row);\n });\n};\n\nconst replaceTreeGridBodyData = <T,>(\n grid: TGrid,\n bodyData: OwpTreeGridBodyData<T>,\n onReloadFinish?: (code: number) => void,\n) => {\n // @ts-expect-error - TreeGrid Data.Data shape is not reflected in bundled types\n const currentDataConfig = grid.Data?.Data;\n\n // @ts-expect-error - TreeGrid Data.Data shape is not reflected in bundled types\n grid.Data.Data = {\n ...currentDataConfig,\n Data: { Body: [bodyData || []] },\n Url: '',\n };\n\n grid.ReloadBody(onReloadFinish);\n};\n\nconst bindTreeGridEvents = <T,>({\n id,\n latestEventHandlersRef,\n treeGridInstanceRef,\n treeGridInitStartedAtRef,\n latestLayoutOverridesRef,\n appliedLayoutOverridesRef,\n appliedBodyDataPropRef,\n hasAppliedInitialLayoutRef,\n syncHasDisplayDataRows,\n setIsTreeGridReady,\n}: TreeGridEventBindingOptions<T>) => {\n const initialEventHandlers = latestEventHandlersRef.current;\n\n window.TGSetEvent('OnRowAdd', id, (grid, row) => {\n row.CanEdit = 1;\n row.CanDelete = 1;\n\n latestEventHandlersRef.current?.onRowAdd?.(grid, row as OwpTreeGridRowModel<T>);\n });\n window.TGSetEvent('OnRowAdded', id, (grid) => {\n syncHasDisplayDataRows(grid);\n });\n\n if (typeof initialEventHandlers?.onRowClick === 'function') {\n window.TGSetEvent(\n 'OnClick',\n id,\n debounce((grid, row, col, x, y, event) => {\n latestEventHandlersRef.current?.onRowClick?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n x,\n y,\n event,\n );\n }, 300),\n );\n }\n\n if (typeof initialEventHandlers?.onClickButton === 'function') {\n window.TGSetEvent(\n 'OnClickButton',\n id,\n debounce((grid, row, col, event) => {\n latestEventHandlersRef.current?.onClickButton?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n event,\n );\n }, 300),\n );\n }\n\n if (typeof initialEventHandlers?.onRowDelete === 'function') {\n window.TGSetEvent('OnRowDelete', id, (grid, row, deleteType) => {\n syncHasDisplayDataRows(grid);\n latestEventHandlersRef.current?.onRowDelete?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n deleteType,\n );\n });\n } else {\n window.TGSetEvent('OnRowDelete', id, (grid) => {\n syncHasDisplayDataRows(grid);\n });\n }\n if (typeof initialEventHandlers?.onRowUndelete === 'function') {\n window.TGSetEvent('OnRowUndelete', id, (grid, row) => {\n syncHasDisplayDataRows(grid);\n latestEventHandlersRef.current?.onRowUndelete?.(grid, row as OwpTreeGridRowModel<T>);\n });\n } else {\n window.TGSetEvent('OnRowUndelete', id, (grid) => {\n syncHasDisplayDataRows(grid);\n });\n }\n if (\n typeof initialEventHandlers?.onAfterValueChanged === 'function' ||\n typeof initialEventHandlers?.onRowChange === 'function'\n ) {\n window.TGSetEvent('OnAfterValueChanged', id, (grid, row, col, value) => {\n const valueChangedHandler =\n latestEventHandlersRef.current?.onAfterValueChanged ??\n latestEventHandlersRef.current?.onRowChange;\n\n valueChangedHandler?.(grid, row as OwpTreeGridRowModel<T>, col, value);\n });\n }\n if (typeof initialEventHandlers?.onSelect === 'function') {\n window.TGSetEvent(\n 'OnSelect',\n id,\n debounce((grid) => {\n const selectedRows = (grid.GetSelRows() ?? []) as OwpTreeGridSelectedRows<T>;\n latestEventHandlersRef.current?.onSelect?.(selectedRows);\n }, 100),\n );\n }\n if (typeof initialEventHandlers?.onSave === 'function') {\n window.TGSetEvent('OnSave', id, (grid, row, autoupdate) => {\n latestEventHandlersRef.current?.onSave?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n autoupdate,\n );\n });\n }\n\n window.TGSetEvent(\n 'OnReady',\n id,\n debounce((grid) => {\n if (!hasAppliedInitialLayoutRef.current) {\n const latestLayoutOverrides = latestLayoutOverridesRef.current;\n\n hasAppliedInitialLayoutRef.current = true;\n applyTreeGridLayoutToGrid(grid, latestLayoutOverrides);\n treeGridInstanceRef.current = grid;\n appliedLayoutOverridesRef.current = latestLayoutOverrides;\n appliedBodyDataPropRef.current = getTreeGridBodyData(grid) as OwpTreeGridBodyData<T>;\n syncHasDisplayDataRows(grid);\n setIsTreeGridReady(true);\n measureTreeGridPerf(id, 'TreeGrid init ready', treeGridInitStartedAtRef.current, {\n bodyRowCount: getTreeGridBodyDataCount(\n getTreeGridBodyData(grid) as OwpTreeGridBodyData<T>,\n ),\n });\n treeGridInitStartedAtRef.current = null;\n latestEventHandlersRef.current?.onReady?.(grid);\n }\n }, 100),\n );\n};\n\n/**\n * OwpTreeGrid 컴포넌트\n * @param id 식별자\n * @param containerStyle containerStyle 값\n * @param containerClassName containerClassName 값\n * @param className CSS 클래스명\n * @param style 스타일 객체\n * @param height height 값\n */\nconst OwpTreeGrid = <T,>({\n id = 'treeGridWrapper',\n containerStyle,\n containerClassName,\n className,\n style,\n height = '100%',\n width = '100%',\n layoutUrl,\n dataUrl,\n layoutOverrides,\n data,\n useDataUrl,\n onSelect,\n onRowClick,\n onRowAdd,\n onRowDelete,\n onRowUndelete,\n onRowChange,\n onClickButton,\n onSave,\n onReady,\n onAfterValueChanged,\n loading,\n showLoading = true,\n}: OwpTreeGridProps<T>) => {\n const { t } = useOwpTranslation();\n const treeGridInstanceRef = useRef<TGrid>(null);\n const treeGridContainerRef = useRef<HTMLDivElement | null>(null);\n const treeGridInitStartedAtRef = useRef<number | null>(null);\n const bodyReloadStartedAtRef = useRef<number | null>(null);\n const latestLayoutOverridesRef = useRef<OwpTreeGridLayoutConfig | undefined>(layoutOverrides);\n const latestBodyDataPropRef = useRef<OwpTreeGridBodyData<T>>(data);\n const latestEventHandlersRef = useRef<TreeGridEventHandlers<T>>({\n onSelect,\n onRowClick,\n onRowAdd,\n onRowDelete,\n onRowUndelete,\n onRowChange,\n onClickButton,\n onSave,\n onReady,\n onAfterValueChanged,\n });\n const stagedBodyDataPropRef = useRef<OwpTreeGridBodyData<T>>(undefined);\n const hasStagedBodyDataPropRef = useRef(false);\n const appliedLayoutOverridesRef = useRef<OwpTreeGridLayoutConfig | undefined>(undefined);\n const appliedBodyDataPropRef = useRef<OwpTreeGridBodyData<T>>(undefined);\n const hasAppliedInitialLayoutRef = useRef(false);\n const bodyReloadSequenceRef = useRef(0);\n const bindingLoadingStartedAtRef = useRef<number | null>(null);\n const bindingLoadingHideTimeoutRef = useRef<number | undefined>(undefined);\n const bodyReloadStartTimeoutRef = useRef<number | undefined>(undefined);\n const [isTreeGridReady, setIsTreeGridReady] = useState(false);\n const [isBindingLoadingVisible, setIsBindingLoadingVisible] = useState(false);\n const [hasDisplayDataRows, setHasDisplayDataRows] = useState(false);\n const currentLanguage = useGetCurrentLanguage();\n const currentLanguageIdRef = useRef(currentLanguage.id);\n const isPendingBodyReload =\n showLoading &&\n data !== undefined &&\n isTreeGridReady &&\n appliedBodyDataPropRef.current !== data;\n const isInternalLoadingVisible = showLoading && (isBindingLoadingVisible || isPendingBodyReload);\n const isLoadingOverlayVisible = (showLoading && loading === true) || isInternalLoadingVisible;\n const isNoDataVisible =\n !isLoadingOverlayVisible && data !== undefined && isEmpty(data) && !hasDisplayDataRows;\n\n const syncHasDisplayDataRows = (grid: TGrid | null) => {\n setHasDisplayDataRows(hasTreeGridDisplayDataRows(grid));\n };\n\n latestLayoutOverridesRef.current = layoutOverrides;\n latestBodyDataPropRef.current = data;\n latestEventHandlersRef.current = {\n onSelect,\n onRowClick,\n onRowAdd,\n onRowDelete,\n onRowUndelete,\n onRowChange,\n onClickButton,\n onSave,\n onReady,\n onAfterValueChanged,\n };\n\n const overlayFrame = useOwpTreeGridOverlayFrame({\n visible: isLoadingOverlayVisible || isNoDataVisible,\n containerRef: treeGridContainerRef,\n treeGridInstanceRef,\n debugId: id,\n });\n\n const clearBindingLoadingHideTimeout = () => {\n if (bindingLoadingHideTimeoutRef.current !== undefined) {\n window.clearTimeout(bindingLoadingHideTimeoutRef.current);\n bindingLoadingHideTimeoutRef.current = undefined;\n }\n };\n\n const clearBodyReloadStartTimeout = () => {\n if (bodyReloadStartTimeoutRef.current !== undefined) {\n window.clearTimeout(bodyReloadStartTimeoutRef.current);\n bodyReloadStartTimeoutRef.current = undefined;\n }\n };\n\n useEffect(() => {\n const handleBodyRowsChanged = (event: Event) => {\n const customEvent = event as CustomEvent<TreeGridBodyRowsChangedEventDetail>;\n\n if (customEvent.detail?.gridId !== id) {\n return;\n }\n\n setHasDisplayDataRows(hasTreeGridDisplayDataRows(treeGridInstanceRef.current));\n };\n\n window.addEventListener(TREE_GRID_BODY_ROWS_CHANGED_EVENT, handleBodyRowsChanged);\n\n return () => {\n window.removeEventListener(TREE_GRID_BODY_ROWS_CHANGED_EVENT, handleBodyRowsChanged);\n };\n }, [id]);\n\n useEffect(() => {\n if (!showLoading) {\n clearBodyReloadStartTimeout();\n clearBindingLoadingHideTimeout();\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n }\n }, [showLoading]);\n\n useEffect(() => {\n if (\n currentLanguage.id !== currentLanguageIdRef.current &&\n !isEmpty(treeGridInstanceRef.current)\n ) {\n treeGridInstanceRef.current?.Dispose();\n treeGridInstanceRef.current = null;\n currentLanguageIdRef.current = currentLanguage.id;\n }\n\n if (!isEmpty(treeGridInstanceRef.current)) {\n return;\n }\n\n bindTreeGridEvents({\n id,\n latestEventHandlersRef,\n treeGridInstanceRef,\n treeGridInitStartedAtRef,\n latestLayoutOverridesRef,\n appliedLayoutOverridesRef,\n appliedBodyDataPropRef,\n hasAppliedInitialLayoutRef,\n syncHasDisplayDataRows,\n setIsTreeGridReady,\n });\n\n treeGridInitStartedAtRef.current = getTreeGridPerfTimestamp();\n countTreeGridPerf(id, 'init');\n logTreeGridPerf(id, 'TreeGrid init start', {\n useDataUrl: Boolean(useDataUrl),\n bodyRowCount: getTreeGridBodyDataCount(data),\n });\n\n window.TreeGrid(\n buildTreeGridInitializationOptions({\n id,\n layoutUrl,\n dataUrl,\n bodyData: data,\n useDataUrl,\n width,\n height,\n languageId: currentLanguage.id,\n }),\n id,\n id,\n );\n\n return () => {\n delay(() => {\n treeGridInstanceRef.current?.Dispose();\n }, 200);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useLayoutEffect(() => {\n const treeGrid = treeGridInstanceRef.current;\n const nextLayoutOverrides = latestLayoutOverridesRef.current;\n const nextBodyData = latestBodyDataPropRef.current;\n\n if (isEmpty(treeGrid) || !isTreeGridReady) {\n return;\n }\n\n const shouldApplyLayoutOverrides =\n appliedLayoutOverridesRef.current !== nextLayoutOverrides &&\n !isEqual(appliedLayoutOverridesRef.current, nextLayoutOverrides);\n const shouldApplyBodyData =\n appliedBodyDataPropRef.current !== nextBodyData &&\n (!hasStagedBodyDataPropRef.current || stagedBodyDataPropRef.current !== nextBodyData);\n\n if (!shouldApplyLayoutOverrides && !shouldApplyBodyData) {\n return;\n }\n\n if (shouldApplyLayoutOverrides) {\n const layoutApplyStartedAt = getTreeGridPerfTimestamp();\n\n applyTreeGridLayoutToGrid(treeGrid, nextLayoutOverrides, shouldApplyBodyData);\n appliedLayoutOverridesRef.current = nextLayoutOverrides;\n measureTreeGridPerf(id, 'apply layout', layoutApplyStartedAt, {\n disableBodyReload: Boolean(shouldApplyBodyData),\n });\n }\n\n if (shouldApplyBodyData) {\n const reloadSequence = bodyReloadSequenceRef.current + 1;\n const runBodyReload = () => {\n const bodyDataToApply = stagedBodyDataPropRef.current;\n\n bodyReloadStartTimeoutRef.current = undefined;\n bodyReloadStartedAtRef.current = getTreeGridPerfTimestamp();\n countTreeGridPerf(id, 'reload');\n logTreeGridPerf(id, 'ReloadBody start', {\n bodyRowCount: getTreeGridBodyDataCount(bodyDataToApply),\n });\n\n replaceTreeGridBodyData(treeGrid, bodyDataToApply, () => {\n if (bodyReloadSequenceRef.current !== reloadSequence) {\n return;\n }\n\n appliedBodyDataPropRef.current = bodyDataToApply;\n syncHasDisplayDataRows(treeGrid);\n measureTreeGridPerf(id, 'ReloadBody end', bodyReloadStartedAtRef.current, {\n bodyRowCount: getTreeGridBodyDataCount(bodyDataToApply),\n });\n bodyReloadStartedAtRef.current = null;\n\n if (stagedBodyDataPropRef.current === bodyDataToApply) {\n stagedBodyDataPropRef.current = undefined;\n hasStagedBodyDataPropRef.current = false;\n }\n\n const startedAt = bindingLoadingStartedAtRef.current;\n\n if (!showLoading || startedAt === null) {\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n return;\n }\n\n const remainingVisibleTime = Math.max(\n 0,\n TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS - (Date.now() - startedAt),\n );\n\n clearBindingLoadingHideTimeout();\n\n if (remainingVisibleTime === 0) {\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n return;\n }\n\n bindingLoadingHideTimeoutRef.current = window.setTimeout(() => {\n if (bodyReloadSequenceRef.current !== reloadSequence) {\n return;\n }\n\n bindingLoadingHideTimeoutRef.current = undefined;\n bindingLoadingStartedAtRef.current = null;\n setIsBindingLoadingVisible(false);\n }, remainingVisibleTime);\n });\n };\n\n bodyReloadSequenceRef.current = reloadSequence;\n stagedBodyDataPropRef.current = nextBodyData;\n hasStagedBodyDataPropRef.current = true;\n\n if (showLoading && nextBodyData !== undefined) {\n clearBodyReloadStartTimeout();\n clearBindingLoadingHideTimeout();\n bindingLoadingStartedAtRef.current = Date.now();\n setIsBindingLoadingVisible(true);\n bodyReloadStartTimeoutRef.current = window.setTimeout(() => {\n if (bodyReloadSequenceRef.current !== reloadSequence) {\n return;\n }\n\n runBodyReload();\n }, 0);\n } else {\n runBodyReload();\n }\n }\n }, [isTreeGridReady, layoutOverrides, data, showLoading, id]);\n\n useEffect(() => {\n return () => {\n clearBodyReloadStartTimeout();\n clearBindingLoadingHideTimeout();\n };\n }, []);\n\n const resolvedContainerStyle: CSSProperties = {\n height,\n width,\n ...containerStyle,\n };\n\n if (showLoading || isNoDataVisible) {\n resolvedContainerStyle.position =\n containerStyle?.position && containerStyle.position !== 'static'\n ? containerStyle.position\n : 'relative';\n resolvedContainerStyle.isolation = 'isolate';\n }\n\n return (\n <div ref={treeGridContainerRef} className={containerClassName} style={resolvedContainerStyle}>\n <div id={id} className={className} style={omit(style, ['height', 'width'])} />\n <OwpTreeGridNoDataOverlay\n visible={isNoDataVisible}\n message={t('Message.조회된 결과가 없습니다.')}\n overlayFrame={overlayFrame}\n />\n <OwpTreeGridLoadingOverlay visible={isLoadingOverlayVisible} overlayFrame={overlayFrame} />\n </div>\n );\n};\n\nexport { OwpTreeGrid };\n"],"names":["TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS","TREE_GRID_TEXT_RESOURCE_URLS","appendNoCacheQuery","__name","url","getTreeGridTextResourceUrl","languageId","resolveTreeGridDataUrl","dataUrl","buildTreeGridDataSource","useDataUrl","bodyData","isEmpty","buildTreeGridInitializationOptions","id","layoutUrl","width","height","getTreeGridBodyData","grid","get","getTreeGridBodyDataCount","isVisibleTreeGridRow","row","visible","isAddedTreeGridRow","added","isDisplayTreeGridRow","hasTreeGridDisplayDataRows","replaceTreeGridBodyData","onReloadFinish","currentDataConfig","_a","bindTreeGridEvents","latestEventHandlersRef","treeGridInstanceRef","treeGridInitStartedAtRef","latestLayoutOverridesRef","appliedLayoutOverridesRef","appliedBodyDataPropRef","hasAppliedInitialLayoutRef","syncHasDisplayDataRows","setIsTreeGridReady","initialEventHandlers","_b","debounce","col","x","y","event","deleteType","value","valueChangedHandler","selectedRows","autoupdate","latestLayoutOverrides","applyTreeGridLayoutToGrid","measureTreeGridPerf","OwpTreeGrid","containerStyle","containerClassName","className","style","layoutOverrides","data","onSelect","onRowClick","onRowAdd","onRowDelete","onRowUndelete","onRowChange","onClickButton","onSave","onReady","onAfterValueChanged","loading","showLoading","t","useOwpTranslation","useRef","treeGridContainerRef","bodyReloadStartedAtRef","latestBodyDataPropRef","stagedBodyDataPropRef","hasStagedBodyDataPropRef","bodyReloadSequenceRef","bindingLoadingStartedAtRef","bindingLoadingHideTimeoutRef","bodyReloadStartTimeoutRef","isTreeGridReady","useState","isBindingLoadingVisible","setIsBindingLoadingVisible","hasDisplayDataRows","setHasDisplayDataRows","currentLanguage","useGetCurrentLanguage","currentLanguageIdRef","isPendingBodyReload","isLoadingOverlayVisible","isNoDataVisible","overlayFrame","useOwpTreeGridOverlayFrame","clearBindingLoadingHideTimeout","clearBodyReloadStartTimeout","useEffect","handleBodyRowsChanged","TREE_GRID_BODY_ROWS_CHANGED_EVENT","getTreeGridPerfTimestamp","countTreeGridPerf","logTreeGridPerf","delay","useLayoutEffect","treeGrid","nextLayoutOverrides","nextBodyData","shouldApplyLayoutOverrides","isEqual","shouldApplyBodyData","layoutApplyStartedAt","reloadSequence","runBodyReload","bodyDataToApply","startedAt","remainingVisibleTime","resolvedContainerStyle","jsx","omit","OwpTreeGridNoDataOverlay","OwpTreeGridLoadingOverlay"],"mappings":"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"}
@@ -1,84 +1,86 @@
1
- var O = Object.defineProperty;
2
- var l = (i, o) => O(i, "name", { value: o, configurable: !0 });
3
- import { useState as R, useLayoutEffect as y } from "react";
4
- import { isEqual as E } from "../../../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/predicate/isEqual.js";
5
- const T = 2147483646, D = 2147483647, g = /* @__PURE__ */ l((i, o) => {
6
- const c = (o == null ? void 0 : o.MainTag) ?? i, a = Array.from(
7
- c.querySelectorAll("table.TSMainTable")
1
+ var A = Object.defineProperty;
2
+ var l = (i, o) => A(i, "name", { value: o, configurable: !0 });
3
+ import { useState as g, useLayoutEffect as _ } from "react";
4
+ import { countTreeGridPerf as O, isTreeGridPerfEnabled as b, getTreeGridPerfTimestamp as F, measureTreeGridPerf as G } from "../perf.js";
5
+ import { isEqual as L } from "../../../node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/predicate/isEqual.js";
6
+ const N = 2147483646, P = 2147483647, R = /* @__PURE__ */ l((i, o) => {
7
+ const r = (o == null ? void 0 : o.MainTag) ?? i, a = Array.from(
8
+ r.querySelectorAll("table.TSMainTable")
8
9
  );
9
- return (a.length > 0 ? a : Array.from(c.querySelectorAll("table"))).reduce((e, t) => {
10
- const n = t.getBoundingClientRect(), d = e == null ? void 0 : e.getBoundingClientRect();
11
- return n.width <= 0 || n.height <= 0 ? e : d ? n.width * n.height > d.width * d.height ? t : e : t;
10
+ return (a.length > 0 ? a : Array.from(r.querySelectorAll("table"))).reduce((e, s) => {
11
+ const t = s.getBoundingClientRect(), n = e == null ? void 0 : e.getBoundingClientRect();
12
+ return t.width <= 0 || t.height <= 0 ? e : n ? t.width * t.height > n.width * n.height ? s : e : s;
12
13
  }, null);
13
- }, "getTreeGridMainTableElement"), A = /* @__PURE__ */ l((i, o) => {
14
- const s = i.getBoundingClientRect(), c = i.clientWidth || s.width, a = i.clientHeight || s.height, r = g(i, o);
15
- if (!r)
14
+ }, "getTreeGridMainTableElement"), D = /* @__PURE__ */ l((i, o) => {
15
+ const c = i.getBoundingClientRect(), r = i.clientWidth || c.width, a = i.clientHeight || c.height, h = R(i, o);
16
+ if (!h)
16
17
  return {
17
18
  left: 0,
18
19
  top: 0,
19
- width: c,
20
+ width: r,
20
21
  height: a
21
22
  };
22
- const e = r.getBoundingClientRect();
23
+ const e = h.getBoundingClientRect();
23
24
  return e.width <= 0 || e.height <= 0 ? {
24
25
  left: 0,
25
26
  top: 0,
26
- width: c,
27
+ width: r,
27
28
  height: a
28
29
  } : {
29
- left: e.left - s.left,
30
- top: e.top - s.top,
30
+ left: e.left - c.left,
31
+ top: e.top - c.top,
31
32
  width: e.width,
32
33
  height: e.height
33
34
  };
34
- }, "getTreeGridOverlayFrame"), G = /* @__PURE__ */ l(({
35
+ }, "getTreeGridOverlayFrame"), S = /* @__PURE__ */ l(({
35
36
  visible: i,
36
37
  containerRef: o,
37
- treeGridInstanceRef: s
38
+ treeGridInstanceRef: c,
39
+ debugId: r
38
40
  }) => {
39
- const [c, a] = R({
41
+ const [a, h] = g({
40
42
  left: 0,
41
43
  top: 0,
42
44
  width: 0,
43
45
  height: 0
44
46
  });
45
- return y(() => {
47
+ return _(() => {
46
48
  if (!i)
47
49
  return;
48
- const r = o.current;
49
- if (!r)
50
+ const e = o.current;
51
+ if (!e)
50
52
  return;
51
- let e, t, n = null;
52
- const d = { capture: !0 }, b = /* @__PURE__ */ l((h) => {
53
- if (!t || n === h) {
54
- n = h;
53
+ let s, t, n = null;
54
+ const f = { capture: !0 }, T = /* @__PURE__ */ l((d) => {
55
+ if (!t || n === d) {
56
+ n = d;
55
57
  return;
56
58
  }
57
- n && t.unobserve(n), n = h, n && t.observe(n);
58
- }, "syncObservedMainTableElement"), f = /* @__PURE__ */ l(() => {
59
- const h = s.current, p = g(r, h), v = A(r, h);
60
- b(p), a(
61
- (w) => E(w, v) ? w : v
62
- );
59
+ n && t.unobserve(n), n = d, n && t.observe(n);
60
+ }, "syncObservedMainTableElement"), m = /* @__PURE__ */ l(() => {
61
+ const d = r && b() ? F() : null, w = c.current, E = R(e, w), p = D(e, w);
62
+ r && O(r, "overlay update"), T(E), h(
63
+ (y) => L(y, p) ? y : p
64
+ ), r && G(r, "overlay update end", d);
63
65
  }, "updateOverlayFrame"), u = /* @__PURE__ */ l(() => {
64
- e !== void 0 && window.cancelAnimationFrame(e), e = window.requestAnimationFrame(() => {
65
- e = void 0, f();
66
+ r && O(r, "overlay schedule"), s !== void 0 && window.cancelAnimationFrame(s), s = window.requestAnimationFrame(() => {
67
+ s = void 0, m();
66
68
  });
67
69
  }, "scheduleOverlayFrameUpdate");
68
- typeof ResizeObserver < "u" && (t = new ResizeObserver(u), t.observe(r));
69
- const m = new MutationObserver(u);
70
- return m.observe(r, { childList: !0, subtree: !0 }), window.addEventListener("resize", u), r.addEventListener("scroll", u, d), f(), () => {
71
- e !== void 0 && window.cancelAnimationFrame(e), window.removeEventListener("resize", u), r.removeEventListener(
70
+ typeof ResizeObserver < "u" && (t = new ResizeObserver(u), t.observe(e));
71
+ const v = new MutationObserver(u);
72
+ return v.observe(e, { childList: !0, subtree: !0 }), window.addEventListener("resize", u), e.addEventListener("scroll", u, f), m(), () => {
73
+ s !== void 0 && window.cancelAnimationFrame(s), window.removeEventListener("resize", u), e.removeEventListener(
72
74
  "scroll",
73
75
  u,
74
- d
75
- ), m.disconnect(), t && n && t.unobserve(n), t == null || t.disconnect();
76
+ f
77
+ ), v.disconnect(), t && n && t.unobserve(n), t == null || t.disconnect();
76
78
  };
77
- }, [o, s, i]), c;
79
+ }, [o, c, i, r]), a;
78
80
  }, "useOwpTreeGridOverlayFrame");
79
81
  export {
80
- D as TREE_GRID_LOADING_OVERLAY_Z_INDEX,
81
- T as TREE_GRID_NO_DATA_OVERLAY_Z_INDEX,
82
- G as useOwpTreeGridOverlayFrame
82
+ P as TREE_GRID_LOADING_OVERLAY_Z_INDEX,
83
+ N as TREE_GRID_NO_DATA_OVERLAY_Z_INDEX,
84
+ S as useOwpTreeGridOverlayFrame
83
85
  };
84
86
  //# sourceMappingURL=useOwpTreeGridOverlayFrame.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useOwpTreeGridOverlayFrame.js","sources":["../../../../src/components/OwpTreeGrid/hooks/useOwpTreeGridOverlayFrame.ts"],"sourcesContent":["import { isEqual } from 'es-toolkit/compat';\nimport { type RefObject, useLayoutEffect, useState } from 'react';\n\nexport type OwpTreeGridOverlayFrame = {\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\ntype UseOwpTreeGridOverlayFrameInput = {\n visible: boolean;\n containerRef: RefObject<HTMLDivElement | null>;\n treeGridInstanceRef: RefObject<TGrid>;\n};\n\nexport const TREE_GRID_NO_DATA_OVERLAY_Z_INDEX = 2147483646;\nexport const TREE_GRID_LOADING_OVERLAY_Z_INDEX = 2147483647;\n\nconst getTreeGridMainTableElement = (containerElement: HTMLDivElement, grid: TGrid | null) => {\n const mainTagElement = grid?.MainTag as HTMLElement | null | undefined;\n const scopedRootElement = mainTagElement ?? containerElement;\n const mainTableElements = Array.from(\n scopedRootElement.querySelectorAll<HTMLTableElement>('table.TSMainTable'),\n );\n\n const tableElements =\n mainTableElements.length > 0\n ? mainTableElements\n : Array.from(scopedRootElement.querySelectorAll<HTMLTableElement>('table'));\n\n return tableElements.reduce<HTMLTableElement | null>((largestTableElement, tableElement) => {\n const tableRect = tableElement.getBoundingClientRect();\n const largestTableRect = largestTableElement?.getBoundingClientRect();\n\n if (tableRect.width <= 0 || tableRect.height <= 0) {\n return largestTableElement;\n }\n\n if (!largestTableRect) {\n return tableElement;\n }\n\n return tableRect.width * tableRect.height > largestTableRect.width * largestTableRect.height\n ? tableElement\n : largestTableElement;\n }, null);\n};\n\nconst getTreeGridOverlayFrame = (\n containerElement: HTMLDivElement,\n grid: TGrid | null,\n): OwpTreeGridOverlayFrame => {\n const containerRect = containerElement.getBoundingClientRect();\n const fallbackWidth = containerElement.clientWidth || containerRect.width;\n const fallbackHeight = containerElement.clientHeight || containerRect.height;\n const mainTableElement = getTreeGridMainTableElement(containerElement, grid);\n\n if (!mainTableElement) {\n return {\n left: 0,\n top: 0,\n width: fallbackWidth,\n height: fallbackHeight,\n };\n }\n\n const tableRect = mainTableElement.getBoundingClientRect();\n\n if (tableRect.width <= 0 || tableRect.height <= 0) {\n return {\n left: 0,\n top: 0,\n width: fallbackWidth,\n height: fallbackHeight,\n };\n }\n\n return {\n left: tableRect.left - containerRect.left,\n top: tableRect.top - containerRect.top,\n width: tableRect.width,\n height: tableRect.height,\n };\n};\n\n/**\n * TreeGrid overlay frame hook\n * @param visible overlay visibility\n * @param containerRef TreeGrid container ref\n * @param treeGridInstanceRef TreeGrid instance ref\n */\nconst useOwpTreeGridOverlayFrame = ({\n visible,\n containerRef,\n treeGridInstanceRef,\n}: UseOwpTreeGridOverlayFrameInput) => {\n const [overlayFrame, setOverlayFrame] = useState<OwpTreeGridOverlayFrame>({\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n });\n\n useLayoutEffect(() => {\n if (!visible) {\n return;\n }\n\n const containerElement = containerRef.current;\n\n if (!containerElement) {\n return;\n }\n\n let animationFrameId: number | undefined;\n let resizeObserver: ResizeObserver | undefined;\n let observedMainTableElement: HTMLTableElement | null = null;\n const scrollListenerOptions = { capture: true } as const;\n\n const syncObservedMainTableElement = (nextMainTableElement: HTMLTableElement | null) => {\n if (!resizeObserver || observedMainTableElement === nextMainTableElement) {\n observedMainTableElement = nextMainTableElement;\n return;\n }\n\n if (observedMainTableElement) {\n resizeObserver.unobserve(observedMainTableElement);\n }\n\n observedMainTableElement = nextMainTableElement;\n\n if (observedMainTableElement) {\n resizeObserver.observe(observedMainTableElement);\n }\n };\n\n const updateOverlayFrame = () => {\n const treeGrid = treeGridInstanceRef.current;\n const mainTableElement = getTreeGridMainTableElement(containerElement, treeGrid);\n const nextOverlayFrame = getTreeGridOverlayFrame(containerElement, treeGrid);\n\n syncObservedMainTableElement(mainTableElement);\n\n setOverlayFrame((currentOverlayFrame) =>\n isEqual(currentOverlayFrame, nextOverlayFrame) ? currentOverlayFrame : nextOverlayFrame,\n );\n };\n\n const scheduleOverlayFrameUpdate = () => {\n if (animationFrameId !== undefined) {\n window.cancelAnimationFrame(animationFrameId);\n }\n\n animationFrameId = window.requestAnimationFrame(() => {\n animationFrameId = undefined;\n updateOverlayFrame();\n });\n };\n\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(scheduleOverlayFrameUpdate);\n resizeObserver.observe(containerElement);\n }\n\n const mutationObserver = new MutationObserver(scheduleOverlayFrameUpdate);\n mutationObserver.observe(containerElement, { childList: true, subtree: true });\n window.addEventListener('resize', scheduleOverlayFrameUpdate);\n containerElement.addEventListener('scroll', scheduleOverlayFrameUpdate, scrollListenerOptions);\n updateOverlayFrame();\n\n return () => {\n if (animationFrameId !== undefined) {\n window.cancelAnimationFrame(animationFrameId);\n }\n\n window.removeEventListener('resize', scheduleOverlayFrameUpdate);\n containerElement.removeEventListener(\n 'scroll',\n scheduleOverlayFrameUpdate,\n scrollListenerOptions,\n );\n mutationObserver.disconnect();\n\n if (resizeObserver && observedMainTableElement) {\n resizeObserver.unobserve(observedMainTableElement);\n }\n\n resizeObserver?.disconnect();\n };\n }, [containerRef, treeGridInstanceRef, visible]);\n\n return overlayFrame;\n};\n\nexport { useOwpTreeGridOverlayFrame };\n"],"names":["TREE_GRID_NO_DATA_OVERLAY_Z_INDEX","TREE_GRID_LOADING_OVERLAY_Z_INDEX","getTreeGridMainTableElement","__name","containerElement","grid","scopedRootElement","mainTableElements","largestTableElement","tableElement","tableRect","largestTableRect","getTreeGridOverlayFrame","containerRect","fallbackWidth","fallbackHeight","mainTableElement","useOwpTreeGridOverlayFrame","visible","containerRef","treeGridInstanceRef","overlayFrame","setOverlayFrame","useState","useLayoutEffect","animationFrameId","resizeObserver","observedMainTableElement","scrollListenerOptions","syncObservedMainTableElement","nextMainTableElement","updateOverlayFrame","treeGrid","nextOverlayFrame","currentOverlayFrame","isEqual","scheduleOverlayFrameUpdate","mutationObserver"],"mappings":"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"}
1
+ {"version":3,"file":"useOwpTreeGridOverlayFrame.js","sources":["../../../../src/components/OwpTreeGrid/hooks/useOwpTreeGridOverlayFrame.ts"],"sourcesContent":["import { isEqual } from 'es-toolkit/compat';\nimport { type RefObject, useLayoutEffect, useState } from 'react';\n// Temporary TreeGrid perf instrumentation import. Remove with ../perf after profiling is finished.\nimport {\n countTreeGridPerf,\n getTreeGridPerfTimestamp,\n isTreeGridPerfEnabled,\n measureTreeGridPerf,\n} from '../perf';\n\nexport type OwpTreeGridOverlayFrame = {\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\ntype UseOwpTreeGridOverlayFrameInput = {\n visible: boolean;\n containerRef: RefObject<HTMLDivElement | null>;\n treeGridInstanceRef: RefObject<TGrid>;\n debugId?: string;\n};\n\nexport const TREE_GRID_NO_DATA_OVERLAY_Z_INDEX = 2147483646;\nexport const TREE_GRID_LOADING_OVERLAY_Z_INDEX = 2147483647;\n\nconst getTreeGridMainTableElement = (containerElement: HTMLDivElement, grid: TGrid | null) => {\n const mainTagElement = grid?.MainTag as HTMLElement | null | undefined;\n const scopedRootElement = mainTagElement ?? containerElement;\n const mainTableElements = Array.from(\n scopedRootElement.querySelectorAll<HTMLTableElement>('table.TSMainTable'),\n );\n\n const tableElements =\n mainTableElements.length > 0\n ? mainTableElements\n : Array.from(scopedRootElement.querySelectorAll<HTMLTableElement>('table'));\n\n return tableElements.reduce<HTMLTableElement | null>((largestTableElement, tableElement) => {\n const tableRect = tableElement.getBoundingClientRect();\n const largestTableRect = largestTableElement?.getBoundingClientRect();\n\n if (tableRect.width <= 0 || tableRect.height <= 0) {\n return largestTableElement;\n }\n\n if (!largestTableRect) {\n return tableElement;\n }\n\n return tableRect.width * tableRect.height > largestTableRect.width * largestTableRect.height\n ? tableElement\n : largestTableElement;\n }, null);\n};\n\nconst getTreeGridOverlayFrame = (\n containerElement: HTMLDivElement,\n grid: TGrid | null,\n): OwpTreeGridOverlayFrame => {\n const containerRect = containerElement.getBoundingClientRect();\n const fallbackWidth = containerElement.clientWidth || containerRect.width;\n const fallbackHeight = containerElement.clientHeight || containerRect.height;\n const mainTableElement = getTreeGridMainTableElement(containerElement, grid);\n\n if (!mainTableElement) {\n return {\n left: 0,\n top: 0,\n width: fallbackWidth,\n height: fallbackHeight,\n };\n }\n\n const tableRect = mainTableElement.getBoundingClientRect();\n\n if (tableRect.width <= 0 || tableRect.height <= 0) {\n return {\n left: 0,\n top: 0,\n width: fallbackWidth,\n height: fallbackHeight,\n };\n }\n\n return {\n left: tableRect.left - containerRect.left,\n top: tableRect.top - containerRect.top,\n width: tableRect.width,\n height: tableRect.height,\n };\n};\n\n/**\n * TreeGrid overlay frame hook\n * @param visible overlay visibility\n * @param containerRef TreeGrid container ref\n * @param treeGridInstanceRef TreeGrid instance ref\n */\nconst useOwpTreeGridOverlayFrame = ({\n visible,\n containerRef,\n treeGridInstanceRef,\n debugId,\n}: UseOwpTreeGridOverlayFrameInput) => {\n const [overlayFrame, setOverlayFrame] = useState<OwpTreeGridOverlayFrame>({\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n });\n\n useLayoutEffect(() => {\n if (!visible) {\n return;\n }\n\n const containerElement = containerRef.current;\n\n if (!containerElement) {\n return;\n }\n\n let animationFrameId: number | undefined;\n let resizeObserver: ResizeObserver | undefined;\n let observedMainTableElement: HTMLTableElement | null = null;\n const scrollListenerOptions = { capture: true } as const;\n\n const syncObservedMainTableElement = (nextMainTableElement: HTMLTableElement | null) => {\n if (!resizeObserver || observedMainTableElement === nextMainTableElement) {\n observedMainTableElement = nextMainTableElement;\n return;\n }\n\n if (observedMainTableElement) {\n resizeObserver.unobserve(observedMainTableElement);\n }\n\n observedMainTableElement = nextMainTableElement;\n\n if (observedMainTableElement) {\n resizeObserver.observe(observedMainTableElement);\n }\n };\n\n const updateOverlayFrame = () => {\n const startedAt =\n debugId && isTreeGridPerfEnabled() ? getTreeGridPerfTimestamp() : null;\n const treeGrid = treeGridInstanceRef.current;\n const mainTableElement = getTreeGridMainTableElement(containerElement, treeGrid);\n const nextOverlayFrame = getTreeGridOverlayFrame(containerElement, treeGrid);\n\n if (debugId) {\n countTreeGridPerf(debugId, 'overlay update');\n }\n\n syncObservedMainTableElement(mainTableElement);\n\n setOverlayFrame((currentOverlayFrame) =>\n isEqual(currentOverlayFrame, nextOverlayFrame) ? currentOverlayFrame : nextOverlayFrame,\n );\n\n if (debugId) {\n measureTreeGridPerf(debugId, 'overlay update end', startedAt);\n }\n };\n\n const scheduleOverlayFrameUpdate = () => {\n if (debugId) {\n countTreeGridPerf(debugId, 'overlay schedule');\n }\n\n if (animationFrameId !== undefined) {\n window.cancelAnimationFrame(animationFrameId);\n }\n\n animationFrameId = window.requestAnimationFrame(() => {\n animationFrameId = undefined;\n updateOverlayFrame();\n });\n };\n\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(scheduleOverlayFrameUpdate);\n resizeObserver.observe(containerElement);\n }\n\n const mutationObserver = new MutationObserver(scheduleOverlayFrameUpdate);\n mutationObserver.observe(containerElement, { childList: true, subtree: true });\n window.addEventListener('resize', scheduleOverlayFrameUpdate);\n containerElement.addEventListener('scroll', scheduleOverlayFrameUpdate, scrollListenerOptions);\n updateOverlayFrame();\n\n return () => {\n if (animationFrameId !== undefined) {\n window.cancelAnimationFrame(animationFrameId);\n }\n\n window.removeEventListener('resize', scheduleOverlayFrameUpdate);\n containerElement.removeEventListener(\n 'scroll',\n scheduleOverlayFrameUpdate,\n scrollListenerOptions,\n );\n mutationObserver.disconnect();\n\n if (resizeObserver && observedMainTableElement) {\n resizeObserver.unobserve(observedMainTableElement);\n }\n\n resizeObserver?.disconnect();\n };\n }, [containerRef, treeGridInstanceRef, visible, debugId]);\n\n return overlayFrame;\n};\n\nexport { useOwpTreeGridOverlayFrame };\n"],"names":["TREE_GRID_NO_DATA_OVERLAY_Z_INDEX","TREE_GRID_LOADING_OVERLAY_Z_INDEX","getTreeGridMainTableElement","__name","containerElement","grid","scopedRootElement","mainTableElements","largestTableElement","tableElement","tableRect","largestTableRect","getTreeGridOverlayFrame","containerRect","fallbackWidth","fallbackHeight","mainTableElement","useOwpTreeGridOverlayFrame","visible","containerRef","treeGridInstanceRef","debugId","overlayFrame","setOverlayFrame","useState","useLayoutEffect","animationFrameId","resizeObserver","observedMainTableElement","scrollListenerOptions","syncObservedMainTableElement","nextMainTableElement","updateOverlayFrame","startedAt","isTreeGridPerfEnabled","getTreeGridPerfTimestamp","treeGrid","nextOverlayFrame","countTreeGridPerf","currentOverlayFrame","isEqual","measureTreeGridPerf","scheduleOverlayFrameUpdate","mutationObserver"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ var c = Object.defineProperty;
2
+ var n = (e, r) => c(e, "name", { value: r, configurable: !0 });
3
+ const s = "__OWP_TREE_GRID_PERF__", i = /* @__PURE__ */ n(() => typeof window < "u" && !!window[s], "isTreeGridPerfEnabled"), u = /* @__PURE__ */ n(() => typeof performance < "u" ? performance.now() : Date.now(), "getTreeGridPerfTimestamp"), T = /* @__PURE__ */ n((e, r) => {
4
+ i() && console.count(`[OwpTreeGrid:${e}] ${r}`);
5
+ }, "countTreeGridPerf"), d = /* @__PURE__ */ n((e, r, o) => {
6
+ if (i()) {
7
+ if (o) {
8
+ console.info(`[OwpTreeGrid:${e}] ${r}`, o);
9
+ return;
10
+ }
11
+ console.info(`[OwpTreeGrid:${e}] ${r}`);
12
+ }
13
+ }, "logTreeGridPerf"), w = /* @__PURE__ */ n((e, r, o, t) => {
14
+ if (!i() || o === null)
15
+ return;
16
+ const f = Number((u() - o).toFixed(1));
17
+ if (t) {
18
+ console.info(`[OwpTreeGrid:${e}] ${r}`, { durationMs: f, ...t });
19
+ return;
20
+ }
21
+ console.info(`[OwpTreeGrid:${e}] ${r}`, { durationMs: f });
22
+ }, "measureTreeGridPerf");
23
+ export {
24
+ s as TREE_GRID_PERF_FLAG,
25
+ T as countTreeGridPerf,
26
+ u as getTreeGridPerfTimestamp,
27
+ i as isTreeGridPerfEnabled,
28
+ d as logTreeGridPerf,
29
+ w as measureTreeGridPerf
30
+ };
31
+ //# sourceMappingURL=perf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf.js","sources":["../../../src/components/OwpTreeGrid/perf.ts"],"sourcesContent":["/** Temporary TreeGrid perf instrumentation. Remove after profiling is no longer needed. */\ntype TreeGridPerfWindow = Window & {\n __OWP_TREE_GRID_PERF__?: boolean;\n};\n\nexport const TREE_GRID_PERF_FLAG = '__OWP_TREE_GRID_PERF__';\n\n/**\n * TreeGrid 성능 계측 활성 여부\n */\nexport const isTreeGridPerfEnabled = () => {\n return typeof window !== 'undefined' && Boolean((window as TreeGridPerfWindow)[TREE_GRID_PERF_FLAG]);\n};\n\n/**\n * TreeGrid 성능 계측 타임스탬프 반환\n */\nexport const getTreeGridPerfTimestamp = () => {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n};\n\n/**\n * TreeGrid 성능 계측 카운트 로그\n * @param gridId TreeGrid 인스턴스 ID\n * @param label 계측 라벨\n */\nexport const countTreeGridPerf = (gridId: string, label: string) => {\n if (!isTreeGridPerfEnabled()) {\n return;\n }\n\n console.count(`[OwpTreeGrid:${gridId}] ${label}`);\n};\n\n/**\n * TreeGrid 성능 계측 디버그 로그\n * @param gridId TreeGrid 인스턴스 ID\n * @param label 계측 라벨\n * @param payload 부가 정보\n */\nexport const logTreeGridPerf = (\n gridId: string,\n label: string,\n payload?: Record<string, unknown>,\n) => {\n if (!isTreeGridPerfEnabled()) {\n return;\n }\n\n if (payload) {\n console.info(`[OwpTreeGrid:${gridId}] ${label}`, payload);\n return;\n }\n\n console.info(`[OwpTreeGrid:${gridId}] ${label}`);\n};\n\n/**\n * TreeGrid 성능 계측 측정 로그\n * @param gridId TreeGrid 인스턴스 ID\n * @param label 계측 라벨\n * @param startedAt 시작 시각\n * @param payload 부가 정보\n */\nexport const measureTreeGridPerf = (\n gridId: string,\n label: string,\n startedAt: number | null,\n payload?: Record<string, unknown>,\n) => {\n if (!isTreeGridPerfEnabled() || startedAt === null) {\n return;\n }\n\n const durationMs = Number((getTreeGridPerfTimestamp() - startedAt).toFixed(1));\n\n if (payload) {\n console.info(`[OwpTreeGrid:${gridId}] ${label}`, { durationMs, ...payload });\n return;\n }\n\n console.info(`[OwpTreeGrid:${gridId}] ${label}`, { durationMs });\n};\n"],"names":["TREE_GRID_PERF_FLAG","isTreeGridPerfEnabled","__name","getTreeGridPerfTimestamp","countTreeGridPerf","gridId","label","logTreeGridPerf","payload","measureTreeGridPerf","startedAt","durationMs"],"mappings":";;AAKO,MAAMA,IAAsB,0BAKtBC,IAAwB,gBAAAC,EAAA,MAC5B,OAAO,SAAW,OAAe,EAAS,OAA8BF,CAAmB,GAD/D,0BAOxBG,IAA2B,gBAAAD,EAAA,MAC/B,OAAO,cAAgB,MAAc,YAAY,IAAA,IAAQ,KAAK,IAAA,GAD/B,6BAS3BE,IAAoB,gBAAAF,EAAA,CAACG,GAAgBC,MAAkB;AAClE,EAAKL,OAIL,QAAQ,MAAM,gBAAgBI,CAAM,KAAKC,CAAK,EAAE;AAClD,GANiC,sBAcpBC,IAAkB,gBAAAL,EAAA,CAC7BG,GACAC,GACAE,MACG;AACH,MAAKP,KAIL;AAAA,QAAIO,GAAS;AACX,cAAQ,KAAK,gBAAgBH,CAAM,KAAKC,CAAK,IAAIE,CAAO;AACxD;AAAA,IACF;AAEA,YAAQ,KAAK,gBAAgBH,CAAM,KAAKC,CAAK,EAAE;AAAA;AACjD,GAf+B,oBAwBlBG,IAAsB,gBAAAP,EAAA,CACjCG,GACAC,GACAI,GACAF,MACG;AACH,MAAI,CAACP,EAAA,KAA2BS,MAAc;AAC5C;AAGF,QAAMC,IAAa,QAAQR,EAAA,IAA6BO,GAAW,QAAQ,CAAC,CAAC;AAE7E,MAAIF,GAAS;AACX,YAAQ,KAAK,gBAAgBH,CAAM,KAAKC,CAAK,IAAI,EAAE,YAAAK,GAAY,GAAGH,EAAA,CAAS;AAC3E;AAAA,EACF;AAEA,UAAQ,KAAK,gBAAgBH,CAAM,KAAKC,CAAK,IAAI,EAAE,YAAAK,GAAY;AACjE,GAlBmC;"}
@@ -0,0 +1,34 @@
1
+ var f = Object.defineProperty;
2
+ var o = (r, t) => f(r, "name", { value: t, configurable: !0 });
3
+ import { jsx as d } 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
+ import { useConfirm as u } from "../../hooks/useConfirm.js";
5
+ import { useOwpTranslation as p } from "../../hooks/useOwpTranslation.js";
6
+ import { resetTreeGridChangesById as c } from "../../utils/treeGridUtil.js";
7
+ import { Button as l } from "@mui/material";
8
+ const G = /* @__PURE__ */ o(({
9
+ gridId: r,
10
+ confirmTitle: t,
11
+ children: s,
12
+ onClick: e,
13
+ ...m
14
+ }) => {
15
+ const { t: n } = p(), { confirmInfo: a } = u();
16
+ return /* @__PURE__ */ d(
17
+ l,
18
+ {
19
+ variant: "outlined",
20
+ color: "primary",
21
+ ...m,
22
+ onClick: /* @__PURE__ */ o(async (i) => {
23
+ e == null || e(i), !(i.defaultPrevented || !await a({
24
+ title: t ?? n("Message.그리드 변경 사항을 초기화하시겠습니까?")
25
+ })) && c(r);
26
+ }, "handleClick"),
27
+ children: s ?? n("Button.변경 초기화")
28
+ }
29
+ );
30
+ }, "OwpTreeGridResetChangesButton");
31
+ export {
32
+ G as OwpTreeGridResetChangesButton
33
+ };
34
+ //# sourceMappingURL=OwpTreeGridResetChangesButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwpTreeGridResetChangesButton.js","sources":["../../../src/components/OwpTreeGridResetChangesButton/OwpTreeGridResetChangesButton.tsx"],"sourcesContent":["import { useConfirm } from '@/hooks/useConfirm';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { resetTreeGridChangesById } from '@/utils/treeGridUtil';\nimport { Button, type ButtonProps } from '@mui/material';\nimport { type MouseEventHandler, type ReactNode } from 'react';\n\nexport interface OwpTreeGridResetChangesButtonProps extends ButtonProps {\n gridId: string;\n confirmTitle?: ReactNode | string;\n}\n\n/**\n * TreeGrid 변경 사항 초기화 버튼\n * @param gridId TreeGrid 인스턴스 ID\n * @param confirmTitle 확인 대화상자 제목\n */\nconst OwpTreeGridResetChangesButton = ({\n gridId,\n confirmTitle,\n children,\n onClick,\n ...buttonProps\n}: OwpTreeGridResetChangesButtonProps) => {\n const { t } = useOwpTranslation();\n const { confirmInfo } = useConfirm();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = async (event) => {\n onClick?.(event);\n\n if (event.defaultPrevented) {\n return;\n }\n\n const isConfirmed = await confirmInfo({\n title:\n confirmTitle ??\n t('Message.그리드 변경 사항을 초기화하시겠습니까?'),\n });\n\n if (!isConfirmed) {\n return;\n }\n\n resetTreeGridChangesById(gridId);\n };\n\n return (\n <Button\n variant=\"outlined\"\n color=\"primary\"\n {...buttonProps}\n onClick={handleClick}\n >\n {children ?? t('Button.변경 초기화')}\n </Button>\n );\n};\n\nexport { OwpTreeGridResetChangesButton };\n"],"names":["OwpTreeGridResetChangesButton","__name","gridId","confirmTitle","children","onClick","buttonProps","t","useOwpTranslation","confirmInfo","useConfirm","jsx","Button","event","resetTreeGridChangesById"],"mappings":";;;;;;;AAgBA,MAAMA,IAAgC,gBAAAC,EAAA,CAAC;AAAA,EACrC,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,MAA0C;AACxC,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,aAAAC,EAAA,IAAgBC,EAAA;AAsBxB,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACL,GAAGN;AAAA,MACJ,SAzBsD,gBAAAL,EAAA,OAAOY,MAAU;AAazE,QAZAR,KAAA,QAAAA,EAAUQ,IAEN,EAAAA,EAAM,oBAUN,CANgB,MAAMJ,EAAY;AAAA,UACpC,OACEN,KACAI,EAAE,+BAA+B;AAAA,QAAA,CACpC,MAMDO,EAAyBZ,CAAM;AAAA,MACjC,GAlB0D;AAAA,MA2BrD,UAAAE,KAAYG,EAAE,eAAe;AAAA,IAAA;AAAA,EAAA;AAGpC,GAxCsC;"}
@@ -0,0 +1,48 @@
1
+ var b = Object.defineProperty;
2
+ var s = (t, e) => b(t, "name", { value: e, configurable: !0 });
3
+ import { useRef as u, useState as C, useLayoutEffect as S } from "react";
4
+ const y = /* @__PURE__ */ s((t) => !t || t.getClientRects().length === 0 ? 0 : t.offsetWidth, "getVisibleElementWidth"), h = /* @__PURE__ */ s((t) => {
5
+ if (!t || t.getClientRects().length === 0)
6
+ return 0;
7
+ const e = Array.from(t.children).filter(
8
+ (r) => r.getClientRects().length > 0
9
+ );
10
+ if (e.length === 0)
11
+ return t.offsetWidth;
12
+ const n = window.getComputedStyle(t), o = Number.parseFloat(n.columnGap || n.gap || "0") || 0;
13
+ return e.reduce((r, l) => r + l.offsetWidth, 0) + o * Math.max(e.length - 1, 0);
14
+ }, "getGroupContentWidth"), E = /* @__PURE__ */ s((t = []) => {
15
+ const e = u(null), n = u(null), o = u(null), r = u(null), [l, g] = C(!1);
16
+ return S(() => {
17
+ const c = e.current;
18
+ if (!c)
19
+ return;
20
+ const d = /* @__PURE__ */ s(() => {
21
+ const i = window.getComputedStyle(c), W = Number.parseFloat(i.columnGap || i.gap || "0") || 0, p = [
22
+ y(n.current),
23
+ h(o.current),
24
+ h(r.current)
25
+ ].filter((a) => a > 0), m = p.reduce((a, R) => a + R, 0) + W * Math.max(p.length - 1, 0);
26
+ g(m > c.clientWidth);
27
+ }, "updateWrapState");
28
+ d();
29
+ const f = new ResizeObserver(() => {
30
+ d();
31
+ });
32
+ return [c, n.current, o.current, r.current].filter(Boolean).forEach((i) => {
33
+ f.observe(i);
34
+ }), () => {
35
+ f.disconnect();
36
+ };
37
+ }, [t]), {
38
+ containerRef: e,
39
+ titleRef: n,
40
+ slotsRef: o,
41
+ actionsRef: r,
42
+ isWrapped: l
43
+ };
44
+ }, "useHeaderWrapState");
45
+ export {
46
+ E as useHeaderWrapState
47
+ };
48
+ //# sourceMappingURL=useHeaderWrapState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHeaderWrapState.js","sources":["../../src/hooks/useHeaderWrapState.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState, type RefObject } from 'react';\n\ntype HeaderWrapState = {\n containerRef: RefObject<HTMLDivElement | null>;\n titleRef: RefObject<HTMLDivElement | null>;\n slotsRef: RefObject<HTMLDivElement | null>;\n actionsRef: RefObject<HTMLDivElement | null>;\n isWrapped: boolean;\n};\n\nconst getVisibleElementWidth = (element: HTMLElement | null) => {\n if (!element || element.getClientRects().length === 0) {\n return 0;\n }\n\n return element.offsetWidth;\n};\n\nconst getGroupContentWidth = (element: HTMLElement | null) => {\n if (!element || element.getClientRects().length === 0) {\n return 0;\n }\n\n const visibleChildren = Array.from(element.children).filter(\n (child) => (child as HTMLElement).getClientRects().length > 0,\n ) as HTMLElement[];\n\n if (visibleChildren.length === 0) {\n return element.offsetWidth;\n }\n\n const computedStyle = window.getComputedStyle(element);\n const gap = Number.parseFloat(computedStyle.columnGap || computedStyle.gap || '0') || 0;\n\n return (\n visibleChildren.reduce((totalWidth, child) => totalWidth + child.offsetWidth, 0) +\n gap * Math.max(visibleChildren.length - 1, 0)\n );\n};\n\n/**\n * 헤더 한 줄 배치 가능 여부 계산 훅\n * @param deps 측정 재실행 의존성\n */\nconst useHeaderWrapState = (deps: unknown[] = []): HeaderWrapState => {\n const containerRef = useRef<HTMLDivElement>(null);\n const titleRef = useRef<HTMLDivElement>(null);\n const slotsRef = useRef<HTMLDivElement>(null);\n const actionsRef = useRef<HTMLDivElement>(null);\n const [isWrapped, setIsWrapped] = useState(false);\n\n useLayoutEffect(() => {\n const containerElement = containerRef.current;\n\n if (!containerElement) {\n return undefined;\n }\n\n const updateWrapState = () => {\n const containerStyle = window.getComputedStyle(containerElement);\n const columnGap =\n Number.parseFloat(containerStyle.columnGap || containerStyle.gap || '0') || 0;\n const groupWidths = [\n getVisibleElementWidth(titleRef.current),\n getGroupContentWidth(slotsRef.current),\n getGroupContentWidth(actionsRef.current),\n ].filter((width) => width > 0);\n const requiredWidth =\n groupWidths.reduce((totalWidth, width) => totalWidth + width, 0) +\n columnGap * Math.max(groupWidths.length - 1, 0);\n\n setIsWrapped(requiredWidth > containerElement.clientWidth);\n };\n\n updateWrapState();\n\n const resizeObserver = new ResizeObserver(() => {\n updateWrapState();\n });\n\n [containerElement, titleRef.current, slotsRef.current, actionsRef.current]\n .filter(Boolean)\n .forEach((element) => {\n resizeObserver.observe(element as HTMLElement);\n });\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [deps]);\n\n return {\n containerRef,\n titleRef,\n slotsRef,\n actionsRef,\n isWrapped,\n };\n};\n\nexport { useHeaderWrapState };\n"],"names":["getVisibleElementWidth","__name","element","getGroupContentWidth","visibleChildren","child","computedStyle","gap","totalWidth","useHeaderWrapState","deps","containerRef","useRef","titleRef","slotsRef","actionsRef","isWrapped","setIsWrapped","useState","useLayoutEffect","containerElement","updateWrapState","containerStyle","columnGap","groupWidths","width","requiredWidth","resizeObserver"],"mappings":";;;AAUA,MAAMA,IAAyB,gBAAAC,EAAA,CAACC,MAC1B,CAACA,KAAWA,EAAQ,eAAA,EAAiB,WAAW,IAC3C,IAGFA,EAAQ,aALc,2BAQzBC,IAAuB,gBAAAF,EAAA,CAACC,MAAgC;AAC5D,MAAI,CAACA,KAAWA,EAAQ,eAAA,EAAiB,WAAW;AAClD,WAAO;AAGT,QAAME,IAAkB,MAAM,KAAKF,EAAQ,QAAQ,EAAE;AAAA,IACnD,CAACG,MAAWA,EAAsB,eAAA,EAAiB,SAAS;AAAA,EAAA;AAG9D,MAAID,EAAgB,WAAW;AAC7B,WAAOF,EAAQ;AAGjB,QAAMI,IAAgB,OAAO,iBAAiBJ,CAAO,GAC/CK,IAAM,OAAO,WAAWD,EAAc,aAAaA,EAAc,OAAO,GAAG,KAAK;AAEtF,SACEF,EAAgB,OAAO,CAACI,GAAYH,MAAUG,IAAaH,EAAM,aAAa,CAAC,IAC/EE,IAAM,KAAK,IAAIH,EAAgB,SAAS,GAAG,CAAC;AAEhD,GApB6B,yBA0BvBK,IAAqB,gBAAAR,EAAA,CAACS,IAAkB,OAAwB;AACpE,QAAMC,IAAeC,EAAuB,IAAI,GAC1CC,IAAWD,EAAuB,IAAI,GACtCE,IAAWF,EAAuB,IAAI,GACtCG,IAAaH,EAAuB,IAAI,GACxC,CAACI,GAAWC,CAAY,IAAIC,EAAS,EAAK;AAEhD,SAAAC,EAAgB,MAAM;AACpB,UAAMC,IAAmBT,EAAa;AAEtC,QAAI,CAACS;AACH;AAGF,UAAMC,IAAkB,gBAAApB,EAAA,MAAM;AAC5B,YAAMqB,IAAiB,OAAO,iBAAiBF,CAAgB,GACzDG,IACJ,OAAO,WAAWD,EAAe,aAAaA,EAAe,OAAO,GAAG,KAAK,GACxEE,IAAc;AAAA,QAClBxB,EAAuBa,EAAS,OAAO;AAAA,QACvCV,EAAqBW,EAAS,OAAO;AAAA,QACrCX,EAAqBY,EAAW,OAAO;AAAA,MAAA,EACvC,OAAO,CAACU,MAAUA,IAAQ,CAAC,GACvBC,IACJF,EAAY,OAAO,CAAChB,GAAYiB,MAAUjB,IAAaiB,GAAO,CAAC,IAC/DF,IAAY,KAAK,IAAIC,EAAY,SAAS,GAAG,CAAC;AAEhD,MAAAP,EAAaS,IAAgBN,EAAiB,WAAW;AAAA,IAC3D,GAdwB;AAgBxB,IAAAC,EAAA;AAEA,UAAMM,IAAiB,IAAI,eAAe,MAAM;AAC9C,MAAAN,EAAA;AAAA,IACF,CAAC;AAED,YAACD,GAAkBP,EAAS,SAASC,EAAS,SAASC,EAAW,OAAO,EACtE,OAAO,OAAO,EACd,QAAQ,CAACb,MAAY;AACpB,MAAAyB,EAAe,QAAQzB,CAAsB;AAAA,IAC/C,CAAC,GAEI,MAAM;AACX,MAAAyB,EAAe,WAAA;AAAA,IACjB;AAAA,EACF,GAAG,CAACjB,CAAI,CAAC,GAEF;AAAA,IACL,cAAAC;AAAA,IACA,UAAAE;AAAA,IACA,UAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAC;AAAA,EAAA;AAEJ,GAtD2B;"}
package/dist/hooks.js CHANGED
@@ -1,33 +1,34 @@
1
- import { useGetCommonCodeList as r, useSetCommonCodeList as t } from "./hooks/useCommonCodeList.js";
1
+ import { useGetCommonCodeList as o, useSetCommonCodeList as t } from "./hooks/useCommonCodeList.js";
2
2
  import { useAccessTokenGuard as u } from "./hooks/useAccessTokenGuard.js";
3
- import { useAppDispatch as p, useAppSelector as f, useAppStore as n } from "./hooks/useAppStore.js";
3
+ import { useAppDispatch as m, useAppSelector as f, useAppStore as n } from "./hooks/useAppStore.js";
4
4
  import { useConfirm as a } from "./hooks/useConfirm.js";
5
5
  import { useGetCurrentLanguage as C, useGetLanguageList as L, useSetCurrentLanguage as g } from "./hooks/useCurrentLanguage.js";
6
- import { useGetLogoSrc as G, useSetLogoSrc as S } from "./hooks/useLogoSrc.js";
6
+ import { useGetLogoSrc as c, useSetLogoSrc as G } from "./hooks/useLogoSrc.js";
7
7
  import { useGetCurrentUser as A, useSetCurrentUser as E } from "./hooks/useCurrentUser.js";
8
8
  import { useGetCurrentUserId as h, useSetCurrentUserId as v } from "./hooks/useCurrentUserId.js";
9
9
  import { useDebounce as I } from "./hooks/useDebounce.js";
10
10
  import { useDeepCompareEffect as k, useDeepCompareEffectNoCheck as N, useDeepCompareMemoize as l } from "./hooks/useDeepCompareEffect.js";
11
- import { useInitApp as M } from "./hooks/useInitApp.js";
12
- import { useInitCommonCodes as b } from "./hooks/useInitCommonCodes.js";
13
- import { useGetNavigationList as y, useSetNavigationList as z } from "./hooks/useNavigation.js";
14
- import { useOwpTranslation as F } from "./hooks/useOwpTranslation.js";
15
- import { useGetPageLockLoading as O, usePageLockLoading as Q } from "./hooks/usePageLockLoading.js";
11
+ import { useHeaderWrapState as M } from "./hooks/useHeaderWrapState.js";
12
+ import { useInitApp as b } from "./hooks/useInitApp.js";
13
+ import { useInitCommonCodes as y } from "./hooks/useInitCommonCodes.js";
14
+ import { useGetNavigationList as B, useSetNavigationList as F } from "./hooks/useNavigation.js";
15
+ import { useOwpTranslation as K } from "./hooks/useOwpTranslation.js";
16
+ import { useGetPageLockLoading as Q, usePageLockLoading as W } from "./hooks/usePageLockLoading.js";
16
17
  import { usePrevious as q } from "./hooks/usePrevious.js";
17
- import { useGetShortcuts as J, useSetShortcuts as R } from "./hooks/useShortcuts.js";
18
- import { getEnv as W, setEnv as X, useStorage as Y } from "./hooks/useStorage.js";
19
- import { useThemeMediaQuery as $ } from "./hooks/useThemeMediaQuery.js";
20
- import { useTimeout as oe } from "./hooks/useTimeout.js";
21
- import { useTreeGridCommonCodeEnums as te } from "./hooks/useTreeGridCommonCodeEnums.js";
22
- import { useTreeGridEnums as ue } from "./hooks/useTreeGridEnums.js";
23
- import { useTreeGridExcelExport as pe } from "./hooks/useTreeGridExcelExport.js";
24
- import { FALLBACK_LANGUAGE_LIST as ne } from "./constants/language.js";
18
+ import { useGetShortcuts as R, useSetShortcuts as V } from "./hooks/useShortcuts.js";
19
+ import { getEnv as Y, setEnv as Z, useStorage as $ } from "./hooks/useStorage.js";
20
+ import { useThemeMediaQuery as re } from "./hooks/useThemeMediaQuery.js";
21
+ import { useTimeout as te } from "./hooks/useTimeout.js";
22
+ import { useTreeGridCommonCodeEnums as ue } from "./hooks/useTreeGridCommonCodeEnums.js";
23
+ import { useTreeGridEnums as me } from "./hooks/useTreeGridEnums.js";
24
+ import { useTreeGridExcelExport as ne } from "./hooks/useTreeGridExcelExport.js";
25
+ import { FALLBACK_LANGUAGE_LIST as ae } from "./constants/language.js";
25
26
  export {
26
- ne as FALLBACK_LANGUAGE_LIST,
27
- W as getEnv,
28
- X as setEnv,
27
+ ae as FALLBACK_LANGUAGE_LIST,
28
+ Y as getEnv,
29
+ Z as setEnv,
29
30
  u as useAccessTokenGuard,
30
- p as useAppDispatch,
31
+ m as useAppDispatch,
31
32
  f as useAppSelector,
32
33
  n as useAppStore,
33
34
  a as useConfirm,
@@ -35,32 +36,33 @@ export {
35
36
  k as useDeepCompareEffect,
36
37
  N as useDeepCompareEffectNoCheck,
37
38
  l as useDeepCompareMemoize,
38
- r as useGetCommonCodeList,
39
+ o as useGetCommonCodeList,
39
40
  C as useGetCurrentLanguage,
40
41
  A as useGetCurrentUser,
41
42
  h as useGetCurrentUserId,
42
43
  L as useGetLanguageList,
43
- G as useGetLogoSrc,
44
- y as useGetNavigationList,
45
- O as useGetPageLockLoading,
46
- J as useGetShortcuts,
47
- M as useInitApp,
48
- b as useInitCommonCodes,
49
- F as useOwpTranslation,
50
- Q as usePageLockLoading,
44
+ c as useGetLogoSrc,
45
+ B as useGetNavigationList,
46
+ Q as useGetPageLockLoading,
47
+ R as useGetShortcuts,
48
+ M as useHeaderWrapState,
49
+ b as useInitApp,
50
+ y as useInitCommonCodes,
51
+ K as useOwpTranslation,
52
+ W as usePageLockLoading,
51
53
  q as usePrevious,
52
54
  t as useSetCommonCodeList,
53
55
  g as useSetCurrentLanguage,
54
56
  E as useSetCurrentUser,
55
57
  v as useSetCurrentUserId,
56
- S as useSetLogoSrc,
57
- z as useSetNavigationList,
58
- R as useSetShortcuts,
59
- Y as useStorage,
60
- $ as useThemeMediaQuery,
61
- oe as useTimeout,
62
- te as useTreeGridCommonCodeEnums,
63
- ue as useTreeGridEnums,
64
- pe as useTreeGridExcelExport
58
+ G as useSetLogoSrc,
59
+ F as useSetNavigationList,
60
+ V as useSetShortcuts,
61
+ $ as useStorage,
62
+ re as useThemeMediaQuery,
63
+ te as useTimeout,
64
+ ue as useTreeGridCommonCodeEnums,
65
+ me as useTreeGridEnums,
66
+ ne as useTreeGridExcelExport
65
67
  };
66
68
  //# sourceMappingURL=hooks.js.map
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"hooks.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;"}