Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
a36aa13
feat(overlay): remove outlet from pickers
wnvko Apr 3, 2026
d9f13ed
feat(overlay): remove outlet from notifications
wnvko Apr 3, 2026
20cc250
feat(overlay): remove outlet from toggle directive
wnvko Apr 3, 2026
c2f3146
feat(overlay): remove row editing outlet
wnvko Apr 3, 2026
835c6fc
feat(overlay): remove grid loading outlet
wnvko Apr 3, 2026
b793b4d
feat(overlay): remove outlet from query builder
wnvko Apr 3, 2026
f748bfc
feat(overlay): remove outlet from grid toolbar
wnvko Apr 3, 2026
c67e0a7
feat(overlay): remove outlet from column moving
wnvko Apr 6, 2026
3149ee2
feat(overlay): remove outlet from filtering row
wnvko Apr 6, 2026
1a703a9
feat(overlay): remove outlet form grid's action strip
wnvko Apr 6, 2026
4d1292d
feat(overlay): remove outlet from grid paginator
wnvko Apr 6, 2026
838eab6
feat(overlay): remove outlet from query builder tree
wnvko Apr 6, 2026
975ec1f
chore(overlay): address PR comments
wnvko Apr 6, 2026
fd142ac
chore(overlay): address PR comments - 2
wnvko Apr 6, 2026
dbd78cf
Merge remote-tracking branch 'remotes/origin/master' into mvenkov/rem…
wnvko Apr 6, 2026
df2ca1a
Merge branch 'master' into mvenkov/remove-internal-overlay-outlets
ChronosSF Apr 6, 2026
be730aa
chore(overlay): revert public properties removal
wnvko Apr 7, 2026
af6099e
feat(overlay): remove igxDragGhostHost and reuse grid outlet instead
wnvko Apr 7, 2026
60c6392
Merge branch 'mvenkov/remove-internal-overlay-outlets' of https://git…
wnvko Apr 7, 2026
713812b
chore(overlay): remove unnecessary change in notifications directive
wnvko Apr 7, 2026
e26d8c5
Merge branch 'master' into mvenkov/remove-internal-overlay-outlets
ChronosSF Apr 8, 2026
8c14e94
Merge branch 'master' into mvenkov/remove-internal-overlay-outlets
damyanpetev Apr 8, 2026
1acabf6
Merge branch 'master' into mvenkov/remove-internal-overlay-outlets
ChronosSF Apr 14, 2026
6498eb4
Merge branch 'master' into mvenkov/remove-internal-overlay-outlets
ChronosSF Apr 14, 2026
d8361c6
feat(overlay): remove unused outlet related styles
wnvko Apr 14, 2026
f311db7
test(overlay): better way to get select items in query builder
wnvko Apr 14, 2026
7b44604
chore(overlay): fix overload order and put deprecated last
wnvko Apr 14, 2026
a9c55f9
fix(overlay): make static view-child not nullable
wnvko Apr 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ The date picker also supports binding through `ngModel` if two-way date-bind is
| `overlaySettings` | Changes the default overlay settings used by the `IgxDatePickerComponent`. | OverlaySettings |
| `placeholder` | Sets the placeholder text for empty input. | string |
| `disabled` | Disables or enables the picker. | boolean |
| `outlet` | **Deprecated.** The container used for the pop up element. | IgxOverlayOutletDirective \| ElementRef |
| `type` | Determines how the picker will be styled. | IgxInputGroupType |
| `spinLoop` | Determines if the currently spun date segment should loop over. | boolean |
| `spinDelta` | Delta values used to increment or decrement each editor date part on spin actions. All values default to `1`. | DatePartDeltas |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@ import { IFormattingViews, IgxCalendarComponent, IgxCalendarHeaderTemplateDirect
import { IgxCalendarContainerComponent } from './calendar-container/calendar-container.component';
import { IgxDatePickerComponent } from './date-picker.component';
import {
IgxOverlayOutletDirective,
IgxOverlayService,
OverlayCancelableEventArgs, OverlayClosingEventArgs, OverlayEventArgs, OverlaySettings,
WEEKDAYS,
BaseFormatter,
I18N_FORMATTER
WEEKDAYS
} from 'igniteui-angular/core';
import { ChangeDetectorRef, Component, DebugElement, ElementRef, EventEmitter, Injector, QueryList, Renderer2, ViewChild } from '@angular/core';
import { By } from '@angular/platform-browser';
Expand Down Expand Up @@ -1064,7 +1061,6 @@ describe('IgxDatePicker', () => {
expect(datePicker.isDropdown).toEqual(true);
expect(datePicker.minValue).toEqual(undefined);
expect(datePicker.maxValue).toEqual(undefined);
expect(datePicker.outlet).toEqual(undefined);
expect(datePicker.specialDates).toEqual(null);
expect(datePicker.spinDelta).toEqual(undefined);
expect(datePicker.spinLoop).toEqual(true);
Expand Down Expand Up @@ -1152,15 +1148,6 @@ describe('IgxDatePicker', () => {
expect(datePicker.maxValue).toEqual(today);
datePicker.maxValue = '12/12/1998';
expect(datePicker.maxValue).toEqual('12/12/1998');
datePicker.outlet = null;
expect(datePicker.outlet).toEqual(null);
const mockEl: ElementRef = jasmine.createSpyObj<ElementRef>('mockEl', ['nativeElement']);
datePicker.outlet = mockEl;
expect(datePicker.outlet).toEqual(mockEl);
const mockOverlayDirective: IgxOverlayOutletDirective =
jasmine.createSpyObj<IgxOverlayOutletDirective>('mockEl', ['nativeElement']);
datePicker.outlet = mockOverlayDirective;
expect(datePicker.outlet).toEqual(mockOverlayDirective);
const specialDates: DateRangeDescriptor[] = [{ type: DateRangeType.Weekdays },
{ type: DateRangeType.Before, dateRange: [today] }];
datePicker.specialDates = specialDates;
Expand Down Expand Up @@ -1286,21 +1273,18 @@ describe('IgxDatePicker', () => {
datePicker.open();
expect(overlay.attach).toHaveBeenCalledWith(IgxCalendarContainerComponent, viewsContainerRef, baseDropdownSettings);
expect(overlay.show).toHaveBeenCalledWith(mockOverlayId);
const mockOutlet = {} as any;
datePicker.outlet = mockOutlet;
datePicker.open();
expect(overlay.attach).toHaveBeenCalledWith(
IgxCalendarContainerComponent,
viewsContainerRef,
Object.assign({}, baseDropdownSettings, { outlet: mockOutlet }),
Object.assign({}, baseDropdownSettings),
);
expect(overlay.show).toHaveBeenCalledWith(mockOverlayId);
let mockSettings: OverlaySettings = {
closeOnEscape: true,
closeOnOutsideClick: true,
modal: false
};
datePicker.outlet = null;
datePicker.open(mockSettings);
expect(overlay.attach).toHaveBeenCalledWith(
IgxCalendarContainerComponent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import {
ChangeDetectorRef,
Component,
ContentChild,
ElementRef,
EventEmitter,
HostBinding,
HostListener,
Expand Down Expand Up @@ -243,25 +242,6 @@ export class IgxDatePickerComponent extends PickerBaseDirective implements Contr
@Input()
public spinDelta: Pick<DatePartDeltas, 'date' | 'month' | 'year'>;

/**
* Gets/Sets the container used for the popup element.
* @remarks
* `outlet` is an instance of `IgxOverlayOutletDirective` or an `ElementRef`.
* @example
* ```html
* <div igxOverlayOutlet #outlet="overlay-outlet"></div>
* //..
* <igx-date-picker [outlet]="outlet"></igx-date-picker>
* //..
* ```
*
* @deprecated in version 21.2.0. Overlays now use the HTML Popover API and no longer move to the document
* body by default, so using outlet is also no longer needed - just define the overlay in the intended
* DOM tree position instead.
*/
@Input()
public override outlet: IgxOverlayOutletDirective | ElementRef;
Comment thread
wnvko marked this conversation as resolved.

/**
* Gets/Sets the value of `id` attribute.
*
Expand Down Expand Up @@ -600,9 +580,6 @@ export class IgxDatePickerComponent extends PickerBaseDirective implements Contr
if (this.isDropdown && this.inputGroupElement) {
overlaySettings.target = this.inputGroupElement;
}
if (this.outlet) {
overlaySettings.outlet = this.outlet;
}
this._overlayId = this._overlayService
.attach(IgxCalendarContainerComponent, this.viewContainerRef, overlaySettings);
this._overlayService.show(this._overlayId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,24 +185,6 @@ export abstract class PickerBaseDirective implements IToggleView, EditorProvider
this._weekStart = value;
}

/**
* The container used for the pop-up element.
*
* @example
* ```html
* <div igxOverlayOutlet #outlet="overlay-outlet"></div>
* <!-- ... -->
* <igx-date-picker [outlet]="outlet"></igx-date-picker>
* <!-- ... -->
* ```
*
* @deprecated in version 21.2.0. Overlays now use the HTML Popover API and no longer move to the document
* body by default, so using outlet is also no longer needed - just define the overlay in the intended
* DOM tree position instead.
*/
@Input()
public outlet: IgxOverlayOutletDirective | ElementRef;

/**
* Determines how the picker's input will be styled.
Comment thread
wnvko marked this conversation as resolved.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ With projected inputs:
| mode | PickerInteractionMode | Sets whether `IgxDateRangePickerComponent` is in dialog or dropdown mode. Default is `dialog` |
| minValue | Date \| string | The minimum value in a valid range. |
| maxValue | Date \| string | The maximum value in a valid range. |
| outlet | IgxOverlayOutletDirective \| ElementRef<any> | **Deprecated** Gets/Sets the container used for the popup element.
| overlaySettings | OverlaySettings | Changes the default overlay settings used by the `IgxDateRangePickerComponent`. |
| placeholder | string | Sets the `placeholder` for single-input `IgxDateRangePickerComponent`. |
| weekStart | number | Sets the start day of the week. Can be assigned to a numeric value or to `WEEKDAYS` enum value. |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ import {
DateTimeUtil,
IgxPickerActionsDirective,
isDateInRanges,
PickerCalendarOrientation,
IgxOverlayOutletDirective
PickerCalendarOrientation
} from 'igniteui-angular/core';
import { IgxCalendarContainerComponent } from '../date-picker/calendar-container/calendar-container.component';
import { PickerBaseDirective } from '../date-picker/picker-base.directive';
Expand Down Expand Up @@ -364,26 +363,6 @@ export class IgxDateRangePickerComponent extends PickerBaseDirective
@Input()
public override placeholder = '';

/**
* Gets/Sets the container used for the popup element.
*
* @remarks
* `outlet` is an instance of `IgxOverlayOutletDirective` or an `ElementRef`.
* @example
* ```html
* <div igxOverlayOutlet #outlet="overlay-outlet"></div>
* //..
* <igx-date-range-picker [outlet]="outlet"></igx-date-range-picker>
* //..
* ```
*
* @deprecated in version 21.2.0. Overlays now use the HTML Popover API and no longer move to the document
* body by default, so using outlet is also no longer needed - just define the overlay in the intended
* DOM tree position instead.
*/
@Input()
public override outlet: IgxOverlayOutletDirective | ElementRef<any>;

/**
* Show/hide week numbers
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Directive, ElementRef, HostBinding, Input, OnDestroy, booleanAttribute } from '@angular/core';
import { IgxOverlayOutletDirective, IToggleView } from 'igniteui-angular/core';
import { Directive, HostBinding, Input, OnDestroy, booleanAttribute } from '@angular/core';
import { IToggleView } from 'igniteui-angular/core';
import { IPositionStrategy, OverlaySettings } from 'igniteui-angular/core';
import { IgxToggleDirective } from '../toggle/toggle.directive';

Expand Down Expand Up @@ -29,19 +29,6 @@ export abstract class IgxNotificationsDirective extends IgxToggleDirective
@Input()
public displayTime = 4000;

/**
* Gets/Sets the container used for the element.
*
* @remarks
* `outlet` is an instance of `IgxOverlayOutletDirective` or an `ElementRef`.
*
* @deprecated in version 21.2.0. Overlays now use the HTML Popover API and no longer move to the document
* body by default, so using outlet is also no longer needed - just define the component in the intended
* DOM tree position instead and use `positioning` property as needed.
*/
@Input()
public outlet: IgxOverlayOutletDirective | ElementRef<HTMLElement>;

/**
* Controls whether positioning is relative to the viewport or to the nearest positioned container.
*/
Expand Down Expand Up @@ -95,8 +82,7 @@ export abstract class IgxNotificationsDirective extends IgxToggleDirective
positionStrategy: this.strategy,
closeOnEscape: false,
closeOnOutsideClick: false,
modal: false,
outlet: this.outlet
modal: false
};

super.open(overlaySettings);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,18 +103,3 @@ Providing reference from custom component which has already been registered into
|:----------:|:-------------|:------|
| `igxToggleAction`| `IToggleView` \| `string` | Determines the target that have to be controled. |
| `overlaySettings` | `OverlaySettings`| Passes `igxOverlay` settings for applicable targets (`igxToggle`) that control positioning, interaction and scroll behavior.
| `igxToggleOutlet` | `IgxOverlayOutletDirective` \| `ElementRef`| **Deprecated.** Determines where the target overlay element should be attached. Shortcut for `overlaySettings.outlet`.

# IgxOverlayOutlet Directive

The **IgxOverlayOutlet** provides a way to mark an element as an `igxOverlay` outlet container through the component template only.
Directive instance is exported as `overlay-outlet`, so it can be assigned within the template:

```html
<div igxOverlayOutlet #outlet="overlay-outlet"></div>
```
This allows to provide the `outlet` templates variable as a setting to the toggle action:
```html
<button type="button" igxButton [igxToggleAction]="reference" [igxToggleOutlet]="outlet">Toggle</button>
<custom-component #reference></custom-component>
```
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { IgxToggleActionDirective, IgxToggleDirective } from './toggle.directive';

import { first } from 'rxjs/operators';
import { AbsoluteScrollStrategy, AutoPositionStrategy, CancelableEventArgs, ConnectedPositioningStrategy, HorizontalAlignment, IgxOverlayOutletDirective, IgxOverlayService, OffsetMode, OverlaySettings } from 'igniteui-angular/core';
import { AbsoluteScrollStrategy, AutoPositionStrategy, CancelableEventArgs, ConnectedPositioningStrategy, HorizontalAlignment, IgxOverlayService, OffsetMode, OverlaySettings } from 'igniteui-angular/core';

describe('IgxToggle', () => {
const HIDDEN_TOGGLER_CLASS = 'igx-toggle--hidden';
Expand All @@ -15,7 +15,6 @@ describe('IgxToggle', () => {
imports: [
NoopAnimationsModule,
IgxToggleActionTestComponent,
IgxToggleOutletComponent,
IgxToggleServiceInjectComponent,
IgxOverlayServiceComponent,
IgxToggleTestComponent,
Expand Down Expand Up @@ -610,29 +609,6 @@ describe('IgxToggle', () => {
expect(toggle.closing.emit).toHaveBeenCalledWith({ id: '0', owner: toggle, cancel: false, event: new Event('click') });
expect(toggle.closed.emit).toHaveBeenCalledTimes(1);
}));

it('should pass IgxOverlayOutletDirective input from IgxToggleActionDirective', () => {
const fixture = TestBed.createComponent(IgxToggleOutletComponent);
const outlet = fixture.debugElement.query(By.css('.outlet-container')).nativeElement;
const toggleSpy = spyOn(IgxToggleDirective.prototype, 'toggle');
const button = fixture.debugElement.query(By.directive(IgxToggleActionDirective)).nativeElement;
fixture.detectChanges();

const settings: OverlaySettings = {
target: button,
positionStrategy: jasmine.any(ConnectedPositioningStrategy) as any,
closeOnOutsideClick: true,
modal: false,
scrollStrategy: jasmine.any(AbsoluteScrollStrategy) as any,
outlet: jasmine.any(IgxOverlayOutletDirective) as any,
excludeFromOutsideClick: [button]
};

fixture.componentInstance.toggleAction.onClick();
expect(IgxToggleDirective.prototype.toggle).toHaveBeenCalledWith(settings);
const directive = toggleSpy.calls.mostRecent().args[0].outlet as IgxOverlayOutletDirective;
expect(directive.nativeElement).toBe(outlet);
});
});
});

Expand Down Expand Up @@ -678,16 +654,6 @@ export class IgxToggleActionTestComponent {
}
}

@Component({
template: `
<button type="button" [igxToggleAction]="toggleRef" [overlaySettings]="{}" [igxToggleOutlet]="outlet"></button>
<div igxToggle #toggleRef="toggle"></div>
<div igxOverlayOutlet #outlet="overlay-outlet" class="outlet-container"></div>
`,
imports: [IgxToggleActionDirective, IgxToggleDirective, IgxOverlayOutletDirective]
})
export class IgxToggleOutletComponent extends IgxToggleActionTestComponent { }

@Component({
template: `
<button type="button" igxToggleAction="toggleID">Open/Close Toggle</button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
OnInit,
Output,
} from '@angular/core';
import { AbsoluteScrollStrategy, IgxOverlayOutletDirective } from 'igniteui-angular/core';
import { AbsoluteScrollStrategy } from 'igniteui-angular/core';
import { CancelableBrowserEventArgs, IBaseEventArgs, PlatformUtil } from 'igniteui-angular/core';
import { ConnectedPositioningStrategy } from 'igniteui-angular/core';
import { filter, first, takeUntil } from 'rxjs/operators';
Expand Down Expand Up @@ -436,22 +436,6 @@ export class IgxToggleActionDirective implements OnInit {
@Input()
public overlaySettings: OverlaySettings;

/**
* Determines where the toggle element overlay should be attached.
*
* ```html
* <!--set-->
* <div igxToggleAction [igxToggleOutlet]="outlet"></div>
* ```
* Where `outlet` in an instance of `IgxOverlayOutletDirective` or an `ElementRef`
*
* @deprecated in version 21.2.0. Overlays now use the HTML Popover API and no longer move to the document
* body by default, so using outlet is also no longer needed - just define the overlay in the intended
* DOM tree position instead or use `container` property instead.
*/
@Input('igxToggleOutlet')
public outlet: IgxOverlayOutletDirective | ElementRef;

/**
* @hidden
*/
Expand Down Expand Up @@ -480,10 +464,6 @@ export class IgxToggleActionDirective implements OnInit {
*/
@HostListener('click')
public onClick() {
if (this.outlet) {
this._overlayDefaults.outlet = this.outlet;
}

const clonedSettings = Object.assign({}, this._overlayDefaults, this.overlaySettings);
this.updateOverlaySettings(clonedSettings);
this.target.toggle(clonedSettings);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,6 @@ export class IgxTooltipTargetDirective extends IgxToggleActionDirective implemen
return;
}

this._checkOutletAndOutsideClick();
this._hideOnInteraction();
}

Expand Down Expand Up @@ -513,12 +512,6 @@ export class IgxTooltipTargetDirective extends IgxToggleActionDirective implemen
this._abortController = new AbortController();
}

private _checkOutletAndOutsideClick(): void {
if (this.outlet) {
this._overlayDefaults.outlet = this.outlet;
}
}

/**
* A guard method that performs precondition checks before showing the tooltip.
* It ensures that the tooltip is not disabled and not already shown in sticky mode.
Expand All @@ -528,7 +521,6 @@ export class IgxTooltipTargetDirective extends IgxToggleActionDirective implemen
if (this.tooltipDisabled) return;
if (!this.target.collapsed && this.target?.tooltipTarget?.sticky) return;

this._checkOutletAndOutsideClick();
this._checkTooltipForMultipleTargets();
action();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1189,7 +1189,7 @@ describe('igxExpansionPanel', () => {
expect(grid.attributes.getNamedItem('role').nodeValue).toEqual('grid');
expect(grid.attributes.getNamedItem('id').nodeValue).toEqual(fixture.componentInstance.grid1.id);
expect(grid.attributes.getNamedItem('tabindex').nodeValue).toEqual('0');
expect(grid.childElementCount).toEqual(6);
expect(grid.childElementCount).toEqual(7);
}));
it('Should apply all appropriate classes on combo initialization_image + text content', fakeAsync(() => {
const fixture: ComponentFixture<IgxExpansionPanelImageComponent> = TestBed.createComponent(IgxExpansionPanelImageComponent);
Expand Down
Loading
Loading