UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

776 lines 107 kB
import { __decorate, __extends, __metadata, __read, __spread } from "tslib"; import { ChangeDetectionStrategy, Component, HostBinding, Input, forwardRef, TemplateRef, ViewChild, ViewChildren, QueryList, ContentChildren, ElementRef, EventEmitter, Output } from '@angular/core'; import { IgxGridBaseDirective } from '../grid-base.directive'; import { GridBaseAPIService } from '../api.service'; import { IgxHierarchicalGridAPIService } from './hierarchical-grid-api.service'; import { IgxRowIslandComponent } from './row-island.component'; import { IgxChildGridRowComponent } from './child-grid-row.component'; import { IgxFilteringService } from '../filtering/grid-filtering.service'; import { DisplayDensity } from '../../core/displayDensity'; import { IgxHierarchicalGridNavigationService } from './hierarchical-grid-navigation.service'; import { IgxGridSummaryService } from '../summaries/grid-summary.service'; import { IgxHierarchicalGridBaseDirective } from './hierarchical-grid-base.directive'; import { takeUntil } from 'rxjs/operators'; import { IgxTemplateOutletDirective } from '../../directives/template-outlet/template_outlet.directive'; import { IgxGridSelectionService, IgxGridCRUDService } from '../selection/selection.service'; import { IgxTransactionService } from '../../services/index'; import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives/for-of/for_of.sync.service'; import { IgxRowIslandAPIService } from './row-island-api.service'; var NEXT_ID = 0; var IgxHierarchicalGridComponent = /** @class */ (function (_super) { __extends(IgxHierarchicalGridComponent, _super); function IgxHierarchicalGridComponent() { var _this = _super !== null && _super.apply(this, arguments) || this; /** *@hidden */ _this.hierarchicalStateChange = new EventEmitter(); /** * @hidden */ _this.childLayoutKeys = []; /** * @hidden */ _this.highlightedRowID = null; /** * @hidden */ _this.updateOnRender = false; /** * @hidden */ _this.parent = null; _this._hierarchicalState = []; _this._filteredData = null; _this.h_id = "igx-hierarchical-grid-" + NEXT_ID++; _this.childGridTemplates = new Map(); _this.scrollTop = 0; _this.scrollLeft = 0; return _this; } IgxHierarchicalGridComponent_1 = IgxHierarchicalGridComponent; Object.defineProperty(IgxHierarchicalGridComponent.prototype, "id", { /** * Sets the value of the `id` attribute. If not provided it will be automatically generated. * ```html * <igx-hierarchical-grid [id]="'igx-hgrid-1'" [data]="Data" [autoGenerate]="true"></igx-hierarchical-grid> * ``` * @memberof IgxHierarchicalGridComponent */ get: function () { return this.h_id; }, enumerable: true, configurable: true }); Object.defineProperty(IgxHierarchicalGridComponent.prototype, "data", { /** * Returns an array of data set to the `IgxHierarchicalGridComponent`. * ```typescript * let filteredData = this.grid.filteredData; * ``` * @memberof IgxHierarchicalGridComponent */ get: function () { return this._data; }, /** * An @Input property that lets you fill the `IgxHierarchicalGridComponent` with an array of data. * ```html * <igx-hierarchical-grid [data]="Data" [autoGenerate]="true"></igx-hierarchical-grid> * ``` * @memberof IgxHierarchicalGridComponent */ set: function (value) { this._data = value || []; this.summaryService.clearSummaryCache(); if (this.shouldGenerate) { this.setupColumns(); this.reflow(); } this.cdr.markForCheck(); if (this.parent && (this.height === null || this.height.indexOf('%') !== -1)) { // If the height will change based on how much data there is, recalculate sizes in igxForOf. this.notifyChanges(true); } }, enumerable: true, configurable: true }); Object.defineProperty(IgxHierarchicalGridComponent.prototype, "hierarchicalState", { /** * Sets the state of the `IgxHierarchicalGridComponent` containing which rows are expanded. * ```typescript * this.gridState = [{ rowID: 1 }, { rowID: 4}]; * ``` * ```html * <igx-hierarchical-grid [primaryKey]="'ID'" [data]="Data" [autoGenerate]="false" [hierarchicalState]="hgridState"> * <igx-column field="ID" [dataType]='number'></igx-column> * <igx-column field="Product" [dataType]='string'></igx-column> * <igx-column field="Description" [dataType]='string'></igx-column> * </igx-hierarchical-grid> * ``` * * Two-way data binding. * ```html * <igx-hierarchical-grid [primaryKey]="'ID'" [data]="Data" [autoGenerate]="false" [(hierarchicalState)]="hgridState"> * <igx-column field="ID" [dataType]='number'></igx-column> * <igx-column field="Product" [dataType]='string'></igx-column> * <igx-column field="Description" [dataType]='string'></igx-column> * </igx-hierarchical-grid> * ``` * @memberof IgxHierarchicalGridComponent */ get: function () { return this._hierarchicalState; }, set: function (val) { var _this = this; if (this._hierarchicalState !== val) { this.hierarchicalStateChange.emit(val); } if (this.hasChildrenKey) { val = val.filter(function (item) { var rec = _this.primaryKey ? _this.data.find(function (x) { return x[_this.primaryKey] === item.rowID; }) : item.rowID; return rec[_this.hasChildrenKey]; }); } this._hierarchicalState = val; if (this.parent) { this.notifyChanges(true); } }, enumerable: true, configurable: true }); Object.defineProperty(IgxHierarchicalGridComponent.prototype, "filteredData", { /** * Returns an array of objects containing the filtered data in the `IgxHierarchicalGridComponent`. * ```typescript * let filteredData = this.grid.filteredData; * ``` * @memberof IgxHierarchicalGridComponent */ get: function () { return this._filteredData; }, /** * Sets an array of objects containing the filtered data in the `IgxHierarchicalGridComponent`. * ```typescript * this.grid.filteredData = [{ * ID: 1, * Name: "A" * }]; * ``` * @memberof IgxHierarchicalGridComponent */ set: function (value) { this._filteredData = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxHierarchicalGridComponent.prototype, "expandChildren", { /** * Gets if all immediate children of the `IgxHierarchicalGridComponent` previously have been set to be expanded/collapsed. * If previously set and some rows have been manually expanded/collapsed it will still return the last set value. * ```typescript * const expanded = this.grid.expandChildren; * ``` * @memberof IgxHierarchicalGridComponent */ get: function () { return this._expandChildren; }, /** * Sets if all immediate children of the `IgxHierarchicalGridComponent` should be expanded/collapsed. * Defult value is false. * ```html * <igx-hierarchical-grid [id]="'igx-grid-1'" [data]="Data" [autoGenerate]="true" [expandChildren]="true"></igx-hierarchical-grid> * ``` * @memberof IgxHierarchicalGridComponent */ set: function (value) { var _this = this; this._expandChildren = value; if (value && this.data) { this.hierarchicalState = this.data.map(function (rec) { return { rowID: _this.primaryKey ? rec[_this.primaryKey] : rec }; }); } else if (this.data) { this.hierarchicalState = []; } }, enumerable: true, configurable: true }); Object.defineProperty(IgxHierarchicalGridComponent.prototype, "foreignKey", { /** * Gets the unique identifier of the parent row. It may be a `string` or `number` if `primaryKey` of the * parent grid is set or an object reference of the parent record otherwise. * ```typescript * const foreignKey = this.grid.foreignKey; * ``` * @memberof IgxHierarchicalGridComponent */ get: function () { if (!this.parent) { return null; } return this.parent.hgridAPI.getParentRowId(this); }, enumerable: true, configurable: true }); Object.defineProperty(IgxHierarchicalGridComponent.prototype, "hasExpandableChildren", { /** * @hidden */ get: function () { return !!this.childLayoutKeys.length; }, enumerable: true, configurable: true }); /** * @hidden */ IgxHierarchicalGridComponent.prototype.ngOnInit = function () { if (this._transactions instanceof IgxTransactionService) { // transaction service cannot be injected in a derived class in a factory manner this._transactions = new IgxTransactionService(); } _super.prototype.ngOnInit.call(this); }; IgxHierarchicalGridComponent.prototype.ngDoCheck = function () { if (this._cdrRequestRepaint && !this._init) { this.updateSizes(); } _super.prototype.ngDoCheck.call(this); }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.ngAfterViewInit = function () { var _this = this; _super.prototype.ngAfterViewInit.call(this); this.verticalScrollContainer.getScroll().addEventListener('scroll', this.hg_verticalScrollHandler.bind(this)); this.headerContainer.getScroll().addEventListener('scroll', this.hg_horizontalScrollHandler.bind(this)); if (this.expandChildren && this.data && this.hierarchicalState.length !== this.data.length) { this.hierarchicalState = this.data.map(function (rec) { return { rowID: _this.primaryKey ? rec[_this.primaryKey] : rec }; }); this.cdr.detectChanges(); } this.verticalScrollContainer.onBeforeViewDestroyed.pipe(takeUntil(this.destroy$)).subscribe(function (view) { var rowData = view.context.$implicit; if (_this.isChildGridRecord(rowData)) { var cachedData = _this.childGridTemplates.get(rowData.rowID); if (cachedData) { var tmlpOutlet = cachedData.owner; tmlpOutlet._viewContainerRef.detach(0); } } }); if (this.parent) { this._displayDensity = this.rootGrid._displayDensity; this.rootGrid.onDensityChanged.pipe(takeUntil(this.destroy$)).subscribe(function () { _this._displayDensity = _this.rootGrid._displayDensity; _this.notifyChanges(true); _this.cdr.markForCheck(); }); this.childLayoutKeys = this.parentIsland.children.map(function (item) { return item.key; }); } this.toolbarCustomContentTemplates = this.parentIsland ? this.parentIsland.toolbarCustomContentTemplates : this.toolbarCustomContentTemplates; this.headSelectorsTemplates = this.parentIsland ? this.parentIsland.headSelectorsTemplates : this.headSelectorsTemplates; this.rowSelectorsTemplates = this.parentIsland ? this.parentIsland.rowSelectorsTemplates : this.rowSelectorsTemplates; this.dragIndicatorIconTemplate = this.parentIsland ? this.parentIsland.dragIndicatorIconTemplate : this.dragIndicatorIconTemplate; this.rowExpandedIndicatorTemplate = this.rootGrid.rowExpandedIndicatorTemplate; this.rowCollapsedIndicatorTemplate = this.rootGrid.rowCollapsedIndicatorTemplate; this.headerCollapseIndicatorTemplate = this.rootGrid.headerCollapseIndicatorTemplate; this.headerExpandIndicatorTemplate = this.rootGrid.headerExpandIndicatorTemplate; this.hasChildrenKey = this.parentIsland ? this.parentIsland.hasChildrenKey || this.rootGrid.hasChildrenKey : this.rootGrid.hasChildrenKey; this.showExpandAll = this.parentIsland ? this.parentIsland.showExpandAll : this.rootGrid.showExpandAll; }; IgxHierarchicalGridComponent.prototype.updateSizes = function () { if (document.body.contains(this.nativeElement) && this.isPercentWidth) { this.reflow(); this.hgridAPI.getChildGrids(false).forEach(function (grid) { grid.updateSizes(); }); } }; IgxHierarchicalGridComponent.prototype._shouldAutoSize = function (renderedHeight) { if (this.isPercentHeight && this.parent) { return true; } return _super.prototype._shouldAutoSize.call(this, renderedHeight); }; Object.defineProperty(IgxHierarchicalGridComponent.prototype, "outletDirective", { get: function () { return this.rootGrid._outletDirective; }, enumerable: true, configurable: true }); /** * @hidden */ IgxHierarchicalGridComponent.prototype.ngAfterContentInit = function () { var _this = this; this.updateColumnList(false); this.childLayoutKeys = this.parent ? this.parentIsland.children.map(function (item) { return item.key; }) : this.childLayoutKeys = this.childLayoutList.map(function (item) { return item.key; }); this.childLayoutList.notifyOnChanges(); this.childLayoutList.changes.pipe(takeUntil(this.destroy$)) .subscribe(function () { return _this.onRowIslandChange(); }); _super.prototype.ngAfterContentInit.call(this); }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.onRowIslandChange = function () { if (this.parent) { this.childLayoutKeys = this.parentIsland.children.filter(function (item) { return !item._destroyed; }).map(function (item) { return item.key; }); } else { this.childLayoutKeys = this.childLayoutList.filter(function (item) { return !item._destroyed; }).map(function (item) { return item.key; }); } if (!this.cdr.destroyed) { this.cdr.detectChanges(); } }; IgxHierarchicalGridComponent.prototype.onColumnsChanged = function (change) { var _this = this; this.updateColumnList(); var cols = change.filter(function (c) { return c.gridAPI.grid === _this; }); if (cols.length > 0) { this.columnList.reset(cols); _super.prototype.onColumnsChanged.call(this, this.columnList); } }; IgxHierarchicalGridComponent.prototype.updateColumnList = function (recalcColSizes) { if (recalcColSizes === void 0) { recalcColSizes = true; } var childLayouts = this.parent ? this.childLayoutList : this.allLayoutList; var nestedColumns = childLayouts.map(function (layout) { return layout.columnList.toArray(); }); var colsArray = [].concat.apply([], nestedColumns); var colLength = this.columnList.length; if (colsArray.length > 0) { var topCols = this.columnList.filter(function (item) { return colsArray.indexOf(item) === -1; }); this.columnList.reset(topCols); if (recalcColSizes && this.columnList.length !== colLength) { this.calculateGridSizes(); } } }; IgxHierarchicalGridComponent.prototype.ngOnDestroy = function () { if (!this.parent) { this.hgridAPI.getChildGrids(true).forEach(function (grid) { if (!grid.childRow.cdr.destroyed) { grid.childRow.cdr.destroy(); } }); } if (this.parent && this.selectionService.activeElement) { // in case selection is in destroyed child grid, selection should be cleared. this._clearSeletionHighlights(); } _super.prototype.ngOnDestroy.call(this); }; IgxHierarchicalGridComponent.prototype._clearSeletionHighlights = function () { __spread([this.rootGrid], this.rootGrid.getChildGrids(true)).forEach(function (grid) { grid.selectionService.clear(); grid.selectionService.activeElement = null; grid.nativeElement.classList.remove('igx-grid__tr--highlighted'); grid.highlightedRowID = null; grid.cdr.markForCheck(); }); }; Object.defineProperty(IgxHierarchicalGridComponent.prototype, "template", { /** * @hidden */ get: function () { if (this.filteredData && this.filteredData.length === 0) { return this.emptyGridTemplate ? this.emptyGridTemplate : this.emptyFilteredGridTemplate; } if (this.isLoading && (!this.data || this.dataLength === 0)) { return this.loadingGridTemplate ? this.loadingGridTemplate : this.loadingGridDefaultTemplate; } if (this.dataLength === 0) { return this.emptyGridTemplate ? this.emptyGridTemplate : this.emptyGridDefaultTemplate; } }, enumerable: true, configurable: true }); /** * @hidden * Gets the combined width of the columns that are specific to the enabled grid features. They are fixed. * TODO: Remove for Angular 8. Calling parent class getter using super is not supported for now. */ IgxHierarchicalGridComponent.prototype.getFeatureColumnsWidth = function () { var width = _super.prototype.getFeatureColumnsWidth.call(this); if (this.hasExpandableChildren) { width += this.headerHierarchyExpander.nativeElement.offsetWidth || this.getDefaultExpanderWidth(); } return width; }; IgxHierarchicalGridComponent.prototype.getDefaultExpanderWidth = function () { switch (this.displayDensity) { case DisplayDensity.cosy: return 57; case DisplayDensity.compact: return 49; default: return 72; } }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.isRowHighlighted = function (rowData) { return this.highlightedRowID === rowData.rowID; }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.isHierarchicalRecord = function (record) { return this.childLayoutList.length !== 0 && record[this.childLayoutList.first.key]; }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.isChildGridRecord = function (record) { // Can be null when there is defined layout but no child data was found return record.childGridsData !== undefined; }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.trackChanges = function (index, rec) { if (rec.childGridsData !== undefined) { // if is child rec return rec.rowID; } return rec; }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.getContext = function (rowData) { if (this.isChildGridRecord(rowData)) { var cachedData = this.childGridTemplates.get(rowData.rowID); if (cachedData) { var view = cachedData.view; var tmlpOutlet = cachedData.owner; return { $implicit: rowData, moveView: view, owner: tmlpOutlet, index: this.dataView.indexOf(rowData) }; } else { var rowID = this.primaryKey ? rowData.rowID : this.data.indexOf(rowData.rowID); // child rows contain unique grids, hence should have unique templates return { $implicit: rowData, templateID: 'childRow-' + rowID, index: this.dataView.indexOf(rowData) }; } } else { return { $implicit: rowData, templateID: 'dataRow', index: this.dataView.indexOf(rowData) }; } }; Object.defineProperty(IgxHierarchicalGridComponent.prototype, "rootGrid", { /** * @hidden */ get: function () { var currGrid = this; while (currGrid.parent) { currGrid = currGrid.parent; } return currGrid; }, enumerable: true, configurable: true }); Object.defineProperty(IgxHierarchicalGridComponent.prototype, "iconTemplate", { /** * @hidden */ get: function () { var expanded = this.hierarchicalState.length > 0 && this.hasExpandableChildren; if (!expanded && this.showExpandAll) { return this.headerCollapseIndicatorTemplate || this.defaultCollapsedTemplate; } else { return this.headerExpandIndicatorTemplate || this.defaultExpandedTemplate; } }, enumerable: true, configurable: true }); /** * @hidden * @internal */ IgxHierarchicalGridComponent.prototype.getDragGhostCustomTemplate = function () { if (this.parentIsland) { return this.parentIsland.getDragGhostCustomTemplate(); } return _super.prototype.getDragGhostCustomTemplate.call(this); }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.initColumns = function (collection, cb) { if (cb === void 0) { cb = null; } if (this.hasColumnLayouts) { // invalid configuration - hierarchical grid should not allow column layouts // remove column layouts var nonColumnLayoutColumns = this.columnList.filter(function (col) { return !col.columnLayout && !col.columnLayoutChild; }); this.columnList.reset(nonColumnLayoutColumns); } _super.prototype.initColumns.call(this, collection, cb); }; /** * @hidden * Gets the visible content height that includes header + tbody + footer. * For hierarchical child grid it may be scrolled and not fully visible. */ IgxHierarchicalGridComponent.prototype.getVisibleContentHeight = function () { var height = _super.prototype.getVisibleContentHeight.call(this); if (this.parent) { var rootHeight = this.rootGrid.getVisibleContentHeight(); var topDiff = this.nativeElement.getBoundingClientRect().top - this.rootGrid.nativeElement.getBoundingClientRect().top; height = rootHeight - topDiff > height ? height : rootHeight - topDiff; } return height; }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.toggleAll = function () { var expanded = this.hierarchicalState.length > 0 && this.hasExpandableChildren; if (!expanded && this.showExpandAll) { this.expandAll(); } else { this.collapseAll(); } }; /** * Collapses all rows of the current hierarchical grid. * ```typescript * this.grid.collapseAll(); * ``` * @memberof IgxHierarchicalGridComponent */ IgxHierarchicalGridComponent.prototype.collapseAll = function () { this.hierarchicalState = []; }; /** * Expands all rows of the current hierarchical grid. * ```typescript * this.grid.expandAll(); * ``` * @memberof IgxHierarchicalGridComponent */ IgxHierarchicalGridComponent.prototype.expandAll = function () { var _this = this; if (this.data) { this.hierarchicalState = this.data.map(function (rec) { return { rowID: _this.primaryKey ? rec[_this.primaryKey] : rec }; }); } }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.isExpanded = function (record) { var _this = this; var inState; if (record.childGridsData !== undefined) { inState = !!this.hierarchicalState.find(function (v) { return v.rowID === record.rowID; }); } else { inState = !!this.hierarchicalState.find(function (v) { return _this.primaryKey ? v.rowID === record[_this.primaryKey] : v.rowID === record; }); } return inState && this.childLayoutList.length !== 0; }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.viewCreatedHandler = function (args) { if (this.isChildGridRecord(args.context.$implicit)) { var key = args.context.$implicit.rowID; this.childGridTemplates.set(key, args); } }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.viewMovedHandler = function (args) { var _this = this; if (this.isChildGridRecord(args.context.$implicit)) { // view was moved, update owner in cache var key = args.context.$implicit.rowID; var cachedData = this.childGridTemplates.get(key); cachedData.owner = args.owner; this.childLayoutList.forEach(function (layout) { var relatedGrid = _this.hgridAPI.getChildGridByID(layout.key, args.context.$implicit.rowID); if (relatedGrid && relatedGrid.updateOnRender) { // Detect changes if `expandChildren` has changed when the grid wasn't visible. This is for performance reasons. relatedGrid.notifyChanges(true); relatedGrid.updateOnRender = false; } }); var childGrids = this.getChildGrids(true); childGrids.forEach(function (grid) { if (grid.isPercentWidth) { grid.notifyChanges(true); } grid.updateScrollPosition(); }); } }; /** * @hidden */ IgxHierarchicalGridComponent.prototype.updateScrollPosition = function () { var vScr = this.verticalScrollContainer.getScroll(); var hScr = this.headerContainer.getScroll(); if (vScr) { vScr.scrollTop = this.scrollTop; } if (hScr) { hScr.scrollLeft = this.scrollLeft; } }; IgxHierarchicalGridComponent.prototype.getChildGrids = function (inDeph) { return this.hgridAPI.getChildGrids(inDeph); }; IgxHierarchicalGridComponent.prototype.generateDataFields = function (data) { var _this = this; return _super.prototype.generateDataFields.call(this, data).filter(function (field) { var layoutsList = _this.parentIsland ? _this.parentIsland.children : _this.childLayoutList; var keys = layoutsList.map(function (item) { return item.key; }); return keys.indexOf(field) === -1; }); }; IgxHierarchicalGridComponent.prototype.hg_verticalScrollHandler = function (event) { this.scrollTop = event.target.scrollTop; }; IgxHierarchicalGridComponent.prototype.onContainerScroll = function () { this.hideOverlays(); }; IgxHierarchicalGridComponent.prototype.hg_horizontalScrollHandler = function (event) { this.scrollLeft = event.target.scrollLeft; }; var IgxHierarchicalGridComponent_1; __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", String), __metadata("design:paramtypes", []) ], IgxHierarchicalGridComponent.prototype, "id", null); __decorate([ Input(), __metadata("design:type", Array), __metadata("design:paramtypes", [Array]) ], IgxHierarchicalGridComponent.prototype, "data", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxHierarchicalGridComponent.prototype, "hierarchicalState", null); __decorate([ Output(), __metadata("design:type", Object) ], IgxHierarchicalGridComponent.prototype, "hierarchicalStateChange", void 0); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxHierarchicalGridComponent.prototype, "expandChildren", null); __decorate([ ContentChildren(IgxRowIslandComponent, { read: IgxRowIslandComponent, descendants: false }), __metadata("design:type", QueryList) ], IgxHierarchicalGridComponent.prototype, "childLayoutList", void 0); __decorate([ ContentChildren(IgxRowIslandComponent, { read: IgxRowIslandComponent, descendants: true }), __metadata("design:type", QueryList) ], IgxHierarchicalGridComponent.prototype, "allLayoutList", void 0); __decorate([ ViewChild('hierarchical_record_template', { read: TemplateRef, static: true }), __metadata("design:type", TemplateRef) ], IgxHierarchicalGridComponent.prototype, "hierarchicalRecordTemplate", void 0); __decorate([ ViewChild('child_record_template', { read: TemplateRef, static: true }), __metadata("design:type", TemplateRef) ], IgxHierarchicalGridComponent.prototype, "childTemplate", void 0); __decorate([ ViewChild('headerHierarchyExpander', { read: ElementRef, static: true }), __metadata("design:type", ElementRef) ], IgxHierarchicalGridComponent.prototype, "headerHierarchyExpander", void 0); __decorate([ ViewChildren(IgxTemplateOutletDirective, { read: IgxTemplateOutletDirective }), __metadata("design:type", QueryList) ], IgxHierarchicalGridComponent.prototype, "templateOutlets", void 0); __decorate([ ViewChildren(IgxChildGridRowComponent, { read: IgxChildGridRowComponent }), __metadata("design:type", QueryList) ], IgxHierarchicalGridComponent.prototype, "hierarchicalRows", void 0); IgxHierarchicalGridComponent = IgxHierarchicalGridComponent_1 = __decorate([ Component({ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-hierarchical-grid', template: "<igx-grid-toolbar role=\"rowgroup\" [style.flex-basis.px]=\"outerWidth\" *ngIf=\"showToolbar\" [gridID]=\"id\"\n [displayDensity]=\"displayDensity\" #toolbar>\n</igx-grid-toolbar>\n\n<div class=\"igx-grid__thead\">\n <div class=\"igx-grid__thead-wrapper\" role=\"rowgroup\" [style.width.px]='calcWidth' #theadRow>\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]='calcWidth'>\n <span *ngIf=\"hasMovableColumns && draggedColumn && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && draggedColumn && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <div #headerHierarchyExpander (click)=\"toggleAll()\" [hidden]='!hasExpandableChildren || !hasVisibleColumns' [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header': hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': isRowSelectable || rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: { $implicit: this }\"></ng-container>\n </div>\n <ng-container *ngIf=\"rowDraggable\">\n <div class=\"igx-grid__drag-indicator\" [ngClass]=\"{\n 'igx-grid__drag-indicator--header': !isRowSelectable\n }\" #headerDragContainer>\n <div style=\"visibility: hidden;\">\n <ng-container\n *ngTemplateOutlet=\"this.dragIndicatorIconTemplate ? this.dragIndicatorIconTemplate : this.dragIndicatorIconBase\">\n </ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showRowSelectors\">\n <div class=\"igx-grid__cbx-selection\" (click)=\"onHeaderSelectorClick($event)\" #headerSelectorContainer [ngClass]=\"{\n 'igx-grid__cbx-selection--push': filteringService.isFilterRowVisible\n }\">\n <ng-template #headSelector\n *ngTemplateOutlet=\"\n this.headSelectorTemplate ? this.headSelectorTemplate : headSelectorBaseTemplate;\n context: { $implicit: {\n selectedCount: this.selectionService.filteredSelectedRowIds.length,\n totalCount: this.totalRowsCountAfterFilter,\n selectAll: selectAllRows.bind(this),\n deselectAll: deselectAllRows.bind(this) }}\">\n </ng-template>\n </div>\n </ng-container>\n <ng-container *ngIf=\"pinnedColumns.length > 0\">\n <ng-template ngFor let-col [ngForOf]=\"pinnedColumns | igxTopLevel\">\n <igx-grid-header-group [column]=\"col\" [gridID]=\"id\" [style.min-width]=\"getHeaderGroupWidth(col)\"\n [style.flex-basis]=\"getHeaderGroupWidth(col)\"></igx-grid-header-group>\n </ng-template>\n </ng-container>\n <ng-template igxGridFor let-col [igxGridForOf]=\"unpinnedColumns | igxTopLevel\"\n [igxForScrollOrientation]=\"'horizontal'\" [igxForScrollContainer]=\"parentVirtDir\"\n [igxForContainerSize]='unpinnedWidth' [igxForTrackBy]='trackColumnChanges'\n [igxForSizePropName]='\"calcPixelWidth\"' #hContainer>\n <igx-grid-header-group [column]=\"col\" [gridID]=\"id\" [style.min-width]=\"getHeaderGroupWidth(col)\"\n [style.flex-basis]=\"getHeaderGroupWidth(col)\"></igx-grid-header-group>\n </ng-template>\n </div>\n <igx-grid-filtering-row #filteringRow [style.width.px]='calcWidth' *ngIf=\"filteringService.isFilterRowVisible\"\n [column]=\"filteringService.filteredColumn\"></igx-grid-filtering-row>\n </div>\n <div [style.display]=\"shouldOverlayLoading ? 'flex' : 'none'\" #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && draggedColumn\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__thead-thumb\" [hidden]='!hasVerticalSroll()' [style.width.px]=\"scrollWidth\"></div>\n</div>\n\n<div igxGridBody (keydown.control.c)=\"copyHandlerIE()\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\">\n <div class=\"igx-grid__tbody-content\" (onDragStop)=\"selectionService.dragMode = $event\"\n (onDragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\" role=\"rowgroup\"\n [style.height.px]='calcHeight' [style.width.px]='calcWidth' #tbody (scroll)='scrollHandler($event)'>\n <span *ngIf=\"hasMovableColumns && draggedColumn && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && draggedColumn && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | gridTransaction:id:pipeTrigger\n | visibleColumns:hasVisibleColumns\n | gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger\n | gridSort:sortingExpressions:sortStrategy:id:pipeTrigger\n | gridHierarchicalPaging:page:perPage:id:pipeTrigger\n | gridHierarchical:hierarchicalState:id:primaryKey:childLayoutKeys:pipeTrigger\" let-rowIndex=\"index\"\n [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight' [igxForItemSize]=\"renderedRowHeight\" [igxForTrackBy]='trackChanges'\n #verticalScrollContainer (onChunkPreload)=\"dataLoading($event)\">\n <ng-template #hierarchical_record_template>\n <igx-hierarchical-grid-row [gridID]=\"id\" [index]=\"rowIndex\" [rowData]=\"rowData\" #row>\n </igx-hierarchical-grid-row>\n </ng-template>\n <ng-template #child_record_template let-rowIndex=\"index\" let-rowData>\n <div style=\"overflow:auto;width: 100%;\" [attr.data-rowindex]='rowIndex' (scroll)='onContainerScroll()'\n [ngClass]=\"{\n 'igx-grid__tr-container': true,\n 'igx-grid__tr--highlighted':isRowHighlighted(rowData)\n }\">\n <igx-child-grid-row *ngFor=\"let layout of childLayoutList\" [parentGridID]=\"id\" [index]=\"rowIndex\"\n [rowData]=\"rowData\" [layout]='layout' #row>\n </igx-child-grid-row>\n </div>\n </ng-template>\n <ng-template\n [igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template))'\n [igxTemplateOutletContext]='getContext(rowData)' (onViewCreated)='viewCreatedHandler($event)'\n (onViewMoved)='viewMovedHandler($event)' (onCachedViewLoaded)='cachedViewLoaded($event)'\n (onBeforeViewDetach)='viewDetachHandler($event)'></ng-template>\n <!-- <ng-container *igxTemplateOutlet=\"(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)\"></ng-container> -->\n </ng-template>\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <span *ngIf=\"hasMovableColumns && draggedColumn\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div class=\"igx-grid__row-editing-outlet\" igxOverlayOutlet #igxRowEditingOverlayOutlet></div>\n </div>\n <span *ngIf=\"hasMovableColumns && draggedColumn\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalSroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollWidth\"\n [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n</div>\n\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" [style.height.px]='summariesHeight' #tfoot>\n <igx-grid-summary-row [style.width.px]='calcWidth' [style.height.px]='summariesHeight'\n *ngIf=\"hasSummarizedColumns && rootSummariesEnabled\" [gridID]=\"id\"\n [summaries]=\"id | igxGridSummaryDataPipe:summaryService.retriggerRootPipe\" [index]=\"0\"\n class=\"igx-grid__summaries\" #summaryRow>\n </igx-grid-summary-row>\n <div class=\"igx-grid__tfoot-thumb\" [hidden]='!hasVerticalSroll()' [style.height.px]='summariesHeight'\n [style.width.px]=\"scrollWidth\"></div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height]=\"'18px'\" #scr [hidden]=\"isHorizontalScrollHidden\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0\"></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>\n </ng-template>\n </div>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n <ng-container *ngIf=\"paging && totalRecords\">\n <ng-container\n *ngTemplateOutlet=\"paginationTemplate ? paginationTemplate : defaultPaginator; context: {$implicit: this}\">\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #defaultPaginator>\n <igx-paginator [displayDensity]=\"displayDensity\" [(page)]=\"page\" [totalRecords]=\"totalRecords\" [(perPage)]=\"perPage\">\n </igx-paginator>\n</ng-template>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\">{{emptyFilteredGridMessage}}</span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\">{{emptyGridMessage}}</span>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n\n<ng-template #defaultCollapsedTemplate>\n <igx-icon role=\"button\" fontSet=\"material\">unfold_more</igx-icon>\n</ng-template>\n\n<ng-template #defaultExpandedTemplate>\n <igx-icon role=\"button\" [isActive]='hierarchicalState.length > 0 && hasExpandableChildren' [isActive]='true' fontSet=\"material\">unfold_less</igx-icon>\n</ng-template>\n\n<div *ngIf=\"rowEditable\" igxToggle>\n <div [className]=\"bannerClass\">\n <ng-container\n *ngTemplateOutlet=\"rowEditContainer; context: { rowChangesCount: rowChangesCount, endEdit: endEdit.bind(this) }\">\n </ng-container>\n </div>\n</div>\n<ng-template #defaultRowEditText>\n You have {{ rowChangesCount }} changes in this row\n</ng-template>\n<ng-template #defaultRowEditActions>\n <button igxButton igxRowEditTabStop (click)=\"endEdit(false, $event)\">Cancel</button>\n <button igxButton igxRowEditTabStop (click)=\"endEdit(true, $event)\">Done</button>\n</ng-template>\n<ng-template #defaultRowEditTemplate>\n <div class=\"igx-banner__message\">\n <span class=\"igx-banner__text\">\n <ng-container\n *ngTemplateOutlet=\"rowEditText ? rowEditText : defaultRowEditText; context: { $implicit: rowChangesCount }\">\n </ng-container>\n </span>\n </div>\n <div class=\"igx-banner__actions\">\n <div class=\"igx-banner__row\">\n <ng-container\n *ngTemplateOutlet=\"rowEditActions ? rowEditActions : defaultRowEditActions; context: { $implicit: endEdit.bind(this) }\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n <igx-icon fontSet=\"material\">drag_indicator</igx-icon>\n</ng-template>\n\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && context.totalCount === context.selectedCount\"\n disableRipple=\"true\"\n [ngStyle]=\"{'visibility': isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && context.selectedCount !== context.totalCount\"\n [aria-label]=\"headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n\n<igx-grid-column-resizer *ngIf=\"colResizingService.showResizer\"></igx-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n", providers: [ IgxGridSelectionService, IgxGridCRUDService, { provide: GridBaseAPIService, useClass: IgxHierarchicalGridAPIService }, { provide: IgxGridBaseDirective, useExisting: forwardRef(function () { return IgxHierarchicalGridComponent_1; }) }, IgxGridSummaryService, IgxFilteringService, IgxHierarchicalGridNavigationService, IgxForOfSyncService, IgxForOfScrollSyncService, IgxRowIslandAPIService ] }) ], IgxHierarchicalGridComponent); return IgxHierarchicalGridComponent; }(IgxHierarchicalGridBaseDirective)); export { IgxHierarchicalGridComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFdBQVcsRUFDWCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQU1WLFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN4RyxPQUFPLEVB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