@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
776 lines • 107 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpY2FsLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9oaWVyYXJjaGljYWwtZ3JpZC9oaWVyYXJjaGljYWwtZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFdBQVcsRUFDWCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQU1WLFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUU3RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUF3QmhCO0lBQWtELGdEQUFnQztJQUFsRjtRQUFBLHFFQWl0QkM7UUFybkJHOztXQUVHO1FBRUksNkJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQW9IekQ7O1dBRUc7UUFDSSxxQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUU1Qjs7V0FFRztRQUNJLHNCQUFnQixHQUFHLElBQUksQ0FBQztRQUUvQjs7V0FFRztRQUNJLG9CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTlCOztXQUVHO1FBQ0ksWUFBTSxHQUFHLElBQUksQ0FBQztRQUViLHdCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUV4QixtQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixVQUFJLEdBQUcsMkJBQXlCLE9BQU8sRUFBSSxDQUFDO1FBQzVDLHdCQUFrQixHQUFrQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzlDLGVBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxnQkFBVSxHQUFHLENBQUMsQ0FBQzs7SUFtZTNCLENBQUM7cUNBanRCWSw0QkFBNEI7SUFZckMsc0JBQVcsNENBQUU7UUFUYjs7Ozs7O1dBTUc7YUFHSDtZQUNJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNyQixDQUFDOzs7T0FBQTtJQVVELHNCQUFXLDhDQUFJO1FBY2Y7Ozs7OztXQU1HO2FBQ0g7WUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdEIsQ0FBQztRQS9CRDs7Ozs7O1dBTUc7YUFFSCxVQUFnQixLQUFZO1lBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNqQjtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDMUUsNEZBQTRGO2dCQUM1RixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCO1FBQ0wsQ0FBQzs7O09BQUE7SUFxQ0Qsc0JBQVcsMkRBQWlCO1FBeEI1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztVQXNCRTthQUVGO1lBQ0ksT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkMsQ0FBQzthQUNELFVBQTZCLEdBQUc7WUFBaEMsaUJBY0M7WUFiRyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDMUM7WUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3JCLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSTtvQkFDakIsSUFBTSxHQUFHLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQWpDLENBQWlDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDbEcsT0FBTyxHQUFHLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsQ0FBQ