* Append column header to a TH element. * * @private * @param {number} visualColumnIndex Visual column index. * @param {HTMLTableCellElement} TH The table header element. * @param {Function} [label] The function that returns the header label. * @param {number} [headerLevel=0] The i
(
visualColumnIndex: number,
TH: HTMLTableCellElement,
label = this.hot.getColHeader,
headerLevel = 0
)
| 1524 | * values counting from 0 to N). |
| 1525 | */ |
| 1526 | appendColHeader( |
| 1527 | visualColumnIndex: number, |
| 1528 | TH: HTMLTableCellElement, |
| 1529 | label = this.hot.getColHeader, |
| 1530 | headerLevel = 0 |
| 1531 | ) { |
| 1532 | const getColumnHeaderClassNames = (): string[] => { |
| 1533 | const metaHeaderClassNames = |
| 1534 | visualColumnIndex >= 0 ? |
| 1535 | this.hot.getColumnMeta(visualColumnIndex).headerClassName : |
| 1536 | null; |
| 1537 | |
| 1538 | if (!metaHeaderClassNames) { |
| 1539 | return []; |
| 1540 | } |
| 1541 | |
| 1542 | const classes: string[] = Array.isArray(metaHeaderClassNames) |
| 1543 | ? (metaHeaderClassNames as string[]) |
| 1544 | : (metaHeaderClassNames as string).split(' '); |
| 1545 | |
| 1546 | return classes.flatMap(cls => cls.split(' ')).filter(cls => cls.length > 0); |
| 1547 | }; |
| 1548 | |
| 1549 | if (TH.firstChild) { |
| 1550 | const container = TH.firstChild as HTMLElement; |
| 1551 | |
| 1552 | if (hasClass(container, 'relative')) { |
| 1553 | this.updateCellHeader( |
| 1554 | container.querySelector<HTMLElement>('.colHeader')!, visualColumnIndex, label, headerLevel); |
| 1555 | |
| 1556 | container.className = ''; |
| 1557 | addClass(container, ['relative', ...getColumnHeaderClassNames()]); |
| 1558 | |
| 1559 | } else { |
| 1560 | empty(TH); |
| 1561 | this.appendColHeader(visualColumnIndex, TH, label, headerLevel); |
| 1562 | } |
| 1563 | |
| 1564 | } else { |
| 1565 | const { rootDocument } = this.hot; |
| 1566 | const div = rootDocument.createElement('div'); |
| 1567 | const span = rootDocument.createElement('span'); |
| 1568 | const classNames = getColumnHeaderClassNames(); |
| 1569 | |
| 1570 | div.classList.add('relative', ...classNames); |
| 1571 | span.className = 'colHeader'; |
| 1572 | |
| 1573 | if (this.settings.ariaTags) { |
| 1574 | setAttribute(div, [A11Y_PRESENTATION()]); |
| 1575 | setAttribute(span, [A11Y_PRESENTATION()]); |
| 1576 | } |
| 1577 | |
| 1578 | this.updateCellHeader(span, visualColumnIndex, label, headerLevel); |
| 1579 | |
| 1580 | div.appendChild(span); |
| 1581 | TH.appendChild(div); |
| 1582 | } |
| 1583 |