igniteui-angular 20.1.14 → 20.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4101,7 +4101,8 @@ class IgxBaseExporter {
4101
4101
  this._ownersMap.set(grid, columnList);
4102
4102
  const childLayoutList = grid.childLayoutList;
4103
4103
  for (const island of childLayoutList) {
4104
- this.mapHierarchicalGridColumns(island, grid.data[0]);
4104
+ const gridData = grid.data && grid.data.length > 0 ? grid.data[0] : {};
4105
+ this.mapHierarchicalGridColumns(island, gridData);
4105
4106
  }
4106
4107
  }
4107
4108
  else if (grid.type === 'pivot') {
@@ -4904,27 +4905,33 @@ class IgxBaseExporter {
4904
4905
  let columnList;
4905
4906
  let keyData;
4906
4907
  if (island.autoGenerate) {
4907
- keyData = gridData[island.key];
4908
- const islandKeys = island.children.map(i => i.key);
4909
- const islandData = keyData.map(i => {
4910
- const newItem = {};
4911
- Object.keys(i).map(k => {
4912
- if (!islandKeys.includes(k)) {
4913
- newItem[k] = i[k];
4914
- }
4908
+ keyData = gridData && gridData[island.key] ? gridData[island.key] : undefined;
4909
+ const islandKeys = island.children && island.children.length > 0 ? island.children.map(i => i.key) : [];
4910
+ if (keyData && Array.isArray(keyData) && keyData.length > 0) {
4911
+ const islandData = keyData.map(i => {
4912
+ const newItem = {};
4913
+ Object.keys(i).map(k => {
4914
+ if (!islandKeys.includes(k)) {
4915
+ newItem[k] = i[k];
4916
+ }
4917
+ });
4918
+ return newItem;
4915
4919
  });
4916
- return newItem;
4917
- });
4918
- columnList = this.getAutoGeneratedColumns(islandData);
4920
+ columnList = this.getAutoGeneratedColumns(islandData);
4921
+ }
4922
+ else {
4923
+ // If no data available, create empty column list
4924
+ columnList = this.getAutoGeneratedColumns([{}]);
4925
+ }
4919
4926
  }
4920
4927
  else {
4921
4928
  const islandColumnList = island.columns;
4922
4929
  columnList = this.getColumns(islandColumnList);
4923
4930
  }
4924
4931
  this._ownersMap.set(island, columnList);
4925
- if (island.children.length > 0) {
4932
+ if (island.children && island.children.length > 0) {
4926
4933
  for (const childIsland of island.children) {
4927
- const islandKeyData = keyData !== undefined ? keyData[0] : {};
4934
+ const islandKeyData = keyData && Array.isArray(keyData) && keyData.length > 0 ? keyData[0] : {};
4928
4935
  this.mapHierarchicalGridColumns(childIsland, islandKeyData);
4929
4936
  }
4930
4937
  }
@@ -5141,19 +5148,27 @@ class CharSeparatedValueData {
5141
5148
  this._dataRecords = this.processDataRecords(this._data, keys);
5142
5149
  return this._headerRecord + this._dataRecords;
5143
5150
  }
5144
- prepareDataAsync(done) {
5151
+ prepareDataAsync(done, alwaysExportHeaders = true) {
5145
5152
  const columns = this.columns?.filter(c => !c.skip)
5146
5153
  .sort((a, b) => a.startIndex - b.startIndex)
5147
5154
  .sort((a, b) => a.pinnedIndex - b.pinnedIndex);
5148
5155
  const keys = columns && columns.length ? columns.map(c => c.field) : ExportUtilities.getKeysFromData(this._data);
5149
- this._isSpecialData = ExportUtilities.isSpecialData(this._data[0]);
5156
+ if (this._data && this._data.length > 0) {
5157
+ this._isSpecialData = ExportUtilities.isSpecialData(this._data[0]);
5158
+ }
5150
5159
  this._escapeCharacters.push(this._delimiter);
5151
5160
  const headers = columns && columns.length ?
5152
5161
  columns.map(c => c.header ?? c.field) :
5153
5162
  keys;
5154
5163
  this._headerRecord = this.processHeaderRecord(headers, this._data.length);
5155
5164
  if (keys.length === 0 || ((!this._data || this._data.length === 0) && keys.length === 0)) {
5156
- done('');
5165
+ // If alwaysExportHeaders is true and we have headers, export headers only
5166
+ if (alwaysExportHeaders && headers && headers.length > 0) {
5167
+ done(this._headerRecord);
5168
+ }
5169
+ else {
5170
+ done('');
5171
+ }
5157
5172
  }
5158
5173
  else {
5159
5174
  this.processDataRecordsAsync(this._data, keys, (dr) => {
@@ -5488,10 +5503,33 @@ class IgxCsvExporterService extends IgxBaseExporter {
5488
5503
  this.exportEnded = new EventEmitter();
5489
5504
  }
5490
5505
  exportDataImplementation(data, options, done) {
5491
- const dimensionKeys = data[0]?.dimensionKeys;
5492
- data = dimensionKeys?.length ?
5493
- data.map((item) => item.rawData) :
5494
- data.map((item) => item.data);
5506
+ const firstDataElement = data[0];
5507
+ const dimensionKeys = firstDataElement?.dimensionKeys;
5508
+ const dataRecords = dimensionKeys?.length ?
5509
+ data.filter(item => item.type !== ExportRecordType.SummaryRecord).map((item) => item.rawData) :
5510
+ data.filter(item => item.type !== ExportRecordType.SummaryRecord).map((item) => item.data);
5511
+ // Get summary records if exportSummaries is enabled
5512
+ const summaryRecords = [];
5513
+ if (options.exportSummaries) {
5514
+ const summaries = data.filter(item => item.type === ExportRecordType.SummaryRecord);
5515
+ for (const summary of summaries) {
5516
+ // Convert summary record data to a flat object format for CSV
5517
+ const summaryData = {};
5518
+ if (summary.data) {
5519
+ for (const [key, value] of Object.entries(summary.data)) {
5520
+ if (value && typeof value === 'object' && 'label' in value && 'value' in value) {
5521
+ summaryData[key] = `${value.label}: ${value.value}`;
5522
+ }
5523
+ else {
5524
+ summaryData[key] = value;
5525
+ }
5526
+ }
5527
+ }
5528
+ summaryRecords.push(summaryData);
5529
+ }
5530
+ }
5531
+ // Combine data records and summary records
5532
+ const allRecords = [...dataRecords, ...summaryRecords];
5495
5533
  const columnList = this._ownersMap.get(DEFAULT_OWNER);
5496
5534
  const columns = columnList?.columns.filter(c => c.headerType === ExportHeaderType.ColumnHeader);
5497
5535
  if (dimensionKeys) {
@@ -5509,13 +5547,13 @@ class IgxCsvExporterService extends IgxBaseExporter {
5509
5547
  });
5510
5548
  columns.unshift(...dimensionCols);
5511
5549
  }
5512
- const csvData = new CharSeparatedValueData(data, options.valueDelimiter, columns);
5550
+ const csvData = new CharSeparatedValueData(allRecords, options.valueDelimiter, columns);
5513
5551
  csvData.prepareDataAsync((r) => {
5514
5552
  this._stringData = r;
5515
5553
  this.saveFile(options);
5516
5554
  this.exportEnded.emit({ csvData: this._stringData });
5517
5555
  done();
5518
- });
5556
+ }, options.alwaysExportHeaders);
5519
5557
  }
5520
5558
  saveFile(options) {
5521
5559
  switch (options.fileType) {
@@ -6106,9 +6144,15 @@ class WorksheetFile {
6106
6144
  }
6107
6145
  }
6108
6146
  getSummaryFunction(type, key, dimensionMapKey, recordLevel, col) {
6109
- const dimensionMap = dimensionMapKey ? this.hierarchicalDimensionMap.get(dimensionMapKey) : this.dimensionMap;
6147
+ const dimensionMap = dimensionMapKey ? (this.hierarchicalDimensionMap.get(dimensionMapKey) ?? this.dimensionMap) : this.dimensionMap;
6148
+ if (!dimensionMap) {
6149
+ return '';
6150
+ }
6110
6151
  const dimensions = dimensionMap.get(key);
6111
6152
  const levelDimensions = dimensionMap.get(GRID_LEVEL_COL);
6153
+ if (!dimensions || !levelDimensions) {
6154
+ return '';
6155
+ }
6112
6156
  let func = '';
6113
6157
  let funcType = '';
6114
6158
  let result = '';
@@ -6733,6 +6777,10 @@ class IgxExcelExporterService extends IgxBaseExporter {
6733
6777
  const firstDataElement = data[0];
6734
6778
  const isHierarchicalGrid = firstDataElement?.type === ExportRecordType.HierarchicalGridRecord;
6735
6779
  const isPivotGrid = firstDataElement?.type === ExportRecordType.PivotGridRecord;
6780
+ const ownersKeys = Array.from(this._ownersMap.keys());
6781
+ const firstKey = ownersKeys[0];
6782
+ const isHierarchicalGridByMap = firstKey && typeof firstKey !== 'string';
6783
+ const filterColumns = (columns) => columns.filter(col => col.field !== GRID_LEVEL_COL && !col.skip && col.headerType === ExportHeaderType.ColumnHeader);
6736
6784
  let rootKeys;
6737
6785
  let columnCount;
6738
6786
  let columnWidths;
@@ -6762,19 +6810,28 @@ class IgxExcelExporterService extends IgxBaseExporter {
6762
6810
  defaultOwner = this._ownersMap.get(firstDataElement.owner);
6763
6811
  }
6764
6812
  else {
6765
- defaultOwner = this._ownersMap.get(DEFAULT_OWNER);
6766
- const columns = defaultOwner.columns.filter(col => col.field !== GRID_LEVEL_COL && !col.skip && col.headerType === ExportHeaderType.ColumnHeader);
6767
- columnWidths = defaultOwner.columnWidths;
6768
- indexOfLastPinnedColumn = defaultOwner.indexOfLastPinnedColumn;
6769
- columnCount = isPivotGrid ? columns.length + this.pivotGridFilterFieldsCount : columns.length;
6770
- rootKeys = columns.map(c => c.field);
6813
+ // Check if this is actually a hierarchical grid (when data only contains summary records)
6814
+ defaultOwner = isHierarchicalGridByMap
6815
+ ? this._ownersMap.get(firstKey)
6816
+ : this._ownersMap.get(DEFAULT_OWNER) || this._ownersMap.get(firstKey);
6817
+ if (defaultOwner) {
6818
+ const columns = filterColumns(defaultOwner.columns);
6819
+ columnWidths = defaultOwner.columnWidths;
6820
+ indexOfLastPinnedColumn = defaultOwner.indexOfLastPinnedColumn;
6821
+ columnCount = isPivotGrid ? columns.length + this.pivotGridFilterFieldsCount : columns.length;
6822
+ rootKeys = columns.map(c => c.field);
6823
+ }
6771
6824
  }
6772
6825
  }
6773
6826
  else {
6774
- const ownersKeys = Array.from(this._ownersMap.keys());
6775
- defaultOwner = this._ownersMap.get(ownersKeys[0]);
6776
- columnWidths = defaultOwner.columnWidths;
6777
- columnCount = defaultOwner.columns.filter(col => col.field !== GRID_LEVEL_COL && !col.skip && col.headerType === ExportHeaderType.ColumnHeader).length;
6827
+ // For hierarchical grids with empty data, use the grid instance; otherwise try DEFAULT_OWNER first
6828
+ defaultOwner = isHierarchicalGridByMap
6829
+ ? this._ownersMap.get(firstKey)
6830
+ : this._ownersMap.get(DEFAULT_OWNER) || this._ownersMap.get(firstKey);
6831
+ if (defaultOwner) {
6832
+ columnWidths = defaultOwner.columnWidths;
6833
+ columnCount = filterColumns(defaultOwner.columns).length;
6834
+ }
6778
6835
  }
6779
6836
  const worksheetData = new WorksheetData(data, options, this._sort, columnCount, rootKeys, indexOfLastPinnedColumn, columnWidths, defaultOwner, this._ownersMap);
6780
6837
  const rootFolder = ExcelElementsFactory.getExcelFolder(ExcelFolderTypes.RootExcelFolder);
@@ -10655,7 +10712,9 @@ class IgxButtonBaseDirective {
10655
10712
  }
10656
10713
  }
10657
10714
  ngOnDestroy() {
10658
- this._animationScheduler.unsubscribe();
10715
+ if (this._animationScheduler) {
10716
+ this._animationScheduler.unsubscribe();
10717
+ }
10659
10718
  }
10660
10719
  /**
10661
10720
  * @hidden
@@ -53429,11 +53488,11 @@ class IgxExcelStyleDateExpressionComponent extends IgxExcelStyleDefaultExpressio
53429
53488
  return getLocaleFirstDayOfWeek(this.grid.locale);
53430
53489
  }
53431
53490
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: IgxExcelStyleDateExpressionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
53432
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.6", type: IgxExcelStyleDateExpressionComponent, isStandalone: true, selector: "igx-excel-style-date-expression", inputs: { searchVal: "searchVal" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-select #dropdownConditions\n type=\"box\"\n [placeholder]=\"conditionsPlaceholder\"\n (selectionChanging)=\"onConditionsChanged($event)\"\n [overlaySettings]=\"dropDownOverlaySettings\">\n <igx-prefix>\n @if (expressionUI.expression.condition) {\n <igx-icon family=\"default\" [name]=\"getIconName()\"></igx-icon>\n }\n @if (!expressionUI.expression.condition) {\n <igx-icon family=\"default\" name=\"filter_list\"></igx-icon>\n }\n </igx-prefix>\n @for (condition of conditions; track condition) {\n <igx-select-item [value]=\"condition\" [text]=\"getConditionFriendlyName(condition)\" [selected]=\"isConditionSelected(condition)\">\n <igx-icon family=\"default\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span>{{translateCondition(condition)}}</span>\n </igx-select-item>\n }\n</igx-select>\n\n@if (column.dataType === 'date') {\n <igx-date-picker #picker\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(value)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputDatePlaceholder\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n}\n\n@if (column.dataType === 'time') {\n <igx-time-picker #picker\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputTimePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [inputFormat]=\"column.editorOptions?.dateTimeFormat\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n}\n\n@if (column.dataType === 'dateTime') {\n <igx-input-group #dropDownTarget #inputGroup type=\"box\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"inputDatePlaceholder\"\n [locale]=\"column.grid.locale\"\n [igxDateTimeEditor]=\"column.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"column.dataType\"\n [displayFormat]=\"column.pipeArgs.format\"\n [(ngModel)]=\"searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n </igx-input-group>\n}\n\n@if (!isSingle) {\n <button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n </button>\n}\n\n@if (!isLast) {\n <igx-buttongroup #logicOperatorButtonGroup>\n <span igxButton\n #andButton\n (keydown)=\"onLogicOperatorKeyDown($event, 0)\"\n tabindex=\"0\"\n [selected]=\"expressionUI.afterOperator === 0\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 0)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_and }}\n </span>\n <span igxButton\n #orButton\n tabindex=\"0\"\n (keydown)=\"onLogicOperatorKeyDown($event, 1)\"\n [selected]=\"expressionUI.afterOperator === 1\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 1)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_or }}\n </span>\n </igx-buttongroup>\n}\n\n<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n", dependencies: [{ kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["ariaHidden", "family", "name", "active"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "orientation", "showWeekNumbers", "activeDate", "formatter", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "defaultFormatType", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }] }); }
53491
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.6", type: IgxExcelStyleDateExpressionComponent, isStandalone: true, selector: "igx-excel-style-date-expression", inputs: { searchVal: "searchVal" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-select #dropdownConditions\n type=\"box\"\n [placeholder]=\"conditionsPlaceholder\"\n (selectionChanging)=\"onConditionsChanged($event)\"\n [overlaySettings]=\"dropDownOverlaySettings\">\n <igx-prefix>\n @if (expressionUI.expression.condition) {\n <igx-icon family=\"default\" [name]=\"getIconName()\"></igx-icon>\n }\n @if (!expressionUI.expression.condition) {\n <igx-icon family=\"default\" name=\"filter_list\"></igx-icon>\n }\n </igx-prefix>\n @for (condition of conditions; track condition) {\n <igx-select-item [value]=\"condition\" [text]=\"getConditionFriendlyName(condition)\" [selected]=\"isConditionSelected(condition)\">\n <igx-icon family=\"default\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span>{{translateCondition(condition)}}</span>\n </igx-select-item>\n }\n</igx-select>\n\n@if (column.dataType === 'date') {\n <igx-date-picker #picker\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputDatePlaceholder\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n}\n\n@if (column.dataType === 'time') {\n <igx-time-picker #picker\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputTimePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [inputFormat]=\"column.editorOptions?.dateTimeFormat\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n}\n\n@if (column.dataType === 'dateTime') {\n <igx-input-group #dropDownTarget #inputGroup type=\"box\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"inputDatePlaceholder\"\n [locale]=\"column.grid.locale\"\n [igxDateTimeEditor]=\"column.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"column.dataType\"\n [displayFormat]=\"column.pipeArgs.format\"\n [(ngModel)]=\"searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n </igx-input-group>\n}\n\n@if (!isSingle) {\n <button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n </button>\n}\n\n@if (!isLast) {\n <igx-buttongroup #logicOperatorButtonGroup>\n <span igxButton\n #andButton\n (keydown)=\"onLogicOperatorKeyDown($event, 0)\"\n tabindex=\"0\"\n [selected]=\"expressionUI.afterOperator === 0\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 0)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_and }}\n </span>\n <span igxButton\n #orButton\n tabindex=\"0\"\n (keydown)=\"onLogicOperatorKeyDown($event, 1)\"\n [selected]=\"expressionUI.afterOperator === 1\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 1)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_or }}\n </span>\n </igx-buttongroup>\n}\n\n<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n", dependencies: [{ kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["ariaHidden", "family", "name", "active"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "orientation", "showWeekNumbers", "activeDate", "formatter", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "defaultFormatType", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }] }); }
53433
53492
  }
53434
53493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: IgxExcelStyleDateExpressionComponent, decorators: [{
53435
53494
  type: Component,
53436
- args: [{ selector: 'igx-excel-style-date-expression', imports: [IgxSelectComponent, IgxPrefixDirective, IgxIconComponent, IgxSelectItemComponent, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxInputGroupComponent, FormsModule, IgxInputDirective, IgxDateTimeEditorDirective, IgxButtonDirective, IgxButtonGroupComponent, IgxOverlayOutletDirective, IgxIconButtonDirective], template: "<igx-select #dropdownConditions\n type=\"box\"\n [placeholder]=\"conditionsPlaceholder\"\n (selectionChanging)=\"onConditionsChanged($event)\"\n [overlaySettings]=\"dropDownOverlaySettings\">\n <igx-prefix>\n @if (expressionUI.expression.condition) {\n <igx-icon family=\"default\" [name]=\"getIconName()\"></igx-icon>\n }\n @if (!expressionUI.expression.condition) {\n <igx-icon family=\"default\" name=\"filter_list\"></igx-icon>\n }\n </igx-prefix>\n @for (condition of conditions; track condition) {\n <igx-select-item [value]=\"condition\" [text]=\"getConditionFriendlyName(condition)\" [selected]=\"isConditionSelected(condition)\">\n <igx-icon family=\"default\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span>{{translateCondition(condition)}}</span>\n </igx-select-item>\n }\n</igx-select>\n\n@if (column.dataType === 'date') {\n <igx-date-picker #picker\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(value)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputDatePlaceholder\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n}\n\n@if (column.dataType === 'time') {\n <igx-time-picker #picker\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputTimePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [inputFormat]=\"column.editorOptions?.dateTimeFormat\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n}\n\n@if (column.dataType === 'dateTime') {\n <igx-input-group #dropDownTarget #inputGroup type=\"box\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"inputDatePlaceholder\"\n [locale]=\"column.grid.locale\"\n [igxDateTimeEditor]=\"column.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"column.dataType\"\n [displayFormat]=\"column.pipeArgs.format\"\n [(ngModel)]=\"searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n </igx-input-group>\n}\n\n@if (!isSingle) {\n <button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n </button>\n}\n\n@if (!isLast) {\n <igx-buttongroup #logicOperatorButtonGroup>\n <span igxButton\n #andButton\n (keydown)=\"onLogicOperatorKeyDown($event, 0)\"\n tabindex=\"0\"\n [selected]=\"expressionUI.afterOperator === 0\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 0)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_and }}\n </span>\n <span igxButton\n #orButton\n tabindex=\"0\"\n (keydown)=\"onLogicOperatorKeyDown($event, 1)\"\n [selected]=\"expressionUI.afterOperator === 1\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 1)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_or }}\n </span>\n </igx-buttongroup>\n}\n\n<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n" }]
53495
+ args: [{ selector: 'igx-excel-style-date-expression', imports: [IgxSelectComponent, IgxPrefixDirective, IgxIconComponent, IgxSelectItemComponent, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxInputGroupComponent, FormsModule, IgxInputDirective, IgxDateTimeEditorDirective, IgxButtonDirective, IgxButtonGroupComponent, IgxOverlayOutletDirective, IgxIconButtonDirective], template: "<igx-select #dropdownConditions\n type=\"box\"\n [placeholder]=\"conditionsPlaceholder\"\n (selectionChanging)=\"onConditionsChanged($event)\"\n [overlaySettings]=\"dropDownOverlaySettings\">\n <igx-prefix>\n @if (expressionUI.expression.condition) {\n <igx-icon family=\"default\" [name]=\"getIconName()\"></igx-icon>\n }\n @if (!expressionUI.expression.condition) {\n <igx-icon family=\"default\" name=\"filter_list\"></igx-icon>\n }\n </igx-prefix>\n @for (condition of conditions; track condition) {\n <igx-select-item [value]=\"condition\" [text]=\"getConditionFriendlyName(condition)\" [selected]=\"isConditionSelected(condition)\">\n <igx-icon family=\"default\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span>{{translateCondition(condition)}}</span>\n </igx-select-item>\n }\n</igx-select>\n\n@if (column.dataType === 'date') {\n <igx-date-picker #picker\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputDatePlaceholder\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n}\n\n@if (column.dataType === 'time') {\n <igx-time-picker #picker\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [placeholder]=\"inputTimePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [inputFormat]=\"column.editorOptions?.dateTimeFormat\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n}\n\n@if (column.dataType === 'dateTime') {\n <igx-input-group #dropDownTarget #inputGroup type=\"box\">\n <input #input igxInput tabindex=\"0\"\n [placeholder]=\"inputDatePlaceholder\"\n [locale]=\"column.grid.locale\"\n [igxDateTimeEditor]=\"column.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"column.dataType\"\n [displayFormat]=\"column.pipeArgs.format\"\n [(ngModel)]=\"searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n </igx-input-group>\n}\n\n@if (!isSingle) {\n <button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n </button>\n}\n\n@if (!isLast) {\n <igx-buttongroup #logicOperatorButtonGroup>\n <span igxButton\n #andButton\n (keydown)=\"onLogicOperatorKeyDown($event, 0)\"\n tabindex=\"0\"\n [selected]=\"expressionUI.afterOperator === 0\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 0)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_and }}\n </span>\n <span igxButton\n #orButton\n tabindex=\"0\"\n (keydown)=\"onLogicOperatorKeyDown($event, 1)\"\n [selected]=\"expressionUI.afterOperator === 1\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 1)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_or }}\n </span>\n </igx-buttongroup>\n}\n\n<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n" }]
53437
53496
  }], propDecorators: { input: [{
53438
53497
  type: ViewChild,
53439
53498
  args: ['input', { read: IgxInputDirective, static: false }]
@@ -57801,8 +57860,8 @@ class IgxExcelStyleSearchComponent {
57801
57860
  * @hidden @internal
57802
57861
  */
57803
57862
  get applyButtonDisabled() {
57804
- return (this._selectAllItem && !this._selectAllItem.isSelected && !this._selectAllItem.indeterminate) ||
57805
- (this.displayedListData && this.displayedListData.length === 0);
57863
+ return ((this._selectAllItem && !this._selectAllItem.isSelected && !this._selectAllItem.indeterminate) ||
57864
+ (this.displayedListData && this.displayedListData.length === 0)) && !this._addToCurrentFilterItem?.isSelected;
57806
57865
  }
57807
57866
  /**
57808
57867
  * @hidden @internal
@@ -57918,11 +57977,28 @@ class IgxExcelStyleSearchComponent {
57918
57977
  selectedItems = this._hierarchicalSelectedItems;
57919
57978
  }
57920
57979
  else {
57921
- const item = this.displayedListData[1];
57922
- const addToCurrentFilterOptionVisible = item === this.addToCurrentFilterItem;
57923
- selectedItems = addToCurrentFilterOptionVisible && item.isSelected ?
57924
- this.esf.listData.slice(1, this.esf.listData.length).filter(el => el.isSelected || el.isFiltered) :
57925
- this.esf.listData.slice(1, this.esf.listData.length).filter(el => el.isSelected);
57980
+ const addToCurrentFilter = this._addToCurrentFilterItem?.isSelected;
57981
+ const displayedSet = new Set(this.displayedListData);
57982
+ const listData = this.esf.listData;
57983
+ for (let i = 1; i < listData.length; i++) {
57984
+ const el = listData[i];
57985
+ const isDisplayed = displayedSet.has(el);
57986
+ if (isDisplayed) {
57987
+ if (el.isSelected) {
57988
+ selectedItems.push(el);
57989
+ }
57990
+ }
57991
+ else if (addToCurrentFilter) {
57992
+ // Hidden items with "add to current filter": include if selected or filtered
57993
+ if (el.isSelected || el.isFiltered) {
57994
+ selectedItems.push(el);
57995
+ }
57996
+ }
57997
+ else if (el.isSelected) {
57998
+ // Hidden items without "add to current filter": include if selected
57999
+ selectedItems.push(el);
58000
+ }
58001
+ }
57926
58002
  }
57927
58003
  let unselectedItem;
57928
58004
  if (this.isHierarchical()) {