@owp/core 2.3.0 → 2.4.0

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 (80) hide show
  1. package/dist/_virtual/index10.js +2 -2
  2. package/dist/_virtual/index12.js +2 -2
  3. package/dist/_virtual/index13.js +2 -2
  4. package/dist/_virtual/index14.js +2 -2
  5. package/dist/_virtual/index15.js +2 -2
  6. package/dist/_virtual/index5.js +2 -2
  7. package/dist/components/OwpDialog/OwpDialog.js +30 -32
  8. package/dist/components/OwpDialog/OwpDialog.js.map +1 -1
  9. package/dist/components/OwpLayout/OwpLayout.js +39 -39
  10. package/dist/components/OwpLayout/OwpLayout.js.map +1 -1
  11. package/dist/components/OwpMrtTable/OwpMrtTable.js +393 -255
  12. package/dist/components/OwpMrtTable/OwpMrtTable.js.map +1 -1
  13. package/dist/components/OwpTable/OwpDataTable.js +45 -45
  14. package/dist/components/OwpTable/OwpDataTable.js.map +1 -1
  15. package/dist/components/OwpTable/OwpTable.js +6 -6
  16. package/dist/components/OwpTable/OwpTable.js.map +1 -1
  17. package/dist/components/OwpTable/OwpVerticalTable.js +55 -53
  18. package/dist/components/OwpTable/OwpVerticalTable.js.map +1 -1
  19. package/dist/components/OwpTreeGrid/OwpTreeGrid.js +169 -148
  20. package/dist/components/OwpTreeGrid/OwpTreeGrid.js.map +1 -1
  21. package/dist/components/OwpTreeGrid/internal/OwpTreeGridLoadingOverlay.js +1 -1
  22. package/dist/components/OwpTreeGrid/internal/OwpTreeGridLoadingOverlay.js.map +1 -1
  23. package/dist/components/OwpTreeGrid/internal/OwpTreeGridNoDataOverlay.js +1 -1
  24. package/dist/components/OwpTreeGrid/internal/OwpTreeGridNoDataOverlay.js.map +1 -1
  25. package/dist/components/OwpTreeGrid/{hooks → internal/hooks}/useOwpTreeGridOverlayFrame.js +1 -1
  26. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridOverlayFrame.js.map +1 -0
  27. package/dist/components/OwpTreeGrid/internal/treeGridColumnEditRules.js +84 -0
  28. package/dist/components/OwpTreeGrid/internal/treeGridColumnEditRules.js.map +1 -0
  29. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js +114 -103
  30. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js.map +1 -1
  31. package/dist/components/OwpTreeGrid/internal/utils/perf.js.map +1 -0
  32. package/dist/constants/storageKeys.js +1 -0
  33. package/dist/constants/storageKeys.js.map +1 -1
  34. package/dist/hooks/useCurrentUserSeq.js +11 -0
  35. package/dist/hooks/useCurrentUserSeq.js.map +1 -0
  36. package/dist/hooks.js +67 -64
  37. package/dist/hooks.js.map +1 -1
  38. package/dist/index.js +58 -59
  39. package/dist/layout/Layout.js +24 -24
  40. package/dist/layout/Layout.js.map +1 -1
  41. package/dist/layout/themeLayouts.js.map +1 -1
  42. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/index.js +1 -1
  43. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE39/index.js +1 -1
  44. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/index.js +1 -1
  45. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/index.js +1 -1
  46. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/GenericBarcode/index.js +1 -1
  47. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/index.js +1 -1
  48. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/MSI/index.js +1 -1
  49. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/codabar/index.js +1 -1
  50. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/pharmacode/index.js +1 -1
  51. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/renderers/index.js +1 -1
  52. package/dist/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +1 -1
  53. package/dist/owp-app.css +1 -1
  54. package/dist/types/components/OwpDialog/OwpDialog.d.ts +1 -9
  55. package/dist/types/components/OwpMrtTable/OwpMrtTable.d.ts +9 -0
  56. package/dist/types/components/OwpTable/OwpVerticalTable.d.ts +3 -1
  57. package/dist/types/components/OwpTreeGrid/OwpTreeGrid.d.ts +7 -1
  58. package/dist/types/components/OwpTreeGrid/index.d.ts +1 -1
  59. package/dist/types/components/OwpTreeGrid/internal/OwpTreeGridLoadingOverlay.d.ts +1 -1
  60. package/dist/types/components/OwpTreeGrid/internal/OwpTreeGridNoDataOverlay.d.ts +1 -1
  61. package/dist/types/components/OwpTreeGrid/internal/treeGridColumnEditRules.d.ts +60 -0
  62. package/dist/types/components/OwpTreeGrid/internal/treeGridRuntime.d.ts +7 -2
  63. package/dist/types/constants/storageKeys.d.ts +1 -0
  64. package/dist/types/hooks/index.d.ts +1 -0
  65. package/dist/types/hooks/useCurrentUserSeq.d.ts +8 -0
  66. package/dist/types/layout/Layout.d.ts +2 -0
  67. package/dist/types/layout/themeLayouts.d.ts +2 -0
  68. package/dist/types/utils/treeGridExportExcelUtil.d.ts +0 -4
  69. package/dist/types/utils/treeGridUtil.d.ts +0 -59
  70. package/dist/utils/treeGridExportExcelUtil.js +57 -58
  71. package/dist/utils/treeGridExportExcelUtil.js.map +1 -1
  72. package/dist/utils/treeGridUtil.js +69 -83
  73. package/dist/utils/treeGridUtil.js.map +1 -1
  74. package/dist/utils.js +71 -86
  75. package/package.json +2 -2
  76. package/dist/components/OwpTreeGrid/hooks/useOwpTreeGridOverlayFrame.js.map +0 -1
  77. package/dist/components/OwpTreeGrid/utils/perf.js.map +0 -1
  78. /package/dist/components/OwpTreeGrid/{utils → internal/utils}/perf.js +0 -0
  79. /package/dist/types/components/OwpTreeGrid/{hooks → internal/hooks}/useOwpTreeGridOverlayFrame.d.ts +0 -0
  80. /package/dist/types/components/OwpTreeGrid/{utils → internal/utils}/perf.d.ts +0 -0
@@ -13,7 +13,7 @@ const S = 200, F = /* @__PURE__ */ new Map(), rt = "엑셀 다운로드 중 오
13
13
  return;
14
14
  }
15
15
  setTimeout(t, 0);
16
- }), "yieldToMain"), H = /* @__PURE__ */ l((t, e, o) => (t == null ? void 0 : t(e, { defaultValue: o })) ?? o, "translateText"), at = /* @__PURE__ */ l((t) => t.ColNames ?? [], "getGridColNames"), D = /* @__PURE__ */ l((t) => t.Cols, "getGridCols"), it = /* @__PURE__ */ l((t) => t.Rows, "getGridRows"), lt = /* @__PURE__ */ l((t) => t.Header ?? null, "getGridHeader"), ct = /* @__PURE__ */ l((t) => t.Head ?? null, "getGridHead"), ft = /* @__PURE__ */ l((t) => t.ExportName, "getGridExportName"), dt = /* @__PURE__ */ l((t) => (t == null ? void 0 : t.firstChild) ?? null, "getRowFirstChild"), pt = /* @__PURE__ */ l((t) => (t == null ? void 0 : t.nextSibling) ?? null, "getRowNextSibling"), Y = /* @__PURE__ */ l((t) => (t ?? "sheet").trim().replace(/[\\/:*?"<>|]/g, "_") || "sheet", "getSafeExportName"), ut = /* @__PURE__ */ l((t) => Y(t).slice(0, 31) || "sheet", "getSafeSheetName"), U = /* @__PURE__ */ l((t) => {
16
+ }), "yieldToMain"), H = /* @__PURE__ */ l((t, e, o) => (t == null ? void 0 : t(e, { defaultValue: o })) ?? o, "translateText"), at = /* @__PURE__ */ l((t) => t.ColNames ?? [], "getGridColNames"), D = /* @__PURE__ */ l((t) => t.Cols, "getGridCols"), it = /* @__PURE__ */ l((t) => t.Rows, "getGridRows"), lt = /* @__PURE__ */ l((t) => t.Header ?? null, "getGridHeader"), ft = /* @__PURE__ */ l((t) => t.Head ?? null, "getGridHead"), ct = /* @__PURE__ */ l((t) => t.ExportName, "getGridExportName"), dt = /* @__PURE__ */ l((t) => (t == null ? void 0 : t.firstChild) ?? null, "getRowFirstChild"), pt = /* @__PURE__ */ l((t) => (t == null ? void 0 : t.nextSibling) ?? null, "getRowNextSibling"), Y = /* @__PURE__ */ l((t) => (t ?? "sheet").trim().replace(/[\\/:*?"<>|]/g, "_") || "sheet", "getSafeExportName"), ut = /* @__PURE__ */ l((t) => Y(t).slice(0, 31) || "sheet", "getSafeSheetName"), U = /* @__PURE__ */ l((t) => {
17
17
  const e = Number(t);
18
18
  return !Number.isFinite(e) || e < 1 ? 1 : Math.floor(e);
19
19
  }, "toPositiveInt"), O = /* @__PURE__ */ l((t) => t !== 0 && t !== !1 && t !== "0", "isVisible"), gt = /* @__PURE__ */ l((t) => (t == null ? void 0 : t.Type) === "Button" || `${(t == null ? void 0 : t.Button) ?? ""}` == "Button", "isButtonColumn"), wt = /* @__PURE__ */ l((t) => {
@@ -38,22 +38,22 @@ const S = 200, F = /* @__PURE__ */ new Map(), rt = "엑셀 다운로드 중 오
38
38
  !r || o.has(r) || r.Kind && r.Kind !== "Header" || (o.add(r), e.push(r));
39
39
  }, "appendHeaderRow");
40
40
  n(lt(t));
41
- let s = dt(ct(t));
41
+ let s = dt(ft(t));
42
42
  for (; s; )
43
43
  n(s), s = pt(s);
44
44
  return e;
45
- }, "getHeaderRows"), B = /* @__PURE__ */ l((t) => !!t && t.Kind === "Data" && O(t.Visible) && t.Fixed !== "Foot", "isExportDataRow");
45
+ }, "getHeaderRows"), V = /* @__PURE__ */ l((t) => !!t && t.Kind === "Data" && O(t.Visible) && t.Fixed !== "Foot", "isExportDataRow");
46
46
  function* k(t) {
47
47
  if (typeof t.GetFirst == "function" && typeof t.GetNext == "function") {
48
48
  let o = t.GetFirst();
49
49
  for (; o; )
50
- B(o) && (yield o), o = t.GetNext(o);
50
+ V(o) && (yield o), o = t.GetNext(o);
51
51
  return;
52
52
  }
53
53
  const e = it(t);
54
54
  for (const o in e) {
55
55
  const n = e[o];
56
- B(n) && (yield n);
56
+ V(n) && (yield n);
57
57
  }
58
58
  }
59
59
  l(k, "iterateExportDataRows");
