Index: trip-planner-front/node_modules/primeng/fesm2020/primeng-table.mjs.map
===================================================================
--- trip-planner-front/node_modules/primeng/fesm2020/primeng-table.mjs.map	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ trip-planner-front/node_modules/primeng/fesm2020/primeng-table.mjs.map	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
@@ -0,0 +1,1 @@
+{"version":3,"file":"primeng-table.mjs","sources":["../../src/app/components/table/table.ts","../../src/app/components/table/primeng-table.ts"],"sourcesContent":["import { NgModule, Component, HostListener, OnInit, OnDestroy, AfterViewInit, Directive, Optional, AfterContentInit,\n    Input, Output, EventEmitter, ElementRef, ContentChildren, TemplateRef, QueryList, ViewChild, NgZone, ChangeDetectorRef, OnChanges, SimpleChanges, ChangeDetectionStrategy, Query, ViewEncapsulation, Renderer2} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { PrimeTemplate, SharedModule, FilterMatchMode, FilterOperator, SelectItem, PrimeNGConfig, TranslationKeys, FilterService, OverlayService } from 'primeng/api';\nimport { PaginatorModule } from 'primeng/paginator';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { ButtonModule } from 'primeng/button';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { TriStateCheckboxModule } from 'primeng/tristatecheckbox';\nimport { CalendarModule } from 'primeng/calendar';\nimport { InputNumberModule } from 'primeng/inputnumber';\nimport { DropdownModule } from 'primeng/dropdown';\nimport { DomHandler, ConnectedOverlayScrollHandler } from 'primeng/dom';\nimport { ObjectUtils, UniqueComponentId, ZIndexUtils } from 'primeng/utils';\nimport { SortMeta } from 'primeng/api';\nimport { TableState } from 'primeng/api';\nimport { FilterMetadata } from 'primeng/api';\nimport { Injectable } from '@angular/core';\nimport { BlockableUI } from 'primeng/api';\nimport { Subject, Subscription } from 'rxjs';\nimport { ScrollingModule, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport {trigger,style,transition,animate,AnimationEvent} from '@angular/animations';\n\n@Injectable()\nexport class TableService {\n\n    private sortSource = new Subject<SortMeta|SortMeta[]>();\n    private selectionSource = new Subject();\n    private contextMenuSource = new Subject<any>();\n    private valueSource = new Subject<any>();\n    private totalRecordsSource = new Subject<any>();\n    private columnsSource = new Subject();\n    private resetSource = new Subject();\n\n    sortSource$ = this.sortSource.asObservable();\n    selectionSource$ = this.selectionSource.asObservable();\n    contextMenuSource$ = this.contextMenuSource.asObservable();\n    valueSource$ = this.valueSource.asObservable();\n    totalRecordsSource$ = this.totalRecordsSource.asObservable();\n    columnsSource$ = this.columnsSource.asObservable();\n    resetSource$ = this.resetSource.asObservable();\n\n    onSort(sortMeta: SortMeta|SortMeta[]) {\n        this.sortSource.next(sortMeta);\n    }\n\n    onSelectionChange() {\n        this.selectionSource.next(null);\n    }\n\n    onResetChange() {\n        this.resetSource.next(null);\n    }\n\n    onContextMenu(data: any) {\n        this.contextMenuSource.next(data);\n    }\n\n    onValueChange(value: any) {\n        this.valueSource.next(value);\n    }\n\n    onTotalRecordsChange(value: number) {\n        this.totalRecordsSource.next(value);\n    }\n\n    onColumnsChange(columns: any[]) {\n        this.columnsSource.next(columns);\n    }\n}\n\n@Component({\n    selector: 'p-table',\n    template: `\n        <div #container [ngStyle]=\"style\" [class]=\"styleClass\"\n            [ngClass]=\"{'p-datatable p-component': true,\n                'p-datatable-hoverable-rows': (rowHover||selectionMode),\n                'p-datatable-auto-layout': autoLayout,\n                'p-datatable-resizable': resizableColumns,\n                'p-datatable-resizable-fit': (resizableColumns && columnResizeMode === 'fit'),\n                'p-datatable-scrollable': scrollable,\n                'p-datatable-scrollable-vertical': scrollable && scrollDirection === 'vertical',\n                'p-datatable-scrollable-horizontal': scrollable && scrollDirection === 'horizontal',\n                'p-datatable-scrollable-both': scrollable && scrollDirection === 'both',\n                'p-datatable-flex-scrollable': (scrollable && scrollHeight === 'flex'),\n                'p-datatable-responsive-stack': responsiveLayout === 'stack',\n                'p-datatable-responsive-scroll': responsiveLayout === 'scroll',\n                'p-datatable-responsive': responsive,\n                'p-datatable-grouped-header': headerGroupedTemplate != null,\n                'p-datatable-grouped-footer': footerGroupedTemplate != null}\" [attr.id]=\"id\">\n            <div class=\"p-datatable-loading-overlay p-component-overlay\" *ngIf=\"loading && showLoader\">\n                <i [class]=\"'p-datatable-loading-icon pi-spin ' + loadingIcon\"></i>\n            </div>\n            <div *ngIf=\"captionTemplate\" class=\"p-datatable-header\">\n                <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n            </div>\n            <p-paginator [rows]=\"rows\" [first]=\"first\" [totalRecords]=\"totalRecords\" [pageLinkSize]=\"pageLinks\" styleClass=\"p-paginator-top\" [alwaysShow]=\"alwaysShowPaginator\"\n                (onPageChange)=\"onPageChange($event)\" [rowsPerPageOptions]=\"rowsPerPageOptions\" *ngIf=\"paginator && (paginatorPosition === 'top' || paginatorPosition =='both')\"\n                [templateLeft]=\"paginatorLeftTemplate\" [templateRight]=\"paginatorRightTemplate\" [dropdownAppendTo]=\"paginatorDropdownAppendTo\" [dropdownScrollHeight]=\"paginatorDropdownScrollHeight\"\n                [currentPageReportTemplate]=\"currentPageReportTemplate\" [showFirstLastIcon]=\"showFirstLastIcon\" [dropdownItemTemplate]=\"paginatorDropdownItemTemplate\" [showCurrentPageReport]=\"showCurrentPageReport\" [showJumpToPageDropdown]=\"showJumpToPageDropdown\" [showJumpToPageInput]=\"showJumpToPageInput\" [showPageLinks]=\"showPageLinks\"></p-paginator>\n\n            <div #wrapper class=\"p-datatable-wrapper\" [ngStyle]=\"{height: scrollHeight}\">\n                <table #table *ngIf=\"!virtualScroll\" role=\"table\" class=\"p-datatable-table\" [ngClass]=\"tableStyleClass\" [ngStyle]=\"tableStyle\" [attr.id]=\"id+'-table'\">\n                    <ng-container *ngTemplateOutlet=\"colGroupTemplate; context {$implicit: columns}\"></ng-container>\n                    <thead class=\"p-datatable-thead\">\n                        <ng-container *ngTemplateOutlet=\"headerGroupedTemplate||headerTemplate; context: {$implicit: columns}\"></ng-container>\n                    </thead>\n                    <tbody class=\"p-datatable-tbody p-datatable-frozen-tbody\" *ngIf=\"frozenValue||frozenBodyTemplate\" [value]=\"frozenValue\" [frozenRows]=\"true\" [pTableBody]=\"columns\" [pTableBodyTemplate]=\"frozenBodyTemplate\" [frozen]=\"true\"></tbody>\n                    <tbody class=\"p-datatable-tbody\" [value]=\"dataToRender\" [pTableBody]=\"columns\" [pTableBodyTemplate]=\"bodyTemplate\"></tbody>\n                    <tfoot *ngIf=\"footerGroupedTemplate||footerTemplate\" class=\"p-datatable-tfoot\">\n                        <ng-container *ngTemplateOutlet=\"footerGroupedTemplate||footerTemplate; context {$implicit: columns}\"></ng-container>\n                    </tfoot>\n                </table>\n                <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll\" [itemSize]=\"virtualRowHeight\" tabindex=\"0\" [style.height]=\"scrollHeight !== 'flex' ? scrollHeight : undefined\" [minBufferPx]=\"minBufferPx\" [maxBufferPx]=\"maxBufferPx\" (scrolledIndexChange)=\"onScrollIndexChange($event)\" class=\"p-datatable-virtual-scrollable-body\">\n                    <table #table role=\"table\" class=\"p-datatable-table\" [ngClass]=\"tableStyleClass\" [ngStyle]=\"tableStyle\" [attr.id]=\"id+'-table'\">\n                        <ng-container *ngTemplateOutlet=\"colGroupTemplate; context {$implicit: columns}\"></ng-container>\n                        <thead #tableHeader class=\"p-datatable-thead\">\n                            <ng-container *ngTemplateOutlet=\"headerGroupedTemplate||headerTemplate; context: {$implicit: columns}\"></ng-container>\n                        </thead>\n                        <tbody class=\"p-datatable-tbody p-datatable-frozen-tbody\" *ngIf=\"frozenValue||frozenBodyTemplate\" [value]=\"frozenValue\" [frozenRows]=\"true\" [pTableBody]=\"columns\" [pTableBodyTemplate]=\"bodyTemplate\" [frozen]=\"true\"></tbody>\n                        <tbody class=\"p-datatable-tbody\" [value]=\"dataToRender\" [pTableBody]=\"columns\" [pTableBodyTemplate]=\"bodyTemplate\"></tbody>\n                        <tfoot *ngIf=\"footerGroupedTemplate||footerTemplate\" class=\"p-datatable-tfoot\">\n                            <ng-container *ngTemplateOutlet=\"footerGroupedTemplate||footerTemplate; context {$implicit: columns}\"></ng-container>\n                        </tfoot>\n                    </table>\n                </cdk-virtual-scroll-viewport>\n            </div>\n\n            <p-paginator [rows]=\"rows\" [first]=\"first\" [totalRecords]=\"totalRecords\" [pageLinkSize]=\"pageLinks\" styleClass=\"p-paginator-bottom\" [alwaysShow]=\"alwaysShowPaginator\"\n                (onPageChange)=\"onPageChange($event)\" [rowsPerPageOptions]=\"rowsPerPageOptions\" *ngIf=\"paginator && (paginatorPosition === 'bottom' || paginatorPosition =='both')\"\n                [templateLeft]=\"paginatorLeftTemplate\" [templateRight]=\"paginatorRightTemplate\" [dropdownAppendTo]=\"paginatorDropdownAppendTo\" [dropdownScrollHeight]=\"paginatorDropdownScrollHeight\"\n                [currentPageReportTemplate]=\"currentPageReportTemplate\" [showFirstLastIcon]=\"showFirstLastIcon\" [dropdownItemTemplate]=\"paginatorDropdownItemTemplate\" [showCurrentPageReport]=\"showCurrentPageReport\" [showJumpToPageDropdown]=\"showJumpToPageDropdown\" [showJumpToPageInput]=\"showJumpToPageInput\" [showPageLinks]=\"showPageLinks\"></p-paginator>\n\n            <div *ngIf=\"summaryTemplate\" class=\"p-datatable-footer\">\n                <ng-container *ngTemplateOutlet=\"summaryTemplate\"></ng-container>\n            </div>\n\n            <div #resizeHelper class=\"p-column-resizer-helper\" style=\"display:none\" *ngIf=\"resizableColumns\"></div>\n            <span #reorderIndicatorUp class=\"pi pi-arrow-down p-datatable-reorder-indicator-up\" style=\"display:none\" *ngIf=\"reorderableColumns\"></span>\n            <span #reorderIndicatorDown class=\"pi pi-arrow-up p-datatable-reorder-indicator-down\" style=\"display:none\" *ngIf=\"reorderableColumns\"></span>\n        </div>\n    `,\n    providers: [TableService],\n    changeDetection: ChangeDetectionStrategy.Default,\n    encapsulation: ViewEncapsulation.None,\n    styleUrls: ['./table.css'],\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class Table implements OnInit, AfterViewInit, AfterContentInit, BlockableUI, OnChanges {\n\n    @Input() frozenColumns: any[];\n\n    @Input() frozenValue: any[];\n\n    @Input() style: any;\n\n    @Input() styleClass: string;\n\n    @Input() tableStyle: any;\n\n    @Input() tableStyleClass: string;\n\n    @Input() paginator: boolean;\n\n    @Input() pageLinks: number = 5;\n\n    @Input() rowsPerPageOptions: any[];\n\n    @Input() alwaysShowPaginator: boolean = true;\n\n    @Input() paginatorPosition: string = 'bottom';\n\n    @Input() paginatorDropdownAppendTo: any;\n\n    @Input() paginatorDropdownScrollHeight: string = '200px';\n\n    @Input() currentPageReportTemplate: string = '{currentPage} of {totalPages}';\n\n    @Input() showCurrentPageReport: boolean;\n\n    @Input() showJumpToPageDropdown: boolean;\n\n    @Input() showJumpToPageInput: boolean;\n\n    @Input() showFirstLastIcon: boolean = true;\n\n    @Input() showPageLinks: boolean = true;\n\n    @Input() defaultSortOrder: number = 1;\n\n    @Input() sortMode: string = 'single';\n\n    @Input() resetPageOnSort: boolean = true;\n\n    @Input() selectionMode: string;\n\n    @Output() selectionChange: EventEmitter<any> = new EventEmitter();\n\n    @Input() contextMenuSelection: any;\n\n    @Output() contextMenuSelectionChange: EventEmitter<any> = new EventEmitter();\n\n    @Input() contextMenuSelectionMode: string = \"separate\";\n\n    @Input() dataKey: string;\n\n    @Input() metaKeySelection: boolean;\n\n    @Input() rowTrackBy: Function = (index: number, item: any) => item;\n\n    @Input() lazy: boolean = false;\n\n    @Input() lazyLoadOnInit: boolean = true;\n\n    @Input() compareSelectionBy: string = 'deepEquals';\n\n    @Input() csvSeparator: string = ',';\n\n    @Input() exportFilename: string = 'download';\n\n    @Input() filters: { [s: string]: FilterMetadata | FilterMetadata[] } = {};\n\n    @Input() globalFilterFields: string[];\n\n    @Input() filterDelay: number = 300;\n\n    @Input() filterLocale: string;\n\n    @Input() expandedRowKeys: { [s: string]: boolean; } = {};\n\n    @Input() editingRowKeys: { [s: string]: boolean; } = {};\n\n    @Input() rowExpandMode: string = 'multiple';\n\n    @Input() scrollable: boolean;\n\n    @Input() scrollDirection: string = \"vertical\";\n\n    @Input() rowGroupMode: string;\n\n    @Input() scrollHeight: string;\n\n    @Input() virtualScroll: boolean;\n\n    @Input() virtualScrollDelay: number = 250;\n\n    @Input() virtualRowHeight: number = 28;\n\n    @Input() frozenWidth: string;\n\n    @Input() responsive: boolean;\n\n    @Input() contextMenu: any;\n\n    @Input() resizableColumns: boolean;\n\n    @Input() columnResizeMode: string = 'fit';\n\n    @Input() reorderableColumns: boolean;\n\n    @Input() loading: boolean;\n\n    @Input() loadingIcon: string = 'pi pi-spinner';\n\n    @Input() showLoader: boolean = true;\n\n    @Input() rowHover: boolean;\n\n    @Input() customSort: boolean;\n\n    @Input() showInitialSortBadge: boolean = true;\n\n    @Input() autoLayout: boolean;\n\n    @Input() exportFunction;\n\n    @Input() stateKey: string;\n\n    @Input() stateStorage: string = 'session';\n\n    @Input() editMode: string = 'cell';\n\n    @Input() groupRowsBy: any;\n\n    @Input() groupRowsByOrder: number = 1;\n\n    @Input() minBufferPx: number;\n\n    @Input() maxBufferPx: number;\n\n    @Input() responsiveLayout: string = 'stack';\n\n    @Input() breakpoint: string = '960px';\n\n    @Output() onRowSelect: EventEmitter<any> = new EventEmitter();\n\n    @Output() onRowUnselect: EventEmitter<any> = new EventEmitter();\n\n    @Output() onPage: EventEmitter<any> = new EventEmitter();\n\n    @Output() onSort: EventEmitter<any> = new EventEmitter();\n\n    @Output() onFilter: EventEmitter<any> = new EventEmitter();\n\n    @Output() onLazyLoad: EventEmitter<any> = new EventEmitter();\n\n    @Output() onRowExpand: EventEmitter<any> = new EventEmitter();\n\n    @Output() onRowCollapse: EventEmitter<any> = new EventEmitter();\n\n    @Output() onContextMenuSelect: EventEmitter<any> = new EventEmitter();\n\n    @Output() onColResize: EventEmitter<any> = new EventEmitter();\n\n    @Output() onColReorder: EventEmitter<any> = new EventEmitter();\n\n    @Output() onRowReorder: EventEmitter<any> = new EventEmitter();\n\n    @Output() onEditInit: EventEmitter<any> = new EventEmitter();\n\n    @Output() onEditComplete: EventEmitter<any> = new EventEmitter();\n\n    @Output() onEditCancel: EventEmitter<any> = new EventEmitter();\n\n    @Output() onHeaderCheckboxToggle: EventEmitter<any> = new EventEmitter();\n\n    @Output() sortFunction: EventEmitter<any> = new EventEmitter();\n\n    @Output() firstChange: EventEmitter<number> = new EventEmitter();\n\n    @Output() rowsChange: EventEmitter<number> = new EventEmitter();\n\n    @Output() onStateSave: EventEmitter<any> = new EventEmitter();\n\n    @Output() onStateRestore: EventEmitter<any> = new EventEmitter();\n\n    @ViewChild('container') containerViewChild: ElementRef;\n\n    @ViewChild('resizeHelper') resizeHelperViewChild: ElementRef;\n\n    @ViewChild('reorderIndicatorUp') reorderIndicatorUpViewChild: ElementRef;\n\n    @ViewChild('reorderIndicatorDown') reorderIndicatorDownViewChild: ElementRef;\n\n    @ViewChild('wrapper') wrapperViewChild: ElementRef;\n\n    @ViewChild('table') tableViewChild: ElementRef;\n\n    @ViewChild('tableHeader') tableHeaderViewChild: ElementRef;\n\n    @ViewChild(CdkVirtualScrollViewport) virtualScrollBody: CdkVirtualScrollViewport;\n\n    @ContentChildren(PrimeTemplate) templates: QueryList<PrimeTemplate>;\n\n    _value: any[] = [];\n\n    _columns: any[];\n\n    _totalRecords: number = 0;\n\n    _first: number = 0;\n\n    _rows: number;\n\n    filteredValue: any[];\n\n    headerTemplate: TemplateRef<any>;\n\n    headerGroupedTemplate: TemplateRef<any>;\n\n    bodyTemplate: TemplateRef<any>;\n\n    loadingBodyTemplate: TemplateRef<any>;\n\n    captionTemplate: TemplateRef<any>;\n\n    frozenRowsTemplate: TemplateRef<any>;\n\n    footerTemplate: TemplateRef<any>;\n\n    footerGroupedTemplate: TemplateRef<any>;\n\n    summaryTemplate: TemplateRef<any>;\n\n    colGroupTemplate: TemplateRef<any>;\n\n    expandedRowTemplate: TemplateRef<any>;\n\n    groupHeaderTemplate: TemplateRef<any>;\n\n    groupFooterTemplate: TemplateRef<any>;\n\n    rowspanTemplate: TemplateRef<any>;\n\n    frozenExpandedRowTemplate: TemplateRef<any>;\n\n    frozenHeaderTemplate: TemplateRef<any>;\n\n    frozenBodyTemplate: TemplateRef<any>;\n\n    frozenFooterTemplate: TemplateRef<any>;\n\n    frozenColGroupTemplate: TemplateRef<any>;\n\n    emptyMessageTemplate: TemplateRef<any>;\n\n    paginatorLeftTemplate: TemplateRef<any>;\n\n    paginatorRightTemplate: TemplateRef<any>;\n\n    paginatorDropdownItemTemplate: TemplateRef<any>;\n\n    selectionKeys: any = {};\n\n    lastResizerHelperX: number;\n\n    reorderIconWidth: number;\n\n    reorderIconHeight: number;\n\n    draggedColumn: any;\n\n    draggedRowIndex: number;\n\n    droppedRowIndex: number;\n\n    rowDragging: boolean;\n\n    dropPosition: number;\n\n    editingCell: Element;\n\n    editingCellData: any;\n\n    editingCellField: any;\n\n    editingCellRowIndex: number;\n\n    selfClick: boolean;\n\n    documentEditListener: any;\n\n    _multiSortMeta: SortMeta[];\n\n    _sortField: string;\n\n    _sortOrder: number = 1;\n\n    preventSelectionSetterPropagation: boolean;\n\n    _selection: any;\n\n    anchorRowIndex: number;\n\n    rangeRowIndex: number;\n\n    filterTimeout: any;\n\n    initialized: boolean;\n\n    rowTouched: boolean;\n\n    restoringSort: boolean;\n\n    restoringFilter: boolean;\n\n    stateRestored: boolean;\n\n    columnOrderStateRestored: boolean;\n\n    columnWidthsState: string;\n\n    tableWidthState: string;\n\n    overlaySubscription: Subscription;\n\n    virtualScrollSubscription: Subscription;\n\n    resizeColumnElement;\n\n    columnResizing: boolean = false;\n\n    rowGroupHeaderStyleObject: any = {};\n\n    id: string = UniqueComponentId();\n\n    styleElement: any;\n\n    responsiveStyleElement: any;\n\n    constructor(public el: ElementRef, public zone: NgZone, public tableService: TableService, public cd: ChangeDetectorRef, public filterService: FilterService, public overlayService: OverlayService) {}\n\n    ngOnInit() {\n        if (this.lazy && this.lazyLoadOnInit) {\n            if (!this.virtualScroll) {\n                this.onLazyLoad.emit(this.createLazyLoadMetadata());\n            }\n\n            if (this.restoringFilter) {\n                this.restoringFilter = false;\n            }\n        }\n\n        if (this.responsiveLayout === 'stack' && !this.scrollable) {\n            this.createResponsiveStyle();\n        }\n\n        this.initialized = true;\n    }\n\n    ngAfterContentInit() {\n        this.templates.forEach((item) => {\n            switch (item.getType()) {\n                case 'caption':\n                    this.captionTemplate = item.template;\n                break;\n\n                case 'header':\n                    this.headerTemplate = item.template;\n                break;\n\n                case 'headergrouped':\n                    this.headerGroupedTemplate = item.template;\n                break;\n\n                case 'body':\n                    this.bodyTemplate = item.template;\n                break;\n\n                case 'loadingbody':\n                    this.loadingBodyTemplate = item.template;\n                break;\n\n                case 'footer':\n                    this.footerTemplate = item.template;\n                break;\n\n                case 'footergrouped':\n                    this.footerGroupedTemplate = item.template;\n                break;\n\n                case 'summary':\n                    this.summaryTemplate = item.template;\n                break;\n\n                case 'colgroup':\n                    this.colGroupTemplate = item.template;\n                break;\n\n                case 'rowexpansion':\n                    this.expandedRowTemplate = item.template;\n                break;\n\n                case 'groupheader':\n                    this.groupHeaderTemplate = item.template;\n                break;\n\n                case 'rowspan':\n                    this.rowspanTemplate = item.template;\n                break;\n\n                case 'groupfooter':\n                    this.groupFooterTemplate = item.template;\n                break;\n\n                case 'frozenrows':\n                    this.frozenRowsTemplate = item.template;\n                break;\n\n                case 'frozenheader':\n                    this.frozenHeaderTemplate = item.template;\n                break;\n\n                case 'frozenbody':\n                    this.frozenBodyTemplate = item.template;\n                break;\n\n                case 'frozenfooter':\n                    this.frozenFooterTemplate = item.template;\n                break;\n\n                case 'frozencolgroup':\n                    this.frozenColGroupTemplate = item.template;\n                break;\n\n                case 'frozenrowexpansion':\n                    this.frozenExpandedRowTemplate = item.template;\n                break;\n\n                case 'emptymessage':\n                    this.emptyMessageTemplate = item.template;\n                break;\n\n                case 'paginatorleft':\n                    this.paginatorLeftTemplate = item.template;\n                break;\n\n                case 'paginatorright':\n                    this.paginatorRightTemplate = item.template;\n                break;\n\n                case 'paginatordropdownitem':\n                    this.paginatorDropdownItemTemplate = item.template;\n                break;\n            }\n        });\n    }\n\n    ngAfterViewInit() {\n        if (this.isStateful() && this.resizableColumns) {\n            this.restoreColumnWidths();\n        }\n\n        if (this.scrollable && this.virtualScroll) {\n            this.virtualScrollSubscription =  this.virtualScrollBody.renderedRangeStream.subscribe(range => {\n                let top = range.start * this.virtualRowHeight * -1;\n                this.tableHeaderViewChild.nativeElement.style.top = top + 'px';\n            });\n        }\n    }\n\n    ngOnChanges(simpleChange: SimpleChanges) {\n        if (simpleChange.value) {\n            if (this.isStateful() && !this.stateRestored) {\n                this.restoreState();\n            }\n\n            this._value = simpleChange.value.currentValue;\n\n            if (!this.lazy) {\n                this.totalRecords = (this._value ? this._value.length : 0);\n\n                if (this.sortMode == 'single' && (this.sortField || this.groupRowsBy))\n                    this.sortSingle();\n                else if (this.sortMode == 'multiple' && (this.multiSortMeta || this.groupRowsBy))\n                    this.sortMultiple();\n                else if (this.hasFilter())       //sort already filters\n                    this._filter();\n            }\n\n            this.tableService.onValueChange(simpleChange.value.currentValue);\n        }\n\n        if (simpleChange.columns) {\n            this._columns = simpleChange.columns.currentValue;\n            this.tableService.onColumnsChange(simpleChange.columns.currentValue);\n\n            if (this._columns && this.isStateful() && this.reorderableColumns && !this.columnOrderStateRestored ) {\n                this.restoreColumnOrder();\n            }\n        }\n\n        if (simpleChange.sortField) {\n            this._sortField = simpleChange.sortField.currentValue;\n\n            //avoid triggering lazy load prior to lazy initialization at onInit\n            if ( !this.lazy || this.initialized ) {\n                if (this.sortMode === 'single') {\n                    this.sortSingle();\n                }\n            }\n        }\n\n        if (simpleChange.groupRowsBy) {\n            //avoid triggering lazy load prior to lazy initialization at onInit\n            if ( !this.lazy || this.initialized ) {\n                if (this.sortMode === 'single') {\n                    this.sortSingle();\n                }\n            }\n        }\n\n        if (simpleChange.sortOrder) {\n            this._sortOrder = simpleChange.sortOrder.currentValue;\n\n            //avoid triggering lazy load prior to lazy initialization at onInit\n            if ( !this.lazy || this.initialized ) {\n                if (this.sortMode === 'single') {\n                    this.sortSingle();\n                }\n            }\n        }\n\n        if (simpleChange.groupRowsByOrder) {\n            //avoid triggering lazy load prior to lazy initialization at onInit\n            if ( !this.lazy || this.initialized ) {\n                if (this.sortMode === 'single') {\n                    this.sortSingle();\n                }\n            }\n        }\n\n        if (simpleChange.multiSortMeta) {\n            this._multiSortMeta = simpleChange.multiSortMeta.currentValue;\n            if (this.sortMode === 'multiple' && (this.initialized || (!this.lazy && !this.virtualScroll))) {\n                this.sortMultiple();\n            }\n        }\n\n        if (simpleChange.selection) {\n            this._selection = simpleChange.selection.currentValue;\n\n            if (!this.preventSelectionSetterPropagation) {\n                this.updateSelectionKeys();\n                this.tableService.onSelectionChange();\n            }\n            this.preventSelectionSetterPropagation = false;\n        }\n    }\n\n    @Input() get value(): any[] {\n        return this._value;\n    }\n    set value(val: any[]) {\n        this._value = val;\n    }\n\n    @Input() get columns(): any[] {\n        return this._columns;\n    }\n    set columns(cols: any[]) {\n        this._columns = cols;\n    }\n\n    @Input() get first(): number {\n        return this._first;\n    }\n    set first(val: number) {\n        this._first = val;\n    }\n\n    @Input() get rows(): number {\n        return this._rows;\n    }\n    set rows(val: number) {\n        this._rows = val;\n    }\n\n    @Input() get totalRecords(): number {\n        return this._totalRecords;\n    }\n    set totalRecords(val: number) {\n        this._totalRecords = val;\n        this.tableService.onTotalRecordsChange(this._totalRecords);\n    }\n\n    @Input() get sortField(): string {\n        return this._sortField;\n    }\n\n    set sortField(val: string) {\n        this._sortField = val;\n    }\n\n    @Input() get sortOrder(): number {\n        return this._sortOrder;\n    }\n    set sortOrder(val: number) {\n        this._sortOrder = val;\n    }\n\n    @Input() get multiSortMeta(): SortMeta[] {\n        return this._multiSortMeta;\n    }\n\n    set multiSortMeta(val: SortMeta[]) {\n        this._multiSortMeta = val;\n    }\n\n    @Input() get selection(): any {\n        return this._selection;\n    }\n\n    set selection(val: any) {\n        this._selection = val;\n    }\n\n    get dataToRender() {\n        let data = this.filteredValue||this.value;\n        return data ? ((this.paginator && !this.lazy) ? (data.slice(this.first, this.first + this.rows)) : data) : [];\n    }\n\n    updateSelectionKeys() {\n        if (this.dataKey && this._selection) {\n            this.selectionKeys = {};\n            if (Array.isArray(this._selection)) {\n                for(let data of this._selection) {\n                    this.selectionKeys[String(ObjectUtils.resolveFieldData(data, this.dataKey))] = 1;\n                }\n            }\n            else {\n                this.selectionKeys[String(ObjectUtils.resolveFieldData(this._selection, this.dataKey))] = 1;\n            }\n        }\n    }\n\n    onPageChange(event) {\n        this.first = event.first;\n        this.rows = event.rows;\n\n        if (this.lazy) {\n            this.onLazyLoad.emit(this.createLazyLoadMetadata());\n        }\n\n        this.onPage.emit({\n            first: this.first,\n            rows: this.rows\n        });\n\n        this.firstChange.emit(this.first);\n        this.rowsChange.emit(this.rows);\n        this.tableService.onValueChange(this.value);\n\n        if (this.isStateful()) {\n            this.saveState();\n        }\n\n        this.anchorRowIndex = null;\n\n        if (this.scrollable) {\n            this.resetScrollTop();\n        }\n    }\n\n    sort(event) {\n        let originalEvent = event.originalEvent;\n\n        if (this.sortMode === 'single') {\n            this._sortOrder = (this.sortField === event.field) ? this.sortOrder * -1 : this.defaultSortOrder;\n            this._sortField = event.field;\n\n            if (this.resetPageOnSort) {\n                this._first = 0;\n                this.firstChange.emit(this._first);\n\n                if (this.scrollable) {\n                    this.resetScrollTop();\n                }\n            }\n\n            this.sortSingle();\n        }\n        if (this.sortMode === 'multiple') {\n            let metaKey = originalEvent.metaKey || originalEvent.ctrlKey;\n            let sortMeta = this.getSortMeta(event.field);\n\n            if (sortMeta) {\n                if (!metaKey) {\n                    this._multiSortMeta = [{ field: event.field, order: sortMeta.order * -1 }];\n\n                    if (this.resetPageOnSort) {\n                        this._first = 0;\n                        this.firstChange.emit(this._first);\n\n                        if (this.scrollable) {\n                            this.resetScrollTop();\n                        }\n                    }\n                }\n                else {\n                    sortMeta.order = sortMeta.order * -1;\n                }\n            }\n            else {\n                if (!metaKey || !this.multiSortMeta) {\n                    this._multiSortMeta = [];\n\n                    if (this.resetPageOnSort) {\n                        this._first = 0;\n                        this.firstChange.emit(this._first);\n                    }\n                }\n                this._multiSortMeta.push({ field: event.field, order: this.defaultSortOrder });\n            }\n\n            this.sortMultiple();\n        }\n\n        if (this.isStateful()) {\n            this.saveState();\n        }\n\n        this.anchorRowIndex = null;\n    }\n\n    sortSingle() {\n        let field = this.sortField || this.groupRowsBy;\n        let order = this.sortField ? this.sortOrder : this.groupRowsByOrder;\n        if (this.groupRowsBy && this.sortField && this.groupRowsBy !== this.sortField) {\n            this._multiSortMeta = [this.getGroupRowsMeta(), {field: this.sortField, order: this.sortOrder}];\n            this.sortMultiple();\n            return;\n        }\n\n        if (field && order) {\n            if (this.restoringSort) {\n                this.restoringSort = false;\n            }\n\n            if (this.lazy) {\n                this.onLazyLoad.emit(this.createLazyLoadMetadata());\n            }\n            else if (this.value) {\n                if (this.customSort) {\n                    this.sortFunction.emit({\n                        data: this.value,\n                        mode: this.sortMode,\n                        field: field,\n                        order: order\n                    });\n                }\n                else {\n                    this.value.sort((data1, data2) => {\n                        let value1 = ObjectUtils.resolveFieldData(data1, field);\n                        let value2 = ObjectUtils.resolveFieldData(data2, field);\n                        let result = null;\n\n                        if (value1 == null && value2 != null)\n                            result = -1;\n                        else if (value1 != null && value2 == null)\n                            result = 1;\n                        else if (value1 == null && value2 == null)\n                            result = 0;\n                        else if (typeof value1 === 'string' && typeof value2 === 'string')\n                            result = value1.localeCompare(value2);\n                        else\n                            result = (value1 < value2) ? -1 : (value1 > value2) ? 1 : 0;\n\n                        return (order * result);\n                    });\n\n                    this._value = [...this.value];\n                }\n\n                if (this.hasFilter()) {\n                    this._filter();\n                }\n            }\n\n            let sortMeta: SortMeta = {\n                field: field,\n                order: order\n            };\n\n            this.onSort.emit(sortMeta);\n            this.tableService.onSort(sortMeta);\n        }\n    }\n\n    sortMultiple() {\n        if (this.groupRowsBy) {\n            if (!this._multiSortMeta)\n                this._multiSortMeta = [this.getGroupRowsMeta()]\n            else if (this.multiSortMeta[0].field !== this.groupRowsBy)\n                this._multiSortMeta = [this.getGroupRowsMeta(), ...this._multiSortMeta]\n        }\n\n        if (this.multiSortMeta) {\n            if (this.lazy) {\n                this.onLazyLoad.emit(this.createLazyLoadMetadata());\n            }\n            else if (this.value) {\n                if (this.customSort) {\n                    this.sortFunction.emit({\n                        data: this.value,\n                        mode: this.sortMode,\n                        multiSortMeta: this.multiSortMeta\n                    });\n                }\n                else {\n                    this.value.sort((data1, data2) => {\n                        return this.multisortField(data1, data2, this.multiSortMeta, 0);\n                    });\n\n                    this._value = [...this.value];\n                }\n\n                if (this.hasFilter()) {\n                    this._filter();\n                }\n            }\n\n            this.onSort.emit({\n                multisortmeta: this.multiSortMeta\n            });\n            this.tableService.onSort(this.multiSortMeta);\n        }\n    }\n\n    multisortField(data1, data2, multiSortMeta, index) {\n        let value1 = ObjectUtils.resolveFieldData(data1, multiSortMeta[index].field);\n        let value2 = ObjectUtils.resolveFieldData(data2, multiSortMeta[index].field);\n        let result = null;\n\n        if (value1 == null && value2 != null)\n            result = -1;\n        else if (value1 != null && value2 == null)\n            result = 1;\n        else if (value1 == null && value2 == null)\n            result = 0;\n        else if (typeof value1 == 'string' || value1 instanceof String) {\n            if (value1.localeCompare && (value1 != value2)) {\n                return (multiSortMeta[index].order * value1.localeCompare(value2));\n            }\n        }\n        else {\n            result = (value1 < value2) ? -1 : 1;\n        }\n\n        if (value1 == value2) {\n            return (multiSortMeta.length - 1) > (index) ? (this.multisortField(data1, data2, multiSortMeta, index + 1)) : 0;\n        }\n\n        return (multiSortMeta[index].order * result);\n    }\n\n    getSortMeta(field: string) {\n        if (this.multiSortMeta && this.multiSortMeta.length) {\n            for (let i = 0; i < this.multiSortMeta.length; i++) {\n                if (this.multiSortMeta[i].field === field) {\n                    return this.multiSortMeta[i];\n                }\n            }\n        }\n\n        return null;\n    }\n\n    isSorted(field: string) {\n        if (this.sortMode === 'single') {\n            return (this.sortField && this.sortField === field);\n        }\n        else if (this.sortMode === 'multiple') {\n            let sorted = false;\n            if (this.multiSortMeta) {\n                for(let i = 0; i < this.multiSortMeta.length; i++) {\n                    if (this.multiSortMeta[i].field == field) {\n                        sorted = true;\n                        break;\n                    }\n                }\n            }\n            return sorted;\n        }\n    }\n\n    handleRowClick(event) {\n        let target = (<HTMLElement> event.originalEvent.target);\n        let targetNode = target.nodeName;\n        let parentNode = target.parentElement && target.parentElement.nodeName;\n        if (targetNode == 'INPUT' || targetNode == 'BUTTON' || targetNode == 'A' ||\n            parentNode == 'INPUT' || parentNode == 'BUTTON' || parentNode == 'A' ||\n            (DomHandler.hasClass(event.originalEvent.target, 'p-clickable'))) {\n            return;\n        }\n\n        if (this.selectionMode) {\n            this.preventSelectionSetterPropagation = true;\n            if (this.isMultipleSelectionMode() && event.originalEvent.shiftKey && this.anchorRowIndex != null) {\n                DomHandler.clearSelection();\n                if (this.rangeRowIndex != null) {\n                    this.clearSelectionRange(event.originalEvent);\n                }\n\n                this.rangeRowIndex = event.rowIndex;\n                this.selectRange(event.originalEvent, event.rowIndex);\n            }\n            else {\n                let rowData = event.rowData;\n                let selected = this.isSelected(rowData);\n                let metaSelection = this.rowTouched ? false : this.metaKeySelection;\n                let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null;\n                this.anchorRowIndex = event.rowIndex;\n                this.rangeRowIndex = event.rowIndex;\n\n                if (metaSelection) {\n                    let metaKey = event.originalEvent.metaKey||event.originalEvent.ctrlKey;\n\n                    if (selected && metaKey) {\n                        if (this.isSingleSelectionMode()) {\n                            this._selection = null;\n                            this.selectionKeys = {};\n                            this.selectionChange.emit(null);\n                        }\n                        else {\n                            let selectionIndex = this.findIndexInSelection(rowData);\n                            this._selection = this.selection.filter((val,i) => i!=selectionIndex);\n                            this.selectionChange.emit(this.selection);\n                            if (dataKeyValue) {\n                                delete this.selectionKeys[dataKeyValue];\n                            }\n                        }\n\n                        this.onRowUnselect.emit({originalEvent: event.originalEvent, data: rowData, type: 'row'});\n                    }\n                    else {\n                        if (this.isSingleSelectionMode()) {\n                            this._selection = rowData;\n                            this.selectionChange.emit(rowData);\n                            if (dataKeyValue) {\n                                this.selectionKeys = {};\n                                this.selectionKeys[dataKeyValue] = 1;\n                            }\n                        }\n                        else if (this.isMultipleSelectionMode()) {\n                            if (metaKey) {\n                                this._selection = this.selection||[];\n                            }\n                            else {\n                                this._selection = [];\n                                this.selectionKeys = {};\n                            }\n\n                            this._selection = [...this.selection,rowData];\n                            this.selectionChange.emit(this.selection);\n                            if (dataKeyValue) {\n                                this.selectionKeys[dataKeyValue] = 1;\n                            }\n                        }\n\n                        this.onRowSelect.emit({originalEvent: event.originalEvent, data: rowData, type: 'row', index: event.rowIndex});\n                    }\n                }\n                else {\n                    if (this.selectionMode === 'single') {\n                        if (selected) {\n                            this._selection = null;\n                            this.selectionKeys = {};\n                            this.selectionChange.emit(this.selection);\n                            this.onRowUnselect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: event.rowIndex });\n                        }\n                        else {\n                            this._selection = rowData;\n                            this.selectionChange.emit(this.selection);\n                            this.onRowSelect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: event.rowIndex });\n                            if (dataKeyValue) {\n                                this.selectionKeys = {};\n                                this.selectionKeys[dataKeyValue] = 1;\n                            }\n                        }\n                    }\n                    else if (this.selectionMode === 'multiple') {\n                        if (selected) {\n                            let selectionIndex = this.findIndexInSelection(rowData);\n                            this._selection = this.selection.filter((val, i) => i != selectionIndex);\n                            this.selectionChange.emit(this.selection);\n                            this.onRowUnselect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: event.rowIndex });\n                            if (dataKeyValue) {\n                                delete this.selectionKeys[dataKeyValue];\n                            }\n                        }\n                        else {\n                            this._selection = this.selection ? [...this.selection, rowData] : [rowData];\n                            this.selectionChange.emit(this.selection);\n                            this.onRowSelect.emit({ originalEvent: event.originalEvent, data: rowData, type: 'row', index: event.rowIndex });\n                            if (dataKeyValue) {\n                                this.selectionKeys[dataKeyValue] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n\n            this.tableService.onSelectionChange();\n\n            if (this.isStateful()) {\n                this.saveState();\n            }\n        }\n\n        this.rowTouched = false;\n    }\n\n    handleRowTouchEnd(event) {\n        this.rowTouched = true;\n    }\n\n    handleRowRightClick(event) {\n        if (this.contextMenu) {\n            const rowData = event.rowData;\n\n            if (this.contextMenuSelectionMode === 'separate') {\n                this.contextMenuSelection = rowData;\n                this.contextMenuSelectionChange.emit(rowData);\n                this.onContextMenuSelect.emit({originalEvent: event.originalEvent, data: rowData, index: event.rowIndex});\n                this.contextMenu.show(event.originalEvent);\n                this.tableService.onContextMenu(rowData);\n            }\n            else if (this.contextMenuSelectionMode === 'joint') {\n                this.preventSelectionSetterPropagation = true;\n                let selected = this.isSelected(rowData);\n                let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null;\n\n                if (!selected) {\n                    if (this.isSingleSelectionMode()) {\n                        this.selection = rowData;\n                        this.selectionChange.emit(rowData);\n\n                        if (dataKeyValue) {\n                            this.selectionKeys = {};\n                            this.selectionKeys[dataKeyValue] = 1;\n                        }\n                    }\n                    else if (this.isMultipleSelectionMode()) {\n                        this._selection = this.selection ? [...this.selection, rowData] : [rowData];\n                        this.selectionChange.emit(this.selection);\n\n                        if (dataKeyValue) {\n                            this.selectionKeys[dataKeyValue] = 1;\n                        }\n                    }\n                }\n\n                this.tableService.onSelectionChange();\n                this.contextMenu.show(event.originalEvent);\n                this.onContextMenuSelect.emit({originalEvent: event, data: rowData, index: event.rowIndex});\n            }\n        }\n    }\n\n    selectRange(event: MouseEvent, rowIndex: number) {\n        let rangeStart, rangeEnd;\n\n        if (this.anchorRowIndex > rowIndex) {\n            rangeStart = rowIndex;\n            rangeEnd = this.anchorRowIndex;\n        }\n        else if (this.anchorRowIndex < rowIndex) {\n            rangeStart = this.anchorRowIndex;\n            rangeEnd = rowIndex;\n        }\n        else {\n            rangeStart = rowIndex;\n            rangeEnd = rowIndex;\n        }\n\n        if (this.lazy && this.paginator) {\n            rangeStart -= this.first;\n            rangeEnd -= this.first;\n        }\n\n        let rangeRowsData = [];\n        for(let i = rangeStart; i <= rangeEnd; i++) {\n            let rangeRowData = this.filteredValue ? this.filteredValue[i] : this.value[i];\n            if (!this.isSelected(rangeRowData)) {\n                rangeRowsData.push(rangeRowData);\n                this._selection = [...this.selection, rangeRowData];\n                let dataKeyValue: string = this.dataKey ? String(ObjectUtils.resolveFieldData(rangeRowData, this.dataKey)) : null;\n                if (dataKeyValue) {\n                    this.selectionKeys[dataKeyValue] = 1;\n                }\n            }\n        }\n        this.selectionChange.emit(this.selection);\n        this.onRowSelect.emit({originalEvent: event, data: rangeRowsData, type: 'row'});\n    }\n\n    clearSelectionRange(event: MouseEvent) {\n        let rangeStart, rangeEnd;\n\n        if (this.rangeRowIndex > this.anchorRowIndex) {\n            rangeStart = this.anchorRowIndex;\n            rangeEnd = this.rangeRowIndex;\n        }\n        else if (this.rangeRowIndex < this.anchorRowIndex) {\n            rangeStart = this.rangeRowIndex;\n            rangeEnd = this.anchorRowIndex;\n        }\n        else {\n            rangeStart = this.rangeRowIndex;\n            rangeEnd = this.rangeRowIndex;\n        }\n\n        for(let i = rangeStart; i <= rangeEnd; i++) {\n            let rangeRowData = this.value[i];\n            let selectionIndex = this.findIndexInSelection(rangeRowData);\n            this._selection = this.selection.filter((val,i) => i!=selectionIndex);\n            let dataKeyValue: string = this.dataKey ? String(ObjectUtils.resolveFieldData(rangeRowData, this.dataKey)) : null;\n            if (dataKeyValue) {\n                delete this.selectionKeys[dataKeyValue];\n            }\n            this.onRowUnselect.emit({originalEvent: event, data: rangeRowData, type: 'row'});\n        }\n    }\n\n    isSelected(rowData) {\n        if (rowData && this.selection) {\n            if (this.dataKey) {\n                return this.selectionKeys[ObjectUtils.resolveFieldData(rowData, this.dataKey)] !== undefined;\n            }\n            else {\n                if (this.selection instanceof Array)\n                    return this.findIndexInSelection(rowData) > -1;\n                else\n                    return this.equals(rowData, this.selection);\n            }\n        }\n\n        return false;\n    }\n\n    findIndexInSelection(rowData: any) {\n        let index: number = -1;\n        if (this.selection && this.selection.length) {\n            for (let i = 0; i < this.selection.length; i++) {\n                if (this.equals(rowData, this.selection[i])) {\n                    index = i;\n                    break;\n                }\n            }\n        }\n\n        return index;\n    }\n\n    toggleRowWithRadio(event: any, rowData:any) {\n        this.preventSelectionSetterPropagation = true;\n\n        if (this.selection != rowData) {\n            this._selection = rowData;\n            this.selectionChange.emit(this.selection);\n            this.onRowSelect.emit({originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'radiobutton'});\n\n            if (this.dataKey) {\n                this.selectionKeys = {};\n                this.selectionKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] = 1;\n            }\n        }\n        else {\n            this._selection = null;\n            this.selectionChange.emit(this.selection);\n            this.onRowUnselect.emit({originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'radiobutton'});\n        }\n\n        this.tableService.onSelectionChange();\n\n        if (this.isStateful()) {\n            this.saveState();\n        }\n    }\n\n    toggleRowWithCheckbox(event, rowData: any) {\n        this.selection = this.selection||[];\n        let selected = this.isSelected(rowData);\n        let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null;\n        this.preventSelectionSetterPropagation = true;\n\n        if (selected) {\n            let selectionIndex = this.findIndexInSelection(rowData);\n            this._selection = this.selection.filter((val, i) => i != selectionIndex);\n            this.selectionChange.emit(this.selection);\n            this.onRowUnselect.emit({ originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'checkbox' });\n            if (dataKeyValue) {\n                delete this.selectionKeys[dataKeyValue];\n            }\n        }\n        else {\n            this._selection = this.selection ? [...this.selection, rowData] : [rowData];\n            this.selectionChange.emit(this.selection);\n            this.onRowSelect.emit({ originalEvent: event.originalEvent, index: event.rowIndex, data: rowData, type: 'checkbox' });\n            if (dataKeyValue) {\n                this.selectionKeys[dataKeyValue] = 1;\n            }\n        }\n\n        this.tableService.onSelectionChange();\n\n        if (this.isStateful()) {\n            this.saveState();\n        }\n    }\n\n    toggleRowsWithCheckbox(event: Event, check: boolean) {\n        this._selection = check ? this.filteredValue ? this.filteredValue.slice(): this.value.slice() : [];\n        this.preventSelectionSetterPropagation = true;\n        this.updateSelectionKeys();\n        this.selectionChange.emit(this._selection);\n        this.tableService.onSelectionChange();\n        this.onHeaderCheckboxToggle.emit({originalEvent: event, checked: check});\n\n        if (this.isStateful()) {\n            this.saveState();\n        }\n    }\n\n    equals(data1, data2) {\n        return this.compareSelectionBy === 'equals' ? (data1 === data2) : ObjectUtils.equals(data1, data2, this.dataKey);\n    }\n\n    /* Legacy Filtering for custom elements */\n    filter(value: any, field: string, matchMode: string) {\n        if (this.filterTimeout) {\n            clearTimeout(this.filterTimeout);\n        }\n        if (!this.isFilterBlank(value)) {\n            this.filters[field] = { value: value, matchMode: matchMode };\n        } else if (this.filters[field]) {\n            delete this.filters[field];\n        }\n\n        this.filterTimeout = setTimeout(() => {\n            this._filter();\n            this.filterTimeout = null;\n        }, this.filterDelay);\n\n        this.anchorRowIndex = null;\n    }\n\n    filterGlobal(value, matchMode) {\n        this.filter(value, 'global', matchMode);\n    }\n\n    isFilterBlank(filter: any): boolean {\n        if (filter !== null && filter !== undefined) {\n            if ((typeof filter === 'string' && filter.trim().length == 0) || (filter instanceof Array && filter.length == 0))\n                return true;\n            else\n                return false;\n        }\n        return true;\n    }\n\n    _filter() {\n        if (!this.restoringFilter) {\n            this.first = 0;\n            this.firstChange.emit(this.first);\n        }\n\n        if (this.lazy) {\n            this.onLazyLoad.emit(this.createLazyLoadMetadata());\n        }\n        else {\n            if (!this.value) {\n                return;\n            }\n\n            if (!this.hasFilter()) {\n                this.filteredValue = null;\n                if (this.paginator) {\n                    this.totalRecords = this.value ? this.value.length : 0;\n                }\n            }\n            else {\n                let globalFilterFieldsArray;\n                if (this.filters['global']) {\n                    if (!this.columns && !this.globalFilterFields)\n                        throw new Error('Global filtering requires dynamic columns or globalFilterFields to be defined.');\n                    else\n                        globalFilterFieldsArray = this.globalFilterFields||this.columns;\n                }\n\n                this.filteredValue = [];\n\n                for (let i = 0; i < this.value.length; i++) {\n                    let localMatch = true;\n                    let globalMatch = false;\n                    let localFiltered = false;\n\n                    for (let prop in this.filters) {\n                        if (this.filters.hasOwnProperty(prop) && prop !== 'global') {\n                            localFiltered = true;\n                            let filterField = prop;\n                            let filterMeta = this.filters[filterField];\n\n                            if (Array.isArray(filterMeta)) {\n                                for (let meta of filterMeta) {\n                                    localMatch = this.executeLocalFilter(filterField, this.value[i], meta);\n\n                                    if ((meta.operator === FilterOperator.OR && localMatch) || (meta.operator === FilterOperator.AND && !localMatch)) {\n                                        break;\n                                    }\n                                }\n                            }\n                            else {\n                                localMatch = this.executeLocalFilter(filterField, this.value[i], filterMeta);\n                            }\n\n                            if (!localMatch) {\n                                break;\n                            }\n                        }\n                    }\n\n                    if (this.filters['global'] && !globalMatch && globalFilterFieldsArray) {\n                        for(let j = 0; j < globalFilterFieldsArray.length; j++) {\n                            let globalFilterField = globalFilterFieldsArray[j].field||globalFilterFieldsArray[j];\n                            globalMatch = this.filterService.filters[(<FilterMetadata> this.filters['global']).matchMode](ObjectUtils.resolveFieldData(this.value[i], globalFilterField), (<FilterMetadata> this.filters['global']).value, this.filterLocale);\n\n                            if (globalMatch) {\n                                break;\n                            }\n                        }\n                    }\n\n                    let matches: boolean;\n                    if (this.filters['global']) {\n                        matches = localFiltered ? (localFiltered && localMatch && globalMatch) : globalMatch;\n                    }\n                    else {\n                        matches = localFiltered && localMatch;\n                    }\n\n                    if (matches) {\n                        this.filteredValue.push(this.value[i]);\n                    }\n                }\n\n                if (this.filteredValue.length === this.value.length) {\n                    this.filteredValue = null;\n                }\n\n                if (this.paginator) {\n                    this.totalRecords = this.filteredValue ? this.filteredValue.length : this.value ? this.value.length : 0;\n                }\n            }\n        }\n\n        this.onFilter.emit({\n            filters: this.filters,\n            filteredValue: this.filteredValue || this.value\n        });\n\n        this.tableService.onValueChange(this.value);\n\n        if (this.isStateful() && !this.restoringFilter) {\n            this.saveState();\n        }\n\n        if (this.restoringFilter) {\n            this.restoringFilter = false;\n        }\n\n        this.cd.markForCheck();\n\n        if (this.scrollable) {\n            this.resetScrollTop();\n        }\n    }\n\n    executeLocalFilter(field: string, rowData: any, filterMeta: FilterMetadata): boolean {\n        let filterValue = filterMeta.value;\n        let filterMatchMode = filterMeta.matchMode || FilterMatchMode.STARTS_WITH;\n        let dataFieldValue = ObjectUtils.resolveFieldData(rowData, field);\n        let filterConstraint = this.filterService.filters[filterMatchMode];\n\n        return filterConstraint(dataFieldValue, filterValue, this.filterLocale);\n    }\n\n    hasFilter() {\n        let empty = true;\n        for (let prop in this.filters) {\n            if (this.filters.hasOwnProperty(prop)) {\n                empty = false;\n                break;\n            }\n        }\n\n        return !empty;\n    }\n\n    createLazyLoadMetadata(): any {\n        return {\n            first: this.first,\n            rows: this.rows,\n            sortField: this.sortField,\n            sortOrder: this.sortOrder,\n            filters: this.filters,\n            globalFilter: this.filters && this.filters['global'] ? (<FilterMetadata> this.filters['global']).value : null,\n            multiSortMeta: this.multiSortMeta\n        };\n    }\n\n    public clear() {\n        this._sortField = null;\n        this._sortOrder = this.defaultSortOrder;\n        this._multiSortMeta = null;\n        this.tableService.onSort(null);\n\n        this.filteredValue = null;\n        this.tableService.onResetChange();\n\n        this.first = 0;\n        this.firstChange.emit(this.first);\n\n        if (this.lazy) {\n            this.onLazyLoad.emit(this.createLazyLoadMetadata());\n        }\n        else {\n            this.totalRecords = (this._value ? this._value.length : 0);\n        }\n    }\n\n    public reset() {\n        this.clear();\n    }\n\n    public exportCSV(options?: any) {\n        let data;\n        let csv = '';\n        let columns = this.frozenColumns ? [...this.frozenColumns, ...this.columns] : this.columns;\n\n        if (options && options.selectionOnly) {\n            data = this.selection || [];\n        }\n        else {\n            data = this.filteredValue || this.value;\n\n            if (this.frozenValue) {\n                data = data ? [...this.frozenValue, ...data] : this.frozenValue;\n            }\n        }\n\n        //headers\n        for (let i = 0; i < columns.length; i++) {\n            let column = columns[i];\n            if (column.exportable !== false && column.field) {\n                csv += '\"' + (column.header || column.field) + '\"';\n\n                if (i < (columns.length - 1)) {\n                    csv += this.csvSeparator;\n                }\n            }\n        }\n\n        //body\n        data.forEach((record, i) => {\n            csv += '\\n';\n            for (let i = 0; i < columns.length; i++) {\n                let column = columns[i];\n                if (column.exportable !== false && column.field) {\n                    let cellData = ObjectUtils.resolveFieldData(record, column.field);\n\n                    if (cellData != null) {\n                        if (this.exportFunction) {\n                            cellData = this.exportFunction({\n                                data: cellData,\n                                field: column.field\n                            });\n                        }\n                        else\n                            cellData = String(cellData).replace(/\"/g, '\"\"');\n                    }\n                    else\n                        cellData = '';\n\n                    csv += '\"' + cellData + '\"';\n\n                    if (i < (columns.length - 1)) {\n                        csv += this.csvSeparator;\n                    }\n                }\n            }\n        });\n\n        let blob = new Blob([csv], {\n            type: 'text/csv;charset=utf-8;'\n        });\n\n        let link = document.createElement(\"a\");\n        link.style.display = 'none';\n        document.body.appendChild(link);\n        if (link.download !== undefined) {\n            link.setAttribute('href', URL.createObjectURL(blob));\n            link.setAttribute('download', this.exportFilename + '.csv');\n            link.click();\n        }\n        else {\n            csv = 'data:text/csv;charset=utf-8,' + csv;\n            window.open(encodeURI(csv));\n        }\n        document.body.removeChild(link);\n    }\n\n    public resetScrollTop() {\n        if (this.virtualScroll)\n            this.scrollToVirtualIndex(0);\n        else\n            this.scrollTo({top: 0});\n    }\n\n    public scrollToVirtualIndex(index: number) {\n        if (this.virtualScrollBody) {\n            this.virtualScrollBody.scrollToIndex(index);\n        }\n    }\n\n    virtualScrollTimeout: any;\n\n    virtualPage: number;\n\n    onScrollIndexChange(index: number) {\n        if (this.lazy) {\n            if (this.virtualScrollTimeout) {\n                clearTimeout(this.virtualScrollTimeout);\n            }\n\n            this.virtualScrollTimeout = setTimeout(() => {\n                let page = Math.floor(index / this.rows);\n                let virtualScrollOffset = page === 0 ? 0 : (page - 1) * this.rows;\n                let virtualScrollChunkSize = page === 0 ? this.rows * 2 : this.rows * 3;\n\n                if (page !== this.virtualPage) {\n                    this.virtualPage = page;\n                    this.onLazyLoad.emit({\n                        first: virtualScrollOffset,\n                        rows: virtualScrollChunkSize,\n                        sortField: this.sortField,\n                        sortOrder: this.sortOrder,\n                        filters: this.filters,\n                        globalFilter: this.filters && this.filters['global'] ? (<FilterMetadata> this.filters['global']).value : null,\n                        multiSortMeta: this.multiSortMeta\n                    });\n                }\n            }, this.virtualScrollDelay);\n        }\n    }\n\n    public scrollTo(options) {\n        if (this.virtualScrollBody) {\n            this.virtualScrollBody.scrollTo(options);\n        }\n        else {\n            if (this.wrapperViewChild.nativeElement.scrollTo) {\n                this.wrapperViewChild.nativeElement.scrollTo(options);\n            }\n            else {\n                this.wrapperViewChild.nativeElement.scrollLeft = options.left;\n                this.wrapperViewChild.nativeElement.scrollTop = options.top;\n            }\n        }\n    }\n\n    updateEditingCell(cell, data, field, index) {\n        this.editingCell = cell;\n        this.editingCellData = data;\n        this.editingCellField = field;\n        this.editingCellRowIndex = index;\n        this.bindDocumentEditListener();\n    }\n\n    isEditingCellValid() {\n        return (this.editingCell && DomHandler.find(this.editingCell, '.ng-invalid.ng-dirty').length === 0);\n    }\n\n    bindDocumentEditListener() {\n        if (!this.documentEditListener) {\n            this.documentEditListener = (event) => {\n                if (this.editingCell && !this.selfClick && this.isEditingCellValid()) {\n                    DomHandler.removeClass(this.editingCell, 'p-cell-editing');\n                    this.editingCell = null;\n                    this.onEditComplete.emit({ field: this.editingCellField, data: this.editingCellData, originalEvent: event, index: this.editingCellRowIndex });\n                    this.editingCellField = null;\n                    this.editingCellData = null;\n                    this.editingCellRowIndex = null;\n                    this.unbindDocumentEditListener();\n                    this.cd.markForCheck();\n\n                    if (this.overlaySubscription) {\n                        this.overlaySubscription.unsubscribe();\n                    }\n                }\n\n                this.selfClick = false;\n            };\n\n            document.addEventListener('click', this.documentEditListener);\n        }\n    }\n\n    unbindDocumentEditListener() {\n        if (this.documentEditListener) {\n            document.removeEventListener('click', this.documentEditListener);\n            this.documentEditListener = null;\n        }\n    }\n\n    initRowEdit(rowData: any) {\n        let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey));\n        this.editingRowKeys[dataKeyValue] = true;\n    }\n\n    saveRowEdit(rowData: any, rowElement: HTMLTableRowElement) {\n        if (DomHandler.find(rowElement, '.ng-invalid.ng-dirty').length === 0) {\n            let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey));\n            delete this.editingRowKeys[dataKeyValue];\n        }\n    }\n\n    cancelRowEdit(rowData: any) {\n        let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey));\n        delete this.editingRowKeys[dataKeyValue];\n    }\n\n    toggleRow(rowData: any, event?: Event) {\n        if (!this.dataKey) {\n            throw new Error('dataKey must be defined to use row expansion');\n        }\n\n        let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey));\n\n        if (this.expandedRowKeys[dataKeyValue] != null) {\n            delete this.expandedRowKeys[dataKeyValue];\n            this.onRowCollapse.emit({\n                originalEvent: event,\n                data: rowData\n            });\n        }\n        else {\n            if (this.rowExpandMode === 'single') {\n                this.expandedRowKeys = {};\n            }\n\n            this.expandedRowKeys[dataKeyValue] = true;\n            this.onRowExpand.emit({\n                originalEvent: event,\n                data: rowData\n            });\n        }\n\n        if (event) {\n            event.preventDefault();\n        }\n\n        if (this.isStateful()) {\n            this.saveState();\n        }\n    }\n\n    isRowExpanded(rowData: any): boolean {\n        return this.expandedRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] === true;\n    }\n\n    isRowEditing(rowData: any): boolean {\n        return this.editingRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] === true;\n    }\n\n    isSingleSelectionMode() {\n        return this.selectionMode === 'single';\n    }\n\n    isMultipleSelectionMode() {\n        return this.selectionMode === 'multiple';\n    }\n\n    onColumnResizeBegin(event) {\n        let containerLeft = DomHandler.getOffset(this.containerViewChild.nativeElement).left;\n        this.resizeColumnElement = event.target.parentElement;\n        this.columnResizing = true;\n        this.lastResizerHelperX = (event.pageX - containerLeft + this.containerViewChild.nativeElement.scrollLeft);\n        this.onColumnResize(event);\n        event.preventDefault();\n    }\n\n    onColumnResize(event) {\n        let containerLeft = DomHandler.getOffset(this.containerViewChild.nativeElement).left;\n        DomHandler.addClass(this.containerViewChild.nativeElement, 'p-unselectable-text');\n        this.resizeHelperViewChild.nativeElement.style.height = this.containerViewChild.nativeElement.offsetHeight + 'px';\n        this.resizeHelperViewChild.nativeElement.style.top = 0 + 'px';\n        this.resizeHelperViewChild.nativeElement.style.left = (event.pageX - containerLeft + this.containerViewChild.nativeElement.scrollLeft) + 'px';\n\n        this.resizeHelperViewChild.nativeElement.style.display = 'block';\n    }\n\n    onColumnResizeEnd() {\n        let delta = this.resizeHelperViewChild.nativeElement.offsetLeft - this.lastResizerHelperX;\n        let columnWidth = this.resizeColumnElement.offsetWidth;\n        let newColumnWidth = columnWidth + delta;\n        let minWidth = this.resizeColumnElement.style.minWidth||15;\n\n        if (newColumnWidth >= minWidth) {\n            if (this.columnResizeMode === 'fit') {\n                let nextColumn = this.resizeColumnElement.nextElementSibling;\n                let nextColumnWidth = nextColumn.offsetWidth - delta;\n\n                if (newColumnWidth > 15 && nextColumnWidth > 15) {\n                    if (!this.scrollable) {\n                        this.resizeColumnElement.style.width = newColumnWidth + 'px';\n                        if(nextColumn) {\n                            nextColumn.style.width = nextColumnWidth + 'px';\n                        }\n                    }\n                    else {\n                        this.resizeTableCells(newColumnWidth, nextColumnWidth);\n                    }\n                }\n            }\n            else if (this.columnResizeMode === 'expand') {\n                let tableWidth = this.tableViewChild.nativeElement.offsetWidth + delta;\n                this.tableViewChild.nativeElement.style.minWidth = tableWidth + 'px';\n                this.resizeColumnElement.style.width = newColumnWidth + 'px';\n\n                if (!this.scrollable)\n                    this.tableViewChild.nativeElement.style.width = tableWidth + 'px';\n                else\n                    this.resizeTableCells(newColumnWidth, null);\n            }\n\n            this.onColResize.emit({\n                element: this.resizeColumnElement,\n                delta: delta\n            });\n\n            if (this.isStateful()) {\n                this.saveState();\n            }\n        }\n\n        this.resizeHelperViewChild.nativeElement.style.display = 'none';\n        DomHandler.removeClass(this.containerViewChild.nativeElement, 'p-unselectable-text');\n    }\n\n    resizeTableCells(newColumnWidth, nextColumnWidth) {\n        let colIndex = DomHandler.index(this.resizeColumnElement);\n        let widths = [];\n        const tableHead = DomHandler.findSingle(this.containerViewChild.nativeElement, '.p-datatable-thead');\n        let headers = DomHandler.find(tableHead, 'tr > th');\n        headers.forEach(header => widths.push(DomHandler.getOuterWidth(header)));\n\n        this.destroyStyleElement();\n        this.createStyleElement();\n\n        let innerHTML = '';\n        widths.forEach((width,index) => {\n            let colWidth = index === colIndex ? newColumnWidth : (nextColumnWidth && index === colIndex + 1) ? nextColumnWidth : width;\n            innerHTML += `\n                #${this.id}-table > .p-datatable-thead > tr > th:nth-child(${index+1}) {\n                    flex: 0 0 ${colWidth}px !important;\n                }\n\n                #${this.id}-table > .p-datatable-tbody > tr > td:nth-child(${index+1}) {\n                    flex: 0 0 ${colWidth}px !important;\n                }\n            `\n        });\n        this.styleElement.innerHTML = innerHTML;\n    }\n\n    onColumnDragStart(event, columnElement) {\n        this.reorderIconWidth = DomHandler.getHiddenElementOuterWidth(this.reorderIndicatorUpViewChild.nativeElement);\n        this.reorderIconHeight = DomHandler.getHiddenElementOuterHeight(this.reorderIndicatorDownViewChild.nativeElement);\n        this.draggedColumn = columnElement;\n        event.dataTransfer.setData('text', 'b');    // For firefox\n    }\n\n    onColumnDragEnter(event, dropHeader) {\n        if (this.reorderableColumns && this.draggedColumn && dropHeader) {\n            event.preventDefault();\n            let containerOffset = DomHandler.getOffset(this.containerViewChild.nativeElement);\n            let dropHeaderOffset = DomHandler.getOffset(dropHeader);\n\n            if (this.draggedColumn != dropHeader) {\n                let dragIndex = DomHandler.indexWithinGroup(this.draggedColumn, 'preorderablecolumn');\n                let dropIndex = DomHandler.indexWithinGroup(dropHeader, 'preorderablecolumn');\n                let targetLeft = dropHeaderOffset.left - containerOffset.left;\n                let targetTop = containerOffset.top - dropHeaderOffset.top;\n                let columnCenter = dropHeaderOffset.left + dropHeader.offsetWidth / 2;\n\n                this.reorderIndicatorUpViewChild.nativeElement.style.top = dropHeaderOffset.top - containerOffset.top - (this.reorderIconHeight - 1) + 'px';\n                this.reorderIndicatorDownViewChild.nativeElement.style.top = dropHeaderOffset.top - containerOffset.top + dropHeader.offsetHeight + 'px';\n\n                if (event.pageX > columnCenter) {\n                    this.reorderIndicatorUpViewChild.nativeElement.style.left = (targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2)) + 'px';\n                    this.reorderIndicatorDownViewChild.nativeElement.style.left = (targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2)) + 'px';\n                    this.dropPosition = 1;\n                }\n                else {\n                    this.reorderIndicatorUpViewChild.nativeElement.style.left = (targetLeft - Math.ceil(this.reorderIconWidth / 2)) + 'px';\n                    this.reorderIndicatorDownViewChild.nativeElement.style.left = (targetLeft - Math.ceil(this.reorderIconWidth / 2)) + 'px';\n                    this.dropPosition = -1;\n                }\n\n                if ((dropIndex - dragIndex === 1 && this.dropPosition === -1) || (dropIndex - dragIndex === -1 && this.dropPosition === 1)) {\n                    this.reorderIndicatorUpViewChild.nativeElement.style.display = 'none';\n                    this.reorderIndicatorDownViewChild.nativeElement.style.display = 'none';\n                }\n                else {\n                    this.reorderIndicatorUpViewChild.nativeElement.style.display = 'block';\n                    this.reorderIndicatorDownViewChild.nativeElement.style.display = 'block';\n                }\n            }\n            else {\n                event.dataTransfer.dropEffect = 'none';\n            }\n        }\n    }\n\n    onColumnDragLeave(event) {\n        if (this.reorderableColumns && this.draggedColumn) {\n            event.preventDefault();\n            this.reorderIndicatorUpViewChild.nativeElement.style.display = 'none';\n            this.reorderIndicatorDownViewChild.nativeElement.style.display = 'none';\n        }\n    }\n\n    onColumnDrop(event, dropColumn) {\n        event.preventDefault();\n        if (this.draggedColumn) {\n            let dragIndex = DomHandler.indexWithinGroup(this.draggedColumn, 'preorderablecolumn');\n            let dropIndex = DomHandler.indexWithinGroup(dropColumn, 'preorderablecolumn');\n            let allowDrop = (dragIndex != dropIndex);\n            if (allowDrop && ((dropIndex - dragIndex == 1 && this.dropPosition === -1) || (dragIndex - dropIndex == 1 && this.dropPosition === 1))) {\n                allowDrop = false;\n            }\n\n            if (allowDrop && ((dropIndex < dragIndex && this.dropPosition === 1))) {\n                dropIndex = dropIndex + 1;\n            }\n\n            if (allowDrop && ((dropIndex > dragIndex && this.dropPosition === -1))) {\n                dropIndex = dropIndex - 1;\n            }\n\n            if (allowDrop) {\n                ObjectUtils.reorderArray(this.columns, dragIndex, dropIndex);\n\n                this.onColReorder.emit({\n                    dragIndex: dragIndex,\n                    dropIndex: dropIndex,\n                    columns: this.columns\n                });\n\n                if (this.isStateful()) {\n                    this.zone.runOutsideAngular(() => {\n                        setTimeout(() => {\n                            this.saveState();\n                        });\n                    });\n                }\n            }\n\n            this.reorderIndicatorUpViewChild.nativeElement.style.display = 'none';\n            this.reorderIndicatorDownViewChild.nativeElement.style.display = 'none';\n            this.draggedColumn.draggable = false;\n            this.draggedColumn = null;\n            this.dropPosition = null;\n        }\n    }\n\n    onRowDragStart(event, index) {\n        this.rowDragging = true;\n        this.draggedRowIndex = index;\n        event.dataTransfer.setData('text', 'b');    // For firefox\n    }\n\n    onRowDragOver(event, index, rowElement) {\n        if (this.rowDragging && this.draggedRowIndex !== index) {\n            let rowY = DomHandler.getOffset(rowElement).top + DomHandler.getWindowScrollTop();\n            let pageY = event.pageY;\n            let rowMidY = rowY + DomHandler.getOuterHeight(rowElement) / 2;\n            let prevRowElement = rowElement.previousElementSibling;\n\n            if (pageY < rowMidY) {\n                DomHandler.removeClass(rowElement, 'p-datatable-dragpoint-bottom');\n\n                this.droppedRowIndex = index;\n                if (prevRowElement)\n                    DomHandler.addClass(prevRowElement, 'p-datatable-dragpoint-bottom');\n                else\n                    DomHandler.addClass(rowElement, 'p-datatable-dragpoint-top');\n            }\n            else {\n                if (prevRowElement)\n                    DomHandler.removeClass(prevRowElement, 'p-datatable-dragpoint-bottom');\n                else\n                    DomHandler.addClass(rowElement, 'p-datatable-dragpoint-top');\n\n                this.droppedRowIndex = index + 1;\n                DomHandler.addClass(rowElement, 'p-datatable-dragpoint-bottom');\n            }\n        }\n    }\n\n    onRowDragLeave(event, rowElement) {\n        let prevRowElement = rowElement.previousElementSibling;\n        if (prevRowElement) {\n            DomHandler.removeClass(prevRowElement, 'p-datatable-dragpoint-bottom');\n        }\n\n        DomHandler.removeClass(rowElement, 'p-datatable-dragpoint-bottom');\n        DomHandler.removeClass(rowElement, 'p-datatable-dragpoint-top');\n    }\n\n    onRowDragEnd(event) {\n        this.rowDragging = false;\n        this.draggedRowIndex = null;\n        this.droppedRowIndex = null;\n    }\n\n    onRowDrop(event, rowElement) {\n        if (this.droppedRowIndex != null) {\n            let dropIndex = (this.draggedRowIndex > this.droppedRowIndex) ? this.droppedRowIndex : (this.droppedRowIndex === 0) ? 0 : this.droppedRowIndex - 1;\n            ObjectUtils.reorderArray(this.value, this.draggedRowIndex, dropIndex);\n\n            this.onRowReorder.emit({\n                dragIndex: this.draggedRowIndex,\n                dropIndex: dropIndex\n            });\n        }\n        //cleanup\n        this.onRowDragLeave(event, rowElement);\n        this.onRowDragEnd(event);\n    }\n\n    isEmpty() {\n        let data = this.filteredValue||this.value;\n        return data == null || data.length == 0;\n    }\n\n    getBlockableElement(): HTMLElement {\n        return this.el.nativeElement.children[0];\n    }\n\n    getStorage() {\n        switch(this.stateStorage) {\n            case 'local':\n                return window.localStorage;\n\n            case 'session':\n                return window.sessionStorage;\n\n            default:\n                throw new Error(this.stateStorage + ' is not a valid value for the state storage, supported values are \"local\" and \"session\".');\n        }\n    }\n\n    isStateful() {\n        return this.stateKey != null;\n    }\n\n    saveState() {\n        const storage = this.getStorage();\n        let state: TableState = {};\n\n        if (this.paginator) {\n            state.first = this.first;\n            state.rows = this.rows;\n        }\n\n        if (this.sortField) {\n            state.sortField = this.sortField;\n            state.sortOrder = this.sortOrder;\n        }\n\n        if (this.multiSortMeta) {\n            state.multiSortMeta = this.multiSortMeta;\n        }\n\n        if (this.hasFilter()) {\n            state.filters = this.filters;\n        }\n\n        if (this.resizableColumns) {\n            this.saveColumnWidths(state);\n        }\n\n        if (this.reorderableColumns) {\n            this.saveColumnOrder(state);\n        }\n\n        if (this.selection) {\n            state.selection = this.selection;\n        }\n\n        if (Object.keys(this.expandedRowKeys).length) {\n            state.expandedRowKeys = this.expandedRowKeys;\n        }\n\n        storage.setItem(this.stateKey, JSON.stringify(state));\n        this.onStateSave.emit(state);\n    }\n\n    clearState() {\n        const storage = this.getStorage();\n\n        if (this.stateKey) {\n            storage.removeItem(this.stateKey);\n        }\n    }\n\n    restoreState() {\n        const storage = this.getStorage();\n        const stateString = storage.getItem(this.stateKey);\n        const dateFormat = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/;\n        const reviver = function(key, value) {\n            if (typeof value === \"string\" && dateFormat.test(value)) {\n                return new Date(value);\n            }\n\n            return value;\n        }\n\n        if (stateString) {\n            let state: TableState = JSON.parse(stateString, reviver);\n\n            if (this.paginator) {\n                if (this.first !== undefined) {\n                    this.first = state.first;\n                    this.firstChange.emit(this.first);\n                }\n\n                if (this.rows !== undefined) {\n                    this.rows = state.rows;\n                    this.rowsChange.emit(this.rows);\n                }\n            }\n\n            if (state.sortField) {\n                this.restoringSort = true;\n                this._sortField = state.sortField;\n                this._sortOrder = state.sortOrder;\n            }\n\n            if (state.multiSortMeta) {\n                this.restoringSort = true;\n                this._multiSortMeta = state.multiSortMeta;\n            }\n\n            if (state.filters) {\n                this.restoringFilter = true;\n                this.filters = state.filters;\n            }\n\n            if (this.resizableColumns) {\n                this.columnWidthsState = state.columnWidths;\n                this.tableWidthState = state.tableWidth;\n            }\n\n            if (state.expandedRowKeys) {\n                this.expandedRowKeys = state.expandedRowKeys;\n            }\n\n            if (state.selection) {\n                Promise.resolve(null).then(() => this.selectionChange.emit(state.selection));\n            }\n\n            this.stateRestored = true;\n\n            this.onStateRestore.emit(state);\n        }\n    }\n\n    saveColumnWidths(state) {\n        let widths = [];\n        let headers = DomHandler.find(this.containerViewChild.nativeElement, '.p-datatable-thead > tr > th');\n        headers.forEach(header => widths.push(DomHandler.getOuterWidth(header)));\n        state.columnWidths = widths.join(',');\n\n        if (this.columnResizeMode === 'expand') {\n            state.tableWidth =  DomHandler.getOuterWidth(this.tableViewChild.nativeElement) + 'px';\n        }\n    }\n\n    restoreColumnWidths() {\n        if (this.columnWidthsState) {\n            let widths = this.columnWidthsState.split(',');\n\n            if (this.columnResizeMode === 'expand' && this.tableWidthState) {\n                this.tableViewChild.nativeElement.style.width = this.tableWidthState;\n                this.tableViewChild.nativeElement.style.minWidth = this.tableWidthState;\n                this.containerViewChild.nativeElement.style.width = this.tableWidthState;\n            }\n\n            this.createStyleElement();\n\n            if (this.scrollable && widths && widths.length > 0) {\n                    let innerHTML = '';\n                    widths.forEach((width,index) => {\n                        innerHTML += `\n                            #${this.id}-table > .p-datatable-thead > tr > th:nth-child(${index+1}) {\n                                flex: 0 0 ${width}px;\n                            }\n\n                            #${this.id}-table > .p-datatable-tbody > tr > td:nth-child(${index+1}) {\n                                flex: 0 0 ${width}px;\n                            }\n                        `\n                    });\n                this.styleElement.innerHTML = innerHTML;\n            }\n            else {\n                DomHandler.find(this.tableViewChild.nativeElement, '.p-datatable-thead > tr > th').forEach((header, index) => {\n                    header.style.width = widths[index] + 'px';\n                });\n            }\n\n        }\n    }\n\n    saveColumnOrder(state) {\n        if (this.columns) {\n            let columnOrder: string[] = [];\n            this.columns.map(column => {\n                columnOrder.push(column.field||column.key)\n            });\n\n            state.columnOrder = columnOrder;\n        }\n    }\n\n    restoreColumnOrder() {\n        const storage = this.getStorage();\n        const stateString = storage.getItem(this.stateKey);\n        if (stateString) {\n            let state: TableState = JSON.parse(stateString);\n            let columnOrder = state.columnOrder;\n            if (columnOrder) {\n                let reorderedColumns = [];\n\n                columnOrder.map(key =>  {\n                    let col = this.findColumnByKey(key);\n                    if (col) {\n                        reorderedColumns.push(col)\n                    }\n                });\n                this.columnOrderStateRestored = true;\n                this.columns = reorderedColumns;\n            }\n        }\n    }\n\n    findColumnByKey(key) {\n        if (this.columns) {\n            for (let col of this.columns) {\n                if (col.key === key || col.field === key)\n                    return col;\n                else\n                    continue;\n            }\n        }\n        else {\n            return null;\n        }\n    }\n\n    createStyleElement() {\n        this.styleElement = document.createElement('style');\n        this.styleElement.type = 'text/css';\n        document.head.appendChild(this.styleElement);\n    }\n\n    getGroupRowsMeta() {\n        return {field: this.groupRowsBy, order: this.groupRowsByOrder};\n    }\n\n    createResponsiveStyle() {\n        if (!this.responsiveStyleElement) {\n            this.responsiveStyleElement = document.createElement('style');\n            this.responsiveStyleElement.type = 'text/css';\n            document.head.appendChild(this.responsiveStyleElement);\n\n            let innerHTML = `\n@media screen and (max-width: ${this.breakpoint}) {\n    #${this.id} .p-datatable-thead > tr > th,\n    #${this.id} .p-datatable-tfoot > tr > td {\n        display: none !important;\n    }\n\n    #${this.id} .p-datatable-tbody > tr > td {\n        display: flex;\n        width: 100% !important;\n        align-items: center;\n        justify-content: space-between;\n    }\n\n    #${this.id} .p-datatable-tbody > tr > td:not(:last-child) {\n        border: 0 none;\n    }\n\n    #${this.id}.p-datatable-gridlines .p-datatable-tbody > tr > td:last-child {\n        border-top: 0;\n        border-right: 0;\n        border-left: 0;\n    }\n\n    #${this.id} .p-datatable-tbody > tr > td > .p-column-title {\n        display: block;\n    }\n}\n`;\n\n            this.responsiveStyleElement.innerHTML = innerHTML;\n        }\n    }\n\n    destroyResponsiveStyle() {\n        if (this.responsiveStyleElement) {\n            document.head.removeChild(this.responsiveStyleElement);\n            this.responsiveStyleElement = null;\n        }\n    }\n\n    destroyStyleElement() {\n        if (this.styleElement) {\n            document.head.removeChild(this.styleElement);\n            this.styleElement = null;\n        }\n    }\n\n    ngOnDestroy() {\n        this.unbindDocumentEditListener();\n        this.editingCell = null;\n        this.initialized = null;\n\n        if (this.virtualScrollSubscription) {\n            this.virtualScrollSubscription.unsubscribe();\n        }\n\n        this.destroyStyleElement();\n        this.destroyResponsiveStyle();\n    }\n}\n\n@Component({\n    selector: '[pTableBody]',\n    template: `\n        <ng-container *ngIf=\"!dt.expandedRowTemplate && !dt.virtualScroll\">\n            <ng-template ngFor let-rowData let-rowIndex=\"index\" [ngForOf]=\"value\" [ngForTrackBy]=\"dt.rowTrackBy\">\n                <ng-container *ngIf=\"dt.groupHeaderTemplate && dt.rowGroupMode === 'subheader' && shouldRenderRowGroupHeader(value, rowData, rowIndex)\" role=\"row\">\n                    <ng-container *ngTemplateOutlet=\"dt.groupHeaderTemplate; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n                </ng-container>\n                <ng-container *ngIf=\"dt.rowGroupMode !== 'rowspan'\">\n                    <ng-container *ngTemplateOutlet=\"template; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n                </ng-container>\n                <ng-container *ngIf=\"dt.rowGroupMode === 'rowspan'\">\n                    <ng-container *ngTemplateOutlet=\"template; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen, rowgroup: shouldRenderRowspan(value, rowData, rowIndex), rowspan: calculateRowGroupSize(value, rowData, rowIndex)}\"></ng-container>\n                </ng-container>\n                <ng-container *ngIf=\"dt.groupFooterTemplate && dt.rowGroupMode === 'subheader' && shouldRenderRowGroupFooter(value, rowData, rowIndex)\" role=\"row\">\n                    <ng-container *ngTemplateOutlet=\"dt.groupFooterTemplate; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n                </ng-container>\n            </ng-template>\n        </ng-container>\n        <ng-container *ngIf=\"!dt.expandedRowTemplate && dt.virtualScroll\">\n            <ng-template cdkVirtualFor let-rowData let-rowIndex=\"index\" [cdkVirtualForOf]=\"value\" [cdkVirtualForTrackBy]=\"dt.rowTrackBy\" [cdkVirtualForTemplateCacheSize]=\"0\">\n                <ng-container *ngTemplateOutlet=\"rowData ? template: dt.loadingBodyTemplate; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n            </ng-template>\n        </ng-container>\n        <ng-container *ngIf=\"dt.expandedRowTemplate && !(frozen && dt.frozenExpandedRowTemplate)\">\n            <ng-template ngFor let-rowData let-rowIndex=\"index\" [ngForOf]=\"value\" [ngForTrackBy]=\"dt.rowTrackBy\">\n                <ng-container *ngIf=\"!dt.groupHeaderTemplate\">\n                    <ng-container *ngTemplateOutlet=\"template; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, expanded: dt.isRowExpanded(rowData), editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n                </ng-container>\n                <ng-container *ngIf=\"dt.groupHeaderTemplate && dt.rowGroupMode === 'subheader' && shouldRenderRowGroupHeader(value, rowData, rowIndex)\" role=\"row\">\n                    <ng-container *ngTemplateOutlet=\"dt.groupHeaderTemplate; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, expanded: dt.isRowExpanded(rowData), editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n                </ng-container>\n                <ng-container *ngIf=\"dt.isRowExpanded(rowData)\">\n                    <ng-container *ngTemplateOutlet=\"dt.expandedRowTemplate; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, frozen: frozen}\"></ng-container>\n                    <ng-container *ngIf=\"dt.groupFooterTemplate && dt.rowGroupMode === 'subheader' && shouldRenderRowGroupFooter(value, rowData, rowIndex)\" role=\"row\">\n                        <ng-container *ngTemplateOutlet=\"dt.groupFooterTemplate; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, expanded: dt.isRowExpanded(rowData), editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n                    </ng-container>\n                </ng-container>\n            </ng-template>\n        </ng-container>\n        <ng-container *ngIf=\"dt.frozenExpandedRowTemplate && frozen\">\n            <ng-template ngFor let-rowData let-rowIndex=\"index\" [ngForOf]=\"value\" [ngForTrackBy]=\"dt.rowTrackBy\">\n                <ng-container *ngTemplateOutlet=\"template; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, expanded: dt.isRowExpanded(rowData), editing: (dt.editMode === 'row' && dt.isRowEditing(rowData)), frozen: frozen}\"></ng-container>\n                <ng-container *ngIf=\"dt.isRowExpanded(rowData)\">\n                    <ng-container *ngTemplateOutlet=\"dt.frozenExpandedRowTemplate; context: {$implicit: rowData, rowIndex: dt.paginator ? (dt.first + rowIndex) : rowIndex, columns: columns, frozen: frozen}\"></ng-container>\n                </ng-container>\n            </ng-template>\n        </ng-container>\n        <ng-container *ngIf=\"dt.loading\">\n            <ng-container *ngTemplateOutlet=\"dt.loadingBodyTemplate; context: {$implicit: columns, frozen: frozen}\"></ng-container>\n        </ng-container>\n        <ng-container *ngIf=\"dt.isEmpty() && !dt.loading\">\n            <ng-container *ngTemplateOutlet=\"dt.emptyMessageTemplate; context: {$implicit: columns, frozen: frozen}\"></ng-container>\n        </ng-container>\n    `,\n    changeDetection: ChangeDetectionStrategy.Default,\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class TableBody implements AfterViewInit, OnDestroy {\n\n    @Input(\"pTableBody\") columns: any[];\n\n    @Input(\"pTableBodyTemplate\") template: TemplateRef<any>;\n\n    @Input() get value(): any[] {\n        return this._value;\n    }\n    set value(val: any[]) {\n        this._value = val;\n        if (this.frozenRows) {\n            this.updateFrozenRowStickyPosition();\n        }\n\n        if (this.dt.scrollable && this.dt.rowGroupMode === 'subheader') {\n            this.updateFrozenRowGroupHeaderStickyPosition();\n        }\n    }\n\n    @Input() frozen: boolean;\n\n    @Input() frozenRows: boolean;\n\n    subscription: Subscription;\n\n    _value: any[];\n\n    ngAfterViewInit() {\n        if (this.frozenRows) {\n            this.updateFrozenRowStickyPosition();\n        }\n\n        if (this.dt.scrollable && this.dt.rowGroupMode === 'subheader') {\n            this.updateFrozenRowGroupHeaderStickyPosition();\n        }\n    }\n\n    constructor(public dt: Table, public tableService: TableService, public cd: ChangeDetectorRef, public el: ElementRef) {\n        this.subscription = this.dt.tableService.valueSource$.subscribe(() => {\n            if (this.dt.virtualScroll) {\n                this.cd.detectChanges();\n            }\n        });\n    }\n\n    shouldRenderRowGroupHeader(value, rowData, i) {\n        let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dt.groupRowsBy);\n        let prevRowData = value[i - 1];\n        if (prevRowData) {\n            let previousRowFieldData = ObjectUtils.resolveFieldData(prevRowData, this.dt.groupRowsBy);\n            return currentRowFieldData !== previousRowFieldData;\n        }\n        else {\n            return true;\n        }\n    }\n\n    shouldRenderRowGroupFooter(value, rowData, i) {\n        let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dt.groupRowsBy);\n        let nextRowData = value[i + 1];\n        if (nextRowData) {\n            let nextRowFieldData = ObjectUtils.resolveFieldData(nextRowData, this.dt.groupRowsBy);\n            return currentRowFieldData !== nextRowFieldData;\n        }\n        else {\n            return true;\n        }\n    }\n\n    shouldRenderRowspan(value, rowData, i) {\n        let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dt.groupRowsBy);\n        let prevRowData = value[i - 1];\n        if (prevRowData) {\n            let previousRowFieldData = ObjectUtils.resolveFieldData(prevRowData, this.dt.groupRowsBy);\n            return currentRowFieldData !== previousRowFieldData;\n        }\n        else {\n            return true;\n        }\n    }\n\n    calculateRowGroupSize(value, rowData, index) {\n        let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dt.groupRowsBy);\n        let nextRowFieldData = currentRowFieldData;\n        let groupRowSpan = 0;\n\n        while (currentRowFieldData === nextRowFieldData) {\n            groupRowSpan++;\n            let nextRowData = value[++index];\n            if (nextRowData) {\n                nextRowFieldData = ObjectUtils.resolveFieldData(nextRowData, this.dt.groupRowsBy);\n            }\n            else {\n                break;\n            }\n        }\n\n        return groupRowSpan === 1 ? null : groupRowSpan;\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n\n    updateFrozenRowStickyPosition() {\n        this.el.nativeElement.style.top = DomHandler.getOuterHeight(this.el.nativeElement.previousElementSibling) + 'px';\n    }\n\n    updateFrozenRowGroupHeaderStickyPosition() {\n        if (this.el.nativeElement.previousElementSibling) {\n            let tableHeaderHeight = DomHandler.getOuterHeight(this.el.nativeElement.previousElementSibling);\n            this.dt.rowGroupHeaderStyleObject.top = tableHeaderHeight + 'px';\n        }\n    }\n}\n\n@Directive({\n    selector: '[pRowGroupHeader]',\n    host: {\n        'class': 'p-rowgroup-header p-element',\n        '[style.top]': \"getFrozenRowGroupHeaderStickyPosition\"\n    }\n})\nexport class RowGroupHeader {\n\n    constructor(public dt: Table) { }\n\n    get getFrozenRowGroupHeaderStickyPosition() {\n        return this.dt.rowGroupHeaderStyleObject ? this.dt.rowGroupHeaderStyleObject.top : '';\n    }\n }\n\n@Directive({\n    selector: '[pFrozenColumn]',\n    host: {\n        'class': 'p-element',\n        '[class.p-frozen-column]': 'frozen'\n    }\n})\nexport class FrozenColumn implements AfterViewInit {\n\n    @Input() get frozen(): boolean {\n        return this._frozen;\n    }\n\n    set frozen(val: boolean) {\n        this._frozen = val;\n        this.updateStickyPosition();\n    }\n\n    @Input() alignFrozen: string = \"left\";\n\n    constructor(private el: ElementRef) { }\n\n    ngAfterViewInit() {\n        this.updateStickyPosition();\n    }\n\n    _frozen: boolean = true;\n\n    updateStickyPosition() {\n        if (this._frozen) {\n            if (this.alignFrozen === 'right') {\n                let right = 0;\n                let next = this.el.nativeElement.nextElementSibling;\n                if (next) {\n                    right = DomHandler.getOuterWidth(next) + parseFloat(next.style.right);\n                }\n                this.el.nativeElement.style.right = right + 'px';\n            }\n            else {\n                let left = 0;\n                let prev = this.el.nativeElement.previousElementSibling;\n                if (prev) {\n                    left = DomHandler.getOuterWidth(prev) + parseFloat(prev.style.left);\n                }\n                this.el.nativeElement.style.left = left + 'px';\n            }\n\n            let filterRow = this.el.nativeElement.parentElement.nextElementSibling;\n\n            if (filterRow) {\n                let index = DomHandler.index(this.el.nativeElement);\n                if (filterRow.children && filterRow.children[index]) {\n                    filterRow.children[index].style.left = this.el.nativeElement.style.left;\n                    filterRow.children[index].style.right = this.el.nativeElement.style.right;\n                }\n            }\n        }\n    }\n}\n@Directive({\n    selector: '[pSortableColumn]',\n    host: {\n        'class': 'p-element',\n        '[class.p-sortable-column]': 'isEnabled()',\n        '[class.p-highlight]': 'sorted',\n        '[attr.tabindex]': 'isEnabled() ? \"0\" : null',\n        '[attr.role]': '\"columnheader\"',\n        '[attr.aria-sort]': 'sortOrder'\n    }\n})\nexport class SortableColumn implements OnInit, OnDestroy {\n\n    @Input(\"pSortableColumn\") field: string;\n\n    @Input() pSortableColumnDisabled: boolean;\n\n    sorted: boolean;\n\n    sortOrder: string;\n\n    subscription: Subscription;\n\n    constructor(public dt: Table) {\n        if (this.isEnabled()) {\n            this.subscription = this.dt.tableService.sortSource$.subscribe(sortMeta => {\n                this.updateSortState();\n            });\n        }\n    }\n\n    ngOnInit() {\n        if (this.isEnabled()) {\n            this.updateSortState();\n        }\n    }\n\n    updateSortState() {\n        this.sorted = this.dt.isSorted(this.field);\n        this.sortOrder = this.sorted ? (this.dt.sortOrder === 1 ? 'ascending' : 'descending') : 'none';\n    }\n\n    @HostListener('click', ['$event'])\n    onClick(event: MouseEvent) {\n        if (this.isEnabled() && !this.isFilterElement(<HTMLElement> event.target)) {\n            this.updateSortState();\n            this.dt.sort({\n                originalEvent: event,\n                field: this.field\n            });\n\n            DomHandler.clearSelection();\n        }\n    }\n\n    @HostListener('keydown.enter', ['$event'])\n    onEnterKey(event: MouseEvent) {\n        this.onClick(event);\n    }\n\n    isEnabled() {\n        return this.pSortableColumnDisabled !== true;\n    }\n\n    isFilterElement(element: HTMLElement) {\n        return DomHandler.hasClass(element, 'pi-filter-icon') || DomHandler.hasClass(element, 'p-column-filter-menu-button');\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n\n}\n\n\n@Component({\n    selector: 'p-sortIcon',\n    template: `\n        <i class=\"p-sortable-column-icon pi pi-fw\" [ngClass]=\"{'pi-sort-amount-up-alt': sortOrder === 1, 'pi-sort-amount-down': sortOrder === -1, 'pi-sort-alt': sortOrder === 0}\"></i>\n        <span *ngIf=\"isMultiSorted()\" class=\"p-sortable-column-badge\">{{getBadgeValue()}}</span>\n    `,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class SortIcon implements OnInit, OnDestroy {\n\n    @Input() field: string;\n\n    subscription: Subscription;\n\n    sortOrder: number;\n\n    constructor(public dt: Table, public cd: ChangeDetectorRef) {\n        this.subscription = this.dt.tableService.sortSource$.subscribe(sortMeta => {\n            this.updateSortState();\n        });\n    }\n\n    ngOnInit() {\n        this.updateSortState();\n    }\n\n    onClick(event){\n        event.preventDefault();\n    }\n\n    updateSortState() {\n        if (this.dt.sortMode === 'single') {\n            this.sortOrder = this.dt.isSorted(this.field) ? this.dt.sortOrder : 0;\n        }\n        else if (this.dt.sortMode === 'multiple') {\n            let sortMeta = this.dt.getSortMeta(this.field);\n            this.sortOrder = sortMeta ? sortMeta.order: 0;\n        }\n\n        this.cd.markForCheck();\n    }\n\n    getMultiSortMetaIndex() {\n        let multiSortMeta = this.dt._multiSortMeta;\n        let index = -1;\n\n        if (multiSortMeta && this.dt.sortMode === 'multiple' && (this.dt.showInitialSortBadge || multiSortMeta.length > 1)) {\n\n            for (let i = 0; i < multiSortMeta.length; i++) {\n                let meta = multiSortMeta[i];\n                if (meta.field === this.field || meta.field === this.field) {\n                    index = i;\n                    break;\n                }\n            }\n        }\n\n        return index;\n    }\n\n    getBadgeValue() {\n        let index = this.getMultiSortMetaIndex();\n\n        return this.dt.groupRowsBy && index > -1 ? index : index + 1;\n    }\n\n    isMultiSorted() {\n        return this.dt.sortMode === 'multiple' && this.getMultiSortMetaIndex() > -1;\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n}\n\n@Directive({\n    selector: '[pSelectableRow]',\n    host: {\n        'class': 'p-element',\n        '[class.p-selectable-row]': 'isEnabled()',\n        '[class.p-highlight]': 'selected',\n        '[attr.tabindex]': 'isEnabled() ? 0 : undefined'\n    }\n})\nexport class SelectableRow implements OnInit, OnDestroy {\n\n    @Input(\"pSelectableRow\") data: any;\n\n    @Input(\"pSelectableRowIndex\") index: number;\n\n    @Input() pSelectableRowDisabled: boolean;\n\n    selected: boolean;\n\n    subscription: Subscription;\n\n    constructor(public dt: Table, public tableService: TableService) {\n        if (this.isEnabled()) {\n            this.subscription = this.dt.tableService.selectionSource$.subscribe(() => {\n                this.selected = this.dt.isSelected(this.data);\n            });\n        }\n    }\n\n    ngOnInit() {\n        if (this.isEnabled()) {\n            this.selected = this.dt.isSelected(this.data);\n        }\n    }\n\n    @HostListener('click', ['$event'])\n    onClick(event: Event) {\n        if (this.isEnabled()) {\n            this.dt.handleRowClick({\n                originalEvent: event,\n                rowData: this.data,\n                rowIndex: this.index\n            });\n        }\n    }\n\n    @HostListener('touchend', ['$event'])\n    onTouchEnd(event: Event) {\n        if (this.isEnabled()) {\n            this.dt.handleRowTouchEnd(event);\n        }\n    }\n\n    @HostListener('keydown.arrowdown', ['$event'])\n    onArrowDownKeyDown(event: KeyboardEvent) {\n        if (!this.isEnabled()) {\n            return;\n        }\n\n        const row = <HTMLTableRowElement>event.currentTarget;\n        const nextRow = this.findNextSelectableRow(row);\n\n        if (nextRow) {\n            nextRow.focus();\n        }\n\n        event.preventDefault();\n    }\n\n    @HostListener('keydown.arrowup', ['$event'])\n    onArrowUpKeyDown(event: KeyboardEvent) {\n        if (!this.isEnabled()) {\n            return;\n        }\n\n        const row = <HTMLTableRowElement>event.currentTarget;\n        const prevRow = this.findPrevSelectableRow(row);\n\n        if (prevRow) {\n            prevRow.focus();\n        }\n\n        event.preventDefault();\n    }\n\n    @HostListener('keydown.enter', ['$event'])\n    @HostListener('keydown.shift.enter', ['$event'])\n    @HostListener('keydown.meta.enter', ['$event'])\n    onEnterKeyDown(event: KeyboardEvent) {\n        if (!this.isEnabled()) {\n            return;\n        }\n\n        this.dt.handleRowClick({\n            originalEvent: event,\n            rowData: this.data,\n            rowIndex: this.index\n        });\n    }\n\n    @HostListener('keydown.pagedown')\n    @HostListener('keydown.pageup')\n    @HostListener('keydown.home')\n    @HostListener('keydown.end')\n    onPageDownKeyDown() {\n        if (this.dt.virtualScroll) {\n            this.dt.virtualScrollBody.elementRef.nativeElement.focus();\n        }\n    }\n\n    @HostListener('keydown.space')\n    onSpaceKeydown() {\n        if (this.dt.virtualScroll && !this.dt.editingCell) {\n            this.dt.virtualScrollBody.elementRef.nativeElement.focus();\n        }\n    }\n\n    findNextSelectableRow(row: HTMLTableRowElement): HTMLTableRowElement {\n        let nextRow = <HTMLTableRowElement> row.nextElementSibling;\n        if (nextRow) {\n            if (DomHandler.hasClass(nextRow, 'p-selectable-row'))\n                return nextRow;\n            else\n                return this.findNextSelectableRow(nextRow);\n        }\n        else {\n            return null;\n        }\n    }\n\n    findPrevSelectableRow(row: HTMLTableRowElement): HTMLTableRowElement {\n        let prevRow = <HTMLTableRowElement> row.previousElementSibling;\n        if (prevRow) {\n            if (DomHandler.hasClass(prevRow, 'p-selectable-row'))\n                return prevRow;\n            else\n                return this.findPrevSelectableRow(prevRow);\n        }\n        else {\n            return null;\n        }\n    }\n\n    isEnabled() {\n        return this.pSelectableRowDisabled !== true;\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n\n}\n\n@Directive({\n    selector: '[pSelectableRowDblClick]',\n    host: {\n        'class': 'p-element',\n        '[class.p-selectable-row]': 'isEnabled()',\n        '[class.p-highlight]': 'selected'\n    }\n})\nexport class SelectableRowDblClick implements OnInit, OnDestroy {\n\n    @Input(\"pSelectableRowDblClick\") data: any;\n\n    @Input(\"pSelectableRowIndex\") index: number;\n\n    @Input() pSelectableRowDisabled: boolean;\n\n    selected: boolean;\n\n    subscription: Subscription;\n\n    constructor(public dt: Table, public tableService: TableService) {\n        if (this.isEnabled()) {\n            this.subscription = this.dt.tableService.selectionSource$.subscribe(() => {\n                this.selected = this.dt.isSelected(this.data);\n            });\n        }\n    }\n\n    ngOnInit() {\n        if (this.isEnabled()) {\n            this.selected = this.dt.isSelected(this.data);\n        }\n    }\n\n    @HostListener('dblclick', ['$event'])\n    onClick(event: Event) {\n        if (this.isEnabled()) {\n            this.dt.handleRowClick({\n                originalEvent: event,\n                rowData: this.data,\n                rowIndex: this.index\n            });\n        }\n    }\n\n    isEnabled() {\n        return this.pSelectableRowDisabled !== true;\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n\n}\n\n@Directive({\n    selector: '[pContextMenuRow]',\n    host: {\n        'class': 'p-element',\n        '[class.p-highlight-contextmenu]': 'selected',\n        '[attr.tabindex]': 'isEnabled() ? 0 : undefined'\n    }\n})\nexport class ContextMenuRow {\n\n    @Input(\"pContextMenuRow\") data: any;\n\n    @Input(\"pContextMenuRowIndex\") index: number;\n\n    @Input() pContextMenuRowDisabled: boolean;\n\n    selected: boolean;\n\n    subscription: Subscription;\n\n    constructor(public dt: Table, public tableService: TableService, private el: ElementRef) {\n        if (this.isEnabled()) {\n            this.subscription = this.dt.tableService.contextMenuSource$.subscribe((data) => {\n                this.selected = this.dt.equals(this.data, data);\n            });\n        }\n    }\n\n    @HostListener('contextmenu', ['$event'])\n    onContextMenu(event: Event) {\n        if (this.isEnabled()) {\n            this.dt.handleRowRightClick({\n                originalEvent: event,\n                rowData: this.data,\n                rowIndex: this.index\n            });\n\n            this.el.nativeElement.focus();\n            event.preventDefault();\n        }\n    }\n\n    isEnabled() {\n        return this.pContextMenuRowDisabled !== true;\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n\n}\n\n@Directive({\n    selector: '[pRowToggler]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class RowToggler {\n\n    @Input('pRowToggler') data: any;\n\n    @Input() pRowTogglerDisabled: boolean;\n\n    constructor(public dt: Table) { }\n\n    @HostListener('click', ['$event'])\n    onClick(event: Event) {\n        if (this.isEnabled()) {\n            this.dt.toggleRow(this.data, event);\n            event.preventDefault();\n        }\n    }\n\n    isEnabled() {\n        return this.pRowTogglerDisabled !== true;\n    }\n}\n\n@Directive({\n    selector: '[pResizableColumn]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class ResizableColumn implements AfterViewInit, OnDestroy {\n\n    @Input() pResizableColumnDisabled: boolean;\n\n    resizer: HTMLSpanElement;\n\n    resizerMouseDownListener: any;\n\n    documentMouseMoveListener: any;\n\n    documentMouseUpListener: any;\n\n    constructor(public dt: Table, public el: ElementRef, public zone: NgZone) { }\n\n    ngAfterViewInit() {\n        if (this.isEnabled()) {\n            DomHandler.addClass(this.el.nativeElement, 'p-resizable-column');\n            this.resizer = document.createElement('span');\n            this.resizer.className = 'p-column-resizer';\n            this.el.nativeElement.appendChild(this.resizer);\n\n            this.zone.runOutsideAngular(() => {\n                this.resizerMouseDownListener = this.onMouseDown.bind(this);\n                this.resizer.addEventListener('mousedown', this.resizerMouseDownListener);\n            });\n        }\n    }\n\n    bindDocumentEvents() {\n        this.zone.runOutsideAngular(() => {\n            this.documentMouseMoveListener = this.onDocumentMouseMove.bind(this);\n            document.addEventListener('mousemove', this.documentMouseMoveListener);\n\n            this.documentMouseUpListener = this.onDocumentMouseUp.bind(this);\n            document.addEventListener('mouseup', this.documentMouseUpListener);\n        });\n    }\n\n    unbindDocumentEvents() {\n        if (this.documentMouseMoveListener) {\n            document.removeEventListener('mousemove', this.documentMouseMoveListener);\n            this.documentMouseMoveListener = null;\n        }\n\n        if (this.documentMouseUpListener) {\n            document.removeEventListener('mouseup', this.documentMouseUpListener);\n            this.documentMouseUpListener = null;\n        }\n    }\n\n    onMouseDown(event: MouseEvent) {\n        if (event.which === 1) {\n            this.dt.onColumnResizeBegin(event);\n            this.bindDocumentEvents();\n        }\n    }\n\n    onDocumentMouseMove(event: MouseEvent) {\n        this.dt.onColumnResize(event);\n    }\n\n    onDocumentMouseUp(event: MouseEvent) {\n        this.dt.onColumnResizeEnd();\n        this.unbindDocumentEvents();\n    }\n\n    isEnabled() {\n        return this.pResizableColumnDisabled !== true;\n    }\n\n    ngOnDestroy() {\n        if (this.resizerMouseDownListener) {\n            this.resizer.removeEventListener('mousedown', this.resizerMouseDownListener);\n        }\n\n        this.unbindDocumentEvents();\n    }\n}\n\n@Directive({\n    selector: '[pReorderableColumn]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class ReorderableColumn implements AfterViewInit, OnDestroy {\n\n    @Input() pReorderableColumnDisabled: boolean;\n\n    dragStartListener: any;\n\n    dragOverListener: any;\n\n    dragEnterListener: any;\n\n    dragLeaveListener: any;\n\n    mouseDownListener: any;\n\n    constructor(public dt: Table, public el: ElementRef, public zone: NgZone) { }\n\n    ngAfterViewInit() {\n        if (this.isEnabled()) {\n            this.bindEvents();\n        }\n    }\n\n    bindEvents() {\n        this.zone.runOutsideAngular(() => {\n            this.mouseDownListener = this.onMouseDown.bind(this);\n            this.el.nativeElement.addEventListener('mousedown', this.mouseDownListener);\n\n            this.dragStartListener = this.onDragStart.bind(this);\n            this.el.nativeElement.addEventListener('dragstart', this.dragStartListener);\n\n            this.dragOverListener = this.onDragEnter.bind(this);\n            this.el.nativeElement.addEventListener('dragover', this.dragOverListener);\n\n            this.dragEnterListener = this.onDragEnter.bind(this);\n            this.el.nativeElement.addEventListener('dragenter', this.dragEnterListener);\n\n            this.dragLeaveListener = this.onDragLeave.bind(this);\n            this.el.nativeElement.addEventListener('dragleave', this.dragLeaveListener);\n        });\n    }\n\n    unbindEvents() {\n        if (this.mouseDownListener) {\n            document.removeEventListener('mousedown', this.mouseDownListener);\n            this.mouseDownListener = null;\n        }\n\n        if (this.dragOverListener) {\n            document.removeEventListener('dragover', this.dragOverListener);\n            this.dragOverListener = null;\n        }\n\n        if (this.dragEnterListener) {\n            document.removeEventListener('dragenter', this.dragEnterListener);\n            this.dragEnterListener = null;\n        }\n\n        if (this.dragEnterListener) {\n            document.removeEventListener('dragenter', this.dragEnterListener);\n            this.dragEnterListener = null;\n        }\n\n        if (this.dragLeaveListener) {\n            document.removeEventListener('dragleave', this.dragLeaveListener);\n            this.dragLeaveListener = null;\n        }\n    }\n\n    onMouseDown(event) {\n        if (event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA' || DomHandler.hasClass(event.target, 'p-column-resizer'))\n            this.el.nativeElement.draggable = false;\n        else\n            this.el.nativeElement.draggable = true;\n    }\n\n    onDragStart(event) {\n        this.dt.onColumnDragStart(event, this.el.nativeElement);\n    }\n\n    onDragOver(event) {\n        event.preventDefault();\n    }\n\n    onDragEnter(event) {\n        this.dt.onColumnDragEnter(event, this.el.nativeElement);\n    }\n\n    onDragLeave(event) {\n        this.dt.onColumnDragLeave(event);\n    }\n\n    @HostListener('drop', ['$event'])\n    onDrop(event) {\n        if (this.isEnabled()) {\n            this.dt.onColumnDrop(event, this.el.nativeElement);\n        }\n    }\n\n    isEnabled() {\n        return this.pReorderableColumnDisabled !== true;\n    }\n\n    ngOnDestroy() {\n        this.unbindEvents();\n    }\n\n}\n\n@Directive({\n    selector: '[pEditableColumn]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class EditableColumn implements AfterViewInit, OnDestroy {\n\n    @Input(\"pEditableColumn\") data: any;\n\n    @Input(\"pEditableColumnField\") field: any;\n\n    @Input(\"pEditableColumnRowIndex\") rowIndex: number;\n\n    @Input() pEditableColumnDisabled: boolean;\n\n    @Input() pFocusCellSelector: string;\n\n    overlayEventListener;\n\n    constructor(public dt: Table, public el: ElementRef, public zone: NgZone) {}\n\n    ngAfterViewInit() {\n        if (this.isEnabled()) {\n            DomHandler.addClass(this.el.nativeElement, 'p-editable-column');\n        }\n    }\n\n    @HostListener('click', ['$event'])\n    onClick(event: MouseEvent) {\n        if (this.isEnabled()) {\n            this.dt.selfClick = true;\n\n            if (this.dt.editingCell) {\n                if (this.dt.editingCell !== this.el.nativeElement) {\n                    if (!this.dt.isEditingCellValid()) {\n                        return;\n                    }\n\n                    this.closeEditingCell(true, event);\n                    this.openCell();\n                }\n            }\n            else {\n                this.openCell();\n            }\n        }\n    }\n\n    openCell() {\n        this.dt.updateEditingCell(this.el.nativeElement, this.data, this.field, this.rowIndex);\n        DomHandler.addClass(this.el.nativeElement, 'p-cell-editing');\n        this.dt.onEditInit.emit({field: this.field, data: this.data, index: this.rowIndex});\n        this.zone.runOutsideAngular(() => {\n            setTimeout(() => {\n                let focusCellSelector = this.pFocusCellSelector || 'input, textarea, select';\n                let focusableElement = DomHandler.findSingle(this.el.nativeElement, focusCellSelector);\n\n                if (focusableElement) {\n                    focusableElement.focus();\n                }\n            }, 50);\n        });\n\n        this.overlayEventListener = (e) => {\n            if (this.el && this.el.nativeElement.contains(e.target)) {\n                this.dt.selfClick = true;\n            }\n        }\n\n        this.dt.overlaySubscription = this.dt.overlayService.clickObservable.subscribe(this.overlayEventListener);\n    }\n\n    closeEditingCell(completed, event) {\n        if (completed)\n            this.dt.onEditComplete.emit({field: this.dt.editingCellField, data: this.dt.editingCellData, originalEvent: event, index: this.dt.editingCellRowIndex});\n        else\n            this.dt.onEditCancel.emit({field: this.dt.editingCellField, data: this.dt.editingCellData, originalEvent: event, index: this.dt.editingCellRowIndex});\n\n        DomHandler.removeClass(this.dt.editingCell, 'p-cell-editing');\n        this.dt.editingCell = null;\n        this.dt.editingCellData = null;\n        this.dt.editingCellField = null;\n        this.dt.unbindDocumentEditListener();\n\n        if (this.dt.overlaySubscription) {\n            this.dt.overlaySubscription.unsubscribe();\n        }\n    }\n\n    @HostListener('keydown.enter', ['$event'])\n    onEnterKeyDown(event: KeyboardEvent) {\n        if (this.isEnabled()) {\n            if (this.dt.isEditingCellValid()) {\n                this.closeEditingCell(true, event);\n            }\n\n            event.preventDefault();\n        }\n    }\n\n    @HostListener('keydown.escape', ['$event'])\n    onEscapeKeyDown(event: KeyboardEvent) {\n        if (this.isEnabled()) {\n            if (this.dt.isEditingCellValid()) {\n                this.closeEditingCell(false, event);\n            }\n\n            event.preventDefault();\n        }\n    }\n\n    @HostListener('keydown.tab', ['$event'])\n    @HostListener('keydown.shift.tab', ['$event'])\n    @HostListener('keydown.meta.tab', ['$event'])\n    onShiftKeyDown(event: KeyboardEvent) {\n        if (this.isEnabled()) {\n            if (event.shiftKey)\n                this.moveToPreviousCell(event);\n            else{\n                this.moveToNextCell(event);\n            }\n        }\n    }\n    @HostListener('keydown.arrowdown', ['$event'])\n    onArrowDown(event: KeyboardEvent) {\n        if (this.isEnabled()) {\n            let currentCell = this.findCell(event.target);\n            if (currentCell) {\n                let cellIndex = DomHandler.index(currentCell);\n                let targetCell = this.findNextEditableColumnByIndex(currentCell, cellIndex);\n\n                if (targetCell) {\n                    if (this.dt.isEditingCellValid()) {\n                        this.closeEditingCell(true, event);\n                    }\n\n                    DomHandler.invokeElementMethod(event.target, 'blur');\n                    DomHandler.invokeElementMethod(targetCell, 'click');\n                }\n\n                event.preventDefault();\n            }\n        }\n    }\n\n    @HostListener('keydown.arrowup', ['$event'])\n    onArrowUp(event: KeyboardEvent) {\n        if (this.isEnabled()) {\n            let currentCell = this.findCell(event.target);\n            if (currentCell) {\n                let cellIndex = DomHandler.index(currentCell);\n                let targetCell = this.findPrevEditableColumnByIndex(currentCell, cellIndex);\n\n                if (targetCell) {\n                    if (this.dt.isEditingCellValid()) {\n                        this.closeEditingCell(true, event);\n                    }\n\n                    DomHandler.invokeElementMethod(event.target, 'blur');\n                    DomHandler.invokeElementMethod(targetCell, 'click');\n                }\n\n                event.preventDefault();\n            }\n        }\n    }\n\n    @HostListener('keydown.arrowleft', ['$event'])\n    onArrowLeft(event: KeyboardEvent) {\n        if (this.isEnabled()) {\n            this.moveToPreviousCell(event);\n        }\n    }\n\n    @HostListener('keydown.arrowright', ['$event'])\n    onArrowRight(event: KeyboardEvent) {\n        if (this.isEnabled()) {\n            this.moveToNextCell(event);\n        }\n    }\n\n    findCell(element) {\n        if (element) {\n            let cell = element;\n            while (cell && !DomHandler.hasClass(cell, 'p-cell-editing')) {\n                cell = cell.parentElement;\n            }\n\n            return cell;\n        }\n        else {\n            return null;\n        }\n    }\n\n    moveToPreviousCell(event: KeyboardEvent) {\n        let currentCell = this.findCell(event.target);\n        if (currentCell) {\n            let targetCell = this.findPreviousEditableColumn(currentCell);\n\n            if (targetCell) {\n                if (this.dt.isEditingCellValid()) {\n                    this.closeEditingCell(true, event);\n                }\n\n                DomHandler.invokeElementMethod(event.target, 'blur');\n                DomHandler.invokeElementMethod(targetCell, 'click');\n                event.preventDefault();\n            }\n        }\n    }\n\n    moveToNextCell(event: KeyboardEvent) {\n        let currentCell = this.findCell(event.target);\n        if (currentCell) {\n            let targetCell = this.findNextEditableColumn(currentCell);\n\n            if (targetCell) {\n                if (this.dt.isEditingCellValid()) {\n                    this.closeEditingCell(true, event);\n                }\n\n                DomHandler.invokeElementMethod(event.target, 'blur');\n                DomHandler.invokeElementMethod(targetCell, 'click');\n                event.preventDefault();\n            }\n        }\n    }\n\n    findPreviousEditableColumn(cell: Element) {\n        let prevCell = cell.previousElementSibling;\n\n        if (!prevCell) {\n            let previousRow = cell.parentElement.previousElementSibling;\n            if (previousRow) {\n                prevCell = previousRow.lastElementChild;\n            }\n        }\n\n        if (prevCell) {\n            if (DomHandler.hasClass(prevCell, 'p-editable-column'))\n                return prevCell;\n            else\n                return this.findPreviousEditableColumn(prevCell);\n        }\n        else {\n            return null;\n        }\n    }\n\n    findNextEditableColumn(cell: Element) {\n        let nextCell = cell.nextElementSibling;\n\n        if (!nextCell) {\n            let nextRow = cell.parentElement.nextElementSibling;\n            if (nextRow) {\n                nextCell = nextRow.firstElementChild;\n            }\n        }\n\n        if (nextCell) {\n            if (DomHandler.hasClass(nextCell, 'p-editable-column'))\n                return nextCell;\n            else\n                return this.findNextEditableColumn(nextCell);\n        }\n        else {\n            return null;\n        }\n    }\n\n    findNextEditableColumnByIndex(cell: Element, index: number) {\n        let nextRow = cell.parentElement.nextElementSibling;\n\n        if (nextRow) {\n            let nextCell = nextRow.children[index];\n\n            if (nextCell && DomHandler.hasClass(nextCell, 'p-editable-column')) {\n                return nextCell;\n            }\n\n            return null;\n        }\n        else {\n            return null;\n        }\n    }\n\n    findPrevEditableColumnByIndex(cell: Element, index: number) {\n        let prevRow = cell.parentElement.previousElementSibling;\n\n        if (prevRow) {\n            let prevCell = prevRow.children[index];\n\n            if (prevCell && DomHandler.hasClass(prevCell, 'p-editable-column')) {\n                return prevCell;\n            }\n\n            return null;\n        }\n        else {\n            return null;\n        }\n    }\n\n    isEnabled() {\n        return this.pEditableColumnDisabled !== true;\n    }\n\n    ngOnDestroy() {\n        if (this.dt.overlaySubscription) {\n            this.dt.overlaySubscription.unsubscribe();\n        }\n    }\n\n}\n\n@Directive({\n    selector: '[pEditableRow]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class EditableRow {\n\n    @Input(\"pEditableRow\") data: any;\n\n    @Input() pEditableRowDisabled: boolean;\n\n    constructor(public el: ElementRef) {}\n\n    isEnabled() {\n        return this.pEditableRowDisabled !== true;\n    }\n\n}\n\n@Directive({\n    selector: '[pInitEditableRow]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class InitEditableRow {\n\n    constructor(public dt: Table, public editableRow: EditableRow) {}\n\n    @HostListener('click', ['$event'])\n    onClick(event: Event) {\n        this.dt.initRowEdit(this.editableRow.data);\n        event.preventDefault();\n    }\n\n}\n\n@Directive({\n    selector: '[pSaveEditableRow]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class SaveEditableRow {\n\n    constructor(public dt: Table, public editableRow: EditableRow) {}\n\n    @HostListener('click', ['$event'])\n    onClick(event: Event) {\n        this.dt.saveRowEdit(this.editableRow.data, this.editableRow.el.nativeElement);\n        event.preventDefault();\n    }\n}\n\n@Directive({\n    selector: '[pCancelEditableRow]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class CancelEditableRow {\n\n    constructor(public dt: Table, public editableRow: EditableRow) {}\n\n    @HostListener('click', ['$event'])\n    onClick(event: Event) {\n        this.dt.cancelRowEdit(this.editableRow.data);\n        event.preventDefault();\n    }\n}\n\n@Component({\n    selector: 'p-cellEditor',\n    template: `\n        <ng-container *ngIf=\"editing\">\n            <ng-container *ngTemplateOutlet=\"inputTemplate\"></ng-container>\n        </ng-container>\n        <ng-container *ngIf=\"!editing\">\n            <ng-container *ngTemplateOutlet=\"outputTemplate\"></ng-container>\n        </ng-container>\n    `,\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class CellEditor implements AfterContentInit {\n\n    @ContentChildren(PrimeTemplate) templates: QueryList<PrimeTemplate>;\n\n    inputTemplate: TemplateRef<any>;\n\n    outputTemplate: TemplateRef<any>;\n\n    constructor(public dt: Table, @Optional() public editableColumn: EditableColumn, @Optional() public editableRow: EditableRow) { }\n\n    ngAfterContentInit() {\n        this.templates.forEach((item) => {\n            switch (item.getType()) {\n                case 'input':\n                    this.inputTemplate = item.template;\n                    break;\n\n                case 'output':\n                    this.outputTemplate = item.template;\n                    break;\n            }\n        });\n    }\n\n    get editing(): boolean {\n        return (this.dt.editingCell && this.editableColumn && this.dt.editingCell === this.editableColumn.el.nativeElement) ||\n                (this.editableRow && this.dt.editMode === 'row' && this.dt.isRowEditing(this.editableRow.data));\n    }\n\n}\n\n@Component({\n    selector: 'p-tableRadioButton',\n    template: `\n        <div class=\"p-radiobutton p-component\" (click)=\"onClick($event)\">\n            <div class=\"p-hidden-accessible\">\n                <input type=\"radio\" [attr.id]=\"inputId\" [attr.name]=\"name\" [checked]=\"checked\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\n                [disabled]=\"disabled\" [attr.aria-label]=\"ariaLabel\">\n            </div>\n            <div #box [ngClass]=\"{'p-radiobutton-box p-component':true, 'p-highlight':checked, 'p-disabled':disabled}\" role=\"radio\" [attr.aria-checked]=\"checked\">\n                <div class=\"p-radiobutton-icon\"></div>\n            </div>\n        </div>\n    `,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class TableRadioButton  {\n\n    @Input() disabled: boolean;\n\n    @Input() value: any;\n\n    @Input() index: number;\n\n    @Input() inputId: string;\n\n    @Input() name: string;\n\n    @Input() ariaLabel: string;\n\n    @ViewChild('box') boxViewChild: ElementRef;\n\n    checked: boolean;\n\n    subscription: Subscription;\n\n    constructor(public dt: Table, public tableService: TableService, public cd: ChangeDetectorRef) {\n        this.subscription = this.dt.tableService.selectionSource$.subscribe(() => {\n            this.checked = this.dt.isSelected(this.value);\n            this.cd.markForCheck();\n        });\n    }\n\n    ngOnInit() {\n        this.checked = this.dt.isSelected(this.value);\n    }\n\n    onClick(event: Event) {\n        if (!this.disabled) {\n            this.dt.toggleRowWithRadio({\n                originalEvent: event,\n                rowIndex: this.index\n            }, this.value);\n        }\n        DomHandler.clearSelection();\n    }\n\n    onFocus() {\n        DomHandler.addClass(this.boxViewChild.nativeElement, 'p-focus');\n    }\n\n    onBlur() {\n        DomHandler.removeClass(this.boxViewChild.nativeElement, 'p-focus');\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n\n}\n\n@Component({\n    selector: 'p-tableCheckbox',\n    template: `\n        <div class=\"p-checkbox p-component\" (click)=\"onClick($event)\">\n            <div class=\"p-hidden-accessible\">\n                <input type=\"checkbox\" [attr.id]=\"inputId\" [attr.name]=\"name\" [checked]=\"checked\" (focus)=\"onFocus()\" (blur)=\"onBlur()\" [disabled]=\"disabled\"\n                [attr.required]=\"required\" [attr.aria-label]=\"ariaLabel\">\n            </div>\n            <div #box [ngClass]=\"{'p-checkbox-box p-component':true,\n                'p-highlight':checked, 'p-disabled':disabled}\" role=\"checkbox\" [attr.aria-checked]=\"checked\">\n                <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check':checked}\"></span>\n            </div>\n        </div>\n    `,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class TableCheckbox  {\n\n    @Input() disabled: boolean;\n\n    @Input() value: any;\n\n    @Input() index: number;\n\n    @Input() inputId: string;\n\n    @Input() name: string;\n\n    @Input() required: boolean;\n\n    @Input() ariaLabel: string;\n\n    @ViewChild('box') boxViewChild: ElementRef;\n\n    checked: boolean;\n\n    subscription: Subscription;\n\n    constructor(public dt: Table, public tableService: TableService, public cd: ChangeDetectorRef) {\n        this.subscription = this.dt.tableService.selectionSource$.subscribe(() => {\n            this.checked = this.dt.isSelected(this.value);\n            this.cd.markForCheck();\n        });\n    }\n\n    ngOnInit() {\n        this.checked = this.dt.isSelected(this.value);\n    }\n\n    onClick(event: Event) {\n        if (!this.disabled) {\n            this.dt.toggleRowWithCheckbox({\n                originalEvent: event,\n                rowIndex: this.index\n            }, this.value);\n        }\n        DomHandler.clearSelection();\n    }\n\n    onFocus() {\n        DomHandler.addClass(this.boxViewChild.nativeElement, 'p-focus');\n    }\n\n    onBlur() {\n        DomHandler.removeClass(this.boxViewChild.nativeElement, 'p-focus');\n    }\n\n    ngOnDestroy() {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    }\n\n}\n\n@Component({\n    selector: 'p-tableHeaderCheckbox',\n    template: `\n        <div class=\"p-checkbox p-component\" (click)=\"onClick($event)\">\n            <div class=\"p-hidden-accessible\">\n                <input #cb type=\"checkbox\" [attr.id]=\"inputId\" [attr.name]=\"name\" [checked]=\"checked\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\n                [disabled]=\"isDisabled()\" [attr.aria-label]=\"ariaLabel\">\n            </div>\n            <div #box [ngClass]=\"{'p-checkbox-box':true,\n                'p-highlight':checked, 'p-disabled': isDisabled()}\" role=\"checkbox\" [attr.aria-checked]=\"checked\">\n                <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check':checked}\"></span>\n            </div>\n        </div>\n    `,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class TableHeaderCheckbox  {\n\n    @ViewChild('box') boxViewChild: ElementRef;\n\n    @Input() disabled: boolean;\n\n    @Input() inputId: string;\n\n    @Input() name: string;\n\n    @Input() ariaLabel: string;\n\n    checked: boolean;\n\n    selectionChangeSubscription: Subscription;\n\n    valueChangeSubscription: Subscription;\n\n    constructor(public dt: Table, public tableService: TableService, public cd: ChangeDetectorRef) {\n        this.valueChangeSubscription = this.dt.tableService.valueSource$.subscribe(() => {\n            this.checked = this.updateCheckedState();\n        });\n\n        this.selectionChangeSubscription = this.dt.tableService.selectionSource$.subscribe(() => {\n            this.checked = this.updateCheckedState();\n        });\n    }\n\n    ngOnInit() {\n        this.checked = this.updateCheckedState();\n    }\n\n    onClick(event: Event) {\n        if (!this.disabled) {\n            if (this.dt.value && this.dt.value.length > 0) {\n                this.dt.toggleRowsWithCheckbox(event, !this.checked);\n            }\n        }\n\n        DomHandler.clearSelection();\n    }\n\n    onFocus() {\n        DomHandler.addClass(this.boxViewChild.nativeElement, 'p-focus');\n    }\n\n    onBlur() {\n        DomHandler.removeClass(this.boxViewChild.nativeElement, 'p-focus');\n    }\n\n    isDisabled() {\n        return this.disabled || !this.dt.value || !this.dt.value.length;\n    }\n\n    ngOnDestroy() {\n        if (this.selectionChangeSubscription) {\n            this.selectionChangeSubscription.unsubscribe();\n        }\n\n        if (this.valueChangeSubscription) {\n            this.valueChangeSubscription.unsubscribe();\n        }\n    }\n\n    updateCheckedState() {\n        this.cd.markForCheck();\n        if (this.dt.filteredValue && !this.dt.lazy) {\n            const val = this.dt.filteredValue;\n            return (val && val.length > 0 && this.dt.selection && this.dt.selection.length > 0 && this.isAllFilteredValuesChecked());\n        }\n        else {\n            const val = this.dt.value;\n            const length = this.dt.lazy ? this.dt._totalRecords : val ? val.length : 0;\n            return (val && length > 0 && this.dt.selection && this.dt.selection.length > 0 && this.dt.selection.length === length);\n        }\n    }\n\n    isAllFilteredValuesChecked() {\n        if (!this.dt.filteredValue) {\n            return false;\n        }\n        else {\n            for (let rowData of this.dt.filteredValue) {\n                if (!this.dt.isSelected(rowData)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n\n}\n\n@Directive({\n    selector: '[pReorderableRowHandle]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class ReorderableRowHandle implements AfterViewInit {\n\n    @Input(\"pReorderableRowHandle\") index: number;\n\n    constructor(public el: ElementRef) {}\n\n    ngAfterViewInit() {\n        DomHandler.addClass(this.el.nativeElement, 'p-datatable-reorderablerow-handle');\n    }\n}\n\n@Directive({\n    selector: '[pReorderableRow]',\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class ReorderableRow implements AfterViewInit {\n\n    @Input(\"pReorderableRow\") index: number;\n\n    @Input() pReorderableRowDisabled: boolean;\n\n    mouseDownListener: any;\n\n    dragStartListener: any;\n\n    dragEndListener: any;\n\n    dragOverListener: any;\n\n    dragLeaveListener: any;\n\n    dropListener: any;\n\n    constructor(public dt: Table, public el: ElementRef, public zone: NgZone) {}\n\n    ngAfterViewInit() {\n        if (this.isEnabled()) {\n            this.el.nativeElement.droppable = true;\n            this.bindEvents();\n        }\n    }\n\n    bindEvents() {\n        this.zone.runOutsideAngular(() => {\n            this.mouseDownListener = this.onMouseDown.bind(this);\n            this.el.nativeElement.addEventListener('mousedown', this.mouseDownListener);\n\n            this.dragStartListener = this.onDragStart.bind(this);\n            this.el.nativeElement.addEventListener('dragstart', this.dragStartListener);\n\n            this.dragEndListener = this.onDragEnd.bind(this);\n            this.el.nativeElement.addEventListener('dragend', this.dragEndListener);\n\n            this.dragOverListener = this.onDragOver.bind(this);\n            this.el.nativeElement.addEventListener('dragover', this.dragOverListener);\n\n            this.dragLeaveListener = this.onDragLeave.bind(this);\n            this.el.nativeElement.addEventListener('dragleave', this.dragLeaveListener);\n        });\n    }\n\n    unbindEvents() {\n        if (this.mouseDownListener) {\n            document.removeEventListener('mousedown', this.mouseDownListener);\n            this.mouseDownListener = null;\n        }\n\n        if (this.dragStartListener) {\n            document.removeEventListener('dragstart', this.dragStartListener);\n            this.dragStartListener = null;\n        }\n\n        if (this.dragEndListener) {\n            document.removeEventListener('dragend', this.dragEndListener);\n            this.dragEndListener = null;\n        }\n\n        if (this.dragOverListener) {\n            document.removeEventListener('dragover', this.dragOverListener);\n            this.dragOverListener = null;\n        }\n\n        if (this.dragLeaveListener) {\n            document.removeEventListener('dragleave', this.dragLeaveListener);\n            this.dragLeaveListener = null;\n        }\n    }\n\n    onMouseDown(event) {\n        if (DomHandler.hasClass(event.target, 'p-datatable-reorderablerow-handle'))\n            this.el.nativeElement.draggable = true;\n        else\n            this.el.nativeElement.draggable = false;\n    }\n\n    onDragStart(event) {\n        this.dt.onRowDragStart(event, this.index);\n    }\n\n    onDragEnd(event) {\n        this.dt.onRowDragEnd(event);\n        this.el.nativeElement.draggable = false;\n    }\n\n    onDragOver(event) {\n        this.dt.onRowDragOver(event, this.index, this.el.nativeElement);\n        event.preventDefault();\n    }\n\n    onDragLeave(event) {\n        this.dt.onRowDragLeave(event, this.el.nativeElement);\n    }\n\n    isEnabled() {\n        return this.pReorderableRowDisabled !== true;\n    }\n\n    @HostListener('drop', ['$event'])\n    onDrop(event) {\n        if (this.isEnabled() && this.dt.rowDragging) {\n            this.dt.onRowDrop(event, this.el.nativeElement);\n        }\n\n        event.preventDefault()\n    }\n}\n\n@Component({\n    selector: 'p-columnFilterFormElement',\n    template: `\n        <ng-container *ngIf=\"filterTemplate; else builtInElement\">\n            <ng-container *ngTemplateOutlet=\"filterTemplate; context: {$implicit: filterConstraint.value, filterCallback: filterCallback}\"></ng-container>\n        </ng-container>\n        <ng-template #builtInElement>\n            <ng-container [ngSwitch]=\"type\">\n                <input *ngSwitchCase=\"'text'\" type=\"text\" pInputText [value]=\"filterConstraint?.value\" (input)=\"onModelChange($event.target.value)\"\n                    (keydown.enter)=\"onTextInputEnterKeyDown($event)\" [attr.placeholder]=\"placeholder\">\n                <p-inputNumber *ngSwitchCase=\"'numeric'\" [ngModel]=\"filterConstraint?.value\" (ngModelChange)=\"onModelChange($event)\" (onKeyDown)=\"onNumericInputKeyDown($event)\" [showButtons]=\"true\" [attr.placeholder]=\"placeholder\"\n                    [minFractionDigits]=\"minFractionDigits\" [maxFractionDigits]=\"maxFractionDigits\" [prefix]=\"prefix\" [suffix]=\"suffix\" [placeholder]=\"placeholder\"\n                    [mode]=\"currency ? 'currency' : 'decimal'\" [locale]=\"locale\" [localeMatcher]=\"localeMatcher\" [currency]=\"currency\" [currencyDisplay]=\"currencyDisplay\" [useGrouping]=\"useGrouping\"></p-inputNumber>\n                <p-triStateCheckbox *ngSwitchCase=\"'boolean'\" [ngModel]=\"filterConstraint?.value\" (ngModelChange)=\"onModelChange($event)\"></p-triStateCheckbox>\n                <p-calendar *ngSwitchCase=\"'date'\" [ngModel]=\"filterConstraint?.value\" (ngModelChange)=\"onModelChange($event)\"></p-calendar>\n            </ng-container>\n        </ng-template>\n    `,\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class ColumnFilterFormElement implements OnInit {\n\n    @Input() field: string;\n\n    @Input() type: string;\n\n    @Input() filterConstraint: FilterMetadata;\n\n    @Input() filterTemplate: TemplateRef<any>;\n\n    @Input() placeholder: string;\n\n    @Input() minFractionDigits: number\n\n    @Input() maxFractionDigits: number;\n\n    @Input() prefix: string;\n\n    @Input() suffix: string;\n\n    @Input() locale: string;\n\n    @Input() localeMatcher: string;\n\n    @Input() currency: string;\n\n    @Input() currencyDisplay: string;\n\n    @Input() useGrouping: boolean = true;\n\n    filterCallback: Function;\n\n    constructor(public dt: Table) {}\n\n    ngOnInit() {\n        this.filterCallback = value => {\n            this.filterConstraint.value = value;\n            this.dt._filter();\n        };\n    }\n\n    onModelChange(value: any) {\n        this.filterConstraint.value = value;\n\n        if (this.type === 'boolean' || value === '') {\n            this.dt._filter();\n        }\n    }\n\n    onTextInputEnterKeyDown(event: KeyboardEvent) {\n        this.dt._filter();\n        event.preventDefault();\n    }\n\n    onNumericInputKeyDown(event: KeyboardEvent) {\n        if (event.key === 'Enter') {\n            this.dt._filter();\n            event.preventDefault();\n        }\n    }\n}\n\n@Component({\n    selector: 'p-columnFilter',\n    template: `\n        <div class=\"p-column-filter\" [ngClass]=\"{'p-column-filter-row': display === 'row', 'p-column-filter-menu': display === 'menu'}\">\n            <p-columnFilterFormElement *ngIf=\"display === 'row'\" class=\"p-fluid\" [type]=\"type\" [field]=\"field\" [filterConstraint]=\"dt.filters[field]\" [filterTemplate]=\"filterTemplate\" [placeholder]=\"placeholder\" [minFractionDigits]=\"minFractionDigits\" [maxFractionDigits]=\"maxFractionDigits\" [prefix]=\"prefix\" [suffix]=\"suffix\"\n                                    [locale]=\"locale\"  [localeMatcher]=\"localeMatcher\" [currency]=\"currency\" [currencyDisplay]=\"currencyDisplay\" [useGrouping]=\"useGrouping\"></p-columnFilterFormElement>\n            <button #icon *ngIf=\"showMenuButton\" type=\"button\" class=\"p-column-filter-menu-button p-link\" aria-haspopup=\"true\" [attr.aria-expanded]=\"overlayVisible\"\n                [ngClass]=\"{'p-column-filter-menu-button-open': overlayVisible, 'p-column-filter-menu-button-active': hasFilter()}\"\n                (click)=\"toggleMenu()\" (keydown)=\"onToggleButtonKeyDown($event)\"><span class=\"pi pi-filter-icon pi-filter\"></span></button>\n            <button #icon *ngIf=\"showClearButton && display === 'row'\" [ngClass]=\"{'p-hidden-space': !hasRowFilter()}\" type=\"button\" class=\"p-column-filter-clear-button p-link\" (click)=\"clearFilter()\"><span class=\"pi pi-filter-slash\"></span></button>\n            <div *ngIf=\"showMenu && overlayVisible\" [ngClass]=\"{'p-column-filter-overlay p-component p-fluid': true, 'p-column-filter-overlay-menu': display === 'menu'}\" (click)=\"onContentClick()\"\n                [@overlayAnimation]=\"'visible'\" (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\" (@overlayAnimation.done)=\"onOverlayAnimationEnd($event)\" (keydown.escape)=\"onEscape()\">\n                <ng-container *ngTemplateOutlet=\"headerTemplate; context: {$implicit: field}\"></ng-container>\n                <ul *ngIf=\"display === 'row'; else menu\" class=\"p-column-filter-row-items\">\n                    <li class=\"p-column-filter-row-item\" *ngFor=\"let matchMode of matchModes; let i = index;\" (click)=\"onRowMatchModeChange(matchMode.value)\" (keydown)=\"onRowMatchModeKeyDown($event)\" (keydown.enter)=\"this.onRowMatchModeChange(matchMode.value)\"\n                        [ngClass]=\"{'p-highlight': isRowMatchModeSelected(matchMode.value)}\" [attr.tabindex]=\"i === 0 ? '0' : null\">{{matchMode.label}}</li>\n                    <li class=\"p-column-filter-separator\"></li>\n                    <li class=\"p-column-filter-row-item\" (click)=\"onRowClearItemClick()\" (keydown)=\"onRowMatchModeKeyDown($event)\" (keydown.enter)=\"onRowClearItemClick()\">{{noFilterLabel}}</li>\n                </ul>\n                <ng-template #menu>\n                    <div class=\"p-column-filter-operator\" *ngIf=\"isShowOperator\">\n                        <p-dropdown [options]=\"operatorOptions\" [ngModel]=\"operator\" (ngModelChange)=\"onOperatorChange($event)\" styleClass=\"p-column-filter-operator-dropdown\"></p-dropdown>\n                    </div>\n                    <div class=\"p-column-filter-constraints\">\n                        <div *ngFor=\"let fieldConstraint of fieldConstraints; let i = index\" class=\"p-column-filter-constraint\">\n                            <p-dropdown  *ngIf=\"showMatchModes && matchModes\" [options]=\"matchModes\" [ngModel]=\"fieldConstraint.matchMode\" (ngModelChange)=\"onMenuMatchModeChange($event, fieldConstraint)\" styleClass=\"p-column-filter-matchmode-dropdown\"></p-dropdown>\n                            <p-columnFilterFormElement [type]=\"type\" [field]=\"field\" [filterConstraint]=\"fieldConstraint\" [filterTemplate]=\"filterTemplate\" [placeholder]=\"placeholder\"\n                            [minFractionDigits]=\"minFractionDigits\" [maxFractionDigits]=\"maxFractionDigits\" [prefix]=\"prefix\" [suffix]=\"suffix\"\n                            [locale]=\"locale\"  [localeMatcher]=\"localeMatcher\" [currency]=\"currency\" [currencyDisplay]=\"currencyDisplay\" [useGrouping]=\"useGrouping\"></p-columnFilterFormElement>\n                            <div>\n                                <button *ngIf=\"showRemoveIcon\" type=\"button\" pButton icon=\"pi pi-trash\" class=\"p-column-filter-remove-button p-button-text p-button-danger p-button-sm\" (click)=\"removeConstraint(fieldConstraint)\" pRipple [label]=\"removeRuleButtonLabel\"></button>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"p-column-filter-add-rule\" *ngIf=\"isShowAddConstraint\">\n                        <button type=\"button\" pButton [label]=\"addRuleButtonLabel\" icon=\"pi pi-plus\" class=\"p-column-filter-add-button p-button-text p-button-sm\" (click)=\"addConstraint()\" pRipple></button>\n                    </div>\n                    <div class=\"p-column-filter-buttonbar\">\n                        <button *ngIf=\"showClearButton\" type=\"button\" pButton class=\"p-button-outlined\" (click)=\"clearFilter()\" [label]=\"clearButtonLabel\" pRipple></button>\n                        <button *ngIf=\"showApplyButton\" type=\"button\" pButton (click)=\"applyFilter()\" [label]=\"applyButtonLabel\" pRipple></button>\n                    </div>\n                </ng-template>\n                <ng-container *ngTemplateOutlet=\"footerTemplate; context: {$implicit: field}\"></ng-container>\n            </div>\n        </div>\n    `,\n    animations: [\n        trigger('overlayAnimation', [\n            transition(':enter', [\n                style({opacity: 0, transform: 'scaleY(0.8)'}),\n                animate('.12s cubic-bezier(0, 0, 0.2, 1)')\n            ]),\n            transition(':leave', [\n                animate('.1s linear', style({ opacity: 0 }))\n            ])\n        ])\n    ],\n    encapsulation: ViewEncapsulation.None,\n    host: {\n        'class': 'p-element'\n    }\n})\nexport class ColumnFilter implements AfterContentInit {\n\n    @Input() field: string;\n\n    @Input() type: string = 'text';\n\n    @Input() display: string = 'row';\n\n    @Input() showMenu: boolean = true;\n\n    @Input() matchMode: string;\n\n    @Input() operator: string = FilterOperator.AND;\n\n    @Input() showOperator: boolean = true;\n\n    @Input() showClearButton: boolean = true;\n\n    @Input() showApplyButton: boolean = true;\n\n    @Input() showMatchModes: boolean = true;\n\n    @Input() showAddButton: boolean = true;\n\n    @Input() hideOnClear: boolean = false;\n\n    @Input() placeholder: string;\n\n    @Input() matchModeOptions: SelectItem[];\n\n    @Input() maxConstraints: number = 2;\n\n    @Input() minFractionDigits: number;\n\n    @Input() maxFractionDigits: number;\n\n    @Input() prefix: string;\n\n    @Input() suffix: string;\n\n    @Input() locale: string;\n\n    @Input() localeMatcher: string;\n\n    @Input() currency: string;\n\n    @Input() currencyDisplay: string;\n\n    @Input() useGrouping: boolean = true;\n\n    @ViewChild('icon') icon: ElementRef;\n\n    @ContentChildren(PrimeTemplate) templates: QueryList<any>;\n\n    constructor(public el: ElementRef, public dt: Table, public renderer: Renderer2, public config: PrimeNGConfig, public overlayService: OverlayService) {}\n\n    overlaySubscription: Subscription;\n\n    headerTemplate: TemplateRef<any>;\n\n    filterTemplate: TemplateRef<any>;\n\n    footerTemplate: TemplateRef<any>;\n\n    operatorOptions: any[];\n\n    overlayVisible: boolean;\n\n    overlay: HTMLElement;\n\n    scrollHandler: any;\n\n    documentClickListener: any;\n\n    documentResizeListener: any;\n\n    matchModes: SelectItem[];\n\n    translationSubscription: Subscription;\n\n    resetSubscription: Subscription;\n\n    selfClick: boolean;\n\n    overlayEventListener;\n\n    ngOnInit() {\n        if (!this.dt.filters[this.field]) {\n            this.initFieldFilterConstraint();\n        }\n\n        this.translationSubscription = this.config.translationObserver.subscribe(() => {\n            this.generateMatchModeOptions();\n            this.generateOperatorOptions();\n        });\n\n        this.resetSubscription = this.dt.tableService.resetSource$.subscribe(() => {\n            this.clearFilter();\n        })\n\n        this.generateMatchModeOptions();\n        this.generateOperatorOptions();\n    }\n\n    generateMatchModeOptions() {\n        this.matchModes = this.matchModeOptions ||\n        this.config.filterMatchModeOptions[this.type]?.map(key => {\n            return {label: this.config.getTranslation(key), value: key}\n        });\n    }\n\n    generateOperatorOptions() {\n        this.operatorOptions = [\n            {label: this.config.getTranslation(TranslationKeys.MATCH_ALL), value: FilterOperator.AND},\n            {label: this.config.getTranslation(TranslationKeys.MATCH_ANY), value: FilterOperator.OR}\n        ];\n    }\n\n    ngAfterContentInit() {\n        this.templates.forEach((item) => {\n            switch(item.getType()) {\n                case 'header':\n                    this.headerTemplate = item.template;\n                break;\n\n                case 'filter':\n                    this.filterTemplate = item.template;\n                break;\n\n                case 'footer':\n                    this.footerTemplate = item.template;\n                break;\n\n                default:\n                    this.filterTemplate = item.template;\n                break;\n            }\n        });\n    }\n\n    initFieldFilterConstraint() {\n        let defaultMatchMode = this.getDefaultMatchMode();\n        this.dt.filters[this.field] = this.display == 'row' ? {value: null, matchMode: defaultMatchMode} : [{value: null, matchMode: defaultMatchMode, operator: this.operator}];\n    }\n\n    onMenuMatchModeChange(value: any, filterMeta: FilterMetadata) {\n        filterMeta.matchMode = value;\n\n        if (!this.showApplyButton) {\n            this.dt._filter();\n        }\n    }\n\n    onRowMatchModeChange(matchMode: string) {\n        (<FilterMetadata> this.dt.filters[this.field]).matchMode = matchMode;\n        this.dt._filter();\n        this.hide();\n    }\n\n    onRowMatchModeKeyDown(event: KeyboardEvent) {\n        let item = <HTMLLIElement> event.target;\n\n        switch(event.key) {\n            case 'ArrowDown':\n                var nextItem = this.findNextItem(item);\n                if (nextItem) {\n                    item.removeAttribute('tabindex');\n                    nextItem.tabIndex = '0';\n                    nextItem.focus();\n                }\n\n                event.preventDefault();\n            break;\n\n            case 'ArrowUp':\n                var prevItem = this.findPrevItem(item);\n                if (prevItem) {\n                    item.removeAttribute('tabindex');\n                    prevItem.tabIndex = '0';\n                    prevItem.focus();\n                }\n\n                event.preventDefault();\n            break;\n        }\n    }\n\n    onRowClearItemClick() {\n        this.clearFilter();\n        this.hide();\n    }\n\n    isRowMatchModeSelected(matchMode: string) {\n        return (<FilterMetadata> this.dt.filters[this.field]).matchMode === matchMode;\n    }\n\n    addConstraint() {\n        (<FilterMetadata[]> this.dt.filters[this.field]).push({value: null, matchMode: this.getDefaultMatchMode(), operator: this.getDefaultOperator()});\n        this.dt._filter();\n    }\n\n    removeConstraint(filterMeta: FilterMetadata) {\n        this.dt.filters[this.field] = (<FilterMetadata[]> this.dt.filters[this.field]).filter(meta => meta !== filterMeta);\n        this.dt._filter();\n    }\n\n    onOperatorChange(value) {\n        (<FilterMetadata[]> this.dt.filters[this.field]).forEach(filterMeta => {\n            filterMeta.operator = value;\n            this.operator = value;\n        });\n\n        if (!this.showApplyButton) {\n            this.dt._filter();\n        }\n    }\n\n    toggleMenu() {\n        this.overlayVisible = !this.overlayVisible;\n    }\n\n    onToggleButtonKeyDown(event: KeyboardEvent) {\n        switch(event.key) {\n            case 'Escape':\n            case 'Tab':\n                this.overlayVisible = false;\n            break;\n\n            case 'ArrowDown':\n                if (this.overlayVisible) {\n                    let focusable = DomHandler.getFocusableElements(this.overlay);\n                    if (focusable) {\n                        focusable[0].focus();\n                    }\n                    event.preventDefault();\n                }\n                else if (event.altKey) {\n                    this.overlayVisible = true;\n                    event.preventDefault();\n                }\n            break;\n        }\n    }\n\n    onEscape() {\n        this.overlayVisible = false;\n        this.icon.nativeElement.focus();\n    }\n\n    findNextItem(item: HTMLLIElement) {\n        let nextItem = <HTMLLIElement> item.nextElementSibling;\n\n        if (nextItem)\n            return DomHandler.hasClass(nextItem, 'p-column-filter-separator')  ? this.findNextItem(nextItem) : nextItem;\n        else\n            return item.parentElement.firstElementChild;\n    }\n\n    findPrevItem(item: HTMLLIElement) {\n        let prevItem = <HTMLLIElement> item.previousElementSibling;\n\n        if (prevItem)\n            return DomHandler.hasClass(prevItem, 'p-column-filter-separator')  ? this.findPrevItem(prevItem) : prevItem;\n        else\n        return item.parentElement.lastElementChild;\n    }\n\n    onContentClick() {\n        this.selfClick = true;\n    }\n\n    onOverlayAnimationStart(event: AnimationEvent) {\n        switch (event.toState) {\n            case 'visible':\n                this.overlay = event.element;\n\n                document.body.appendChild(this.overlay);\n                ZIndexUtils.set('overlay', this.overlay, this.config.zIndex.overlay);\n                DomHandler.absolutePosition(this.overlay, this.icon.nativeElement)\n                this.bindDocumentClickListener();\n                this.bindDocumentResizeListener();\n                this.bindScrollListener();\n\n                this.overlayEventListener = (e) => {\n                    if (this.overlay && this.overlay.contains(e.target)) {\n                        this.selfClick = true;\n                    }\n                }\n\n                this.overlaySubscription = this.overlayService.clickObservable.subscribe(this.overlayEventListener);\n            break;\n\n            case 'void':\n                this.onOverlayHide();\n\n                if (this.overlaySubscription) {\n                    this.overlaySubscription.unsubscribe();\n                }\n            break;\n        }\n    }\n\n    onOverlayAnimationEnd(event: AnimationEvent) {\n        switch (event.toState) {\n            case 'void':\n                ZIndexUtils.clear(event.element);\n            break;\n        }\n    }\n\n    getDefaultMatchMode(): string {\n        if (this.matchMode) {\n            return this.matchMode;\n        }\n        else {\n            if (this.type === 'text')\n                return FilterMatchMode.STARTS_WITH;\n            else if (this.type === 'numeric')\n                return FilterMatchMode.EQUALS;\n            else if (this.type === 'date')\n                return FilterMatchMode.DATE_IS;\n            else\n                return FilterMatchMode.CONTAINS;\n        }\n    }\n\n    getDefaultOperator(): string {\n        return this.dt.filters ? (<FilterMetadata[]> this.dt.filters[this.field])[0].operator: this.operator;\n    }\n\n    hasRowFilter() {\n        return this.dt.filters[this.field] && !this.dt.isFilterBlank((<FilterMetadata>this.dt.filters[this.field]).value);\n    }\n\n    get fieldConstraints(): FilterMetadata[] {\n        return this.dt.filters ? <FilterMetadata[]> this.dt.filters[this.field] : null;\n    }\n\n    get showRemoveIcon(): boolean {\n        return this.fieldConstraints ? this.fieldConstraints.length > 1 : false;\n    }\n\n    get showMenuButton(): boolean {\n        return this.showMenu && (this.display === 'row' ? this.type !== 'boolean': true);\n    }\n\n    get isShowOperator(): boolean {\n        return this.showOperator && this.type !== 'boolean';\n    }\n\n    get isShowAddConstraint(): boolean {\n        return this.showAddButton && this.type !== 'boolean' && (this.fieldConstraints && this.fieldConstraints.length < this.maxConstraints);\n    }\n\n    get applyButtonLabel(): string {\n        return this.config.getTranslation(TranslationKeys.APPLY);\n    }\n\n    get clearButtonLabel(): string {\n        return this.config.getTranslation(TranslationKeys.CLEAR);\n    }\n\n    get addRuleButtonLabel(): string {\n        return this.config.getTranslation(TranslationKeys.ADD_RULE);\n    }\n\n    get removeRuleButtonLabel(): string {\n        return this.config.getTranslation(TranslationKeys.REMOVE_RULE);\n    }\n\n    get noFilterLabel(): string {\n        return this.config.getTranslation(TranslationKeys.NO_FILTER);\n    }\n\n    hasFilter(): boolean {\n        let fieldFilter = this.dt.filters[this.field];\n        if (fieldFilter) {\n            if (Array.isArray(fieldFilter))\n                return !this.dt.isFilterBlank((<FilterMetadata[]> fieldFilter)[0].value);\n            else\n                return !this.dt.isFilterBlank(fieldFilter.value);\n        }\n\n        return false;\n    }\n\n    isOutsideClicked(event): boolean {\n        return !(this.overlay.isSameNode(event.target) || this.overlay.contains(event.target)\n            || this.icon.nativeElement.isSameNode(event.target) || this.icon.nativeElement.contains(event.target)\n            || DomHandler.hasClass(event.target, 'p-column-filter-add-button') || DomHandler.hasClass(event.target.parentElement, 'p-column-filter-add-button')\n            || DomHandler.hasClass(event.target, 'p-column-filter-remove-button') || DomHandler.hasClass(event.target.parentElement, 'p-column-filter-remove-button'));\n    }\n\n    bindDocumentClickListener() {\n        if (!this.documentClickListener) {\n            const documentTarget: any = this.el ? this.el.nativeElement.ownerDocument : 'document';\n\n            this.documentClickListener = this.renderer.listen(documentTarget, 'mousedown', event => {\n                if (this.overlayVisible && !this.selfClick && this.isOutsideClicked(event)) {\n                    this.hide();\n                }\n\n                this.selfClick = false;\n            });\n        }\n    }\n\n    unbindDocumentClickListener() {\n        if (this.documentClickListener) {\n            this.documentClickListener();\n            this.documentClickListener = null;\n            this.selfClick = false;\n        }\n    }\n\n    bindDocumentResizeListener() {\n        this.documentResizeListener = () => this.hide();\n        window.addEventListener('resize', this.documentResizeListener);\n    }\n\n    unbindDocumentResizeListener() {\n        if (this.documentResizeListener) {\n            window.removeEventListener('resize', this.documentResizeListener);\n            this.documentResizeListener = null;\n        }\n    }\n\n    bindScrollListener() {\n        if (!this.scrollHandler) {\n            this.scrollHandler = new ConnectedOverlayScrollHandler(this.icon.nativeElement, () => {\n                if (this.overlayVisible) {\n                    this.hide();\n                }\n            });\n        }\n\n        this.scrollHandler.bindScrollListener();\n    }\n\n    unbindScrollListener() {\n        if (this.scrollHandler) {\n            this.scrollHandler.unbindScrollListener();\n        }\n    }\n\n    hide() {\n        this.overlayVisible = false;\n    }\n\n    onOverlayHide() {\n        this.unbindDocumentClickListener();\n        this.unbindDocumentResizeListener();\n        this.unbindScrollListener();\n        this.overlay = null;\n    }\n\n    clearFilter() {\n        this.initFieldFilterConstraint();\n        this.dt._filter();\n        if (this.hideOnClear)\n            this.hide();\n    }\n\n    applyFilter() {\n        this.dt._filter();\n        this.hide();\n    }\n\n    ngOnDestroy() {\n        if (this.overlay) {\n            this.el.nativeElement.appendChild(this.overlay);\n            ZIndexUtils.clear(this.overlay);\n            this.onOverlayHide();\n        }\n\n        if (this.translationSubscription) {\n            this.translationSubscription.unsubscribe();\n        }\n\n        if (this.resetSubscription) {\n            this.resetSubscription.unsubscribe();\n        }\n\n        if (this.overlaySubscription) {\n            this.overlaySubscription.unsubscribe();\n        }\n    }\n}\n\n@NgModule({\n    imports: [CommonModule,PaginatorModule,InputTextModule,DropdownModule,ScrollingModule,FormsModule,ButtonModule,SelectButtonModule,CalendarModule,InputNumberModule,TriStateCheckboxModule],\n    exports: [Table,SharedModule,SortableColumn,FrozenColumn,RowGroupHeader,SelectableRow,RowToggler,ContextMenuRow,ResizableColumn,ReorderableColumn,EditableColumn,CellEditor,SortIcon,\n            TableRadioButton,TableCheckbox,TableHeaderCheckbox,ReorderableRowHandle,ReorderableRow,SelectableRowDblClick,EditableRow,InitEditableRow,SaveEditableRow,CancelEditableRow,ScrollingModule,ColumnFilter],\n    declarations: [Table,SortableColumn,FrozenColumn,RowGroupHeader,SelectableRow,RowToggler,ContextMenuRow,ResizableColumn,ReorderableColumn,EditableColumn,CellEditor,TableBody,SortIcon,\n            TableRadioButton,TableCheckbox,TableHeaderCheckbox,ReorderableRowHandle,ReorderableRow,SelectableRowDblClick,EditableRow,InitEditableRow,SaveEditableRow,CancelEditableRow,ColumnFilter,ColumnFilterFormElement]\n})\nexport class TableModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
