@toolbox-web/grid 1.25.0 → 1.25.2
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.
- package/all.js +2 -2
- package/all.js.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/core/grid.d.ts +18 -2
- package/lib/core/internal/diagnostics.d.ts +164 -0
- package/lib/core/internal/sorting.d.ts +53 -4
- package/lib/core/internal/utils.d.ts +0 -8
- package/lib/core/plugin/base-plugin.d.ts +18 -2
- package/lib/core/plugin/plugin-manager.d.ts +6 -4
- package/lib/core/types.d.ts +3 -2
- package/lib/features/registry.js +1 -1
- package/lib/features/registry.js.map +1 -1
- package/lib/plugins/clipboard/index.js +1 -1
- package/lib/plugins/clipboard/index.js.map +1 -1
- package/lib/plugins/column-virtualization/index.js +1 -1
- package/lib/plugins/column-virtualization/index.js.map +1 -1
- package/lib/plugins/context-menu/index.js +1 -1
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/editing/index.js +1 -1
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/editing/types.d.ts +3 -1
- package/lib/plugins/export/ExportPlugin.d.ts +2 -2
- package/lib/plugins/export/index.js +1 -1
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/filtering/FilteringPlugin.d.ts +2 -2
- package/lib/plugins/filtering/index.js +1 -1
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/grouping-columns/grouping-columns.d.ts +15 -1
- package/lib/plugins/grouping-columns/index.d.ts +1 -0
- package/lib/plugins/grouping-columns/index.js +1 -1
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-columns/types.d.ts +98 -8
- package/lib/plugins/grouping-rows/GroupingRowsPlugin.d.ts +2 -2
- package/lib/plugins/grouping-rows/index.js +2 -2
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/master-detail/index.js +1 -1
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/multi-sort/MultiSortPlugin.d.ts +2 -2
- package/lib/plugins/multi-sort/index.js +1 -1
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/pinned-columns/PinnedColumnsPlugin.d.ts +2 -2
- package/lib/plugins/pinned-columns/index.js +1 -1
- package/lib/plugins/pinned-columns/index.js.map +1 -1
- package/lib/plugins/pinned-rows/index.js +1 -1
- package/lib/plugins/pinned-rows/index.js.map +1 -1
- package/lib/plugins/pivot/index.js +1 -1
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/print/PrintPlugin.d.ts +2 -1
- package/lib/plugins/print/index.js +1 -1
- package/lib/plugins/print/index.js.map +1 -1
- package/lib/plugins/print/print-isolated.d.ts +2 -1
- package/lib/plugins/reorder-columns/ReorderPlugin.d.ts +2 -2
- package/lib/plugins/reorder-columns/index.js +1 -1
- package/lib/plugins/reorder-columns/index.js.map +1 -1
- package/lib/plugins/reorder-rows/RowReorderPlugin.d.ts +2 -2
- package/lib/plugins/reorder-rows/index.js +1 -1
- package/lib/plugins/reorder-rows/index.js.map +1 -1
- package/lib/plugins/responsive/index.js +1 -1
- package/lib/plugins/responsive/index.js.map +1 -1
- package/lib/plugins/selection/index.js +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/index.js +1 -1
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/tree/TreePlugin.d.ts +2 -2
- package/lib/plugins/tree/index.js +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts +2 -2
- package/lib/plugins/undo-redo/index.js +1 -1
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/visibility/VisibilityPlugin.d.ts +2 -2
- package/lib/plugins/visibility/index.js +1 -1
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +1 -1
- package/umd/grid.all.umd.js +1 -1
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +1 -1
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/clipboard.umd.js +1 -1
- package/umd/plugins/clipboard.umd.js.map +1 -1
- package/umd/plugins/context-menu.umd.js +1 -1
- package/umd/plugins/context-menu.umd.js.map +1 -1
- package/umd/plugins/editing.umd.js +1 -1
- package/umd/plugins/editing.umd.js.map +1 -1
- package/umd/plugins/export.umd.js.map +1 -1
- package/umd/plugins/filtering.umd.js.map +1 -1
- package/umd/plugins/grouping-columns.umd.js +1 -1
- package/umd/plugins/grouping-columns.umd.js.map +1 -1
- package/umd/plugins/grouping-rows.umd.js.map +1 -1
- package/umd/plugins/multi-sort.umd.js.map +1 -1
- package/umd/plugins/pinned-columns.umd.js.map +1 -1
- package/umd/plugins/print.umd.js +1 -1
- package/umd/plugins/print.umd.js.map +1 -1
- package/umd/plugins/reorder-columns.umd.js.map +1 -1
- package/umd/plugins/reorder-rows.umd.js.map +1 -1
- package/umd/plugins/responsive.umd.js +1 -1
- package/umd/plugins/responsive.umd.js.map +1 -1
- package/umd/plugins/tree.umd.js.map +1 -1
- package/umd/plugins/undo-redo.umd.js +1 -1
- package/umd/plugins/undo-redo.umd.js.map +1 -1
- package/umd/plugins/visibility.umd.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.umd.js","sources":["../../../../../libs/grid/src/lib/plugins/shared/data-collection.ts","../../../../../libs/grid/src/lib/plugins/export/csv.ts","../../../../../libs/grid/src/lib/plugins/export/excel.ts","../../../../../libs/grid/src/lib/plugins/export/ExportPlugin.ts"],"sourcesContent":["/**\n * Shared Data Collection Utilities\n *\n * Pure functions for resolving columns and formatting values, shared between\n * the Clipboard and Export plugins. Each plugin bundles its own copy of this\n * module (no chunk splitting) since plugin builds inline sibling imports.\n *\n * @internal\n */\n\nimport type { ColumnConfig } from '../../core/types';\n\n/**\n * Resolve which columns to include in a data export or copy operation.\n *\n * Filters out hidden columns, utility columns (`meta.utility`), and\n * internal columns (`__`-prefixed fields). Optionally restricts to an\n * explicit set of field names.\n *\n * @param columns - All column configurations\n * @param fields - If provided, only include columns whose field is in this list\n * @param onlyVisible - When `true` (default), exclude hidden and internal columns\n * @returns Filtered column array preserving original order\n */\nexport function resolveColumns(\n columns: readonly ColumnConfig[],\n fields?: string[],\n onlyVisible = true,\n): ColumnConfig[] {\n let result = columns as ColumnConfig[];\n\n if (onlyVisible) {\n result = result.filter((c) => !c.hidden && !c.field.startsWith('__') && c.meta?.utility !== true);\n }\n\n if (fields?.length) {\n const fieldSet = new Set(fields);\n result = result.filter((c) => fieldSet.has(c.field));\n }\n\n return result;\n}\n\n/**\n * Resolve which rows to include, optionally filtered to specific indices.\n *\n * @param rows - All row data\n * @param indices - If provided, only include rows at these indices (sorted ascending)\n * @returns Filtered row array\n */\nexport function resolveRows<T>(rows: readonly T[], indices?: number[]): T[] {\n if (!indices?.length) return rows as T[];\n\n return [...indices]\n .sort((a, b) => a - b)\n .map((i) => rows[i])\n .filter((r): r is T => r != null);\n}\n\n/**\n * Format a raw cell value as a text string.\n *\n * Provides the common null / Date / object → string conversion shared by\n * both clipboard and export output builders.\n *\n * @param value - The cell value to format\n * @returns A plain-text representation of the value\n */\nexport function formatValueAsText(value: unknown): string {\n if (value == null) return '';\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n","/**\n * CSV Export Utilities\n *\n * Functions for building and downloading CSV content.\n */\n\nimport type { ColumnConfig } from '../../core/types';\nimport type { ExportParams } from './types';\n\n/** CSV export options */\nexport interface CsvOptions {\n /** Field delimiter (default: ',') */\n delimiter?: string;\n /** Line separator (default: '\\n') */\n newline?: string;\n /** Whether to quote strings containing special characters (default: true) */\n quoteStrings?: boolean;\n /** Add UTF-8 BOM for Excel compatibility (default: false) */\n bom?: boolean;\n}\n\n/**\n * Format a value for CSV output.\n * Handles null, Date, objects, and strings with special characters.\n */\nexport function formatCsvValue(value: any, quote = true): string {\n if (value == null) return '';\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'object') return JSON.stringify(value);\n\n const str = String(value);\n\n // Quote if contains special characters (comma, quote, newline)\n if (quote && (str.includes(',') || str.includes('\"') || str.includes('\\n') || str.includes('\\r'))) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n return str;\n}\n\n/**\n * Build CSV content from rows and columns.\n */\nexport function buildCsv(rows: any[], columns: ColumnConfig[], params: ExportParams, options: CsvOptions = {}): string {\n const delimiter = options.delimiter ?? ',';\n const newline = options.newline ?? '\\n';\n const lines: string[] = [];\n\n // UTF-8 BOM for Excel compatibility\n const bom = options.bom ? '\\uFEFF' : '';\n\n // Build header row\n if (params.includeHeaders !== false) {\n const headerRow = columns.map((col) => {\n const header = col.header || col.field;\n const processed = params.processHeader ? params.processHeader(header, col.field) : header;\n return formatCsvValue(processed);\n });\n lines.push(headerRow.join(delimiter));\n }\n\n // Build data rows\n for (const row of rows) {\n const cells = columns.map((col) => {\n let value = row[col.field];\n if (params.processCell) {\n value = params.processCell(value, col.field, row);\n }\n return formatCsvValue(value);\n });\n lines.push(cells.join(delimiter));\n }\n\n return bom + lines.join(newline);\n}\n\n/**\n * Download a Blob as a file.\n */\nexport function downloadBlob(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Download CSV content as a file.\n */\nexport function downloadCsv(content: string, fileName: string): void {\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8;' });\n downloadBlob(blob, fileName);\n}\n","/**\n * Excel Export Utilities\n *\n * Simple Excel XML format export (no external dependencies).\n * Produces XML Spreadsheet 2003 format which opens in Excel.\n */\n\nimport type { ColumnConfig } from '../../core/types';\nimport type { ExportParams } from './types';\nimport { downloadBlob } from './csv';\n\n/**\n * Escape XML special characters.\n */\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Build Excel XML content from rows and columns.\n * Uses XML Spreadsheet 2003 format for broad compatibility.\n */\nexport function buildExcelXml(rows: any[], columns: ColumnConfig[], params: ExportParams): string {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<?mso-application progid=\"Excel.Sheet\"?>\n<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\n xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\n<Worksheet ss:Name=\"Sheet1\">\n<Table>`;\n\n // Build header row\n if (params.includeHeaders !== false) {\n xml += '\\n<Row>';\n for (const col of columns) {\n const header = col.header || col.field;\n const processed = params.processHeader ? params.processHeader(header, col.field) : header;\n xml += `<Cell><Data ss:Type=\"String\">${escapeXml(processed)}</Data></Cell>`;\n }\n xml += '</Row>';\n }\n\n // Build data rows\n for (const row of rows) {\n xml += '\\n<Row>';\n for (const col of columns) {\n let value = row[col.field];\n if (params.processCell) {\n value = params.processCell(value, col.field, row);\n }\n\n // Determine cell type based on value\n let type: 'Number' | 'String' | 'DateTime' = 'String';\n let displayValue = '';\n\n if (value == null) {\n displayValue = '';\n } else if (typeof value === 'number' && !isNaN(value)) {\n type = 'Number';\n displayValue = String(value);\n } else if (value instanceof Date) {\n type = 'DateTime';\n displayValue = value.toISOString();\n } else {\n displayValue = escapeXml(String(value));\n }\n\n xml += `<Cell><Data ss:Type=\"${type}\">${displayValue}</Data></Cell>`;\n }\n xml += '</Row>';\n }\n\n xml += '\\n</Table>\\n</Worksheet>\\n</Workbook>';\n return xml;\n}\n\n/**\n * Download Excel XML content as a file.\n */\nexport function downloadExcel(content: string, fileName: string): void {\n const finalName = fileName.endsWith('.xls') ? fileName : `${fileName}.xls`;\n const blob = new Blob([content], {\n type: 'application/vnd.ms-excel;charset=utf-8;',\n });\n downloadBlob(blob, finalName);\n}\n","/**\n * Export Plugin (Class-based)\n *\n * Provides data export functionality for tbw-grid.\n * Supports CSV, Excel (XML), and JSON formats.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { BaseGridPlugin } from '../../core/plugin/base-plugin';\nimport type { ColumnConfig } from '../../core/types';\nimport { resolveColumns, resolveRows } from '../shared/data-collection';\nimport { buildCsv, downloadBlob, downloadCsv } from './csv';\nimport { buildExcelXml, downloadExcel } from './excel';\nimport type { ExportCompleteDetail, ExportConfig, ExportFormat, ExportParams } from './types';\n\n/** Selection plugin state interface for type safety */\ninterface SelectionPluginState {\n selected: Set<number>;\n}\n\n/**\n * Export Plugin for tbw-grid\n *\n * Lets users download grid data as CSV, Excel (XML), or JSON with a single click\n * or API call. Great for reporting, data backup, or letting users work with data\n * in Excel. Integrates with SelectionPlugin to export only selected rows.\n *\n * ## Installation\n *\n * ```ts\n * import { ExportPlugin } from '@toolbox-web/grid/plugins/export';\n * ```\n *\n * ## Configuration Options\n *\n * | Option | Type | Default | Description |\n * |--------|------|---------|-------------|\n * | `fileName` | `string` | `'export'` | Base filename (without extension) |\n * | `includeHeaders` | `boolean` | `true` | Include column headers in export |\n * | `onlyVisible` | `boolean` | `true` | Export only visible columns |\n * | `onlySelected` | `boolean` | `false` | Export only selected rows (requires SelectionPlugin) |\n *\n * ## Supported Formats\n *\n * | Format | Method | Description |\n * |--------|--------|-------------|\n * | CSV | `exportToCSV()` | Comma-separated values |\n * | Excel | `exportToExcel()` | Excel XML format (.xlsx) |\n * | JSON | `exportToJSON()` | JSON array of objects |\n *\n * ## Programmatic API\n *\n * | Method | Signature | Description |\n * |--------|-----------|-------------|\n * | `exportToCSV` | `(params?) => void` | Export as CSV file |\n * | `exportToExcel` | `(params?) => void` | Export as Excel file |\n * | `exportToJSON` | `(params?) => void` | Export as JSON file |\n * | `isExporting` | `() => boolean` | Check if export is in progress |\n *\n * @example Basic Export with Button\n * ```ts\n * import '@toolbox-web/grid';\n * import { ExportPlugin } from '@toolbox-web/grid/plugins/export';\n *\n * const grid = document.querySelector('tbw-grid');\n * grid.gridConfig = {\n * columns: [\n * { field: 'name', header: 'Name' },\n * { field: 'email', header: 'Email' },\n * ],\n * plugins: [new ExportPlugin({ fileName: 'employees', includeHeaders: true })],\n * };\n *\n * // Trigger export via button\n * document.getElementById('export-btn').addEventListener('click', () => {\n * grid.getPluginByName('export').exportToCSV();\n * });\n * ```\n *\n * @example Export Selected Rows Only\n * ```ts\n * import { SelectionPlugin } from '@toolbox-web/grid/plugins/selection';\n *\n * grid.gridConfig = {\n * plugins: [\n * new SelectionPlugin({ mode: 'row' }),\n * new ExportPlugin({ onlySelected: true }),\n * ],\n * };\n * ```\n *\n * @see {@link ExportConfig} for all configuration options\n * @see {@link ExportParams} for method parameters\n * @see {@link SelectionPlugin} for exporting selected rows\n *\n * @internal Extends BaseGridPlugin\n */\nexport class ExportPlugin extends BaseGridPlugin<ExportConfig> {\n /** @internal */\n readonly name = 'export';\n\n /** @internal */\n protected override get defaultConfig(): Partial<ExportConfig> {\n return {\n fileName: 'export',\n includeHeaders: true,\n onlyVisible: true,\n onlySelected: false,\n };\n }\n\n // #region Internal State\n private isExportingFlag = false;\n private lastExportInfo: { format: ExportFormat; timestamp: Date } | null = null;\n // #endregion\n\n // #region Private Methods\n\n private performExport(format: ExportFormat, params?: Partial<ExportParams>): void {\n const config = this.config;\n\n // Build full params with defaults\n const fullParams: ExportParams = {\n format,\n fileName: params?.fileName ?? config.fileName ?? 'export',\n includeHeaders: params?.includeHeaders ?? config.includeHeaders,\n processCell: params?.processCell,\n processHeader: params?.processHeader,\n columns: params?.columns,\n rowIndices: params?.rowIndices,\n };\n\n // Get columns to export (shared utility handles hidden/utility filtering)\n const columns = resolveColumns(this.columns, params?.columns, config.onlyVisible) as ColumnConfig[];\n\n // Get rows to export\n let rows: Record<string, unknown>[];\n if (params?.rowIndices) {\n rows = resolveRows(this.rows as Record<string, unknown>[], params.rowIndices);\n } else if (config.onlySelected) {\n const selectionState = this.getSelectionState();\n if (selectionState?.selected?.size) {\n rows = resolveRows(this.rows as Record<string, unknown>[], [...selectionState.selected]);\n } else {\n rows = [...this.rows] as Record<string, unknown>[];\n }\n } else {\n rows = [...this.rows] as Record<string, unknown>[];\n }\n\n this.isExportingFlag = true;\n let fileName = fullParams.fileName!;\n\n try {\n switch (format) {\n case 'csv': {\n const content = buildCsv(rows, columns, fullParams, { bom: true });\n fileName = fileName.endsWith('.csv') ? fileName : `${fileName}.csv`;\n downloadCsv(content, fileName);\n break;\n }\n\n case 'excel': {\n const content = buildExcelXml(rows, columns, fullParams);\n fileName = fileName.endsWith('.xls') ? fileName : `${fileName}.xls`;\n downloadExcel(content, fileName);\n break;\n }\n\n case 'json': {\n const jsonData = rows.map((row) => {\n const obj: Record<string, any> = {};\n for (const col of columns) {\n let value = row[col.field];\n if (fullParams.processCell) {\n value = fullParams.processCell(value, col.field, row);\n }\n obj[col.field] = value;\n }\n return obj;\n });\n const content = JSON.stringify(jsonData, null, 2);\n fileName = fileName.endsWith('.json') ? fileName : `${fileName}.json`;\n const blob = new Blob([content], { type: 'application/json' });\n downloadBlob(blob, fileName);\n break;\n }\n }\n\n this.lastExportInfo = { format, timestamp: new Date() };\n\n this.emit<ExportCompleteDetail>('export-complete', {\n format,\n fileName,\n rowCount: rows.length,\n columnCount: columns.length,\n });\n } finally {\n this.isExportingFlag = false;\n }\n }\n\n private getSelectionState(): SelectionPluginState | null {\n try {\n return (this.grid?.getPluginState?.('selection') as SelectionPluginState | null) ?? null;\n } catch {\n return null;\n }\n }\n // #endregion\n\n // #region Public API\n\n /**\n * Export data to CSV format.\n * @param params - Optional export parameters\n */\n exportCsv(params?: Partial<ExportParams>): void {\n this.performExport('csv', params);\n }\n\n /**\n * Export data to Excel format (XML Spreadsheet).\n * @param params - Optional export parameters\n */\n exportExcel(params?: Partial<ExportParams>): void {\n this.performExport('excel', params);\n }\n\n /**\n * Export data to JSON format.\n * @param params - Optional export parameters\n */\n exportJson(params?: Partial<ExportParams>): void {\n this.performExport('json', params);\n }\n\n /**\n * Check if an export is currently in progress.\n * @returns Whether export is in progress\n */\n isExporting(): boolean {\n return this.isExportingFlag;\n }\n\n /**\n * Get information about the last export.\n * @returns Export info or null if no export has occurred\n */\n getLastExport(): { format: ExportFormat; timestamp: Date } | null {\n return this.lastExportInfo;\n }\n // #endregion\n}\n"],"names":["resolveRows","rows","indices","length","sort","a","b","map","i","filter","r","formatCsvValue","value","quote","Date","toISOString","JSON","stringify","str","String","includes","replace","downloadBlob","blob","fileName","url","URL","createObjectURL","link","document","createElement","href","download","style","display","body","appendChild","click","removeChild","revokeObjectURL","escapeXml","ExportPlugin","BaseGridPlugin","name","defaultConfig","includeHeaders","onlyVisible","onlySelected","isExportingFlag","lastExportInfo","performExport","format","params","config","this","fullParams","processCell","processHeader","columns","rowIndices","fields","result","c","hidden","field","startsWith","meta","utility","fieldSet","Set","has","resolveColumns","selectionState","getSelectionState","selected","size","content","options","delimiter","newline","lines","bom","headerRow","col","header","push","join","row","cells","buildCsv","endsWith","Blob","type","downloadCsv","xml","displayValue","isNaN","buildExcelXml","finalName","downloadExcel","jsonData","obj","timestamp","emit","rowCount","columnCount","grid","getPluginState","exportCsv","exportExcel","exportJson","isExporting","getLastExport"],"mappings":"gVAkDO,SAASA,EAAeC,EAAoBC,GACjD,OAAKA,GAASC,OAEP,IAAID,GACRE,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GACnBC,IAAKC,GAAMP,EAAKO,IAChBC,OAAQC,GAAmB,MAALA,GALIT,CAM/B,CChCO,SAASU,EAAeC,EAAYC,GAAQ,GACjD,GAAa,MAATD,EAAe,MAAO,GAC1B,GAAIA,aAAiBE,KAAM,OAAOF,EAAMG,cACxC,GAAqB,iBAAVH,EAAoB,OAAOI,KAAKC,UAAUL,GAErD,MAAMM,EAAMC,OAAOP,GAGnB,OAAIC,IAAUK,EAAIE,SAAS,MAAQF,EAAIE,SAAS,MAAQF,EAAIE,SAAS,OAASF,EAAIE,SAAS,OAClF,IAAIF,EAAIG,QAAQ,KAAM,SAGxBH,CACT,CAyCO,SAASI,EAAaC,EAAYC,GACvC,MAAMC,EAAMC,IAAIC,gBAAgBJ,GAC1BK,EAAOC,SAASC,cAAc,KACpCF,EAAKG,KAAON,EACZG,EAAKI,SAAWR,EAChBI,EAAKK,MAAMC,QAAU,OACrBL,SAASM,KAAKC,YAAYR,GAC1BA,EAAKS,QACLR,SAASM,KAAKG,YAAYV,GAC1BF,IAAIa,gBAAgBd,EACtB,CC3EA,SAASe,EAAUtB,GACjB,OAAOA,EACJG,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,SACnB,CC6EO,MAAMoB,UAAqBC,EAAAA,eAEvBC,KAAO,SAGhB,iBAAuBC,GACrB,MAAO,CACLpB,SAAU,SACVqB,gBAAgB,EAChBC,aAAa,EACbC,cAAc,EAElB,CAGQC,iBAAkB,EAClBC,eAAmE,KAKnE,aAAAC,CAAcC,EAAsBC,GAC1C,MAAMC,EAASC,KAAKD,OAGdE,EAA2B,CAC/BJ,SACA3B,SAAU4B,GAAQ5B,UAAY6B,EAAO7B,UAAY,SACjDqB,eAAgBO,GAAQP,gBAAkBQ,EAAOR,eACjDW,YAAaJ,GAAQI,YACrBC,cAAeL,GAAQK,cACvBC,QAASN,GAAQM,QACjBC,WAAYP,GAAQO,YAIhBD,EH9GH,SACLA,EACAE,EACAd,GAAc,GAEd,IAAIe,EAASH,EAMb,GAJIZ,IACFe,EAASA,EAAOpD,OAAQqD,IAAOA,EAAEC,SAAWD,EAAEE,MAAMC,WAAW,QAA6B,IAApBH,EAAEI,MAAMC,UAG9EP,GAAQzD,OAAQ,CAClB,MAAMiE,EAAW,IAAIC,IAAIT,GACzBC,EAASA,EAAOpD,OAAQqD,GAAMM,EAASE,IAAIR,EAAEE,OAC/C,CAEA,OAAOH,CACT,CG6FoBU,CAAejB,KAAKI,QAASN,GAAQM,QAASL,EAAOP,aAGrE,IAAI7C,EACJ,GAAImD,GAAQO,WACV1D,EAAOD,EAAYsD,KAAKrD,KAAmCmD,EAAOO,iBACpE,GAAWN,EAAON,aAAc,CAC9B,MAAMyB,EAAiBlB,KAAKmB,oBAE1BxE,EADEuE,GAAgBE,UAAUC,KACrB3E,EAAYsD,KAAKrD,KAAmC,IAAIuE,EAAeE,WAEvE,IAAIpB,KAAKrD,KAEpB,MACEA,EAAO,IAAIqD,KAAKrD,MAGlBqD,KAAKN,iBAAkB,EACvB,IAAIxB,EAAW+B,EAAW/B,SAE1B,IACE,OAAQ2B,GACN,IAAK,MAAO,CACV,MAAMyB,EFlHT,SAAkB3E,EAAayD,EAAyBN,EAAsByB,EAAsB,CAAA,GACzG,MAAMC,EAAYD,EAAQC,WAAa,IACjCC,EAAUF,EAAQE,SAAW,KAC7BC,EAAkB,GAGlBC,EAAMJ,EAAQI,IAAM,SAAW,GAGrC,IAA8B,IAA1B7B,EAAOP,eAA0B,CACnC,MAAMqC,EAAYxB,EAAQnD,IAAK4E,IAC7B,MAAMC,EAASD,EAAIC,QAAUD,EAAInB,MAEjC,OAAOrD,EADWyC,EAAOK,cAAgBL,EAAOK,cAAc2B,EAAQD,EAAInB,OAASoB,KAGrFJ,EAAMK,KAAKH,EAAUI,KAAKR,GAC5B,CAGA,IAAA,MAAWS,KAAOtF,EAAM,CACtB,MAAMuF,EAAQ9B,EAAQnD,IAAK4E,IACzB,IAAIvE,EAAQ2E,EAAIJ,EAAInB,OAIpB,OAHIZ,EAAOI,cACT5C,EAAQwC,EAAOI,YAAY5C,EAAOuE,EAAInB,MAAOuB,IAExC5E,EAAeC,KAExBoE,EAAMK,KAAKG,EAAMF,KAAKR,GACxB,CAEA,OAAOG,EAAMD,EAAMM,KAAKP,EAC1B,CEmF0BU,CAASxF,EAAMyD,EAASH,EAAY,CAAE0B,KAAK,IAC3DzD,EAAWA,EAASkE,SAAS,QAAUlE,EAAW,GAAGA,QFhExD,SAAqBoD,EAAiBpD,GAE3CF,EADa,IAAIqE,KAAK,CAACf,GAAU,CAAEgB,KAAM,4BACtBpE,EACrB,CE8DUqE,CAAYjB,EAASpD,GACrB,KACF,CAEA,IAAK,QAAS,CACZ,MAAMoD,EDzIT,SAAuB3E,EAAayD,EAAyBN,GAClE,IAAI0C,EAAM,sPAQV,IAA8B,IAA1B1C,EAAOP,eAA0B,CACnCiD,GAAO,UACP,IAAA,MAAWX,KAAOzB,EAAS,CACzB,MAAM0B,EAASD,EAAIC,QAAUD,EAAInB,MAEjC8B,GAAO,gCAAgCtD,EADrBY,EAAOK,cAAgBL,EAAOK,cAAc2B,EAAQD,EAAInB,OAASoB,kBAErF,CACAU,GAAO,QACT,CAGA,IAAA,MAAWP,KAAOtF,EAAM,CACtB6F,GAAO,UACP,IAAA,MAAWX,KAAOzB,EAAS,CACzB,IAAI9C,EAAQ2E,EAAIJ,EAAInB,OAChBZ,EAAOI,cACT5C,EAAQwC,EAAOI,YAAY5C,EAAOuE,EAAInB,MAAOuB,IAI/C,IAAIK,EAAyC,SACzCG,EAAe,GAEN,MAATnF,EACFmF,EAAe,GACW,iBAAVnF,GAAuBoF,MAAMpF,GAGpCA,aAAiBE,MAC1B8E,EAAO,WACPG,EAAenF,EAAMG,eAErBgF,EAAevD,EAAUrB,OAAOP,KANhCgF,EAAO,SACPG,EAAe5E,OAAOP,IAQxBkF,GAAO,wBAAwBF,MAASG,iBAC1C,CACAD,GAAO,QACT,CAGA,OADAA,GAAO,wCACAA,CACT,CCsF0BG,CAAchG,EAAMyD,EAASH,GAC7C/B,EAAWA,EAASkE,SAAS,QAAUlE,EAAW,GAAGA,QDlFxD,SAAuBoD,EAAiBpD,GAC7C,MAAM0E,EAAY1E,EAASkE,SAAS,QAAUlE,EAAW,GAAGA,QAI5DF,EAHa,IAAIqE,KAAK,CAACf,GAAU,CAC/BgB,KAAM,4CAEWM,EACrB,CC6EUC,CAAcvB,EAASpD,GACvB,KACF,CAEA,IAAK,OAAQ,CACX,MAAM4E,EAAWnG,EAAKM,IAAKgF,IACzB,MAAMc,EAA2B,CAAA,EACjC,IAAA,MAAWlB,KAAOzB,EAAS,CACzB,IAAI9C,EAAQ2E,EAAIJ,EAAInB,OAChBT,EAAWC,cACb5C,EAAQ2C,EAAWC,YAAY5C,EAAOuE,EAAInB,MAAOuB,IAEnDc,EAAIlB,EAAInB,OAASpD,CACnB,CACA,OAAOyF,IAEHzB,EAAU5D,KAAKC,UAAUmF,EAAU,KAAM,GAC/C5E,EAAWA,EAASkE,SAAS,SAAWlE,EAAW,GAAGA,SAEtDF,EADa,IAAIqE,KAAK,CAACf,GAAU,CAAEgB,KAAM,qBACtBpE,GACnB,KACF,EAGF8B,KAAKL,eAAiB,CAAEE,SAAQmD,UAAW,IAAIxF,MAE/CwC,KAAKiD,KAA2B,kBAAmB,CACjDpD,SACA3B,WACAgF,SAAUvG,EAAKE,OACfsG,YAAa/C,EAAQvD,QAEzB,CAAA,QACEmD,KAAKN,iBAAkB,CACzB,CACF,CAEQ,iBAAAyB,GACN,IACE,OAAQnB,KAAKoD,MAAMC,iBAAiB,cAAgD,IACtF,CAAA,MACE,OAAO,IACT,CACF,CASA,SAAAC,CAAUxD,GACRE,KAAKJ,cAAc,MAAOE,EAC5B,CAMA,WAAAyD,CAAYzD,GACVE,KAAKJ,cAAc,QAASE,EAC9B,CAMA,UAAA0D,CAAW1D,GACTE,KAAKJ,cAAc,OAAQE,EAC7B,CAMA,WAAA2D,GACE,OAAOzD,KAAKN,eACd,CAMA,aAAAgE,GACE,OAAO1D,KAAKL,cACd"}
|
|
1
|
+
{"version":3,"file":"export.umd.js","sources":["../../../../../libs/grid/src/lib/plugins/shared/data-collection.ts","../../../../../libs/grid/src/lib/plugins/export/csv.ts","../../../../../libs/grid/src/lib/plugins/export/excel.ts","../../../../../libs/grid/src/lib/plugins/export/ExportPlugin.ts"],"sourcesContent":["/**\n * Shared Data Collection Utilities\n *\n * Pure functions for resolving columns and formatting values, shared between\n * the Clipboard and Export plugins. Each plugin bundles its own copy of this\n * module (no chunk splitting) since plugin builds inline sibling imports.\n *\n * @internal\n */\n\nimport type { ColumnConfig } from '../../core/types';\n\n/**\n * Resolve which columns to include in a data export or copy operation.\n *\n * Filters out hidden columns, utility columns (`meta.utility`), and\n * internal columns (`__`-prefixed fields). Optionally restricts to an\n * explicit set of field names.\n *\n * @param columns - All column configurations\n * @param fields - If provided, only include columns whose field is in this list\n * @param onlyVisible - When `true` (default), exclude hidden and internal columns\n * @returns Filtered column array preserving original order\n */\nexport function resolveColumns(\n columns: readonly ColumnConfig[],\n fields?: string[],\n onlyVisible = true,\n): ColumnConfig[] {\n let result = columns as ColumnConfig[];\n\n if (onlyVisible) {\n result = result.filter((c) => !c.hidden && !c.field.startsWith('__') && c.meta?.utility !== true);\n }\n\n if (fields?.length) {\n const fieldSet = new Set(fields);\n result = result.filter((c) => fieldSet.has(c.field));\n }\n\n return result;\n}\n\n/**\n * Resolve which rows to include, optionally filtered to specific indices.\n *\n * @param rows - All row data\n * @param indices - If provided, only include rows at these indices (sorted ascending)\n * @returns Filtered row array\n */\nexport function resolveRows<T>(rows: readonly T[], indices?: number[]): T[] {\n if (!indices?.length) return rows as T[];\n\n return [...indices]\n .sort((a, b) => a - b)\n .map((i) => rows[i])\n .filter((r): r is T => r != null);\n}\n\n/**\n * Format a raw cell value as a text string.\n *\n * Provides the common null / Date / object → string conversion shared by\n * both clipboard and export output builders.\n *\n * @param value - The cell value to format\n * @returns A plain-text representation of the value\n */\nexport function formatValueAsText(value: unknown): string {\n if (value == null) return '';\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n","/**\n * CSV Export Utilities\n *\n * Functions for building and downloading CSV content.\n */\n\nimport type { ColumnConfig } from '../../core/types';\nimport type { ExportParams } from './types';\n\n/** CSV export options */\nexport interface CsvOptions {\n /** Field delimiter (default: ',') */\n delimiter?: string;\n /** Line separator (default: '\\n') */\n newline?: string;\n /** Whether to quote strings containing special characters (default: true) */\n quoteStrings?: boolean;\n /** Add UTF-8 BOM for Excel compatibility (default: false) */\n bom?: boolean;\n}\n\n/**\n * Format a value for CSV output.\n * Handles null, Date, objects, and strings with special characters.\n */\nexport function formatCsvValue(value: any, quote = true): string {\n if (value == null) return '';\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'object') return JSON.stringify(value);\n\n const str = String(value);\n\n // Quote if contains special characters (comma, quote, newline)\n if (quote && (str.includes(',') || str.includes('\"') || str.includes('\\n') || str.includes('\\r'))) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n return str;\n}\n\n/**\n * Build CSV content from rows and columns.\n */\nexport function buildCsv(rows: any[], columns: ColumnConfig[], params: ExportParams, options: CsvOptions = {}): string {\n const delimiter = options.delimiter ?? ',';\n const newline = options.newline ?? '\\n';\n const lines: string[] = [];\n\n // UTF-8 BOM for Excel compatibility\n const bom = options.bom ? '\\uFEFF' : '';\n\n // Build header row\n if (params.includeHeaders !== false) {\n const headerRow = columns.map((col) => {\n const header = col.header || col.field;\n const processed = params.processHeader ? params.processHeader(header, col.field) : header;\n return formatCsvValue(processed);\n });\n lines.push(headerRow.join(delimiter));\n }\n\n // Build data rows\n for (const row of rows) {\n const cells = columns.map((col) => {\n let value = row[col.field];\n if (params.processCell) {\n value = params.processCell(value, col.field, row);\n }\n return formatCsvValue(value);\n });\n lines.push(cells.join(delimiter));\n }\n\n return bom + lines.join(newline);\n}\n\n/**\n * Download a Blob as a file.\n */\nexport function downloadBlob(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Download CSV content as a file.\n */\nexport function downloadCsv(content: string, fileName: string): void {\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8;' });\n downloadBlob(blob, fileName);\n}\n","/**\n * Excel Export Utilities\n *\n * Simple Excel XML format export (no external dependencies).\n * Produces XML Spreadsheet 2003 format which opens in Excel.\n */\n\nimport type { ColumnConfig } from '../../core/types';\nimport type { ExportParams } from './types';\nimport { downloadBlob } from './csv';\n\n/**\n * Escape XML special characters.\n */\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Build Excel XML content from rows and columns.\n * Uses XML Spreadsheet 2003 format for broad compatibility.\n */\nexport function buildExcelXml(rows: any[], columns: ColumnConfig[], params: ExportParams): string {\n let xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<?mso-application progid=\"Excel.Sheet\"?>\n<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\n xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\n<Worksheet ss:Name=\"Sheet1\">\n<Table>`;\n\n // Build header row\n if (params.includeHeaders !== false) {\n xml += '\\n<Row>';\n for (const col of columns) {\n const header = col.header || col.field;\n const processed = params.processHeader ? params.processHeader(header, col.field) : header;\n xml += `<Cell><Data ss:Type=\"String\">${escapeXml(processed)}</Data></Cell>`;\n }\n xml += '</Row>';\n }\n\n // Build data rows\n for (const row of rows) {\n xml += '\\n<Row>';\n for (const col of columns) {\n let value = row[col.field];\n if (params.processCell) {\n value = params.processCell(value, col.field, row);\n }\n\n // Determine cell type based on value\n let type: 'Number' | 'String' | 'DateTime' = 'String';\n let displayValue = '';\n\n if (value == null) {\n displayValue = '';\n } else if (typeof value === 'number' && !isNaN(value)) {\n type = 'Number';\n displayValue = String(value);\n } else if (value instanceof Date) {\n type = 'DateTime';\n displayValue = value.toISOString();\n } else {\n displayValue = escapeXml(String(value));\n }\n\n xml += `<Cell><Data ss:Type=\"${type}\">${displayValue}</Data></Cell>`;\n }\n xml += '</Row>';\n }\n\n xml += '\\n</Table>\\n</Worksheet>\\n</Workbook>';\n return xml;\n}\n\n/**\n * Download Excel XML content as a file.\n */\nexport function downloadExcel(content: string, fileName: string): void {\n const finalName = fileName.endsWith('.xls') ? fileName : `${fileName}.xls`;\n const blob = new Blob([content], {\n type: 'application/vnd.ms-excel;charset=utf-8;',\n });\n downloadBlob(blob, finalName);\n}\n","/**\n * Export Plugin (Class-based)\n *\n * Provides data export functionality for tbw-grid.\n * Supports CSV, Excel (XML), and JSON formats.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { BaseGridPlugin } from '../../core/plugin/base-plugin';\nimport type { ColumnConfig } from '../../core/types';\nimport { resolveColumns, resolveRows } from '../shared/data-collection';\nimport { buildCsv, downloadBlob, downloadCsv } from './csv';\nimport { buildExcelXml, downloadExcel } from './excel';\nimport type { ExportCompleteDetail, ExportConfig, ExportFormat, ExportParams } from './types';\n\n/** Selection plugin state interface for type safety */\ninterface SelectionPluginState {\n selected: Set<number>;\n}\n\n/**\n * Export Plugin for tbw-grid\n *\n * Lets users download grid data as CSV, Excel (XML), or JSON with a single click\n * or API call. Great for reporting, data backup, or letting users work with data\n * in Excel. Integrates with SelectionPlugin to export only selected rows.\n *\n * ## Installation\n *\n * ```ts\n * import { ExportPlugin } from '@toolbox-web/grid/plugins/export';\n * ```\n *\n * ## Configuration Options\n *\n * | Option | Type | Default | Description |\n * |--------|------|---------|-------------|\n * | `fileName` | `string` | `'export'` | Base filename (without extension) |\n * | `includeHeaders` | `boolean` | `true` | Include column headers in export |\n * | `onlyVisible` | `boolean` | `true` | Export only visible columns |\n * | `onlySelected` | `boolean` | `false` | Export only selected rows (requires SelectionPlugin) |\n *\n * ## Supported Formats\n *\n * | Format | Method | Description |\n * |--------|--------|-------------|\n * | CSV | `exportToCSV()` | Comma-separated values |\n * | Excel | `exportToExcel()` | Excel XML format (.xlsx) |\n * | JSON | `exportToJSON()` | JSON array of objects |\n *\n * ## Programmatic API\n *\n * | Method | Signature | Description |\n * |--------|-----------|-------------|\n * | `exportToCSV` | `(params?) => void` | Export as CSV file |\n * | `exportToExcel` | `(params?) => void` | Export as Excel file |\n * | `exportToJSON` | `(params?) => void` | Export as JSON file |\n * | `isExporting` | `() => boolean` | Check if export is in progress |\n *\n * @example Basic Export with Button\n * ```ts\n * import { queryGrid } from '@toolbox-web/grid';\n * import { ExportPlugin } from '@toolbox-web/grid/plugins/export';\n *\n * const grid = queryGrid('tbw-grid');\n * grid.gridConfig = {\n * columns: [\n * { field: 'name', header: 'Name' },\n * { field: 'email', header: 'Email' },\n * ],\n * plugins: [new ExportPlugin({ fileName: 'employees', includeHeaders: true })],\n * };\n *\n * // Trigger export via button\n * document.getElementById('export-btn').addEventListener('click', () => {\n * grid.getPluginByName('export').exportToCSV();\n * });\n * ```\n *\n * @example Export Selected Rows Only\n * ```ts\n * import { SelectionPlugin } from '@toolbox-web/grid/plugins/selection';\n *\n * grid.gridConfig = {\n * plugins: [\n * new SelectionPlugin({ mode: 'row' }),\n * new ExportPlugin({ onlySelected: true }),\n * ],\n * };\n * ```\n *\n * @see {@link ExportConfig} for all configuration options\n * @see {@link ExportParams} for method parameters\n * @see {@link SelectionPlugin} for exporting selected rows\n *\n * @internal Extends BaseGridPlugin\n */\nexport class ExportPlugin extends BaseGridPlugin<ExportConfig> {\n /** @internal */\n readonly name = 'export';\n\n /** @internal */\n protected override get defaultConfig(): Partial<ExportConfig> {\n return {\n fileName: 'export',\n includeHeaders: true,\n onlyVisible: true,\n onlySelected: false,\n };\n }\n\n // #region Internal State\n private isExportingFlag = false;\n private lastExportInfo: { format: ExportFormat; timestamp: Date } | null = null;\n // #endregion\n\n // #region Private Methods\n\n private performExport(format: ExportFormat, params?: Partial<ExportParams>): void {\n const config = this.config;\n\n // Build full params with defaults\n const fullParams: ExportParams = {\n format,\n fileName: params?.fileName ?? config.fileName ?? 'export',\n includeHeaders: params?.includeHeaders ?? config.includeHeaders,\n processCell: params?.processCell,\n processHeader: params?.processHeader,\n columns: params?.columns,\n rowIndices: params?.rowIndices,\n };\n\n // Get columns to export (shared utility handles hidden/utility filtering)\n const columns = resolveColumns(this.columns, params?.columns, config.onlyVisible) as ColumnConfig[];\n\n // Get rows to export\n let rows: Record<string, unknown>[];\n if (params?.rowIndices) {\n rows = resolveRows(this.rows as Record<string, unknown>[], params.rowIndices);\n } else if (config.onlySelected) {\n const selectionState = this.getSelectionState();\n if (selectionState?.selected?.size) {\n rows = resolveRows(this.rows as Record<string, unknown>[], [...selectionState.selected]);\n } else {\n rows = [...this.rows] as Record<string, unknown>[];\n }\n } else {\n rows = [...this.rows] as Record<string, unknown>[];\n }\n\n this.isExportingFlag = true;\n let fileName = fullParams.fileName!;\n\n try {\n switch (format) {\n case 'csv': {\n const content = buildCsv(rows, columns, fullParams, { bom: true });\n fileName = fileName.endsWith('.csv') ? fileName : `${fileName}.csv`;\n downloadCsv(content, fileName);\n break;\n }\n\n case 'excel': {\n const content = buildExcelXml(rows, columns, fullParams);\n fileName = fileName.endsWith('.xls') ? fileName : `${fileName}.xls`;\n downloadExcel(content, fileName);\n break;\n }\n\n case 'json': {\n const jsonData = rows.map((row) => {\n const obj: Record<string, any> = {};\n for (const col of columns) {\n let value = row[col.field];\n if (fullParams.processCell) {\n value = fullParams.processCell(value, col.field, row);\n }\n obj[col.field] = value;\n }\n return obj;\n });\n const content = JSON.stringify(jsonData, null, 2);\n fileName = fileName.endsWith('.json') ? fileName : `${fileName}.json`;\n const blob = new Blob([content], { type: 'application/json' });\n downloadBlob(blob, fileName);\n break;\n }\n }\n\n this.lastExportInfo = { format, timestamp: new Date() };\n\n this.emit<ExportCompleteDetail>('export-complete', {\n format,\n fileName,\n rowCount: rows.length,\n columnCount: columns.length,\n });\n } finally {\n this.isExportingFlag = false;\n }\n }\n\n private getSelectionState(): SelectionPluginState | null {\n try {\n return (this.grid?.getPluginState?.('selection') as SelectionPluginState | null) ?? null;\n } catch {\n return null;\n }\n }\n // #endregion\n\n // #region Public API\n\n /**\n * Export data to CSV format.\n * @param params - Optional export parameters\n */\n exportCsv(params?: Partial<ExportParams>): void {\n this.performExport('csv', params);\n }\n\n /**\n * Export data to Excel format (XML Spreadsheet).\n * @param params - Optional export parameters\n */\n exportExcel(params?: Partial<ExportParams>): void {\n this.performExport('excel', params);\n }\n\n /**\n * Export data to JSON format.\n * @param params - Optional export parameters\n */\n exportJson(params?: Partial<ExportParams>): void {\n this.performExport('json', params);\n }\n\n /**\n * Check if an export is currently in progress.\n * @returns Whether export is in progress\n */\n isExporting(): boolean {\n return this.isExportingFlag;\n }\n\n /**\n * Get information about the last export.\n * @returns Export info or null if no export has occurred\n */\n getLastExport(): { format: ExportFormat; timestamp: Date } | null {\n return this.lastExportInfo;\n }\n // #endregion\n}\n"],"names":["resolveRows","rows","indices","length","sort","a","b","map","i","filter","r","formatCsvValue","value","quote","Date","toISOString","JSON","stringify","str","String","includes","replace","downloadBlob","blob","fileName","url","URL","createObjectURL","link","document","createElement","href","download","style","display","body","appendChild","click","removeChild","revokeObjectURL","escapeXml","ExportPlugin","BaseGridPlugin","name","defaultConfig","includeHeaders","onlyVisible","onlySelected","isExportingFlag","lastExportInfo","performExport","format","params","config","this","fullParams","processCell","processHeader","columns","rowIndices","fields","result","c","hidden","field","startsWith","meta","utility","fieldSet","Set","has","resolveColumns","selectionState","getSelectionState","selected","size","content","options","delimiter","newline","lines","bom","headerRow","col","header","push","join","row","cells","buildCsv","endsWith","Blob","type","downloadCsv","xml","displayValue","isNaN","buildExcelXml","finalName","downloadExcel","jsonData","obj","timestamp","emit","rowCount","columnCount","grid","getPluginState","exportCsv","exportExcel","exportJson","isExporting","getLastExport"],"mappings":"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"}
|