igniteui-angular 17.2.25 → 17.2.27

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 (26) hide show
  1. package/esm2022/lib/avatar/avatar.component.mjs +17 -2
  2. package/esm2022/lib/calendar/common/calendar-view.directive.mjs +3 -2
  3. package/esm2022/lib/calendar/common/model.mjs +3 -2
  4. package/esm2022/lib/core/utils.mjs +30 -11
  5. package/esm2022/lib/date-picker/date-picker.component.mjs +7 -3
  6. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +2 -2
  7. package/esm2022/lib/directives/drag-drop/drag-drop.directive.mjs +20 -22
  8. package/esm2022/lib/directives/for-of/for_of.directive.mjs +5 -3
  9. package/esm2022/lib/grids/grid-base.directive.mjs +2 -2
  10. package/esm2022/lib/grids/moving/moving.drag.directive.mjs +3 -3
  11. package/esm2022/lib/query-builder/query-builder.component.mjs +9 -19
  12. package/esm2022/lib/services/animation/angular-animation-player.mjs +4 -2
  13. package/esm2022/lib/tabs/tabs/tab-header.component.mjs +7 -5
  14. package/esm2022/lib/tabs/tabs/tabs.component.mjs +15 -11
  15. package/fesm2022/igniteui-angular.mjs +106 -71
  16. package/fesm2022/igniteui-angular.mjs.map +1 -1
  17. package/lib/avatar/avatar.component.d.ts +3 -1
  18. package/lib/core/styles/components/action-strip/_action-strip-component.scss +1 -1
  19. package/lib/core/styles/components/grid/_grid-component.scss +1 -0
  20. package/lib/core/styles/components/paginator/_paginator-component.scss +1 -1
  21. package/lib/core/styles/components/query-builder/_query-builder-component.scss +9 -1
  22. package/lib/core/utils.d.ts +5 -0
  23. package/lib/date-picker/date-picker.component.d.ts +2 -1
  24. package/lib/directives/drag-drop/drag-drop.directive.d.ts +1 -0
  25. package/lib/tabs/tabs/tabs.component.d.ts +3 -1
  26. package/package.json +1 -1
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, Directive, Input, HostListener, isDevMode, PLATFORM_ID, Inject, EventEmitter, ViewContainerRef, ElementRef, InjectionToken, Optional, Output, HostBinding, Self, booleanAttribute, SecurityContext, TemplateRef, Component, ViewChild, ContentChildren, ContentChild, RendererStyleFlags2, Pipe, inject, LOCALE_ID, forwardRef, Host, QueryList, ViewChildren, ChangeDetectionStrategy, SimpleChange, SkipSelf, createComponent, 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, Subject, fromEvent, interval, animationFrameScheduler, noop, merge, Subscription, timer, pipe } from 'rxjs';
5
+ import { Observable, NEVER, Subject, fromEvent, interval, animationFrameScheduler, noop, merge, Subscription, timer, takeUntil as takeUntil$1, pipe } from 'rxjs';
6
6
  import { takeUntil, filter, first as first$2, throttle, throttleTime, startWith, take, debounce, tap, switchMap, skipLast, debounceTime, map, shareReplay, takeWhile, 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';
@@ -359,7 +359,9 @@ const isObject = (value) => !!(value && value.toString() === '[object Object]');
359
359
  * @returns true if provided variable is Date
360
360
  * @hidden
361
361
  */
362
- const isDate = (value) => value instanceof Date;
362
+ const isDate = (value) => {
363
+ return Object.prototype.toString.call(value) === "[object Date]";
364
+ };
363
365
  /**
364
366
  * Checks if the two passed arguments are equal
365
367
  * Currently supports date objects
@@ -554,14 +556,24 @@ const HEADER_KEYS = new Set([...Array.from(NAVIGATION_KEYS), 'escape', 'esc', 'l
554
556
  * Run the resizeObservable outside angular zone, because it patches the MutationObserver which causes an infinite loop.
555
557
  * Related issue: https://github.com/angular/angular/issues/31712
556
558
  */
557
- const resizeObservable = (target) => new Observable((observer) => {
558
- const instance = new (getResizeObserver())((entries) => {
559
- observer.next(entries);
560
- });
561
- instance.observe(target);
562
- const unsubscribe = () => instance.disconnect();
563
- return unsubscribe;
564
- });
559
+ const resizeObservable = (target) => {
560
+ const resizeObserver = getResizeObserver();
561
+ // check whether we are on server env or client env
562
+ if (resizeObserver) {
563
+ return new Observable((observer) => {
564
+ const instance = new resizeObserver((entries) => {
565
+ observer.next(entries);
566
+ });
567
+ instance.observe(target);
568
+ const unsubscribe = () => instance.disconnect();
569
+ return unsubscribe;
570
+ });
571
+ }
572
+ else {
573
+ // if on a server env return a empty observable that does not complete immediately
574
+ return NEVER;
575
+ }
576
+ };
565
577
  /**
566
578
  * @hidden
567
579
  * @internal
@@ -713,6 +725,13 @@ function* intoChunks(arr, size) {
713
725
  yield arr.slice(i, i + size);
714
726
  }
715
727
  }
728
+ /**
729
+ * @param path - The URI path to be normalized.
730
+ * @returns string encoded using the encodeURI function.
731
+ */
732
+ function normalizeURI(path) {
733
+ return path.split('/').map(encodeURI).join('/');
734
+ }
716
735
 
717
736
  var PagingError;
718
737
  (function (PagingError) {
@@ -4686,7 +4705,9 @@ class IgxAngularAnimationPlayer {
4686
4705
  // To workaround this we are getting the positions from the inner player.
4687
4706
  // This is logged in Angular here - https://github.com/angular/angular/issues/18891
4688
4707
  // As soon as this is resolved we can remove this hack
4689
- this._innerPlayer = innerRenderer.engine.players[innerRenderer.engine.players.length - 1];
4708
+ const rendererEngine = innerRenderer.engine || innerRenderer.delegate.engine;
4709
+ // A workaround because of Angular SSR is using some delegation.
4710
+ this._innerPlayer = rendererEngine.players[rendererEngine.players.length - 1];
4690
4711
  }
4691
4712
  init() {
4692
4713
  this.internalPlayer.init();
@@ -10612,9 +10633,7 @@ class IgxDragDirective {
10612
10633
  fromEvent(document.defaultView, 'mouseup').pipe(takeUntil(this._destroy))
10613
10634
  .subscribe((res) => this.onPointerUp(res));
10614
10635
  }
10615
- this.element.nativeElement.addEventListener('transitionend', (args) => {
10616
- this.onTransitionEnd(args);
10617
- });
10636
+ this.element.nativeElement.addEventListener('transitionend', this.onTransitionEnd.bind(this));
10618
10637
  });
10619
10638
  // Set transition duration to 0s. This also helps with setting `visibility: hidden` to the base to not lag.
10620
10639
  this.element.nativeElement.style.transitionDuration = '0.0s';
@@ -10633,6 +10652,7 @@ class IgxDragDirective {
10633
10652
  this._dynamicGhostRef = null;
10634
10653
  }
10635
10654
  }
10655
+ this.element.nativeElement.removeEventListener('transitionend', this.onTransitionEnd);
10636
10656
  if (this._containerScrollIntervalId) {
10637
10657
  clearInterval(this._containerScrollIntervalId);
10638
10658
  this._containerScrollIntervalId = null;
@@ -11017,12 +11037,7 @@ class IgxDragDirective {
11017
11037
  if (ghostDestroyArgs.cancel) {
11018
11038
  return;
11019
11039
  }
11020
- this.ghostElement.remove();
11021
- this.ghostElement = null;
11022
- if (this._dynamicGhostRef) {
11023
- this._dynamicGhostRef.destroy();
11024
- this._dynamicGhostRef = null;
11025
- }
11040
+ this.clearGhost();
11026
11041
  }
11027
11042
  else if (!this.ghost) {
11028
11043
  this.element.nativeElement.style.transitionProperty = '';
@@ -11044,6 +11059,18 @@ class IgxDragDirective {
11044
11059
  });
11045
11060
  });
