@owp/core 2.5.37 → 2.5.39

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 (37) 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/index16.js +4 -4
  6. package/dist/_virtual/index17.js +4 -4
  7. package/dist/_virtual/index18.js +4 -4
  8. package/dist/_virtual/index19.js +4 -4
  9. package/dist/_virtual/index3.js +2 -2
  10. package/dist/_virtual/index4.js +2 -2
  11. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js +192 -193
  12. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js.map +1 -1
  13. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js +140 -133
  14. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js.map +1 -1
  15. package/dist/configs/defaultConfig.js +7 -7
  16. package/dist/configs/defaultConfig.js.map +1 -1
  17. package/dist/layout/components/toggles/NavigationSearchToggle.js +3 -3
  18. package/dist/node_modules/.pnpm/inko@1.1.1/node_modules/inko/index.js +1 -1
  19. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/index.js +1 -1
  20. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE39/index.js +1 -1
  21. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/constants.js +1 -1
  22. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/index.js +1 -1
  23. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/index.js +1 -1
  24. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/GenericBarcode/index.js +1 -1
  25. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/constants.js +1 -1
  26. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/index.js +1 -1
  27. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/MSI/index.js +1 -1
  28. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/codabar/index.js +1 -1
  29. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/index.js +1 -1
  30. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/pharmacode/index.js +1 -1
  31. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/renderers/index.js +1 -1
  32. package/dist/node_modules/.pnpm/react-overlays@5.2.1_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/react-overlays/esm/Portal.js +1 -1
  33. package/dist/types/configs/defaultConfig.d.ts +7 -7
  34. package/dist/utils/treeGridUtil.js +91 -85
  35. package/dist/utils/treeGridUtil.js.map +1 -1
  36. package/package.json +1 -1
  37. package/treegrid/Defaults.xml +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"treeGridRuntime.js","sources":["../../../../src/components/OwpTreeGrid/internal/treeGridRuntime.ts"],"sourcesContent":["import {\n getTreeGridTextResourceUrl,\n TREEGRID_ADDED_ROW_BACKGROUND_COLOR,\n TREEGRID_CELL_CHANGED_CLASS,\n} from '@/constants/treeGrid';\nimport {\n appendTreeGridAddedRowHighlightColumn,\n clearTreeGridCellHighlightById,\n getTreeGridAddedRowBaselineValue,\n getTreeGridAddedRowHighlightColumns,\n getTreeGridCellComparableValue,\n highlightTreeGridCellById,\n isTreeGridRowAddedById,\n normalizeTreeGridExternalRows,\n removeTreeGridAddedRowHighlightColumn,\n} from '@/utils/treeGridUtil';\nimport { debounce, get, isEmpty } from 'es-toolkit/compat';\nimport {\n type Dispatch,\n type RefObject,\n type SetStateAction,\n} from 'react';\nimport type {\n OwpTreeGridBodyData,\n OwpTreeGridDisabledAnimation,\n OwpTreeGridLayoutConfig,\n OwpTreeGridProps,\n OwpTreeGridRowModel,\n OwpTreeGridSelectedRows,\n OwpTreeGridSuppressCfg,\n} from '../OwpTreeGrid';\nimport type {\n OwpTreeGridErrorTooltipHideHandler,\n OwpTreeGridErrorTooltipShowHandler,\n} from './hooks/useOwpTreeGridErrorTooltip';\nimport { applyTreeGridLayoutToGrid } from './treeGridLayout';\nimport {\n resolveTreeGridSelectedRows,\n type OwpTreeGridSelectionScope,\n} from './treeGridSelection';\nimport {\n TREE_GRID_ERROR_CELL_CLASS,\n TREE_GRID_ADDED_ROW_BOX_CELL_CLASS,\n TREE_GRID_ADDED_ROW_BOX_END_CLASS,\n TREE_GRID_ADDED_ROW_BOX_START_CLASS,\n TREE_GRID_PANEL_CHECKBOX_SELECT_CLASS,\n TREE_GRID_SELECTED_CHANGED_CELL_CLASS,\n TREE_GRID_SELECT_ALL_CHECKED_CLASS,\n TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS,\n TREE_GRID_SELECT_ALL_UNCHECKED_CLASS,\n TREE_GRID_THEME_WRAPPER_CLASS,\n} from './treeGridTheme';\nimport {\n countTreeGridPerf,\n logTreeGridPerf,\n measureTreeGridPerf,\n} from './utils/perf';\n\nexport const TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS = 300;\nconst TREE_GRID_DEFAULT_ENTER_MODE = 3;\nconst TREE_GRID_DEFAULT_ENTER_ACTIONS = {\n 1: {\n onEnter: 'TabDownEdit',\n onEnterEdit: 'AcceptEdit AND TabDownEdit,1',\n },\n 2: {\n onEnter: 'GoDownEditAdd',\n onEnterEdit: 'AcceptEdit AND GoDownEditAdd,1',\n },\n 3: {\n onEnter: 'TabRightEdit',\n onEnterEdit: 'AcceptEdit AND TabRightEdit,1',\n },\n 4: {\n onEnter: 'TabRightEditAdd',\n onEnterEdit: 'AcceptEdit AND TabRightEditAdd,1',\n },\n} as const;\n\nconst TREE_GRID_READONLY_HOVER_CELL_RGB = [240, 240, 240] as const;\nconst TREE_GRID_READONLY_NO_FOCUS_HOVER_CELL_RGB = [248, 248, 248] as const;\nconst TREE_GRID_PREVIEW_CELL_RGB = [255, 255, 255] as const;\nconst TREE_GRID_PREVIEW_CELL_SOFT_RGB = [255, 255, 254] as const;\nconst TREE_GRID_PREVIEW_CELL_DIM_RGB = [242, 242, 242] as const;\nconst TREE_GRID_NATIVE_ERROR_CELL_RGB_VALUES = [\n [255, 210, 210],\n [249, 209, 209],\n [115, 16, 11],\n] as const;\nconst TREE_GRID_ERROR_CELL_FALLBACK_BACKGROUND_COLOR = 'transparent';\nconst TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE = 'Button';\nconst TREE_GRID_ROW_BOX_EXCLUDED_COLUMNS = new Set(['Panel']);\nconst TREE_GRID_CELL_CHANGED_CLASS_TOKENS = TREEGRID_CELL_CHANGED_CLASS.split(/\\s+/).filter(\n Boolean,\n);\nconst TREE_GRID_NATIVE_INPUT_EDIT_TYPES = new Set([\n 'Text',\n 'Lines',\n 'Int',\n 'Float',\n 'Date',\n 'Pass',\n]);\n\ntype TreeGridInitializationInput<T> = {\n id: string;\n layoutUrl?: string;\n layoutData?: string;\n toolbarTotalCountFormula?: string;\n suppressCfg?: OwpTreeGridSuppressCfg;\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[];\n dataUrl?: string;\n bodyData: OwpTreeGridBodyData<T>;\n useDataUrl?: boolean;\n width?: string | number;\n height?: string | number;\n languageId: string;\n};\n\ntype TreeGridBeforeRowUndeleteAction = 'cancel' | 'remove' | 'undelete';\ntype TreeGridBeforeRowUndeleteHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n) =>\n | TreeGridBeforeRowUndeleteAction\n | undefined\n | Promise<TreeGridBeforeRowUndeleteAction | undefined>;\ntype TreeGridInternalCellClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n x: number,\n y: number,\n event: Event,\n) => boolean | number | undefined;\ntype TreeGridInternalButtonClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n event: Event,\n) => boolean | number | undefined;\ntype TreeGridInternalKeyDownHandler = (\n grid: TGrid,\n key: string,\n event: Event,\n name: string,\n prefix: string,\n) => boolean | number | undefined;\ntype TreeGridInternalStartEditHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n) => boolean | number | undefined;\n\nexport type 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 onBeforeRowUndelete?: TreeGridBeforeRowUndeleteHandler<T>;\n onInternalButtonClick?: TreeGridInternalButtonClickHandler<T>;\n onInternalCellClick?: TreeGridInternalCellClickHandler<T>;\n onInternalKeyDown?: TreeGridInternalKeyDownHandler;\n onInternalStartEdit?: TreeGridInternalStartEditHandler<T>;\n};\n\nexport type TreeGridEventBindingOptions<T> = Pick<OwpTreeGridProps<T>, 'id'> & {\n latestEventHandlersRef: RefObject<TreeGridEventHandlers<T>>;\n layoutHasExplicitEnterModeRef: RefObject<boolean>;\n highlightEditableCellsRef: RefObject<boolean>;\n highlightChangedCellsRef: RefObject<boolean>;\n syncDeletedRowCanEditRef: RefObject<boolean>;\n editableCellBackgroundColorValueRef: RefObject<number | undefined>;\n changedCellBackgroundColorRef: RefObject<string>;\n focusedCellBackgroundColorRef: RefObject<string>;\n selectedCellBackgroundColorRef: RefObject<string>;\n hoverCellBackgroundColorRef: RefObject<string>;\n changedCellBaselineRef: RefObject<TreeGridCellBaselineMap>;\n treeGridInstanceRef: RefObject<TGrid>;\n treeGridInitStartedAtRef: RefObject<number | null>;\n latestLayoutOverridesRef: RefObject<OwpTreeGridLayoutConfig | undefined>;\n latestToolbarTotalCountFormulaRef: RefObject<string | undefined>;\n latestSuppressCfgRef: RefObject<OwpTreeGridSuppressCfg | undefined>;\n latestHideChildHeaderSortButtonsRef: RefObject<boolean>;\n latestSelectionScopeRef: RefObject<OwpTreeGridSelectionScope | undefined>;\n latestDisabledAnimationsRef: RefObject<\n readonly OwpTreeGridDisabledAnimation[] | undefined\n >;\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 showErrorTooltip: OwpTreeGridErrorTooltipShowHandler;\n hideErrorTooltip: OwpTreeGridErrorTooltipHideHandler;\n};\n\nexport type TreeGridCellBaselineMap = WeakMap<TRow, Map<string, string>>;\n\n/**\n * TreeGrid 레이아웃 Enter 동작 명시 여부\n * @param layoutData 레이아웃 문자열\n */\nexport const hasTreeGridExplicitEnterMode = (layoutData?: string) => {\n return Boolean(layoutData && /\\b(?:EnterMode|OnEnterEdit|OnEnter)\\s*[:=]/.test(layoutData));\n};\n\ntype TreeGridMutableActions = Record<string, string | undefined>;\ntype TreeGridJsonRecord = Record<string, unknown>;\ntype TreeGridXmlTagMatch = {\n index: number;\n tag: string;\n};\ntype TreeGridXmlHeadPanelRowSpanDefaultResult = {\n headContent: string;\n isApplied: boolean;\n};\ntype TreeGridSelectAllState = 'checked' | 'indeterminate' | 'unchecked';\ntype TreeGridDefaultLayoutCfgAttribute =\n | 'Undo'\n | 'Deleting'\n | 'Selecting'\n | 'SelectingSingle'\n | 'SuppressCfg';\ntype TreeGridDefaultLayoutCfgValues = Partial<Record<TreeGridDefaultLayoutCfgAttribute, string>>;\ntype TreeGridXmlDefaultLayoutScanResult = {\n cfgValues: TreeGridDefaultLayoutCfgValues;\n animationsTag?: TreeGridXmlTagMatch;\n defaultActionsTag?: TreeGridXmlTagMatch;\n defaultCfgTag?: TreeGridXmlTagMatch;\n defaultPanelTag?: TreeGridXmlTagMatch;\n gridOpenTagEndIndex?: number;\n hasFastPanel?: boolean;\n lastCfgEndIndex?: number;\n};\ntype TreeGridAddedRowBoxColumnBounds = {\n columnSet: Set<string>;\n firstColumn?: string;\n lastColumn?: string;\n};\n\nconst TREE_GRID_DELETE_PANEL_DEFAULT_ATTRIBUTES = {\n Visible: '1',\n CanHide: '0',\n Delete: '1',\n Width: '33',\n} as const;\nconst TREE_GRID_PANEL_SPANNED_DEFAULT_ATTRIBUTES = {\n Spanned: '1',\n} as const;\nconst TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS = {\n OnClickCell: 'Focus',\n} as const;\nconst TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS = {\n OnClickPanelSelectAll: 'SelectAll OR DeselectAll',\n} as const;\nconst TREE_GRID_SELECTION_ROW_SPAN_COLUMN = 'Panel';\nconst TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES = ['Formula', 'FormulaFormula'] as const;\nconst TREE_GRID_XML_GRID_OPEN_TAG_PATTERN = /<Grid\\b[^>]*>/i;\nconst TREE_GRID_XML_GRID_CLOSE_TAG_PATTERN = /<\\/Grid\\s*>/i;\nconst TREE_GRID_XML_TOOLBAR_TAG_PATTERN = /<Toolbar\\b[^>]*\\/?>/i;\nconst TREE_GRID_DEFAULT_LAYOUT_CFG_ATTRIBUTES = [\n 'Undo',\n 'Deleting',\n 'Selecting',\n 'SelectingSingle',\n 'SuppressCfg',\n] as const;\nconst TREE_GRID_DISABLED_ANIMATION_ATTRIBUTES = {\n addRow: ['Add', 'AddRows', 'AddChildren', 'AddRowsChildren'],\n deleteRow: [\n 'Delete',\n 'DeleteRows',\n 'DeleteVisible',\n 'DeleteVisibleRows',\n 'DeleteChildren',\n 'DeleteVisibleChildren',\n 'DeleteRowsChildren',\n 'DeleteVisibleRowsChildren',\n 'Undelete',\n 'UndeleteRows',\n 'UndeleteVisible',\n 'UndeleteVisibleRows',\n 'UndeleteChildren',\n 'UndeleteVisibleChildren',\n 'UndeleteRowsChildren',\n 'UndeleteVisibleRowsChildren',\n ],\n selectRow: ['Select', 'SelectRows', 'Deselect', 'DeselectRows'],\n} as const satisfies Record<OwpTreeGridDisabledAnimation, readonly string[]>;\nconst treeGridAddedRowBoxColumnBoundsCache = new WeakMap<\n TGrid,\n TreeGridAddedRowBoxColumnBounds\n>();\n\n/** TreeGrid JSON 객체 여부 */\nconst isTreeGridJsonRecord = (value: unknown): value is TreeGridJsonRecord =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** TreeGrid 비활성 설정값 여부 */\nconst isTreeGridDisabledConfigValue = (value: unknown) =>\n value === 0 || value === false || value === '0' || value === 'false';\n\n/** TreeGrid 명시 활성 설정값 여부 */\nconst isTreeGridExplicitEnabledConfigValue = (value: unknown) =>\n value === 1 || value === true || value === '1' || value === 'true';\n\n/** TreeGrid 명시 숨김 설정값 여부 */\nconst isTreeGridExplicitHiddenConfigValue = (value: unknown) =>\n value === 1 || value === true || value === '1' || value === 'true';\n\n/** TreeGrid 설정값 동일 여부 */\nconst isTreeGridConfigValue = (value: unknown, expectedValue: string) => {\n return String(value ?? '').trim().toLowerCase() === expectedValue.toLowerCase();\n};\n\n/**\n * TreeGrid checkbox 선택 모드 여부\n * @param selecting Selecting 설정값\n * @param selectingSingle SelectingSingle 설정값\n */\nconst isTreeGridCheckboxSelectionMode = (\n selecting: unknown,\n selectingSingle: unknown,\n) => {\n return (\n !isTreeGridDisabledConfigValue(selecting) &&\n !isTreeGridExplicitEnabledConfigValue(selectingSingle)\n );\n};\n\n/**\n * TreeGrid JSON Cfg 목록 조회\n * @param layoutData JSON 레이아웃 객체\n */\nconst getTreeGridJsonCfgRecords = (layoutData: TreeGridJsonRecord) => {\n const cfg = layoutData.Cfg;\n\n if (Array.isArray(cfg)) {\n return cfg.filter(isTreeGridJsonRecord);\n }\n\n return isTreeGridJsonRecord(cfg) ? [cfg] : [];\n};\n\n/**\n * TreeGrid JSON Cfg 값 조회\n * @param layoutData JSON 레이아웃 객체\n * @param fieldName Cfg 필드명\n */\nconst getTreeGridJsonCfgValue = (layoutData: TreeGridJsonRecord, fieldName: string) => {\n let fieldValue: unknown;\n\n getTreeGridJsonCfgRecords(layoutData).forEach((cfg) => {\n if (fieldName in cfg) {\n fieldValue = cfg[fieldName];\n }\n });\n\n return fieldValue;\n};\n\n/**\n * TreeGrid XML 태그 속성값 조회\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n */\nconst getTreeGridXmlTagAttributeValue = (tag: string, attributeName: string) => {\n const attributeMatch = new RegExp(`\\\\b${attributeName}\\\\s*=\\\\s*(['\"])(.*?)\\\\1`, 'i').exec(\n tag,\n );\n\n return attributeMatch?.[2];\n};\n\n/**\n * TreeGrid XML 태그 속성 보유 여부\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n */\nconst hasTreeGridXmlTagAttribute = (tag: string, attributeName: string) => {\n return new RegExp(`\\\\b${attributeName}\\\\s*=`, 'i').test(tag);\n};\n\n/**\n * TreeGrid XML 속성값 escape\n * @param value XML 속성값\n */\nconst escapeTreeGridXmlAttributeValue = (value: string | number) => {\n return String(value)\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;');\n};\n\n/**\n * TreeGrid XML 태그 속성 추가\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n * @param attributeValue 속성값\n */\nconst appendTreeGridXmlTagAttribute = (\n tag: string,\n attributeName: string,\n attributeValue: string | number,\n) => {\n const insertionIndex = tag.endsWith('/>') ? tag.length - 2 : tag.length - 1;\n\n return `${tag.slice(0, insertionIndex)} ${attributeName}=\"${escapeTreeGridXmlAttributeValue(\n attributeValue,\n )}\"${tag.slice(insertionIndex)}`;\n};\n\n/**\n * TreeGrid XML 태그 속성 설정\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n * @param attributeValue 속성값\n */\nconst setTreeGridXmlTagAttribute = (\n tag: string,\n attributeName: string,\n attributeValue: string | number,\n) => {\n if (!hasTreeGridXmlTagAttribute(tag, attributeName)) {\n return appendTreeGridXmlTagAttribute(tag, attributeName, attributeValue);\n }\n\n return tag.replace(\n new RegExp(`\\\\b${attributeName}\\\\s*=\\\\s*(['\"])(.*?)\\\\1`, 'i'),\n () => `${attributeName}=\"${escapeTreeGridXmlAttributeValue(attributeValue)}\"`,\n );\n};\n\n/**\n * TreeGrid XML 태그 속성 목록 설정\n * @param tag XML 태그 문자열\n * @param attributes 설정 속성\n */\nconst setTreeGridXmlTagAttributes = (\n tag: string,\n attributes: Record<string, string | number>,\n) => {\n let nextTag = tag;\n\n Object.entries(attributes).forEach(([attributeName, attributeValue]) => {\n nextTag = setTreeGridXmlTagAttribute(nextTag, attributeName, attributeValue);\n });\n\n return nextTag;\n};\n\n/**\n * TreeGrid XML 태그 누락 속성 추가\n * @param tag XML 태그 문자열\n * @param attributes 기본 속성\n */\nconst appendMissingTreeGridXmlTagAttributes = (\n tag: string,\n attributes: Record<string, string | number>,\n) => {\n let nextTag = tag;\n\n Object.entries(attributes).forEach(([attributeName, attributeValue]) => {\n if (!hasTreeGridXmlTagAttribute(nextTag, attributeName)) {\n nextTag = appendTreeGridXmlTagAttribute(nextTag, attributeName, attributeValue);\n }\n });\n\n return nextTag;\n};\n\n/**\n * TreeGrid XML 기본값 적용 관련 최상위 태그 스캔\n * @param layoutData XML 레이아웃 문자열\n */\nconst scanTreeGridXmlDefaultLayout = (layoutData: string) => {\n const tagPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<\\/?([A-Za-z][\\w:-]*)\\b[^>]*>/g;\n const scanResult: TreeGridXmlDefaultLayoutScanResult = {\n cfgValues: {},\n };\n let tagMatch: RegExpExecArray | null;\n let rootDepth = 0;\n let isInsideGrid = false;\n\n while ((tagMatch = tagPattern.exec(layoutData))) {\n const tag = tagMatch[0];\n const currentTagName = tagMatch[1]?.toLowerCase();\n\n if (!currentTagName || tag.startsWith('<!--') || tag.startsWith('<?') || tag.startsWith('<!')) {\n continue;\n }\n\n if (!scanResult.hasFastPanel && hasTreeGridXmlTagAttribute(tag, 'FastPanel')) {\n scanResult.hasFastPanel = true;\n }\n\n const isClosingTag = tag.startsWith('</');\n const isSelfClosingTag = /\\/>\\s*$/.test(tag);\n\n if (!isInsideGrid) {\n if (!isClosingTag && currentTagName === 'grid') {\n isInsideGrid = true;\n scanResult.gridOpenTagEndIndex = tagMatch.index + tag.length;\n rootDepth = isSelfClosingTag ? 0 : 1;\n }\n\n continue;\n }\n\n if (isClosingTag) {\n rootDepth = Math.max(0, rootDepth - 1);\n\n if (currentTagName === 'grid' && rootDepth === 0) {\n break;\n }\n\n continue;\n }\n\n if (rootDepth === 1) {\n if (currentTagName === 'cfg') {\n if (!scanResult.defaultCfgTag) {\n scanResult.defaultCfgTag = {\n index: tagMatch.index,\n tag,\n };\n }\n\n TREE_GRID_DEFAULT_LAYOUT_CFG_ATTRIBUTES.forEach((attributeName) => {\n const attributeValue = getTreeGridXmlTagAttributeValue(tag, attributeName);\n\n if (attributeValue !== undefined) {\n scanResult.cfgValues[attributeName] = attributeValue;\n }\n });\n scanResult.lastCfgEndIndex = tagMatch.index + tag.length;\n } else if (currentTagName === 'actions' && !scanResult.defaultActionsTag) {\n scanResult.defaultActionsTag = {\n index: tagMatch.index,\n tag,\n };\n } else if (\n currentTagName === 'panel' &&\n !scanResult.defaultPanelTag &&\n isTreeGridXmlDefaultPanelTag(tag)\n ) {\n scanResult.defaultPanelTag = {\n index: tagMatch.index,\n tag,\n };\n } else if (currentTagName === 'animations' && !scanResult.animationsTag) {\n scanResult.animationsTag = {\n index: tagMatch.index,\n tag,\n };\n }\n }\n\n if (!isSelfClosingTag) {\n rootDepth += 1;\n }\n }\n\n return scanResult;\n};\n\n/**\n * TreeGrid XML 기본 Panel 태그 여부\n * @param tag XML 태그 문자열\n */\nconst isTreeGridXmlDefaultPanelTag = (tag: string) => {\n const panelName = getTreeGridXmlTagAttributeValue(tag, 'Name');\n\n return panelName === undefined || panelName === '' || panelName.toLowerCase() === 'panel';\n};\n\n/**\n * TreeGrid XML Head 선두 Header 태그 목록 조회\n * @param headContent Head 내부 XML 문자열\n */\nconst getLeadingTreeGridXmlHeaderTags = (headContent: string) => {\n const childTagPattern = /<([A-Za-z][\\w:-]*)\\b[^>]*(?:\\/>|>)/g;\n const headerTags: TreeGridXmlTagMatch[] = [];\n let childTagMatch: RegExpExecArray | null;\n\n while ((childTagMatch = childTagPattern.exec(headContent))) {\n if (childTagMatch[1].toLowerCase() !== 'header') {\n if (headerTags.length > 0) {\n break;\n }\n\n return headerTags;\n }\n\n headerTags.push({\n index: childTagMatch.index,\n tag: childTagMatch[0],\n });\n }\n\n return headerTags;\n};\n\n/**\n * TreeGrid XML Head Panel RowSpan 기본값 적용\n * @param headContent Head 내부 XML 문자열\n */\nconst applyTreeGridXmlHeadPanelRowSpanDefault = (\n headContent: string,\n): TreeGridXmlHeadPanelRowSpanDefaultResult => {\n const headerTags = getLeadingTreeGridXmlHeaderTags(headContent);\n\n if (headerTags.length <= 1) {\n return {\n headContent,\n isApplied: false,\n };\n }\n\n const [firstHeaderTag, ...remainingHeaderTags] = headerTags;\n\n if (\n hasTreeGridXmlTagAttribute(firstHeaderTag.tag, 'PanelRowSpan') ||\n remainingHeaderTags.some(({ tag }) => /\\bPanel[A-Za-z0-9_]*\\s*=/i.test(tag))\n ) {\n return {\n headContent,\n isApplied: false,\n };\n }\n\n let nextHeaderTag = firstHeaderTag.tag;\n\n if (!hasTreeGridXmlTagAttribute(nextHeaderTag, 'Spanned')) {\n nextHeaderTag = appendTreeGridXmlTagAttribute(nextHeaderTag, 'Spanned', 1);\n }\n\n nextHeaderTag = appendTreeGridXmlTagAttribute(\n nextHeaderTag,\n 'PanelRowSpan',\n headerTags.length,\n );\n\n return {\n headContent: `${headContent.slice(0, firstHeaderTag.index)}${nextHeaderTag}${headContent.slice(\n firstHeaderTag.index + firstHeaderTag.tag.length,\n )}`,\n isApplied: true,\n };\n};\n\n/**\n * TreeGrid XML Panel Spanned 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlPanelSpannedInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML Panel Spanned 기본값 적용 대상 여부\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst isTreeGridXmlPanelSpannedDefaultLayout = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return (\n Boolean(scanResult.defaultPanelTag) ||\n isTreeGridXmlSelectingLayout(scanResult.cfgValues) ||\n isTreeGridXmlDeletePanelDefaultLayout(scanResult.cfgValues)\n );\n};\n\n/**\n * TreeGrid XML Panel Spanned 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultPanelSpannedLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlPanelSpannedDefaultLayout(scanResult)\n ) {\n return layoutData;\n }\n\n const panelTag = scanResult.defaultPanelTag;\n\n if (panelTag) {\n const nextPanelTag = appendMissingTreeGridXmlTagAttributes(\n panelTag.tag,\n TREE_GRID_PANEL_SPANNED_DEFAULT_ATTRIBUTES,\n );\n\n return nextPanelTag === panelTag.tag\n ? layoutData\n : `${layoutData.slice(0, panelTag.index)}${nextPanelTag}${layoutData.slice(\n panelTag.index + panelTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlPanelSpannedInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Panel Spanned=\"1\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid Header Panel RowSpan 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n */\nconst applyTreeGridDefaultHeaderPanelRowSpanLayout = (layoutData: string) => {\n if (!/<Head\\b/i.test(layoutData) || /\\bPanelRowSpan\\s*[:=]/i.test(layoutData)) {\n return layoutData;\n }\n\n let isPanelRowSpanApplied = false;\n const nextLayoutData = layoutData.replace(\n /(<Head\\b[^>]*>)([\\s\\S]*?)(<\\/Head>)/i,\n (matchedHead, headOpenTag: string, headContent: string, headCloseTag: string) => {\n const result = applyTreeGridXmlHeadPanelRowSpanDefault(headContent);\n\n if (!result.isApplied) {\n return matchedHead;\n }\n\n isPanelRowSpanApplied = true;\n\n return `${headOpenTag}${result.headContent}${headCloseTag}`;\n },\n );\n\n if (!isPanelRowSpanApplied) {\n return layoutData;\n }\n\n return applyTreeGridXmlDefaultPanelSpannedLayout(\n nextLayoutData,\n scanTreeGridXmlDefaultLayout(nextLayoutData),\n );\n};\n\n/**\n * TreeGrid JSON 레이아웃 checkbox 선택 모드 여부\n * @param layoutData JSON 레이아웃 객체\n */\nconst isTreeGridJsonCheckboxSelectionLayout = (layoutData: TreeGridJsonRecord) => {\n return isTreeGridCheckboxSelectionMode(\n getTreeGridJsonCfgValue(layoutData, 'Selecting'),\n getTreeGridJsonCfgValue(layoutData, 'SelectingSingle'),\n );\n};\n\n/**\n * TreeGrid XML 레이아웃 checkbox 선택 모드 여부\n * @param cfgValues 최상위 Cfg 속성값\n */\nconst isTreeGridXmlCheckboxSelectionLayout = (cfgValues: TreeGridDefaultLayoutCfgValues) => {\n return isTreeGridCheckboxSelectionMode(\n cfgValues.Selecting,\n cfgValues.SelectingSingle,\n );\n};\n\n/**\n * TreeGrid XML 레이아웃 선택 활성 여부\n * @param cfgValues 최상위 Cfg 속성값\n */\nconst isTreeGridXmlSelectingLayout = (cfgValues: TreeGridDefaultLayoutCfgValues) => {\n return !isTreeGridDisabledConfigValue(cfgValues.Selecting);\n};\n\n/**\n * TreeGrid XML 삭제 Panel 기본값 적용 대상 여부\n * @param cfgValues 최상위 Cfg 속성값\n */\nconst isTreeGridXmlDeletePanelDefaultLayout = (cfgValues: TreeGridDefaultLayoutCfgValues) => {\n return (\n isTreeGridConfigValue(cfgValues.Undo, '1') &&\n isTreeGridConfigValue(cfgValues.Deleting, '2') &&\n isTreeGridConfigValue(cfgValues.Selecting, '0')\n );\n};\n\n/**\n * TreeGrid XML 셀 클릭 액션 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlCellClickActionInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML 셀 클릭 액션 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultCellClickActionLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlSelectingLayout(scanResult.cfgValues) ||\n /\\bOnClickCell\\s*=/i.test(layoutData)\n ) {\n return layoutData;\n }\n\n const actionsTag = scanResult.defaultActionsTag;\n\n if (actionsTag) {\n const nextActionsTag = appendMissingTreeGridXmlTagAttributes(\n actionsTag.tag,\n TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS,\n );\n\n return nextActionsTag === actionsTag.tag\n ? layoutData\n : `${layoutData.slice(0, actionsTag.index)}${nextActionsTag}${layoutData.slice(\n actionsTag.index + actionsTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlCellClickActionInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Actions OnClickCell=\"Focus\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid XML SelectAll Panel 액션 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlSelectAllPanelActionInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML SelectAll Panel 액션 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultSelectAllPanelActionLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlCheckboxSelectionLayout(scanResult.cfgValues) ||\n /\\bOnClickPanelSelectAll\\s*=/i.test(layoutData)\n ) {\n return layoutData;\n }\n\n const actionsTag = scanResult.defaultActionsTag;\n\n if (actionsTag) {\n const nextActionsTag = appendMissingTreeGridXmlTagAttributes(\n actionsTag.tag,\n TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS,\n );\n\n return nextActionsTag === actionsTag.tag\n ? layoutData\n : `${layoutData.slice(0, actionsTag.index)}${nextActionsTag}${layoutData.slice(\n actionsTag.index + actionsTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlSelectAllPanelActionInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(\n 0,\n insertionIndex,\n )}\\n <Actions OnClickPanelSelectAll=\"SelectAll OR DeselectAll\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid XML 삭제 Panel 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlDeletePanelInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML 삭제 Panel 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultDeletePanelLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlDeletePanelDefaultLayout(scanResult.cfgValues)\n ) {\n return layoutData;\n }\n\n const panelTag = scanResult.defaultPanelTag;\n\n if (panelTag) {\n const nextPanelTag = appendMissingTreeGridXmlTagAttributes(\n panelTag.tag,\n TREE_GRID_DELETE_PANEL_DEFAULT_ATTRIBUTES,\n );\n\n return nextPanelTag === panelTag.tag\n ? layoutData\n : `${layoutData.slice(0, panelTag.index)}${nextPanelTag}${layoutData.slice(\n panelTag.index + panelTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlDeletePanelInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n const panelTagText = '\\n <Panel Visible=\"1\" CanHide=\"0\" Delete=\"1\" Width=\"33\" />';\n\n return `${layoutData.slice(0, insertionIndex)}${panelTagText}${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid XML 레이아웃 FastPanel 기본값 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultFastPanelLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (scanResult.hasFastPanel || !isTreeGridXmlCheckboxSelectionLayout(scanResult.cfgValues)) {\n return layoutData;\n }\n\n const insertionIndex = scanResult.gridOpenTagEndIndex;\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Cfg FastPanel=\"0\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid JSON Cfg FastPanel 기본값 적용\n * @param layoutData JSON 레이아웃 객체\n */\nconst applyTreeGridJsonFastPanelDefault = (layoutData: TreeGridJsonRecord) => {\n const cfg = layoutData.Cfg;\n\n if (Array.isArray(cfg)) {\n if (!cfg.some((item) => isTreeGridJsonRecord(item) && 'FastPanel' in item)) {\n layoutData.Cfg = [{ FastPanel: 0 }, ...cfg];\n }\n return;\n }\n\n if (isTreeGridJsonRecord(cfg)) {\n if (!('FastPanel' in cfg)) {\n cfg.FastPanel = 0;\n }\n return;\n }\n\n layoutData.Cfg = { FastPanel: 0 };\n};\n\n/**\n * TreeGrid JSON SelectAll Panel 액션 기본값 적용\n * @param layoutData JSON 레이아웃 객체\n */\nconst applyTreeGridJsonSelectAllPanelActionDefault = (layoutData: TreeGridJsonRecord) => {\n const actions = layoutData.Actions;\n\n if (Array.isArray(actions)) {\n if (\n !actions.some(\n (item) => isTreeGridJsonRecord(item) && 'OnClickPanelSelectAll' in item,\n )\n ) {\n layoutData.Actions = [{ ...TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS }, ...actions];\n }\n return;\n }\n\n if (isTreeGridJsonRecord(actions)) {\n if (!('OnClickPanelSelectAll' in actions)) {\n actions.OnClickPanelSelectAll =\n TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS.OnClickPanelSelectAll;\n }\n return;\n }\n\n if (actions === undefined) {\n layoutData.Actions = { ...TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS };\n }\n};\n\n/**\n * TreeGrid JSON 셀 클릭 액션 기본값 적용\n * @param layoutData JSON 레이아웃 객체\n */\nconst applyTreeGridJsonCellClickActionDefault = (layoutData: TreeGridJsonRecord) => {\n const actions = layoutData.Actions;\n\n if (Array.isArray(actions)) {\n if (!actions.some((item) => isTreeGridJsonRecord(item) && 'OnClickCell' in item)) {\n layoutData.Actions = [{ ...TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS }, ...actions];\n }\n return;\n }\n\n if (isTreeGridJsonRecord(actions)) {\n if (!('OnClickCell' in actions)) {\n actions.OnClickCell = TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS.OnClickCell;\n }\n return;\n }\n\n if (actions === undefined) {\n layoutData.Actions = { ...TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS };\n }\n};\n\n/**\n * TreeGrid JSON 레이아웃 셀 클릭 액션 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n */\nconst applyTreeGridJsonDefaultCellClickActionLayout = (layoutData: string) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (\n !isTreeGridJsonRecord(parsedLayoutData) ||\n isTreeGridDisabledConfigValue(getTreeGridJsonCfgValue(parsedLayoutData, 'Selecting'))\n ) {\n return layoutData;\n }\n\n applyTreeGridJsonCellClickActionDefault(parsedLayoutData);\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid 셀 클릭 액션 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param xmlScanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridDefaultCellClickActionLayout = (\n layoutData: string,\n xmlScanResult?: TreeGridXmlDefaultLayoutScanResult,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultCellClickActionLayout(layoutData);\n }\n\n return applyTreeGridXmlDefaultCellClickActionLayout(\n layoutData,\n xmlScanResult ?? scanTreeGridXmlDefaultLayout(layoutData),\n );\n};\n\n/**\n * TreeGrid JSON 레이아웃 SelectAll Panel 액션 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n */\nconst applyTreeGridJsonDefaultSelectAllPanelActionLayout = (layoutData: string) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (\n !isTreeGridJsonRecord(parsedLayoutData) ||\n !isTreeGridJsonCheckboxSelectionLayout(parsedLayoutData)\n ) {\n return layoutData;\n }\n\n applyTreeGridJsonSelectAllPanelActionDefault(parsedLayoutData);\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid SelectAll Panel 액션 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param xmlScanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridDefaultSelectAllPanelActionLayout = (\n layoutData: string,\n xmlScanResult?: TreeGridXmlDefaultLayoutScanResult,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultSelectAllPanelActionLayout(layoutData);\n }\n\n return applyTreeGridXmlDefaultSelectAllPanelActionLayout(\n layoutData,\n xmlScanResult ?? scanTreeGridXmlDefaultLayout(layoutData),\n );\n};\n\n/**\n * TreeGrid JSON SuppressCfg 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridJsonDefaultSuppressCfgLayout = (\n layoutData: string,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n if (suppressCfg === undefined) {\n return layoutData;\n }\n\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n const cfgRecords = getTreeGridJsonCfgRecords(parsedLayoutData);\n\n if (cfgRecords.some((cfg) => 'SuppressCfg' in cfg)) {\n return layoutData;\n }\n\n if (cfgRecords[0]) {\n cfgRecords[0].SuppressCfg = suppressCfg;\n } else {\n parsedLayoutData.Cfg = { SuppressCfg: suppressCfg };\n }\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid XML SuppressCfg 기본값 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridXmlDefaultSuppressCfgLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n if (suppressCfg === undefined || scanResult.cfgValues.SuppressCfg !== undefined) {\n return layoutData;\n }\n\n const cfgTag = scanResult.defaultCfgTag;\n\n if (cfgTag) {\n const nextCfgTag = appendTreeGridXmlTagAttribute(cfgTag.tag, 'SuppressCfg', suppressCfg);\n\n return `${layoutData.slice(0, cfgTag.index)}${nextCfgTag}${layoutData.slice(\n cfgTag.index + cfgTag.tag.length,\n )}`;\n }\n\n const insertionIndex = scanResult.gridOpenTagEndIndex;\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Cfg SuppressCfg=\"${suppressCfg}\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid SuppressCfg 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridDefaultSuppressCfgLayout = (\n layoutData: string,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (suppressCfg === undefined || !trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultSuppressCfgLayout(layoutData, suppressCfg);\n }\n\n return applyTreeGridXmlDefaultSuppressCfgLayout(\n layoutData,\n scanTreeGridXmlDefaultLayout(layoutData),\n suppressCfg,\n );\n};\n\n/**\n * TreeGrid Toolbar formula 속성 명시 여부\n * @param layoutRecord TreeGrid JSON 레이아웃 객체\n */\nconst hasTreeGridToolbarFormulaField = (layoutRecord: TreeGridJsonRecord) => {\n return TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES.some((fieldName) => fieldName in layoutRecord);\n};\n\n/**\n * TreeGrid JSON 레이아웃 Toolbar record 목록 조회\n * @param layoutData JSON 레이아웃 객체\n */\nconst getTreeGridJsonToolbarRecords = (layoutData: TreeGridJsonRecord) => {\n const toolbar = layoutData.Toolbar;\n const solid = layoutData.Solid;\n const toolbarRecords = Array.isArray(toolbar)\n ? toolbar.filter(isTreeGridJsonRecord)\n : isTreeGridJsonRecord(toolbar)\n ? [toolbar]\n : [];\n const solidToolbarRecords = Array.isArray(solid)\n ? solid.filter(\n (item): item is TreeGridJsonRecord =>\n isTreeGridJsonRecord(item) && isTreeGridConfigValue(item.Kind, 'Toolbar'),\n )\n : isTreeGridJsonRecord(solid) && isTreeGridConfigValue(solid.Kind, 'Toolbar')\n ? [solid]\n : [];\n\n return [...toolbarRecords, ...solidToolbarRecords];\n};\n\n/**\n * TreeGrid JSON Toolbar 전체 건수 formula 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n */\nconst applyTreeGridJsonDefaultToolbarTotalCountLayout = (\n layoutData: string,\n toolbarTotalCountFormula?: string,\n) => {\n if (!toolbarTotalCountFormula) {\n return layoutData;\n }\n\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n const toolbarRecords = getTreeGridJsonToolbarRecords(parsedLayoutData);\n\n if (toolbarRecords.some(hasTreeGridToolbarFormulaField)) {\n return layoutData;\n }\n\n if (toolbarRecords[0]) {\n toolbarRecords[0].FormulaFormula = toolbarTotalCountFormula;\n } else {\n parsedLayoutData.Toolbar = { FormulaFormula: toolbarTotalCountFormula };\n }\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid XML Toolbar formula 명시 여부\n * @param toolbarTag Toolbar 태그 문자열\n */\nconst hasTreeGridXmlToolbarFormulaAttribute = (toolbarTag: string) => {\n return TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES.some((fieldName) =>\n hasTreeGridXmlTagAttribute(toolbarTag, fieldName),\n );\n};\n\n/**\n * TreeGrid XML Toolbar 전체 건수 formula 기본값 적용\n * @param layoutData XML 레이아웃 문자열\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n */\nconst applyTreeGridXmlDefaultToolbarTotalCountLayout = (\n layoutData: string,\n toolbarTotalCountFormula?: string,\n) => {\n if (!toolbarTotalCountFormula) {\n return layoutData;\n }\n\n const toolbarMatch = TREE_GRID_XML_TOOLBAR_TAG_PATTERN.exec(layoutData);\n\n if (toolbarMatch) {\n const toolbarTag = toolbarMatch[0];\n\n if (hasTreeGridXmlToolbarFormulaAttribute(toolbarTag)) {\n return layoutData;\n }\n\n const nextToolbarTag = setTreeGridXmlTagAttribute(\n toolbarTag,\n 'Formula',\n toolbarTotalCountFormula,\n );\n\n return `${layoutData.slice(0, toolbarMatch.index)}${nextToolbarTag}${layoutData.slice(\n toolbarMatch.index + toolbarTag.length,\n )}`;\n }\n\n const toolbarTag = setTreeGridXmlTagAttribute(\n '<Toolbar />',\n 'Formula',\n toolbarTotalCountFormula,\n );\n const gridCloseMatch = TREE_GRID_XML_GRID_CLOSE_TAG_PATTERN.exec(layoutData);\n\n if (gridCloseMatch) {\n return `${layoutData.slice(0, gridCloseMatch.index)} ${toolbarTag}\\n${layoutData.slice(\n gridCloseMatch.index,\n )}`;\n }\n\n const gridOpenMatch = TREE_GRID_XML_GRID_OPEN_TAG_PATTERN.exec(layoutData);\n\n if (!gridOpenMatch) {\n return layoutData;\n }\n\n return `${layoutData.slice(\n 0,\n gridOpenMatch.index + gridOpenMatch[0].length,\n )}\\n ${toolbarTag}${layoutData.slice(gridOpenMatch.index + gridOpenMatch[0].length)}`;\n};\n\n/**\n * TreeGrid Toolbar 전체 건수 formula 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n */\nconst applyTreeGridDefaultToolbarTotalCountLayout = (\n layoutData: string,\n toolbarTotalCountFormula?: string,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!toolbarTotalCountFormula || !trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultToolbarTotalCountLayout(\n layoutData,\n toolbarTotalCountFormula,\n );\n }\n\n return applyTreeGridXmlDefaultToolbarTotalCountLayout(layoutData, toolbarTotalCountFormula);\n};\n\n/**\n * TreeGrid JSON 레이아웃 FastPanel 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n */\nconst applyTreeGridJsonDefaultFastPanelLayout = (layoutData: string) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n if (!isTreeGridJsonCheckboxSelectionLayout(parsedLayoutData)) {\n return layoutData;\n }\n\n applyTreeGridJsonFastPanelDefault(parsedLayoutData);\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid FastPanel 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param xmlScanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridDefaultFastPanelLayout = (\n layoutData: string,\n xmlScanResult?: TreeGridXmlDefaultLayoutScanResult,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n if (/\\bFastPanel\\s*[:=]/i.test(layoutData)) {\n return layoutData;\n }\n\n return applyTreeGridJsonDefaultFastPanelLayout(layoutData);\n }\n\n return applyTreeGridXmlDefaultFastPanelLayout(\n layoutData,\n xmlScanResult ?? scanTreeGridXmlDefaultLayout(layoutData),\n );\n};\n\n/**\n * TreeGrid 비활성 애니메이션 속성 목록 조회\n * @param disabledAnimations 비활성화할 애니메이션 의미 키 목록\n */\nconst getTreeGridDisabledAnimationAttributes = (\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[],\n) => {\n const attributes: Record<string, string> = {};\n\n disabledAnimations?.forEach((animation) => {\n TREE_GRID_DISABLED_ANIMATION_ATTRIBUTES[animation]?.forEach((attributeName) => {\n attributes[attributeName] = '';\n });\n });\n\n return attributes;\n};\n\n/**\n * TreeGrid JSON Animations 비활성 속성 적용\n * @param layoutData JSON 레이아웃 문자열\n * @param attributes 비활성 애니메이션 속성\n */\nconst applyTreeGridJsonDisabledAnimationsLayout = (\n layoutData: string,\n attributes: Record<string, string>,\n) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n const animations = parsedLayoutData.Animations;\n\n if (Array.isArray(animations)) {\n const firstAnimations = animations.find(isTreeGridJsonRecord);\n\n if (firstAnimations) {\n Object.assign(firstAnimations, attributes);\n } else {\n animations.unshift({ ...attributes });\n }\n } else if (isTreeGridJsonRecord(animations)) {\n Object.assign(animations, attributes);\n } else if (animations === undefined) {\n parsedLayoutData.Animations = attributes;\n } else {\n return layoutData;\n }\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid XML Animations 태그 생성\n * @param attributes 비활성 애니메이션 속성\n */\nconst createTreeGridDisabledAnimationsTag = (attributes: Record<string, string>) => {\n return setTreeGridXmlTagAttributes('<Animations />', attributes);\n};\n\n/**\n * TreeGrid XML Animations 비활성 속성 적용\n * @param layoutData XML 레이아웃 문자열\n * @param attributes 비활성 애니메이션 속성\n */\nconst applyTreeGridXmlDisabledAnimationsLayout = (\n layoutData: string,\n attributes: Record<string, string>,\n) => {\n const scanResult = scanTreeGridXmlDefaultLayout(layoutData);\n\n if (scanResult.gridOpenTagEndIndex === undefined) {\n return layoutData;\n }\n\n const animationsTag = scanResult.animationsTag;\n\n if (animationsTag) {\n const nextAnimationsTag = setTreeGridXmlTagAttributes(animationsTag.tag, attributes);\n\n return nextAnimationsTag === animationsTag.tag\n ? layoutData\n : `${layoutData.slice(0, animationsTag.index)}${nextAnimationsTag}${layoutData.slice(\n animationsTag.index + animationsTag.tag.length,\n )}`;\n }\n\n const insertionIndex = scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n\n return `${layoutData.slice(0, insertionIndex)}\\n ${createTreeGridDisabledAnimationsTag(\n attributes,\n )}${layoutData.slice(insertionIndex)}`;\n};\n\n/**\n * TreeGrid Animations 비활성 속성 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param disabledAnimations 비활성화할 애니메이션 의미 키 목록\n */\nconst applyTreeGridDisabledAnimationsLayout = (\n layoutData: string,\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[],\n) => {\n const attributes = getTreeGridDisabledAnimationAttributes(disabledAnimations);\n\n if (!Object.keys(attributes).length) {\n return layoutData;\n }\n\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDisabledAnimationsLayout(layoutData, attributes);\n }\n\n return applyTreeGridXmlDisabledAnimationsLayout(layoutData, attributes);\n};\n\n/**\n * TreeGrid 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param disabledAnimations 비활성화할 애니메이션 의미 키 목록\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridDefaultLayout = (\n layoutData: string,\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[],\n toolbarTotalCountFormula?: string,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n const nextLayoutData = applyTreeGridDefaultToolbarTotalCountLayout(\n applyTreeGridDefaultHeaderPanelRowSpanLayout(\n applyTreeGridDefaultSuppressCfgLayout(layoutData, suppressCfg),\n ),\n toolbarTotalCountFormula,\n );\n const trimmedLayoutData = nextLayoutData.trim();\n\n if (!trimmedLayoutData || trimmedLayoutData.startsWith('{')) {\n return applyTreeGridDisabledAnimationsLayout(\n applyTreeGridDefaultFastPanelLayout(\n applyTreeGridDefaultCellClickActionLayout(\n applyTreeGridDefaultSelectAllPanelActionLayout(nextLayoutData),\n ),\n ),\n disabledAnimations,\n );\n }\n\n const xmlScanResult = scanTreeGridXmlDefaultLayout(nextLayoutData);\n const nextSelectAllPanelActionLayoutData = applyTreeGridDefaultSelectAllPanelActionLayout(\n nextLayoutData,\n xmlScanResult,\n );\n const nextSelectAllXmlScanResult =\n nextSelectAllPanelActionLayoutData === nextLayoutData\n ? xmlScanResult\n : scanTreeGridXmlDefaultLayout(nextSelectAllPanelActionLayoutData);\n const nextCellClickActionLayoutData = applyTreeGridDefaultCellClickActionLayout(\n nextSelectAllPanelActionLayoutData,\n nextSelectAllXmlScanResult,\n );\n const nextXmlScanResult =\n nextCellClickActionLayoutData === nextSelectAllPanelActionLayoutData\n ? nextSelectAllXmlScanResult\n : scanTreeGridXmlDefaultLayout(nextCellClickActionLayoutData);\n\n return applyTreeGridDisabledAnimationsLayout(\n applyTreeGridXmlDefaultDeletePanelLayout(\n applyTreeGridDefaultFastPanelLayout(\n nextCellClickActionLayoutData,\n nextXmlScanResult,\n ),\n nextXmlScanResult,\n ),\n disabledAnimations,\n );\n};\n\n/**\n * TreeGrid wrapper 엘리먼트 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nconst getTreeGridWrapperElement = (gridId: string) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n return document.getElementById(gridId)?.closest(`.${TREE_GRID_THEME_WRAPPER_CLASS}`) ?? null;\n};\n\n/**\n * TreeGrid 전체 선택 상태 조회\n * @param grid TreeGrid 인스턴스\n */\nconst getTreeGridSelectAllState = (grid: TGrid): TreeGridSelectAllState => {\n if (isTreeGridExplicitEnabledConfigValue(grid.AllSelected)) {\n return 'checked';\n }\n\n if (isTreeGridDisabledConfigValue(grid.AllSelected)) {\n return 'unchecked';\n }\n\n let selectableRowCount = 0;\n let selectedRowCount = 0;\n\n getTreeGridRows(grid).forEach((row) => {\n if (!isDisplayTreeGridRow(row) || isTreeGridDisabledConfigValue(row.CanSelect)) {\n return;\n }\n\n selectableRowCount += 1;\n\n if (isTreeGridExplicitEnabledConfigValue(grid.IsSelected(row))) {\n selectedRowCount += 1;\n }\n });\n\n if (!selectedRowCount) {\n return 'unchecked';\n }\n\n return selectableRowCount > 0 && selectedRowCount >= selectableRowCount\n ? 'checked'\n : 'indeterminate';\n};\n\n/**\n * TreeGrid 선택 패널 표시 상태 동기화\n * @param grid TreeGrid 인스턴스\n * @param gridId TreeGrid 인스턴스 ID\n */\nconst syncTreeGridSelectionPanelState = (grid: TGrid, gridId: string) => {\n const wrapperElement = getTreeGridWrapperElement(gridId);\n const isSelectingEnabled = !isTreeGridDisabledConfigValue(grid.Selecting);\n const isCheckboxSelectionMode = isTreeGridCheckboxSelectionMode(\n grid.Selecting,\n grid.SelectingSingle,\n );\n const header = grid.Header;\n\n wrapperElement?.classList.toggle(\n TREE_GRID_PANEL_CHECKBOX_SELECT_CLASS,\n isCheckboxSelectionMode,\n );\n\n if (!isCheckboxSelectionMode) {\n wrapperElement?.classList.remove(\n TREE_GRID_SELECT_ALL_CHECKED_CLASS,\n TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS,\n TREE_GRID_SELECT_ALL_UNCHECKED_CLASS,\n );\n } else {\n const selectAllState = getTreeGridSelectAllState(grid);\n\n wrapperElement?.classList.toggle(\n TREE_GRID_SELECT_ALL_CHECKED_CLASS,\n selectAllState === 'checked',\n );\n wrapperElement?.classList.toggle(\n TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS,\n selectAllState === 'indeterminate',\n );\n wrapperElement?.classList.toggle(\n TREE_GRID_SELECT_ALL_UNCHECKED_CLASS,\n selectAllState === 'unchecked',\n );\n }\n\n if (header && isSelectingEnabled) {\n header.CanSelect = isCheckboxSelectionMode ? 1 : 0;\n }\n};\n\nconst treeGridSelectionPanelStateSyncTimeouts = new Map<string, number>();\n\n/**\n * TreeGrid 선택 패널 표시 상태 지연 동기화\n * @param grid TreeGrid 인스턴스\n * @param gridId TreeGrid 인스턴스 ID\n */\nconst scheduleTreeGridSelectionPanelStateSync = (grid: TGrid, gridId: string) => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const activeTimeout = treeGridSelectionPanelStateSyncTimeouts.get(gridId);\n\n if (activeTimeout !== undefined) {\n window.clearTimeout(activeTimeout);\n }\n\n const nextTimeout = window.setTimeout(() => {\n treeGridSelectionPanelStateSyncTimeouts.delete(gridId);\n syncTreeGridSelectionPanelState(grid, gridId);\n }, 0);\n\n treeGridSelectionPanelStateSyncTimeouts.set(gridId, nextTimeout);\n};\n\n/**\n * TreeGrid 기본 Enter 동작 적용\n * @param grid TreeGrid 인스턴스\n * @param enterMode EnterMode 값\n */\nconst applyTreeGridDefaultEnterMode = (grid: TGrid, enterMode: number) => {\n grid.EnterMode = enterMode;\n\n const actionConfig =\n TREE_GRID_DEFAULT_ENTER_ACTIONS[\n enterMode as keyof typeof TREE_GRID_DEFAULT_ENTER_ACTIONS\n ];\n\n if (!actionConfig) {\n return;\n }\n\n const mutableGrid = grid as TGrid & { Actions?: TreeGridMutableActions };\n\n mutableGrid.Actions ??= {};\n mutableGrid.Actions.OnEnter = actionConfig.onEnter;\n mutableGrid.Actions.OnEnterEdit = actionConfig.onEnterEdit;\n};\n\nconst isTreeGridInlineUrl = (url?: string) => {\n return url?.startsWith('data:') || url?.startsWith('blob:');\n};\n\nconst treeGridInlineBlobUrlCache = new Map<string, string>();\n\nconst resolveTreeGridInlineUrl = (url?: string) => {\n if (!url || !url.startsWith('data:')) {\n return url;\n }\n\n const cachedUrl = treeGridInlineBlobUrlCache.get(url);\n\n if (cachedUrl) {\n return cachedUrl;\n }\n\n try {\n const [meta, encodedData = ''] = url.split(',', 2);\n const match = /^data:([^;]*)(;base64)?$/i.exec(meta);\n const mimeType = match?.[1] || 'application/octet-stream';\n const decodedData = match?.[2] ? atob(encodedData) : decodeURIComponent(encodedData);\n const bytes = new Uint8Array(decodedData.length);\n\n for (let index = 0; index < decodedData.length; index += 1) {\n bytes[index] = decodedData.charCodeAt(index);\n }\n\n const blobUrl = URL.createObjectURL(new Blob([bytes], { type: mimeType }));\n\n treeGridInlineBlobUrlCache.set(url, blobUrl);\n\n return blobUrl;\n } catch {\n return url;\n }\n};\n\nconst appendNoCacheQuery = (url: string) => {\n if (!url || isTreeGridInlineUrl(url)) {\n return resolveTreeGridInlineUrl(url);\n }\n\n const hashIndex = url.indexOf('#');\n const [baseUrl, hashFragment] =\n hashIndex >= 0 ? [url.slice(0, hashIndex), url.slice(hashIndex)] : [url, ''];\n const querySeparator = baseUrl.includes('?') ? '&' : '?';\n\n return `${baseUrl}${querySeparator}noCache=${Date.now()}${hashFragment}`;\n};\n\ntype TreeGridDeletedRowStateSyncOptions = {\n canEdit?: 1 | 2;\n highlightColumns?: readonly string[];\n highlightBackgroundColor?: string;\n};\n\n/**\n * 삭제 상태 변경 행 시각 상태 동기화\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param options 동기화 옵션\n */\nconst syncTreeGridDeletedRowState = (\n grid: TGrid | null | undefined,\n row: TRow,\n options: TreeGridDeletedRowStateSyncOptions,\n) => {\n if (!grid) {\n return;\n }\n\n const canEdit = options.canEdit;\n const highlightColumns = options.highlightColumns ?? [];\n const highlightBackgroundColor = options.highlightBackgroundColor;\n\n if (canEdit === undefined && !highlightColumns.length) {\n return;\n }\n\n if (typeof grid.StartUpdate === 'function') {\n grid.StartUpdate();\n }\n\n try {\n if (canEdit !== undefined) {\n row.CanEdit = canEdit;\n }\n\n highlightColumns.forEach((col) => {\n if (!col) {\n return;\n }\n\n grid.SetValue(\n row,\n `${col}Class`,\n highlightBackgroundColor ? TREEGRID_CELL_CHANGED_CLASS : '',\n 0,\n );\n grid.SetValue(row, `${col}Color`, highlightBackgroundColor ?? '', 0);\n });\n } finally {\n if (typeof grid.EndUpdate === 'function') {\n grid.EndUpdate();\n }\n }\n\n if (typeof grid.RefreshRow === 'function') {\n grid.RefreshRow(row);\n }\n};\n\nconst resolveTreeGridDataUrl = (dataUrl?: string) => {\n if (!dataUrl) {\n return '';\n }\n\n if (isTreeGridInlineUrl(dataUrl) || dataUrl.includes('assets')) {\n return appendNoCacheQuery(dataUrl);\n }\n\n // @ts-expect-error - API base URL env is provided by host app\n return appendNoCacheQuery(`${import.meta.env.VITE_API_BASE_URL}/${dataUrl}`);\n};\n\nconst isTreeGridPromiseLike = <T,>(value: unknown): value is PromiseLike<T> => {\n return (\n (typeof value === 'object' || typeof value === 'function') &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n};\n\n/**\n * 삭제 상태 행 재클릭 후속 처리\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param action 후속 액션\n * @param syncHasDisplayDataRows 표시 행 동기화 콜백\n */\nconst applyTreeGridBeforeRowUndeleteAction = (\n grid: TGrid | null | undefined,\n row: TRow,\n action: TreeGridBeforeRowUndeleteAction | undefined,\n syncHasDisplayDataRows: (grid: TGrid | null) => void,\n) => {\n if (!grid || action === 'cancel') {\n return;\n }\n\n if (action === 'remove') {\n grid.RemoveRow(row);\n syncHasDisplayDataRows(grid);\n return;\n }\n\n grid.DeleteRowT(row, 3);\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\n/**\n * TreeGrid 초기화 옵션 생성\n * @param input 초기화 입력값\n */\nexport const buildTreeGridInitializationOptions = <T,>({\n id,\n layoutUrl,\n layoutData,\n toolbarTotalCountFormula,\n suppressCfg,\n disabledAnimations,\n dataUrl,\n bodyData,\n useDataUrl,\n width,\n height,\n languageId,\n}: TreeGridInitializationInput<T>) => {\n return {\n id,\n Layout: layoutData\n ? {\n Data: applyTreeGridDefaultLayout(\n layoutData,\n disabledAnimations,\n toolbarTotalCountFormula,\n suppressCfg,\n ),\n }\n : { 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\ntype TreeGridCellSpanAttribute = 'Span' | 'RowSpan';\n\n/**\n * TreeGrid span 속성 숫자 변환\n * @param value span 속성 원본값\n */\nconst parseTreeGridPositiveNumber = (value: unknown) => {\n if (typeof value === 'number') {\n return Number.isFinite(value) && value > 0 ? value : undefined;\n }\n\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (!trimmedValue) {\n return undefined;\n }\n\n const numericValue = Number(trimmedValue);\n\n return Number.isFinite(numericValue) && numericValue > 0 ? numericValue : undefined;\n};\n\n/**\n * TreeGrid 헤더 셀 span 속성 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param attributeName span 속성 이름\n */\nconst getTreeGridHeaderCellSpanAttribute = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n attributeName: TreeGridCellSpanAttribute,\n) => {\n if (!row || !col) {\n return undefined;\n }\n\n const attributeValue = grid.GetAttribute(row, col, attributeName);\n const resolvedAttributeValue = parseTreeGridPositiveNumber(attributeValue);\n\n if (resolvedAttributeValue !== undefined) {\n return resolvedAttributeValue;\n }\n\n return parseTreeGridPositiveNumber(\n (row as unknown as Record<string, unknown>)[`${col}${attributeName}`],\n );\n};\n\n/**\n * TreeGrid 그룹 전용 헤더 셀 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst isTreeGridGroupHeaderCell = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || row.Fixed !== 'Head') {\n return false;\n }\n\n const colSpan = getTreeGridHeaderCellSpanAttribute(grid, row, col, 'Span') ?? 1;\n\n if (colSpan <= 1) {\n return false;\n }\n\n const rowSpan = getTreeGridHeaderCellSpanAttribute(grid, row, col, 'RowSpan') ?? 1;\n\n return rowSpan === 1;\n};\n\n/**\n * TreeGrid 헤더 버튼 제거 대상 등록\n * @param targets 헤더 행별 대상 컬럼 목록\n * @param row 헤더 행\n * @param col 컬럼 키\n */\nconst addTreeGridHeaderButtonAttributeTarget = (\n targets: Map<TRow, Set<string>>,\n row: TRow,\n col: string,\n) => {\n const targetCols = targets.get(row);\n\n if (targetCols) {\n targetCols.add(col);\n return;\n }\n\n targets.set(row, new Set([col]));\n};\n\n/**\n * TreeGrid 그룹 헤더 sort 버튼 제거 대상 조회\n * @param grid TreeGrid 인스턴스\n * @param headerRows 헤더 행 목록\n * @param cols 컬럼 키 목록\n * @param includeChildHeaderCells 하위 헤더 셀 포함 여부\n */\nconst getTreeGridGroupHeaderSortButtonTargets = (\n grid: TGrid,\n headerRows: readonly TRow[],\n cols: readonly string[],\n includeChildHeaderCells: boolean,\n) => {\n const targets = new Map<TRow, Set<string>>();\n\n headerRows.forEach((row, rowIndex) => {\n cols.forEach((col, colIndex) => {\n if (!isTreeGridGroupHeaderCell(grid, row, col)) {\n return;\n }\n\n addTreeGridHeaderButtonAttributeTarget(targets, row, col);\n\n if (!includeChildHeaderCells) {\n return;\n }\n\n const colSpan = Math.floor(getTreeGridHeaderCellSpanAttribute(grid, row, col, 'Span') ?? 1);\n const childColEndIndex = Math.min(cols.length, colIndex + colSpan);\n\n for (let childRowIndex = rowIndex + 1; childRowIndex < headerRows.length; childRowIndex += 1) {\n const childRow = headerRows[childRowIndex];\n\n for (let childColIndex = colIndex; childColIndex < childColEndIndex; childColIndex += 1) {\n addTreeGridHeaderButtonAttributeTarget(targets, childRow, cols[childColIndex]);\n }\n }\n });\n });\n\n return targets;\n};\n\n/**\n * TreeGrid 그룹 헤더 sort 버튼 제거 대상 셀 여부\n * @param grid TreeGrid 인스턴스\n * @param row 헤더 행\n * @param col 컬럼 키\n * @param includeChildHeaderCells 하위 헤더 셀 포함 여부\n */\nconst isTreeGridGroupHeaderSortButtonTarget = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n includeChildHeaderCells: boolean,\n) => {\n if (!row || !col || row.Fixed !== 'Head') {\n return false;\n }\n\n const headerRows =\n typeof grid.GetFixedRows === 'function'\n ? grid.GetFixedRows().filter((fixedRow) => fixedRow.Fixed === 'Head')\n : [];\n const cols = typeof grid.GetCols === 'function' ? grid.GetCols() : [];\n\n if (!headerRows.length || !cols.length) {\n return false;\n }\n\n return (\n getTreeGridGroupHeaderSortButtonTargets(\n grid,\n headerRows,\n cols,\n includeChildHeaderCells,\n )\n .get(row)\n ?.has(col) === true\n );\n};\n\n/**\n * TreeGrid 그룹 헤더 sort 버튼 비활성 셀 속성 적용\n * @param grid TreeGrid 인스턴스\n * @param gridId TreeGrid 인스턴스 ID\n * @param refreshRows 반영 후 헤더 행 refresh 여부\n * @param includeChildHeaderCells 하위 헤더 셀 포함 여부\n */\nconst applyTreeGridGroupHeaderSortButtonAttributes = (\n grid: TGrid,\n gridId: string,\n refreshRows = false,\n includeChildHeaderCells = true,\n) => {\n const applyStartedAt =\n typeof performance !== 'undefined' ? performance.now() : Date.now();\n const headerRows =\n typeof grid.GetFixedRows === 'function'\n ? grid.GetFixedRows().filter((row) => row.Fixed === 'Head')\n : [];\n const cols = typeof grid.GetCols === 'function' ? grid.GetCols() : [];\n\n if (!headerRows.length || !cols.length) {\n return;\n }\n\n const updatedRows = new Set<TRow>();\n let updatedCellCount = 0;\n const targets = getTreeGridGroupHeaderSortButtonTargets(\n grid,\n headerRows,\n cols,\n includeChildHeaderCells,\n );\n\n if (!targets.size) {\n return;\n }\n\n if (typeof grid.StartUpdate === 'function') {\n grid.StartUpdate();\n }\n\n try {\n targets.forEach((targetCols, row) => {\n targetCols.forEach((col) => {\n if (grid.GetAttribute(row, col, TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE) === '') {\n return;\n }\n\n grid.SetAttribute(row, col, TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE, '', 0, 0);\n updatedRows.add(row);\n updatedCellCount += 1;\n });\n });\n } finally {\n if (typeof grid.EndUpdate === 'function') {\n grid.EndUpdate();\n }\n }\n\n if (!updatedRows.size) {\n return;\n }\n\n if (refreshRows) {\n updatedRows.forEach((row) => {\n if (typeof grid.RefreshRow === 'function') {\n grid.RefreshRow(row);\n }\n });\n }\n\n countTreeGridPerf(gridId, 'group header button attribute apply');\n measureTreeGridPerf(gridId, 'group header button attribute apply', applyStartedAt, {\n updatedCellCount,\n updatedRowCount: updatedRows.size,\n });\n};\n\n/**\n * TreeGrid Body 데이터 건수\n * @param bodyData TreeGrid Body 데이터\n */\nexport const 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\nconst getTreeGridColumnNames = (grid: TGrid) => Object.keys(grid.Cols ?? {}).filter(Boolean);\n\n/**\n * TreeGrid 표시 컬럼 여부\n * @param grid TreeGrid 인스턴스\n * @param col TreeGrid 컬럼 키\n */\nconst isVisibleTreeGridColumn = (grid: TGrid, col: string) => {\n const column = grid.Cols?.[col];\n\n return (\n !!column &&\n !isTreeGridDisabledConfigValue(column.Visible) &&\n !isTreeGridExplicitHiddenConfigValue(column.Hidden)\n );\n};\n\n/**\n * TreeGrid 컬럼 순서값 조회\n * @param value TreeGrid 컬럼 순서 속성값\n * @param fallback fallback 순서값\n */\nconst resolveTreeGridColumnOrderValue = (value: unknown, fallback: number) => {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n};\n\n/**\n * TreeGrid 신규 행 박스 대상 컬럼 경계 조회\n * @param grid TreeGrid 인스턴스\n */\nconst getTreeGridAddedRowBoxColumnBounds = (grid: TGrid): TreeGridAddedRowBoxColumnBounds => {\n const cachedBounds = treeGridAddedRowBoxColumnBoundsCache.get(grid);\n\n if (cachedBounds) {\n return cachedBounds;\n }\n\n const columnNameIndexes = new Map(\n getTreeGridColumnNames(grid).map((columnName, index) => [columnName, index]),\n );\n const columns = [...columnNameIndexes.keys()]\n .filter(\n (columnName) =>\n !TREE_GRID_ROW_BOX_EXCLUDED_COLUMNS.has(columnName) &&\n isVisibleTreeGridColumn(grid, columnName),\n )\n .sort((columnNameA, columnNameB) => {\n const columnA = grid.Cols?.[columnNameA];\n const columnB = grid.Cols?.[columnNameB];\n const indexA = columnNameIndexes.get(columnNameA) ?? 0;\n const indexB = columnNameIndexes.get(columnNameB) ?? 0;\n const sectionDiff =\n resolveTreeGridColumnOrderValue(columnA?.Sec, indexA) -\n resolveTreeGridColumnOrderValue(columnB?.Sec, indexB);\n\n if (sectionDiff !== 0) {\n return sectionDiff;\n }\n\n const positionDiff =\n resolveTreeGridColumnOrderValue(columnA?.Pos, indexA) -\n resolveTreeGridColumnOrderValue(columnB?.Pos, indexB);\n\n return positionDiff || indexA - indexB;\n });\n const columnBounds = {\n columnSet: new Set(columns),\n firstColumn: columns[0],\n lastColumn: columns[columns.length - 1],\n };\n\n treeGridAddedRowBoxColumnBoundsCache.set(grid, columnBounds);\n\n return columnBounds;\n};\n\n/**\n * TreeGrid 신규 행 박스 컬럼 경계 캐시 제거\n * @param grid TreeGrid 인스턴스\n */\nconst clearTreeGridAddedRowBoxColumnBounds = (grid: TGrid | null | undefined) => {\n if (grid) {\n treeGridAddedRowBoxColumnBoundsCache.delete(grid);\n }\n};\n\nconst getTreeGridRows = (grid: TGrid) => {\n if (typeof grid.GetFirst === 'function' && typeof grid.GetNext === 'function') {\n const rows: TRow[] = [];\n let row = grid.GetFirst();\n\n while (row) {\n rows.push(row);\n row = grid.GetNext(row);\n }\n\n return rows;\n }\n\n return Object.values(grid.Rows ?? {});\n};\n\nconst treeGridSelectionRowSpanAnchorRowMaps = new WeakMap<TGrid, WeakMap<TRow, TRow | null>>();\n\n/**\n * TreeGrid 선택 Panel row span 앵커 맵 제거\n * @param grid TreeGrid 인스턴스\n */\nconst clearTreeGridSelectionRowSpanAnchorRowMap = (grid: TGrid | null | undefined) => {\n if (grid) {\n treeGridSelectionRowSpanAnchorRowMaps.delete(grid);\n }\n};\n\n/**\n * TreeGrid row span 정수값 조회\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getTreeGridRowSpanCount = (row: TRow | null | undefined, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown> | null;\n const rowSpanValue = rowRecord?.[`${col}RowSpan`];\n const rowSpan =\n typeof rowSpanValue === 'number'\n ? rowSpanValue\n : Number.parseFloat(String(rowSpanValue ?? ''));\n\n return Number.isFinite(rowSpan) && rowSpan > 1 ? Math.floor(rowSpan) : 1;\n};\n\n/**\n * TreeGrid 선택 Panel row span 앵커 맵 생성\n * @param grid TreeGrid 인스턴스\n */\nconst createTreeGridSelectionRowSpanAnchorRowMap = (grid: TGrid) => {\n const anchorRowMap = new WeakMap<TRow, TRow | null>();\n let anchorRow: TRow | null = null;\n let anchorEndIndex = -1;\n\n getTreeGridRows(grid).forEach((row, index) => {\n if (!isDisplayTreeGridRow(row)) {\n anchorRowMap.set(row, null);\n return;\n }\n\n const rowSpan = getTreeGridRowSpanCount(row, TREE_GRID_SELECTION_ROW_SPAN_COLUMN);\n\n if (rowSpan > 1) {\n anchorRow = row;\n anchorEndIndex = index + rowSpan - 1;\n anchorRowMap.set(row, row);\n return;\n }\n\n anchorRowMap.set(row, anchorRow && index <= anchorEndIndex ? anchorRow : null);\n\n if (index >= anchorEndIndex) {\n anchorRow = null;\n anchorEndIndex = -1;\n }\n });\n\n return anchorRowMap;\n};\n\n/**\n * TreeGrid 선택 Panel row span 앵커 행 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst getTreeGridSelectionRowSpanAnchorRow = (\n grid: TGrid,\n row: TRow | null | undefined,\n) => {\n if (!row || !isDisplayTreeGridRow(row)) {\n return null;\n }\n\n let anchorRowMap = treeGridSelectionRowSpanAnchorRowMaps.get(grid);\n\n if (!anchorRowMap?.has(row)) {\n anchorRowMap = createTreeGridSelectionRowSpanAnchorRowMap(grid);\n treeGridSelectionRowSpanAnchorRowMaps.set(grid, anchorRowMap);\n }\n\n return anchorRowMap.get(row) ?? null;\n};\n\n/**\n * TreeGrid 선택 Panel row span 그룹 행 목록 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst getTreeGridSelectionRowSpanRows = (grid: TGrid, row: TRow | null | undefined) => {\n const anchorRow = getTreeGridSelectionRowSpanAnchorRow(grid, row);\n\n if (!anchorRow) {\n return [];\n }\n\n const rowSpan = getTreeGridRowSpanCount(anchorRow, TREE_GRID_SELECTION_ROW_SPAN_COLUMN);\n const rows: TRow[] = [];\n let currentRow: TRow | null = anchorRow;\n\n for (let rowOffset = 0; currentRow && rowOffset < rowSpan; rowOffset += 1) {\n if (isDisplayTreeGridRow(currentRow)) {\n rows.push(currentRow);\n }\n\n currentRow =\n typeof grid.GetNext === 'function' ? grid.GetNext(currentRow) : null;\n }\n\n return rows;\n};\n\n/**\n * TreeGrid 선택 Panel row span 선택 행 목록 조회\n * @param grid TreeGrid 인스턴스\n */\nconst getTreeGridSelectedRowSpanRows = (grid: TGrid) => {\n const targetRows = new Set<TRow>();\n\n (grid.GetSelRows() ?? []).forEach((selectedRow) => {\n getTreeGridSelectionRowSpanRows(grid, selectedRow).forEach((targetRow) => {\n targetRows.add(targetRow);\n });\n });\n\n return [...targetRows];\n};\n\n/**\n * TreeGrid 변경 비교 기준값 저장\n * @param grid TreeGrid 인스턴스\n * @param baselineMap 셀 기준값 저장소\n */\nexport const captureTreeGridChangeBaselines = (\n grid: TGrid | null | undefined,\n baselineMap: TreeGridCellBaselineMap,\n) => {\n if (!grid) {\n return;\n }\n\n const cols = getTreeGridColumnNames(grid);\n\n getTreeGridRows(grid).forEach((row) => {\n if (!isDisplayTreeGridRow(row)) {\n return;\n }\n\n baselineMap.set(\n row,\n new Map(cols.map((col) => [col, getTreeGridCellComparableValue(grid, row, col)])),\n );\n });\n};\n\nconst isTreeGridChangedFlag = (value: unknown) =>\n value !== undefined &&\n value !== null &&\n value !== '' &&\n value !== 0 &&\n value !== false &&\n value !== '0';\n\nconst hasOtherTreeGridChangedCells = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n\n return getTreeGridColumnNames(grid).some((column) => {\n return column !== col && isTreeGridChangedFlag(rowRecord[`${column}Changed`]);\n });\n};\n\n/**\n * TreeGrid 셀 변경 상태 제거\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst clearTreeGridCellChangedState = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n\n rowRecord[`${col}Changed`] = 0;\n\n if (\n !isAddedTreeGridRow(row) &&\n !isTreeGridRowAddedById(row) &&\n !hasOtherTreeGridChangedCells(grid, row, col)\n ) {\n rowRecord.Changed = 0;\n }\n};\n\nconst resolveTreeGridCellBaselineValue = (\n baselineMap: TreeGridCellBaselineMap,\n row: TRow,\n col: string,\n) => {\n const baselineValues = baselineMap.get(row);\n\n if (baselineValues?.has(col)) {\n return baselineValues.get(col);\n }\n\n return undefined;\n};\n\n/**\n * TreeGrid 신규 행 변경 셀 하이라이트 동기화\n * @param gridId TreeGrid 인스턴스 ID\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n * @param backgroundColor 변경 하이라이트 배경색\n * @param highlightRefresh 하이라이트 적용 후 셀 refresh 여부\n */\nconst syncTreeGridAddedRowChangedCellHighlight = ({\n gridId,\n grid,\n row,\n col,\n backgroundColor,\n highlightRefresh,\n}: {\n gridId: string;\n grid: TGrid;\n row: TRow;\n col: string;\n backgroundColor: string;\n highlightRefresh?: boolean;\n}) => {\n if (!isAddedTreeGridRow(row) && !isTreeGridRowAddedById(row)) {\n return false;\n }\n\n if (grid.CanEdit(row, col) !== 1) {\n return true;\n }\n\n const baselineValue = getTreeGridAddedRowBaselineValue(row, col);\n const isHighlightedCell = getTreeGridAddedRowHighlightColumns(row).includes(col);\n\n if (baselineValue === undefined) {\n return true;\n }\n\n const currentValue = getTreeGridCellComparableValue(grid, row, col);\n\n if (currentValue === baselineValue) {\n removeTreeGridAddedRowHighlightColumn(row, col);\n if (isHighlightedCell) {\n clearTreeGridCellHighlightById(gridId, { row, col });\n }\n clearTreeGridCellChangedState(grid, row, col);\n return true;\n }\n\n appendTreeGridAddedRowHighlightColumn(row, col);\n highlightTreeGridCellById(gridId, {\n row,\n col,\n backgroundColor,\n refresh: highlightRefresh,\n });\n\n return true;\n};\n\n/**\n * TreeGrid 셀 변경 하이라이트 동기화\n * @param gridId TreeGrid 인스턴스 ID\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n * @param backgroundColor 변경 하이라이트 배경색\n * @param baselineMap 셀 기준값 저장소\n * @param highlightRefresh 하이라이트 적용 후 셀 refresh 여부\n */\nexport const syncTreeGridChangedCellHighlight = ({\n gridId,\n grid,\n row,\n col,\n backgroundColor,\n baselineMap,\n highlightRefresh,\n}: {\n gridId: string;\n grid: TGrid;\n row: TRow;\n col: string;\n backgroundColor: string;\n baselineMap: TreeGridCellBaselineMap;\n highlightRefresh?: boolean;\n}) => {\n if (!isDisplayTreeGridRow(row)) {\n return;\n }\n\n if (\n syncTreeGridAddedRowChangedCellHighlight({\n gridId,\n grid,\n row,\n col,\n backgroundColor,\n highlightRefresh,\n })\n ) {\n return;\n }\n\n const baselineValue = resolveTreeGridCellBaselineValue(baselineMap, row, col);\n const currentValue = getTreeGridCellComparableValue(grid, row, col);\n\n if (baselineValue !== undefined && currentValue === baselineValue) {\n clearTreeGridCellHighlightById(gridId, { row, col });\n clearTreeGridCellChangedState(grid, row, col);\n return;\n }\n\n highlightTreeGridCellById(gridId, {\n row,\n col,\n backgroundColor,\n refresh: highlightRefresh,\n });\n};\n\n/**\n * TreeGrid 셀 편집 가능 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst isEditableTreeGridCell = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n return grid.CanEdit(row, col) === 1;\n};\n\n/**\n * TreeGrid 셀 명시 색상 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getExplicitTreeGridCellColor = (grid: TGrid, row: TRow, col: string) => {\n const color = grid.GetAttribute(row, col, 'Color') as unknown;\n\n if (typeof color === 'number') {\n return toTreeGridCssHexColor(color);\n }\n\n if (typeof color === 'string') {\n const trimmedColor = color.trim();\n\n return trimmedColor || undefined;\n }\n\n return undefined;\n};\n\n/**\n * TreeGrid 셀 명시 색상 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst hasExplicitTreeGridCellColor = (grid: TGrid, row: TRow, col: string) => {\n return getExplicitTreeGridCellColor(grid, row, col) !== undefined;\n};\n\n/** TreeGrid 포커스 셀 상태 여부 */\nconst isTreeGridFocusedCellState = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n const focused =\n typeof grid.IsFocused === 'function'\n ? grid.IsFocused(row, col)\n : grid.FRow === row && grid.FCol === col;\n\n return focused !== 0 && focused !== false && focused !== undefined && focused !== null;\n};\n\n/** TreeGrid 선택 셀 상태 여부 */\nconst isTreeGridSelectedCellState = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n const selected = grid.IsSelected(row, col);\n\n if (selected !== 0 && selected !== false && selected !== undefined && selected !== null) {\n return true;\n }\n\n const anchorRow = getTreeGridSelectionRowSpanAnchorRow(grid, row);\n\n if (!anchorRow || anchorRow === row) {\n return false;\n }\n\n const anchorSelected = grid.IsSelected(anchorRow, col);\n\n return (\n anchorSelected !== 0 &&\n anchorSelected !== false &&\n anchorSelected !== undefined &&\n anchorSelected !== null\n );\n};\n\n/**\n * TreeGrid 변경 셀 class 포함 여부\n * @param className 원본 class 문자열\n */\nconst hasTreeGridChangedCellDisplayClass = (className: string) => {\n if (!TREE_GRID_CELL_CHANGED_CLASS_TOKENS.length) {\n return false;\n }\n\n const classTokens = className.split(/\\s+/).filter(Boolean);\n\n return TREE_GRID_CELL_CHANGED_CLASS_TOKENS.every((classToken) =>\n classTokens.includes(classToken),\n );\n};\n\n/**\n * TreeGrid 선택 변경 셀 표시 class 추가\n * @param className 원본 class 문자열\n */\nconst appendTreeGridSelectedChangedCellDisplayClass = (className: string) => {\n if (\n !className ||\n className.split(/\\s+/).includes(TREE_GRID_SELECTED_CHANGED_CELL_CLASS) ||\n !hasTreeGridChangedCellDisplayClass(className)\n ) {\n return undefined;\n }\n\n return `${className} ${TREE_GRID_SELECTED_CHANGED_CELL_CLASS}`;\n};\n\n/**\n * TreeGrid 변경 셀 class 보유 행 여부\n * @param row 대상 행\n */\nconst hasTreeGridChangedCellDisplayClassInRow = (row: TRow | null | undefined) => {\n if (!row || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n return Object.entries(row as unknown as Record<string, unknown>).some(([key, value]) => {\n return (\n key.endsWith('Class') &&\n typeof value === 'string' &&\n hasTreeGridChangedCellDisplayClass(value)\n );\n });\n};\n\n/**\n * TreeGrid 선택 변경 행 class refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n */\nconst scheduleTreeGridSelectionChangedClassRefresh = (\n grid: TGrid,\n row: TRow | null | undefined,\n) => {\n if (\n !row ||\n !hasTreeGridChangedCellDisplayClassInRow(row) ||\n typeof grid.RefreshRow !== 'function'\n ) {\n return;\n }\n\n const targetRow = row;\n\n window.setTimeout(() => {\n grid.RefreshRow(targetRow);\n }, 0);\n};\n\n/**\n * TreeGrid 행 목록 refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param rows TreeGrid 행 목록\n */\nconst scheduleTreeGridRowsRefresh = (grid: TGrid, rows: readonly TRow[]) => {\n if (!rows.length || typeof window === 'undefined' || typeof grid.RefreshRow !== 'function') {\n return;\n }\n\n const targetRows = [...new Set(rows)];\n\n window.setTimeout(() => {\n targetRows.forEach((targetRow) => {\n grid.RefreshRow(targetRow);\n });\n }, 0);\n};\n\n/**\n * TreeGrid 선택 Panel row span 그룹 refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst scheduleTreeGridSelectionRowSpanRefresh = (\n grid: TGrid,\n row: TRow | null | undefined,\n) => {\n if (!row) {\n return;\n }\n\n const targetRows = getTreeGridSelectionRowSpanRows(grid, row);\n\n if (targetRows.length <= 1) {\n return;\n }\n\n scheduleTreeGridRowsRefresh(grid, targetRows);\n};\n\n/**\n * TreeGrid 전체 선택 Panel row span 그룹 refresh 예약\n * @param grid TreeGrid 인스턴스\n */\nconst scheduleTreeGridSelectionRowSpanRefreshAll = (grid: TGrid) => {\n const targetRows = getTreeGridRows(grid).filter((row) => {\n return isDisplayTreeGridRow(row) && getTreeGridSelectionRowSpanAnchorRow(grid, row);\n });\n\n scheduleTreeGridRowsRefresh(grid, targetRows);\n};\n\n/**\n * TreeGrid 입력 셀 기본 배경색 계산\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getEditableTreeGridCellDefaultColor = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n editableCellBackgroundColorValue: number | undefined,\n) => {\n if (\n !row ||\n editableCellBackgroundColorValue === undefined ||\n !isEditableTreeGridCell(grid, row, col) ||\n isTreeGridFocusedCellState(grid, row, col) ||\n isTreeGridSelectedCellState(grid, row, col) ||\n hasExplicitTreeGridCellColor(grid, row, col)\n ) {\n return undefined;\n }\n\n return editableCellBackgroundColorValue;\n};\n\nconst matchesTreeGridRgbColor = (\n r: number,\n g: number,\n b: number,\n expected: readonly [number, number, number],\n) => {\n return r === expected[0] && g === expected[1] && b === expected[2];\n};\n\n/**\n * TreeGrid native Error 배경색 여부\n * @param r red 채널\n * @param g green 채널\n * @param b blue 채널\n */\nconst isTreeGridNativeErrorBackgroundColor = (r: number, g: number, b: number) => {\n return TREE_GRID_NATIVE_ERROR_CELL_RGB_VALUES.some((expectedColor) =>\n matchesTreeGridRgbColor(r, g, b, expectedColor),\n );\n};\n\n/**\n * TreeGrid 숫자 색상 CSS 변환\n * @param color TreeGrid 숫자 색상\n */\nconst toTreeGridCssHexColor = (color: number | undefined) => {\n if (color === undefined || !Number.isFinite(color)) {\n return undefined;\n }\n\n return `#${Math.trunc(color).toString(16).padStart(6, '0')}`;\n};\n\n/**\n * TreeGrid 셀 Error 메시지 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getTreeGridCellError = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string | null | undefined,\n) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return '';\n }\n\n const error = grid.GetAttribute(row, col, 'Error');\n\n return error ?? '';\n};\n\n/**\n * TreeGrid 셀 Error 설정 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst hasTreeGridCellError = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n return getTreeGridCellError(grid, row, col) !== '';\n};\n\n/**\n * TreeGrid 행 Error 상태 초기화\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst clearTreeGridRowErrors = (grid: TGrid, row: TRow | null | undefined) => {\n if (!row) {\n return;\n }\n\n let hasError = false;\n\n getTreeGridColumnNames(grid).forEach((col) => {\n if (!hasTreeGridCellError(grid, row, col)) {\n return;\n }\n\n grid.SetAttribute(row, col, 'Error', '', 0);\n hasError = true;\n });\n\n if (hasError) {\n grid.RefreshRow(row);\n }\n};\n\n/**\n * TreeGrid mouse event anchor 엘리먼트 조회\n * @param event TreeGrid mouse event\n */\nconst getTreeGridMouseEventAnchorElement = (event: Event | null | undefined) => {\n const target = event?.target;\n\n if (\n typeof HTMLElement === 'undefined' ||\n typeof Element === 'undefined' ||\n typeof Node === 'undefined'\n ) {\n return null;\n }\n\n const targetElement = target instanceof Element ? target : null;\n const fallbackTargetElement = target instanceof Node ? target.parentElement : null;\n const anchorTargetElement = targetElement ?? fallbackTargetElement;\n\n if (anchorTargetElement) {\n const cellElement = anchorTargetElement.closest('td,th');\n\n if (cellElement instanceof HTMLElement) {\n return cellElement;\n }\n\n return anchorTargetElement instanceof HTMLElement ? anchorTargetElement : null;\n }\n\n return null;\n};\n\n/**\n * TreeGrid 변경 행 또는 셀 여부\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst isChangedTreeGridRowOrCell = (row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n const rowRecord = row as unknown as Record<string, unknown>;\n const cellDisplayClass = rowRecord[`${col}Class`];\n const isChangedCell =\n isTreeGridChangedFlag(rowRecord[`${col}Changed`]) ||\n (typeof cellDisplayClass === 'string' &&\n hasTreeGridChangedCellDisplayClass(cellDisplayClass));\n\n if (isAddedTreeGridRow(row) || isTreeGridRowAddedById(row)) {\n return isChangedCell;\n }\n\n return (\n isChangedCell ||\n isTreeGridChangedFlag(rowRecord.Changed)\n );\n};\n\n/**\n * TreeGrid native input 편집 타입 여부\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst isTreeGridNativeInputEditType = (grid: TGrid, row: TRow, col: string) => {\n return TREE_GRID_NATIVE_INPUT_EDIT_TYPES.has(grid.GetType(row, col));\n};\n\nconst isTreeGridReadonlyHoveredCellState = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col || !isDisplayTreeGridRow(row) || grid.ARow !== row || grid.ACol !== col) {\n return false;\n }\n\n return grid.CanEdit(row, col) === 0;\n};\n\nconst isTreeGridPreviewHoveredCellState = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col || !isDisplayTreeGridRow(row) || grid.ARow !== row || grid.ACol !== col) {\n return false;\n }\n\n return grid.CanEdit(row, col) === 2;\n};\n\n/** TreeGrid 포커스 행 상태 여부 */\nconst isTreeGridFocusedRowState = (grid: TGrid, row: TRow | null | undefined) => {\n return !!row && isDisplayTreeGridRow(row) && grid.FRow === row;\n};\n\n/** TreeGrid 호버 행 상태 여부 */\nconst isTreeGridHoveredRowState = (grid: TGrid, row: TRow | null | undefined) => {\n return !!row && isDisplayTreeGridRow(row) && grid.ARow === row;\n};\n\nconst resolveTreeGridStateBackgroundColor = ({\n grid,\n row,\n col,\n r,\n g,\n b,\n focusedCellBackgroundColor,\n selectedCellBackgroundColor,\n hoverCellBackgroundColor,\n changedCellBackgroundColor,\n editableCellBackgroundColorValue,\n}: {\n grid: TGrid;\n row: TRow | null | undefined;\n col: string;\n r: number;\n g: number;\n b: number;\n focusedCellBackgroundColor: string;\n selectedCellBackgroundColor: string;\n hoverCellBackgroundColor: string;\n changedCellBackgroundColor: string;\n editableCellBackgroundColorValue: number | undefined;\n}) => {\n if (isTreeGridFocusedCellState(grid, row, col)) {\n return focusedCellBackgroundColor;\n }\n\n if (isTreeGridSelectedCellState(grid, row, col)) {\n return selectedCellBackgroundColor;\n }\n\n if (\n isTreeGridReadonlyHoveredCellState(grid, row, col) &&\n (matchesTreeGridRgbColor(r, g, b, TREE_GRID_READONLY_HOVER_CELL_RGB) ||\n matchesTreeGridRgbColor(r, g, b, TREE_GRID_READONLY_NO_FOCUS_HOVER_CELL_RGB))\n ) {\n return hoverCellBackgroundColor;\n }\n\n if (\n isTreeGridPreviewHoveredCellState(grid, row, col) &&\n (matchesTreeGridRgbColor(r, g, b, TREE_GRID_PREVIEW_CELL_RGB) ||\n matchesTreeGridRgbColor(r, g, b, TREE_GRID_PREVIEW_CELL_SOFT_RGB) ||\n matchesTreeGridRgbColor(r, g, b, TREE_GRID_PREVIEW_CELL_DIM_RGB))\n ) {\n return hoverCellBackgroundColor;\n }\n\n const isAddedRow = isAddedTreeGridRow(row) || isTreeGridRowAddedById(row);\n const hasNativeErrorBackgroundColor =\n hasTreeGridCellError(grid, row, col) && isTreeGridNativeErrorBackgroundColor(r, g, b);\n\n if (!hasNativeErrorBackgroundColor && !isAddedRow) {\n return undefined;\n }\n\n const explicitCellColor = getExplicitTreeGridCellColor(grid, row, col);\n\n if (hasNativeErrorBackgroundColor) {\n if (explicitCellColor) {\n return explicitCellColor;\n }\n }\n\n if (isChangedTreeGridRowOrCell(row, col)) {\n return changedCellBackgroundColor;\n }\n\n const editableCellDefaultColor = getEditableTreeGridCellDefaultColor(\n grid,\n row,\n col,\n editableCellBackgroundColorValue,\n );\n\n if (editableCellDefaultColor !== undefined) {\n return toTreeGridCssHexColor(editableCellDefaultColor);\n }\n\n if (isAddedRow) {\n return explicitCellColor ?? TREEGRID_ADDED_ROW_BACKGROUND_COLOR;\n }\n\n return TREE_GRID_ERROR_CELL_FALLBACK_BACKGROUND_COLOR;\n};\n\n/**\n * TreeGrid class token 추가\n * @param className 원본 class 문자열\n * @param classToken 추가 class token\n */\nconst appendTreeGridClassToken = (className: string, classToken: string) => {\n const classTokens = className.split(/\\s+/).filter(Boolean);\n\n if (classTokens.includes(classToken)) {\n return className;\n }\n\n return [...classTokens, classToken].join(' ');\n};\n\n/**\n * TreeGrid Error 셀 표시 class 추가\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param className 원본 class 문자열\n */\nconst appendTreeGridErrorCellDisplayClass = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n className: string,\n) => {\n if (!hasTreeGridCellError(grid, row, col) || !row) {\n return className;\n }\n\n return appendTreeGridClassToken(className, TREE_GRID_ERROR_CELL_CLASS);\n};\n\n/**\n * TreeGrid 신규 행 박스 표시 class 추가\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param className 원본 class 문자열\n */\nconst appendTreeGridAddedRowBoxDisplayClass = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n className: string,\n) => {\n if (\n !isDisplayTreeGridRow(row) ||\n (!isAddedTreeGridRow(row) && !isTreeGridRowAddedById(row))\n ) {\n return className;\n }\n\n if (\n isTreeGridFocusedRowState(grid, row) ||\n isTreeGridSelectedCellState(grid, row, col) ||\n isTreeGridHoveredRowState(grid, row)\n ) {\n return className;\n }\n\n const columnBounds = getTreeGridAddedRowBoxColumnBounds(grid);\n\n if (!columnBounds.columnSet.has(col)) {\n return className;\n }\n\n let nextClassName = appendTreeGridClassToken(className, TREE_GRID_ADDED_ROW_BOX_CELL_CLASS);\n\n if (col === columnBounds.firstColumn) {\n nextClassName = appendTreeGridClassToken(nextClassName, TREE_GRID_ADDED_ROW_BOX_START_CLASS);\n }\n\n if (col === columnBounds.lastColumn) {\n nextClassName = appendTreeGridClassToken(nextClassName, TREE_GRID_ADDED_ROW_BOX_END_CLASS);\n }\n\n return nextClassName;\n};\n\n/**\n * TreeGrid 셀 표시 class 계산\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param className 원본 class 문자열\n */\nconst resolveTreeGridCellDisplayClass = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n className: string,\n) => {\n const errorCellClassName = appendTreeGridErrorCellDisplayClass(grid, row, col, className);\n const addedRowBoxClassName = appendTreeGridAddedRowBoxDisplayClass(\n grid,\n row,\n col,\n errorCellClassName,\n );\n\n if (!isTreeGridSelectedCellState(grid, row, col)) {\n return addedRowBoxClassName === className ? undefined : addedRowBoxClassName;\n }\n\n const selectedChangedCellClassName =\n appendTreeGridSelectedChangedCellDisplayClass(addedRowBoxClassName) ?? addedRowBoxClassName;\n\n return selectedChangedCellClassName === className ? undefined : selectedChangedCellClassName;\n};\n\n/** TreeGrid 신규 행 박스 표시 대상 행 여부 */\nconst isTreeGridAddedRowBoxDisplayRow = (row: TRow | null | undefined): row is TRow => {\n return isDisplayTreeGridRow(row) && (isAddedTreeGridRow(row) || isTreeGridRowAddedById(row));\n};\n\n/**\n * TreeGrid 신규 행 박스 상태 행 refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param rows refresh 후보 행 목록\n */\nconst scheduleTreeGridAddedRowBoxRowsRefresh = (\n grid: TGrid,\n rows: readonly (TRow | null | undefined)[],\n) => {\n const targetRows = rows.filter(isTreeGridAddedRowBoxDisplayRow);\n\n if (targetRows.length) {\n scheduleTreeGridRowsRefresh(grid, targetRows);\n }\n};\n\n/**\n * TreeGrid 신규 행 박스 전체 상태 refresh 예약\n * @param grid TreeGrid 인스턴스\n */\nconst scheduleTreeGridAddedRowBoxRowsRefreshAll = (grid: TGrid) => {\n scheduleTreeGridRowsRefresh(grid, getTreeGridRows(grid).filter(isTreeGridAddedRowBoxDisplayRow));\n};\n\n/**\n * TreeGrid 표시 데이터 행 존재 여부\n * @param grid TreeGrid 인스턴스\n */\nexport const 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\n/**\n * TreeGrid Body 데이터 교체 후 재로드\n * @param grid TreeGrid 인스턴스\n * @param bodyData 새 Body 데이터\n * @param onReloadFinish 재로드 완료 콜백\n */\nexport const replaceTreeGridBodyData = <T,>(\n grid: TGrid,\n bodyData: OwpTreeGridBodyData<T>,\n onReloadFinish?: (code: number) => void,\n) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\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\n/**\n * TreeGrid 이벤트 바인딩\n * @param options 이벤트 바인딩 옵션\n */\nexport const bindTreeGridEvents = <T,>({\n id,\n latestEventHandlersRef,\n layoutHasExplicitEnterModeRef,\n highlightEditableCellsRef,\n highlightChangedCellsRef,\n syncDeletedRowCanEditRef,\n editableCellBackgroundColorValueRef,\n changedCellBackgroundColorRef,\n focusedCellBackgroundColorRef,\n selectedCellBackgroundColorRef,\n hoverCellBackgroundColorRef,\n changedCellBaselineRef,\n treeGridInstanceRef,\n treeGridInitStartedAtRef,\n latestLayoutOverridesRef,\n latestToolbarTotalCountFormulaRef,\n latestSuppressCfgRef,\n latestHideChildHeaderSortButtonsRef,\n latestSelectionScopeRef,\n latestDisabledAnimationsRef,\n appliedLayoutOverridesRef,\n appliedBodyDataPropRef,\n hasAppliedInitialLayoutRef,\n syncHasDisplayDataRows,\n setIsTreeGridReady,\n showErrorTooltip,\n hideErrorTooltip,\n}: TreeGridEventBindingOptions<T>) => {\n const initialEventHandlers = latestEventHandlersRef.current;\n\n window.TGSetEvent('OnRowAdd', id, (grid, row) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\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 clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n syncHasDisplayDataRows(grid);\n });\n window.TGSetEvent('OnRowRemove', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n hideErrorTooltip();\n syncHasDisplayDataRows(grid);\n });\n window.TGSetEvent('OnColShow', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnAfterColumnsChanged', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColMove', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColsAdd', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColDelete', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColUndelete', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnMouseOver', id, (grid, row, col, _orow, _ocol, event) => {\n if (row !== _orow) {\n scheduleTreeGridAddedRowBoxRowsRefresh(grid, [row, _orow]);\n }\n\n const message = getTreeGridCellError(grid, row, col);\n\n if (!message) {\n hideErrorTooltip();\n return;\n }\n\n const anchorEl = getTreeGridMouseEventAnchorElement(event);\n\n if (!anchorEl) {\n hideErrorTooltip();\n return;\n }\n\n grid.HideTip();\n showErrorTooltip({ anchorEl, row, col, message });\n });\n window.TGSetEvent('OnFocus', id, (grid, row, _col, orow) => {\n if (row !== orow) {\n scheduleTreeGridAddedRowBoxRowsRefresh(grid, [row, orow]);\n }\n });\n window.TGSetEvent('OnTip', id, (grid, row, col, tip) => {\n return getTreeGridCellError(grid, row, col) ? '' : tip;\n });\n window.TGSetEvent('OnCanRowDelete', id, (grid, row, type) => {\n if (type !== 3) {\n return type;\n }\n\n const beforeRowUndeleteHandler = latestEventHandlersRef.current?.onBeforeRowUndelete;\n\n if (typeof beforeRowUndeleteHandler !== 'function') {\n return type;\n }\n\n const scheduleAction = (action: TreeGridBeforeRowUndeleteAction | undefined) => {\n window.setTimeout(() => {\n applyTreeGridBeforeRowUndeleteAction(\n treeGridInstanceRef.current ?? grid,\n row,\n action,\n syncHasDisplayDataRows,\n );\n }, 0);\n };\n\n try {\n const result = beforeRowUndeleteHandler(grid, row as OwpTreeGridRowModel<T>);\n\n if (isTreeGridPromiseLike<TreeGridBeforeRowUndeleteAction | undefined>(result)) {\n void result.then(scheduleAction).catch(() => {\n scheduleAction('undelete');\n });\n return 0;\n }\n\n scheduleAction(result);\n\n return 0;\n } catch {\n scheduleAction('undelete');\n return 0;\n }\n });\n\n if (\n typeof initialEventHandlers?.onRowClick === 'function' ||\n typeof initialEventHandlers?.onInternalCellClick === 'function'\n ) {\n const debouncedRowClickHandler = 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 window.TGSetEvent('OnClick', id, (grid, row, col, x, y, event) => {\n const internalResult = latestEventHandlersRef.current?.onInternalCellClick?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n x,\n y,\n event,\n );\n\n if (internalResult !== undefined) {\n return internalResult;\n }\n\n if (typeof latestEventHandlersRef.current?.onRowClick === 'function') {\n debouncedRowClickHandler(grid, row, col, x, y, event);\n }\n\n return undefined;\n });\n }\n\n if (\n typeof initialEventHandlers?.onClickButton === 'function' ||\n typeof initialEventHandlers?.onInternalButtonClick === 'function'\n ) {\n window.TGSetEvent(\n 'OnClickButton',\n id,\n (grid, row, col, event) => {\n const internalResult = latestEventHandlersRef.current?.onInternalButtonClick?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n event,\n );\n\n if (internalResult !== undefined) {\n return internalResult;\n }\n\n latestEventHandlersRef.current?.onClickButton?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n event,\n );\n\n return undefined;\n },\n );\n }\n\n if (typeof initialEventHandlers?.onInternalKeyDown === 'function') {\n window.TGSetEvent('OnKeyDown', id, (grid, key, event, name, prefix) =>\n latestEventHandlersRef.current?.onInternalKeyDown?.(grid, key, event, name, prefix),\n );\n window.TGSetEvent('OnKeyPress', id, (grid, key, event, name, prefix) =>\n latestEventHandlersRef.current?.onInternalKeyDown?.(grid, key, event, name, prefix),\n );\n }\n\n window.TGSetEvent('OnStartEdit', id, (grid, row, col) => {\n hideErrorTooltip();\n\n return latestEventHandlersRef.current?.onInternalStartEdit?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n );\n });\n\n window.TGSetEvent('OnRowDelete', id, (grid, row, deleteType) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n hideErrorTooltip();\n clearTreeGridRowErrors(grid, row);\n grid.SelectRow(row, 0);\n const addedRowHighlightColumns = isTreeGridRowAddedById(row)\n ? getTreeGridAddedRowHighlightColumns(row)\n : [];\n\n syncTreeGridDeletedRowState(grid, row, {\n canEdit: syncDeletedRowCanEditRef.current !== false ? 2 : undefined,\n highlightColumns: addedRowHighlightColumns,\n });\n\n syncHasDisplayDataRows(grid);\n latestEventHandlersRef.current?.onRowDelete?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n deleteType,\n );\n });\n window.TGSetEvent('OnRowUndelete', id, (grid, row) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n hideErrorTooltip();\n const addedRowHighlightColumns = isTreeGridRowAddedById(row)\n ? getTreeGridAddedRowHighlightColumns(row)\n : [];\n\n syncTreeGridDeletedRowState(grid, row, {\n canEdit: syncDeletedRowCanEditRef.current !== false ? 1 : undefined,\n highlightColumns: addedRowHighlightColumns,\n highlightBackgroundColor: addedRowHighlightColumns.length\n ? changedCellBackgroundColorRef.current\n : undefined,\n });\n\n syncHasDisplayDataRows(grid);\n latestEventHandlersRef.current?.onRowUndelete?.(grid, row as OwpTreeGridRowModel<T>);\n });\n window.TGSetEvent('OnGetDefaultColor', id, (grid, row, col) => {\n if (!highlightEditableCellsRef.current || !isDisplayTreeGridRow(row)) {\n return undefined;\n }\n\n return getEditableTreeGridCellDefaultColor(\n grid,\n row,\n col,\n editableCellBackgroundColorValueRef.current,\n );\n });\n window.TGSetEvent('OnGetColor', id, (grid, row, col, r, g, b, type) => {\n if (type) {\n return undefined;\n }\n\n return resolveTreeGridStateBackgroundColor({\n grid,\n row,\n col,\n r,\n g,\n b,\n focusedCellBackgroundColor: focusedCellBackgroundColorRef.current,\n selectedCellBackgroundColor: selectedCellBackgroundColorRef.current,\n hoverCellBackgroundColor: hoverCellBackgroundColorRef.current,\n changedCellBackgroundColor: changedCellBackgroundColorRef.current,\n editableCellBackgroundColorValue: editableCellBackgroundColorValueRef.current,\n });\n });\n window.TGSetEvent('OnGetClass', id, (grid, row, col, className) => {\n const baseClassName = typeof className === 'string' ? className : '';\n\n return resolveTreeGridCellDisplayClass(grid, row, col, baseClassName);\n });\n window.TGSetEvent('OnAfterValueChanged', id, (grid, row, col, value) => {\n hideErrorTooltip();\n\n if (highlightChangedCellsRef.current && isDisplayTreeGridRow(row)) {\n const shouldRefreshChangedCellHighlight =\n !isTreeGridNativeInputEditType(grid, row, col) ||\n (isTreeGridSelectedCellState(grid, row, col) &&\n !isTreeGridFocusedCellState(grid, row, col));\n\n syncTreeGridChangedCellHighlight({\n gridId: id,\n grid,\n row,\n col,\n backgroundColor: changedCellBackgroundColorRef.current,\n baselineMap: changedCellBaselineRef.current,\n highlightRefresh: shouldRefreshChangedCellHighlight,\n });\n }\n\n const valueChangedHandler =\n latestEventHandlersRef.current?.onAfterValueChanged ??\n latestEventHandlersRef.current?.onRowChange;\n\n valueChangedHandler?.(grid, row as OwpTreeGridRowModel<T>, col, value);\n });\n const notifyTreeGridSelectionChange = debounce((grid: TGrid) => {\n const selectedRows = (grid.GetSelRows() ?? []) as OwpTreeGridSelectedRows<T>;\n const resolvedSelectedRows = resolveTreeGridSelectedRows<T>(grid, selectedRows, {\n selectionScope: latestSelectionScopeRef.current,\n });\n\n latestEventHandlersRef.current?.onSelect?.(\n normalizeTreeGridExternalRows<T>(grid, resolvedSelectedRows),\n );\n }, 100);\n\n window.TGSetEvent('OnSelect', id, (grid, _row, _deselect, _cols, test) => {\n if (test) {\n return undefined;\n }\n\n const selectedRowSpanRows = getTreeGridSelectedRowSpanRows(grid);\n\n scheduleTreeGridSelectionChangedClassRefresh(grid, _row);\n scheduleTreeGridAddedRowBoxRowsRefresh(grid, [_row]);\n scheduleTreeGridRowsRefresh(grid, selectedRowSpanRows);\n scheduleTreeGridSelectionRowSpanRefresh(grid, _row);\n scheduleTreeGridSelectionPanelStateSync(grid, id);\n\n if (typeof latestEventHandlersRef.current?.onSelect === 'function') {\n notifyTreeGridSelectionChange(grid);\n }\n\n return undefined;\n });\n window.TGSetEvent('OnSelectAll', id, (grid, _select, _type, test) => {\n if (test) {\n return undefined;\n }\n\n scheduleTreeGridSelectionRowSpanRefreshAll(grid);\n scheduleTreeGridAddedRowBoxRowsRefreshAll(grid);\n scheduleTreeGridSelectionPanelStateSync(grid, id);\n\n if (typeof latestEventHandlersRef.current?.onSelect === 'function') {\n notifyTreeGridSelectionChange(grid);\n }\n\n return undefined;\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 window.TGSetEvent('OnSort', id, (grid, col) => {\n if (\n !col ||\n !isTreeGridGroupHeaderSortButtonTarget(\n grid,\n grid.ARow,\n col,\n latestHideChildHeaderSortButtonsRef.current !== false,\n )\n ) {\n return undefined;\n }\n\n countTreeGridPerf(id, 'group header sort blocked');\n logTreeGridPerf(id, 'group header sort blocked', {\n rowId: grid.ARow?.id,\n col,\n });\n\n return -1;\n });\n window.TGSetEvent('OnSortFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnFilterFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnGroupFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnSearchFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnRenderStart', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n syncTreeGridSelectionPanelState(grid, id);\n applyTreeGridGroupHeaderSortButtonAttributes(\n grid,\n id,\n false,\n latestHideChildHeaderSortButtonsRef.current !== false,\n );\n });\n window.TGSetEvent('OnRenderFinish', id, (grid) => {\n syncTreeGridSelectionPanelState(grid, id);\n });\n window.TGSetEvent('OnDataGet', id, (_grid, source, data) => {\n if (source?.Name === 'Layout' && typeof data === 'string') {\n layoutHasExplicitEnterModeRef.current = hasTreeGridExplicitEnterMode(data);\n const nextData = applyTreeGridDefaultLayout(\n data,\n latestDisabledAnimationsRef.current,\n latestToolbarTotalCountFormulaRef.current,\n latestSuppressCfgRef.current,\n );\n\n return nextData === data ? null : nextData;\n }\n\n return null;\n });\n window.TGSetEvent('OnDataParse', id, (_grid, source, data) => {\n if (source?.Name === 'Layout' && typeof data === 'string') {\n layoutHasExplicitEnterModeRef.current = hasTreeGridExplicitEnterMode(data);\n const nextData = applyTreeGridDefaultLayout(\n data,\n latestDisabledAnimationsRef.current,\n latestToolbarTotalCountFormulaRef.current,\n latestSuppressCfgRef.current,\n );\n\n return nextData === data ? null : nextData;\n }\n\n return null;\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 if (\n !layoutHasExplicitEnterModeRef.current &&\n (grid.EnterMode === undefined || grid.EnterMode === null || grid.EnterMode === 0)\n ) {\n applyTreeGridDefaultEnterMode(grid, TREE_GRID_DEFAULT_ENTER_MODE);\n }\n applyTreeGridLayoutToGrid(grid, latestLayoutOverrides);\n treeGridInstanceRef.current = grid;\n appliedLayoutOverridesRef.current = latestLayoutOverrides;\n appliedBodyDataPropRef.current = getTreeGridBodyData(grid) as OwpTreeGridBodyData<T>;\n changedCellBaselineRef.current = new WeakMap();\n captureTreeGridChangeBaselines(grid, changedCellBaselineRef.current);\n syncHasDisplayDataRows(grid);\n setIsTreeGridReady(true);\n applyTreeGridGroupHeaderSortButtonAttributes(\n grid,\n id,\n true,\n latestHideChildHeaderSortButtonsRef.current !== false,\n );\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"],"names":["TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS","TREE_GRID_DEFAULT_ENTER_MODE","TREE_GRID_DEFAULT_ENTER_ACTIONS","TREE_GRID_READONLY_HOVER_CELL_RGB","TREE_GRID_READONLY_NO_FOCUS_HOVER_CELL_RGB","TREE_GRID_PREVIEW_CELL_RGB","TREE_GRID_PREVIEW_CELL_SOFT_RGB","TREE_GRID_PREVIEW_CELL_DIM_RGB","TREE_GRID_NATIVE_ERROR_CELL_RGB_VALUES","TREE_GRID_ERROR_CELL_FALLBACK_BACKGROUND_COLOR","TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE","TREE_GRID_ROW_BOX_EXCLUDED_COLUMNS","TREE_GRID_CELL_CHANGED_CLASS_TOKENS","TREEGRID_CELL_CHANGED_CLASS","TREE_GRID_NATIVE_INPUT_EDIT_TYPES","hasTreeGridExplicitEnterMode","__name","layoutData","TREE_GRID_DELETE_PANEL_DEFAULT_ATTRIBUTES","TREE_GRID_PANEL_SPANNED_DEFAULT_ATTRIBUTES","TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS","TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS","TREE_GRID_SELECTION_ROW_SPAN_COLUMN","TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES","TREE_GRID_XML_GRID_OPEN_TAG_PATTERN","TREE_GRID_XML_GRID_CLOSE_TAG_PATTERN","TREE_GRID_XML_TOOLBAR_TAG_PATTERN","TREE_GRID_DEFAULT_LAYOUT_CFG_ATTRIBUTES","TREE_GRID_DISABLED_ANIMATION_ATTRIBUTES","treeGridAddedRowBoxColumnBoundsCache","isTreeGridJsonRecord","value","isTreeGridDisabledConfigValue","isTreeGridExplicitEnabledConfigValue","isTreeGridExplicitHiddenConfigValue","isTreeGridConfigValue","expectedValue","isTreeGridCheckboxSelectionMode","selecting","selectingSingle","getTreeGridJsonCfgRecords","cfg","getTreeGridJsonCfgValue","fieldName","fieldValue","getTreeGridXmlTagAttributeValue","tag","attributeName","attributeMatch","hasTreeGridXmlTagAttribute","escapeTreeGridXmlAttributeValue","appendTreeGridXmlTagAttribute","attributeValue","insertionIndex","setTreeGridXmlTagAttribute","setTreeGridXmlTagAttributes","attributes","nextTag","appendMissingTreeGridXmlTagAttributes","scanTreeGridXmlDefaultLayout","tagPattern","scanResult","tagMatch","rootDepth","isInsideGrid","currentTagName","_a","isClosingTag","isSelfClosingTag","isTreeGridXmlDefaultPanelTag","panelName","getLeadingTreeGridXmlHeaderTags","headContent","childTagPattern","headerTags","childTagMatch","applyTreeGridXmlHeadPanelRowSpanDefault","firstHeaderTag","remainingHeaderTags","nextHeaderTag","getTreeGridXmlPanelSpannedInsertionIndex","isTreeGridXmlPanelSpannedDefaultLayout","isTreeGridXmlSelectingLayout","isTreeGridXmlDeletePanelDefaultLayout","applyTreeGridXmlDefaultPanelSpannedLayout","panelTag","nextPanelTag","applyTreeGridDefaultHeaderPanelRowSpanLayout","isPanelRowSpanApplied","nextLayoutData","matchedHead","headOpenTag","headCloseTag","result","isTreeGridJsonCheckboxSelectionLayout","isTreeGridXmlCheckboxSelectionLayout","cfgValues","getTreeGridXmlCellClickActionInsertionIndex","applyTreeGridXmlDefaultCellClickActionLayout","actionsTag","nextActionsTag","getTreeGridXmlSelectAllPanelActionInsertionIndex","applyTreeGridXmlDefaultSelectAllPanelActionLayout","getTreeGridXmlDeletePanelInsertionIndex","applyTreeGridXmlDefaultDeletePanelLayout","applyTreeGridXmlDefaultFastPanelLayout","applyTreeGridJsonFastPanelDefault","item","applyTreeGridJsonSelectAllPanelActionDefault","actions","applyTreeGridJsonCellClickActionDefault","applyTreeGridJsonDefaultCellClickActionLayout","parsedLayoutData","applyTreeGridDefaultCellClickActionLayout","xmlScanResult","trimmedLayoutData","applyTreeGridJsonDefaultSelectAllPanelActionLayout","applyTreeGridDefaultSelectAllPanelActionLayout","applyTreeGridJsonDefaultSuppressCfgLayout","suppressCfg","cfgRecords","applyTreeGridXmlDefaultSuppressCfgLayout","cfgTag","nextCfgTag","applyTreeGridDefaultSuppressCfgLayout","hasTreeGridToolbarFormulaField","layoutRecord","getTreeGridJsonToolbarRecords","toolbar","solid","toolbarRecords","solidToolbarRecords","applyTreeGridJsonDefaultToolbarTotalCountLayout","toolbarTotalCountFormula","hasTreeGridXmlToolbarFormulaAttribute","toolbarTag","applyTreeGridXmlDefaultToolbarTotalCountLayout","toolbarMatch","nextToolbarTag","gridCloseMatch","gridOpenMatch","applyTreeGridDefaultToolbarTotalCountLayout","applyTreeGridJsonDefaultFastPanelLayout","applyTreeGridDefaultFastPanelLayout","getTreeGridDisabledAnimationAttributes","disabledAnimations","animation","applyTreeGridJsonDisabledAnimationsLayout","animations","firstAnimations","createTreeGridDisabledAnimationsTag","applyTreeGridXmlDisabledAnimationsLayout","animationsTag","nextAnimationsTag","applyTreeGridDisabledAnimationsLayout","applyTreeGridDefaultLayout","nextSelectAllPanelActionLayoutData","nextSelectAllXmlScanResult","nextCellClickActionLayoutData","nextXmlScanResult","getTreeGridWrapperElement","gridId","TREE_GRID_THEME_WRAPPER_CLASS","getTreeGridSelectAllState","grid","selectableRowCount","selectedRowCount","getTreeGridRows","row","isDisplayTreeGridRow","syncTreeGridSelectionPanelState","wrapperElement","isSelectingEnabled","isCheckboxSelectionMode","header","TREE_GRID_PANEL_CHECKBOX_SELECT_CLASS","TREE_GRID_SELECT_ALL_CHECKED_CLASS","TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS","TREE_GRID_SELECT_ALL_UNCHECKED_CLASS","selectAllState","treeGridSelectionPanelStateSyncTimeouts","scheduleTreeGridSelectionPanelStateSync","activeTimeout","nextTimeout","applyTreeGridDefaultEnterMode","enterMode","actionConfig","mutableGrid","isTreeGridInlineUrl","url","treeGridInlineBlobUrlCache","resolveTreeGridInlineUrl","cachedUrl","meta","encodedData","match","mimeType","decodedData","bytes","index","blobUrl","appendNoCacheQuery","hashIndex","baseUrl","hashFragment","querySeparator","syncTreeGridDeletedRowState","options","canEdit","highlightColumns","highlightBackgroundColor","col","resolveTreeGridDataUrl","dataUrl","isTreeGridPromiseLike","applyTreeGridBeforeRowUndeleteAction","action","syncHasDisplayDataRows","buildTreeGridDataSource","useDataUrl","bodyData","isEmpty","buildTreeGridInitializationOptions","id","layoutUrl","width","height","languageId","getTreeGridTextResourceUrl","getTreeGridBodyData","get","parseTreeGridPositiveNumber","trimmedValue","numericValue","getTreeGridHeaderCellSpanAttribute","resolvedAttributeValue","isTreeGridGroupHeaderCell","addTreeGridHeaderButtonAttributeTarget","targets","targetCols","getTreeGridGroupHeaderSortButtonTargets","headerRows","cols","includeChildHeaderCells","rowIndex","colIndex","colSpan","childColEndIndex","childRowIndex","childRow","childColIndex","isTreeGridGroupHeaderSortButtonTarget","fixedRow","applyTreeGridGroupHeaderSortButtonAttributes","refreshRows","applyStartedAt","updatedRows","updatedCellCount","countTreeGridPerf","measureTreeGridPerf","getTreeGridBodyDataCount","isVisibleTreeGridRow","visible","isAddedTreeGridRow","added","getTreeGridColumnNames","isVisibleTreeGridColumn","column","resolveTreeGridColumnOrderValue","fallback","getTreeGridAddedRowBoxColumnBounds","cachedBounds","columnNameIndexes","columnName","columns","columnNameA","columnNameB","columnA","columnB","_b","indexA","indexB","sectionDiff","columnBounds","clearTreeGridAddedRowBoxColumnBounds","rows","treeGridSelectionRowSpanAnchorRowMaps","clearTreeGridSelectionRowSpanAnchorRowMap","getTreeGridRowSpanCount","rowRecord","rowSpanValue","rowSpan","createTreeGridSelectionRowSpanAnchorRowMap","anchorRowMap","anchorRow","anchorEndIndex","getTreeGridSelectionRowSpanAnchorRow","getTreeGridSelectionRowSpanRows","currentRow","rowOffset","getTreeGridSelectedRowSpanRows","targetRows","selectedRow","targetRow","captureTreeGridChangeBaselines","baselineMap","getTreeGridCellComparableValue","isTreeGridChangedFlag","hasOtherTreeGridChangedCells","clearTreeGridCellChangedState","isTreeGridRowAddedById","resolveTreeGridCellBaselineValue","baselineValues","syncTreeGridAddedRowChangedCellHighlight","backgroundColor","highlightRefresh","baselineValue","getTreeGridAddedRowBaselineValue","isHighlightedCell","getTreeGridAddedRowHighlightColumns","removeTreeGridAddedRowHighlightColumn","clearTreeGridCellHighlightById","appendTreeGridAddedRowHighlightColumn","highlightTreeGridCellById","syncTreeGridChangedCellHighlight","currentValue","isEditableTreeGridCell","getExplicitTreeGridCellColor","color","toTreeGridCssHexColor","hasExplicitTreeGridCellColor","isTreeGridFocusedCellState","focused","isTreeGridSelectedCellState","selected","anchorSelected","hasTreeGridChangedCellDisplayClass","className","classTokens","classToken","appendTreeGridSelectedChangedCellDisplayClass","TREE_GRID_SELECTED_CHANGED_CELL_CLASS","hasTreeGridChangedCellDisplayClassInRow","key","scheduleTreeGridSelectionChangedClassRefresh","scheduleTreeGridRowsRefresh","scheduleTreeGridSelectionRowSpanRefresh","scheduleTreeGridSelectionRowSpanRefreshAll","getEditableTreeGridCellDefaultColor","editableCellBackgroundColorValue","matchesTreeGridRgbColor","r","g","b","expected","isTreeGridNativeErrorBackgroundColor","expectedColor","getTreeGridCellError","hasTreeGridCellError","clearTreeGridRowErrors","hasError","getTreeGridMouseEventAnchorElement","event","target","targetElement","fallbackTargetElement","anchorTargetElement","cellElement","isChangedTreeGridRowOrCell","cellDisplayClass","isChangedCell","isTreeGridNativeInputEditType","isTreeGridReadonlyHoveredCellState","isTreeGridPreviewHoveredCellState","isTreeGridFocusedRowState","isTreeGridHoveredRowState","resolveTreeGridStateBackgroundColor","focusedCellBackgroundColor","selectedCellBackgroundColor","hoverCellBackgroundColor","changedCellBackgroundColor","isAddedRow","hasNativeErrorBackgroundColor","explicitCellColor","editableCellDefaultColor","TREEGRID_ADDED_ROW_BACKGROUND_COLOR","appendTreeGridClassToken","appendTreeGridErrorCellDisplayClass","TREE_GRID_ERROR_CELL_CLASS","appendTreeGridAddedRowBoxDisplayClass","nextClassName","TREE_GRID_ADDED_ROW_BOX_CELL_CLASS","TREE_GRID_ADDED_ROW_BOX_START_CLASS","TREE_GRID_ADDED_ROW_BOX_END_CLASS","resolveTreeGridCellDisplayClass","errorCellClassName","addedRowBoxClassName","selectedChangedCellClassName","isTreeGridAddedRowBoxDisplayRow","scheduleTreeGridAddedRowBoxRowsRefresh","scheduleTreeGridAddedRowBoxRowsRefreshAll","hasTreeGridDisplayDataRows","replaceTreeGridBodyData","onReloadFinish","currentDataConfig","bindTreeGridEvents","latestEventHandlersRef","layoutHasExplicitEnterModeRef","highlightEditableCellsRef","highlightChangedCellsRef","syncDeletedRowCanEditRef","editableCellBackgroundColorValueRef","changedCellBackgroundColorRef","focusedCellBackgroundColorRef","selectedCellBackgroundColorRef","hoverCellBackgroundColorRef","changedCellBaselineRef","treeGridInstanceRef","treeGridInitStartedAtRef","latestLayoutOverridesRef","latestToolbarTotalCountFormulaRef","latestSuppressCfgRef","latestHideChildHeaderSortButtonsRef","latestSelectionScopeRef","latestDisabledAnimationsRef","appliedLayoutOverridesRef","appliedBodyDataPropRef","hasAppliedInitialLayoutRef","setIsTreeGridReady","showErrorTooltip","hideErrorTooltip","initialEventHandlers","_orow","_ocol","message","anchorEl","_col","orow","tip","type","beforeRowUndeleteHandler","scheduleAction","debouncedRowClickHandler","debounce","x","y","internalResult","_c","_d","name","prefix","deleteType","addedRowHighlightColumns","shouldRefreshChangedCellHighlight","valueChangedHandler","notifyTreeGridSelectionChange","selectedRows","resolvedSelectedRows","resolveTreeGridSelectedRows","normalizeTreeGridExternalRows","_row","_deselect","_cols","test","selectedRowSpanRows","_select","_type","autoupdate","logTreeGridPerf","_grid","source","data","nextData","latestLayoutOverrides","applyTreeGridLayoutToGrid"],"mappings":"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"}
