@siberiaweb/components
Version:
179 lines (136 loc) • 3.98 kB
text/typescript
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" );