blob: 222c97ffb85fdbecde627d96b04b66fe1bd972ab [file] [log] [blame]
{"version":3,"sources":["../../../../node_modules/tslib/tslib.es6.js","../../../src/platform/core/data-table/data-table-row/data-table-row.component.ts","../../../src/platform/core/data-table/directives/data-table-template.directive.ts","../../../../src/platform/core/data-table/data-table.component.ts","../../../src/platform/core/data-table/data-table-column/data-table-column.component.ts","../../../src/platform/core/data-table/data-table-cell/data-table-cell.component.ts","../../../src/platform/core/data-table/data-table-table/data-table-table.component.ts","../../../src/platform/core/data-table/services/data-table.service.ts","../../../../src/platform/core/data-table/data-table.module.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","__","this","constructor","create","__values","o","s","Symbol","iterator","m","i","length","next","value","done","TypeError","_elementRef","_renderer","addClass","nativeElement","Component","args","selector","template","ElementRef","Renderer2","TdDataTableRowComponent","_selected","defineProperty","selected","removeClass","height","getBoundingClientRect","clickListener","focus","Input","HostListener","TdDataTableTemplateDirective","templateRef","viewContainerRef","_super","TemplatePortalDirective","Directive","TemplateRef","ViewContainerRef","TdDataTableSortingOrder","Ascending","Descending","_changeDetectorRef","_TdDataTableMixinBase","mixinControlValueAccessor","TdDataTableBase","TdDataTableComponent","_document","_domSanitizer","_this","_hostWidth","_resizableColumns","_columnClientX","_onColumnResize","Subject","_widths","_onResize","_scrollHorizontalOffset","_onHorizontalScroll","_onVerticalScroll","_rowHeightCache","_totalHeight","_hostHeight","_scrollVerticalOffset","_fromRow","_toRow","_selectable","_clickable","_multiple","_allSelected","_indeterminate","_sortable","_sortOrder","_shiftPreviouslyPressed","_lastSelectedIndex","_firstSelectedIndex","_firstCheckboxValue","_templateMap","Map","sortChange","EventEmitter","rowSelect","rowClick","selectAll","compareWith","row","model","_resizingColumn","selectable","_offsetTransform","_data","data","Promise","resolve","then","refresh","_scrollableDiv","scrollTop","_virtualData","_columns","hasData","keys","forEach","k","find","c","name","push","label","cols","resizableColumns","coerceBooleanProperty","clickable","multiple","sortable","columnName","column","columns","Error","_sortBy","order","sortOrder","toUpperCase","ngOnInit","_resizeSubs","asObservable","subscribe","_rows","toArray","index","fromRow","_calculateWidths","_calculateVirtualRows","_columnResizeSubs","pipe","debounceTime","clientX","markForCheck","_horizontalScrollSubs","horizontalScroll","_verticalScrollSubs","verticalScroll","_valueChangesSubs","valueChanges","ngAfterContentInit","_b","_templates","_c","set","tdDataTableTemplate","ngAfterContentChecked","newHostWidth_1","width","setTimeout","newHostHeight","ngAfterViewInit","_rowsChangedSubs","changes","ngOnDestroy","unsubscribe","handleScroll","event","element","scrollLeft","getColumnWidth","getCellValue","undefined","nested","_getNestedValue","getTemplateRef","get","clearModel","splice","_calculateCheckboxState","_selectAll","checked","toggledRows","isRowSelected","modelRow","filter","val","indexOf","emit","rows","onChange","select","currentSelected","blockEvent","mouseEvent","shiftKey","firstIndex","lastIndex","_doSelection","rowSelected","disableTextSelection","onselectstart","enableTextSelection","handleRowClick","srcElement","currentTarget","getAttribute","tagName","toLowerCase","handleSort","_rowKeyup","keyCode","ENTER","SPACE","UP_ARROW","DOWN_ARROW","_handleStartColumnDrag","_handleColumnDrag","xPosition","proposedManualWidth","_colElements","projectedWidth","_handleEndColumnDrag","preventDefault","splitName","split","rowIndex","wasSelected","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","TD_VIRTUAL_OFFSET","isFinite","offset","bypassSecurityTrustStyle","totalHeight","slice","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","inputs","changeDetection","ChangeDetectionStrategy","OnPush","Optional","type","Inject","DOCUMENT","DomSanitizer","ChangeDetectorRef","ContentChildren","descendants","ViewChild","static","ViewChildren","Output","TdDataTableColumnComponent","active","numeric","isColumnSortOrder","_columnContent","handleClick","isAscending","isDescending","read","HostBinding","TdDataTableCellComponent","_align","align","TdDataTableService","filterData","searchTerm","ignoreCase","excludedColumns","item","key","preItemValue","sortData","sortBy","from","sort","a","compA","compB","direction","Number","isNaN","parseFloat","pageData","Injectable","TD_DATA_TABLE","TdDataTableColumnRowComponent","TdDataTableTableComponent","NgModule","imports","CommonModule","MatCheckboxModule","MatTooltipModule","MatIconModule","MatPseudoCheckboxModule","declarations","exports"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\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 (Object.prototype.hasOwnProperty.call(b, 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++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\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 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\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) : adopt(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 var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") 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 throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\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 __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\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\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\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 (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, 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\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import {\n Component,\n Input,\n Output,\n Renderer2,\n ElementRef,\n ContentChildren,\n QueryList,\n HostListener,\n} 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 constructor(protected _elementRef: ElementRef, protected _renderer: Renderer2) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-data-table-column-row');\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 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","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 @Input() tdDataTableTemplate: string;\n constructor(templateRef: TemplateRef<any>, viewContainerRef: ViewContainerRef) {\n super(templateRef, viewContainerRef);\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n ViewChild,\n OnDestroy,\n AfterViewInit,\n ContentChildren,\n TemplateRef,\n AfterContentInit,\n QueryList,\n Inject,\n Optional,\n ViewChildren,\n ElementRef,\n OnInit,\n AfterContentChecked,\n} 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 {\n ITdDataTableSortChangeEvent,\n TdDataTableColumnComponent,\n} 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 columnSortOrder?: 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 {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdDataTableComponent),\n multi: true,\n },\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\n extends _TdDataTableMixinBase\n implements IControlValueAccessor, OnInit, 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, { descendants: true })\n _templates: QueryList<TdDataTableTemplateDirective>;\n\n @ViewChild('scrollableDiv', { static: true }) _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 const 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 const 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' ? 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: EventEmitter<ITdDataTableSortChangeEvent> = 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: 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: 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: EventEmitter<ITdDataTableSelectAllEvent> = new EventEmitter<ITdDataTableSelectAllEvent>();\n\n constructor(\n @Optional() @Inject(DOCUMENT) private _document: any,\n private _elementRef: ElementRef,\n private _domSanitizer: DomSanitizer,\n _changeDetectorRef: ChangeDetectorRef,\n ) {\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: (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\n .asObservable()\n .pipe(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().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().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 (const template of this._templates.toArray()) {\n this._templateMap.set(template.tdDataTableTemplate, template.templateRef);\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 const 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 const 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(debounceTime(0)).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 const element: HTMLElement = <HTMLElement>event.target;\n if (element) {\n const horizontalScroll: number = element.scrollLeft;\n if (this._scrollHorizontalOffset !== horizontalScroll) {\n this._onHorizontalScroll.next(horizontalScroll);\n }\n const 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 const 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 const modelRow: any = this.value.filter((val: any) => {\n return this.compareWith(row, val);\n })[0];\n const 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.selectAll.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\n ? this.value.filter((val: any) => {\n return this.compareWith(row, val);\n }).length > 0\n : 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 const 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 (\n (this._firstSelectedIndex >= currentSelected && this._lastSelectedIndex > this._firstSelectedIndex) ||\n (this._firstSelectedIndex <= currentSelected && this._lastSelectedIndex < this._firstSelectedIndex)\n ) {\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 const 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) || (!this._firstCheckboxValue && rowSelected)) {\n this._doSelection(this._data[i], i);\n } else if (\n this._shiftPreviouslyPressed &&\n ((currentSelected >= this._firstSelectedIndex && currentSelected <= this._lastSelectedIndex) ||\n (currentSelected <= this._firstSelectedIndex && currentSelected >= this._lastSelectedIndex))\n ) {\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 this._doSelection(this._data[i], i);\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 const 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.rowClick.emit({\n row,\n 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 =\n this._sortOrder === TdDataTableSortingOrder.Ascending\n ? TdDataTableSortingOrder.Descending\n : TdDataTableSortingOrder.Ascending;\n } else {\n this._sortBy = column;\n this._sortOrder = TdDataTableSortingOrder.Ascending;\n }\n this.sortChange.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 const 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 const 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 const 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 const index: number = this.value.indexOf(row);\n if (index > -1) {\n this.value.splice(index, 1);\n }\n }\n this._calculateCheckboxState();\n this.rowSelect.emit({ 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 (const 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 const 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 const 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 (\n (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 ) {\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 const 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,\n 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 const 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 && 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 const 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 const 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 const 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(\n 'translateY(' + (offset - this.totalHeight) + 'px)',\n );\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 {\n Component,\n Input,\n Output,\n EventEmitter,\n Renderer2,\n ElementRef,\n HostBinding,\n HostListener,\n ViewChild,\n} 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 private _sortOrder: TdDataTableSortingOrder = TdDataTableSortingOrder.Ascending;\n\n @ViewChild('columnContent', { read: ElementRef, static: true }) _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: string = '';\n\n /**\n * sortable?: boolean\n * Enables sorting events, sort icons and active column states.\n * Defaults to 'false'\n */\n @Input() sortable: boolean = false;\n\n /**\n * active?: boolean\n * Sets column to active state when 'true'.\n * Defaults to 'false'\n */\n @Input() 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: boolean = false;\n\n /**\n * if column sort order is present\n */\n @Input() isColumnSortOrder: 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 const 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' ? 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: EventEmitter<ITdDataTableSortChangeEvent> = 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.sortChange.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","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 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: 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","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 constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {\n this._renderer.addClass(this._elementRef.nativeElement, 'td-data-table');\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { TdDataTableSortingOrder } from '../data-table.component';\n\n@Injectable()\nexport class TdDataTableService {\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 const 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 const compA: any = a[sortBy];\n const 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","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';\nimport { TdDataTableService } 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: [CommonModule, MatCheckboxModule, MatTooltipModule, MatIconModule, MatPseudoCheckboxModule],\n declarations: [TD_DATA_TABLE],\n exports: [TD_DATA_TABLE],\n providers: [TdDataTableService],\n})\nexport class CovalentDataTableModule {}\n"]}