UNPKG

igniteui-angular

Version:

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

959 lines • 101 kB
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osdUJBQXVCLEVBQzFCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQXVCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsT0FBTyxFQUFFLGNBQWMsRUFBd0IsTUFBTSxzREFBc0QsQ0FBQztBQUM1RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sa0NBQWtDLENBQUM7QUFDM0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDOUcsT0FBTyxFQUE0QyxxQkFBcUIsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBUSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQVd2RSxNQUFNLE9BQU8sNEJBQTRCOzs7Ozs7SUEwR3JDLFlBQW1CLGdCQUFxQyxFQUFTLE9BQW1CLEVBQVMs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