igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
959 lines • 101 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, Input, TemplateRef, ViewChild, ViewChildren, QueryList, ElementRef, HostBinding, HostListener, ChangeDetectionStrategy } from '@angular/core';
import { DataType } from '../../data-operations/data-util';
import { IgxColumnComponent } from '../column.component';
import { IgxDropDownComponent } from '../../drop-down/index';
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
import { HorizontalAlignment, VerticalAlignment } from '../../services/overlay/utilities';
import { ConnectedPositioningStrategy } from '../../services/overlay/position/connected-positioning-strategy';
import { IgxChipsAreaComponent } from '../../chips';
import { ExpressionUI } from './grid-filtering.service';
import { IgxFilteringService } from './grid-filtering.service';
import { isEdge } from '../../core/utils';
import { AbsoluteScrollStrategy } from '../../services/overlay/scroll';
/**
* @hidden
*/
export class IgxGridFilteringRowComponent {
/**
* @param {?} filteringService
* @param {?} element
* @param {?} cdr
*/
constructor(filteringService, element, cdr) {
this.filteringService = filteringService;
this.element = element;
this.cdr = cdr;
this._positionSettings = {
horizontalStartPoint: HorizontalAlignment.Left,
verticalStartPoint: VerticalAlignment.Bottom
};
this._conditionsOverlaySettings = {
excludePositionTarget: true,
closeOnOutsideClick: true,
modal: false,
scrollStrategy: new AbsoluteScrollStrategy(),
positionStrategy: new ConnectedPositioningStrategy(this._positionSettings)
};
this._operatorsOverlaySettings = {
excludePositionTarget: true,
closeOnOutsideClick: true,
modal: false,
scrollStrategy: new AbsoluteScrollStrategy(),
positionStrategy: new ConnectedPositioningStrategy(this._positionSettings)
};
this.chipAreaScrollOffset = 0;
this._column = null;
this.isKeyPressed = false;
this.isComposing = false;
this.cssClass = 'igx-grid__filtering-row';
}
/**
* @return {?}
*/
get column() {
return this._column;
}
/**
* @param {?} val
* @return {?}
*/
set column(val) {
if (val) {
this._column = val;
this.expressionsList = this.filteringService.getExpressions(this._column.field);
this.resetExpression();
this.chipAreaScrollOffset = 0;
this.transform(this.chipAreaScrollOffset);
}
}
/**
* @return {?}
*/
get value() {
return this.expression ? this.expression.searchVal : null;
}
/**
* @param {?} val
* @return {?}
*/
set value(val) {
if (!val && val !== 0) {
this.expression.searchVal = null;
this.showHideArrowButtons();
}
else {
this.expression.searchVal = this.transformValue(val);
if (this.expressionsList.find(item => item.expression === this.expression) === undefined) {
this.addExpression(true);
}
}
this.filter();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this._conditionsOverlaySettings.outlet = this.column.grid.outletDirective;
this._operatorsOverlaySettings.outlet = this.column.grid.outletDirective;
this.input.nativeElement.focus();
}
/**
* @param {?} event
* @return {?}
*/
onTabKeydown(event) {
event.stopPropagation();
if (document.activeElement === this.closeButton.nativeElement && !event.shiftKey) {
this.filteringService.grid.navigation.navigateFirstCellIfPossible(event);
}
}
/**
* @param {?} event
* @return {?}
*/
onEscKeydown(event) {
event.preventDefault();
event.stopPropagation();
this.close();
}
/**
* @return {?}
*/
get disabled() {
return !(this.column.filteringExpressionsTree && this.column.filteringExpressionsTree.filteringOperands.length > 0);
}
/**
* @return {?}
*/
get template() {
if (this.column.dataType === DataType.Date) {
return this.defaultDateUI;
}
return this.defaultFilterUI;
}
/**
* @return {?}
*/
get type() {
switch (this.column.dataType) {
case DataType.String:
case DataType.Boolean:
return 'text';
case DataType.Number:
return 'number';
}
}
/**
* @return {?}
*/
get conditions() {
return this.column.filters.conditionList();
}
/**
* @return {?}
*/
get isUnaryCondition() {
if (this.expression.condition) {
return this.expression.condition.isUnary;
}
else {
return true;
}
}
/**
* @return {?}
*/
get placeholder() {
if (this.expression.condition && this.expression.condition.isUnary) {
return this.filteringService.getChipLabel(this.expression);
}
else if (this.column.dataType === DataType.Date) {
return this.filteringService.grid.resourceStrings.igx_grid_filter_row_date_placeholder;
}
else if (this.column.dataType === DataType.Boolean) {
return this.filteringService.grid.resourceStrings.igx_grid_filter_row_boolean_placeholder;
}
else {
return this.filteringService.grid.resourceStrings.igx_grid_filter_row_placeholder;
}
}
/**
* Event handler for keydown on the input group's prefix.
* @param {?} event
* @return {?}
*/
onPrefixKeyDown(event) {
if ((event.key === "Enter" /* ENTER */ || event.key === " " /* SPACE */ || event.key === "Spacebar" /* SPACE_IE */) &&
this.dropDownConditions.collapsed) {
this.toggleConditionsDropDown(this.inputGroupPrefix.nativeElement);
event.stopImmediatePropagation();
}
else if (event.key === "Tab" /* TAB */) {
if (event.shiftKey) {
event.preventDefault();
event.stopPropagation();
}
else if (!this.dropDownConditions.collapsed) {
this.toggleConditionsDropDown(this.inputGroupPrefix.nativeElement);
}
}
}
/**
* Event handler for keydown on the input.
* @param {?} event
* @return {?}
*/
onInputKeyDown(event) {
this.isKeyPressed = true;
if (this.column.dataType === DataType.Boolean) {
if (event.key === "Enter" /* ENTER */ || event.key === " " /* SPACE */ || event.key === "Spacebar" /* SPACE_IE */) {
this.inputGroupPrefix.nativeElement.focus();
this.toggleConditionsDropDown(this.inputGroupPrefix.nativeElement);
event.stopPropagation();
return;
}
}
if (event.key === "Enter" /* ENTER */) {
if (this.isComposing) {
return;
}
this.commitInput();
}
else if (event.altKey && (event.key === "ArrowDown" /* DOWN_ARROW */ || event.key === "Down" /* DOWN_ARROW_IE */)) {
this.inputGroupPrefix.nativeElement.focus();
this.toggleConditionsDropDown(this.inputGroupPrefix.nativeElement);
}
else if (event.key === "Escape" /* ESCAPE */ || event.key === "Esc" /* ESCAPE_IE */) {
event.preventDefault();
this.close();
}
event.stopPropagation();
}
/**
* Event handler for keyup on the input.
* @param {?} eventArgs
* @return {?}
*/
onInputKeyUp(eventArgs) {
this.isKeyPressed = false;
}
/**
* Event handler for input on the input.
* @param {?} eventArgs
* @return {?}
*/
onInput(eventArgs) {
// The 'iskeyPressed' flag is needed for a case in IE, because the input event is fired on focus and for some reason,
// when you have a japanese character as a placeholder, on init the value here is empty string .
if (isEdge() || this.isKeyPressed || eventArgs.target.value) {
this.value = eventArgs.target.value;
}
}
/**
* Event handler for compositionstart on the input.
* @return {?}
*/
onCompositionStart() {
this.isComposing = true;
}
/**
* Event handler for compositionend on the input.
* @return {?}
*/
onCompositionEnd() {
this.isComposing = false;
}
/**
* Event handler for input click event.
* @return {?}
*/
onInputClick() {
if (this.column.dataType === DataType.Boolean && this.dropDownConditions.collapsed) {
this.inputGroupPrefix.nativeElement.focus();
this.toggleConditionsDropDown(this.inputGroupPrefix.nativeElement);
}
}
/**
* Event handler for datepicker's close.
* @return {?}
*/
datePickerClose() {
this.input.nativeElement.focus();
}
/**
* Returns the filtering operation condition for a given value.
* @param {?} value
* @return {?}
*/
getCondition(value) {
return this.column.filters.condition(value);
}
/**
* Returns the translated condition name for a given value.
* @param {?} value
* @return {?}
*/
translateCondition(value) {
return this.filteringService.grid.resourceStrings[`igx_grid_filter_${this.getCondition(value).name}`] || value;
}
/**
* Returns the icon name of the current condition.
* @return {?}
*/
getIconName() {
if (this.column.dataType === DataType.Boolean && this.expression.condition === null) {
return this.getCondition(this.conditions[0]).iconName;
}
else {
return this.expression.condition.iconName;
}
}
/**
* Returns whether a given condition is selected in dropdown.
* @param {?} conditionName
* @return {?}
*/
isConditionSelected(conditionName) {
if (this.expression.condition) {
return this.expression.condition.name === conditionName;
}
else {
return false;
}
}
/**
* Clears the current filtering.
* @return {?}
*/
clearFiltering() {
this.filteringService.clearFilter(this.column.field);
this.resetExpression();
if (this.input) {
this.input.nativeElement.focus();
}
this.cdr.detectChanges();
this.chipAreaScrollOffset = 0;
this.transform(this.chipAreaScrollOffset);
}
/**
* Commits the value of the input.
* @return {?}
*/
commitInput() {
this.chipsArea.chipsList.filter(chip => chip.selected = false);
/** @type {?} */
let indexToDeselect = -1;
for (let index = 0; index < this.expressionsList.length; index++) {
/** @type {?} */
const expression = this.expressionsList[index].expression;
if (expression.searchVal === null && !expression.condition.isUnary) {
indexToDeselect = index;
}
}
if (indexToDeselect !== -1) {
this.removeExpression(indexToDeselect, this.expression);
}
this.resetExpression();
this.scrollChipsWhenAddingExpression();
}
/**
* Clears the value of the input.
* @return {?}
*/
clearInput() {
this.value = null;
}
/**
* Event handler for keydown on clear button.
* @param {?} eventArgs
* @return {?}
*/
onClearKeyDown(eventArgs) {
if (eventArgs.key === "Enter" /* ENTER */ || eventArgs.key === " " /* SPACE */ || eventArgs.key === "Spacebar" /* SPACE_IE */) {
eventArgs.preventDefault();
this.clearInput();
this.input.nativeElement.focus();
}
}
/**
* Event handler for click on clear button.
* @return {?}
*/
onClearClick() {
this.clearInput();
this.input.nativeElement.focus();
}
/**
* Event handler for keydown on commit button.
* @param {?} eventArgs
* @return {?}
*/
onCommitKeyDown(eventArgs) {
if (eventArgs.key === "Enter" /* ENTER */ || eventArgs.key === " " /* SPACE */ || eventArgs.key === "Spacebar" /* SPACE_IE */) {
eventArgs.preventDefault();
this.commitInput();
this.input.nativeElement.focus();
}
}
/**
* Event handler for click on commit button.
* @return {?}
*/
onCommitClick() {
this.commitInput();
this.input.nativeElement.focus();
}
/**
* Event handler for focusout on the input group.
* @return {?}
*/
onInputGroupFocusout() {
if (!this.value && this.value !== 0) {
return;
}
requestAnimationFrame(() => {
/** @type {?} */
const focusedElement = document.activeElement;
if (!(focusedElement && this.inputGroup.nativeElement.contains(focusedElement)) &&
this.dropDownConditions.collapsed) {
this.commitInput();
}
});
}
/**
* Closes the filtering edit row.
* @return {?}
*/
close() {
if (this.expressionsList.length === 1 &&
this.expressionsList[0].expression.searchVal === null &&
this.expressionsList[0].expression.condition.isUnary === false) {
this.filteringService.getExpressions(this.column.field).pop();
}
else {
this.expressionsList.forEach((item) => {
if (item.expression.searchVal === null && !item.expression.condition.isUnary) {
this.filteringService.removeExpression(this.column.field, this.expressionsList.indexOf(item));
}
});
}
this.filteringService.isFilterRowVisible = false;
this.filteringService.updateFilteringCell(this.column);
this.filteringService.focusFilterCellChip(this.column, true);
this.filteringService.filteredColumn = null;
this.filteringService.selectedExpression = null;
this.cdr.detectChanges();
this.chipAreaScrollOffset = 0;
this.transform(this.chipAreaScrollOffset);
}
/*
* Opens date-picker if condition is not unary
*/
/**
* @param {?} openDialog
* @return {?}
*/
openDatePicker(openDialog) {
if (!this.expression.condition.isUnary) {
openDialog();
}
}
/**
* Event handler for date picker's selection.
* @param {?} value
* @return {?}
*/
onDateSelected(value) {
this.value = value;
this.commitInput();
}
/**
* Opens the conditions dropdown.
* @param {?} target
* @return {?}
*/
toggleConditionsDropDown(target) {
this._conditionsOverlaySettings.positionStrategy.settings.target = target;
this.dropDownConditions.toggle(this._conditionsOverlaySettings);
}
/**
* Opens the logic operators dropdown.
* @param {?} eventArgs
* @param {?} index
* @return {?}
*/
toggleOperatorsDropDown(eventArgs, index) {
this._operatorsOverlaySettings.positionStrategy.settings.target = eventArgs.target.parentElement;
this.dropDownOperators.toArray()[index].toggle(this._operatorsOverlaySettings);
}
/**
* Event handler for change event in conditions dropdown.
* @param {?} eventArgs
* @return {?}
*/
onConditionsChanged(eventArgs) {
/** @type {?} */
const value = ((/** @type {?} */ (eventArgs.newSelection))).value;
this.expression.condition = this.getCondition(value);
if (this.expression.condition.isUnary) {
// update grid's filtering on the next cycle to ensure the drop-down is closed
// if the drop-down is not closed this event handler will be invoked multiple times
requestAnimationFrame(() => this.unaryConditionChangedCallback());
}
else {
requestAnimationFrame(() => this.conditionChangedCallback());
}
if (this.input) {
// Add requestAnimationFrame becasue of an issue in IE, where you are still able to write in the input,
// if it has been focused and then set to readonly.
requestAnimationFrame(() => this.input.nativeElement.focus());
}
}
/**
* Event handler for chip selected event.
* @param {?} eventArgs
* @param {?} expression
* @return {?}
*/
onChipSelected(eventArgs, expression) {
if (eventArgs.selected) {
if (this.chipsArea.chipsList) {
this.chipsArea.chipsList.forEach((chip) => {
if (chip !== eventArgs.owner) {
chip.selected = false;
}
});
}
this.expression = expression;
if (this.input) {
this.input.nativeElement.focus();
}
}
else if (this.expression === expression) {
this.resetExpression();
}
}
/**
* Event handler for chip keydown event.
* @param {?} eventArgs
* @param {?} chip
* @return {?}
*/
onChipKeyDown(eventArgs, chip) {
if (eventArgs.key === "Enter" /* ENTER */) {
eventArgs.preventDefault();
chip.selected = !chip.selected;
}
}
/**
* Scrolls the first chip into view if the tab key is pressed on the left arrow.
* @param {?} event
* @return {?}
*/
onLeftArrowKeyDown(event) {
if (event.key === "Tab" /* TAB */) {
this.chipAreaScrollOffset = 0;
this.transform(this.chipAreaScrollOffset);
}
}
/**
* Event handler for chip removed event.
* @param {?} eventArgs
* @param {?} item
* @return {?}
*/
onChipRemoved(eventArgs, item) {
/** @type {?} */
const indexToRemove = this.expressionsList.indexOf(item);
this.removeExpression(indexToRemove, item.expression);
this.scrollChipsOnRemove();
}
/**
* Event handler for logic operator changed event.
* @param {?} eventArgs
* @param {?} expression
* @return {?}
*/
onLogicOperatorChanged(eventArgs, expression) {
if (eventArgs.oldSelection) {
expression.afterOperator = ((/** @type {?} */ (eventArgs.newSelection))).value;
this.expressionsList[this.expressionsList.indexOf(expression) + 1].beforeOperator = expression.afterOperator;
// update grid's filtering on the next cycle to ensure the drop-down is closed
// if the drop-down is not closed this event handler will be invoked multiple times
requestAnimationFrame(() => this.filter());
}
}
/**
* Scrolls the chips into the chip area when left or right arrows are pressed.
* @param {?} arrowPosition
* @return {?}
*/
scrollChipsOnArrowPress(arrowPosition) {
/** @type {?} */
let count = 0;
/** @type {?} */
const chipAraeChildren = this.chipsArea.element.nativeElement.children;
/** @type {?} */
const containerRect = this.container.nativeElement.getBoundingClientRect();
if (arrowPosition === 'right') {
for (let index = 0; index < chipAraeChildren.length; index++) {
if (Math.ceil(chipAraeChildren[index].getBoundingClientRect().right) < Math.ceil(containerRect.right)) {
count++;
}
}
if (count < chipAraeChildren.length) {
this.chipAreaScrollOffset -= Math.ceil(chipAraeChildren[count].getBoundingClientRect().right) -
Math.ceil(containerRect.right) + 1;
this.transform(this.chipAreaScrollOffset);
}
}
if (arrowPosition === 'left') {
for (let index = 0; index < chipAraeChildren.length; index++) {
if (Math.ceil(chipAraeChildren[index].getBoundingClientRect().left) < Math.ceil(containerRect.left)) {
count++;
}
}
if (count > 0) {
this.chipAreaScrollOffset += Math.ceil(containerRect.left) -
Math.ceil(chipAraeChildren[count - 1].getBoundingClientRect().left) + 1;
this.transform(this.chipAreaScrollOffset);
}
}
}
/**
* @private
* @return {?}
*/
showHideArrowButtons() {
requestAnimationFrame(() => {
if (this.filteringService.isFilterRowVisible) {
/** @type {?} */
const containerWidth = this.container.nativeElement.getBoundingClientRect().width;
this.chipsAreaWidth = this.chipsArea.element.nativeElement.getBoundingClientRect().width;
this.showArrows = this.chipsAreaWidth >= containerWidth && this.isColumnFiltered;
// TODO: revise the cdr.detectChanges() usage here
this.cdr.detectChanges();
}
});
}
/**
* @private
* @param {?} value
* @return {?}
*/
transformValue(value) {
if (this.column.dataType === DataType.Number) {
value = parseFloat(value);
}
else if (this.column.dataType === DataType.Boolean) {
value = Boolean(value);
}
return value;
}
/**
* @private
* @param {?} isSelected
* @return {?}
*/
addExpression(isSelected) {
/** @type {?} */
const exprUI = new ExpressionUI();
exprUI.expression = this.expression;
exprUI.beforeOperator = this.expressionsList.length > 0 ? FilteringLogic.And : null;
exprUI.isSelected = isSelected;
this.expressionsList.push(exprUI);
/** @type {?} */
const length = this.expressionsList.length;
if (this.expressionsList[length - 2]) {
this.expressionsList[length - 2].afterOperator = this.expressionsList[length - 1].beforeOperator;
}
this.showHideArrowButtons();
}
/**
* @private
* @param {?} indexToRemove
* @param {?} expression
* @return {?}
*/
removeExpression(indexToRemove, expression) {
if (indexToRemove === 0 && this.expressionsList.length === 1) {
this.clearFiltering();
return;
}
this.filteringService.removeExpression(this.column.field, indexToRemove);
this.filter();
if (this.expression === expression) {
this.resetExpression();
}
this.showHideArrowButtons();
}
/**
* @private
* @return {?}
*/
resetExpression() {
this.expression = {
fieldName: this.column.field,
condition: null,
searchVal: null,
ignoreCase: this.column.filteringIgnoreCase
};
if (this.column.dataType !== DataType.Boolean) {
this.expression.condition = this.getCondition(this.conditions[0]);
}
if (this.column.dataType === DataType.Date && this.input) {
this.input.nativeElement.value = null;
}
this.showHideArrowButtons();
}
/**
* @private
* @return {?}
*/
scrollChipsWhenAddingExpression() {
/** @type {?} */
const chipAraeChildren = this.chipsArea.element.nativeElement.children;
if (!chipAraeChildren || chipAraeChildren.length === 0) {
return;
}
/** @type {?} */
const containerRectRight = Math.ceil(this.container.nativeElement.getBoundingClientRect().right);
/** @type {?} */
const lastChipRectRight = Math.ceil(chipAraeChildren[chipAraeChildren.length - 1].getBoundingClientRect().right);
if (lastChipRectRight >= containerRectRight) {
this.chipAreaScrollOffset -= lastChipRectRight - containerRectRight;
this.transform(this.chipAreaScrollOffset);
}
}
/**
* @hidden
* Resets the chips area
* \@memberof IgxGridFilteringRowComponent
* @return {?}
*/
resetChipsArea() {
this.chipAreaScrollOffset = 0;
this.transform(this.chipAreaScrollOffset);
this.showHideArrowButtons();
}
/**
* @private
* @param {?} offset
* @return {?}
*/
transform(offset) {
requestAnimationFrame(() => {
this.chipsArea.element.nativeElement.style.transform = `translate(${offset}px)`;
});
}
/**
* @private
* @return {?}
*/
scrollChipsOnRemove() {
/** @type {?} */
let count = 0;
/** @type {?} */
const chipAraeChildren = this.chipsArea.element.nativeElement.children;
/** @type {?} */
const containerRect = this.container.nativeElement.getBoundingClientRect();
for (let index = 0; index < chipAraeChildren.length; index++) {
if (Math.ceil(chipAraeChildren[index].getBoundingClientRect().left) < Math.ceil(containerRect.left)) {
count++;
}
}
if (count <= 2) {
this.chipAreaScrollOffset = 0;
}
else {
/** @type {?} */
const dif = chipAraeChildren[count].id === 'chip' ? count - 2 : count - 1;
this.chipAreaScrollOffset += Math.ceil(containerRect.left) - Math.ceil(chipAraeChildren[dif].getBoundingClientRect().left) + 1;
}
this.transform(this.chipAreaScrollOffset);
}
/**
* @private
* @return {?}
*/
conditionChangedCallback() {
if (!!this.expression.searchVal || this.expression.searchVal === 0) {
this.filter();
}
else if (this.value) {
this.value = null;
}
}
/**
* @private
* @return {?}
*/
unaryConditionChangedCallback() {
if (this.value) {
this.value = null;
}
if (this.expressionsList.find(item => item.expression === this.expression) === undefined) {
this.addExpression(true);
}
this.filter();
}
/**
* @private
* @return {?}
*/
filter() {
this.filteringService.filterInternal(this.column.field);
}
/**
* @private
* @return {?}
*/
get isColumnFiltered() {
return this.column.filteringExpressionsTree && this.column.filteringExpressionsTree.filteringOperands.length > 0;
}
}
IgxGridFilteringRowComponent.decorators = [
{ type: Component, args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-grid-filtering-row',
template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [height]=\"'200px'\" (onSelection)=\"onConditionsChanged($event)\">\n <igx-drop-down-item\n *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <igx-icon fontSet=\"filtering-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span style=\"margin-left: 16px\">{{ translateCondition(condition) }}</span>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"'compact'\" [supressInputAutofocus]=\"true\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"toggleConditionsDropDown(inputGroupPrefix)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon fontSet=\"filtering-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp($event)\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker\n tabindex=\"0\"\n mode=\"dropdown\"\n [value]=\"value\"\n [outlet]=\"filteringService.grid.outletDirective\"\n [locale]=\"filteringService.grid.locale\"\n (onSelection)=\"onDateSelected($event)\"\n (onClose)=\"datePickerClose()\">\n <ng-template igxDatePickerTemplate let-openDialog=\"openDialog\">\n <igx-input-group #dropDownTarget type=\"box\" [displayDensity]=\"'compact'\" [supressInputAutofocus]=\"true\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"toggleConditionsDropDown(inputGroupPrefix)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon fontSet=\"filtering-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <input #input\n igxInput\n tabindex=\"0\"\n (click)=\"openDatePicker(openDialog)\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value | igxdate: filteringService.grid.locale\"\n [readonly]=\"true\"\n (keydown)=\"onInputKeyDown($event)\"/>\n <igx-suffix *ngIf=\"value\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput()\" tabindex=\"0\">\n <igx-icon>clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n </ng-template>\n </igx-date-picker>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id='chip'\n (onSelection)=\"onChipSelected($event, item.expression)\"\n (keydown)=\"onChipKeyDown($event, chip)\"\n (onRemove)=\"onChipRemoved($event, item)\"\n [selectable]=\"true\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"'cosy'\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n fontSet=\"filtering-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id='operand' *ngIf=\"!last\">\n <button igxButton (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down #operators (onSelection)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer class=\"igx-grid__filtering-row-editing-buttons\">\n <button igxButton igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">{{filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</button>\n <button #closeButton igxButton igxRipple (click)=\"close()\">{{filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</button>\n</div>\n"
}] }
];
/** @nocollapse */
IgxGridFilteringRowComponent.ctorParameters = () => [
{ type: IgxFilteringService },
{ type: ElementRef },
{ type: ChangeDetectorRef }
];
IgxGridFilteringRowComponent.propDecorators = {
column: [{ type: Input }],
value: [{ type: Input }],
defaultFilterUI: [{ type: ViewChild, args: ['defaultFilterUI', { read: TemplateRef },] }],
defaultDateUI: [{ type: ViewChild, args: ['defaultDateUI', { read: TemplateRef },] }],
input: [{ type: ViewChild, args: ['input', { read: ElementRef },] }],
dropDownConditions: [{ type: ViewChild, args: ['inputGroupConditions', { read: IgxDropDownComponent },] }],
chipsArea: [{ type: ViewChild, args: ['chipsArea', { read: IgxChipsAreaComponent },] }],
dropDownOperators: [{ type: ViewChildren, args: ['operators', { read: IgxDropDownComponent },] }],
inputGroup: [{ type: ViewChild, args: ['inputGroup', { read: ElementRef },] }],
inputGroupPrefix: [{ type: ViewChild, args: ['inputGroupPrefix', { read: ElementRef },] }],
container: [{ type: ViewChild, args: ['container',] }],
operand: [{ type: ViewChild, args: ['operand',] }],
closeButton: [{ type: ViewChild, args: ['closeButton',] }],
cssClass: [{ type: HostBinding, args: ['class.igx-grid__filtering-row',] }],
onTabKeydown: [{ type: HostListener, args: ['keydown.shift.tab', ['$event'],] }, { type: HostListener, args: ['keydown.tab', ['$event'],] }],
onEscKeydown: [{ type: HostListener, args: ['keydown.esc', ['$event'],] }]
};
if (false) {
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype._positionSettings;
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype._conditionsOverlaySettings;
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype._operatorsOverlaySettings;
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype.chipsAreaWidth;
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype.chipAreaScrollOffset;
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype._column;
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype.isKeyPressed;
/**
* @type {?}
* @private
*/
IgxGridFilteringRowComponent.prototype.isComposing;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.showArrows;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.expression;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.expressionsList;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.defaultFilterUI;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.defaultDateUI;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.input;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.dropDownConditions;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.chipsArea;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.dropDownOperators;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.inputGroup;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.inputGroupPrefix;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.container;
/**
* @type {?}
* @protected
*/
IgxGridFilteringRowComponent.prototype.operand;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.closeButton;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.cssClass;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.filteringService;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.element;
/** @type {?} */
IgxGridFilteringRowComponent.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osdUJBQXVCLEVBQzFCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQXVCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsT0FBTyxFQUFFLGNBQWMsRUFBd0IsTUFBTSxzREFBc0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sa0NBQWtDLENBQUM7QUFDM0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDOUcsT0FBTyxFQUE0QyxxQkFBcUIsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBUSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQVd2RSxNQUFNLE9BQU8sNEJBQTRCOzs7Ozs7SUEwR3JDLFlBQW1CLGdCQUFxQyxFQUFTLE9BQW1CLEVBQVMsR0FBc0I7UUFBaEcscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFxQjtRQUFTLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXhHM0csc0JBQWlCLEdBQUc7WUFDeEIsb0JBQW9CLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtZQUM5QyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO1NBQy9DLENBQUM7UUFFTSwrQkFBMEIsR0FBb0I7WUFDbEQscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLEtBQUssRUFBRSxLQUFLO1lBQ1osY0FBYyxFQUFFLElBQUksc0JBQXNCLEVBQUU7WUFDNUMsZ0JBQWdCLEVBQUUsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7U0FDN0UsQ0FBQztRQUVNLDhCQUF5QixHQUFvQjtZQUNqRCxxQkFBcUIsRUFBRSxJQUFJO1lBQzNCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsS0FBSyxFQUFFLEtBQUs7WUFDWixjQUFjLEVBQUUsSUFBSSxzQkFBc0IsRUFBRTtZQUM1QyxnQkFBZ0IsRUFBRSxJQUFJLDRCQUE0QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUM3RSxDQUFDO1FBR00seUJBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQTZFckIsYUFBUSxHQUFHLHlCQUF5QixDQUFDO0lBRTJFLENBQUM7Ozs7SUF6RXhILElBQ0ksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOzs7OztJQUVELElBQUksTUFBTSxDQUFDLEdBQUc7UUFDVixJQUFJLEdBQUcsRUFBRTtZQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBRW5CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWhGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV2QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDN0M7SUFDTCxDQUFDOzs7O0lBRUQsSUFDSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUM7Ozs7O0lBRUQsSUFBSSxLQUFLLENBQUMsR0FBRztRQUNULElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDL0I7YUFBTTtZQUNILElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDdEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QjtTQUNKO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7Ozs7SUF3Q0QsZUFBZTtRQUNYLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRXpFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7Ozs7O0lBSU0sWUFBWSxDQUFDLEtBQUs7UUFDckIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksUUFBUSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDOUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUU7SUFDTCxDQUFDOzs7OztJQUdNLFlBQVksQ0FBQyxLQUFLO1FBQ3JCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7Ozs7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hILENBQUM7Ozs7SUFFRCxJQUFJLFFBQVE7UUFDUixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQzdCO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFFRCxJQUFJLElBQUk7UUFDSixRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQzFCLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNyQixLQUFLLFFBQVEsQ0FBQyxPQUFPO2dCQUNqQixPQUFPLE1BQU0sQ0FBQztZQUNsQixLQUFLLFFBQVEsQ0FBQyxNQUFNO2dCQUNoQixPQUFPLFFBQVEsQ0FBQztTQUN2QjtJQUNMLENBQUM7Ozs7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9DLENBQUM7Ozs7SUFFRCxJQUFJLGdCQUFnQjtRQUNoQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1NBQzVDO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQzs7OztJQUVELElBQUksV0FBVztRQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ2hFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDOUQ7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDL0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQ0FBb0MsQ0FBQztTQUMxRjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHVDQUF1QyxDQUFDO1NBQzdGO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLCtCQUErQixDQUFDO1NBQ3JGO0lBQ0wsQ0FBQzs7Ozs7O0lBS00sZUFBZSxDQUFDLEtBQW9CO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyx3QkFBZSxJQUFJLEtBQUssQ0FBQyxHQUFHLG9CQUFlLElBQUksS0FBSyxDQUFDLEdBQUcsOEJBQWtCLENBQUM7WUFDckYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRTtZQUNuQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25FLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1NBQ3BDO2FBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxvQkFBYSxFQUFFO1lBQy9CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDaEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDM0I7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDdEU7U0FDSjtJQUNMLENBQUM7Ozs7OztJQUtNLGNBQWMsQ0FBQyxLQUFvQjtRQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDM0MsSUFBSSxLQUFLLENBQUMsR0FBRyx3QkFBZSxJQUFJLEtBQUssQ0FBQyxHQUFHLG9CQUFlLElBQUksS0FBSyxDQUFDLEdBQUcsOEJBQWtCLEVBQUU7Z0JBQ3JGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEIsT0FBTzthQUNWO1NBQ0o7UUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLHdCQUFlLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixPQUFPO2FBQ1Y7WUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEI7YUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxpQ0FBb0IsSUFBSSxLQUFLLENBQUMsR0FBRywrQkFBdUIsQ0FBQyxFQUFFO1lBQzVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN0RTthQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsMEJBQWdCLElBQUksS0FBSyxDQUFDLEdBQUcsMEJBQW1CLEVBQUU7WUFDbEUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQjtRQUNELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QixDQUFDOzs7Ozs7SUFLTSxZQUFZLENBQUMsU0FBUztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDOzs7Ozs7SUFLTSxPQUFPLENBQUMsU0FBUztRQUNwQixxSEFBcUg7UUFDckgsZ0dBQWdHO1FBQ2hHLElBQUksTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3ZDO0lBQ0wsQ0FBQzs7Ozs7SUFLTSxrQkFBa0I7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQzs7Ozs7SUFLTSxnQkFBZ0I7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQzs7Ozs7SUFLTSxZQUFZO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7WUFDaEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3RFO0lBQ0wsQ0FBQzs7Ozs7SUFLTSxlQUFlO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7Ozs7OztJQUtNLFlBQVksQ0FBQyxLQUFhO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7Ozs7OztJQUtNLGtCQUFrQixDQUFDLEtBQWE7UUFDbkMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNuSCxDQUFDOzs7OztJQUtNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQ2pGLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1NBQ3pEO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztTQUM3QztJQUNMLENBQUM7Ozs7OztJQUtNLG1CQUFtQixDQUFDLGFBQXFCO1FBQzVDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDO1NBQzNEO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7Ozs7O0lBS00sY0FBYztRQUNqQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDOUMsQ0FBQzs7Ozs7SUFLTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQzs7WUFDM0QsZUFBZSxHQUFHLENBQUMsQ0FBQztRQUN4QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7O2tCQUN4RCxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVO1lBQ3pELElBQUksVUFBVSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtnQkFDaEUsZUFBZSxHQUFHLEtBQUssQ0FBQzthQUMzQjtTQUNKO1FBQ0QsSUFBSSxlQUFlLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0Q7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7SUFDM0MsQ0FBQzs7Ozs7SUFLTSxVQUFVO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQzs7Ozs7O0lBS00sY0FBYyxDQUFDLFNBQXdCO1FBQzFDLElBQUksU0FBUyxDQUFDLEdBQUcsd0JBQWUsSUFBSSxTQUFTLENBQUMsR0FBRyxvQkFBZSxJQUFJLFNBQVMsQ0FBQyxHQUFHLDhCQUFrQixFQUFFO1lBQ2pHLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDcEM7SUFDTCxDQUFDOzs7OztJQUtNLFlBQVk7UUFDZixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckMsQ0FBQzs7Ozs7O0lBS00sZUFBZSxDQUFDLFNBQXdCO1FBQzNDLElBQUksU0FBUyxDQUFDLEdBQUcsd0JBQWUsSUFBSSxTQUFTLENBQUMsR0FBRyxvQkFBZSxJQUFJLFNBQVMsQ0FBQyxHQUFHLDhCQUFrQixFQUFFO1lBQ2pHLFNBQVMsQ0FBQyxjQUFjLEV