UNPKG

@progress/kendo-angular-grid

Version:

Kendo UI Grid for Angular - high performance data grid with paging, filtering, virtualization, CRUD, and more.

127 lines (126 loc) 4.65 kB
/**----------------------------------------------------------------------------------------- * Copyright © 2025 Progress Software Corporation. All rights reserved. * Licensed under commercial license. See LICENSE.md in the project root for more information *-------------------------------------------------------------------------------------------*/ import { isDocumentAvailable } from '@progress/kendo-angular-common'; import { GridQuery } from './grid-query'; const FIRST_CLASS = 'k-first'; const INPUTS = ['input', 'select', 'textarea', 'option']; /** @hidden */ export const cloneNode = (node) => { const clone = node.cloneNode(false); if (node._kendoExportVisual) { clone._kendoExportVisual = node._kendoExportVisual; } if (INPUTS.indexOf(String(node.nodeName).toLowerCase()) >= 0) { clone.removeAttribute("id"); clone.removeAttribute("name"); clone.value = node.value; clone.checked = node.checked; clone.selected = node.selected; } let child = node.firstChild; while (child) { clone.appendChild(cloneNode(child)); child = child.nextSibling; } return clone; }; const appendNodes = (element, nodes) => { const length = nodes.length; for (let idx = 0; idx < length; idx++) { element.appendChild(cloneNode(nodes[idx])); } }; const wrapTable = (table, size) => { if (!isDocumentAvailable()) { return; } const wrapper = document.createElement('div'); const classes = ['k-grid']; if (size && size !== 'none') { classes.push(`k-grid-${size === 'medium' ? 'md' : 'sm'}`); } wrapper.classList.add(...classes); wrapper.appendChild(table); return wrapper; }; const createTableElement = (sources) => { const sourceCount = sources.length; const element = cloneNode(sources[0]); const rowsCount = element.rows.length; if (sourceCount > 1) { for (let rowIdx = 0; rowIdx < rowsCount; rowIdx++) { for (let sourceIdx = 1; sourceIdx < sourceCount; sourceIdx++) { appendNodes(element.rows[rowIdx], sources[sourceIdx].rows[rowIdx].cells); } } } return element; }; const setFirstCellClass = (header, headers) => { if (headers.length > 1 && header.rows.length > 1) { for (let idx = 1; idx < header.rows.length; idx++) { const firstCellIndex = headers[0].rows[idx].cells.length; const cell = header.rows[idx].cells[firstCellIndex]; if (String(cell.className).indexOf(FIRST_CLASS) === -1) { cell.className += ` ${FIRST_CLASS}`; } } } }; const createTable = (colGroups, headers, bodies, footers, size) => { const table = document.createElement('table'); const classes = ['k-table']; if (size && size !== 'none') { classes.push(`k-table-${size === 'medium' ? 'md' : 'sm'}`); } table.classList.add(...classes); const colGroup = colGroups[0].cloneNode(true); for (let idx = 1; idx < colGroups.length; idx++) { appendNodes(colGroup, colGroups[idx].querySelectorAll('col')); } const header = createTableElement(headers); const body = createTableElement(bodies); setFirstCellClass(header, headers); table.appendChild(colGroup); table.appendChild(header); table.appendChild(body); if (footers.length) { const footer = createTableElement(footers); table.appendChild(footer); } return wrapTable(table, size); }; /** * @hidden */ export const exportElement = (wrapper, size) => { const query = new GridQuery(wrapper); const content = query.content(); let result; if (content) { const colGroups = [content.querySelector('colgroup')]; const headers = [query.header().querySelector('thead')]; const bodies = [content.querySelector('tbody')]; const footer = query.footer(); const footers = []; if (footer) { footers.push(footer.querySelector('tfoot')); } const lockedContent = query.content(true); if (lockedContent) { colGroups.unshift(lockedContent.querySelector('colgroup')); headers.unshift(query.header(true).querySelector('thead')); bodies.unshift(lockedContent.querySelector('tbody')); if (footer) { footers.unshift(query.footer(true).querySelector('tfoot')); } } result = createTable(colGroups, headers, bodies, footers, size); } else { result = wrapTable(query.table().cloneNode(true), size); } return result; };