igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
904 lines • 98.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, ViewChild, HostBinding, ChangeDetectionStrategy, TemplateRef, Directive, ElementRef } from '@angular/core';
import { HorizontalAlignment, VerticalAlignment, ConnectedPositioningStrategy, AbsoluteScrollStrategy } from '../../../services/index';
import { IgxStringFilteringOperand, IgxNumberFilteringOperand, IgxBooleanFilteringOperand, IgxDateFilteringOperand, InFilteringOperation, InDateFilteringOperation } from '../../../data-operations/filtering-condition';
import { FilteringExpressionsTree } from '../../../data-operations/filtering-expressions-tree';
import { FilteringLogic } from '../../../data-operations/filtering-expression.interface';
import { cloneArray } from '../../../core/utils';
import { DataType, DataUtil } from '../../../data-operations/data-util';
import { IgxExcelStyleSearchComponent } from './excel-style-search.component';
import { IgxExcelStyleCustomDialogComponent } from './excel-style-custom-dialog.component';
import { Subscription, Subject } from 'rxjs';
import { IgxExcelStyleSortingComponent } from './excel-style-sorting.component';
import { takeUntil } from 'rxjs/operators';
import { IgxDropDownComponent } from '../../../drop-down';
/**
* @hidden
*/
export class FilterListItem {
constructor() {
this.isSpecial = false;
}
}
if (false) {
/** @type {?} */
FilterListItem.prototype.value;
/** @type {?} */
FilterListItem.prototype.label;
/** @type {?} */
FilterListItem.prototype.isSelected;
/** @type {?} */
FilterListItem.prototype.indeterminate;
/** @type {?} */
FilterListItem.prototype.isSpecial;
}
export class IgxExcelStyleSortingTemplateDirective {
/**
* @param {?} template
*/
constructor(template) {
this.template = template;
}
}
IgxExcelStyleSortingTemplateDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxExcelStyleSortingTemplate]'
},] }
];
/** @nocollapse */
IgxExcelStyleSortingTemplateDirective.ctorParameters = () => [
{ type: TemplateRef }
];
if (false) {
/** @type {?} */
IgxExcelStyleSortingTemplateDirective.prototype.template;
}
export class IgxExcelStyleMovingTemplateDirective {
/**
* @param {?} template
*/
constructor(template) {
this.template = template;
}
}
IgxExcelStyleMovingTemplateDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxExcelStyleMovingTemplate]'
},] }
];
/** @nocollapse */
IgxExcelStyleMovingTemplateDirective.ctorParameters = () => [
{ type: TemplateRef }
];
if (false) {
/** @type {?} */
IgxExcelStyleMovingTemplateDirective.prototype.template;
}
export class IgxExcelStyleHidingTemplateDirective {
/**
* @param {?} template
*/
constructor(template) {
this.template = template;
}
}
IgxExcelStyleHidingTemplateDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxExcelStyleHidingTemplate]'
},] }
];
/** @nocollapse */
IgxExcelStyleHidingTemplateDirective.ctorParameters = () => [
{ type: TemplateRef }
];
if (false) {
/** @type {?} */
IgxExcelStyleHidingTemplateDirective.prototype.template;
}
export class IgxExcelStylePinningTemplateDirective {
/**
* @param {?} template
*/
constructor(template) {
this.template = template;
}
}
IgxExcelStylePinningTemplateDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxExcelStylePinningTemplate]'
},] }
];
/** @nocollapse */
IgxExcelStylePinningTemplateDirective.ctorParameters = () => [
{ type: TemplateRef }
];
if (false) {
/** @type {?} */
IgxExcelStylePinningTemplateDirective.prototype.template;
}
/**
* @hidden
*/
export class IgxGridExcelStyleFilteringComponent {
/**
* @param {?} cdr
*/
constructor(cdr) {
this.cdr = cdr;
this.shouldOpenSubMenu = true;
this.expressionsList = new Array();
this.destroy$ = new Subject();
this.containsNullOrEmpty = false;
this.selectAllSelected = true;
this.selectAllIndeterminate = false;
this.filterValues = new Set();
this.columnMoving = new Subscription();
this.listData = new Array();
this.uniqueValues = [];
this._subMenuPositionSettings = {
verticalStartPoint: VerticalAlignment.Top
};
this._subMenuOverlaySettings = {
closeOnOutsideClick: true,
modal: false,
positionStrategy: new ConnectedPositioningStrategy(this._subMenuPositionSettings),
scrollStrategy: new AbsoluteScrollStrategy()
};
this.className = 'igx-excel-filter';
}
/**
* @return {?}
*/
get grid() {
return this.filteringService.grid;
}
/**
* @return {?}
*/
get conditions() {
return this.column.filters.conditionList();
}
/**
* @return {?}
*/
get subMenuText() {
switch (this.column.dataType) {
case DataType.Boolean:
return this.grid.resourceStrings.igx_grid_excel_boolean_filter;
case DataType.Number:
return this.grid.resourceStrings.igx_grid_excel_number_filter;
case DataType.Date:
return this.grid.resourceStrings.igx_grid_excel_date_filter;
default:
return this.grid.resourceStrings.igx_grid_excel_text_filter;
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.destroy$.next(true);
this.destroy$.complete();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.expressionsList = new Array();
this.filteringService.generateExpressionsList(this.column.filteringExpressionsTree, this.grid.filteringLogic, this.expressionsList);
if (this.expressionsList && this.expressionsList.length &&
this.expressionsList[0].expression.condition.name !== 'in') {
this.customDialog.expressionsList = this.expressionsList;
}
this.populateColumnData();
if (this.excelStyleSorting) {
/** @type {?} */
const se = this.grid.sortingExpressions.find(expr => expr.fieldName === this.column.field);
if (se) {
this.excelStyleSorting.selectButton(se.dir);
}
}
requestAnimationFrame(() => {
this.excelStyleSearch.searchInput.nativeElement.focus();
});
}
/**
* @return {?}
*/
clearFilterClass() {
if (this.column.filteringExpressionsTree) {
return 'igx-excel-filter__actions-clear';
}
return 'igx-excel-filter__actions-clear--disabled';
}
/**
* @param {?} column
* @param {?} filteringService
* @param {?} overlayService
* @param {?} overlayComponentId
* @return {?}
*/
initialize(column, filteringService, overlayService, overlayComponentId) {
this.column = column;
this.filteringService = filteringService;
this.overlayService = overlayService;
this.overlayComponentId = overlayComponentId;
this._subMenuOverlaySettings.outlet = this.grid.outlet;
this.columnMoving = this.grid.onColumnMoving.pipe(takeUntil(this.destroy$)).subscribe(() => {
this.closeDropdown();
});
}
/**
* 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.grid.resourceStrings[`igx_grid_filter_${this.getCondition(value).name}`] || value;
}
/**
* @return {?}
*/
onPin() {
this.column.pinned = !this.column.pinned;
this.closeDropdown();
}
/**
* @return {?}
*/
onHide() {
this.column.hidden = true;
this.grid.onColumnVisibilityChanged.emit({ column: this.column, newValue: true });
this.closeDropdown();
}
/**
* @param {?} eventArgs
* @return {?}
*/
onTextFilterClick(eventArgs) {
if (this.shouldOpenSubMenu) {
this._subMenuOverlaySettings.positionStrategy.settings.target = eventArgs.currentTarget;
/** @type {?} */
const gridRect = this.grid.nativeElement.getBoundingClientRect();
/** @type {?} */
const dropdownRect = this.mainDropdown.nativeElement.getBoundingClientRect();
/** @type {?} */
let x = dropdownRect.left + dropdownRect.width;
/** @type {?} */
let x1 = gridRect.left + gridRect.width;
x += window.pageXOffset;
x1 += window.pageXOffset;
if (Math.abs(x - x1) < 200) {
this._subMenuOverlaySettings.positionStrategy.settings.horizontalDirection = HorizontalAlignment.Left;
this._subMenuOverlaySettings.positionStrategy.settings.horizontalStartPoint = HorizontalAlignment.Left;
}
else {
this._subMenuOverlaySettings.positionStrategy.settings.horizontalDirection = HorizontalAlignment.Right;
this._subMenuOverlaySettings.positionStrategy.settings.horizontalStartPoint = HorizontalAlignment.Right;
}
this.subMenu.open(this._subMenuOverlaySettings);
this.shouldOpenSubMenu = false;
}
}
/**
* @param {?} eventArgs
* @return {?}
*/
onTextFilterKeyDown(eventArgs) {
if (eventArgs.key === "Enter" /* ENTER */) {
this.onTextFilterClick(eventArgs);
}
}
/**
* @return {?}
*/
onSubMenuClosed() {
requestAnimationFrame(() => {
this.shouldOpenSubMenu = true;
});
}
/**
* @param {?} eventArgs
* @return {?}
*/
onSubMenuSelection(eventArgs) {
this.customDialog.selectedOperator = eventArgs.newSelection.value;
eventArgs.cancel = true;
this.mainDropdown.nativeElement.style.display = 'none';
this.subMenu.close();
this.customDialog.open();
}
/**
* @private
* @return {?}
*/
areExpressionsSelectable() {
if (this.expressionsList.length === 1 &&
(this.expressionsList[0].expression.condition.name === 'equals' ||
this.expressionsList[0].expression.condition.name === 'true' ||
this.expressionsList[0].expression.condition.name === 'false' ||
this.expressionsList[0].expression.condition.name === 'empty' ||
this.expressionsList[0].expression.condition.name === 'in')) {
return true;
}
/** @type {?} */
const selectableExpressionsCount = this.expressionsList.filter(exp => (exp.beforeOperator === 1 || exp.afterOperator === 1) &&
(exp.expression.condition.name === 'equals' ||
exp.expression.condition.name === 'true' ||
exp.expression.condition.name === 'false' ||
exp.expression.condition.name === 'empty' ||
exp.expression.condition.name === 'in')).length;
return selectableExpressionsCount === this.expressionsList.length;
}
/**
* @private
* @return {?}
*/
areExpressionsValuesInTheList() {
if (this.column.dataType === DataType.Boolean) {
return true;
}
if (this.filterValues.size === 1) {
/** @type {?} */
const firstValue = this.filterValues.values().next().value;
if (!firstValue && firstValue !== 0) {
return true;
}
}
for (let index = 0; index < this.uniqueValues.length; index++) {
if (this.filterValues.has(this.uniqueValues[index])) {
return true;
}
}
return false;
}
/**
* @return {?}
*/
populateColumnData() {
/** @type {?} */
let data = this.column.gridAPI.get_all_data(this.grid.id);
/** @type {?} */
const gridExpressionsTree = this.grid.filteringExpressionsTree;
/** @type {?} */
const expressionsTree = new FilteringExpressionsTree(gridExpressionsTree.operator, gridExpressionsTree.fieldName);
for (const operand of gridExpressionsTree.filteringOperands) {
if (operand instanceof FilteringExpressionsTree) {
/** @type {?} */
const columnExprTree = (/** @type {?} */ (operand));
if (columnExprTree.fieldName === this.column.field) {
break;
}
}
expressionsTree.filteringOperands.push(operand);
}
if (expressionsTree.filteringOperands.length) {
/** @type {?} */
const state = { expressionsTree: expressionsTree };
data = DataUtil.filter(cloneArray(data), state);
}
if (this.column.dataType === DataType.Date) {
this.uniqueValues = Array.from(new Set(data.map(record => record[this.column.field] ? record[this.column.field].toDateString() : record[this.column.field])));
this.filterValues = new Set(this.expressionsList.reduce((arr, e) => {
if (e.expression.condition.name === 'in') {
return [...arr, ...Array.from(((/** @type {?} */ (e.expression.searchVal))).values()).map(v => new Date(v).toDateString())];
}
return [...arr, ...[e.expression.searchVal ? e.expression.searchVal.toDateString() : e.expression.searchVal]];
}, []));
}
else {
this.uniqueValues = Array.from(new Set(data.map(record => record[this.column.field])));
this.filterValues = new Set(this.expressionsList.reduce((arr, e) => {
if (e.expression.condition.name === 'in') {
return [...arr, ...Array.from(((/** @type {?} */ (e.expression.searchVal))).values())];
}
return [...arr, ...[e.expression.searchVal]];
}, []));
}
this.listData = new Array();
/** @type {?} */
const shouldUpdateSelection = this.areExpressionsSelectable() && this.areExpressionsValuesInTheList();
if (this.column.dataType === DataType.Boolean) {
this.addBooleanItems();
}
else {
this.addItems(shouldUpdateSelection);
}
this.listData.sort((a, b) => this.sortData(a, b));
if (this.column.dataType === DataType.Date) {
this.uniqueValues = this.uniqueValues.map(value => new Date(value));
}
if (this.containsNullOrEmpty) {
this.addBlanksItem(shouldUpdateSelection);
}
this.addSelectAllItem();
this.cdr.detectChanges();
}
/**
* @private
* @return {?}
*/
addBooleanItems() {
this.selectAllSelected = true;
this.selectAllIndeterminate = false;
this.uniqueValues.forEach(element => {
/** @type {?} */
const filterListItem = new FilterListItem();
if (element !== undefined && element !== null && element !== '') {
if (this.column.filteringExpressionsTree) {
if (element === true && this.expressionsList.find(exp => exp.expression.condition.name === 'true')) {
filterListItem.isSelected = true;
this.selectAllIndeterminate = true;
}
else if (element === false && this.expressionsList.find(exp => exp.expression.condition.name === 'false')) {
filterListItem.isSelected = true;
this.selectAllIndeterminate = true;
}
else {
filterListItem.isSelected = false;
}
}
else {
filterListItem.isSelected = true;
}
filterListItem.value = element;
filterListItem.label = element;
filterListItem.indeterminate = false;
this.listData.push(filterListItem);
}
else {
this.containsNullOrEmpty = true;
}
});
}
/**
* @private
* @param {?} shouldUpdateSelection
* @return {?}
*/
addItems(shouldUpdateSelection) {
this.selectAllSelected = true;
this.selectAllIndeterminate = false;
this.uniqueValues.forEach(element => {
if (element !== undefined && element !== null && element !== '') {
/** @type {?} */
const filterListItem = new FilterListItem();
if (this.column.filteringExpressionsTree) {
if (shouldUpdateSelection) {
if (this.filterValues.has(element)) {
filterListItem.isSelected = true;
}
else {
filterListItem.isSelected = false;
}
this.selectAllIndeterminate = true;
}
else {
filterListItem.isSelected = false;
this.selectAllSelected = false;
}
}
else {
filterListItem.isSelected = true;
}
if (this.column.dataType === DataType.Date) {
filterListItem.value = new Date(element);
filterListItem.label = new Date(element);
}
else {
filterListItem.value = element;
filterListItem.label = element;
}
filterListItem.indeterminate = false;
this.listData.push(filterListItem);
}
else {
this.containsNullOrEmpty = true;
}
});
}
/**
* @private
* @return {?}
*/
addSelectAllItem() {
/** @type {?} */
const selectAll = new FilterListItem();
selectAll.isSelected = this.selectAllSelected;
selectAll.value = this.grid.resourceStrings.igx_grid_excel_select_all;
selectAll.label = this.grid.resourceStrings.igx_grid_excel_select_all;
selectAll.indeterminate = this.selectAllIndeterminate;
selectAll.isSpecial = true;
this.listData.unshift(selectAll);
}
/**
* @private
* @param {?} shouldUpdateSelection
* @return {?}
*/
addBlanksItem(shouldUpdateSelection) {
/** @type {?} */
const blanks = new FilterListItem();
if (this.column.filteringExpressionsTree) {
if (shouldUpdateSelection) {
if (this.filterValues.has(null)) {
blanks.isSelected = true;
}
else {
blanks.isSelected = false;
}
}
}
else {
blanks.isSelected = true;
}
blanks.value = null;
blanks.label = this.grid.resourceStrings.igx_grid_excel_blanks;
blanks.indeterminate = false;
blanks.isSpecial = true;
this.listData.unshift(blanks);
}
/**
* @private
* @param {?} a
* @param {?} b
* @return {?}
*/
sortData(a, b) {
/** @type {?} */
let valueA = a.value;
/** @type {?} */
let valueB = b.value;
if (typeof (a) === DataType.String) {
valueA = a.value.toUpperCase();
valueB = b.value.toUpperCase();
}
if (valueA < valueB) {
return -1;
}
else if (valueA > valueB) {
return 1;
}
else {
return 0;
}
}
// TODO: sort members by access modifier
/**
* @return {?}
*/
get sortingTemplate() {
if (this.grid.excelStyleSortingTemplateDirective) {
return this.grid.excelStyleSortingTemplateDirective.template;
}
else {
return this.defaultExcelStyleSortingTemplate;
}
}
/**
* @return {?}
*/
get movingTemplate() {
if (this.grid.excelStyleMovingTemplateDirective) {
return this.grid.excelStyleMovingTemplateDirective.template;
}
else {
return this.defaultExcelStyleMovingTemplate;
}
}
/**
* @return {?}
*/
get pinningTemplate() {
if (this.grid.excelStylePinningTemplateDirective) {
return this.grid.excelStylePinningTemplateDirective.template;
}
else {
return this.defaultExcelStylePinningTemplate;
}
}
/**
* @return {?}
*/
get hidingTemplate() {
if (this.grid.excelStyleHidingTemplateDirective) {
return this.grid.excelStyleHidingTemplateDirective.template;
}
else {
return this.defaultExcelStyleHidingTemplate;
}
}
/**
* @return {?}
*/
get applyButtonDisabled() {
return this.listData[0] && !this.listData[0].isSelected && !this.listData[0].indeterminate;
}
/**
* @return {?}
*/
applyFilter() {
/** @type {?} */
const filterTree = new FilteringExpressionsTree(FilteringLogic.Or, this.column.field);
/** @type {?} */
const selectedItems = this.listData.slice(1, this.listData.length).filter(el => el.isSelected === true);
/** @type {?} */
const unselectedItem = this.listData.slice(1, this.listData.length).find(el => el.isSelected === false);
if (unselectedItem) {
if (selectedItems.length <= IgxGridExcelStyleFilteringComponent.filterOptimizationThreshold) {
selectedItems.forEach(element => {
/** @type {?} */
let condition = null;
if (element.value !== null && element.value !== undefined) {
if (this.column.dataType === DataType.Boolean) {
condition = this.createCondition(element.value.toString());
}
else {
condition = this.createCondition('equals');
}
}
else {
condition = this.createCondition('empty');
}
filterTree.filteringOperands.push({
condition: condition,
fieldName: this.column.field,
ignoreCase: this.column.filteringIgnoreCase,
searchVal: element.value
});
});
}
else {
/** @type {?} */
const blanksItemIndex = selectedItems.findIndex(e => e.value === null || e.value === undefined);
/** @type {?} */
let blanksItem;
if (blanksItemIndex >= 0) {
blanksItem = selectedItems[blanksItemIndex];
selectedItems.splice(blanksItemIndex, 1);
}
if (this.column.dataType === DataType.Date) {
filterTree.filteringOperands.push({
condition: new InDateFilteringOperation(),
fieldName: this.column.field,
ignoreCase: this.column.filteringIgnoreCase,
searchVal: new Set(selectedItems.map(d => new Date(d.value.getFullYear(), d.value.getMonth(), d.value.getDate()).toISOString()))
});
}
else {
filterTree.filteringOperands.push({
condition: new InFilteringOperation(),
fieldName: this.column.field,
ignoreCase: this.column.filteringIgnoreCase,
searchVal: new Set(selectedItems.map(e => e.value))
});
}
if (blanksItem) {
filterTree.filteringOperands.push({
condition: this.createCondition('empty'),
fieldName: this.column.field,
ignoreCase: this.column.filteringIgnoreCase,
searchVal: blanksItem.value
});
}
}
this.expressionsList = new Array();
this.filteringService.filterInternal(this.column.field, filterTree);
}
else {
this.filteringService.clearFilter(this.column.field);
}
this.closeDropdown();
}
/**
* @return {?}
*/
closeDropdown() {
if (this.overlayComponentId) {
this.overlayService.hide(this.overlayComponentId);
this.overlayComponentId = null;
}
}
/**
* @param {?} eventArgs
* @return {?}
*/
onKeyDown(eventArgs) {
if (eventArgs.key === "Escape" /* ESCAPE */ || eventArgs.key === "Esc" /* ESCAPE_IE */) {
this.closeDropdown();
}
eventArgs.stopPropagation();
}
/**
* @return {?}
*/
clearFilter() {
this.filteringService.clearFilter(this.column.field);
this.populateColumnData();
}
/**
* @param {?} eventArgs
* @return {?}
*/
onClearFilterKeyDown(eventArgs) {
if (eventArgs.key === "Enter" /* ENTER */) {
this.clearFilter();
}
}
/**
* @return {?}
*/
showCustomFilterItem() {
/** @type {?} */
const exprTree = this.column.filteringExpressionsTree;
return exprTree && exprTree.filteringOperands && exprTree.filteringOperands.length &&
!(((/** @type {?} */ (exprTree.filteringOperands[0]))).condition &&
((/** @type {?} */ (exprTree.filteringOperands[0]))).condition.name === 'in');
}
/**
* @private
* @param {?} conditionName
* @return {?}
*/
createCondition(conditionName) {
switch (this.column.dataType) {
case DataType.Boolean:
return IgxBooleanFilteringOperand.instance().condition(conditionName);
case DataType.Number:
return IgxNumberFilteringOperand.instance().condition(conditionName);
case DataType.Date:
return IgxDateFilteringOperand.instance().condition(conditionName);
default:
return IgxStringFilteringOperand.instance().condition(conditionName);
}
}
}
IgxGridExcelStyleFilteringComponent.filterOptimizationThreshold = 2;
IgxGridExcelStyleFilteringComponent.decorators = [
{ type: Component, args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
selector: 'igx-grid-excel-style-filtering',
template: "<article #dropdown\n class=\"igx-excel-filter__menu\"\n [id]=\"overlayComponentId\"\n (keydown)=\"onKeyDown($event)\">\n\n <header class=\"igx-excel-filter__menu-header\">\n <h4 class=\"igx-typography__h6\">{{ column.header || column.field }}</h4>\n </header>\n\n <ng-template #defaultExcelStyleSortingTemplate>\n <igx-excel-style-sorting\n #excelStyleSorting\n class=\"igx-excel-filter__sort\"\n [column]=\"column\"\n [grid]=\"grid\">\n </igx-excel-style-sorting>\n </ng-template>\n\n <div *ngIf=\"column.sortable\">\n <ng-container *ngTemplateOutlet=\"sortingTemplate\"></ng-container>\n </div>\n\n <section class=\"igx-excel-filter__actions\">\n\n <ng-template #defaultExcelStyleMovingTemplate>\n <igx-excel-style-column-moving\n class=\"igx-excel-filter__move\"\n [column]=\"column\"\n [grid]=\"grid\">\n </igx-excel-style-column-moving>\n </ng-template>\n\n <div *ngIf=\"column.movable\">\n <ng-container *ngTemplateOutlet=\"movingTemplate\"></ng-container>\n </div>\n\n <ng-template #defaultExcelStylePinningTemplate>\n <div class=\"igx-excel-filter__actions-pin\"\n (click)=\"onPin()\"\n tabindex=\"0\"\n *ngIf=\"!column.pinned\">\n <span>{{ grid.resourceStrings.igx_grid_excel_pin }}</span>\n <igx-icon fontSet=\"filtering-icons\" name=\"pin\"></igx-icon>\n </div>\n\n <div class=\"igx-excel-filter__actions-unpin\"\n (click)=\"onPin()\"\n tabindex=\"0\"\n *ngIf=\"column.pinned\">\n <span>{{ grid.resourceStrings.igx_grid_excel_unpin }}</span>\n <igx-icon fontSet=\"filtering-icons\" name=\"unpin\"></igx-icon>\n </div>\n </ng-template>\n\n <div *ngIf=\"!column.disablePinning\">\n <ng-container *ngTemplateOutlet=\"pinningTemplate\"></ng-container>\n </div>\n\n <ng-template #defaultExcelStyleHidingTemplate>\n <div class=\"igx-excel-filter__actions-hide\"\n tabindex=\"0\"\n (click)=\"onHide()\">\n <span>{{ grid.resourceStrings.igx_grid_excel_hide }}</span>\n <igx-icon>visibility_off</igx-icon>\n </div>\n </ng-template>\n\n <div *ngIf=\"!column.disableHiding\">\n <ng-container *ngTemplateOutlet=\"hidingTemplate\"></ng-container>\n </div>\n\n <div\n tabindex=\"0\"\n [ngClass]=\"clearFilterClass()\"\n (keydown)=\"onClearFilterKeyDown($event)\"\n (click)=\"clearFilter()\">\n <span>{{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}</span>\n <igx-icon>clear</igx-icon>\n </div>\n\n <div\n tabindex=\"0\"\n class=\"igx-excel-filter__actions-filter\"\n (keydown)=\"onTextFilterKeyDown($event)\"\n (click)=\"onTextFilterClick($event)\"\n [igxDropDownItemNavigation]=\"subMenu\" >\n <span>{{ subMenuText }}</span>\n <igx-icon>keyboard_arrow_right</igx-icon>\n </div>\n </section>\n\n <igx-excel-style-search\n class=\"igx-excel-filter__menu-main\"\n #excelStyleSearch\n [column]=\"column\"\n [data]=\"listData\">\n </igx-excel-style-search>\n\n <footer class=\"igx-excel-filter__menu-footer\">\n <button igxButton (click)=\"closeDropdown()\">{{ grid.resourceStrings.igx_grid_excel_cancel }}</button>\n <button igxButton=\"raised\" [disabled]=\"applyButtonDisabled\" (click)=\"applyFilter()\">{{ grid.resourceStrings.igx_grid_excel_apply }}</button>\n </footer>\n</article>\n\n<igx-drop-down [maxHeight]=\"'397px'\" #subMenu (onSelection)=\"onSubMenuSelection($event)\" (onClosed)=\"onSubMenuClosed()\">\n <div>\n <igx-drop-down-item\n *ngFor=\"let condition of conditions\"\n [value]=\"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-item *ngIf=\"showCustomFilterItem()\">\n <igx-icon>filter_list</igx-icon>\n <span style=\"margin-left: 16px\">{{ grid.resourceStrings.igx_grid_excel_custom_filter }}</span>\n </igx-drop-down-item>\n </div>\n</igx-drop-down>\n\n<igx-excel-style-custom-dialog\n #customDialog\n [column]=\"column\"\n [filteringService]=\"filteringService\"\n [overlayComponentId]=\"overlayComponentId\"\n [overlayService]=\"overlayService\">\n</igx-excel-style-custom-dialog>\n"
}] }
];
/** @nocollapse */
IgxGridExcelStyleFilteringComponent.ctorParameters = () => [
{ type: ChangeDetectorRef }
];
IgxGridExcelStyleFilteringComponent.propDecorators = {
className: [{ type: HostBinding, args: ['class.igx-excel-filter',] }],
mainDropdown: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
subMenu: [{ type: ViewChild, args: ['subMenu', { read: IgxDropDownComponent },] }],
customDialog: [{ type: ViewChild, args: ['customDialog', { read: IgxExcelStyleCustomDialogComponent },] }],
excelStyleSearch: [{ type: ViewChild, args: ['excelStyleSearch', { read: IgxExcelStyleSearchComponent },] }],
excelStyleSorting: [{ type: ViewChild, args: ['excelStyleSorting', { read: IgxExcelStyleSortingComponent },] }],
defaultExcelStyleSortingTemplate: [{ type: ViewChild, args: ['defaultExcelStyleSortingTemplate', { read: TemplateRef },] }],
defaultExcelStyleHidingTemplate: [{ type: ViewChild, args: ['defaultExcelStyleHidingTemplate', { read: TemplateRef },] }],
defaultExcelStyleMovingTemplate: [{ type: ViewChild, args: ['defaultExcelStyleMovingTemplate', { read: TemplateRef },] }],
defaultExcelStylePinningTemplate: [{ type: ViewChild, args: ['defaultExcelStylePinningTemplate', { read: TemplateRef },] }]
};
if (false) {
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.filterOptimizationThreshold;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.shouldOpenSubMenu;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.expressionsList;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.destroy$;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.containsNullOrEmpty;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.selectAllSelected;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.selectAllIndeterminate;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.filterValues;
/**
* @type {?}
* @protected
*/
IgxGridExcelStyleFilteringComponent.prototype.columnMoving;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.column;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.filteringService;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.listData;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.uniqueValues;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.overlayService;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.overlayComponentId;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype._subMenuPositionSettings;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype._subMenuOverlaySettings;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.className;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.mainDropdown;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.subMenu;
/** @type {?} */
IgxGridExcelStyleFilteringComponent.prototype.customDialog;
/**
* @type {?}
* @protected
*/
IgxGridExcelStyleFilteringComponent.prototype.excelStyleSearch;
/**
* @type {?}
* @protected
*/
IgxGridExcelStyleFilteringComponent.prototype.excelStyleSorting;
/**
* @type {?}
* @protected
*/
IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStyleSortingTemplate;
/**
* @type {?}
* @protected
*/
IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStyleHidingTemplate;
/**
* @type {?}
* @protected
*/
IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStyleMovingTemplate;
/**
* @type {?}
* @protected
*/
IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStylePinningTemplate;
/**
* @type {?}
* @private
*/
IgxGridExcelStyleFilteringComponent.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsV0FBVyxFQUNYLHVCQUF1QixFQUN2QixXQUFXLEVBQ1gsU0FBUyxFQUdULFVBQVUsRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFHNUIsc0JBQXNCLEVBQ3pCLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxFQUVILHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQzNCLE1BQU0sOENBQThDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHdCQUF3QixFQUE2QixNQUFNLHFEQUFxRCxDQUFDO0FBQzFILE9BQU8sRUFBRSxjQUFjLEVBQXdCLE1BQU0seURBQXlELENBQUM7QUFDL0csT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFD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