@owp/core 2.5.21 → 2.5.22

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 (78) hide show
  1. package/dayjs.d.ts +4 -0
  2. package/dayjs.js +2 -0
  3. package/dist/_virtual/index16.js +4 -4
  4. package/dist/_virtual/index17.js +4 -4
  5. package/dist/_virtual/index18.js +4 -4
  6. package/dist/_virtual/index19.js +4 -4
  7. package/dist/_virtual/isBetween.js +8 -0
  8. package/dist/_virtual/isBetween.js.map +1 -0
  9. package/dist/_virtual/isBetween2.js +5 -0
  10. package/dist/_virtual/isBetween2.js.map +1 -0
  11. package/dist/components/OwpPageContent/OwpPageContent.js +20 -19
  12. package/dist/components/OwpPageContent/OwpPageContent.js.map +1 -1
  13. package/dist/components/OwpPicker/OwpDatePicker.js +31 -32
  14. package/dist/components/OwpPicker/OwpDatePicker.js.map +1 -1
  15. package/dist/components/OwpPicker/OwpDateRangePicker.js +21 -21
  16. package/dist/components/OwpPicker/OwpDateRangePicker.js.map +1 -1
  17. package/dist/components/OwpPicker/OwpTimePicker.js +29 -30
  18. package/dist/components/OwpPicker/OwpTimePicker.js.map +1 -1
  19. package/dist/components/OwpPicker/OwpWeekDatePicker.js +28 -29
  20. package/dist/components/OwpPicker/OwpWeekDatePicker.js.map +1 -1
  21. package/dist/components/OwpPicker/OwpYearRangePicker.js +1 -1
  22. package/dist/components/OwpPicker/OwpYearRangePicker.js.map +1 -1
  23. package/dist/components/OwpPicker/internal/DatePickerInput.js +5 -5
  24. package/dist/components/OwpPicker/internal/DatePickerInput.js.map +1 -1
  25. package/dist/components/OwpSection/OwpSection.js +118 -111
  26. package/dist/components/OwpSection/OwpSection.js.map +1 -1
  27. package/dist/components/OwpTable/OwpFieldTable.js +67 -70
  28. package/dist/components/OwpTable/OwpFieldTable.js.map +1 -1
  29. package/dist/components/OwpTable/internal/OwpTableBase.js +85 -60
  30. package/dist/components/OwpTable/internal/OwpTableBase.js.map +1 -1
  31. package/dist/components/OwpTable/internal/defaultTableStyle.js +1 -1
  32. package/dist/components/OwpTable/internal/defaultTableStyle.js.map +1 -1
  33. package/dist/components/OwpTreeGrid/OwpTreeGrid.js +1 -1
  34. package/dist/components/OwpTreeGrid/OwpTreeGrid.js.map +1 -1
  35. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js +21 -22
  36. package/dist/components/OwpTreeGrid/internal/hooks/useOwpTreeGridDatePickerEditor.js.map +1 -1
  37. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js +10 -10
  38. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js.map +1 -1
  39. package/dist/dayjs.js +18 -0
  40. package/dist/dayjs.js.map +1 -0
  41. package/dist/features/themePreview/components/ThemePreviewCanvas.js +22 -22
  42. package/dist/features/themePreview/components/ThemePreviewCanvas.js.map +1 -1
  43. package/dist/features/themePreview/hooks/useThemePreview.js +16 -16
  44. package/dist/features/themePreview/hooks/useThemePreview.js.map +1 -1
  45. package/dist/hooks/{useInitCommonCodes.js → internal/useInitCommonCodes.js} +6 -6
  46. package/dist/hooks/internal/useInitCommonCodes.js.map +1 -0
  47. package/dist/hooks/internal/useMinimumVisibleState.js +31 -0
  48. package/dist/hooks/internal/useMinimumVisibleState.js.map +1 -0
  49. package/dist/hooks/useInitApp.js +17 -14
  50. package/dist/hooks/useInitApp.js.map +1 -1
  51. package/dist/hooks.js +49 -51
  52. package/dist/hooks.js.map +1 -1
  53. package/dist/layout/components/toggles/NavigationSearchToggle.js +3 -3
  54. package/dist/node_modules/.pnpm/dayjs@1.11.18/node_modules/dayjs/plugin/isBetween.js +23 -0
  55. package/dist/node_modules/.pnpm/dayjs@1.11.18/node_modules/dayjs/plugin/isBetween.js.map +1 -0
  56. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/constants.js +1 -1
  57. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/constants.js +1 -1
  58. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/constants.js +1 -1
  59. 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
  60. package/dist/types/components/OwpPicker/OwpTimePicker.d.ts +1 -1
  61. package/dist/types/components/OwpSection/OwpSection.d.ts +9 -3
  62. package/dist/types/components/OwpTable/internal/defaultTableStyle.d.ts +1 -1
  63. package/dist/types/dayjs.d.ts +18 -0
  64. package/dist/types/hooks/index.d.ts +0 -1
  65. package/dist/types/hooks/internal/useMinimumVisibleState.d.ts +7 -0
  66. package/dist/types/utils/dayjsBrowser.d.ts +1 -7
  67. package/dist/types/utils/formatDateToYmd.d.ts +1 -1
  68. package/dist/utils/formatDateToYmd.js +3 -3
  69. package/dist/utils/formatDateToYmd.js.map +1 -1
  70. package/dist/utils/treeGridExportExcelUtil.js +1 -1
  71. package/dist/utils/treeGridExportExcelUtil.js.map +1 -1
  72. package/dist/utils/zipUtil.js +3 -3
  73. package/dist/utils/zipUtil.js.map +1 -1
  74. package/package.json +3 -1
  75. package/dist/hooks/useInitCommonCodes.js.map +0 -1
  76. package/dist/utils/dayjsBrowser.js +0 -16
  77. package/dist/utils/dayjsBrowser.js.map +0 -1
  78. /package/dist/types/hooks/{useInitCommonCodes.d.ts → internal/useInitCommonCodes.d.ts} +0 -0
