@owp/core 2.5.32 β†’ 2.5.34

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 (26) hide show
  1. package/dist/_virtual/index16.js +4 -4
  2. package/dist/_virtual/index17.js +4 -4
  3. package/dist/_virtual/index18.js +4 -4
  4. package/dist/_virtual/index19.js +4 -4
  5. package/dist/_virtual/index3.js +2 -2
  6. package/dist/_virtual/index4.js +2 -2
  7. package/dist/components/OwpPicker/OwpDatePicker.js +189 -185
  8. package/dist/components/OwpPicker/OwpDatePicker.js.map +1 -1
  9. package/dist/components/OwpPicker/internal/DatePickerInput.js +48 -45
  10. package/dist/components/OwpPicker/internal/DatePickerInput.js.map +1 -1
  11. package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js +351 -331
  12. package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js.map +1 -1
  13. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js +17 -16
  14. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js.map +1 -1
  15. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js +229 -222
  16. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.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/constants.js +1 -1
  20. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/constants.js +1 -1
  21. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/constants.js +1 -1
  22. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/index.js +1 -1
  23. 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
  24. package/dist/utils/treeGridUtil.js +1 -1
  25. package/dist/utils/treeGridUtil.js.map +1 -1
  26. package/package.json +1 -1
@@ -18,11 +18,11 @@ import { styled as te } from "@mui/material/styles";
18
18
  import z from "@mui/material/TextField";
19
19
  import ne from "@mui/material/Tooltip";
20
20
  import E from "@mui/material/Typography";
21
- import D from "../../../_virtual/index16.js";
22
- import re from "../../../_virtual/index17.js";
21
+ import D from "../../../_virtual/index17.js";
22
+ import re from "../../../_virtual/index18.js";
23
23
  import { clsx as B } from "../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js";
24
24
  import { useMemo as oe, useReducer as ie, useRef as T, useEffect as se } from "react";
25
- import W from "../../../_virtual/index18.js";
25
+ import W from "../../../_virtual/index19.js";
26
26
  import { useNavigate as ae } from "react-router-dom";
27
27
  import { toolbarToggleSx as le } from "./toggleStyles.js";
28
28
  import { OwpSvgIcon as w } from "../../../components/OwpSvgIcon/OwpSvgIcon.js";
@@ -1,6 +1,6 @@
1
1
  var Q = Object.defineProperty;
2
2
  var w = (k, D) => Q(k, "name", { value: D, configurable: !0 });
3
- import { __module as I } from "../../../../../_virtual/index3.js";
3
+ import { __module as I } from "../../../../../_virtual/index4.js";
4
4
  var F;
