igniteui-angular 19.0.6 → 19.1.0-beta.0

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.
Files changed (83) hide show
  1. package/fesm2022/igniteui-angular.mjs +1874 -718
  2. package/fesm2022/igniteui-angular.mjs.map +1 -1
  3. package/lib/carousel/carousel-base.d.ts +2 -31
  4. package/lib/carousel/carousel.component.d.ts +12 -12
  5. package/lib/carousel/enums.d.ts +8 -0
  6. package/lib/carousel/slide.component.d.ts +3 -2
  7. package/lib/checkbox/checkbox.component.d.ts +5 -4
  8. package/lib/core/i18n/query-builder-resources.d.ts +22 -2
  9. package/lib/core/styles/components/avatar/_avatar-theme.scss +31 -1
  10. package/lib/core/styles/components/card/_card-theme.scss +1 -1
  11. package/lib/core/styles/components/carousel/_carousel-component.scss +4 -4
  12. package/lib/core/styles/components/carousel/_carousel-theme.scss +8 -4
  13. package/lib/core/styles/components/checkbox/_checkbox-component.scss +4 -8
  14. package/lib/core/styles/components/checkbox/_checkbox-theme.scss +3 -8
  15. package/lib/core/styles/components/chip/_chip-theme.scss +4 -2
  16. package/lib/core/styles/components/combo/_combo-theme.scss +10 -24
  17. package/lib/core/styles/components/grid/_excel-filtering-theme.scss +14 -16
  18. package/lib/core/styles/components/grid/_grid-theme.scss +34 -30
  19. package/lib/core/styles/components/input/_input-group-theme.scss +2 -5
  20. package/lib/core/styles/components/query-builder/_query-builder-component.scss +59 -44
  21. package/lib/core/styles/components/query-builder/_query-builder-theme.scss +325 -232
  22. package/lib/core/styles/components/radio/_radio-theme.scss +2 -0
  23. package/lib/core/styles/components/switch/_switch-theme.scss +2 -0
  24. package/lib/core/styles/components/tree/_tree-theme.scss +1 -7
  25. package/lib/core/styles/themes/generators/_base.scss +4 -6
  26. package/lib/core/styles/themes/generators/_bootstrap.scss +0 -2
  27. package/lib/core/styles/themes/generators/_fluent.scss +0 -2
  28. package/lib/core/styles/themes/generators/_indigo.scss +0 -2
  29. package/lib/core/utils.d.ts +0 -2
  30. package/lib/data-operations/filtering-condition.d.ts +16 -5
  31. package/lib/data-operations/filtering-expression.interface.d.ts +4 -1
  32. package/lib/data-operations/filtering-expressions-tree.d.ts +29 -3
  33. package/lib/directives/drag-drop/drag-drop.directive.d.ts +0 -1
  34. package/lib/grids/common/grid.interface.d.ts +13 -10
  35. package/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.d.ts +7 -0
  36. package/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.d.ts +1 -4
  37. package/lib/grids/filtering/excel-style/excel-style-date-expression.component.d.ts +3 -1
  38. package/lib/grids/grid-base.directive.d.ts +2 -5
  39. package/lib/grids/pivot-grid/pivot-grid.component.d.ts +1 -1
  40. package/lib/grids/resizing/resizer.directive.d.ts +0 -2
  41. package/lib/grids/resizing/resizing.service.d.ts +2 -2
  42. package/lib/icon/icon.component.d.ts +17 -1
  43. package/lib/icon/icon.service.d.ts +4 -7
  44. package/lib/icon/types.d.ts +1 -3
  45. package/lib/input-group/input-group.component.d.ts +10 -8
  46. package/lib/query-builder/public_api.d.ts +3 -1
  47. package/lib/query-builder/query-builder-header.component.d.ts +1 -11
  48. package/lib/query-builder/query-builder-tree.component.d.ts +565 -0
  49. package/lib/query-builder/query-builder.component.d.ts +43 -303
  50. package/lib/query-builder/query-builder.directives.d.ts +22 -0
  51. package/lib/query-builder/query-builder.module.d.ts +2 -1
  52. package/lib/services/public_api.d.ts +0 -1
  53. package/lib/services/theme/theme.service.d.ts +27 -0
  54. package/migrations/update-18_2_0/changes/inputs.json +9 -0
  55. package/migrations/update-18_2_0/index.js +4 -0
  56. package/package.json +2 -2
  57. package/styles/igniteui-angular-dark.css +1 -1
  58. package/styles/igniteui-angular.css +1 -1
  59. package/styles/igniteui-bootstrap-dark.css +1 -1
  60. package/styles/igniteui-bootstrap-light.css +1 -1
  61. package/styles/igniteui-dark-green.css +1 -1
  62. package/styles/igniteui-fluent-dark-excel.css +1 -1
  63. package/styles/igniteui-fluent-dark-word.css +1 -1
  64. package/styles/igniteui-fluent-dark.css +1 -1
  65. package/styles/igniteui-fluent-light-excel.css +1 -1
  66. package/styles/igniteui-fluent-light-word.css +1 -1
  67. package/styles/igniteui-fluent-light.css +1 -1
  68. package/styles/igniteui-indigo-dark.css +1 -1
  69. package/styles/igniteui-indigo-light.css +1 -1
  70. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  71. package/styles/maps/igniteui-angular.css.map +1 -1
  72. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  73. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  74. package/styles/maps/igniteui-dark-green.css.map +1 -1
  75. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  76. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  77. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  78. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  79. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  80. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  81. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  82. package/styles/maps/igniteui-indigo-light.css.map +1 -1
  83. package/lib/services/theme/theme.token.d.ts +0 -24
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Directive, Input, HostListener, EventEmitter, InjectionToken, isDevMode, inject, PLATFORM_ID, Inject, ElementRef, ViewContainerRef, createComponent, Output, HostBinding, Self, Optional, booleanAttribute, SecurityContext, DestroyRef, Component, ContentChildren, ContentChild, RendererStyleFlags2, Pipe, ViewChild, LOCALE_ID, forwardRef, Host, QueryList, ViewChildren, TemplateRef, ChangeDetectionStrategy, SimpleChange, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, reflectComponentType, NgModule } from '@angular/core';
2
+ import { Injectable, Directive, Input, HostListener, EventEmitter, InjectionToken, isDevMode, inject, PLATFORM_ID, Inject, ElementRef, ViewContainerRef, createComponent, Output, HostBinding, Self, Optional, booleanAttribute, SecurityContext, Component, ContentChildren, ContentChild, RendererStyleFlags2, Pipe, ViewChild, DestroyRef, LOCALE_ID, forwardRef, Host, QueryList, ViewChildren, TemplateRef, ChangeDetectionStrategy, SimpleChange, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, reflectComponentType, NgModule } from '@angular/core';
3
3
  import * as i4 from '@angular/forms';
4
4
  import { NgModel, NgControl, FormControlName, NG_VALUE_ACCESSOR, Validators, NG_VALIDATORS, FormGroup, FormsModule, RequiredValidator, MinValidator, MaxValidator, EmailValidator, MinLengthValidator, MaxLengthValidator, PatternValidator, FormControl, ReactiveFormsModule } from '@angular/forms';
5
- import { Observable, NEVER, Subject, fromEvent, BehaviorSubject, interval, animationFrameScheduler, noop, merge, Subscription, timer, takeUntil as takeUntil$1, pipe } from 'rxjs';
5
+ import { Observable, NEVER, Subject, fromEvent, BehaviorSubject, interval, animationFrameScheduler, noop, merge, Subscription, timer, sampleTime, filter as filter$1, tap as tap$1, takeUntil as takeUntil$1, pipe } from 'rxjs';
6
6
  import { takeUntil, filter, throttle, throttleTime, first as first$2, startWith, take, debounce, tap, switchMap, skipLast, debounceTime, map, shareReplay, takeWhile, timeout, pluck } from 'rxjs/operators';
7
7
  import { isPlatformBrowser, formatDate as formatDate$1, CurrencyPipe, formatPercent, formatNumber, getLocaleCurrencyCode, DatePipe, getLocaleDateFormat, FormatWidth, getLocaleDateTimeFormat, DOCUMENT, NgTemplateOutlet, NgIf, NgClass, NgSwitch, NgSwitchCase, NgSwitchDefault, NgFor, TitleCasePipe, getLocaleFirstDayOfWeek, NgStyle, getLocaleCurrencySymbol, formatCurrency as formatCurrency$1, getLocaleNumberFormat, NumberFormatStyle, DecimalPipe, PercentPipe, getCurrencySymbol, AsyncPipe } from '@angular/common';
8
8
  import { mergeWith, isEqual as isEqual$1 } from 'lodash-es';
@@ -789,13 +789,7 @@ function getComponentCssSizeVar(size) {
789
789
  * @returns string encoded using the encodeURI function.
790
790
  */
791
791
  function normalizeURI(path) {
792
- return path?.split('/').map(encodeURI).join('/');
793
- }
794
- function getComponentTheme(el) {
795
- return globalThis.window
796
- ?.getComputedStyle(el)
797
- .getPropertyValue('--theme')
798
- .trim();
792
+ return path.split('/').map(encodeURI).join('/');
799
793
  }
800
794
 
801
795
  var PagingError;
@@ -1409,14 +1403,13 @@ class ExportUtilities {
1409
1403
  return !ExportUtilities.isSpecialData(dataEntry) ? Array.from(keys) : ['Column 1'];
1410
1404
  }
1411
1405
  static saveBlobToFile(blob, fileName) {
1412
- const doc = globalThis.document;
1413
- const a = doc.createElement('a');
1406
+ const a = document.createElement('a');
1414
1407
  const url = window.URL.createObjectURL(blob);
1415
1408
  a.download = fileName;
1416
1409
  a.href = url;
1417
- doc.body.appendChild(a);
1410
+ document.body.appendChild(a);
1418
1411
  a.click();
1419
- doc.body.removeChild(a);
1412
+ document.body.removeChild(a);
1420
1413
  window.URL.revokeObjectURL(url);
1421
1414
  }
1422
1415
  static stringToArrayBuffer(s) {
@@ -1514,7 +1507,7 @@ var FilteringExpressionsTreeType;
1514
1507
  /* marshalByValue */
1515
1508
  /* jsonAPIPlainObject */
1516
1509
  class FilteringExpressionsTree {
1517
- constructor(operator, fieldName) {
1510
+ constructor(operator, fieldName, entity, returnFields) {
1518
1511
  /**
1519
1512
  * Sets/gets the filtering operands.
1520
1513
  * ```typescript
@@ -1537,6 +1530,8 @@ class FilteringExpressionsTree {
1537
1530
  */
1538
1531
  this.filteringOperands = [];
1539
1532
  this.operator = operator;
1533
+ this.entity = entity;
1534
+ this.returnFields = returnFields;
1540
1535
  this.fieldName = fieldName;
1541
1536
  }
1542
1537
  /**
@@ -4539,7 +4534,7 @@ class WorksheetDataDictionary {
4539
4534
  }
4540
4535
  getContext() {
4541
4536
  if (!this._context) {
4542
- const canvas = globalThis.document?.createElement('canvas');
4537
+ const canvas = document.createElement('canvas');
4543
4538
  this._context = canvas.getContext('2d');
4544
4539
  this._context.font = WorksheetDataDictionary.DEFAULT_FONT;
4545
4540
  }
@@ -7327,41 +7322,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
7327
7322
  }]
7328
7323
  }] });
7329
7324
 
7330
- class ThemeToken {
7331
- constructor(t) {
7332
- this.t = t;
7333
- this.document = inject(DOCUMENT);
7334
- const globalTheme = globalThis.window
7335
- ?.getComputedStyle(this.document.body)
7336
- .getPropertyValue("--ig-theme")
7337
- .trim() || 'material';
7338
- const _theme = t ?? globalTheme;
7339
- this.subject = new BehaviorSubject(_theme);
7340
- }
7341
- onChange(callback) {
7342
- return this.subject.subscribe(callback);
7343
- }
7344
- set(theme) {
7345
- this.subject.next(theme);
7346
- }
7347
- get theme() {
7348
- return this.subject.getValue();
7349
- }
7350
- get preferToken() {
7351
- return !!this.t;
7352
- }
7353
- }
7354
- const THEME_TOKEN = new InjectionToken('ThemeToken', {
7355
- providedIn: 'root',
7356
- factory: () => new ThemeToken()
7357
- });
7358
- const Theme = /*@__PURE__*/ mkenum({
7359
- Material: "material",
7360
- Fluent: "fluent",
7361
- Bootstrap: "bootstrap",
7362
- IndigoDesign: "indigo",
7363
- });
7364
-
7365
7325
  // Export services
7366
7326
 
7367
7327
  /** @hidden */
@@ -9742,12 +9702,10 @@ const IndigoIcons = new Map(Object.entries({
9742
9702
  * ```
9743
9703
  */
9744
9704
  class IgxIconService {
9745
- constructor(_sanitizer, _httpClient, _platformUtil, _themeToken, _destroyRef, document) {
9705
+ constructor(_sanitizer, _httpClient, _platformUtil, document) {
9746
9706
  this._sanitizer = _sanitizer;
9747
9707
  this._httpClient = _httpClient;
9748
9708
  this._platformUtil = _platformUtil;
9749
- this._themeToken = _themeToken;
9750
- this._destroyRef = _destroyRef;
9751
9709
  this.document = document;
9752
9710
  this._defaultFamily = {
9753
9711
  name: "material",
@@ -9759,10 +9717,6 @@ class IgxIconService {
9759
9717
  this._iconLoaded = new Subject();
9760
9718
  this.iconLoaded = this._iconLoaded.asObservable();
9761
9719
  this.setFamily(this._defaultFamily.name, this._defaultFamily.meta);
9762
- const { unsubscribe } = this._themeToken?.onChange((theme) => {
9763
- this.setRefsByTheme(theme);
9764
- });
9765
- this._destroyRef.onDestroy(() => unsubscribe);
9766
9720
  if (this._platformUtil?.isBrowser) {
9767
9721
  this._domParser = new DOMParser();
9768
9722
  for (const [name, svg] of IndigoIcons) {
@@ -9815,13 +9769,12 @@ class IgxIconService {
9815
9769
  }
9816
9770
  /** @hidden @internal */
9817
9771
  setRefsByTheme(theme) {
9818
- for (const { alias, target } of iconReferences) {
9819
- const external = this._iconRefs.get(alias.family)?.get(alias.name)?.external;
9820
- const _ref = this._iconRefs.get('default')?.get(alias.name) ?? {};
9821
- const _target = target.get(theme) ?? target.get('default');
9822
- const icon = target.get(theme) ?? target.get('default');
9823
- const overwrite = !external && !(JSON.stringify(_ref) === JSON.stringify(_target));
9824
- this._setIconRef(alias.name, alias.family, icon, overwrite);
9772
+ if (this.theme !== theme) {
9773
+ this.theme = theme;
9774
+ for (const { alias, target } of iconReferences) {
9775
+ const icon = target.get(theme) ?? target.get('default');
9776
+ this.addIconRef(alias.name, alias.family, icon);
9777
+ }
9825
9778
  }
9826
9779
  }
9827
9780
  /**
@@ -9847,14 +9800,6 @@ class IgxIconService {
9847
9800
  this.setIconRef(name, family, icon);
9848
9801
  }
9849
9802
  }
9850
- _setIconRef(name, family, icon, overwrite = false) {
9851
- if (overwrite) {
9852
- this.setIconRef(name, family, {
9853
- ...icon,
9854
- external: false
9855
- });
9856
- }
9857
- }
9858
9803
  /**
9859
9804
  * Similar to addIconRef, but always sets the icon reference meta for an icon in a meta family.
9860
9805
  * ```typescript
@@ -9867,9 +9812,8 @@ class IgxIconService {
9867
9812
  familyRef = new Map();
9868
9813
  this._iconRefs.set(family, familyRef);
9869
9814
  }
9870
- const external = icon.external ?? true;
9871
9815
  const familyType = this.familyType(icon?.family);
9872
- familyRef.set(name, { ...icon, type: icon.type ?? familyType, external });
9816
+ familyRef.set(name, { ...icon, type: icon.type ?? familyType });
9873
9817
  this._iconLoaded.next({ name, family });
9874
9818
  }
9875
9819
  /**
@@ -10008,7 +9952,7 @@ class IgxIconService {
10008
9952
  }
10009
9953
  }
10010
9954
  }
10011
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxIconService, deps: [{ token: i1$1.DomSanitizer, optional: true }, { token: i2.HttpClient, optional: true }, { token: PlatformUtil, optional: true }, { token: THEME_TOKEN, optional: true }, { token: DestroyRef, optional: true }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
9955
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxIconService, deps: [{ token: i1$1.DomSanitizer, optional: true }, { token: i2.HttpClient, optional: true }, { token: PlatformUtil, optional: true }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
10012
9956
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxIconService, providedIn: "root" }); }
10013
9957
  }
10014
9958
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxIconService, decorators: [{
@@ -10022,16 +9966,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
10022
9966
  type: Optional
10023
9967
  }] }, { type: PlatformUtil, decorators: [{
10024
9968
  type: Optional
10025
- }] }, { type: ThemeToken, decorators: [{
10026
- type: Optional
10027
- }, {
10028
- type: Inject,
10029
- args: [THEME_TOKEN]
10030
- }] }, { type: i0.DestroyRef, decorators: [{
10031
- type: Optional
10032
- }, {
10033
- type: Inject,
10034
- args: [DestroyRef]
10035
9969
  }] }, { type: Document, decorators: [{
10036
9970
  type: Optional
10037
9971
  }, {
@@ -10039,6 +9973,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
10039
9973
  args: [DOCUMENT]
10040
9974
  }] }] });
10041
9975
 
9976
+ const Theme = /*@__PURE__*/ mkenum({
9977
+ Material: "material",
9978
+ Fluent: "fluent",
9979
+ Bootstrap: "bootstrap",
9980
+ IndigoDesign: "indigo",
9981
+ });
9982
+ class ThemeService {
9983
+ constructor(document) {
9984
+ this.document = document;
9985
+ this.theme$ = new BehaviorSubject("material");
9986
+ this.theme$.asObservable().subscribe((value) => {
9987
+ this.globalTheme = value;
9988
+ });
9989
+ this.init();
9990
+ }
9991
+ init() {
9992
+ const theme = globalThis.window
9993
+ ?.getComputedStyle(this.document.body)
9994
+ .getPropertyValue("--ig-theme")
9995
+ .trim();
9996
+ if (theme !== "") {
9997
+ this.theme$.next(theme);
9998
+ }
9999
+ }
10000
+ getComponentTheme(el) {
10001
+ return globalThis.window
10002
+ ?.getComputedStyle(el.nativeElement)
10003
+ .getPropertyValue('--theme')
10004
+ .trim();
10005
+ }
10006
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ThemeService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
10007
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ThemeService, providedIn: "root" }); }
10008
+ }
10009
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ThemeService, decorators: [{
10010
+ type: Injectable,
10011
+ args: [{
10012
+ providedIn: "root",
10013
+ }]
10014
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
10015
+ type: Inject,
10016
+ args: [DOCUMENT]
10017
+ }] }] });
10018
+
10042
10019
  /**
10043
10020
  * Icon provides a way to include material icons to markup
10044
10021
  *
@@ -10088,13 +10065,28 @@ class IgxIconComponent {
10088
10065
  get getInactive() {
10089
10066
  return !this.active;
10090
10067
  }
10091
- constructor(el, iconService, ref) {
10068
+ constructor(el, iconService, themeService, ref) {
10092
10069
  this.el = el;
10093
10070
  this.iconService = iconService;
10071
+ this.themeService = themeService;
10094
10072
  this.ref = ref;
10095
10073
  this._destroy$ = new Subject();
10096
10074
  this._userClasses = new Set();
10097
10075
  this._iconClasses = new Set();
10076
+ /**
10077
+ * This allows you to disable the `aria-hidden` attribute. By default it's applied.
10078
+ *
10079
+ * @example
10080
+ * ```typescript
10081
+ * @ViewChild("MyIcon") public icon: IgxIconComponent;
10082
+ * constructor(private cdRef:ChangeDetectorRef) {}
10083
+ * ngAfterViewInit() {
10084
+ * this.icon.ariaHidden = false;
10085
+ * this.cdRef.detectChanges();
10086
+ * }
10087
+ * ```
10088
+ */
10089
+ this.ariaHidden = true;
10098
10090
  /**
10099
10091
  * An @Input property that allows you to disable the `active` property. By default it's applied.
10100
10092
  *
@@ -10105,6 +10097,7 @@ class IgxIconComponent {
10105
10097
  */
10106
10098
  this.active = true;
10107
10099
  this.family = this.iconService.defaultFamily.name;
10100
+ this.iconService.setRefsByTheme(this.themeService.globalTheme);
10108
10101
  this.iconService.iconLoaded
10109
10102
  .pipe(filter((e) => e.name === this.name && e.family === this.family), takeUntil(this._destroy$))
10110
10103
  .subscribe(() => {
@@ -10217,15 +10210,18 @@ class IgxIconComponent {
10217
10210
  }
10218
10211
  this.addIconClass(className);
10219
10212
  }
10220
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxIconComponent, deps: [{ token: i0.ElementRef }, { token: IgxIconService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
10221
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: IgxIconComponent, isStandalone: true, selector: "igx-icon", inputs: { family: "family", name: "name", active: ["active", "active", booleanAttribute] }, host: { properties: { "class": "this.elementClasses", "class.igx-icon--inactive": "this.getInactive" } }, usesOnChanges: true, ngImport: i0, template: "<!-- This is only here for backwards compatibility in case -->\n<!-- ligatures are used and the name is provided as content -->\n@if (!iconRef.name) {\n <ng-content></ng-content>\n}\n\n@switch (iconRef.type) {\n @case (\"liga\") {{{ iconRef.name }}}\n\n @case (\"svg\") {\n <div [innerHTML]=\"getSvg\"></div>\n }\n}\n" }); }
10213
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxIconComponent, deps: [{ token: i0.ElementRef }, { token: IgxIconService }, { token: ThemeService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
10214
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: IgxIconComponent, isStandalone: true, selector: "igx-icon", inputs: { family: "family", name: "name", active: ["active", "active", booleanAttribute] }, host: { properties: { "class": "this.elementClasses", "attr.aria-hidden": "this.ariaHidden", "class.igx-icon--inactive": "this.getInactive" } }, usesOnChanges: true, ngImport: i0, template: "<!-- This is only here for backwards compatibility in case -->\n<!-- ligatures are used and the name is provided as content -->\n@if (!iconRef.name) {\n <ng-content></ng-content>\n}\n\n@switch (iconRef.type) {\n @case (\"liga\") {{{ iconRef.name }}}\n\n @case (\"svg\") {\n <div [innerHTML]=\"getSvg\"></div>\n }\n}\n" }); }
10222
10215
  }
10223
10216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxIconComponent, decorators: [{
10224
10217
  type: Component,
10225
10218
  args: [{ selector: "igx-icon", imports: [NgTemplateOutlet, NgIf], template: "<!-- This is only here for backwards compatibility in case -->\n<!-- ligatures are used and the name is provided as content -->\n@if (!iconRef.name) {\n <ng-content></ng-content>\n}\n\n@switch (iconRef.type) {\n @case (\"liga\") {{{ iconRef.name }}}\n\n @case (\"svg\") {\n <div [innerHTML]=\"getSvg\"></div>\n }\n}\n" }]
10226
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: IgxIconService }, { type: i0.ChangeDetectorRef }], propDecorators: { elementClasses: [{
10219
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: IgxIconService }, { type: ThemeService }, { type: i0.ChangeDetectorRef }], propDecorators: { elementClasses: [{
10227
10220
  type: HostBinding,
10228
10221
  args: ["class"]
10222
+ }], ariaHidden: [{
10223
+ type: HostBinding,
10224
+ args: ["attr.aria-hidden"]
10229
10225
  }], getInactive: [{
10230
10226
  type: HostBinding,
10231
10227
  args: ["class.igx-icon--inactive"]
@@ -10351,13 +10347,13 @@ class IgxInputGroupComponent {
10351
10347
  get theme() {
10352
10348
  return this._theme;
10353
10349
  }
10354
- constructor(element, _inputGroupType, document, platform, cdr, themeToken) {
10350
+ constructor(element, _inputGroupType, document, platform, cdr, themeService) {
10355
10351
  this.element = element;
10356
10352
  this._inputGroupType = _inputGroupType;
10357
10353
  this.document = document;
10358
10354
  this.platform = platform;
10359
10355
  this.cdr = cdr;
10360
- this.themeToken = themeToken;
10356
+ this.themeService = themeService;
10361
10357
  /**
10362
10358
  * Property that enables/disables the auto-generated class of the `IgxInputGroupComponent`.
10363
10359
  * By default applied the class is applied.
@@ -10398,18 +10394,15 @@ class IgxInputGroupComponent {
10398
10394
  this.suppressInputAutofocus = false;
10399
10395
  /** @hidden */
10400
10396
  this.hasWarning = false;
10401
- this._destroyRef = inject(DestroyRef);
10402
10397
  this._type = null;
10403
10398
  this._filled = false;
10399
+ this._theme$ = new Subject();
10404
10400
  this._resourceStrings = getCurrentResourceStrings(InputResourceStringsEN);
10405
- this._theme = this.themeToken.theme;
10406
- const { unsubscribe } = this.themeToken.onChange((theme) => {
10407
- if (this._theme !== theme) {
10408
- this._theme = theme;
10409
- this.cdr.detectChanges();
10410
- }
10401
+ this._theme = this.themeService.globalTheme;
10402
+ this._subscription = this._theme$.asObservable().subscribe(value => {
10403
+ this._theme = value;
10404
+ this.cdr.detectChanges();
10411
10405
  });
10412
- this._destroyRef.onDestroy(() => unsubscribe);
10413
10406
  }
10414
10407
  /** @hidden */
10415
10408
  onClick(event) {
@@ -10587,20 +10580,19 @@ class IgxInputGroupComponent {
10587
10580
  set filled(val) {
10588
10581
  this._filled = val;
10589
10582
  }
10590
- setComponentTheme() {
10591
- if (!this.themeToken.preferToken) {
10592
- const theme = getComponentTheme(this.element.nativeElement);
10593
- if (theme && theme !== this._theme) {
10594
- this.theme = theme;
10595
- this.cdr.markForCheck();
10596
- }
10583
+ /** @hidden @internal */
10584
+ ngAfterViewChecked() {
10585
+ const theme = this.themeService.getComponentTheme(this.element);
10586
+ if (theme) {
10587
+ this._theme$.next(theme);
10588
+ this.cdr.markForCheck();
10597
10589
  }
10598
10590
  }
10599
10591
  /** @hidden @internal */
10600
- ngAfterViewInit() {
10601
- this.setComponentTheme();
10592
+ ngOnDestroy() {
10593
+ this._subscription.unsubscribe();
10602
10594
  }
10603
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxInputGroupComponent, deps: [{ token: i0.ElementRef }, { token: IGX_INPUT_GROUP_TYPE, optional: true }, { token: DOCUMENT }, { token: PlatformUtil }, { token: i0.ChangeDetectorRef }, { token: THEME_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
10595
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxInputGroupComponent, deps: [{ token: i0.ElementRef }, { token: IGX_INPUT_GROUP_TYPE, optional: true }, { token: DOCUMENT }, { token: PlatformUtil }, { token: i0.ChangeDetectorRef }, { token: ThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
10604
10596
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxInputGroupComponent, isStandalone: true, selector: "igx-input-group", inputs: { resourceStrings: "resourceStrings", suppressInputAutofocus: ["suppressInputAutofocus", "suppressInputAutofocus", booleanAttribute], type: "type", theme: "theme" }, host: { listeners: { "click": "onClick($event)", "pointerdown": "onPointerDown($event)" }, properties: { "class.igx-input-group": "this.defaultClass", "class.igx-input-group--placeholder": "this.hasPlaceholder", "class.igx-input-group--required": "this.isRequired", "class.igx-input-group--focused": "this.isFocused", "class.igx-input-group--disabled": "this.disabled", "class.igx-input-group--warning": "this.hasWarning", "class.igx-input-group--valid": "this.validClass", "class.igx-input-group--invalid": "this.invalidClass", "class.igx-input-group--filled": "this.isFilled", "class.igx-input-group--textarea-group": "this.textAreaClass", "class.igx-input-group--prefixed": "this.hasPrefixes", "class.igx-input-group--suffixed": "this.hasSuffixes", "class.igx-input-group--box": "this.isTypeBox", "class.igx-input-group--file": "this.isFileType", "class.igx-input-group--border": "this.isTypeBorder", "class.igx-input-group--fluent": "this.isTypeFluent", "class.igx-input-group--bootstrap": "this.isTypeBootstrap", "class.igx-input-group--indigo": "this.isTypeIndigo", "class.igx-input-group--search": "this.isTypeSearch" } }, providers: [{ provide: IgxInputGroupBase, useExisting: IgxInputGroupComponent }], queries: [{ propertyName: "input", first: true, predicate: IgxInputDirective, descendants: true, read: IgxInputDirective, static: true }, { propertyName: "hints", predicate: IgxHintDirective, read: IgxHintDirective }, { propertyName: "_prefixes", predicate: IgxPrefixDirective, descendants: true, read: IgxPrefixDirective }, { propertyName: "_suffixes", predicate: IgxSuffixDirective, descendants: true, read: IgxSuffixDirective }], ngImport: i0, template: "<div class=\"igx-input-group__wrapper\" *ngIf=\"isTypeBox; else bundle\">\n <ng-container *ngTemplateOutlet=\"bundle\"></ng-container>\n</div>\n\n<div class=\"igx-input-group__hint\" (click)=\"hintClickHandler($event)\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n</div>\n\n<ng-template #label>\n <ng-content select=\"[igxLabel]\"></ng-content>\n</ng-template>\n\n<ng-template #input>\n <ng-content select=\"[igxInput]\"></ng-content>\n</ng-template>\n\n<ng-template #prefix>\n <ng-content select=\"igx-prefix, [igxPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #uploadButton>\n <igx-prefix *ngIf=\"isFileType\" class=\"igx-input-group__upload-button\">\n <button\n igxButton=\"contained\"\n type=\"button\"\n (click)=\"uploadButtonHandler()\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'igx-input-group__upload-button': isTypeLine }\"\n >\n {{ resourceStrings.igx_input_upload_button }}\n </button>\n </igx-prefix>\n</ng-template>\n\n<ng-template #files>\n <div\n *ngIf=\"isFileType\"\n class=\"igx-input-group__file-input\"\n [title]=\"fileNames\"\n >\n <span>{{ fileNames }}</span>\n </div>\n</ng-template>\n\n<ng-template #clear>\n <igx-suffix\n class=\"igx-input-group__clear-icon\"\n *ngIf=\"isFileType && isFilled\"\n (click)=\"clearValueHandler()\"\n (keydown.Enter)=\"clearValueHandler()\"\n title=\"clear files\"\n tabindex=\"0\"\n >\n <igx-icon family=\"default\" name=\"input_clear\"></igx-icon>\n </igx-suffix>\n</ng-template>\n\n<ng-template #suffix>\n <ng-content select=\"igx-suffix, [igxSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #materialBundle>\n <div class=\"igx-input-group__bundle\">\n <div class=\"igx-input-group__bundle-start\">\n <ng-container *ngTemplateOutlet=\"prefix\"></ng-container>\n <ng-container *ngTemplateOutlet=\"uploadButton\"></ng-container>\n </div>\n\n <ng-container>\n <div class=\"igx-input-group__notch\">\n <ng-container *ngTemplateOutlet=\"label\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"igx-input-group__bundle-main\">\n <ng-container *ngTemplateOutlet=\"input\"></ng-container>\n <ng-container *ngTemplateOutlet=\"files\"></ng-container>\n </div>\n\n <div class=\"igx-input-group__filler\"></div>\n\n <div class=\"igx-input-group__bundle-end\">\n <ng-container *ngTemplateOutlet=\"clear\"></ng-container>\n <ng-container *ngTemplateOutlet=\"suffix\"></ng-container>\n </div>\n\n <div class=\"igx-input-group__line\" *ngIf=\"hasBorder\"></div>\n </div>\n</ng-template>\n\n<ng-template #fluentBundle>\n <ng-container *ngTemplateOutlet=\"label\"></ng-container>\n\n <div class=\"igx-input-group__bundle\">\n <div class=\"igx-input-group__bundle-start\">\n <ng-container *ngTemplateOutlet=\"prefix\"></ng-container>\n <ng-container *ngTemplateOutlet=\"uploadButton\"></ng-container>\n </div>\n\n\n <div class=\"igx-input-group__bundle-main\">\n <ng-container *ngTemplateOutlet=\"input\"></ng-container>\n <ng-container *ngTemplateOutlet=\"files\"></ng-container>\n </div>\n\n <div class=\"igx-input-group__bundle-end\">\n <ng-container *ngTemplateOutlet=\"clear\"></ng-container>\n <ng-container *ngTemplateOutlet=\"suffix\"></ng-container>\n </div>\n\n <div class=\"igx-input-group__line\" *ngIf=\"hasBorder\"></div>\n </div>\n</ng-template>\n\n<ng-template #bootstrapBundle>\n <ng-container *ngTemplateOutlet=\"label\"></ng-container>\n\n <div class=\"igx-input-group__bundle\">\n <div class=\"igx-input-group__bundle-start\">\n <ng-container *ngTemplateOutlet=\"prefix\"></ng-container>\n <ng-container *ngTemplateOutlet=\"uploadButton\"></ng-container>\n </div>\n\n <ng-container *ngTemplateOutlet=\"input\"></ng-container>\n <ng-container *ngTemplateOutlet=\"files\"></ng-container>\n\n <div class=\"igx-input-group__bundle-end\">\n <ng-container *ngTemplateOutlet=\"clear\"></ng-container>\n <ng-container *ngTemplateOutlet=\"suffix\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #bundle>\n <ng-container [ngSwitch]=\"theme\">\n <ng-container *ngSwitchCase=\"'bootstrap'\">\n <ng-container *ngTemplateOutlet=\"bootstrapBundle\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'fluent'\">\n <ng-container *ngTemplateOutlet=\"fluentBundle\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'indigo'\">\n <ng-container *ngTemplateOutlet=\"fluentBundle\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"materialBundle\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
10605
10597
  }
10606
10598
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxInputGroupComponent, decorators: [{
@@ -10614,10 +10606,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
10614
10606
  }] }, { type: undefined, decorators: [{
10615
10607
  type: Inject,
10616
10608
  args: [DOCUMENT]
10617
- }] }, { type: PlatformUtil }, { type: i0.ChangeDetectorRef }, { type: ThemeToken, decorators: [{
10618
- type: Inject,
10619
- args: [THEME_TOKEN]
10620
- }] }], propDecorators: { resourceStrings: [{
10609
+ }] }, { type: PlatformUtil }, { type: i0.ChangeDetectorRef }, { type: ThemeService }], propDecorators: { resourceStrings: [{
10621
10610
  type: Input
10622
10611
  }], defaultClass: [{
10623
10612
  type: HostBinding,
@@ -11379,7 +11368,7 @@ class IgxDragDirective {
11379
11368
  set ghostLeft(pageX) {
11380
11369
  if (this.ghostElement) {
11381
11370
  // We need to take into account marginLeft, since top style does not include margin, but pageX includes the margin.
11382
- const ghostMarginLeft = parseInt(this.document.defaultView.getComputedStyle(this.ghostElement)['margin-left'], 10);
11371
+ const ghostMarginLeft = parseInt(document.defaultView.getComputedStyle(this.ghostElement)['margin-left'], 10);
11383
11372
  // If ghost host is defined it needs to be taken into account.
11384
11373
  this.ghostElement.style.left = (pageX - ghostMarginLeft - this._ghostHostX) + 'px';
11385
11374
  }
@@ -11392,7 +11381,7 @@ class IgxDragDirective {
11392
11381
  set ghostTop(pageY) {
11393
11382
  if (this.ghostElement) {
11394
11383
  // We need to take into account marginTop, since top style does not include margin, but pageY includes the margin.
11395
- const ghostMarginTop = parseInt(this.document.defaultView.getComputedStyle(this.ghostElement)['margin-top'], 10);
11384
+ const ghostMarginTop = parseInt(document.defaultView.getComputedStyle(this.ghostElement)['margin-top'], 10);
11396
11385
  // If ghost host is defined it needs to be taken into account.
11397
11386
  this.ghostElement.style.top = (pageY - ghostMarginTop - this._ghostHostY) + 'px';
11398
11387
  }
@@ -11403,16 +11392,16 @@ class IgxDragDirective {
11403
11392
  }
11404
11393
  }
11405
11394
  get windowScrollTop() {
11406
- return this.document.documentElement.scrollTop || window.scrollY;
11395
+ return document.documentElement.scrollTop || window.scrollY;
11407
11396
  }
11408
11397
  get windowScrollLeft() {
11409
- return this.document.documentElement.scrollLeft || window.scrollX;
11398
+ return document.documentElement.scrollLeft || window.scrollX;
11410
11399
  }
11411
11400
  get windowScrollHeight() {
11412
- return this.document.documentElement.scrollHeight;
11401
+ return document.documentElement.scrollHeight;
11413
11402
  }
11414
11403
  get windowScrollWidth() {
11415
- return this.document.documentElement.scrollWidth;
11404
+ return document.documentElement.scrollWidth;
11416
11405
  }
11417
11406
  /**
11418
11407
  * Sets the offset of the dragged element relative to the mouse in pixels.
@@ -11671,7 +11660,6 @@ class IgxDragDirective {
11671
11660
  this._scrollContainerStepMs = 10;
11672
11661
  this._scrollContainerThreshold = 25;
11673
11662
  this._containerScrollIntervalId = null;
11674
- this.document = inject(DOCUMENT);
11675
11663
  }
11676
11664
  /**
11677
11665
  * @hidden
@@ -11719,13 +11707,13 @@ class IgxDragDirective {
11719
11707
  });
11720
11708
  // We should bind to document events only once when there are no pointer events.
11721
11709
  if (!this.pointerEventsEnabled && this.touchEventsEnabled) {
11722
- fromEvent(this.document.defaultView, 'touchmove').pipe(throttle(() => interval(0, animationFrameScheduler)), takeUntil(this._destroy)).subscribe((res) => this.onPointerMove(res));
11723
- fromEvent(this.document.defaultView, 'touchend').pipe(takeUntil(this._destroy))
11710
+ fromEvent(document.defaultView, 'touchmove').pipe(throttle(() => interval(0, animationFrameScheduler)), takeUntil(this._destroy)).subscribe((res) => this.onPointerMove(res));
11711
+ fromEvent(document.defaultView, 'touchend').pipe(takeUntil(this._destroy))
11724
11712
  .subscribe((res) => this.onPointerUp(res));
11725
11713
  }
11726
11714
  else if (!this.pointerEventsEnabled) {
11727
- fromEvent(this.document.defaultView, 'mousemove').pipe(throttle(() => interval(0, animationFrameScheduler)), takeUntil(this._destroy)).subscribe((res) => this.onPointerMove(res));
11728
- fromEvent(this.document.defaultView, 'mouseup').pipe(takeUntil(this._destroy))
11715
+ fromEvent(document.defaultView, 'mousemove').pipe(throttle(() => interval(0, animationFrameScheduler)), takeUntil(this._destroy)).subscribe((res) => this.onPointerMove(res));
11716
+ fromEvent(document.defaultView, 'mouseup').pipe(takeUntil(this._destroy))
11729
11717
  .subscribe((res) => this.onPointerUp(res));
11730
11718
  }
11731
11719
  this.element.nativeElement.addEventListener('transitionend', this.onTransitionEnd.bind(this));
@@ -12084,9 +12072,9 @@ class IgxDragDirective {
12084
12072
  ghostReattached = true;
12085
12073
  this.ghostHost.appendChild(this.ghostElement);
12086
12074
  }
12087
- else if (!this.ghostHost && !Array.from(this.document.body.children).includes(this.ghostElement)) {
12075
+ else if (!this.ghostHost && !Array.from(document.body.children).includes(this.ghostElement)) {
12088
12076
  ghostReattached = true;
12089
- this.document.body.appendChild(this.ghostElement);
12077
+ document.body.appendChild(this.ghostElement);
12090
12078
  }
12091
12079
  if (ghostReattached) {
12092
12080
  this.ghostElement.setPointerCapture(this._pointerDownId);
@@ -12224,10 +12212,10 @@ class IgxDragDirective {
12224
12212
  this.ghostHost.appendChild(this.ghostElement);
12225
12213
  }
12226
12214
  else {
12227
- this.document.body.appendChild(this.ghostElement);
12215
+ document.body.appendChild(this.ghostElement);
12228
12216
  }
12229
- const ghostMarginLeft = parseInt(this.document.defaultView.getComputedStyle(this.ghostElement)['margin-left'], 10);
12230
- const ghostMarginTop = parseInt(this.document.defaultView.getComputedStyle(this.ghostElement)['margin-top'], 10);
12217
+ const ghostMarginLeft = parseInt(document.defaultView.getComputedStyle(this.ghostElement)['margin-left'], 10);
12218
+ const ghostMarginTop = parseInt(document.defaultView.getComputedStyle(this.ghostElement)['margin-top'], 10);
12231
12219
  this.ghostElement.style.left = (this._ghostStartX - ghostMarginLeft + totalMovedX - this._ghostHostX) + 'px';
12232
12220
  this.ghostElement.style.top = (this._ghostStartY - ghostMarginTop + totalMovedY - this._ghostHostY) + 'px';
12233
12221
  if (this.pointerEventsEnabled) {
@@ -12336,14 +12324,14 @@ class IgxDragDirective {
12336
12324
  // using window.pageXOffset for IE9 compatibility
12337
12325
  const viewPortX = pageX - window.pageXOffset;
12338
12326
  const viewPortY = pageY - window.pageYOffset;
12339
- if (this.document['msElementsFromPoint']) {
12327
+ if (document['msElementsFromPoint']) {
12340
12328
  // Edge and IE special snowflakes
12341
- const elements = this.document['msElementsFromPoint'](viewPortX, viewPortY);
12329
+ const elements = document['msElementsFromPoint'](viewPortX, viewPortY);
12342
12330
  return elements === null ? [] : elements;
12343
12331
  }
12344
12332
  else {
12345
12333
  // Other browsers like Chrome, Firefox, Opera
12346
- return this.document.elementsFromPoint(viewPortX, viewPortY);
12334
+ return document.elementsFromPoint(viewPortX, viewPortY);
12347
12335
  }
12348
12336
  }
12349
12337
  /**
@@ -12396,8 +12384,8 @@ class IgxDragDirective {
12396
12384
  getGhostHostBaseOffsetX() {
12397
12385
  if (!this.ghostHost)
12398
12386
  return 0;
12399
- const ghostPosition = this.document.defaultView.getComputedStyle(this.ghostHost).getPropertyValue('position');
12400
- if (ghostPosition === 'static' && this.ghostHost.offsetParent && this.ghostHost.offsetParent === this.document.body) {
12387
+ const ghostPosition = document.defaultView.getComputedStyle(this.ghostHost).getPropertyValue('position');
12388
+ if (ghostPosition === 'static' && this.ghostHost.offsetParent && this.ghostHost.offsetParent === document.body) {
12401
12389
  return 0;
12402
12390
  }
12403
12391
  else if (ghostPosition === 'static' && this.ghostHost.offsetParent) {
@@ -12408,8 +12396,8 @@ class IgxDragDirective {
12408
12396
  getGhostHostBaseOffsetY() {
12409
12397
  if (!this.ghostHost)
12410
12398
  return 0;
12411
- const ghostPosition = this.document.defaultView.getComputedStyle(this.ghostHost).getPropertyValue('position');
12412
- if (ghostPosition === 'static' && this.ghostHost.offsetParent && this.ghostHost.offsetParent === this.document.body) {
12399
+ const ghostPosition = document.defaultView.getComputedStyle(this.ghostHost).getPropertyValue('position');
12400
+ if (ghostPosition === 'static' && this.ghostHost.offsetParent && this.ghostHost.offsetParent === document.body) {
12413
12401
  return 0;
12414
12402
  }
12415
12403
  else if (ghostPosition === 'static' && this.ghostHost.offsetParent) {
@@ -12453,8 +12441,8 @@ class IgxDragDirective {
12453
12441
  let yDir = scrollDir == DragScrollDirection$1.UP ? -1 : (scrollDir == DragScrollDirection$1.DOWN ? 1 : 0);
12454
12442
  if (!this.scrollContainer) {
12455
12443
  // Cap scrolling so we don't scroll past the window max scroll position.
12456
- const maxScrollX = this._originalScrollContainerWidth - this.document.documentElement.clientWidth;
12457
- const maxScrollY = this._originalScrollContainerHeight - this.document.documentElement.clientHeight;
12444
+ const maxScrollX = this._originalScrollContainerWidth - document.documentElement.clientWidth;
12445
+ const maxScrollY = this._originalScrollContainerHeight - document.documentElement.clientHeight;
12458
12446
  xDir = (this.windowScrollLeft <= 0 && xDir < 0) || (this.windowScrollLeft >= maxScrollX && xDir > 0) ? 0 : xDir;
12459
12447
  yDir = (this.windowScrollTop <= 0 && yDir < 0) || (this.windowScrollTop >= maxScrollY && yDir > 0) ? 0 : yDir;
12460
12448
  }
@@ -16754,10 +16742,10 @@ class IgxCheckboxComponent {
16754
16742
  this._onChangeCallback(this._checked);
16755
16743
  }
16756
16744
  }
16757
- constructor(cdr, renderer, themeToken, ngControl) {
16745
+ constructor(cdr, renderer, themeService, ngControl) {
16758
16746
  this.cdr = cdr;
16759
16747
  this.renderer = renderer;
16760
- this.themeToken = themeToken;
16748
+ this.themeService = themeService;
16761
16749
  this.ngControl = ngControl;
16762
16750
  /**
16763
16751
  * An event that is emitted after the checkbox state is changed.
@@ -16970,27 +16958,17 @@ class IgxCheckboxComponent {
16970
16958
  */
16971
16959
  this._required = false;
16972
16960
  this.elRef = inject(ElementRef);
16961
+ this._theme$ = new Subject();
16973
16962
  this.destroyRef = inject(DestroyRef);
16974
16963
  if (this.ngControl !== null) {
16975
16964
  this.ngControl.valueAccessor = this;
16976
16965
  }
16977
- this.theme = this.themeToken.theme;
16978
- const { unsubscribe } = this.themeToken.onChange((theme) => {
16979
- if (this.theme !== theme) {
16980
- this.theme = theme;
16981
- this.cdr.detectChanges();
16982
- }
16966
+ this.theme = this.themeService.globalTheme;
16967
+ this._subscription = this._theme$.asObservable().subscribe(value => {
16968
+ this.theme = value;
16969
+ this.cdr.detectChanges();
16983
16970
  });
16984
- this.destroyRef.onDestroy(() => unsubscribe);
16985
- }
16986
- setComponentTheme() {
16987
- if (!this.themeToken.preferToken) {
16988
- const theme = getComponentTheme(this.elRef.nativeElement);
16989
- if (theme && theme !== this.theme) {
16990
- this.theme = theme;
16991
- this.cdr.markForCheck();
16992
- }
16993
- }
16971
+ this.destroyRef.onDestroy(() => this._subscription.unsubscribe());
16994
16972
  }
16995
16973
  /**
16996
16974
  * @hidden
@@ -17004,7 +16982,11 @@ class IgxCheckboxComponent {
17004
16982
  this.cdr.detectChanges();
17005
16983
  }
17006
16984
  }
17007
- this.setComponentTheme();
16985
+ const theme = this.themeService.getComponentTheme(this.elRef);
16986
+ if (theme) {
16987
+ this._theme$.next(theme);
16988
+ this.cdr.markForCheck();
16989
+ }
17008
16990
  }
17009
16991
  /** @hidden @internal */
17010
16992
  onKeyUp(event) {
@@ -17125,7 +17107,7 @@ class IgxCheckboxComponent {
17125
17107
  this.invalid = false;
17126
17108
  }
17127
17109
  }
17128
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxCheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: THEME_TOKEN }, { token: i4.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
17110
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxCheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: ThemeService }, { token: i4.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
17129
17111
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: IgxCheckboxComponent, isStandalone: true, selector: "igx-checkbox", inputs: { id: "id", labelId: "labelId", value: "value", name: "name", tabindex: "tabindex", labelPosition: "labelPosition", disableRipple: ["disableRipple", "disableRipple", booleanAttribute], required: ["required", "required", booleanAttribute], ariaLabelledBy: ["aria-labelledby", "ariaLabelledBy"], ariaLabel: ["aria-label", "ariaLabel"], indeterminate: ["indeterminate", "indeterminate", booleanAttribute], checked: ["checked", "checked", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], invalid: ["invalid", "invalid", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], disableTransitions: ["disableTransitions", "disableTransitions", booleanAttribute] }, outputs: { change: "change" }, host: { listeners: { "keyup": "onKeyUp($event)", "click": "_onCheckboxClick($event)", "blur": "onBlur()" }, properties: { "attr.id": "this.id", "class.igx-checkbox": "this.cssClass", "class.igx-checkbox--material": "this.material", "class.igx-checkbox--indigo": "this.indigo", "class.igx-checkbox--bootstrap": "this.bootstrap", "class.igx-checkbox--fluent": "this.fluent", "class.igx-checkbox--focused": "this.focused", "class.igx-checkbox--indeterminate": "this.indeterminate", "class.igx-checkbox--checked": "this.checked", "class.igx-checkbox--disabled": "this.disabled", "class.igx-checkbox--invalid": "this.invalid", "class.igx-checkbox--plain": "this.disableTransitions" } }, providers: [{
17130
17112
  provide: EDITOR_PROVIDER,
17131
17113
  useExisting: IgxCheckboxComponent,
@@ -17139,10 +17121,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
17139
17121
  useExisting: IgxCheckboxComponent,
17140
17122
  multi: true
17141
17123
  }], preserveWhitespaces: false, imports: [IgxRippleDirective], template: "<input #checkbox class=\"igx-checkbox__input\"\n type=\"checkbox\"\n [id]=\"inputId\"\n [name]=\"name\"\n [value]=\"value\"\n [tabindex]=\"tabindex\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n [checked]=\"checked\"\n [required]=\"required\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-checked]=\"ariaChecked\"\n [attr.aria-labelledby]=\"ariaLabel ? null : ariaLabelledBy\"\n [attr.aria-label]=\"ariaLabel\"\n (change)=\"_onCheckboxChange($event)\"\n (blur)=\"onBlur()\" />\n\n<div\n igxRipple\n igxRippleTarget=\".igx-checkbox__ripple\"\n [igxRippleDisabled]=\"disableRipple\"\n [igxRippleCentered]=\"true\"\n [igxRippleDuration]=\"300\"\n class=\"igx-checkbox__composite-wrapper\"\n>\n <span #label class=\"igx-checkbox__composite\">\n @if (theme === 'indigo') {\n <svg class=\"igx-checkbox__composite-mark\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <rect width=\"18\" height=\"4\" x=\"2\" y=\"9\" rx=\"1.85\"/>\n <path d=\"M19.033 5a1.966 1.966 0 0 0-1.418.586l-8.479 8.577-2.753-2.77a1.971 1.971 0 0 0-2.8 0 1.998 1.998 0 0 0 0 2.822l4.155 4.196a1.955 1.955 0 0 0 2.8 0l9.879-9.99a1.998 1.998 0 0 0 0-2.821 1.966 1.966 0 0 0-1.384-.6Z\"/>\n </svg>\n } @else {\n <svg class=\"igx-checkbox__composite-mark\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path d=\"M4.1,12.7 9,17.6 20.3,6.3\"/>\n </svg>\n }\n </span>\n\n <div class=\"igx-checkbox__ripple\"></div>\n</div>\n\n<span #placeholderLabel\n [class]=\"labelClass\"\n [id]=\"labelId\">\n <ng-content></ng-content>\n</span>\n" }]
17142
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: ThemeToken, decorators: [{
17143
- type: Inject,
17144
- args: [THEME_TOKEN]
17145
- }] }, { type: i4.NgControl, decorators: [{
17124
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: ThemeService }, { type: i4.NgControl, decorators: [{
17146
17125
  type: Optional
17147
17126
  }, {
17148
17127
  type: Self
@@ -21235,18 +21214,31 @@ class IgxFilteringOperand {
21235
21214
  }, {
21236
21215
  name: 'in',
21237
21216
  isUnary: false,
21238
- iconName: 'filter_in',
21239
- hidden: true,
21217
+ isNestedQuery: true,
21218
+ iconName: 'in',
21240
21219
  logic: (target, searchVal) => this.findValueInSet(target, searchVal)
21220
+ },
21221
+ {
21222
+ name: 'notIn',
21223
+ isUnary: false,
21224
+ isNestedQuery: true,
21225
+ iconName: 'not-in',
21226
+ logic: (target, searchVal) => !this.findValueInSet(target, searchVal)
21241
21227
  }];
21242
21228
  }
21243
21229
  static instance() {
21244
21230
  return this._instance || (this._instance = new this());
21245
21231
  }
21246
21232
  /**
21247
- * Returns an array of names of the conditions which are visible in the UI
21233
+ * Returns an array of names of the conditions which are visible in the filtering UI
21248
21234
  */
21249
21235
  conditionList() {
21236
+ return this.operations.filter(f => !f.hidden && !f.isNestedQuery).map((element) => element.name);
21237
+ }
21238
+ /**
21239
+ * Returns an array of names of the conditions which are visible in the UI, including "In" and "Not In", allowing the creation of sub-queries.
21240
+ */
21241
+ extendedConditionList() {
21250
21242
  return this.operations.filter(f => !f.hidden).map((element) => element.name);
21251
21243
  }
21252
21244
  /**
@@ -21281,7 +21273,7 @@ class IgxFilteringOperand {
21281
21273
  class IgxBooleanFilteringOperand extends IgxFilteringOperand {
21282
21274
  constructor() {
21283
21275
  super();
21284
- this.operations = [{
21276
+ const newOperations = [{
21285
21277
  name: 'all',
21286
21278
  isUnary: true,
21287
21279
  iconName: 'filter_all',
@@ -21306,7 +21298,8 @@ class IgxBooleanFilteringOperand extends IgxFilteringOperand {
21306
21298
  isUnary: true,
21307
21299
  iconName: 'filter_not_empty',
21308
21300
  logic: (target) => target !== null && target !== undefined
21309
- }].concat(this.operations);
21301
+ }];
21302
+ this.operations = newOperations.concat(this.operations);
21310
21303
  }
21311
21304
  }
21312
21305
  /* blazorCSSuppress */
@@ -21317,7 +21310,7 @@ class IgxBooleanFilteringOperand extends IgxFilteringOperand {
21317
21310
  class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
21318
21311
  constructor() {
21319
21312
  super();
21320
- this.operations = [{
21313
+ const newOperations = [{
21321
21314
  name: 'empty',
21322
21315
  isUnary: true,
21323
21316
  iconName: 'filter_empty',
@@ -21327,7 +21320,8 @@ class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
21327
21320
  isUnary: true,
21328
21321
  iconName: 'filter_not_empty',
21329
21322
  logic: (target) => target !== null && target !== undefined
21330
- }].concat(this.operations);
21323
+ }];
21324
+ this.operations = newOperations.concat(this.operations);
21331
21325
  }
21332
21326
  /**
21333
21327
  * Splits a Date object into parts
@@ -21370,6 +21364,9 @@ class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
21370
21364
  }
21371
21365
  return res;
21372
21366
  }
21367
+ /**
21368
+ * @hidden
21369
+ */
21373
21370
  findValueInSet(target, searchVal) {
21374
21371
  if (!target) {
21375
21372
  return false;
@@ -21391,7 +21388,7 @@ class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
21391
21388
  class IgxDateFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21392
21389
  constructor() {
21393
21390
  super();
21394
- this.operations = [{
21391
+ const newOperations = [{
21395
21392
  name: 'equals',
21396
21393
  isUnary: false,
21397
21394
  iconName: 'filter_equal',
@@ -21569,7 +21566,8 @@ class IgxDateFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21569
21566
  const now = IgxDateFilteringOperand.getDateParts(new Date(), 'y');
21570
21567
  return d.year === now.year + 1;
21571
21568
  }
21572
- }].concat(this.operations);
21569
+ }];
21570
+ this.operations = newOperations.concat(this.operations);
21573
21571
  }
21574
21572
  findValueInSet(target, searchVal) {
21575
21573
  if (!target) {
@@ -21583,7 +21581,7 @@ class IgxDateFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21583
21581
  class IgxDateTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21584
21582
  constructor() {
21585
21583
  super();
21586
- this.operations = [{
21584
+ const newOperations = [{
21587
21585
  name: 'equals',
21588
21586
  isUnary: false,
21589
21587
  iconName: 'filter_equal',
@@ -21767,14 +21765,15 @@ class IgxDateTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21767
21765
  const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'y');
21768
21766
  return d.year === now.year + 1;
21769
21767
  }
21770
- }].concat(this.operations);
21768
+ }];
21769
+ this.operations = newOperations.concat(this.operations);
21771
21770
  }
21772
21771
  }
21773
21772
  /* blazorCSSuppress */
21774
21773
  class IgxTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21775
21774
  constructor() {
21776
21775
  super();
21777
- this.operations = [{
21776
+ const newOperations = [{
21778
21777
  name: 'at',
21779
21778
  isUnary: false,
21780
21779
  iconName: 'filter_equal',
@@ -21862,8 +21861,12 @@ class IgxTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21862
21861
  targetn.hours > search.hours ? true : targetn.hours === search.hours && targetn.minutes > search.minutes ?
21863
21862
  true : targetn.hours === search.hours && targetn.minutes === search.minutes && targetn.seconds > search.seconds;
21864
21863
  }
21865
- }].concat(this.operations);
21864
+ }];
21865
+ this.operations = newOperations.concat(this.operations);
21866
21866
  }
21867
+ /**
21868
+ * @hidden
21869
+ */
21867
21870
  findValueInSet(target, searchVal) {
21868
21871
  if (!target) {
21869
21872
  return false;
@@ -21880,7 +21883,7 @@ class IgxTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
21880
21883
  class IgxNumberFilteringOperand extends IgxFilteringOperand {
21881
21884
  constructor() {
21882
21885
  super();
21883
- this.operations = [{
21886
+ const newOperations = [{
21884
21887
  name: 'equals',
21885
21888
  isUnary: false,
21886
21889
  iconName: 'filter_equal',
@@ -21920,7 +21923,8 @@ class IgxNumberFilteringOperand extends IgxFilteringOperand {
21920
21923
  isUnary: true,
21921
21924
  iconName: 'filter_not_empty',
21922
21925
  logic: (target) => target !== null && target !== undefined && !isNaN(target)
21923
- }].concat(this.operations);
21926
+ }];
21927
+ this.operations = newOperations.concat(this.operations);
21924
21928
  }
21925
21929
  }
21926
21930
  /* blazorCSSuppress */
@@ -21932,7 +21936,7 @@ class IgxNumberFilteringOperand extends IgxFilteringOperand {
21932
21936
  class IgxStringFilteringOperand extends IgxFilteringOperand {
21933
21937
  constructor() {
21934
21938
  super();
21935
- this.operations = [{
21939
+ const newOperations = [{
21936
21940
  name: 'contains',
21937
21941
  isUnary: false,
21938
21942
  iconName: 'filter_contains',
@@ -21996,7 +22000,8 @@ class IgxStringFilteringOperand extends IgxFilteringOperand {
21996
22000
  isUnary: true,
21997
22001
  iconName: 'filter_not_empty',
21998
22002
  logic: (target) => target !== null && target !== undefined && target.length > 0
21999
- }].concat(this.operations);
22003
+ }];
22004
+ this.operations = newOperations.concat(this.operations);
22000
22005
  }
22001
22006
  /**
22002
22007
  * Applies case sensitivity on strings if provided
@@ -22443,11 +22448,11 @@ class IgxExpansionPanelHeaderComponent {
22443
22448
  }
22444
22449
  }
22445
22450
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxExpansionPanelHeaderComponent, deps: [{ token: IGX_EXPANSION_PANEL_COMPONENT, host: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
22446
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxExpansionPanelHeaderComponent, isStandalone: true, selector: "igx-expansion-panel-header", inputs: { lv: "lv", role: "role", iconPosition: "iconPosition", disabled: ["disabled", "disabled", booleanAttribute] }, outputs: { interaction: "interaction" }, host: { listeners: { "keydown.Enter": "onAction($event)", "keydown.Space": "onAction($event)", "keydown.Spacebar": "onAction($event)", "click": "onAction($event)", "keydown.Alt.ArrowDown": "openPanel($event)", "keydown.Alt.ArrowUp": "closePanel($event)" }, properties: { "attr.aria-level": "this.lv", "attr.role": "this.role", "class.igx-expansion-panel__header": "this.cssClass", "class.igx-expansion-panel__header--expanded": "this.isExpanded", "class.igx-expansion-panel--disabled": "this.disabled" } }, queries: [{ propertyName: "iconTemplate", first: true, predicate: IgxExpansionPanelIconDirective, descendants: true }, { propertyName: "customIconRef", first: true, predicate: IgxExpansionPanelIconDirective, descendants: true, read: ElementRef }], viewQueries: [{ propertyName: "defaultIconRef", first: true, predicate: IgxIconComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"igx-expansion-panel__header-inner\" [attr.tabindex]=\"tabIndex\" role=\"button\" [attr.id]=\"id\"\n[attr.aria-disabled]=\"disabled\" [attr.aria-expanded]=\"isExpanded\" [attr.aria-controls]=\"controls\">\n <div class=\"igx-expansion-panel__title-wrapper\">\n <ng-content select=\"igx-expansion-panel-title\"></ng-content>\n <ng-content select=\"igx-expansion-panel-description\"></ng-content>\n </div>\n <ng-content></ng-content>\n <div [class]=\"iconPositionClass\">\n <ng-content *ngIf=\"iconTemplate\" select=\"igx-expansion-panel-icon\"></ng-content>\n <igx-icon\n *ngIf=\"!iconTemplate\"\n family=\"default\"\n [name]=\"panel.collapsed ? 'expand' : 'collapse'\"\n [attr.aria-hidden]=\"true\">\n </igx-icon>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }] }); }
22451
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxExpansionPanelHeaderComponent, isStandalone: true, selector: "igx-expansion-panel-header", inputs: { lv: "lv", role: "role", iconPosition: "iconPosition", disabled: ["disabled", "disabled", booleanAttribute] }, outputs: { interaction: "interaction" }, host: { listeners: { "keydown.Enter": "onAction($event)", "keydown.Space": "onAction($event)", "keydown.Spacebar": "onAction($event)", "click": "onAction($event)", "keydown.Alt.ArrowDown": "openPanel($event)", "keydown.Alt.ArrowUp": "closePanel($event)" }, properties: { "attr.aria-level": "this.lv", "attr.role": "this.role", "class.igx-expansion-panel__header": "this.cssClass", "class.igx-expansion-panel__header--expanded": "this.isExpanded", "class.igx-expansion-panel--disabled": "this.disabled" } }, queries: [{ propertyName: "iconTemplate", first: true, predicate: IgxExpansionPanelIconDirective, descendants: true }, { propertyName: "customIconRef", first: true, predicate: IgxExpansionPanelIconDirective, descendants: true, read: ElementRef }], viewQueries: [{ propertyName: "defaultIconRef", first: true, predicate: IgxIconComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"igx-expansion-panel__header-inner\" [attr.tabindex]=\"tabIndex\" role=\"button\" [attr.id]=\"id\"\n[attr.aria-disabled]=\"disabled\" [attr.aria-expanded]=\"isExpanded\" [attr.aria-controls]=\"controls\">\n <div class=\"igx-expansion-panel__title-wrapper\">\n <ng-content select=\"igx-expansion-panel-title\"></ng-content>\n <ng-content select=\"igx-expansion-panel-description\"></ng-content>\n </div>\n <ng-content></ng-content>\n <div [class]=\"iconPositionClass\">\n <ng-content *ngIf=\"iconTemplate\" select=\"igx-expansion-panel-icon\"></ng-content>\n <igx-icon\n *ngIf=\"!iconTemplate\"\n family=\"default\"\n [name]=\"panel.collapsed ? 'expand' : 'collapse'\">\n </igx-icon>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }] }); }
22447
22452
  }
22448
22453
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxExpansionPanelHeaderComponent, decorators: [{
22449
22454
  type: Component,
22450
- args: [{ selector: 'igx-expansion-panel-header', imports: [NgIf, IgxIconComponent], template: "<div class=\"igx-expansion-panel__header-inner\" [attr.tabindex]=\"tabIndex\" role=\"button\" [attr.id]=\"id\"\n[attr.aria-disabled]=\"disabled\" [attr.aria-expanded]=\"isExpanded\" [attr.aria-controls]=\"controls\">\n <div class=\"igx-expansion-panel__title-wrapper\">\n <ng-content select=\"igx-expansion-panel-title\"></ng-content>\n <ng-content select=\"igx-expansion-panel-description\"></ng-content>\n </div>\n <ng-content></ng-content>\n <div [class]=\"iconPositionClass\">\n <ng-content *ngIf=\"iconTemplate\" select=\"igx-expansion-panel-icon\"></ng-content>\n <igx-icon\n *ngIf=\"!iconTemplate\"\n family=\"default\"\n [name]=\"panel.collapsed ? 'expand' : 'collapse'\"\n [attr.aria-hidden]=\"true\">\n </igx-icon>\n </div>\n</div>\n" }]
22455
+ args: [{ selector: 'igx-expansion-panel-header', imports: [NgIf, IgxIconComponent], template: "<div class=\"igx-expansion-panel__header-inner\" [attr.tabindex]=\"tabIndex\" role=\"button\" [attr.id]=\"id\"\n[attr.aria-disabled]=\"disabled\" [attr.aria-expanded]=\"isExpanded\" [attr.aria-controls]=\"controls\">\n <div class=\"igx-expansion-panel__title-wrapper\">\n <ng-content select=\"igx-expansion-panel-title\"></ng-content>\n <ng-content select=\"igx-expansion-panel-description\"></ng-content>\n </div>\n <ng-content></ng-content>\n <div [class]=\"iconPositionClass\">\n <ng-content *ngIf=\"iconTemplate\" select=\"igx-expansion-panel-icon\"></ng-content>\n <igx-icon\n *ngIf=\"!iconTemplate\"\n family=\"default\"\n [name]=\"panel.collapsed ? 'expand' : 'collapse'\">\n </igx-icon>\n </div>\n</div>\n" }]
22451
22456
  }], ctorParameters: () => [{ type: undefined, decorators: [{
22452
22457
  type: Host
22453
22458
  }, {
@@ -26423,7 +26428,7 @@ class IgxGridSelectionService {
26423
26428
  this._ranges = new Set();
26424
26429
  this.pointerOriginHandler = (event) => {
26425
26430
  this.pointerEventInGridBody = false;
26426
- this.grid.document.body.removeEventListener('pointerup', this.pointerOriginHandler);
26431
+ document.body.removeEventListener('pointerup', this.pointerOriginHandler);
26427
26432
  const targetTagName = event.target.tagName.toLowerCase();
26428
26433
  if (targetTagName !== 'igx-grid-cell' && targetTagName !== 'igx-tree-grid-cell') {
26429
26434
  this.pointerUp(this._lastSelectedNode, this.grid.rangeSelected, true);
@@ -26582,7 +26587,7 @@ class IgxGridSelectionService {
26582
26587
  this.pointerState.ctrl = ctrl;
26583
26588
  this.pointerState.shift = shift;
26584
26589
  this.pointerEventInGridBody = true;
26585
- this.grid.document.body.addEventListener('pointerup', this.pointerOriginHandler);
26590
+ document.body.addEventListener('pointerup', this.pointerOriginHandler);
26586
26591
  // No ctrl key pressed - no multiple selection
26587
26592
  if (!ctrl) {
26588
26593
  this.clear();
@@ -26705,7 +26710,7 @@ class IgxGridSelectionService {
26705
26710
  restoreTextSelection() {
26706
26711
  const selection = window.getSelection();
26707
26712
  if (!selection.rangeCount) {
26708
- selection.addRange(this._selectionRange || this.grid.document.createRange());
26713
+ selection.addRange(this._selectionRange || document.createRange());
26709
26714
  }
26710
26715
  }
26711
26716
  getSelectedRowsData() {
@@ -28528,7 +28533,7 @@ class IgxAvatarComponent {
28528
28533
  * @internal
28529
28534
  */
28530
28535
  getSrcUrl() {
28531
- return `url("${this.src}")`;
28536
+ return `url(${this.src})`;
28532
28537
  }
28533
28538
  /** @hidden @internal */
28534
28539
  ngOnInit() {
@@ -34168,8 +34173,16 @@ const CarouselAnimationType = /*@__PURE__*/ mkenum({
34168
34173
  fade: 'fade'
34169
34174
  });
34170
34175
  const CarouselIndicatorsOrientation = /*@__PURE__*/ mkenum({
34176
+ /**
34177
+ * @deprecated in version 19.1.0. Use `end` instead.
34178
+ */
34171
34179
  bottom: 'bottom',
34172
- top: 'top'
34180
+ /**
34181
+ * @deprecated in version 19.1.0. Use `start` instead.
34182
+ */
34183
+ top: 'top',
34184
+ start: 'start',
34185
+ end: 'end'
34173
34186
  });
34174
34187
 
34175
34188
  var Direction;
@@ -34179,8 +34192,6 @@ var Direction;
34179
34192
  Direction[Direction["PREV"] = 2] = "PREV";
34180
34193
  })(Direction || (Direction = {}));
34181
34194
  /** @hidden */
34182
- const IGX_CAROUSEL_COMPONENT = /*@__PURE__*/ new InjectionToken('IgxCarouselToken');
34183
- /** @hidden */
34184
34195
  let IgxCarouselComponentBase = class IgxCarouselComponentBase {
34185
34196
  constructor(animationService, cdr) {
34186
34197
  this.animationService = animationService;
@@ -34459,15 +34470,15 @@ class IgxSlideComponent {
34459
34470
  this._destroy$.next(true);
34460
34471
  this._destroy$.complete();
34461
34472
  }
34462
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxSlideComponent, deps: [{ token: i0.ElementRef }, { token: IGX_CAROUSEL_COMPONENT }], target: i0.ɵɵFactoryTarget.Component }); }
34473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxSlideComponent, deps: [{ token: i0.ElementRef }, { token: IgxCarouselComponent }], target: i0.ɵɵFactoryTarget.Component }); }
34463
34474
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxSlideComponent, isStandalone: true, selector: "igx-slide", inputs: { index: "index", direction: "direction", total: "total", active: ["active", "active", booleanAttribute], previous: ["previous", "previous", booleanAttribute] }, outputs: { activeChange: "activeChange" }, host: { properties: { "attr.tabindex": "this.tabIndex", "attr.id": "this.id", "attr.role": "this.tab", "attr.aria-labelledby": "this.ariaLabelledBy", "class.igx-slide": "this.cssClass", "class.igx-slide--current": "this.active", "class.igx-slide--previous": "this.previous" } }, ngImport: i0, template: "<ng-content></ng-content>\n" }); }
34464
34475
  }
34465
34476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxSlideComponent, decorators: [{
34466
34477
  type: Component,
34467
34478
  args: [{ selector: 'igx-slide', standalone: true, template: "<ng-content></ng-content>\n" }]
34468
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
34479
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: IgxCarouselComponent, decorators: [{
34469
34480
  type: Inject,
34470
- args: [IGX_CAROUSEL_COMPONENT]
34481
+ args: [IgxCarouselComponent]
34471
34482
  }] }], propDecorators: { index: [{
34472
34483
  type: Input
34473
34484
  }], direction: [{
@@ -34748,7 +34759,7 @@ class IgxCarouselComponent extends IgxCarouselComponentBase {
34748
34759
  get indicatorsClass() {
34749
34760
  return {
34750
34761
  ['igx-carousel-indicators--focused']: this._hasKeyboardFocusOnIndicators,
34751
- [`igx-carousel-indicators--${this.indicatorsOrientation}`]: true
34762
+ [`igx-carousel-indicators--${this.getIndicatorsClass()}`]: true
34752
34763
  };
34753
34764
  }
34754
34765
  /** @hidden */
@@ -34842,13 +34853,12 @@ class IgxCarouselComponent extends IgxCarouselComponentBase {
34842
34853
  this._interval = +value;
34843
34854
  this.restartInterval();
34844
34855
  }
34845
- constructor(cdr, element, iterableDiffers, animationService, platformUtil, dir, document) {
34856
+ constructor(cdr, element, iterableDiffers, animationService, platformUtil, dir) {
34846
34857
  super(animationService, cdr);
34847
34858
  this.element = element;
34848
34859
  this.iterableDiffers = iterableDiffers;
34849
34860
  this.platformUtil = platformUtil;
34850
34861
  this.dir = dir;
34851
- this.document = document;
34852
34862
  /**
34853
34863
  * Sets the `id` of the carousel.
34854
34864
  * If not set, the `id` of the first carousel component will be `"igx-carousel-0"`.
@@ -34952,34 +34962,34 @@ class IgxCarouselComponent extends IgxCarouselComponentBase {
34952
34962
  this.gesturesSupport = true;
34953
34963
  /**
34954
34964
  * Controls the maximum indexes that can be shown.
34955
- * Default value is `5`.
34965
+ * Default value is `10`.
34956
34966
  * ```html
34957
- * <igx-carousel [maximumIndicatorsCount]="10"></igx-carousel>
34967
+ * <igx-carousel [maximumIndicatorsCount]="5"></igx-carousel>
34958
34968
  * ```
34959
34969
  *
34960
34970
  * @memberOf IgxCarouselComponent
34961
34971
  */
34962
- this.maximumIndicatorsCount = 5;
34972
+ this.maximumIndicatorsCount = 10;
34963
34973
  /**
34964
- * Gets/sets the display mode of carousel indicators. It can be top or bottom.
34965
- * Default value is `bottom`.
34974
+ * Gets/sets the display mode of carousel indicators. It can be `start` or `end`.
34975
+ * Default value is `end`.
34966
34976
  * ```html
34967
- * <igx-carousel indicatorsOrientation='top'>
34977
+ * <igx-carousel indicatorsOrientation="start">
34968
34978
  * <igx-carousel>
34969
34979
  * ```
34970
34980
  *
34971
- * @memberOf IgxSlideComponent
34981
+ * @memberOf IgxCarouselComponent
34972
34982
  */
34973
- this.indicatorsOrientation = CarouselIndicatorsOrientation.bottom;
34983
+ this.indicatorsOrientation = CarouselIndicatorsOrientation.end;
34974
34984
  /**
34975
34985
  * Gets/sets the animation type of carousel.
34976
34986
  * Default value is `slide`.
34977
34987
  * ```html
34978
- * <igx-carousel animationType='none'>
34988
+ * <igx-carousel animationType="none">
34979
34989
  * <igx-carousel>
34980
34990
  * ```
34981
34991
  *
34982
- * @memberOf IgxSlideComponent
34992
+ * @memberOf IgxCarouselComponent
34983
34993
  */
34984
34994
  this.animationType = CarouselAnimationType.slide;
34985
34995
  /**
@@ -35457,7 +35467,7 @@ class IgxCarouselComponent extends IgxCarouselComponentBase {
35457
35467
  return this._indicators.toArray();
35458
35468
  }
35459
35469
  focusElement() {
35460
- const focusedElement = this.document.activeElement;
35470
+ const focusedElement = document.activeElement;
35461
35471
  if (focusedElement.classList.contains('igx-carousel-indicators__indicator')) {
35462
35472
  this.indicatorsElements[this.current].nativeElement.focus();
35463
35473
  }
@@ -35465,6 +35475,16 @@ class IgxCarouselComponent extends IgxCarouselComponentBase {
35465
35475
  this.focusSlideElement();
35466
35476
  }
35467
35477
  }
35478
+ getIndicatorsClass() {
35479
+ switch (this.indicatorsOrientation) {
35480
+ case CarouselIndicatorsOrientation.top:
35481
+ return CarouselIndicatorsOrientation.start;
35482
+ case CarouselIndicatorsOrientation.bottom:
35483
+ return CarouselIndicatorsOrientation.end;
35484
+ default:
35485
+ return this.indicatorsOrientation;
35486
+ }
35487
+ }
35468
35488
  getNextIndex() {
35469
35489
  return (this.current + 1) % this.total;
35470
35490
  }
@@ -35607,13 +35627,12 @@ class IgxCarouselComponent extends IgxCarouselComponentBase {
35607
35627
  requestAnimationFrame(() => this.slides.find(s => s.active).nativeElement.focus());
35608
35628
  }
35609
35629
  }
35610
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxCarouselComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.IterableDiffers }, { token: IgxAngularAnimationService }, { token: PlatformUtil }, { token: IgxDirectionality }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
35630
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxCarouselComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.IterableDiffers }, { token: IgxAngularAnimationService }, { token: PlatformUtil }, { token: IgxDirectionality }], target: i0.ɵɵFactoryTarget.Component }); }
35611
35631
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxCarouselComponent, isStandalone: true, selector: "igx-carousel", inputs: { id: "id", loop: ["loop", "loop", booleanAttribute], pause: ["pause", "pause", booleanAttribute], navigation: ["navigation", "navigation", booleanAttribute], indicators: ["indicators", "indicators", booleanAttribute], vertical: ["vertical", "vertical", booleanAttribute], keyboardSupport: ["keyboardSupport", "keyboardSupport", booleanAttribute], gesturesSupport: ["gesturesSupport", "gesturesSupport", booleanAttribute], maximumIndicatorsCount: "maximumIndicatorsCount", indicatorsOrientation: "indicatorsOrientation", animationType: "animationType", resourceStrings: "resourceStrings", interval: "interval" }, outputs: { slideChanged: "slideChanged", slideAdded: "slideAdded", slideRemoved: "slideRemoved", carouselPaused: "carouselPaused", carouselPlaying: "carouselPlaying" }, host: { listeners: { "keydown.arrowright": "onKeydownArrowRight($event)", "keydown.arrowleft": "onKeydownArrowLeft($event)", "tap": "onTap($event)", "keydown.home": "onKeydownHome($event)", "keydown.end": "onKeydownEnd($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "panleft": "onPanLeft($event)", "panright": "onPanRight($event)", "panup": "onPanUp($event)", "pandown": "onPanDown($event)", "panend": "onPanEnd($event)" }, properties: { "attr.id": "this.id", "attr.role": "this.role", "attr.aria-roledescription": "this.roleDescription", "attr.aria-labelledby": "this.labelId", "class.igx-carousel--vertical": "this.isVertical", "class.igx-carousel": "this.cssClass", "style.touch-action": "this.touchAction" } }, providers: [
35612
35632
  {
35613
35633
  provide: HAMMER_GESTURE_CONFIG,
35614
35634
  useClass: CarouselHammerConfig
35615
- },
35616
- { provide: IGX_CAROUSEL_COMPONENT, useExisting: IgxCarouselComponent }
35635
+ }
35617
35636
  ], queries: [{ propertyName: "indicatorTemplate", first: true, predicate: IgxCarouselIndicatorDirective, descendants: true, read: TemplateRef }, { propertyName: "nextButtonTemplate", first: true, predicate: IgxCarouselNextButtonDirective, descendants: true, read: TemplateRef }, { propertyName: "prevButtonTemplate", first: true, predicate: IgxCarouselPrevButtonDirective, descendants: true, read: TemplateRef }, { propertyName: "slides", predicate: IgxSlideComponent }], viewQueries: [{ propertyName: "defaultIndicator", first: true, predicate: ["defaultIndicator"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultNextButton", first: true, predicate: ["defaultNextButton"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultPrevButton", first: true, predicate: ["defaultPrevButton"], descendants: true, read: TemplateRef, static: true }, { propertyName: "_indicators", predicate: ["indicators"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<ng-template #defaultIndicator let-slide>\n <div class=\"igx-nav-dot\"\n [class.igx-nav-dot--active]=\"slide.active\">\n </div>\n</ng-template>\n\n<ng-template #defaultNextButton>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"carousel_next\"\n class=\"igx-nav-arrow\">\n </igx-icon>\n</ng-template>\n\n<ng-template #defaultPrevButton>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"carousel_prev\"\n class=\"igx-nav-arrow\">\n </igx-icon>\n</ng-template>\n\n<button *ngIf=\"navigation && slides.length\"\n igxButton\n class=\"igx-carousel__arrow--prev\"\n [attr.aria-label]=\"resourceStrings.igx_carousel_previous_slide\"\n [disabled]=\"prevButtonDisabled\"\n (click)=\"prev()\"\n (keydown)=\"handleKeydownPrev($event)\">\n <ng-container *ngTemplateOutlet=\"getPrevButtonTemplate; context: {$implicit: prevButtonDisabled};\"></ng-container>\n</button>\n\n<button *ngIf=\"navigation && slides.length\"\n igxButton\n class=\"igx-carousel__arrow--next\"\n [attr.aria-label]=\"resourceStrings.igx_carousel_next_slide\"\n [disabled]=\"nextButtonDisabled\"\n (click)=\"next()\"\n (keydown)=\"handleKeydownNext($event)\">\n <ng-container *ngTemplateOutlet=\"getNextButtonTemplate; context: {$implicit: nextButtonDisabled};\"></ng-container>\n</button>\n\n<div *ngIf=\"showIndicators\" [ngClass]=\"indicatorsClass\" [attr.role]=\"'tablist'\" (keyup)=\"handleKeyUp($event)\" (focusout)=\"handleFocusOut($event)\" (click)=\"handleClick()\" (keydown)=\"handleKeydown($event)\">\n <div #indicators *ngFor=\"let slide of slides\"\n class=\"igx-carousel-indicators__indicator\"\n (click)=\"select(slide)\"\n [id]=\"'tab-'+ slide.index + '-' + total\"\n [attr.role]=\"'tab'\"\n [attr.tabindex]=\"slide.active ? 0 : -1\"\n [attr.aria-label]=\"resourceStrings.igx_carousel_slide + ' ' + (slide.index + 1) + ' ' + resourceStrings.igx_carousel_of + ' ' + this.total\"\n [attr.aria-controls]=\"'panel-' + slide.index\"\n [attr.aria-selected]=\"slide.active\">\n <ng-container *ngTemplateOutlet=\"getIndicatorTemplate; context: {$implicit: slide};\"></ng-container>\n </div>\n</div>\n\n<div *ngIf=\"showIndicatorsLabel\" [ngClass]=\"indicatorsClass\" class=\"igx-carousel-label-indicator\">\n <span [id]=\"labelId\" class=\"igx-carousel__label\">{{getCarouselLabel}}</span>\n</div>\n\n<div class=\"igx-carousel__inner\" [attr.aria-live]=\"!interval || stoppedByInteraction ? 'polite' : 'off'\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:block;outline-style:none}\n"], dependencies: [{ kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
35618
35637
  }
35619
35638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxCarouselComponent, decorators: [{
@@ -35622,16 +35641,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
35622
35641
  {
35623
35642
  provide: HAMMER_GESTURE_CONFIG,
35624
35643
  useClass: CarouselHammerConfig
35625
- },
35626
- { provide: IGX_CAROUSEL_COMPONENT, useExisting: IgxCarouselComponent }
35644
+ }
35627
35645
  ], selector: 'igx-carousel', imports: [IgxButtonDirective, IgxIconComponent, NgIf, NgClass, NgFor, NgTemplateOutlet], template: "<ng-template #defaultIndicator let-slide>\n <div class=\"igx-nav-dot\"\n [class.igx-nav-dot--active]=\"slide.active\">\n </div>\n</ng-template>\n\n<ng-template #defaultNextButton>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"carousel_next\"\n class=\"igx-nav-arrow\">\n </igx-icon>\n</ng-template>\n\n<ng-template #defaultPrevButton>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"carousel_prev\"\n class=\"igx-nav-arrow\">\n </igx-icon>\n</ng-template>\n\n<button *ngIf=\"navigation && slides.length\"\n igxButton\n class=\"igx-carousel__arrow--prev\"\n [attr.aria-label]=\"resourceStrings.igx_carousel_previous_slide\"\n [disabled]=\"prevButtonDisabled\"\n (click)=\"prev()\"\n (keydown)=\"handleKeydownPrev($event)\">\n <ng-container *ngTemplateOutlet=\"getPrevButtonTemplate; context: {$implicit: prevButtonDisabled};\"></ng-container>\n</button>\n\n<button *ngIf=\"navigation && slides.length\"\n igxButton\n class=\"igx-carousel__arrow--next\"\n [attr.aria-label]=\"resourceStrings.igx_carousel_next_slide\"\n [disabled]=\"nextButtonDisabled\"\n (click)=\"next()\"\n (keydown)=\"handleKeydownNext($event)\">\n <ng-container *ngTemplateOutlet=\"getNextButtonTemplate; context: {$implicit: nextButtonDisabled};\"></ng-container>\n</button>\n\n<div *ngIf=\"showIndicators\" [ngClass]=\"indicatorsClass\" [attr.role]=\"'tablist'\" (keyup)=\"handleKeyUp($event)\" (focusout)=\"handleFocusOut($event)\" (click)=\"handleClick()\" (keydown)=\"handleKeydown($event)\">\n <div #indicators *ngFor=\"let slide of slides\"\n class=\"igx-carousel-indicators__indicator\"\n (click)=\"select(slide)\"\n [id]=\"'tab-'+ slide.index + '-' + total\"\n [attr.role]=\"'tab'\"\n [attr.tabindex]=\"slide.active ? 0 : -1\"\n [attr.aria-label]=\"resourceStrings.igx_carousel_slide + ' ' + (slide.index + 1) + ' ' + resourceStrings.igx_carousel_of + ' ' + this.total\"\n [attr.aria-controls]=\"'panel-' + slide.index\"\n [attr.aria-selected]=\"slide.active\">\n <ng-container *ngTemplateOutlet=\"getIndicatorTemplate; context: {$implicit: slide};\"></ng-container>\n </div>\n</div>\n\n<div *ngIf=\"showIndicatorsLabel\" [ngClass]=\"indicatorsClass\" class=\"igx-carousel-label-indicator\">\n <span [id]=\"labelId\" class=\"igx-carousel__label\">{{getCarouselLabel}}</span>\n</div>\n\n<div class=\"igx-carousel__inner\" [attr.aria-live]=\"!interval || stoppedByInteraction ? 'polite' : 'off'\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:block;outline-style:none}\n"] }]
35628
35646
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.IterableDiffers }, { type: undefined, decorators: [{
35629
35647
  type: Inject,
35630
35648
  args: [IgxAngularAnimationService]
35631
- }] }, { type: PlatformUtil }, { type: IgxDirectionality }, { type: undefined, decorators: [{
35632
- type: Inject,
35633
- args: [DOCUMENT]
35634
- }] }], propDecorators: { id: [{
35649
+ }] }, { type: PlatformUtil }, { type: IgxDirectionality }], propDecorators: { id: [{
35635
35650
  type: HostBinding,
35636
35651
  args: ['attr.id']
35637
35652
  }, {
@@ -42773,8 +42788,8 @@ class IgxGridCell {
42773
42788
  }
42774
42789
 
42775
42790
  const DEFAULT_DATE_FORMAT = 'mediumDate';
42776
- const DEFAULT_TIME_FORMAT$1 = 'mediumTime';
42777
- const DEFAULT_DATE_TIME_FORMAT$1 = 'medium';
42791
+ const DEFAULT_TIME_FORMAT = 'mediumTime';
42792
+ const DEFAULT_DATE_TIME_FORMAT = 'medium';
42778
42793
  const DEFAULT_DIGITS_INFO = '1.0-3';
42779
42794
  /* blazorElement */
42780
42795
  /* contentParent: ColumnGroup */
@@ -44123,8 +44138,8 @@ class IgxColumnComponent {
44123
44138
  }
44124
44139
  if (!this._columnPipeArgs.format) {
44125
44140
  this._columnPipeArgs.format = this.dataType === GridColumnDataType.Time ?
44126
- DEFAULT_TIME_FORMAT$1 : this.dataType === GridColumnDataType.DateTime ?
44127
- DEFAULT_DATE_TIME_FORMAT$1 : DEFAULT_DATE_FORMAT;
44141
+ DEFAULT_TIME_FORMAT : this.dataType === GridColumnDataType.DateTime ?
44142
+ DEFAULT_DATE_TIME_FORMAT : DEFAULT_DATE_FORMAT;
44128
44143
  }
44129
44144
  if (!this.summaries) {
44130
44145
  switch (this.dataType) {
@@ -44206,7 +44221,7 @@ class IgxColumnComponent {
44206
44221
  columnSizes[col.colStart - 1] = {
44207
44222
  ref: col,
44208
44223
  width: col.width === 'fit-content' ? col.autoSize :
44209
- col.widthSetByUser || this.grid.columnWidthSetByUser ? parseFloat(col.calcWidth) : null,
44224
+ col.widthSetByUser || this.grid.columnWidthSetByUser ? parseInt(col.calcWidth, 10) : null,
44210
44225
  colSpan: col.gridColumnSpan,
44211
44226
  colEnd: col.colStart + col.gridColumnSpan,
44212
44227
  widthSetByUser: col.widthSetByUser
@@ -44235,7 +44250,7 @@ class IgxColumnComponent {
44235
44250
  columnSizes[col.colStart - 1] = {
44236
44251
  ref: col,
44237
44252
  width: col.width === 'fit-content' ? col.autoSize :
44238
- col.widthSetByUser || this.grid.columnWidthSetByUser ? parseFloat(col.calcWidth) : null,
44253
+ col.widthSetByUser || this.grid.columnWidthSetByUser ? parseInt(col.calcWidth, 10) : null,
44239
44254
  colSpan: col.gridColumnSpan,
44240
44255
  colEnd: col.colStart + col.gridColumnSpan,
44241
44256
  widthSetByUser: col.widthSetByUser
@@ -44250,7 +44265,7 @@ class IgxColumnComponent {
44250
44265
  columnSizes[i] = {
44251
44266
  ref: col,
44252
44267
  width: col.width === 'fit-content' ? col.autoSize :
44253
- col.widthSetByUser || this.grid.columnWidthSetByUser ? parseFloat(col.calcWidth) : null,
44268
+ col.widthSetByUser || this.grid.columnWidthSetByUser ? parseInt(col.calcWidth, 10) : null,
44254
44269
  colSpan: col.gridColumnSpan,
44255
44270
  colEnd: col.colStart + col.gridColumnSpan,
44256
44271
  widthSetByUser: col.widthSetByUser
@@ -44310,7 +44325,7 @@ class IgxColumnComponent {
44310
44325
  result.push(size.width + 'px');
44311
44326
  }
44312
44327
  else {
44313
- result.push(parseFloat(this.grid.getPossibleColumnWidth()) + 'px');
44328
+ result.push(parseInt(this.grid.getPossibleColumnWidth(), 10) + 'px');
44314
44329
  }
44315
44330
  }
44316
44331
  return result;
@@ -44715,11 +44730,8 @@ class IgxColumnComponent {
44715
44730
  const colWidth = this.width;
44716
44731
  const isPercentageWidth = colWidth && typeof colWidth === 'string' && colWidth.indexOf('%') !== -1;
44717
44732
  const isAutoWidth = colWidth && typeof colWidth === 'string' && colWidth === 'fit-content';
44718
- if (isPercentageWidth && this.grid.isColumnWidthSum) {
44719
- this._calcWidth = this.grid.minColumnWidth;
44720
- }
44721
- else if (isPercentageWidth) {
44722
- this._calcWidth = parseFloat(colWidth) / 100 * this.grid.calcWidth;
44733
+ if (isPercentageWidth) {
44734
+ this._calcWidth = Math.floor(parseFloat(colWidth) / 100 * this.grid.calcWidth);
44723
44735
  }
44724
44736
  else if (!colWidth || isAutoWidth && !this.autoSize) {
44725
44737
  // no width
@@ -44728,7 +44740,7 @@ class IgxColumnComponent {
44728
44740
  else {
44729
44741
  this._calcWidth = this.width;
44730
44742
  }
44731
- this.calcPixelWidth = parseFloat(this._calcWidth);
44743
+ this.calcPixelWidth = parseInt(this._calcWidth, 10);
44732
44744
  }
44733
44745
  /**
44734
44746
  * @hidden
@@ -45427,7 +45439,7 @@ class IgxColumnGroupComponent extends IgxColumnComponent {
45427
45439
  if (val.hidden) {
45428
45440
  return acc;
45429
45441
  }
45430
- return acc + parseFloat(val.calcWidth);
45442
+ return acc + parseInt(val.calcWidth, 10);
45431
45443
  }, 0)}`;
45432
45444
  return width + 'px';
45433
45445
  }
@@ -45533,7 +45545,7 @@ class IgxColumnLayoutComponent extends IgxColumnGroupComponent {
45533
45545
  * @memberof IgxColumnGroupComponent
45534
45546
  */
45535
45547
  get width() {
45536
- const width = this.getFilledChildColumnSizes(this.children).reduce((acc, val) => acc + parseFloat(val), 0);
45548
+ const width = this.getFilledChildColumnSizes(this.children).reduce((acc, val) => acc + parseInt(val, 10), 0);
45537
45549
  return width;
45538
45550
  }
45539
45551
  /* blazorSuppress */
@@ -45548,7 +45560,7 @@ class IgxColumnLayoutComponent extends IgxColumnGroupComponent {
45548
45560
  let borderWidth = 0;
45549
45561
  if (this.headerGroup && this.headerGroup.hasLastPinnedChildColumn) {
45550
45562
  const headerStyles = this.grid.document.defaultView.getComputedStyle(this.headerGroup.nativeElement.children[0]);
45551
- borderWidth = parseFloat(headerStyles.borderRightWidth);
45563
+ borderWidth = parseInt(headerStyles.borderRightWidth, 10);
45552
45564
  }
45553
45565
  return super.getCalcWidth() + borderWidth;
45554
45566
  }
@@ -45714,8 +45726,9 @@ const IGX_GRID_VALIDATION_DIRECTIVES = [
45714
45726
  // ] as const;
45715
45727
 
45716
45728
  const QueryBuilderResourceStringsEN = {
45717
- igx_query_builder_date_placeholder: 'Pick up date',
45718
- igx_query_builder_time_placeholder: 'Pick up time',
45729
+ igx_query_builder_date_placeholder: 'Select date',
45730
+ igx_query_builder_time_placeholder: 'Select time',
45731
+ igx_query_builder_datetime_placeholder: 'Select date & time',
45719
45732
  igx_query_builder_filter_operator_and: 'And',
45720
45733
  igx_query_builder_filter_operator_or: 'Or',
45721
45734
  igx_query_builder_filter_contains: 'Contains',
@@ -45728,6 +45741,8 @@ const QueryBuilderResourceStringsEN = {
45728
45741
  igx_query_builder_filter_notEmpty: 'Not Empty',
45729
45742
  igx_query_builder_filter_null: 'Null',
45730
45743
  igx_query_builder_filter_notNull: 'Not Null',
45744
+ igx_query_builder_filter_in: 'In',
45745
+ igx_query_builder_filter_notIn: 'Not In',
45731
45746
  igx_query_builder_filter_before: 'Before',
45732
45747
  igx_query_builder_filter_after: 'After',
45733
45748
  igx_query_builder_filter_at: 'At',
@@ -45750,14 +45765,19 @@ const QueryBuilderResourceStringsEN = {
45750
45765
  igx_query_builder_filter_false: 'False',
45751
45766
  igx_query_builder_filter_all: 'All',
45752
45767
  igx_query_builder_title: 'Query Builder',
45768
+ igx_query_builder_from_label: 'From',
45769
+ igx_query_builder_select_label: 'Select',
45770
+ igx_query_builder_where_label: 'Where',
45753
45771
  igx_query_builder_and_group: '"And" Group',
45754
45772
  igx_query_builder_or_group: '"Or" Group',
45755
45773
  igx_query_builder_end_group: 'End Group',
45756
45774
  igx_query_builder_and_label: 'and',
45757
45775
  igx_query_builder_or_label: 'or',
45758
- igx_query_builder_add_condition: 'Condition',
45759
- igx_query_builder_create_and_group: 'Create "And" Group',
45760
- igx_query_builder_create_or_group: 'Create "Or" Group',
45776
+ igx_query_builder_switch_group: 'Switch to {0}',
45777
+ igx_query_builder_add_condition: 'Add condition',
45778
+ igx_query_builder_add_group: 'Add group',
45779
+ igx_query_builder_add_condition_root: 'Condition',
45780
+ igx_query_builder_add_group_root: 'Group',
45761
45781
  igx_query_builder_ungroup: 'Ungroup',
45762
45782
  igx_query_builder_delete: 'Delete',
45763
45783
  igx_query_builder_delete_filters: 'Delete filters',
@@ -45765,8 +45785,49 @@ const QueryBuilderResourceStringsEN = {
45765
45785
  igx_query_builder_column_placeholder: 'Select column',
45766
45786
  igx_query_builder_condition_placeholder: 'Select filter',
45767
45787
  igx_query_builder_value_placeholder: 'Value',
45788
+ igx_query_builder_all_fields: 'All fields',
45789
+ igx_query_builder_details: 'Details',
45790
+ igx_query_builder_search: 'Search',
45791
+ igx_query_builder_select_all: 'Select All',
45792
+ igx_query_builder_select_entity: 'Select entity',
45793
+ igx_query_builder_select_return_field_single: 'Select return field',
45794
+ igx_query_builder_select_return_fields: 'Select return fields',
45795
+ igx_query_builder_dialog_title: 'Confirmation',
45796
+ igx_query_builder_dialog_message: 'By changing the entity, you will lose your current settings. Are you sure you want to do that?',
45797
+ igx_query_builder_dialog_checkbox_text: 'Do not show this dialog again',
45798
+ igx_query_builder_dialog_cancel: 'Cancel',
45799
+ igx_query_builder_dialog_confirm: 'Confirm',
45768
45800
  };
45769
45801
 
45802
+ class IgxQueryBuilderHeaderComponent {
45803
+ constructor() {
45804
+ this._resourceStrings = getCurrentResourceStrings(QueryBuilderResourceStringsEN);
45805
+ }
45806
+ /**
45807
+ * Sets the resource strings.
45808
+ * By default it uses EN resources.
45809
+ */
45810
+ set resourceStrings(value) {
45811
+ this._resourceStrings = Object.assign({}, this._resourceStrings, value);
45812
+ }
45813
+ /**
45814
+ * Returns the resource strings.
45815
+ */
45816
+ get resourceStrings() {
45817
+ return this._resourceStrings;
45818
+ }
45819
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
45820
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxQueryBuilderHeaderComponent, isStandalone: true, selector: "igx-query-builder-header", inputs: { title: "title", resourceStrings: "resourceStrings" }, ngImport: i0, template: "<div class=\"igx-query-builder__header\">\n <div class=\"igx-query-builder__title\">\n {{ title || this.resourceStrings.igx_query_builder_title }}\n <ng-content></ng-content>\n </div>\n</div>\n" }); }
45821
+ }
45822
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderHeaderComponent, decorators: [{
45823
+ type: Component,
45824
+ args: [{ selector: 'igx-query-builder-header', imports: [NgIf], template: "<div class=\"igx-query-builder__header\">\n <div class=\"igx-query-builder__title\">\n {{ title || this.resourceStrings.igx_query_builder_title }}\n <ng-content></ng-content>\n </div>\n</div>\n" }]
45825
+ }], propDecorators: { title: [{
45826
+ type: Input
45827
+ }], resourceStrings: [{
45828
+ type: Input
45829
+ }] } });
45830
+
45770
45831
  class IgxSelectItemComponent extends IgxDropDownItemComponent {
45771
45832
  /**
45772
45833
  * Gets/Sets the item's text to be displayed in the select component's input when the item is selected.
@@ -46581,14 +46642,14 @@ class IgxSelectComponent extends IgxDropDownComponent {
46581
46642
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxSelectComponent, isStandalone: true, selector: "igx-select", inputs: { placeholder: "placeholder", disabled: ["disabled", "disabled", booleanAttribute], overlaySettings: "overlaySettings", value: "value", type: "type" }, outputs: { opening: "opening", opened: "opened", closing: "closing", closed: "closed" }, host: { properties: { "style.maxHeight": "this.maxHeight" } }, providers: [
46582
46643
  { provide: NG_VALUE_ACCESSOR, useExisting: IgxSelectComponent, multi: true },
46583
46644
  { provide: IGX_DROPDOWN_BASE, useExisting: IgxSelectComponent }
46584
- ], queries: [{ propertyName: "label", first: true, predicate: i0.forwardRef(() => IgxLabelDirective), descendants: true, static: true }, { propertyName: "toggleIconTemplate", first: true, predicate: IgxSelectToggleIconDirective, descendants: true, read: TemplateRef }, { propertyName: "headerTemplate", first: true, predicate: IgxSelectHeaderDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: IgxSelectFooterDirective, descendants: true, read: TemplateRef }, { propertyName: "hintElement", first: true, predicate: IgxHintDirective, descendants: true, read: ElementRef }, { propertyName: "children", predicate: i0.forwardRef(() => IgxSelectItemComponent), descendants: true }, { propertyName: "prefixes", predicate: IgxPrefixDirective, descendants: true }, { propertyName: "suffixes", predicate: IgxSuffixDirective, descendants: true }], viewQueries: [{ propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: IgxInputGroupComponent, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective, static: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group #inputGroup class=\"input-group\" (click)=\"inputGroupClick($event)\" [type]=\"type\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <input #input class=\"input\" type=\"text\" igxInput [igxSelectItemNavigation]=\"this\"\n [disabled]=\"disabled\"\n readonly=\"true\"\n [attr.placeholder]=\"this.placeholder\"\n [value]=\"this.selectionValue\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-labelledby]=\"this.label?.id\"\n [attr.aria-expanded]=\"!this.collapsed\"\n [attr.aria-owns]=\"this.listId\"\n [attr.aria-activedescendant]=\"!this.collapsed ? this.focusedItem?.id : null\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <igx-suffix class=\"igx-select__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\" [attr.aria-hidden]=\"true\"></igx-icon>\n </igx-suffix>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\" >\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n</igx-input-group>\n<div igxToggle class=\"igx-drop-down__list\" (mousedown)=\"mousedownHandler($event);\"\n (appended)=\"onToggleContentAppended($event)\"\n (opening)=\"handleOpening($event)\"\n (opened)=\"handleOpened()\"\n (closing)=\"handleClosing($event)\"\n (closed)=\"handleClosed()\">\n\n <div *ngIf=\"headerTemplate\" class=\"igx-drop-down__select-header\">\n <ng-content *ngTemplateOutlet=\"headerTemplate\"></ng-content>\n </div>\n\n <!-- #7436 LMB scrolling closes items container - unselectable attribute is IE specific -->\n <div #scrollContainer class=\"igx-drop-down__list-scroll\" unselectable=\"on\" [style.maxHeight]=\"maxHeight\"\n [attr.id]=\"this.listId\" role=\"listbox\" [attr.aria-labelledby]=\"this.label?.id\">\n <ng-content select=\"igx-select-item, igx-select-item-group\"></ng-content>\n </div>\n\n <div *ngIf=\"footerTemplate\" class=\"igx-drop-down__select-footer\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxSelectItemNavigationDirective, selector: "[igxSelectItemNavigation]", inputs: ["igxSelectItemNavigation"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }] }); }
46645
+ ], queries: [{ propertyName: "label", first: true, predicate: i0.forwardRef(() => IgxLabelDirective), descendants: true, static: true }, { propertyName: "toggleIconTemplate", first: true, predicate: IgxSelectToggleIconDirective, descendants: true, read: TemplateRef }, { propertyName: "headerTemplate", first: true, predicate: IgxSelectHeaderDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: IgxSelectFooterDirective, descendants: true, read: TemplateRef }, { propertyName: "hintElement", first: true, predicate: IgxHintDirective, descendants: true, read: ElementRef }, { propertyName: "children", predicate: i0.forwardRef(() => IgxSelectItemComponent), descendants: true }, { propertyName: "prefixes", predicate: IgxPrefixDirective, descendants: true }, { propertyName: "suffixes", predicate: IgxSuffixDirective, descendants: true }], viewQueries: [{ propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: IgxInputGroupComponent, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true, read: IgxInputDirective, static: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group #inputGroup class=\"input-group\" (click)=\"inputGroupClick($event)\" [type]=\"type\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <input #input class=\"input\" type=\"text\" igxInput [igxSelectItemNavigation]=\"this\"\n [disabled]=\"disabled\"\n readonly=\"true\"\n [attr.placeholder]=\"this.placeholder\"\n [value]=\"this.selectionValue\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-labelledby]=\"this.label?.id\"\n [attr.aria-expanded]=\"!this.collapsed\"\n [attr.aria-owns]=\"this.listId\"\n [attr.aria-activedescendant]=\"!this.collapsed ? this.focusedItem?.id : null\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <igx-suffix class=\"igx-select__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\"></igx-icon>\n </igx-suffix>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\" >\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n</igx-input-group>\n<div igxToggle class=\"igx-drop-down__list\" (mousedown)=\"mousedownHandler($event);\"\n (appended)=\"onToggleContentAppended($event)\"\n (opening)=\"handleOpening($event)\"\n (opened)=\"handleOpened()\"\n (closing)=\"handleClosing($event)\"\n (closed)=\"handleClosed()\">\n\n <div *ngIf=\"headerTemplate\" class=\"igx-drop-down__select-header\">\n <ng-content *ngTemplateOutlet=\"headerTemplate\"></ng-content>\n </div>\n\n <!-- #7436 LMB scrolling closes items container - unselectable attribute is IE specific -->\n <div #scrollContainer class=\"igx-drop-down__list-scroll\" unselectable=\"on\" [style.maxHeight]=\"maxHeight\"\n [attr.id]=\"this.listId\" role=\"listbox\" [attr.aria-labelledby]=\"this.label?.id\">\n <ng-content select=\"igx-select-item, igx-select-item-group\"></ng-content>\n </div>\n\n <div *ngIf=\"footerTemplate\" class=\"igx-drop-down__select-footer\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxSelectItemNavigationDirective, selector: "[igxSelectItemNavigation]", inputs: ["igxSelectItemNavigation"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }] }); }
46585
46646
  }
46586
46647
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxSelectComponent, decorators: [{
46587
46648
  type: Component,
46588
46649
  args: [{ selector: 'igx-select', providers: [
46589
46650
  { provide: NG_VALUE_ACCESSOR, useExisting: IgxSelectComponent, multi: true },
46590
46651
  { provide: IGX_DROPDOWN_BASE, useExisting: IgxSelectComponent }
46591
- ], imports: [IgxInputGroupComponent, IgxInputDirective, IgxSelectItemNavigationDirective, IgxSuffixDirective, NgIf, NgTemplateOutlet, IgxIconComponent, IgxToggleDirective], template: "<igx-input-group #inputGroup class=\"input-group\" (click)=\"inputGroupClick($event)\" [type]=\"type\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <input #input class=\"input\" type=\"text\" igxInput [igxSelectItemNavigation]=\"this\"\n [disabled]=\"disabled\"\n readonly=\"true\"\n [attr.placeholder]=\"this.placeholder\"\n [value]=\"this.selectionValue\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-labelledby]=\"this.label?.id\"\n [attr.aria-expanded]=\"!this.collapsed\"\n [attr.aria-owns]=\"this.listId\"\n [attr.aria-activedescendant]=\"!this.collapsed ? this.focusedItem?.id : null\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <igx-suffix class=\"igx-select__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\" [attr.aria-hidden]=\"true\"></igx-icon>\n </igx-suffix>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\" >\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n</igx-input-group>\n<div igxToggle class=\"igx-drop-down__list\" (mousedown)=\"mousedownHandler($event);\"\n (appended)=\"onToggleContentAppended($event)\"\n (opening)=\"handleOpening($event)\"\n (opened)=\"handleOpened()\"\n (closing)=\"handleClosing($event)\"\n (closed)=\"handleClosed()\">\n\n <div *ngIf=\"headerTemplate\" class=\"igx-drop-down__select-header\">\n <ng-content *ngTemplateOutlet=\"headerTemplate\"></ng-content>\n </div>\n\n <!-- #7436 LMB scrolling closes items container - unselectable attribute is IE specific -->\n <div #scrollContainer class=\"igx-drop-down__list-scroll\" unselectable=\"on\" [style.maxHeight]=\"maxHeight\"\n [attr.id]=\"this.listId\" role=\"listbox\" [attr.aria-labelledby]=\"this.label?.id\">\n <ng-content select=\"igx-select-item, igx-select-item-group\"></ng-content>\n </div>\n\n <div *ngIf=\"footerTemplate\" class=\"igx-drop-down__select-footer\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n</div>\n", styles: [":host{display:block}\n"] }]
46652
+ ], imports: [IgxInputGroupComponent, IgxInputDirective, IgxSelectItemNavigationDirective, IgxSuffixDirective, NgIf, NgTemplateOutlet, IgxIconComponent, IgxToggleDirective], template: "<igx-input-group #inputGroup class=\"input-group\" (click)=\"inputGroupClick($event)\" [type]=\"type\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <input #input class=\"input\" type=\"text\" igxInput [igxSelectItemNavigation]=\"this\"\n [disabled]=\"disabled\"\n readonly=\"true\"\n [attr.placeholder]=\"this.placeholder\"\n [value]=\"this.selectionValue\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-labelledby]=\"this.label?.id\"\n [attr.aria-expanded]=\"!this.collapsed\"\n [attr.aria-owns]=\"this.listId\"\n [attr.aria-activedescendant]=\"!this.collapsed ? this.focusedItem?.id : null\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <igx-suffix class=\"igx-select__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" family=\"default\" [name]=\"toggleIcon\"></igx-icon>\n </igx-suffix>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\" >\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n</igx-input-group>\n<div igxToggle class=\"igx-drop-down__list\" (mousedown)=\"mousedownHandler($event);\"\n (appended)=\"onToggleContentAppended($event)\"\n (opening)=\"handleOpening($event)\"\n (opened)=\"handleOpened()\"\n (closing)=\"handleClosing($event)\"\n (closed)=\"handleClosed()\">\n\n <div *ngIf=\"headerTemplate\" class=\"igx-drop-down__select-header\">\n <ng-content *ngTemplateOutlet=\"headerTemplate\"></ng-content>\n </div>\n\n <!-- #7436 LMB scrolling closes items container - unselectable attribute is IE specific -->\n <div #scrollContainer class=\"igx-drop-down__list-scroll\" unselectable=\"on\" [style.maxHeight]=\"maxHeight\"\n [attr.id]=\"this.listId\" role=\"listbox\" [attr.aria-labelledby]=\"this.label?.id\">\n <ng-content select=\"igx-select-item, igx-select-item-group\"></ng-content>\n </div>\n\n <div *ngIf=\"footerTemplate\" class=\"igx-drop-down__select-footer\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n</div>\n", styles: [":host{display:block}\n"] }]
46592
46653
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
46593
46654
  type: Inject,
46594
46655
  args: [DOCUMENT]
@@ -48323,53 +48384,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
48323
48384
  args: ['keydown', ['$event']]
48324
48385
  }] } });
48325
48386
 
48326
- class IgxQueryBuilderHeaderComponent {
48327
- constructor() {
48328
- this._resourceStrings = getCurrentResourceStrings(QueryBuilderResourceStringsEN);
48329
- /**
48330
- * Show/hide the legend.
48331
- *
48332
- * @example
48333
- * ```html
48334
- * <igx-query-builder-header [showLegend]="false"></igx-query-builder-header>
48335
- * ```
48336
- */
48337
- this.showLegend = true;
48338
- }
48339
- /**
48340
- * Sets the resource strings.
48341
- * By default it uses EN resources.
48342
- */
48343
- set resourceStrings(value) {
48344
- this._resourceStrings = Object.assign({}, this._resourceStrings, value);
48345
- }
48346
- /**
48347
- * Returns the resource strings.
48348
- */
48349
- get resourceStrings() {
48350
- return this._resourceStrings;
48351
- }
48352
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
48353
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxQueryBuilderHeaderComponent, isStandalone: true, selector: "igx-query-builder-header", inputs: { title: "title", showLegend: ["showLegend", "showLegend", booleanAttribute], resourceStrings: "resourceStrings" }, ngImport: i0, template: "<div class=\"igx-query-builder__header\">\n <div class=\"ig-typography__h6\" style=\"pointer-events: none;\">\n {{ title || this.resourceStrings.igx_query_builder_title }}\n <ng-content></ng-content>\n </div>\n <div *ngIf=\"showLegend\" class=\"igx-builder-legend\" >\n <div class=\"igx-builder-legend__item--and\">\n <span>{{this.resourceStrings.igx_query_builder_and_label}}</span>\n </div>\n <div class=\"igx-builder-legend__item--or\">\n <span>{{this.resourceStrings.igx_query_builder_or_label}}</span>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
48354
- }
48355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderHeaderComponent, decorators: [{
48356
- type: Component,
48357
- args: [{ selector: 'igx-query-builder-header', imports: [NgIf], template: "<div class=\"igx-query-builder__header\">\n <div class=\"ig-typography__h6\" style=\"pointer-events: none;\">\n {{ title || this.resourceStrings.igx_query_builder_title }}\n <ng-content></ng-content>\n </div>\n <div *ngIf=\"showLegend\" class=\"igx-builder-legend\" >\n <div class=\"igx-builder-legend__item--and\">\n <span>{{this.resourceStrings.igx_query_builder_and_label}}</span>\n </div>\n <div class=\"igx-builder-legend__item--or\">\n <span>{{this.resourceStrings.igx_query_builder_or_label}}</span>\n </div>\n </div>\n</div>\n" }]
48358
- }], propDecorators: { title: [{
48359
- type: Input
48360
- }], showLegend: [{
48361
- type: Input,
48362
- args: [{ transform: booleanAttribute }]
48363
- }], resourceStrings: [{
48364
- type: Input
48365
- }] } });
48366
-
48367
48387
  const DEFAULT_PIPE_DATE_FORMAT = 'mediumDate';
48368
48388
  const DEFAULT_PIPE_TIME_FORMAT = 'mediumTime';
48369
48389
  const DEFAULT_PIPE_DATE_TIME_FORMAT = 'medium';
48370
48390
  const DEFAULT_PIPE_DIGITS_INFO = '1.0-3';
48371
- const DEFAULT_DATE_TIME_FORMAT = 'dd/MM/yyyy HH:mm:ss a';
48372
- const DEFAULT_TIME_FORMAT = 'hh:mm:ss a';
48391
+ const DEFAULT_CHIP_FOCUS_DELAY = 50;
48373
48392
  class IgxFieldFormatterPipe {
48374
48393
  transform(value, formatter, rowData, fieldData) {
48375
48394
  return formatter(value, rowData, fieldData);
@@ -48417,22 +48436,33 @@ class ExpressionOperandItem extends ExpressionItem {
48417
48436
  this.expression = expression;
48418
48437
  }
48419
48438
  }
48420
- /**
48421
- * A component used for operating with complex filters by creating or editing conditions
48422
- * and grouping them using AND/OR logic.
48423
- * It is used internally in the Advanced Filtering of the Grid.
48424
- *
48425
- * @example
48426
- * ```html
48427
- * <igx-query-builder [fields]="this.fields">
48428
- * </igx-query-builder>
48429
- * ```
48430
- */
48431
- class IgxQueryBuilderComponent {
48439
+ /** @hidden */
48440
+ class IgxQueryBuilderTreeComponent {
48441
+ /**
48442
+ * @hidden @internal
48443
+ */
48444
+ get getClass() {
48445
+ return `igx-query-builder-tree--level-${this.level}`;
48446
+ }
48447
+ /**
48448
+ * Returns the parent expression operand.
48449
+ */
48450
+ get parentExpression() {
48451
+ return this._parentExpression;
48452
+ }
48453
+ /**
48454
+ * Sets the parent expression operand.
48455
+ */
48456
+ set parentExpression(value) {
48457
+ this._parentExpression = value;
48458
+ }
48432
48459
  /**
48433
48460
  * Returns the fields.
48434
48461
  */
48435
48462
  get fields() {
48463
+ if (!this._fields && this.isAdvancedFiltering()) {
48464
+ this._fields = this.entities[0].fields;
48465
+ }
48436
48466
  return this._fields;
48437
48467
  }
48438
48468
  /**
@@ -48440,8 +48470,10 @@ class IgxQueryBuilderComponent {
48440
48470
  */
48441
48471
  set fields(fields) {
48442
48472
  this._fields = fields;
48473
+ if (!this._fields && this.isAdvancedFiltering()) {
48474
+ this._fields = this.entities[0].fields;
48475
+ }
48443
48476
  if (this._fields) {
48444
- this.registerSVGIcons();
48445
48477
  this._fields.forEach(field => {
48446
48478
  this.setFilters(field);
48447
48479
  this.setFormat(field);
@@ -48459,7 +48491,13 @@ class IgxQueryBuilderComponent {
48459
48491
  */
48460
48492
  set expressionTree(expressionTree) {
48461
48493
  this._expressionTree = expressionTree;
48462
- this.init();
48494
+ if (!expressionTree) {
48495
+ this._selectedEntity = null;
48496
+ this._selectedReturnFields = [];
48497
+ }
48498
+ if (!this._preventInit) {
48499
+ this.init();
48500
+ }
48463
48501
  }
48464
48502
  /**
48465
48503
  * Gets the `locale` of the query builder.
@@ -48478,7 +48516,7 @@ class IgxQueryBuilderComponent {
48478
48516
  try {
48479
48517
  getLocaleFirstDayOfWeek(this._locale);
48480
48518
  }
48481
- catch (e) {
48519
+ catch {
48482
48520
  this._locale = this._localeId;
48483
48521
  }
48484
48522
  }
@@ -48508,19 +48546,6 @@ class IgxQueryBuilderComponent {
48508
48546
  get editingInputsContainer() {
48509
48547
  return this._editingInputsContainer;
48510
48548
  }
48511
- set addModeContainer(value) {
48512
- if ((value && !this._addModeContainer) ||
48513
- (value && this._addModeContainer && this._addModeContainer.nativeElement !== value.nativeElement)) {
48514
- requestAnimationFrame(() => {
48515
- this.scrollElementIntoView(value.nativeElement);
48516
- });
48517
- }
48518
- this._addModeContainer = value;
48519
- }
48520
- /** @hidden */
48521
- get addModeContainer() {
48522
- return this._addModeContainer;
48523
- }
48524
48549
  set currentGroupButtonsContainer(value) {
48525
48550
  if ((value && !this._currentGroupButtonsContainer) ||
48526
48551
  (value && this._currentGroupButtonsContainer && this._currentGroupButtonsContainer.nativeElement !== value.nativeElement)) {
@@ -48534,39 +48559,88 @@ class IgxQueryBuilderComponent {
48534
48559
  get currentGroupButtonsContainer() {
48535
48560
  return this._currentGroupButtonsContainer;
48536
48561
  }
48537
- constructor(cdr, iconService, platform, el, _localeId) {
48562
+ /**
48563
+ * Disables the select entity dropdown at the root level after the initial selection.
48564
+ */
48565
+ get disableEntityChange() {
48566
+ return !this.parentExpression && this.selectedEntity ? this.queryBuilder.disableEntityChange : false;
48567
+ }
48568
+ get level() {
48569
+ let parent = this.elRef.nativeElement.parentElement;
48570
+ let _level = 0;
48571
+ while (parent) {
48572
+ if (parent.localName === 'igx-query-builder-tree') {
48573
+ _level++;
48574
+ }
48575
+ parent = parent.parentElement;
48576
+ }
48577
+ return _level;
48578
+ }
48579
+ /** @hidden */
48580
+ isAdvancedFiltering() {
48581
+ return this.entities?.length === 1 && !this.entities[0]?.name;
48582
+ }
48583
+ /** @hidden */
48584
+ isSearchValueInputDisabled() {
48585
+ return !this.selectedField ||
48586
+ !this.selectedCondition ||
48587
+ (this.selectedField &&
48588
+ (this.selectedField.filters.condition(this.selectedCondition).isUnary ||
48589
+ this.selectedField.filters.condition(this.selectedCondition).isNestedQuery));
48590
+ }
48591
+ constructor(cdr, platform, el, elRef, _localeId) {
48538
48592
  this.cdr = cdr;
48539
- this.iconService = iconService;
48540
48593
  this.platform = platform;
48541
48594
  this.el = el;
48595
+ this.elRef = elRef;
48542
48596
  this._localeId = _localeId;
48597
+ /**
48598
+ * Sets/gets the search value template.
48599
+ */
48600
+ this.searchValueTemplate = null;
48601
+ /**
48602
+ * Event fired as the expression tree is changed.
48603
+ */
48604
+ this.expressionTreeChange = new EventEmitter();
48605
+ /**
48606
+ * Event fired if a nested query builder tree is being edited.
48607
+ */
48608
+ this.inEditModeChange = new EventEmitter();
48543
48609
  /**
48544
48610
  * @hidden @internal
48545
48611
  */
48546
- this.cssClass = 'igx-query-builder';
48612
+ this.selectedExpressions = [];
48547
48613
  /**
48548
48614
  * @hidden @internal
48549
48615
  */
48550
- this.display = 'block';
48616
+ this.searchValue = { value: null };
48551
48617
  /**
48552
- * Event fired as the expression tree is changed.
48553
- *
48554
- * ```html
48555
- * <igx-query-builder (expressionTreeChange)='onExpressionTreeChange()'></igx-query-builder>
48556
- * ```
48618
+ * @hidden @internal
48557
48619
  */
48558
- this.expressionTreeChange = new EventEmitter();
48620
+ this.initialOperator = 0;
48559
48621
  /**
48560
48622
  * @hidden @internal
48561
48623
  */
48562
- this.selectedExpressions = [];
48624
+ this.returnFieldSelectOverlaySettings = {
48625
+ scrollStrategy: new AbsoluteScrollStrategy(),
48626
+ modal: false,
48627
+ closeOnOutsideClick: true
48628
+ };
48629
+ /**
48630
+ * @hidden @internal
48631
+ */
48632
+ this.entitySelectOverlaySettings = {
48633
+ scrollStrategy: new AbsoluteScrollStrategy(),
48634
+ modal: false,
48635
+ closeOnOutsideClick: true
48636
+ };
48563
48637
  /**
48564
48638
  * @hidden @internal
48565
48639
  */
48566
48640
  this.fieldSelectOverlaySettings = {
48567
48641
  scrollStrategy: new AbsoluteScrollStrategy(),
48568
48642
  modal: false,
48569
- closeOnOutsideClick: false
48643
+ closeOnOutsideClick: true
48570
48644
  };
48571
48645
  /**
48572
48646
  * @hidden @internal
@@ -48574,12 +48648,28 @@ class IgxQueryBuilderComponent {
48574
48648
  this.conditionSelectOverlaySettings = {
48575
48649
  scrollStrategy: new AbsoluteScrollStrategy(),
48576
48650
  modal: false,
48577
- closeOnOutsideClick: false
48651
+ closeOnOutsideClick: true
48652
+ };
48653
+ /**
48654
+ * @hidden @internal
48655
+ */
48656
+ this.addExpressionDropDownOverlaySettings = {
48657
+ scrollStrategy: new AbsoluteScrollStrategy(),
48658
+ modal: false,
48659
+ closeOnOutsideClick: true
48660
+ };
48661
+ /**
48662
+ * @hidden @internal
48663
+ */
48664
+ this.groupContextMenuDropDownOverlaySettings = {
48665
+ scrollStrategy: new AbsoluteScrollStrategy(),
48666
+ modal: false,
48667
+ closeOnOutsideClick: true
48578
48668
  };
48579
48669
  this.destroy$ = new Subject();
48580
- this._dblClickDelay = 200;
48581
- this._preventChipClick = false;
48582
- this._selectedGroups = [];
48670
+ this._focusDelay = DEFAULT_CHIP_FOCUS_DELAY;
48671
+ this._preventInit = false;
48672
+ this._expandedExpressions = [];
48583
48673
  this._resourceStrings = getCurrentResourceStrings(QueryBuilderResourceStringsEN);
48584
48674
  this._positionSettings = {
48585
48675
  horizontalStartPoint: HorizontalAlignment.Right,
@@ -48591,6 +48681,9 @@ class IgxQueryBuilderComponent {
48591
48681
  positionStrategy: new ConnectedPositioningStrategy(this._positionSettings),
48592
48682
  scrollStrategy: new CloseScrollStrategy()
48593
48683
  };
48684
+ this.keyDragOffsetIndex = 0;
48685
+ this.keyDragFirstMove = true;
48686
+ this.dropGhostClass = 'igx-filter-tree__expression-item-drop-ghost';
48594
48687
  this.locale = this.locale || this._localeId;
48595
48688
  }
48596
48689
  /**
@@ -48598,8 +48691,14 @@ class IgxQueryBuilderComponent {
48598
48691
  */
48599
48692
  ngAfterViewInit() {
48600
48693
  this._overlaySettings.outlet = this.overlayOutlet;
48694
+ this.entitySelectOverlaySettings.outlet = this.overlayOutlet;
48601
48695
  this.fieldSelectOverlaySettings.outlet = this.overlayOutlet;
48602
48696
  this.conditionSelectOverlaySettings.outlet = this.overlayOutlet;
48697
+ this.returnFieldSelectOverlaySettings.outlet = this.overlayOutlet;
48698
+ this.addExpressionDropDownOverlaySettings.outlet = this.overlayOutlet;
48699
+ this.groupContextMenuDropDownOverlaySettings.outlet = this.overlayOutlet;
48700
+ // Trigger additional change detection cycle
48701
+ this.cdr.detectChanges();
48603
48702
  }
48604
48703
  /**
48605
48704
  * @hidden @internal
@@ -48608,6 +48707,99 @@ class IgxQueryBuilderComponent {
48608
48707
  this.destroy$.next(true);
48609
48708
  this.destroy$.complete();
48610
48709
  }
48710
+ /**
48711
+ * @hidden @internal
48712
+ */
48713
+ set selectedEntity(value) {
48714
+ this._selectedEntity = this.entities?.find(el => el.name === value);
48715
+ }
48716
+ /**
48717
+ * @hidden @internal
48718
+ */
48719
+ get selectedEntity() {
48720
+ return this._selectedEntity;
48721
+ }
48722
+ /**
48723
+ * @hidden @internal
48724
+ */
48725
+ onEntitySelectChanging(event) {
48726
+ event.cancel = true;
48727
+ this._entityNewValue = event.newSelection.value;
48728
+ if (event.oldSelection.value && this.queryBuilder.showEntityChangeDialog) {
48729
+ this.entityChangeDialog.open();
48730
+ }
48731
+ else {
48732
+ this.onEntityChangeConfirm();
48733
+ }
48734
+ }
48735
+ /**
48736
+ * @hidden
48737
+ */
48738
+ onShowEntityChangeDialogChange(eventArgs) {
48739
+ this.queryBuilder.showEntityChangeDialog = !eventArgs.checked;
48740
+ }
48741
+ /**
48742
+ * @hidden
48743
+ */
48744
+ onEntityChangeCancel() {
48745
+ this.entityChangeDialog.close();
48746
+ this.entitySelect.close();
48747
+ this._entityNewValue = null;
48748
+ }
48749
+ /**
48750
+ * @hidden
48751
+ */
48752
+ onEntityChangeConfirm() {
48753
+ if (this._parentExpression) {
48754
+ this._expressionTree = this.createExpressionTreeFromGroupItem(this.createExpressionGroupItem(this._expressionTree));
48755
+ }
48756
+ this._selectedEntity = this._entityNewValue;
48757
+ if (!this._selectedEntity.fields) {
48758
+ this._selectedEntity.fields = [];
48759
+ }
48760
+ this.fields = this._entityNewValue ? this._entityNewValue.fields : [];
48761
+ this._selectedReturnFields = this.parentExpression ? [] : this._entityNewValue.fields?.map(f => f.field);
48762
+ if (this._expressionTree) {
48763
+ this._expressionTree.entity = this._entityNewValue.name;
48764
+ this._expressionTree.returnFields = [];
48765
+ this._expressionTree.filteringOperands = [];
48766
+ this._editedExpression = null;
48767
+ if (!this.parentExpression) {
48768
+ this.expressionTreeChange.emit(this._expressionTree);
48769
+ }
48770
+ this.rootGroup = null;
48771
+ this.currentGroup = this.rootGroup;
48772
+ }
48773
+ this._selectedField = null;
48774
+ this.selectedCondition = null;
48775
+ this.searchValue.value = null;
48776
+ this.entityChangeDialog.close();
48777
+ this.entitySelect.close();
48778
+ this._entityNewValue = null;
48779
+ this.innerQueryNewExpressionTree = null;
48780
+ this.initExpressionTree(this._selectedEntity.name, this.selectedReturnFields);
48781
+ }
48782
+ /**
48783
+ * @hidden @internal
48784
+ */
48785
+ set selectedReturnFields(value) {
48786
+ if (this._selectedReturnFields !== value) {
48787
+ this._selectedReturnFields = value;
48788
+ if (this._expressionTree && !this.parentExpression) {
48789
+ this._expressionTree.returnFields = value;
48790
+ this.expressionTreeChange.emit(this._expressionTree);
48791
+ }
48792
+ }
48793
+ }
48794
+ /**
48795
+ * @hidden @internal
48796
+ */
48797
+ get selectedReturnFields() {
48798
+ if (typeof this._selectedReturnFields == 'string') {
48799
+ return [this._selectedReturnFields];
48800
+ }
48801
+ return this._selectedReturnFields;
48802
+ }
48611
48803
  /**
48612
48804
  * @hidden @internal
48613
48805
  */
@@ -48617,7 +48809,7 @@ class IgxQueryBuilderComponent {
48617
48809
  this._selectedField = value;
48618
48810
  if (oldValue && this._selectedField && this._selectedField.dataType !== oldValue.dataType) {
48619
48811
  this.selectedCondition = null;
48620
- this.searchValue = null;
48812
+ this.searchValue.value = null;
48621
48813
  this.cdr.detectChanges();
48622
48814
  }
48623
48815
  }
@@ -48642,7 +48834,7 @@ class IgxQueryBuilderComponent {
48642
48834
  * used by the grid
48643
48835
  */
48644
48836
  get isContextMenuVisible() {
48645
- return !this.contextMenuToggle.collapsed;
48837
+ return !this.groupContextMenuDropDown.collapsed;
48646
48838
  }
48647
48839
  /**
48648
48840
  * @hidden @internal
@@ -48653,59 +48845,111 @@ class IgxQueryBuilderComponent {
48653
48845
  /**
48654
48846
  * @hidden @internal
48655
48847
  */
48656
- addCondition(parent, afterExpression) {
48848
+ addCondition(parent, afterExpression, isUIInteraction) {
48657
48849
  this.cancelOperandAdd();
48658
48850
  const operandItem = new ExpressionOperandItem({
48659
48851
  fieldName: null,
48660
48852
  condition: null,
48853
+ conditionName: null,
48661
48854
  ignoreCase: true,
48662
48855
  searchVal: null
48663
48856
  }, parent);
48664
- if (afterExpression) {
48665
- const index = parent.children.indexOf(afterExpression);
48666
- parent.children.splice(index + 1, 0, operandItem);
48857
+ const groupItem = new ExpressionGroupItem(this.getOperator(null) ?? FilteringLogic.And, parent);
48858
+ this.contextualGroup = groupItem;
48859
+ this.initialOperator = null;
48860
+ this._lastFocusedChipIndex = this._lastFocusedChipIndex == undefined ? -1 : this._lastFocusedChipIndex;
48861
+ if (parent) {
48862
+ if (afterExpression) {
48863
+ const index = parent.children.indexOf(afterExpression);
48864
+ parent.children.splice(index + 1, 0, operandItem);
48865
+ }
48866
+ else {
48867
+ parent.children.push(operandItem);
48868
+ }
48869
+ this._lastFocusedChipIndex++;
48667
48870
  }
48668
48871
  else {
48669
- parent.children.push(operandItem);
48872
+ this.rootGroup = groupItem;
48873
+ operandItem.parent = groupItem;
48874
+ this.rootGroup.children.push(operandItem);
48875
+ this._lastFocusedChipIndex = 0;
48876
+ }
48877
+ this._focusDelay = 250;
48878
+ if (isUIInteraction && !afterExpression) {
48879
+ this._lastFocusedChipIndex = this.expressionsChips.length;
48880
+ this._focusDelay = DEFAULT_CHIP_FOCUS_DELAY;
48670
48881
  }
48671
48882
  this.enterExpressionEdit(operandItem);
48672
48883
  }
48673
48884
  /**
48674
48885
  * @hidden @internal
48675
48886
  */
48676
- addAndGroup(parent, afterExpression) {
48677
- this.addGroup(FilteringLogic.And, parent, afterExpression);
48887
+ addReverseGroup(parent, afterExpression) {
48888
+ parent = parent ?? this.rootGroup;
48889
+ if (parent.operator === FilteringLogic.And) {
48890
+ this.addGroup(FilteringLogic.Or, parent, afterExpression);
48891
+ }
48892
+ else {
48893
+ this.addGroup(FilteringLogic.And, parent, afterExpression);
48894
+ }
48678
48895
  }
48679
48896
  /**
48680
48897
  * @hidden @internal
48681
48898
  */
48682
- addOrGroup(parent, afterExpression) {
48683
- this.addGroup(FilteringLogic.Or, parent, afterExpression);
48899
+ endGroup(groupItem) {
48900
+ this.currentGroup = groupItem.parent;
48684
48901
  }
48685
48902
  /**
48686
48903
  * @hidden @internal
48687
48904
  */
48688
- endGroup(groupItem) {
48689
- this.currentGroup = groupItem.parent;
48905
+ commitExpression() {
48906
+ this.commitOperandEdit();
48907
+ this.focusEditedExpressionChip();
48908
+ }
48909
+ /**
48910
+ * @hidden @internal
48911
+ */
48912
+ discardExpression(expressionItem) {
48913
+ this.cancelOperandEdit();
48914
+ if (expressionItem && expressionItem.expression.fieldName) {
48915
+ this.focusEditedExpressionChip();
48916
+ }
48690
48917
  }
48691
48918
  /**
48692
48919
  * @hidden @internal
48693
48920
  */
48694
48921
  commitOperandEdit() {
48922
+ const actualSearchValue = this.searchValue.value;
48695
48923
  if (this._editedExpression) {
48696
48924
  this._editedExpression.expression.fieldName = this.selectedField.field;
48697
48925
  this._editedExpression.expression.condition = this.selectedField.filters.condition(this.selectedCondition);
48698
- this._editedExpression.expression.searchVal = DataUtil.parseValue(this.selectedField.dataType, this.searchValue);
48926
+ this._editedExpression.expression.conditionName = this.selectedCondition;
48927
+ this._editedExpression.expression.searchVal = DataUtil.parseValue(this.selectedField.dataType, actualSearchValue) || actualSearchValue;
48699
48928
  this._editedExpression.fieldLabel = this.selectedField.label
48700
48929
  ? this.selectedField.label
48701
48930
  : this.selectedField.header
48702
48931
  ? this.selectedField.header
48703
48932
  : this.selectedField.field;
48933
+ const innerQuery = this.innerQueries.filter(q => q.isInEditMode())[0];
48934
+ if (innerQuery && this.selectedField?.filters?.condition(this.selectedCondition)?.isNestedQuery) {
48935
+ innerQuery.exitEditAddMode();
48936
+ this._editedExpression.expression.searchTree = this.getExpressionTreeCopy(innerQuery.expressionTree);
48937
+ this._editedExpression.expression.searchTree.returnFields = innerQuery.selectedReturnFields;
48938
+ }
48939
+ else {
48940
+ this._editedExpression.expression.searchTree = null;
48941
+ }
48942
+ this.innerQueryNewExpressionTree = null;
48943
+ if (this.selectedField.filters.condition(this.selectedCondition)?.isUnary || this.selectedField.filters.condition(this.selectedCondition)?.isNestedQuery) {
48944
+ this._editedExpression.expression.searchVal = null;
48945
+ }
48704
48946
  this._editedExpression.inEditMode = false;
48705
48947
  this._editedExpression = null;
48706
48948
  }
48707
- this._expressionTree = this.createExpressionTreeFromGroupItem(this.rootGroup);
48708
- this.expressionTreeChange.emit();
48949
+ this._expressionTree = this.createExpressionTreeFromGroupItem(this.rootGroup, this.selectedEntity?.name, this.selectedReturnFields);
48950
+ if (!this.parentExpression) {
48951
+ this.expressionTreeChange.emit(this._expressionTree);
48952
+ }
48709
48953
  }
48710
48954
  /**
48711
48955
  * @hidden @internal
@@ -48720,6 +48964,16 @@ class IgxQueryBuilderComponent {
48720
48964
  * @hidden @internal
48721
48965
  */
48722
48966
  cancelOperandEdit() {
48967
+ if (this.innerQueries) {
48968
+ const innerQuery = this.innerQueries.filter(q => q.isInEditMode())[0];
48969
+ if (innerQuery) {
48970
+ if (innerQuery._editedExpression) {
48971
+ innerQuery.cancelOperandEdit();
48972
+ }
48973
+ innerQuery.expressionTree = this.getExpressionTreeCopy(this._editedExpression.expression.searchTree);
48974
+ this.innerQueryNewExpressionTree = null;
48975
+ }
48976
+ }
48723
48977
  if (this._editedExpression) {
48724
48978
  this._editedExpression.inEditMode = false;
48725
48979
  if (!this._editedExpression.expression.fieldName) {
@@ -48727,13 +48981,67 @@ class IgxQueryBuilderComponent {
48727
48981
  }
48728
48982
  this._editedExpression = null;
48729
48983
  }
48984
+ if (!this.expressionTree && this.contextualGroup) {
48985
+ this.initialOperator = this.contextualGroup.operator;
48986
+ }
48730
48987
  }
48731
48988
  /**
48732
48989
  * @hidden @internal
48733
48990
  */
48734
48991
  operandCanBeCommitted() {
48992
+ const innerQuery = this.innerQueries.filter(q => q.isInEditMode())[0];
48735
48993
  return this.selectedField && this.selectedCondition &&
48736
- (!!this.searchValue || this.selectedField.filters.condition(this.selectedCondition).isUnary);
48994
+ ((((!Array.isArray(this.searchValue.value) && !!this.searchValue.value) || (Array.isArray(this.searchValue.value) && this.searchValue.value.length !== 0)) &&
48995
+ !(this.selectedField?.filters?.condition(this.selectedCondition)?.isNestedQuery)) ||
48996
+ (this.selectedField?.filters?.condition(this.selectedCondition)?.isNestedQuery && innerQuery && !!innerQuery.expressionTree && innerQuery.selectedReturnFields?.length > 0) ||
48997
+ this.selectedField.filters.condition(this.selectedCondition)?.isUnary);
48998
+ }
48999
+ /**
49000
+ * @hidden @internal
49001
+ */
49002
+ canCommitCurrentState() {
49003
+ const innerQuery = this.innerQueries.filter(q => q.isInEditMode())[0];
49004
+ if (innerQuery) {
49005
+ return this.selectedReturnFields?.length > 0 && innerQuery.canCommitCurrentState();
49006
+ }
49007
+ else {
49008
+ return this.selectedReturnFields?.length > 0 &&
49009
+ ((!this._editedExpression) || // no edited expr
49010
+ (this._editedExpression && !this.selectedField) || // empty edited expr
49011
+ (this._editedExpression && this.operandCanBeCommitted() === true) // valid edited expr
49012
+ );
49013
+ }
49014
+ }
49015
+ /**
49016
+ * @hidden @internal
49017
+ */
49018
+ commitCurrentState() {
49019
+ const innerQuery = this.innerQueries.filter(q => q.isInEditMode())[0];
49020
+ if (innerQuery) {
49021
+ innerQuery.commitCurrentState();
49022
+ }
49023
+ if (this._editedExpression) {
49024
+ if (this.selectedField) {
49025
+ this.commitOperandEdit();
49026
+ }
49027
+ else {
49028
+ this.deleteItem(this._editedExpression);
49029
+ this._editedExpression = null;
49030
+ }
49031
+ }
49032
+ }
49033
+ /**
49034
+ * @hidden @internal
49035
+ */
49036
+ exitEditAddMode(shouldPreventInit = false) {
49037
+ if (!this._editedExpression) {
49038
+ return;
49039
+ }
49040
+ this.exitOperandEdit();
49041
+ this.cancelOperandAdd();
49042
+ if (shouldPreventInit) {
49043
+ this._preventInit = true;
49044
+ }
48737
49045
  }
48738
49046
  /**
48739
49047
  * @hidden @internal
@@ -48757,138 +49065,673 @@ class IgxQueryBuilderComponent {
48757
49065
  isExpressionGroup(expression) {
48758
49066
  return expression instanceof ExpressionGroupItem;
48759
49067
  }
49068
+ /**
49069
+ * @hidden @internal
49070
+ */
49071
+ onExpressionFocus(expressionItem) {
49072
+ if (this.prevFocusedExpression) {
49073
+ this.prevFocusedExpression.focused = false;
49074
+ }
49075
+ expressionItem.focused = true;
49076
+ this.prevFocusedExpression = expressionItem;
49077
+ }
49078
+ /**
49079
+ * @hidden @internal
49080
+ */
49081
+ onExpressionBlur(event, expressionItem) {
49082
+ if (this._prevFocusedContainer && this._prevFocusedContainer !== event.target.closest('.igx-filter-tree__expression-item')) {
49083
+ expressionItem.focused = false;
49084
+ }
49085
+ this._prevFocusedContainer = event.target.closest('.igx-filter-tree__expression-item');
49086
+ }
48760
49087
  /**
48761
49088
  * @hidden @internal
48762
49089
  */
48763
49090
  onChipRemove(expressionItem) {
49091
+ this.exitEditAddMode();
48764
49092
  this.deleteItem(expressionItem);
48765
49093
  }
49094
+ //Get the dragged ghost as a HTMLElement
49095
+ get dragGhostElement() {
49096
+ return document.querySelector('.igx-chip__ghost[ghostclass="igx-chip__ghost"]');
49097
+ }
49098
+ //Get the drop ghost as a HTMLElement
49099
+ get dropGhostElement() {
49100
+ return document.querySelector(`.${this.dropGhostClass}`);
49101
+ }
49102
+ get mainExpressionTree() {
49103
+ return this.el.nativeElement.querySelector('.igx-filter-tree');
49104
+ }
49105
+ //Chip can be dragged if it's tree is in edit mode and there is no inner query that's been edited
49106
+ canBeDragged() {
49107
+ return this.isInEditMode && (!this.innerQueries || this.innerQueries.length == 0 || !this.innerQueries?.some(q => q.isInEditMode()));
49108
+ }
49109
+ //When we pick up a chip
49110
+ onMoveStart(sourceDragElement, sourceExpressionItem, isKeyboardDrag) {
49111
+ //console.log('Picked up:', event, sourceDragElement);
49112
+ this.resetDragAndDrop(true);
49113
+ this.isKeyboardDrag = isKeyboardDrag;
49114
+ this.sourceExpressionItem = sourceExpressionItem;
49115
+ this.sourceElement = sourceDragElement;
49116
+ this.listenToKeyboard();
49117
+ if (!this.isKeyboardDrag) {
49118
+ this.sourceElement.style.display = 'none';
49119
+ }
49120
+ }
49121
+ //When we let go a chip outside a proper drop zone
49122
+ onMoveEnd() {
49123
+ // console.log('Let go:');
49124
+ if (!this.sourceElement || !this.sourceExpressionItem)
49125
+ return;
49126
+ if (this.dropGhostChipNode) {
49127
+ //If there is a ghost chip presented to the user, execute drop
49128
+ this.onChipDropped();
49129
+ }
49130
+ else {
49131
+ this.resetDragAndDrop(true);
49132
+ }
49133
+ this.ghostChipMousemoveSubscription$?.unsubscribe();
49134
+ this.keyboardSubscription$?.unsubscribe();
49135
+ }
49136
+ //On entering a drop area of another chip
49137
+ onDivEnter(targetDragElement, targetExpressionItem) {
49138
+ this.onChipEnter(targetDragElement, targetExpressionItem, true);
49139
+ }
49140
+ //TODO remove fromDiv: boolean -> targetDragElement is always the div
49141
+ onChipEnter(targetDragElement, targetExpressionItem, fromDiv) {
49142
+ // console.log('Entering:', targetDragElement, targetExpressionItem, 'from div:', fromDiv);
49143
+ if (!this.sourceElement || !this.sourceExpressionItem)
49144
+ return;
49145
+ //If entering the one that's been picked up
49146
+ if (targetDragElement == this.sourceElement)
49147
+ return;
49148
+ //Simulate leaving the last entered chip in case of no Leave event triggered due to the artificial drop zone of a north positioned ghost chip
49149
+ if (this.targetElement) {
49150
+ this.resetDragAndDrop(false);
49151
+ }
49152
+ this.targetElement = targetDragElement;
49153
+ this.targetExpressionItem = targetExpressionItem;
49154
+ //Determine the middle point of the chip. (fromDiv - get the div's chip)
49155
+ const appendUnder = fromDiv ? this.ghostInLowerPart(targetDragElement.children[0]) : this.ghostInLowerPart(targetDragElement);
49156
+ this.renderDropGhostChip(targetDragElement, appendUnder);
49157
+ }
49158
+ //On moving the dragged chip in a drop area
49159
+ onDivOver(targetDragElement, targetExpressionItem) {
49160
+ if (this.targetExpressionItem === targetExpressionItem) {
49161
+ this.onChipOver(targetDragElement, true);
49162
+ }
49163
+ else {
49164
+ this.onChipEnter(targetDragElement, targetExpressionItem, true);
49165
+ }
49166
+ }
49167
+ //TODO remove fromDiv: boolean -> targetDragElement is always the div
49168
+ onChipOver(targetDragElement, fromDiv) {
49169
+ //console.log('Over:', targetDragElement, 'type: ', typeof event);
49170
+ if (!this.sourceElement || !this.sourceExpressionItem)
49171
+ return;
49172
+ //Determine the middle point of the chip. (fromDiv - get the div's chip)
49173
+ const appendUnder = fromDiv ? this.ghostInLowerPart(targetDragElement.children[0]) : this.ghostInLowerPart(targetDragElement);
49174
+ this.renderDropGhostChip(targetDragElement, appendUnder);
49175
+ }
49176
+ onChipLeave() {
49177
+ if (!this.sourceElement || !this.sourceExpressionItem || !this.targetElement)
49178
+ return;
49179
+ //console.log('Leaving:', targetDragElement.textContent.trim());
49180
+ //if the drag ghost is on the drop ghost row don't trigger leave
49181
+ if (this.dragGhostIsOnDropGhostRow(this.dragGhostElement, this.dropGhostChipNode?.firstChild)) {
49182
+ return;
49183
+ }
49184
+ if (this.targetElement) {
49185
+ this.resetDragAndDrop(false);
49186
+ }
49187
+ }
49188
+ //On dropped in a drop area of another chip
49189
+ onDivDropped(targetExpressionItem) {
49190
+ if (targetExpressionItem != this.sourceExpressionItem) {
49191
+ this.onChipDropped();
49192
+ }
49193
+ }
49194
+ onChipDropped() {
49195
+ if (!this.sourceElement || !this.sourceExpressionItem || !this.targetElement)
49196
+ return;
49197
+ //console.log('Move: [', this.sourceElement.children[0].textContent.trim(), (this.dropUnder ? '] under: [' : '] over:'), this.targetExpressionItem)
49198
+ this.moveDraggedChipToNewLocation(this.targetExpressionItem);
49199
+ this.resetDragAndDrop(true);
49200
+ this.exitEditAddMode();
49201
+ }
49202
+ onGroupRootOver(targetDragElement, targetExpressionItem) {
49203
+ //console.log('Entering:', targetDragElement, targetExpressionItem);
49204
+ if (!this.sourceElement || !this.sourceExpressionItem)
49205
+ return;
49206
+ let newTargetElement, newTargetExpressionItem;
49207
+ if (this.ghostInLowerPart(targetDragElement) || !targetExpressionItem.parent) {
49208
+ //if ghost in lower part of the AND/OR (or it's the main group) => drop before the group starts
49209
+ newTargetElement = targetDragElement.nextElementSibling.firstElementChild;
49210
+ newTargetElement = (newTargetElement.className.indexOf(this.dropGhostClass) !== -1) ? newTargetElement.nextElementSibling : newTargetElement;
49211
+ newTargetExpressionItem = targetExpressionItem.children[0];
49212
+ }
49213
+ else {
49214
+ //if ghost in upper part or it's the root group => drop as first child of that group
49215
+ newTargetElement = targetDragElement.parentElement.parentElement;
49216
+ newTargetExpressionItem = targetExpressionItem;
49217
+ }
49218
+ if (newTargetElement && (this.targetElement !== newTargetElement || this.targetExpressionItem !== newTargetExpressionItem)) {
49219
+ this.resetDragAndDrop(false);
49220
+ this.targetElement = newTargetElement;
49221
+ this.targetExpressionItem = newTargetExpressionItem;
49222
+ this.renderDropGhostChip(this.targetElement, false);
49223
+ }
49224
+ }
49225
+ onAddConditionEnter(addConditionElement, rootGroup) {
49226
+ //console.log('onAddConditionEnter', addConditionElement);
49227
+ if (!this.sourceElement || !this.sourceExpressionItem)
49228
+ return;
49229
+ const lastElement = addConditionElement.parentElement.previousElementSibling.lastElementChild;
49230
+ if (lastElement == this.dropGhostChipNode)
49231
+ return;
49232
+ //simulate entering in the lower part of the last chip/group
49233
+ this.onChipEnter(lastElement, rootGroup.children[rootGroup.children.length - 1], false);
49234
+ }
49235
+ onAddConditionLeave() {
49236
+ this.onChipLeave();
49237
+ }
49238
+ //Checks if the dragged ghost is horizontally on the same line with the drop ghost
49239
+ dragGhostIsOnDropGhostRow(dragGhost, dropGhost) {
49240
+ const dragGhostBounds = dragGhost.getBoundingClientRect();
49241
+ const dropGhostBounds = dropGhost.getBoundingClientRect();
49242
+ if (!dragGhostBounds || !dropGhostBounds)
49243
+ return false;
49244
+ const ghostHeight = dragGhostBounds.bottom - dragGhostBounds.top;
49245
+ return !(dragGhostBounds.bottom < dropGhostBounds.top - ghostHeight || dragGhostBounds.top > dropGhostBounds.bottom + ghostHeight);
49246
+ }
49247
+ //Checks if the dragged ghost is north or south of a target element's center
49248
+ ghostInLowerPart(ofElement) {
49249
+ //if (event == null) return true;
49250
+ const ghostBounds = this.dragGhostElement.getBoundingClientRect();
49251
+ const targetBounds = ofElement.getBoundingClientRect();
49252
+ return ((ghostBounds.top + ghostBounds.bottom) / 2) >= ((targetBounds.top + targetBounds.bottom) / 2);
49253
+ }
49254
+ //Create the drop ghost node based on the base chip that's been dragged
49255
+ //TODO refactor this using angular and css?
49256
+ createDropGhost(keyboardMode) {
49257
+ const dragCopy = this.sourceElement.cloneNode(true);
49258
+ dragCopy.classList.add(this.dropGhostClass);
49259
+ dragCopy.style.display = '';
49260
+ dragCopy.firstChild.style.visibility = 'visible';
49261
+ dragCopy.removeChild(dragCopy.childNodes[3]);
49262
+ if (!keyboardMode) {
49263
+ var span = document.createElement('span');
49264
+ //TODO Localize string
49265
+ span.innerHTML = "Drop here to insert";
49266
+ dragCopy.firstChild.firstChild.removeChild(dragCopy.firstChild.firstChild.childNodes[1]);
49267
+ dragCopy.firstChild.firstChild.removeChild(dragCopy.firstChild.firstChild.childNodes[1]);
49268
+ dragCopy.firstChild.firstChild.firstChild.replaceChildren(span);
49269
+ dragCopy.firstChild.firstChild.classList.add('igx-filter-tree__expression-item-ghost');
49270
+ }
49271
+ return dragCopy;
49272
+ }
49273
+ //Make a copy of the drag chip and place it in the DOM north or south of the drop chip
49274
+ renderDropGhostChip(appendToElement, appendUnder, keyboardMode) {
49275
+ const dragCopy = this.createDropGhost(keyboardMode);
49276
+ //Append the ghost
49277
+ if ((!appendUnder && this.dropUnder !== false) || //mouse mode
49278
+ (keyboardMode && !appendUnder)) {
49279
+ //over
49280
+ this.dropGhostChipNode?.remove();
49281
+ this.dropGhostChipNode = dragCopy;
49282
+ this.dropUnder = false;
49283
+ appendToElement.parentNode.insertBefore(this.dropGhostChipNode, appendToElement);
49284
+ }
49285
+ else if ((appendUnder && this.dropUnder !== true) || //mouse mode
49286
+ (keyboardMode && appendUnder)) {
49287
+ //under
49288
+ this.dropGhostChipNode?.remove();
49289
+ this.dropGhostChipNode = dragCopy;
49290
+ this.dropUnder = true;
49291
+ appendToElement.parentNode.insertBefore(this.dropGhostChipNode, appendToElement.nextElementSibling);
49292
+ }
49293
+ //Put focus on the drag icon of the ghost while performing keyboard drag
49294
+ if (this.isKeyboardDrag) {
49295
+ this.dropGhostChipNode.querySelector('.igx-drag-indicator').focus();
49296
+ }
49297
+ //Attach a mousemove event listener (if not already in place) to the dragged ghost (if present)
49298
+ if (this.dragGhostElement && (!this.ghostChipMousemoveSubscription$ || this.ghostChipMousemoveSubscription$?.closed === true)) {
49299
+ const mouseMoves = fromEvent(this.dragGhostElement, 'mousemove');
49300
+ this.ghostChipMousemoveSubscription$ = mouseMoves.pipe(sampleTime(100)).subscribe(() => {
49301
+ this.onChipLeave();
49302
+ });
49303
+ }
49304
+ this.setDragCursor('grab');
49305
+ }
49306
+ //Set the cursor when dragging a ghost
49307
+ setDragCursor(cursor) {
49308
+ if (this.dragGhostElement) {
49309
+ this.dragGhostElement.style.cursor = cursor;
49310
+ }
49311
+ }
49312
+ //Execute the drop
49313
+ moveDraggedChipToNewLocation(appendToExpressionItem, fromAddConditionBtn) {
49314
+ //Copy dragged chip
49315
+ const dragCopy = { ...this.sourceExpressionItem };
49316
+ dragCopy.parent = appendToExpressionItem.parent;
49317
+ //Paste on new place
49318
+ const index = appendToExpressionItem.parent.children.indexOf(appendToExpressionItem);
49319
+ appendToExpressionItem.parent.children.splice(index + (fromAddConditionBtn || this.dropUnder ? 1 : 0), 0, dragCopy);
49320
+ //Delete from old place
49321
+ this.deleteItem(this.sourceExpressionItem);
49322
+ }
49323
+ //Reset Drag&Drop vars. Optionally the drag source vars too
49324
+ resetDragAndDrop(clearDragged) {
49325
+ this.targetExpressionItem = null;
49326
+ this.targetElement = null;
49327
+ this.dropUnder = null;
49328
+ this.dropGhostChipNode?.remove();
49329
+ this.dropGhostChipNode = null;
49330
+ this.keyDragOffsetIndex = 0;
49331
+ this.keyDragFirstMove = true;
49332
+ this.setDragCursor('no-drop');
49333
+ if ((clearDragged || this.isKeyboardDrag) && this.sourceElement) {
49334
+ this.sourceElement.style.display = '';
49335
+ }
49336
+ if (clearDragged) {
49337
+ this.sourceExpressionItem = null;
49338
+ this.sourceElement = null;
49339
+ this.dropZonesList = null;
49340
+ this.expressionsList = null;
49341
+ }
49342
+ }
49343
+ listenToKeyboard() {
49344
+ this.keyboardSubscription$?.unsubscribe();
49345
+ this.keyboardSubscription$ = fromEvent(this.mainExpressionTree, 'keydown')
49346
+ .pipe(filter$1(key => ['ArrowUp', 'ArrowDown', 'Enter', 'Space', 'Escape', 'Tab'].includes(key.code)))
49347
+ .pipe(tap$1(e => {
49348
+ //Inhibit Tabs if keyboard drag is underway
49349
+ if (e.key !== 'Tab' || this.dropGhostElement)
49350
+ e.preventDefault();
49351
+ }))
49352
+ .pipe(filter$1(event => !event.repeat))
49353
+ .subscribe(key => {
49354
+ if (key.code == 'Escape') {
49355
+ //TODO cancel mouse drag
49356
+ this.resetDragAndDrop(false);
49357
+ //Regain focus on the drag icon after keyboard drag cancel
49358
+ if (this.isKeyboardDrag) {
49359
+ this.sourceElement.firstElementChild.firstElementChild.firstElementChild.firstElementChild.focus();
49360
+ }
49361
+ }
49362
+ else if (key.code == 'ArrowUp' || key.code == 'ArrowDown') {
49363
+ this.arrowDrag(key);
49364
+ }
49365
+ else if (key.code == 'Enter' || key.code == 'Space') {
49366
+ //this.platform.isActivationKey(eventArgs) Maybe use this rather that Enter/Space?
49367
+ this.onChipDropped();
49368
+ this.keyboardSubscription$.unsubscribe();
49369
+ }
49370
+ });
49371
+ }
49372
+ //Perform up/down movement of drop ghost along the expression tree
49373
+ arrowDrag(key) {
49374
+ if (!this.sourceElement || !this.sourceExpressionItem)
49375
+ return;
49376
+ if (this.keyDragFirstMove) {
49377
+ this.expressionsList = this.getListedExpressions(this.rootGroup);
49378
+ this.dropZonesList = this.getListedDropZones();
49379
+ this.sourceElement.style.display = 'none';
49380
+ }
49381
+ //const index = this.expressionsList.indexOf(this.sourceExpressionItem);
49382
+ const index = this.dropZonesList.indexOf(this.sourceElement);
49383
+ if (index === -1)
49384
+ console.error("Dragged expression not found");
49385
+ let newKeyIndexOffset = 0;
49386
+ if (key.code == 'ArrowUp') {
49387
+ //decrease index offset capped at top of tree
49388
+ newKeyIndexOffset = this.keyDragOffsetIndex - 1 >= index * -2 - 1 ? this.keyDragOffsetIndex - 1 : this.keyDragOffsetIndex;
49389
+ }
49390
+ else if (key.code == 'ArrowDown') {
49391
+ //increase index offset capped at bottom of tree
49392
+ newKeyIndexOffset = this.keyDragOffsetIndex + 1 <= (this.dropZonesList.length - 2 - index) * 2 + 2 ? this.keyDragOffsetIndex + 1 : this.keyDragOffsetIndex;
49393
+ }
49394
+ else {
49395
+ console.error('wrong key');
49396
+ return;
49397
+ }
49398
+ //if up/down limits not reached
49399
+ if (newKeyIndexOffset != this.keyDragOffsetIndex) {
49400
+ this.keyDragOffsetIndex = newKeyIndexOffset;
49401
+ const indexOffset = ~~(this.keyDragOffsetIndex / 2);
49402
+ if (index + indexOffset <= this.expressionsList.length - 1) {
49403
+ let under = this.keyDragOffsetIndex < 0 ? this.keyDragOffsetIndex % 2 == 0 ? true : false : this.keyDragOffsetIndex % 2 == 0 ? false : true;
49404
+ if (this.dropZonesList[index + indexOffset].className.indexOf('igx-filter-tree__expression-context-menu') === -1) {
49405
+ this.targetElement = this.dropZonesList[index + indexOffset];
49406
+ this.targetExpressionItem = this.expressionsList[index + indexOffset];
49407
+ }
49408
+ else {
49409
+ //if the current drop zone is a group root (AND/OR)
49410
+ if (index + indexOffset === 0) {
49411
+ //If the root group's AND/OR
49412
+ this.targetElement = this.dropZonesList[0];
49413
+ this.targetExpressionItem = this.rootGroup.children[0];
49414
+ under = true;
49415
+ }
49416
+ else if (under) {
49417
+ //If under AND/OR
49418
+ this.targetElement = this.dropZonesList[index + indexOffset];
49419
+ this.targetExpressionItem = this.expressionsList[index + indexOffset + 1];
49420
+ }
49421
+ else {
49422
+ //if over AND/OR
49423
+ this.targetElement = this.dropZonesList[index + indexOffset].parentElement.parentElement;
49424
+ this.targetExpressionItem = this.expressionsList[index + indexOffset];
49425
+ }
49426
+ //If should drop under AND/OR => drop over first chip in that AND/OR's group
49427
+ if (under) {
49428
+ this.targetElement = this.targetElement.nextElementSibling.firstElementChild;
49429
+ if (this.targetElement === this.dropGhostChipNode)
49430
+ this.targetElement = this.targetElement.nextElementSibling;
49431
+ under = false;
49432
+ }
49433
+ }
49434
+ const before = this.getPreviousChip(this.dropGhostElement);
49435
+ const after = this.getNextChip(this.dropGhostElement);
49436
+ this.renderDropGhostChip(this.targetElement, under, true);
49437
+ //If it's the first arrow hit OR drop ghost is not displayed OR hasn't actually moved, move one more step in the same direction
49438
+ if (this.keyDragFirstMove ||
49439
+ !this.dropGhostElement ||
49440
+ (this.getPreviousChip(this.dropGhostElement) === before && this.getNextChip(this.dropGhostElement) === after)) {
49441
+ this.keyDragFirstMove = false;
49442
+ this.arrowDrag(key);
49443
+ }
49444
+ }
49445
+ else {
49446
+ //Dropping on '+ Condition button' => drop as last condition in the root group
49447
+ let lastElement = this.dropZonesList[this.dropZonesList.length - 1].parentElement.previousElementSibling;
49448
+ if (lastElement.className.indexOf("igx-filter-tree__expression-section") !== -1)
49449
+ lastElement = lastElement.lastElementChild;
49450
+ if (lastElement.className.indexOf("igx-filter-tree__subquery") !== -1)
49451
+ lastElement = lastElement.previousElementSibling;
49452
+ if (lastElement === this.dropGhostChipNode)
49453
+ lastElement = lastElement.previousElementSibling;
49454
+ const getParentExpression = (expression) => {
49455
+ return expression.parent ? getParentExpression(expression.parent) : expression;
49456
+ };
49457
+ const rootGroup = getParentExpression(this.expressionsList[this.expressionsList.length - 1]);
49458
+ this.targetElement = lastElement;
49459
+ this.targetExpressionItem = rootGroup.children[rootGroup.children.length - 1];
49460
+ this.renderDropGhostChip(lastElement, true, true);
49461
+ }
49462
+ }
49463
+ return;
49464
+ }
49465
+ //Get previous chip area taking into account a possible hidden sub-tree or collapsed base chip
49466
+ getPreviousChip(chipSubject) {
49467
+ let prevElement = chipSubject;
49468
+ do {
49469
+ prevElement = prevElement?.previousElementSibling;
49470
+ } while (prevElement && getComputedStyle(prevElement).display === 'none');
49471
+ return prevElement;
49472
+ }
49473
+ //Get next chip area taking into account a possible hidden sub-tree or collapsed base chip
49474
+ getNextChip(chipSubject) {
49475
+ let nextElement = chipSubject;
49476
+ do {
49477
+ nextElement = nextElement?.nextElementSibling;
49478
+ } while (nextElement && getComputedStyle(nextElement).display === 'none');
49479
+ return nextElement;
49480
+ }
49481
+ //Get all expressions from the tree flatten out as a list, including the expression groups
49482
+ getListedExpressions(group) {
49483
+ const expressions = [];
49484
+ expressions.push(group);
49485
+ group.children.forEach(child => {
49486
+ if (child instanceof ExpressionGroupItem) {
49487
+ expressions.push(...this.getListedExpressions(child));
49488
+ }
49489
+ else {
49490
+ expressions.push(child);
49491
+ }
49492
+ });
49493
+ return expressions;
49494
+ }
49495
+ //Gets all chip elements owned by this tree (discard child trees), AND/OR group roots and '+condition' button, flatten out as a list of HTML elements
49496
+ getListedDropZones() {
49497
+ const viableDropAreaSelector = `.igx-filter-tree__expression-item[igxDrop]:not(.${this.dropGhostClass}),` + /*Condition chip*/ //TODO :not(.${this.dropGhostClass}) might be redundant now
49498
+ `.igx-filter-tree__subquery:has([igxDrop]),` + /*Chip in edit*/
49499
+ `.igx-filter-tree__buttons > .igx-button[igxDrop]:first-of-type,` + /*Add Condition Button*/
49500
+ `.igx-filter-tree__expression-context-menu[igxDrop]`; /*AND/OR group root*/
49501
+ const expressionElementList = this.el.nativeElement.querySelectorAll(viableDropAreaSelector);
49502
+ const ownChipElements = [];
49503
+ const isNotFromThisTree = (qb, parent) => {
49504
+ if (parent == qb)
49505
+ return false;
49506
+ else if (parent?.style?.display === "none" || parent.classList.contains('igx-query-builder-tree'))
49507
+ return true;
49508
+ else if (parent.parentElement)
49509
+ return isNotFromThisTree(qb, parent.parentElement);
49510
+ else
49511
+ return false;
49512
+ };
49513
+ expressionElementList.forEach(element => {
49514
+ if (!isNotFromThisTree(this.el.nativeElement, element) && getComputedStyle(element).display !== 'none')
49515
+ ownChipElements.push(element);
49516
+ });
49517
+ return ownChipElements;
49518
+ }
49519
+ onChipDragIndicatorFocus(sourceDragElement, sourceExpressionItem) {
49520
+ sourceDragElement.querySelector('.igx-drag-indicator').setAttribute('aria-hidden', 'false'); //Temp solution for aria-hidden bug #35759
49521
+ this.onMoveStart(sourceDragElement, sourceExpressionItem, true);
49522
+ }
49523
+ onChipDragIndicatorFocusOut() {
49524
+ if (this.sourceElement?.style?.display !== 'none') {
49525
+ this.resetDragAndDrop(true);
49526
+ this.keyboardSubscription$?.unsubscribe();
49527
+ }
49528
+ }
49529
+ //Upon blurring the tree, if Keyboard drag is underway and the next active item is not the drop ghost's drag indicator icon, cancel the drag&drop procedure
49530
+ onDragFocusOut() {
49531
+ if (this.isKeyboardDrag && this.dropGhostElement) {
49532
+ //have to wait a tick because upon blur, the next activeElement is always body, right before the next element gains focus
49533
+ setTimeout(() => {
49534
+ if (document.activeElement.className.indexOf("igx-drag-indicator") === -1) {
49535
+ this.resetDragAndDrop(true);
49536
+ this.keyboardSubscription$?.unsubscribe();
49537
+ }
49538
+ }, 0);
49539
+ }
49540
+ }
49541
+ /* DRAG AND DROP END*/
48766
49542
  /**
48767
49543
  * @hidden @internal
48768
49544
  */
48769
- onChipClick(expressionItem) {
48770
- this._clickTimer = setTimeout(() => {
48771
- if (!this._preventChipClick) {
48772
- this.onToggleExpression(expressionItem);
48773
- }
48774
- this._preventChipClick = false;
48775
- }, this._dblClickDelay);
49545
+ addExpressionBlur() {
49546
+ if (this.prevFocusedExpression) {
49547
+ this.prevFocusedExpression.focused = false;
49548
+ }
49549
+ if (this.addExpressionItemDropDown && !this.addExpressionItemDropDown.collapsed) {
49550
+ this.addExpressionItemDropDown.close();
49551
+ }
48776
49552
  }
48777
49553
  /**
48778
49554
  * @hidden @internal
48779
49555
  */
48780
- onChipDblClick(expressionItem) {
48781
- clearTimeout(this._clickTimer);
48782
- this._preventChipClick = true;
48783
- this.enterExpressionEdit(expressionItem);
49556
+ onChipClick(expressionItem, chip) {
49557
+ this.enterExpressionEdit(expressionItem, chip);
48784
49558
  }
48785
49559
  /**
48786
49560
  * @hidden @internal
48787
49561
  */
48788
- enterExpressionEdit(expressionItem) {
48789
- this.clearSelection();
48790
- this.exitOperandEdit();
48791
- this.cancelOperandAdd();
49562
+ enterExpressionEdit(expressionItem, chip) {
49563
+ this.exitEditAddMode(true);
49564
+ this.cdr.detectChanges();
49565
+ this._lastFocusedChipIndex = chip ? this.expressionsChips.toArray().findIndex(expr => expr === chip) : this._lastFocusedChipIndex;
49566
+ this.enterEditMode(expressionItem);
49567
+ }
49568
+ /**
49569
+ * @hidden @internal
49570
+ */
49571
+ clickExpressionAdd(targetButton, chip) {
49572
+ this.exitEditAddMode(true);
49573
+ this.cdr.detectChanges();
49574
+ this._lastFocusedChipIndex = this.expressionsChips.toArray().findIndex(expr => expr === chip);
49575
+ this.openExpressionAddDialog(targetButton);
49576
+ }
49577
+ /**
49578
+ * @hidden @internal
49579
+ */
49580
+ openExpressionAddDialog(targetButton) {
49581
+ this.addExpressionDropDownOverlaySettings.target = targetButton;
49582
+ this.addExpressionDropDownOverlaySettings.positionStrategy = new ConnectedPositioningStrategy({
49583
+ horizontalDirection: HorizontalAlignment.Right,
49584
+ horizontalStartPoint: HorizontalAlignment.Left,
49585
+ verticalStartPoint: VerticalAlignment.Bottom
49586
+ });
49587
+ this.addExpressionItemDropDown.open(this.addExpressionDropDownOverlaySettings);
49588
+ }
49589
+ /**
49590
+ * @hidden @internal
49591
+ */
49592
+ enterExpressionAdd(event, expressionItem) {
49593
+ if (this._addModeExpression) {
49594
+ this._addModeExpression.inAddMode = false;
49595
+ }
49596
+ if (this.parentExpression) {
49597
+ this.inEditModeChange.emit(this.parentExpression);
49598
+ }
49599
+ const parent = expressionItem.parent ?? this.rootGroup;
49600
+ requestAnimationFrame(() => {
49601
+ if (event.newSelection.value === 'addCondition') {
49602
+ this.addCondition(parent, expressionItem);
49603
+ }
49604
+ else if (event.newSelection.value === 'addGroup') {
49605
+ this.addReverseGroup(parent, expressionItem);
49606
+ }
49607
+ expressionItem.inAddMode = true;
49608
+ this._addModeExpression = expressionItem;
49609
+ });
49610
+ }
49611
+ /**
49612
+ * @hidden @internal
49613
+ */
49614
+ enterEditMode(expressionItem) {
48792
49615
  if (this._editedExpression) {
48793
49616
  this._editedExpression.inEditMode = false;
48794
49617
  }
49618
+ if (this.parentExpression) {
49619
+ this.inEditModeChange.emit(this.parentExpression);
49620
+ }
48795
49621
  expressionItem.hovered = false;
48796
- this.selectedField = expressionItem.expression.fieldName ?
48797
- this.fields.find(field => field.field === expressionItem.expression.fieldName) : null;
48798
- this.selectedCondition = expressionItem.expression.condition ?
48799
- expressionItem.expression.condition.name : null;
48800
- this.searchValue = expressionItem.expression.searchVal;
49622
+ this.fields = this.selectedEntity ? this.selectedEntity.fields : null;
49623
+ this.selectedField =
49624
+ expressionItem.expression.fieldName ?
49625
+ this.fields?.find(field => field.field === expressionItem.expression.fieldName)
49626
+ : null;
49627
+ this.selectedCondition =
49628
+ expressionItem.expression.condition ?
49629
+ expressionItem.expression.condition.name :
49630
+ null;
49631
+ this.searchValue.value = expressionItem.expression.searchVal;
48801
49632
  expressionItem.inEditMode = true;
48802
49633
  this._editedExpression = expressionItem;
48803
49634
  this.cdr.detectChanges();
48804
- this.fieldSelectOverlaySettings.target = this.fieldSelect.element;
48805
- this.fieldSelectOverlaySettings.excludeFromOutsideClick = [this.fieldSelect.element];
48806
- this.fieldSelectOverlaySettings.positionStrategy = new AutoPositionStrategy();
48807
- this.conditionSelectOverlaySettings.target = this.conditionSelect.element;
48808
- this.conditionSelectOverlaySettings.excludeFromOutsideClick = [this.conditionSelect.element];
48809
- this.conditionSelectOverlaySettings.positionStrategy = new AutoPositionStrategy();
49635
+ this.entitySelectOverlaySettings.target = this.entitySelect.element;
49636
+ this.entitySelectOverlaySettings.excludeFromOutsideClick = [this.entitySelect.element];
49637
+ this.entitySelectOverlaySettings.positionStrategy = new AutoPositionStrategy();
49638
+ if (this.returnFieldSelect) {
49639
+ this.returnFieldSelectOverlaySettings.target = this.returnFieldSelect.element;
49640
+ this.returnFieldSelectOverlaySettings.excludeFromOutsideClick = [this.returnFieldSelect.element];
49641
+ this.returnFieldSelectOverlaySettings.positionStrategy = new AutoPositionStrategy();
49642
+ }
49643
+ if (this.fieldSelect) {
49644
+ this.fieldSelectOverlaySettings.target = this.fieldSelect.element;
49645
+ this.fieldSelectOverlaySettings.excludeFromOutsideClick = [this.fieldSelect.element];
49646
+ this.fieldSelectOverlaySettings.positionStrategy = new AutoPositionStrategy();
49647
+ }
49648
+ if (this.conditionSelect) {
49649
+ this.conditionSelectOverlaySettings.target = this.conditionSelect.element;
49650
+ this.conditionSelectOverlaySettings.excludeFromOutsideClick = [this.conditionSelect.element];
49651
+ this.conditionSelectOverlaySettings.positionStrategy = new AutoPositionStrategy();
49652
+ }
48810
49653
  if (!this.selectedField) {
48811
49654
  this.fieldSelect.input.nativeElement.focus();
48812
49655
  }
48813
- else if (this.selectedField.filters.condition(this.selectedCondition).isUnary) {
49656
+ else if (this.selectedField.filters.condition(this.selectedCondition)?.isUnary) {
48814
49657
  this.conditionSelect.input.nativeElement.focus();
48815
49658
  }
48816
49659
  else {
48817
49660
  const input = this.searchValueInput?.nativeElement || this.picker?.getEditElement();
48818
- input.focus();
49661
+ input?.focus();
48819
49662
  }
48820
49663
  }
48821
49664
  /**
48822
49665
  * @hidden @internal
48823
49666
  */
48824
- clearSelection() {
48825
- for (const group of this._selectedGroups) {
48826
- group.selected = false;
48827
- }
48828
- this._selectedGroups = [];
48829
- for (const expr of this.selectedExpressions) {
48830
- expr.selected = false;
48831
- }
48832
- this.selectedExpressions = [];
48833
- this.toggleContextMenu();
48834
- }
48835
- /**
48836
- * @hidden @internal
48837
- */
48838
- enterExpressionAdd(expressionItem) {
48839
- this.clearSelection();
48840
- this.exitOperandEdit();
48841
- if (this._addModeExpression) {
48842
- this._addModeExpression.inAddMode = false;
48843
- }
48844
- expressionItem.inAddMode = true;
48845
- this._addModeExpression = expressionItem;
48846
- if (expressionItem.selected) {
48847
- this.toggleExpression(expressionItem);
48848
- }
48849
- }
48850
- /**
48851
- * @hidden @internal
48852
- */
48853
- contextMenuClosed() {
48854
- this.contextualGroup = null;
49667
+ onConditionSelectChanging(event) {
49668
+ event.cancel = true;
49669
+ this.selectedCondition = event.newSelection.value;
49670
+ this.conditionSelect.close();
49671
+ this.cdr.detectChanges();
48855
49672
  }
48856
49673
  /**
48857
49674
  * @hidden @internal
48858
49675
  */
48859
49676
  onKeyDown(eventArgs) {
48860
49677
  eventArgs.stopPropagation();
48861
- const key = eventArgs.key;
48862
- if (!this.contextMenuToggle.collapsed && (key === this.platform.KEYMAP.ESCAPE)) {
48863
- this.clearSelection();
48864
- }
48865
49678
  }
48866
49679
  /**
48867
49680
  * @hidden @internal
48868
49681
  */
48869
- createAndGroup() {
48870
- this.createGroup(FilteringLogic.And);
49682
+ onGroupClick(groupContextMenuDropDown, targetButton, groupItem) {
49683
+ this.exitEditAddMode();
49684
+ this.cdr.detectChanges();
49685
+ this.groupContextMenuDropDown = groupContextMenuDropDown;
49686
+ this.groupContextMenuDropDownOverlaySettings.target = targetButton;
49687
+ this.groupContextMenuDropDownOverlaySettings.positionStrategy = new ConnectedPositioningStrategy({
49688
+ horizontalDirection: HorizontalAlignment.Right,
49689
+ horizontalStartPoint: HorizontalAlignment.Left,
49690
+ verticalStartPoint: VerticalAlignment.Bottom
49691
+ });
49692
+ if (groupContextMenuDropDown.collapsed) {
49693
+ this.contextualGroup = groupItem;
49694
+ groupContextMenuDropDown.open(this.groupContextMenuDropDownOverlaySettings);
49695
+ }
49696
+ else {
49697
+ groupContextMenuDropDown.close();
49698
+ }
48871
49699
  }
48872
49700
  /**
48873
49701
  * @hidden @internal
48874
49702
  */
48875
- createOrGroup() {
48876
- this.createGroup(FilteringLogic.Or);
49703
+ getOperator(expressionItem) {
49704
+ // if (!expressionItem && !this.expressionTree && !this.initialOperator) {
49705
+ // this.initialOperator = 0;
49706
+ // }
49707
+ const operator = expressionItem ?
49708
+ expressionItem.operator :
49709
+ this.expressionTree ?
49710
+ this.expressionTree.operator :
49711
+ this.initialOperator;
49712
+ return operator;
48877
49713
  }
48878
49714
  /**
48879
49715
  * @hidden @internal
48880
49716
  */
48881
- deleteFilters() {
48882
- for (const expr of this.selectedExpressions) {
48883
- this.deleteItem(expr);
48884
- }
48885
- this.clearSelection();
49717
+ getSwitchGroupText(expressionItem) {
49718
+ const operator = this.getOperator(expressionItem);
49719
+ const condition = operator === FilteringLogic.Or ? this.resourceStrings.igx_query_builder_and_label : this.resourceStrings.igx_query_builder_or_label;
49720
+ return this.resourceStrings.igx_query_builder_switch_group.replace('{0}', condition.toUpperCase());
48886
49721
  }
48887
49722
  /**
48888
49723
  * @hidden @internal
48889
49724
  */
48890
- onGroupClick(groupItem) {
48891
- this.toggleGroup(groupItem);
49725
+ onGroupContextMenuDropDownSelectionChanging(event) {
49726
+ event.cancel = true;
49727
+ if (event.newSelection.value === 'switchCondition') {
49728
+ const newOperator = (!this.expressionTree ? this.initialOperator : (this.contextualGroup ?? this._expressionTree).operator) === 0 ? 1 : 0;
49729
+ this.selectFilteringLogic(newOperator);
49730
+ }
49731
+ else if (event.newSelection.value === 'ungroup') {
49732
+ this.ungroup();
49733
+ }
49734
+ this.groupContextMenuDropDown.close();
48892
49735
  }
48893
49736
  /**
48894
49737
  * @hidden @internal
@@ -48903,36 +49746,24 @@ class IgxQueryBuilderComponent {
48903
49746
  expr.parent = parent;
48904
49747
  }
48905
49748
  }
48906
- this.clearSelection();
48907
49749
  this.commitOperandEdit();
48908
49750
  }
48909
49751
  /**
48910
49752
  * @hidden @internal
48911
49753
  */
48912
- deleteGroup() {
48913
- let selectedGroup = this.contextualGroup;
48914
- let parent = selectedGroup.parent;
48915
- if (!parent) {
48916
- this.rootGroup = null;
49754
+ selectFilteringLogic(index) {
49755
+ if (!this.expressionTree) {
49756
+ this.initialOperator = index;
49757
+ return;
48917
49758
  }
48918
- while (parent) {
48919
- let index = parent.children.indexOf(selectedGroup);
48920
- parent.children.splice(index, 1);
48921
- selectedGroup = parent;
48922
- parent = parent.children.length === 0 ? parent.parent : null;
49759
+ if (this.contextualGroup) {
49760
+ this.contextualGroup.operator = index;
49761
+ this.commitOperandEdit();
48923
49762
  }
48924
- if (this.rootGroup?.children.length === 0) {
48925
- this.rootGroup = null;
49763
+ else if (this.expressionTree) {
49764
+ this._expressionTree.operator = index;
48926
49765
  }
48927
- this.clearSelection();
48928
- this.commitOperandEdit();
48929
- }
48930
- /**
48931
- * @hidden @internal
48932
- */
48933
- selectFilteringLogic(event) {
48934
- this.contextualGroup.operator = event.index;
48935
- this.commitOperandEdit();
49766
+ this.initialOperator = null;
48936
49767
  }
48937
49768
  /**
48938
49769
  * @hidden @internal
@@ -48946,20 +49777,11 @@ class IgxQueryBuilderComponent {
48946
49777
  isDate(value) {
48947
49778
  return value instanceof Date;
48948
49779
  }
48949
- /**
48950
- * @hidden @internal
48951
- */
48952
- onExpressionsScrolled() {
48953
- if (!this.contextMenuToggle.collapsed) {
48954
- this.calculateContextMenuTarget();
48955
- this.contextMenuToggle.reposition();
48956
- }
48957
- }
48958
49780
  /**
48959
49781
  * @hidden @internal
48960
49782
  */
48961
49783
  invokeClick(eventArgs) {
48962
- if (this.platform.isActivationKey(eventArgs)) {
49784
+ if (!this.dropGhostChipNode && this.platform.isActivationKey(eventArgs)) {
48963
49785
  eventArgs.preventDefault();
48964
49786
  eventArgs.currentTarget.click();
48965
49787
  }
@@ -48984,19 +49806,24 @@ class IgxQueryBuilderComponent {
48984
49806
  * @hidden @internal
48985
49807
  */
48986
49808
  getConditionList() {
48987
- return this.selectedField ? this.selectedField.filters.conditionList() : [];
49809
+ if (!this.selectedField)
49810
+ return [];
49811
+ if (this.entities?.length === 1 && !this.entities[0].name) {
49812
+ return this.selectedField.filters.conditionList();
49813
+ }
49814
+ return this.selectedField.filters.extendedConditionList();
48988
49815
  }
48989
49816
  /**
48990
49817
  * @hidden @internal
48991
49818
  */
48992
49819
  getFormatter(field) {
48993
- return this.fields.find(el => el.field === field).formatter;
49820
+ return this.fields?.find(el => el.field === field)?.formatter;
48994
49821
  }
48995
49822
  /**
48996
49823
  * @hidden @internal
48997
49824
  */
48998
49825
  getFormat(field) {
48999
- return this.fields.find(el => el.field === field).pipeArgs.format;
49826
+ return this.fields?.find(el => el.field === field).pipeArgs.format;
49000
49827
  }
49001
49828
  /**
49002
49829
  * @hidden @internal
@@ -49020,22 +49847,76 @@ class IgxQueryBuilderComponent {
49020
49847
  afterExpression
49021
49848
  };
49022
49849
  }
49023
- /**
49024
- * @hidden @internal
49025
- */
49026
- onChipSelectionEnd() {
49027
- const contextualGroup = this.findSingleSelectedGroup();
49028
- if (contextualGroup || this.selectedExpressions.length > 1) {
49029
- this.contextualGroup = contextualGroup;
49030
- this.calculateContextMenuTarget();
49031
- if (this.contextMenuToggle.collapsed) {
49032
- this.contextMenuToggle.open(this._overlaySettings);
49033
- }
49034
- else {
49035
- this.contextMenuToggle.reposition();
49036
- }
49850
+ formatReturnFields(innerTree) {
49851
+ const returnFields = innerTree.returnFields;
49852
+ let text = returnFields.join(', ');
49853
+ const innerTreeEntity = this.entities?.find(el => el.name === innerTree.entity);
49854
+ if (returnFields.length === innerTreeEntity?.fields.length) {
49855
+ text = this.resourceStrings.igx_query_builder_all_fields;
49856
+ }
49857
+ else {
49858
+ text = returnFields.join(', ');
49859
+ text = text.length > 25 ? text.substring(0, 25) + ' ...' : text;
49860
+ }
49861
+ return text;
49862
+ }
49863
+ isInEditMode() {
49864
+ return !this.parentExpression || (this.parentExpression && this.parentExpression.inEditMode);
49865
+ }
49866
+ onInEditModeChanged(expressionItem) {
49867
+ if (!expressionItem.inEditMode) {
49868
+ this.enterExpressionEdit(expressionItem);
49869
+ }
49870
+ }
49871
+ getExpressionTreeCopy(expressionTree, shouldAssignInnerQueryExprTree) {
49872
+ if (!expressionTree) {
49873
+ return null;
49874
+ }
49875
+ const exprTreeCopy = new FilteringExpressionsTree(expressionTree.operator, expressionTree.fieldName, expressionTree.entity, expressionTree.returnFields);
49876
+ exprTreeCopy.filteringOperands = [];
49877
+ expressionTree.filteringOperands.forEach(o => o instanceof FilteringExpressionsTree ? exprTreeCopy.filteringOperands.push(this.getExpressionTreeCopy(o)) : exprTreeCopy.filteringOperands.push(o));
49878
+ if (!this.innerQueryNewExpressionTree && shouldAssignInnerQueryExprTree) {
49879
+ this.innerQueryNewExpressionTree = exprTreeCopy;
49880
+ }
49881
+ return exprTreeCopy;
49882
+ }
49883
+ onSelectAllClicked(_event) {
49884
+ if ((this._selectedReturnFields.length > 0 && this._selectedReturnFields.length < this._selectedEntity.fields.length) ||
49885
+ this._selectedReturnFields.length == this._selectedEntity.fields.length) {
49886
+ this.returnFieldsCombo.deselectAllItems();
49887
+ }
49888
+ else {
49889
+ this.returnFieldsCombo.selectAllItems();
49890
+ }
49891
+ }
49892
+ onReturnFieldSelectChanging(event) {
49893
+ let newSelection = [];
49894
+ if (event.newSelection instanceof Array) {
49895
+ newSelection = event.newSelection.map(item => item.field);
49896
+ }
49897
+ else {
49898
+ newSelection.push(event.newSelection.value);
49899
+ this._selectedReturnFields = newSelection;
49900
+ }
49901
+ this.initExpressionTree(this.selectedEntity.name, newSelection);
49902
+ }
49903
+ initExpressionTree(selectedEntityName, selectedReturnFields) {
49904
+ if (!this._expressionTree) {
49905
+ this._expressionTree = this.createExpressionTreeFromGroupItem(new ExpressionGroupItem(FilteringLogic.And, this.rootGroup), selectedEntityName, selectedReturnFields);
49906
+ }
49907
+ if (!this.parentExpression) {
49908
+ this.expressionTreeChange.emit(this._expressionTree);
49037
49909
  }
49038
49910
  }
49911
+ getSearchValueTemplateContext(defaultSearchValueTemplate) {
49912
+ const ctx = {
49913
+ $implicit: this.searchValue,
49914
+ selectedField: this.selectedField,
49915
+ selectedCondition: this.selectedCondition,
49916
+ defaultSearchValueTemplate: defaultSearchValueTemplate
49917
+ };
49918
+ return ctx;
49919
+ }
49039
49920
  setFormat(field) {
49040
49921
  if (!field.pipeArgs) {
49041
49922
  field.pipeArgs = { digitsInfo: DEFAULT_PIPE_DIGITS_INFO };
@@ -49073,22 +49954,6 @@ class IgxQueryBuilderComponent {
49073
49954
  }
49074
49955
  }
49075
49956
  }
49076
- onToggleExpression(expressionItem) {
49077
- this.exitOperandEdit();
49078
- this.toggleExpression(expressionItem);
49079
- this.toggleContextMenu();
49080
- }
49081
- toggleExpression(expressionItem) {
49082
- expressionItem.selected = !expressionItem.selected;
49083
- if (expressionItem.selected) {
49084
- this.selectedExpressions.push(expressionItem);
49085
- }
49086
- else {
49087
- const index = this.selectedExpressions.indexOf(expressionItem);
49088
- this.selectedExpressions.splice(index, 1);
49089
- this.deselectParentRecursive(expressionItem);
49090
- }
49091
- }
49092
49957
  addGroup(operator, parent, afterExpression) {
49093
49958
  this.cancelOperandAdd();
49094
49959
  const groupItem = new ExpressionGroupItem(operator, parent);
@@ -49107,39 +49972,59 @@ class IgxQueryBuilderComponent {
49107
49972
  this.addCondition(groupItem);
49108
49973
  this.currentGroup = groupItem;
49109
49974
  }
49110
- createExpressionGroupItem(expressionTree, parent) {
49111
- if (!expressionTree) {
49112
- return null;
49113
- }
49114
- const groupItem = new ExpressionGroupItem(expressionTree.operator, parent);
49115
- for (const expr of expressionTree.filteringOperands) {
49116
- if (expr instanceof FilteringExpressionsTree) {
49117
- const childGroup = this.createExpressionGroupItem(expr, groupItem);
49118
- if (childGroup) {
49119
- groupItem.children.push(childGroup);
49120
- }
49975
+ createExpressionGroupItem(expressionTree, parent, entityName) {
49976
+ let groupItem;
49977
+ if (expressionTree) {
49978
+ groupItem = new ExpressionGroupItem(expressionTree.operator, parent);
49979
+ if (!expressionTree.filteringOperands) {
49980
+ return groupItem;
49121
49981
  }
49122
- else {
49123
- const filteringExpr = expr;
49124
- const field = this.fields.find(el => el.field === filteringExpr.fieldName);
49125
- if (field) {
49126
- const exprCopy = { ...filteringExpr };
49982
+ for (const expr of expressionTree.filteringOperands) {
49983
+ if (expr instanceof FilteringExpressionsTree) {
49984
+ groupItem.children.push(this.createExpressionGroupItem(expr, groupItem, expressionTree.entity));
49985
+ }
49986
+ else {
49987
+ const filteringExpr = expr;
49988
+ const exprCopy = {
49989
+ fieldName: filteringExpr.fieldName,
49990
+ condition: filteringExpr.condition,
49991
+ conditionName: filteringExpr.condition.name,
49992
+ searchVal: filteringExpr.searchVal,
49993
+ searchTree: filteringExpr.searchTree,
49994
+ ignoreCase: filteringExpr.ignoreCase
49995
+ };
49127
49996
  const operandItem = new ExpressionOperandItem(exprCopy, groupItem);
49128
- operandItem.fieldLabel = field.label || field.header || field.field;
49997
+ const field = this.fields?.find(el => el.field === filteringExpr.fieldName);
49998
+ operandItem.fieldLabel = field?.label || field?.header || field?.field;
49999
+ if (this._expandedExpressions.filter(e => e.searchTree == operandItem.expression.searchTree).length > 0) {
50000
+ operandItem.expanded = true;
50001
+ }
49129
50002
  groupItem.children.push(operandItem);
49130
50003
  }
49131
50004
  }
50005
+ if (expressionTree.entity) {
50006
+ entityName = expressionTree.entity;
50007
+ }
50008
+ const entity = this.entities?.find(el => el.name === entityName);
50009
+ if (entity) {
50010
+ this.fields = entity.fields;
50011
+ }
50012
+ this._selectedEntity = this.entities?.find(el => el.name === entityName);
50013
+ this._selectedReturnFields =
50014
+ !expressionTree.returnFields || expressionTree.returnFields.includes('*') || expressionTree.returnFields.includes('All') || expressionTree.returnFields.length === 0
50015
+ ? this.fields?.map(f => f.field)
50016
+ : this.fields?.filter(f => expressionTree.returnFields.indexOf(f.field) >= 0).map(f => f.field);
49132
50017
  }
49133
- return groupItem.children.length > 0 ? groupItem : null;
50018
+ return groupItem;
49134
50019
  }
49135
- createExpressionTreeFromGroupItem(groupItem) {
50020
+ createExpressionTreeFromGroupItem(groupItem, entity, returnFields) {
49136
50021
  if (!groupItem) {
49137
50022
  return null;
49138
50023
  }
49139
- const expressionTree = new FilteringExpressionsTree(groupItem.operator);
50024
+ const expressionTree = new FilteringExpressionsTree(groupItem.operator, undefined, entity, returnFields);
49140
50025
  for (const item of groupItem.children) {
49141
50026
  if (item instanceof ExpressionGroupItem) {
49142
- const subTree = this.createExpressionTreeFromGroupItem(item);
50027
+ const subTree = this.createExpressionTreeFromGroupItem(item, entity, returnFields);
49143
50028
  expressionTree.filteringOperands.push(subTree);
49144
50029
  }
49145
50030
  else {
@@ -49148,50 +50033,12 @@ class IgxQueryBuilderComponent {
49148
50033
  }
49149
50034
  return expressionTree;
49150
50035
  }
49151
- toggleContextMenu() {
49152
- const contextualGroup = this.findSingleSelectedGroup();
49153
- if (contextualGroup || this.selectedExpressions.length > 1) {
49154
- this.contextualGroup = contextualGroup;
49155
- if (contextualGroup) {
49156
- this.filteringLogics = [
49157
- {
49158
- label: this.resourceStrings.igx_query_builder_filter_operator_and,
49159
- selected: contextualGroup.operator === FilteringLogic.And
49160
- },
49161
- {
49162
- label: this.resourceStrings.igx_query_builder_filter_operator_or,
49163
- selected: contextualGroup.operator === FilteringLogic.Or
49164
- }
49165
- ];
49166
- }
49167
- }
49168
- else if (this.contextMenuToggle) {
49169
- this.contextMenuToggle.close();
49170
- }
49171
- }
49172
- findSingleSelectedGroup() {
49173
- for (const group of this._selectedGroups) {
49174
- const containsAllSelectedExpressions = this.selectedExpressions.every(op => this.isInsideGroup(op, group));
49175
- if (containsAllSelectedExpressions) {
49176
- return group;
49177
- }
49178
- }
49179
- return null;
49180
- }
49181
- isInsideGroup(item, group) {
49182
- if (!item) {
49183
- return false;
49184
- }
49185
- if (item.parent === group) {
49186
- return true;
49187
- }
49188
- return this.isInsideGroup(item.parent, group);
49189
- }
49190
50036
  deleteItem(expressionItem) {
50037
+ //console.log('deleteItem', expressionItem)
49191
50038
  if (!expressionItem.parent) {
49192
50039
  this.rootGroup = null;
49193
50040
  this.currentGroup = null;
49194
- this._expressionTree = null;
50041
+ //this._expressionTree = null;
49195
50042
  return;
49196
50043
  }
49197
50044
  if (expressionItem === this.currentGroup) {
@@ -49200,82 +50047,16 @@ class IgxQueryBuilderComponent {
49200
50047
  const children = expressionItem.parent.children;
49201
50048
  const index = children.indexOf(expressionItem);
49202
50049
  children.splice(index, 1);
49203
- this._expressionTree = this.createExpressionTreeFromGroupItem(this.rootGroup);
50050
+ const entity = this.expressionTree ? this.expressionTree.entity : null;
50051
+ const returnFields = this.expressionTree ? this.expressionTree.returnFields : null;
50052
+ this._expressionTree = this.createExpressionTreeFromGroupItem(this.rootGroup, entity, returnFields); // TODO: don't recreate if not necessary
49204
50053
  if (!children.length) {
49205
50054
  this.deleteItem(expressionItem.parent);
49206
50055
  }
49207
- this.expressionTreeChange.emit();
49208
- }
49209
- createGroup(operator) {
49210
- const chips = this.chips.toArray();
49211
- const minIndex = this.selectedExpressions.reduce((i, e) => Math.min(i, chips.findIndex(c => c.data === e)), Number.MAX_VALUE);
49212
- const firstExpression = chips[minIndex].data;
49213
- const parent = firstExpression.parent;
49214
- const groupItem = new ExpressionGroupItem(operator, parent);
49215
- const index = parent.children.indexOf(firstExpression);
49216
- parent.children.splice(index, 0, groupItem);
49217
- for (const expr of this.selectedExpressions) {
49218
- groupItem.children.push(expr);
49219
- this.deleteItem(expr);
49220
- expr.parent = groupItem;
49221
- }
49222
- this.clearSelection();
49223
- }
49224
- toggleGroup(groupItem) {
49225
- this.exitOperandEdit();
49226
- if (groupItem.children && groupItem.children.length) {
49227
- this.toggleGroupRecursive(groupItem, !groupItem.selected);
49228
- if (!groupItem.selected) {
49229
- this.deselectParentRecursive(groupItem);
49230
- }
49231
- this.toggleContextMenu();
49232
- }
49233
- }
49234
- toggleGroupRecursive(groupItem, selected) {
49235
- if (groupItem.selected !== selected) {
49236
- groupItem.selected = selected;
49237
- if (groupItem.selected) {
49238
- this._selectedGroups.push(groupItem);
49239
- }
49240
- else {
49241
- const index = this._selectedGroups.indexOf(groupItem);
49242
- this._selectedGroups.splice(index, 1);
49243
- }
49244
- }
49245
- for (const expr of groupItem.children) {
49246
- if (expr instanceof ExpressionGroupItem) {
49247
- this.toggleGroupRecursive(expr, selected);
49248
- }
49249
- else {
49250
- const operandExpression = expr;
49251
- if (operandExpression.selected !== selected) {
49252
- this.toggleExpression(operandExpression);
49253
- }
49254
- }
49255
- }
49256
- }
49257
- deselectParentRecursive(expressionItem) {
49258
- const parent = expressionItem.parent;
49259
- if (parent) {
49260
- if (parent.selected) {
49261
- parent.selected = false;
49262
- const index = this._selectedGroups.indexOf(parent);
49263
- this._selectedGroups.splice(index, 1);
49264
- }
49265
- this.deselectParentRecursive(parent);
50056
+ if (!this.parentExpression) {
50057
+ this.expressionTreeChange.emit(this._expressionTree);
49266
50058
  }
49267
50059
  }
49268
- calculateContextMenuTarget() {
49269
- const containerRect = this.expressionsContainer.nativeElement.getBoundingClientRect();
49270
- const chips = this.chips.filter(c => this.selectedExpressions.indexOf(c.data) !== -1);
49271
- let minTop = chips.reduce((t, c) => Math.min(t, c.nativeElement.getBoundingClientRect().top), Number.MAX_VALUE);
49272
- minTop = Math.max(containerRect.top, minTop);
49273
- minTop = Math.min(containerRect.bottom, minTop);
49274
- let maxRight = chips.reduce((r, c) => Math.max(r, c.nativeElement.getBoundingClientRect().right), 0);
49275
- maxRight = Math.max(maxRight, containerRect.left);
49276
- maxRight = Math.min(maxRight, containerRect.right);
49277
- this._overlaySettings.target = new Point(maxRight, minTop);
49278
- }
49279
50060
  scrollElementIntoView(target) {
49280
50061
  const container = this.expressionsContainer.nativeElement;
49281
50062
  const targetOffset = target.offsetTop - container.offsetTop;
@@ -49287,34 +50068,106 @@ class IgxQueryBuilderComponent {
49287
50068
  container.scrollTop = targetOffset + target.offsetHeight + delta - container.clientHeight;
49288
50069
  }
49289
50070
  }
50071
+ focusEditedExpressionChip() {
50072
+ if (this._timeoutId) {
50073
+ clearTimeout(this._timeoutId);
50074
+ }
50075
+ this._timeoutId = setTimeout(() => {
50076
+ if (this._lastFocusedChipIndex != -1) {
50077
+ const chipElement = this.expressionsChips.toArray()[this._lastFocusedChipIndex].nativeElement;
50078
+ chipElement.focus();
50079
+ this._lastFocusedChipIndex = -1;
50080
+ this._focusDelay = DEFAULT_CHIP_FOCUS_DELAY;
50081
+ }
50082
+ }, this._focusDelay);
50083
+ }
49290
50084
  init() {
49291
- this.clearSelection();
49292
50085
  this.cancelOperandAdd();
49293
50086
  this.cancelOperandEdit();
49294
- this.rootGroup = this.createExpressionGroupItem(this.expressionTree);
49295
- this.currentGroup = this.rootGroup;
49296
- }
49297
- registerSVGIcons() {
49298
- const editorIcons = editor;
49299
- editorIcons.forEach((icon) => {
49300
- this.iconService.addSvgIconFromText(icon.name, icon.value, 'imx-icons');
49301
- });
50087
+ // Ignore values of certain properties for the comparison
50088
+ const propsToIgnore = ['parent', 'hovered', 'ignoreCase', 'inEditMode', 'inAddMode'];
50089
+ const propsReplacer = function replacer(key, value) {
50090
+ if (propsToIgnore.indexOf(key) >= 0) {
50091
+ return undefined;
50092
+ }
50093
+ else {
50094
+ return value;
50095
+ }
50096
+ };
50097
+ // Skip root being recreated if the same
50098
+ const newRootGroup = this.createExpressionGroupItem(this.expressionTree);
50099
+ if (JSON.stringify(this.rootGroup, propsReplacer) !== JSON.stringify(newRootGroup, propsReplacer)) {
50100
+ this.rootGroup = this.createExpressionGroupItem(this.expressionTree);
50101
+ this.currentGroup = this.rootGroup;
50102
+ }
50103
+ if (this.rootGroup?.children?.length == 0) {
50104
+ this.rootGroup = null;
50105
+ this.currentGroup = null;
50106
+ }
49302
50107
  }
49303
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: IgxIconService }, { token: PlatformUtil }, { token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
49304
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxQueryBuilderComponent, isStandalone: true, selector: "igx-query-builder", inputs: { fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange" }, host: { properties: { "class.igx-query-builder": "this.cssClass", "style.display": "this.display" } }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }], ngImport: i0, template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [resourceStrings]=\"this.resourceStrings\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"default\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"edit-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n <igx-icon id=\"edit-expression\" [attr.aria-hidden]=\"true\">edit</igx-icon>\n </button>\n\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"add-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n <igx-icon id=\"add-expression\">add</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\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 <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [inputFormat]=\"selectedField.editorOptions?.dateTimeFormat\"\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 <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <input\n #input\n #searchValueInput\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [igxDateTimeEditor]=\"selectedField.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"selectedField.dataType\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "showLegend", "resourceStrings"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { 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: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "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", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "defaultFormatType", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { 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: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }] }); }
50108
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderTreeComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: PlatformUtil }, { token: i0.ElementRef }, { token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
50109
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: IgxQueryBuilderTreeComponent, isStandalone: true, selector: "igx-query-builder-tree", inputs: { entities: "entities", queryBuilder: "queryBuilder", searchValueTemplate: "searchValueTemplate", parentExpression: "parentExpression", fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange", inEditModeChange: "inEditModeChange" }, host: { properties: { "class": "this.getClass" }, classAttribute: "igx-query-builder-tree" }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "entitySelect", first: true, predicate: ["entitySelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "returnFieldsCombo", first: true, predicate: ["returnFieldsCombo"], descendants: true, read: IgxComboComponent }, { propertyName: "returnFieldSelect", first: true, predicate: ["returnFieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "entityChangeDialog", first: true, predicate: ["entityChangeDialog"], descendants: true, read: IgxDialogComponent }, { propertyName: "addExpressionItemDropDown", first: true, predicate: ["addOptionsDropDown"], descendants: true, read: IgxDropDownComponent }, { propertyName: "groupContextMenuDropDown", first: true, predicate: ["groupContextMenuDropDown"], descendants: true, read: IgxDropDownComponent }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "expressionsChips", predicate: IgxChipComponent, descendants: true, read: IgxChipComponent }, { propertyName: "innerQueries", predicate: IgxQueryBuilderTreeComponent, descendants: true }], ngImport: i0, template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<ng-template #selectFromTemplate>\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && !this.isAdvancedFiltering()) ? 'flex' : 'none'\">\n <div class=\"igx-filter-tree__inputs-field\">\n <span class=\"igx-query-builder__label\">From</span>\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n (opening)=\"exitEditAddMode(true)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_select_entity\"\n [disabled]=\"disableEntityChange\"\n >\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n </div>\n\n <div class=\"igx-filter-tree__inputs-field\">\n <span class=\"igx-query-builder__label\">Select</span>\n @if(!parentExpression) {\n <igx-combo\n #returnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_select_return_fields\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n (selectionChanging)=\"onReturnFieldSelectChanging($event)\"\n (opening)=\"exitEditAddMode()\"\n >\n <ng-template igxComboHeader>\n <div\n class=\"igx-drop-down__item igx-drop-down__item--query-builder\"\n (click)=\"onSelectAllClicked($event)\"\n [ngClass]=\"{'igx-drop-down__item--selected': this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length}\"\n >\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n class=\"igx-combo__checkbox\">\n </igx-checkbox>\n <div class=\"igx-drop-down__inner\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </div>\n </div>\n </ng-template>\n </igx-combo>\n }\n @else {\n <igx-select #returnFieldSelect\n type=\"box\"\n (selectionChanging)=\"onReturnFieldSelectChanging($event)\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n [disabled]=\"!selectedEntity\"\n [ngModel]=\"selectedReturnFields[0]\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_select_return_field_single\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n (opening)=\"exitEditAddMode()\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field.field\">\n {{ field.field }}\n </igx-select-item>\n </igx-select>\n }\n </div>\n </div>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n>\n <ng-container *ngTemplateOutlet=\"selectFromTemplate\"></ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"flat\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression, true)\"\n igxDrop\n (enter)=\"onAddConditionEnter(addConditionButton, expressionItem)\"\n (leave)=\"onChipLeave()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition_root\n }}</span>\n </button>\n\n @if(this.rootGroup) {\n <button type=\"button\"\n igxButton=\"flat\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addReverseGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_add_group_root }}</span>\n </button>\n }\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n #dragRef\n igxDrop\n (enter)=\"onChipEnter(dragRef, expressionItem, true)\"\n (over)=\"onDivOver(dragRef, expressionItem)\"\n (leave)=\"onChipLeave()\"\n (dropped)=\"onDivDropped(expressionItem)\"\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n (focusin)=\"onExpressionFocus(expressionItem)\"\n (focusout)=\"onExpressionBlur($event, expressionItem)\"\n >\n <igx-chip\n #expressionChip\n [draggable]=\"canBeDragged()\"\n [hideBaseOnDrag] = \"false\"\n [animateOnRelease] = \"false\"\n (moveStart)=\"canBeDragged() ? onMoveStart(dragRef, expressionItem, false): null\"\n (moveEnd)=\"onMoveEnd()\"\n (dragEnter)=\"onChipEnter(dragRef, expressionItem, false)\"\n (dragOver)=\"onChipOver(dragRef, false)\"\n (dragLeave)=\"onChipLeave()\"\n (dragDrop)=\"onChipDropped()\"\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem, expressionChip)\"\n (remove)=\"onChipRemove(expressionItem)\"\n\n >\n <igx-icon igxPrefix\n class=\"igx-drag-indicator\"\n tabindex=\"0\"\n (focus)=\"onChipDragIndicatorFocus(dragRef, expressionItem)\"\n (focusout)=\"onChipDragIndicatorFocusOut()\"\n >\n drag_indicator\n </igx-icon>\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.fieldName}}\n </span>\n <span igxPrefix class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition?.name\n )\n }}\n </span>\n <span *ngIf=\"!expressionItem.expression.condition?.isUnary\">\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong>&nbsp;/ {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n @if(isDate(expressionItem.expression.searchVal)) {\n @if(getFormatter(expressionItem.expression.fieldName)) {\n {{\n expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined\n }}\n } @else {\n {{\n expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale\n }}\n }\n } @else {\n @if(getFormatter(expressionItem.expression.fieldName)) {\n {{\n expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(expressionItem.expression.fieldName)\n : (expressionItem.expression.conditionName || expressionItem.expression.condition?.name)\n }}\n } @else {\n {{ expressionItem.expression.searchVal }}\n }\n }\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n @if(expressionItem.expression.searchTree){\n {{expressionItem.expression.searchTree.returnFields.join(', ')}}\n } @else if (expressionItem.expression.condition?.isUnary) {\n {{getConditionFriendlyName(expressionItem.expression.condition?.name)}}\n } @else {\n @if(getFormatter(expressionItem.expression.fieldName)) {\n {{\n expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(expressionItem.expression.fieldName)\n : (expressionItem.expression.conditionName || expressionItem.expression.condition?.name)\n }}\n } @else {\n {{ expressionItem.expression.searchVal }}\n }\n }\n </div>\n\n @if((expressionItem.focused || expressionItem.hovered) && !expressionItem.inAddMode) {\n <div igxDragIgnore class=\"igx-filter-tree__expression-actions\">\n <button #addExpressionButton igxDragIgnore igxIconButton=\"outlined\" [igxDropDownItemNavigation]=\"addOptionsDropDown\"\n aria-labelledby=\"add-expression\" (keydown)=\"invokeClick($event)\"\n (click)=\"clickExpressionAdd(addExpressionButton, expressionChip)\"\n (blur)=\"addExpressionBlur()\">\n <igx-icon id=\"add-expression\">add</igx-icon>\n </button>\n <igx-drop-down #addOptionsDropDown\n (selectionChanging)=\"enterExpressionAdd($event, expressionItem)\">\n <igx-drop-down-item [value]=\"'addCondition'\">\n <span>{{this.resourceStrings.igx_query_builder_add_condition}}</span>\n </igx-drop-down-item>\n <igx-drop-down-item [value]=\"'addGroup'\">\n <span>{{this.resourceStrings.igx_query_builder_add_group}}</span>\n </igx-drop-down-item>\n </igx-drop-down>\n </div>\n }\n </div>\n\n <div #editingInputsContainer class=\"igx-filter-tree__subquery\" >\n <div\n igxDrop\n (enter)=\"onChipEnter(editingInputsContainer, expressionItem, true)\"\n (over)=\"onDivOver(editingInputsContainer, expressionItem)\"\n (leave)=\"onChipLeave()\"\n (dropped)=\"onDivDropped(expressionItem)\"\n *ngIf=\"expressionItem.inEditMode\"\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_column_placeholder\"\n >\n\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n (selectionChanging)=\"onConditionSelectChanging($event)\"\n [disabled]=\"!selectedField\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_condition_placeholder\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container\n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext(defaultSearchValueTemplate)\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n\n <input\n #searchValueInput\n igxInput\n [disabled]=\"isSearchValueInputDisabled()\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_value_placeholder\"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue.value\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue.value\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"isSearchValueInputDisabled()\"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_date_placeholder\"\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 <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue.value\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"isSearchValueInputDisabled()\"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [inputFormat]=\"selectedField.editorOptions?.dateTimeFormat\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_time_placeholder\"\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 <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_datetime_placeholder\"\n [(ngModel)]=\"searchValue.value\"\n [disabled]=\"isSearchValueInputDisabled()\"\n [locale]=\"this.locale\"\n [igxDateTimeEditor]=\"selectedField.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"selectedField.dataType\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"outlined\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitExpression()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"outlined\"\n (click)=\"discardExpression(expressionItem)\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"\n (!expressionItem.inEditMode && expressionItem.expression.searchTree && expressionItem.expression.searchTree.filteringOperands?.length > 0) ||\n (expressionItem.inEditMode && selectedField?.filters?.condition(selectedCondition)?.isNestedQuery)\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [queryBuilder]=\"this.queryBuilder\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.inEditMode ? (innerQueryNewExpressionTree ?? getExpressionTreeCopy(expressionItem.expression.searchTree, true)) : expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n </igx-query-builder-tree>\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\"\n (focusout)=\"parentExpression? null : onDragFocusOut()\">\n <div\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': getOperator(expressionItem) === 0,\n 'igx-filter-tree__line--or': getOperator(expressionItem) === 1\n }\"\n ></div>\n\n <div class=\"igx-filter-tree__expressions\">\n <div class=\"igx-filter-tree__expression-context-menu\"\n #groupRef\n igxDrop\n (enter)=\"onGroupRootOver(groupRef, expressionItem)\"\n (over)=\"onGroupRootOver(groupRef, expressionItem)\"\n (leave)=\"onChipLeave()\"\n >\n <button #changeGroupButton\n [ngClass]=\"{\n 'igx-filter-tree__button--and': getOperator(expressionItem) === 0,\n 'igx-filter-tree__button--or': getOperator(expressionItem) === 1\n }\"\n [igxDropDownItemNavigation]=\"groupContextMenuDropDown\"\n igxDragIgnore\n igxButton=\"flat\"\n aria-labelledby=\"change-group\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(groupContextMenuDropDown, changeGroupButton, expressionItem)\"\n >\n <span\n igxDrop\n (enter)=\"onGroupRootOver(groupRef, expressionItem)\"\n (over)=\"onGroupRootOver(groupRef, expressionItem)\"\n (leave)=\"onChipLeave()\"\n >\n {{getOperator(expressionItem) === 0 ? this.resourceStrings.igx_query_builder_and_label : this.resourceStrings.igx_query_builder_or_label}}\n </span>\n <igx-icon family=\"default\" name=\"arrow_drop_down\" role=\"button\"></igx-icon>\n </button>\n <igx-drop-down #groupContextMenuDropDown\n (selectionChanging)=\"onGroupContextMenuDropDownSelectionChanging($event)\"\n [width]=\"'fit-content'\">\n <igx-drop-down-item [value]=\"'switchCondition'\"\n >\n {{getSwitchGroupText(expressionItem)}}\n </igx-drop-down-item>\n <igx-drop-down-item [value]=\"'ungroup'\"\n [disabled]=\"this.rootGroup === this.contextualGroup\"\n >\n {{this.resourceStrings.igx_query_builder_ungroup}}\n </igx-drop-down-item>\n </igx-drop-down>\n </div>\n <div class=\"igx-filter-tree__expression-section\">\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n </div>\n <div\n *ngIf=\"expressionItem === rootGroup && !hasEditedExpression\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n\n <div class=\"igx-filter-tree__section\" *ngIf=\"rootGroup || (!rootGroup && (selectedEntity || (entities?.length === 1 && !entities[0]?.name)))\">\n @if(!this.isAdvancedFiltering()) {\n <span class=\"igx-query-builder__label\">Where</span>\n }\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"{{ this.resourceStrings.igx_query_builder_dialog_title }}\"\n leftButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_cancel }}\"\n rightButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_confirm }}\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n <section class=\"igx-query-builder-dialog\">\n <p>{{ this.resourceStrings.igx_query_builder_dialog_message }}</p>\n <igx-checkbox\n (change)=\"onShowEntityChangeDialogChange($event)\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\">\n {{ this.resourceStrings.igx_query_builder_dialog_checkbox_text }}\n </igx-checkbox>\n </section>\n</igx-dialog>\n", dependencies: [{ kind: "component", type: IgxQueryBuilderTreeComponent, selector: "igx-query-builder-tree", inputs: ["entities", "queryBuilder", "searchValueTemplate", "parentExpression", "fields", "expressionTree", "locale", "resourceStrings"], outputs: ["expressionTreeChange", "inEditModeChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { 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: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "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", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "defaultFormatType", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }, { kind: "directive", type: IgxIconButtonDirective, selector: "[igxIconButton]", inputs: ["igxIconButton"] }, { kind: "component", type: IgxComboComponent, selector: "igx-combo", inputs: ["autoFocusSearch", "disableFiltering", "searchPlaceholder"], outputs: ["selectionChanging"] }, { kind: "directive", type: IgxComboHeaderDirective, selector: "[igxComboHeader]" }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "component", type: IgxDialogComponent, selector: "igx-dialog", inputs: ["id", "isModal", "closeOnEscape", "focusTrap", "title", "message", "leftButtonLabel", "leftButtonType", "leftButtonRipple", "rightButtonLabel", "rightButtonType", "rightButtonRipple", "closeOnOutsideSelect", "positionSettings", "isOpen", "role", "titleId"], outputs: ["opening", "opened", "closing", "closed", "leftButtonSelect", "rightButtonSelect", "isOpenChange"] }, { kind: "directive", type: IgxTooltipTargetDirective, selector: "[igxTooltipTarget]", inputs: ["showDelay", "hideDelay", "tooltipDisabled", "igxTooltipTarget", "tooltip"], outputs: ["tooltipShow", "tooltipHide"], exportAs: ["tooltipTarget"] }, { kind: "directive", type: IgxTooltipDirective, selector: "[igxTooltip]", inputs: ["context", "id"], exportAs: ["tooltip"] }, { kind: "directive", type: IgxDragIgnoreDirective, selector: "[igxDragIgnore]" }, { kind: "directive", type: IgxDropDirective, selector: "[igxDrop]", inputs: ["igxDrop", "dropChannel", "dropStrategy"], outputs: ["enter", "over", "leave", "dropped"], exportAs: ["drop"] }, { kind: "component", type: IgxDropDownComponent, selector: "igx-drop-down", inputs: ["allowItemsFocus", "labelledBy"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "component", type: IgxDropDownItemComponent, selector: "igx-drop-down-item" }, { kind: "directive", type: IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }] }); }
49305
50110
  }
49306
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderComponent, decorators: [{
50111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderTreeComponent, decorators: [{
49307
50112
  type: Component,
49308
- args: [{ selector: 'igx-query-builder', imports: [NgIf, IgxQueryBuilderHeaderComponent, IgxButtonDirective, IgxIconComponent, IgxChipComponent, IgxPrefixDirective, IgxSuffixDirective, IgxSelectComponent, FormsModule, NgFor, IgxSelectItemComponent, IgxInputGroupComponent, IgxInputDirective, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxDateTimeEditorDirective, NgTemplateOutlet, NgClass, IgxToggleDirective, IgxButtonGroupComponent, IgxOverlayOutletDirective, DatePipe, IgxFieldFormatterPipe, IgxIconButtonDirective], template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [resourceStrings]=\"this.resourceStrings\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n (click)=\"addAndGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"addOrGroup()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"default\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"edit-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n <igx-icon id=\"edit-expression\" [attr.aria-hidden]=\"true\">edit</igx-icon>\n </button>\n\n <button\n igxIconButton=\"flat\"\n aria-labelledby=\"add-expression\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n <igx-icon id=\"add-expression\">add</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\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 <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [inputFormat]=\"selectedField.editorOptions?.dateTimeFormat\"\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 <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n >\n <input\n #input\n #searchValueInput\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [igxDateTimeEditor]=\"selectedField.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"selectedField.dataType\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"flat\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandEdit()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxIconButton=\"flat\"\n (click)=\"cancelOperandAdd()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n >\n <button type=\"button\"\n igxIconButton=\"flat\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"default\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon family=\"default\" name=\"delete\"></igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n" }]
49309
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: IgxIconService }, { type: PlatformUtil }, { type: i0.ElementRef }, { type: undefined, decorators: [{
50113
+ args: [{ selector: 'igx-query-builder-tree', host: { 'class': 'igx-query-builder-tree' }, standalone: true, imports: [
50114
+ NgIf,
50115
+ IgxQueryBuilderHeaderComponent,
50116
+ IgxButtonDirective,
50117
+ IgxIconComponent,
50118
+ IgxChipComponent,
50119
+ IgxPrefixDirective,
50120
+ IgxSuffixDirective,
50121
+ IgxSelectComponent,
50122
+ FormsModule,
50123
+ NgFor,
50124
+ IgxSelectItemComponent,
50125
+ IgxInputGroupComponent,
50126
+ IgxInputDirective,
50127
+ IgxDatePickerComponent,
50128
+ IgxPickerToggleComponent,
50129
+ IgxPickerClearComponent,
50130
+ IgxTimePickerComponent,
50131
+ IgxDateTimeEditorDirective,
50132
+ NgTemplateOutlet,
50133
+ NgClass,
50134
+ IgxToggleDirective,
50135
+ IgxButtonGroupComponent,
50136
+ IgxOverlayOutletDirective,
50137
+ DatePipe,
50138
+ IgxFieldFormatterPipe,
50139
+ IgxIconButtonDirective,
50140
+ IgxToggleActionDirective,
50141
+ IgxComboComponent,
50142
+ IgxLabelDirective,
50143
+ IgxComboHeaderDirective,
50144
+ IgxCheckboxComponent,
50145
+ IgxDialogComponent,
50146
+ IgxTooltipTargetDirective,
50147
+ IgxTooltipDirective,
50148
+ IgxChipsAreaComponent,
50149
+ IgxDragDirective,
50150
+ IgxDragIgnoreDirective,
50151
+ IgxDragHandleDirective,
50152
+ IgxDropDirective,
50153
+ IgxDropDownComponent,
50154
+ IgxDropDownItemComponent,
50155
+ IgxDropDownItemNavigationDirective
50156
+ ], template: "<ng-template #addIcon>\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n</ng-template>\n\n<ng-template #closeIcon>\n <igx-icon family=\"default\" name=\"close\"></igx-icon>\n</ng-template>\n\n<ng-template #selectFromTemplate>\n <div class=\"igx-filter-tree__inputs\" [style.display]=\"(isInEditMode() && !this.isAdvancedFiltering()) ? 'flex' : 'none'\">\n <div class=\"igx-filter-tree__inputs-field\">\n <span class=\"igx-query-builder__label\">From</span>\n <igx-select #entitySelect\n type=\"box\"\n (selectionChanging)=\"onEntitySelectChanging($event)\"\n (opening)=\"exitEditAddMode(true)\"\n [overlaySettings]=\"entitySelectOverlaySettings\"\n [ngModel]=\"selectedEntity\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_select_entity\"\n [disabled]=\"disableEntityChange\"\n >\n <igx-select-item *ngFor=\"let entity of entities\" [value]=\"entity\">\n {{entity.name}}\n </igx-select-item>\n </igx-select>\n </div>\n\n <div class=\"igx-filter-tree__inputs-field\">\n <span class=\"igx-query-builder__label\">Select</span>\n @if(!parentExpression) {\n <igx-combo\n #returnFieldsCombo\n [itemsMaxHeight]=\"250\"\n [data]=\"fields\"\n [displayKey]=\"'field'\"\n [valueKey]=\"'field'\"\n [disabled]=\"!selectedEntity\"\n [(ngModel)]=\"selectedReturnFields\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_select_return_fields\"\n searchPlaceholder=\"{{ this.resourceStrings.igx_query_builder_search }}\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n (selectionChanging)=\"onReturnFieldSelectChanging($event)\"\n (opening)=\"exitEditAddMode()\"\n >\n <ng-template igxComboHeader>\n <div\n class=\"igx-drop-down__item igx-drop-down__item--query-builder\"\n (click)=\"onSelectAllClicked($event)\"\n [ngClass]=\"{'igx-drop-down__item--selected': this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length}\"\n >\n <igx-checkbox\n [checked]=\"this.selectedEntity && this.selectedReturnFields && this.selectedEntity.fields.length === this.selectedReturnFields.length\"\n [indeterminate]=\"this.selectedEntity && this.selectedReturnFields && this.selectedReturnFields.length > 0 && this.selectedReturnFields.length < this.selectedEntity.fields?.length\"\n [readonly]=\"true\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\"\n class=\"igx-combo__checkbox\">\n </igx-checkbox>\n <div class=\"igx-drop-down__inner\">\n {{ this.resourceStrings.igx_query_builder_select_all }}\n </div>\n </div>\n </ng-template>\n </igx-combo>\n }\n @else {\n <igx-select #returnFieldSelect\n type=\"box\"\n (selectionChanging)=\"onReturnFieldSelectChanging($event)\"\n [overlaySettings]=\"returnFieldSelectOverlaySettings\"\n [disabled]=\"!selectedEntity\"\n [ngModel]=\"selectedReturnFields[0]\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_select_return_field_single\"\n [style.display]=\"isInEditMode() ? 'block' : 'none'\"\n (opening)=\"exitEditAddMode()\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field.field\">\n {{ field.field }}\n </igx-select-item>\n </igx-select>\n }\n </div>\n </div>\n</ng-template>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n>\n <ng-container *ngTemplateOutlet=\"selectFromTemplate\"></ng-container>\n\n <ng-template #addExpressionsTemplate let-expressionItem let-afterExpression=\"afterExpression\">\n <button type=\"button\"\n #addConditionButton\n igxButton=\"flat\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression, true)\"\n igxDrop\n (enter)=\"onAddConditionEnter(addConditionButton, expressionItem)\"\n (leave)=\"onChipLeave()\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition_root\n }}</span>\n </button>\n\n @if(this.rootGroup) {\n <button type=\"button\"\n igxButton=\"flat\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addReverseGroup(expressionItem, afterExpression)\"\n >\n <ng-container *ngTemplateOutlet=\"addIcon\"></ng-container>\n <span>{{ this.resourceStrings.igx_query_builder_add_group_root }}</span>\n </button>\n }\n </ng-template>\n\n <ng-template #operandTemplate let-expressionItem>\n <div\n #dragRef\n igxDrop\n (enter)=\"onChipEnter(dragRef, expressionItem, true)\"\n (over)=\"onDivOver(dragRef, expressionItem)\"\n (leave)=\"onChipLeave()\"\n (dropped)=\"onDivDropped(expressionItem)\"\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n (focusin)=\"onExpressionFocus(expressionItem)\"\n (focusout)=\"onExpressionBlur($event, expressionItem)\"\n >\n <igx-chip\n #expressionChip\n [draggable]=\"canBeDragged()\"\n [hideBaseOnDrag] = \"false\"\n [animateOnRelease] = \"false\"\n (moveStart)=\"canBeDragged() ? onMoveStart(dragRef, expressionItem, false): null\"\n (moveEnd)=\"onMoveEnd()\"\n (dragEnter)=\"onChipEnter(dragRef, expressionItem, false)\"\n (dragOver)=\"onChipOver(dragRef, false)\"\n (dragLeave)=\"onChipLeave()\"\n (dragDrop)=\"onChipDropped()\"\n #target=\"tooltipTarget\"\n [igxTooltipTarget]=\"tooltipRef\"\n [data]=\"expressionItem\"\n [removable]=\"isInEditMode() ? 'true' : 'false'\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem, expressionChip)\"\n (remove)=\"onChipRemove(expressionItem)\"\n\n >\n <igx-icon igxPrefix\n class=\"igx-drag-indicator\"\n tabindex=\"0\"\n (focus)=\"onChipDragIndicatorFocus(dragRef, expressionItem)\"\n (focusout)=\"onChipDragIndicatorFocusOut()\"\n >\n drag_indicator\n </igx-icon>\n <span igxPrefix class=\"igx-filter-tree__expression-column\">\n {{expressionItem.fieldLabel || expressionItem.expression.fieldName}}\n </span>\n <span igxPrefix class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition?.name\n )\n }}\n </span>\n <span *ngIf=\"!expressionItem.expression.condition?.isUnary\">\n <ng-container *ngIf=\"expressionItem.expression.searchTree\">\n <strong>{{expressionItem.expression.searchTree.entity}}</strong>&nbsp;/ {{formatReturnFields(expressionItem.expression.searchTree)}}\n </ng-container>\n\n <ng-container *ngIf=\"!expressionItem.expression.searchTree\">\n @if(isDate(expressionItem.expression.searchVal)) {\n @if(getFormatter(expressionItem.expression.fieldName)) {\n {{\n expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined\n }}\n } @else {\n {{\n expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale\n }}\n }\n } @else {\n @if(getFormatter(expressionItem.expression.fieldName)) {\n {{\n expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(expressionItem.expression.fieldName)\n : (expressionItem.expression.conditionName || expressionItem.expression.condition?.name)\n }}\n } @else {\n {{ expressionItem.expression.searchVal }}\n }\n }\n </ng-container>\n </span>\n </igx-chip>\n <div #tooltipRef=\"tooltip\" igxTooltip>\n @if(expressionItem.expression.searchTree){\n {{expressionItem.expression.searchTree.returnFields.join(', ')}}\n } @else if (expressionItem.expression.condition?.isUnary) {\n {{getConditionFriendlyName(expressionItem.expression.condition?.name)}}\n } @else {\n @if(getFormatter(expressionItem.expression.fieldName)) {\n {{\n expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(expressionItem.expression.fieldName)\n : (expressionItem.expression.conditionName || expressionItem.expression.condition?.name)\n }}\n } @else {\n {{ expressionItem.expression.searchVal }}\n }\n }\n </div>\n\n @if((expressionItem.focused || expressionItem.hovered) && !expressionItem.inAddMode) {\n <div igxDragIgnore class=\"igx-filter-tree__expression-actions\">\n <button #addExpressionButton igxDragIgnore igxIconButton=\"outlined\" [igxDropDownItemNavigation]=\"addOptionsDropDown\"\n aria-labelledby=\"add-expression\" (keydown)=\"invokeClick($event)\"\n (click)=\"clickExpressionAdd(addExpressionButton, expressionChip)\"\n (blur)=\"addExpressionBlur()\">\n <igx-icon id=\"add-expression\">add</igx-icon>\n </button>\n <igx-drop-down #addOptionsDropDown\n (selectionChanging)=\"enterExpressionAdd($event, expressionItem)\">\n <igx-drop-down-item [value]=\"'addCondition'\">\n <span>{{this.resourceStrings.igx_query_builder_add_condition}}</span>\n </igx-drop-down-item>\n <igx-drop-down-item [value]=\"'addGroup'\">\n <span>{{this.resourceStrings.igx_query_builder_add_group}}</span>\n </igx-drop-down-item>\n </igx-drop-down>\n </div>\n }\n </div>\n\n <div #editingInputsContainer class=\"igx-filter-tree__subquery\" >\n <div\n igxDrop\n (enter)=\"onChipEnter(editingInputsContainer, expressionItem, true)\"\n (over)=\"onDivOver(editingInputsContainer, expressionItem)\"\n (leave)=\"onChipLeave()\"\n (dropped)=\"onDivDropped(expressionItem)\"\n *ngIf=\"expressionItem.inEditMode\"\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [(ngModel)]=\"selectedField\"\n [disabled]=\"!fields\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_column_placeholder\"\n >\n\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [(ngModel)]=\"selectedCondition\"\n (selectionChanging)=\"onConditionSelectChanging($event)\"\n [disabled]=\"!selectedField\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_condition_placeholder\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"default\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <ng-container\n *ngTemplateOutlet=\"\n searchValueTemplate ? searchValueTemplate : defaultSearchValueTemplate;\n context: getSearchValueTemplateContext(defaultSearchValueTemplate)\n \"\n >\n </ng-container>\n\n <ng-template #defaultSearchValueTemplate>\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n >\n\n <input\n #searchValueInput\n igxInput\n [disabled]=\"isSearchValueInputDisabled()\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_value_placeholder\"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [(ngModel)]=\"searchValue.value\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue.value\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"isSearchValueInputDisabled()\"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_date_placeholder\"\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 <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue.value\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"isSearchValueInputDisabled()\"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [inputFormat]=\"selectedField.editorOptions?.dateTimeFormat\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_time_placeholder\"\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 <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"this.resourceStrings.igx_query_builder_datetime_placeholder\"\n [(ngModel)]=\"searchValue.value\"\n [disabled]=\"isSearchValueInputDisabled()\"\n [locale]=\"this.locale\"\n [igxDateTimeEditor]=\"selectedField.editorOptions?.dateTimeFormat\"\n [defaultFormatType]=\"selectedField.dataType\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n />\n </igx-input-group>\n </ng-template>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxIconButton=\"outlined\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitExpression()\"\n >\n <igx-icon family=\"default\" name=\"confirm\"></igx-icon>\n </button>\n <button type=\"button\"\n igxIconButton=\"outlined\"\n (click)=\"discardExpression(expressionItem)\"\n >\n <ng-container *ngTemplateOutlet=\"closeIcon\"></ng-container>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"\n (!expressionItem.inEditMode && expressionItem.expression.searchTree && expressionItem.expression.searchTree.filteringOperands?.length > 0) ||\n (expressionItem.inEditMode && selectedField?.filters?.condition(selectedCondition)?.isNestedQuery)\">\n <igx-query-builder-tree\n [style.display]=\"expressionItem.inEditMode || expressionItem.expanded ? 'block' : 'none'\"\n [entities]=\"entities\"\n [queryBuilder]=\"this.queryBuilder\"\n [parentExpression]=\"expressionItem\"\n [expressionTree]=\"expressionItem.inEditMode ? (innerQueryNewExpressionTree ?? getExpressionTreeCopy(expressionItem.expression.searchTree, true)) : expressionItem.expression.searchTree\"\n (inEditModeChange)=\"onInEditModeChanged($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n </igx-query-builder-tree>\n </ng-container>\n </div>\n </ng-template>\n\n <ng-template #expressionGroupTemplate let-expressionItem>\n <div class=\"igx-filter-tree\"\n (focusout)=\"parentExpression? null : onDragFocusOut()\">\n <div\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': getOperator(expressionItem) === 0,\n 'igx-filter-tree__line--or': getOperator(expressionItem) === 1\n }\"\n ></div>\n\n <div class=\"igx-filter-tree__expressions\">\n <div class=\"igx-filter-tree__expression-context-menu\"\n #groupRef\n igxDrop\n (enter)=\"onGroupRootOver(groupRef, expressionItem)\"\n (over)=\"onGroupRootOver(groupRef, expressionItem)\"\n (leave)=\"onChipLeave()\"\n >\n <button #changeGroupButton\n [ngClass]=\"{\n 'igx-filter-tree__button--and': getOperator(expressionItem) === 0,\n 'igx-filter-tree__button--or': getOperator(expressionItem) === 1\n }\"\n [igxDropDownItemNavigation]=\"groupContextMenuDropDown\"\n igxDragIgnore\n igxButton=\"flat\"\n aria-labelledby=\"change-group\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(groupContextMenuDropDown, changeGroupButton, expressionItem)\"\n >\n <span\n igxDrop\n (enter)=\"onGroupRootOver(groupRef, expressionItem)\"\n (over)=\"onGroupRootOver(groupRef, expressionItem)\"\n (leave)=\"onChipLeave()\"\n >\n {{getOperator(expressionItem) === 0 ? this.resourceStrings.igx_query_builder_and_label : this.resourceStrings.igx_query_builder_or_label}}\n </span>\n <igx-icon family=\"default\" name=\"arrow_drop_down\" role=\"button\"></igx-icon>\n </button>\n <igx-drop-down #groupContextMenuDropDown\n (selectionChanging)=\"onGroupContextMenuDropDownSelectionChanging($event)\"\n [width]=\"'fit-content'\">\n <igx-drop-down-item [value]=\"'switchCondition'\"\n >\n {{getSwitchGroupText(expressionItem)}}\n </igx-drop-down-item>\n <igx-drop-down-item [value]=\"'ungroup'\"\n [disabled]=\"this.rootGroup === this.contextualGroup\"\n >\n {{this.resourceStrings.igx_query_builder_ungroup}}\n </igx-drop-down-item>\n </igx-drop-down>\n </div>\n <div class=\"igx-filter-tree__expression-section\">\n <ng-container *ngFor=\"let expr of expressionItem?.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionGroupTemplate\n : operandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n </div>\n <div\n *ngIf=\"expressionItem === rootGroup && !hasEditedExpression\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n\n <div class=\"igx-filter-tree__section\" *ngIf=\"rootGroup || (!rootGroup && (selectedEntity || (entities?.length === 1 && !entities[0]?.name)))\">\n @if(!this.isAdvancedFiltering()) {\n <span class=\"igx-query-builder__label\">Where</span>\n }\n <ng-container\n *ngTemplateOutlet=\"\n expressionGroupTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </div>\n</div>\n\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n\n<igx-dialog\n #entityChangeDialog\n title=\"{{ this.resourceStrings.igx_query_builder_dialog_title }}\"\n leftButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_cancel }}\"\n rightButtonLabel=\"{{ this.resourceStrings.igx_query_builder_dialog_confirm }}\"\n (leftButtonSelect)=\"onEntityChangeCancel()\"\n (rightButtonSelect)=\"onEntityChangeConfirm()\">\n <section class=\"igx-query-builder-dialog\">\n <p>{{ this.resourceStrings.igx_query_builder_dialog_message }}</p>\n <igx-checkbox\n (change)=\"onShowEntityChangeDialogChange($event)\"\n [disableRipple]=\"true\"\n [tabindex]=\"-1\">\n {{ this.resourceStrings.igx_query_builder_dialog_checkbox_text }}\n </igx-checkbox>\n </section>\n</igx-dialog>\n" }]
50157
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: PlatformUtil }, { type: i0.ElementRef }, { type: i0.ElementRef }, { type: undefined, decorators: [{
49310
50158
  type: Inject,
49311
50159
  args: [LOCALE_ID]
49312
- }] }], propDecorators: { cssClass: [{
50160
+ }] }], propDecorators: { getClass: [{
49313
50161
  type: HostBinding,
49314
- args: ['class.igx-query-builder']
49315
- }], display: [{
49316
- type: HostBinding,
49317
- args: ['style.display']
50162
+ args: ['class']
50163
+ }], entities: [{
50164
+ type: Input
50165
+ }], queryBuilder: [{
50166
+ type: Input
50167
+ }], searchValueTemplate: [{
50168
+ type: Input
50169
+ }], parentExpression: [{
50170
+ type: Input
49318
50171
  }], fields: [{
49319
50172
  type: Input
49320
50173
  }], expressionTree: [{
@@ -49325,6 +50178,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
49325
50178
  type: Input
49326
50179
  }], expressionTreeChange: [{
49327
50180
  type: Output
50181
+ }], inEditModeChange: [{
50182
+ type: Output
50183
+ }], entitySelect: [{
50184
+ type: ViewChild,
50185
+ args: ['entitySelect', { read: IgxSelectComponent }]
50186
+ }], returnFieldsCombo: [{
50187
+ type: ViewChild,
50188
+ args: ['returnFieldsCombo', { read: IgxComboComponent }]
50189
+ }], returnFieldSelect: [{
50190
+ type: ViewChild,
50191
+ args: ['returnFieldSelect', { read: IgxSelectComponent }]
49328
50192
  }], fieldSelect: [{
49329
50193
  type: ViewChild,
49330
50194
  args: ['fieldSelect', { read: IgxSelectComponent }]
@@ -49343,30 +50207,320 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
49343
50207
  }], addConditionButton: [{
49344
50208
  type: ViewChild,
49345
50209
  args: ['addConditionButton', { read: ElementRef }]
50210
+ }], entityChangeDialog: [{
50211
+ type: ViewChild,
50212
+ args: ['entityChangeDialog', { read: IgxDialogComponent }]
50213
+ }], addExpressionItemDropDown: [{
50214
+ type: ViewChild,
50215
+ args: ['addOptionsDropDown', { read: IgxDropDownComponent }]
50216
+ }], groupContextMenuDropDown: [{
50217
+ type: ViewChild,
50218
+ args: ['groupContextMenuDropDown', { read: IgxDropDownComponent }]
50219
+ }], expressionsChips: [{
50220
+ type: ViewChildren,
50221
+ args: [IgxChipComponent, { read: IgxChipComponent }]
49346
50222
  }], headerContent: [{
49347
50223
  type: ContentChild,
49348
50224
  args: [IgxQueryBuilderHeaderComponent]
49349
50225
  }], editingInputsContainer: [{
49350
50226
  type: ViewChild,
49351
50227
  args: ['editingInputsContainer', { read: ElementRef }]
49352
- }], addModeContainer: [{
49353
- type: ViewChild,
49354
- args: ['addModeContainer', { read: ElementRef }]
49355
50228
  }], currentGroupButtonsContainer: [{
49356
50229
  type: ViewChild,
49357
50230
  args: ['currentGroupButtonsContainer', { read: ElementRef }]
49358
- }], contextMenuToggle: [{
49359
- type: ViewChild,
49360
- args: [IgxToggleDirective]
49361
- }], chips: [{
49362
- type: ViewChildren,
49363
- args: [IgxChipComponent]
49364
50231
  }], expressionsContainer: [{
49365
50232
  type: ViewChild,
49366
50233
  args: ['expressionsContainer']
49367
50234
  }], overlayOutlet: [{
49368
50235
  type: ViewChild,
49369
50236
  args: ['overlayOutlet', { read: IgxOverlayOutletDirective, static: true }]
50237
+ }], innerQueries: [{
50238
+ type: ViewChildren,
50239
+ args: [IgxQueryBuilderTreeComponent]
50240
+ }] } });
50241
+
50242
+ /**
50243
+ * Defines the custom template that will be used for the search value input of condition in edit mode
50244
+ *
50245
+ * @igxModule IgxQueryBuilderModule
50246
+ * @igxKeywords query builder, query builder search value
50247
+ * @igxGroup Data entry and display
50248
+ *
50249
+ * @example
50250
+ * <igx-query-builder>
50251
+ * <ng-template igxQueryBuilderSearchValue let-expression="expression">
50252
+ * <input type="text" required [(ngModel)]="expression.searchVal"/>
50253
+ * </ng-template>
50254
+ * </igx-query-builder>
50255
+ */
50256
+ class IgxQueryBuilderSearchValueTemplateDirective {
50257
+ constructor(template) {
50258
+ this.template = template;
50259
+ }
50260
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderSearchValueTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
50261
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.0", type: IgxQueryBuilderSearchValueTemplateDirective, isStandalone: true, selector: "[igxQueryBuilderSearchValue]", ngImport: i0 }); }
50262
+ }
50263
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderSearchValueTemplateDirective, decorators: [{
50264
+ type: Directive,
50265
+ args: [{
50266
+ selector: '[igxQueryBuilderSearchValue]',
50267
+ standalone: true
50268
+ }]
50269
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
50270
+
50271
+ /**
50272
+ * A component used for operating with complex filters by creating or editing conditions
50273
+ * and grouping them using AND/OR logic.
50274
+ * It is used internally in the Advanced Filtering of the Grid.
50275
+ *
50276
+ * @example
50277
+ * ```html
50278
+ * <igx-query-builder [entities]="this.entities">
50279
+ * </igx-query-builder>
50280
+ * ```
50281
+ */
50282
+ class IgxQueryBuilderComponent {
50283
+ /**
50284
+ * Returns the fields.
50285
+ * @hidden
50286
+ * @deprecated in version 19.1.0. Use the `entities` property instead.
50287
+ */
50288
+ get fields() {
50289
+ return this._fields;
50290
+ }
50291
+ /**
50292
+ * Sets the fields.
50293
+ * @hidden
50294
+ * @deprecated in version 19.1.0. Use the `entities` property instead.
50295
+ */
50296
+ set fields(fields) {
50297
+ if (fields) {
50298
+ this._fields = fields;
50299
+ this.entities = [
50300
+ {
50301
+ name: null,
50302
+ fields: fields
50303
+ }
50304
+ ];
50305
+ }
50306
+ }
50307
+ /**
50308
+ * Returns the expression tree.
50309
+ */
50310
+ get expressionTree() {
50311
+ return this._expressionTree;
50312
+ }
50313
+ /**
50314
+ * Sets the expression tree.
50315
+ */
50316
+ set expressionTree(expressionTree) {
50317
+ if (JSON.stringify(expressionTree) !== JSON.stringify(this._expressionTree)) {
50318
+ this._expressionTree = expressionTree;
50319
+ }
50320
+ }
50321
+ /**
50322
+ * Sets the resource strings.
50323
+ * By default it uses EN resources.
50324
+ */
50325
+ set resourceStrings(value) {
50326
+ this._resourceStrings = Object.assign({}, this._resourceStrings, value);
50327
+ }
50328
+ /**
50329
+ * Returns the resource strings.
50330
+ */
50331
+ get resourceStrings() {
50332
+ return this._resourceStrings;
50333
+ }
50334
+ constructor(iconService) {
50335
+ this.iconService = iconService;
50336
+ /**
50337
+ * @hidden @internal
50338
+ */
50339
+ this.cssClass = 'igx-query-builder';
50340
+ /**
50341
+ * @hidden @internal
50342
+ */
50343
+ this.display = 'block';
50344
+ /**
50345
+ * Gets/sets whether the confirmation dialog should be shown when changing entity.
50346
+ * Default value is `true`.
50347
+ */
50348
+ this.showEntityChangeDialog = true;
50349
+ /**
50350
+ * Disables subsequent entity changes at the root level after the initial selection.
50351
+ */
50352
+ this.disableEntityChange = false;
50353
+ /**
50354
+ * Event fired as the expression tree is changed.
50355
+ *
50356
+ * ```html
50357
+ * <igx-query-builder (expressionTreeChange)='onExpressionTreeChange()'></igx-query-builder>
50358
+ * ```
50359
+ */
50360
+ this.expressionTreeChange = new EventEmitter();
50361
+ this.destroy$ = new Subject();
50362
+ this._resourceStrings = getCurrentResourceStrings(QueryBuilderResourceStringsEN);
50363
+ this._shouldEmitTreeChange = true;
50364
+ this.registerSVGIcons();
50365
+ }
50366
+ /**
50367
+ * Returns whether the expression tree can be committed in the current state.
50368
+ */
50369
+ canCommit() {
50370
+ return this.queryTree?.canCommitCurrentState() === true;
50371
+ }
50372
+ /**
50373
+ * Commits the expression tree in the current state if it is valid. If not throws an exception.
50374
+ */
50375
+ commit() {
50376
+ if (this.canCommit()) {
50377
+ this._shouldEmitTreeChange = false;
50378
+ this.queryTree.commitCurrentState();
50379
+ this._shouldEmitTreeChange = true;
50380
+ }
50381
+ else {
50382
+ throw new Error('Expression tree can\'t be committed in the current state. Use `canCommit` method to check if the current state is valid.');
50383
+ }
50384
+ }
50385
+ /**
50386
+ * Discards all unsaved changes to the expression tree.
50387
+ */
50388
+ discard() {
50389
+ this.queryTree.cancelOperandEdit();
50390
+ }
50391
+ /**
50392
+ * @hidden @internal
50393
+ */
50394
+ ngOnDestroy() {
50395
+ this.destroy$.next(true);
50396
+ this.destroy$.complete();
50397
+ }
50398
+ /**
50399
+ * @hidden @internal
50400
+ *
50401
+ * used by the grid
50402
+ */
50403
+ setPickerOutlet(outlet) {
50404
+ this.queryTree.setPickerOutlet(outlet);
50405
+ }
50406
+ /**
50407
+ * @hidden @internal
50408
+ *
50409
+ * used by the grid
50410
+ */
50411
+ get isContextMenuVisible() {
50412
+ return this.queryTree.isContextMenuVisible;
50413
+ }
50414
+ /**
50415
+ * @hidden @internal
50416
+ *
50417
+ * used by the grid
50418
+ */
50419
+ exitOperandEdit() {
50420
+ this.queryTree.exitOperandEdit();
50421
+ }
50422
+ /**
50423
+ * @hidden @internal
50424
+ *
50425
+ * used by the grid
50426
+ */
50427
+ setAddButtonFocus() {
50428
+ this.queryTree.setAddButtonFocus();
50429
+ }
50430
+ onExpressionTreeChange(tree) {
50431
+ this._expressionTree = tree;
50432
+ if (this._shouldEmitTreeChange) {
50433
+ this.expressionTreeChange.emit();
50434
+ }
50435
+ }
50436
+ registerSVGIcons() {
50437
+ const editorIcons = editor;
50438
+ editorIcons.forEach((icon) => {
50439
+ this.iconService.addSvgIconFromText(icon.name, icon.value, 'imx-icons');
50440
+ this.iconService.addIconRef(icon.name, 'default', {
50441
+ name: icon.name,
50442
+ family: 'imx-icons'
50443
+ });
50444
+ });
50445
+ const inIcon = '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#5f6368"><path d="M560-280H120v-400h720v120h-80v-40H200v240h360v80Zm-360-80v-240 240Zm560 200v-120H640v-80h120v-120h80v120h120v80H840v120h-80Z"/></svg>';
50446
+ this.iconService.addSvgIconFromText('in', inIcon, 'imx-icons');
50447
+ this.iconService.addIconRef('in', 'default', {
50448
+ name: 'in',
50449
+ family: 'imx-icons'
50450
+ });
50451
+ const notInIcon = '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#5f6368"><path d="M560-280H120v-400h720v120h-80v-40H200v240h360v80Zm-360-80v-240 240Zm440 104 84-84-84-84 56-56 84 84 84-84 56 56-83 84 83 84-56 56-84-83-84 83-56-56Z"/></svg>';
50452
+ this.iconService.addSvgIconFromText('not-in', notInIcon, 'imx-icons');
50453
+ this.iconService.addIconRef('not-in', 'default', {
50454
+ name: 'not-in',
50455
+ family: 'imx-icons'
50456
+ });
50457
+ this.iconService.addIconRef('add', 'default', {
50458
+ name: 'add',
50459
+ family: 'material',
50460
+ });
50461
+ this.iconService.addIconRef('close', 'default', {
50462
+ name: 'close',
50463
+ family: 'material',
50464
+ });
50465
+ this.iconService.addIconRef('check', 'default', {
50466
+ name: 'check',
50467
+ family: 'material',
50468
+ });
50469
+ this.iconService.addIconRef('delete', 'default', {
50470
+ name: 'delete',
50471
+ family: 'material',
50472
+ });
50473
+ this.iconService.addIconRef('edit', 'default', {
50474
+ name: 'edit',
50475
+ family: 'material',
50476
+ });
50477
+ this.iconService.addIconRef('unfold_less', 'default', {
50478
+ name: 'unfold_less',
50479
+ family: 'material',
50480
+ });
50481
+ this.iconService.addIconRef('unfold_more', 'default', {
50482
+ name: 'unfold_more',
50483
+ family: 'material',
50484
+ });
50485
+ }
50486
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderComponent, deps: [{ token: IgxIconService }], target: i0.ɵɵFactoryTarget.Component }); }
50487
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxQueryBuilderComponent, isStandalone: true, selector: "igx-query-builder", inputs: { showEntityChangeDialog: ["showEntityChangeDialog", "showEntityChangeDialog", booleanAttribute], entities: "entities", fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings", disableEntityChange: "disableEntityChange" }, outputs: { expressionTreeChange: "expressionTreeChange" }, host: { properties: { "class.igx-query-builder": "this.cssClass", "style.display": "this.display" } }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }, { propertyName: "searchValueTemplate", first: true, predicate: IgxQueryBuilderSearchValueTemplateDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "queryTree", first: true, predicate: IgxQueryBuilderTreeComponent, descendants: true }], ngImport: i0, template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [resourceStrings]=\"this.resourceStrings\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<igx-query-builder-tree\n [entities]=\"this.entities\"\n [expressionTree]=\"this.expressionTree\"\n [locale]=\"this.locale\"\n [resourceStrings]=\"this.resourceStrings\"\n [queryBuilder]=\"this\"\n (expressionTreeChange)=\"onExpressionTreeChange($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n</igx-query-builder-tree>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "resourceStrings"] }, { kind: "component", type: IgxQueryBuilderTreeComponent, selector: "igx-query-builder-tree", inputs: ["entities", "queryBuilder", "searchValueTemplate", "parentExpression", "fields", "expressionTree", "locale", "resourceStrings"], outputs: ["expressionTreeChange", "inEditModeChange"] }] }); }
50488
+ }
50489
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderComponent, decorators: [{
50490
+ type: Component,
50491
+ args: [{ selector: 'igx-query-builder', standalone: true, imports: [NgIf, IgxQueryBuilderHeaderComponent, IgxQueryBuilderTreeComponent, NgTemplateOutlet, IgxQueryBuilderSearchValueTemplateDirective], template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [resourceStrings]=\"this.resourceStrings\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<igx-query-builder-tree\n [entities]=\"this.entities\"\n [expressionTree]=\"this.expressionTree\"\n [locale]=\"this.locale\"\n [resourceStrings]=\"this.resourceStrings\"\n [queryBuilder]=\"this\"\n (expressionTreeChange)=\"onExpressionTreeChange($event)\"\n [searchValueTemplate]=\"searchValueTemplate\">\n</igx-query-builder-tree>\n" }]
50492
+ }], ctorParameters: () => [{ type: IgxIconService }], propDecorators: { cssClass: [{
50493
+ type: HostBinding,
50494
+ args: ['class.igx-query-builder']
50495
+ }], display: [{
50496
+ type: HostBinding,
50497
+ args: ['style.display']
50498
+ }], showEntityChangeDialog: [{
50499
+ type: Input,
50500
+ args: [{ transform: booleanAttribute }]
50501
+ }], entities: [{
50502
+ type: Input
50503
+ }], fields: [{
50504
+ type: Input
50505
+ }], expressionTree: [{
50506
+ type: Input
50507
+ }], locale: [{
50508
+ type: Input
50509
+ }], resourceStrings: [{
50510
+ type: Input
50511
+ }], disableEntityChange: [{
50512
+ type: Input
50513
+ }], expressionTreeChange: [{
50514
+ type: Output
50515
+ }], headerContent: [{
50516
+ type: ContentChild,
50517
+ args: [IgxQueryBuilderHeaderComponent]
50518
+ }], searchValueTemplate: [{
50519
+ type: ContentChild,
50520
+ args: [IgxQueryBuilderSearchValueTemplateDirective, { read: TemplateRef }]
50521
+ }], queryTree: [{
50522
+ type: ViewChild,
50523
+ args: [IgxQueryBuilderTreeComponent]
49370
50524
  }] } });
49371
50525
 
49372
50526
  const GridResourceStringsEN = {
@@ -49438,8 +50592,8 @@ const GridResourceStringsEN = {
49438
50592
  igx_grid_excel_custom_dialog_add: 'add filter',
49439
50593
  igx_grid_excel_custom_dialog_clear: 'Clear filter',
49440
50594
  igx_grid_excel_custom_dialog_header: 'Custom auto-filter on column: ',
49441
- igx_grid_excel_cancel: 'Cancel',
49442
- igx_grid_excel_apply: 'Apply',
50595
+ igx_grid_excel_cancel: 'cancel',
50596
+ igx_grid_excel_apply: 'apply',
49443
50597
  igx_grid_excel_search_placeholder: 'Search',
49444
50598
  igx_grid_excel_select_all: 'Select All',
49445
50599
  igx_grid_excel_select_all_search_results: 'Select all search results',
@@ -49626,7 +50780,6 @@ class IgxAdvancedFilteringDialogComponent {
49626
50780
  eventArgs.stopPropagation();
49627
50781
  const key = eventArgs.key;
49628
50782
  if (this.queryBuilder.isContextMenuVisible && (key === this.platform.KEYMAP.ESCAPE)) {
49629
- this.queryBuilder.clearSelection();
49630
50783
  }
49631
50784
  else if (key === this.platform.KEYMAP.ESCAPE) {
49632
50785
  this.closeDialog();
@@ -49681,6 +50834,18 @@ class IgxAdvancedFilteringDialogComponent {
49681
50834
  this.applyChanges(event);
49682
50835
  this.closeDialog();
49683
50836
  }
50837
+ /**
50838
+ * @hidden @internal
50839
+ */
50840
+ generateEntity() {
50841
+ const entities = [
50842
+ {
50843
+ name: null,
50844
+ fields: this.filterableFields
50845
+ }
50846
+ ];
50847
+ return entities;
50848
+ }
49684
50849
  assignResourceStrings() {
49685
50850
  // If grid has custom resource strings set for the advanced filtering,
49686
50851
  // they are passed to the query builder resource strings.
@@ -49705,11 +50870,11 @@ class IgxAdvancedFilteringDialogComponent {
49705
50870
  }
49706
50871
  }
49707
50872
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxAdvancedFilteringDialogComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: PlatformUtil }], target: i0.ɵɵFactoryTarget.Component }); }
49708
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxAdvancedFilteringDialogComponent, isStandalone: true, selector: "igx-advanced-filtering-dialog", inputs: { grid: "grid" }, host: { properties: { "style.display": "this.display" } }, viewQueries: [{ propertyName: "queryBuilder", first: true, predicate: ["queryBuilder"], descendants: true, read: IgxQueryBuilderComponent }], ngImport: i0, template: "<article *ngIf=\"grid\" class=\"igx-advanced-filter\" igxDrag [ghost]=\"false\" [dragTolerance]=\"0\"\n (dragStart)=\"dragStart($event)\" (dragMove)=\"onDragMove($event)\" (keydown)=\"onKeyDown($event)\"\n [ngClass]=\"{\n 'igx-advanced-filter': true,\n 'igx-advanced-filter--inline': inline\n }\">\n <igx-query-builder #queryBuilder [locale]=\"grid.locale\"\n [fields]=\"this.filterableFields\"\n [expressionTree]=\"this.grid.advancedFilteringExpressionsTree\">\n <igx-query-builder-header\n [title]=\"grid.resourceStrings.igx_grid_advanced_filter_title\"\n igxDragHandle>\n </igx-query-builder-header>\n </igx-query-builder>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button igxButton=\"flat\" type=\"button\"\n (click)=\"onClearButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button igxButton=\"flat\" type=\"button\" (click)=\"cancelChanges()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button igxButton=\"contained\" type=\"button\"\n (click)=\"onApplyButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxDragDirective, selector: "[igxDrag]", inputs: ["igxDrag", "dragTolerance", "dragDirection", "dragChannel", "ghost", "ghostClass", "ghostStyle", "ghostTemplate", "ghostHost", "scrollContainer", "ghostOffsetX", "ghostOffsetY"], outputs: ["dragStart", "dragMove", "dragEnd", "dragClick", "ghostCreate", "ghostDestroy", "transitioned"], exportAs: ["drag"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IgxQueryBuilderComponent, selector: "igx-query-builder", inputs: ["fields", "expressionTree", "locale", "resourceStrings"], outputs: ["expressionTreeChange"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "showLegend", "resourceStrings"] }, { kind: "directive", type: IgxDragHandleDirective, selector: "[igxDragHandle]" }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }] }); }
50873
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxAdvancedFilteringDialogComponent, isStandalone: true, selector: "igx-advanced-filtering-dialog", inputs: { grid: "grid" }, host: { properties: { "style.display": "this.display" } }, viewQueries: [{ propertyName: "queryBuilder", first: true, predicate: ["queryBuilder"], descendants: true, read: IgxQueryBuilderComponent }], ngImport: i0, template: "<article *ngIf=\"grid\" class=\"igx-advanced-filter\" igxDrag [ghost]=\"false\" [dragTolerance]=\"0\"\n (dragStart)=\"dragStart($event)\" (dragMove)=\"onDragMove($event)\" (keydown)=\"onKeyDown($event)\"\n [ngClass]=\"{\n 'igx-advanced-filter': true,\n 'igx-advanced-filter--inline': inline\n }\">\n <igx-query-builder #queryBuilder\n [locale]=\"grid.locale\"\n [entities]=\"generateEntity()\"\n [expressionTree]=\"this.grid.advancedFilteringExpressionsTree\">\n <igx-query-builder-header\n [title]=\"grid.resourceStrings.igx_grid_advanced_filter_title\"\n igxDragHandle>\n </igx-query-builder-header>\n </igx-query-builder>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button igxButton=\"flat\" type=\"button\"\n (click)=\"onClearButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button igxButton=\"outlined\" type=\"button\" (click)=\"cancelChanges()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button igxButton=\"contained\" type=\"button\"\n (click)=\"onApplyButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxDragDirective, selector: "[igxDrag]", inputs: ["igxDrag", "dragTolerance", "dragDirection", "dragChannel", "ghost", "ghostClass", "ghostStyle", "ghostTemplate", "ghostHost", "scrollContainer", "ghostOffsetX", "ghostOffsetY"], outputs: ["dragStart", "dragMove", "dragEnd", "dragClick", "ghostCreate", "ghostDestroy", "transitioned"], exportAs: ["drag"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IgxQueryBuilderComponent, selector: "igx-query-builder", inputs: ["showEntityChangeDialog", "entities", "fields", "expressionTree", "locale", "resourceStrings", "disableEntityChange"], outputs: ["expressionTreeChange"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "resourceStrings"] }, { kind: "directive", type: IgxDragHandleDirective, selector: "[igxDragHandle]" }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }] }); }
49709
50874
  }
49710
50875
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxAdvancedFilteringDialogComponent, decorators: [{
49711
50876
  type: Component,
49712
- args: [{ selector: 'igx-advanced-filtering-dialog', imports: [NgIf, IgxDragDirective, NgClass, IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxDragHandleDirective, IgxButtonDirective], template: "<article *ngIf=\"grid\" class=\"igx-advanced-filter\" igxDrag [ghost]=\"false\" [dragTolerance]=\"0\"\n (dragStart)=\"dragStart($event)\" (dragMove)=\"onDragMove($event)\" (keydown)=\"onKeyDown($event)\"\n [ngClass]=\"{\n 'igx-advanced-filter': true,\n 'igx-advanced-filter--inline': inline\n }\">\n <igx-query-builder #queryBuilder [locale]=\"grid.locale\"\n [fields]=\"this.filterableFields\"\n [expressionTree]=\"this.grid.advancedFilteringExpressionsTree\">\n <igx-query-builder-header\n [title]=\"grid.resourceStrings.igx_grid_advanced_filter_title\"\n igxDragHandle>\n </igx-query-builder-header>\n </igx-query-builder>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button igxButton=\"flat\" type=\"button\"\n (click)=\"onClearButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button igxButton=\"flat\" type=\"button\" (click)=\"cancelChanges()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button igxButton=\"contained\" type=\"button\"\n (click)=\"onApplyButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n" }]
50877
+ args: [{ selector: 'igx-advanced-filtering-dialog', imports: [NgIf, IgxDragDirective, NgClass, IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxDragHandleDirective, IgxButtonDirective], template: "<article *ngIf=\"grid\" class=\"igx-advanced-filter\" igxDrag [ghost]=\"false\" [dragTolerance]=\"0\"\n (dragStart)=\"dragStart($event)\" (dragMove)=\"onDragMove($event)\" (keydown)=\"onKeyDown($event)\"\n [ngClass]=\"{\n 'igx-advanced-filter': true,\n 'igx-advanced-filter--inline': inline\n }\">\n <igx-query-builder #queryBuilder\n [locale]=\"grid.locale\"\n [entities]=\"generateEntity()\"\n [expressionTree]=\"this.grid.advancedFilteringExpressionsTree\">\n <igx-query-builder-header\n [title]=\"grid.resourceStrings.igx_grid_advanced_filter_title\"\n igxDragHandle>\n </igx-query-builder-header>\n </igx-query-builder>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button igxButton=\"flat\" type=\"button\"\n (click)=\"onClearButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button igxButton=\"outlined\" type=\"button\" (click)=\"cancelChanges()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button igxButton=\"contained\" type=\"button\"\n (click)=\"onApplyButtonClick($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n" }]
49713
50878
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: PlatformUtil }], propDecorators: { queryBuilder: [{
49714
50879
  type: ViewChild,
49715
50880
  args: ['queryBuilder', { read: IgxQueryBuilderComponent }]
@@ -49928,6 +51093,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
49928
51093
  * @hidden
49929
51094
  */
49930
51095
  class IgxExcelStyleDateExpressionComponent extends IgxExcelStyleDefaultExpressionComponent {
51096
+ get searchVal() {
51097
+ return this.expressionUI.expression.searchVal;
51098
+ }
51099
+ set searchVal(value) {
51100
+ this.expressionUI.expression.searchVal = value ? new Date(Date.parse(value.toString())) : null;
51101
+ }
49931
51102
  get inputValuesElement() {
49932
51103
  return this.picker?.getEditElement() || this.input?.nativeElement;
49933
51104
  }
@@ -49941,17 +51112,19 @@ class IgxExcelStyleDateExpressionComponent extends IgxExcelStyleDefaultExpressio
49941
51112
  return getLocaleFirstDayOfWeek(this.grid.locale);
49942
51113
  }
49943
51114
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxExcelStyleDateExpressionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
49944
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxExcelStyleDateExpressionComponent, isStandalone: true, selector: "igx-excel-style-date-expression", 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 <igx-icon *ngIf=\"expressionUI.expression.condition\" family=\"default\" [name]=\"getIconName()\"></igx-icon>\n <igx-icon *ngIf=\"!expressionUI.expression.condition\" family=\"default\" name=\"filter_list\"></igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of conditions\" [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</igx-select>\n\n<igx-date-picker #picker *ngIf=\"column.dataType === 'date'\"\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputDatePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-date-picker>\n\n<igx-time-picker #picker *ngIf=\"column.dataType === 'time'\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\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 <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-time-picker>\n\n<igx-input-group #dropDownTarget *ngIf=\"column.dataType === 'dateTime'\" #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)]=\"expressionUI.expression.searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n</igx-input-group>\n\n<button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" *ngIf=\"!isSingle\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n</button>\n\n<igx-buttongroup #logicOperatorButtonGroup\n *ngIf=\"!isLast\">\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\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<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: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "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", "headerOrientation", "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"] }] }); }
51115
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", 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 <igx-icon *ngIf=\"expressionUI.expression.condition\" family=\"default\" [name]=\"getIconName()\"></igx-icon>\n <igx-icon *ngIf=\"!expressionUI.expression.condition\" family=\"default\" name=\"filter_list\"></igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of conditions\" [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</igx-select>\n\n<igx-date-picker #picker *ngIf=\"column.dataType === 'date'\"\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(value)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputDatePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-date-picker>\n\n<igx-time-picker #picker *ngIf=\"column.dataType === 'time'\"\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\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 <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-time-picker>\n\n<igx-input-group #dropDownTarget *ngIf=\"column.dataType === 'dateTime'\" #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<button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" *ngIf=\"!isSingle\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n</button>\n\n<igx-buttongroup #logicOperatorButtonGroup\n *ngIf=\"!isLast\">\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\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<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: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "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", "headerOrientation", "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"] }] }); }
49945
51116
  }
49946
51117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxExcelStyleDateExpressionComponent, decorators: [{
49947
51118
  type: Component,
49948
- args: [{ selector: 'igx-excel-style-date-expression', imports: [IgxSelectComponent, IgxPrefixDirective, NgIf, IgxIconComponent, NgFor, 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 <igx-icon *ngIf=\"expressionUI.expression.condition\" family=\"default\" [name]=\"getIconName()\"></igx-icon>\n <igx-icon *ngIf=\"!expressionUI.expression.condition\" family=\"default\" name=\"filter_list\"></igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of conditions\" [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</igx-select>\n\n<igx-date-picker #picker *ngIf=\"column.dataType === 'date'\"\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputDatePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-date-picker>\n\n<igx-time-picker #picker *ngIf=\"column.dataType === 'time'\"\n [(value)]=\"expressionUI.expression.searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\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 <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-time-picker>\n\n<igx-input-group #dropDownTarget *ngIf=\"column.dataType === 'dateTime'\" #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)]=\"expressionUI.expression.searchVal\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"/>\n</igx-input-group>\n\n<button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" *ngIf=\"!isSingle\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n</button>\n\n<igx-buttongroup #logicOperatorButtonGroup\n *ngIf=\"!isLast\">\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\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<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n" }]
51119
+ args: [{ selector: 'igx-excel-style-date-expression', imports: [IgxSelectComponent, IgxPrefixDirective, NgIf, IgxIconComponent, NgFor, 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 <igx-icon *ngIf=\"expressionUI.expression.condition\" family=\"default\" [name]=\"getIconName()\"></igx-icon>\n <igx-icon *ngIf=\"!expressionUI.expression.condition\" family=\"default\" name=\"filter_list\"></igx-icon>\n </igx-prefix>\n <igx-select-item *ngFor=\"let condition of conditions\" [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</igx-select>\n\n<igx-date-picker #picker *ngIf=\"column.dataType === 'date'\"\n [weekStart]=\"column.pipeArgs.weekStart ?? weekStart\"\n [(value)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\n [placeholder]=\"inputDatePlaceholder\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n type=\"box\">\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-date-picker>\n\n<igx-time-picker #picker *ngIf=\"column.dataType === 'time'\"\n [(ngModel)]=\"searchVal\"\n [locale]=\"grid.locale\"\n [outlet]=\"grid.outlet\"\n (click)=\"picker.open()\"\n [readOnly]=\"true\"\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 <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n</igx-time-picker>\n\n<igx-input-group #dropDownTarget *ngIf=\"column.dataType === 'dateTime'\" #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<button type=\"button\" (click)=\"onRemoveButtonClick()\" igxIconButton=\"flat\" *ngIf=\"!isSingle\" >\n <igx-icon family=\"default\" name=\"remove\"></igx-icon>\n</button>\n\n<igx-buttongroup #logicOperatorButtonGroup\n *ngIf=\"!isLast\">\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\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<div #overlayOutlet\n igxOverlayOutlet\n (pointerdown)=\"onOutletPointerDown($event)\">\n</div>\n" }]
49949
51120
  }], propDecorators: { input: [{
49950
51121
  type: ViewChild,
49951
51122
  args: ['input', { read: IgxInputDirective, static: false }]
49952
51123
  }], picker: [{
49953
51124
  type: ViewChild,
49954
51125
  args: ['picker']
51126
+ }], searchVal: [{
51127
+ type: Input
49955
51128
  }] } });
49956
51129
 
49957
51130
  /**
@@ -50013,11 +51186,10 @@ function generateExpressionsListRecursive(expressions, operator, expressionsUIs)
50013
51186
  * @hidden
50014
51187
  */
50015
51188
  class IgxExcelStyleCustomDialogComponent {
50016
- constructor(overlayService, cdr, platform, esf) {
51189
+ constructor(overlayService, cdr, platform) {
50017
51190
  this.overlayService = overlayService;
50018
51191
  this.cdr = cdr;
50019
51192
  this.platform = platform;
50020
- this.esf = esf;
50021
51193
  this.expressionsList = new Array();
50022
51194
  this._customDialogPositionSettings = {
50023
51195
  verticalDirection: VerticalAlignment.Middle,
@@ -50064,7 +51236,6 @@ class IgxExcelStyleCustomDialogComponent {
50064
51236
  }
50065
51237
  onClearButtonClick() {
50066
51238
  this.filteringService.clearFilter(this.column.field);
50067
- this.selectedOperator = null;
50068
51239
  this.createInitialExpressionUIElement();
50069
51240
  this.cdr.detectChanges();
50070
51241
  }
@@ -50077,10 +51248,6 @@ class IgxExcelStyleCustomDialogComponent {
50077
51248
  this.toggle.close();
50078
51249
  }
50079
51250
  }
50080
- cancelDialog() {
50081
- this.esf.cancel();
50082
- this.closeDialog();
50083
- }
50084
51251
  onApplyButtonClick() {
50085
51252
  this.expressionsList = this.expressionsList.filter(element => element.expression.condition &&
50086
51253
  (element.expression.searchVal || element.expression.searchVal === 0 || element.expression.condition.isUnary));
@@ -50095,6 +51262,7 @@ class IgxExcelStyleCustomDialogComponent {
50095
51262
  const exprUI = new ExpressionUI();
50096
51263
  exprUI.expression = {
50097
51264
  condition: null,
51265
+ conditionName: null,
50098
51266
  fieldName: this.column.field,
50099
51267
  ignoreCase: this.column.filteringIgnoreCase,
50100
51268
  searchVal: null
@@ -50167,8 +51335,10 @@ class IgxExcelStyleCustomDialogComponent {
50167
51335
  }
50168
51336
  else {
50169
51337
  this.expressionsList = [];
51338
+ const cond = this.createCondition(this.selectedOperator);
50170
51339
  firstExprUI.expression = {
50171
- condition: this.createCondition(this.selectedOperator),
51340
+ condition: cond,
51341
+ conditionName: cond.name,
50172
51342
  fieldName: this.column.field,
50173
51343
  ignoreCase: this.column.filteringIgnoreCase,
50174
51344
  searchVal: null
@@ -50179,6 +51349,7 @@ class IgxExcelStyleCustomDialogComponent {
50179
51349
  const secondExprUI = new ExpressionUI();
50180
51350
  secondExprUI.expression = {
50181
51351
  condition: null,
51352
+ conditionName: null,
50182
51353
  fieldName: this.column.field,
50183
51354
  ignoreCase: this.column.filteringIgnoreCase,
50184
51355
  searchVal: null
@@ -50191,13 +51362,13 @@ class IgxExcelStyleCustomDialogComponent {
50191
51362
  this.expressionsContainer.nativeElement.scrollTop = this.expressionsContainer.nativeElement.scrollHeight;
50192
51363
  });
50193
51364
  }
50194
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxExcelStyleCustomDialogComponent, deps: [{ token: IgxOverlayService }, { token: i0.ChangeDetectorRef }, { token: PlatformUtil }, { token: BaseFilteringComponent }], target: i0.ɵɵFactoryTarget.Component }); }
50195
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxExcelStyleCustomDialogComponent, isStandalone: true, selector: "igx-excel-style-custom-dialog", inputs: { expressionsList: "expressionsList", column: "column", selectedOperator: "selectedOperator", filteringService: "filteringService", overlayComponentId: "overlayComponentId" }, viewQueries: [{ propertyName: "toggle", first: true, predicate: ["toggle"], descendants: true, read: IgxToggleDirective, static: true }, { propertyName: "defaultExpressionTemplate", first: true, predicate: ["defaultExpressionTemplate"], descendants: true, read: TemplateRef }, { propertyName: "dateExpressionTemplate", first: true, predicate: ["dateExpressionTemplate"], descendants: true, read: TemplateRef }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true, static: true }, { propertyName: "expressionComponents", predicate: IgxExcelStyleDefaultExpressionComponent, descendants: true }, { propertyName: "expressionDateComponents", predicate: IgxExcelStyleDateExpressionComponent, descendants: true }], ngImport: i0, template: "<article #toggle igxToggle\n class=\"igx-excel-filter__secondary\"\n [ngClass]=\"{\n 'igx-excel-filter__secondary--cosy': grid.gridSize === '2',\n 'igx-excel-filter__secondary--compact': grid.gridSize === '1'\n }\"\n (keydown)=\"onKeyDown($event)\"\n (opening)=\"onCustomDialogOpening()\"\n (opened)=\"onCustomDialogOpened()\">\n <header class=\"igx-excel-filter__secondary-header\">\n <h4 class=\"ig-typography__h6\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_header }}{{ column.header || column.field }}\n </h4>\n </header>\n\n <article #expressionsContainer class=\"igx-excel-filter__secondary-main\">\n <ng-container *ngIf=\"column.dataType === 'date' || column.dataType === 'dateTime' || column.dataType === 'time'\">\n <igx-excel-style-date-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-date-expression>\n </ng-container>\n\n <ng-container *ngIf=\"column.dataType !== 'date' && column.dataType !== 'dateTime' && column.dataType !== 'time'\">\n <igx-excel-style-default-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-default-expression>\n </ng-container>\n\n <button type=\"button\" igxButton\n class=\"igx-excel-filter__add-filter\"\n (click)=\"onAddButtonClick()\">\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n <span>{{ grid.resourceStrings.igx_grid_excel_custom_dialog_add }}</span>\n </button>\n </article>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"onClearButtonClick()\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"cancelDialog()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"contained\"\n (click)=\"onApplyButtonClick()\"\n (keydown)=\"onApplyButtonKeyDown($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n", dependencies: [{ kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxExcelStyleDateExpressionComponent, selector: "igx-excel-style-date-expression" }, { kind: "component", type: IgxExcelStyleDefaultExpressionComponent, selector: "igx-excel-style-default-expression", inputs: ["column", "expressionUI", "expressionsList", "grid"], outputs: ["expressionRemoved", "logicOperatorChanged"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }] }); }
51365
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxExcelStyleCustomDialogComponent, deps: [{ token: IgxOverlayService }, { token: i0.ChangeDetectorRef }, { token: PlatformUtil }], target: i0.ɵɵFactoryTarget.Component }); }
51366
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxExcelStyleCustomDialogComponent, isStandalone: true, selector: "igx-excel-style-custom-dialog", inputs: { expressionsList: "expressionsList", column: "column", selectedOperator: "selectedOperator", filteringService: "filteringService", overlayComponentId: "overlayComponentId" }, viewQueries: [{ propertyName: "toggle", first: true, predicate: ["toggle"], descendants: true, read: IgxToggleDirective, static: true }, { propertyName: "defaultExpressionTemplate", first: true, predicate: ["defaultExpressionTemplate"], descendants: true, read: TemplateRef }, { propertyName: "dateExpressionTemplate", first: true, predicate: ["dateExpressionTemplate"], descendants: true, read: TemplateRef }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true, static: true }, { propertyName: "expressionComponents", predicate: IgxExcelStyleDefaultExpressionComponent, descendants: true }, { propertyName: "expressionDateComponents", predicate: IgxExcelStyleDateExpressionComponent, descendants: true }], ngImport: i0, template: "<article #toggle igxToggle\n class=\"igx-excel-filter__secondary\"\n [ngClass]=\"{\n 'igx-excel-filter__secondary--cosy': grid.gridSize === '2',\n 'igx-excel-filter__secondary--compact': grid.gridSize === '1'\n }\"\n (keydown)=\"onKeyDown($event)\"\n (opening)=\"onCustomDialogOpening()\"\n (opened)=\"onCustomDialogOpened()\">\n <header class=\"igx-excel-filter__secondary-header\">\n <h4 class=\"ig-typography__h6\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_header }}{{ column.header || column.field }}\n </h4>\n </header>\n\n <article #expressionsContainer class=\"igx-excel-filter__secondary-main\">\n <ng-container *ngIf=\"column.dataType === 'date' || column.dataType === 'dateTime' || column.dataType === 'time'\">\n <igx-excel-style-date-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-date-expression>\n </ng-container>\n\n <ng-container *ngIf=\"column.dataType !== 'date' && column.dataType !== 'dateTime' && column.dataType !== 'time'\">\n <igx-excel-style-default-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-default-expression>\n </ng-container>\n\n <button type=\"button\" igxButton\n class=\"igx-excel-filter__add-filter\"\n (click)=\"onAddButtonClick()\">\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n <span>{{ grid.resourceStrings.igx_grid_excel_custom_dialog_add }}</span>\n </button>\n </article>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"onClearButtonClick()\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"closeDialog()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"contained\"\n (click)=\"onApplyButtonClick()\"\n (keydown)=\"onApplyButtonKeyDown($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n", dependencies: [{ kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxExcelStyleDateExpressionComponent, selector: "igx-excel-style-date-expression", inputs: ["searchVal"] }, { kind: "component", type: IgxExcelStyleDefaultExpressionComponent, selector: "igx-excel-style-default-expression", inputs: ["column", "expressionUI", "expressionsList", "grid"], outputs: ["expressionRemoved", "logicOperatorChanged"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxLabel"], outputs: ["buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }] }); }
50196
51367
  }
50197
51368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxExcelStyleCustomDialogComponent, decorators: [{
50198
51369
  type: Component,
50199
- args: [{ selector: 'igx-excel-style-custom-dialog', imports: [IgxToggleDirective, NgClass, NgIf, NgFor, IgxExcelStyleDateExpressionComponent, IgxExcelStyleDefaultExpressionComponent, IgxButtonDirective, IgxIconComponent], template: "<article #toggle igxToggle\n class=\"igx-excel-filter__secondary\"\n [ngClass]=\"{\n 'igx-excel-filter__secondary--cosy': grid.gridSize === '2',\n 'igx-excel-filter__secondary--compact': grid.gridSize === '1'\n }\"\n (keydown)=\"onKeyDown($event)\"\n (opening)=\"onCustomDialogOpening()\"\n (opened)=\"onCustomDialogOpened()\">\n <header class=\"igx-excel-filter__secondary-header\">\n <h4 class=\"ig-typography__h6\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_header }}{{ column.header || column.field }}\n </h4>\n </header>\n\n <article #expressionsContainer class=\"igx-excel-filter__secondary-main\">\n <ng-container *ngIf=\"column.dataType === 'date' || column.dataType === 'dateTime' || column.dataType === 'time'\">\n <igx-excel-style-date-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-date-expression>\n </ng-container>\n\n <ng-container *ngIf=\"column.dataType !== 'date' && column.dataType !== 'dateTime' && column.dataType !== 'time'\">\n <igx-excel-style-default-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-default-expression>\n </ng-container>\n\n <button type=\"button\" igxButton\n class=\"igx-excel-filter__add-filter\"\n (click)=\"onAddButtonClick()\">\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n <span>{{ grid.resourceStrings.igx_grid_excel_custom_dialog_add }}</span>\n </button>\n </article>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"onClearButtonClick()\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"cancelDialog()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"contained\"\n (click)=\"onApplyButtonClick()\"\n (keydown)=\"onApplyButtonKeyDown($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n" }]
50200
- }], ctorParameters: () => [{ type: IgxOverlayService }, { type: i0.ChangeDetectorRef }, { type: PlatformUtil }, { type: BaseFilteringComponent }], propDecorators: { expressionsList: [{
51370
+ args: [{ selector: 'igx-excel-style-custom-dialog', imports: [IgxToggleDirective, NgClass, NgIf, NgFor, IgxExcelStyleDateExpressionComponent, IgxExcelStyleDefaultExpressionComponent, IgxButtonDirective, IgxIconComponent], template: "<article #toggle igxToggle\n class=\"igx-excel-filter__secondary\"\n [ngClass]=\"{\n 'igx-excel-filter__secondary--cosy': grid.gridSize === '2',\n 'igx-excel-filter__secondary--compact': grid.gridSize === '1'\n }\"\n (keydown)=\"onKeyDown($event)\"\n (opening)=\"onCustomDialogOpening()\"\n (opened)=\"onCustomDialogOpened()\">\n <header class=\"igx-excel-filter__secondary-header\">\n <h4 class=\"ig-typography__h6\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_header }}{{ column.header || column.field }}\n </h4>\n </header>\n\n <article #expressionsContainer class=\"igx-excel-filter__secondary-main\">\n <ng-container *ngIf=\"column.dataType === 'date' || column.dataType === 'dateTime' || column.dataType === 'time'\">\n <igx-excel-style-date-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-date-expression>\n </ng-container>\n\n <ng-container *ngIf=\"column.dataType !== 'date' && column.dataType !== 'dateTime' && column.dataType !== 'time'\">\n <igx-excel-style-default-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (expressionRemoved)=\"onExpressionRemoved($event)\"\n (logicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-default-expression>\n </ng-container>\n\n <button type=\"button\" igxButton\n class=\"igx-excel-filter__add-filter\"\n (click)=\"onAddButtonClick()\">\n <igx-icon family=\"default\" name=\"add\"></igx-icon>\n <span>{{ grid.resourceStrings.igx_grid_excel_custom_dialog_add }}</span>\n </button>\n </article>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <div class=\"igx-excel-filter__clear\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"onClearButtonClick()\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}\n </button>\n </div>\n <div class=\"igx-excel-filter__cancel\">\n <button type=\"button\"\n igxButton=\"flat\"\n (click)=\"closeDialog()\">\n {{ grid.resourceStrings.igx_grid_excel_cancel }}\n </button>\n </div>\n <div class=\"igx-excel-filter__apply\">\n <button type=\"button\"\n igxButton=\"contained\"\n (click)=\"onApplyButtonClick()\"\n (keydown)=\"onApplyButtonKeyDown($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n" }]
51371
+ }], ctorParameters: () => [{ type: IgxOverlayService }, { type: i0.ChangeDetectorRef }, { type: PlatformUtil }], propDecorators: { expressionsList: [{
50201
51372
  type: Input
50202
51373
  }], column: [{
50203
51374
  type: Input
@@ -50232,7 +51403,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
50232
51403
  */
50233
51404
  class IgxExcelStyleConditionalFilterComponent {
50234
51405
  get filterNumber() {
50235
- return this.esf.expressionsList.filter(e => e.expression.condition).length;
51406
+ return this.esf.expressionsList.length;
50236
51407
  }
50237
51408
  constructor(esf, platform) {
50238
51409
  this.esf = esf;
@@ -50324,9 +51495,6 @@ class IgxExcelStyleConditionalFilterComponent {
50324
51495
  this.esf.expressionsList[0].expression.condition.name !== 'in') {
50325
51496
  this.customDialog.expressionsList = this.esf.expressionsList;
50326
51497
  }
50327
- else {
50328
- this.customDialog.expressionsList = this.customDialog.expressionsList.filter(e => e.expression.fieldName === this.esf.column.field && e.expression.condition);
50329
- }
50330
51498
  this.customDialog.selectedOperator = eventArgs.newSelection.value;
50331
51499
  eventArgs.cancel = true;
50332
51500
  if (this.esf.overlayComponentId) {
@@ -54335,6 +55503,7 @@ class IgxExcelStyleSearchComponent {
54335
55503
  }
54336
55504
  filterTree.filteringOperands.push({
54337
55505
  condition,
55506
+ conditionName: condition.name,
54338
55507
  fieldName: this.esf.column.field,
54339
55508
  ignoreCase: this.esf.column.filteringIgnoreCase,
54340
55509
  searchVal: element.value
@@ -54350,6 +55519,7 @@ class IgxExcelStyleSearchComponent {
54350
55519
  }
54351
55520
  filterTree.filteringOperands.push({
54352
55521
  condition: this.createCondition('in'),
55522
+ conditionName: 'in',
54353
55523
  fieldName: this.esf.column.field,
54354
55524
  ignoreCase: this.esf.column.filteringIgnoreCase,
54355
55525
  searchVal: new Set(this.esf.column.dataType === GridColumnDataType.Date ?
@@ -54363,6 +55533,7 @@ class IgxExcelStyleSearchComponent {
54363
55533
  if (blanksItem) {
54364
55534
  filterTree.filteringOperands.push({
54365
55535
  condition: this.createCondition('empty'),
55536
+ conditionName: 'empty',
54366
55537
  fieldName: this.esf.column.field,
54367
55538
  ignoreCase: this.esf.column.filteringIgnoreCase,
54368
55539
  searchVal: blanksItem.value
@@ -55056,8 +56227,7 @@ class IgxGridExcelStyleFilteringComponent extends BaseFilteringComponent {
55056
56227
  this.filterValues = this.generateFilterValues();
55057
56228
  this.generateListData();
55058
56229
  this.expressionsList.forEach(expr => {
55059
- if (this.column.dataType === GridColumnDataType.String && this.column.filteringIgnoreCase &&
55060
- expr.expression.searchVal && expr.expression.searchVal instanceof Set) {
56230
+ if (this.column.dataType === GridColumnDataType.String && this.column.filteringIgnoreCase && expr.expression.searchVal) {
55061
56231
  this.modifyExpression(expr);
55062
56232
  }
55063
56233
  });
@@ -55466,8 +56636,8 @@ class IgxColumnMovingDragDirective extends IgxDragDirective {
55466
56636
  this.ghostElement.style.flexBasis = null;
55467
56637
  this.ghostElement.style.position = null;
55468
56638
  this.ghostElement.classList.remove(this.columnSelectedClass);
55469
- const icon = this.column?.grid.document.createElement('i');
55470
- const text = this.column?.grid.document.createTextNode('block');
56639
+ const icon = document.createElement('i');
56640
+ const text = document.createTextNode('block');
55471
56641
  icon.appendChild(text);
55472
56642
  icon.classList.add('material-icons');
55473
56643
  this.cms.icon = icon;
@@ -55907,7 +57077,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
55907
57077
  class IgxHeaderGroupWidthPipe {
55908
57078
  transform(width, minWidth, hasLayout) {
55909
57079
  const isFitContent = width === 'fit-content';
55910
- return hasLayout ? '' : isFitContent ? width : `${Math.max(parseFloat(width), minWidth)}px`;
57080
+ return hasLayout ? '' : isFitContent ? width : `${Math.max(parseInt(width), minWidth)}px`;
55911
57081
  }
55912
57082
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxHeaderGroupWidthPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
55913
57083
  static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: IgxHeaderGroupWidthPipe, isStandalone: true, name: "igxHeaderGroupWidth" }); }
@@ -55962,7 +57132,7 @@ class IgxColumnResizingService {
55962
57132
  * @hidden
55963
57133
  */
55964
57134
  getColumnHeaderRenderedWidth() {
55965
- return parseFloat(window.getComputedStyle(this.column.headerCell.nativeElement).width);
57135
+ return this.column.headerCell.nativeElement.getBoundingClientRect().width;
55966
57136
  }
55967
57137
  /**
55968
57138
  * @hidden
@@ -56018,9 +57188,9 @@ class IgxColumnResizingService {
56018
57188
  /**
56019
57189
  * Resizes the column regaridng to the column minWidth and maxWidth.
56020
57190
  */
56021
- resizeColumn(event, ratio = 1) {
57191
+ resizeColumn(event) {
56022
57192
  this.showResizer = false;
56023
- const diff = (event.clientX - this.startResizePos) / ratio;
57193
+ const diff = event.clientX - this.startResizePos;
56024
57194
  const colWidth = this.column.width;
56025
57195
  const isPercentageWidth = colWidth && typeof colWidth === 'string' && colWidth.indexOf('%') !== -1;
56026
57196
  let currentColWidth = parseFloat(colWidth);
@@ -56852,7 +58022,7 @@ class IgxFilteringService {
56852
58022
  newExpressionsTree.filteringOperands = [...filteringState.filteringOperands];
56853
58023
  }
56854
58024
  if (condition) {
56855
- const newExpression = { fieldName, searchVal, condition, ignoreCase };
58025
+ const newExpression = { fieldName: fieldName, searchVal, condition, conditionName: condition.name, ignoreCase };
56856
58026
  expressionsTree = new FilteringExpressionsTree(filteringState.operator, fieldName);
56857
58027
  expressionsTree.filteringOperands.push(newExpression);
56858
58028
  }
@@ -57040,7 +58210,7 @@ class IgxGridFilteringCellComponent {
57040
58210
  const chipsAreaElements = this.chipsArea.element.nativeElement.children;
57041
58211
  let visibleChipsCount = 0;
57042
58212
  const moreIconWidth = this.moreIcon.nativeElement.offsetWidth -
57043
- parseInt(this.column?.grid.document.defaultView.getComputedStyle(this.moreIcon.nativeElement)['margin-left'], 10);
58213
+ parseInt(document.defaultView.getComputedStyle(this.moreIcon.nativeElement)['margin-left'], 10);
57044
58214
  for (let index = 0; index < chipsAreaElements.length - 1; index++) {
57045
58215
  if (viewWidth + chipsAreaElements[index].offsetWidth < areaWidth) {
57046
58216
  viewWidth += chipsAreaElements[index].offsetWidth;
@@ -57048,8 +58218,8 @@ class IgxGridFilteringCellComponent {
57048
58218
  visibleChipsCount++;
57049
58219
  }
57050
58220
  else {
57051
- viewWidth += parseInt(this.column?.grid.document.defaultView.getComputedStyle(chipsAreaElements[index])['margin-left'], 10);
57052
- viewWidth += parseInt(this.column?.grid.document.defaultView.getComputedStyle(chipsAreaElements[index])['margin-right'], 10);
58221
+ viewWidth += parseInt(document.defaultView.getComputedStyle(chipsAreaElements[index])['margin-left'], 10);
58222
+ viewWidth += parseInt(document.defaultView.getComputedStyle(chipsAreaElements[index])['margin-right'], 10);
57053
58223
  }
57054
58224
  }
57055
58225
  else {
@@ -58034,7 +59204,7 @@ class IgxGridFilteringRowComponent {
58034
59204
  return;
58035
59205
  }
58036
59206
  requestAnimationFrame(() => {
58037
- const focusedElement = this.column?.grid.document.activeElement;
59207
+ const focusedElement = document.activeElement;
58038
59208
  if (focusedElement.classList.contains('igx-chip__remove')) {
58039
59209
  return;
58040
59210
  }
@@ -58116,7 +59286,7 @@ class IgxGridFilteringRowComponent {
58116
59286
  requestAnimationFrame(() => this.focusEditElement());
58117
59287
  }
58118
59288
  onChipPointerdown(args, chip) {
58119
- const activeElement = this.column?.grid.document.activeElement;
59289
+ const activeElement = document.activeElement;
58120
59290
  this._cancelChipClick = chip.selected
58121
59291
  && activeElement && this.editorFocused(activeElement);
58122
59292
  }
@@ -58269,6 +59439,7 @@ class IgxGridFilteringRowComponent {
58269
59439
  this.expression = {
58270
59440
  fieldName: this.column.field,
58271
59441
  condition: null,
59442
+ conditionName: null,
58272
59443
  searchVal: null,
58273
59444
  ignoreCase: this.column.filteringIgnoreCase
58274
59445
  };
@@ -60335,9 +61506,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
60335
61506
  * @internal
60336
61507
  */
60337
61508
  class IgxColumnResizerDirective {
60338
- get ratio() {
60339
- return this._ratio;
60340
- }
60341
61509
  constructor(element, document, zone) {
60342
61510
  this.element = element;
60343
61511
  this.document = document;
@@ -60348,10 +61516,9 @@ class IgxColumnResizerDirective {
60348
61516
  this.resizeStart = new Subject();
60349
61517
  // eslint-disable-next-line @angular-eslint/no-output-native
60350
61518
  this.resize = new Subject();
60351
- this._ratio = 1;
60352
61519
  this._destroy = new Subject();
60353
61520
  this.resizeStart.pipe(takeUntil(this._destroy), map((event) => event.clientX), switchMap((offset) => this.resize
60354
- .pipe(takeUntil(this._destroy), takeUntil(this.resizeEnd), map((event) => (event.clientX - offset) / (this._ratio)))))
61521
+ .pipe(takeUntil(this._destroy), takeUntil(this.resizeEnd), map((event) => event.clientX - offset))))
60355
61522
  .subscribe((pos) => {
60356
61523
  const left = this._left + pos;
60357
61524
  const min = this._left - this.restrictHResizeMin;
@@ -60394,12 +61561,7 @@ class IgxColumnResizerDirective {
60394
61561
  onMousedown(event) {
60395
61562
  event.preventDefault();
60396
61563
  const parent = this.element.nativeElement.parentElement.parentElement;
60397
- const parentRectWidth = parent.getBoundingClientRect().width;
60398
- const parentComputedWidth = parseFloat(window.getComputedStyle(parent).width);
60399
- if (Math.abs(parentRectWidth - parentComputedWidth) > 1) {
60400
- this._ratio = parentRectWidth / parentComputedWidth;
60401
- }
60402
- this.left = this._left = (event.clientX - parent.getBoundingClientRect().left) / this._ratio;
61564
+ this.left = this._left = event.clientX - parent.getBoundingClientRect().left;
60403
61565
  this.top = event.target.getBoundingClientRect().top - parent.getBoundingClientRect().top;
60404
61566
  this.resizeStart.next(event);
60405
61567
  }
@@ -60438,11 +61600,11 @@ class IgxGridColumnResizerComponent {
60438
61600
  this.colResizingService = colResizingService;
60439
61601
  }
60440
61602
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxGridColumnResizerComponent, deps: [{ token: IgxColumnResizingService }], target: i0.ɵɵFactoryTarget.Component }); }
60441
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxGridColumnResizerComponent, isStandalone: true, selector: "igx-grid-column-resizer", inputs: { restrictResizerTop: "restrictResizerTop" }, viewQueries: [{ propertyName: "resizer", first: true, predicate: IgxColumnResizerDirective, descendants: true, static: true }], ngImport: i0, template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event, resizer.ratio)\">\n</div>\n", dependencies: [{ kind: "directive", type: IgxColumnResizerDirective, selector: "[igxResizer]", inputs: ["restrictHResizeMin", "restrictHResizeMax", "restrictResizerTop"], outputs: ["resizeEnd", "resizeStart", "resize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
61603
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxGridColumnResizerComponent, isStandalone: true, selector: "igx-grid-column-resizer", inputs: { restrictResizerTop: "restrictResizerTop" }, viewQueries: [{ propertyName: "resizer", first: true, predicate: IgxColumnResizerDirective, descendants: true, static: true }], ngImport: i0, template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event)\">\n</div>\n", dependencies: [{ kind: "directive", type: IgxColumnResizerDirective, selector: "[igxResizer]", inputs: ["restrictHResizeMin", "restrictHResizeMax", "restrictResizerTop"], outputs: ["resizeEnd", "resizeStart", "resize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
60442
61604
  }
60443
61605
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxGridColumnResizerComponent, decorators: [{
60444
61606
  type: Component,
60445
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-column-resizer', imports: [IgxColumnResizerDirective], template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event, resizer.ratio)\">\n</div>\n" }]
61607
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-column-resizer', imports: [IgxColumnResizerDirective], template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event)\">\n</div>\n" }]
60446
61608
  }], ctorParameters: () => [{ type: IgxColumnResizingService }], propDecorators: { restrictResizerTop: [{
60447
61609
  type: Input
60448
61610
  }], resizer: [{
@@ -64172,10 +65334,6 @@ class IgxGridBaseDirective {
64172
65334
  * @hidden @internal
64173
65335
  */
64174
65336
  this.filteringPipeTrigger = 0;
64175
- /**
64176
- * @hidden @internal
64177
- */
64178
- this.isColumnWidthSum = false;
64179
65337
  /**
64180
65338
  * @hidden @internal
64181
65339
  */
@@ -64304,6 +65462,7 @@ class IgxGridBaseDirective {
64304
65462
  this._rowSelectionMode = GridSelectionMode.none;
64305
65463
  this._selectRowOnClick = true;
64306
65464
  this._columnSelectionMode = GridSelectionMode.none;
65465
+ this.isColumnWidthSum = false;
64307
65466
  this.rowEditPositioningStrategy = new RowEditPositionStrategy({
64308
65467
  horizontalDirection: HorizontalAlignment.Right,
64309
65468
  verticalDirection: VerticalAlignment.Bottom,
@@ -65348,7 +66507,7 @@ class IgxGridBaseDirective {
65348
66507
  let totalWidth = 0;
65349
66508
  let i = 0;
65350
66509
  for (i; i < cols.length; i++) {
65351
- totalWidth += parseFloat(cols[i].calcWidth) || 0;
66510
+ totalWidth += parseInt(cols[i].calcWidth, 10) || 0;
65352
66511
  }
65353
66512
  this._totalWidth = totalWidth;
65354
66513
  return totalWidth;
@@ -66113,7 +67272,7 @@ class IgxGridBaseDirective {
66113
67272
  }
66114
67273
  else {
66115
67274
  computedWidth = this.calcWidth ||
66116
- parseFloat(this.document.defaultView.getComputedStyle(this.nativeElement).getPropertyValue('width'));
67275
+ parseInt(this.document.defaultView.getComputedStyle(this.nativeElement).getPropertyValue('width'), 10);
66117
67276
  }
66118
67277
  const visibleChildColumns = this.visibleColumns.filter(c => !c.columnGroup);
66119
67278
  // Column layouts related
@@ -66132,7 +67291,7 @@ class IgxGridBaseDirective {
66132
67291
  const sumExistingWidths = columnsWithSetWidths
66133
67292
  .reduce((prev, curr) => {
66134
67293
  const colWidth = curr.width;
66135
- let widthValue = parseFloat(colWidth);
67294
+ let widthValue = parseInt(colWidth, 10);
66136
67295
  if (isNaN(widthValue)) {
66137
67296
  widthValue = MINIMUM_COLUMN_WIDTH$1;
66138
67297
  }
@@ -66146,9 +67305,9 @@ class IgxGridBaseDirective {
66146
67305
  return '0px';
66147
67306
  }
66148
67307
  computedWidth -= this.featureColumnsWidth();
66149
- const columnWidth = !Number.isFinite(sumExistingWidths) ?
67308
+ const columnWidth = Math.floor(!Number.isFinite(sumExistingWidths) ?
66150
67309
  Math.max(computedWidth / columnsToSize, this.minColumnWidth) :
66151
- Math.max((computedWidth - sumExistingWidths) / columnsToSize, this.minColumnWidth);
67310
+ Math.max((computedWidth - sumExistingWidths) / columnsToSize, this.minColumnWidth));
66152
67311
  return columnWidth + 'px';
66153
67312
  }
66154
67313
  /**
@@ -67117,11 +68276,8 @@ class IgxGridBaseDirective {
67117
68276
  width = this.nativeElement.offsetWidth;
67118
68277
  }
67119
68278
  if (this.width === null || !width) {
67120
- this.isColumnWidthSum = true;
67121
68279
  width = this.getColumnWidthSum();
67122
- }
67123
- else {
67124
- this.isColumnWidthSum = false;
68280
+ this.isColumnWidthSum = true;
67125
68281
  }
67126
68282
  if (this.hasVerticalScroll() && this.width !== null) {
67127
68283
  width -= this.scrollSize;
@@ -67140,8 +68296,8 @@ class IgxGridBaseDirective {
67140
68296
  this._columnWidth = this.width !== null ? this.getPossibleColumnWidth() : this.minColumnWidth + 'px';
67141
68297
  }
67142
68298
  this._columns.forEach((column) => {
67143
- if (this.hasColumnLayouts && parseFloat(this._columnWidth)) {
67144
- const columnWidthCombined = parseFloat(this._columnWidth) * (column.colEnd ? column.colEnd - column.colStart : 1);
68299
+ if (this.hasColumnLayouts && parseInt(this._columnWidth, 10)) {
68300
+ const columnWidthCombined = parseInt(this._columnWidth, 10) * (column.colEnd ? column.colEnd - column.colStart : 1);
67145
68301
  column.defaultWidth = columnWidthCombined + 'px';
67146
68302
  }
67147
68303
  else {
@@ -68067,7 +69223,7 @@ class IgxGridBaseDirective {
68067
69223
  get renderedActualRowHeight() {
68068
69224
  let border = 1;
68069
69225
  if (this.rowList.toArray().length > 0) {
68070
- const rowStyles = this.document.defaultView.getComputedStyle(this.rowList.first.nativeElement);
69226
+ const rowStyles = document.defaultView.getComputedStyle(this.rowList.first.nativeElement);
68071
69227
  border = rowStyles.borderBottomWidth ? Math.ceil(parseFloat(rowStyles.borderBottomWidth)) : border;
68072
69228
  }
68073
69229
  return this.rowHeight + border;
@@ -74660,11 +75816,11 @@ class IgxPivotGridColumnResizerComponent extends IgxGridColumnResizerComponent {
74660
75816
  this.colResizingService = colResizingService;
74661
75817
  }
74662
75818
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxPivotGridColumnResizerComponent, deps: [{ token: IgxPivotColumnResizingService }], target: i0.ɵɵFactoryTarget.Component }); }
74663
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxPivotGridColumnResizerComponent, isStandalone: true, selector: "igx-pivot-grid-column-resizer", usesInheritance: true, ngImport: i0, template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event, resizer.ratio)\">\n</div>\n", dependencies: [{ kind: "directive", type: IgxColumnResizerDirective, selector: "[igxResizer]", inputs: ["restrictHResizeMin", "restrictHResizeMax", "restrictResizerTop"], outputs: ["resizeEnd", "resizeStart", "resize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
75819
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: IgxPivotGridColumnResizerComponent, isStandalone: true, selector: "igx-pivot-grid-column-resizer", usesInheritance: true, ngImport: i0, template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event)\">\n</div>\n", dependencies: [{ kind: "directive", type: IgxColumnResizerDirective, selector: "[igxResizer]", inputs: ["restrictHResizeMin", "restrictHResizeMax", "restrictResizerTop"], outputs: ["resizeEnd", "resizeStart", "resize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
74664
75820
  }
74665
75821
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxPivotGridColumnResizerComponent, decorators: [{
74666
75822
  type: Component,
74667
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-pivot-grid-column-resizer', imports: [IgxColumnResizerDirective], template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event, resizer.ratio)\">\n</div>\n" }]
75823
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-pivot-grid-column-resizer', imports: [IgxColumnResizerDirective], template: "<div class=\"igx-grid-th__resize-line\"\n [style.left.px]=\"-99999\" igxResizer\n [style.height.px]=\"colResizingService.resizerHeight\"\n [restrictHResizeMax]=\"colResizingService.restrictResizeMax\"\n [restrictHResizeMin]=\"colResizingService.restrictResizeMin\"\n [restrictResizerTop]=\"restrictResizerTop\"\n (resizeEnd)=\"colResizingService.resizeColumn($event)\">\n</div>\n" }]
74668
75824
  }], ctorParameters: () => [{ type: IgxPivotColumnResizingService }] });
74669
75825
 
74670
75826
  class DefaultPivotGridRecordSortingStrategy extends DefaultSortingStrategy {
@@ -78432,7 +79588,7 @@ class IgxGridStateBaseDirective {
78432
79588
  expr.searchVal = new Set(expr.searchVal);
78433
79589
  }
78434
79590
  else {
78435
- expr.searchVal = expr.searchVal && (dataType === 'date' || dataType === 'dateTime') ? new Date(Date.parse(expr.searchVal)) : expr.searchVal;
79591
+ expr.searchVal = expr.searchVal && (dataType === 'date' || dataType === 'dateTime') ? new Date(Date.parse(expr.searchVal.toString())) : expr.searchVal;
78436
79592
  }
78437
79593
  const condition = this.generateFilteringCondition(dataType, expr.condition.name) ||
78438
79594
  this.currGrid.columns.find(c => c.field === expr.fieldName).filters.condition(expr.condition.name);
@@ -83455,7 +84611,6 @@ class IgxHierarchicalGridBaseDirective extends IgxGridBaseDirective {
83455
84611
  const columns = [];
83456
84612
  const topLevelCols = cols.filter(c => c.level === 0);
83457
84613
  topLevelCols.forEach((col) => {
83458
- col.grid = this;
83459
84614
  const ref = this._createColumn(col);
83460
84615
  ref.changeDetectorRef.detectChanges();
83461
84616
  columns.push(ref.instance);
@@ -83750,7 +84905,7 @@ class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective {
83750
84905
  set expandChildren(value) {
83751
84906
  this._defaultExpandState = value;
83752
84907
  this.rowIslandAPI.getChildGrids().forEach((grid) => {
83753
- if (this.document.body.contains(grid.nativeElement)) {
84908
+ if (document.body.contains(grid.nativeElement)) {
83754
84909
  // Detect changes right away if the grid is visible
83755
84910
  grid.expandChildren = value;
83756
84911
  grid.cdr.detectChanges();
@@ -83995,7 +85150,7 @@ class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective {
83995
85150
  this.updateColumns(this._childColumns);
83996
85151
  this.rowIslandAPI.getChildGrids().forEach((grid) => {
83997
85152
  grid.createColumnsList(this._childColumns);
83998
- if (!this.document.body.contains(grid.nativeElement)) {
85153
+ if (!document.body.contains(grid.nativeElement)) {
83999
85154
  grid.updateOnRender = true;
84000
85155
  }
84001
85156
  });
@@ -93084,7 +94239,7 @@ class IgxDateRangePickerComponent extends PickerBaseDirective {
93084
94239
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.0", type: IgxDateRangePickerComponent, isStandalone: true, selector: "igx-date-range-picker", inputs: { displayMonthsCount: "displayMonthsCount", hideOutsideDays: ["hideOutsideDays", "hideOutsideDays", booleanAttribute], formatter: "formatter", doneButtonText: "doneButtonText", overlaySettings: "overlaySettings", displayFormat: "displayFormat", inputFormat: "inputFormat", minValue: "minValue", maxValue: "maxValue", resourceStrings: "resourceStrings", placeholder: "placeholder", outlet: "outlet", showWeekNumbers: ["showWeekNumbers", "showWeekNumbers", booleanAttribute], locale: "locale", value: "value" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "class.igx-date-range-picker": "this.cssClass" } }, providers: [
93085
94240
  { provide: NG_VALUE_ACCESSOR, useExisting: IgxDateRangePickerComponent, multi: true },
93086
94241
  { provide: NG_VALIDATORS, useExisting: IgxDateRangePickerComponent, multi: true }
93087
- ], queries: [{ propertyName: "label", first: true, predicate: IgxLabelDirective, descendants: true }, { propertyName: "pickerActions", first: true, predicate: IgxPickerActionsDirective, descendants: true }, { propertyName: "dateSeparatorTemplate", first: true, predicate: IgxDateRangeSeparatorDirective, descendants: true, read: TemplateRef }, { propertyName: "projectedInputs", predicate: IgxDateRangeInputsBaseComponent }], viewQueries: [{ propertyName: "viewContainerRef", first: true, predicate: IgxInputGroupComponent, descendants: true, read: ViewContainerRef }, { propertyName: "inputDirective", first: true, predicate: IgxInputDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"hasProjectedInputs ? startEndTemplate : defTemplate\"></ng-container>\n\n<ng-template #singleTemplate>\n <div (click)=\"open()\" class=\"content-wrap\">\n <ng-content select=\"igx-date-single\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #startEndTemplate>\n <ng-content select=\"igx-date-range-start\"></ng-content>\n <div [className]=\"separatorClass\">\n <ng-container *ngTemplateOutlet=\"dateSeparatorTemplate || defDateSeparatorTemplate;\">\n </ng-container>\n </div>\n <ng-content select=\"igx-date-range-end\"></ng-content>\n</ng-template>\n\n<ng-template #defIcon>\n <igx-icon family=\"default\" name=\"date_range\" [attr.aria-hidden]=\"true\"></igx-icon>\n</ng-template>\n\n<ng-template #defDateSeparatorTemplate>{{ dateSeparator }}</ng-template>\n\n<ng-template #defTemplate>\n <igx-input-group [type]=\"type\" (click)=\"open()\">\n <!-- only set mask placeholder when empty, otherwise input group might use it as label if none is set -->\n <input #singleInput igxInput type=\"text\" readonly [disabled]=\"disabled\" [placeholder]=\"value ? '' : singleInputFormat\"\n role=\"combobox\" aria-haspopup=\"grid\" [attr.aria-expanded]=\"!collapsed\" [attr.aria-labelledby]=\"label?.id\"\n [value]=\"value | dateRange: appliedFormat : locale : formatter\" />\n\n <igx-prefix *ngIf=\"!toggleComponents.length\">\n <ng-container *ngTemplateOutlet=\"defIcon\"></ng-container>\n </igx-prefix>\n\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n </ng-container>\n </igx-input-group>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "pipe", type: DateRangePickerFormatPipe, name: "dateRange" }] }); }
94242
+ ], queries: [{ propertyName: "label", first: true, predicate: IgxLabelDirective, descendants: true }, { propertyName: "pickerActions", first: true, predicate: IgxPickerActionsDirective, descendants: true }, { propertyName: "dateSeparatorTemplate", first: true, predicate: IgxDateRangeSeparatorDirective, descendants: true, read: TemplateRef }, { propertyName: "projectedInputs", predicate: IgxDateRangeInputsBaseComponent }], viewQueries: [{ propertyName: "viewContainerRef", first: true, predicate: IgxInputGroupComponent, descendants: true, read: ViewContainerRef }, { propertyName: "inputDirective", first: true, predicate: IgxInputDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"hasProjectedInputs ? startEndTemplate : defTemplate\"></ng-container>\n\n<ng-template #singleTemplate>\n <div (click)=\"open()\" class=\"content-wrap\">\n <ng-content select=\"igx-date-single\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #startEndTemplate>\n <ng-content select=\"igx-date-range-start\"></ng-content>\n <div [className]=\"separatorClass\">\n <ng-container *ngTemplateOutlet=\"dateSeparatorTemplate || defDateSeparatorTemplate;\">\n </ng-container>\n </div>\n <ng-content select=\"igx-date-range-end\"></ng-content>\n</ng-template>\n\n<ng-template #defIcon>\n <igx-icon family=\"default\" name=\"date_range\"></igx-icon>\n</ng-template>\n\n<ng-template #defDateSeparatorTemplate>{{ dateSeparator }}</ng-template>\n\n<ng-template #defTemplate>\n <igx-input-group [type]=\"type\" (click)=\"open()\">\n <!-- only set mask placeholder when empty, otherwise input group might use it as label if none is set -->\n <input #singleInput igxInput type=\"text\" readonly [disabled]=\"disabled\" [placeholder]=\"value ? '' : singleInputFormat\"\n role=\"combobox\" aria-haspopup=\"grid\" [attr.aria-expanded]=\"!collapsed\" [attr.aria-labelledby]=\"label?.id\"\n [value]=\"value | dateRange: appliedFormat : locale : formatter\" />\n\n <igx-prefix *ngIf=\"!toggleComponents.length\">\n <ng-container *ngTemplateOutlet=\"defIcon\"></ng-container>\n </igx-prefix>\n\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n </ng-container>\n </igx-input-group>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "pipe", type: DateRangePickerFormatPipe, name: "dateRange" }] }); }
93088
94243
  }
93089
94244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxDateRangePickerComponent, decorators: [{
93090
94245
  type: Component,
@@ -93099,7 +94254,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
93099
94254
  IgxInputDirective,
93100
94255
  IgxPrefixDirective,
93101
94256
  DateRangePickerFormatPipe
93102
- ], template: "<ng-container *ngTemplateOutlet=\"hasProjectedInputs ? startEndTemplate : defTemplate\"></ng-container>\n\n<ng-template #singleTemplate>\n <div (click)=\"open()\" class=\"content-wrap\">\n <ng-content select=\"igx-date-single\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #startEndTemplate>\n <ng-content select=\"igx-date-range-start\"></ng-content>\n <div [className]=\"separatorClass\">\n <ng-container *ngTemplateOutlet=\"dateSeparatorTemplate || defDateSeparatorTemplate;\">\n </ng-container>\n </div>\n <ng-content select=\"igx-date-range-end\"></ng-content>\n</ng-template>\n\n<ng-template #defIcon>\n <igx-icon family=\"default\" name=\"date_range\" [attr.aria-hidden]=\"true\"></igx-icon>\n</ng-template>\n\n<ng-template #defDateSeparatorTemplate>{{ dateSeparator }}</ng-template>\n\n<ng-template #defTemplate>\n <igx-input-group [type]=\"type\" (click)=\"open()\">\n <!-- only set mask placeholder when empty, otherwise input group might use it as label if none is set -->\n <input #singleInput igxInput type=\"text\" readonly [disabled]=\"disabled\" [placeholder]=\"value ? '' : singleInputFormat\"\n role=\"combobox\" aria-haspopup=\"grid\" [attr.aria-expanded]=\"!collapsed\" [attr.aria-labelledby]=\"label?.id\"\n [value]=\"value | dateRange: appliedFormat : locale : formatter\" />\n\n <igx-prefix *ngIf=\"!toggleComponents.length\">\n <ng-container *ngTemplateOutlet=\"defIcon\"></ng-container>\n </igx-prefix>\n\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n </ng-container>\n </igx-input-group>\n</ng-template>\n" }]
94257
+ ], template: "<ng-container *ngTemplateOutlet=\"hasProjectedInputs ? startEndTemplate : defTemplate\"></ng-container>\n\n<ng-template #singleTemplate>\n <div (click)=\"open()\" class=\"content-wrap\">\n <ng-content select=\"igx-date-single\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #startEndTemplate>\n <ng-content select=\"igx-date-range-start\"></ng-content>\n <div [className]=\"separatorClass\">\n <ng-container *ngTemplateOutlet=\"dateSeparatorTemplate || defDateSeparatorTemplate;\">\n </ng-container>\n </div>\n <ng-content select=\"igx-date-range-end\"></ng-content>\n</ng-template>\n\n<ng-template #defIcon>\n <igx-icon family=\"default\" name=\"date_range\"></igx-icon>\n</ng-template>\n\n<ng-template #defDateSeparatorTemplate>{{ dateSeparator }}</ng-template>\n\n<ng-template #defTemplate>\n <igx-input-group [type]=\"type\" (click)=\"open()\">\n <!-- only set mask placeholder when empty, otherwise input group might use it as label if none is set -->\n <input #singleInput igxInput type=\"text\" readonly [disabled]=\"disabled\" [placeholder]=\"value ? '' : singleInputFormat\"\n role=\"combobox\" aria-haspopup=\"grid\" [attr.aria-expanded]=\"!collapsed\" [attr.aria-labelledby]=\"label?.id\"\n [value]=\"value | dateRange: appliedFormat : locale : formatter\" />\n\n <igx-prefix *ngIf=\"!toggleComponents.length\">\n <ng-container *ngTemplateOutlet=\"defIcon\"></ng-container>\n </igx-prefix>\n\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n </ng-container>\n </igx-input-group>\n</ng-template>\n" }]
93103
94258
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
93104
94259
  type: Inject,
93105
94260
  args: [LOCALE_ID]
@@ -93195,7 +94350,8 @@ const IGX_TREE_DIRECTIVES = [
93195
94350
  /* NOTE: Query builder directives collection for ease-of-use import in standalone components scenario */
93196
94351
  const IGX_QUERY_BUILDER_DIRECTIVES = [
93197
94352
  IgxQueryBuilderComponent,
93198
- IgxQueryBuilderHeaderComponent
94353
+ IgxQueryBuilderHeaderComponent,
94354
+ IgxQueryBuilderSearchValueTemplateDirective,
93199
94355
  ];
93200
94356
 
93201
94357
  /**
@@ -94090,7 +95246,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
94090
95246
  */
94091
95247
  class IgxQueryBuilderModule {
94092
95248
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
94093
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderModule, imports: [IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent], exports: [IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent] }); }
95249
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderModule, imports: [IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxQueryBuilderSearchValueTemplateDirective], exports: [IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxQueryBuilderSearchValueTemplateDirective] }); }
94094
95250
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderModule, imports: [IgxQueryBuilderComponent] }); }
94095
95251
  }
94096
95252
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: IgxQueryBuilderModule, decorators: [{
@@ -94373,5 +95529,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
94373
95529
  * Generated bundle index. Do not edit.
94374
95530
  */
94375
95531
 
94376
- export { AbsolutePosition, AbsoluteScrollStrategy, ActionStripResourceStringsEN, AutoPositionStrategy, BannerResourceStringsEN, BaseFilteringStrategy, BlockScrollStrategy, ButtonGroupAlignment, CachedDataCloneStrategy, Calendar, CalendarResourceStringsEN, CalendarSelection, CarouselAnimationType, CarouselHammerConfig, CarouselIndicatorsOrientation, CarouselResourceStringsEN, ChipResourceStringsEN, CloseScrollStrategy, ColumnDisplayOrder, ColumnPinningPosition, ComboResourceStringsEN, ConnectedPositioningStrategy, ContainerPositionStrategy, CsvFileTypes, DEFAULT_OWNER, DEFAULT_PIVOT_KEYS, DataType, DataUtil, DatePart, DatePickerResourceStringsEN, DateRangePickerFormatPipe, DateRangePickerResourceStringsEN, DateRangeType, DefaultDataCloneStrategy, DefaultPivotGridRecordSortingStrategy, DefaultPivotSortingStrategy, DefaultSortingStrategy, DimensionValuesFilteringStrategy, Direction, DragDirection, ElasticPositionStrategy, ExpansionPanelHeaderIconPosition, ExportHeaderType, ExportRecordType, ExpressionsTreeUtil, FilterMode, FilterUtil, FilteringExpressionsTree, FilteringExpressionsTreeType, FilteringLogic, FilteringStrategy, FormattedValuesFilteringStrategy, FormattedValuesSortingStrategy, GRID_LEVEL_COL, GRID_PARENT, GRID_ROOT_SUMMARY, GlobalPositionStrategy, GridColumnDataType, GridPagingMode, GridResourceStringsEN, GridSelectionMode, GridSummaryCalculationMode, GridSummaryPosition, GroupMemberCountSortingStrategy, GroupedRecords, HorizontalAlignment, HorizontalAnimationType, IGX_ACCORDION_DIRECTIVES, IGX_ACTION_STRIP_DIRECTIVES, IGX_BANNER_DIRECTIVES, IGX_BOTTOM_NAV_DIRECTIVES, IGX_BUTTON_GROUP_DIRECTIVES, IGX_CALENDAR_DIRECTIVES, IGX_CALENDAR_VIEW_ITEM, IGX_CARD_DIRECTIVES, IGX_CAROUSEL_DIRECTIVES, IGX_CHIPS_DIRECTIVES, IGX_CIRCULAR_PROGRESS_BAR_DIRECTIVES, IGX_COMBO_DIRECTIVES, IGX_DATE_PICKER_DIRECTIVES, IGX_DATE_RANGE_PICKER_DIRECTIVES, IGX_DIALOG_DIRECTIVES, IGX_DRAG_DROP_DIRECTIVES, IGX_DROP_DOWN_DIRECTIVES, IGX_EXPANSION_PANEL_DIRECTIVES, IGX_GRID_ACTION_STRIP_DIRECTIVES, IGX_GRID_BASE, IGX_GRID_COMMON_DIRECTIVES, IGX_GRID_DIRECTIVES, IGX_GRID_SERVICE_BASE, IGX_GRID_VALIDATION_DIRECTIVES, IGX_HIERARCHICAL_GRID_DIRECTIVES, IGX_INPUT_GROUP_DIRECTIVES, IGX_INPUT_GROUP_TYPE, IGX_LINEAR_PROGRESS_BAR_DIRECTIVES, IGX_LIST_DIRECTIVES, IGX_NAVBAR_DIRECTIVES, IGX_NAVIGATION_DRAWER_DIRECTIVES, IGX_PAGINATOR_DIRECTIVES, IGX_PIVOT_GRID_DIRECTIVES, IGX_PROGRESS_BAR_DIRECTIVES, IGX_QUERY_BUILDER_DIRECTIVES, IGX_RADIO_GROUP_DIRECTIVES, IGX_SELECT_DIRECTIVES, IGX_SIMPLE_COMBO_DIRECTIVES, IGX_SLIDER_DIRECTIVES, IGX_SPLITTER_DIRECTIVES, IGX_STEPPER_DIRECTIVES, IGX_TABS_DIRECTIVES, IGX_TIME_PICKER_DIRECTIVES, IGX_TOOLTIP_DIRECTIVES, IGX_TREE_DIRECTIVES, IGX_TREE_GRID_DIRECTIVES, ITreeGridAggregation, IgcFormControlDirective, IgcFormsModule, IgxAccordionComponent, IgxAccordionModule, IgxActionStripComponent, IgxActionStripMenuItemDirective, IgxActionStripModule, IgxAdvancedFilteringDialogComponent, IgxAppendDropStrategy, IgxAutocompleteDirective, IgxAutocompleteModule, IgxAvatarComponent, IgxAvatarModule, IgxAvatarSize, IgxAvatarType, IgxBadgeComponent, IgxBadgeModule, IgxBadgeType, IgxBannerActionsDirective, IgxBannerComponent, IgxBannerModule, IgxBaseExporter, IgxBaseTransactionService, IgxBooleanFilteringOperand, IgxBottomNavComponent, IgxBottomNavContentComponent, IgxBottomNavHeaderComponent, IgxBottomNavHeaderIconDirective, IgxBottomNavHeaderLabelDirective, IgxBottomNavItemComponent, IgxBottomNavModule, IgxButtonDirective, IgxButtonGroupComponent, IgxButtonGroupModule, IgxButtonModule, IgxCSVTextDirective, IgxCalendarComponent, IgxCalendarHeaderTemplateDirective, IgxCalendarHeaderTitleTemplateDirective, IgxCalendarModule, IgxCalendarMonthDirective, IgxCalendarScrollPageDirective, IgxCalendarSubheaderTemplateDirective, IgxCalendarView, IgxCalendarViewBaseDirective, IgxCalendarYearDirective, IgxCardActionsComponent, IgxCardActionsLayout, IgxCardComponent, IgxCardContentDirective, IgxCardFooterDirective, IgxCardHeaderComponent, IgxCardHeaderSubtitleDirective, IgxCardHeaderTitleDirective, IgxCardMediaDirective, IgxCardModule, IgxCardThumbnailDirective, IgxCarouselComponent, IgxCarouselIndicatorDirective, IgxCarouselModule, IgxCarouselNextButtonDirective, IgxCarouselPrevButtonDirective, IgxCellEditorTemplateDirective, IgxCellFooterTemplateDirective, IgxCellHeaderTemplateDirective, IgxCellTemplateDirective, IgxCellValidationErrorDirective, IgxCheckboxComponent, IgxCheckboxModule, IgxChildGridRowComponent, IgxChipComponent, IgxChipTypeVariant, IgxChipsAreaComponent, IgxChipsModule, IgxCircularProgressBarComponent, IgxCollapsibleIndicatorTemplateDirective, IgxColumPatternValidatorDirective, IgxColumnActionsBaseDirective, IgxColumnActionsComponent, IgxColumnComponent, IgxColumnEmailValidatorDirective, IgxColumnGroupComponent, IgxColumnHidingDirective, IgxColumnLayoutComponent, IgxColumnMaxLengthValidatorDirective, IgxColumnMaxValidatorDirective, IgxColumnMinLengthValidatorDirective, IgxColumnMinValidatorDirective, IgxColumnPinningDirective, IgxColumnRequiredValidatorDirective, IgxComboAddItemDirective, IgxComboClearIconDirective, IgxComboComponent, IgxComboEmptyDirective, IgxComboFooterDirective, IgxComboHeaderDirective, IgxComboHeaderItemDirective, IgxComboItemDirective, IgxComboModule, IgxComboToggleIconDirective, IgxCsvExporterOptions, IgxCsvExporterService, IgxDataLoadingTemplateDirective, IgxDataRecordSorting, IgxDateFilteringOperand, IgxDatePickerComponent, IgxDatePickerModule, IgxDateRangeEndComponent, IgxDateRangeInputsBaseComponent, IgxDateRangePickerComponent, IgxDateRangePickerModule, IgxDateRangeSeparatorDirective, IgxDateRangeStartComponent, IgxDateSummaryOperand, IgxDateTimeEditorDirective, IgxDateTimeEditorModule, IgxDateTimeFilteringOperand, IgxDaysViewComponent, IgxDefaultDropStrategy, IgxDialogActionsDirective, IgxDialogComponent, IgxDialogModule, IgxDialogTitleDirective, IgxDividerDirective, IgxDividerModule, IgxDividerType, IgxDragDirective, IgxDragDropModule, IgxDragHandleDirective, IgxDragIgnoreDirective, IgxDragIndicatorIconDirective, IgxDragLocation, IgxDropDirective, IgxDropDownComponent, IgxDropDownGroupComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, IgxDropDownModule, IgxEmptyListTemplateDirective, IgxExcelExporterOptions, IgxExcelExporterService, IgxExcelStyleClearFiltersComponent, IgxExcelStyleColumnOperationsTemplateDirective, IgxExcelStyleConditionalFilterComponent, IgxExcelStyleDateExpressionComponent, IgxExcelStyleFilterOperationsTemplateDirective, IgxExcelStyleHeaderComponent, IgxExcelStyleHeaderIconDirective, IgxExcelStyleHidingComponent, IgxExcelStyleLoadingValuesTemplateDirective, IgxExcelStyleMovingComponent, IgxExcelStylePinningComponent, IgxExcelStyleSearchComponent, IgxExcelStyleSelectingComponent, IgxExcelStyleSortingComponent, IgxExcelTextDirective, IgxExpansionPanelBodyComponent, IgxExpansionPanelComponent, IgxExpansionPanelDescriptionDirective, IgxExpansionPanelHeaderComponent, IgxExpansionPanelIconDirective, IgxExpansionPanelModule, IgxExpansionPanelTitleDirective, IgxExporterOptionsBase, IgxFilterCellTemplateDirective, IgxFilterDirective, IgxFilterModule, IgxFilterOptions, IgxFilterPipe, IgxFilteringOperand, IgxFlatTransactionFactory, IgxFlexDirective, IgxFocusDirective, IgxFocusModule, IgxFocusTrapDirective, IgxFocusTrapModule, IgxForOfContext, IgxForOfDirective, IgxForOfModule, IgxGridActionButtonComponent, IgxGridActionsBaseDirective, IgxGridCell, IgxGridComponent, IgxGridDetailTemplateDirective, IgxGridEditingActionsComponent, IgxGridExcelStyleFilteringComponent, IgxGridFooterComponent, IgxGridForOfContext, IgxGridForOfDirective, IgxGridHeaderComponent, IgxGridHeaderGroupComponent, IgxGridHeaderRowComponent, IgxGridModule, IgxGridPinningActionsComponent, IgxGridRow, IgxGridStateDirective, IgxGridToolbarActionsComponent, IgxGridToolbarAdvancedFilteringComponent, IgxGridToolbarComponent, IgxGridToolbarDirective, IgxGridToolbarExporterComponent, IgxGridToolbarHidingComponent, IgxGridToolbarPinningComponent, IgxGridToolbarTitleComponent, IgxGridTransaction, IgxGroupAreaDropDirective, IgxGroupByRow, IgxGroupByRowSelectorDirective, IgxGroupByRowTemplateDirective, IgxGroupedTreeGridSorting, IgxGrouping, IgxHeadSelectorDirective, IgxHeaderCollapsedIndicatorDirective, IgxHeaderExpandedIndicatorDirective, IgxHierarchicalGridComponent, IgxHierarchicalGridModule, IgxHierarchicalGridRow, IgxHierarchicalTransactionFactory, IgxHierarchicalTransactionService, IgxHintDirective, IgxIconButtonDirective, IgxIconComponent, IgxIconModule, IgxIconService, IgxInputDirective, IgxInputGroupComponent, IgxInputGroupModule, IgxInputState, IgxInsertDropStrategy, IgxItemListDirective, IgxLabelDirective, IgxLayoutDirective, IgxLayoutModule, IgxLinearProgressBarComponent, IgxListActionDirective, IgxListBaseDirective, IgxListComponent, IgxListItemComponent, IgxListItemLeftPanningTemplateDirective, IgxListItemRightPanningTemplateDirective, IgxListLineDirective, IgxListLineSubTitleDirective, IgxListLineTitleDirective, IgxListModule, IgxListPanState, IgxListThumbnailDirective, IgxMaskDirective, IgxMaskModule, IgxMonthPickerComponent, IgxMonthsViewComponent, IgxNavDrawerItemDirective, IgxNavDrawerMiniTemplateDirective, IgxNavDrawerTemplateDirective, IgxNavbarActionDirective, IgxNavbarComponent, IgxNavbarModule, IgxNavbarTitleDirective, IgxNavigationCloseDirective, IgxNavigationDrawerComponent, IgxNavigationDrawerModule, IgxNavigationService, IgxNavigationToggleDirective, IgxNumberFilteringOperand, IgxNumberSummaryOperand, IgxOverlayOutletDirective, IgxOverlayService, IgxPageNavigationComponent, IgxPageSizeSelectorComponent, IgxPaginatorComponent, IgxPaginatorContentDirective, IgxPaginatorDirective, IgxPaginatorModule, IgxPickerActionsDirective, IgxPickerClearComponent, IgxPickerToggleComponent, IgxPivotAggregate, IgxPivotDataSelectorComponent, IgxPivotDateAggregate, IgxPivotDateDimension, IgxPivotGridComponent, IgxPivotGridModule, IgxPivotNumericAggregate, IgxPivotRowDimensionHeaderTemplateDirective, IgxPivotTimeAggregate, IgxPivotValueChipTemplateDirective, IgxPrefixDirective, IgxPrependDropStrategy, IgxProgressBarGradientDirective, IgxProgressBarModule, IgxProgressBarTextTemplateDirective, IgxProgressType, IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxQueryBuilderModule, IgxRadioComponent, IgxRadioGroupDirective, IgxRadioModule, IgxRippleDirective, IgxRippleModule, IgxRowAddTextDirective, IgxRowCollapsedIndicatorDirective, IgxRowDirective, IgxRowDragGhostDirective, IgxRowEditActionsDirective, IgxRowEditTabStopDirective, IgxRowEditTextDirective, IgxRowExpandedIndicatorDirective, IgxRowIslandComponent, IgxRowSelectorDirective, IgxScrollInertiaDirective, IgxScrollInertiaModule, IgxSelectComponent, IgxSelectFooterDirective, IgxSelectGroupComponent, IgxSelectHeaderDirective, IgxSelectItemComponent, IgxSelectModule, IgxSelectToggleIconDirective, IgxSimpleComboComponent, IgxSimpleComboModule, IgxSlideComponent, IgxSliderComponent, IgxSliderModule, IgxSliderType, IgxSnackbarComponent, IgxSnackbarModule, IgxSortAscendingHeaderIconDirective, IgxSortDescendingHeaderIconDirective, IgxSortHeaderIconDirective, IgxSorting, IgxSplitBarComponent, IgxSplitterComponent, IgxSplitterModule, IgxSplitterPaneComponent, IgxStepActiveIndicatorDirective, IgxStepCompletedIndicatorDirective, IgxStepComponent, IgxStepContentDirective, IgxStepIndicatorDirective, IgxStepInvalidIndicatorDirective, IgxStepSubtitleDirective, IgxStepTitleDirective, IgxStepType, IgxStepperComponent, IgxStepperModule, IgxStepperOrientation, IgxStepperTitlePosition, IgxStringFilteringOperand, IgxSuffixDirective, IgxSummaryOperand, IgxSummaryRow, IgxSummaryTemplateDirective, IgxSwitchComponent, IgxSwitchModule, IgxTabContentComponent, IgxTabHeaderComponent, IgxTabHeaderIconDirective, IgxTabHeaderLabelDirective, IgxTabItemComponent, IgxTabsAlignment, IgxTabsComponent, IgxTabsModule, IgxTemplateOutletDirective, IgxTextAlign, IgxTextHighlightDirective, IgxTextHighlightModule, IgxTextHighlightService, IgxTextSelectionDirective, IgxTextSelectionModule, IgxThumbFromTemplateDirective, IgxThumbToTemplateDirective, IgxTickLabelTemplateDirective, IgxTimeFilteringOperand, IgxTimeItemDirective, IgxTimePickerComponent, IgxTimePickerModule, IgxTimeSummaryOperand, IgxToastComponent, IgxToastModule, IgxToggleActionDirective, IgxToggleDirective, IgxToggleModule, IgxTooltipDirective, IgxTooltipModule, IgxTooltipTargetDirective, IgxTransactionService, IgxTreeComponent, IgxTreeExpandIndicatorDirective, IgxTreeGridComponent, IgxTreeGridGroupByAreaComponent, IgxTreeGridGroupingPipe, IgxTreeGridModule, IgxTreeGridRow, IgxTreeModule, IgxTreeNodeComponent, IgxTreeNodeLinkDirective, IgxTreeSelectionType, IgxYearsViewComponent, IndigoIcons, InputResourceStringsEN, LabelPosition, ListResourceStringsEN, NoOpScrollStrategy, NoopFilteringStrategy, NoopPivotDimensionsStrategy, NoopSortingStrategy, PaginatorResourceStringsEN, PagingError, PickerInteractionMode, PivotColumnDimensionsStrategy, PivotDimensionType, PivotRowDimensionsStrategy, PivotRowLayoutType, PivotSummaryPosition, Point, QueryBuilderResourceStringsEN, RadioGroupAlignment, RelativePosition, RelativePositionStrategy, RowPinningPosition, ScrollStrategy, Size, SliderHandle, SortingDirection, SplitterType, THEME_TOKEN, ThemeToken, TickLabelsOrientation, TicksOrientation, TimePickerResourceStringsEN, TransactionEventOrigin, TransactionType, TreeGridFilteringStrategy, TreeGridFormattedValuesFilteringStrategy, TreeGridMatchingRecordsOnlyFilteringStrategy, TreeResourceStringsEN, VerticalAlignment, VerticalAnimationType, WEEKDAYS, changei18n, comboIgnoreDiacriticsFilter, igxI18N, isLeap, monthRange, range, weekDay };
95532
+ export { AbsolutePosition, AbsoluteScrollStrategy, ActionStripResourceStringsEN, AutoPositionStrategy, BannerResourceStringsEN, BaseFilteringStrategy, BlockScrollStrategy, ButtonGroupAlignment, CachedDataCloneStrategy, Calendar, CalendarResourceStringsEN, CalendarSelection, CarouselAnimationType, CarouselHammerConfig, CarouselIndicatorsOrientation, CarouselResourceStringsEN, ChipResourceStringsEN, CloseScrollStrategy, ColumnDisplayOrder, ColumnPinningPosition, ComboResourceStringsEN, ConnectedPositioningStrategy, ContainerPositionStrategy, CsvFileTypes, DEFAULT_OWNER, DEFAULT_PIVOT_KEYS, DataType, DataUtil, DatePart, DatePickerResourceStringsEN, DateRangePickerFormatPipe, DateRangePickerResourceStringsEN, DateRangeType, DefaultDataCloneStrategy, DefaultPivotGridRecordSortingStrategy, DefaultPivotSortingStrategy, DefaultSortingStrategy, DimensionValuesFilteringStrategy, Direction, DragDirection, ElasticPositionStrategy, ExpansionPanelHeaderIconPosition, ExportHeaderType, ExportRecordType, ExpressionsTreeUtil, FilterMode, FilterUtil, FilteringExpressionsTree, FilteringExpressionsTreeType, FilteringLogic, FilteringStrategy, FormattedValuesFilteringStrategy, FormattedValuesSortingStrategy, GRID_LEVEL_COL, GRID_PARENT, GRID_ROOT_SUMMARY, GlobalPositionStrategy, GridColumnDataType, GridPagingMode, GridResourceStringsEN, GridSelectionMode, GridSummaryCalculationMode, GridSummaryPosition, GroupMemberCountSortingStrategy, GroupedRecords, HorizontalAlignment, HorizontalAnimationType, IGX_ACCORDION_DIRECTIVES, IGX_ACTION_STRIP_DIRECTIVES, IGX_BANNER_DIRECTIVES, IGX_BOTTOM_NAV_DIRECTIVES, IGX_BUTTON_GROUP_DIRECTIVES, IGX_CALENDAR_DIRECTIVES, IGX_CALENDAR_VIEW_ITEM, IGX_CARD_DIRECTIVES, IGX_CAROUSEL_DIRECTIVES, IGX_CHIPS_DIRECTIVES, IGX_CIRCULAR_PROGRESS_BAR_DIRECTIVES, IGX_COMBO_DIRECTIVES, IGX_DATE_PICKER_DIRECTIVES, IGX_DATE_RANGE_PICKER_DIRECTIVES, IGX_DIALOG_DIRECTIVES, IGX_DRAG_DROP_DIRECTIVES, IGX_DROP_DOWN_DIRECTIVES, IGX_EXPANSION_PANEL_DIRECTIVES, IGX_GRID_ACTION_STRIP_DIRECTIVES, IGX_GRID_BASE, IGX_GRID_COMMON_DIRECTIVES, IGX_GRID_DIRECTIVES, IGX_GRID_SERVICE_BASE, IGX_GRID_VALIDATION_DIRECTIVES, IGX_HIERARCHICAL_GRID_DIRECTIVES, IGX_INPUT_GROUP_DIRECTIVES, IGX_INPUT_GROUP_TYPE, IGX_LINEAR_PROGRESS_BAR_DIRECTIVES, IGX_LIST_DIRECTIVES, IGX_NAVBAR_DIRECTIVES, IGX_NAVIGATION_DRAWER_DIRECTIVES, IGX_PAGINATOR_DIRECTIVES, IGX_PIVOT_GRID_DIRECTIVES, IGX_PROGRESS_BAR_DIRECTIVES, IGX_QUERY_BUILDER_DIRECTIVES, IGX_RADIO_GROUP_DIRECTIVES, IGX_SELECT_DIRECTIVES, IGX_SIMPLE_COMBO_DIRECTIVES, IGX_SLIDER_DIRECTIVES, IGX_SPLITTER_DIRECTIVES, IGX_STEPPER_DIRECTIVES, IGX_TABS_DIRECTIVES, IGX_TIME_PICKER_DIRECTIVES, IGX_TOOLTIP_DIRECTIVES, IGX_TREE_DIRECTIVES, IGX_TREE_GRID_DIRECTIVES, ITreeGridAggregation, IgcFormControlDirective, IgcFormsModule, IgxAccordionComponent, IgxAccordionModule, IgxActionStripComponent, IgxActionStripMenuItemDirective, IgxActionStripModule, IgxAdvancedFilteringDialogComponent, IgxAppendDropStrategy, IgxAutocompleteDirective, IgxAutocompleteModule, IgxAvatarComponent, IgxAvatarModule, IgxAvatarSize, IgxAvatarType, IgxBadgeComponent, IgxBadgeModule, IgxBadgeType, IgxBannerActionsDirective, IgxBannerComponent, IgxBannerModule, IgxBaseExporter, IgxBaseTransactionService, IgxBooleanFilteringOperand, IgxBottomNavComponent, IgxBottomNavContentComponent, IgxBottomNavHeaderComponent, IgxBottomNavHeaderIconDirective, IgxBottomNavHeaderLabelDirective, IgxBottomNavItemComponent, IgxBottomNavModule, IgxButtonDirective, IgxButtonGroupComponent, IgxButtonGroupModule, IgxButtonModule, IgxCSVTextDirective, IgxCalendarComponent, IgxCalendarHeaderTemplateDirective, IgxCalendarHeaderTitleTemplateDirective, IgxCalendarModule, IgxCalendarMonthDirective, IgxCalendarScrollPageDirective, IgxCalendarSubheaderTemplateDirective, IgxCalendarView, IgxCalendarViewBaseDirective, IgxCalendarYearDirective, IgxCardActionsComponent, IgxCardActionsLayout, IgxCardComponent, IgxCardContentDirective, IgxCardFooterDirective, IgxCardHeaderComponent, IgxCardHeaderSubtitleDirective, IgxCardHeaderTitleDirective, IgxCardMediaDirective, IgxCardModule, IgxCardThumbnailDirective, IgxCarouselComponent, IgxCarouselIndicatorDirective, IgxCarouselModule, IgxCarouselNextButtonDirective, IgxCarouselPrevButtonDirective, IgxCellEditorTemplateDirective, IgxCellFooterTemplateDirective, IgxCellHeaderTemplateDirective, IgxCellTemplateDirective, IgxCellValidationErrorDirective, IgxCheckboxComponent, IgxCheckboxModule, IgxChildGridRowComponent, IgxChipComponent, IgxChipTypeVariant, IgxChipsAreaComponent, IgxChipsModule, IgxCircularProgressBarComponent, IgxCollapsibleIndicatorTemplateDirective, IgxColumPatternValidatorDirective, IgxColumnActionsBaseDirective, IgxColumnActionsComponent, IgxColumnComponent, IgxColumnEmailValidatorDirective, IgxColumnGroupComponent, IgxColumnHidingDirective, IgxColumnLayoutComponent, IgxColumnMaxLengthValidatorDirective, IgxColumnMaxValidatorDirective, IgxColumnMinLengthValidatorDirective, IgxColumnMinValidatorDirective, IgxColumnPinningDirective, IgxColumnRequiredValidatorDirective, IgxComboAddItemDirective, IgxComboClearIconDirective, IgxComboComponent, IgxComboEmptyDirective, IgxComboFooterDirective, IgxComboHeaderDirective, IgxComboHeaderItemDirective, IgxComboItemDirective, IgxComboModule, IgxComboToggleIconDirective, IgxCsvExporterOptions, IgxCsvExporterService, IgxDataLoadingTemplateDirective, IgxDataRecordSorting, IgxDateFilteringOperand, IgxDatePickerComponent, IgxDatePickerModule, IgxDateRangeEndComponent, IgxDateRangeInputsBaseComponent, IgxDateRangePickerComponent, IgxDateRangePickerModule, IgxDateRangeSeparatorDirective, IgxDateRangeStartComponent, IgxDateSummaryOperand, IgxDateTimeEditorDirective, IgxDateTimeEditorModule, IgxDateTimeFilteringOperand, IgxDaysViewComponent, IgxDefaultDropStrategy, IgxDialogActionsDirective, IgxDialogComponent, IgxDialogModule, IgxDialogTitleDirective, IgxDividerDirective, IgxDividerModule, IgxDividerType, IgxDragDirective, IgxDragDropModule, IgxDragHandleDirective, IgxDragIgnoreDirective, IgxDragIndicatorIconDirective, IgxDragLocation, IgxDropDirective, IgxDropDownComponent, IgxDropDownGroupComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, IgxDropDownModule, IgxEmptyListTemplateDirective, IgxExcelExporterOptions, IgxExcelExporterService, IgxExcelStyleClearFiltersComponent, IgxExcelStyleColumnOperationsTemplateDirective, IgxExcelStyleConditionalFilterComponent, IgxExcelStyleDateExpressionComponent, IgxExcelStyleFilterOperationsTemplateDirective, IgxExcelStyleHeaderComponent, IgxExcelStyleHeaderIconDirective, IgxExcelStyleHidingComponent, IgxExcelStyleLoadingValuesTemplateDirective, IgxExcelStyleMovingComponent, IgxExcelStylePinningComponent, IgxExcelStyleSearchComponent, IgxExcelStyleSelectingComponent, IgxExcelStyleSortingComponent, IgxExcelTextDirective, IgxExpansionPanelBodyComponent, IgxExpansionPanelComponent, IgxExpansionPanelDescriptionDirective, IgxExpansionPanelHeaderComponent, IgxExpansionPanelIconDirective, IgxExpansionPanelModule, IgxExpansionPanelTitleDirective, IgxExporterOptionsBase, IgxFilterCellTemplateDirective, IgxFilterDirective, IgxFilterModule, IgxFilterOptions, IgxFilterPipe, IgxFilteringOperand, IgxFlatTransactionFactory, IgxFlexDirective, IgxFocusDirective, IgxFocusModule, IgxFocusTrapDirective, IgxFocusTrapModule, IgxForOfContext, IgxForOfDirective, IgxForOfModule, IgxGridActionButtonComponent, IgxGridActionsBaseDirective, IgxGridCell, IgxGridComponent, IgxGridDetailTemplateDirective, IgxGridEditingActionsComponent, IgxGridExcelStyleFilteringComponent, IgxGridFooterComponent, IgxGridForOfContext, IgxGridForOfDirective, IgxGridHeaderComponent, IgxGridHeaderGroupComponent, IgxGridHeaderRowComponent, IgxGridModule, IgxGridPinningActionsComponent, IgxGridRow, IgxGridStateDirective, IgxGridToolbarActionsComponent, IgxGridToolbarAdvancedFilteringComponent, IgxGridToolbarComponent, IgxGridToolbarDirective, IgxGridToolbarExporterComponent, IgxGridToolbarHidingComponent, IgxGridToolbarPinningComponent, IgxGridToolbarTitleComponent, IgxGridTransaction, IgxGroupAreaDropDirective, IgxGroupByRow, IgxGroupByRowSelectorDirective, IgxGroupByRowTemplateDirective, IgxGroupedTreeGridSorting, IgxGrouping, IgxHeadSelectorDirective, IgxHeaderCollapsedIndicatorDirective, IgxHeaderExpandedIndicatorDirective, IgxHierarchicalGridComponent, IgxHierarchicalGridModule, IgxHierarchicalGridRow, IgxHierarchicalTransactionFactory, IgxHierarchicalTransactionService, IgxHintDirective, IgxIconButtonDirective, IgxIconComponent, IgxIconModule, IgxIconService, IgxInputDirective, IgxInputGroupComponent, IgxInputGroupModule, IgxInputState, IgxInsertDropStrategy, IgxItemListDirective, IgxLabelDirective, IgxLayoutDirective, IgxLayoutModule, IgxLinearProgressBarComponent, IgxListActionDirective, IgxListBaseDirective, IgxListComponent, IgxListItemComponent, IgxListItemLeftPanningTemplateDirective, IgxListItemRightPanningTemplateDirective, IgxListLineDirective, IgxListLineSubTitleDirective, IgxListLineTitleDirective, IgxListModule, IgxListPanState, IgxListThumbnailDirective, IgxMaskDirective, IgxMaskModule, IgxMonthPickerComponent, IgxMonthsViewComponent, IgxNavDrawerItemDirective, IgxNavDrawerMiniTemplateDirective, IgxNavDrawerTemplateDirective, IgxNavbarActionDirective, IgxNavbarComponent, IgxNavbarModule, IgxNavbarTitleDirective, IgxNavigationCloseDirective, IgxNavigationDrawerComponent, IgxNavigationDrawerModule, IgxNavigationService, IgxNavigationToggleDirective, IgxNumberFilteringOperand, IgxNumberSummaryOperand, IgxOverlayOutletDirective, IgxOverlayService, IgxPageNavigationComponent, IgxPageSizeSelectorComponent, IgxPaginatorComponent, IgxPaginatorContentDirective, IgxPaginatorDirective, IgxPaginatorModule, IgxPickerActionsDirective, IgxPickerClearComponent, IgxPickerToggleComponent, IgxPivotAggregate, IgxPivotDataSelectorComponent, IgxPivotDateAggregate, IgxPivotDateDimension, IgxPivotGridComponent, IgxPivotGridModule, IgxPivotNumericAggregate, IgxPivotRowDimensionHeaderTemplateDirective, IgxPivotTimeAggregate, IgxPivotValueChipTemplateDirective, IgxPrefixDirective, IgxPrependDropStrategy, IgxProgressBarGradientDirective, IgxProgressBarModule, IgxProgressBarTextTemplateDirective, IgxProgressType, IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxQueryBuilderModule, IgxQueryBuilderSearchValueTemplateDirective, IgxRadioComponent, IgxRadioGroupDirective, IgxRadioModule, IgxRippleDirective, IgxRippleModule, IgxRowAddTextDirective, IgxRowCollapsedIndicatorDirective, IgxRowDirective, IgxRowDragGhostDirective, IgxRowEditActionsDirective, IgxRowEditTabStopDirective, IgxRowEditTextDirective, IgxRowExpandedIndicatorDirective, IgxRowIslandComponent, IgxRowSelectorDirective, IgxScrollInertiaDirective, IgxScrollInertiaModule, IgxSelectComponent, IgxSelectFooterDirective, IgxSelectGroupComponent, IgxSelectHeaderDirective, IgxSelectItemComponent, IgxSelectModule, IgxSelectToggleIconDirective, IgxSimpleComboComponent, IgxSimpleComboModule, IgxSlideComponent, IgxSliderComponent, IgxSliderModule, IgxSliderType, IgxSnackbarComponent, IgxSnackbarModule, IgxSortAscendingHeaderIconDirective, IgxSortDescendingHeaderIconDirective, IgxSortHeaderIconDirective, IgxSorting, IgxSplitBarComponent, IgxSplitterComponent, IgxSplitterModule, IgxSplitterPaneComponent, IgxStepActiveIndicatorDirective, IgxStepCompletedIndicatorDirective, IgxStepComponent, IgxStepContentDirective, IgxStepIndicatorDirective, IgxStepInvalidIndicatorDirective, IgxStepSubtitleDirective, IgxStepTitleDirective, IgxStepType, IgxStepperComponent, IgxStepperModule, IgxStepperOrientation, IgxStepperTitlePosition, IgxStringFilteringOperand, IgxSuffixDirective, IgxSummaryOperand, IgxSummaryRow, IgxSummaryTemplateDirective, IgxSwitchComponent, IgxSwitchModule, IgxTabContentComponent, IgxTabHeaderComponent, IgxTabHeaderIconDirective, IgxTabHeaderLabelDirective, IgxTabItemComponent, IgxTabsAlignment, IgxTabsComponent, IgxTabsModule, IgxTemplateOutletDirective, IgxTextAlign, IgxTextHighlightDirective, IgxTextHighlightModule, IgxTextHighlightService, IgxTextSelectionDirective, IgxTextSelectionModule, IgxThumbFromTemplateDirective, IgxThumbToTemplateDirective, IgxTickLabelTemplateDirective, IgxTimeFilteringOperand, IgxTimeItemDirective, IgxTimePickerComponent, IgxTimePickerModule, IgxTimeSummaryOperand, IgxToastComponent, IgxToastModule, IgxToggleActionDirective, IgxToggleDirective, IgxToggleModule, IgxTooltipDirective, IgxTooltipModule, IgxTooltipTargetDirective, IgxTransactionService, IgxTreeComponent, IgxTreeExpandIndicatorDirective, IgxTreeGridComponent, IgxTreeGridGroupByAreaComponent, IgxTreeGridGroupingPipe, IgxTreeGridModule, IgxTreeGridRow, IgxTreeModule, IgxTreeNodeComponent, IgxTreeNodeLinkDirective, IgxTreeSelectionType, IgxYearsViewComponent, IndigoIcons, InputResourceStringsEN, LabelPosition, ListResourceStringsEN, NoOpScrollStrategy, NoopFilteringStrategy, NoopPivotDimensionsStrategy, NoopSortingStrategy, PaginatorResourceStringsEN, PagingError, PickerInteractionMode, PivotColumnDimensionsStrategy, PivotDimensionType, PivotRowDimensionsStrategy, PivotRowLayoutType, PivotSummaryPosition, Point, QueryBuilderResourceStringsEN, RadioGroupAlignment, RelativePosition, RelativePositionStrategy, RowPinningPosition, ScrollStrategy, Size, SliderHandle, SortingDirection, SplitterType, TickLabelsOrientation, TicksOrientation, TimePickerResourceStringsEN, TransactionEventOrigin, TransactionType, TreeGridFilteringStrategy, TreeGridFormattedValuesFilteringStrategy, TreeGridMatchingRecordsOnlyFilteringStrategy, TreeResourceStringsEN, VerticalAlignment, VerticalAnimationType, WEEKDAYS, changei18n, comboIgnoreDiacriticsFilter, igxI18N, isLeap, monthRange, range, weekDay };
94377
95533
  //# sourceMappingURL=igniteui-angular.mjs.map