Skip to content

Commit 8399573

Browse files
authored
Merge branch 'master' into ddincheva/cellEditingFocus
2 parents 9555682 + 9c70ca8 commit 8399573

15 files changed

+151
-73
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ All notable changes for each version of this project will be documented in this
2121
- `IgxCarousel`:
2222
- **Breaking Changes** -The carousel slides are no longer array, they are changed to QueryList.
2323
- **Behavioural change** - When slides are more than 5, a label is shown instead of the indicators. The count limit of visible indicators can be changed with the input `maximumIndicatorsCount`
24-
24+
- `igxOverlay`:
25+
- **Behavioural Change** - `igxOverlay` - no longer persists element scrolling `out of the box`. In order to persist an element scroll position after attaching the element to an overlay, handle the exposed `onAppended` overlay event and manage/restore the scroll position.
2526

2627
### New Features
2728
- `IgxGrid`, `IgxTreeGrid`, `IgxHierarchicalGrid`:
Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { IgxComboItemComponent } from './combo-item.component';
2-
import { Component, HostListener } from '@angular/core';
2+
import { Component } from '@angular/core';
33

44
/**
55
* @hidden
@@ -17,18 +17,10 @@ export class IgxComboAddItemComponent extends IgxComboItemComponent {
1717
}
1818

1919
/**
20-
* @hidden
21-
* @internal
22-
* This is related to https://github.com/angular/angular/issues/33300
23-
* When the above is fixed, we can remove the @HostListener decorator and move
24-
* the body of the `handleClick` method back under `clicked`
20+
* @inheritdoc
2521
*/
26-
@HostListener('click')
27-
handleClick() {
22+
clicked(event?) {
2823
this.comboAPI.disableTransitions = false;
2924
this.comboAPI.add_custom_item();
3025
}
31-
32-
clicked(event?) {
33-
}
3426
}

projects/igniteui-angular/src/lib/combo/combo-item.component.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,12 @@ export class IgxComboItemComponent extends IgxDropDownItemComponent implements D
8484
return rect.y >= parentDiv.y;
8585
}
8686

