igniteui-angular 19.2.7 → 19.2.9

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 (45) hide show
  1. package/fesm2022/igniteui-angular.mjs +213 -174
  2. package/fesm2022/igniteui-angular.mjs.map +1 -1
  3. package/lib/core/styles/components/grid/_excel-filtering-theme.scss +1 -1
  4. package/lib/core/styles/components/input/_input-group-component.scss +2 -1
  5. package/lib/core/styles/components/input/_input-group-theme.scss +53 -5
  6. package/lib/core/styles/components/label/_label-theme.scss +4 -1
  7. package/lib/core/styles/components/radio/_radio-component.scss +12 -0
  8. package/lib/core/styles/components/radio/_radio-theme.scss +30 -8
  9. package/lib/core/utils.d.ts +4 -4
  10. package/lib/data-operations/filtering-strategy.d.ts +4 -5
  11. package/lib/directives/radio/radio-group.directive.d.ts +33 -15
  12. package/lib/directives/tooltip/tooltip.directive.d.ts +11 -2
  13. package/lib/grids/common/pipes.d.ts +1 -1
  14. package/lib/grids/common/strategy.d.ts +1 -1
  15. package/lib/grids/grid/grid-validation.service.d.ts +1 -1
  16. package/lib/grids/grid-public-cell.d.ts +2 -2
  17. package/lib/grids/summaries/grid-summary.service.d.ts +1 -1
  18. package/lib/grids/tree-grid/tree-grid.filtering.strategy.d.ts +4 -4
  19. package/package.json +1 -1
  20. package/styles/igniteui-angular-dark.css +1 -1
  21. package/styles/igniteui-angular.css +1 -1
  22. package/styles/igniteui-bootstrap-dark.css +1 -1
  23. package/styles/igniteui-bootstrap-light.css +1 -1
  24. package/styles/igniteui-dark-green.css +1 -1
  25. package/styles/igniteui-fluent-dark-excel.css +1 -1
  26. package/styles/igniteui-fluent-dark-word.css +1 -1
  27. package/styles/igniteui-fluent-dark.css +1 -1
  28. package/styles/igniteui-fluent-light-excel.css +1 -1
  29. package/styles/igniteui-fluent-light-word.css +1 -1
  30. package/styles/igniteui-fluent-light.css +1 -1
  31. package/styles/igniteui-indigo-dark.css +1 -1
  32. package/styles/igniteui-indigo-light.css +1 -1
  33. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  34. package/styles/maps/igniteui-angular.css.map +1 -1
  35. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  36. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  37. package/styles/maps/igniteui-dark-green.css.map +1 -1
  38. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  39. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  40. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  41. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  42. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  43. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  44. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  45. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, HostListener, Input, Directive, EventEmitter, InjectionToken, isDevMode, inject, PLATFORM_ID, Inject, ElementRef, ViewContainerRef, createComponent, HostBinding, Output, Self, Optional, booleanAttribute, SecurityContext, DestroyRef, Component, ContentChild, ContentChildren, RendererStyleFlags2, Pipe, ViewChild, LOCALE_ID, forwardRef, Host, QueryList, ViewChildren, TemplateRef, ChangeDetectionStrategy, SimpleChange, ChangeDetectorRef, NgZone, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, reflectComponentType, NgModule } from '@angular/core';
