handsontable
Version:
Handsontable is a JavaScript Data Grid available for React, Angular and Vue.
97 lines (92 loc) • 3.91 kB
JavaScript
;
exports.__esModule = true;
require("core-js/modules/es.error.cause.js");
var _orderView = require("../utils/orderView");
var _base = require("./_base");
var _element = require("../../../../helpers/dom/element");
var _a11y = require("../../../../helpers/a11y");
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
* Row headers renderer responsible for managing (inserting, tracking, rendering) TR elements belongs to TR.
*
* <tr> (root node)
* ├ <th> --- RowHeadersRenderer
* ├ <td> \
* ├ <td> \
* ├ <td> - CellsRenderer
* ├ <td> /
* └ <td> /.
*
* @class {CellsRenderer}
*/
class RowHeadersRenderer extends _base.BaseRenderer {
constructor() {
super('TH');
/**
* Cache for OrderView classes connected to specified node.
*
* @type {WeakMap}
*/
_defineProperty(this, "orderViews", new WeakMap());
/**
* Row index which specifies the row position of the processed row header.
*
* @type {number}
*/
_defineProperty(this, "sourceRowIndex", 0);
}
/**
* Obtains the instance of the SharedOrderView class which is responsible for rendering the nodes to the root node.
*
* @param {HTMLTableRowElement} rootNode The TR element, which is root element for row headers (TH).
* @returns {SharedOrderView}
*/
obtainOrderView(rootNode) {
let orderView;
if (this.orderViews.has(rootNode)) {
orderView = this.orderViews.get(rootNode);
} else {
orderView = new _orderView.SharedOrderView(rootNode, sourceColumnIndex => this.nodesPool.obtain(this.sourceRowIndex, sourceColumnIndex));
this.orderViews.set(rootNode, orderView);
}
return orderView;
}
/**
* Renders the cells.
*/
render() {
const {
rowsToRender,
rowHeaderFunctions,
rowHeadersCount,
rows,
cells
} = this.table;
for (let visibleRowIndex = 0; visibleRowIndex < rowsToRender; visibleRowIndex++) {
const sourceRowIndex = this.table.renderedRowToSource(visibleRowIndex);
const TR = rows.getRenderedNode(visibleRowIndex);
this.sourceRowIndex = sourceRowIndex;
const orderView = this.obtainOrderView(TR);
const cellsView = cells.obtainOrderView(TR);
orderView.appendView(cellsView).setSize(rowHeadersCount).setOffset(0).start();
// Reading the row header renderers in reverse because of how the Eco Renderers handle rendering
// (prepending the nodes when rendering row headers).
for (let visibleColumnIndex = rowHeadersCount - 1; visibleColumnIndex >= 0; visibleColumnIndex--) {
orderView.render();
const TH = orderView.getCurrentNode();
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_ROWHEADER)(), (0, _a11y.A11Y_SCOPE_ROW)(), (0, _a11y.A11Y_COLINDEX)(visibleColumnIndex + 1), (0, _a11y.A11Y_TABINDEX)(-1)]);
}
rowHeaderFunctions[visibleColumnIndex](sourceRowIndex, TH, visibleColumnIndex);
}
orderView.end();
}
}
}
exports.RowHeadersRenderer = RowHeadersRenderer;