1
+ {"version":3,"file":"treeGridRuntime.js","sources":["../../../../src/components/OwpTreeGrid/internal/treeGridRuntime.ts"],"sourcesContent":["import {\n getTreeGridTextResourceUrl,\n TREEGRID_ADDED_ROW_BACKGROUND_COLOR,\n TREEGRID_CELL_CHANGED_CLASS,\n} from '@/constants/treeGrid';\nimport {\n appendTreeGridAddedRowHighlightColumn,\n clearTreeGridCellHighlightById,\n getTreeGridAddedRowBaselineValue,\n getTreeGridAddedRowHighlightColumns,\n getTreeGridCellComparableValue,\n highlightTreeGridCellById,\n isTreeGridRowAddedById,\n normalizeTreeGridExternalRows,\n removeTreeGridAddedRowHighlightColumn,\n} from '@/utils/treeGridUtil';\nimport { debounce, get, isEmpty } from 'es-toolkit/compat';\nimport {\n type Dispatch,\n type RefObject,\n type SetStateAction,\n} from 'react';\nimport type {\n OwpTreeGridBodyData,\n OwpTreeGridDisabledAnimation,\n OwpTreeGridLayoutConfig,\n OwpTreeGridProps,\n OwpTreeGridRowModel,\n OwpTreeGridSelectedRows,\n OwpTreeGridSuppressCfg,\n} from '../OwpTreeGrid';\nimport type {\n OwpTreeGridErrorTooltipHideHandler,\n OwpTreeGridErrorTooltipShowHandler,\n} from './hooks/useOwpTreeGridErrorTooltip';\nimport { applyTreeGridLayoutToGrid } from './treeGridLayout';\nimport {\n resolveTreeGridSelectedRows,\n type OwpTreeGridSelectionScope,\n} from './treeGridSelection';\nimport {\n TREE_GRID_ERROR_CELL_CLASS,\n TREE_GRID_ADDED_ROW_BOX_CELL_CLASS,\n TREE_GRID_ADDED_ROW_BOX_END_CLASS,\n TREE_GRID_ADDED_ROW_BOX_START_CLASS,\n TREE_GRID_PANEL_CHECKBOX_SELECT_CLASS,\n TREE_GRID_SELECTED_CHANGED_CELL_CLASS,\n TREE_GRID_SELECT_ALL_CHECKED_CLASS,\n TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS,\n TREE_GRID_SELECT_ALL_UNCHECKED_CLASS,\n TREE_GRID_THEME_WRAPPER_CLASS,\n} from './treeGridTheme';\nimport {\n countTreeGridPerf,\n logTreeGridPerf,\n measureTreeGridPerf,\n} from './utils/perf';\n\nexport const TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS = 300;\nconst TREE_GRID_DEFAULT_ENTER_MODE = 3;\nconst TREE_GRID_DEFAULT_ENTER_ACTIONS = {\n 1: {\n onEnter: 'TabDownEdit',\n onEnterEdit: 'AcceptEdit AND TabDownEdit,1',\n },\n 2: {\n onEnter: 'GoDownEditAdd',\n onEnterEdit: 'AcceptEdit AND GoDownEditAdd,1',\n },\n 3: {\n onEnter: 'TabRightEdit',\n onEnterEdit: 'AcceptEdit AND TabRightEdit,1',\n },\n 4: {\n onEnter: 'TabRightEditAdd',\n onEnterEdit: 'AcceptEdit AND TabRightEditAdd,1',\n },\n} as const;\n\nconst TREE_GRID_READONLY_HOVER_CELL_RGB = [240, 240, 240] as const;\nconst TREE_GRID_READONLY_NO_FOCUS_HOVER_CELL_RGB = [248, 248, 248] as const;\nconst TREE_GRID_PREVIEW_CELL_RGB = [255, 255, 255] as const;\nconst TREE_GRID_PREVIEW_CELL_SOFT_RGB = [255, 255, 254] as const;\nconst TREE_GRID_PREVIEW_CELL_DIM_RGB = [242, 242, 242] as const;\nconst TREE_GRID_NATIVE_ERROR_CELL_RGB_VALUES = [\n [255, 210, 210],\n [249, 209, 209],\n [115, 16, 11],\n] as const;\nconst TREE_GRID_ERROR_CELL_FALLBACK_BACKGROUND_COLOR = 'transparent';\nconst TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE = 'Button';\nconst TREE_GRID_ROW_BOX_EXCLUDED_COLUMNS = new Set(['Panel']);\nconst TREE_GRID_CELL_CHANGED_CLASS_TOKENS = TREEGRID_CELL_CHANGED_CLASS.split(/\\s+/).filter(\n Boolean,\n);\nconst TREE_GRID_NATIVE_INPUT_EDIT_TYPES = new Set([\n 'Text',\n 'Lines',\n 'Int',\n 'Float',\n 'Date',\n 'Pass',\n]);\n\ntype TreeGridInitializationInput<T> = {\n id: string;\n layoutUrl?: string;\n layoutData?: string;\n toolbarTotalCountFormula?: string;\n suppressCfg?: OwpTreeGridSuppressCfg;\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[];\n dataUrl?: string;\n bodyData: OwpTreeGridBodyData<T>;\n useDataUrl?: boolean;\n width?: string | number;\n height?: string | number;\n languageId: string;\n};\n\ntype TreeGridBeforeRowUndeleteAction = 'cancel' | 'remove' | 'undelete';\ntype TreeGridBeforeRowUndeleteHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n) =>\n | TreeGridBeforeRowUndeleteAction\n | undefined\n | Promise<TreeGridBeforeRowUndeleteAction | undefined>;\ntype TreeGridInternalCellClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n x: number,\n y: number,\n event: Event,\n) => boolean | number | undefined;\ntype TreeGridInternalButtonClickHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n event: Event,\n) => boolean | number | undefined;\ntype TreeGridInternalKeyDownHandler = (\n grid: TGrid,\n key: string,\n event: Event,\n name: string,\n prefix: string,\n) => boolean | number | undefined;\ntype TreeGridInternalStartEditHandler<T> = (\n grid: TGrid,\n row: OwpTreeGridRowModel<T>,\n col: string,\n) => boolean | number | undefined;\n\nexport type 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 onBeforeRowUndelete?: TreeGridBeforeRowUndeleteHandler<T>;\n onInternalButtonClick?: TreeGridInternalButtonClickHandler<T>;\n onInternalCellClick?: TreeGridInternalCellClickHandler<T>;\n onInternalKeyDown?: TreeGridInternalKeyDownHandler;\n onInternalStartEdit?: TreeGridInternalStartEditHandler<T>;\n};\n\nexport type TreeGridEventBindingOptions<T> = Pick<OwpTreeGridProps<T>, 'id'> & {\n latestEventHandlersRef: RefObject<TreeGridEventHandlers<T>>;\n layoutHasExplicitEnterModeRef: RefObject<boolean>;\n highlightEditableCellsRef: RefObject<boolean>;\n highlightChangedCellsRef: RefObject<boolean>;\n syncDeletedRowCanEditRef: RefObject<boolean>;\n editableCellBackgroundColorValueRef: RefObject<number | undefined>;\n changedCellBackgroundColorRef: RefObject<string>;\n focusedCellBackgroundColorRef: RefObject<string>;\n selectedCellBackgroundColorRef: RefObject<string>;\n hoverCellBackgroundColorRef: RefObject<string>;\n changedCellBaselineRef: RefObject<TreeGridCellBaselineMap>;\n treeGridInstanceRef: RefObject<TGrid>;\n treeGridInitStartedAtRef: RefObject<number | null>;\n latestLayoutOverridesRef: RefObject<OwpTreeGridLayoutConfig | undefined>;\n latestToolbarTotalCountFormulaRef: RefObject<string | undefined>;\n latestSuppressCfgRef: RefObject<OwpTreeGridSuppressCfg | undefined>;\n latestHideChildHeaderSortButtonsRef: RefObject<boolean>;\n latestSelectionScopeRef: RefObject<OwpTreeGridSelectionScope | undefined>;\n latestDisabledAnimationsRef: RefObject<\n readonly OwpTreeGridDisabledAnimation[] | undefined\n >;\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 showErrorTooltip: OwpTreeGridErrorTooltipShowHandler;\n hideErrorTooltip: OwpTreeGridErrorTooltipHideHandler;\n};\n\nexport type TreeGridCellBaselineMap = WeakMap<TRow, Map<string, string>>;\n\n/**\n * TreeGrid 레이아웃 Enter 동작 명시 여부\n * @param layoutData 레이아웃 문자열\n */\nexport const hasTreeGridExplicitEnterMode = (layoutData?: string) => {\n return Boolean(layoutData && /\\b(?:EnterMode|OnEnterEdit|OnEnter)\\s*[:=]/.test(layoutData));\n};\n\ntype TreeGridMutableActions = Record<string, string | undefined>;\ntype TreeGridJsonRecord = Record<string, unknown>;\ntype TreeGridXmlTagMatch = {\n index: number;\n tag: string;\n};\ntype TreeGridXmlHeadPanelRowSpanDefaultResult = {\n headContent: string;\n isApplied: boolean;\n};\ntype TreeGridSelectAllState = 'checked' | 'indeterminate' | 'unchecked';\ntype TreeGridDefaultLayoutCfgAttribute =\n | 'Undo'\n | 'Deleting'\n | 'Selecting'\n | 'SelectingSingle'\n | 'SuppressCfg';\ntype TreeGridDefaultLayoutCfgValues = Partial<Record<TreeGridDefaultLayoutCfgAttribute, string>>;\ntype TreeGridXmlDefaultLayoutScanResult = {\n cfgValues: TreeGridDefaultLayoutCfgValues;\n animationsTag?: TreeGridXmlTagMatch;\n defaultActionsTag?: TreeGridXmlTagMatch;\n defaultCfgTag?: TreeGridXmlTagMatch;\n defaultPanelTag?: TreeGridXmlTagMatch;\n gridOpenTagEndIndex?: number;\n hasFastPanel?: boolean;\n lastCfgEndIndex?: number;\n};\ntype TreeGridAddedRowBoxColumnBounds = {\n columnSet: Set<string>;\n firstColumn?: string;\n lastColumn?: string;\n};\n\nconst TREE_GRID_DELETE_PANEL_DEFAULT_ATTRIBUTES = {\n Visible: '1',\n CanHide: '0',\n Delete: '1',\n Width: '33',\n} as const;\nconst TREE_GRID_PANEL_SPANNED_DEFAULT_ATTRIBUTES = {\n Spanned: '1',\n} as const;\nconst TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS = {\n OnClickCell: 'Focus',\n} as const;\nconst TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS = {\n OnClickPanelSelectAll: 'SelectAll OR DeselectAll',\n} as const;\nconst TREE_GRID_SELECTION_ROW_SPAN_COLUMN = 'Panel';\nconst TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES = ['Formula', 'FormulaFormula'] as const;\nconst TREE_GRID_XML_GRID_OPEN_TAG_PATTERN = /<Grid\\b[^>]*>/i;\nconst TREE_GRID_XML_GRID_CLOSE_TAG_PATTERN = /<\\/Grid\\s*>/i;\nconst TREE_GRID_XML_TOOLBAR_TAG_PATTERN = /<Toolbar\\b[^>]*\\/?>/i;\nconst TREE_GRID_DEFAULT_LAYOUT_CFG_ATTRIBUTES = [\n 'Undo',\n 'Deleting',\n 'Selecting',\n 'SelectingSingle',\n 'SuppressCfg',\n] as const;\nconst TREE_GRID_DISABLED_ANIMATION_ATTRIBUTES = {\n addRow: ['Add', 'AddRows', 'AddChildren', 'AddRowsChildren'],\n deleteRow: [\n 'Delete',\n 'DeleteRows',\n 'DeleteVisible',\n 'DeleteVisibleRows',\n 'DeleteChildren',\n 'DeleteVisibleChildren',\n 'DeleteRowsChildren',\n 'DeleteVisibleRowsChildren',\n 'Undelete',\n 'UndeleteRows',\n 'UndeleteVisible',\n 'UndeleteVisibleRows',\n 'UndeleteChildren',\n 'UndeleteVisibleChildren',\n 'UndeleteRowsChildren',\n 'UndeleteVisibleRowsChildren',\n ],\n selectRow: ['Select', 'SelectRows', 'Deselect', 'DeselectRows'],\n} as const satisfies Record<OwpTreeGridDisabledAnimation, readonly string[]>;\nconst treeGridAddedRowBoxColumnBoundsCache = new WeakMap<\n TGrid,\n TreeGridAddedRowBoxColumnBounds\n>();\n\n/** TreeGrid JSON 객체 여부 */\nconst isTreeGridJsonRecord = (value: unknown): value is TreeGridJsonRecord =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** TreeGrid 비활성 설정값 여부 */\nconst isTreeGridDisabledConfigValue = (value: unknown) =>\n value === 0 || value === false || value === '0' || value === 'false';\n\n/** TreeGrid 명시 활성 설정값 여부 */\nconst isTreeGridExplicitEnabledConfigValue = (value: unknown) =>\n value === 1 || value === true || value === '1' || value === 'true';\n\n/** TreeGrid 명시 숨김 설정값 여부 */\nconst isTreeGridExplicitHiddenConfigValue = (value: unknown) =>\n value === 1 || value === true || value === '1' || value === 'true';\n\n/** TreeGrid 설정값 동일 여부 */\nconst isTreeGridConfigValue = (value: unknown, expectedValue: string) => {\n return String(value ?? '').trim().toLowerCase() === expectedValue.toLowerCase();\n};\n\n/**\n * TreeGrid checkbox 선택 모드 여부\n * @param selecting Selecting 설정값\n * @param selectingSingle SelectingSingle 설정값\n */\nconst isTreeGridCheckboxSelectionMode = (\n selecting: unknown,\n selectingSingle: unknown,\n) => {\n return (\n !isTreeGridDisabledConfigValue(selecting) &&\n !isTreeGridExplicitEnabledConfigValue(selectingSingle)\n );\n};\n\n/**\n * TreeGrid JSON Cfg 목록 조회\n * @param layoutData JSON 레이아웃 객체\n */\nconst getTreeGridJsonCfgRecords = (layoutData: TreeGridJsonRecord) => {\n const cfg = layoutData.Cfg;\n\n if (Array.isArray(cfg)) {\n return cfg.filter(isTreeGridJsonRecord);\n }\n\n return isTreeGridJsonRecord(cfg) ? [cfg] : [];\n};\n\n/**\n * TreeGrid JSON Cfg 값 조회\n * @param layoutData JSON 레이아웃 객체\n * @param fieldName Cfg 필드명\n */\nconst getTreeGridJsonCfgValue = (layoutData: TreeGridJsonRecord, fieldName: string) => {\n let fieldValue: unknown;\n\n getTreeGridJsonCfgRecords(layoutData).forEach((cfg) => {\n if (fieldName in cfg) {\n fieldValue = cfg[fieldName];\n }\n });\n\n return fieldValue;\n};\n\n/**\n * TreeGrid XML 태그 속성값 조회\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n */\nconst getTreeGridXmlTagAttributeValue = (tag: string, attributeName: string) => {\n const attributeMatch = new RegExp(`\\\\b${attributeName}\\\\s*=\\\\s*(['\"])(.*?)\\\\1`, 'i').exec(\n tag,\n );\n\n return attributeMatch?.[2];\n};\n\n/**\n * TreeGrid XML 태그 속성 보유 여부\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n */\nconst hasTreeGridXmlTagAttribute = (tag: string, attributeName: string) => {\n return new RegExp(`\\\\b${attributeName}\\\\s*=`, 'i').test(tag);\n};\n\n/**\n * TreeGrid XML 속성값 escape\n * @param value XML 속성값\n */\nconst escapeTreeGridXmlAttributeValue = (value: string | number) => {\n return String(value)\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;');\n};\n\n/**\n * TreeGrid XML 태그 속성 추가\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n * @param attributeValue 속성값\n */\nconst appendTreeGridXmlTagAttribute = (\n tag: string,\n attributeName: string,\n attributeValue: string | number,\n) => {\n const insertionIndex = tag.endsWith('/>') ? tag.length - 2 : tag.length - 1;\n\n return `${tag.slice(0, insertionIndex)} ${attributeName}=\"${escapeTreeGridXmlAttributeValue(\n attributeValue,\n )}\"${tag.slice(insertionIndex)}`;\n};\n\n/**\n * TreeGrid XML 태그 속성 설정\n * @param tag XML 태그 문자열\n * @param attributeName 속성명\n * @param attributeValue 속성값\n */\nconst setTreeGridXmlTagAttribute = (\n tag: string,\n attributeName: string,\n attributeValue: string | number,\n) => {\n if (!hasTreeGridXmlTagAttribute(tag, attributeName)) {\n return appendTreeGridXmlTagAttribute(tag, attributeName, attributeValue);\n }\n\n return tag.replace(\n new RegExp(`\\\\b${attributeName}\\\\s*=\\\\s*(['\"])(.*?)\\\\1`, 'i'),\n () => `${attributeName}=\"${escapeTreeGridXmlAttributeValue(attributeValue)}\"`,\n );\n};\n\n/**\n * TreeGrid XML 태그 속성 목록 설정\n * @param tag XML 태그 문자열\n * @param attributes 설정 속성\n */\nconst setTreeGridXmlTagAttributes = (\n tag: string,\n attributes: Record<string, string | number>,\n) => {\n let nextTag = tag;\n\n Object.entries(attributes).forEach(([attributeName, attributeValue]) => {\n nextTag = setTreeGridXmlTagAttribute(nextTag, attributeName, attributeValue);\n });\n\n return nextTag;\n};\n\n/**\n * TreeGrid XML 태그 누락 속성 추가\n * @param tag XML 태그 문자열\n * @param attributes 기본 속성\n */\nconst appendMissingTreeGridXmlTagAttributes = (\n tag: string,\n attributes: Record<string, string | number>,\n) => {\n let nextTag = tag;\n\n Object.entries(attributes).forEach(([attributeName, attributeValue]) => {\n if (!hasTreeGridXmlTagAttribute(nextTag, attributeName)) {\n nextTag = appendTreeGridXmlTagAttribute(nextTag, attributeName, attributeValue);\n }\n });\n\n return nextTag;\n};\n\n/**\n * TreeGrid XML 기본값 적용 관련 최상위 태그 스캔\n * @param layoutData XML 레이아웃 문자열\n */\nconst scanTreeGridXmlDefaultLayout = (layoutData: string) => {\n const tagPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<\\/?([A-Za-z][\\w:-]*)\\b[^>]*>/g;\n const scanResult: TreeGridXmlDefaultLayoutScanResult = {\n cfgValues: {},\n };\n let tagMatch: RegExpExecArray | null;\n let rootDepth = 0;\n let isInsideGrid = false;\n\n while ((tagMatch = tagPattern.exec(layoutData))) {\n const tag = tagMatch[0];\n const currentTagName = tagMatch[1]?.toLowerCase();\n\n if (!currentTagName || tag.startsWith('<!--') || tag.startsWith('<?') || tag.startsWith('<!')) {\n continue;\n }\n\n if (!scanResult.hasFastPanel && hasTreeGridXmlTagAttribute(tag, 'FastPanel')) {\n scanResult.hasFastPanel = true;\n }\n\n const isClosingTag = tag.startsWith('</');\n const isSelfClosingTag = /\\/>\\s*$/.test(tag);\n\n if (!isInsideGrid) {\n if (!isClosingTag && currentTagName === 'grid') {\n isInsideGrid = true;\n scanResult.gridOpenTagEndIndex = tagMatch.index + tag.length;\n rootDepth = isSelfClosingTag ? 0 : 1;\n }\n\n continue;\n }\n\n if (isClosingTag) {\n rootDepth = Math.max(0, rootDepth - 1);\n\n if (currentTagName === 'grid' && rootDepth === 0) {\n break;\n }\n\n continue;\n }\n\n if (rootDepth === 1) {\n if (currentTagName === 'cfg') {\n if (!scanResult.defaultCfgTag) {\n scanResult.defaultCfgTag = {\n index: tagMatch.index,\n tag,\n };\n }\n\n TREE_GRID_DEFAULT_LAYOUT_CFG_ATTRIBUTES.forEach((attributeName) => {\n const attributeValue = getTreeGridXmlTagAttributeValue(tag, attributeName);\n\n if (attributeValue !== undefined) {\n scanResult.cfgValues[attributeName] = attributeValue;\n }\n });\n scanResult.lastCfgEndIndex = tagMatch.index + tag.length;\n } else if (currentTagName === 'actions' && !scanResult.defaultActionsTag) {\n scanResult.defaultActionsTag = {\n index: tagMatch.index,\n tag,\n };\n } else if (\n currentTagName === 'panel' &&\n !scanResult.defaultPanelTag &&\n isTreeGridXmlDefaultPanelTag(tag)\n ) {\n scanResult.defaultPanelTag = {\n index: tagMatch.index,\n tag,\n };\n } else if (currentTagName === 'animations' && !scanResult.animationsTag) {\n scanResult.animationsTag = {\n index: tagMatch.index,\n tag,\n };\n }\n }\n\n if (!isSelfClosingTag) {\n rootDepth += 1;\n }\n }\n\n return scanResult;\n};\n\n/**\n * TreeGrid XML 기본 Panel 태그 여부\n * @param tag XML 태그 문자열\n */\nconst isTreeGridXmlDefaultPanelTag = (tag: string) => {\n const panelName = getTreeGridXmlTagAttributeValue(tag, 'Name');\n\n return panelName === undefined || panelName === '' || panelName.toLowerCase() === 'panel';\n};\n\n/**\n * TreeGrid XML Head 선두 Header 태그 목록 조회\n * @param headContent Head 내부 XML 문자열\n */\nconst getLeadingTreeGridXmlHeaderTags = (headContent: string) => {\n const childTagPattern = /<([A-Za-z][\\w:-]*)\\b[^>]*(?:\\/>|>)/g;\n const headerTags: TreeGridXmlTagMatch[] = [];\n let childTagMatch: RegExpExecArray | null;\n\n while ((childTagMatch = childTagPattern.exec(headContent))) {\n if (childTagMatch[1].toLowerCase() !== 'header') {\n if (headerTags.length > 0) {\n break;\n }\n\n return headerTags;\n }\n\n headerTags.push({\n index: childTagMatch.index,\n tag: childTagMatch[0],\n });\n }\n\n return headerTags;\n};\n\n/**\n * TreeGrid XML Head Panel RowSpan 기본값 적용\n * @param headContent Head 내부 XML 문자열\n */\nconst applyTreeGridXmlHeadPanelRowSpanDefault = (\n headContent: string,\n): TreeGridXmlHeadPanelRowSpanDefaultResult => {\n const headerTags = getLeadingTreeGridXmlHeaderTags(headContent);\n\n if (headerTags.length <= 1) {\n return {\n headContent,\n isApplied: false,\n };\n }\n\n const [firstHeaderTag, ...remainingHeaderTags] = headerTags;\n\n if (\n hasTreeGridXmlTagAttribute(firstHeaderTag.tag, 'PanelRowSpan') ||\n remainingHeaderTags.some(({ tag }) => /\\bPanel[A-Za-z0-9_]*\\s*=/i.test(tag))\n ) {\n return {\n headContent,\n isApplied: false,\n };\n }\n\n let nextHeaderTag = firstHeaderTag.tag;\n\n if (!hasTreeGridXmlTagAttribute(nextHeaderTag, 'Spanned')) {\n nextHeaderTag = appendTreeGridXmlTagAttribute(nextHeaderTag, 'Spanned', 1);\n }\n\n nextHeaderTag = appendTreeGridXmlTagAttribute(\n nextHeaderTag,\n 'PanelRowSpan',\n headerTags.length,\n );\n\n return {\n headContent: `${headContent.slice(0, firstHeaderTag.index)}${nextHeaderTag}${headContent.slice(\n firstHeaderTag.index + firstHeaderTag.tag.length,\n )}`,\n isApplied: true,\n };\n};\n\n/**\n * TreeGrid XML Panel Spanned 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlPanelSpannedInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML Panel Spanned 기본값 적용 대상 여부\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst isTreeGridXmlPanelSpannedDefaultLayout = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return (\n Boolean(scanResult.defaultPanelTag) ||\n isTreeGridXmlSelectingLayout(scanResult.cfgValues) ||\n isTreeGridXmlDeletePanelDefaultLayout(scanResult.cfgValues)\n );\n};\n\n/**\n * TreeGrid XML Panel Spanned 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultPanelSpannedLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlPanelSpannedDefaultLayout(scanResult)\n ) {\n return layoutData;\n }\n\n const panelTag = scanResult.defaultPanelTag;\n\n if (panelTag) {\n const nextPanelTag = appendMissingTreeGridXmlTagAttributes(\n panelTag.tag,\n TREE_GRID_PANEL_SPANNED_DEFAULT_ATTRIBUTES,\n );\n\n return nextPanelTag === panelTag.tag\n ? layoutData\n : `${layoutData.slice(0, panelTag.index)}${nextPanelTag}${layoutData.slice(\n panelTag.index + panelTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlPanelSpannedInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Panel Spanned=\"1\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid Header Panel RowSpan 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n */\nconst applyTreeGridDefaultHeaderPanelRowSpanLayout = (layoutData: string) => {\n if (!/<Head\\b/i.test(layoutData) || /\\bPanelRowSpan\\s*[:=]/i.test(layoutData)) {\n return layoutData;\n }\n\n let isPanelRowSpanApplied = false;\n const nextLayoutData = layoutData.replace(\n /(<Head\\b[^>]*>)([\\s\\S]*?)(<\\/Head>)/i,\n (matchedHead, headOpenTag: string, headContent: string, headCloseTag: string) => {\n const result = applyTreeGridXmlHeadPanelRowSpanDefault(headContent);\n\n if (!result.isApplied) {\n return matchedHead;\n }\n\n isPanelRowSpanApplied = true;\n\n return `${headOpenTag}${result.headContent}${headCloseTag}`;\n },\n );\n\n if (!isPanelRowSpanApplied) {\n return layoutData;\n }\n\n return applyTreeGridXmlDefaultPanelSpannedLayout(\n nextLayoutData,\n scanTreeGridXmlDefaultLayout(nextLayoutData),\n );\n};\n\n/**\n * TreeGrid JSON 레이아웃 checkbox 선택 모드 여부\n * @param layoutData JSON 레이아웃 객체\n */\nconst isTreeGridJsonCheckboxSelectionLayout = (layoutData: TreeGridJsonRecord) => {\n return isTreeGridCheckboxSelectionMode(\n getTreeGridJsonCfgValue(layoutData, 'Selecting'),\n getTreeGridJsonCfgValue(layoutData, 'SelectingSingle'),\n );\n};\n\n/**\n * TreeGrid XML 레이아웃 checkbox 선택 모드 여부\n * @param cfgValues 최상위 Cfg 속성값\n */\nconst isTreeGridXmlCheckboxSelectionLayout = (cfgValues: TreeGridDefaultLayoutCfgValues) => {\n return isTreeGridCheckboxSelectionMode(\n cfgValues.Selecting,\n cfgValues.SelectingSingle,\n );\n};\n\n/**\n * TreeGrid XML 레이아웃 선택 활성 여부\n * @param cfgValues 최상위 Cfg 속성값\n */\nconst isTreeGridXmlSelectingLayout = (cfgValues: TreeGridDefaultLayoutCfgValues) => {\n return !isTreeGridDisabledConfigValue(cfgValues.Selecting);\n};\n\n/**\n * TreeGrid XML 삭제 Panel 기본값 적용 대상 여부\n * @param cfgValues 최상위 Cfg 속성값\n */\nconst isTreeGridXmlDeletePanelDefaultLayout = (cfgValues: TreeGridDefaultLayoutCfgValues) => {\n return (\n isTreeGridConfigValue(cfgValues.Undo, '1') &&\n isTreeGridConfigValue(cfgValues.Deleting, '2') &&\n isTreeGridConfigValue(cfgValues.Selecting, '0')\n );\n};\n\n/**\n * TreeGrid XML 셀 클릭 액션 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlCellClickActionInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML 셀 클릭 액션 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultCellClickActionLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlSelectingLayout(scanResult.cfgValues) ||\n /\\bOnClickCell\\s*=/i.test(layoutData)\n ) {\n return layoutData;\n }\n\n const actionsTag = scanResult.defaultActionsTag;\n\n if (actionsTag) {\n const nextActionsTag = appendMissingTreeGridXmlTagAttributes(\n actionsTag.tag,\n TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS,\n );\n\n return nextActionsTag === actionsTag.tag\n ? layoutData\n : `${layoutData.slice(0, actionsTag.index)}${nextActionsTag}${layoutData.slice(\n actionsTag.index + actionsTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlCellClickActionInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Actions OnClickCell=\"Focus\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid XML SelectAll Panel 액션 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlSelectAllPanelActionInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML SelectAll Panel 액션 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultSelectAllPanelActionLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlCheckboxSelectionLayout(scanResult.cfgValues) ||\n /\\bOnClickPanelSelectAll\\s*=/i.test(layoutData)\n ) {\n return layoutData;\n }\n\n const actionsTag = scanResult.defaultActionsTag;\n\n if (actionsTag) {\n const nextActionsTag = appendMissingTreeGridXmlTagAttributes(\n actionsTag.tag,\n TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS,\n );\n\n return nextActionsTag === actionsTag.tag\n ? layoutData\n : `${layoutData.slice(0, actionsTag.index)}${nextActionsTag}${layoutData.slice(\n actionsTag.index + actionsTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlSelectAllPanelActionInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(\n 0,\n insertionIndex,\n )}\\n <Actions OnClickPanelSelectAll=\"SelectAll OR DeselectAll\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid XML 삭제 Panel 기본값 삽입 위치 조회\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst getTreeGridXmlDeletePanelInsertionIndex = (\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n return scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n};\n\n/**\n * TreeGrid XML 삭제 Panel 기본값 레이아웃 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultDeletePanelLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (\n scanResult.gridOpenTagEndIndex === undefined ||\n !isTreeGridXmlDeletePanelDefaultLayout(scanResult.cfgValues)\n ) {\n return layoutData;\n }\n\n const panelTag = scanResult.defaultPanelTag;\n\n if (panelTag) {\n const nextPanelTag = appendMissingTreeGridXmlTagAttributes(\n panelTag.tag,\n TREE_GRID_DELETE_PANEL_DEFAULT_ATTRIBUTES,\n );\n\n return nextPanelTag === panelTag.tag\n ? layoutData\n : `${layoutData.slice(0, panelTag.index)}${nextPanelTag}${layoutData.slice(\n panelTag.index + panelTag.tag.length,\n )}`;\n }\n\n const insertionIndex = getTreeGridXmlDeletePanelInsertionIndex(scanResult);\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n const panelTagText = '\\n <Panel Visible=\"1\" CanHide=\"0\" Delete=\"1\" Width=\"33\" />';\n\n return `${layoutData.slice(0, insertionIndex)}${panelTagText}${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid XML 레이아웃 FastPanel 기본값 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridXmlDefaultFastPanelLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n) => {\n if (scanResult.hasFastPanel || !isTreeGridXmlCheckboxSelectionLayout(scanResult.cfgValues)) {\n return layoutData;\n }\n\n const insertionIndex = scanResult.gridOpenTagEndIndex;\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Cfg FastPanel=\"0\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid JSON Cfg FastPanel 기본값 적용\n * @param layoutData JSON 레이아웃 객체\n */\nconst applyTreeGridJsonFastPanelDefault = (layoutData: TreeGridJsonRecord) => {\n const cfg = layoutData.Cfg;\n\n if (Array.isArray(cfg)) {\n if (!cfg.some((item) => isTreeGridJsonRecord(item) && 'FastPanel' in item)) {\n layoutData.Cfg = [{ FastPanel: 0 }, ...cfg];\n }\n return;\n }\n\n if (isTreeGridJsonRecord(cfg)) {\n if (!('FastPanel' in cfg)) {\n cfg.FastPanel = 0;\n }\n return;\n }\n\n layoutData.Cfg = { FastPanel: 0 };\n};\n\n/**\n * TreeGrid JSON SelectAll Panel 액션 기본값 적용\n * @param layoutData JSON 레이아웃 객체\n */\nconst applyTreeGridJsonSelectAllPanelActionDefault = (layoutData: TreeGridJsonRecord) => {\n const actions = layoutData.Actions;\n\n if (Array.isArray(actions)) {\n if (\n !actions.some(\n (item) => isTreeGridJsonRecord(item) && 'OnClickPanelSelectAll' in item,\n )\n ) {\n layoutData.Actions = [{ ...TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS }, ...actions];\n }\n return;\n }\n\n if (isTreeGridJsonRecord(actions)) {\n if (!('OnClickPanelSelectAll' in actions)) {\n actions.OnClickPanelSelectAll =\n TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS.OnClickPanelSelectAll;\n }\n return;\n }\n\n if (actions === undefined) {\n layoutData.Actions = { ...TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS };\n }\n};\n\n/**\n * TreeGrid JSON 셀 클릭 액션 기본값 적용\n * @param layoutData JSON 레이아웃 객체\n */\nconst applyTreeGridJsonCellClickActionDefault = (layoutData: TreeGridJsonRecord) => {\n const actions = layoutData.Actions;\n\n if (Array.isArray(actions)) {\n if (!actions.some((item) => isTreeGridJsonRecord(item) && 'OnClickCell' in item)) {\n layoutData.Actions = [{ ...TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS }, ...actions];\n }\n return;\n }\n\n if (isTreeGridJsonRecord(actions)) {\n if (!('OnClickCell' in actions)) {\n actions.OnClickCell = TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS.OnClickCell;\n }\n return;\n }\n\n if (actions === undefined) {\n layoutData.Actions = { ...TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS };\n }\n};\n\n/**\n * TreeGrid JSON 레이아웃 셀 클릭 액션 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n */\nconst applyTreeGridJsonDefaultCellClickActionLayout = (layoutData: string) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (\n !isTreeGridJsonRecord(parsedLayoutData) ||\n isTreeGridDisabledConfigValue(getTreeGridJsonCfgValue(parsedLayoutData, 'Selecting'))\n ) {\n return layoutData;\n }\n\n applyTreeGridJsonCellClickActionDefault(parsedLayoutData);\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid 셀 클릭 액션 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param xmlScanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridDefaultCellClickActionLayout = (\n layoutData: string,\n xmlScanResult?: TreeGridXmlDefaultLayoutScanResult,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultCellClickActionLayout(layoutData);\n }\n\n return applyTreeGridXmlDefaultCellClickActionLayout(\n layoutData,\n xmlScanResult ?? scanTreeGridXmlDefaultLayout(layoutData),\n );\n};\n\n/**\n * TreeGrid JSON 레이아웃 SelectAll Panel 액션 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n */\nconst applyTreeGridJsonDefaultSelectAllPanelActionLayout = (layoutData: string) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (\n !isTreeGridJsonRecord(parsedLayoutData) ||\n !isTreeGridJsonCheckboxSelectionLayout(parsedLayoutData)\n ) {\n return layoutData;\n }\n\n applyTreeGridJsonSelectAllPanelActionDefault(parsedLayoutData);\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid SelectAll Panel 액션 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param xmlScanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridDefaultSelectAllPanelActionLayout = (\n layoutData: string,\n xmlScanResult?: TreeGridXmlDefaultLayoutScanResult,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultSelectAllPanelActionLayout(layoutData);\n }\n\n return applyTreeGridXmlDefaultSelectAllPanelActionLayout(\n layoutData,\n xmlScanResult ?? scanTreeGridXmlDefaultLayout(layoutData),\n );\n};\n\n/**\n * TreeGrid JSON SuppressCfg 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridJsonDefaultSuppressCfgLayout = (\n layoutData: string,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n if (suppressCfg === undefined) {\n return layoutData;\n }\n\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n const cfgRecords = getTreeGridJsonCfgRecords(parsedLayoutData);\n\n if (cfgRecords.some((cfg) => 'SuppressCfg' in cfg)) {\n return layoutData;\n }\n\n if (cfgRecords[0]) {\n cfgRecords[0].SuppressCfg = suppressCfg;\n } else {\n parsedLayoutData.Cfg = { SuppressCfg: suppressCfg };\n }\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid XML SuppressCfg 기본값 적용\n * @param layoutData XML 레이아웃 문자열\n * @param scanResult XML 레이아웃 스캔 결과\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridXmlDefaultSuppressCfgLayout = (\n layoutData: string,\n scanResult: TreeGridXmlDefaultLayoutScanResult,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n if (suppressCfg === undefined || scanResult.cfgValues.SuppressCfg !== undefined) {\n return layoutData;\n }\n\n const cfgTag = scanResult.defaultCfgTag;\n\n if (cfgTag) {\n const nextCfgTag = appendTreeGridXmlTagAttribute(cfgTag.tag, 'SuppressCfg', suppressCfg);\n\n return `${layoutData.slice(0, cfgTag.index)}${nextCfgTag}${layoutData.slice(\n cfgTag.index + cfgTag.tag.length,\n )}`;\n }\n\n const insertionIndex = scanResult.gridOpenTagEndIndex;\n\n if (insertionIndex === undefined) {\n return layoutData;\n }\n\n return `${layoutData.slice(0, insertionIndex)}\\n <Cfg SuppressCfg=\"${suppressCfg}\" />${layoutData.slice(\n insertionIndex,\n )}`;\n};\n\n/**\n * TreeGrid SuppressCfg 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridDefaultSuppressCfgLayout = (\n layoutData: string,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (suppressCfg === undefined || !trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultSuppressCfgLayout(layoutData, suppressCfg);\n }\n\n return applyTreeGridXmlDefaultSuppressCfgLayout(\n layoutData,\n scanTreeGridXmlDefaultLayout(layoutData),\n suppressCfg,\n );\n};\n\n/**\n * TreeGrid Toolbar formula 속성 명시 여부\n * @param layoutRecord TreeGrid JSON 레이아웃 객체\n */\nconst hasTreeGridToolbarFormulaField = (layoutRecord: TreeGridJsonRecord) => {\n return TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES.some((fieldName) => fieldName in layoutRecord);\n};\n\n/**\n * TreeGrid JSON 레이아웃 Toolbar record 목록 조회\n * @param layoutData JSON 레이아웃 객체\n */\nconst getTreeGridJsonToolbarRecords = (layoutData: TreeGridJsonRecord) => {\n const toolbar = layoutData.Toolbar;\n const solid = layoutData.Solid;\n const toolbarRecords = Array.isArray(toolbar)\n ? toolbar.filter(isTreeGridJsonRecord)\n : isTreeGridJsonRecord(toolbar)\n ? [toolbar]\n : [];\n const solidToolbarRecords = Array.isArray(solid)\n ? solid.filter(\n (item): item is TreeGridJsonRecord =>\n isTreeGridJsonRecord(item) && isTreeGridConfigValue(item.Kind, 'Toolbar'),\n )\n : isTreeGridJsonRecord(solid) && isTreeGridConfigValue(solid.Kind, 'Toolbar')\n ? [solid]\n : [];\n\n return [...toolbarRecords, ...solidToolbarRecords];\n};\n\n/**\n * TreeGrid JSON Toolbar 전체 건수 formula 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n */\nconst applyTreeGridJsonDefaultToolbarTotalCountLayout = (\n layoutData: string,\n toolbarTotalCountFormula?: string,\n) => {\n if (!toolbarTotalCountFormula) {\n return layoutData;\n }\n\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n const toolbarRecords = getTreeGridJsonToolbarRecords(parsedLayoutData);\n\n if (toolbarRecords.some(hasTreeGridToolbarFormulaField)) {\n return layoutData;\n }\n\n if (toolbarRecords[0]) {\n toolbarRecords[0].FormulaFormula = toolbarTotalCountFormula;\n } else {\n parsedLayoutData.Toolbar = { FormulaFormula: toolbarTotalCountFormula };\n }\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid XML Toolbar formula 명시 여부\n * @param toolbarTag Toolbar 태그 문자열\n */\nconst hasTreeGridXmlToolbarFormulaAttribute = (toolbarTag: string) => {\n return TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES.some((fieldName) =>\n hasTreeGridXmlTagAttribute(toolbarTag, fieldName),\n );\n};\n\n/**\n * TreeGrid XML Toolbar 전체 건수 formula 기본값 적용\n * @param layoutData XML 레이아웃 문자열\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n */\nconst applyTreeGridXmlDefaultToolbarTotalCountLayout = (\n layoutData: string,\n toolbarTotalCountFormula?: string,\n) => {\n if (!toolbarTotalCountFormula) {\n return layoutData;\n }\n\n const toolbarMatch = TREE_GRID_XML_TOOLBAR_TAG_PATTERN.exec(layoutData);\n\n if (toolbarMatch) {\n const toolbarTag = toolbarMatch[0];\n\n if (hasTreeGridXmlToolbarFormulaAttribute(toolbarTag)) {\n return layoutData;\n }\n\n const nextToolbarTag = setTreeGridXmlTagAttribute(\n toolbarTag,\n 'Formula',\n toolbarTotalCountFormula,\n );\n\n return `${layoutData.slice(0, toolbarMatch.index)}${nextToolbarTag}${layoutData.slice(\n toolbarMatch.index + toolbarTag.length,\n )}`;\n }\n\n const toolbarTag = setTreeGridXmlTagAttribute(\n '<Toolbar />',\n 'Formula',\n toolbarTotalCountFormula,\n );\n const gridCloseMatch = TREE_GRID_XML_GRID_CLOSE_TAG_PATTERN.exec(layoutData);\n\n if (gridCloseMatch) {\n return `${layoutData.slice(0, gridCloseMatch.index)} ${toolbarTag}\\n${layoutData.slice(\n gridCloseMatch.index,\n )}`;\n }\n\n const gridOpenMatch = TREE_GRID_XML_GRID_OPEN_TAG_PATTERN.exec(layoutData);\n\n if (!gridOpenMatch) {\n return layoutData;\n }\n\n return `${layoutData.slice(\n 0,\n gridOpenMatch.index + gridOpenMatch[0].length,\n )}\\n ${toolbarTag}${layoutData.slice(gridOpenMatch.index + gridOpenMatch[0].length)}`;\n};\n\n/**\n * TreeGrid Toolbar 전체 건수 formula 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n */\nconst applyTreeGridDefaultToolbarTotalCountLayout = (\n layoutData: string,\n toolbarTotalCountFormula?: string,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!toolbarTotalCountFormula || !trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDefaultToolbarTotalCountLayout(\n layoutData,\n toolbarTotalCountFormula,\n );\n }\n\n return applyTreeGridXmlDefaultToolbarTotalCountLayout(layoutData, toolbarTotalCountFormula);\n};\n\n/**\n * TreeGrid JSON 레이아웃 FastPanel 기본값 적용\n * @param layoutData JSON 레이아웃 문자열\n */\nconst applyTreeGridJsonDefaultFastPanelLayout = (layoutData: string) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n if (!isTreeGridJsonCheckboxSelectionLayout(parsedLayoutData)) {\n return layoutData;\n }\n\n applyTreeGridJsonFastPanelDefault(parsedLayoutData);\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid FastPanel 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param xmlScanResult XML 레이아웃 스캔 결과\n */\nconst applyTreeGridDefaultFastPanelLayout = (\n layoutData: string,\n xmlScanResult?: TreeGridXmlDefaultLayoutScanResult,\n) => {\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n if (/\\bFastPanel\\s*[:=]/i.test(layoutData)) {\n return layoutData;\n }\n\n return applyTreeGridJsonDefaultFastPanelLayout(layoutData);\n }\n\n return applyTreeGridXmlDefaultFastPanelLayout(\n layoutData,\n xmlScanResult ?? scanTreeGridXmlDefaultLayout(layoutData),\n );\n};\n\n/**\n * TreeGrid 비활성 애니메이션 속성 목록 조회\n * @param disabledAnimations 비활성화할 애니메이션 의미 키 목록\n */\nconst getTreeGridDisabledAnimationAttributes = (\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[],\n) => {\n const attributes: Record<string, string> = {};\n\n disabledAnimations?.forEach((animation) => {\n TREE_GRID_DISABLED_ANIMATION_ATTRIBUTES[animation]?.forEach((attributeName) => {\n attributes[attributeName] = '';\n });\n });\n\n return attributes;\n};\n\n/**\n * TreeGrid JSON Animations 비활성 속성 적용\n * @param layoutData JSON 레이아웃 문자열\n * @param attributes 비활성 애니메이션 속성\n */\nconst applyTreeGridJsonDisabledAnimationsLayout = (\n layoutData: string,\n attributes: Record<string, string>,\n) => {\n try {\n const parsedLayoutData = JSON.parse(layoutData) as unknown;\n\n if (!isTreeGridJsonRecord(parsedLayoutData)) {\n return layoutData;\n }\n\n const animations = parsedLayoutData.Animations;\n\n if (Array.isArray(animations)) {\n const firstAnimations = animations.find(isTreeGridJsonRecord);\n\n if (firstAnimations) {\n Object.assign(firstAnimations, attributes);\n } else {\n animations.unshift({ ...attributes });\n }\n } else if (isTreeGridJsonRecord(animations)) {\n Object.assign(animations, attributes);\n } else if (animations === undefined) {\n parsedLayoutData.Animations = attributes;\n } else {\n return layoutData;\n }\n\n return JSON.stringify(parsedLayoutData);\n } catch {\n return layoutData;\n }\n};\n\n/**\n * TreeGrid XML Animations 태그 생성\n * @param attributes 비활성 애니메이션 속성\n */\nconst createTreeGridDisabledAnimationsTag = (attributes: Record<string, string>) => {\n return setTreeGridXmlTagAttributes('<Animations />', attributes);\n};\n\n/**\n * TreeGrid XML Animations 비활성 속성 적용\n * @param layoutData XML 레이아웃 문자열\n * @param attributes 비활성 애니메이션 속성\n */\nconst applyTreeGridXmlDisabledAnimationsLayout = (\n layoutData: string,\n attributes: Record<string, string>,\n) => {\n const scanResult = scanTreeGridXmlDefaultLayout(layoutData);\n\n if (scanResult.gridOpenTagEndIndex === undefined) {\n return layoutData;\n }\n\n const animationsTag = scanResult.animationsTag;\n\n if (animationsTag) {\n const nextAnimationsTag = setTreeGridXmlTagAttributes(animationsTag.tag, attributes);\n\n return nextAnimationsTag === animationsTag.tag\n ? layoutData\n : `${layoutData.slice(0, animationsTag.index)}${nextAnimationsTag}${layoutData.slice(\n animationsTag.index + animationsTag.tag.length,\n )}`;\n }\n\n const insertionIndex = scanResult.lastCfgEndIndex ?? scanResult.gridOpenTagEndIndex;\n\n return `${layoutData.slice(0, insertionIndex)}\\n ${createTreeGridDisabledAnimationsTag(\n attributes,\n )}${layoutData.slice(insertionIndex)}`;\n};\n\n/**\n * TreeGrid Animations 비활성 속성 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param disabledAnimations 비활성화할 애니메이션 의미 키 목록\n */\nconst applyTreeGridDisabledAnimationsLayout = (\n layoutData: string,\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[],\n) => {\n const attributes = getTreeGridDisabledAnimationAttributes(disabledAnimations);\n\n if (!Object.keys(attributes).length) {\n return layoutData;\n }\n\n const trimmedLayoutData = layoutData.trim();\n\n if (!trimmedLayoutData) {\n return layoutData;\n }\n\n if (trimmedLayoutData.startsWith('{')) {\n return applyTreeGridJsonDisabledAnimationsLayout(layoutData, attributes);\n }\n\n return applyTreeGridXmlDisabledAnimationsLayout(layoutData, attributes);\n};\n\n/**\n * TreeGrid 기본값 레이아웃 적용\n * @param layoutData 레이아웃 문자열\n * @param disabledAnimations 비활성화할 애니메이션 의미 키 목록\n * @param toolbarTotalCountFormula Toolbar 전체 건수 formula\n * @param suppressCfg SuppressCfg 기본값\n */\nconst applyTreeGridDefaultLayout = (\n layoutData: string,\n disabledAnimations?: readonly OwpTreeGridDisabledAnimation[],\n toolbarTotalCountFormula?: string,\n suppressCfg?: OwpTreeGridSuppressCfg,\n) => {\n const nextLayoutData = applyTreeGridDefaultToolbarTotalCountLayout(\n applyTreeGridDefaultHeaderPanelRowSpanLayout(\n applyTreeGridDefaultSuppressCfgLayout(layoutData, suppressCfg),\n ),\n toolbarTotalCountFormula,\n );\n const trimmedLayoutData = nextLayoutData.trim();\n\n if (!trimmedLayoutData || trimmedLayoutData.startsWith('{')) {\n return applyTreeGridDisabledAnimationsLayout(\n applyTreeGridDefaultFastPanelLayout(\n applyTreeGridDefaultCellClickActionLayout(\n applyTreeGridDefaultSelectAllPanelActionLayout(nextLayoutData),\n ),\n ),\n disabledAnimations,\n );\n }\n\n const xmlScanResult = scanTreeGridXmlDefaultLayout(nextLayoutData);\n const nextSelectAllPanelActionLayoutData = applyTreeGridDefaultSelectAllPanelActionLayout(\n nextLayoutData,\n xmlScanResult,\n );\n const nextSelectAllXmlScanResult =\n nextSelectAllPanelActionLayoutData === nextLayoutData\n ? xmlScanResult\n : scanTreeGridXmlDefaultLayout(nextSelectAllPanelActionLayoutData);\n const nextCellClickActionLayoutData = applyTreeGridDefaultCellClickActionLayout(\n nextSelectAllPanelActionLayoutData,\n nextSelectAllXmlScanResult,\n );\n const nextXmlScanResult =\n nextCellClickActionLayoutData === nextSelectAllPanelActionLayoutData\n ? nextSelectAllXmlScanResult\n : scanTreeGridXmlDefaultLayout(nextCellClickActionLayoutData);\n\n return applyTreeGridDisabledAnimationsLayout(\n applyTreeGridXmlDefaultDeletePanelLayout(\n applyTreeGridDefaultFastPanelLayout(\n nextCellClickActionLayoutData,\n nextXmlScanResult,\n ),\n nextXmlScanResult,\n ),\n disabledAnimations,\n );\n};\n\n/**\n * TreeGrid wrapper 엘리먼트 조회\n * @param gridId TreeGrid 인스턴스 ID\n */\nconst getTreeGridWrapperElement = (gridId: string) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n return document.getElementById(gridId)?.closest(`.${TREE_GRID_THEME_WRAPPER_CLASS}`) ?? null;\n};\n\n/**\n * TreeGrid 전체 선택 상태 조회\n * @param grid TreeGrid 인스턴스\n */\nconst getTreeGridSelectAllState = (grid: TGrid): TreeGridSelectAllState => {\n if (isTreeGridExplicitEnabledConfigValue(grid.AllSelected)) {\n return 'checked';\n }\n\n if (isTreeGridDisabledConfigValue(grid.AllSelected)) {\n return 'unchecked';\n }\n\n let selectableRowCount = 0;\n let selectedRowCount = 0;\n\n getTreeGridRows(grid).forEach((row) => {\n if (!isDisplayTreeGridRow(row) || isTreeGridDisabledConfigValue(row.CanSelect)) {\n return;\n }\n\n selectableRowCount += 1;\n\n if (isTreeGridExplicitEnabledConfigValue(grid.IsSelected(row))) {\n selectedRowCount += 1;\n }\n });\n\n if (!selectedRowCount) {\n return 'unchecked';\n }\n\n return selectableRowCount > 0 && selectedRowCount >= selectableRowCount\n ? 'checked'\n : 'indeterminate';\n};\n\n/**\n * TreeGrid 선택 패널 표시 상태 동기화\n * @param grid TreeGrid 인스턴스\n * @param gridId TreeGrid 인스턴스 ID\n */\nconst syncTreeGridSelectionPanelState = (grid: TGrid, gridId: string) => {\n const wrapperElement = getTreeGridWrapperElement(gridId);\n const isSelectingEnabled = !isTreeGridDisabledConfigValue(grid.Selecting);\n const isCheckboxSelectionMode = isTreeGridCheckboxSelectionMode(\n grid.Selecting,\n grid.SelectingSingle,\n );\n const header = grid.Header;\n\n wrapperElement?.classList.toggle(\n TREE_GRID_PANEL_CHECKBOX_SELECT_CLASS,\n isCheckboxSelectionMode,\n );\n\n if (!isCheckboxSelectionMode) {\n wrapperElement?.classList.remove(\n TREE_GRID_SELECT_ALL_CHECKED_CLASS,\n TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS,\n TREE_GRID_SELECT_ALL_UNCHECKED_CLASS,\n );\n } else {\n const selectAllState = getTreeGridSelectAllState(grid);\n\n wrapperElement?.classList.toggle(\n TREE_GRID_SELECT_ALL_CHECKED_CLASS,\n selectAllState === 'checked',\n );\n wrapperElement?.classList.toggle(\n TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS,\n selectAllState === 'indeterminate',\n );\n wrapperElement?.classList.toggle(\n TREE_GRID_SELECT_ALL_UNCHECKED_CLASS,\n selectAllState === 'unchecked',\n );\n }\n\n if (header && isSelectingEnabled) {\n header.CanSelect = isCheckboxSelectionMode ? 1 : 0;\n }\n};\n\nconst treeGridSelectionPanelStateSyncTimeouts = new Map<string, number>();\n\n/**\n * TreeGrid 선택 패널 표시 상태 지연 동기화\n * @param grid TreeGrid 인스턴스\n * @param gridId TreeGrid 인스턴스 ID\n */\nconst scheduleTreeGridSelectionPanelStateSync = (grid: TGrid, gridId: string) => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const activeTimeout = treeGridSelectionPanelStateSyncTimeouts.get(gridId);\n\n if (activeTimeout !== undefined) {\n window.clearTimeout(activeTimeout);\n }\n\n const nextTimeout = window.setTimeout(() => {\n treeGridSelectionPanelStateSyncTimeouts.delete(gridId);\n syncTreeGridSelectionPanelState(grid, gridId);\n }, 0);\n\n treeGridSelectionPanelStateSyncTimeouts.set(gridId, nextTimeout);\n};\n\n/**\n * TreeGrid 기본 Enter 동작 적용\n * @param grid TreeGrid 인스턴스\n * @param enterMode EnterMode 값\n */\nconst applyTreeGridDefaultEnterMode = (grid: TGrid, enterMode: number) => {\n grid.EnterMode = enterMode;\n\n const actionConfig =\n TREE_GRID_DEFAULT_ENTER_ACTIONS[\n enterMode as keyof typeof TREE_GRID_DEFAULT_ENTER_ACTIONS\n ];\n\n if (!actionConfig) {\n return;\n }\n\n const mutableGrid = grid as TGrid & { Actions?: TreeGridMutableActions };\n\n mutableGrid.Actions ??= {};\n mutableGrid.Actions.OnEnter = actionConfig.onEnter;\n mutableGrid.Actions.OnEnterEdit = actionConfig.onEnterEdit;\n};\n\nconst isTreeGridInlineUrl = (url?: string) => {\n return url?.startsWith('data:') || url?.startsWith('blob:');\n};\n\nconst treeGridInlineBlobUrlCache = new Map<string, string>();\n\nconst resolveTreeGridInlineUrl = (url?: string) => {\n if (!url || !url.startsWith('data:')) {\n return url;\n }\n\n const cachedUrl = treeGridInlineBlobUrlCache.get(url);\n\n if (cachedUrl) {\n return cachedUrl;\n }\n\n try {\n const [meta, encodedData = ''] = url.split(',', 2);\n const match = /^data:([^;]*)(;base64)?$/i.exec(meta);\n const mimeType = match?.[1] || 'application/octet-stream';\n const decodedData = match?.[2] ? atob(encodedData) : decodeURIComponent(encodedData);\n const bytes = new Uint8Array(decodedData.length);\n\n for (let index = 0; index < decodedData.length; index += 1) {\n bytes[index] = decodedData.charCodeAt(index);\n }\n\n const blobUrl = URL.createObjectURL(new Blob([bytes], { type: mimeType }));\n\n treeGridInlineBlobUrlCache.set(url, blobUrl);\n\n return blobUrl;\n } catch {\n return url;\n }\n};\n\nconst appendNoCacheQuery = (url: string) => {\n if (!url || isTreeGridInlineUrl(url)) {\n return resolveTreeGridInlineUrl(url);\n }\n\n const hashIndex = url.indexOf('#');\n const [baseUrl, hashFragment] =\n hashIndex >= 0 ? [url.slice(0, hashIndex), url.slice(hashIndex)] : [url, ''];\n const querySeparator = baseUrl.includes('?') ? '&' : '?';\n\n return `${baseUrl}${querySeparator}noCache=${Date.now()}${hashFragment}`;\n};\n\ntype TreeGridDeletedRowStateSyncOptions = {\n canEdit?: 1 | 2;\n highlightColumns?: readonly string[];\n highlightBackgroundColor?: string;\n};\n\n/**\n * 삭제 상태 변경 행 시각 상태 동기화\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param options 동기화 옵션\n */\nconst syncTreeGridDeletedRowState = (\n grid: TGrid | null | undefined,\n row: TRow,\n options: TreeGridDeletedRowStateSyncOptions,\n) => {\n if (!grid) {\n return;\n }\n\n const canEdit = options.canEdit;\n const highlightColumns = options.highlightColumns ?? [];\n const highlightBackgroundColor = options.highlightBackgroundColor;\n\n if (canEdit === undefined && !highlightColumns.length) {\n return;\n }\n\n if (typeof grid.StartUpdate === 'function') {\n grid.StartUpdate();\n }\n\n try {\n if (canEdit !== undefined) {\n row.CanEdit = canEdit;\n }\n\n highlightColumns.forEach((col) => {\n if (!col) {\n return;\n }\n\n grid.SetValue(\n row,\n `${col}Class`,\n highlightBackgroundColor ? TREEGRID_CELL_CHANGED_CLASS : '',\n 0,\n );\n grid.SetValue(row, `${col}Color`, highlightBackgroundColor ?? '', 0);\n });\n } finally {\n if (typeof grid.EndUpdate === 'function') {\n grid.EndUpdate();\n }\n }\n\n if (typeof grid.RefreshRow === 'function') {\n grid.RefreshRow(row);\n }\n};\n\nconst resolveTreeGridDataUrl = (dataUrl?: string) => {\n if (!dataUrl) {\n return '';\n }\n\n if (isTreeGridInlineUrl(dataUrl) || dataUrl.includes('assets')) {\n return appendNoCacheQuery(dataUrl);\n }\n\n // @ts-expect-error - API base URL env is provided by host app\n return appendNoCacheQuery(`${import.meta.env.VITE_API_BASE_URL}/${dataUrl}`);\n};\n\nconst isTreeGridPromiseLike = <T,>(value: unknown): value is PromiseLike<T> => {\n return (\n (typeof value === 'object' || typeof value === 'function') &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === 'function'\n );\n};\n\n/**\n * 삭제 상태 행 재클릭 후속 처리\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param action 후속 액션\n * @param syncHasDisplayDataRows 표시 행 동기화 콜백\n */\nconst applyTreeGridBeforeRowUndeleteAction = (\n grid: TGrid | null | undefined,\n row: TRow,\n action: TreeGridBeforeRowUndeleteAction | undefined,\n syncHasDisplayDataRows: (grid: TGrid | null) => void,\n) => {\n if (!grid || action === 'cancel') {\n return;\n }\n\n if (action === 'remove') {\n grid.RemoveRow(row);\n syncHasDisplayDataRows(grid);\n return;\n }\n\n grid.DeleteRowT(row, 3);\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\n/**\n * TreeGrid 초기화 옵션 생성\n * @param input 초기화 입력값\n */\nexport const buildTreeGridInitializationOptions = <T,>({\n id,\n layoutUrl,\n layoutData,\n toolbarTotalCountFormula,\n suppressCfg,\n disabledAnimations,\n dataUrl,\n bodyData,\n useDataUrl,\n width,\n height,\n languageId,\n}: TreeGridInitializationInput<T>) => {\n return {\n id,\n Layout: layoutData\n ? {\n Data: applyTreeGridDefaultLayout(\n layoutData,\n disabledAnimations,\n toolbarTotalCountFormula,\n suppressCfg,\n ),\n }\n : { 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\ntype TreeGridCellSpanAttribute = 'Span' | 'RowSpan';\n\n/**\n * TreeGrid span 속성 숫자 변환\n * @param value span 속성 원본값\n */\nconst parseTreeGridPositiveNumber = (value: unknown) => {\n if (typeof value === 'number') {\n return Number.isFinite(value) && value > 0 ? value : undefined;\n }\n\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (!trimmedValue) {\n return undefined;\n }\n\n const numericValue = Number(trimmedValue);\n\n return Number.isFinite(numericValue) && numericValue > 0 ? numericValue : undefined;\n};\n\n/**\n * TreeGrid 헤더 셀 span 속성 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param attributeName span 속성 이름\n */\nconst getTreeGridHeaderCellSpanAttribute = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n attributeName: TreeGridCellSpanAttribute,\n) => {\n if (!row || !col) {\n return undefined;\n }\n\n const attributeValue = grid.GetAttribute(row, col, attributeName);\n const resolvedAttributeValue = parseTreeGridPositiveNumber(attributeValue);\n\n if (resolvedAttributeValue !== undefined) {\n return resolvedAttributeValue;\n }\n\n return parseTreeGridPositiveNumber(\n (row as unknown as Record<string, unknown>)[`${col}${attributeName}`],\n );\n};\n\n/**\n * TreeGrid 그룹 전용 헤더 셀 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst isTreeGridGroupHeaderCell = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || row.Fixed !== 'Head') {\n return false;\n }\n\n const colSpan = getTreeGridHeaderCellSpanAttribute(grid, row, col, 'Span') ?? 1;\n\n if (colSpan <= 1) {\n return false;\n }\n\n const rowSpan = getTreeGridHeaderCellSpanAttribute(grid, row, col, 'RowSpan') ?? 1;\n\n return rowSpan === 1;\n};\n\n/**\n * TreeGrid 헤더 버튼 제거 대상 등록\n * @param targets 헤더 행별 대상 컬럼 목록\n * @param row 헤더 행\n * @param col 컬럼 키\n */\nconst addTreeGridHeaderButtonAttributeTarget = (\n targets: Map<TRow, Set<string>>,\n row: TRow,\n col: string,\n) => {\n const targetCols = targets.get(row);\n\n if (targetCols) {\n targetCols.add(col);\n return;\n }\n\n targets.set(row, new Set([col]));\n};\n\n/**\n * TreeGrid 그룹 헤더 sort 버튼 제거 대상 조회\n * @param grid TreeGrid 인스턴스\n * @param headerRows 헤더 행 목록\n * @param cols 컬럼 키 목록\n * @param includeChildHeaderCells 하위 헤더 셀 포함 여부\n */\nconst getTreeGridGroupHeaderSortButtonTargets = (\n grid: TGrid,\n headerRows: readonly TRow[],\n cols: readonly string[],\n includeChildHeaderCells: boolean,\n) => {\n const targets = new Map<TRow, Set<string>>();\n\n headerRows.forEach((row, rowIndex) => {\n cols.forEach((col, colIndex) => {\n if (!isTreeGridGroupHeaderCell(grid, row, col)) {\n return;\n }\n\n addTreeGridHeaderButtonAttributeTarget(targets, row, col);\n\n if (!includeChildHeaderCells) {\n return;\n }\n\n const colSpan = Math.floor(getTreeGridHeaderCellSpanAttribute(grid, row, col, 'Span') ?? 1);\n const childColEndIndex = Math.min(cols.length, colIndex + colSpan);\n\n for (let childRowIndex = rowIndex + 1; childRowIndex < headerRows.length; childRowIndex += 1) {\n const childRow = headerRows[childRowIndex];\n\n for (let childColIndex = colIndex; childColIndex < childColEndIndex; childColIndex += 1) {\n addTreeGridHeaderButtonAttributeTarget(targets, childRow, cols[childColIndex]);\n }\n }\n });\n });\n\n return targets;\n};\n\n/**\n * TreeGrid 그룹 헤더 sort 버튼 제거 대상 셀 여부\n * @param grid TreeGrid 인스턴스\n * @param row 헤더 행\n * @param col 컬럼 키\n * @param includeChildHeaderCells 하위 헤더 셀 포함 여부\n */\nconst isTreeGridGroupHeaderSortButtonTarget = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n includeChildHeaderCells: boolean,\n) => {\n if (!row || !col || row.Fixed !== 'Head') {\n return false;\n }\n\n const headerRows =\n typeof grid.GetFixedRows === 'function'\n ? grid.GetFixedRows().filter((fixedRow) => fixedRow.Fixed === 'Head')\n : [];\n const cols = typeof grid.GetCols === 'function' ? grid.GetCols() : [];\n\n if (!headerRows.length || !cols.length) {\n return false;\n }\n\n return (\n getTreeGridGroupHeaderSortButtonTargets(\n grid,\n headerRows,\n cols,\n includeChildHeaderCells,\n )\n .get(row)\n ?.has(col) === true\n );\n};\n\n/**\n * TreeGrid 그룹 헤더 sort 버튼 비활성 셀 속성 적용\n * @param grid TreeGrid 인스턴스\n * @param gridId TreeGrid 인스턴스 ID\n * @param refreshRows 반영 후 헤더 행 refresh 여부\n * @param includeChildHeaderCells 하위 헤더 셀 포함 여부\n */\nconst applyTreeGridGroupHeaderSortButtonAttributes = (\n grid: TGrid,\n gridId: string,\n refreshRows = false,\n includeChildHeaderCells = true,\n) => {\n const applyStartedAt =\n typeof performance !== 'undefined' ? performance.now() : Date.now();\n const headerRows =\n typeof grid.GetFixedRows === 'function'\n ? grid.GetFixedRows().filter((row) => row.Fixed === 'Head')\n : [];\n const cols = typeof grid.GetCols === 'function' ? grid.GetCols() : [];\n\n if (!headerRows.length || !cols.length) {\n return;\n }\n\n const updatedRows = new Set<TRow>();\n let updatedCellCount = 0;\n const targets = getTreeGridGroupHeaderSortButtonTargets(\n grid,\n headerRows,\n cols,\n includeChildHeaderCells,\n );\n\n if (!targets.size) {\n return;\n }\n\n if (typeof grid.StartUpdate === 'function') {\n grid.StartUpdate();\n }\n\n try {\n targets.forEach((targetCols, row) => {\n targetCols.forEach((col) => {\n if (grid.GetAttribute(row, col, TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE) === '') {\n return;\n }\n\n grid.SetAttribute(row, col, TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE, '', 0, 0);\n updatedRows.add(row);\n updatedCellCount += 1;\n });\n });\n } finally {\n if (typeof grid.EndUpdate === 'function') {\n grid.EndUpdate();\n }\n }\n\n if (!updatedRows.size) {\n return;\n }\n\n if (refreshRows) {\n updatedRows.forEach((row) => {\n if (typeof grid.RefreshRow === 'function') {\n grid.RefreshRow(row);\n }\n });\n }\n\n countTreeGridPerf(gridId, 'group header button attribute apply');\n measureTreeGridPerf(gridId, 'group header button attribute apply', applyStartedAt, {\n updatedCellCount,\n updatedRowCount: updatedRows.size,\n });\n};\n\n/**\n * TreeGrid Body 데이터 건수\n * @param bodyData TreeGrid Body 데이터\n */\nexport const 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\nconst getTreeGridColumnNames = (grid: TGrid) => Object.keys(grid.Cols ?? {}).filter(Boolean);\n\n/**\n * TreeGrid 표시 컬럼 여부\n * @param grid TreeGrid 인스턴스\n * @param col TreeGrid 컬럼 키\n */\nconst isVisibleTreeGridColumn = (grid: TGrid, col: string) => {\n const column = grid.Cols?.[col];\n\n return (\n !!column &&\n !isTreeGridDisabledConfigValue(column.Visible) &&\n !isTreeGridExplicitHiddenConfigValue(column.Hidden)\n );\n};\n\n/**\n * TreeGrid 컬럼 순서값 조회\n * @param value TreeGrid 컬럼 순서 속성값\n * @param fallback fallback 순서값\n */\nconst resolveTreeGridColumnOrderValue = (value: unknown, fallback: number) => {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n};\n\n/**\n * TreeGrid 신규 행 박스 대상 컬럼 경계 조회\n * @param grid TreeGrid 인스턴스\n */\nconst getTreeGridAddedRowBoxColumnBounds = (grid: TGrid): TreeGridAddedRowBoxColumnBounds => {\n const cachedBounds = treeGridAddedRowBoxColumnBoundsCache.get(grid);\n\n if (cachedBounds) {\n return cachedBounds;\n }\n\n const columnNameIndexes = new Map(\n getTreeGridColumnNames(grid).map((columnName, index) => [columnName, index]),\n );\n const columns = [...columnNameIndexes.keys()]\n .filter(\n (columnName) =>\n !TREE_GRID_ROW_BOX_EXCLUDED_COLUMNS.has(columnName) &&\n isVisibleTreeGridColumn(grid, columnName),\n )\n .sort((columnNameA, columnNameB) => {\n const columnA = grid.Cols?.[columnNameA];\n const columnB = grid.Cols?.[columnNameB];\n const indexA = columnNameIndexes.get(columnNameA) ?? 0;\n const indexB = columnNameIndexes.get(columnNameB) ?? 0;\n const sectionDiff =\n resolveTreeGridColumnOrderValue(columnA?.Sec, indexA) -\n resolveTreeGridColumnOrderValue(columnB?.Sec, indexB);\n\n if (sectionDiff !== 0) {\n return sectionDiff;\n }\n\n const positionDiff =\n resolveTreeGridColumnOrderValue(columnA?.Pos, indexA) -\n resolveTreeGridColumnOrderValue(columnB?.Pos, indexB);\n\n return positionDiff || indexA - indexB;\n });\n const columnBounds = {\n columnSet: new Set(columns),\n firstColumn: columns[0],\n lastColumn: columns[columns.length - 1],\n };\n\n treeGridAddedRowBoxColumnBoundsCache.set(grid, columnBounds);\n\n return columnBounds;\n};\n\n/**\n * TreeGrid 신규 행 박스 컬럼 경계 캐시 제거\n * @param grid TreeGrid 인스턴스\n */\nconst clearTreeGridAddedRowBoxColumnBounds = (grid: TGrid | null | undefined) => {\n if (grid) {\n treeGridAddedRowBoxColumnBoundsCache.delete(grid);\n }\n};\n\nconst getTreeGridRows = (grid: TGrid) => {\n if (typeof grid.GetFirst === 'function' && typeof grid.GetNext === 'function') {\n const rows: TRow[] = [];\n let row = grid.GetFirst();\n\n while (row) {\n rows.push(row);\n row = grid.GetNext(row);\n }\n\n return rows;\n }\n\n return Object.values(grid.Rows ?? {});\n};\n\nconst treeGridSelectionRowSpanAnchorRowMaps = new WeakMap<TGrid, WeakMap<TRow, TRow | null>>();\n\n/**\n * TreeGrid 선택 Panel row span 앵커 맵 제거\n * @param grid TreeGrid 인스턴스\n */\nconst clearTreeGridSelectionRowSpanAnchorRowMap = (grid: TGrid | null | undefined) => {\n if (grid) {\n treeGridSelectionRowSpanAnchorRowMaps.delete(grid);\n }\n};\n\n/**\n * TreeGrid row span 정수값 조회\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getTreeGridRowSpanCount = (row: TRow | null | undefined, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown> | null;\n const rowSpanValue = rowRecord?.[`${col}RowSpan`];\n const rowSpan =\n typeof rowSpanValue === 'number'\n ? rowSpanValue\n : Number.parseFloat(String(rowSpanValue ?? ''));\n\n return Number.isFinite(rowSpan) && rowSpan > 1 ? Math.floor(rowSpan) : 1;\n};\n\n/**\n * TreeGrid 선택 Panel row span 앵커 맵 생성\n * @param grid TreeGrid 인스턴스\n */\nconst createTreeGridSelectionRowSpanAnchorRowMap = (grid: TGrid) => {\n const anchorRowMap = new WeakMap<TRow, TRow | null>();\n let anchorRow: TRow | null = null;\n let anchorEndIndex = -1;\n\n getTreeGridRows(grid).forEach((row, index) => {\n if (!isDisplayTreeGridRow(row)) {\n anchorRowMap.set(row, null);\n return;\n }\n\n const rowSpan = getTreeGridRowSpanCount(row, TREE_GRID_SELECTION_ROW_SPAN_COLUMN);\n\n if (rowSpan > 1) {\n anchorRow = row;\n anchorEndIndex = index + rowSpan - 1;\n anchorRowMap.set(row, row);\n return;\n }\n\n anchorRowMap.set(row, anchorRow && index <= anchorEndIndex ? anchorRow : null);\n\n if (index >= anchorEndIndex) {\n anchorRow = null;\n anchorEndIndex = -1;\n }\n });\n\n return anchorRowMap;\n};\n\n/**\n * TreeGrid 선택 Panel row span 앵커 행 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst getTreeGridSelectionRowSpanAnchorRow = (\n grid: TGrid,\n row: TRow | null | undefined,\n) => {\n if (!row || !isDisplayTreeGridRow(row)) {\n return null;\n }\n\n let anchorRowMap = treeGridSelectionRowSpanAnchorRowMaps.get(grid);\n\n if (!anchorRowMap?.has(row)) {\n anchorRowMap = createTreeGridSelectionRowSpanAnchorRowMap(grid);\n treeGridSelectionRowSpanAnchorRowMaps.set(grid, anchorRowMap);\n }\n\n return anchorRowMap.get(row) ?? null;\n};\n\n/**\n * TreeGrid 선택 Panel row span 그룹 행 목록 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst getTreeGridSelectionRowSpanRows = (grid: TGrid, row: TRow | null | undefined) => {\n const anchorRow = getTreeGridSelectionRowSpanAnchorRow(grid, row);\n\n if (!anchorRow) {\n return [];\n }\n\n const rowSpan = getTreeGridRowSpanCount(anchorRow, TREE_GRID_SELECTION_ROW_SPAN_COLUMN);\n const rows: TRow[] = [];\n let currentRow: TRow | null = anchorRow;\n\n for (let rowOffset = 0; currentRow && rowOffset < rowSpan; rowOffset += 1) {\n if (isDisplayTreeGridRow(currentRow)) {\n rows.push(currentRow);\n }\n\n currentRow =\n typeof grid.GetNext === 'function' ? grid.GetNext(currentRow) : null;\n }\n\n return rows;\n};\n\n/**\n * TreeGrid 선택 Panel row span 선택 행 목록 조회\n * @param grid TreeGrid 인스턴스\n */\nconst getTreeGridSelectedRowSpanRows = (grid: TGrid) => {\n const targetRows = new Set<TRow>();\n\n (grid.GetSelRows() ?? []).forEach((selectedRow) => {\n getTreeGridSelectionRowSpanRows(grid, selectedRow).forEach((targetRow) => {\n targetRows.add(targetRow);\n });\n });\n\n return [...targetRows];\n};\n\n/**\n * TreeGrid 변경 비교 기준값 저장\n * @param grid TreeGrid 인스턴스\n * @param baselineMap 셀 기준값 저장소\n */\nexport const captureTreeGridChangeBaselines = (\n grid: TGrid | null | undefined,\n baselineMap: TreeGridCellBaselineMap,\n) => {\n if (!grid) {\n return;\n }\n\n const cols = getTreeGridColumnNames(grid);\n\n getTreeGridRows(grid).forEach((row) => {\n if (!isDisplayTreeGridRow(row)) {\n return;\n }\n\n baselineMap.set(\n row,\n new Map(cols.map((col) => [col, getTreeGridCellComparableValue(grid, row, col)])),\n );\n });\n};\n\nconst isTreeGridChangedFlag = (value: unknown) =>\n value !== undefined &&\n value !== null &&\n value !== '' &&\n value !== 0 &&\n value !== false &&\n value !== '0';\n\nconst hasOtherTreeGridChangedCells = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n\n return getTreeGridColumnNames(grid).some((column) => {\n return column !== col && isTreeGridChangedFlag(rowRecord[`${column}Changed`]);\n });\n};\n\n/**\n * TreeGrid 셀 변경 상태 제거\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst clearTreeGridCellChangedState = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n\n rowRecord[`${col}Changed`] = 0;\n\n if (\n !isAddedTreeGridRow(row) &&\n !isTreeGridRowAddedById(row) &&\n !hasOtherTreeGridChangedCells(grid, row, col)\n ) {\n rowRecord.Changed = 0;\n }\n};\n\nconst resolveTreeGridCellBaselineValue = (\n baselineMap: TreeGridCellBaselineMap,\n row: TRow,\n col: string,\n) => {\n const baselineValues = baselineMap.get(row);\n\n if (baselineValues?.has(col)) {\n return baselineValues.get(col);\n }\n\n return undefined;\n};\n\n/**\n * TreeGrid 신규 행 변경 셀 하이라이트 동기화\n * @param gridId TreeGrid 인스턴스 ID\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n * @param backgroundColor 변경 하이라이트 배경색\n * @param highlightRefresh 하이라이트 적용 후 셀 refresh 여부\n */\nconst syncTreeGridAddedRowChangedCellHighlight = ({\n gridId,\n grid,\n row,\n col,\n backgroundColor,\n highlightRefresh,\n}: {\n gridId: string;\n grid: TGrid;\n row: TRow;\n col: string;\n backgroundColor: string;\n highlightRefresh?: boolean;\n}) => {\n if (!isAddedTreeGridRow(row) && !isTreeGridRowAddedById(row)) {\n return false;\n }\n\n if (grid.CanEdit(row, col) !== 1) {\n return true;\n }\n\n const baselineValue = getTreeGridAddedRowBaselineValue(row, col);\n const isHighlightedCell = getTreeGridAddedRowHighlightColumns(row).includes(col);\n\n if (baselineValue === undefined) {\n return true;\n }\n\n const currentValue = getTreeGridCellComparableValue(grid, row, col);\n\n if (currentValue === baselineValue) {\n removeTreeGridAddedRowHighlightColumn(row, col);\n if (isHighlightedCell) {\n clearTreeGridCellHighlightById(gridId, { row, col });\n }\n clearTreeGridCellChangedState(grid, row, col);\n return true;\n }\n\n appendTreeGridAddedRowHighlightColumn(row, col);\n highlightTreeGridCellById(gridId, {\n row,\n col,\n backgroundColor,\n refresh: highlightRefresh,\n });\n\n return true;\n};\n\n/**\n * TreeGrid 셀 변경 하이라이트 동기화\n * @param gridId TreeGrid 인스턴스 ID\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n * @param backgroundColor 변경 하이라이트 배경색\n * @param baselineMap 셀 기준값 저장소\n * @param highlightRefresh 하이라이트 적용 후 셀 refresh 여부\n */\nexport const syncTreeGridChangedCellHighlight = ({\n gridId,\n grid,\n row,\n col,\n backgroundColor,\n baselineMap,\n highlightRefresh,\n}: {\n gridId: string;\n grid: TGrid;\n row: TRow;\n col: string;\n backgroundColor: string;\n baselineMap: TreeGridCellBaselineMap;\n highlightRefresh?: boolean;\n}) => {\n if (!isDisplayTreeGridRow(row)) {\n return;\n }\n\n if (\n syncTreeGridAddedRowChangedCellHighlight({\n gridId,\n grid,\n row,\n col,\n backgroundColor,\n highlightRefresh,\n })\n ) {\n return;\n }\n\n const baselineValue = resolveTreeGridCellBaselineValue(baselineMap, row, col);\n const currentValue = getTreeGridCellComparableValue(grid, row, col);\n\n if (baselineValue !== undefined && currentValue === baselineValue) {\n clearTreeGridCellHighlightById(gridId, { row, col });\n clearTreeGridCellChangedState(grid, row, col);\n return;\n }\n\n highlightTreeGridCellById(gridId, {\n row,\n col,\n backgroundColor,\n refresh: highlightRefresh,\n });\n};\n\n/**\n * TreeGrid 셀 편집 가능 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst isEditableTreeGridCell = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n return grid.CanEdit(row, col) === 1;\n};\n\n/**\n * TreeGrid 셀 명시 색상 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getExplicitTreeGridCellColor = (grid: TGrid, row: TRow, col: string) => {\n const color = grid.GetAttribute(row, col, 'Color') as unknown;\n\n if (typeof color === 'number') {\n return toTreeGridCssHexColor(color);\n }\n\n if (typeof color === 'string') {\n const trimmedColor = color.trim();\n\n return trimmedColor || undefined;\n }\n\n return undefined;\n};\n\n/**\n * TreeGrid 셀 명시 색상 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst hasExplicitTreeGridCellColor = (grid: TGrid, row: TRow, col: string) => {\n return getExplicitTreeGridCellColor(grid, row, col) !== undefined;\n};\n\n/** TreeGrid 포커스 셀 상태 여부 */\nconst isTreeGridFocusedCellState = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n const focused =\n typeof grid.IsFocused === 'function'\n ? grid.IsFocused(row, col)\n : grid.FRow === row && grid.FCol === col;\n\n return focused !== 0 && focused !== false && focused !== undefined && focused !== null;\n};\n\n/** TreeGrid 선택 셀 상태 여부 */\nconst isTreeGridSelectedCellState = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n const selected = grid.IsSelected(row, col);\n\n if (selected !== 0 && selected !== false && selected !== undefined && selected !== null) {\n return true;\n }\n\n const anchorRow = getTreeGridSelectionRowSpanAnchorRow(grid, row);\n\n if (!anchorRow || anchorRow === row) {\n return false;\n }\n\n const anchorSelected = grid.IsSelected(anchorRow, col);\n\n return (\n anchorSelected !== 0 &&\n anchorSelected !== false &&\n anchorSelected !== undefined &&\n anchorSelected !== null\n );\n};\n\n/**\n * TreeGrid 변경 셀 class 포함 여부\n * @param className 원본 class 문자열\n */\nconst hasTreeGridChangedCellDisplayClass = (className: string) => {\n if (!TREE_GRID_CELL_CHANGED_CLASS_TOKENS.length) {\n return false;\n }\n\n const classTokens = className.split(/\\s+/).filter(Boolean);\n\n return TREE_GRID_CELL_CHANGED_CLASS_TOKENS.every((classToken) =>\n classTokens.includes(classToken),\n );\n};\n\n/**\n * TreeGrid 선택 변경 셀 표시 class 추가\n * @param className 원본 class 문자열\n */\nconst appendTreeGridSelectedChangedCellDisplayClass = (className: string) => {\n if (\n !className ||\n className.split(/\\s+/).includes(TREE_GRID_SELECTED_CHANGED_CELL_CLASS) ||\n !hasTreeGridChangedCellDisplayClass(className)\n ) {\n return undefined;\n }\n\n return `${className} ${TREE_GRID_SELECTED_CHANGED_CELL_CLASS}`;\n};\n\n/**\n * TreeGrid 변경 셀 class 보유 행 여부\n * @param row 대상 행\n */\nconst hasTreeGridChangedCellDisplayClassInRow = (row: TRow | null | undefined) => {\n if (!row || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n return Object.entries(row as unknown as Record<string, unknown>).some(([key, value]) => {\n return (\n key.endsWith('Class') &&\n typeof value === 'string' &&\n hasTreeGridChangedCellDisplayClass(value)\n );\n });\n};\n\n/**\n * TreeGrid 선택 변경 행 class refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n */\nconst scheduleTreeGridSelectionChangedClassRefresh = (\n grid: TGrid,\n row: TRow | null | undefined,\n) => {\n if (\n !row ||\n !hasTreeGridChangedCellDisplayClassInRow(row) ||\n typeof grid.RefreshRow !== 'function'\n ) {\n return;\n }\n\n const targetRow = row;\n\n window.setTimeout(() => {\n grid.RefreshRow(targetRow);\n }, 0);\n};\n\n/**\n * TreeGrid 행 목록 refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param rows TreeGrid 행 목록\n */\nconst scheduleTreeGridRowsRefresh = (grid: TGrid, rows: readonly TRow[]) => {\n if (!rows.length || typeof window === 'undefined' || typeof grid.RefreshRow !== 'function') {\n return;\n }\n\n const targetRows = [...new Set(rows)];\n\n window.setTimeout(() => {\n targetRows.forEach((targetRow) => {\n grid.RefreshRow(targetRow);\n });\n }, 0);\n};\n\n/**\n * TreeGrid 선택 Panel row span 그룹 refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst scheduleTreeGridSelectionRowSpanRefresh = (\n grid: TGrid,\n row: TRow | null | undefined,\n) => {\n if (!row) {\n return;\n }\n\n const targetRows = getTreeGridSelectionRowSpanRows(grid, row);\n\n if (targetRows.length <= 1) {\n return;\n }\n\n scheduleTreeGridRowsRefresh(grid, targetRows);\n};\n\n/**\n * TreeGrid 전체 선택 Panel row span 그룹 refresh 예약\n * @param grid TreeGrid 인스턴스\n */\nconst scheduleTreeGridSelectionRowSpanRefreshAll = (grid: TGrid) => {\n const targetRows = getTreeGridRows(grid).filter((row) => {\n return isDisplayTreeGridRow(row) && getTreeGridSelectionRowSpanAnchorRow(grid, row);\n });\n\n scheduleTreeGridRowsRefresh(grid, targetRows);\n};\n\n/**\n * TreeGrid 입력 셀 기본 배경색 계산\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getEditableTreeGridCellDefaultColor = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n editableCellBackgroundColorValue: number | undefined,\n) => {\n if (\n !row ||\n editableCellBackgroundColorValue === undefined ||\n !isEditableTreeGridCell(grid, row, col) ||\n isTreeGridFocusedCellState(grid, row, col) ||\n isTreeGridSelectedCellState(grid, row, col) ||\n hasExplicitTreeGridCellColor(grid, row, col)\n ) {\n return undefined;\n }\n\n return editableCellBackgroundColorValue;\n};\n\nconst matchesTreeGridRgbColor = (\n r: number,\n g: number,\n b: number,\n expected: readonly [number, number, number],\n) => {\n return r === expected[0] && g === expected[1] && b === expected[2];\n};\n\n/**\n * TreeGrid native Error 배경색 여부\n * @param r red 채널\n * @param g green 채널\n * @param b blue 채널\n */\nconst isTreeGridNativeErrorBackgroundColor = (r: number, g: number, b: number) => {\n return TREE_GRID_NATIVE_ERROR_CELL_RGB_VALUES.some((expectedColor) =>\n matchesTreeGridRgbColor(r, g, b, expectedColor),\n );\n};\n\n/**\n * TreeGrid 숫자 색상 CSS 변환\n * @param color TreeGrid 숫자 색상\n */\nconst toTreeGridCssHexColor = (color: number | undefined) => {\n if (color === undefined || !Number.isFinite(color)) {\n return undefined;\n }\n\n return `#${Math.trunc(color).toString(16).padStart(6, '0')}`;\n};\n\n/**\n * TreeGrid 셀 Error 메시지 조회\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst getTreeGridCellError = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string | null | undefined,\n) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return '';\n }\n\n const error = grid.GetAttribute(row, col, 'Error');\n\n return error ?? '';\n};\n\n/**\n * TreeGrid 셀 Error 설정 여부\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst hasTreeGridCellError = (grid: TGrid, row: TRow | null | undefined, col: string) => {\n return getTreeGridCellError(grid, row, col) !== '';\n};\n\n/**\n * TreeGrid 행 Error 상태 초기화\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n */\nconst clearTreeGridRowErrors = (grid: TGrid, row: TRow | null | undefined) => {\n if (!row) {\n return;\n }\n\n let hasError = false;\n\n getTreeGridColumnNames(grid).forEach((col) => {\n if (!hasTreeGridCellError(grid, row, col)) {\n return;\n }\n\n grid.SetAttribute(row, col, 'Error', '', 0);\n hasError = true;\n });\n\n if (hasError) {\n grid.RefreshRow(row);\n }\n};\n\n/**\n * TreeGrid mouse event anchor 엘리먼트 조회\n * @param event TreeGrid mouse event\n */\nconst getTreeGridMouseEventAnchorElement = (event: Event | null | undefined) => {\n const target = event?.target;\n\n if (\n typeof HTMLElement === 'undefined' ||\n typeof Element === 'undefined' ||\n typeof Node === 'undefined'\n ) {\n return null;\n }\n\n const targetElement = target instanceof Element ? target : null;\n const fallbackTargetElement = target instanceof Node ? target.parentElement : null;\n const anchorTargetElement = targetElement ?? fallbackTargetElement;\n\n if (anchorTargetElement) {\n const cellElement = anchorTargetElement.closest('td,th');\n\n if (cellElement instanceof HTMLElement) {\n return cellElement;\n }\n\n return anchorTargetElement instanceof HTMLElement ? anchorTargetElement : null;\n }\n\n return null;\n};\n\n/**\n * TreeGrid 변경 행 또는 셀 여부\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n */\nconst isChangedTreeGridRowOrCell = (row: TRow | null | undefined, col: string) => {\n if (!row || !col || !isDisplayTreeGridRow(row)) {\n return false;\n }\n\n const rowRecord = row as unknown as Record<string, unknown>;\n const cellDisplayClass = rowRecord[`${col}Class`];\n const isChangedCell =\n isTreeGridChangedFlag(rowRecord[`${col}Changed`]) ||\n (typeof cellDisplayClass === 'string' &&\n hasTreeGridChangedCellDisplayClass(cellDisplayClass));\n\n if (isAddedTreeGridRow(row) || isTreeGridRowAddedById(row)) {\n return isChangedCell;\n }\n\n return (\n isChangedCell ||\n isTreeGridChangedFlag(rowRecord.Changed)\n );\n};\n\n/**\n * TreeGrid native input 편집 타입 여부\n * @param grid TreeGrid 인스턴스\n * @param row 대상 행\n * @param col 대상 컬럼\n */\nconst isTreeGridNativeInputEditType = (grid: TGrid, row: TRow, col: string) => {\n return TREE_GRID_NATIVE_INPUT_EDIT_TYPES.has(grid.GetType(row, col));\n};\n\nconst isTreeGridReadonlyHoveredCellState = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col || !isDisplayTreeGridRow(row) || grid.ARow !== row || grid.ACol !== col) {\n return false;\n }\n\n return grid.CanEdit(row, col) === 0;\n};\n\nconst isTreeGridPreviewHoveredCellState = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col || !isDisplayTreeGridRow(row) || grid.ARow !== row || grid.ACol !== col) {\n return false;\n }\n\n return grid.CanEdit(row, col) === 2;\n};\n\n/** TreeGrid 포커스 행 상태 여부 */\nconst isTreeGridFocusedRowState = (grid: TGrid, row: TRow | null | undefined) => {\n return !!row && isDisplayTreeGridRow(row) && grid.FRow === row;\n};\n\nconst resolveTreeGridStateBackgroundColor = ({\n grid,\n row,\n col,\n r,\n g,\n b,\n focusedCellBackgroundColor,\n selectedCellBackgroundColor,\n hoverCellBackgroundColor,\n changedCellBackgroundColor,\n editableCellBackgroundColorValue,\n}: {\n grid: TGrid;\n row: TRow | null | undefined;\n col: string;\n r: number;\n g: number;\n b: number;\n focusedCellBackgroundColor: string;\n selectedCellBackgroundColor: string;\n hoverCellBackgroundColor: string;\n changedCellBackgroundColor: string;\n editableCellBackgroundColorValue: number | undefined;\n}) => {\n if (isTreeGridFocusedCellState(grid, row, col)) {\n return focusedCellBackgroundColor;\n }\n\n if (isTreeGridSelectedCellState(grid, row, col)) {\n return selectedCellBackgroundColor;\n }\n\n if (\n isTreeGridReadonlyHoveredCellState(grid, row, col) &&\n (matchesTreeGridRgbColor(r, g, b, TREE_GRID_READONLY_HOVER_CELL_RGB) ||\n matchesTreeGridRgbColor(r, g, b, TREE_GRID_READONLY_NO_FOCUS_HOVER_CELL_RGB))\n ) {\n return hoverCellBackgroundColor;\n }\n\n if (\n isTreeGridPreviewHoveredCellState(grid, row, col) &&\n (matchesTreeGridRgbColor(r, g, b, TREE_GRID_PREVIEW_CELL_RGB) ||\n matchesTreeGridRgbColor(r, g, b, TREE_GRID_PREVIEW_CELL_SOFT_RGB) ||\n matchesTreeGridRgbColor(r, g, b, TREE_GRID_PREVIEW_CELL_DIM_RGB))\n ) {\n return hoverCellBackgroundColor;\n }\n\n const isAddedRow = isAddedTreeGridRow(row) || isTreeGridRowAddedById(row);\n const hasNativeErrorBackgroundColor =\n hasTreeGridCellError(grid, row, col) && isTreeGridNativeErrorBackgroundColor(r, g, b);\n\n if (!hasNativeErrorBackgroundColor && !isAddedRow) {\n return undefined;\n }\n\n const explicitCellColor = getExplicitTreeGridCellColor(grid, row, col);\n\n if (hasNativeErrorBackgroundColor) {\n if (explicitCellColor) {\n return explicitCellColor;\n }\n }\n\n if (isChangedTreeGridRowOrCell(row, col)) {\n return changedCellBackgroundColor;\n }\n\n const editableCellDefaultColor = getEditableTreeGridCellDefaultColor(\n grid,\n row,\n col,\n editableCellBackgroundColorValue,\n );\n\n if (editableCellDefaultColor !== undefined) {\n return toTreeGridCssHexColor(editableCellDefaultColor);\n }\n\n if (isAddedRow) {\n return explicitCellColor ?? TREEGRID_ADDED_ROW_BACKGROUND_COLOR;\n }\n\n return TREE_GRID_ERROR_CELL_FALLBACK_BACKGROUND_COLOR;\n};\n\n/**\n * TreeGrid class token 추가\n * @param className 원본 class 문자열\n * @param classToken 추가 class token\n */\nconst appendTreeGridClassToken = (className: string, classToken: string) => {\n const classTokens = className.split(/\\s+/).filter(Boolean);\n\n if (classTokens.includes(classToken)) {\n return className;\n }\n\n return [...classTokens, classToken].join(' ');\n};\n\n/**\n * TreeGrid Error 셀 표시 class 추가\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param className 원본 class 문자열\n */\nconst appendTreeGridErrorCellDisplayClass = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n className: string,\n) => {\n if (!hasTreeGridCellError(grid, row, col) || !row) {\n return className;\n }\n\n return appendTreeGridClassToken(className, TREE_GRID_ERROR_CELL_CLASS);\n};\n\n/**\n * TreeGrid 신규 행 박스 표시 class 추가\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param className 원본 class 문자열\n */\nconst appendTreeGridAddedRowBoxDisplayClass = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n className: string,\n) => {\n if (\n !isDisplayTreeGridRow(row) ||\n (!isAddedTreeGridRow(row) && !isTreeGridRowAddedById(row))\n ) {\n return className;\n }\n\n if (\n isTreeGridFocusedRowState(grid, row) ||\n isTreeGridSelectedCellState(grid, row, col)\n ) {\n return className;\n }\n\n const columnBounds = getTreeGridAddedRowBoxColumnBounds(grid);\n\n if (!columnBounds.columnSet.has(col)) {\n return className;\n }\n\n let nextClassName = appendTreeGridClassToken(className, TREE_GRID_ADDED_ROW_BOX_CELL_CLASS);\n\n if (col === columnBounds.firstColumn) {\n nextClassName = appendTreeGridClassToken(nextClassName, TREE_GRID_ADDED_ROW_BOX_START_CLASS);\n }\n\n if (col === columnBounds.lastColumn) {\n nextClassName = appendTreeGridClassToken(nextClassName, TREE_GRID_ADDED_ROW_BOX_END_CLASS);\n }\n\n return nextClassName;\n};\n\n/**\n * TreeGrid 셀 표시 class 계산\n * @param grid TreeGrid 인스턴스\n * @param row TreeGrid 행\n * @param col TreeGrid 컬럼 키\n * @param className 원본 class 문자열\n */\nconst resolveTreeGridCellDisplayClass = (\n grid: TGrid,\n row: TRow | null | undefined,\n col: string,\n className: string,\n) => {\n const errorCellClassName = appendTreeGridErrorCellDisplayClass(grid, row, col, className);\n const addedRowBoxClassName = appendTreeGridAddedRowBoxDisplayClass(\n grid,\n row,\n col,\n errorCellClassName,\n );\n\n if (!isTreeGridSelectedCellState(grid, row, col)) {\n return addedRowBoxClassName === className ? undefined : addedRowBoxClassName;\n }\n\n const selectedChangedCellClassName =\n appendTreeGridSelectedChangedCellDisplayClass(addedRowBoxClassName) ?? addedRowBoxClassName;\n\n return selectedChangedCellClassName === className ? undefined : selectedChangedCellClassName;\n};\n\n/** TreeGrid 신규 행 박스 표시 대상 행 여부 */\nconst isTreeGridAddedRowBoxDisplayRow = (row: TRow | null | undefined): row is TRow => {\n return isDisplayTreeGridRow(row) && (isAddedTreeGridRow(row) || isTreeGridRowAddedById(row));\n};\n\n/**\n * TreeGrid 신규 행 박스 상태 행 refresh 예약\n * @param grid TreeGrid 인스턴스\n * @param rows refresh 후보 행 목록\n */\nconst scheduleTreeGridAddedRowBoxRowsRefresh = (\n grid: TGrid,\n rows: readonly (TRow | null | undefined)[],\n) => {\n const targetRows = rows.filter(isTreeGridAddedRowBoxDisplayRow);\n\n if (targetRows.length) {\n scheduleTreeGridRowsRefresh(grid, targetRows);\n }\n};\n\n/**\n * TreeGrid 신규 행 박스 전체 상태 refresh 예약\n * @param grid TreeGrid 인스턴스\n */\nconst scheduleTreeGridAddedRowBoxRowsRefreshAll = (grid: TGrid) => {\n scheduleTreeGridRowsRefresh(grid, getTreeGridRows(grid).filter(isTreeGridAddedRowBoxDisplayRow));\n};\n\n/**\n * TreeGrid 표시 데이터 행 존재 여부\n * @param grid TreeGrid 인스턴스\n */\nexport const 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\n/**\n * TreeGrid Body 데이터 교체 후 재로드\n * @param grid TreeGrid 인스턴스\n * @param bodyData 새 Body 데이터\n * @param onReloadFinish 재로드 완료 콜백\n */\nexport const replaceTreeGridBodyData = <T,>(\n grid: TGrid,\n bodyData: OwpTreeGridBodyData<T>,\n onReloadFinish?: (code: number) => void,\n) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\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\n/**\n * TreeGrid 이벤트 바인딩\n * @param options 이벤트 바인딩 옵션\n */\nexport const bindTreeGridEvents = <T,>({\n id,\n latestEventHandlersRef,\n layoutHasExplicitEnterModeRef,\n highlightEditableCellsRef,\n highlightChangedCellsRef,\n syncDeletedRowCanEditRef,\n editableCellBackgroundColorValueRef,\n changedCellBackgroundColorRef,\n focusedCellBackgroundColorRef,\n selectedCellBackgroundColorRef,\n hoverCellBackgroundColorRef,\n changedCellBaselineRef,\n treeGridInstanceRef,\n treeGridInitStartedAtRef,\n latestLayoutOverridesRef,\n latestToolbarTotalCountFormulaRef,\n latestSuppressCfgRef,\n latestHideChildHeaderSortButtonsRef,\n latestSelectionScopeRef,\n latestDisabledAnimationsRef,\n appliedLayoutOverridesRef,\n appliedBodyDataPropRef,\n hasAppliedInitialLayoutRef,\n syncHasDisplayDataRows,\n setIsTreeGridReady,\n showErrorTooltip,\n hideErrorTooltip,\n}: TreeGridEventBindingOptions<T>) => {\n const initialEventHandlers = latestEventHandlersRef.current;\n\n window.TGSetEvent('OnRowAdd', id, (grid, row) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\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 clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n syncHasDisplayDataRows(grid);\n });\n window.TGSetEvent('OnRowRemove', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n hideErrorTooltip();\n syncHasDisplayDataRows(grid);\n });\n window.TGSetEvent('OnColShow', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnAfterColumnsChanged', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColMove', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColsAdd', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColDelete', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnColUndelete', id, (grid) => {\n clearTreeGridAddedRowBoxColumnBounds(grid);\n });\n window.TGSetEvent('OnMouseOver', id, (grid, row, col, _orow, _ocol, event) => {\n const message = getTreeGridCellError(grid, row, col);\n\n if (!message) {\n hideErrorTooltip();\n return;\n }\n\n const anchorEl = getTreeGridMouseEventAnchorElement(event);\n\n if (!anchorEl) {\n hideErrorTooltip();\n return;\n }\n\n grid.HideTip();\n showErrorTooltip({ anchorEl, row, col, message });\n });\n window.TGSetEvent('OnFocus', id, (grid, row, _col, orow) => {\n if (row !== orow) {\n scheduleTreeGridAddedRowBoxRowsRefresh(grid, [row, orow]);\n }\n });\n window.TGSetEvent('OnTip', id, (grid, row, col, tip) => {\n return getTreeGridCellError(grid, row, col) ? '' : tip;\n });\n window.TGSetEvent('OnCanRowDelete', id, (grid, row, type) => {\n if (type !== 3) {\n return type;\n }\n\n const beforeRowUndeleteHandler = latestEventHandlersRef.current?.onBeforeRowUndelete;\n\n if (typeof beforeRowUndeleteHandler !== 'function') {\n return type;\n }\n\n const scheduleAction = (action: TreeGridBeforeRowUndeleteAction | undefined) => {\n window.setTimeout(() => {\n applyTreeGridBeforeRowUndeleteAction(\n treeGridInstanceRef.current ?? grid,\n row,\n action,\n syncHasDisplayDataRows,\n );\n }, 0);\n };\n\n try {\n const result = beforeRowUndeleteHandler(grid, row as OwpTreeGridRowModel<T>);\n\n if (isTreeGridPromiseLike<TreeGridBeforeRowUndeleteAction | undefined>(result)) {\n void result.then(scheduleAction).catch(() => {\n scheduleAction('undelete');\n });\n return 0;\n }\n\n scheduleAction(result);\n\n return 0;\n } catch {\n scheduleAction('undelete');\n return 0;\n }\n });\n\n if (\n typeof initialEventHandlers?.onRowClick === 'function' ||\n typeof initialEventHandlers?.onInternalCellClick === 'function'\n ) {\n const debouncedRowClickHandler = 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 window.TGSetEvent('OnClick', id, (grid, row, col, x, y, event) => {\n const internalResult = latestEventHandlersRef.current?.onInternalCellClick?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n x,\n y,\n event,\n );\n\n if (internalResult !== undefined) {\n return internalResult;\n }\n\n if (typeof latestEventHandlersRef.current?.onRowClick === 'function') {\n debouncedRowClickHandler(grid, row, col, x, y, event);\n }\n\n return undefined;\n });\n }\n\n if (\n typeof initialEventHandlers?.onClickButton === 'function' ||\n typeof initialEventHandlers?.onInternalButtonClick === 'function'\n ) {\n window.TGSetEvent(\n 'OnClickButton',\n id,\n (grid, row, col, event) => {\n const internalResult = latestEventHandlersRef.current?.onInternalButtonClick?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n event,\n );\n\n if (internalResult !== undefined) {\n return internalResult;\n }\n\n latestEventHandlersRef.current?.onClickButton?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n event,\n );\n\n return undefined;\n },\n );\n }\n\n if (typeof initialEventHandlers?.onInternalKeyDown === 'function') {\n window.TGSetEvent('OnKeyDown', id, (grid, key, event, name, prefix) =>\n latestEventHandlersRef.current?.onInternalKeyDown?.(grid, key, event, name, prefix),\n );\n window.TGSetEvent('OnKeyPress', id, (grid, key, event, name, prefix) =>\n latestEventHandlersRef.current?.onInternalKeyDown?.(grid, key, event, name, prefix),\n );\n }\n\n window.TGSetEvent('OnStartEdit', id, (grid, row, col) => {\n hideErrorTooltip();\n\n return latestEventHandlersRef.current?.onInternalStartEdit?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n col,\n );\n });\n\n window.TGSetEvent('OnRowDelete', id, (grid, row, deleteType) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n hideErrorTooltip();\n clearTreeGridRowErrors(grid, row);\n grid.SelectRow(row, 0);\n const addedRowHighlightColumns = isTreeGridRowAddedById(row)\n ? getTreeGridAddedRowHighlightColumns(row)\n : [];\n\n syncTreeGridDeletedRowState(grid, row, {\n canEdit: syncDeletedRowCanEditRef.current !== false ? 2 : undefined,\n highlightColumns: addedRowHighlightColumns,\n });\n\n syncHasDisplayDataRows(grid);\n latestEventHandlersRef.current?.onRowDelete?.(\n grid,\n row as OwpTreeGridRowModel<T>,\n deleteType,\n );\n });\n window.TGSetEvent('OnRowUndelete', id, (grid, row) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n hideErrorTooltip();\n const addedRowHighlightColumns = isTreeGridRowAddedById(row)\n ? getTreeGridAddedRowHighlightColumns(row)\n : [];\n\n syncTreeGridDeletedRowState(grid, row, {\n canEdit: syncDeletedRowCanEditRef.current !== false ? 1 : undefined,\n highlightColumns: addedRowHighlightColumns,\n highlightBackgroundColor: addedRowHighlightColumns.length\n ? changedCellBackgroundColorRef.current\n : undefined,\n });\n\n syncHasDisplayDataRows(grid);\n latestEventHandlersRef.current?.onRowUndelete?.(grid, row as OwpTreeGridRowModel<T>);\n });\n window.TGSetEvent('OnGetDefaultColor', id, (grid, row, col) => {\n if (!highlightEditableCellsRef.current || !isDisplayTreeGridRow(row)) {\n return undefined;\n }\n\n return getEditableTreeGridCellDefaultColor(\n grid,\n row,\n col,\n editableCellBackgroundColorValueRef.current,\n );\n });\n window.TGSetEvent('OnGetColor', id, (grid, row, col, r, g, b, type) => {\n if (type) {\n return undefined;\n }\n\n return resolveTreeGridStateBackgroundColor({\n grid,\n row,\n col,\n r,\n g,\n b,\n focusedCellBackgroundColor: focusedCellBackgroundColorRef.current,\n selectedCellBackgroundColor: selectedCellBackgroundColorRef.current,\n hoverCellBackgroundColor: hoverCellBackgroundColorRef.current,\n changedCellBackgroundColor: changedCellBackgroundColorRef.current,\n editableCellBackgroundColorValue: editableCellBackgroundColorValueRef.current,\n });\n });\n window.TGSetEvent('OnGetClass', id, (grid, row, col, className) => {\n const baseClassName = typeof className === 'string' ? className : '';\n\n return resolveTreeGridCellDisplayClass(grid, row, col, baseClassName);\n });\n window.TGSetEvent('OnAfterValueChanged', id, (grid, row, col, value) => {\n hideErrorTooltip();\n\n if (highlightChangedCellsRef.current && isDisplayTreeGridRow(row)) {\n const shouldRefreshChangedCellHighlight =\n !isTreeGridNativeInputEditType(grid, row, col) ||\n (isTreeGridSelectedCellState(grid, row, col) &&\n !isTreeGridFocusedCellState(grid, row, col));\n\n syncTreeGridChangedCellHighlight({\n gridId: id,\n grid,\n row,\n col,\n backgroundColor: changedCellBackgroundColorRef.current,\n baselineMap: changedCellBaselineRef.current,\n highlightRefresh: shouldRefreshChangedCellHighlight,\n });\n }\n\n const valueChangedHandler =\n latestEventHandlersRef.current?.onAfterValueChanged ??\n latestEventHandlersRef.current?.onRowChange;\n\n valueChangedHandler?.(grid, row as OwpTreeGridRowModel<T>, col, value);\n });\n const notifyTreeGridSelectionChange = debounce((grid: TGrid) => {\n const selectedRows = (grid.GetSelRows() ?? []) as OwpTreeGridSelectedRows<T>;\n const resolvedSelectedRows = resolveTreeGridSelectedRows<T>(grid, selectedRows, {\n selectionScope: latestSelectionScopeRef.current,\n });\n\n latestEventHandlersRef.current?.onSelect?.(\n normalizeTreeGridExternalRows<T>(grid, resolvedSelectedRows),\n );\n }, 100);\n\n window.TGSetEvent('OnSelect', id, (grid, _row, _deselect, _cols, test) => {\n if (test) {\n return undefined;\n }\n\n const selectedRowSpanRows = getTreeGridSelectedRowSpanRows(grid);\n\n scheduleTreeGridSelectionChangedClassRefresh(grid, _row);\n scheduleTreeGridAddedRowBoxRowsRefresh(grid, [_row]);\n scheduleTreeGridRowsRefresh(grid, selectedRowSpanRows);\n scheduleTreeGridSelectionRowSpanRefresh(grid, _row);\n scheduleTreeGridSelectionPanelStateSync(grid, id);\n\n if (typeof latestEventHandlersRef.current?.onSelect === 'function') {\n notifyTreeGridSelectionChange(grid);\n }\n\n return undefined;\n });\n window.TGSetEvent('OnSelectAll', id, (grid, _select, _type, test) => {\n if (test) {\n return undefined;\n }\n\n scheduleTreeGridSelectionRowSpanRefreshAll(grid);\n scheduleTreeGridAddedRowBoxRowsRefreshAll(grid);\n scheduleTreeGridSelectionPanelStateSync(grid, id);\n\n if (typeof latestEventHandlersRef.current?.onSelect === 'function') {\n notifyTreeGridSelectionChange(grid);\n }\n\n return undefined;\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 window.TGSetEvent('OnSort', id, (grid, col) => {\n if (\n !col ||\n !isTreeGridGroupHeaderSortButtonTarget(\n grid,\n grid.ARow,\n col,\n latestHideChildHeaderSortButtonsRef.current !== false,\n )\n ) {\n return undefined;\n }\n\n countTreeGridPerf(id, 'group header sort blocked');\n logTreeGridPerf(id, 'group header sort blocked', {\n rowId: grid.ARow?.id,\n col,\n });\n\n return -1;\n });\n window.TGSetEvent('OnSortFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnFilterFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnGroupFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnSearchFinish', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n });\n window.TGSetEvent('OnRenderStart', id, (grid) => {\n clearTreeGridSelectionRowSpanAnchorRowMap(grid);\n syncTreeGridSelectionPanelState(grid, id);\n applyTreeGridGroupHeaderSortButtonAttributes(\n grid,\n id,\n false,\n latestHideChildHeaderSortButtonsRef.current !== false,\n );\n });\n window.TGSetEvent('OnRenderFinish', id, (grid) => {\n syncTreeGridSelectionPanelState(grid, id);\n });\n window.TGSetEvent('OnDataGet', id, (_grid, source, data) => {\n if (source?.Name === 'Layout' && typeof data === 'string') {\n layoutHasExplicitEnterModeRef.current = hasTreeGridExplicitEnterMode(data);\n const nextData = applyTreeGridDefaultLayout(\n data,\n latestDisabledAnimationsRef.current,\n latestToolbarTotalCountFormulaRef.current,\n latestSuppressCfgRef.current,\n );\n\n return nextData === data ? null : nextData;\n }\n\n return null;\n });\n window.TGSetEvent('OnDataParse', id, (_grid, source, data) => {\n if (source?.Name === 'Layout' && typeof data === 'string') {\n layoutHasExplicitEnterModeRef.current = hasTreeGridExplicitEnterMode(data);\n const nextData = applyTreeGridDefaultLayout(\n data,\n latestDisabledAnimationsRef.current,\n latestToolbarTotalCountFormulaRef.current,\n latestSuppressCfgRef.current,\n );\n\n return nextData === data ? null : nextData;\n }\n\n return null;\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 if (\n !layoutHasExplicitEnterModeRef.current &&\n (grid.EnterMode === undefined || grid.EnterMode === null || grid.EnterMode === 0)\n ) {\n applyTreeGridDefaultEnterMode(grid, TREE_GRID_DEFAULT_ENTER_MODE);\n }\n applyTreeGridLayoutToGrid(grid, latestLayoutOverrides);\n treeGridInstanceRef.current = grid;\n appliedLayoutOverridesRef.current = latestLayoutOverrides;\n appliedBodyDataPropRef.current = getTreeGridBodyData(grid) as OwpTreeGridBodyData<T>;\n changedCellBaselineRef.current = new WeakMap();\n captureTreeGridChangeBaselines(grid, changedCellBaselineRef.current);\n syncHasDisplayDataRows(grid);\n setIsTreeGridReady(true);\n applyTreeGridGroupHeaderSortButtonAttributes(\n grid,\n id,\n true,\n latestHideChildHeaderSortButtonsRef.current !== false,\n );\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"],"names":["TREE_GRID_BINDING_LOADING_MIN_VISIBLE_MS","TREE_GRID_DEFAULT_ENTER_MODE","TREE_GRID_DEFAULT_ENTER_ACTIONS","TREE_GRID_READONLY_HOVER_CELL_RGB","TREE_GRID_READONLY_NO_FOCUS_HOVER_CELL_RGB","TREE_GRID_PREVIEW_CELL_RGB","TREE_GRID_PREVIEW_CELL_SOFT_RGB","TREE_GRID_PREVIEW_CELL_DIM_RGB","TREE_GRID_NATIVE_ERROR_CELL_RGB_VALUES","TREE_GRID_ERROR_CELL_FALLBACK_BACKGROUND_COLOR","TREE_GRID_GROUP_HEADER_BUTTON_ATTRIBUTE","TREE_GRID_ROW_BOX_EXCLUDED_COLUMNS","TREE_GRID_CELL_CHANGED_CLASS_TOKENS","TREEGRID_CELL_CHANGED_CLASS","TREE_GRID_NATIVE_INPUT_EDIT_TYPES","hasTreeGridExplicitEnterMode","__name","layoutData","TREE_GRID_DELETE_PANEL_DEFAULT_ATTRIBUTES","TREE_GRID_PANEL_SPANNED_DEFAULT_ATTRIBUTES","TREE_GRID_CELL_CLICK_FOCUS_DEFAULT_ACTIONS","TREE_GRID_SELECT_ALL_PANEL_DEFAULT_ACTIONS","TREE_GRID_SELECTION_ROW_SPAN_COLUMN","TREE_GRID_TOOLBAR_FORMULA_FIELD_NAMES","TREE_GRID_XML_GRID_OPEN_TAG_PATTERN","TREE_GRID_XML_GRID_CLOSE_TAG_PATTERN","TREE_GRID_XML_TOOLBAR_TAG_PATTERN","TREE_GRID_DEFAULT_LAYOUT_CFG_ATTRIBUTES","TREE_GRID_DISABLED_ANIMATION_ATTRIBUTES","treeGridAddedRowBoxColumnBoundsCache","isTreeGridJsonRecord","value","isTreeGridDisabledConfigValue","isTreeGridExplicitEnabledConfigValue","isTreeGridExplicitHiddenConfigValue","isTreeGridConfigValue","expectedValue","isTreeGridCheckboxSelectionMode","selecting","selectingSingle","getTreeGridJsonCfgRecords","cfg","getTreeGridJsonCfgValue","fieldName","fieldValue","getTreeGridXmlTagAttributeValue","tag","attributeName","attributeMatch","hasTreeGridXmlTagAttribute","escapeTreeGridXmlAttributeValue","appendTreeGridXmlTagAttribute","attributeValue","insertionIndex","setTreeGridXmlTagAttribute","setTreeGridXmlTagAttributes","attributes","nextTag","appendMissingTreeGridXmlTagAttributes","scanTreeGridXmlDefaultLayout","tagPattern","scanResult","tagMatch","rootDepth","isInsideGrid","currentTagName","_a","isClosingTag","isSelfClosingTag","isTreeGridXmlDefaultPanelTag","panelName","getLeadingTreeGridXmlHeaderTags","headContent","childTagPattern","headerTags","childTagMatch","applyTreeGridXmlHeadPanelRowSpanDefault","firstHeaderTag","remainingHeaderTags","nextHeaderTag","getTreeGridXmlPanelSpannedInsertionIndex","isTreeGridXmlPanelSpannedDefaultLayout","isTreeGridXmlSelectingLayout","isTreeGridXmlDeletePanelDefaultLayout","applyTreeGridXmlDefaultPanelSpannedLayout","panelTag","nextPanelTag","applyTreeGridDefaultHeaderPanelRowSpanLayout","isPanelRowSpanApplied","nextLayoutData","matchedHead","headOpenTag","headCloseTag","result","isTreeGridJsonCheckboxSelectionLayout","isTreeGridXmlCheckboxSelectionLayout","cfgValues","getTreeGridXmlCellClickActionInsertionIndex","applyTreeGridXmlDefaultCellClickActionLayout","actionsTag","nextActionsTag","getTreeGridXmlSelectAllPanelActionInsertionIndex","applyTreeGridXmlDefaultSelectAllPanelActionLayout","getTreeGridXmlDeletePanelInsertionIndex","applyTreeGridXmlDefaultDeletePanelLayout","applyTreeGridXmlDefaultFastPanelLayout","applyTreeGridJsonFastPanelDefault","item","applyTreeGridJsonSelectAllPanelActionDefault","actions","applyTreeGridJsonCellClickActionDefault","applyTreeGridJsonDefaultCellClickActionLayout","parsedLayoutData","applyTreeGridDefaultCellClickActionLayout","xmlScanResult","trimmedLayoutData","applyTreeGridJsonDefaultSelectAllPanelActionLayout","applyTreeGridDefaultSelectAllPanelActionLayout","applyTreeGridJsonDefaultSuppressCfgLayout","suppressCfg","cfgRecords","applyTreeGridXmlDefaultSuppressCfgLayout","cfgTag","nextCfgTag","applyTreeGridDefaultSuppressCfgLayout","hasTreeGridToolbarFormulaField","layoutRecord","getTreeGridJsonToolbarRecords","toolbar","solid","toolbarRecords","solidToolbarRecords","applyTreeGridJsonDefaultToolbarTotalCountLayout","toolbarTotalCountFormula","hasTreeGridXmlToolbarFormulaAttribute","toolbarTag","applyTreeGridXmlDefaultToolbarTotalCountLayout","toolbarMatch","nextToolbarTag","gridCloseMatch","gridOpenMatch","applyTreeGridDefaultToolbarTotalCountLayout","applyTreeGridJsonDefaultFastPanelLayout","applyTreeGridDefaultFastPanelLayout","getTreeGridDisabledAnimationAttributes","disabledAnimations","animation","applyTreeGridJsonDisabledAnimationsLayout","animations","firstAnimations","createTreeGridDisabledAnimationsTag","applyTreeGridXmlDisabledAnimationsLayout","animationsTag","nextAnimationsTag","applyTreeGridDisabledAnimationsLayout","applyTreeGridDefaultLayout","nextSelectAllPanelActionLayoutData","nextSelectAllXmlScanResult","nextCellClickActionLayoutData","nextXmlScanResult","getTreeGridWrapperElement","gridId","TREE_GRID_THEME_WRAPPER_CLASS","getTreeGridSelectAllState","grid","selectableRowCount","selectedRowCount","getTreeGridRows","row","isDisplayTreeGridRow","syncTreeGridSelectionPanelState","wrapperElement","isSelectingEnabled","isCheckboxSelectionMode","header","TREE_GRID_PANEL_CHECKBOX_SELECT_CLASS","TREE_GRID_SELECT_ALL_CHECKED_CLASS","TREE_GRID_SELECT_ALL_INDETERMINATE_CLASS","TREE_GRID_SELECT_ALL_UNCHECKED_CLASS","selectAllState","treeGridSelectionPanelStateSyncTimeouts","scheduleTreeGridSelectionPanelStateSync","activeTimeout","nextTimeout","applyTreeGridDefaultEnterMode","enterMode","actionConfig","mutableGrid","isTreeGridInlineUrl","url","treeGridInlineBlobUrlCache","resolveTreeGridInlineUrl","cachedUrl","meta","encodedData","match","mimeType","decodedData","bytes","index","blobUrl","appendNoCacheQuery","hashIndex","baseUrl","hashFragment","querySeparator","syncTreeGridDeletedRowState","options","canEdit","highlightColumns","highlightBackgroundColor","col","resolveTreeGridDataUrl","dataUrl","isTreeGridPromiseLike","applyTreeGridBeforeRowUndeleteAction","action","syncHasDisplayDataRows","buildTreeGridDataSource","useDataUrl","bodyData","isEmpty","buildTreeGridInitializationOptions","id","layoutUrl","width","height","languageId","getTreeGridTextResourceUrl","getTreeGridBodyData","get","parseTreeGridPositiveNumber","trimmedValue","numericValue","getTreeGridHeaderCellSpanAttribute","resolvedAttributeValue","isTreeGridGroupHeaderCell","addTreeGridHeaderButtonAttributeTarget","targets","targetCols","getTreeGridGroupHeaderSortButtonTargets","headerRows","cols","includeChildHeaderCells","rowIndex","colIndex","colSpan","childColEndIndex","childRowIndex","childRow","childColIndex","isTreeGridGroupHeaderSortButtonTarget","fixedRow","applyTreeGridGroupHeaderSortButtonAttributes","refreshRows","applyStartedAt","updatedRows","updatedCellCount","countTreeGridPerf","measureTreeGridPerf","getTreeGridBodyDataCount","isVisibleTreeGridRow","visible","isAddedTreeGridRow","added","getTreeGridColumnNames","isVisibleTreeGridColumn","column","resolveTreeGridColumnOrderValue","fallback","getTreeGridAddedRowBoxColumnBounds","cachedBounds","columnNameIndexes","columnName","columns","columnNameA","columnNameB","columnA","columnB","_b","indexA","indexB","sectionDiff","columnBounds","clearTreeGridAddedRowBoxColumnBounds","rows","treeGridSelectionRowSpanAnchorRowMaps","clearTreeGridSelectionRowSpanAnchorRowMap","getTreeGridRowSpanCount","rowRecord","rowSpanValue","rowSpan","createTreeGridSelectionRowSpanAnchorRowMap","anchorRowMap","anchorRow","anchorEndIndex","getTreeGridSelectionRowSpanAnchorRow","getTreeGridSelectionRowSpanRows","currentRow","rowOffset","getTreeGridSelectedRowSpanRows","targetRows","selectedRow","targetRow","captureTreeGridChangeBaselines","baselineMap","getTreeGridCellComparableValue","isTreeGridChangedFlag","hasOtherTreeGridChangedCells","clearTreeGridCellChangedState","isTreeGridRowAddedById","resolveTreeGridCellBaselineValue","baselineValues","syncTreeGridAddedRowChangedCellHighlight","backgroundColor","highlightRefresh","baselineValue","getTreeGridAddedRowBaselineValue","isHighlightedCell","getTreeGridAddedRowHighlightColumns","removeTreeGridAddedRowHighlightColumn","clearTreeGridCellHighlightById","appendTreeGridAddedRowHighlightColumn","highlightTreeGridCellById","syncTreeGridChangedCellHighlight","currentValue","isEditableTreeGridCell","getExplicitTreeGridCellColor","color","toTreeGridCssHexColor","hasExplicitTreeGridCellColor","isTreeGridFocusedCellState","focused","isTreeGridSelectedCellState","selected","anchorSelected","hasTreeGridChangedCellDisplayClass","className","classTokens","classToken","appendTreeGridSelectedChangedCellDisplayClass","TREE_GRID_SELECTED_CHANGED_CELL_CLASS","hasTreeGridChangedCellDisplayClassInRow","key","scheduleTreeGridSelectionChangedClassRefresh","scheduleTreeGridRowsRefresh","scheduleTreeGridSelectionRowSpanRefresh","scheduleTreeGridSelectionRowSpanRefreshAll","getEditableTreeGridCellDefaultColor","editableCellBackgroundColorValue","matchesTreeGridRgbColor","r","g","b","expected","isTreeGridNativeErrorBackgroundColor","expectedColor","getTreeGridCellError","hasTreeGridCellError","clearTreeGridRowErrors","hasError","getTreeGridMouseEventAnchorElement","event","target","targetElement","fallbackTargetElement","anchorTargetElement","cellElement","isChangedTreeGridRowOrCell","cellDisplayClass","isChangedCell","isTreeGridNativeInputEditType","isTreeGridReadonlyHoveredCellState","isTreeGridPreviewHoveredCellState","isTreeGridFocusedRowState","resolveTreeGridStateBackgroundColor","focusedCellBackgroundColor","selectedCellBackgroundColor","hoverCellBackgroundColor","changedCellBackgroundColor","isAddedRow","hasNativeErrorBackgroundColor","explicitCellColor","editableCellDefaultColor","TREEGRID_ADDED_ROW_BACKGROUND_COLOR","appendTreeGridClassToken","appendTreeGridErrorCellDisplayClass","TREE_GRID_ERROR_CELL_CLASS","appendTreeGridAddedRowBoxDisplayClass","nextClassName","TREE_GRID_ADDED_ROW_BOX_CELL_CLASS","TREE_GRID_ADDED_ROW_BOX_START_CLASS","TREE_GRID_ADDED_ROW_BOX_END_CLASS","resolveTreeGridCellDisplayClass","errorCellClassName","addedRowBoxClassName","selectedChangedCellClassName","isTreeGridAddedRowBoxDisplayRow","scheduleTreeGridAddedRowBoxRowsRefresh","scheduleTreeGridAddedRowBoxRowsRefreshAll","hasTreeGridDisplayDataRows","replaceTreeGridBodyData","onReloadFinish","currentDataConfig","bindTreeGridEvents","latestEventHandlersRef","layoutHasExplicitEnterModeRef","highlightEditableCellsRef","highlightChangedCellsRef","syncDeletedRowCanEditRef","editableCellBackgroundColorValueRef","changedCellBackgroundColorRef","focusedCellBackgroundColorRef","selectedCellBackgroundColorRef","hoverCellBackgroundColorRef","changedCellBaselineRef","treeGridInstanceRef","treeGridInitStartedAtRef","latestLayoutOverridesRef","latestToolbarTotalCountFormulaRef","latestSuppressCfgRef","latestHideChildHeaderSortButtonsRef","latestSelectionScopeRef","latestDisabledAnimationsRef","appliedLayoutOverridesRef","appliedBodyDataPropRef","hasAppliedInitialLayoutRef","setIsTreeGridReady","showErrorTooltip","hideErrorTooltip","initialEventHandlers","_orow","_ocol","message","anchorEl","_col","orow","tip","type","beforeRowUndeleteHandler","scheduleAction","debouncedRowClickHandler","debounce","x","y","internalResult","_c","_d","name","prefix","deleteType","addedRowHighlightColumns","shouldRefreshChangedCellHighlight","valueChangedHandler","notifyTreeGridSelectionChange","selectedRows","resolvedSelectedRows","resolveTreeGridSelectedRows","normalizeTreeGridExternalRows","_row","_deselect","_cols","test","selectedRowSpanRows","_select","_type","autoupdate","logTreeGridPerf","_grid","source","data","nextData","latestLayoutOverrides","applyTreeGridLayoutToGrid"],"mappings":"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"}