2
+ import { Injectable, HostListener, Input, Directive, EventEmitter, InjectionToken, isDevMode, inject, PLATFORM_ID, Inject, ElementRef, ViewContainerRef, createComponent, HostBinding, Output, Self, Optional, booleanAttribute, SecurityContext, DestroyRef, Component, ContentChild, ContentChildren, RendererStyleFlags2, Pipe, ViewChild, contentChildren, QueryList, signal, effect, LOCALE_ID, forwardRef, Host, ViewChildren, TemplateRef, ChangeDetectionStrategy, SimpleChange, ChangeDetectorRef, NgZone, 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, sampleTime, filter as filter$1, pipe } from 'rxjs';
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';
5
+ import { Observable, NEVER, Subject, fromEvent, BehaviorSubject, interval, animationFrameScheduler, noop, takeUntil as takeUntil$1, merge, Subscription, timer, sampleTime, filter as filter$1, pipe } from 'rxjs';
6
+ import { takeUntil, filter, throttle, throttleTime, first as first$2, take, debounce, tap, switchMap, skipLast, debounceTime, map, shareReplay, takeWhile, timeout, pluck } from 'rxjs/operators';
7
7
  import { isPlatformBrowser, formatDate as formatDate$1, CurrencyPipe, FormatWidth, getLocaleDateFormat, formatPercent, formatNumber, getLocaleCurrencyCode, DatePipe, getLocaleDateTimeFormat, DOCUMENT, NgTemplateOutlet, NgClass, 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';
9
9
  import { strToU8, zip } from 'fflate';
@@ -238,17 +238,9 @@ const getResizeObserver = () => globalThis.window?.ResizeObserver;
238
238
  /**
239
239
  * @hidden
240
240
  */
241
- const cloneArray = (array, deep) => {
242
- const arr = [];
243
- if (!array) {
244
- return arr;
245
- }
246
- let i = array.length;
247
- while (i--) {
248
- arr[i] = deep ? cloneValue(array[i]) : array[i];
249
- }
250
- return arr;
251
- };
241
+ function cloneArray(array, deep = false) {
242
+ return deep ? (array ?? []).map(cloneValue) : (array ?? []).slice();
243
+ }
252
244
  /**
253
245
  * Doesn't clone leaf items
254
246
  *
@@ -306,7 +298,7 @@ const cloneValue = (value) => {
306
298
  return new Date(value.getTime());
307
299
  }
308
300
  if (Array.isArray(value)) {
309
- return [...value];
301
+ return value.slice();
310
302
  }
311
303
  if (value instanceof Map || value instanceof Set) {
312
304
  return value;
@@ -613,10 +605,8 @@ const resizeObservable = (target) => {
613
605
  return unsubscribe;
614
606
  });
615
607
  }
616
- else {
617
- // if on a server env return a empty observable that does not complete immediately
618
- return NEVER;
619
- }
608
+ // if on a server env return a empty observable that does not complete immediately
609
+ return NEVER;
620
610
  };
621
611
  /**
622
612
  * @hidden
@@ -626,7 +616,7 @@ const resizeObservable = (target) => {
626
616
  */
627
617
  const compareMaps = (map1, map2) => {
628
618
  if (!map2) {
629
- return !map1 ? true : false;
619
+ return !map1;
630
620
  }
631
621
  if (map1.size !== map2.size) {
632
622
  return false;
@@ -646,24 +636,34 @@ const compareMaps = (map1, map2) => {
646
636
  }
647
637
  return match;
648
638
  };
639
+ function _isObject(entity) {
640
+ return entity != null && typeof entity === 'object';
641
+ }
642
+ function columnFieldPath(path) {
643
+ return path?.split('.') ?? [];
644
+ }
649
645
  /**
650
- *
651
646
  * Given a property access path in the format `x.y.z` resolves and returns
652
647
  * the value of the `z` property in the passed object.
653
648
  *
654
649
  * @hidden
655
650
  * @internal
656
651
  */
657
- const resolveNestedPath = (obj, path) => {
658
- const parts = path?.split('.') ?? [];
659
- let current = obj[parts.shift()];
660
- parts.forEach(prop => {
661
- if (current) {
662
- current = current[prop];
652
+ function resolveNestedPath(obj, pathParts, defaultValue) {
653
+ if (!_isObject(obj) || pathParts.length < 1) {
654
+ return defaultValue;
655
+ }
656
+ let current = obj;
657
+ for (const key of pathParts) {
658
+ if (_isObject(current) && key in current) {
659
+ current = current[key];
663
660
  }
664
- });
661
+ else {
662
+ return defaultValue;
663
+ }
664
+ }
665
665
  return current;
666
- };
666
+ }
667
667
  /**
668
668
  *
669
669
  * Given a property access path in the format `x.y.z` and a value
@@ -779,7 +779,6 @@ function getComponentCssSizeVar(size) {
779
779
  return 'var(--ig-size, var(--ig-size-small))';
780
780
  case "2":
781
781
  return 'var(--ig-size, var(--ig-size-medium))';
782
- case "3":
783
782
  default:
784
783
  return 'var(--ig-size, var(--ig-size-large))';
785
784
  }
@@ -1050,7 +1049,7 @@ class IgxSorting {
1050
1049
  * @internal
1051
1050
  */
1052
1051
  getFieldValue(obj, key, isDate = false, isTime = false) {
1053
- let resolvedValue = resolveNestedPath(obj, key);
1052
+ let resolvedValue = resolveNestedPath(obj, columnFieldPath(key));
1054
1053
  const date = parseDate(resolvedValue);
1055
1054
  if (date && isDate && isTime) {
1056
1055
  resolvedValue = date;
@@ -3349,9 +3348,6 @@ class BaseFilteringStrategy {
3349
3348
  if (!records) { // child grid is not yet created
3350
3349
  return true;
3351
3350
  }
3352
- else if (records.length === 0) { // child grid is empty
3353
- return false;
3354
- }
3355
3351
  for (let index = 0; index < records.length; index++) {
3356
3352
  const record = records[index];
3357
3353
  if ((shouldMatchRecords && this.matchRecord(record, expr.searchTree, grid, expr.searchTree.entity)) ||
@@ -3373,7 +3369,7 @@ class BaseFilteringStrategy {
3373
3369
  const expressionsTree = expressions;
3374
3370
  const operator = expressionsTree.operator;
3375
3371
  let matchOperand;
3376
- if (expressionsTree.filteringOperands && expressionsTree.filteringOperands.length) {
3372
+ if (expressionsTree.filteringOperands?.length) {
3377
3373
  for (const operand of expressionsTree.filteringOperands) {
3378
3374
  matchOperand = this.matchRecord(rec, operand, grid, entity);
3379
3375
  // Return false if at least one operand does not match and the filtering logic is And
@@ -3423,15 +3419,14 @@ class BaseFilteringStrategy {
3423
3419
  return null;
3424
3420
  }
3425
3421
  getFilterItems(column, tree) {
3422
+ const applyFormatter = column.formatter && this.shouldFormatFilterValues(column);
3426
3423
  let data = column.grid.gridAPI.filterDataByExpressions(tree);
3427
3424
  data = column.grid.gridAPI.sortDataByExpressions(data, [{ fieldName: column.field, dir: SortingDirection.Asc, ignoreCase: column.sortingIgnoreCase }]);
3428
- const columnField = column.field;
3425
+ const pathParts = columnFieldPath(column.field);
3429
3426
  let filterItems = data.map(record => {
3430
- let value = resolveNestedPath(record, columnField);
3431
- const applyFormatter = column.formatter && this.shouldFormatFilterValues(column);
3432
- value = applyFormatter ?
3433
- column.formatter(value, record) :
3434
- value;
3427
+ const value = applyFormatter ?
3428
+ column.formatter(resolveNestedPath(record, pathParts), record) :
3429
+ resolveNestedPath(record, pathParts);
3435
3430
  return {
3436
3431
  value,
3437
3432
  label: this.getFilterItemLabel(column, value, !applyFormatter, record)
@@ -3508,31 +3503,18 @@ class NoopFilteringStrategy extends BaseFilteringStrategy {
3508
3503
  }
3509
3504
  class FilteringStrategy extends BaseFilteringStrategy {
3510
3505
  static { this._instance = null; }
3511
- constructor() {
3512
- super();
3513
- }
3514
3506
  static instance() {
3515
3507
  return this._instance || (this._instance = new this());
3516
3508
  }
3517
3509
  filter(data, expressionsTree, advancedExpressionsTree, grid) {
3518
- let i;
3519
- let rec;
3520
- const len = data.length;
3521
- const res = [];
3522
- if ((FilteringExpressionsTree.empty(expressionsTree) && FilteringExpressionsTree.empty(advancedExpressionsTree)) || !len) {
3510
+ if ((FilteringExpressionsTree.empty(expressionsTree) && FilteringExpressionsTree.empty(advancedExpressionsTree))) {
3523
3511
  return data;
3524
3512
  }
3525
- for (i = 0; i < len; i++) {
3526
- rec = data[i];
3527
- if (this.matchRecord(rec, expressionsTree, grid) && this.matchRecord(rec, advancedExpressionsTree, grid)) {
3528
- res.push(rec);
3529
- }
3530
- }
3531
- return res;
3513
+ return data.filter(record => this.matchRecord(record, expressionsTree, grid) && this.matchRecord(record, advancedExpressionsTree, grid));
3532
3514
  }
3533
3515
  getFieldValue(rec, fieldName, isDate = false, isTime = false, grid) {
3534
3516
  const column = grid?.getColumnByName(fieldName);
3535
- let value = resolveNestedPath(rec, fieldName);
3517
+ let value = resolveNestedPath(rec, columnFieldPath(fieldName));
3536
3518
  value = column?.formatter && this.shouldFormatFilterValues(column) ?
3537
3519
  column.formatter(value, rec) :
3538
3520
  value && (isDate || isTime) ? parseDate(value) : value;
@@ -3568,14 +3550,14 @@ class TreeGridFilteringStrategy extends BaseFilteringStrategy {
3568
3550
  const hierarchicalRecord = rec;
3569
3551
  let value = this.isHierarchicalFilterField(fieldName) ?
3570
3552
  this.getHierarchicalFieldValue(hierarchicalRecord, fieldName) :
3571
- resolveNestedPath(hierarchicalRecord.data, fieldName);
3553
+ resolveNestedPath(hierarchicalRecord.data, columnFieldPath(fieldName));
3572
3554
  value = column?.formatter && this.shouldFormatFilterValues(column) ?
3573
3555
  column.formatter(value, rec.data) :
3574
3556
  value && (isDate || isTime) ? parseDate(value) : value;
3575
3557
  return value;
3576
3558
  }
3577
3559
  getHierarchicalFieldValue(record, field) {
3578
- const value = resolveNestedPath(record.data, field);
3560
+ const value = resolveNestedPath(record.data, columnFieldPath(field));
3579
3561
  return record.parent ?
3580
3562
  `${this.getHierarchicalFieldValue(record.parent, field)}${value ? `.[${value}]` : ''}` :
3581
3563
  `[${value}]`;
@@ -3618,8 +3600,9 @@ class TreeGridFilteringStrategy extends BaseFilteringStrategy {
3618
3600
  return Promise.resolve(items);
3619
3601
  }
3620
3602
  getHierarchicalFilterItems(records, column, parent) {
3603
+ const pathParts = columnFieldPath(column.field);
3621
3604
  return records?.map(record => {
3622
- let value = resolveNestedPath(record.data, column.field);
3605
+ let value = resolveNestedPath(record.data, pathParts);
3623
3606
  const applyFormatter = column.formatter && this.shouldFormatFilterValues(column);
3624
3607
  value = applyFormatter ?
3625
3608
  column.formatter(value, record.data) :
@@ -4061,7 +4044,7 @@ class IgxBaseExporter {
4061
4044
  }
4062
4045
  record.data = columns.reduce((a, e) => {
4063
4046
  if (!e.skip) {
4064
- let rawValue = resolveNestedPath(record.data, e.field);
4047
+ let rawValue = resolveNestedPath(record.data, columnFieldPath(e.field));
4065
4048
  const shouldApplyFormatter = e.formatter && !e.skipFormatter && record.type !== ExportRecordType.GroupedRecord;
4066
4049
  const isOfDateType = e.dataType === 'date' || e.dataType === 'dateTime' || e.dataType === 'time';
4067
4050
  if (isOfDateType &&
@@ -19195,6 +19178,19 @@ let nextId = 0;
19195
19178
  * ```
19196
19179
  */
19197
19180
  class IgxRadioGroupDirective {
19181
+ /**
19182
+ * Returns reference to the child radio buttons.
19183
+ *
19184
+ * @example
19185
+ * ```typescript
19186
+ * let radioButtons = this.radioGroup.radioButtons;
19187
+ * ```
19188
+ */
19189
+ get radioButtons() {
19190
+ const buttons = Array.from(this._radioButtons());
19191
+ this._radioButtonsList.reset(buttons);
19192
+ return this._radioButtonsList;
19193
+ }
19198
19194
  /**
19199
19195
  * Sets/gets the `value` attribute.
19200
19196
  *
@@ -19283,6 +19279,26 @@ class IgxRadioGroupDirective {
19283
19279
  this._invalid = value;
19284
19280
  this._setRadioButtonsInvalid();
19285
19281
  }
19282
+ /**
19283
+ * A css class applied to the component if any of the
19284
+ * child radio buttons labelPosition is set to `before`.
19285
+ *
19286
+ * @hidden
19287
+ * @internal
19288
+ */
19289
+ get labelBefore() {
19290
+ return this._radioButtons().some((radio) => radio.labelPosition === 'before');
19291
+ }
19292
+ /**
19293
+ * A css class applied to the component if all
19294
+ * child radio buttons are disabled.
19295
+ *
19296
+ * @hidden
19297
+ * @internal
19298
+ */
19299
+ get disabled() {
19300
+ return this._radioButtons().every((radio) => radio.disabled);
19301
+ }
19286
19302
  handleClick(event) {
19287
19303
  event.stopPropagation();
19288
19304
  if (this.selected) {
@@ -19291,7 +19307,7 @@ class IgxRadioGroupDirective {
19291
19307
  }
19292
19308
  handleKeyDown(event) {
19293
19309
  const { key } = event;
19294
- const buttons = this.radioButtons.filter(radio => !radio.disabled);
19310
+ const buttons = this._radioButtons().filter(radio => !radio.disabled);
19295
19311
  const checked = buttons.find((radio) => radio.checked);
19296
19312
  if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(key)) {
19297
19313
  let index = checked ? buttons.indexOf(checked) : -1;
@@ -19357,60 +19373,12 @@ class IgxRadioGroupDirective {
19357
19373
  set alignment(value) {
19358
19374
  this.vertical = value === RadioGroupAlignment.vertical;
19359
19375
  }
19360
- /**
19361
- * @hidden
19362
- * @internal
19363
- */
19364
- ngAfterContentInit() {
19365
- // The initial value can possibly be set by NgModel and it is possible that
19366
- // the OnInit of the NgModel occurs after the OnInit of this class.
19367
- this._isInitialized = true;
19368
- this.radioButtons.changes.pipe(startWith(0), takeUntil(this.destroy$)).subscribe(() => {
19369
- this.queryChange$.next();
19370
- setTimeout(() => this._initRadioButtons());
19371
- });
19372
- if (this.ngControl) {
19373
- this.radioButtons.forEach((button) => {
19374
- if (this.ngControl.disabled) {
19375
- button.disabled = this.ngControl.disabled;
19376
- }
19377
- });
19378
- }
19379
- }
19380
- /**
19381
- * @hidden
19382
- * @internal
19383
- */
19384
- ngAfterViewInit() {
19385
- if (this.ngControl) {
19386
- this.ngControl.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {
19387
- this.invalid = false;
19388
- });
19389
- if (this.ngControl.control.validator || this.ngControl.control.asyncValidator) {
19390
- this._required = this.ngControl?.control?.hasValidator(Validators.required);
19391
- }
19392
- }
19393
- if (this.radioButtons) {
19394
- this.radioButtons.forEach((button) => {
19395
- button.blurRadio
19396
- .pipe(takeUntil(this.destroy$))
19397
- .subscribe(() => {
19398
- this.updateValidityOnBlur();
19399
- });
19400
- fromEvent(button.nativeElement, 'keyup')
19401
- .pipe(takeUntil(this.destroy$))
19402
- .subscribe((event) => {
19403
- this.updateOnKeyUp(event);
19404
- });
19405
- });
19406
- }
19407
- }
19408
19376
  /**
19409
19377
  * @hidden
19410
19378
  * @internal
19411
19379
  */
19412
19380
  updateValidityOnBlur() {
19413
- this.radioButtons.forEach((button) => {
19381
+ this._radioButtons().forEach((button) => {
19414
19382
  button.focused = false;
19415
19383
  if (button.invalid) {
19416
19384
  this.invalid = true;
@@ -19422,9 +19390,9 @@ class IgxRadioGroupDirective {
19422
19390
  * @internal
19423
19391
  */
19424
19392
  updateOnKeyUp(event) {
19425
- const checked = this.radioButtons.find(x => x.checked);
19393
+ const checked = this._radioButtons().find(x => x.checked);
19426
19394
  if (event.key === "Tab") {
19427
- this.radioButtons.forEach((radio) => {
19395
+ this._radioButtons().forEach((radio) => {
19428
19396
  if (radio === checked) {
19429
19397
  checked.focused = true;
19430
19398
  }
@@ -19437,10 +19405,10 @@ class IgxRadioGroupDirective {
19437
19405
  _updateTabIndex() {
19438
19406
  // Needed so that the keyboard navigation of a radio group
19439
19407
  // placed inside a dialog works properly
19440
- if (this.radioButtons) {
19441
- const checked = this.radioButtons.find(x => x.checked);
19408
+ if (this._radioButtons) {
19409
+ const checked = this._radioButtons().find(x => x.checked);
19442
19410
  if (checked) {
19443
- this.radioButtons.forEach((button) => {
19411
+ this._radioButtons().forEach((button) => {
19444
19412
  checked.nativeElement.tabIndex = 0;
19445
19413
  if (button !== checked) {
19446
19414
  button.nativeElement.tabIndex = -1;
@@ -19481,8 +19449,8 @@ class IgxRadioGroupDirective {
19481
19449
  * @internal
19482
19450
  */
19483
19451
  registerOnTouched(fn) {
19484
- if (this.radioButtons) {
19485
- this.radioButtons.forEach((button) => {
19452
+ if (this._radioButtons) {
19453
+ this._radioButtons().forEach((button) => {
19486
19454
  button.registerOnTouched(fn);
19487
19455
  });
19488
19456
  }
@@ -19499,6 +19467,8 @@ class IgxRadioGroupDirective {
19499
19467
  this.ngControl = ngControl;
19500
19468
  this._directionality = _directionality;
19501
19469
  this.cdr = cdr;
19470
+ this._radioButtons = contentChildren(IgxRadioComponent, { descendants: true });
19471
+ this._radioButtonsList = new QueryList();
19502
19472
  /**
19503
19473
  * An event that is emitted after the radio group `value` is changed.
19504
19474
  *
@@ -19553,7 +19523,7 @@ class IgxRadioGroupDirective {
19553
19523
  * @hidden
19554
19524
  * @internal
19555
19525
  */
19556
- this._isInitialized = false;
19526
+ this._isInitialized = signal(false);
19557
19527
  /**
19558
19528
  * @hidden
19559
19529
  * @internal
@@ -19577,31 +19547,72 @@ class IgxRadioGroupDirective {
19577
19547
  if (this.ngControl !== null) {
19578
19548
  this.ngControl.valueAccessor = this;
19579
19549
  }
19550
+ effect(() => {
19551
+ this.initialize();
19552
+ Promise.resolve().then(() => {
19553
+ this.setRadioButtons();
19554
+ });
19555
+ });
19580
19556
  }
19581
19557
  /**
19582
19558
  * @hidden
19583
19559
  * @internal
19584
19560
  */
19585
- _initRadioButtons() {
19586
- if (this.radioButtons) {
19587
- const props = { name: this._name, required: this._required };
19588
- this.radioButtons.forEach((button) => {
19589
- Object.assign(button, props);
19590
- if (button.value === this._value) {
19591
- button.checked = true;
19592
- this._selected = button;
19593
- this.cdr.markForCheck();
19561
+ initialize() {
19562
+ // The initial value can possibly be set by NgModel and it is possible that
19563
+ // the OnInit of the NgModel occurs after the OnInit of this class.
19564
+ this._isInitialized.set(true);
19565
+ if (this.ngControl) {
19566
+ this.ngControl.statusChanges
19567
+ .pipe(takeUntil$1(this.destroy$))
19568
+ .subscribe(() => {
19569
+ this.invalid = false;
19570
+ });
19571
+ if (this.ngControl.control.validator || this.ngControl.control.asyncValidator) {
19572
+ this._required = this.ngControl?.control?.hasValidator(Validators.required);
19573
+ }
19574
+ this._radioButtons().forEach((button) => {
19575
+ if (this.ngControl.disabled) {
19576
+ button.disabled = this.ngControl.disabled;
19594
19577
  }
19595
- button.change.pipe(takeUntil(button.destroy$), takeUntil(this.destroy$), takeUntil(this.queryChange$)).subscribe((ev) => this._selectedRadioButtonChanged(ev));
19596
19578
  });
19597
19579
  }
19598
19580
  }
19581
+ /**
19582
+ * @hidden
19583
+ * @internal
19584
+ */
19585
+ setRadioButtons() {
19586
+ this._radioButtons().forEach((button) => {
19587
+ button.name = this._name;
19588
+ button.required = this._required;
19589
+ if (button.value === this._value) {
19590
+ button.checked = true;
19591
+ this._selected = button;
19592
+ this.cdr.markForCheck();
19593
+ }
19594
+ this._setRadioButtonEvents(button);
19595
+ });
19596
+ }
19597
+ /**
19598
+ * @hidden
19599
+ * @internal
19600
+ */
19601
+ _setRadioButtonEvents(button) {
19602
+ button.change.pipe(takeUntil$1(button.destroy$), takeUntil$1(this.destroy$), takeUntil$1(this.queryChange$)).subscribe((ev) => this._selectedRadioButtonChanged(ev));
19603
+ button.blurRadio
19604
+ .pipe(takeUntil$1(this.destroy$))
19605
+ .subscribe(() => this.updateValidityOnBlur());
19606
+ fromEvent(button.nativeElement, 'keyup')
19607
+ .pipe(takeUntil$1(this.destroy$))
19608
+ .subscribe((event) => this.updateOnKeyUp(event));
19609
+ }
19599
19610
  /**
19600
19611
  * @hidden
19601
19612
  * @internal
19602
19613
  */
19603
19614
  _selectedRadioButtonChanged(args) {
19604
- this.radioButtons.forEach((button) => {
19615
+ this._radioButtons().forEach((button) => {
19605
19616
  button.checked = button.id === args.owner.id;
19606
19617
  if (button.checked && button.ngControl) {
19607
19618
  this.invalid = button.ngControl.invalid;
@@ -19622,8 +19633,8 @@ class IgxRadioGroupDirective {
19622
19633
  * @internal
19623
19634
  */
19624
19635
  _setRadioButtonNames() {
19625
- if (this.radioButtons) {
19626
- this.radioButtons.forEach((button) => {
19636
+ if (this._radioButtons) {
19637
+ this._radioButtons().forEach((button) => {
19627
19638
  button.name = this._name;
19628
19639
  });
19629
19640
  }
@@ -19633,8 +19644,8 @@ class IgxRadioGroupDirective {
19633
19644
  * @internal
19634
19645
  */
19635
19646
  _selectRadioButton() {
19636
- if (this.radioButtons) {
19637
- this.radioButtons.forEach((button) => {
19647
+ if (this._radioButtons) {
19648
+ this._radioButtons().forEach((button) => {
19638
19649
  if (this._value === null) {
19639
19650
  // no value - uncheck all radio buttons
19640
19651
  if (button.checked) {
@@ -19666,8 +19677,8 @@ class IgxRadioGroupDirective {
19666
19677
  * @internal
19667
19678
  */
19668
19679
  _setRadioButtonsRequired() {
19669
- if (this.radioButtons) {
19670
- this.radioButtons.forEach((button) => {
19680
+ if (this._radioButtons) {
19681
+ this._radioButtons().forEach((button) => {
19671
19682
  button.required = this._required;
19672
19683
  });
19673
19684
  }
@@ -19677,14 +19688,14 @@ class IgxRadioGroupDirective {
19677
19688
  * @internal
19678
19689
  */
19679
19690
  _setRadioButtonsInvalid() {
19680
- if (this.radioButtons) {
19681
- this.radioButtons.forEach((button) => {
19691
+ if (this._radioButtons) {
19692
+ this._radioButtons().forEach((button) => {
19682
19693
  button.invalid = this._invalid;
19683
19694
  });
19684
19695
  }
19685
19696
  }
19686
19697
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxRadioGroupDirective, deps: [{ token: i4.NgControl, optional: true, self: true }, { token: IgxDirectionality }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
19687
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.2.5", type: IgxRadioGroupDirective, isStandalone: true, selector: "igx-radio-group, [igxRadioGroup]", inputs: { value: "value", name: "name", required: ["required", "required", booleanAttribute], selected: "selected", invalid: ["invalid", "invalid", booleanAttribute], alignment: "alignment" }, outputs: { change: "change" }, host: { listeners: { "click": "handleClick($event)", "keydown": "handleKeyDown($event)" }, properties: { "class.igx-radio-group": "this.cssClass", "class.igx-radio-group--vertical": "this.vertical" } }, queries: [{ propertyName: "radioButtons", predicate: IgxRadioComponent, descendants: true }], exportAs: ["igxRadioGroup"], ngImport: i0 }); }
19698
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "19.2.5", type: IgxRadioGroupDirective, isStandalone: true, selector: "igx-radio-group, [igxRadioGroup]", inputs: { value: "value", name: "name", required: ["required", "required", booleanAttribute], selected: "selected", invalid: ["invalid", "invalid", booleanAttribute], alignment: "alignment" }, outputs: { change: "change" }, host: { listeners: { "click": "handleClick($event)", "keydown": "handleKeyDown($event)" }, properties: { "class.igx-radio-group": "this.cssClass", "class.igx-radio-group--vertical": "this.vertical", "class.igx-radio-group--before": "this.labelBefore", "class.igx-radio-group--disabled": "this.disabled" } }, queries: [{ propertyName: "_radioButtons", predicate: IgxRadioComponent, descendants: true, isSignal: true }], exportAs: ["igxRadioGroup"], ngImport: i0 }); }
19688
19699
  }
19689
19700
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxRadioGroupDirective, decorators: [{
19690
19701
  type: Directive,
@@ -19697,10 +19708,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
19697
19708
  type: Optional
19698
19709
  }, {
19699
19710
  type: Self
19700
- }] }, { type: IgxDirectionality }, { type: i0.ChangeDetectorRef }], propDecorators: { radioButtons: [{
19701
- type: ContentChildren,
19702
- args: [IgxRadioComponent, { descendants: true }]
19703
- }], value: [{
19711
+ }] }, { type: IgxDirectionality }, { type: i0.ChangeDetectorRef }], propDecorators: { value: [{
19704
19712
  type: Input
19705
19713
  }], name: [{
19706
19714
  type: Input
@@ -19720,6 +19728,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
19720
19728
  }], vertical: [{
19721
19729
  type: HostBinding,
19722
19730
  args: ['class.igx-radio-group--vertical']
19731
+ }], labelBefore: [{
19732
+ type: HostBinding,
19733
+ args: ['class.igx-radio-group--before']
19734
+ }], disabled: [{
19735
+ type: HostBinding,
19736
+ args: ['class.igx-radio-group--disabled']
19723
19737
  }], handleClick: [{
19724
19738
  type: HostListener,
19725
19739
  args: ['click', ['$event']]
@@ -20908,6 +20922,21 @@ class IgxTooltipDirective extends IgxToggleDirective {
20908
20922
  * Returns whether open time out has started
20909
20923
  */
20910
20924
  this.toBeShown = false;
20925
+ this._destroy$ = new Subject();
20926
+ this.onDocumentTouchStart = this.onDocumentTouchStart.bind(this);
20927
+ this.overlayService.opening.pipe(takeUntil$1(this._destroy$)).subscribe(() => {
20928
+ document.addEventListener('touchstart', this.onDocumentTouchStart, { passive: true });
20929
+ });
20930
+ this.overlayService.closed.pipe(takeUntil$1(this._destroy$)).subscribe(() => {
20931
+ document.removeEventListener('touchstart', this.onDocumentTouchStart);
20932
+ });
20933
+ }
20934
+ /** @hidden */
20935
+ ngOnDestroy() {
20936
+ super.ngOnDestroy();
20937
+ document.removeEventListener('touchstart', this.onDocumentTouchStart);
20938
+ this._destroy$.next(true);
20939
+ this._destroy$.complete();
20911
20940
  }
20912
20941
  /**
20913
20942
  * If there is open animation in progress this method will finish is.
@@ -20951,6 +20980,9 @@ class IgxTooltipDirective extends IgxToggleDirective {
20951
20980
  overlaySettings.positionStrategy.settings.closeAnimation = animation;
20952
20981
  }
20953
20982
  }
20983
+ onDocumentTouchStart(event) {
20984
+ this.tooltipTarget?.onDocumentTouchStart(event);
20985
+ }
20954
20986
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxTooltipDirective, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: IgxOverlayService }, { token: IgxNavigationService, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
20955
20987
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.5", type: IgxTooltipDirective, isStandalone: true, selector: "[igxTooltip]", inputs: { context: "context", id: "id" }, host: { properties: { "class.igx-tooltip--hidden": "this.hiddenClass", "class.igx-tooltip": "this.defaultClass", "attr.id": "this.id", "attr.role": "this.role" } }, exportAs: ["tooltip"], usesInheritance: true, ngImport: i0 }); }
20956
20988
  }
@@ -21164,6 +21196,7 @@ class IgxTooltipTargetDirective extends IgxToggleActionDirective {
21164
21196
  if (shouldReturn) {
21165
21197
  return;
21166
21198
  }
21199
+ this.target.tooltipTarget = this;
21167
21200
  const showingArgs = { target: this, tooltip: this.target, cancel: false };
21168
21201
  this.tooltipShow.emit(showingArgs);
21169
21202
  if (showingArgs.cancel) {
@@ -21229,18 +21262,23 @@ class IgxTooltipTargetDirective extends IgxToggleActionDirective {
21229
21262
  this._overlayDefaults.closeOnOutsideClick = false;
21230
21263
  this._overlayDefaults.closeOnEscape = true;
21231
21264
  this.target.closing.pipe(takeUntil(this.destroy$)).subscribe((event) => {
21265
+ if (this.target.tooltipTarget !== this) {
21266
+ return;
21267
+ }
21232
21268
  const hidingArgs = { target: this, tooltip: this.target, cancel: false };
21233
21269
  this.tooltipHide.emit(hidingArgs);
21234
21270
  if (hidingArgs.cancel) {
21235
21271
  event.cancel = true;
21236
21272
  }
21237
21273
  });
21274
+ this.nativeElement.addEventListener('touchstart', this.onTouchStart = this.onTouchStart.bind(this), { passive: true });
21238
21275
  }
21239
21276
  /**
21240
21277
  * @hidden
21241
21278
  */
21242
21279
  ngOnDestroy() {
21243
21280
  this.hideTooltip();
21281
+ this.nativeElement.removeEventListener('touchstart', this.onTouchStart);
21244
21282
  this.destroy$.next();
21245
21283
  this.destroy$.complete();
21246
21284
  }
@@ -21258,6 +21296,7 @@ class IgxTooltipTargetDirective extends IgxToggleActionDirective {
21258
21296
  this.target.forceClose(this.mergedOverlaySettings);
21259
21297
  this.target.toBeHidden = false;
21260
21298
  }
21299
+ this.target.tooltipTarget = this;
21261
21300
  const showingArgs = { target: this, tooltip: this.target, cancel: false };
21262
21301
  this.tooltipShow.emit(showingArgs);
21263
21302
  if (showingArgs.cancel) {
@@ -21325,7 +21364,7 @@ class IgxTooltipTargetDirective extends IgxToggleActionDirective {
21325
21364
  return false;
21326
21365
  }
21327
21366
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxTooltipTargetDirective, deps: [{ token: i0.ElementRef }, { token: IgxNavigationService, optional: true }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
21328
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.2.5", type: IgxTooltipTargetDirective, isStandalone: true, selector: "[igxTooltipTarget]", inputs: { showDelay: "showDelay", hideDelay: "hideDelay", tooltipDisabled: ["tooltipDisabled", "tooltipDisabled", booleanAttribute], target: ["igxTooltipTarget", "target"], tooltip: "tooltip" }, outputs: { tooltipShow: "tooltipShow", tooltipHide: "tooltipHide" }, host: { listeners: { "click": "onClick()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "touchstart": "onTouchStart()", "document:touchstart": "onDocumentTouchStart($event)" } }, exportAs: ["tooltipTarget"], usesInheritance: true, ngImport: i0 }); }
21367
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.2.5", type: IgxTooltipTargetDirective, isStandalone: true, selector: "[igxTooltipTarget]", inputs: { showDelay: "showDelay", hideDelay: "hideDelay", tooltipDisabled: ["tooltipDisabled", "tooltipDisabled", booleanAttribute], target: ["igxTooltipTarget", "target"], tooltip: "tooltip" }, outputs: { tooltipShow: "tooltipShow", tooltipHide: "tooltipHide" }, host: { listeners: { "click": "onClick()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, exportAs: ["tooltipTarget"], usesInheritance: true, ngImport: i0 }); }
21329
21368
  }
21330
21369
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxTooltipTargetDirective, decorators: [{
21331
21370
  type: Directive,
@@ -21361,12 +21400,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
21361
21400
  }], onMouseLeave: [{
21362
21401
  type: HostListener,
21363
21402
  args: ['mouseleave']
21364
- }], onTouchStart: [{
21365
- type: HostListener,
21366
- args: ['touchstart']
21367
- }], onDocumentTouchStart: [{
21368
- type: HostListener,
21369
- args: ['document:touchstart', ['$event']]
21370
21403
  }] } });
21371
21404
 
21372
21405
  /* NOTE: Tooltip directives collection for ease-of-use import in standalone components scenario */
@@ -31651,7 +31684,7 @@ class IgxCalendarBaseDirective {
31651
31684
  case 'month':
31652
31685
  return `${this.resourceStrings.igx_calendar_previous_month}, ${detail}`;
31653
31686
  case 'year':
31654
- return this.resourceStrings.igx_calendar_previous_year.replace('{0}', '15');
31687
+ return this.resourceStrings.igx_calendar_previous_year;
31655
31688
  case 'decade':
31656
31689
  return this.resourceStrings.igx_calendar_previous_years.replace('{0}', '15');
31657
31690
  }
@@ -31661,7 +31694,7 @@ class IgxCalendarBaseDirective {
31661
31694
  case 'month':
31662
31695
  return `${this.resourceStrings.igx_calendar_next_month}, ${detail}`;
31663
31696
  case 'year':
31664
- return this.resourceStrings.igx_calendar_next_year.replace('{0}', '15');
31697
+ return this.resourceStrings.igx_calendar_next_year;
31665
31698
  case 'decade':
31666
31699
  return this.resourceStrings.igx_calendar_next_years.replace('{0}', '15');
31667
31700
  }
@@ -34091,7 +34124,7 @@ class IgxMonthPickerComponent extends IgxCalendarBaseDirective {
34091
34124
  multi: false,
34092
34125
  provide: KeyboardNavigationService
34093
34126
  },
34094
- ], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true }, { propertyName: "monthsView", first: true, predicate: ["months"], descendants: true, read: IgxMonthsViewComponent }, { propertyName: "dacadeView", first: true, predicate: ["decade"], descendants: true, read: IgxYearsViewComponent }, { propertyName: "daysView", first: true, predicate: ["days"], descendants: true, read: IgxDaysViewComponent }, { propertyName: "yearsBtn", first: true, predicate: ["yearsBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- Previous arrow icon -->\n<ng-template #prevArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_prev\"></igx-icon>\n</ng-template>\n\n<!-- Next arrow icon -->\n<ng-template #nextArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_next\"></igx-icon>\n</ng-template>\n\n<!-- Previous picker button -->\n<ng-template #prevPageButton let-obj>\n <div\n #prevPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__prev\"\n role=\"button\"\n [attr.aria-label]=\"prevNavLabel((getPrevYearDate(viewDate) | date: 'YYYY'))\"\n data-action=\"prev\"\n igxCalendarScrollPage\n (mousedown)=\"previousPage()\"\n (keydown)=\"changePageKB($event, false)\"\n >\n <ng-container *ngTemplateOutlet=\"prevArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Next picker button -->\n<ng-template #nextPageButton let-obj>\n <div\n #nextPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__next\"\n role=\"button\"\n [attr.aria-label]=\"nextNavLabel((getNextYearDate(viewDate) | date: 'YYYY'))\"\n data-action=\"next\"\n igxCalendarScrollPage\n (mousedown)=\"nextPage()\"\n (keydown)=\"changePageKB($event)\"\n >\n <ng-container *ngTemplateOutlet=\"nextArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Year -->\n<ng-template #defaultYear let-obj>\n @if (activeView === 'year') {\n <span class=\"igx-calendar__aria-off-screen\" aria-live=\"polite\">{{ formattedYear(obj.date) }}</span>\n }\n <span\n #yearsBtn\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"(obj.date | date: 'yyyy') + ', ' + resourceStrings.igx_calendar_select_year\"\n (keydown)=\"onActiveViewDecadeKB(obj.date, $event, obj.index)\"\n (mousedown)=\"onActiveViewDecade($event, obj.date, obj.index)\"\n class=\"igx-calendar-picker__date\">\n {{ formattedYear(obj.date) }}\n </span>\n</ng-template>\n\n<!-- Decade -->\n<ng-template #defaultDecade>\n <span>{{ getDecadeRange().start }} - {{ getDecadeRange().end }}</span>\n</ng-template>\n\n<!-- PICKER IN MONTHS -->\n<ng-template #calendarYearPicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\">\n <ng-container\n *ngTemplateOutlet=\"defaultYear; context: getContext(0)\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<!-- PICKER IN YEARS -->\n<ng-template #calendarDecadePicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\" aria-live=\"polite\">\n <ng-container\n *ngTemplateOutlet=\"defaultDecade;\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<div\n #wrapper\n [tabIndex]=\"0\"\n class=\"igx-calendar__wrapper\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-multiselectable]=\"selection !== 'single'\"\n aria-labelledby=\"calendar-desc\"\n role=\"grid\"\n (focus)=\"this.onWrapperFocus($event)\"\n (blur)=\"this.onWrapperBlur($event)\"\n >\n <caption id=\"calendar-desc\" tabindex=\"-1\" class=\"igx-calendar__aria-off-screen\">\n {{ resourceStrings.igx_calendar_singular_single_selection}}\n </caption>\n\n <section class=\"igx-calendar__pickers\">\n @if (isDefaultView) {\n <ng-container *ngTemplateOutlet=\"calendarYearPicker\"></ng-container>\n }\n\n @if (isDecadeView) {\n <ng-container *ngTemplateOutlet=\"calendarDecadePicker\"></ng-container>\n }\n </section>\n\n <section class=\"igx-calendar__body\">\n @if (isDefaultView) {\n <igx-months-view\n #months\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.month\"\n [monthFormat]=\"formatOptions.month\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectMonth($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\">\n >\n </igx-months-view>\n }\n\n @if (isDecadeView) {\n <igx-years-view\n #decade\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.year\"\n [yearFormat]=\"formatOptions.year\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectYear($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\"\n >\n </igx-years-view>\n }\n </section>\n</div>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxMonthsViewComponent, selector: "igx-months-view", inputs: ["id", "standalone", "monthFormat", "formatView"] }, { kind: "component", type: IgxYearsViewComponent, selector: "igx-years-view", inputs: ["standalone", "yearFormat"] }] }); }
34127
+ ], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true }, { propertyName: "monthsView", first: true, predicate: ["months"], descendants: true, read: IgxMonthsViewComponent }, { propertyName: "dacadeView", first: true, predicate: ["decade"], descendants: true, read: IgxYearsViewComponent }, { propertyName: "daysView", first: true, predicate: ["days"], descendants: true, read: IgxDaysViewComponent }, { propertyName: "yearsBtn", first: true, predicate: ["yearsBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- Previous arrow icon -->\n<ng-template #prevArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_prev\"></igx-icon>\n</ng-template>\n\n<!-- Next arrow icon -->\n<ng-template #nextArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_next\"></igx-icon>\n</ng-template>\n\n<!-- Previous picker button -->\n<ng-template #prevPageButton let-obj>\n <div\n #prevPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__prev\"\n role=\"button\"\n [attr.aria-label]=\"prevNavLabel((getPrevYearDate(viewDate) | date: 'yyyy'))\"\n data-action=\"prev\"\n igxCalendarScrollPage\n (mousedown)=\"previousPage()\"\n (keydown)=\"changePageKB($event, false)\"\n >\n <ng-container *ngTemplateOutlet=\"prevArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Next picker button -->\n<ng-template #nextPageButton let-obj>\n <div\n #nextPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__next\"\n role=\"button\"\n [attr.aria-label]=\"nextNavLabel((getNextYearDate(viewDate) | date: 'yyyy'))\"\n data-action=\"next\"\n igxCalendarScrollPage\n (mousedown)=\"nextPage()\"\n (keydown)=\"changePageKB($event)\"\n >\n <ng-container *ngTemplateOutlet=\"nextArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Year -->\n<ng-template #defaultYear let-obj>\n @if (activeView === 'year') {\n <span class=\"igx-calendar__aria-off-screen\" aria-live=\"polite\">{{ formattedYear(obj.date) }}</span>\n }\n <span\n #yearsBtn\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"(obj.date | date: 'yyyy') + ', ' + resourceStrings.igx_calendar_select_year\"\n (keydown)=\"onActiveViewDecadeKB(obj.date, $event, obj.index)\"\n (mousedown)=\"onActiveViewDecade($event, obj.date, obj.index)\"\n class=\"igx-calendar-picker__date\">\n {{ formattedYear(obj.date) }}\n </span>\n</ng-template>\n\n<!-- Decade -->\n<ng-template #defaultDecade>\n <span>{{ getDecadeRange().start }} - {{ getDecadeRange().end }}</span>\n</ng-template>\n\n<!-- PICKER IN MONTHS -->\n<ng-template #calendarYearPicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\">\n <ng-container\n *ngTemplateOutlet=\"defaultYear; context: getContext(0)\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<!-- PICKER IN YEARS -->\n<ng-template #calendarDecadePicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\" aria-live=\"polite\">\n <ng-container\n *ngTemplateOutlet=\"defaultDecade;\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<div\n #wrapper\n [tabIndex]=\"0\"\n class=\"igx-calendar__wrapper\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-multiselectable]=\"selection !== 'single'\"\n aria-labelledby=\"calendar-desc\"\n role=\"grid\"\n (focus)=\"this.onWrapperFocus($event)\"\n (blur)=\"this.onWrapperBlur($event)\"\n >\n <caption id=\"calendar-desc\" tabindex=\"-1\" class=\"igx-calendar__aria-off-screen\">\n {{ resourceStrings.igx_calendar_singular_single_selection}}\n </caption>\n\n <section class=\"igx-calendar__pickers\">\n @if (isDefaultView) {\n <ng-container *ngTemplateOutlet=\"calendarYearPicker\"></ng-container>\n }\n\n @if (isDecadeView) {\n <ng-container *ngTemplateOutlet=\"calendarDecadePicker\"></ng-container>\n }\n </section>\n\n <section class=\"igx-calendar__body\">\n @if (isDefaultView) {\n <igx-months-view\n #months\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.month\"\n [monthFormat]=\"formatOptions.month\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectMonth($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\">\n >\n </igx-months-view>\n }\n\n @if (isDecadeView) {\n <igx-years-view\n #decade\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.year\"\n [yearFormat]=\"formatOptions.year\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectYear($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\"\n >\n </igx-years-view>\n }\n </section>\n</div>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "component", type: IgxMonthsViewComponent, selector: "igx-months-view", inputs: ["id", "standalone", "monthFormat", "formatView"] }, { kind: "component", type: IgxYearsViewComponent, selector: "igx-years-view", inputs: ["standalone", "yearFormat"] }] }); }
34095
34128
  }
34096
34129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxMonthPickerComponent, decorators: [{
34097
34130
  type: Component,
@@ -34111,7 +34144,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
34111
34144
  IgxIconComponent,
34112
34145
  IgxMonthsViewComponent,
34113
34146
  IgxYearsViewComponent,
34114
- ], template: "<!-- Previous arrow icon -->\n<ng-template #prevArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_prev\"></igx-icon>\n</ng-template>\n\n<!-- Next arrow icon -->\n<ng-template #nextArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_next\"></igx-icon>\n</ng-template>\n\n<!-- Previous picker button -->\n<ng-template #prevPageButton let-obj>\n <div\n #prevPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__prev\"\n role=\"button\"\n [attr.aria-label]=\"prevNavLabel((getPrevYearDate(viewDate) | date: 'YYYY'))\"\n data-action=\"prev\"\n igxCalendarScrollPage\n (mousedown)=\"previousPage()\"\n (keydown)=\"changePageKB($event, false)\"\n >\n <ng-container *ngTemplateOutlet=\"prevArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Next picker button -->\n<ng-template #nextPageButton let-obj>\n <div\n #nextPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__next\"\n role=\"button\"\n [attr.aria-label]=\"nextNavLabel((getNextYearDate(viewDate) | date: 'YYYY'))\"\n data-action=\"next\"\n igxCalendarScrollPage\n (mousedown)=\"nextPage()\"\n (keydown)=\"changePageKB($event)\"\n >\n <ng-container *ngTemplateOutlet=\"nextArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Year -->\n<ng-template #defaultYear let-obj>\n @if (activeView === 'year') {\n <span class=\"igx-calendar__aria-off-screen\" aria-live=\"polite\">{{ formattedYear(obj.date) }}</span>\n }\n <span\n #yearsBtn\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"(obj.date | date: 'yyyy') + ', ' + resourceStrings.igx_calendar_select_year\"\n (keydown)=\"onActiveViewDecadeKB(obj.date, $event, obj.index)\"\n (mousedown)=\"onActiveViewDecade($event, obj.date, obj.index)\"\n class=\"igx-calendar-picker__date\">\n {{ formattedYear(obj.date) }}\n </span>\n</ng-template>\n\n<!-- Decade -->\n<ng-template #defaultDecade>\n <span>{{ getDecadeRange().start }} - {{ getDecadeRange().end }}</span>\n</ng-template>\n\n<!-- PICKER IN MONTHS -->\n<ng-template #calendarYearPicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\">\n <ng-container\n *ngTemplateOutlet=\"defaultYear; context: getContext(0)\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<!-- PICKER IN YEARS -->\n<ng-template #calendarDecadePicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\" aria-live=\"polite\">\n <ng-container\n *ngTemplateOutlet=\"defaultDecade;\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<div\n #wrapper\n [tabIndex]=\"0\"\n class=\"igx-calendar__wrapper\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-multiselectable]=\"selection !== 'single'\"\n aria-labelledby=\"calendar-desc\"\n role=\"grid\"\n (focus)=\"this.onWrapperFocus($event)\"\n (blur)=\"this.onWrapperBlur($event)\"\n >\n <caption id=\"calendar-desc\" tabindex=\"-1\" class=\"igx-calendar__aria-off-screen\">\n {{ resourceStrings.igx_calendar_singular_single_selection}}\n </caption>\n\n <section class=\"igx-calendar__pickers\">\n @if (isDefaultView) {\n <ng-container *ngTemplateOutlet=\"calendarYearPicker\"></ng-container>\n }\n\n @if (isDecadeView) {\n <ng-container *ngTemplateOutlet=\"calendarDecadePicker\"></ng-container>\n }\n </section>\n\n <section class=\"igx-calendar__body\">\n @if (isDefaultView) {\n <igx-months-view\n #months\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.month\"\n [monthFormat]=\"formatOptions.month\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectMonth($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\">\n >\n </igx-months-view>\n }\n\n @if (isDecadeView) {\n <igx-years-view\n #decade\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.year\"\n [yearFormat]=\"formatOptions.year\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectYear($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\"\n >\n </igx-years-view>\n }\n </section>\n</div>\n" }]
34147
+ ], template: "<!-- Previous arrow icon -->\n<ng-template #prevArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_prev\"></igx-icon>\n</ng-template>\n\n<!-- Next arrow icon -->\n<ng-template #nextArrow let-obj>\n <igx-icon aria-hidden=\"true\" family=\"default\" name=\"arrow_next\"></igx-icon>\n</ng-template>\n\n<!-- Previous picker button -->\n<ng-template #prevPageButton let-obj>\n <div\n #prevPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__prev\"\n role=\"button\"\n [attr.aria-label]=\"prevNavLabel((getPrevYearDate(viewDate) | date: 'yyyy'))\"\n data-action=\"prev\"\n igxCalendarScrollPage\n (mousedown)=\"previousPage()\"\n (keydown)=\"changePageKB($event, false)\"\n >\n <ng-container *ngTemplateOutlet=\"prevArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Next picker button -->\n<ng-template #nextPageButton let-obj>\n <div\n #nextPageBtn\n tabindex=\"0\"\n class=\"igx-calendar-picker__next\"\n role=\"button\"\n [attr.aria-label]=\"nextNavLabel((getNextYearDate(viewDate) | date: 'yyyy'))\"\n data-action=\"next\"\n igxCalendarScrollPage\n (mousedown)=\"nextPage()\"\n (keydown)=\"changePageKB($event)\"\n >\n <ng-container *ngTemplateOutlet=\"nextArrow\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Year -->\n<ng-template #defaultYear let-obj>\n @if (activeView === 'year') {\n <span class=\"igx-calendar__aria-off-screen\" aria-live=\"polite\">{{ formattedYear(obj.date) }}</span>\n }\n <span\n #yearsBtn\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"(obj.date | date: 'yyyy') + ', ' + resourceStrings.igx_calendar_select_year\"\n (keydown)=\"onActiveViewDecadeKB(obj.date, $event, obj.index)\"\n (mousedown)=\"onActiveViewDecade($event, obj.date, obj.index)\"\n class=\"igx-calendar-picker__date\">\n {{ formattedYear(obj.date) }}\n </span>\n</ng-template>\n\n<!-- Decade -->\n<ng-template #defaultDecade>\n <span>{{ getDecadeRange().start }} - {{ getDecadeRange().end }}</span>\n</ng-template>\n\n<!-- PICKER IN MONTHS -->\n<ng-template #calendarYearPicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\">\n <ng-container\n *ngTemplateOutlet=\"defaultYear; context: getContext(0)\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<!-- PICKER IN YEARS -->\n<ng-template #calendarDecadePicker>\n <section class=\"igx-calendar-picker\">\n <div class=\"igx-calendar-picker__dates\" aria-live=\"polite\">\n <ng-container\n *ngTemplateOutlet=\"defaultDecade;\">\n </ng-container>\n </div>\n <div class=\"igx-calendar-picker__nav\">\n <ng-container *ngTemplateOutlet=\"prevPageButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"nextPageButton\"></ng-container>\n </div>\n </section>\n</ng-template>\n\n<div\n #wrapper\n [tabIndex]=\"0\"\n class=\"igx-calendar__wrapper\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-multiselectable]=\"selection !== 'single'\"\n aria-labelledby=\"calendar-desc\"\n role=\"grid\"\n (focus)=\"this.onWrapperFocus($event)\"\n (blur)=\"this.onWrapperBlur($event)\"\n >\n <caption id=\"calendar-desc\" tabindex=\"-1\" class=\"igx-calendar__aria-off-screen\">\n {{ resourceStrings.igx_calendar_singular_single_selection}}\n </caption>\n\n <section class=\"igx-calendar__pickers\">\n @if (isDefaultView) {\n <ng-container *ngTemplateOutlet=\"calendarYearPicker\"></ng-container>\n }\n\n @if (isDecadeView) {\n <ng-container *ngTemplateOutlet=\"calendarDecadePicker\"></ng-container>\n }\n </section>\n\n <section class=\"igx-calendar__body\">\n @if (isDefaultView) {\n <igx-months-view\n #months\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.month\"\n [monthFormat]=\"formatOptions.month\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectMonth($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\">\n >\n </igx-months-view>\n }\n\n @if (isDecadeView) {\n <igx-years-view\n #decade\n role=\"rowgroup\"\n [tabIndex]=\"-1\"\n [date]=\"viewDate\"\n [locale]=\"locale\"\n [formatView]=\"formatViews.year\"\n [yearFormat]=\"formatOptions.year\"\n [showActive]=\"showActiveDay\"\n [standalone]=\"false\"\n (swiperight)=\"previousPage()\"\n (swipeleft)=\"nextPage()\"\n (selected)=\"selectYear($event)\"\n (pageChanged)=\"updateDate($event)\"\n (mousedown)=\"$event.preventDefault()\"\n >\n </igx-years-view>\n }\n </section>\n</div>\n" }]
34115
34148
  }], propDecorators: { id: [{
34116
34149
  type: HostBinding,
34117
34150
  args: ["attr.id"]
@@ -42991,7 +43024,7 @@ class IgxGridCell {
42991
43024
  // will return undefined for a column layout, because getCellByColumnVisibleIndex may return the column layout at that index.
42992
43025
  // getCellByColumnVisibleIndex is deprecated and will be removed in future version
42993
43026
  return this.column.field ?
42994
- this.column.hasNestedPath ? resolveNestedPath(this.row?.data, this.column.field) : this.row?.data[this.column.field]
43027
+ this.column.hasNestedPath ? resolveNestedPath(this.row?.data, columnFieldPath(this.column.field)) : this.row?.data[this.column.field]
42995
43028
  : undefined;
42996
43029
  }
42997
43030
  /**
@@ -60998,10 +61031,11 @@ class IgxGridCellStyleClassesPipe {
60998
61031
  return '';
60999
61032
  }
61000
61033
  const result = [];
61034
+ const pathParts = columnFieldPath(field);
61001
61035
  for (const cssClass of Object.keys(cssClasses)) {
61002
61036
  const callbackOrValue = cssClasses[cssClass];
61003
61037
  const apply = typeof callbackOrValue === 'function' ?
61004
- callbackOrValue(data, field, resolveNestedPath(data, field), index) : callbackOrValue;
61038
+ callbackOrValue(data, field, resolveNestedPath(data, pathParts), index) : callbackOrValue;
61005
61039
  if (apply) {
61006
61040
  result.push(cssClass);
61007
61041
  }
@@ -61028,9 +61062,10 @@ class IgxGridCellStylesPipe {
61028
61062
  if (!styles) {
61029
61063
  return css;
61030
61064
  }
61065
+ const pathParts = columnFieldPath(field);
61031
61066
  for (const prop of Object.keys(styles)) {
61032
61067
  const res = styles[prop];
61033
- css[prop] = typeof res === 'function' ? res(data, field, resolveNestedPath(data, field), index) : res;
61068
+ css[prop] = typeof res === 'function' ? res(data, field, resolveNestedPath(data, pathParts), index) : res;
61034
61069
  }
61035
61070
  return css;
61036
61071
  }
@@ -61324,7 +61359,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
61324
61359
  }] }], propDecorators: { transform: [] } });
61325
61360
  class IgxGridDataMapperPipe {
61326
61361
  transform(data, field, _, val, isNestedPath) {
61327
- return isNestedPath ? resolveNestedPath(data, field) : val;
61362
+ return isNestedPath ? resolveNestedPath(data, columnFieldPath(field)) : val;
61328
61363
  }
61329
61364
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxGridDataMapperPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
61330
61365
  static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.5", ngImport: i0, type: IgxGridDataMapperPipe, isStandalone: true, name: "dataMapper" }); }
@@ -61355,14 +61390,14 @@ class IgxGridTransactionStatePipe {
61355
61390
  if (rowEditable) {
61356
61391
  const rowCurrentState = transactions.getAggregatedValue(row_id, false);
61357
61392
  if (rowCurrentState) {
61358
- const value = resolveNestedPath(rowCurrentState, field);
61393
+ const value = resolveNestedPath(rowCurrentState, columnFieldPath(field));
61359
61394
  return value !== undefined && value !== null;
61360
61395
  }
61361
61396
  }
61362
61397
  else {
61363
61398
  const transaction = transactions.getState(row_id);
61364
- const value = resolveNestedPath(transaction?.value ?? {}, field);
61365
- return transaction && transaction.value && (value || value === 0 || value === false);
61399
+ const value = resolveNestedPath(transaction?.value ?? {}, columnFieldPath(field));
61400
+ return transaction?.value && (value || value === 0 || value === false);
61366
61401
  }
61367
61402
  }
61368
61403
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IgxGridTransactionStatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
@@ -62723,7 +62758,7 @@ class IgxGridValidationService {
62723
62758
  * @internal
62724
62759
  */
62725
62760
  addFormControl(formGroup, data, column) {
62726
- const value = resolveNestedPath(data || {}, column.field);
62761
+ const value = resolveNestedPath(data || {}, columnFieldPath(column.field));
62727
62762
  const field = this.getFieldKey(column.field);
62728
62763
  const control = new FormControl(value, { updateOn: this.grid.validationTrigger });
62729
62764
  control.addValidators(column.validators);
@@ -63640,7 +63675,7 @@ class IgxGridSummaryService {
63640
63675
  }
63641
63676
  if (!args) {
63642
63677
  this.summaryCacheMap.clear();
63643
- if (this.grid && this.grid.rootSummariesEnabled) {
63678
+ if (this.grid?.rootSummariesEnabled) {
63644
63679
  this.retriggerRootPipe++;
63645
63680
  }
63646
63681
  return;
@@ -63729,15 +63764,17 @@ class IgxGridSummaryService {
63729
63764
  if (!this.hasSummarizedColumns || !data) {
63730
63765
  return rowSummaries;
63731
63766
  }
63732
- this.grid.columns.filter(col => col.hasSummary).forEach((column) => {
63767
+ const columns = this.grid.columns.filter(col => col.hasSummary);
63768
+ const columnPathParts = columns.map(col => columnFieldPath(col.field));
63769
+ for (const [idx, column] of columns.entries()) {
63733
63770
  if (!rowSummaries.get(column.field)) {
63734
- let summaryResult = column.summaries.operate(data.map(r => resolveNestedPath(r, column.field)), data, column.field, groupRecord, this.grid.locale, column.pipeArgs);
63771
+ let summaryResult = column.summaries.operate(data.map(r => resolveNestedPath(r, columnPathParts[idx])), data, column.field, groupRecord, this.grid.locale, column.pipeArgs);
63735
63772
  summaryResult = column.disabledSummaries.length > 0
63736
63773
  ? summaryResult.filter(s => !column.disabledSummaries.includes(s.key))
63737
63774
  : summaryResult;
63738
63775
  rowSummaries.set(column.field, summaryResult);
63739
63776
  }
63740
- });
63777
+ }
63741
63778
  return rowSummaries;
63742
63779
  }
63743
63780
  resetSummaryHeight() {
@@ -69748,7 +69785,7 @@ class IgxGridBaseDirective {
69748
69785
  const key = this.type !== 'pivot' && headers ? col.header || col.field : col.field;
69749
69786
  const rowData = source[row].ghostRecord ? source[row].recordRef : source[row];
69750
69787
  const value = this.type === 'pivot' ? rowData.aggregationValues.get(col.field)
69751
- : resolveNestedPath(rowData, col.field);
69788
+ : resolveNestedPath(rowData, columnFieldPath(col.field));
69752
69789
  record[key] = formatters && col.formatter ? col.formatter(value, rowData) : value;
69753
69790
  if (columnData) {
69754
69791
  if (!record[key]) {
@@ -70217,14 +70254,15 @@ class IgxGridBaseDirective {
70217
70254
  const searchText = caseSensitive ? this._lastSearchInfo.searchText : this._lastSearchInfo.searchText.toLowerCase();
70218
70255
  const data = this.filteredSortedData;
70219
70256
  const columnItems = this.visibleColumns.filter((c) => !c.columnGroup).sort((c1, c2) => c1.visibleIndex - c2.visibleIndex);
70257
+ const columnsPathParts = columnItems.map(col => columnFieldPath(col.field));
70220
70258
  data.forEach((dataRow, rowIndex) => {
70221
- columnItems.forEach((c) => {
70259
+ columnItems.forEach((c, cid) => {
70222
70260
  const pipeArgs = this.getColumnByName(c.field).pipeArgs;
70223
- const value = c.formatter ? c.formatter(resolveNestedPath(dataRow, c.field), dataRow) :
70224
- c.dataType === 'number' ? formatNumber(resolveNestedPath(dataRow, c.field), this.locale, pipeArgs.digitsInfo) :
70261
+ const value = c.formatter ? c.formatter(resolveNestedPath(dataRow, columnsPathParts[cid]), dataRow) :
70262
+ c.dataType === 'number' ? formatNumber(resolveNestedPath(dataRow, columnsPathParts[cid]), this.locale, pipeArgs.digitsInfo) :
70225
70263
  c.dataType === 'date'
70226
- ? formatDate(resolveNestedPath(dataRow, c.field), pipeArgs.format, this.locale, pipeArgs.timezone)
70227
- : resolveNestedPath(dataRow, c.field);
70264
+ ? formatDate(resolveNestedPath(dataRow, columnsPathParts[cid]), pipeArgs.format, this.locale, pipeArgs.timezone)
70265
+ : resolveNestedPath(dataRow, columnsPathParts[cid]);
70228
70266
  if (value !== undefined && value !== null && c.searchable) {
70229
70267
  let searchValue = caseSensitive ? String(value) : String(value).toLowerCase();
70230
70268
  if (exactMatch) {
@@ -77249,10 +77287,11 @@ class IgxPivotGridCellStyleClassesPipe {
77249
77287
  return '';
77250
77288
  }
77251
77289
  const result = [];
77290
+ const pathParts = columnFieldPath(columnData.field);
77252
77291
  for (const cssClass of Object.keys(cssClasses)) {
77253
77292
  const callbackOrValue = cssClasses[cssClass];
77254
77293
  const apply = typeof callbackOrValue === 'function' ?
77255
- callbackOrValue(rowData, columnData, resolveNestedPath(rowData, columnData.field), index) : callbackOrValue;
77294
+ callbackOrValue(rowData, columnData, resolveNestedPath(rowData, pathParts), index) : callbackOrValue;
77256
77295
  if (apply) {
77257
77296
  result.push(cssClass);
77258
77297
  }
@@ -86144,7 +86183,7 @@ class IgxGridHierarchicalPipe {
86144
86183
  v[childKey] = [];
86145
86184
  }
86146
86185
  const hasNestedPath = childKey?.includes('.');
86147
- const childData = !hasNestedPath ? v[childKey] : resolveNestedPath(v, childKey);
86186
+ const childData = !hasNestedPath ? v[childKey] : resolveNestedPath(v, columnFieldPath(childKey));
86148
86187
  childGridsData[childKey] = childData;
86149
86188
  });
86150
86189
  if (grid.gridAPI.get_row_expansion_state(v)) {