blob: 716814b4b6de6004d11a4d4bb1ab15c48950706a [file] [log] [blame]
{"version":3,"sources":["node_modules/tslib/tslib.es6.js","ng://@covalent/core/data-table/data-table-row/data-table-row.component.ts","ng://@covalent/core/data-table/directives/data-table-template.directive.ts","ng://@covalent/core/data-table/data-table.component.ts","ng://@covalent/core/data-table/data-table-column/data-table-column.component.ts","ng://@covalent/core/data-table/data-table-cell/data-table-cell.component.ts","ng://@covalent/core/data-table/data-table-table/data-table-table.component.ts","ng://@covalent/core/data-table/services/data-table.service.ts","ng://@covalent/core/data-table/data-table.module.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","__","this","constructor","prototype","create","TdDataTableColumnRowComponent","Component","args","selector","template","ElementRef","Renderer2","_elementRef","_renderer","addClass","nativeElement","defineProperty","TdDataTableRowComponent","_selected","selected","removeClass","height","getBoundingClientRect","clickListener","focus","Input","HostListener","tslib_1.__extends","TemplatePortalDirective","Directive","TemplateRef","ViewContainerRef","TdDataTableTemplateDirective","templateRef","viewContainerRef","_super","call","TdDataTableBase","_changeDetectorRef","Ascending","Descending","_TdDataTableMixinBase","mixinControlValueAccessor","TdDataTableComponent","_resizingColumn","selectable","_hostWidth","_offsetTransform","_totalHeight","_fromRow","_toRow","_scrollHorizontalOffset","_allSelected","_indeterminate","_data","data","_this","_rowHeightCache","Promise","resolve","then","refresh","_scrollableDiv","scrollTop","_virtualData","_columns","hasData","row","keys","forEach","k","find","c","name","push","label","cols","_resizableColumns","resizableColumns","coerceBooleanProperty","_selectable","_clickable","clickable","_multiple","multiple","_sortable","sortable","columnName","column","columns","Error","_sortBy","order","sortOrder","toUpperCase","_sortOrder","TdDataTableSortingOrder","length","ngOnInit","_resizeSubs","_onResize","asObservable","subscribe","_rows","toArray","index","fromRow","_calculateWidths","_calculateVirtualRows","_columnResizeSubs","_onColumnResize","pipe","debounceTime","clientX","_columnClientX","markForCheck","_horizontalScrollSubs","_onHorizontalScroll","horizontalScroll","_verticalScrollSubs","_onVerticalScroll","verticalScroll","_scrollVerticalOffset","_valueChangesSubs","valueChanges","value","ngAfterContentInit","i","_templates","_templateMap","set","tdDataTableTemplate","ngAfterContentChecked","next","newHostWidth_1","width","setTimeout","newHostHeight","_hostHeight","ngAfterViewInit","_rowsChangedSubs","changes","ngOnDestroy","unsubscribe","handleScroll","event","element","scrollLeft","getColumnWidth","_widths","undefined","getCellValue","nested","_getNestedValue","getTemplateRef","get","clearModel","splice","_calculateCheckboxState","selectAll","checked","toggledRows","isRowSelected","modelRow","filter","val","compareWith","indexOf","onSelectAll","emit","rows","onChange","select","currentSelected","blockEvent","mouseEvent","shiftKey","_lastSelectedIndex","firstIndex","lastIndex","_firstSelectedIndex","_doSelection","rowSelected","_firstCheckboxValue","_shiftPreviouslyPressed","disableTextSelection","_document","onselectstart","enableTextSelection","handleRowClick","srcElement","currentTarget","getAttribute","tagName","toLowerCase","onRowClick","handleSort","onSortChange","_rowKeyup","keyCode","ENTER","SPACE","UP_ARROW","DOWN_ARROW","_handleStartColumnDrag","_handleColumnDrag","xPosition","proposedManualWidth","_colElements","projectedWidth","_handleEndColumnDrag","preventDefault","splitName","split","rowIndex","wasSelected","onRowSelect","_b","__values","o","m","Symbol","iterator","done","tslib_1.__values","_c","col","_adjustColumnWidth","_calculateWidth","_adjustColumnWidhts","fixedTotalWidth","flexibleWidths","hidden","limit","max","min","recalculateHostWidth","hostWidth","newValue_1","Math","floor","adjustedNumber_1","colWidth","newFlexibleWidths","skipMinWidthProjection","widthOpts","renderedColumns","scrolledRows","rowHeightSum_1","hostHeight","toRow","isFinite","offset","_domSanitizer","bypassSecurityTrustStyle","totalHeight","slice","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","inputs","changeDetection","ChangeDetectionStrategy","OnPush","Optional","type","Inject","DOCUMENT","DomSanitizer","ChangeDetectorRef","ContentChildren","ViewChild","ViewChildren","Output","Subject","Map","EventEmitter","model","TdDataTableColumnComponent","_columnContent","active","numeric","handleClick","isAscending","isDescending","read","HostBinding","TdDataTableCellComponent","_align","align","TdDataTableTableComponent","TdDataTableService","filterData","searchTerm","ignoreCase","excludedColumns","item","key","preItemValue","sortData","sortBy","from","sort","a","compA","compB","direction","Number","isNaN","parseFloat","pageData","Injectable","DATA_TABLE_PROVIDER_FACTORY","parent","DATA_TABLE_PROVIDER","deps","SkipSelf","useFactory","TD_DATA_TABLE","CovalentDataTableModule","NgModule","imports","CommonModule","MatCheckboxModule","MatTooltipModule","MatIconModule","MatPseudoCheckboxModule","declarations","exports"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","import { Component, Input, Output, Renderer2, ElementRef, ContentChildren, QueryList, HostListener } from '@angular/core';\n\nimport { TdDataTableCellComponent } from '../data-table-cell/data-table-cell.component';\nimport { TdDataTableColumnComponent } from '../data-table-column/data-table-column.component';\n\n@Component({\n /* tslint:disable-next-line */\n selector: 'tr[td-data-table-column-row]',\n styleUrls: ['./data-table-row.component.scss' ],\n templateUrl: './data-table-row.component.html',\n})\nexport class TdDataTableColumnRowComponent {\n\n constructor(protected _elementRef: ElementRef, protected _renderer: Renderer2) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-data-table-column-row');\n }\n\n}\n\n@Component({\n /* tslint:disable-next-line */\n selector: 'tr[td-data-table-row]',\n styleUrls: ['./data-table-row.component.scss' ],\n templateUrl: './data-table-row.component.html',\n})\nexport class TdDataTableRowComponent {\n\n private _selected: boolean = false;\n\n @Input('selected')\n set selected(selected: boolean) {\n if (selected) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-selected');\n } else {\n this._renderer.removeClass(this._elementRef.nativeElement, 'td-selected');\n }\n this._selected = selected;\n }\n get selected(): boolean {\n return this._selected;\n }\n\n get height(): number {\n let height: number = 48;\n if (this._elementRef.nativeElement) {\n height = (<HTMLElement>this._elementRef.nativeElement).getBoundingClientRect().height;\n }\n return height;\n }\n\n constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-data-table-row');\n }\n\n /**\n * Listening to click event to explicitly focus the row element.\n */\n @HostListener('click')\n clickListener(): void {\n this.focus();\n }\n\n focus(): void {\n this._elementRef.nativeElement.focus();\n }\n\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { TemplatePortalDirective } from '@angular/cdk/portal';\n\n@Directive({selector: '[tdDataTableTemplate]ng-template'})\nexport class TdDataTableTemplateDirective extends TemplatePortalDirective {\n\n @Input() tdDataTableTemplate: string;\n constructor(templateRef: TemplateRef<any>, viewContainerRef: ViewContainerRef) {\n super(templateRef, viewContainerRef);\n }\n}\n","import { Component, Input, Output, EventEmitter, forwardRef, ChangeDetectionStrategy,\n ChangeDetectorRef, ViewChild, OnDestroy, AfterViewInit,\n ContentChildren, TemplateRef, AfterContentInit, QueryList, Inject,\n Optional, ViewChildren, ElementRef, OnInit, AfterContentChecked } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ENTER, SPACE, UP_ARROW, DOWN_ARROW } from '@angular/cdk/keycodes';\n\nimport { Observable, Subscription, Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { TdDataTableRowComponent } from './data-table-row/data-table-row.component';\nimport { ITdDataTableSortChangeEvent, TdDataTableColumnComponent } from './data-table-column/data-table-column.component';\nimport { TdDataTableTemplateDirective } from './directives/data-table-template.directive';\n\nimport { IControlValueAccessor, mixinControlValueAccessor } from '@covalent/core/common';\n\nexport enum TdDataTableSortingOrder {\n Ascending = 'ASC',\n Descending = 'DESC',\n}\n\nexport interface ITdDataTableColumnWidth {\n min?: number;\n max?: number;\n}\n\nexport interface ITdDataTableColumn {\n name: string;\n label: string;\n tooltip?: string;\n numeric?: boolean;\n format?: (value: any) => any;\n nested?: boolean;\n sortable?: boolean;\n hidden?: boolean;\n filter?: boolean;\n width?: ITdDataTableColumnWidth | number;\n}\n\nexport interface ITdDataTableSelectEvent {\n row: any;\n selected: boolean;\n index: number;\n}\n\nexport interface ITdDataTableSelectAllEvent {\n rows: any[];\n selected: boolean;\n}\n\nexport interface ITdDataTableRowClickEvent {\n row: any;\n index: number;\n}\n\nexport interface IInternalColumnWidth {\n value: number;\n limit: boolean;\n index: number;\n min?: boolean;\n max?: boolean;\n}\n\n/**\n * Constant to set the rows offset before and after the viewport\n */\nconst TD_VIRTUAL_OFFSET: number = 2;\n\n/**\n * Constant to set default row height if none is provided\n */\nconst TD_VIRTUAL_DEFAULT_ROW_HEIGHT: number = 48;\n\nexport class TdDataTableBase {\n constructor(public _changeDetectorRef: ChangeDetectorRef) {}\n}\n\n/* tslint:disable-next-line */\nexport const _TdDataTableMixinBase = mixinControlValueAccessor(TdDataTableBase, []);\n\n@Component({\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdDataTableComponent),\n multi: true,\n }],\n selector: 'td-data-table',\n styleUrls: ['./data-table.component.scss' ],\n templateUrl: './data-table.component.html',\n inputs: ['value'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDataTableComponent extends _TdDataTableMixinBase implements IControlValueAccessor, OnInit,\n AfterContentInit, AfterContentChecked, AfterViewInit, OnDestroy {\n\n /** responsive width calculations */\n private _resizeSubs: Subscription;\n private _rowsChangedSubs: Subscription;\n private _hostWidth: number = 0;\n\n /** manually resizable columns */\n private _resizableColumns: boolean = false;\n private _columnClientX: number = 0;\n private _columnResizeSubs: Subscription;\n private _resizingColumn: number;\n private _onColumnResize: Subject<number> = new Subject<number>();\n\n get resizingColumn(): number {\n return this._resizingColumn;\n }\n\n get hostWidth(): number {\n // if the checkboxes are rendered, we need to remove their width\n // from the total width to calculate properly\n if (this.selectable) {\n return this._hostWidth - 42;\n }\n return this._hostWidth;\n }\n\n private _widths: IInternalColumnWidth[] = [];\n private _onResize: Subject<void> = new Subject<void>();\n\n /** column header reposition and viewpoort */\n private _verticalScrollSubs: Subscription;\n private _horizontalScrollSubs: Subscription;\n private _scrollHorizontalOffset: number = 0;\n\n private _onHorizontalScroll: Subject<number> = new Subject<number>();\n private _onVerticalScroll: Subject<number> = new Subject<number>();\n\n // Array of cached row heights to allow dynamic row heights\n private _rowHeightCache: number[] = [];\n // Total pseudo height of all the elements\n private _totalHeight: number = 0;\n // Total host height for the viewport\n private _hostHeight: number = 0;\n // Scrolled vertical pixels\n private _scrollVerticalOffset: number = 0;\n // Style to move the content a certain offset depending on scrolled offset\n private _offsetTransform: SafeStyle;\n\n // Variables that set from and to which rows will be rendered\n private _fromRow: number = 0;\n private _toRow: number = 0;\n\n /**\n * Returns the offset style with a proper calculation on how much it should move\n * over the y axis of the total height\n */\n get offsetTransform(): SafeStyle {\n return this._offsetTransform;\n }\n\n /**\n * Returns the assumed total height of the rows\n */\n get totalHeight(): number {\n return this._totalHeight;\n }\n\n /**\n * Returns the initial row to render in the viewport\n */\n get fromRow(): number {\n return this._fromRow;\n }\n\n /**\n * Returns the last row to render in the viewport\n */\n get toRow(): number {\n return this._toRow;\n }\n\n private _valueChangesSubs: Subscription;\n /** internal attributes */\n private _data: any[];\n // data virtually iterated by component\n private _virtualData: any[];\n private _columns: ITdDataTableColumn[];\n private _selectable: boolean = false;\n private _clickable: boolean = false;\n private _multiple: boolean = true;\n private _allSelected: boolean = false;\n private _indeterminate: boolean = false;\n\n /** sorting */\n private _sortable: boolean = false;\n private _sortBy: ITdDataTableColumn;\n private _sortOrder: TdDataTableSortingOrder = TdDataTableSortingOrder.Ascending;\n\n /** shift select */\n private _shiftPreviouslyPressed: boolean = false;\n private _lastSelectedIndex: number = -1;\n private _firstSelectedIndex: number = -1;\n private _firstCheckboxValue: boolean = false;\n\n /** template fetching support */\n private _templateMap: Map<string, TemplateRef<any>> = new Map<string, TemplateRef<any>>();\n @ContentChildren(TdDataTableTemplateDirective) _templates: QueryList<TdDataTableTemplateDirective>;\n\n @ViewChild('scrollableDiv') _scrollableDiv: ElementRef;\n\n @ViewChildren('columnElement') _colElements: QueryList<TdDataTableColumnComponent>;\n\n @ViewChildren(TdDataTableRowComponent) _rows: QueryList<TdDataTableRowComponent>;\n\n /**\n * Returns scroll position to reposition column headers\n */\n get columnsLeftScroll(): number {\n return this._scrollHorizontalOffset * -1;\n }\n\n /**\n * Returns true if all values are selected.\n */\n get allSelected(): boolean {\n return this._allSelected;\n }\n\n /**\n * Returns true if all values are not deselected\n * and at least one is.\n */\n get indeterminate(): boolean {\n return this._indeterminate;\n }\n\n /**\n * data?: {[key: string]: any}[]\n * Sets the data to be rendered as rows.\n */\n @Input('data')\n set data(data: any[]) {\n this._data = data;\n this._rowHeightCache = [];\n Promise.resolve().then(() => {\n this.refresh();\n // scroll back to the top if the data has changed\n this._scrollableDiv.nativeElement.scrollTop = 0;\n });\n }\n get data(): any[] {\n return this._data;\n }\n\n get virtualData(): any[] {\n return this._virtualData;\n }\n\n /**\n * columns?: ITdDataTableColumn[]\n * Sets additional column configuration. [ITdDataTableColumn.name] has to exist in [data] as key.\n * Defaults to [data] keys.\n */\n @Input('columns')\n set columns(cols: ITdDataTableColumn[]) {\n this._columns = cols;\n }\n get columns(): ITdDataTableColumn[] {\n if (this._columns) {\n return this._columns;\n }\n\n if (this.hasData) {\n this._columns = [];\n // if columns is undefined, use key in [data] rows as name and label for column headers.\n let row: any = this._data[0];\n Object.keys(row).forEach((k: string) => {\n if (!this._columns.find((c: any) => c.name === k)) {\n this._columns.push({ name: k, label: k });\n }\n });\n return this._columns;\n } else {\n return [];\n }\n }\n\n /**\n * resizableColumns?: boolean\n * Enables manual column resize.\n * Defaults to 'false'\n */\n @Input('resizableColumns')\n set resizableColumns(resizableColumns: boolean) {\n this._resizableColumns = coerceBooleanProperty(resizableColumns);\n }\n get resizableColumns(): boolean {\n return this._resizableColumns;\n }\n\n /**\n * selectable?: boolean\n * Enables row selection events, hover and selected row states.\n * Defaults to 'false'\n */\n @Input('selectable')\n set selectable(selectable: boolean) {\n this._selectable = coerceBooleanProperty(selectable);\n }\n get selectable(): boolean {\n return this._selectable;\n }\n\n /**\n * clickable?: boolean\n * Enables row click events, hover.\n * Defaults to 'false'\n */\n @Input('clickable')\n set clickable(clickable: boolean) {\n this._clickable = coerceBooleanProperty(clickable);\n }\n get clickable(): boolean {\n return this._clickable;\n }\n\n /**\n * multiple?: boolean\n * Enables multiple row selection. [selectable] needs to be enabled.\n * Defaults to 'false'\n */\n @Input('multiple')\n set multiple(multiple: boolean) {\n this._multiple = coerceBooleanProperty(multiple);\n }\n get multiple(): boolean {\n return this._multiple;\n }\n\n /**\n * sortable?: boolean\n * Enables sorting events, sort icons and active column states.\n * Defaults to 'false'\n */\n @Input('sortable')\n set sortable(sortable: boolean) {\n this._sortable = coerceBooleanProperty(sortable);\n }\n get sortable(): boolean {\n return this._sortable;\n }\n\n /**\n * sortBy?: string\n * Sets the active sort column. [sortable] needs to be enabled.\n */\n @Input('sortBy')\n set sortBy(columnName: string) {\n if (!columnName) {\n return;\n }\n const column: ITdDataTableColumn = this.columns.find((c: any) => c.name === columnName);\n if (!column) {\n throw new Error('[sortBy] must be a valid column name');\n }\n\n this._sortBy = column;\n }\n get sortByColumn(): ITdDataTableColumn {\n return this._sortBy;\n }\n\n /**\n * sortOrder?: ['ASC' | 'DESC'] or TdDataTableSortingOrder\n * Sets the sort order of the [sortBy] column. [sortable] needs to be enabled.\n * Defaults to 'ASC' or TdDataTableSortingOrder.Ascending\n */\n @Input('sortOrder')\n set sortOrder(order: 'ASC' | 'DESC') {\n let sortOrder: string = order ? order.toUpperCase() : 'ASC';\n if (sortOrder !== 'DESC' && sortOrder !== 'ASC') {\n throw new Error('[sortOrder] must be empty, ASC or DESC');\n }\n\n this._sortOrder = sortOrder === 'ASC' ?\n TdDataTableSortingOrder.Ascending : TdDataTableSortingOrder.Descending;\n }\n get sortOrderEnum(): TdDataTableSortingOrder {\n return this._sortOrder;\n }\n\n get hasData(): boolean {\n return this._data && this._data.length > 0;\n }\n\n /**\n * sortChange?: function\n * Event emitted when the column headers are clicked. [sortable] needs to be enabled.\n * Emits an [ITdDataTableSortChangeEvent] implemented object.\n */\n @Output('sortChange') onSortChange: EventEmitter<ITdDataTableSortChangeEvent> =\n new EventEmitter<ITdDataTableSortChangeEvent>();\n\n /**\n * rowSelect?: function\n * Event emitted when a row is selected/deselected. [selectable] needs to be enabled.\n * Emits an [ITdDataTableSelectEvent] implemented object.\n */\n @Output('rowSelect') onRowSelect: EventEmitter<ITdDataTableSelectEvent> = new EventEmitter<ITdDataTableSelectEvent>();\n\n /**\n * rowClick?: function\n * Event emitted when a row is clicked.\n * Emits an [ITdDataTableRowClickEvent] implemented object.\n */\n @Output('rowClick') onRowClick: EventEmitter<ITdDataTableRowClickEvent> = new EventEmitter<ITdDataTableRowClickEvent>();\n\n /**\n * selectAll?: function\n * Event emitted when all rows are selected/deselected by the all checkbox. [selectable] needs to be enabled.\n * Emits an [ITdDataTableSelectAllEvent] implemented object.\n */\n @Output('selectAll') onSelectAll: EventEmitter<ITdDataTableSelectAllEvent> =\n new EventEmitter<ITdDataTableSelectAllEvent>();\n\n constructor(@Optional() @Inject(DOCUMENT) private _document: any,\n private _elementRef: ElementRef,\n private _domSanitizer: DomSanitizer,\n _changeDetectorRef: ChangeDetectorRef) {\n super(_changeDetectorRef);\n }\n\n /**\n * compareWith?: function(row, model): boolean\n * Allows custom comparison between row and model to see if row is selected or not\n * Default comparation is by reference\n */\n @Input('compareWith') compareWith: (row: any, model: any) => boolean = (row: any, model: any) => {\n return row === model;\n }\n\n /**\n * Initialize observable for resize and scroll events\n */\n ngOnInit(): void {\n // initialize observable for resize calculations\n this._resizeSubs = this._onResize.asObservable().subscribe(() => {\n if (this._rows) {\n this._rows.toArray().forEach((row: TdDataTableRowComponent, index: number) => {\n this._rowHeightCache[this.fromRow + index] = row.height + 1;\n });\n }\n this._calculateWidths();\n this._calculateVirtualRows();\n });\n\n // initialize observable for column resize calculations\n this._columnResizeSubs = this._onColumnResize.asObservable().pipe(\n debounceTime(0),\n ).subscribe((clientX: number) => {\n this._columnClientX = clientX;\n this._calculateWidths();\n this._changeDetectorRef.markForCheck();\n });\n // initialize observable for scroll column header reposition\n this._horizontalScrollSubs = this._onHorizontalScroll.asObservable()\n .subscribe((horizontalScroll: number) => {\n this._scrollHorizontalOffset = horizontalScroll;\n this._changeDetectorRef.markForCheck();\n });\n // initialize observable for virtual scroll rendering\n this._verticalScrollSubs = this._onVerticalScroll.asObservable()\n .subscribe((verticalScroll: number) => {\n this._scrollVerticalOffset = verticalScroll;\n this._calculateVirtualRows();\n this._changeDetectorRef.markForCheck();\n });\n this._valueChangesSubs = this.valueChanges.subscribe((value: any) => {\n this.refresh();\n });\n }\n\n /**\n * Loads templates and sets them in a map for faster access.\n */\n ngAfterContentInit(): void {\n for (let i: number = 0; i < this._templates.toArray().length; i++) {\n this._templateMap.set(\n this._templates.toArray()[i].tdDataTableTemplate,\n this._templates.toArray()[i].templateRef,\n );\n }\n }\n\n /**\n * Checks hosts native elements widths to see if it has changed (resize check)\n */\n ngAfterContentChecked(): void {\n // check if the scroll has been reset when element is hidden\n if (this._scrollVerticalOffset - this._scrollableDiv.nativeElement.scrollTop > 5) {\n // scroll back to the top if element has been reset\n this._onVerticalScroll.next(0);\n }\n if (this._elementRef.nativeElement) {\n let newHostWidth: number = this._elementRef.nativeElement.getBoundingClientRect().width;\n // if the width has changed then we throw a resize event.\n if (this._hostWidth !== newHostWidth) {\n setTimeout(() => {\n this._hostWidth = newHostWidth;\n this._onResize.next();\n }, 0);\n }\n }\n if (this._scrollableDiv.nativeElement) {\n let newHostHeight: number = this._scrollableDiv.nativeElement.getBoundingClientRect().height;\n // if the height of the viewport has changed, then we mark for check\n if (this._hostHeight !== newHostHeight) {\n this._hostHeight = newHostHeight;\n this._calculateVirtualRows();\n this._changeDetectorRef.markForCheck();\n }\n }\n }\n\n /**\n * Registers to an observable that checks if all rows have been rendered\n * so we can start calculating the widths\n */\n ngAfterViewInit(): void {\n this._rowsChangedSubs = this._rows.changes.pipe(\n debounceTime(0),\n ).subscribe(() => {\n this._onResize.next();\n });\n this._calculateVirtualRows();\n }\n\n /**\n * Unsubscribes observables when data table is destroyed\n */\n ngOnDestroy(): void {\n if (this._resizeSubs) {\n this._resizeSubs.unsubscribe();\n }\n if (this._columnResizeSubs) {\n this._columnResizeSubs.unsubscribe();\n }\n if (this._horizontalScrollSubs) {\n this._horizontalScrollSubs.unsubscribe();\n }\n if (this._verticalScrollSubs) {\n this._verticalScrollSubs.unsubscribe();\n }\n if (this._rowsChangedSubs) {\n this._rowsChangedSubs.unsubscribe();\n }\n if (this._valueChangesSubs) {\n this._valueChangesSubs.unsubscribe();\n }\n }\n\n /**\n * Method that gets executed every time there is a scroll event\n * Calls the scroll observable\n */\n handleScroll(event: Event): void {\n let element: HTMLElement = (<HTMLElement>event.target);\n if (element) {\n let horizontalScroll: number = element.scrollLeft;\n if (this._scrollHorizontalOffset !== horizontalScroll) {\n this._onHorizontalScroll.next(horizontalScroll);\n }\n let verticalScroll: number = element.scrollTop;\n if (this._scrollVerticalOffset !== verticalScroll) {\n this._onVerticalScroll.next(verticalScroll);\n }\n }\n }\n\n /**\n * Returns the width needed for the columns via index\n */\n getColumnWidth(index: number): number {\n if (this._widths[index]) {\n return this._widths[index].value;\n }\n return undefined;\n }\n\n getCellValue(column: ITdDataTableColumn, value: any): string {\n if (column.nested === undefined || column.nested) {\n return this._getNestedValue(column.name, value);\n }\n return value[column.name];\n }\n\n /**\n * Getter method for template references\n */\n getTemplateRef(name: string): TemplateRef<any> {\n return this._templateMap.get(name);\n }\n\n /**\n * Clears model (ngModel) of component by removing all values in array.\n */\n clearModel(): void {\n this.value.splice(0, this.value.length);\n }\n\n /**\n * Refreshes data table and rerenders [data] and [columns]\n */\n refresh(): void {\n this._calculateVirtualRows();\n this._calculateWidths();\n this._calculateCheckboxState();\n this._changeDetectorRef.markForCheck();\n }\n\n /**\n * Selects or clears all rows depending on 'checked' value.\n */\n selectAll(checked: boolean): void {\n let toggledRows: any[] = [];\n if (checked) {\n this._data.forEach((row: any) => {\n // skiping already selected rows\n if (!this.isRowSelected(row)) {\n this.value.push(row);\n // checking which ones are being toggled\n toggledRows.push(row);\n }\n });\n this._allSelected = true;\n this._indeterminate = true;\n } else {\n this._data.forEach((row: any) => {\n // checking which ones are being toggled\n if (this.isRowSelected(row)) {\n toggledRows.push(row);\n let modelRow: any = this.value.filter((val: any) => {\n return this.compareWith(row, val);\n })[0];\n let index: number = this.value.indexOf(modelRow);\n if (index > -1) {\n this.value.splice(index, 1);\n }\n }\n });\n this._allSelected = false;\n this._indeterminate = false;\n }\n this.onSelectAll.emit({rows: toggledRows, selected: checked});\n this.onChange(this.value);\n }\n\n /**\n * Checks if row is selected\n */\n isRowSelected(row: any): boolean {\n // compare items by [compareWith] function\n return this.value ? this.value.filter((val: any) => {\n return this.compareWith(row, val);\n }).length > 0 : false;\n }\n\n /**\n * Selects or clears a row depending on 'checked' value if the row 'isSelectable'\n * handles cntrl clicks and shift clicks for multi-select\n */\n select(row: any, event: Event, currentSelected: number): void {\n if (this.selectable) {\n this.blockEvent(event);\n // Check to see if Shift key is selected and need to select everything in between\n let mouseEvent: MouseEvent = event as MouseEvent;\n if (this.multiple && mouseEvent && mouseEvent.shiftKey && this._lastSelectedIndex > -1) {\n let firstIndex: number = currentSelected;\n let lastIndex: number = this._lastSelectedIndex;\n if (currentSelected > this._lastSelectedIndex) {\n firstIndex = this._lastSelectedIndex;\n lastIndex = currentSelected;\n }\n // if clicking a checkbox behind the initial check, then toggle all selections expect the initial checkbox\n // else the checkboxes clicked are all after the initial one\n if ((this._firstSelectedIndex >= currentSelected && this._lastSelectedIndex > this._firstSelectedIndex) ||\n (this._firstSelectedIndex <= currentSelected && this._lastSelectedIndex < this._firstSelectedIndex)) {\n for (let i: number = firstIndex; i <= lastIndex; i++) {\n if (this._firstSelectedIndex !== i) {\n this._doSelection(this._data[i], i);\n }\n }\n } else if ((this._firstSelectedIndex > currentSelected) || (this._firstSelectedIndex < currentSelected)) {\n // change indexes depending on where the next checkbox is selected (before or after)\n if (this._firstSelectedIndex > currentSelected) {\n lastIndex--;\n } else if (this._firstSelectedIndex < currentSelected) {\n firstIndex++;\n }\n for (let i: number = firstIndex; i <= lastIndex; i++) {\n let rowSelected: boolean = this.isRowSelected(this._data[i]);\n // if row is selected and first checkbox was selected\n // or if row was unselected and first checkbox was unselected\n // we ignore the toggle\n if ((this._firstCheckboxValue && !rowSelected) ||\n (!this._firstCheckboxValue && rowSelected)) {\n this._doSelection(this._data[i], i);\n } else if (this._shiftPreviouslyPressed) {\n // else if the checkbox selected was in the middle of the last selection and the first selection\n // then we undo the selections\n if ((currentSelected >= this._firstSelectedIndex && currentSelected <= this._lastSelectedIndex) ||\n (currentSelected <= this._firstSelectedIndex && currentSelected >= this._lastSelectedIndex)) {\n this._doSelection(this._data[i], i);\n }\n }\n }\n }\n this._shiftPreviouslyPressed = true;\n // if shift wasnt pressed, then we take the element checked as the first row\n // incase the next click uses shift\n } else if (mouseEvent && !mouseEvent.shiftKey) {\n this._firstCheckboxValue = this._doSelection(row, currentSelected);\n this._shiftPreviouslyPressed = false;\n this._firstSelectedIndex = currentSelected;\n }\n this._lastSelectedIndex = currentSelected;\n }\n }\n\n /**\n * Overrides the onselectstart method of the document so other text on the page\n * doesn't get selected when doing shift selections.\n */\n disableTextSelection(): void {\n if (this._document) {\n this._document.onselectstart = function(): boolean {\n return false;\n };\n }\n }\n\n /**\n * Resets the original onselectstart method.\n */\n enableTextSelection(): void {\n if (this._document) {\n this._document.onselectstart = undefined;\n }\n }\n\n /**\n * emits the onRowClickEvent when a row is clicked\n * if clickable is true and selectable is false then select the row\n */\n handleRowClick(row: any, index: number, event: Event): void {\n if (this.clickable) {\n // ignoring linting rules here because attribute it actually null or not there\n // can't check for undefined\n const srcElement: any = event.srcElement || event.currentTarget;\n let element: HTMLElement = event.target as HTMLElement;\n /* tslint:disable-next-line */\n if (srcElement.getAttribute('stopRowClick') === null && element.tagName.toLowerCase() !== 'mat-pseudo-checkbox') {\n this.onRowClick.emit({\n row: row,\n index: index,\n });\n }\n }\n }\n\n /**\n * Method handle for sort click event in column headers.\n */\n handleSort(column: ITdDataTableColumn): void {\n if (this._sortBy === column) {\n this._sortOrder = this._sortOrder === TdDataTableSortingOrder.Ascending ?\n TdDataTableSortingOrder.Descending : TdDataTableSortingOrder.Ascending;\n } else {\n this._sortBy = column;\n this._sortOrder = TdDataTableSortingOrder.Ascending;\n }\n this.onSortChange.next({ name: this._sortBy.name, order: this._sortOrder });\n }\n\n /**\n * Handle all keyup events when focusing a data table row\n */\n _rowKeyup(event: KeyboardEvent, row: any, index: number): void {\n switch (event.keyCode) {\n case ENTER:\n case SPACE:\n /** if user presses enter or space, the row should be selected */\n if (this.selectable) {\n this._doSelection(this._data[this.fromRow + index], this.fromRow + index);\n }\n break;\n case UP_ARROW:\n /**\n * if users presses the up arrow, we focus the prev row\n * unless its the first row\n */\n if (index > 0) {\n this._rows.toArray()[index - 1].focus();\n }\n this.blockEvent(event);\n if (this.selectable && this.multiple && event.shiftKey && this.fromRow + index >= 0) {\n this._doSelection(this._data[this.fromRow + index], this.fromRow + index);\n }\n break;\n case DOWN_ARROW:\n /**\n * if users presses the down arrow, we focus the next row\n * unless its the last row\n */\n if (index < (this._rows.toArray().length - 1)) {\n this._rows.toArray()[index + 1].focus();\n }\n this.blockEvent(event);\n if (this.selectable && this.multiple && event.shiftKey && this.fromRow + index < this._data.length) {\n this._doSelection(this._data[this.fromRow + index], this.fromRow + index);\n }\n break;\n default:\n // default\n }\n }\n\n /**\n * Sets column index of the dragged column and initial clientX of column\n */\n _handleStartColumnDrag(index: number, event: MouseEvent): void {\n this._columnClientX = event.clientX;\n this._resizingColumn = index;\n }\n\n /**\n * Calculates new width depending on new clientX of dragger column\n */\n _handleColumnDrag(event: MouseEvent | DragEvent): void {\n // check if there was been a separator clicked for resize\n if (this._resizingColumn !== undefined && event.clientX > 0) {\n let xPosition: number = event.clientX;\n // checks if the separator is being moved to try and resize the column, else dont do anything\n if (xPosition > 0 && this._columnClientX > 0 && (xPosition - this._columnClientX) !== 0) {\n // calculate the new width depending if making the column bigger or smaller\n let proposedManualWidth: number = this._widths[this._resizingColumn].value + (xPosition - this._columnClientX);\n // if the proposed new width is less than the projected min width of the column, use projected min width\n if (proposedManualWidth < this._colElements.toArray()[this._resizingColumn].projectedWidth) {\n proposedManualWidth = this._colElements.toArray()[this._resizingColumn].projectedWidth;\n }\n this.columns[this._resizingColumn].width = proposedManualWidth;\n // update new x position for the resized column\n this._onColumnResize.next(xPosition);\n }\n }\n }\n\n /**\n * Ends dragged flags\n */\n _handleEndColumnDrag(): void {\n this._columnClientX = undefined;\n this._resizingColumn = undefined;\n }\n\n /**\n * Method to prevent the default events\n */\n blockEvent(event: Event): void {\n event.preventDefault();\n }\n\n private _getNestedValue(name: string, value: any): string {\n if (!(value instanceof Object) || !name) {\n return value;\n }\n if (name.indexOf('.') > -1) {\n let splitName: string[] = name.split(/\\.(.+)/, 2);\n return this._getNestedValue(splitName[1], value[splitName[0]]);\n } else {\n return value[name];\n }\n }\n\n /**\n * Does the actual Row Selection\n */\n private _doSelection(row: any, rowIndex: number): boolean {\n let wasSelected: boolean = this.isRowSelected(row);\n if (!wasSelected) {\n if (!this._multiple) {\n this.clearModel();\n }\n this.value.push(row);\n } else {\n // compare items by [compareWith] function\n row = this.value.filter((val: any) => {\n return this.compareWith(row, val);\n })[0];\n let index: number = this.value.indexOf(row);\n if (index > -1) {\n this.value.splice(index, 1);\n }\n }\n this._calculateCheckboxState();\n this.onRowSelect.emit({row: row, index: rowIndex, selected: !wasSelected});\n this.onChange(this.value);\n return !wasSelected;\n }\n\n /**\n * Calculate all the state of all checkboxes\n */\n private _calculateCheckboxState(): void {\n if (this._data) {\n this._allSelected = typeof this._data.find((d: any) => !this.isRowSelected(d)) === 'undefined';\n this._indeterminate = false;\n for (let row of this._data) {\n if (!this.isRowSelected(row)) {\n continue;\n }\n this._indeterminate = true;\n break;\n }\n }\n }\n\n /**\n * Calculates the widths for columns and cells depending on content\n */\n private _calculateWidths(): void {\n if (this._colElements && this._colElements.length) {\n this._widths = [];\n this._colElements.forEach((col: TdDataTableColumnComponent, index: number) => {\n this._adjustColumnWidth(index, this._calculateWidth());\n });\n this._adjustColumnWidhts();\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * Adjusts columns after calculation to see if they need to be recalculated.\n */\n private _adjustColumnWidhts(): void {\n let fixedTotalWidth: number = 0;\n // get the number of total columns that have flexible widths (not fixed or hidden)\n let flexibleWidths: number = this._widths.filter((width: IInternalColumnWidth, index: number) => {\n if (this.columns[index].hidden) {\n return false;\n }\n if (width.limit || width.max || width.min) {\n fixedTotalWidth += width.value;\n }\n return !width.limit && !width.max && !width.min;\n }).length;\n // calculate how much pixes are left that could be spread across\n // the flexible columns\n let recalculateHostWidth: number = 0;\n if (fixedTotalWidth < this.hostWidth) {\n recalculateHostWidth = this.hostWidth - fixedTotalWidth;\n }\n // if we have flexible columns and pixels to spare on them\n // we try and spread the pixels across them\n if (flexibleWidths && recalculateHostWidth) {\n let newValue: number = Math.floor(recalculateHostWidth / flexibleWidths);\n let adjustedNumber: number = 0;\n // adjust the column widths with the spread pixels\n this._widths.forEach((colWidth: IInternalColumnWidth) => {\n if (this._widths[colWidth.index].max && this._widths[colWidth.index].value > newValue ||\n this._widths[colWidth.index].min && this._widths[colWidth.index].value < newValue ||\n !this._widths[colWidth.index].limit) {\n this._adjustColumnWidth(colWidth.index, newValue);\n adjustedNumber++;\n }\n });\n // if there are still columns that need to be recalculated, we start over\n let newFlexibleWidths: number = this._widths.filter((width: IInternalColumnWidth) => {\n return !width.limit && !width.max;\n }).length;\n if (newFlexibleWidths !== adjustedNumber && newFlexibleWidths !== flexibleWidths) {\n this._adjustColumnWidhts();\n }\n }\n }\n\n /**\n * Adjusts a single column to see if it can be recalculated\n */\n private _adjustColumnWidth(index: number, value: number): void {\n this._widths[index] = {\n value: value,\n index: index,\n limit: false,\n min: false,\n max: false,\n };\n // flag to see if we need to skip the min width projection\n // depending if a width or min width has been provided\n let skipMinWidthProjection: boolean = false;\n if (this.columns[index]) {\n // if the provided width has min/max, then we check to see if we need to set it\n if (typeof this.columns[index].width === 'object') {\n let widthOpts: ITdDataTableColumnWidth = <ITdDataTableColumnWidth>this.columns[index].width;\n // if the column width is less than the configured min, we override it\n skipMinWidthProjection = (widthOpts && !!widthOpts.min);\n if (widthOpts && widthOpts.min >= this._widths[index].value) {\n this._widths[index].value = widthOpts.min;\n this._widths[index].min = true;\n // if the column width is more than the configured max, we override it\n } else if (widthOpts && widthOpts.max <= this._widths[index].value) {\n this._widths[index].value = widthOpts.max;\n this._widths[index].max = true;\n }\n // if it has a fixed width, then we just set it\n } else if (typeof this.columns[index].width === 'number') {\n this._widths[index].value = <number>this.columns[index].width;\n skipMinWidthProjection = this._widths[index].limit = true;\n }\n }\n // if there wasn't any width or min width provided, we set a min to what the column width min should be\n if (!skipMinWidthProjection &&\n this._widths[index].value < this._colElements.toArray()[index].projectedWidth) {\n this._widths[index].value = this._colElements.toArray()[index].projectedWidth;\n this._widths[index].min = true;\n this._widths[index].limit = false;\n }\n }\n\n /**\n * Generic method to calculate column width\n */\n private _calculateWidth(): number {\n let renderedColumns: ITdDataTableColumn[] = this.columns.filter((col: ITdDataTableColumn) => !col.hidden);\n return Math.floor(this.hostWidth / renderedColumns.length);\n }\n\n /**\n * Method to calculate the rows to be rendered in the viewport\n */\n private _calculateVirtualRows(): void {\n let scrolledRows: number = 0;\n if (this._data) {\n this._totalHeight = 0;\n let rowHeightSum: number = 0;\n // loop through all rows to see if we have their height cached\n // and sum them all to calculate the total height\n this._data.forEach((d: any, i: number) => {\n // iterate through all rows at first and assume all\n // rows are the same height as the first one\n if (!this._rowHeightCache[i]) {\n this._rowHeightCache[i] = this._rowHeightCache[0] || TD_VIRTUAL_DEFAULT_ROW_HEIGHT;\n }\n rowHeightSum += this._rowHeightCache[i];\n // check how many rows have been scrolled\n if (this._scrollVerticalOffset - rowHeightSum > 0) {\n scrolledRows++;\n }\n });\n this._totalHeight = rowHeightSum;\n // set the initial row to be rendered taking into account the row offset\n let fromRow: number = scrolledRows - TD_VIRTUAL_OFFSET;\n this._fromRow = fromRow > 0 ? fromRow : 0;\n\n let hostHeight: number = this._hostHeight;\n let index: number = 0;\n // calculate how many rows can fit in the viewport\n while (hostHeight > 0) {\n hostHeight -= this._rowHeightCache[this.fromRow + index];\n index++;\n }\n // set the last row to be rendered taking into account the row offset\n let range: number = (index - 1) + (TD_VIRTUAL_OFFSET * 2);\n let toRow: number = range + this.fromRow;\n // if last row is greater than the total length, then we use the total length\n if (isFinite(toRow) && toRow > this._data.length) {\n toRow = this._data.length;\n } else if (!isFinite(toRow)) {\n toRow = TD_VIRTUAL_OFFSET;\n }\n this._toRow = toRow;\n } else {\n this._totalHeight = 0;\n this._fromRow = 0;\n this._toRow = 0;\n }\n\n let offset: number = 0;\n // calculate the proper offset depending on how many rows have been scrolled\n if (scrolledRows > TD_VIRTUAL_OFFSET) {\n for (let index: number = 0; index < this.fromRow; index++) {\n offset += this._rowHeightCache[index];\n }\n }\n\n this._offsetTransform = this._domSanitizer.bypassSecurityTrustStyle('translateY(' + (offset - this.totalHeight) + 'px)');\n if (this._data) {\n this._virtualData = this.data.slice(this.fromRow, this.toRow);\n }\n // mark for check at the end of the queue so we are sure\n // that the changes will be marked\n Promise.resolve().then(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n}\n","import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, HostBinding, HostListener, ViewChild } from '@angular/core';\n\nimport { TdDataTableSortingOrder } from '../data-table.component';\n\nexport interface ITdDataTableSortChangeEvent {\n order: TdDataTableSortingOrder;\n name: string;\n}\n\n@Component({\n /* tslint:disable-next-line */\n selector: 'th[td-data-table-column]',\n styleUrls: ['./data-table-column.component.scss' ],\n templateUrl: './data-table-column.component.html',\n})\nexport class TdDataTableColumnComponent {\n\n private _sortOrder: TdDataTableSortingOrder = TdDataTableSortingOrder.Ascending;\n\n @ViewChild('columnContent', {read: ElementRef}) _columnContent: ElementRef;\n\n get projectedWidth(): number {\n if (this._columnContent && this._columnContent.nativeElement) {\n return (<HTMLElement>this._columnContent.nativeElement).getBoundingClientRect().width;\n }\n return 100;\n }\n\n /**\n * name?: string\n * Sets unique column [name] for [sortable] events.\n */\n @Input('name') name: string = '';\n\n /**\n * sortable?: boolean\n * Enables sorting events, sort icons and active column states.\n * Defaults to 'false'\n */\n @Input('sortable') sortable: boolean = false;\n\n /**\n * active?: boolean\n * Sets column to active state when 'true'.\n * Defaults to 'false'\n */\n @Input('active') active: boolean = false;\n\n /**\n * numeric?: boolean\n * Makes column follow the numeric data-table specs and sort icon.\n * Defaults to 'false'\n */\n @Input('numeric') numeric: boolean = false;\n\n /**\n * sortOrder?: ['ASC' | 'DESC'] or TdDataTableSortingOrder\n * Sets the sort order of column.\n * Defaults to 'ASC' or TdDataTableSortingOrder.Ascending\n */\n @Input('sortOrder')\n set sortOrder(order: 'ASC' | 'DESC') {\n let sortOrder: string = order ? order.toUpperCase() : 'ASC';\n if (sortOrder !== 'DESC' && sortOrder !== 'ASC') {\n throw new Error('[sortOrder] must be empty, ASC or DESC');\n }\n\n this._sortOrder = sortOrder === 'ASC' ?\n TdDataTableSortingOrder.Ascending : TdDataTableSortingOrder.Descending;\n }\n\n /**\n * sortChange?: function\n * Event emitted when the column headers are clicked. [sortable] needs to be enabled.\n * Emits an [ITdDataTableSortChangeEvent] implemented object.\n */\n @Output('sortChange') onSortChange: EventEmitter<ITdDataTableSortChangeEvent> =\n new EventEmitter<ITdDataTableSortChangeEvent>();\n\n @HostBinding('class.mat-clickable')\n get bindClickable(): boolean {\n return this.sortable;\n }\n\n @HostBinding('class.mat-sortable')\n get bingSortable(): boolean {\n return this.sortable;\n }\n\n @HostBinding('class.mat-active')\n get bindActive(): boolean {\n return this.active;\n }\n\n @HostBinding('class.mat-numeric')\n get bindNumeric(): boolean {\n return this.numeric;\n }\n\n constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-data-table-column');\n }\n\n /**\n * Listening to click event on host to throw a sort event\n */\n @HostListener('click')\n handleClick(): void {\n if (this.sortable) {\n this.onSortChange.emit({name: this.name, order: this._sortOrder});\n }\n }\n\n isAscending(): boolean {\n return this._sortOrder === TdDataTableSortingOrder.Ascending;\n }\n\n isDescending(): boolean {\n return this._sortOrder === TdDataTableSortingOrder.Descending;\n }\n\n}\n","import { Component, Input, Renderer2, ElementRef, HostBinding } from '@angular/core';\n\nexport type TdDataTableCellAlign = 'start' | 'center' | 'end';\n\n@Component({\n /* tslint:disable-next-line */\n selector: 'td[td-data-table-cell]',\n styleUrls: ['./data-table-cell.component.scss' ],\n templateUrl: './data-table-cell.component.html',\n})\nexport class TdDataTableCellComponent {\n\n private _align: TdDataTableCellAlign;\n\n /**\n * numeric?: boolean\n * Makes cell follow the numeric data-table specs.\n * Defaults to 'false'\n */\n @Input('numeric') numeric: boolean = false;\n\n /**\n * align?: 'start' | 'center' | 'end'\n * Makes cell content align on demand\n * Defaults to 'left', overrides numeric\n */\n @Input() \n set align(align: TdDataTableCellAlign) {\n this._align = align;\n }\n get align(): TdDataTableCellAlign {\n return this._align; \n }\n\n @HostBinding('class.mat-numeric')\n get bindNumeric(): boolean {\n return this.numeric;\n }\n\n constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-data-table-cell');\n }\n\n}\n","import { Component, Renderer2, ElementRef } from '@angular/core';\n\n@Component({\n /* tslint:disable-next-line */\n selector: 'table[td-data-table]',\n styleUrls: ['./data-table-table.component.scss' ],\n templateUrl: './data-table-table.component.html',\n})\nexport class TdDataTableTableComponent {\n\n constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-data-table');\n }\n\n}\n","import { Injectable, Provider, SkipSelf, Optional } from '@angular/core';\n\nimport { TdDataTableSortingOrder, ITdDataTableColumn } from '../data-table.component';\n\n@Injectable()\nexport class TdDataTableService {\n\n /**\n * params:\n * - data: any[]\n * - searchTerm: string\n * - ignoreCase: boolean = false\n * - excludedColumns: string[] = []\n *\n * Searches [data] parameter for [searchTerm] matches and returns a new array with them.\n */\n filterData(data: any[], searchTerm: string, ignoreCase: boolean = false, excludedColumns?: string[]): any[] {\n let filter: string = searchTerm ? (ignoreCase ? searchTerm.toLowerCase() : searchTerm) : '';\n if (filter) {\n data = data.filter((item: any) => {\n const res: any = Object.keys(item).find((key: string) => {\n if (!excludedColumns || excludedColumns.indexOf(key) === -1) {\n const preItemValue: string = ('' + item[key]);\n const itemValue: string = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n }\n });\n return !(typeof res === 'undefined');\n });\n }\n return data;\n }\n\n /**\n * params:\n * - data: any[]\n * - sortBy: string\n * - sortOrder: TdDataTableSortingOrder = TdDataTableSortingOrder.Ascending\n *\n * Sorts [data] parameter by [sortBy] and [sortOrder] and returns the sorted data.\n */\n sortData(data: any[], sortBy: string, sortOrder: TdDataTableSortingOrder = TdDataTableSortingOrder.Ascending): any[] {\n if (sortBy) {\n data = Array.from(data); // Change the array reference to trigger OnPush and not mutate original array\n data.sort((a: any, b: any) => {\n let compA: any = a[sortBy];\n let compB: any = b[sortBy];\n let direction: number = 0;\n if (!Number.isNaN(Number.parseFloat(compA)) && !Number.isNaN(Number.parseFloat(compB))) {\n direction = Number.parseFloat(compA) - Number.parseFloat(compB);\n } else {\n if (compA < compB) {\n direction = -1;\n } else if (compA > compB) {\n direction = 1;\n }\n }\n return direction * (sortOrder === TdDataTableSortingOrder.Descending ? -1 : 1);\n });\n }\n return data;\n }\n\n /**\n * params:\n * - data: any[]\n * - fromRow: number\n * - toRow: : number\n *\n * Returns a section of the [data] parameter starting from [fromRow] and ending in [toRow].\n */\n pageData(data: any[], fromRow: number, toRow: number): any[] {\n if (fromRow >= 1) {\n data = data.slice(fromRow - 1, toRow);\n }\n return data;\n }\n}\n\nexport function DATA_TABLE_PROVIDER_FACTORY(\n parent: TdDataTableService): TdDataTableService {\n return parent || new TdDataTableService();\n}\n\nexport const DATA_TABLE_PROVIDER: Provider = {\n // If there is already a service available, use that. Otherwise, provide a new one.\n provide: TdDataTableService,\n deps: [[new Optional(), new SkipSelf(), TdDataTableService]],\n useFactory: DATA_TABLE_PROVIDER_FACTORY,\n};\n","import { NgModule, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatPseudoCheckboxModule } from '@angular/material/core';\n\nimport { TdDataTableComponent } from './data-table.component';\nimport { TdDataTableColumnComponent } from './data-table-column/data-table-column.component';\nimport { TdDataTableCellComponent } from './data-table-cell/data-table-cell.component';\nimport { TdDataTableRowComponent, TdDataTableColumnRowComponent } from './data-table-row/data-table-row.component';\nimport { TdDataTableTableComponent } from './data-table-table/data-table-table.component';\nimport { TdDataTableTemplateDirective } from './directives/data-table-template.directive';\n\nimport { DATA_TABLE_PROVIDER } from './services/data-table.service';\n\nconst TD_DATA_TABLE: Type<any>[] = [\n TdDataTableComponent,\n TdDataTableTemplateDirective,\n\n TdDataTableColumnComponent,\n TdDataTableCellComponent,\n TdDataTableRowComponent,\n TdDataTableColumnRowComponent,\n TdDataTableTableComponent,\n];\n\n@NgModule({\n imports: [\n CommonModule,\n MatCheckboxModule,\n MatTooltipModule,\n MatIconModule,\n MatPseudoCheckboxModule,\n ],\n declarations: [\n TD_DATA_TABLE,\n ],\n exports: [\n TD_DATA_TABLE,\n ],\n providers: [\n DATA_TABLE_PROVIDER,\n ],\n})\nexport class CovalentDataTableModule {\n\n}\n"]}