UNPKG

handsontable

Version:

Handsontable is a JavaScript Data Grid available for React, Angular and Vue.

105 lines (101 loc) 3.88 kB
"use strict"; exports.__esModule = true; var _element = require("../../../../helpers/dom/element"); var _base = require("./_base"); var _a11y = require("../../../../helpers/a11y"); /** * Column headers renderer responsible for managing (inserting, tracking, rendering) TR and TH elements. * * <thead> (root node) * ├ <tr> \ * ├ <tr> \ * ├ <tr> - ColumnHeadersRenderer * ├ <tr> / * └ <tr> /. * * @class {ColumnHeadersRenderer} */ class ColumnHeadersRenderer extends _base.BaseRenderer { constructor(rootNode) { super(null, rootNode); // NodePool is not implemented for this renderer yet } /** * Adjusts the number of the rendered elements. */ adjust() { const { columnHeadersCount, rowHeadersCount } = this.table; let TR = this.rootNode.firstChild; if (columnHeadersCount) { const { columnsToRender } = this.table; const allColumnsToRender = columnsToRender + rowHeadersCount; for (let i = 0, len = columnHeadersCount; i < len; i++) { TR = this.rootNode.childNodes[i]; if (!TR) { TR = this.table.rootDocument.createElement('tr'); this.rootNode.appendChild(TR); } this.renderedNodes = TR.childNodes.length; while (this.renderedNodes < allColumnsToRender) { TR.appendChild(this.table.rootDocument.createElement('th')); this.renderedNodes += 1; } while (this.renderedNodes > allColumnsToRender) { TR.removeChild(TR.lastChild); this.renderedNodes -= 1; } } const theadChildrenLength = this.rootNode.childNodes.length; if (theadChildrenLength > columnHeadersCount) { for (let i = columnHeadersCount; i < theadChildrenLength; i++) { this.rootNode.removeChild(this.rootNode.lastChild); } } } else if (TR) { (0, _element.empty)(TR); } } /** * Renders the TH elements. */ render() { const { columnHeadersCount } = this.table; if (this.table.isAriaEnabled()) { (0, _element.setAttribute)(this.rootNode, [(0, _a11y.A11Y_ROWGROUP)()]); } for (let rowHeaderIndex = 0; rowHeaderIndex < columnHeadersCount; rowHeaderIndex += 1) { const { columnHeaderFunctions, columnsToRender, rowHeadersCount } = this.table; const TR = this.rootNode.childNodes[rowHeaderIndex]; if (this.table.isAriaEnabled()) { (0, _element.setAttribute)(TR, [(0, _a11y.A11Y_ROW)(), (0, _a11y.A11Y_ROWINDEX)(rowHeaderIndex + 1)]); } for (let renderedColumnIndex = -1 * rowHeadersCount; renderedColumnIndex < columnsToRender; renderedColumnIndex += 1) { // eslint-disable-line max-len const sourceColumnIndex = this.table.renderedColumnToSource(renderedColumnIndex); const TH = TR.childNodes[renderedColumnIndex + rowHeadersCount]; TH.className = ''; TH.removeAttribute('style'); // Remove all accessibility-related attributes for the header to start fresh. (0, _element.removeAttribute)(TH, [new RegExp('aria-(.*)'), new RegExp('role')]); if (this.table.isAriaEnabled()) { (0, _element.setAttribute)(TH, [(0, _a11y.A11Y_COLINDEX)(renderedColumnIndex + 1 + this.table.rowHeadersCount), (0, _a11y.A11Y_TABINDEX)(-1), (0, _a11y.A11Y_COLUMNHEADER)(), ...(renderedColumnIndex >= 0 ? [(0, _a11y.A11Y_SCOPE_COL)()] : [ // Adding `role=row` to the corner headers to prevent // https://github.com/handsontable/dev-handsontable/issues/1574 (0, _a11y.A11Y_GRIDCELL_BUTTON)(), (0, _a11y.A11Y_LABEL)('Select whole grid')])]); } columnHeaderFunctions[rowHeaderIndex](sourceColumnIndex, TH, rowHeaderIndex); } } } } exports.ColumnHeadersRenderer = ColumnHeadersRenderer;