@@ -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 isDeleted = (value: unknown) => value === 1 || value === true || value === '1';\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 (\n !!row &&\n row.Kind === 'Data' &&\n isVisible(row.Visible) &&\n !isDeleted(row.Deleted) &&\n row.Fixed !== 'Foot'\n );\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","isDeleted","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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"}
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 isDeleted = (value: unknown) => value === 1 || value === true || value === '1';\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 (\n !!row &&\n row.Kind === 'Data' &&\n isVisible(row.Visible) &&\n !isDeleted(row.Deleted) &&\n row.Fixed !== 'Foot'\n );\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","isDeleted","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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"}
@@ -1,6 +1,6 @@
1
1
  var y = Object.defineProperty;
2
2
  var i = (e, t) => y(e, "name", { value: t, configurable: !0 });
3
- import v from "dayjs";
3
+ import { owpDayjs as v } from "../dayjs.js";
4
4
  import { t as E } from "i18next";
5
5
  import { enqueueSnackbar as d } from "notistack";
6
6
  import { loadJSZip as m } from "./jszipBrowser.js";
@@ -33,7 +33,7 @@ const l = {
33
33
  }, "readZipEntryText"), A = /* @__PURE__ */ i(async (e, t) => {
34
34
  const r = await $(e, t);
35
35
  return r ? JSON.parse(r) : null;
36
- }, "readZipEntryJson"), _ = /* @__PURE__ */ i((e, t, r) => {
36
+ }, "readZipEntryJson"), D = /* @__PURE__ */ i((e, t, r) => {
37
37
  t.forEach(({ blob: a, fileName: n }, c) => {
38
38
  a && e.file(
39
39
  r.preserveFileNames ? n : F(c, n, r.fileExtension),
@@ -55,7 +55,7 @@ const l = {
55
55
  return;
56
56
  }
57
57
  const a = await m(), n = new a();
58
- _(n, e, r);
58
+ D(n, e, r);
59
59
  const c = await n.generateAsync({ type: "blob" }), p = URL.createObjectURL(c), s = document.createElement("a");
60
60
  s.href = p, s.download = w(
61
61
  r.fileTitle,
@@ -1 +1 @@
1
- {"version":3,"file":"zipUtil.js","sources":["../../src/utils/zipUtil.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { t } from 'i18next';\nimport type JSZip from 'jszip';\nimport { enqueueSnackbar } from 'notistack';\nimport { loadJSZip } from './jszipBrowser';\n\ntype BlobInfoData = {\n blob: Blob;\n fileName: string;\n};\n\nexport interface SaveAsZipFileOptions {\n type?: string;\n fileExtension?: string;\n fileTitle?: string;\n archiveExtension?: string;\n appendDatetime?: boolean;\n preserveFileNames?: boolean;\n}\n\nconst DEFAULT_ZIP_OPTIONS: Required<SaveAsZipFileOptions> = {\n type: 'pdf',\n fileExtension: 'application/pdf',\n fileTitle: 'archive',\n archiveExtension: 'zip',\n appendDatetime: false,\n preserveFileNames: false,\n};\n\n/**\n * 파일명 안전 문자 변환\n * @param fileName 원본 파일명\n */\nconst sanitizeFileName = (fileName: string) => fileName.replace(/[.*+?^${}()|[\\]\\\\]/g, '_');\n\n/**\n * ZIP 경고 메시지 출력\n * @param message 경고 메시지\n */\nconst showZipWarning = (message: string) => {\n enqueueSnackbar(\n t(`Message.${message}`, {\n defaultValue: message,\n }),\n { variant: 'warning' },\n );\n};\n\n/**\n * ZIP 저장 옵션 정규화\n * @param options 저장 옵션\n */\nconst normalizeZipOptions = (options?: SaveAsZipFileOptions) => {\n return {\n type: options?.type ?? DEFAULT_ZIP_OPTIONS.type,\n fileExtension: options?.fileExtension ?? DEFAULT_ZIP_OPTIONS.fileExtension,\n fileTitle: options?.fileTitle ?? DEFAULT_ZIP_OPTIONS.fileTitle,\n archiveExtension: options?.archiveExtension ?? DEFAULT_ZIP_OPTIONS.archiveExtension,\n appendDatetime: options?.appendDatetime ?? DEFAULT_ZIP_OPTIONS.appendDatetime,\n preserveFileNames: options?.preserveFileNames ?? DEFAULT_ZIP_OPTIONS.preserveFileNames,\n };\n};\n\n/**\n * ZIP 내부 파일명 생성\n * @param index 파일 순서\n * @param fileName 파일명\n * @param fileExtension 파일 확장자\n */\nconst createZipEntryFileName = (index: number, fileName: string, fileExtension: string) => {\n return `${sanitizeFileName(`${index + 1}_${fileName}`)}.${fileExtension}`;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n */\nconst normalizeArchiveExtension = (archiveExtension: string) => {\n return archiveExtension.replace(/^\\.+/, '') || DEFAULT_ZIP_OPTIONS.archiveExtension;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n * @param archiveExtension 아카이브 확장자\n */\nconst createArchiveFileName = (\n fileTitle: string,\n appendDatetime: boolean,\n archiveExtension: string,\n) => {\n return `${sanitizeFileName(fileTitle)}${appendDatetime ? `-${dayjs().format('YYYY_MM_DD_HH_mm_ss')}` : ''}.${normalizeArchiveExtension(archiveExtension)}`;\n};\n\n/**\n * ZIP 엔트리 일치 여부 확인\n * @param fileName ZIP 엔트리 파일명\n * @param matcher 엔트리 식별자\n */\nconst isMatchedZipEntry = (\n fileName: string,\n matcher: string | RegExp | ((fileName: string) => boolean),\n) => {\n if (typeof matcher === 'string') {\n return fileName === matcher;\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(fileName);\n }\n\n return matcher(fileName);\n};\n\n/**\n * ZIP 소스 ArrayBuffer 변환\n * @param source ZIP 소스\n */\nconst toZipArrayBuffer = async (source: Blob | ArrayBuffer) => {\n return source instanceof Blob ? source.arrayBuffer() : source;\n};\n\n/**\n * ZIP 엔트리 텍스트 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryText = async (\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<string | null> => {\n const JSZip = await loadJSZip();\n const zip = await JSZip.loadAsync(await toZipArrayBuffer(source));\n const zipFile = Object.values(zip.files).find(\n (entry) => !entry.dir && isMatchedZipEntry(entry.name, matcher),\n );\n\n if (!zipFile) {\n return null;\n }\n\n return zipFile.async('string');\n};\n\n/**\n * ZIP 엔트리 JSON 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryJson = async <T>(\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<T | null> => {\n const text = await readZipEntryText(source, matcher);\n\n if (!text) {\n return null;\n }\n\n return JSON.parse(text) as T;\n};\n\n/**\n * ZIP 파일 데이터 추가\n * @param zip ZIP 인스턴스\n * @param data 파일 데이터 목록\n * @param options ZIP 저장 옵션\n */\nconst appendZipFiles = (\n zip: JSZip,\n data: BlobInfoData[],\n options: Required<SaveAsZipFileOptions>,\n) => {\n data.forEach(({ blob, fileName }, index) => {\n if (!blob) {\n return;\n }\n\n zip.file(\n options.preserveFileNames\n ? fileName\n : createZipEntryFileName(index, fileName, options.fileExtension),\n options.preserveFileNames ? blob : new Blob([blob], { type: options.type }),\n );\n });\n};\n\n/**\n * ZIP 파일 저장\n * @param data 저장할 파일 데이터\n * @param options 저장 옵션\n */\nexport const saveAsZipFile = async (\n data: BlobInfoData[],\n options?: SaveAsZipFileOptions,\n) => {\n const normalizedOptions = normalizeZipOptions(options);\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.type) {\n showZipWarning('type 이 선언되지 않았습니다');\n return;\n }\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.fileExtension) {\n showZipWarning('파일 확장자가 선언되지 않았습니다');\n return;\n }\n\n if (!data) {\n showZipWarning('다운로드할 데이터가 없습니다');\n return;\n }\n\n const JSZip = await loadJSZip();\n const zip = new JSZip();\n appendZipFiles(zip, data, normalizedOptions);\n\n const archiveFiles = await zip.generateAsync({ type: 'blob' });\n const url = URL.createObjectURL(archiveFiles);\n const link = document.createElement('a');\n link.href = url;\n link.download = createArchiveFileName(\n normalizedOptions.fileTitle,\n normalizedOptions.appendDatetime,\n normalizedOptions.archiveExtension,\n );\n link.click();\n URL.revokeObjectURL(url);\n};\n"],"names":["DEFAULT_ZIP_OPTIONS","sanitizeFileName","__name","fileName","showZipWarning","message","enqueueSnackbar","t","normalizeZipOptions","options","createZipEntryFileName","index","fileExtension","normalizeArchiveExtension","archiveExtension","createArchiveFileName","fileTitle","appendDatetime","dayjs","isMatchedZipEntry","matcher","toZipArrayBuffer","source","readZipEntryText","zip","loadJSZip","zipFile","entry","readZipEntryJson","text","appendZipFiles","data","blob","saveAsZipFile","normalizedOptions","JSZip","archiveFiles","url","link"],"mappings":"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"}
1
+ {"version":3,"file":"zipUtil.js","sources":["../../src/utils/zipUtil.ts"],"sourcesContent":["import dayjs from '@/dayjs';\nimport { t } from 'i18next';\nimport type JSZip from 'jszip';\nimport { enqueueSnackbar } from 'notistack';\nimport { loadJSZip } from './jszipBrowser';\n\ntype BlobInfoData = {\n blob: Blob;\n fileName: string;\n};\n\nexport interface SaveAsZipFileOptions {\n type?: string;\n fileExtension?: string;\n fileTitle?: string;\n archiveExtension?: string;\n appendDatetime?: boolean;\n preserveFileNames?: boolean;\n}\n\nconst DEFAULT_ZIP_OPTIONS: Required<SaveAsZipFileOptions> = {\n type: 'pdf',\n fileExtension: 'application/pdf',\n fileTitle: 'archive',\n archiveExtension: 'zip',\n appendDatetime: false,\n preserveFileNames: false,\n};\n\n/**\n * 파일명 안전 문자 변환\n * @param fileName 원본 파일명\n */\nconst sanitizeFileName = (fileName: string) => fileName.replace(/[.*+?^${}()|[\\]\\\\]/g, '_');\n\n/**\n * ZIP 경고 메시지 출력\n * @param message 경고 메시지\n */\nconst showZipWarning = (message: string) => {\n enqueueSnackbar(\n t(`Message.${message}`, {\n defaultValue: message,\n }),\n { variant: 'warning' },\n );\n};\n\n/**\n * ZIP 저장 옵션 정규화\n * @param options 저장 옵션\n */\nconst normalizeZipOptions = (options?: SaveAsZipFileOptions) => {\n return {\n type: options?.type ?? DEFAULT_ZIP_OPTIONS.type,\n fileExtension: options?.fileExtension ?? DEFAULT_ZIP_OPTIONS.fileExtension,\n fileTitle: options?.fileTitle ?? DEFAULT_ZIP_OPTIONS.fileTitle,\n archiveExtension: options?.archiveExtension ?? DEFAULT_ZIP_OPTIONS.archiveExtension,\n appendDatetime: options?.appendDatetime ?? DEFAULT_ZIP_OPTIONS.appendDatetime,\n preserveFileNames: options?.preserveFileNames ?? DEFAULT_ZIP_OPTIONS.preserveFileNames,\n };\n};\n\n/**\n * ZIP 내부 파일명 생성\n * @param index 파일 순서\n * @param fileName 파일명\n * @param fileExtension 파일 확장자\n */\nconst createZipEntryFileName = (index: number, fileName: string, fileExtension: string) => {\n return `${sanitizeFileName(`${index + 1}_${fileName}`)}.${fileExtension}`;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n */\nconst normalizeArchiveExtension = (archiveExtension: string) => {\n return archiveExtension.replace(/^\\.+/, '') || DEFAULT_ZIP_OPTIONS.archiveExtension;\n};\n\n/**\n * ZIP 다운로드 파일명 생성\n * @param fileTitle 파일 제목\n * @param appendDatetime 일시 추가 여부\n * @param archiveExtension 아카이브 확장자\n */\nconst createArchiveFileName = (\n fileTitle: string,\n appendDatetime: boolean,\n archiveExtension: string,\n) => {\n return `${sanitizeFileName(fileTitle)}${appendDatetime ? `-${dayjs().format('YYYY_MM_DD_HH_mm_ss')}` : ''}.${normalizeArchiveExtension(archiveExtension)}`;\n};\n\n/**\n * ZIP 엔트리 일치 여부 확인\n * @param fileName ZIP 엔트리 파일명\n * @param matcher 엔트리 식별자\n */\nconst isMatchedZipEntry = (\n fileName: string,\n matcher: string | RegExp | ((fileName: string) => boolean),\n) => {\n if (typeof matcher === 'string') {\n return fileName === matcher;\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(fileName);\n }\n\n return matcher(fileName);\n};\n\n/**\n * ZIP 소스 ArrayBuffer 변환\n * @param source ZIP 소스\n */\nconst toZipArrayBuffer = async (source: Blob | ArrayBuffer) => {\n return source instanceof Blob ? source.arrayBuffer() : source;\n};\n\n/**\n * ZIP 엔트리 텍스트 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryText = async (\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<string | null> => {\n const JSZip = await loadJSZip();\n const zip = await JSZip.loadAsync(await toZipArrayBuffer(source));\n const zipFile = Object.values(zip.files).find(\n (entry) => !entry.dir && isMatchedZipEntry(entry.name, matcher),\n );\n\n if (!zipFile) {\n return null;\n }\n\n return zipFile.async('string');\n};\n\n/**\n * ZIP 엔트리 JSON 로드\n * @param source ZIP 소스\n * @param matcher 엔트리 식별자\n */\nexport const readZipEntryJson = async <T>(\n source: Blob | ArrayBuffer,\n matcher: string | RegExp | ((fileName: string) => boolean),\n): Promise<T | null> => {\n const text = await readZipEntryText(source, matcher);\n\n if (!text) {\n return null;\n }\n\n return JSON.parse(text) as T;\n};\n\n/**\n * ZIP 파일 데이터 추가\n * @param zip ZIP 인스턴스\n * @param data 파일 데이터 목록\n * @param options ZIP 저장 옵션\n */\nconst appendZipFiles = (\n zip: JSZip,\n data: BlobInfoData[],\n options: Required<SaveAsZipFileOptions>,\n) => {\n data.forEach(({ blob, fileName }, index) => {\n if (!blob) {\n return;\n }\n\n zip.file(\n options.preserveFileNames\n ? fileName\n : createZipEntryFileName(index, fileName, options.fileExtension),\n options.preserveFileNames ? blob : new Blob([blob], { type: options.type }),\n );\n });\n};\n\n/**\n * ZIP 파일 저장\n * @param data 저장할 파일 데이터\n * @param options 저장 옵션\n */\nexport const saveAsZipFile = async (\n data: BlobInfoData[],\n options?: SaveAsZipFileOptions,\n) => {\n const normalizedOptions = normalizeZipOptions(options);\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.type) {\n showZipWarning('type 이 선언되지 않았습니다');\n return;\n }\n\n if (!normalizedOptions.preserveFileNames && !normalizedOptions.fileExtension) {\n showZipWarning('파일 확장자가 선언되지 않았습니다');\n return;\n }\n\n if (!data) {\n showZipWarning('다운로드할 데이터가 없습니다');\n return;\n }\n\n const JSZip = await loadJSZip();\n const zip = new JSZip();\n appendZipFiles(zip, data, normalizedOptions);\n\n const archiveFiles = await zip.generateAsync({ type: 'blob' });\n const url = URL.createObjectURL(archiveFiles);\n const link = document.createElement('a');\n link.href = url;\n link.download = createArchiveFileName(\n normalizedOptions.fileTitle,\n normalizedOptions.appendDatetime,\n normalizedOptions.archiveExtension,\n );\n link.click();\n URL.revokeObjectURL(url);\n};\n"],"names":["DEFAULT_ZIP_OPTIONS","sanitizeFileName","__name","fileName","showZipWarning","message","enqueueSnackbar","t","normalizeZipOptions","options","createZipEntryFileName","index","fileExtension","normalizeArchiveExtension","archiveExtension","createArchiveFileName","fileTitle","appendDatetime","dayjs","isMatchedZipEntry","matcher","toZipArrayBuffer","source","readZipEntryText","zip","loadJSZip","zipFile","entry","readZipEntryJson","text","appendZipFiles","data","blob","saveAsZipFile","normalizedOptions","JSZip","archiveFiles","url","link"],"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.21",
4
+ "version": "2.5.22",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -97,6 +97,8 @@
97
97
  "constants.js",
98
98
  "contexts.d.ts",
99
99
  "contexts.js",
100
+ "dayjs.d.ts",
101
+ "dayjs.js",
100
102
  "features/",
101
103
  "hooks.d.ts",
102
104
  "hooks.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"useInitCommonCodes.js","sources":["../../src/hooks/useInitCommonCodes.ts"],"sourcesContent":["import { STORAGE_ACCESS_TOKEN_KEY } from '@/constants/localStorageKeys';\nimport { useOwpAppContext } from '@/contexts/OwpAppProvider';\nimport { useGetCurrentUser } from '@/hooks/useCurrentUser';\nimport { useSetCommonCodeList } from '@/hooks/useCommonCodeList';\nimport { CommonCodeRes, transformCommonCodeBasedOnGroupId } from '@/utils/commonCodeUtils';\nimport { getApiLanguageCode } from '@/utils/language';\nimport { useQuery } from '@tanstack/react-query';\nimport { useEffect } from 'react';\n\n/**\n * 공통코드 요청 URL 생성\n * @param apiBaseUrl API base URL\n * @param accessToken 접근 토큰\n */\nfunction createCommonCodeRequestUrl(apiBaseUrl: string, accessToken: string) {\n const baseUrl = new URL(apiBaseUrl.endsWith('/') ? apiBaseUrl : `${apiBaseUrl}/`);\n const requestUrl = new URL('listIpxCommonCodeTotalAC', baseUrl);\n\n requestUrl.searchParams.set('TOKEN', accessToken);\n requestUrl.searchParams.set('i18nextLng', getApiLanguageCode());\n\n return requestUrl.toString();\n}\n\n/**\n * 공통코드 전역 캐시 초기화\n */\nexport function useInitCommonCodes() {\n const { env } = useOwpAppContext();\n const currentUser = useGetCurrentUser();\n const setCommonCodeList = useSetCommonCodeList();\n\n const apiBaseUrl = `${env?.apiBaseUrl ?? ''}`.trim();\n const accessToken = `${currentUser?.token ?? localStorage.getItem(STORAGE_ACCESS_TOKEN_KEY) ?? ''}`.trim();\n const enabled = Boolean(apiBaseUrl && accessToken);\n\n const { data } = useQuery({\n queryKey: ['owp', 'common-code-list', accessToken],\n enabled,\n staleTime: Infinity,\n gcTime: Infinity,\n queryFn: async () => {\n const response = await fetch(createCommonCodeRequestUrl(apiBaseUrl, accessToken));\n const data = (await response.json()) as CommonCodeRes & {\n resultCode?: string;\n resultMessage?: string;\n };\n\n if (!response.ok || data?.resultCode === 'STATUS_0') {\n throw new Error(data?.resultMessage ?? 'Failed to fetch common codes');\n }\n\n return transformCommonCodeBasedOnGroupId(data?.resultData ?? []);\n },\n });\n\n useEffect(() => {\n if (!data) {\n return;\n }\n\n setCommonCodeList(data);\n }, [data, setCommonCodeList]);\n}\n"],"names":["createCommonCodeRequestUrl","apiBaseUrl","accessToken","baseUrl","requestUrl","getApiLanguageCode","__name","useInitCommonCodes","env","useOwpAppContext","currentUser","useGetCurrentUser","setCommonCodeList","useSetCommonCodeList","STORAGE_ACCESS_TOKEN_KEY","enabled","data","useQuery","response","transformCommonCodeBasedOnGroupId","useEffect"],"mappings":";;;;;;;;;;AAcA,SAASA,EAA2BC,GAAoBC,GAAqB;AAC3E,QAAMC,IAAU,IAAI,IAAIF,EAAW,SAAS,GAAG,IAAIA,IAAa,GAAGA,CAAU,GAAG,GAC1EG,IAAa,IAAI,IAAI,4BAA4BD,CAAO;AAE9D,SAAAC,EAAW,aAAa,IAAI,SAASF,CAAW,GAChDE,EAAW,aAAa,IAAI,cAAcC,EAAA,CAAoB,GAEvDD,EAAW,SAAA;AACpB;AARSE,EAAAN,GAAA;AAaF,SAASO,IAAqB;AACnC,QAAM,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACVC,IAAcC,EAAA,GACdC,IAAoBC,EAAA,GAEpBZ,IAAa,IAAGO,KAAA,gBAAAA,EAAK,eAAc,EAAE,GAAG,KAAA,GACxCN,IAAc,IAAGQ,KAAA,gBAAAA,EAAa,UAAS,aAAa,QAAQI,CAAwB,KAAK,EAAE,GAAG,KAAA,GAC9FC,IAAU,GAAQd,KAAcC,IAEhC,EAAE,MAAAc,EAAA,IAASC,EAAS;AAAA,IACxB,UAAU,CAAC,OAAO,oBAAoBf,CAAW;AAAA,IACjD,SAAAa;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS,gBAAAT,EAAA,YAAY;AACnB,YAAMY,IAAW,MAAM,MAAMlB,EAA2BC,GAAYC,CAAW,CAAC,GAC1Ec,IAAQ,MAAME,EAAS,KAAA;AAK7B,UAAI,CAACA,EAAS,OAAMF,KAAAA,gBAAAA,EAAM,gBAAe;AACvC,cAAM,IAAI,OAAMA,KAAAA,gBAAAA,EAAM,kBAAiB,8BAA8B;AAGvE,aAAOG,GAAkCH,KAAAA,gBAAAA,EAAM,eAAc,EAAE;AAAA,IACjE,GAZS;AAAA,EAYT,CACD;AAED,EAAAI,EAAU,MAAM;AACd,IAAKJ,KAILJ,EAAkBI,CAAI;AAAA,EACxB,GAAG,CAACA,GAAMJ,CAAiB,CAAC;AAC9B;AApCgBN,EAAAC,GAAA;"}
@@ -1,16 +0,0 @@
1
- var m = Object.defineProperty;
2
- var r = (e, o) => m(e, "name", { value: o, configurable: !0 });
3
- import a from "dayjs";
4
- import "../_virtual/en.js";
5
- import "../_virtual/ko.js";
6
- import * as i from "../_virtual/customParseFormat.js";
7
- import * as n from "../_virtual/isoWeek.js";
8
- import * as p from "../_virtual/weekday.js";
9
- const t = /* @__PURE__ */ new Set(), d = /* @__PURE__ */ r((e) => e.default ?? e, "resolveDayjsPlugin"), s = /* @__PURE__ */ r((e, o) => {
10
- t.has(e) || (a.extend(d(o)), t.add(e));
11
- }, "applyDayjsPlugin"), u = /* @__PURE__ */ r(() => (s("customParseFormat", i), s("isoWeek", n), s("weekday", p), a), "ensureDayjsBrowserSetup");
12
- u();
13
- export {
14
- u as ensureDayjsBrowserSetup
15
- };
16
- //# sourceMappingURL=dayjsBrowser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dayjsBrowser.js","sources":["../../src/utils/dayjsBrowser.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport type {} from 'dayjs/plugin/customParseFormat';\nimport type {} from 'dayjs/plugin/isoWeek';\nimport type {} from 'dayjs/plugin/weekday';\nimport 'virtual:owp-dayjs-locale-en';\nimport 'virtual:owp-dayjs-locale-ko';\nimport * as customParseFormatModule from 'virtual:owp-dayjs-plugin-custom-parse-format';\nimport * as isoWeekModule from 'virtual:owp-dayjs-plugin-iso-week';\nimport * as weekdayModule from 'virtual:owp-dayjs-plugin-weekday';\n\ntype DayjsPlugin = Parameters<typeof dayjs.extend>[0];\n\nconst appliedPluginNames = new Set<string>();\n\n/**\n * 브라우저 배포용 dayjs 플러그인 정규화\n * @param pluginModule 플러그인 모듈\n */\nconst resolveDayjsPlugin = (pluginModule: { default?: DayjsPlugin }) =>\n (pluginModule.default ?? (pluginModule as unknown as DayjsPlugin)) as DayjsPlugin;\n\n/**\n * dayjs 플러그인 1회 등록\n * @param pluginName 플러그인 식별자\n * @param pluginModule 플러그인 모듈\n */\nconst applyDayjsPlugin = (pluginName: string, pluginModule: { default?: DayjsPlugin }) => {\n if (appliedPluginNames.has(pluginName)) {\n return;\n }\n\n dayjs.extend(resolveDayjsPlugin(pluginModule));\n appliedPluginNames.add(pluginName);\n};\n\n/**\n * 브라우저 배포용 dayjs locale/plugin 초기화\n */\nexport const ensureDayjsBrowserSetup = () => {\n applyDayjsPlugin('customParseFormat', customParseFormatModule);\n applyDayjsPlugin('isoWeek', isoWeekModule);\n applyDayjsPlugin('weekday', weekdayModule);\n\n return dayjs;\n};\n\nensureDayjsBrowserSetup();\n"],"names":["appliedPluginNames","resolveDayjsPlugin","__name","pluginModule","applyDayjsPlugin","pluginName","dayjs","ensureDayjsBrowserSetup","customParseFormatModule","isoWeekModule","weekdayModule"],"mappings":";;;;;;;;AAYA,MAAMA,wBAAyB,IAAA,GAMzBC,IAAqB,gBAAAC,EAAA,CAACC,MACzBA,EAAa,WAAYA,GADD,uBAQrBC,IAAmB,gBAAAF,EAAA,CAACG,GAAoBF,MAA4C;AACxF,EAAIH,EAAmB,IAAIK,CAAU,MAIrCC,EAAM,OAAOL,EAAmBE,CAAY,CAAC,GAC7CH,EAAmB,IAAIK,CAAU;AACnC,GAPyB,qBAYZE,IAA0B,gBAAAL,EAAA,OACrCE,EAAiB,qBAAqBI,CAAuB,GAC7DJ,EAAiB,WAAWK,CAAa,GACzCL,EAAiB,WAAWM,CAAa,GAElCJ,IAL8B;AAQvCC,EAAA;"}