11046
11061
  }
11062
+ clearGhost() {
11063
+ this.ghostElement.removeEventListener('pointermove', this.onPointerMove);
11064
+ this.ghostElement.removeEventListener('pointerup', this.onPointerUp);
11065
+ this.ghostElement.removeEventListener('lostpointercapture', this.onPointerLost);
11066
+ this.ghostElement.removeEventListener('transitionend', this.onTransitionEnd);
11067
+ this.ghostElement.remove();
11068
+ this.ghostElement = null;
11069
+ if (this._dynamicGhostRef) {
11070
+ this._dynamicGhostRef.destroy();
11071
+ this._dynamicGhostRef = null;
11072
+ }
11073
+ }
11047
11074
  /**
11048
11075
  * @hidden
11049
11076
  * Create ghost element - if a Node object is provided it creates a clone of that node,
@@ -11113,20 +11140,12 @@ class IgxDragDirective {
11113
11140
  if (this._pointerDownId !== null) {
11114
11141
  this.ghostElement.setPointerCapture(this._pointerDownId);
11115
11142
  }
11116
- this.ghostElement.addEventListener('pointermove', (args) => {
11117
- this.onPointerMove(args);
11118
- });
11119
- this.ghostElement.addEventListener('pointerup', (args) => {
11120
- this.onPointerUp(args);
11121
- });
11122
- this.ghostElement.addEventListener('lostpointercapture', (args) => {
11123
- this.onPointerLost(args);
11124
- });
11143
+ this.ghostElement.addEventListener('pointermove', this.onPointerMove.bind(this));
11144
+ this.ghostElement.addEventListener('pointerup', this.onPointerUp.bind(this));
11145
+ this.ghostElement.addEventListener('lostpointercapture', this.onPointerLost.bind(this));
11125
11146
  }
11126
11147
  // Transition animation when the ghostElement is released and it returns to it's original position.
11127
- this.ghostElement.addEventListener('transitionend', (args) => {
11128
- this.onTransitionEnd(args);
11129
- });
11148
+ this.ghostElement.addEventListener('transitionend', this.onTransitionEnd.bind(this));
11130
11149
  this.cdr.detectChanges();
11131
11150
  }
11132
11151
  /**
@@ -13168,8 +13187,10 @@ class IgxForOfDirective extends IgxForOfToken {
13168
13187
  ngAfterViewInit() {
13169
13188
  if (this.igxForScrollOrientation === 'vertical') {
13170
13189
  this._zone.runOutsideAngular(() => {
13171
- this.contentObserver = new (getResizeObserver())(() => this.contentResizeNotify.next());
13172
- this.contentObserver.observe(this.dc.instance._viewContainer.element.nativeElement);
13190
+ if (this.platformUtil.isBrowser) {
13191
+ this.contentObserver = new (getResizeObserver())(() => this.contentResizeNotify.next());
13192
+ this.contentObserver.observe(this.dc.instance._viewContainer.element.nativeElement);
13193
+ }
13173
13194
  });
13174
13195
  }
13175
13196
  }
@@ -26823,6 +26844,21 @@ class IgxAvatarComponent {
26823
26844
  get isCircle() {
26824
26845
  return this.shape === 'circle';
26825
26846
  }
26847
+ /**
26848
+ * Sets the image source of the avatar.
26849
+ *
26850
+ * @example
26851
+ * ```html
26852
+ * <igx-avatar src="images/picture.jpg"></igx-avatar>
26853
+ * ```
26854
+ * @igxFriendlyName Image URL
26855
+ */
26856
+ set src(value) {
26857
+ this._src = normalizeURI(value);
26858
+ }
26859
+ get src() {
26860
+ return this._src;
26861
+ }
26826
26862
  /**
26827
26863
  * Returns the size of the avatar.
26828
26864
  *
@@ -28022,7 +28058,7 @@ const IGX_BUTTON_GROUP_DIRECTIVES = [
28022
28058
  const daysInWeek = 7;
28023
28059
  const millisecondsInDay = 86400000;
28024
28060
  function toCalendarDay(date) {
28025
- return date instanceof Date ? CalendarDay.from(date) : date;
28061
+ return isDate(date) ? CalendarDay.from(date) : date;
28026
28062
  }
28027
28063
  function checkRollover(original, modified) {
28028
28064
  return original.date !== modified.date
@@ -28649,7 +28685,7 @@ class IgxCalendarViewDirective {
28649
28685
  * @memberof IgxYearsViewComponent
28650
28686
  */
