import { Component, ElementRef, HostListener, Inject, Input, OnDestroy } from '@angular/core';
import { Subject, timer } from 'rxjs';
import { take, takeUntil } from 'rxjs/operators';
import { NbCdkFooterRow, NbCdkHeaderRow, NbCdkRow } from '../cdk/table/type-mappings';
import { NbFooterRowComponent, NbHeaderRowComponent, NbRowComponent } from '../cdk/table/row';
import { NbTreeGridComponent } from './tree-grid.component';
import { NB_TREE_GRID } from './tree-grid-injection-tokens';
export const NB_ROW_DOUBLE_CLICK_DELAY: number = 200;
/**
* Cells container. Adds the right class and role.
*/
@Component({
selector: 'tr[nbTreeGridRow]',
template: ``,
host: {
'class': 'nb-tree-grid-row',
'role': 'row',
},
providers: [{ provide: NbCdkRow, useExisting: NbTreeGridRowComponent }],
})
export class NbTreeGridRowComponent extends NbRowComponent implements OnDestroy {
private readonly doubleClick$ = new Subject();
private readonly tree: NbTreeGridComponent;
/**
* Time to wait for second click to expand row deeply.
* 200ms by default.
*/
@Input() doubleClickDelay: number = NB_ROW_DOUBLE_CLICK_DELAY;
/**
* Toggle row on click. Enabled by default.
*/
@Input() clickToToggle: boolean = true;
@HostListener('click')
toggleIfEnabledNode(): void {
if (!this.clickToToggle) {
return;
}
timer(NB_ROW_DOUBLE_CLICK_DELAY)
.pipe(
take(1),
takeUntil(this.doubleClick$),
)
.subscribe(() => this.tree.toggleRow(this));
}
@HostListener('dblclick')
toggleIfEnabledNodeDeep() {
if (!this.clickToToggle) {
return;
}
this.doubleClick$.next();
this.tree.toggleRow(this, { deep: true });
}
constructor(
@Inject(NB_TREE_GRID) tree,
public elementRef: ElementRef,
) {
super();
this.tree = tree as NbTreeGridComponent;
}
ngOnDestroy() {
this.doubleClick$.complete();
}
}
@Component({
selector: 'tr[nbTreeGridHeaderRow]',
template: `
`,
host: {
'class': 'nb-tree-grid-header-row',
'role': 'row',
},
providers: [{ provide: NbCdkHeaderRow, useExisting: NbTreeGridHeaderRowComponent }],
})
export class NbTreeGridHeaderRowComponent extends NbHeaderRowComponent {}
@Component({
selector: 'tr[nbTreeGridFooterRow]',
template: `
`,
host: {
'class': 'nb-tree-grid-footer-row',
'role': 'row',
},
providers: [{ provide: NbCdkFooterRow, useExisting: NbTreeGridFooterRowComponent }],
})
export class NbTreeGridFooterRowComponent extends NbFooterRowComponent {}