{"version":3,"sources":["node_modules/tslib/tslib.es6.js","ng://@covalent/core/virtual-scroll/virtual-scroll-row.directive.ts","ng://@covalent/core/virtual-scroll/virtual-scroll-container.component.ts","ng://@covalent/core/virtual-scroll/virtual-scroll.module.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","__","this","constructor","prototype","create","tslib_1.__extends","TemplatePortalDirective","Directive","args","selector","TemplateRef","ViewContainerRef","TdVirtualScrollRowDirective","templateRef","viewContainerRef","_super","call","defineProperty","TdVirtualScrollContainerComponent","_data","data","_initialized","_calculateVirtualRows","_changeDetectorRef","markForCheck","_virtualData","_rows","toArray","nativeElement","getBoundingClientRect","height","_totalHeight","_fromRow","_toRow","_offsetTransform","ngAfterViewInit","_this","_subs","push","changes","subscribe","_bottom","pipe","debounceTime","bottom","emit","lastRow","length","lastIndex","toRow","ngAfterViewChecked","newHostHeight","_elementRef","_hostHeight","ngOnDestroy","forEach","sub","unsubscribe","handleScroll","event","element","verticalScroll","scrollTop","_scrollVerticalOffset","rowHeight","next","refresh","scrollTo","row","scrollToStart","scrollToEnd","totalHeight","fromRow","Math","floor","isFinite","offset","_domSanitizer","bypassSecurityTrustStyle","slice","Promise","resolve","then","Component","template","changeDetection","ChangeDetectionStrategy","OnPush","ElementRef","DomSanitizer","Renderer2","ChangeDetectorRef","Input","Output","ViewChildren","ContentChild","HostListener","_renderer","Subject","EventEmitter","trackBy","index","item","TD_VIRTUAL_SCROLL","CovalentVirtualScrollModule","NgModule","imports","CommonModule","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 { Directive, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { TemplatePortalDirective } from '@angular/cdk/portal';\n\n@Directive({selector: '[tdVirtualScrollRow]'})\nexport class TdVirtualScrollRowDirective extends TemplatePortalDirective {\n\n  constructor(templateRef: TemplateRef<any>,\n              viewContainerRef: ViewContainerRef) {\n    super(templateRef, viewContainerRef);\n  }\n  \n}\n","import { Component, Directive, Input, Output, EventEmitter, ContentChild, AfterViewInit, ViewChild,\n         ChangeDetectionStrategy, ChangeDetectorRef, QueryList, ViewChildren, ElementRef, HostListener,\n         Renderer2, AfterViewChecked, OnDestroy, TrackByFunction } from '@angular/core';\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\n\nimport { Subscription, Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { TdVirtualScrollRowDirective } from './virtual-scroll-row.directive';\n\nconst TD_VIRTUAL_OFFSET: number = 2;\nconst SCROLL_DEBOUNCE: number = 200;\n\nexport interface ITdVirtualScrollBottomEvent {\n  lastRow: any;\n  lastIndex: number;\n}\n\n@Component({\n  selector: 'td-virtual-scroll-container',\n  styleUrls: ['./virtual-scroll-container.component.scss' ],\n  templateUrl: './virtual-scroll-container.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdVirtualScrollContainerComponent implements AfterViewInit, AfterViewChecked, OnDestroy {\n\n  private _subs: Subscription[] = [];\n  private _bottom: Subject<any> = new Subject();\n  private _initialized: boolean = false;\n\n  private _totalHeight: number = 0;\n  private _hostHeight: number = 0;\n  private _scrollVerticalOffset: number = 0;\n  private _offsetTransform: SafeStyle;\n\n  private _fromRow: number = 0;\n  private _toRow: number = 0;\n\n  private _data: any[];\n  private _virtualData: any[];\n\n  /**\n   * data: any[]\n   * List of items to virtually iterate on.\n   */\n  @Input('data')\n  set data(data: any[]) {\n    this._data = data;\n    if (this._initialized) {\n      this._calculateVirtualRows();\n    }\n    this._changeDetectorRef.markForCheck();\n  }\n  get data(): any[] {\n    return this._data;\n  }\n\n  get virtualData(): any[] {\n    return this._virtualData;\n  }\n\n  /**\n   * bottom: function\n   * Method to be executed when user scrolled to the last item of the list.\n   * An [ITdVirtualScrollBottomEvent] event is emitted\n   */\n  @Output() bottom: EventEmitter<ITdVirtualScrollBottomEvent> = new EventEmitter<ITdVirtualScrollBottomEvent>();\n\n  @ViewChildren('rowElement') _rows: QueryList<ElementRef>;\n\n  @ContentChild(TdVirtualScrollRowDirective) _rowTemplate: TdVirtualScrollRowDirective;\n\n  get rowHeight(): number {\n    if (this._rows && this._rows.toArray()[0]) {\n      return this._rows.toArray()[0].nativeElement.getBoundingClientRect().height;\n    }\n    return 0;\n  }\n\n  get totalHeight(): number {\n    return this._totalHeight;\n  }\n\n  get fromRow(): number {\n    return this._fromRow;\n  }\n\n  get toRow(): number {\n    return this._toRow;\n  }\n\n  get offsetTransform(): SafeStyle {\n    return this._offsetTransform;\n  }\n\n  constructor(private _elementRef: ElementRef,\n              private _domSanitizer: DomSanitizer,\n              private _renderer: Renderer2,\n              private _changeDetectorRef: ChangeDetectorRef) {}\n\n  ngAfterViewInit(): void {\n    this._subs.push(this._rows.changes.subscribe(() => {\n      this._calculateVirtualRows();\n    }));\n    this._initialized = true;\n    this._calculateVirtualRows();\n\n    this._subs.push(this._bottom.pipe(\n      debounceTime(SCROLL_DEBOUNCE),\n    ).subscribe(() => {\n      this.bottom.emit({\n        lastRow: this._data[this._data.length - 1],\n        lastIndex: this.toRow,\n      });\n    }));\n  }\n\n  ngAfterViewChecked(): void {\n    let newHostHeight: number = this._elementRef.nativeElement.getBoundingClientRect().height;\n    if (this._hostHeight !== newHostHeight) {\n      this._hostHeight = newHostHeight;\n      if (this._initialized) {\n        this._calculateVirtualRows();\n      }\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this._subs) {\n      this._subs.forEach((sub: Subscription) => {\n        sub.unsubscribe();\n      });\n    }\n  }\n\n  /**\n   * trackBy?: TrackByFunction\n   * This accepts the same trackBy function [ngFor] does.\n   * https://angular.io/api/core/TrackByFunction\n   */\n  @Input('trackBy') trackBy: TrackByFunction<any> =  (index: number, item: any) => {\n    return item;\n  }\n\n  @HostListener('scroll', ['$event'])\n  handleScroll(event: Event): void {\n    let element: HTMLElement = (<HTMLElement>event.target);\n    if (element) {\n      let verticalScroll: number = element.scrollTop;\n      if (this._scrollVerticalOffset !== verticalScroll) {\n        this._scrollVerticalOffset = verticalScroll;\n        if (this._initialized) {\n          this._calculateVirtualRows();\n        }\n      }\n      if (this._initialized) {\n        // check to see if bottom was hit to throw the bottom event\n        if ((this._data.length * this.rowHeight) - (verticalScroll + this._hostHeight) === 0) {\n          this._bottom.next();\n        }\n      }\n    }\n  }\n\n  /**\n   * Method to refresh and recalculate the virtual rows\n   * e.g. after changing the [data] content\n   */\n  refresh(): void {\n    this._calculateVirtualRows();\n  }\n\n  /**\n   * Method to scroll to a specific row of the list.\n   */\n  scrollTo(row: number): void {\n    this._elementRef.nativeElement.scrollTop = row * this.rowHeight;\n    this._changeDetectorRef.markForCheck();\n  }\n\n  /**\n   * Method to scroll to the start of the list.\n   */\n  scrollToStart(): void {\n    this.scrollTo(0);\n    this._changeDetectorRef.markForCheck();\n  }\n\n  /**\n   * Method to scroll to the end of the list.\n   */\n  scrollToEnd(): void {\n    this.scrollTo(this.totalHeight / this.rowHeight);\n    this._changeDetectorRef.markForCheck();\n  }\n\n  private _calculateVirtualRows(): void {\n    if (this._data) {\n      this._totalHeight = this._data.length * this.rowHeight;\n      let fromRow: number = Math.floor((this._scrollVerticalOffset / this.rowHeight)) - TD_VIRTUAL_OFFSET;\n      this._fromRow = fromRow > 0 ? fromRow : 0;\n      let range: number = Math.floor((this._hostHeight / this.rowHeight)) + (TD_VIRTUAL_OFFSET * 2);\n      let toRow: number = range + this.fromRow;\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    if (this._scrollVerticalOffset > (TD_VIRTUAL_OFFSET * this.rowHeight)) {\n      offset = this.fromRow * this.rowHeight;\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\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 { NgModule, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { TdVirtualScrollRowDirective } from './virtual-scroll-row.directive';\nimport { TdVirtualScrollContainerComponent } from './virtual-scroll-container.component';\n\nconst TD_VIRTUAL_SCROLL: Type<any>[] = [\n  TdVirtualScrollRowDirective,\n  TdVirtualScrollContainerComponent,\n];\n\n@NgModule({\n  imports: [\n    CommonModule,\n  ],\n  declarations: [\n    TD_VIRTUAL_SCROLL,\n  ],\n  exports: [\n    TD_VIRTUAL_SCROLL,\n  ],\n})\nexport class CovalentVirtualScrollModule {\n\n}\n"]}