28651
28687
  set date(value) {
28652
- if (!(value instanceof Date))
28688
+ if (!isDate(value))
28653
28689
  return;
28654
28690
  this._date = value;
28655
28691
  }
@@ -39188,6 +39224,7 @@ class IgxDatePickerComponent extends PickerBaseDirective {
39188
39224
  this._calendar.locale = this.locale;
39189
39225
  this._calendar.weekStart = this.weekStart;
39190
39226
  this._calendar.specialDates = this.specialDates;
39227
+ this._calendar.headerTitleTemplate = this.headerTitleTemplate;
39191
39228
  this._calendar.headerTemplate = this.headerTemplate;
39192
39229
  this._calendar.subheaderTemplate = this.subheaderTemplate;
39193
39230
  this._calendar.headerOrientation = this.headerOrientation;
@@ -39226,7 +39263,7 @@ class IgxDatePickerComponent extends PickerBaseDirective {
39226
39263
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.2.4", type: IgxDatePickerComponent, isStandalone: true, selector: "igx-date-picker", inputs: { hideOutsideDays: ["hideOutsideDays", "hideOutsideDays", booleanAttribute], displayMonthsCount: "displayMonthsCount", showWeekNumbers: ["showWeekNumbers", "showWeekNumbers", booleanAttribute], formatter: "formatter", headerOrientation: "headerOrientation", todayButtonLabel: "todayButtonLabel", cancelButtonLabel: "cancelButtonLabel", spinLoop: ["spinLoop", "spinLoop", booleanAttribute], spinDelta: "spinDelta", outlet: "outlet", id: "id", formatViews: "formatViews", disabledDates: "disabledDates", specialDates: "specialDates", calendarFormat: "calendarFormat", value: "value", minValue: "minValue", maxValue: "maxValue", resourceStrings: "resourceStrings", readOnly: ["readOnly", "readOnly", booleanAttribute] }, outputs: { valueChange: "valueChange", validationFailed: "validationFailed" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "attr.id": "this.id" } }, providers: [
39227
39264
  { provide: NG_VALUE_ACCESSOR, useExisting: IgxDatePickerComponent, multi: true },
39228
39265
  { provide: NG_VALIDATORS, useExisting: IgxDatePickerComponent, multi: true }
39229
- ], queries: [{ propertyName: "label", first: true, predicate: IgxLabelDirective, descendants: true }, { propertyName: "headerTemplate", first: true, predicate: IgxCalendarHeaderTemplateDirective, descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: IgxCalendarSubheaderTemplateDirective, descendants: true }, { propertyName: "pickerActions", first: true, predicate: IgxPickerActionsDirective, descendants: true }, { propertyName: "clearComponents", predicate: IgxPickerClearComponent }], viewQueries: [{ propertyName: "dateTimeEditor", first: true, predicate: IgxDateTimeEditorDirective, descendants: true, static: true }, { propertyName: "viewContainerRef", first: true, predicate: IgxInputGroupComponent, descendants: true, read: ViewContainerRef }, { propertyName: "labelDirective", first: true, predicate: IgxLabelDirective, descendants: true }, { propertyName: "inputDirective", first: true, predicate: IgxInputDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group [displayDensity]=\"displayDensity\" [type]=\"type\">\n <igx-prefix *ngIf=\"!toggleComponents.length\" (click)=\"toggle()\">\n <igx-icon [title]=\"value\n ? pickerResourceStrings.igx_date_picker_change_date\n : pickerResourceStrings.igx_date_picker_choose_date\">calendar_today</igx-icon>\n </igx-prefix>\n\n <input class=\"igx-date-picker__input-date\" [displayValuePipe]=\"formatter ? displayValue : null\" igxInput\n [igxDateTimeEditor]=\"inputFormat\" [displayFormat]=\"displayFormat\"\n [minValue]=\"minValue\" [maxValue]=\"maxValue\" [spinDelta]=\"spinDelta\" [spinLoop]=\"spinLoop\"\n [disabled]=\"disabled\" [placeholder]=\"placeholder\" [readonly]=\"!isDropdown || readOnly\"\n [igxTextSelection]=\"isDropdown && !readOnly\" [locale]=\"locale\" [attr.aria-expanded]=\"!collapsed\"\n [attr.aria-labelledby]=\"label?.id\" aria-haspopup=\"dialog\" aria-autocomplete=\"none\" role=\"combobox\">\n\n <igx-suffix *ngIf=\"!clearComponents.length && value\" (click)=\"clear()\">\n <igx-icon>clear</igx-icon>\n </igx-suffix>\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", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { 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", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: IgxTextSelectionDirective, selector: "[igxTextSelection]", inputs: ["igxTextSelection"], exportAs: ["igxTextSelection"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }] }); }
39266
+ ], queries: [{ propertyName: "label", first: true, predicate: IgxLabelDirective, descendants: true }, { propertyName: "headerTitleTemplate", first: true, predicate: IgxCalendarHeaderTitleTemplateDirective, descendants: true }, { propertyName: "headerTemplate", first: true, predicate: IgxCalendarHeaderTemplateDirective, descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: IgxCalendarSubheaderTemplateDirective, descendants: true }, { propertyName: "pickerActions", first: true, predicate: IgxPickerActionsDirective, descendants: true }, { propertyName: "clearComponents", predicate: IgxPickerClearComponent }], viewQueries: [{ propertyName: "dateTimeEditor", first: true, predicate: IgxDateTimeEditorDirective, descendants: true, static: true }, { propertyName: "viewContainerRef", first: true, predicate: IgxInputGroupComponent, descendants: true, read: ViewContainerRef }, { propertyName: "labelDirective", first: true, predicate: IgxLabelDirective, descendants: true }, { propertyName: "inputDirective", first: true, predicate: IgxInputDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group [displayDensity]=\"displayDensity\" [type]=\"type\">\n <igx-prefix *ngIf=\"!toggleComponents.length\" (click)=\"toggle()\">\n <igx-icon [title]=\"value\n ? pickerResourceStrings.igx_date_picker_change_date\n : pickerResourceStrings.igx_date_picker_choose_date\">calendar_today</igx-icon>\n </igx-prefix>\n\n <input class=\"igx-date-picker__input-date\" [displayValuePipe]=\"formatter ? displayValue : null\" igxInput\n [igxDateTimeEditor]=\"inputFormat\" [displayFormat]=\"displayFormat\"\n [minValue]=\"minValue\" [maxValue]=\"maxValue\" [spinDelta]=\"spinDelta\" [spinLoop]=\"spinLoop\"\n [disabled]=\"disabled\" [placeholder]=\"placeholder\" [readonly]=\"!isDropdown || readOnly\"\n [igxTextSelection]=\"isDropdown && !readOnly\" [locale]=\"locale\" [attr.aria-expanded]=\"!collapsed\"\n [attr.aria-labelledby]=\"label?.id\" aria-haspopup=\"dialog\" aria-autocomplete=\"none\" role=\"combobox\">\n\n <igx-suffix *ngIf=\"!clearComponents.length && value\" (click)=\"clear()\">\n <igx-icon>clear</igx-icon>\n </igx-suffix>\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", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { 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", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: IgxTextSelectionDirective, selector: "[igxTextSelection]", inputs: ["igxTextSelection"], exportAs: ["igxTextSelection"] }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }] }); }
39230
39267
  }
39231
39268
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: IgxDatePickerComponent, decorators: [{
39232
39269
  type: Component,
@@ -39316,6 +39353,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
39316
39353
  }], label: [{
39317
39354
  type: ContentChild,
39318
39355
  args: [IgxLabelDirective]
39356
+ }], headerTitleTemplate: [{
39357
+ type: ContentChild,
39358
+ args: [IgxCalendarHeaderTitleTemplateDirective]
39319
39359
  }], headerTemplate: [{
39320
39360
  type: ContentChild,
39321
39361
  args: [IgxCalendarHeaderTemplateDirective]
@@ -47228,28 +47268,18 @@ class IgxQueryBuilderComponent extends DisplayDensityBase {
47228
47268
  * @hidden @internal
47229
47269
  */
47230
47270
  deleteGroup() {
47231
- const selectedGroup = this.contextualGroup;
47271
+ let selectedGroup = this.contextualGroup;
47232
47272
  let parent = selectedGroup.parent;
47233
- if (parent) {
47273
+ if (!parent) {
47274
+ this.rootGroup = null;
47275
+ }
47276
+ while (parent) {
47234
47277
  let index = parent.children.indexOf(selectedGroup);
47235
47278
  parent.children.splice(index, 1);
47236
- if (parent.children.length === 0) {
47237
- let childGroup = parent;
47238
- parent = parent.parent;
47239
- while (parent && parent.children.length === 1) {
47240
- childGroup = parent;
47241
- parent = parent.parent;
47242
- }
47243
- if (parent) {
47244
- index = parent.children.indexOf(childGroup);
47245
- parent.children.splice(index, 1);
47246
- }
47247
- else {
47248
- this.rootGroup = null;
47249
- }
47250
- }
47279
+ selectedGroup = parent;
47280
+ parent = parent.children.length === 0 ? parent.parent : null;
47251
47281
  }
47252
- else {
47282
+ if (this.rootGroup?.children.length === 0) {
47253
47283
  this.rootGroup = null;
47254
47284
  }
47255
47285
  this.clearSelection();
@@ -53860,7 +53890,7 @@ class IgxColumnMovingDragDirective extends IgxDragDirective {
53860
53890
  source: this.column
53861
53891
  };
53862
53892
  this.column.grid.columnMovingStart.emit(movingStartArgs);
53863
- this.subscription$ = fromEvent(this.column.grid.document.defaultView, 'keydown').subscribe((ev) => {
53893
+ this.subscription$ = fromEvent(this.column.grid.document.defaultView, 'keydown').pipe(takeUntil$1(this._destroy)).subscribe((ev) => {
53864
53894
  if (ev.key === this.platformUtil.KEYMAP.ESCAPE) {
53865
53895
  this.onEscape(ev);
53866
53896
  }
@@ -63269,7 +63299,7 @@ class IgxGridBaseDirective extends DisplayDensityBase {
63269
63299
  .subscribe((change) => {
63270
63300
  this.onPinnedRowsChanged(change);
63271
63301
  });
63272
- this.addRowSnackbar?.clicked.subscribe(() => {
63302
+ this.addRowSnackbar?.clicked.pipe(takeUntil(this.destroy$)).subscribe(() => {
63273
63303
  const rec = this.filteredSortedData[this.lastAddedRowIndex];
63274
63304
  this.scrollTo(rec, 0);
63275
63305
  this.addRowSnackbar.close();
@@ -86137,9 +86167,10 @@ class IgxTabsComponent extends IgxTabsDirective {
86137
86167
  this.realignSelectedIndicator();
86138
86168
  });
86139
86169
  }
86140
- constructor(animationService, cdr, ngZone, dir) {
86170
+ constructor(animationService, cdr, ngZone, platform, dir) {
86141
86171
  super(animationService, cdr, dir);
86142
86172
  this.ngZone = ngZone;
86173
+ this.platform = platform;
86143
86174
  /** @hidden */
86144
86175
  this.defaultClass = true;
86145
86176
  /** @hidden */
@@ -86152,12 +86183,14 @@ class IgxTabsComponent extends IgxTabsDirective {
86152
86183
  ngAfterViewInit() {
86153
86184
  super.ngAfterViewInit();
86154
86185
  this.ngZone.runOutsideAngular(() => {
86155
- this._resizeObserver = new (getResizeObserver())(() => {
86156
- this.updateScrollButtons();
86157
- this.realignSelectedIndicator();
86158
- });
86159
- this._resizeObserver.observe(this.headerContainer.nativeElement);
86160
- this._resizeObserver.observe(this.viewPort.nativeElement);
86186
+ if (this.platform.isBrowser) {
86187
+ this._resizeObserver = new (getResizeObserver())(() => {
86188
+ this.updateScrollButtons();
86189
+ this.realignSelectedIndicator();
86190
+ });
86191
+ this._resizeObserver.observe(this.headerContainer.nativeElement);
86192
+ this._resizeObserver.observe(this.viewPort.nativeElement);
86193
+ }
86161
86194
  });
86162
86195
  }
86163
86196
  /** @hidden @internal */
@@ -86329,7 +86362,7 @@ class IgxTabsComponent extends IgxTabsDirective {
86329
86362
  getElementOffset(element) {
86330
86363
  return this.dir.rtl ? this.itemsWrapper.nativeElement.offsetWidth - element.offsetLeft - element.offsetWidth : element.offsetLeft;
86331
86364
  }
86332
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: IgxTabsComponent, deps: [{ token: IgxAngularAnimationService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: IgxDirectionality }], target: i0.ɵɵFactoryTarget.Component }); }
86365
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: IgxTabsComponent, deps: [{ token: IgxAngularAnimationService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: PlatformUtil }, { token: IgxDirectionality }], target: i0.ɵɵFactoryTarget.Component }); }
86333
86366
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: IgxTabsComponent, isStandalone: true, selector: "igx-tabs", inputs: { tabAlignment: "tabAlignment" }, host: { properties: { "class.igx-tabs": "this.defaultClass" } }, providers: [{ provide: IgxTabsBase, useExisting: IgxTabsComponent }], viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["headerContainer"], descendants: true, static: true }, { propertyName: "viewPort", first: true, predicate: ["viewPort"], descendants: true, static: true }, { propertyName: "itemsWrapper", first: true, predicate: ["itemsWrapper"], descendants: true, static: true }, { propertyName: "itemsContainer", first: true, predicate: ["itemsContainer"], descendants: true, static: true }, { propertyName: "selectedIndicator", first: true, predicate: ["selectedIndicator"], descendants: true }, { propertyName: "scrollPrevButton", first: true, predicate: ["scrollPrevButton"], descendants: true }, { propertyName: "scrollNextButton", first: true, predicate: ["scrollNextButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #headerContainer class=\"igx-tabs__header\">\n <button #scrollPrevButton type=\"button\" igxIconButton=\"flat\" igxRipple class=\"igx-tabs__header-button\" (click)=\"scrollPrev()\">\n <igx-icon>navigate_before</igx-icon>\n </button>\n <div #viewPort class=\"igx-tabs__header-content\">\n <div #itemsWrapper class=\"igx-tabs__header-wrapper\" role=\"tablist\">\n <div #itemsContainer class=\"igx-tabs__header-scroll\" [ngClass]=\"resolveHeaderScrollClasses()\">\n <ng-container *ngFor=\"let tab of items; let i = index\">\n <ng-container *ngTemplateOutlet=\"tab.headerTemplate\"></ng-container>\n </ng-container>\n </div>\n <div #selectedIndicator *ngIf=\"items.length > 0\" class=\"igx-tabs__header-active-indicator\">\n </div>\n </div>\n </div>\n <button #scrollNextButton type=\"button\" igxIconButton=\"flat\" igxRipple class=\"igx-tabs__header-button\" (click)=\"scrollNext()\">\n <igx-icon>navigate_next</igx-icon>\n </button>\n</div>\n<div class=\"igx-tabs__panels\">\n <ng-container *ngFor=\"let tab of items; let i = index\">\n <ng-container *ngTemplateOutlet=\"tab.panelTemplate\"></ng-container>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { 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"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
86334
86367
  }
86335
86368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: IgxTabsComponent, decorators: [{
@@ -86338,7 +86371,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
86338
86371
  }], ctorParameters: () => [{ type: undefined, decorators: [{
86339
86372
  type: Inject,
86340
86373
  args: [IgxAngularAnimationService]
86341
- }] }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: IgxDirectionality }], propDecorators: { tabAlignment: [{
86374
+ }] }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: PlatformUtil }, { type: IgxDirectionality }], propDecorators: { tabAlignment: [{
86342
86375
  type: Input
86343
86376
  }], headerContainer: [{
86344
86377
  type: ViewChild,
@@ -86439,10 +86472,12 @@ class IgxTabHeaderComponent extends IgxTabHeaderDirective {
86439
86472
  /** @hidden @internal */
86440
86473
  ngAfterViewInit() {
86441
86474
  this.ngZone.runOutsideAngular(() => {
86442
- this._resizeObserver = new (getResizeObserver())(() => {
86443
- this.tabs.realignSelectedIndicator();
86444
- });
86445
- this._resizeObserver.observe(this.nativeElement);
86475
+ if (this.platform.isBrowser) {
86476
+ this._resizeObserver = new (getResizeObserver())(() => {
86477
+ this.tabs.realignSelectedIndicator();
86478
+ });
86479
+ this._resizeObserver.observe(this.nativeElement);
86480
+ }
86446
86481
  });
86447
86482
  }
86448
86483
  /** @hidden @internal */
@@ -89670,7 +89705,6 @@ class IgxDateRangePickerComponent extends PickerBaseDirective {
89670
89705
  // input click
89671
89706
  if (this.hasProjectedInputs && this._focusedInput) {
89672
89707
  this._focusedInput.setFocus();
89673
- this._focusedInput = null;
89674
89708
  }
89675
89709
  if (this.inputDirective) {
89676
89710
  this.inputDirective.focus();
@@ -89714,6 +89748,7 @@ class IgxDateRangePickerComponent extends PickerBaseDirective {
89714
89748
  this.updateCalendar();
89715
89749
  }
89716
89750
  updateValidityOnBlur() {
89751
+ this._focusedInput = null;
89717
89752
  this.onTouchCallback();
89718
89753
  if (this._ngControl) {
89719
89754
  if (this.hasProjectedInputs) {