UNPKG

@siberiaweb/components

Version:
179 lines (136 loc) 3.98 kB
import Col from "./Col"; import CSS from "./CSS"; import DataRow from "./DataRow"; import WebComponent from "@siberiaweb/webcomponent/lib/WebComponent"; /** * Ячейка. * * @template TRecord Тип записи. */ export default class DataCell< TRecord > extends HTMLTableCellElement { /** * Наименование компонента. */ public static readonly COMPONENT_NAME: string = "sw-grid-data-cell"; /** * Обертка содержания. */ private readonly contentWrapper: HTMLDivElement; /** * Содержание. */ private readonly content: HTMLSpanElement; /** * Столбец. */ private _col: Col | null = null; /** * Строка. */ private _row: DataRow< TRecord > | null = null; /** * Создание обертки содержания. */ private createContentWrapper(): HTMLDivElement { let wrapper: HTMLDivElement = document.createElement( "div" ); wrapper.classList.add( CSS.DATA_CELL_CONTENT_WRAPPER ); return wrapper; } /** * Создание содержания. */ private createContent(): HTMLSpanElement { let content: HTMLSpanElement = document.createElement( "span" ); content.classList.add( CSS.DATA_CELL_CONTENT ); return content; } /** * Признак, что элемент впервые подключен подключен к DOM. */ private firstConnected: boolean = false; /** * Элемент подключен к DOM. */ protected connectedCallback(): void { if ( !this.firstConnected ) { this.firstConnected = true; this.contentWrapper.appendChild( this.content ); this.appendChild( this.contentWrapper ); } } /** * Получение обертки содержания. */ public getContentWrapper(): HTMLDivElement { return this.contentWrapper; } /** * Получение содержания. */ public getContent(): HTMLSpanElement { return this.content; } /** * Получение столбца. * * @throws Error Если столбец для ячейки не указан. */ public get col(): Col { if ( this._col === null ) { throw new Error( "Столбец для ячейки не указан." ); } return this._col; } /** * Установка столбца. * * @param value Значение. */ public set col( value: Col ) { this._col = value; } /** * Получение строки. * * @throws Error Если строка для ячейки не указана. */ public get row(): DataRow< TRecord > { if ( this._row === null ) { throw new Error( "Строка для ячейки не указана." ); } return this._row; } /** * Установка строки. * * @param value Значение. */ public set row( value: DataRow< TRecord > ) { this._row = value; } /** * Выбор ячейки. */ public select(): void { this.classList.add( CSS.SELECTED_CELL ); } /** * Отмена выбора ячейки. */ public unselect(): void { this.classList.remove( CSS.SELECTED_CELL ); } /** * Конструктор. */ constructor() { super(); this.contentWrapper = this.createContentWrapper(); this.content = this.createContent(); } } WebComponent.define( DataCell, "td" );