@@ -63,28 +63,28 @@ const Rt = /* @__PURE__ */ l((t) => {
63
63
  o && (e += 1);
64
64
  return e;
65
65
  }, "getExportDataRowCount"), Ct = /* @__PURE__ */ l((t, e) => {
66
- const o = new Map(t.map((c, f) => [c, f])), n = new Map(
67
- e.map((c, f) => [c, f])
66
+ const o = new Map(t.map((f, c) => [f, c])), n = new Map(
67
+ e.map((f, c) => [f, c])
68
68
  ), s = new Array(t.length + 1).fill(0), r = new Array(t.length).fill(-1), i = new Array(t.length).fill(-1);
69
69
  let a = -1;
70
- for (let c = 0; c < t.length; c += 1) {
71
- const f = t[c];
72
- if (!f)
70
+ for (let f = 0; f < t.length; f += 1) {
71
+ const c = t[f];
72
+ if (!c)
73
73
  continue;
74
- const d = n.get(f) ?? -1;
75
- r[c] = d, s[c + 1] = s[c] + (d >= 0 ? 1 : 0);
74
+ const d = n.get(c) ?? -1;
75
+ r[f] = d, s[f + 1] = s[f] + (d >= 0 ? 1 : 0);
76
76
  }
77
- for (let c = t.length - 1; c >= 0; c -= 1)
78
- r[c] >= 0 && (a = c), i[c] = a;
79
- return (c, f) => {
80
- const d = o.get(c);
77
+ for (let f = t.length - 1; f >= 0; f -= 1)
78
+ r[f] >= 0 && (a = f), i[f] = a;
79
+ return (f, c) => {
80
+ const d = o.get(f);
81
81
  if (d === void 0)
82
82
  return {
83
83
  allColSpan: 1,
84
84
  visibleColIndex: null,
85
85
  visibleColSpan: 0
86
86
  };
87
- const g = U(f), p = Math.min(t.length - 1, d + g - 1), x = i[d], u = x >= 0 && x <= p ? r[x] : null, w = s[p + 1] - s[d];
87
+ const g = U(c), p = Math.min(t.length - 1, d + g - 1), x = i[d], u = x >= 0 && x <= p ? r[x] : null, w = s[p + 1] - s[d];
88
88
  return {
89
89
  allColSpan: g,
90
90
  visibleColIndex: u !== null && u >= 0 ? u : null,
@@ -111,7 +111,7 @@ const Rt = /* @__PURE__ */ l((t) => {
111
111
  return null;
112
112
  const n = $(t);
113
113
  return n.isValid() ? n.format(o) : null;
114
- }, "formatDateValue"), b = /* @__PURE__ */ l((t, e) => (e == null ? void 0 : e.Type) !== "Bool" ? null : t == null || t === "" ? "" : t === !0 || t === 1 || t === "1" || t === "Y" || t === "y" || t === "true" || t === "TRUE" ? "Y" : t === !1 || t === 0 || t === "0" || t === "N" || t === "n" || t === "false" || t === "FALSE" ? "N" : null, "formatBoolValue"), V = /* @__PURE__ */ l((t, e, o) => {
114
+ }, "formatDateValue"), b = /* @__PURE__ */ l((t, e) => (e == null ? void 0 : e.Type) !== "Bool" ? null : t == null || t === "" ? "" : t === !0 || t === 1 || t === "1" || t === "Y" || t === "y" || t === "true" || t === "TRUE" ? "Y" : t === !1 || t === 0 || t === "0" || t === "N" || t === "n" || t === "false" || t === "FALSE" ? "N" : null, "formatBoolValue"), B = /* @__PURE__ */ l((t, e, o) => {
115
115
  const n = e == null ? void 0 : e[o];
116
116
  return n != null ? String(n) : typeof t.GetCaption == "function" ? t.GetCaption(o) ?? "" : o;
117
117
  }, "getHeaderValue"), y = /* @__PURE__ */ l((t, e) => {
@@ -132,22 +132,22 @@ const Rt = /* @__PURE__ */ l((t) => {
132
132
  if (_(s))
133
133
  return y(s, n);
134
134
  if (typeof t.GetValue == "function") {
135
- const a = t.GetValue(e, o), c = b(a, n);
136
- if (c !== null)
137
- return y(c, n);
138
- const f = T(a, n);
135
+ const a = t.GetValue(e, o), f = b(a, n);
139
136
  if (f !== null)
140
137
  return y(f, n);
138
+ const c = T(a, n);
139
+ if (c !== null)
140
+ return y(c, n);
141
141
  if (_(a))
142
142
  return y(a, n);
143
143
  }
144
144
  if (typeof t.GetString == "function") {
145
- const a = t.GetString(e, o), c = b(a, n);
146
- if (c !== null)
147
- return y(c, n);
148
- const f = T(a, n);
145
+ const a = t.GetString(e, o), f = b(a, n);
149
146
  if (f !== null)
150
147
  return y(f, n);
148
+ const c = T(a, n);
149
+ if (c !== null)
150
+ return y(c, n);
151
151
  if (a != null)
152
152
  return y(a, n);
153
153
  }
@@ -162,7 +162,7 @@ const Rt = /* @__PURE__ */ l((t) => {
162
162
  const r = Math.min(
163
163
  U(o[`${t}RowSpan`]),
164
164
  Math.max(1, s - n)
165
- ), { allColSpan: i, visibleColIndex: a, visibleColSpan: c } = e(
165
+ ), { allColSpan: i, visibleColIndex: a, visibleColSpan: f } = e(
166
166
  t,
167
167
  o[`${t}Span`]
168
168
  );
@@ -170,7 +170,7 @@ const Rt = /* @__PURE__ */ l((t) => {
170
170
  allColSpan: i,
171
171
  rowSpan: r,
172
172
  visibleColIndex: a,
173
- visibleColSpan: c
173
+ visibleColSpan: f
174
174
  };
175
175
  }, "getCellSpanInfo"), z = /* @__PURE__ */ l((t, e, o) => {
176
176
  var n;
@@ -193,14 +193,14 @@ const Rt = /* @__PURE__ */ l((t) => {
193
193
  return [];
194
194
  const r = /* @__PURE__ */ new Map(), i = s.map(() => []);
195
195
  for (let a = 0; a < s.length; a += 1) {
196
- const c = s[a], f = i[a];
197
- if (!(!c || !f)) {
196
+ const f = s[a], c = i[a];
197
+ if (!(!f || !c)) {
198
198
  for (let d = 0; d < t.length; d += 1) {
199
199
  const g = t[d];
200
200
  if (!g || z(r, a, d))
201
201
  continue;
202
202
  const { allColSpan: p, rowSpan: x, visibleColIndex: u, visibleColSpan: w } = q({
203
- row: c,
203
+ row: f,
204
204
  colName: g,
205
205
  rowIndex: a,
206
206
  totalRows: s.length,
@@ -208,8 +208,8 @@ const Rt = /* @__PURE__ */ l((t) => {
208
208
  });
209
209
  if (J(r, a, d, x, p), u === null || w < 1)
210
210
  continue;
211
- const C = e(c, g);
212
- o == null || o(u, C), f.push({
211
+ const C = e(f, g);
212
+ o == null || o(u, C), c.push({
213
213
  colIndex: u,
214
214
  value: C,
215
215
  rowSpan: x,
@@ -228,14 +228,14 @@ const Rt = /* @__PURE__ */ l((t) => {
228
228
  visibleExportColumns: s
229
229
  }) => s.length ? o.length ? mt({
230
230
  allExportColumns: t,
231
- getValue: /* @__PURE__ */ l((r, i) => V(e, r, i), "getValue"),
231
+ getValue: /* @__PURE__ */ l((r, i) => B(e, r, i), "getValue"),
232
232
  resolveSpan: n,
233
233
  rows: o
234
234
  }) : [
235
235
  s.map((r, i) => ({
236
236
  colName: r,
237
237
  colIndex: i,
238
- value: V(e, null, r),
238
+ value: B(e, null, r),
239
239
  rowSpan: 1,
240
240
  colSpan: 1
241
241
  }))
@@ -251,22 +251,22 @@ const Rt = /* @__PURE__ */ l((t) => {
251
251
  const a = t.rowCount + 1;
252
252
  if (!i)
253
253
  return { startRowIndex: a, rowCount: 0, mergeRanges: [] };
254
- const c = Rt(n), f = /* @__PURE__ */ new Map(), d = [], g = [];
254
+ const f = Rt(n), c = /* @__PURE__ */ new Map(), d = [], g = [];
255
255
  let p = 0;
256
256
  for (const x of k(n)) {
257
257
  const u = new Array(i).fill("");
258
258
  for (let w = 0; w < e.length; w += 1) {
259
259
  const C = e[w];
260
- if (!C || z(f, p, w))
260
+ if (!C || z(c, p, w))
261
261
  continue;
262
262
  const { allColSpan: M, rowSpan: h, visibleColIndex: I, visibleColSpan: E } = q({
263
263
  row: x,
264
264
  colName: C,
265
265
  rowIndex: p,
266
- totalRows: c,
266
+ totalRows: f,
267
267
  resolveSpan: r
268
268
  });
269
- if (J(f, p, w, h, M), I === null || E < 1)
269
+ if (J(c, p, w, h, M), I === null || E < 1)
270
270
  continue;
271
271
  const A = Et(n, x, C, o[C]);
272
272
  s == null || s(I, A), u[I] = A ?? "", !(h === 1 && E === 1) && g.push({
@@ -276,16 +276,16 @@ const Rt = /* @__PURE__ */ l((t) => {
276
276
  endColIndex: I + E
277
277
  });
278
278
  }
279
- d.push(u), f.delete(p), p += 1, d.length === S ? (t.addRows(d), d.length = 0, await R()) : p % S === 0 && await R();
279
+ d.push(u), c.delete(p), p += 1, d.length === S ? (t.addRows(d), d.length = 0, await R()) : p % S === 0 && await R();
280
280
  }
281
281
  return d.length && t.addRows(d), { startRowIndex: a, rowCount: p, mergeRanges: g };
282
282
  }, "appendBodyRows"), Tt = /* @__PURE__ */ l(async (t, e, o) => {
283
283
  const n = t.rowCount + 1, s = [];
284
284
  for (let r = 0; r < e.length; r += 1) {
285
285
  const i = e[r] ?? [], a = new Array(o).fill("");
286
- for (let c = 0; c < i.length; c += 1) {
287
- const f = i[c];
288
- f && (a[f.colIndex] = f.value ?? "");
286
+ for (let f = 0; f < i.length; f += 1) {
287
+ const c = i[f];
288
+ c && (a[c.colIndex] = c.value ?? "");
289
289
  }
290
290
  s.push(a), s.length === S ? (t.addRows(s), s.length = 0, await R()) : (r + 1) % S === 0 && await R();
291
291
  }
@@ -344,13 +344,13 @@ const Rt = /* @__PURE__ */ l((t) => {
344
344
  const i = o[r];
345
345
  if (!i)
346
346
  continue;
347
- const a = e[i], c = Gt(a);
348
- if (c !== null) {
349
- n[r] = c, s[r] = !0;
347
+ const a = e[i], f = Gt(a);
348
+ if (f !== null) {
349
+ n[r] = f, s[r] = !0;
350
350
  continue;
351
351
  }
352
- const f = (typeof t.GetCaption == "function" ? t.GetCaption(i) : "") || i;
353
- n[r] = W(`${f}`.length);
352
+ const c = (typeof t.GetCaption == "function" ? t.GetCaption(i) : "") || i;
353
+ n[r] = W(`${c}`.length);
354
354
  }
355
355
  return {
356
356
  widths: n,
@@ -360,24 +360,24 @@ const Rt = /* @__PURE__ */ l((t) => {
360
360
  const a = n[r];
361
361
  if (a === void 0)
362
362
  return;
363
- const c = W(`${i ?? ""}`.length);
364
- c > a && (n[r] = c);
363
+ const f = W(`${i ?? ""}`.length);
364
+ f > a && (n[r] = f);
365
365
  }, "updateWidth")
366
366
  };
367
- }, "createColumnWidths"), Ht = /* @__PURE__ */ l(async (t, e) => {
367
+ }, "createColumnWidths"), Pt = /* @__PURE__ */ l(async (t, e) => {
368
368
  try {
369
369
  const o = typeof e == "string" ? { exportName: e } : e, n = o == null ? void 0 : o.t;
370
370
  if (!t)
371
371
  throw new Error(
372
372
  H(n, "Message.TreeGrid 인스턴스가 없습니다.", st)
373
373
  );
374
- const s = tt(), r = D(t), i = ht(t), a = xt(t, i), { widths: c, updateWidth: f } = Ft(t, r, a), d = yt(t), g = Ct(i, a), p = await Mt({
374
+ const s = tt(), r = D(t), i = ht(t), a = xt(t, i), { widths: f, updateWidth: c } = Ft(t, r, a), d = yt(t), g = Ct(i, a), p = await Mt({
375
375
  allExportColumns: i,
376
376
  grid: t,
377
377
  headerRows: d,
378
378
  resolveSpan: g,
379
379
  visibleExportColumns: a
380
- }), x = await s, u = new x.Workbook(), w = (o == null ? void 0 : o.exportName) ?? ft(t) ?? t.id ?? "sheet", C = o != null && o.useAppendCurrentDateTimeToExportName ? `-${$().format("YYYY-MM-DD-HH-mm-ss")}` : "", M = Y(`${w}${C}`), h = u.addWorksheet(ut(M)), I = await Tt(
380
+ }), x = await s, u = new x.Workbook(), w = (o == null ? void 0 : o.exportName) ?? ct(t) ?? t.id ?? "sheet", C = o != null && o.useAppendCurrentDateTimeToExportName ? `-${$().format("YYYY-MM-DD-HH-mm-ss")}` : "", M = Y(`${w}${C}`), h = u.addWorksheet(ut(M)), I = await Tt(
381
381
  h,
382
382
  p,
383
383
  a.length
@@ -390,7 +390,7 @@ const Rt = /* @__PURE__ */ l((t) => {
390
390
  allExportColumns: i,
391
391
  columns: r,
392
392
  grid: t,
393
- onVisibleEntry: f,
393
+ onVisibleEntry: c,
394
394
  resolveSpan: g,
395
395
  visibleColumnCount: a.length
396
396
  });
@@ -399,7 +399,7 @@ const Rt = /* @__PURE__ */ l((t) => {
399
399
  if (!N)
400
400
  continue;
401
401
  const X = r[N], G = h.getColumn(m + 1);
402
- G.width = c[m], G.alignment = {
402
+ G.width = f[m], G.alignment = {
403
403
  ...L,
404
404
  horizontal: St(X)
405
405
  };
@@ -433,9 +433,8 @@ const Rt = /* @__PURE__ */ l((t) => {
433
433
  }
434
434
  );
435
435
  }
436
- }, "exportTreeGridExcel"), Yt = Ht;
436
+ }, "exportTreeGridExcel");
437
437
  export {
438
- Yt as exportExcelByGrid,
439
- Ht as exportTreeGridExcel
438
+ Pt as exportTreeGridExcel
440
439
  };
441
440
  //# sourceMappingURL=treeGridExportExcelUtil.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"treeGridExportExcelUtil.js","sources":["../../src/utils/treeGridExportExcelUtil.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport type * as ExcelJS from 'exceljs';\nimport { enqueueSnackbar } from 'notistack';\nimport {\n DEFAULT_WRAP_CELL_ALIGNMENT as DEFAULT_ALIGNMENT,\n DEFAULT_HEADER_FILL as HEADER_FILL,\n DEFAULT_HEADER_FONT as HEADER_FONT,\n DEFAULT_THIN_BORDER as HEADER_BORDER,\n DEFAULT_VALUE_FONT as BODY_FONT,\n exportExcelByBuffer,\n} from './excelUtil';\nimport { loadExcelJSBrowser } from './exceljsBrowser';\n\ntype TreeGridCellValue = string | number | boolean | Date | null | undefined;\ntype TreeGridLike = TTGrid;\ntype TreeGridRowLike = TRow & Record<string, unknown>;\ntype TranslateFunction = (key: string, options?: Record<string, unknown>) => string;\n\nexport interface ExportTreeGridExcelOptions {\n useAppendCurrentDateTimeToExportName?: boolean;\n exportName?: string;\n t?: TranslateFunction;\n}\n\ninterface ExportCellEntry {\n colIndex: number;\n colSpan: number;\n rowSpan: number;\n value: TreeGridCellValue;\n}\n\ninterface SpanInfo {\n allColSpan: number;\n rowSpan: number;\n visibleColIndex: number | null;\n visibleColSpan: number;\n}\n\ninterface WorksheetMergeRange {\n startRowIndex: number;\n startColIndex: number;\n endRowIndex: number;\n endColIndex: number;\n}\n\nconst ROW_BATCH_SIZE = 200;\nconst DAYJS_DATE_FORMAT_CACHE = new Map<string, string | null>();\nconst DEFAULT_EXPORT_ERROR_MESSAGE = '엑셀 다운로드 중 오류가 발생했습니다.';\nconst DEFAULT_GRID_MISSING_MESSAGE = 'TreeGrid 인스턴스가 없습니다.';\n\nconst isPrimitiveCellValue = (value: unknown): value is TreeGridCellValue =>\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value instanceof Date;\n\nconst yieldToMain = () =>\n new Promise<void>((resolve) => {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => {\n resolve();\n });\n return;\n }\n\n setTimeout(resolve, 0);\n });\n\n/**\n * 번역 텍스트 반환\n * @param t 번역 함수\n * @param key 번역 키\n * @param defaultValue 기본 문구\n */\nconst translateText = (t: TranslateFunction | undefined, key: string, defaultValue: string) => {\n return t?.(key, { defaultValue }) ?? defaultValue;\n};\n\nconst getGridColNames = (grid: TreeGridLike) => (grid.ColNames as string[][] | undefined) ?? [];\n\nconst getGridCols = (grid: TreeGridLike) =>\n grid.Cols as unknown as Record<string, TCol | undefined>;\n\nconst getGridRows = (grid: TreeGridLike) => grid.Rows as unknown as Record<string, TreeGridRowLike>;\n\nconst getGridHeader = (grid: TreeGridLike) =>\n (grid.Header as TreeGridRowLike | null | undefined) ?? null;\n\nconst getGridHead = (grid: TreeGridLike) =>\n (grid.Head as TreeGridRowLike | null | undefined) ?? null;\n\nconst getGridExportName = (grid: TreeGridLike) =>\n (grid as TreeGridLike & { ExportName?: string }).ExportName;\n\nconst getRowFirstChild = (row: TreeGridRowLike | null | undefined) =>\n (row?.firstChild as TreeGridRowLike | null | undefined) ?? null;\n\nconst getRowNextSibling = (row: TreeGridRowLike | null | undefined) =>\n (row?.nextSibling as TreeGridRowLike | null | undefined) ?? null;\n\nconst getSafeExportName = (value?: string) => {\n const exportName = (value ?? 'sheet').trim();\n\n return exportName.replace(/[\\\\/:*?\"<>|]/g, '_') || 'sheet';\n};\n\nconst getSafeSheetName = (value?: string) => getSafeExportName(value).slice(0, 31) || 'sheet';\n\nconst toPositiveInt = (value: unknown) => {\n const parsedValue = Number(value);\n\n if (!Number.isFinite(parsedValue) || parsedValue < 1) {\n return 1;\n }\n\n return Math.floor(parsedValue);\n};\n\nconst isVisible = (value: unknown) => value !== 0 && value !== false && value !== '0';\n\nconst isButtonColumn = (column?: TCol) =>\n column?.Type === 'Button' ||\n `${(column as TCol & { Button?: unknown })?.Button ?? ''}` === 'Button';\n\nconst getColumnNames = (grid: TreeGridLike) => {\n const sectionColumnNames = getGridColNames(grid).flat();\n const orderedColumnNames =\n sectionColumnNames.length > 0\n ? sectionColumnNames\n : typeof grid.GetCols === 'function'\n ? grid.GetCols()\n : [];\n const uniqueColumnNames: string[] = [];\n const seenColumnNames = new Set<string>();\n\n for (const colName of orderedColumnNames) {\n if (!colName || seenColumnNames.has(colName)) {\n continue;\n }\n\n seenColumnNames.add(colName);\n uniqueColumnNames.push(colName);\n }\n\n return uniqueColumnNames;\n};\n\nconst getAllExportColumns = (grid: TreeGridLike) => {\n const columns = getGridCols(grid);\n\n return getColumnNames(grid).filter((colName) => {\n const column = columns[colName];\n\n if (!column || colName === 'Panel' || isButtonColumn(column)) {\n return false;\n }\n\n return column.CanExport !== 0;\n });\n};\n\nconst getVisibleExportColumns = (grid: TreeGridLike, allExportColumns: string[]) => {\n const columns = getGridCols(grid);\n\n return allExportColumns.filter((colName) => {\n const column = columns[colName];\n\n if (!column) {\n return false;\n }\n\n return isVisible(column.Visible);\n });\n};\n\nconst getHeaderRows = (grid: TreeGridLike) => {\n const headerRows: TreeGridRowLike[] = [];\n const seenRows = new Set<TreeGridRowLike>();\n\n const appendHeaderRow = (row: TreeGridRowLike | null) => {\n if (!row || seenRows.has(row)) {\n return;\n }\n\n if (row.Kind && row.Kind !== 'Header') {\n return;\n }\n\n seenRows.add(row);\n headerRows.push(row);\n };\n\n appendHeaderRow(getGridHeader(grid));\n\n let row = getRowFirstChild(getGridHead(grid));\n\n while (row) {\n appendHeaderRow(row);\n row = getRowNextSibling(row);\n }\n\n return headerRows;\n};\n\n/**\n * TreeGrid 엑셀 대상 데이터 행 여부\n * @param row TreeGrid 행\n */\nconst isExportDataRow = (row: TreeGridRowLike | null | undefined) => {\n return !!row && row.Kind === 'Data' && isVisible(row.Visible) && row.Fixed !== 'Foot';\n};\n\n/**\n * TreeGrid 엑셀 대상 데이터 행 순회기\n * @param grid TreeGrid 인스턴스\n */\nfunction* iterateExportDataRows(grid: TreeGridLike): Generator<TreeGridRowLike> {\n if (typeof grid.GetFirst === 'function' && typeof grid.GetNext === 'function') {\n let row = grid.GetFirst() as TreeGridRowLike | null | undefined;\n\n while (row) {\n if (isExportDataRow(row)) {\n yield row;\n }\n\n row = grid.GetNext(row) as TreeGridRowLike | null | undefined;\n }\n\n return;\n }\n\n const rows = getGridRows(grid);\n\n for (const rowKey in rows) {\n const row = rows[rowKey];\n\n if (!isExportDataRow(row)) {\n continue;\n }\n\n yield row;\n }\n}\n\n/**\n * TreeGrid 엑셀 대상 데이터 행 수\n * @param grid TreeGrid 인스턴스\n */\nconst getExportDataRowCount = (grid: TreeGridLike) => {\n let count = 0;\n\n for (const row of iterateExportDataRows(grid)) {\n if (!row) {\n continue;\n }\n\n count += 1;\n }\n\n return count;\n};\n\nconst createSpanResolver = (allExportColumns: string[], visibleExportColumns: string[]) => {\n const allColumnIndexMap = new Map(allExportColumns.map((colName, index) => [colName, index]));\n const visibleColumnIndexMap = new Map(\n visibleExportColumns.map((colName, index) => [colName, index]),\n );\n const visiblePrefixCounts = new Array(allExportColumns.length + 1).fill(0);\n const visibleIndexByAllIndex = new Array(allExportColumns.length).fill(-1);\n const nextVisibleAllIndexByAllIndex = new Array(allExportColumns.length).fill(-1);\n let nextVisibleAllIndex = -1;\n\n for (let allIndex = 0; allIndex < allExportColumns.length; allIndex += 1) {\n const colName = allExportColumns[allIndex];\n\n if (!colName) {\n continue;\n }\n\n const visibleIndex = visibleColumnIndexMap.get(colName) ?? -1;\n\n visibleIndexByAllIndex[allIndex] = visibleIndex;\n visiblePrefixCounts[allIndex + 1] = visiblePrefixCounts[allIndex] + (visibleIndex >= 0 ? 1 : 0);\n }\n\n for (let allIndex = allExportColumns.length - 1; allIndex >= 0; allIndex -= 1) {\n if (visibleIndexByAllIndex[allIndex] >= 0) {\n nextVisibleAllIndex = allIndex;\n }\n\n nextVisibleAllIndexByAllIndex[allIndex] = nextVisibleAllIndex;\n }\n\n return (colName: string, rawColSpan: unknown) => {\n const startIndex = allColumnIndexMap.get(colName);\n\n if (startIndex === undefined) {\n return {\n allColSpan: 1,\n visibleColIndex: null,\n visibleColSpan: 0,\n };\n }\n\n const allColSpan = toPositiveInt(rawColSpan);\n const endIndex = Math.min(allExportColumns.length - 1, startIndex + allColSpan - 1);\n const firstVisibleAllIndex = nextVisibleAllIndexByAllIndex[startIndex];\n const visibleColIndex =\n firstVisibleAllIndex >= 0 && firstVisibleAllIndex <= endIndex\n ? visibleIndexByAllIndex[firstVisibleAllIndex]\n : null;\n const visibleColSpan = visiblePrefixCounts[endIndex + 1] - visiblePrefixCounts[startIndex];\n\n return {\n allColSpan,\n visibleColIndex: visibleColIndex !== null && visibleColIndex >= 0 ? visibleColIndex : null,\n visibleColSpan,\n };\n };\n};\n\nconst getCellHorizontalAlignment = (column?: TCol) => {\n const align = `${column?.Align ?? ''}`.toLowerCase();\n\n if (align === 'left' || align === 'center' || align === 'right') {\n return align;\n }\n\n if (column?.Type === 'Int' || column?.Type === 'Float') {\n return 'right';\n }\n\n if (column?.Type === 'Date' || column?.Type === 'Enum') {\n return 'center';\n }\n\n return 'left';\n};\n\nconst getDayjsDateFormat = (column?: TCol) => {\n if (column?.Type !== 'Date') {\n return null;\n }\n\n const rawFormat = `${column.Format ?? ''}`.trim();\n\n if (!rawFormat) {\n return null;\n }\n\n const cachedFormat = DAYJS_DATE_FORMAT_CACHE.get(rawFormat);\n\n if (cachedFormat !== undefined) {\n return cachedFormat;\n }\n\n const minuteTwoPlaceholder = '__TREEGRID_MINUTE_TWO__';\n const minuteOnePlaceholder = '__TREEGRID_MINUTE_ONE__';\n const convertedFormat = rawFormat\n .replace(/yyyy/g, 'YYYY')\n .replace(/yy/g, 'YY')\n .replace(/tt/g, 'A')\n .replace(/hh/g, 'HH')\n .replace(/\\bh\\b/g, 'H')\n .replace(/(H{1,2}:)mm/g, `$1${minuteTwoPlaceholder}`)\n .replace(/(H{1,2}:)m/g, `$1${minuteOnePlaceholder}`)\n .replace(/mmmm/g, 'MMMM')\n .replace(/mmm/g, 'MMM')\n .replace(/mm/g, 'MM')\n .replace(/\\bm\\b/g, 'M')\n .replace(new RegExp(minuteTwoPlaceholder, 'g'), 'mm')\n .replace(new RegExp(minuteOnePlaceholder, 'g'), 'm')\n .replace(/dddd/g, 'dddd')\n .replace(/ddd/g, 'ddd')\n .replace(/dd/g, 'DD')\n .replace(/\\bd\\b/g, 'D');\n\n DAYJS_DATE_FORMAT_CACHE.set(rawFormat, convertedFormat);\n\n return convertedFormat;\n};\n\nconst formatDateValue = (value: unknown, column?: TCol) => {\n const dayjsFormat = getDayjsDateFormat(column);\n\n if (!dayjsFormat) {\n return null;\n }\n\n if (!isPrimitiveCellValue(value) || value === null || value === undefined || value === '') {\n return null;\n }\n\n if (typeof value === 'boolean') {\n return null;\n }\n\n const parsedDate = dayjs(value);\n\n if (!parsedDate.isValid()) {\n return null;\n }\n\n return parsedDate.format(dayjsFormat);\n};\n\nconst formatBoolValue = (value: unknown, column?: TCol) => {\n if (column?.Type !== 'Bool') {\n return null;\n }\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n if (\n value === true ||\n value === 1 ||\n value === '1' ||\n value === 'Y' ||\n value === 'y' ||\n value === 'true' ||\n value === 'TRUE'\n ) {\n return 'Y';\n }\n\n if (\n value === false ||\n value === 0 ||\n value === '0' ||\n value === 'N' ||\n value === 'n' ||\n value === 'false' ||\n value === 'FALSE'\n ) {\n return 'N';\n }\n\n return null;\n};\n\nconst getHeaderValue = (grid: TreeGridLike, headerRow: TreeGridRowLike | null, colName: string) => {\n const headerValue = headerRow?.[colName];\n\n if (headerValue !== undefined && headerValue !== null) {\n return String(headerValue);\n }\n\n if (typeof grid.GetCaption === 'function') {\n return grid.GetCaption(colName) ?? '';\n }\n\n return colName;\n};\n\nconst appendHtmlPostfix = (value: TreeGridCellValue, column?: TCol) => {\n const htmlPostfix = `${(column as TCol & { HtmlPostfix?: unknown })?.HtmlPostfix ?? ''}`;\n\n if (!htmlPostfix || value === null || value === undefined || value === '') {\n return value;\n }\n\n return `${value}${htmlPostfix}`;\n};\n\nconst getBodyValue = (grid: TreeGridLike, row: TreeGridRowLike, colName: string, column?: TCol) => {\n if (column?.Type === 'Enum' && typeof grid.GetString === 'function') {\n const displayValue = grid.GetString(row, colName);\n\n if (displayValue !== undefined && displayValue !== null) {\n return appendHtmlPostfix(displayValue, column);\n }\n }\n\n const rowValue = row[colName];\n const formattedBoolValue = formatBoolValue(rowValue, column);\n\n if (formattedBoolValue !== null) {\n return appendHtmlPostfix(formattedBoolValue, column);\n }\n\n const formattedRowValue = formatDateValue(rowValue, column);\n\n if (formattedRowValue !== null) {\n return appendHtmlPostfix(formattedRowValue, column);\n }\n\n if (isPrimitiveCellValue(rowValue)) {\n return appendHtmlPostfix(rowValue, column);\n }\n\n if (typeof grid.GetValue === 'function') {\n const rawValue = grid.GetValue(row, colName);\n const formattedRawBoolValue = formatBoolValue(rawValue, column);\n\n if (formattedRawBoolValue !== null) {\n return appendHtmlPostfix(formattedRawBoolValue, column);\n }\n\n const formattedRawValue = formatDateValue(rawValue, column);\n\n if (formattedRawValue !== null) {\n return appendHtmlPostfix(formattedRawValue, column);\n }\n\n if (isPrimitiveCellValue(rawValue)) {\n return appendHtmlPostfix(rawValue, column);\n }\n }\n\n if (typeof grid.GetString === 'function') {\n const displayValue = grid.GetString(row, colName);\n const formattedDisplayBoolValue = formatBoolValue(displayValue, column);\n\n if (formattedDisplayBoolValue !== null) {\n return appendHtmlPostfix(formattedDisplayBoolValue, column);\n }\n\n const formattedDisplayValue = formatDateValue(displayValue, column);\n\n if (formattedDisplayValue !== null) {\n return appendHtmlPostfix(formattedDisplayValue, column);\n }\n\n if (displayValue !== undefined && displayValue !== null) {\n return appendHtmlPostfix(displayValue, column);\n }\n }\n\n return '';\n};\n\nconst getCellSpanInfo = ({\n colName,\n resolveSpan,\n row,\n rowIndex,\n totalRows,\n}: {\n colName: string;\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n row: TreeGridRowLike;\n rowIndex: number;\n totalRows: number;\n}): SpanInfo => {\n const rowSpan = Math.min(\n toPositiveInt(row[`${colName}RowSpan`]),\n Math.max(1, totalRows - rowIndex),\n );\n const { allColSpan, visibleColIndex, visibleColSpan } = resolveSpan(\n colName,\n row[`${colName}Span`],\n );\n\n return {\n allColSpan,\n rowSpan,\n visibleColIndex,\n visibleColSpan,\n };\n};\n\nconst isOccupied = (occupiedCells: Map<number, Set<number>>, rowIndex: number, colIndex: number) =>\n occupiedCells.get(rowIndex)?.has(colIndex);\n\nconst markOccupied = (\n occupiedCells: Map<number, Set<number>>,\n rowIndex: number,\n colIndex: number,\n rowSpan: number,\n colSpan: number,\n) => {\n for (let targetRowIndex = rowIndex; targetRowIndex < rowIndex + rowSpan; targetRowIndex += 1) {\n const occupiedRow = occupiedCells.get(targetRowIndex) ?? new Set<number>();\n\n for (let targetColIndex = colIndex; targetColIndex < colIndex + colSpan; targetColIndex += 1) {\n occupiedRow.add(targetColIndex);\n }\n\n occupiedCells.set(targetRowIndex, occupiedRow);\n }\n};\n\nconst createEntryRows = async ({\n allExportColumns,\n getValue,\n onVisibleEntry,\n resolveSpan,\n rows,\n}: {\n allExportColumns: string[];\n getValue: (row: TreeGridRowLike, colName: string) => TreeGridCellValue;\n onVisibleEntry?: (colIndex: number, value: TreeGridCellValue) => void;\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n rows: TreeGridRowLike[];\n}) => {\n if (!allExportColumns.length) {\n return [];\n }\n\n const occupiedCells = new Map<number, Set<number>>();\n const entryRows: ExportCellEntry[][] = rows.map(() => []);\n\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex += 1) {\n const row = rows[rowIndex];\n const currentEntryRow = entryRows[rowIndex];\n\n if (!row || !currentEntryRow) {\n continue;\n }\n\n for (let allColIndex = 0; allColIndex < allExportColumns.length; allColIndex += 1) {\n const colName = allExportColumns[allColIndex];\n\n if (!colName) {\n continue;\n }\n\n if (isOccupied(occupiedCells, rowIndex, allColIndex)) {\n continue;\n }\n\n const { allColSpan, rowSpan, visibleColIndex, visibleColSpan } = getCellSpanInfo({\n row,\n colName,\n rowIndex,\n totalRows: rows.length,\n resolveSpan,\n });\n\n markOccupied(occupiedCells, rowIndex, allColIndex, rowSpan, allColSpan);\n\n if (visibleColIndex === null || visibleColSpan < 1) {\n continue;\n }\n\n const value = getValue(row, colName);\n\n onVisibleEntry?.(visibleColIndex, value);\n currentEntryRow.push({\n colIndex: visibleColIndex,\n value,\n rowSpan,\n colSpan: visibleColSpan,\n });\n }\n\n if ((rowIndex + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n\n return entryRows;\n};\n\nconst createHeaderEntries = async ({\n allExportColumns,\n grid,\n headerRows,\n resolveSpan,\n visibleExportColumns,\n}: {\n allExportColumns: string[];\n grid: TreeGridLike;\n headerRows: TreeGridRowLike[];\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n visibleExportColumns: string[];\n}) => {\n if (!visibleExportColumns.length) {\n return [];\n }\n\n if (!headerRows.length) {\n return [\n visibleExportColumns.map((colName, colIndex) => ({\n colName,\n colIndex,\n value: getHeaderValue(grid, null, colName),\n rowSpan: 1,\n colSpan: 1,\n })),\n ];\n }\n\n return createEntryRows({\n allExportColumns,\n getValue: (row, colName) => getHeaderValue(grid, row, colName),\n resolveSpan,\n rows: headerRows,\n });\n};\n\n/**\n * TreeGrid body 행 추가\n * @param worksheet 엑셀 워크시트\n * @param allExportColumns 내보내기 전체 컬럼 목록\n * @param columns 컬럼 맵\n * @param grid TreeGrid 인스턴스\n * @param onVisibleEntry 표시 셀 콜백\n * @param resolveSpan span 계산 함수\n * @param visibleColumnCount 표시 컬럼 수\n */\nconst appendBodyRows = async ({\n worksheet,\n allExportColumns,\n columns,\n grid,\n onVisibleEntry,\n resolveSpan,\n visibleColumnCount,\n}: {\n worksheet: ExcelJS.Worksheet;\n allExportColumns: string[];\n columns: Record<string, TCol | undefined>;\n grid: TreeGridLike;\n onVisibleEntry?: (colIndex: number, value: TreeGridCellValue) => void;\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n visibleColumnCount: number;\n}) => {\n const startRowIndex = worksheet.rowCount + 1;\n\n if (!visibleColumnCount) {\n return { startRowIndex, rowCount: 0, mergeRanges: [] as WorksheetMergeRange[] };\n }\n\n const totalRows = getExportDataRowCount(grid);\n const occupiedCells = new Map<number, Set<number>>();\n const pendingRows: TreeGridCellValue[][] = [];\n const mergeRanges: WorksheetMergeRange[] = [];\n let rowIndex = 0;\n\n for (const row of iterateExportDataRows(grid)) {\n const rowValues = new Array<TreeGridCellValue>(visibleColumnCount).fill('');\n\n for (let allColIndex = 0; allColIndex < allExportColumns.length; allColIndex += 1) {\n const colName = allExportColumns[allColIndex];\n\n if (!colName || isOccupied(occupiedCells, rowIndex, allColIndex)) {\n continue;\n }\n\n const { allColSpan, rowSpan, visibleColIndex, visibleColSpan } = getCellSpanInfo({\n row,\n colName,\n rowIndex,\n totalRows,\n resolveSpan,\n });\n\n markOccupied(occupiedCells, rowIndex, allColIndex, rowSpan, allColSpan);\n\n if (visibleColIndex === null || visibleColSpan < 1) {\n continue;\n }\n\n const value = getBodyValue(grid, row, colName, columns[colName]);\n\n onVisibleEntry?.(visibleColIndex, value);\n rowValues[visibleColIndex] = value ?? '';\n\n if (rowSpan === 1 && visibleColSpan === 1) {\n continue;\n }\n\n mergeRanges.push({\n startRowIndex: startRowIndex + rowIndex,\n startColIndex: visibleColIndex + 1,\n endRowIndex: startRowIndex + rowIndex + rowSpan - 1,\n endColIndex: visibleColIndex + visibleColSpan,\n });\n }\n\n pendingRows.push(rowValues);\n occupiedCells.delete(rowIndex);\n rowIndex += 1;\n\n if (pendingRows.length === ROW_BATCH_SIZE) {\n worksheet.addRows(pendingRows);\n pendingRows.length = 0;\n await yieldToMain();\n } else if (rowIndex % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n\n if (pendingRows.length) {\n worksheet.addRows(pendingRows);\n }\n\n return { startRowIndex, rowCount: rowIndex, mergeRanges };\n};\n\nconst appendEntryRows = async (\n worksheet: ExcelJS.Worksheet,\n entryRows: ExportCellEntry[][],\n visibleColumnCount: number,\n) => {\n const startRowIndex = worksheet.rowCount + 1;\n const pendingRows: TreeGridCellValue[][] = [];\n\n for (let rowIndex = 0; rowIndex < entryRows.length; rowIndex += 1) {\n const entries = entryRows[rowIndex] ?? [];\n const rowValues = new Array<TreeGridCellValue>(visibleColumnCount).fill('');\n\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex += 1) {\n const entry = entries[entryIndex];\n\n if (!entry) {\n continue;\n }\n\n rowValues[entry.colIndex] = entry.value ?? '';\n }\n\n pendingRows.push(rowValues);\n\n if (pendingRows.length === ROW_BATCH_SIZE) {\n worksheet.addRows(pendingRows);\n pendingRows.length = 0;\n await yieldToMain();\n } else if ((rowIndex + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n\n if (pendingRows.length) {\n worksheet.addRows(pendingRows);\n }\n\n return startRowIndex;\n};\n\nconst mergeEntryRows = async (\n worksheet: ExcelJS.Worksheet,\n entryRows: ExportCellEntry[][],\n startRowIndex: number,\n) => {\n for (let rowOffset = 0; rowOffset < entryRows.length; rowOffset += 1) {\n const entries = entryRows[rowOffset] ?? [];\n\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex += 1) {\n const entry = entries[entryIndex];\n\n if (!entry) {\n continue;\n }\n\n if (entry.rowSpan === 1 && entry.colSpan === 1) {\n continue;\n }\n\n worksheet.mergeCells(\n startRowIndex + rowOffset,\n entry.colIndex + 1,\n startRowIndex + rowOffset + entry.rowSpan - 1,\n entry.colIndex + entry.colSpan,\n );\n }\n\n if ((rowOffset + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\n/**\n * 워크시트 병합 범위 적용\n * @param worksheet 엑셀 워크시트\n * @param mergeRanges 병합 범위 목록\n */\nconst mergeWorksheetRanges = async (\n worksheet: ExcelJS.Worksheet,\n mergeRanges: WorksheetMergeRange[],\n) => {\n for (let index = 0; index < mergeRanges.length; index += 1) {\n const mergeRange = mergeRanges[index];\n\n if (!mergeRange) {\n continue;\n }\n\n worksheet.mergeCells(\n mergeRange.startRowIndex,\n mergeRange.startColIndex,\n mergeRange.endRowIndex,\n mergeRange.endColIndex,\n );\n\n if ((index + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\nconst styleHeaderRows = async (\n worksheet: ExcelJS.Worksheet,\n startRowIndex: number,\n rowCount: number,\n visibleColumnCount: number,\n) => {\n for (let rowOffset = 0; rowOffset < rowCount; rowOffset += 1) {\n const row = worksheet.getRow(startRowIndex + rowOffset);\n\n row.font = HEADER_FONT;\n\n for (let colIndex = 1; colIndex <= visibleColumnCount; colIndex += 1) {\n const cell = row.getCell(colIndex);\n\n cell.fill = HEADER_FILL;\n cell.border = HEADER_BORDER;\n cell.alignment = {\n ...DEFAULT_ALIGNMENT,\n horizontal: 'center',\n };\n }\n\n if ((rowOffset + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\nconst styleBodyRows = async (\n worksheet: ExcelJS.Worksheet,\n startRowIndex: number,\n rowCount: number,\n visibleColumnCount: number,\n) => {\n for (let rowOffset = 0; rowOffset < rowCount; rowOffset += 1) {\n const row = worksheet.getRow(startRowIndex + rowOffset);\n\n row.font = BODY_FONT;\n\n for (let colIndex = 1; colIndex <= visibleColumnCount; colIndex += 1) {\n row.getCell(colIndex).border = HEADER_BORDER;\n }\n\n if ((rowOffset + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\nconst getPreferredColumnWidth = (column?: TCol) => {\n const layoutWidth = Number(column?.Width ?? column?.MinWidth);\n\n if (!Number.isFinite(layoutWidth) || layoutWidth <= 0) {\n return null;\n }\n\n return Math.min(Math.max(Math.round(layoutWidth / 8), 10), 50);\n};\n\nconst getAutoColumnWidth = (valueLength: number) => Math.min(Math.max(valueLength + 4, 10), 50);\n\nconst createColumnWidths = (\n grid: TreeGridLike,\n columns: Record<string, TCol | undefined>,\n visibleExportColumns: string[],\n) => {\n const widths = new Array<number>(visibleExportColumns.length).fill(10);\n const fixedWidthMap = new Array<boolean>(visibleExportColumns.length).fill(false);\n\n for (let index = 0; index < visibleExportColumns.length; index += 1) {\n const colName = visibleExportColumns[index];\n\n if (!colName) {\n continue;\n }\n\n const column = columns[colName];\n const preferredWidth = getPreferredColumnWidth(column);\n\n if (preferredWidth !== null) {\n widths[index] = preferredWidth;\n fixedWidthMap[index] = true;\n continue;\n }\n\n const caption =\n (typeof grid.GetCaption === 'function' ? grid.GetCaption(colName) : '') || colName;\n\n widths[index] = getAutoColumnWidth(`${caption}`.length);\n }\n\n return {\n widths,\n updateWidth: (colIndex: number, value: TreeGridCellValue) => {\n if (fixedWidthMap[colIndex]) {\n return;\n }\n\n const currentWidth = widths[colIndex];\n\n if (currentWidth === undefined) {\n return;\n }\n\n const nextWidth = getAutoColumnWidth(`${value ?? ''}`.length);\n\n if (nextWidth > currentWidth) {\n widths[colIndex] = nextWidth;\n }\n },\n };\n};\n\n/**\n * TreeGrid 엑셀 내보내기\n * @param grid TreeGrid 인스턴스\n * @param options 다운로드 옵션\n */\nexport const exportTreeGridExcel = async (\n grid: TreeGridLike | null | undefined,\n options?: ExportTreeGridExcelOptions | string,\n) => {\n try {\n const resolvedOptions = typeof options === 'string' ? { exportName: options } : options;\n const t = resolvedOptions?.t;\n\n if (!grid) {\n throw new Error(\n translateText(t, 'Message.TreeGrid 인스턴스가 없습니다.', DEFAULT_GRID_MISSING_MESSAGE),\n );\n }\n\n const excelJSBrowserPromise = loadExcelJSBrowser();\n const columns = getGridCols(grid);\n const allExportColumns = getAllExportColumns(grid);\n const visibleExportColumns = getVisibleExportColumns(grid, allExportColumns);\n const { widths, updateWidth } = createColumnWidths(grid, columns, visibleExportColumns);\n\n const headerRows = getHeaderRows(grid);\n const resolveSpan = createSpanResolver(allExportColumns, visibleExportColumns);\n const headerEntries = await createHeaderEntries({\n allExportColumns,\n grid,\n headerRows,\n resolveSpan,\n visibleExportColumns,\n });\n const ExcelJSBrowser = await excelJSBrowserPromise;\n const workbook = new ExcelJSBrowser.Workbook();\n const baseExportName =\n resolvedOptions?.exportName ?? getGridExportName(grid) ?? grid.id ?? 'sheet';\n const exportNameSuffix = resolvedOptions?.useAppendCurrentDateTimeToExportName\n ? `-${dayjs().format('YYYY-MM-DD-HH-mm-ss')}`\n : '';\n const resolvedExportName = getSafeExportName(`${baseExportName}${exportNameSuffix}`);\n const worksheet = workbook.addWorksheet(getSafeSheetName(resolvedExportName));\n const headerStartRowIndex = await appendEntryRows(\n worksheet,\n headerEntries,\n visibleExportColumns.length,\n );\n const {\n startRowIndex: bodyStartRowIndex,\n rowCount: bodyRowCount,\n mergeRanges: bodyMergeRanges,\n } = await appendBodyRows({\n worksheet,\n allExportColumns,\n columns,\n grid,\n onVisibleEntry: updateWidth,\n resolveSpan,\n visibleColumnCount: visibleExportColumns.length,\n });\n\n for (let index = 0; index < visibleExportColumns.length; index += 1) {\n const colName = visibleExportColumns[index];\n\n if (!colName) {\n continue;\n }\n\n const column = columns[colName];\n const worksheetColumn = worksheet.getColumn(index + 1);\n\n worksheetColumn.width = widths[index];\n worksheetColumn.alignment = {\n ...DEFAULT_ALIGNMENT,\n horizontal: getCellHorizontalAlignment(column),\n };\n }\n\n await mergeEntryRows(worksheet, headerEntries, headerStartRowIndex);\n await mergeWorksheetRanges(worksheet, bodyMergeRanges);\n await styleHeaderRows(\n worksheet,\n headerStartRowIndex,\n headerEntries.length,\n visibleExportColumns.length,\n );\n await styleBodyRows(\n worksheet,\n bodyStartRowIndex,\n bodyRowCount,\n visibleExportColumns.length,\n );\n\n worksheet.views = [{ state: 'frozen', ySplit: headerEntries.length }];\n\n await yieldToMain();\n\n const buffer = await workbook.xlsx.writeBuffer({\n useSharedStrings: false,\n useStyles: true,\n });\n\n exportExcelByBuffer(buffer, resolvedExportName);\n } catch (error) {\n const resolvedOptions = typeof options === 'string' ? { exportName: options } : options;\n const t = resolvedOptions?.t;\n\n enqueueSnackbar(\n error instanceof Error\n ? error.message\n : translateText(\n t,\n 'Message.엑셀 다운로드 중 오류가 발생했습니다.',\n DEFAULT_EXPORT_ERROR_MESSAGE,\n ),\n {\n variant: 'error',\n },\n );\n }\n};\n\n/**\n * @deprecated `exportTreeGridExcel` 사용\n */\nexport const exportExcelByGrid = exportTreeGridExcel;\n"],"names":["ROW_BATCH_SIZE","DAYJS_DATE_FORMAT_CACHE","DEFAULT_EXPORT_ERROR_MESSAGE","DEFAULT_GRID_MISSING_MESSAGE","isPrimitiveCellValue","__name","value","yieldToMain","resolve","translateText","key","defaultValue","getGridColNames","grid","getGridCols","getGridRows","getGridHeader","getGridHead","getGridExportName","getRowFirstChild","row","getRowNextSibling","getSafeExportName","getSafeSheetName","toPositiveInt","parsedValue","isVisible","isButtonColumn","column","getColumnNames","sectionColumnNames","orderedColumnNames","uniqueColumnNames","seenColumnNames","colName","getAllExportColumns","columns","getVisibleExportColumns","allExportColumns","getHeaderRows","headerRows","seenRows","appendHeaderRow","isExportDataRow","iterateExportDataRows","rows","rowKey","getExportDataRowCount","count","createSpanResolver","visibleExportColumns","allColumnIndexMap","index","visibleColumnIndexMap","visiblePrefixCounts","visibleIndexByAllIndex","nextVisibleAllIndexByAllIndex","nextVisibleAllIndex","allIndex","visibleIndex","rawColSpan","startIndex","allColSpan","endIndex","firstVisibleAllIndex","visibleColIndex","visibleColSpan","getCellHorizontalAlignment","align","getDayjsDateFormat","rawFormat","cachedFormat","minuteTwoPlaceholder","minuteOnePlaceholder","convertedFormat","formatDateValue","dayjsFormat","parsedDate","dayjs","formatBoolValue","getHeaderValue","headerRow","headerValue","appendHtmlPostfix","htmlPostfix","getBodyValue","displayValue","rowValue","formattedBoolValue","formattedRowValue","rawValue","formattedRawBoolValue","formattedRawValue","formattedDisplayBoolValue","formattedDisplayValue","getCellSpanInfo","resolveSpan","rowIndex","totalRows","rowSpan","isOccupied","occupiedCells","colIndex","_a","markOccupied","colSpan","targetRowIndex","occupiedRow","targetColIndex","createEntryRows","getValue","onVisibleEntry","entryRows","currentEntryRow","allColIndex","createHeaderEntries","appendBodyRows","worksheet","visibleColumnCount","startRowIndex","pendingRows","mergeRanges","rowValues","appendEntryRows","entries","entryIndex","entry","mergeEntryRows","rowOffset","mergeWorksheetRanges","mergeRange","styleHeaderRows","rowCount","HEADER_FONT","cell","HEADER_FILL","HEADER_BORDER","DEFAULT_ALIGNMENT","styleBodyRows","BODY_FONT","getPreferredColumnWidth","layoutWidth","getAutoColumnWidth","valueLength","createColumnWidths","widths","fixedWidthMap","preferredWidth","caption","currentWidth","nextWidth","exportTreeGridExcel","options","resolvedOptions","t","excelJSBrowserPromise","loadExcelJSBrowser","updateWidth","headerEntries","ExcelJSBrowser","workbook","baseExportName","exportNameSuffix","resolvedExportName","headerStartRowIndex","bodyStartRowIndex","bodyRowCount","bodyMergeRanges","worksheetColumn","buffer","exportExcelByBuffer","error","enqueueSnackbar","exportExcelByGrid"],"mappings":"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"}
1
+ {"version":3,"file":"treeGridExportExcelUtil.js","sources":["../../src/utils/treeGridExportExcelUtil.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport type * as ExcelJS from 'exceljs';\nimport { enqueueSnackbar } from 'notistack';\nimport {\n DEFAULT_WRAP_CELL_ALIGNMENT as DEFAULT_ALIGNMENT,\n DEFAULT_HEADER_FILL as HEADER_FILL,\n DEFAULT_HEADER_FONT as HEADER_FONT,\n DEFAULT_THIN_BORDER as HEADER_BORDER,\n DEFAULT_VALUE_FONT as BODY_FONT,\n exportExcelByBuffer,\n} from './excelUtil';\nimport { loadExcelJSBrowser } from './exceljsBrowser';\n\ntype TreeGridCellValue = string | number | boolean | Date | null | undefined;\ntype TreeGridLike = TTGrid;\ntype TreeGridRowLike = TRow & Record<string, unknown>;\ntype TranslateFunction = (key: string, options?: Record<string, unknown>) => string;\n\nexport interface ExportTreeGridExcelOptions {\n useAppendCurrentDateTimeToExportName?: boolean;\n exportName?: string;\n t?: TranslateFunction;\n}\n\ninterface ExportCellEntry {\n colIndex: number;\n colSpan: number;\n rowSpan: number;\n value: TreeGridCellValue;\n}\n\ninterface SpanInfo {\n allColSpan: number;\n rowSpan: number;\n visibleColIndex: number | null;\n visibleColSpan: number;\n}\n\ninterface WorksheetMergeRange {\n startRowIndex: number;\n startColIndex: number;\n endRowIndex: number;\n endColIndex: number;\n}\n\nconst ROW_BATCH_SIZE = 200;\nconst DAYJS_DATE_FORMAT_CACHE = new Map<string, string | null>();\nconst DEFAULT_EXPORT_ERROR_MESSAGE = '엑셀 다운로드 중 오류가 발생했습니다.';\nconst DEFAULT_GRID_MISSING_MESSAGE = 'TreeGrid 인스턴스가 없습니다.';\n\nconst isPrimitiveCellValue = (value: unknown): value is TreeGridCellValue =>\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value instanceof Date;\n\nconst yieldToMain = () =>\n new Promise<void>((resolve) => {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => {\n resolve();\n });\n return;\n }\n\n setTimeout(resolve, 0);\n });\n\n/**\n * 번역 텍스트 반환\n * @param t 번역 함수\n * @param key 번역 키\n * @param defaultValue 기본 문구\n */\nconst translateText = (t: TranslateFunction | undefined, key: string, defaultValue: string) => {\n return t?.(key, { defaultValue }) ?? defaultValue;\n};\n\nconst getGridColNames = (grid: TreeGridLike) => (grid.ColNames as string[][] | undefined) ?? [];\n\nconst getGridCols = (grid: TreeGridLike) =>\n grid.Cols as unknown as Record<string, TCol | undefined>;\n\nconst getGridRows = (grid: TreeGridLike) => grid.Rows as unknown as Record<string, TreeGridRowLike>;\n\nconst getGridHeader = (grid: TreeGridLike) =>\n (grid.Header as TreeGridRowLike | null | undefined) ?? null;\n\nconst getGridHead = (grid: TreeGridLike) =>\n (grid.Head as TreeGridRowLike | null | undefined) ?? null;\n\nconst getGridExportName = (grid: TreeGridLike) =>\n (grid as TreeGridLike & { ExportName?: string }).ExportName;\n\nconst getRowFirstChild = (row: TreeGridRowLike | null | undefined) =>\n (row?.firstChild as TreeGridRowLike | null | undefined) ?? null;\n\nconst getRowNextSibling = (row: TreeGridRowLike | null | undefined) =>\n (row?.nextSibling as TreeGridRowLike | null | undefined) ?? null;\n\nconst getSafeExportName = (value?: string) => {\n const exportName = (value ?? 'sheet').trim();\n\n return exportName.replace(/[\\\\/:*?\"<>|]/g, '_') || 'sheet';\n};\n\nconst getSafeSheetName = (value?: string) => getSafeExportName(value).slice(0, 31) || 'sheet';\n\nconst toPositiveInt = (value: unknown) => {\n const parsedValue = Number(value);\n\n if (!Number.isFinite(parsedValue) || parsedValue < 1) {\n return 1;\n }\n\n return Math.floor(parsedValue);\n};\n\nconst isVisible = (value: unknown) => value !== 0 && value !== false && value !== '0';\n\nconst isButtonColumn = (column?: TCol) =>\n column?.Type === 'Button' ||\n `${(column as TCol & { Button?: unknown })?.Button ?? ''}` === 'Button';\n\nconst getColumnNames = (grid: TreeGridLike) => {\n const sectionColumnNames = getGridColNames(grid).flat();\n const orderedColumnNames =\n sectionColumnNames.length > 0\n ? sectionColumnNames\n : typeof grid.GetCols === 'function'\n ? grid.GetCols()\n : [];\n const uniqueColumnNames: string[] = [];\n const seenColumnNames = new Set<string>();\n\n for (const colName of orderedColumnNames) {\n if (!colName || seenColumnNames.has(colName)) {\n continue;\n }\n\n seenColumnNames.add(colName);\n uniqueColumnNames.push(colName);\n }\n\n return uniqueColumnNames;\n};\n\nconst getAllExportColumns = (grid: TreeGridLike) => {\n const columns = getGridCols(grid);\n\n return getColumnNames(grid).filter((colName) => {\n const column = columns[colName];\n\n if (!column || colName === 'Panel' || isButtonColumn(column)) {\n return false;\n }\n\n return column.CanExport !== 0;\n });\n};\n\nconst getVisibleExportColumns = (grid: TreeGridLike, allExportColumns: string[]) => {\n const columns = getGridCols(grid);\n\n return allExportColumns.filter((colName) => {\n const column = columns[colName];\n\n if (!column) {\n return false;\n }\n\n return isVisible(column.Visible);\n });\n};\n\nconst getHeaderRows = (grid: TreeGridLike) => {\n const headerRows: TreeGridRowLike[] = [];\n const seenRows = new Set<TreeGridRowLike>();\n\n const appendHeaderRow = (row: TreeGridRowLike | null) => {\n if (!row || seenRows.has(row)) {\n return;\n }\n\n if (row.Kind && row.Kind !== 'Header') {\n return;\n }\n\n seenRows.add(row);\n headerRows.push(row);\n };\n\n appendHeaderRow(getGridHeader(grid));\n\n let row = getRowFirstChild(getGridHead(grid));\n\n while (row) {\n appendHeaderRow(row);\n row = getRowNextSibling(row);\n }\n\n return headerRows;\n};\n\n/**\n * TreeGrid 엑셀 대상 데이터 행 여부\n * @param row TreeGrid 행\n */\nconst isExportDataRow = (row: TreeGridRowLike | null | undefined) => {\n return !!row && row.Kind === 'Data' && isVisible(row.Visible) && row.Fixed !== 'Foot';\n};\n\n/**\n * TreeGrid 엑셀 대상 데이터 행 순회기\n * @param grid TreeGrid 인스턴스\n */\nfunction* iterateExportDataRows(grid: TreeGridLike): Generator<TreeGridRowLike> {\n if (typeof grid.GetFirst === 'function' && typeof grid.GetNext === 'function') {\n let row = grid.GetFirst() as TreeGridRowLike | null | undefined;\n\n while (row) {\n if (isExportDataRow(row)) {\n yield row;\n }\n\n row = grid.GetNext(row) as TreeGridRowLike | null | undefined;\n }\n\n return;\n }\n\n const rows = getGridRows(grid);\n\n for (const rowKey in rows) {\n const row = rows[rowKey];\n\n if (!isExportDataRow(row)) {\n continue;\n }\n\n yield row;\n }\n}\n\n/**\n * TreeGrid 엑셀 대상 데이터 행 수\n * @param grid TreeGrid 인스턴스\n */\nconst getExportDataRowCount = (grid: TreeGridLike) => {\n let count = 0;\n\n for (const row of iterateExportDataRows(grid)) {\n if (!row) {\n continue;\n }\n\n count += 1;\n }\n\n return count;\n};\n\nconst createSpanResolver = (allExportColumns: string[], visibleExportColumns: string[]) => {\n const allColumnIndexMap = new Map(allExportColumns.map((colName, index) => [colName, index]));\n const visibleColumnIndexMap = new Map(\n visibleExportColumns.map((colName, index) => [colName, index]),\n );\n const visiblePrefixCounts = new Array(allExportColumns.length + 1).fill(0);\n const visibleIndexByAllIndex = new Array(allExportColumns.length).fill(-1);\n const nextVisibleAllIndexByAllIndex = new Array(allExportColumns.length).fill(-1);\n let nextVisibleAllIndex = -1;\n\n for (let allIndex = 0; allIndex < allExportColumns.length; allIndex += 1) {\n const colName = allExportColumns[allIndex];\n\n if (!colName) {\n continue;\n }\n\n const visibleIndex = visibleColumnIndexMap.get(colName) ?? -1;\n\n visibleIndexByAllIndex[allIndex] = visibleIndex;\n visiblePrefixCounts[allIndex + 1] = visiblePrefixCounts[allIndex] + (visibleIndex >= 0 ? 1 : 0);\n }\n\n for (let allIndex = allExportColumns.length - 1; allIndex >= 0; allIndex -= 1) {\n if (visibleIndexByAllIndex[allIndex] >= 0) {\n nextVisibleAllIndex = allIndex;\n }\n\n nextVisibleAllIndexByAllIndex[allIndex] = nextVisibleAllIndex;\n }\n\n return (colName: string, rawColSpan: unknown) => {\n const startIndex = allColumnIndexMap.get(colName);\n\n if (startIndex === undefined) {\n return {\n allColSpan: 1,\n visibleColIndex: null,\n visibleColSpan: 0,\n };\n }\n\n const allColSpan = toPositiveInt(rawColSpan);\n const endIndex = Math.min(allExportColumns.length - 1, startIndex + allColSpan - 1);\n const firstVisibleAllIndex = nextVisibleAllIndexByAllIndex[startIndex];\n const visibleColIndex =\n firstVisibleAllIndex >= 0 && firstVisibleAllIndex <= endIndex\n ? visibleIndexByAllIndex[firstVisibleAllIndex]\n : null;\n const visibleColSpan = visiblePrefixCounts[endIndex + 1] - visiblePrefixCounts[startIndex];\n\n return {\n allColSpan,\n visibleColIndex: visibleColIndex !== null && visibleColIndex >= 0 ? visibleColIndex : null,\n visibleColSpan,\n };\n };\n};\n\nconst getCellHorizontalAlignment = (column?: TCol) => {\n const align = `${column?.Align ?? ''}`.toLowerCase();\n\n if (align === 'left' || align === 'center' || align === 'right') {\n return align;\n }\n\n if (column?.Type === 'Int' || column?.Type === 'Float') {\n return 'right';\n }\n\n if (column?.Type === 'Date' || column?.Type === 'Enum') {\n return 'center';\n }\n\n return 'left';\n};\n\nconst getDayjsDateFormat = (column?: TCol) => {\n if (column?.Type !== 'Date') {\n return null;\n }\n\n const rawFormat = `${column.Format ?? ''}`.trim();\n\n if (!rawFormat) {\n return null;\n }\n\n const cachedFormat = DAYJS_DATE_FORMAT_CACHE.get(rawFormat);\n\n if (cachedFormat !== undefined) {\n return cachedFormat;\n }\n\n const minuteTwoPlaceholder = '__TREEGRID_MINUTE_TWO__';\n const minuteOnePlaceholder = '__TREEGRID_MINUTE_ONE__';\n const convertedFormat = rawFormat\n .replace(/yyyy/g, 'YYYY')\n .replace(/yy/g, 'YY')\n .replace(/tt/g, 'A')\n .replace(/hh/g, 'HH')\n .replace(/\\bh\\b/g, 'H')\n .replace(/(H{1,2}:)mm/g, `$1${minuteTwoPlaceholder}`)\n .replace(/(H{1,2}:)m/g, `$1${minuteOnePlaceholder}`)\n .replace(/mmmm/g, 'MMMM')\n .replace(/mmm/g, 'MMM')\n .replace(/mm/g, 'MM')\n .replace(/\\bm\\b/g, 'M')\n .replace(new RegExp(minuteTwoPlaceholder, 'g'), 'mm')\n .replace(new RegExp(minuteOnePlaceholder, 'g'), 'm')\n .replace(/dddd/g, 'dddd')\n .replace(/ddd/g, 'ddd')\n .replace(/dd/g, 'DD')\n .replace(/\\bd\\b/g, 'D');\n\n DAYJS_DATE_FORMAT_CACHE.set(rawFormat, convertedFormat);\n\n return convertedFormat;\n};\n\nconst formatDateValue = (value: unknown, column?: TCol) => {\n const dayjsFormat = getDayjsDateFormat(column);\n\n if (!dayjsFormat) {\n return null;\n }\n\n if (!isPrimitiveCellValue(value) || value === null || value === undefined || value === '') {\n return null;\n }\n\n if (typeof value === 'boolean') {\n return null;\n }\n\n const parsedDate = dayjs(value);\n\n if (!parsedDate.isValid()) {\n return null;\n }\n\n return parsedDate.format(dayjsFormat);\n};\n\nconst formatBoolValue = (value: unknown, column?: TCol) => {\n if (column?.Type !== 'Bool') {\n return null;\n }\n\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n if (\n value === true ||\n value === 1 ||\n value === '1' ||\n value === 'Y' ||\n value === 'y' ||\n value === 'true' ||\n value === 'TRUE'\n ) {\n return 'Y';\n }\n\n if (\n value === false ||\n value === 0 ||\n value === '0' ||\n value === 'N' ||\n value === 'n' ||\n value === 'false' ||\n value === 'FALSE'\n ) {\n return 'N';\n }\n\n return null;\n};\n\nconst getHeaderValue = (grid: TreeGridLike, headerRow: TreeGridRowLike | null, colName: string) => {\n const headerValue = headerRow?.[colName];\n\n if (headerValue !== undefined && headerValue !== null) {\n return String(headerValue);\n }\n\n if (typeof grid.GetCaption === 'function') {\n return grid.GetCaption(colName) ?? '';\n }\n\n return colName;\n};\n\nconst appendHtmlPostfix = (value: TreeGridCellValue, column?: TCol) => {\n const htmlPostfix = `${(column as TCol & { HtmlPostfix?: unknown })?.HtmlPostfix ?? ''}`;\n\n if (!htmlPostfix || value === null || value === undefined || value === '') {\n return value;\n }\n\n return `${value}${htmlPostfix}`;\n};\n\nconst getBodyValue = (grid: TreeGridLike, row: TreeGridRowLike, colName: string, column?: TCol) => {\n if (column?.Type === 'Enum' && typeof grid.GetString === 'function') {\n const displayValue = grid.GetString(row, colName);\n\n if (displayValue !== undefined && displayValue !== null) {\n return appendHtmlPostfix(displayValue, column);\n }\n }\n\n const rowValue = row[colName];\n const formattedBoolValue = formatBoolValue(rowValue, column);\n\n if (formattedBoolValue !== null) {\n return appendHtmlPostfix(formattedBoolValue, column);\n }\n\n const formattedRowValue = formatDateValue(rowValue, column);\n\n if (formattedRowValue !== null) {\n return appendHtmlPostfix(formattedRowValue, column);\n }\n\n if (isPrimitiveCellValue(rowValue)) {\n return appendHtmlPostfix(rowValue, column);\n }\n\n if (typeof grid.GetValue === 'function') {\n const rawValue = grid.GetValue(row, colName);\n const formattedRawBoolValue = formatBoolValue(rawValue, column);\n\n if (formattedRawBoolValue !== null) {\n return appendHtmlPostfix(formattedRawBoolValue, column);\n }\n\n const formattedRawValue = formatDateValue(rawValue, column);\n\n if (formattedRawValue !== null) {\n return appendHtmlPostfix(formattedRawValue, column);\n }\n\n if (isPrimitiveCellValue(rawValue)) {\n return appendHtmlPostfix(rawValue, column);\n }\n }\n\n if (typeof grid.GetString === 'function') {\n const displayValue = grid.GetString(row, colName);\n const formattedDisplayBoolValue = formatBoolValue(displayValue, column);\n\n if (formattedDisplayBoolValue !== null) {\n return appendHtmlPostfix(formattedDisplayBoolValue, column);\n }\n\n const formattedDisplayValue = formatDateValue(displayValue, column);\n\n if (formattedDisplayValue !== null) {\n return appendHtmlPostfix(formattedDisplayValue, column);\n }\n\n if (displayValue !== undefined && displayValue !== null) {\n return appendHtmlPostfix(displayValue, column);\n }\n }\n\n return '';\n};\n\nconst getCellSpanInfo = ({\n colName,\n resolveSpan,\n row,\n rowIndex,\n totalRows,\n}: {\n colName: string;\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n row: TreeGridRowLike;\n rowIndex: number;\n totalRows: number;\n}): SpanInfo => {\n const rowSpan = Math.min(\n toPositiveInt(row[`${colName}RowSpan`]),\n Math.max(1, totalRows - rowIndex),\n );\n const { allColSpan, visibleColIndex, visibleColSpan } = resolveSpan(\n colName,\n row[`${colName}Span`],\n );\n\n return {\n allColSpan,\n rowSpan,\n visibleColIndex,\n visibleColSpan,\n };\n};\n\nconst isOccupied = (occupiedCells: Map<number, Set<number>>, rowIndex: number, colIndex: number) =>\n occupiedCells.get(rowIndex)?.has(colIndex);\n\nconst markOccupied = (\n occupiedCells: Map<number, Set<number>>,\n rowIndex: number,\n colIndex: number,\n rowSpan: number,\n colSpan: number,\n) => {\n for (let targetRowIndex = rowIndex; targetRowIndex < rowIndex + rowSpan; targetRowIndex += 1) {\n const occupiedRow = occupiedCells.get(targetRowIndex) ?? new Set<number>();\n\n for (let targetColIndex = colIndex; targetColIndex < colIndex + colSpan; targetColIndex += 1) {\n occupiedRow.add(targetColIndex);\n }\n\n occupiedCells.set(targetRowIndex, occupiedRow);\n }\n};\n\nconst createEntryRows = async ({\n allExportColumns,\n getValue,\n onVisibleEntry,\n resolveSpan,\n rows,\n}: {\n allExportColumns: string[];\n getValue: (row: TreeGridRowLike, colName: string) => TreeGridCellValue;\n onVisibleEntry?: (colIndex: number, value: TreeGridCellValue) => void;\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n rows: TreeGridRowLike[];\n}) => {\n if (!allExportColumns.length) {\n return [];\n }\n\n const occupiedCells = new Map<number, Set<number>>();\n const entryRows: ExportCellEntry[][] = rows.map(() => []);\n\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex += 1) {\n const row = rows[rowIndex];\n const currentEntryRow = entryRows[rowIndex];\n\n if (!row || !currentEntryRow) {\n continue;\n }\n\n for (let allColIndex = 0; allColIndex < allExportColumns.length; allColIndex += 1) {\n const colName = allExportColumns[allColIndex];\n\n if (!colName) {\n continue;\n }\n\n if (isOccupied(occupiedCells, rowIndex, allColIndex)) {\n continue;\n }\n\n const { allColSpan, rowSpan, visibleColIndex, visibleColSpan } = getCellSpanInfo({\n row,\n colName,\n rowIndex,\n totalRows: rows.length,\n resolveSpan,\n });\n\n markOccupied(occupiedCells, rowIndex, allColIndex, rowSpan, allColSpan);\n\n if (visibleColIndex === null || visibleColSpan < 1) {\n continue;\n }\n\n const value = getValue(row, colName);\n\n onVisibleEntry?.(visibleColIndex, value);\n currentEntryRow.push({\n colIndex: visibleColIndex,\n value,\n rowSpan,\n colSpan: visibleColSpan,\n });\n }\n\n if ((rowIndex + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n\n return entryRows;\n};\n\nconst createHeaderEntries = async ({\n allExportColumns,\n grid,\n headerRows,\n resolveSpan,\n visibleExportColumns,\n}: {\n allExportColumns: string[];\n grid: TreeGridLike;\n headerRows: TreeGridRowLike[];\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n visibleExportColumns: string[];\n}) => {\n if (!visibleExportColumns.length) {\n return [];\n }\n\n if (!headerRows.length) {\n return [\n visibleExportColumns.map((colName, colIndex) => ({\n colName,\n colIndex,\n value: getHeaderValue(grid, null, colName),\n rowSpan: 1,\n colSpan: 1,\n })),\n ];\n }\n\n return createEntryRows({\n allExportColumns,\n getValue: (row, colName) => getHeaderValue(grid, row, colName),\n resolveSpan,\n rows: headerRows,\n });\n};\n\n/**\n * TreeGrid body 행 추가\n * @param worksheet 엑셀 워크시트\n * @param allExportColumns 내보내기 전체 컬럼 목록\n * @param columns 컬럼 맵\n * @param grid TreeGrid 인스턴스\n * @param onVisibleEntry 표시 셀 콜백\n * @param resolveSpan span 계산 함수\n * @param visibleColumnCount 표시 컬럼 수\n */\nconst appendBodyRows = async ({\n worksheet,\n allExportColumns,\n columns,\n grid,\n onVisibleEntry,\n resolveSpan,\n visibleColumnCount,\n}: {\n worksheet: ExcelJS.Worksheet;\n allExportColumns: string[];\n columns: Record<string, TCol | undefined>;\n grid: TreeGridLike;\n onVisibleEntry?: (colIndex: number, value: TreeGridCellValue) => void;\n resolveSpan: (colName: string, rawColSpan: unknown) => Omit<SpanInfo, 'rowSpan'>;\n visibleColumnCount: number;\n}) => {\n const startRowIndex = worksheet.rowCount + 1;\n\n if (!visibleColumnCount) {\n return { startRowIndex, rowCount: 0, mergeRanges: [] as WorksheetMergeRange[] };\n }\n\n const totalRows = getExportDataRowCount(grid);\n const occupiedCells = new Map<number, Set<number>>();\n const pendingRows: TreeGridCellValue[][] = [];\n const mergeRanges: WorksheetMergeRange[] = [];\n let rowIndex = 0;\n\n for (const row of iterateExportDataRows(grid)) {\n const rowValues = new Array<TreeGridCellValue>(visibleColumnCount).fill('');\n\n for (let allColIndex = 0; allColIndex < allExportColumns.length; allColIndex += 1) {\n const colName = allExportColumns[allColIndex];\n\n if (!colName || isOccupied(occupiedCells, rowIndex, allColIndex)) {\n continue;\n }\n\n const { allColSpan, rowSpan, visibleColIndex, visibleColSpan } = getCellSpanInfo({\n row,\n colName,\n rowIndex,\n totalRows,\n resolveSpan,\n });\n\n markOccupied(occupiedCells, rowIndex, allColIndex, rowSpan, allColSpan);\n\n if (visibleColIndex === null || visibleColSpan < 1) {\n continue;\n }\n\n const value = getBodyValue(grid, row, colName, columns[colName]);\n\n onVisibleEntry?.(visibleColIndex, value);\n rowValues[visibleColIndex] = value ?? '';\n\n if (rowSpan === 1 && visibleColSpan === 1) {\n continue;\n }\n\n mergeRanges.push({\n startRowIndex: startRowIndex + rowIndex,\n startColIndex: visibleColIndex + 1,\n endRowIndex: startRowIndex + rowIndex + rowSpan - 1,\n endColIndex: visibleColIndex + visibleColSpan,\n });\n }\n\n pendingRows.push(rowValues);\n occupiedCells.delete(rowIndex);\n rowIndex += 1;\n\n if (pendingRows.length === ROW_BATCH_SIZE) {\n worksheet.addRows(pendingRows);\n pendingRows.length = 0;\n await yieldToMain();\n } else if (rowIndex % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n\n if (pendingRows.length) {\n worksheet.addRows(pendingRows);\n }\n\n return { startRowIndex, rowCount: rowIndex, mergeRanges };\n};\n\nconst appendEntryRows = async (\n worksheet: ExcelJS.Worksheet,\n entryRows: ExportCellEntry[][],\n visibleColumnCount: number,\n) => {\n const startRowIndex = worksheet.rowCount + 1;\n const pendingRows: TreeGridCellValue[][] = [];\n\n for (let rowIndex = 0; rowIndex < entryRows.length; rowIndex += 1) {\n const entries = entryRows[rowIndex] ?? [];\n const rowValues = new Array<TreeGridCellValue>(visibleColumnCount).fill('');\n\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex += 1) {\n const entry = entries[entryIndex];\n\n if (!entry) {\n continue;\n }\n\n rowValues[entry.colIndex] = entry.value ?? '';\n }\n\n pendingRows.push(rowValues);\n\n if (pendingRows.length === ROW_BATCH_SIZE) {\n worksheet.addRows(pendingRows);\n pendingRows.length = 0;\n await yieldToMain();\n } else if ((rowIndex + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n\n if (pendingRows.length) {\n worksheet.addRows(pendingRows);\n }\n\n return startRowIndex;\n};\n\nconst mergeEntryRows = async (\n worksheet: ExcelJS.Worksheet,\n entryRows: ExportCellEntry[][],\n startRowIndex: number,\n) => {\n for (let rowOffset = 0; rowOffset < entryRows.length; rowOffset += 1) {\n const entries = entryRows[rowOffset] ?? [];\n\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex += 1) {\n const entry = entries[entryIndex];\n\n if (!entry) {\n continue;\n }\n\n if (entry.rowSpan === 1 && entry.colSpan === 1) {\n continue;\n }\n\n worksheet.mergeCells(\n startRowIndex + rowOffset,\n entry.colIndex + 1,\n startRowIndex + rowOffset + entry.rowSpan - 1,\n entry.colIndex + entry.colSpan,\n );\n }\n\n if ((rowOffset + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\n/**\n * 워크시트 병합 범위 적용\n * @param worksheet 엑셀 워크시트\n * @param mergeRanges 병합 범위 목록\n */\nconst mergeWorksheetRanges = async (\n worksheet: ExcelJS.Worksheet,\n mergeRanges: WorksheetMergeRange[],\n) => {\n for (let index = 0; index < mergeRanges.length; index += 1) {\n const mergeRange = mergeRanges[index];\n\n if (!mergeRange) {\n continue;\n }\n\n worksheet.mergeCells(\n mergeRange.startRowIndex,\n mergeRange.startColIndex,\n mergeRange.endRowIndex,\n mergeRange.endColIndex,\n );\n\n if ((index + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\nconst styleHeaderRows = async (\n worksheet: ExcelJS.Worksheet,\n startRowIndex: number,\n rowCount: number,\n visibleColumnCount: number,\n) => {\n for (let rowOffset = 0; rowOffset < rowCount; rowOffset += 1) {\n const row = worksheet.getRow(startRowIndex + rowOffset);\n\n row.font = HEADER_FONT;\n\n for (let colIndex = 1; colIndex <= visibleColumnCount; colIndex += 1) {\n const cell = row.getCell(colIndex);\n\n cell.fill = HEADER_FILL;\n cell.border = HEADER_BORDER;\n cell.alignment = {\n ...DEFAULT_ALIGNMENT,\n horizontal: 'center',\n };\n }\n\n if ((rowOffset + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\nconst styleBodyRows = async (\n worksheet: ExcelJS.Worksheet,\n startRowIndex: number,\n rowCount: number,\n visibleColumnCount: number,\n) => {\n for (let rowOffset = 0; rowOffset < rowCount; rowOffset += 1) {\n const row = worksheet.getRow(startRowIndex + rowOffset);\n\n row.font = BODY_FONT;\n\n for (let colIndex = 1; colIndex <= visibleColumnCount; colIndex += 1) {\n row.getCell(colIndex).border = HEADER_BORDER;\n }\n\n if ((rowOffset + 1) % ROW_BATCH_SIZE === 0) {\n await yieldToMain();\n }\n }\n};\n\nconst getPreferredColumnWidth = (column?: TCol) => {\n const layoutWidth = Number(column?.Width ?? column?.MinWidth);\n\n if (!Number.isFinite(layoutWidth) || layoutWidth <= 0) {\n return null;\n }\n\n return Math.min(Math.max(Math.round(layoutWidth / 8), 10), 50);\n};\n\nconst getAutoColumnWidth = (valueLength: number) => Math.min(Math.max(valueLength + 4, 10), 50);\n\nconst createColumnWidths = (\n grid: TreeGridLike,\n columns: Record<string, TCol | undefined>,\n visibleExportColumns: string[],\n) => {\n const widths = new Array<number>(visibleExportColumns.length).fill(10);\n const fixedWidthMap = new Array<boolean>(visibleExportColumns.length).fill(false);\n\n for (let index = 0; index < visibleExportColumns.length; index += 1) {\n const colName = visibleExportColumns[index];\n\n if (!colName) {\n continue;\n }\n\n const column = columns[colName];\n const preferredWidth = getPreferredColumnWidth(column);\n\n if (preferredWidth !== null) {\n widths[index] = preferredWidth;\n fixedWidthMap[index] = true;\n continue;\n }\n\n const caption =\n (typeof grid.GetCaption === 'function' ? grid.GetCaption(colName) : '') || colName;\n\n widths[index] = getAutoColumnWidth(`${caption}`.length);\n }\n\n return {\n widths,\n updateWidth: (colIndex: number, value: TreeGridCellValue) => {\n if (fixedWidthMap[colIndex]) {\n return;\n }\n\n const currentWidth = widths[colIndex];\n\n if (currentWidth === undefined) {\n return;\n }\n\n const nextWidth = getAutoColumnWidth(`${value ?? ''}`.length);\n\n if (nextWidth > currentWidth) {\n widths[colIndex] = nextWidth;\n }\n },\n };\n};\n\n/**\n * TreeGrid 엑셀 내보내기\n * @param grid TreeGrid 인스턴스\n * @param options 다운로드 옵션\n */\nexport const exportTreeGridExcel = async (\n grid: TreeGridLike | null | undefined,\n options?: ExportTreeGridExcelOptions | string,\n) => {\n try {\n const resolvedOptions = typeof options === 'string' ? { exportName: options } : options;\n const t = resolvedOptions?.t;\n\n if (!grid) {\n throw new Error(\n translateText(t, 'Message.TreeGrid 인스턴스가 없습니다.', DEFAULT_GRID_MISSING_MESSAGE),\n );\n }\n\n const excelJSBrowserPromise = loadExcelJSBrowser();\n const columns = getGridCols(grid);\n const allExportColumns = getAllExportColumns(grid);\n const visibleExportColumns = getVisibleExportColumns(grid, allExportColumns);\n const { widths, updateWidth } = createColumnWidths(grid, columns, visibleExportColumns);\n\n const headerRows = getHeaderRows(grid);\n const resolveSpan = createSpanResolver(allExportColumns, visibleExportColumns);\n const headerEntries = await createHeaderEntries({\n allExportColumns,\n grid,\n headerRows,\n resolveSpan,\n visibleExportColumns,\n });\n const ExcelJSBrowser = await excelJSBrowserPromise;\n const workbook = new ExcelJSBrowser.Workbook();\n const baseExportName =\n resolvedOptions?.exportName ?? getGridExportName(grid) ?? grid.id ?? 'sheet';\n const exportNameSuffix = resolvedOptions?.useAppendCurrentDateTimeToExportName\n ? `-${dayjs().format('YYYY-MM-DD-HH-mm-ss')}`\n : '';\n const resolvedExportName = getSafeExportName(`${baseExportName}${exportNameSuffix}`);\n const worksheet = workbook.addWorksheet(getSafeSheetName(resolvedExportName));\n const headerStartRowIndex = await appendEntryRows(\n worksheet,\n headerEntries,\n visibleExportColumns.length,\n );\n const {\n startRowIndex: bodyStartRowIndex,\n rowCount: bodyRowCount,\n mergeRanges: bodyMergeRanges,\n } = await appendBodyRows({\n worksheet,\n allExportColumns,\n columns,\n grid,\n onVisibleEntry: updateWidth,\n resolveSpan,\n visibleColumnCount: visibleExportColumns.length,\n });\n\n for (let index = 0; index < visibleExportColumns.length; index += 1) {\n const colName = visibleExportColumns[index];\n\n if (!colName) {\n continue;\n }\n\n const column = columns[colName];\n const worksheetColumn = worksheet.getColumn(index + 1);\n\n worksheetColumn.width = widths[index];\n worksheetColumn.alignment = {\n ...DEFAULT_ALIGNMENT,\n horizontal: getCellHorizontalAlignment(column),\n };\n }\n\n await mergeEntryRows(worksheet, headerEntries, headerStartRowIndex);\n await mergeWorksheetRanges(worksheet, bodyMergeRanges);\n await styleHeaderRows(\n worksheet,\n headerStartRowIndex,\n headerEntries.length,\n visibleExportColumns.length,\n );\n await styleBodyRows(\n worksheet,\n bodyStartRowIndex,\n bodyRowCount,\n visibleExportColumns.length,\n );\n\n worksheet.views = [{ state: 'frozen', ySplit: headerEntries.length }];\n\n await yieldToMain();\n\n const buffer = await workbook.xlsx.writeBuffer({\n useSharedStrings: false,\n useStyles: true,\n });\n\n exportExcelByBuffer(buffer, resolvedExportName);\n } catch (error) {\n const resolvedOptions = typeof options === 'string' ? { exportName: options } : options;\n const t = resolvedOptions?.t;\n\n enqueueSnackbar(\n error instanceof Error\n ? error.message\n : translateText(\n t,\n 'Message.엑셀 다운로드 중 오류가 발생했습니다.',\n DEFAULT_EXPORT_ERROR_MESSAGE,\n ),\n {\n variant: 'error',\n },\n );\n }\n};\n"],"names":["ROW_BATCH_SIZE","DAYJS_DATE_FORMAT_CACHE","DEFAULT_EXPORT_ERROR_MESSAGE","DEFAULT_GRID_MISSING_MESSAGE","isPrimitiveCellValue","__name","value","yieldToMain","resolve","translateText","key","defaultValue","getGridColNames","grid","getGridCols","getGridRows","getGridHeader","getGridHead","getGridExportName","getRowFirstChild","row","getRowNextSibling","getSafeExportName","getSafeSheetName","toPositiveInt","parsedValue","isVisible","isButtonColumn","column","getColumnNames","sectionColumnNames","orderedColumnNames","uniqueColumnNames","seenColumnNames","colName","getAllExportColumns","columns","getVisibleExportColumns","allExportColumns","getHeaderRows","headerRows","seenRows","appendHeaderRow","isExportDataRow","iterateExportDataRows","rows","rowKey","getExportDataRowCount","count","createSpanResolver","visibleExportColumns","allColumnIndexMap","index","visibleColumnIndexMap","visiblePrefixCounts","visibleIndexByAllIndex","nextVisibleAllIndexByAllIndex","nextVisibleAllIndex","allIndex","visibleIndex","rawColSpan","startIndex","allColSpan","endIndex","firstVisibleAllIndex","visibleColIndex","visibleColSpan","getCellHorizontalAlignment","align","getDayjsDateFormat","rawFormat","cachedFormat","minuteTwoPlaceholder","minuteOnePlaceholder","convertedFormat","formatDateValue","dayjsFormat","parsedDate","dayjs","formatBoolValue","getHeaderValue","headerRow","headerValue","appendHtmlPostfix","htmlPostfix","getBodyValue","displayValue","rowValue","formattedBoolValue","formattedRowValue","rawValue","formattedRawBoolValue","formattedRawValue","formattedDisplayBoolValue","formattedDisplayValue","getCellSpanInfo","resolveSpan","rowIndex","totalRows","rowSpan","isOccupied","occupiedCells","colIndex","_a","markOccupied","colSpan","targetRowIndex","occupiedRow","targetColIndex","createEntryRows","getValue","onVisibleEntry","entryRows","currentEntryRow","allColIndex","createHeaderEntries","appendBodyRows","worksheet","visibleColumnCount","startRowIndex","pendingRows","mergeRanges","rowValues","appendEntryRows","entries","entryIndex","entry","mergeEntryRows","rowOffset","mergeWorksheetRanges","mergeRange","styleHeaderRows","rowCount","HEADER_FONT","cell","HEADER_FILL","HEADER_BORDER","DEFAULT_ALIGNMENT","styleBodyRows","BODY_FONT","getPreferredColumnWidth","layoutWidth","getAutoColumnWidth","valueLength","createColumnWidths","widths","fixedWidthMap","preferredWidth","caption","currentWidth","nextWidth","exportTreeGridExcel","options","resolvedOptions","t","excelJSBrowserPromise","loadExcelJSBrowser","updateWidth","headerEntries","ExcelJSBrowser","workbook","baseExportName","exportNameSuffix","resolvedExportName","headerStartRowIndex","bodyStartRowIndex","bodyRowCount","bodyMergeRanges","worksheetColumn","buffer","exportExcelByBuffer","error","enqueueSnackbar"],"mappings":"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"}