5
5
  function W() {
6
6
  return F ? I.exports : (F = 1, (function(k, D) {
@@ -1,6 +1,6 @@
1
1
  var f = Object.defineProperty;
2
2
  var t = (e, _) => f(e, "name", { value: _, configurable: !0 });
3
- import { __exports as r } from "../../../../../../../../_virtual/constants2.js";
3
+ import { __exports as r } from "../../../../../../../../_virtual/constants.js";
4
4
  var i;
5
5
  function E() {
6
6
  if (i) return r;
@@ -1,6 +1,6 @@
1
1
  var n = Object.defineProperty;
2
2
  var G = (r, t) => n(r, "name", { value: t, configurable: !0 });
3
- import { __exports as L } from "../../../../../../../../_virtual/constants3.js";
3
+ import { __exports as L } from "../../../../../../../../_virtual/constants2.js";
4
4
  var e;
5
5
  function o() {
6
6
  return e ? L : (e = 1, Object.defineProperty(L, "__esModule", {
@@ -1,6 +1,6 @@
1
1
  var o = Object.defineProperty;
2
2
  var r = (n, s) => o(n, "name", { value: s, configurable: !0 });
3
- import { __exports as e } from "../../../../../../../../_virtual/constants.js";
3
+ import { __exports as e } from "../../../../../../../../_virtual/constants3.js";
4
4
  var t;
5
5
  function _() {
6
6
  return t ? e : (t = 1, Object.defineProperty(e, "__esModule", {
@@ -1,6 +1,6 @@
1
1
  var O = Object.defineProperty;
2
2
  var C = (i, r) => O(i, "name", { value: r, configurable: !0 });
3
- import { __exports as o } from "../../../../../../../_virtual/index4.js";
3
+ import { __exports as o } from "../../../../../../../_virtual/index3.js";
4
4
  import { __require as c } from "./CODE39/index.js";
5
5
  import { __require as D } from "./CODE128/index.js";
6
6
  import { __require as d } from "./EAN_UPC/index.js";
@@ -1,6 +1,6 @@
1
1
  var c = Object.defineProperty;
2
2
  var a = (r, e) => c(r, "name", { value: e, configurable: !0 });
3
- import n from "../../../../../../_virtual/index19.js";
3
+ import n from "../../../../../../_virtual/index16.js";
4
4
  import m from "react-dom";
5
5
  import t from "react";
6
6
  import u from "./useWaitForDOMRef.js";
@@ -145,7 +145,7 @@ const X = ["Added", "Changed"], Q = ["OWP", "IPX"], g = /^H{1,2}(?::m{1,2})?(?::
145
145
  const r = (i = (s = e.Cols) == null ? void 0 : s[t.key]) == null ? void 0 : i.Caption;
146
146
  return r ? `${r}`.trim() : t.key;
147
147
  }, "getTreeGridRequiredCellLabel"), Ee = /* @__PURE__ */ l((e, t, r) => t.message ? t.message : (r ?? J)(e), "getTreeGridRequiredCellMessage"), Ce = /* @__PURE__ */ l((e) => e.trim() === "", "isBlankTreeGridRequiredCellValue"), me = /* @__PURE__ */ l((e, t, r) => {
148
- !t || r.focusFirstError === !1 || (e.Focus(t.row, t.col), r.startEditFirstError !== !1 && $(e, t.row, t.col) && e.StartEdit(t.row, t.col));
148
+ !t || r.focusFirstError === !1 || (e.Focus(t.row, t.col), r.startEditFirstError === !0 && $(e, t.row, t.col) && e.StartEdit(t.row, t.col));
149
149
  }, "focusFirstTreeGridRequiredCellError"), C = /* @__PURE__ */ l((e) => typeof e == "string" && g.test(e.trim()), "isTreeGridTimeDateFormat"), x = /* @__PURE__ */ l((e, t, r) => {
150
150
  var i;
151
151
  const n = t, s = (i = e.Cols) == null ? void 0 : i[r];
@@ -1 +1 @@
1
- {"version":3,"file":"treeGridUtil.js","sources":["../../src/utils/treeGridUtil.ts"],"sourcesContent":["import {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n} from '@/constants/treeGrid';\nimport { parseTreeGridXmlToJson } from '@/components/OwpTreeGrid/internal/treeGridLayout';\nimport {\n resolveTreeGridSelectedRows,\n type OwpTreeGridSelectedRowsResolveOptions,\n type OwpTreeGridSelectionScope,\n} from '@/components/OwpTreeGrid/internal/treeGridSelection';\nimport { emitTreeGridBodyRowsChanged } from '@/utils/internal/treeGridBodyRowsEvent';\nimport { isPlainObject } from 'es-toolkit';\nimport { get, isArray, isEmpty, lowerCase, without } from 'es-toolkit/compat';\n\nexport {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n};\n\ntype TreeGridInsertPosition = 'above' | 'below' | 'top' | 'last';\n\ntype TreeGridAddRowOptions<T> = {\n canSelect?: boolean;\n insertPosition?: TreeGridInsertPosition;\n parent?: TRow & T;\n anchorRow?: TRow & T;\n initialValues?: T;\n editableColumns?: readonly string[];\n};\n\ntype TreeGridColumnVisibilityOptions = {\n targetKey: string;\n canVisible: boolean;\n};\n\ntype TreeGridHighlightTargetOption = {\n row: TRow;\n col: string;\n backgroundColor?: string;\n refresh?: boolean;\n};\n\nexport type TreeGridSelectionScope = OwpTreeGridSelectionScope;\nexport type TreeGridSelectedRowsOptions = OwpTreeGridSelectedRowsResolveOptions;\n\nexport type TreeGridRequiredCellColumn =\n | string\n | {\n key: string;\n label?: string;\n message?: string;\n };\n\nexport type TreeGridRequiredCellMessageContext = {\n grid: TGrid;\n row: TRow;\n col: string;\n key: string;\n label: string;\n value: string;\n};\n\nexport type TreeGridRequiredCellValidationError = TreeGridRequiredCellMessageContext & {\n message: string;\n};\n\nexport type TreeGridRequiredCellTargetRow = 'added' | 'changed' | 'all';\n\ntype TreeGridRequiredCellsValidationBaseOptions = {\n targetRows?: TreeGridRequiredCellTargetRow | readonly TreeGridRequiredCellTargetRow[];\n rows?: readonly TRow[];\n messageFactory?: (context: TreeGridRequiredCellMessageContext) => string;\n focusFirstError?: boolean;\n startEditFirstError?: boolean;\n refresh?: boolean;\n};\n\nexport type TreeGridRequiredCellsValidationOptions =\n TreeGridRequiredCellsValidationBaseOptions &\n (\n | {\n editableOnly: true;\n columns?: readonly TreeGridRequiredCellColumn[];\n }\n | {\n columns: readonly TreeGridRequiredCellColumn[];\n editableOnly?: boolean;\n }\n );\n\nexport type TreeGridRequiredCellsValidationResult = {\n valid: boolean;\n errors: TreeGridRequiredCellValidationError[];\n firstError?: TreeGridRequiredCellValidationError;\n};\n\ntype NormalizedTreeGridRequiredCellColumn = {\n key: string;\n label?: string;\n message?: string;\n};\n\ntype TreeGridAddedRowMetadata = TRow & {\n [TREEGRID_ADDED_ROW_BY_ID_FLAG]?: boolean | number;\n [TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY]?: Record<string, string>;\n [TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?: Record<\n string,\n { className: unknown; color: unknown }\n >;\n};\n\ntype TreeGridChangeStatus = 'Added' | 'Changed';\ntype TreeGridChangedRow = Record<string, unknown>;\n\nconst TREEGRID_CHANGE_STATUSES: TreeGridChangeStatus[] = ['Added', 'Changed'];\nconst TREEGRID_DATA_KEY_PREFIXES = ['OWP', 'IPX'];\nconst TREEGRID_TIME_DATE_FORMAT_PATTERN = /^H{1,2}(?::m{1,2})?(?::s{1,2})?$/;\nconst TREEGRID_ADDED_ROW_BY_ID_FLAG = '__owpAddedByAddTreeGridRowById';\nconst TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY = '__owpAddedRowHighlightColumns';\nconst TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY = '__owpAddedRowInitialValueKeys';\nconst TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY = '__owpAddedRowBaselineValues';\nconst TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY = '__owpCellStyleBaselineValues';\nconst TREEGRID_ROW_SELECTED_KEY = 'Selected';\n\nconst DEFAULT_TREE_GRID_REQUIRED_CELL_MESSAGE_FACTORY = ({\n label,\n}: TreeGridRequiredCellMessageContext) => `${label} ν•„μˆ˜ μž…λ ₯`;\nconst DEFAULT_TREE_GRID_REQUIRED_CELL_TARGET_ROWS: readonly TreeGridRequiredCellTargetRow[] = [\n 'added',\n];\n\nconst normalizeTreeGridStringValues = (value: unknown) => {\n if (!isArray(value)) {\n return [];\n }\n\n return value.filter((item): item is string => typeof item === 'string' && item !== '');\n};\n\nconst normalizeTreeGridAddedRowHighlightColumns = normalizeTreeGridStringValues;\n\n/**\n * addTreeGridRowById 생성 ν–‰ λ§ˆν‚Ή\n * @param row λŒ€μƒ ν–‰\n */\nconst markTreeGridRowAddedById = (row: TRow | null | undefined) => {\n if (!row) {\n return;\n }\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BY_ID_FLAG] = 1;\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nexport const isTreeGridRowAddedById = (row: TRow | null | undefined) => {\n const addedById = (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_BY_ID_FLAG];\n\n return !!row && addedById !== 0 && addedById !== false && addedById !== undefined;\n};\n\n/**\n * TreeGrid μ‹ κ·œ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst isTreeGridAddedRow = (row: TRow | null | undefined) => {\n const added = (row as { Added?: unknown } | null)?.Added;\n\n return added === 1 || added === '1' || added === true || isTreeGridRowAddedById(row);\n};\n\n/**\n * TreeGrid μˆ˜μ • ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst isTreeGridChangedRow = (row: TRow | null | undefined) => {\n const changed = (row as { Changed?: unknown } | null)?.Changed;\n\n return !isTreeGridAddedRow(row) && (changed === 1 || changed === '1' || changed === true);\n};\n\n/**\n * TreeGrid μ‚­μ œ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst isTreeGridDeletedRow = (row: TRow | null | undefined) => {\n const deleted = (row as { Deleted?: unknown } | null)?.Deleted;\n\n return deleted === 1 || deleted === '1' || deleted === true;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ μ’…λ₯˜ μ •κ·œν™”\n * @param targetRows 검사 λŒ€μƒ ν–‰ μ’…λ₯˜\n */\nconst normalizeTreeGridRequiredCellTargetRows = (\n targetRows?: TreeGridRequiredCellsValidationOptions['targetRows'],\n) => {\n const normalizedTargetRows = isArray(targetRows)\n ? targetRows\n : targetRows\n ? [targetRows]\n : DEFAULT_TREE_GRID_REQUIRED_CELL_TARGET_ROWS;\n\n if (normalizedTargetRows.includes('all')) {\n return new Set<TreeGridRequiredCellTargetRow>(['all']);\n }\n\n return new Set<TreeGridRequiredCellTargetRow>(\n normalizedTargetRows.filter(\n (targetRow) => targetRow === 'added' || targetRow === 'changed',\n ),\n );\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n * @param targetRows 검사 λŒ€μƒ ν–‰ μ’…λ₯˜\n */\nconst shouldValidateTreeGridRequiredCellRow = (\n row: TRow,\n targetRows: Set<TreeGridRequiredCellTargetRow>,\n) => {\n if (isTreeGridDeletedRow(row)) {\n return false;\n }\n\n if (targetRows.has('all')) {\n return row.Kind === 'Data' || isTreeGridAddedRow(row);\n }\n\n return (\n (targetRows.has('added') && isTreeGridAddedRow(row)) ||\n (targetRows.has('changed') && isTreeGridChangedRow(row))\n );\n};\n\n/**\n * TreeGrid λͺ…μ‹œ ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst shouldValidateExplicitTreeGridRequiredCellRow = (row: TRow | null | undefined) => {\n return !!row && !isTreeGridDeletedRow(row) && (row.Kind === 'Data' || isTreeGridAddedRow(row));\n};\n\n/**\n * TreeGrid live ν–‰ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n */\nconst resolveLiveTreeGridRequiredCellRow = (grid: TGrid, row: TRow | null | undefined) => {\n if (!row) {\n return undefined;\n }\n\n if (typeof row.id !== 'string') {\n return row;\n }\n\n return (grid.Rows as unknown as Record<string, TRow | undefined>)?.[row.id] ?? row;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λͺ…μ‹œ ν–‰ λͺ©λ‘ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param rows λͺ…μ‹œ 검사 ν–‰ λͺ©λ‘\n */\nconst normalizeExplicitTreeGridRequiredCellRows = (\n grid: TGrid,\n rows: readonly TRow[],\n) => {\n const seenRows = new Set<TRow>();\n const normalizedRows: TRow[] = [];\n\n rows.forEach((row) => {\n const liveRow = resolveLiveTreeGridRequiredCellRow(grid, row);\n\n if (\n !shouldValidateExplicitTreeGridRequiredCellRow(liveRow) ||\n seenRows.has(liveRow)\n ) {\n return;\n }\n\n seenRows.add(liveRow);\n normalizedRows.push(liveRow);\n });\n\n return normalizedRows;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ λͺ©λ‘ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nconst getTreeGridRequiredCellRows = (\n grid: TGrid,\n options: TreeGridRequiredCellsValidationOptions,\n) => {\n if (options.rows !== undefined) {\n return normalizeExplicitTreeGridRequiredCellRows(grid, options.rows);\n }\n\n const targetRows = normalizeTreeGridRequiredCellTargetRows(options.targetRows);\n\n return Object.values(grid.Rows ?? {}).filter((row) =>\n shouldValidateTreeGridRequiredCellRow(row, targetRows),\n );\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ ν•˜μ΄λΌμ΄νŠΈ 컬럼 λˆ„μ \n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const appendTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n\n if (currentColumns.includes(col)) {\n return;\n }\n\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = [...currentColumns, col];\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ ν•˜μ΄λΌμ΄νŠΈ 컬럼 제거\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const removeTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n const nextColumns = currentColumns.filter((column) => column !== col);\n\n if (nextColumns.length) {\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = nextColumns;\n return;\n }\n\n delete targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY];\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ ν•˜μ΄λΌμ΄νŠΈ 컬럼 쑰회\n * @param row λŒ€μƒ ν–‰\n */\nexport const getTreeGridAddedRowHighlightColumns = (row: TRow | null | undefined) => {\n return normalizeTreeGridAddedRowHighlightColumns(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n};\n\n/**\n * TreeGrid μ…€ 비ꡐ κ°’ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const getTreeGridCellComparableValue = (\n grid: TGrid,\n row: TRow,\n col: string,\n) => {\n const cellType = grid.GetType?.(row, col) || grid.Cols?.[col]?.Type || '';\n const rawValue =\n grid.GetValue?.(row, col) ?? (row as unknown as Record<string, unknown>)[col];\n\n if (cellType === 'Enum' || cellType === 'Select') {\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n }\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null) {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 μ…€ fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ κΈ°μ€€κ°’ μ €μž₯\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n */\nconst markTreeGridAddedRowBaselineValues = (grid: TGrid, row: TRow) => {\n const baselineValues = Object.fromEntries(\n Object.keys(grid.Cols ?? {}).map((col) => [\n col,\n getTreeGridCellComparableValue(grid, row, col),\n ]),\n );\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY] = baselineValues;\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ κΈ°μ€€κ°’ 쑰회\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const getTreeGridAddedRowBaselineValue = (\n row: TRow | null | undefined,\n col: string,\n) => {\n return (row as TreeGridAddedRowMetadata | null)?.[\n TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY\n ]?.[col];\n};\n\n/**\n * TreeGrid μ…€ ν•˜μ΄λΌμ΄νŠΈ μ „ μŠ€νƒ€μΌ μ €μž₯\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst preserveTreeGridCellStyleBaseline = (grid: TGrid, row: TRow, col: string) => {\n const targetRow = row as TreeGridAddedRowMetadata;\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY] ??= {};\n\n if (targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col]) {\n return;\n }\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY][col] = {\n className: grid.GetAttribute(row, col, 'Class'),\n color: grid.GetAttribute(row, col, 'Color'),\n };\n};\n\n/**\n * TreeGrid μ…€ ν•˜μ΄λΌμ΄νŠΈ μ „ μŠ€νƒ€μΌ 쑰회\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst getTreeGridCellStyleBaseline = (row: TRow, col: string) => {\n return (row as TreeGridAddedRowMetadata)[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col];\n};\n\n/**\n * TreeGrid μ—‘μ…€ 내보내기 μœ ν‹Έ λ‘œλ”\n */\nconst loadExportTreeGridExcel = async () => {\n const { exportTreeGridExcel } = await import('./treeGridExportExcelUtil');\n\n return exportTreeGridExcel;\n};\n\n/**\n * TreeGrid 데이터 ν–‰ λͺ©λ‘ μΆ”μΆœ\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n */\nconst getDataRows = (grid: TGrid | undefined) => {\n return Object.values(grid?.Rows ?? {}).filter((item) => item.Kind === 'Data');\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 컬럼 μ„€μ • μ •κ·œν™”\n * @param columns ν•„μˆ˜ 컬럼 μ„€μ • λͺ©λ‘\n */\nconst normalizeTreeGridRequiredCellColumns = (\n columns?: readonly TreeGridRequiredCellColumn[],\n) => {\n if (!columns?.length) {\n return [];\n }\n\n return columns\n .map((column): NormalizedTreeGridRequiredCellColumn | null => {\n if (typeof column === 'string') {\n const key = column.trim();\n\n return key ? { key } : null;\n }\n\n if (!isPlainObject(column) || typeof column.key !== 'string') {\n return null;\n }\n\n const key = column.key.trim();\n\n if (!key) {\n return null;\n }\n\n return {\n key,\n label: typeof column.label === 'string' ? column.label.trim() : undefined,\n message: typeof column.message === 'string' ? column.message : undefined,\n };\n })\n .filter((column): column is NormalizedTreeGridRequiredCellColumn => !!column);\n};\n\n/**\n * TreeGrid μ…€ νŽΈμ§‘ κ°€λŠ₯ μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst isTreeGridEditableCell = (grid: TGrid, row: TRow, col: string) => {\n const canEdit = grid.CanEdit?.(row, col) as unknown;\n\n return canEdit === 1 || canEdit === '1' || canEdit === true;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 컬럼 λͺ©λ‘ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nconst getTreeGridRequiredCellColumns = (\n grid: TGrid,\n row: TRow,\n options: TreeGridRequiredCellsValidationOptions,\n) => {\n const requiredColumns = normalizeTreeGridRequiredCellColumns(options.columns);\n\n if (requiredColumns.length) {\n return requiredColumns.filter((column) => !!grid.Cols?.[column.key]);\n }\n\n if (!options.editableOnly) {\n return [];\n }\n\n return Object.keys(grid.Cols ?? {})\n .filter((col) => isVisibleTreeGridColumn(grid, col) && isTreeGridEditableCell(grid, row, col))\n .map((key) => ({ key }));\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 였λ₯˜ 라벨 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param column ν•„μˆ˜ 컬럼 μ„€μ •\n */\nconst getTreeGridRequiredCellLabel = (\n grid: TGrid,\n column: NormalizedTreeGridRequiredCellColumn,\n) => {\n if (column.label) {\n return column.label;\n }\n\n try {\n const caption = grid.GetCaption?.(column.key);\n\n if (caption) {\n return `${caption}`.trim();\n }\n } catch {\n // GetCaption 미지원 컬럼 fallback\n }\n\n const columnCaption = (grid.Cols?.[column.key] as { Caption?: unknown } | undefined)?.Caption;\n\n if (columnCaption) {\n return `${columnCaption}`.trim();\n }\n\n return column.key;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 였λ₯˜ λ©”μ‹œμ§€ 쑰회\n * @param context λ©”μ‹œμ§€ 생성 μ»¨ν…μŠ€νŠΈ\n * @param column ν•„μˆ˜ 컬럼 μ„€μ •\n * @param messageFactory λ©”μ‹œμ§€ 생성 ν•¨μˆ˜\n */\nconst getTreeGridRequiredCellMessage = (\n context: TreeGridRequiredCellMessageContext,\n column: NormalizedTreeGridRequiredCellColumn,\n messageFactory?: (context: TreeGridRequiredCellMessageContext) => string,\n) => {\n if (column.message) {\n return column.message;\n }\n\n return (messageFactory ?? DEFAULT_TREE_GRID_REQUIRED_CELL_MESSAGE_FACTORY)(context);\n};\n\n/**\n * TreeGrid ν•„μˆ˜κ°’ 곡백 μ—¬λΆ€\n * @param value 비ꡐ κ°’\n */\nconst isBlankTreeGridRequiredCellValue = (value: string) => value.trim() === '';\n\n/**\n * TreeGrid ν•„μˆ˜ 였λ₯˜ 포컀슀 반영\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param error 졜초 였λ₯˜\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nconst focusFirstTreeGridRequiredCellError = (\n grid: TGrid,\n error: TreeGridRequiredCellValidationError | undefined,\n options: TreeGridRequiredCellsValidationOptions,\n) => {\n if (!error || options.focusFirstError === false) {\n return;\n }\n\n grid.Focus(error.row, error.col);\n\n if (options.startEditFirstError !== false && isTreeGridEditableCell(grid, error.row, error.col)) {\n grid.StartEdit(error.row, error.col);\n }\n};\n\n/**\n * TreeGrid μ‹œκ°„ μ „μš© Date 포맷 μ—¬λΆ€\n * @param format TreeGrid λ‚ μ§œ 포맷\n */\nconst isTreeGridTimeDateFormat = (format: unknown) =>\n typeof format === 'string' && TREEGRID_TIME_DATE_FORMAT_PATTERN.test(format.trim());\n\n/**\n * TreeGrid μ‹œκ°„ μ „μš© Date 컬럼 μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst isTreeGridTimeDateColumn = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n const column = grid.Cols?.[col];\n\n return (\n column?.Type === 'Date' &&\n (isTreeGridTimeDateFormat(rowRecord[`${col}EditFormat`]) ||\n isTreeGridTimeDateFormat(rowRecord[`${col}Format`]) ||\n isTreeGridTimeDateFormat(column.EditFormat) ||\n isTreeGridTimeDateFormat(column.Format))\n );\n};\n\n/**\n * TreeGrid μ‹œκ°„ μ „μš© Date ν‘œμ‹œ κ°’ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst getTreeGridTimeDateDisplayValue = (grid: TGrid, row: TRow, col: string) => {\n const rawValue = (row as unknown as Record<string, unknown>)[col];\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null && `${displayValue}` !== '') {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 μ…€ fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * TreeGrid μ™ΈλΆ€ λ°˜ν™˜ ν–‰ Date μ‹œκ°„ κ°’ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n */\nconst normalizeTreeGridExternalRow = <T>(grid: TGrid, row: TRow & T) => {\n const normalizedRow = { ...row } as TRow & T;\n\n Object.keys(grid.Cols ?? {}).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, row, col)) {\n return;\n }\n\n (normalizedRow as Record<string, unknown>)[col] = getTreeGridTimeDateDisplayValue(grid, row, col);\n });\n\n return normalizedRow;\n};\n\n/**\n * TreeGrid μ™ΈλΆ€ λ°˜ν™˜ ν–‰ λͺ©λ‘ Date μ‹œκ°„ κ°’ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param rows λŒ€μƒ ν–‰ λͺ©λ‘\n */\nexport const normalizeTreeGridExternalRows = <T>(grid: TGrid, rows: Array<TRow & T>) =>\n rows.map((row) => normalizeTreeGridExternalRow(grid, row));\n\n/** TreeGrid λͺ…μ‹œ ν™œμ„± μ„€μ •κ°’ μ—¬λΆ€ */\nconst isTreeGridExplicitEnabledConfigValue = (value: unknown) =>\n value === 1 || value === true || value === '1' || value === 'true';\n\n/**\n * TreeGrid 단일 선택 λ ˆμ΄μ•„μ›ƒ μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n */\nconst isTreeGridSingleSelectionLayout = (grid: TGrid) =>\n isTreeGridExplicitEnabledConfigValue(grid.SelectingSingle);\n\n/**\n * μ‹ κ·œ ν–‰ 선택 μ΄ˆκΈ°κ°’ ν™œμ„± μ—¬λΆ€\n * @param initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n */\nconst isTreeGridSelectedInitialValue = <T>(initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return false;\n }\n\n return isTreeGridExplicitEnabledConfigValue(\n (initialValues as Record<string, unknown>)[TREEGRID_ROW_SELECTED_KEY],\n );\n};\n\n/**\n * μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’μ—μ„œ 선택 μƒνƒœ μ œμ™Έ\n * @param initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n */\nconst omitTreeGridSelectedInitialValue = <T>(initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return initialValues;\n }\n\n const initialValueRecord = initialValues as Record<string, unknown>;\n\n if (!(TREEGRID_ROW_SELECTED_KEY in initialValueRecord)) {\n return initialValues;\n }\n\n return Object.fromEntries(\n Object.entries(initialValueRecord).filter(\n ([key]) => key !== TREEGRID_ROW_SELECTED_KEY,\n ),\n ) as T;\n};\n\n/**\n * μ‹ κ·œ ν–‰ μΆ”κ°€ λŒ€μƒ 계산\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param options ν–‰ μΆ”κ°€ μ˜΅μ…˜\n */\nconst resolveRowInsertionTarget = <T>(grid: TGrid, options?: TreeGridAddRowOptions<T>) => {\n const insertPosition = options?.insertPosition ?? 'top';\n const parent = options?.parent;\n const anchorRow = options?.anchorRow;\n\n let resolvedParent = parent ?? (anchorRow ? anchorRow.parentNode : null) ?? grid.GetFirst();\n let next = null;\n\n switch (insertPosition) {\n case 'top':\n next = grid.GetFirst();\n break;\n\n case 'last':\n resolvedParent = grid.GetNext(grid.GetLast(), grid.RowCount > 0 ? grid.RowCount + 1 : 0);\n next = resolvedParent;\n break;\n\n case 'above':\n next = anchorRow ?? grid.GetFirst();\n break;\n\n case 'below':\n next = anchorRow?.nextSibling ?? grid.GetFirst();\n break;\n }\n\n return { resolvedParent, next };\n};\n\n/**\n * μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’ 반영\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row μƒμ„±λœ TreeGrid ν–‰\n * @param initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n */\nconst assignInitialRowValues = <T>(grid: TGrid, row: TRow, initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return;\n }\n\n const initialValueKeys = Object.keys(initialValues as Record<string, unknown>).filter(Boolean);\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY] = initialValueKeys;\n\n Object.entries(initialValues as Record<string, unknown>).forEach(([rowKey, rowValue]) => {\n if (grid.Cols?.[rowKey]?.Type === 'Date' && typeof rowValue === 'string') {\n grid.SetString(row, rowKey, rowValue, 0);\n return;\n }\n\n (row as unknown as Record<string, unknown>)[rowKey] = rowValue;\n });\n};\n\n/**\n * μ‹ κ·œ ν–‰ μ…€ λ‹¨μœ„ νŽΈμ§‘ κ°€λŠ₯ 컬럼 반영\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row μƒμ„±λœ TreeGrid ν–‰\n * @param editableColumns νŽΈμ§‘ κ°€λŠ₯ μ²˜λ¦¬ν•  컬럼 ν‚€ λͺ©λ‘\n */\nconst assignEditableAddedRowColumns = (\n grid: TGrid,\n row: TRow,\n editableColumns?: readonly string[],\n) => {\n const targetColumns = normalizeTreeGridStringValues(editableColumns);\n\n if (!targetColumns.length) {\n return;\n }\n\n const rowRecord = row as unknown as Record<string, unknown>;\n\n targetColumns.forEach((col) => {\n if (!grid.Cols?.[col]) {\n return;\n }\n\n rowRecord[`${col}CanEdit`] = 1;\n });\n};\n\n/**\n * λ³€κ²½ 데이터 컬럼 ν‚€ μ—¬λΆ€ 확인\n * @param key 컬럼 ν‚€\n */\nconst isTreeGridDataKey = (key: string) => {\n return TREEGRID_DATA_KEY_PREFIXES.some((prefix) => key.startsWith(prefix));\n};\n\n/**\n * TreeGrid 컬럼 데이터 ν‚€ μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param key 컬럼 ν‚€\n */\nconst isTreeGridColumnDataKey = (grid: TGrid | undefined, key: string) => {\n return !!grid?.Cols?.[key];\n};\n\n/**\n * TreeGrid μ—…λ‘œλ“œ κ°’ 포함 λŒ€μƒ μ—¬λΆ€\n * @param value μ—…λ‘œλ“œ κ°’\n */\nconst hasTreeGridUploadValue = (value: unknown) => {\n return value !== undefined && value !== null && value !== '';\n};\n\n/**\n * TreeGrid μˆ¨κΉ€ κ°’ μ—¬λΆ€\n * @param value Visible 속성값\n */\nconst isHiddenTreeGridValue = (value: unknown) => {\n return value === 0 || value === false || value === '0';\n};\n\n/**\n * TreeGrid ν‘œμ‹œ 컬럼 μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param key 컬럼 ν‚€\n */\nconst isVisibleTreeGridColumn = (grid: TGrid | undefined, key: string) => {\n return !isHiddenTreeGridValue(grid?.Cols?.[key]?.Visible);\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ μ΄ˆκΈ°κ°’ ν‚€ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n * @param key 컬럼 ν‚€\n */\nconst isTreeGridAddedRowInitialValueKey = (row: TRow | null | undefined, key: string) => {\n return normalizeTreeGridStringValues(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY],\n ).includes(key);\n};\n\n/**\n * TreeGrid λ³€κ²½ ν–‰ 원본 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row TreeGrid λ³€κ²½ ν–‰ 데이터\n */\nconst getLiveTreeGridChangedRow = (grid: TGrid | undefined, row: TreeGridChangedRow) => {\n return typeof row.id === 'string'\n ? (grid?.Rows as unknown as Record<string, TRow> | undefined)?.[row.id]\n : null;\n};\n\n/**\n * λ³€κ²½ ν–‰ 데이터 ν‚€ 포함 μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row TreeGrid λ³€κ²½ ν–‰ 데이터\n * @param key 컬럼 ν‚€\n * @param includeAddedInitialValues μΆ”κ°€ ν–‰ μ΄ˆκΈ°κ°’ ν‚€ 포함 μ—¬λΆ€\n */\nconst shouldIncludeTreeGridChangeDataKey = (\n grid: TGrid | undefined,\n row: TreeGridChangedRow,\n key: string,\n includeAddedInitialValues = false,\n) => {\n if (!hasTreeGridUploadValue(row[key])) {\n return false;\n }\n\n if (isTreeGridColumnDataKey(grid, key)) {\n return true;\n }\n\n if (isTreeGridDataKey(key)) {\n return true;\n }\n\n return (\n includeAddedInitialValues &&\n isTreeGridAddedRowInitialValueKey(getLiveTreeGridChangedRow(grid, row), key)\n );\n};\n\n/**\n * TreeGrid λ³€κ²½ ν–‰ 데이터 μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row TreeGrid λ³€κ²½ ν–‰ 데이터\n * @param excludedKeys μ œμ™Έν•  μƒνƒœ ν‚€ λͺ©λ‘\n * @param includeAddedInitialValues μΆ”κ°€ ν–‰ μ΄ˆκΈ°κ°’ ν‚€ 포함 μ—¬λΆ€\n */\nconst normalizeTreeGridChangeRow = <T>(\n grid: TGrid | undefined,\n row: TreeGridChangedRow,\n excludedKeys: string[],\n includeAddedInitialValues = false,\n) => {\n return Object.fromEntries(\n without(Object.keys(row), ...excludedKeys)\n .filter((key) =>\n shouldIncludeTreeGridChangeDataKey(grid, row, key, includeAddedInitialValues),\n )\n .map((key) => [key, row[key]]),\n ) as T;\n};\n\n/**\n * λ³€κ²½ μƒνƒœλ³„ ν–‰ 데이터 λ°˜ν™˜\n * @param rows TreeGrid λ³€κ²½ ν–‰ λͺ©λ‘\n * @param status μ‘°νšŒν•  λ³€κ²½ μƒνƒœ\n */\nconst getChangedRowsByStatus = <T>(\n grid: TGrid | undefined,\n rows: TreeGridChangedRow[],\n status: TreeGridChangeStatus,\n) => {\n return rows\n .filter((row) => get(row, status) === '1' && row.Deleted !== '1')\n .map((row) =>\n status === 'Changed'\n ? normalizeTreeGridChangeRow<T>(grid, row, ['id', 'Changed'])\n : normalizeTreeGridChangeRow<T>(grid, row, ['id'], true),\n )\n .filter((row) => !isEmpty(row));\n};\n\n/**\n * TreeGrid λ³€κ²½ ν–‰ Date μ‹œκ°„ κ°’ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param rows λ³€κ²½ ν–‰ λͺ©λ‘\n */\nconst normalizeTreeGridChangedRows = (grid: TGrid | undefined, rows: TreeGridChangedRow[]) => {\n if (!grid) {\n return rows;\n }\n\n return rows.map((row) => {\n const liveRow =\n typeof row.id === 'string'\n ? (grid.Rows as unknown as Record<string, TRow>)[row.id]\n : null;\n\n if (!liveRow) {\n return row;\n }\n\n const normalizedRow = { ...row };\n\n Object.keys(row).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, liveRow, col)) {\n return;\n }\n\n normalizedRow[col] = getTreeGridTimeDateDisplayValue(grid, liveRow, col);\n });\n\n return normalizedRow;\n });\n};\n\n/**\n * TreeGrid ν™œμ„± νŽΈμ§‘ μ…€ κ°’ ν™•μ •\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n */\nconst commitTreeGridActiveEdit = (grid: TGrid | undefined) => {\n try {\n grid?.EndEdit?.(1);\n } catch {\n // νŽΈμ§‘ λ―Έμ§„μž… λ˜λŠ” ν™•μ • λΆˆκ°€ μƒνƒœ fallback\n }\n};\n\n/**\n * TreeGrid μΈμŠ€ν„΄μŠ€ ID 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const getTreeGridById = (gridId: string) => {\n return Grids[gridId];\n};\n\n/**\n * TreeGrid 데이터 ν–‰ λͺ©λ‘ 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const getTreeGridDataRowsById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n return grid ? (normalizeTreeGridExternalRows<T>(grid, getDataRows(grid) as Array<TRow & T>) as T) : [];\n};\n\n/**\n * TreeGrid Body 데이터 ꡐ체 ν›„ μž¬λ‘œλ“œ\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param rows μƒˆλ‘œ λ°˜μ˜ν•  ν–‰ 데이터\n */\nexport const reloadTreeGridBodyById = (gridId: string, rows: unknown) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n // @ts-expect-error - Data property not defined in type\n const currentData = grid.Data.Data;\n\n // @ts-expect-error - Data property not defined in type\n grid.Data.Data = {\n ...currentData,\n Data: { Body: [rows || []] },\n Url: '',\n };\n grid.ReloadBody();\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * 행을 νŠΉμ • μœ„μΉ˜μ— μΆ”κ°€\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options.canSelect ν–‰ 선택 κ°€λŠ₯ μ—¬λΆ€\n * @param options.parent λΆ€λͺ¨ ν–‰\n * @param options.anchorRow above/below용 κΈ°μ€€ ν–‰\n * @param options.insertPosition ν–‰ μ‚½μž… μœ„μΉ˜\n * @param options.initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n * @param options.editableColumns μ‹ κ·œ ν–‰ μ…€ λ‹¨μœ„ νŽΈμ§‘ κ°€λŠ₯ 컬럼\n */\nexport const addTreeGridRowById = <T>(\n gridId: string,\n options?: TreeGridAddRowOptions<T>,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const canSelect = options?.canSelect;\n const initialValues = options?.initialValues;\n const editableColumns = options?.editableColumns;\n const isSingleSelectionLayout = isTreeGridSingleSelectionLayout(grid);\n const shouldResetSelection = !!canSelect && isSingleSelectionLayout;\n const shouldSelectAddedRow =\n shouldResetSelection && isTreeGridSelectedInitialValue(initialValues);\n const resolvedInitialValues = shouldSelectAddedRow\n ? omitTreeGridSelectedInitialValue(initialValues)\n : initialValues;\n\n if (shouldResetSelection) {\n resetTreeGridSelectionById(gridId);\n }\n\n const { resolvedParent, next } = resolveRowInsertionTarget(grid, options);\n\n const newRow = grid.AddRow(resolvedParent, next, 1);\n\n markTreeGridRowAddedById(newRow);\n assignInitialRowValues(grid, newRow, resolvedInitialValues);\n markTreeGridAddedRowBaselineValues(grid, newRow);\n\n newRow.CanEdit = 1;\n newRow.CanDelete = 1;\n newRow.CanSelect = canSelect ? 1 : 0;\n assignEditableAddedRowColumns(grid, newRow, editableColumns);\n\n if (shouldSelectAddedRow) {\n grid.SelectRow(newRow, 1);\n }\n\n grid.Focus(newRow);\n grid.RefreshRow(newRow);\n grid.Calculate(1, 1);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * TreeGrid ν•„μˆ˜ μ…€ Error 검증\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nexport const validateTreeGridRequiredCellsById = (\n gridId: string,\n options: TreeGridRequiredCellsValidationOptions,\n): TreeGridRequiredCellsValidationResult => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return { valid: false, errors: [] };\n }\n\n const rows = getTreeGridRequiredCellRows(grid, options);\n const errors: TreeGridRequiredCellValidationError[] = [];\n const refresh = options.refresh === false ? 0 : 1;\n\n rows.forEach((row) => {\n getTreeGridRequiredCellColumns(grid, row, options).forEach((column) => {\n const col = column.key;\n const value = getTreeGridCellComparableValue(grid, row, col);\n const label = getTreeGridRequiredCellLabel(grid, column);\n const context = {\n grid,\n row,\n col,\n key: col,\n label,\n value,\n };\n\n if (!isBlankTreeGridRequiredCellValue(value)) {\n grid.SetAttribute(row, col, 'Error', '', refresh);\n return;\n }\n\n const message = getTreeGridRequiredCellMessage(\n context,\n column,\n options.messageFactory,\n );\n const error = { ...context, message };\n\n grid.SetAttribute(row, col, 'Error', message, refresh);\n errors.push(error);\n });\n });\n\n const firstError = errors[0];\n\n focusFirstTreeGridRequiredCellError(grid, firstError, options);\n\n return {\n valid: !firstError,\n errors,\n firstError,\n };\n};\n\n/**\n * TreeGrid μΆ”κ°€/μˆ˜μ • 데이터 ν–‰ 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const getTreeGridRowChangesById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n commitTreeGridActiveEdit(grid);\n\n const changesData = parseTreeGridXmlToJson(grid?.GetXmlData('changes,allcols,nogrid,noio'));\n\n if (!isArray(changesData)) {\n return { added: [], changed: [] };\n }\n\n return Object.fromEntries(\n TREEGRID_CHANGE_STATUSES.map((status) => [\n lowerCase(status),\n getChangedRowsByStatus<T>(\n grid,\n normalizeTreeGridChangedRows(grid, changesData as TreeGridChangedRow[]),\n status,\n ),\n ]),\n ) as { added: T[]; changed: T[] };\n};\n\n/**\n * TreeGrid 데이터 μ—‘μ…€ 내보내기\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param title λ‹€μš΄λ‘œλ“œ 파일λͺ…\n */\nexport const exportTreeGridToExcelById = (gridId: string, title?: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n void loadExportTreeGridExcel().then((exportTreeGridExcel) =>\n exportTreeGridExcel(grid, { exportName: title ?? '' }),\n );\n};\n\n/**\n * TreeGrid ν˜„μž¬ 선택 ν–‰ λͺ©λ‘ 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options 선택 ν–‰ λ°˜ν™˜ μ˜΅μ…˜\n */\nexport const getTreeGridSelectedRowsById = <T>(\n gridId: string,\n options?: TreeGridSelectedRowsOptions,\n) => {\n const grid = getTreeGridById(gridId);\n\n const selectedRows = grid?.GetSelRows();\n\n if (!grid || !selectedRows) {\n return [];\n }\n\n const resolvedSelectedRows = resolveTreeGridSelectedRows<T>(\n grid,\n selectedRows as Array<TRow & T>,\n options,\n );\n\n return normalizeTreeGridExternalRows<T>(grid, resolvedSelectedRows) as T;\n};\n\n/**\n * TreeGrid 컬럼 ν‘œμ‹œ μ—¬λΆ€ λ³€κ²½\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options.targetKey ν‘œμ‹œ μƒνƒœλ₯Ό λ³€κ²½ν•  컬럼 ν‚€\n * @param options.canVisible 컬럼 ν‘œμ‹œ μ—¬λΆ€\n */\nexport const setTreeGridColumnVisibilityById = (\n gridId: string,\n options: TreeGridColumnVisibilityOptions,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid || !options?.targetKey) {\n return;\n }\n\n const targetKey = options?.targetKey;\n const canVisible = options?.canVisible;\n\n if (canVisible) {\n grid.ShowCol(targetKey);\n return;\n }\n grid.HideCol(targetKey);\n};\n\n/**\n * νŠΉμ • μ…€ κ°•μ‘° μŠ€νƒ€μΌ 적용\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param targetOption.row κ°•μ‘°ν•  λŒ€μƒ ν–‰\n * @param targetOption.col κ°•μ‘°ν•  λŒ€μƒ 컬럼\n * @param targetOption.refresh κ°•μ‘° 적용 ν›„ μ…€ refresh μ—¬λΆ€\n */\nexport const highlightTreeGridCellById = (\n gridId: string,\n targetOption: TreeGridHighlightTargetOption,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n preserveTreeGridCellStyleBaseline(grid, row, col);\n grid.SetValue(row, `${col}Class`, TREEGRID_CELL_CHANGED_CLASS);\n grid.SetValue(row, `${col}Color`, targetOption.backgroundColor ?? TREEGRID_CELL_HIGHLIGHT_COLOR);\n\n if (targetOption.refresh !== false) {\n grid.RefreshCell(row, col);\n }\n};\n\n/**\n * νŠΉμ • μ…€ κ°•μ‘° μŠ€νƒ€μΌ 제거\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param targetOption.row κ°•μ‘° ν•΄μ œ λŒ€μƒ ν–‰\n * @param targetOption.col κ°•μ‘° ν•΄μ œ λŒ€μƒ 컬럼\n */\nexport const clearTreeGridCellHighlightById = (\n gridId: string,\n targetOption: Pick<TreeGridHighlightTargetOption, 'row' | 'col'>,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n const styleBaseline = getTreeGridCellStyleBaseline(row, col);\n\n grid.SetValue(row, `${col}Class`, styleBaseline?.className ?? '');\n grid.SetValue(row, `${col}Color`, styleBaseline?.color ?? '');\n grid.RefreshCell(row, col);\n};\n\n/**\n * TreeGrid ν˜„μž¬ 선택 μƒνƒœ 전체 ν•΄μ œ\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const resetTreeGridSelectionById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionDeselectAll(1, 0);\n};\n\n/**\n * μ—¬λŸ¬ TreeGrid 선택 μƒνƒœ 전체 ν•΄μ œ\n * @param gridIds TreeGrid μΈμŠ€ν„΄μŠ€ ID λͺ©λ‘\n */\nexport const resetTreeGridSelectionsByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridSelectionById);\n};\n\n/**\n * TreeGrid λ³€κ²½ 사항 및 선택 μƒνƒœ μ΄ˆκΈ°ν™”\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const resetTreeGridChangesById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionUndoAll(1, 0);\n resetTreeGridSelectionById(gridId);\n grid.Calculate(1, 1);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * μ—¬λŸ¬ TreeGrid λ³€κ²½ 사항 및 선택 μƒνƒœ μ΄ˆκΈ°ν™”\n * @param gridIds TreeGrid μΈμŠ€ν„΄μŠ€ ID λͺ©λ‘\n */\nexport const resetTreeGridChangesByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridChangesById);\n};\n\n/**\n * TreeGrid Enum 컬럼 μ˜΅μ…˜ 반영\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param columnName Enum을 μ μš©ν•  컬럼λͺ…\n * @param options Enum μ˜΅μ…˜ λͺ©λ‘\n * @param valueKey Enum κ°’μœΌλ‘œ μ‚¬μš©ν•  ν•„λ“œλͺ…\n * @param labelKeys Enum 라벨둜 μ‚¬μš©ν•  ν•„λ“œ μš°μ„ μˆœμœ„ λͺ©λ‘\n */\nexport const setTreeGridColumnEnumOptionsById = <T extends object>(\n gridId: string,\n columnName: string,\n options: T[] | undefined,\n valueKey: keyof T & string,\n labelKeys: Array<keyof T & string>,\n) => {\n if (!options?.length) {\n return;\n }\n\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const enumValues = options\n .map((item) => {\n const option = item as Record<string, unknown>;\n const labelValue = labelKeys\n .map((labelKey) => option[labelKey])\n .find((value) => value !== undefined && value !== null && value !== '');\n\n return `${labelValue ?? ''}`;\n })\n .join('|');\n const enumKeys = options\n .map((item) => `${(item as Record<string, unknown>)[valueKey] ?? ''}`)\n .join('|');\n\n grid.SetAttribute(null, columnName, 'Type', 'Enum', 0, 0);\n grid.SetAttribute(null, columnName, 'Enum', `|${enumValues}`, 0, 0);\n grid.SetAttribute(null, columnName, 'EnumKeys', `|${enumKeys}`, 1, 0);\n};\n"],"names":["TREEGRID_CHANGE_STATUSES","TREEGRID_DATA_KEY_PREFIXES","TREEGRID_TIME_DATE_FORMAT_PATTERN","TREEGRID_ADDED_ROW_BY_ID_FLAG","TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY","TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY","TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY","TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY","TREEGRID_ROW_SELECTED_KEY","DEFAULT_TREE_GRID_REQUIRED_CELL_MESSAGE_FACTORY","__name","label","DEFAULT_TREE_GRID_REQUIRED_CELL_TARGET_ROWS","normalizeTreeGridStringValues","value","isArray","item","normalizeTreeGridAddedRowHighlightColumns","markTreeGridRowAddedById","row","isTreeGridRowAddedById","addedById","isTreeGridAddedRow","added","isTreeGridChangedRow","changed","isTreeGridDeletedRow","deleted","normalizeTreeGridRequiredCellTargetRows","targetRows","normalizedTargetRows","targetRow","shouldValidateTreeGridRequiredCellRow","shouldValidateExplicitTreeGridRequiredCellRow","resolveLiveTreeGridRequiredCellRow","grid","_a","normalizeExplicitTreeGridRequiredCellRows","rows","seenRows","normalizedRows","liveRow","getTreeGridRequiredCellRows","options","appendTreeGridAddedRowHighlightColumn","col","currentColumns","removeTreeGridAddedRowHighlightColumn","nextColumns","column","getTreeGridAddedRowHighlightColumns","getTreeGridCellComparableValue","cellType","_c","_b","rawValue","_d","displayValue","_e","markTreeGridAddedRowBaselineValues","baselineValues","getTreeGridAddedRowBaselineValue","preserveTreeGridCellStyleBaseline","getTreeGridCellStyleBaseline","loadExportTreeGridExcel","exportTreeGridExcel","getDataRows","normalizeTreeGridRequiredCellColumns","columns","key","isPlainObject","isTreeGridEditableCell","canEdit","getTreeGridRequiredCellColumns","requiredColumns","isVisibleTreeGridColumn","getTreeGridRequiredCellLabel","caption","columnCaption","getTreeGridRequiredCellMessage","context","messageFactory","isBlankTreeGridRequiredCellValue","focusFirstTreeGridRequiredCellError","error","isTreeGridTimeDateFormat","format","isTreeGridTimeDateColumn","rowRecord","getTreeGridTimeDateDisplayValue","normalizeTreeGridExternalRow","normalizedRow","normalizeTreeGridExternalRows","isTreeGridExplicitEnabledConfigValue","isTreeGridSingleSelectionLayout","isTreeGridSelectedInitialValue","initialValues","omitTreeGridSelectedInitialValue","initialValueRecord","resolveRowInsertionTarget","insertPosition","parent","anchorRow","resolvedParent","next","assignInitialRowValues","initialValueKeys","rowKey","rowValue","assignEditableAddedRowColumns","editableColumns","targetColumns","isTreeGridDataKey","prefix","isTreeGridColumnDataKey","hasTreeGridUploadValue","isHiddenTreeGridValue","isTreeGridAddedRowInitialValueKey","getLiveTreeGridChangedRow","shouldIncludeTreeGridChangeDataKey","includeAddedInitialValues","normalizeTreeGridChangeRow","excludedKeys","without","getChangedRowsByStatus","status","get","isEmpty","normalizeTreeGridChangedRows","commitTreeGridActiveEdit","getTreeGridById","gridId","getTreeGridDataRowsById","reloadTreeGridBodyById","currentData","emitTreeGridBodyRowsChanged","addTreeGridRowById","canSelect","isSingleSelectionLayout","shouldResetSelection","shouldSelectAddedRow","resolvedInitialValues","resetTreeGridSelectionById","newRow","validateTreeGridRequiredCellsById","errors","refresh","message","firstError","getTreeGridRowChangesById","changesData","parseTreeGridXmlToJson","lowerCase","exportTreeGridToExcelById","title","getTreeGridSelectedRowsById","selectedRows","resolvedSelectedRows","resolveTreeGridSelectedRows","setTreeGridColumnVisibilityById","targetKey","highlightTreeGridCellById","targetOption","TREEGRID_CELL_CHANGED_CLASS","TREEGRID_CELL_HIGHLIGHT_COLOR","clearTreeGridCellHighlightById","styleBaseline","resetTreeGridSelectionsByIds","gridIds","resetTreeGridChangesById","resetTreeGridChangesByIds","setTreeGridColumnEnumOptionsById","columnName","valueKey","labelKeys","enumValues","option","labelKey","enumKeys"],"mappings":"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"}
1
+ {"version":3,"file":"treeGridUtil.js","sources":["../../src/utils/treeGridUtil.ts"],"sourcesContent":["import {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n} from '@/constants/treeGrid';\nimport { parseTreeGridXmlToJson } from '@/components/OwpTreeGrid/internal/treeGridLayout';\nimport {\n resolveTreeGridSelectedRows,\n type OwpTreeGridSelectedRowsResolveOptions,\n type OwpTreeGridSelectionScope,\n} from '@/components/OwpTreeGrid/internal/treeGridSelection';\nimport { emitTreeGridBodyRowsChanged } from '@/utils/internal/treeGridBodyRowsEvent';\nimport { isPlainObject } from 'es-toolkit';\nimport { get, isArray, isEmpty, lowerCase, without } from 'es-toolkit/compat';\n\nexport {\n TREEGRID_CELL_CHANGED_CLASS,\n TREEGRID_CELL_HIGHLIGHT_COLOR,\n TREEGRID_INPUT_CELL_COLOR,\n TREEGRID_WARNING_CELL_COLOR,\n};\n\ntype TreeGridInsertPosition = 'above' | 'below' | 'top' | 'last';\n\ntype TreeGridAddRowOptions<T> = {\n canSelect?: boolean;\n insertPosition?: TreeGridInsertPosition;\n parent?: TRow & T;\n anchorRow?: TRow & T;\n initialValues?: T;\n editableColumns?: readonly string[];\n};\n\ntype TreeGridColumnVisibilityOptions = {\n targetKey: string;\n canVisible: boolean;\n};\n\ntype TreeGridHighlightTargetOption = {\n row: TRow;\n col: string;\n backgroundColor?: string;\n refresh?: boolean;\n};\n\nexport type TreeGridSelectionScope = OwpTreeGridSelectionScope;\nexport type TreeGridSelectedRowsOptions = OwpTreeGridSelectedRowsResolveOptions;\n\nexport type TreeGridRequiredCellColumn =\n | string\n | {\n key: string;\n label?: string;\n message?: string;\n };\n\nexport type TreeGridRequiredCellMessageContext = {\n grid: TGrid;\n row: TRow;\n col: string;\n key: string;\n label: string;\n value: string;\n};\n\nexport type TreeGridRequiredCellValidationError = TreeGridRequiredCellMessageContext & {\n message: string;\n};\n\nexport type TreeGridRequiredCellTargetRow = 'added' | 'changed' | 'all';\n\ntype TreeGridRequiredCellsValidationBaseOptions = {\n targetRows?: TreeGridRequiredCellTargetRow | readonly TreeGridRequiredCellTargetRow[];\n rows?: readonly TRow[];\n messageFactory?: (context: TreeGridRequiredCellMessageContext) => string;\n focusFirstError?: boolean;\n startEditFirstError?: boolean;\n refresh?: boolean;\n};\n\nexport type TreeGridRequiredCellsValidationOptions =\n TreeGridRequiredCellsValidationBaseOptions &\n (\n | {\n editableOnly: true;\n columns?: readonly TreeGridRequiredCellColumn[];\n }\n | {\n columns: readonly TreeGridRequiredCellColumn[];\n editableOnly?: boolean;\n }\n );\n\nexport type TreeGridRequiredCellsValidationResult = {\n valid: boolean;\n errors: TreeGridRequiredCellValidationError[];\n firstError?: TreeGridRequiredCellValidationError;\n};\n\ntype NormalizedTreeGridRequiredCellColumn = {\n key: string;\n label?: string;\n message?: string;\n};\n\ntype TreeGridAddedRowMetadata = TRow & {\n [TREEGRID_ADDED_ROW_BY_ID_FLAG]?: boolean | number;\n [TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY]?: string[];\n [TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY]?: Record<string, string>;\n [TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?: Record<\n string,\n { className: unknown; color: unknown }\n >;\n};\n\ntype TreeGridChangeStatus = 'Added' | 'Changed';\ntype TreeGridChangedRow = Record<string, unknown>;\n\nconst TREEGRID_CHANGE_STATUSES: TreeGridChangeStatus[] = ['Added', 'Changed'];\nconst TREEGRID_DATA_KEY_PREFIXES = ['OWP', 'IPX'];\nconst TREEGRID_TIME_DATE_FORMAT_PATTERN = /^H{1,2}(?::m{1,2})?(?::s{1,2})?$/;\nconst TREEGRID_ADDED_ROW_BY_ID_FLAG = '__owpAddedByAddTreeGridRowById';\nconst TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY = '__owpAddedRowHighlightColumns';\nconst TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY = '__owpAddedRowInitialValueKeys';\nconst TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY = '__owpAddedRowBaselineValues';\nconst TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY = '__owpCellStyleBaselineValues';\nconst TREEGRID_ROW_SELECTED_KEY = 'Selected';\n\nconst DEFAULT_TREE_GRID_REQUIRED_CELL_MESSAGE_FACTORY = ({\n label,\n}: TreeGridRequiredCellMessageContext) => `${label} ν•„μˆ˜ μž…λ ₯`;\nconst DEFAULT_TREE_GRID_REQUIRED_CELL_TARGET_ROWS: readonly TreeGridRequiredCellTargetRow[] = [\n 'added',\n];\n\nconst normalizeTreeGridStringValues = (value: unknown) => {\n if (!isArray(value)) {\n return [];\n }\n\n return value.filter((item): item is string => typeof item === 'string' && item !== '');\n};\n\nconst normalizeTreeGridAddedRowHighlightColumns = normalizeTreeGridStringValues;\n\n/**\n * addTreeGridRowById 생성 ν–‰ λ§ˆν‚Ή\n * @param row λŒ€μƒ ν–‰\n */\nconst markTreeGridRowAddedById = (row: TRow | null | undefined) => {\n if (!row) {\n return;\n }\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BY_ID_FLAG] = 1;\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nexport const isTreeGridRowAddedById = (row: TRow | null | undefined) => {\n const addedById = (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_BY_ID_FLAG];\n\n return !!row && addedById !== 0 && addedById !== false && addedById !== undefined;\n};\n\n/**\n * TreeGrid μ‹ κ·œ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst isTreeGridAddedRow = (row: TRow | null | undefined) => {\n const added = (row as { Added?: unknown } | null)?.Added;\n\n return added === 1 || added === '1' || added === true || isTreeGridRowAddedById(row);\n};\n\n/**\n * TreeGrid μˆ˜μ • ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst isTreeGridChangedRow = (row: TRow | null | undefined) => {\n const changed = (row as { Changed?: unknown } | null)?.Changed;\n\n return !isTreeGridAddedRow(row) && (changed === 1 || changed === '1' || changed === true);\n};\n\n/**\n * TreeGrid μ‚­μ œ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst isTreeGridDeletedRow = (row: TRow | null | undefined) => {\n const deleted = (row as { Deleted?: unknown } | null)?.Deleted;\n\n return deleted === 1 || deleted === '1' || deleted === true;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ μ’…λ₯˜ μ •κ·œν™”\n * @param targetRows 검사 λŒ€μƒ ν–‰ μ’…λ₯˜\n */\nconst normalizeTreeGridRequiredCellTargetRows = (\n targetRows?: TreeGridRequiredCellsValidationOptions['targetRows'],\n) => {\n const normalizedTargetRows = isArray(targetRows)\n ? targetRows\n : targetRows\n ? [targetRows]\n : DEFAULT_TREE_GRID_REQUIRED_CELL_TARGET_ROWS;\n\n if (normalizedTargetRows.includes('all')) {\n return new Set<TreeGridRequiredCellTargetRow>(['all']);\n }\n\n return new Set<TreeGridRequiredCellTargetRow>(\n normalizedTargetRows.filter(\n (targetRow) => targetRow === 'added' || targetRow === 'changed',\n ),\n );\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n * @param targetRows 검사 λŒ€μƒ ν–‰ μ’…λ₯˜\n */\nconst shouldValidateTreeGridRequiredCellRow = (\n row: TRow,\n targetRows: Set<TreeGridRequiredCellTargetRow>,\n) => {\n if (isTreeGridDeletedRow(row)) {\n return false;\n }\n\n if (targetRows.has('all')) {\n return row.Kind === 'Data' || isTreeGridAddedRow(row);\n }\n\n return (\n (targetRows.has('added') && isTreeGridAddedRow(row)) ||\n (targetRows.has('changed') && isTreeGridChangedRow(row))\n );\n};\n\n/**\n * TreeGrid λͺ…μ‹œ ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n */\nconst shouldValidateExplicitTreeGridRequiredCellRow = (row: TRow | null | undefined) => {\n return !!row && !isTreeGridDeletedRow(row) && (row.Kind === 'Data' || isTreeGridAddedRow(row));\n};\n\n/**\n * TreeGrid live ν–‰ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n */\nconst resolveLiveTreeGridRequiredCellRow = (grid: TGrid, row: TRow | null | undefined) => {\n if (!row) {\n return undefined;\n }\n\n if (typeof row.id !== 'string') {\n return row;\n }\n\n return (grid.Rows as unknown as Record<string, TRow | undefined>)?.[row.id] ?? row;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λͺ…μ‹œ ν–‰ λͺ©λ‘ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param rows λͺ…μ‹œ 검사 ν–‰ λͺ©λ‘\n */\nconst normalizeExplicitTreeGridRequiredCellRows = (\n grid: TGrid,\n rows: readonly TRow[],\n) => {\n const seenRows = new Set<TRow>();\n const normalizedRows: TRow[] = [];\n\n rows.forEach((row) => {\n const liveRow = resolveLiveTreeGridRequiredCellRow(grid, row);\n\n if (\n !shouldValidateExplicitTreeGridRequiredCellRow(liveRow) ||\n seenRows.has(liveRow)\n ) {\n return;\n }\n\n seenRows.add(liveRow);\n normalizedRows.push(liveRow);\n });\n\n return normalizedRows;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 λŒ€μƒ ν–‰ λͺ©λ‘ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nconst getTreeGridRequiredCellRows = (\n grid: TGrid,\n options: TreeGridRequiredCellsValidationOptions,\n) => {\n if (options.rows !== undefined) {\n return normalizeExplicitTreeGridRequiredCellRows(grid, options.rows);\n }\n\n const targetRows = normalizeTreeGridRequiredCellTargetRows(options.targetRows);\n\n return Object.values(grid.Rows ?? {}).filter((row) =>\n shouldValidateTreeGridRequiredCellRow(row, targetRows),\n );\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ ν•˜μ΄λΌμ΄νŠΈ 컬럼 λˆ„μ \n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const appendTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n\n if (currentColumns.includes(col)) {\n return;\n }\n\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = [...currentColumns, col];\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ ν•˜μ΄λΌμ΄νŠΈ 컬럼 제거\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const removeTreeGridAddedRowHighlightColumn = (\n row: TRow | null | undefined,\n col: string,\n) => {\n if (!row || !col) {\n return;\n }\n\n const targetRow = row as TreeGridAddedRowMetadata;\n const currentColumns = normalizeTreeGridAddedRowHighlightColumns(\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n const nextColumns = currentColumns.filter((column) => column !== col);\n\n if (nextColumns.length) {\n targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY] = nextColumns;\n return;\n }\n\n delete targetRow[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY];\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ ν•˜μ΄λΌμ΄νŠΈ 컬럼 쑰회\n * @param row λŒ€μƒ ν–‰\n */\nexport const getTreeGridAddedRowHighlightColumns = (row: TRow | null | undefined) => {\n return normalizeTreeGridAddedRowHighlightColumns(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY],\n );\n};\n\n/**\n * TreeGrid μ…€ 비ꡐ κ°’ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const getTreeGridCellComparableValue = (\n grid: TGrid,\n row: TRow,\n col: string,\n) => {\n const cellType = grid.GetType?.(row, col) || grid.Cols?.[col]?.Type || '';\n const rawValue =\n grid.GetValue?.(row, col) ?? (row as unknown as Record<string, unknown>)[col];\n\n if (cellType === 'Enum' || cellType === 'Select') {\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n }\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null) {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 μ…€ fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ κΈ°μ€€κ°’ μ €μž₯\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n */\nconst markTreeGridAddedRowBaselineValues = (grid: TGrid, row: TRow) => {\n const baselineValues = Object.fromEntries(\n Object.keys(grid.Cols ?? {}).map((col) => [\n col,\n getTreeGridCellComparableValue(grid, row, col),\n ]),\n );\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY] = baselineValues;\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ κΈ°μ€€κ°’ 쑰회\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nexport const getTreeGridAddedRowBaselineValue = (\n row: TRow | null | undefined,\n col: string,\n) => {\n return (row as TreeGridAddedRowMetadata | null)?.[\n TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY\n ]?.[col];\n};\n\n/**\n * TreeGrid μ…€ ν•˜μ΄λΌμ΄νŠΈ μ „ μŠ€νƒ€μΌ μ €μž₯\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst preserveTreeGridCellStyleBaseline = (grid: TGrid, row: TRow, col: string) => {\n const targetRow = row as TreeGridAddedRowMetadata;\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY] ??= {};\n\n if (targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col]) {\n return;\n }\n\n targetRow[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY][col] = {\n className: grid.GetAttribute(row, col, 'Class'),\n color: grid.GetAttribute(row, col, 'Color'),\n };\n};\n\n/**\n * TreeGrid μ…€ ν•˜μ΄λΌμ΄νŠΈ μ „ μŠ€νƒ€μΌ 쑰회\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst getTreeGridCellStyleBaseline = (row: TRow, col: string) => {\n return (row as TreeGridAddedRowMetadata)[TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY]?.[col];\n};\n\n/**\n * TreeGrid μ—‘μ…€ 내보내기 μœ ν‹Έ λ‘œλ”\n */\nconst loadExportTreeGridExcel = async () => {\n const { exportTreeGridExcel } = await import('./treeGridExportExcelUtil');\n\n return exportTreeGridExcel;\n};\n\n/**\n * TreeGrid 데이터 ν–‰ λͺ©λ‘ μΆ”μΆœ\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n */\nconst getDataRows = (grid: TGrid | undefined) => {\n return Object.values(grid?.Rows ?? {}).filter((item) => item.Kind === 'Data');\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 컬럼 μ„€μ • μ •κ·œν™”\n * @param columns ν•„μˆ˜ 컬럼 μ„€μ • λͺ©λ‘\n */\nconst normalizeTreeGridRequiredCellColumns = (\n columns?: readonly TreeGridRequiredCellColumn[],\n) => {\n if (!columns?.length) {\n return [];\n }\n\n return columns\n .map((column): NormalizedTreeGridRequiredCellColumn | null => {\n if (typeof column === 'string') {\n const key = column.trim();\n\n return key ? { key } : null;\n }\n\n if (!isPlainObject(column) || typeof column.key !== 'string') {\n return null;\n }\n\n const key = column.key.trim();\n\n if (!key) {\n return null;\n }\n\n return {\n key,\n label: typeof column.label === 'string' ? column.label.trim() : undefined,\n message: typeof column.message === 'string' ? column.message : undefined,\n };\n })\n .filter((column): column is NormalizedTreeGridRequiredCellColumn => !!column);\n};\n\n/**\n * TreeGrid μ…€ νŽΈμ§‘ κ°€λŠ₯ μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst isTreeGridEditableCell = (grid: TGrid, row: TRow, col: string) => {\n const canEdit = grid.CanEdit?.(row, col) as unknown;\n\n return canEdit === 1 || canEdit === '1' || canEdit === true;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 검사 컬럼 λͺ©λ‘ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nconst getTreeGridRequiredCellColumns = (\n grid: TGrid,\n row: TRow,\n options: TreeGridRequiredCellsValidationOptions,\n) => {\n const requiredColumns = normalizeTreeGridRequiredCellColumns(options.columns);\n\n if (requiredColumns.length) {\n return requiredColumns.filter((column) => !!grid.Cols?.[column.key]);\n }\n\n if (!options.editableOnly) {\n return [];\n }\n\n return Object.keys(grid.Cols ?? {})\n .filter((col) => isVisibleTreeGridColumn(grid, col) && isTreeGridEditableCell(grid, row, col))\n .map((key) => ({ key }));\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 였λ₯˜ 라벨 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param column ν•„μˆ˜ 컬럼 μ„€μ •\n */\nconst getTreeGridRequiredCellLabel = (\n grid: TGrid,\n column: NormalizedTreeGridRequiredCellColumn,\n) => {\n if (column.label) {\n return column.label;\n }\n\n try {\n const caption = grid.GetCaption?.(column.key);\n\n if (caption) {\n return `${caption}`.trim();\n }\n } catch {\n // GetCaption 미지원 컬럼 fallback\n }\n\n const columnCaption = (grid.Cols?.[column.key] as { Caption?: unknown } | undefined)?.Caption;\n\n if (columnCaption) {\n return `${columnCaption}`.trim();\n }\n\n return column.key;\n};\n\n/**\n * TreeGrid ν•„μˆ˜ 였λ₯˜ λ©”μ‹œμ§€ 쑰회\n * @param context λ©”μ‹œμ§€ 생성 μ»¨ν…μŠ€νŠΈ\n * @param column ν•„μˆ˜ 컬럼 μ„€μ •\n * @param messageFactory λ©”μ‹œμ§€ 생성 ν•¨μˆ˜\n */\nconst getTreeGridRequiredCellMessage = (\n context: TreeGridRequiredCellMessageContext,\n column: NormalizedTreeGridRequiredCellColumn,\n messageFactory?: (context: TreeGridRequiredCellMessageContext) => string,\n) => {\n if (column.message) {\n return column.message;\n }\n\n return (messageFactory ?? DEFAULT_TREE_GRID_REQUIRED_CELL_MESSAGE_FACTORY)(context);\n};\n\n/**\n * TreeGrid ν•„μˆ˜κ°’ 곡백 μ—¬λΆ€\n * @param value 비ꡐ κ°’\n */\nconst isBlankTreeGridRequiredCellValue = (value: string) => value.trim() === '';\n\n/**\n * TreeGrid ν•„μˆ˜ 였λ₯˜ 포컀슀 반영\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param error 졜초 였λ₯˜\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nconst focusFirstTreeGridRequiredCellError = (\n grid: TGrid,\n error: TreeGridRequiredCellValidationError | undefined,\n options: TreeGridRequiredCellsValidationOptions,\n) => {\n if (!error || options.focusFirstError === false) {\n return;\n }\n\n grid.Focus(error.row, error.col);\n\n if (options.startEditFirstError === true && isTreeGridEditableCell(grid, error.row, error.col)) {\n grid.StartEdit(error.row, error.col);\n }\n};\n\n/**\n * TreeGrid μ‹œκ°„ μ „μš© Date 포맷 μ—¬λΆ€\n * @param format TreeGrid λ‚ μ§œ 포맷\n */\nconst isTreeGridTimeDateFormat = (format: unknown) =>\n typeof format === 'string' && TREEGRID_TIME_DATE_FORMAT_PATTERN.test(format.trim());\n\n/**\n * TreeGrid μ‹œκ°„ μ „μš© Date 컬럼 μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst isTreeGridTimeDateColumn = (grid: TGrid, row: TRow, col: string) => {\n const rowRecord = row as unknown as Record<string, unknown>;\n const column = grid.Cols?.[col];\n\n return (\n column?.Type === 'Date' &&\n (isTreeGridTimeDateFormat(rowRecord[`${col}EditFormat`]) ||\n isTreeGridTimeDateFormat(rowRecord[`${col}Format`]) ||\n isTreeGridTimeDateFormat(column.EditFormat) ||\n isTreeGridTimeDateFormat(column.Format))\n );\n};\n\n/**\n * TreeGrid μ‹œκ°„ μ „μš© Date ν‘œμ‹œ κ°’ 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n * @param col λŒ€μƒ 컬럼\n */\nconst getTreeGridTimeDateDisplayValue = (grid: TGrid, row: TRow, col: string) => {\n const rawValue = (row as unknown as Record<string, unknown>)[col];\n\n try {\n const displayValue = grid.GetString?.(row, col);\n\n if (displayValue !== undefined && displayValue !== null && `${displayValue}` !== '') {\n return `${displayValue}`;\n }\n } catch {\n // GetString 미지원 μ…€ fallback\n }\n\n return rawValue === undefined || rawValue === null ? '' : `${rawValue}`;\n};\n\n/**\n * TreeGrid μ™ΈλΆ€ λ°˜ν™˜ ν–‰ Date μ‹œκ°„ κ°’ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row λŒ€μƒ ν–‰\n */\nconst normalizeTreeGridExternalRow = <T>(grid: TGrid, row: TRow & T) => {\n const normalizedRow = { ...row } as TRow & T;\n\n Object.keys(grid.Cols ?? {}).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, row, col)) {\n return;\n }\n\n (normalizedRow as Record<string, unknown>)[col] = getTreeGridTimeDateDisplayValue(grid, row, col);\n });\n\n return normalizedRow;\n};\n\n/**\n * TreeGrid μ™ΈλΆ€ λ°˜ν™˜ ν–‰ λͺ©λ‘ Date μ‹œκ°„ κ°’ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param rows λŒ€μƒ ν–‰ λͺ©λ‘\n */\nexport const normalizeTreeGridExternalRows = <T>(grid: TGrid, rows: Array<TRow & T>) =>\n rows.map((row) => normalizeTreeGridExternalRow(grid, row));\n\n/** TreeGrid λͺ…μ‹œ ν™œμ„± μ„€μ •κ°’ μ—¬λΆ€ */\nconst isTreeGridExplicitEnabledConfigValue = (value: unknown) =>\n value === 1 || value === true || value === '1' || value === 'true';\n\n/**\n * TreeGrid 단일 선택 λ ˆμ΄μ•„μ›ƒ μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n */\nconst isTreeGridSingleSelectionLayout = (grid: TGrid) =>\n isTreeGridExplicitEnabledConfigValue(grid.SelectingSingle);\n\n/**\n * μ‹ κ·œ ν–‰ 선택 μ΄ˆκΈ°κ°’ ν™œμ„± μ—¬λΆ€\n * @param initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n */\nconst isTreeGridSelectedInitialValue = <T>(initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return false;\n }\n\n return isTreeGridExplicitEnabledConfigValue(\n (initialValues as Record<string, unknown>)[TREEGRID_ROW_SELECTED_KEY],\n );\n};\n\n/**\n * μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’μ—μ„œ 선택 μƒνƒœ μ œμ™Έ\n * @param initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n */\nconst omitTreeGridSelectedInitialValue = <T>(initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return initialValues;\n }\n\n const initialValueRecord = initialValues as Record<string, unknown>;\n\n if (!(TREEGRID_ROW_SELECTED_KEY in initialValueRecord)) {\n return initialValues;\n }\n\n return Object.fromEntries(\n Object.entries(initialValueRecord).filter(\n ([key]) => key !== TREEGRID_ROW_SELECTED_KEY,\n ),\n ) as T;\n};\n\n/**\n * μ‹ κ·œ ν–‰ μΆ”κ°€ λŒ€μƒ 계산\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param options ν–‰ μΆ”κ°€ μ˜΅μ…˜\n */\nconst resolveRowInsertionTarget = <T>(grid: TGrid, options?: TreeGridAddRowOptions<T>) => {\n const insertPosition = options?.insertPosition ?? 'top';\n const parent = options?.parent;\n const anchorRow = options?.anchorRow;\n\n let resolvedParent = parent ?? (anchorRow ? anchorRow.parentNode : null) ?? grid.GetFirst();\n let next = null;\n\n switch (insertPosition) {\n case 'top':\n next = grid.GetFirst();\n break;\n\n case 'last':\n resolvedParent = grid.GetNext(grid.GetLast(), grid.RowCount > 0 ? grid.RowCount + 1 : 0);\n next = resolvedParent;\n break;\n\n case 'above':\n next = anchorRow ?? grid.GetFirst();\n break;\n\n case 'below':\n next = anchorRow?.nextSibling ?? grid.GetFirst();\n break;\n }\n\n return { resolvedParent, next };\n};\n\n/**\n * μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’ 반영\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row μƒμ„±λœ TreeGrid ν–‰\n * @param initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n */\nconst assignInitialRowValues = <T>(grid: TGrid, row: TRow, initialValues?: T) => {\n if (!isPlainObject(initialValues)) {\n return;\n }\n\n const initialValueKeys = Object.keys(initialValues as Record<string, unknown>).filter(Boolean);\n\n (row as TreeGridAddedRowMetadata)[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY] = initialValueKeys;\n\n Object.entries(initialValues as Record<string, unknown>).forEach(([rowKey, rowValue]) => {\n if (grid.Cols?.[rowKey]?.Type === 'Date' && typeof rowValue === 'string') {\n grid.SetString(row, rowKey, rowValue, 0);\n return;\n }\n\n (row as unknown as Record<string, unknown>)[rowKey] = rowValue;\n });\n};\n\n/**\n * μ‹ κ·œ ν–‰ μ…€ λ‹¨μœ„ νŽΈμ§‘ κ°€λŠ₯ 컬럼 반영\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row μƒμ„±λœ TreeGrid ν–‰\n * @param editableColumns νŽΈμ§‘ κ°€λŠ₯ μ²˜λ¦¬ν•  컬럼 ν‚€ λͺ©λ‘\n */\nconst assignEditableAddedRowColumns = (\n grid: TGrid,\n row: TRow,\n editableColumns?: readonly string[],\n) => {\n const targetColumns = normalizeTreeGridStringValues(editableColumns);\n\n if (!targetColumns.length) {\n return;\n }\n\n const rowRecord = row as unknown as Record<string, unknown>;\n\n targetColumns.forEach((col) => {\n if (!grid.Cols?.[col]) {\n return;\n }\n\n rowRecord[`${col}CanEdit`] = 1;\n });\n};\n\n/**\n * λ³€κ²½ 데이터 컬럼 ν‚€ μ—¬λΆ€ 확인\n * @param key 컬럼 ν‚€\n */\nconst isTreeGridDataKey = (key: string) => {\n return TREEGRID_DATA_KEY_PREFIXES.some((prefix) => key.startsWith(prefix));\n};\n\n/**\n * TreeGrid 컬럼 데이터 ν‚€ μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param key 컬럼 ν‚€\n */\nconst isTreeGridColumnDataKey = (grid: TGrid | undefined, key: string) => {\n return !!grid?.Cols?.[key];\n};\n\n/**\n * TreeGrid μ—…λ‘œλ“œ κ°’ 포함 λŒ€μƒ μ—¬λΆ€\n * @param value μ—…λ‘œλ“œ κ°’\n */\nconst hasTreeGridUploadValue = (value: unknown) => {\n return value !== undefined && value !== null && value !== '';\n};\n\n/**\n * TreeGrid μˆ¨κΉ€ κ°’ μ—¬λΆ€\n * @param value Visible 속성값\n */\nconst isHiddenTreeGridValue = (value: unknown) => {\n return value === 0 || value === false || value === '0';\n};\n\n/**\n * TreeGrid ν‘œμ‹œ 컬럼 μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param key 컬럼 ν‚€\n */\nconst isVisibleTreeGridColumn = (grid: TGrid | undefined, key: string) => {\n return !isHiddenTreeGridValue(grid?.Cols?.[key]?.Visible);\n};\n\n/**\n * addTreeGridRowById 생성 ν–‰ μ΄ˆκΈ°κ°’ ν‚€ μ—¬λΆ€\n * @param row λŒ€μƒ ν–‰\n * @param key 컬럼 ν‚€\n */\nconst isTreeGridAddedRowInitialValueKey = (row: TRow | null | undefined, key: string) => {\n return normalizeTreeGridStringValues(\n (row as TreeGridAddedRowMetadata | null)?.[TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY],\n ).includes(key);\n};\n\n/**\n * TreeGrid λ³€κ²½ ν–‰ 원본 쑰회\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row TreeGrid λ³€κ²½ ν–‰ 데이터\n */\nconst getLiveTreeGridChangedRow = (grid: TGrid | undefined, row: TreeGridChangedRow) => {\n return typeof row.id === 'string'\n ? (grid?.Rows as unknown as Record<string, TRow> | undefined)?.[row.id]\n : null;\n};\n\n/**\n * λ³€κ²½ ν–‰ 데이터 ν‚€ 포함 μ—¬λΆ€\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row TreeGrid λ³€κ²½ ν–‰ 데이터\n * @param key 컬럼 ν‚€\n * @param includeAddedInitialValues μΆ”κ°€ ν–‰ μ΄ˆκΈ°κ°’ ν‚€ 포함 μ—¬λΆ€\n */\nconst shouldIncludeTreeGridChangeDataKey = (\n grid: TGrid | undefined,\n row: TreeGridChangedRow,\n key: string,\n includeAddedInitialValues = false,\n) => {\n if (!hasTreeGridUploadValue(row[key])) {\n return false;\n }\n\n if (isTreeGridColumnDataKey(grid, key)) {\n return true;\n }\n\n if (isTreeGridDataKey(key)) {\n return true;\n }\n\n return (\n includeAddedInitialValues &&\n isTreeGridAddedRowInitialValueKey(getLiveTreeGridChangedRow(grid, row), key)\n );\n};\n\n/**\n * TreeGrid λ³€κ²½ ν–‰ 데이터 μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param row TreeGrid λ³€κ²½ ν–‰ 데이터\n * @param excludedKeys μ œμ™Έν•  μƒνƒœ ν‚€ λͺ©λ‘\n * @param includeAddedInitialValues μΆ”κ°€ ν–‰ μ΄ˆκΈ°κ°’ ν‚€ 포함 μ—¬λΆ€\n */\nconst normalizeTreeGridChangeRow = <T>(\n grid: TGrid | undefined,\n row: TreeGridChangedRow,\n excludedKeys: string[],\n includeAddedInitialValues = false,\n) => {\n return Object.fromEntries(\n without(Object.keys(row), ...excludedKeys)\n .filter((key) =>\n shouldIncludeTreeGridChangeDataKey(grid, row, key, includeAddedInitialValues),\n )\n .map((key) => [key, row[key]]),\n ) as T;\n};\n\n/**\n * λ³€κ²½ μƒνƒœλ³„ ν–‰ 데이터 λ°˜ν™˜\n * @param rows TreeGrid λ³€κ²½ ν–‰ λͺ©λ‘\n * @param status μ‘°νšŒν•  λ³€κ²½ μƒνƒœ\n */\nconst getChangedRowsByStatus = <T>(\n grid: TGrid | undefined,\n rows: TreeGridChangedRow[],\n status: TreeGridChangeStatus,\n) => {\n return rows\n .filter((row) => get(row, status) === '1' && row.Deleted !== '1')\n .map((row) =>\n status === 'Changed'\n ? normalizeTreeGridChangeRow<T>(grid, row, ['id', 'Changed'])\n : normalizeTreeGridChangeRow<T>(grid, row, ['id'], true),\n )\n .filter((row) => !isEmpty(row));\n};\n\n/**\n * TreeGrid λ³€κ²½ ν–‰ Date μ‹œκ°„ κ°’ μ •κ·œν™”\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n * @param rows λ³€κ²½ ν–‰ λͺ©λ‘\n */\nconst normalizeTreeGridChangedRows = (grid: TGrid | undefined, rows: TreeGridChangedRow[]) => {\n if (!grid) {\n return rows;\n }\n\n return rows.map((row) => {\n const liveRow =\n typeof row.id === 'string'\n ? (grid.Rows as unknown as Record<string, TRow>)[row.id]\n : null;\n\n if (!liveRow) {\n return row;\n }\n\n const normalizedRow = { ...row };\n\n Object.keys(row).forEach((col) => {\n if (!isTreeGridTimeDateColumn(grid, liveRow, col)) {\n return;\n }\n\n normalizedRow[col] = getTreeGridTimeDateDisplayValue(grid, liveRow, col);\n });\n\n return normalizedRow;\n });\n};\n\n/**\n * TreeGrid ν™œμ„± νŽΈμ§‘ μ…€ κ°’ ν™•μ •\n * @param grid TreeGrid μΈμŠ€ν„΄μŠ€\n */\nconst commitTreeGridActiveEdit = (grid: TGrid | undefined) => {\n try {\n grid?.EndEdit?.(1);\n } catch {\n // νŽΈμ§‘ λ―Έμ§„μž… λ˜λŠ” ν™•μ • λΆˆκ°€ μƒνƒœ fallback\n }\n};\n\n/**\n * TreeGrid μΈμŠ€ν„΄μŠ€ ID 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const getTreeGridById = (gridId: string) => {\n return Grids[gridId];\n};\n\n/**\n * TreeGrid 데이터 ν–‰ λͺ©λ‘ 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const getTreeGridDataRowsById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n return grid ? (normalizeTreeGridExternalRows<T>(grid, getDataRows(grid) as Array<TRow & T>) as T) : [];\n};\n\n/**\n * TreeGrid Body 데이터 ꡐ체 ν›„ μž¬λ‘œλ“œ\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param rows μƒˆλ‘œ λ°˜μ˜ν•  ν–‰ 데이터\n */\nexport const reloadTreeGridBodyById = (gridId: string, rows: unknown) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n // @ts-expect-error - Data property not defined in type\n const currentData = grid.Data.Data;\n\n // @ts-expect-error - Data property not defined in type\n grid.Data.Data = {\n ...currentData,\n Data: { Body: [rows || []] },\n Url: '',\n };\n grid.ReloadBody();\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * 행을 νŠΉμ • μœ„μΉ˜μ— μΆ”κ°€\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options.canSelect ν–‰ 선택 κ°€λŠ₯ μ—¬λΆ€\n * @param options.parent λΆ€λͺ¨ ν–‰\n * @param options.anchorRow above/below용 κΈ°μ€€ ν–‰\n * @param options.insertPosition ν–‰ μ‚½μž… μœ„μΉ˜\n * @param options.initialValues μ‹ κ·œ ν–‰ μ΄ˆκΈ°κ°’\n * @param options.editableColumns μ‹ κ·œ ν–‰ μ…€ λ‹¨μœ„ νŽΈμ§‘ κ°€λŠ₯ 컬럼\n */\nexport const addTreeGridRowById = <T>(\n gridId: string,\n options?: TreeGridAddRowOptions<T>,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const canSelect = options?.canSelect;\n const initialValues = options?.initialValues;\n const editableColumns = options?.editableColumns;\n const isSingleSelectionLayout = isTreeGridSingleSelectionLayout(grid);\n const shouldResetSelection = !!canSelect && isSingleSelectionLayout;\n const shouldSelectAddedRow =\n shouldResetSelection && isTreeGridSelectedInitialValue(initialValues);\n const resolvedInitialValues = shouldSelectAddedRow\n ? omitTreeGridSelectedInitialValue(initialValues)\n : initialValues;\n\n if (shouldResetSelection) {\n resetTreeGridSelectionById(gridId);\n }\n\n const { resolvedParent, next } = resolveRowInsertionTarget(grid, options);\n\n const newRow = grid.AddRow(resolvedParent, next, 1);\n\n markTreeGridRowAddedById(newRow);\n assignInitialRowValues(grid, newRow, resolvedInitialValues);\n markTreeGridAddedRowBaselineValues(grid, newRow);\n\n newRow.CanEdit = 1;\n newRow.CanDelete = 1;\n newRow.CanSelect = canSelect ? 1 : 0;\n assignEditableAddedRowColumns(grid, newRow, editableColumns);\n\n if (shouldSelectAddedRow) {\n grid.SelectRow(newRow, 1);\n }\n\n grid.Focus(newRow);\n grid.RefreshRow(newRow);\n grid.Calculate(1, 1);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * TreeGrid ν•„μˆ˜ μ…€ Error 검증\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options ν•„μˆ˜ 검사 μ˜΅μ…˜\n */\nexport const validateTreeGridRequiredCellsById = (\n gridId: string,\n options: TreeGridRequiredCellsValidationOptions,\n): TreeGridRequiredCellsValidationResult => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return { valid: false, errors: [] };\n }\n\n const rows = getTreeGridRequiredCellRows(grid, options);\n const errors: TreeGridRequiredCellValidationError[] = [];\n const refresh = options.refresh === false ? 0 : 1;\n\n rows.forEach((row) => {\n getTreeGridRequiredCellColumns(grid, row, options).forEach((column) => {\n const col = column.key;\n const value = getTreeGridCellComparableValue(grid, row, col);\n const label = getTreeGridRequiredCellLabel(grid, column);\n const context = {\n grid,\n row,\n col,\n key: col,\n label,\n value,\n };\n\n if (!isBlankTreeGridRequiredCellValue(value)) {\n grid.SetAttribute(row, col, 'Error', '', refresh);\n return;\n }\n\n const message = getTreeGridRequiredCellMessage(\n context,\n column,\n options.messageFactory,\n );\n const error = { ...context, message };\n\n grid.SetAttribute(row, col, 'Error', message, refresh);\n errors.push(error);\n });\n });\n\n const firstError = errors[0];\n\n focusFirstTreeGridRequiredCellError(grid, firstError, options);\n\n return {\n valid: !firstError,\n errors,\n firstError,\n };\n};\n\n/**\n * TreeGrid μΆ”κ°€/μˆ˜μ • 데이터 ν–‰ 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const getTreeGridRowChangesById = <T>(gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n commitTreeGridActiveEdit(grid);\n\n const changesData = parseTreeGridXmlToJson(grid?.GetXmlData('changes,allcols,nogrid,noio'));\n\n if (!isArray(changesData)) {\n return { added: [], changed: [] };\n }\n\n return Object.fromEntries(\n TREEGRID_CHANGE_STATUSES.map((status) => [\n lowerCase(status),\n getChangedRowsByStatus<T>(\n grid,\n normalizeTreeGridChangedRows(grid, changesData as TreeGridChangedRow[]),\n status,\n ),\n ]),\n ) as { added: T[]; changed: T[] };\n};\n\n/**\n * TreeGrid 데이터 μ—‘μ…€ 내보내기\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param title λ‹€μš΄λ‘œλ“œ 파일λͺ…\n */\nexport const exportTreeGridToExcelById = (gridId: string, title?: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n void loadExportTreeGridExcel().then((exportTreeGridExcel) =>\n exportTreeGridExcel(grid, { exportName: title ?? '' }),\n );\n};\n\n/**\n * TreeGrid ν˜„μž¬ 선택 ν–‰ λͺ©λ‘ 쑰회\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options 선택 ν–‰ λ°˜ν™˜ μ˜΅μ…˜\n */\nexport const getTreeGridSelectedRowsById = <T>(\n gridId: string,\n options?: TreeGridSelectedRowsOptions,\n) => {\n const grid = getTreeGridById(gridId);\n\n const selectedRows = grid?.GetSelRows();\n\n if (!grid || !selectedRows) {\n return [];\n }\n\n const resolvedSelectedRows = resolveTreeGridSelectedRows<T>(\n grid,\n selectedRows as Array<TRow & T>,\n options,\n );\n\n return normalizeTreeGridExternalRows<T>(grid, resolvedSelectedRows) as T;\n};\n\n/**\n * TreeGrid 컬럼 ν‘œμ‹œ μ—¬λΆ€ λ³€κ²½\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param options.targetKey ν‘œμ‹œ μƒνƒœλ₯Ό λ³€κ²½ν•  컬럼 ν‚€\n * @param options.canVisible 컬럼 ν‘œμ‹œ μ—¬λΆ€\n */\nexport const setTreeGridColumnVisibilityById = (\n gridId: string,\n options: TreeGridColumnVisibilityOptions,\n) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid || !options?.targetKey) {\n return;\n }\n\n const targetKey = options?.targetKey;\n const canVisible = options?.canVisible;\n\n if (canVisible) {\n grid.ShowCol(targetKey);\n return;\n }\n grid.HideCol(targetKey);\n};\n\n/**\n * νŠΉμ • μ…€ κ°•μ‘° μŠ€νƒ€μΌ 적용\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param targetOption.row κ°•μ‘°ν•  λŒ€μƒ ν–‰\n * @param targetOption.col κ°•μ‘°ν•  λŒ€μƒ 컬럼\n * @param targetOption.refresh κ°•μ‘° 적용 ν›„ μ…€ refresh μ—¬λΆ€\n */\nexport const highlightTreeGridCellById = (\n gridId: string,\n targetOption: TreeGridHighlightTargetOption,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n preserveTreeGridCellStyleBaseline(grid, row, col);\n grid.SetValue(row, `${col}Class`, TREEGRID_CELL_CHANGED_CLASS);\n grid.SetValue(row, `${col}Color`, targetOption.backgroundColor ?? TREEGRID_CELL_HIGHLIGHT_COLOR);\n\n if (targetOption.refresh !== false) {\n grid.RefreshCell(row, col);\n }\n};\n\n/**\n * νŠΉμ • μ…€ κ°•μ‘° μŠ€νƒ€μΌ 제거\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param targetOption.row κ°•μ‘° ν•΄μ œ λŒ€μƒ ν–‰\n * @param targetOption.col κ°•μ‘° ν•΄μ œ λŒ€μƒ 컬럼\n */\nexport const clearTreeGridCellHighlightById = (\n gridId: string,\n targetOption: Pick<TreeGridHighlightTargetOption, 'row' | 'col'>,\n) => {\n const grid = getTreeGridById(gridId);\n\n const row = targetOption?.row;\n const col = targetOption?.col;\n\n if (!grid || !row || !col) {\n return;\n }\n\n const styleBaseline = getTreeGridCellStyleBaseline(row, col);\n\n grid.SetValue(row, `${col}Class`, styleBaseline?.className ?? '');\n grid.SetValue(row, `${col}Color`, styleBaseline?.color ?? '');\n grid.RefreshCell(row, col);\n};\n\n/**\n * TreeGrid ν˜„μž¬ 선택 μƒνƒœ 전체 ν•΄μ œ\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const resetTreeGridSelectionById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionDeselectAll(1, 0);\n};\n\n/**\n * μ—¬λŸ¬ TreeGrid 선택 μƒνƒœ 전체 ν•΄μ œ\n * @param gridIds TreeGrid μΈμŠ€ν„΄μŠ€ ID λͺ©λ‘\n */\nexport const resetTreeGridSelectionsByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridSelectionById);\n};\n\n/**\n * TreeGrid λ³€κ²½ 사항 및 선택 μƒνƒœ μ΄ˆκΈ°ν™”\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n */\nexport const resetTreeGridChangesById = (gridId: string) => {\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n grid.ActionUndoAll(1, 0);\n resetTreeGridSelectionById(gridId);\n grid.Calculate(1, 1);\n window.setTimeout(() => {\n emitTreeGridBodyRowsChanged(gridId);\n }, 0);\n};\n\n/**\n * μ—¬λŸ¬ TreeGrid λ³€κ²½ 사항 및 선택 μƒνƒœ μ΄ˆκΈ°ν™”\n * @param gridIds TreeGrid μΈμŠ€ν„΄μŠ€ ID λͺ©λ‘\n */\nexport const resetTreeGridChangesByIds = (gridIds: string[]) => {\n gridIds.forEach(resetTreeGridChangesById);\n};\n\n/**\n * TreeGrid Enum 컬럼 μ˜΅μ…˜ 반영\n * @param gridId TreeGrid μΈμŠ€ν„΄μŠ€ ID\n * @param columnName Enum을 μ μš©ν•  컬럼λͺ…\n * @param options Enum μ˜΅μ…˜ λͺ©λ‘\n * @param valueKey Enum κ°’μœΌλ‘œ μ‚¬μš©ν•  ν•„λ“œλͺ…\n * @param labelKeys Enum 라벨둜 μ‚¬μš©ν•  ν•„λ“œ μš°μ„ μˆœμœ„ λͺ©λ‘\n */\nexport const setTreeGridColumnEnumOptionsById = <T extends object>(\n gridId: string,\n columnName: string,\n options: T[] | undefined,\n valueKey: keyof T & string,\n labelKeys: Array<keyof T & string>,\n) => {\n if (!options?.length) {\n return;\n }\n\n const grid = getTreeGridById(gridId);\n\n if (!grid) {\n return;\n }\n\n const enumValues = options\n .map((item) => {\n const option = item as Record<string, unknown>;\n const labelValue = labelKeys\n .map((labelKey) => option[labelKey])\n .find((value) => value !== undefined && value !== null && value !== '');\n\n return `${labelValue ?? ''}`;\n })\n .join('|');\n const enumKeys = options\n .map((item) => `${(item as Record<string, unknown>)[valueKey] ?? ''}`)\n .join('|');\n\n grid.SetAttribute(null, columnName, 'Type', 'Enum', 0, 0);\n grid.SetAttribute(null, columnName, 'Enum', `|${enumValues}`, 0, 0);\n grid.SetAttribute(null, columnName, 'EnumKeys', `|${enumKeys}`, 1, 0);\n};\n"],"names":["TREEGRID_CHANGE_STATUSES","TREEGRID_DATA_KEY_PREFIXES","TREEGRID_TIME_DATE_FORMAT_PATTERN","TREEGRID_ADDED_ROW_BY_ID_FLAG","TREEGRID_ADDED_ROW_HIGHLIGHT_COLUMNS_KEY","TREEGRID_ADDED_ROW_INITIAL_VALUE_KEYS_KEY","TREEGRID_ADDED_ROW_BASELINE_VALUES_KEY","TREEGRID_CELL_STYLE_BASELINE_VALUES_KEY","TREEGRID_ROW_SELECTED_KEY","DEFAULT_TREE_GRID_REQUIRED_CELL_MESSAGE_FACTORY","__name","label","DEFAULT_TREE_GRID_REQUIRED_CELL_TARGET_ROWS","normalizeTreeGridStringValues","value","isArray","item","normalizeTreeGridAddedRowHighlightColumns","markTreeGridRowAddedById","row","isTreeGridRowAddedById","addedById","isTreeGridAddedRow","added","isTreeGridChangedRow","changed","isTreeGridDeletedRow","deleted","normalizeTreeGridRequiredCellTargetRows","targetRows","normalizedTargetRows","targetRow","shouldValidateTreeGridRequiredCellRow","shouldValidateExplicitTreeGridRequiredCellRow","resolveLiveTreeGridRequiredCellRow","grid","_a","normalizeExplicitTreeGridRequiredCellRows","rows","seenRows","normalizedRows","liveRow","getTreeGridRequiredCellRows","options","appendTreeGridAddedRowHighlightColumn","col","currentColumns","removeTreeGridAddedRowHighlightColumn","nextColumns","column","getTreeGridAddedRowHighlightColumns","getTreeGridCellComparableValue","cellType","_c","_b","rawValue","_d","displayValue","_e","markTreeGridAddedRowBaselineValues","baselineValues","getTreeGridAddedRowBaselineValue","preserveTreeGridCellStyleBaseline","getTreeGridCellStyleBaseline","loadExportTreeGridExcel","exportTreeGridExcel","getDataRows","normalizeTreeGridRequiredCellColumns","columns","key","isPlainObject","isTreeGridEditableCell","canEdit","getTreeGridRequiredCellColumns","requiredColumns","isVisibleTreeGridColumn","getTreeGridRequiredCellLabel","caption","columnCaption","getTreeGridRequiredCellMessage","context","messageFactory","isBlankTreeGridRequiredCellValue","focusFirstTreeGridRequiredCellError","error","isTreeGridTimeDateFormat","format","isTreeGridTimeDateColumn","rowRecord","getTreeGridTimeDateDisplayValue","normalizeTreeGridExternalRow","normalizedRow","normalizeTreeGridExternalRows","isTreeGridExplicitEnabledConfigValue","isTreeGridSingleSelectionLayout","isTreeGridSelectedInitialValue","initialValues","omitTreeGridSelectedInitialValue","initialValueRecord","resolveRowInsertionTarget","insertPosition","parent","anchorRow","resolvedParent","next","assignInitialRowValues","initialValueKeys","rowKey","rowValue","assignEditableAddedRowColumns","editableColumns","targetColumns","isTreeGridDataKey","prefix","isTreeGridColumnDataKey","hasTreeGridUploadValue","isHiddenTreeGridValue","isTreeGridAddedRowInitialValueKey","getLiveTreeGridChangedRow","shouldIncludeTreeGridChangeDataKey","includeAddedInitialValues","normalizeTreeGridChangeRow","excludedKeys","without","getChangedRowsByStatus","status","get","isEmpty","normalizeTreeGridChangedRows","commitTreeGridActiveEdit","getTreeGridById","gridId","getTreeGridDataRowsById","reloadTreeGridBodyById","currentData","emitTreeGridBodyRowsChanged","addTreeGridRowById","canSelect","isSingleSelectionLayout","shouldResetSelection","shouldSelectAddedRow","resolvedInitialValues","resetTreeGridSelectionById","newRow","validateTreeGridRequiredCellsById","errors","refresh","message","firstError","getTreeGridRowChangesById","changesData","parseTreeGridXmlToJson","lowerCase","exportTreeGridToExcelById","title","getTreeGridSelectedRowsById","selectedRows","resolvedSelectedRows","resolveTreeGridSelectedRows","setTreeGridColumnVisibilityById","targetKey","highlightTreeGridCellById","targetOption","TREEGRID_CELL_CHANGED_CLASS","TREEGRID_CELL_HIGHLIGHT_COLOR","clearTreeGridCellHighlightById","styleBaseline","resetTreeGridSelectionsByIds","gridIds","resetTreeGridChangesById","resetTreeGridChangesByIds","setTreeGridColumnEnumOptionsById","columnName","valueKey","labelKeys","enumValues","option","labelKey","enumKeys"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@owp/core",
3
3
  "private": false,
4
- "version": "2.5.32",
4
+ "version": "2.5.34",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",