87-
clicked(event) {
87+
/**
88+
* @inheritdoc
89+
*/
90+
clicked(event): void {
8891
this.comboAPI.disableTransitions = false;
89-
if (this.disabled || this.isHeader) {
90-
const focusedItem = this.dropDown.items.find((item) => item.focused);
91-
if (this.dropDown.allowItemsFocus && focusedItem) {
92-
focusedItem.element.nativeElement.focus({ preventScroll: true });
93-
}
94-
return;
95-
}
92+
if (!this.isSelectable) { return; }
9693
this.dropDown.navigateItem(this.index);
9794
this.comboAPI.set_selected_item(this.itemID, event);
9895
}

projects/igniteui-angular/src/lib/combo/combo.component.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ describe('igxCombo', () => {
369369
await wait(30);
370370
items = fix.debugElement.queryAll(By.css('.' + CSS_CLASS_DROPDOWNLISTITEM));
371371
lastItem = items[items.length - 1].componentInstance;
372-
(lastItem as IgxComboAddItemComponent).handleClick();
372+
(lastItem as IgxComboAddItemComponent).clicked();
373373
fix.detectChanges();
374374
// After `Add Item` is clicked, the input is focused and the item is added to the list
375375
expect(dropdown.focusedItem).toEqual(null);

projects/igniteui-angular/src/lib/directives/toggle/README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ Open/Close the directive only through one trigger by exporting it with name **to
2828
handlers when the toggle is opened and respectively closed.
2929
```html
3030
<button (click)="toggleRef.toggle()">Toggle</button>
31-
<div igxToggle #toggleRef="toggle" (onOpening)="eventHandler()" (onOpened)="eventHandler()" (onClosing)="eventHandler()" (onClosed)="eventHandler()">
31+
<div igxToggle #toggleRef="toggle"
32+
(onOpening)="eventHandler()" (onAppended)="eventHandler()" (onOpened)="eventHandler()"
33+
(onClosing)="eventHandler()" (onClosed)="eventHandler()" >
3234
<p>Some content that user would like to make it togglable.</p>
3335
</div>
3436
```
@@ -38,10 +40,11 @@ handlers when the toggle is opened and respectively closed.
3840
### Outputs
3941
| Name | Return Type | Description |
4042
|:--:|:---|:---|
41-
| `onOpening` | `void` | Emits an event before the toggle container is opened. |
42-
| `onOpened` | `void` | Emits an event after the toggle container is opened. |
43-
| `onClosing` | `void` | Emits an event before the toggle container is closed. |
44-
| `onClosed` | `void` | Emits an event after the toggle container is closed. |
43+
| `onAppended` | `void` | Emits an event after content is appended to the overlay. |
44+
| `onOpening` | `void` | Emits an event before the toggle container is opened. |
45+
| `onOpened` | `void` | Emits an event after the toggle container is opened. |
46+
| `onClosing` | `void` | Emits an event before the toggle container is closed. |
47+
| `onClosed` | `void` | Emits an event after the toggle container is closed. |
4548
### Methods
4649
| Name | Arguments | Return Type | Description |
4750
|:----------:|:------|:------|:------|

projects/igniteui-angular/src/lib/directives/toggle/toggle.directive.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ describe('IgxToggle', () => {
7878
expect(toggle.onOpened.emit).toHaveBeenCalled();
7979
}));
8080

81+
it('should emit \'onAppended\' event', fakeAsync(() => {
82+
const fixture = TestBed.createComponent(IgxToggleTestComponent);
83+
fixture.detectChanges();
84+
85+
const toggle = fixture.componentInstance.toggle;
86+
spyOn(toggle.onAppended, 'emit');
87+
toggle.open();
88+
tick();
89+
fixture.detectChanges();
90+
91+
expect(toggle.onAppended.emit).toHaveBeenCalled();
92+
}));
93+
8194
it('should emit \'onClosing\' and \'onClosed\' events', fakeAsync(() => {
8295
const fixture = TestBed.createComponent(IgxToggleTestComponent);
8396
fixture.detectChanges();

projects/igniteui-angular/src/lib/directives/toggle/toggle.directive.ts

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export class IgxToggleDirective implements IToggleView, OnInit, OnDestroy {
3535
private _overlayOpenedSub: Subscription;
3636
private _overlayClosingSub: Subscription;
3737
private _overlayClosedSub: Subscription;
38+
private _overlayAppendedSub: Subscription;
3839

3940
/**
4041
* Emits an event after the toggle container is opened.
@@ -164,6 +165,25 @@ export class IgxToggleDirective implements IToggleView, OnInit, OnDestroy {
164165
@Optional() private navigationService: IgxNavigationService) {
165166
}
166167

168+
/**
169+
* Emits an event after the toggle element is appended to the overlay container.
170+
*
171+
* ```typescript
172+
* onAppended() {
173+
* alert("Content appended!");
174+
* }
175+
* ```
176+
*
177+
* ```html
178+
* <div
179+
* igxToggle
180+
* (onAppended)='onToggleAppended()'>
181+
* </div>
182+
* ```
183+
*/
184+
@Output()
185+
public onAppended = new EventEmitter();
186+
167187
/**
168188
* Opens the toggle.
169189
*
@@ -196,32 +216,37 @@ export class IgxToggleDirective implements IToggleView, OnInit, OnDestroy {
196216
return;
197217
}
198218

199-
this.overlayService.show(this._overlayId, overlaySettings);
200-
201219
this.unsubscribe();
220+
221+
this._overlayAppendedSub = this.overlayService.onAppended.pipe(...this._overlaySubFilter).subscribe(() => {
222+
this.onAppended.emit();
223+
});
224+
202225
this._overlayOpenedSub = this.overlayService.onOpened.pipe(...this._overlaySubFilter).subscribe(() => {
203226
this.onOpened.emit();
204227
});
205228

206229
this._overlayClosingSub = this.overlayService
207-
.onClosing
208-
.pipe(...this._overlaySubFilter)
209-
.subscribe((e: OverlayClosingEventArgs) => {
210-
const eventArgs: CancelableBrowserEventArgs = { cancel: false, event: e.event };
211-
this.onClosing.emit(eventArgs);
212-
e.cancel = eventArgs.cancel;
213-
214-
// in case event is not canceled this will close the toggle and we need to unsubscribe.
215-
// Otherwise if for some reason, e.g. close on outside click, close() gets called before
216-
// onClosed was fired we will end with calling onClosing more than once
217-
if (!e.cancel) {
218-
this.clearSubscription(this._overlayClosingSub);
219-
}
220-
});
230+
.onClosing
231+
.pipe(...this._overlaySubFilter)
232+
.subscribe((e: OverlayClosingEventArgs) => {
233+
const eventArgs: CancelableBrowserEventArgs = { cancel: false, event: e.event };
234+
this.onClosing.emit(eventArgs);
235+
e.cancel = eventArgs.cancel;
236+
237+
// in case event is not canceled this will close the toggle and we need to unsubscribe.
238+
// Otherwise if for some reason, e.g. close on outside click, close() gets called before
239+
// onClosed was fired we will end with calling onClosing more than once
240+
if (!e.cancel) {
241+
this.clearSubscription(this._overlayClosingSub);
242+
}
243+
});
221244

222245
this._overlayClosedSub = this.overlayService.onClosed
223-
.pipe(...this._overlaySubFilter)
224-
.subscribe(this.overlayClosed);
246+
.pipe(...this._overlaySubFilter)
247+
.subscribe(this.overlayClosed);
248+
249+
this.overlayService.show(this._overlayId, overlaySettings);
225250
}
226251

227252
/**
@@ -319,6 +344,7 @@ export class IgxToggleDirective implements IToggleView, OnInit, OnDestroy {
319344
this.clearSubscription(this._overlayOpenedSub);
320345
this.clearSubscription(this._overlayClosingSub);
321346
this.clearSubscription(this._overlayClosedSub);
347+
this.clearSubscription(this._overlayAppendedSub);
322348
}
323349

324350
private clearSubscription(subscription: Subscription) {

projects/igniteui-angular/src/lib/drop-down/drop-down-item.base.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ export class IgxDropDownItemBaseDirective implements DoCheck {
178178
*/
179179
@HostBinding('class.igx-drop-down__item--focused')
180180
get focused(): boolean {
181-
return (!this.isHeader && !this.disabled) && this._focused;
181+
return this.isSelectable && this._focused;
182182
}
183183

184184
/**
@@ -329,4 +329,26 @@ export class IgxDropDownItemBaseDirective implements DoCheck {
329329
}
330330
}
331331
}
332+
333+
/** Returns true if the items is not a header or disabled */
334+
protected get isSelectable(): boolean {
335+
return !(this.disabled || this.isHeader);
336+
}
337+
338+
/** If `allowItemsFocus` is enabled, keep the browser focus on the active item */
339+
protected ensureItemFocus() {
340+
if (this.dropDown.allowItemsFocus) {
341+
const focusedItem = this.dropDown.items.find((item) => item.focused);
342+
if (!focusedItem) { return; }
343+
focusedItem.element.nativeElement.focus({ preventScroll: true });
344+
}
345+
}
346+
347+
/**
348+
* @hidden
349+
* @internal
350+
*/
351+
@HostListener('click', ['$event'])
352+
clicked(event): void {
353+
}
332354
}

projects/igniteui-angular/src/lib/drop-down/drop-down-item.component.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
Component,
3-
HostListener,
43
HostBinding
54
} from '@angular/core';
65
import { IgxDropDownItemBaseDirective } from './drop-down-item.base';
@@ -24,7 +23,7 @@ export class IgxDropDownItemComponent extends IgxDropDownItemBaseDirective {
2423
const focusedIndex = focusedItem ? focusedItem.index : -1;
2524
focusedState = this._index === focusedIndex;
2625
}
27-
return !this.isHeader && !this.disabled && focusedState;
26+
return this.isSelectable && focusedState;
2827
}
2928

3029
/**
@@ -59,7 +58,7 @@ export class IgxDropDownItemComponent extends IgxDropDownItemBaseDirective {
5958
*/
6059
@HostBinding('attr.tabindex')
6160
get setTabIndex() {
62-
const shouldSetTabIndex = this.dropDown.allowItemsFocus && !(this.disabled || this.isHeader);
61+
const shouldSetTabIndex = this.dropDown.allowItemsFocus && this.isSelectable;
6362
if (shouldSetTabIndex) {
6463
return 0;
6564
} else {
@@ -68,15 +67,11 @@ export class IgxDropDownItemComponent extends IgxDropDownItemBaseDirective {
6867
}
6968

7069
/**
71-
* @hidden @internal
70+
* @inheritdoc
7271
*/
73-
@HostListener('click', ['$event'])
74-
clicked(event) {
75-
if (this.disabled || this.isHeader) {
76-
const focusedItem = this.dropDown.items.find((item) => item.focused);
77-
if (this.dropDown.allowItemsFocus && focusedItem) {
78-
focusedItem.element.nativeElement.focus({ preventScroll: true });
79-
}
72+
clicked(event): void {
73+
if (!this.isSelectable) {
74+
this.ensureItemFocus();
8075
return;
8176
}
8277
if (this.selection) {

projects/igniteui-angular/src/lib/drop-down/drop-down.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<div class="igx-drop-down__list" igxToggle [style.width]="width"
2-
(onOpening)="onToggleOpening($event)" (onOpened)="onToggleOpened()"
2+
(onOpening)="onToggleOpening($event)" (onOpened)="onToggleOpened()" (onAppended)="onToggleContentAppended()"
33
(onClosing)="onToggleClosing($event)" (onClosed)="onToggleClosed()">
44
<div class="igx-drop-down__list-scroll" #scrollContainer [attr.id]="this.listId" role="listbox"
55
[style.height]="height"

0 commit comments

Comments
 (0)