@taiga-ui/addon-table
Version:
A library to display tabled data with filters, search, group actions, etc.
131 lines • 18.5 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Directive, EventEmitter, inject, Input, Output, signal, ViewEncapsulation, } from '@angular/core';
import { WA_INTERSECTION_ROOT_MARGIN } from '@ng-web-apis/intersection-observer';
import { tuiProvide, tuiWithStyles } from '@taiga-ui/cdk/utils/miscellaneous';
import { tuiButtonOptionsProvider } from '@taiga-ui/core/components/button';
import { TUI_TEXTFIELD_OPTIONS } from '@taiga-ui/core/components/textfield';
import { tuiBadgeOptionsProvider } from '@taiga-ui/kit/components/badge';
import { tuiChipOptionsProvider } from '@taiga-ui/kit/components/chip';
import { tuiProgressOptionsProvider } from '@taiga-ui/kit/components/progress';
import { combineLatest, debounceTime, map, Subject } from 'rxjs';
import { TUI_TABLE_OPTIONS, TuiSortDirection } from '../table.options';
import { TuiStuck } from './stuck.directive';
import * as i0 from "@angular/core";
import * as i1 from "./stuck.directive";
class TuiTableStyles {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableStyles, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiTableStyles, isStandalone: true, selector: "ng-component", host: { classAttribute: "tui-table" }, ngImport: i0, template: '', isInline: true, styles: ["table[tuiTable]{border-collapse:separate;border-spacing:0}table[tuiTable] [tuiCell]{padding:0}table[tuiTable] [tuiTitle]{white-space:nowrap}table[tuiTable] [tuiTitle] tui-icon{font-size:1rem}table[tuiTable] [tuiSubtitle]{color:var(--tui-text-secondary)}table[tuiTable] [tuiTh] [tuiCell],table[tuiTable] [tuiTh] [tuiTitle]{font:inherit;color:inherit}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableStyles, decorators: [{
type: Component,
args: [{ standalone: true, template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
class: 'tui-table',
}, styles: ["table[tuiTable]{border-collapse:separate;border-spacing:0}table[tuiTable] [tuiCell]{padding:0}table[tuiTable] [tuiTitle]{white-space:nowrap}table[tuiTable] [tuiTitle] tui-icon{font-size:1rem}table[tuiTable] [tuiSubtitle]{color:var(--tui-text-secondary)}table[tuiTable] [tuiTh] [tuiCell],table[tuiTable] [tuiTh] [tuiTitle]{font:inherit;color:inherit}\n"] }]
}] });
class TuiTableDirective {
constructor() {
this.options = inject(TUI_TABLE_OPTIONS);
this.cdr = inject(ChangeDetectorRef);
this.nothing = tuiWithStyles(TuiTableStyles);
this.columns = [];
this.direction = this.options.direction;
/**
* @deprecated: use sortChange
*/
this.directionChange = new EventEmitter();
/**
* @deprecated: use sortChange
*/
this.sorterChange = new EventEmitter();
this.sortChange = combineLatest([
this.sorterChange,
this.directionChange,
]).pipe(debounceTime(0), map(([sortBy, orderBy]) => ({ sortBy, orderBy })));
this.appearance = signal('table');
this.size = signal(this.options.size);
this.cleaner = signal(false);
// TODO: refactor to signal inputs after Angular update
this.change$ = new Subject();
this.sorter = () => 0;
}
set sizeSetter(size) {
this.size.set(size);
}
updateSorterAndDirection(sorter) {
if (this.sorter === sorter) {
this.updateDirection(this.direction === TuiSortDirection.Asc
? TuiSortDirection.Desc
: TuiSortDirection.Asc);
}
else {
this.updateSorter(sorter);
this.updateDirection(1);
}
}
ngOnChanges() {
this.change$.next();
}
ngAfterViewInit() {
this.cdr.detectChanges();
}
updateSorter(sorter) {
this.sorter = sorter || (() => 0);
this.sorterChange.emit(this.sorter);
this.change$.next();
}
updateDirection(direction) {
this.direction = direction;
this.directionChange.emit(this.direction);
this.change$.next();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiTableDirective, isStandalone: true, selector: "table[tuiTable]", inputs: { columns: "columns", direction: "direction", sizeSetter: ["size", "sizeSetter"], sorter: "sorter" }, outputs: { directionChange: "directionChange", sorterChange: "sorterChange", sortChange: "sortChange" }, host: { properties: { "attr.data-size": "size()" } }, providers: [
{
provide: WA_INTERSECTION_ROOT_MARGIN,
useValue: '10000px 10000px 10000px 0px',
},
tuiProvide(TUI_TEXTFIELD_OPTIONS, TuiTableDirective),
tuiButtonOptionsProvider({ size: 's' }),
tuiBadgeOptionsProvider({ size: 'm', appearance: 'neutral' }),
tuiChipOptionsProvider({ size: 'xxs', appearance: 'neutral' }),
tuiProgressOptionsProvider({ size: 's', color: 'var(--tui-text-action)' }),
], usesOnChanges: true, hostDirectives: [{ directive: i1.TuiStuck }], ngImport: i0 }); }
}
export { TuiTableDirective };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: 'table[tuiTable]',
providers: [
{
provide: WA_INTERSECTION_ROOT_MARGIN,
useValue: '10000px 10000px 10000px 0px',
},
tuiProvide(TUI_TEXTFIELD_OPTIONS, TuiTableDirective),
tuiButtonOptionsProvider({ size: 's' }),
tuiBadgeOptionsProvider({ size: 'm', appearance: 'neutral' }),
tuiChipOptionsProvider({ size: 'xxs', appearance: 'neutral' }),
tuiProgressOptionsProvider({ size: 's', color: 'var(--tui-text-action)' }),
],
hostDirectives: [TuiStuck],
host: {
'[attr.data-size]': 'size()',
},
}]
}], propDecorators: { columns: [{
type: Input
}], direction: [{
type: Input
}], directionChange: [{
type: Output
}], sorterChange: [{
type: Output
}], sortChange: [{
type: Output
}], sizeSetter: [{
type: Input,
args: ['size']
}], sorter: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tdGFibGUvY29tcG9uZW50cy90YWJsZS9kaXJlY3RpdmVzL3RhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04saUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRS9FLE9BQU8sRUFBQyxVQUFVLEVBQUUsYUFBYSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDNUUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFFMUUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFMUUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDckUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDN0UsT0FBTyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUUvRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7OztBQUUzQyxNQVVNLGNBQWM7K0dBQWQsY0FBYzttR0FBZCxjQUFjLCtHQVJOLEVBQUU7OzRGQVFWLGNBQWM7a0JBVm5CLFNBQVM7aUNBQ00sSUFBSSxZ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RSxRQUFRO3FCQUMvQjtpQkFDSjs4QkFVVSxPQUFPO3NCQURiLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQU9VLGVBQWU7c0JBRDlCLE1BQU07Z0JBT1MsWUFBWTtzQkFEM0IsTUFBTTtnQkFJUyxVQUFVO3NCQUR6QixNQUFNO2dCQWlCSSxVQUFVO3NCQURwQixLQUFLO3VCQUFDLE1BQU07Z0JBTU4sTUFBTTtzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge0FmdGVyVmlld0luaXQsIE9uQ2hhbmdlc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V0FfSU5URVJTRUNUSU9OX1JPT1RfTUFSR0lOfSBmcm9tICdAbmctd2ViLWFwaXMvaW50ZXJzZWN0aW9uLW9ic2VydmVyJztcbmltcG9ydCB0eXBlIHtUdWlDb21wYXJhdG9yfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tdGFibGUvdHlwZXMnO1xuaW1wb3J0IHt0dWlQcm92aWRlLCB0dWlXaXRoU3R5bGVzfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHt0dWlCdXR0b25PcHRpb25zUHJvdmlkZXJ9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB0eXBlIHtUdWlUZXh0ZmllbGRPcHRpb25zfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3RleHRmaWVsZCc7XG5pbXBvcnQge1RVSV9URVhURklFTERfT1BUSU9OU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHR5cGUge1R1aVNpemVMLCBUdWlTaXplU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHt0dWlCYWRnZU9wdGlvbnNQcm92aWRlcn0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL2JhZGdlJztcbmltcG9ydCB7dHVpQ2hpcE9wdGlvbnNQcm92aWRlcn0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL2NoaXAnO1xuaW1wb3J0IHt0dWlQcm9ncmVzc09wdGlvbnNQcm92aWRlcn0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL3Byb2dyZXNzJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBtYXAsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1RVSV9UQUJMRV9PUFRJT05TLCBUdWlTb3J0RGlyZWN0aW9ufSBmcm9tICcuLi90YWJsZS5vcHRpb25zJztcbmltcG9ydCB7VHVpU3R1Y2t9IGZyb20gJy4vc3R1Y2suZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogJycsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFibGUuc3R5bGUubGVzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ3R1aS10YWJsZScsXG4gICAgfSxcbn0pXG5jbGFzcyBUdWlUYWJsZVN0eWxlcyB7fVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndGFibGVbdHVpVGFibGVdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogV0FfSU5URVJTRUNUSU9OX1JPT1RfTUFSR0lOLFxuICAgICAgICAgICAgdXNlVmFsdWU6ICcxMDAwMHB4IDEwMDAwcHggMTAwMDBweCAwcHgnLFxuICAgICAgICB9LFxuICAgICAgICB0dWlQcm92aWRlKFRVSV9URVhURklFTERfT1BUSU9OUywgVHVpVGFibGVEaXJlY3RpdmUpLFxuICAgICAgICB0dWlCdXR0b25PcHRpb25zUHJvdmlkZXIoe3NpemU6ICdzJ30pLFxuICAgICAgICB0dWlCYWRnZU9wdGlvbnNQcm92aWRlcih7c2l6ZTogJ20nLCBhcHBlYXJhbmNlOiAnbmV1dHJhbCd9KSxcbiAgICAgICAgdHVpQ2hpcE9wdGlvbnNQcm92aWRlcih7c2l6ZTogJ3h4cycsIGFwcGVhcmFuY2U6ICduZXV0cmFsJ30pLFxuICAgICAgICB0dWlQcm9ncmVzc09wdGlvbnNQcm92aWRlcih7c2l6ZTogJ3MnLCBjb2xvcjogJ3ZhcigtLXR1aS10ZXh0LWFjdGlvbiknfSksXG4gICAgXSxcbiAgICBob3N0RGlyZWN0aXZlczogW1R1aVN0dWNrXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbYXR0ci5kYXRhLXNpemVdJzogJ3NpemUoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpVGFibGVEaXJlY3RpdmU8VCBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGFueT4+PlxuICAgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgVHVpVGV4dGZpZWxkT3B0aW9ucywgT25DaGFuZ2VzXG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KFRVSV9UQUJMRV9PUFRJT05TKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm90aGluZyA9IHR1aVdpdGhTdHlsZXMoVHVpVGFibGVTdHlsZXMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sdW1uczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBrZXlvZiBUPiA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkOiB1c2Ugc29ydENoYW5nZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBkaXJlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aVNvcnREaXJlY3Rpb24+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZDogdXNlIHNvcnRDaGFuZ2VcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgc29ydGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlDb21wYXJhdG9yPFQ+IHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBzb3J0Q2hhbmdlID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuc29ydGVyQ2hhbmdlLFxuICAgICAgICB0aGlzLmRpcmVjdGlvbkNoYW5nZSxcbiAgICBdKS5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICAgIG1hcCgoW3NvcnRCeSwgb3JkZXJCeV0pID0+ICh7c29ydEJ5LCBvcmRlckJ5fSkpLFxuICAgICk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwZWFyYW5jZSA9IHNpZ25hbCgndGFibGUnKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2l6ZSA9IHNpZ25hbCh0aGlzLm9wdGlvbnMuc2l6ZSk7XG4gICAgcHVibGljIHJlYWRvbmx5IGNsZWFuZXIgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLy8gVE9ETzogcmVmYWN0b3IgdG8gc2lnbmFsIGlucHV0cyBhZnRlciBBbmd1bGFyIHVwZGF0ZVxuICAgIHB1YmxpYyByZWFkb25seSBjaGFuZ2UkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIEBJbnB1dCgnc2l6ZScpXG4gICAgcHVibGljIHNldCBzaXplU2V0dGVyKHNpemU6IFR1aVNpemVMIHwgVHVpU2l6ZVMpIHtcbiAgICAgICAgdGhpcy5zaXplLnNldChzaXplKTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzb3J0ZXI6IFR1aUNvbXBhcmF0b3I8VD4gPSAoKSA9PiAwO1xuXG4gICAgcHVibGljIHVwZGF0ZVNvcnRlckFuZERpcmVjdGlvbihzb3J0ZXI6IFR1aUNvbXBhcmF0b3I8VD4gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRlciA9PT0gc29ydGVyKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpcmVjdGlvbihcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gVHVpU29ydERpcmVjdGlvbi5Bc2NcbiAgICAgICAgICAgICAgICAgICAgPyBUdWlTb3J0RGlyZWN0aW9uLkRlc2NcbiAgICAgICAgICAgICAgICAgICAgOiBUdWlTb3J0RGlyZWN0aW9uLkFzYyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNvcnRlcihzb3J0ZXIpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXJlY3Rpb24oMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hhbmdlJC5uZXh0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVTb3J0ZXIoc29ydGVyOiBUdWlDb21wYXJhdG9yPFQ+IHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNvcnRlciA9IHNvcnRlciB8fCAoKCkgPT4gMCk7XG4gICAgICAgIHRoaXMuc29ydGVyQ2hhbmdlLmVtaXQodGhpcy5zb3J0ZXIpO1xuICAgICAgICB0aGlzLmNoYW5nZSQubmV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRGlyZWN0aW9uKGRpcmVjdGlvbjogVHVpU29ydERpcmVjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuY2hhbmdlJC5uZXh0KCk7XG4gICAgfVxufVxuIl19