Skip to content

Commit e3a0b00

Browse files
authored
Merge pull request #9414 from IgniteUI/dpetev/pickers-toggle
Pickers toggle refactor
2 parents da85345 + 1b6ec10 commit e3a0b00

File tree

11 files changed

+441
-101
lines changed

11 files changed

+441
-101
lines changed

package-lock.json

Lines changed: 31 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"@angular/compiler-cli": "^11.2.5",
8484
"@angular/language-service": "^11.2.5",
8585
"@angularclass/hmr": "^2.1.3",
86-
"@types/jasmine": "^3.3.16",
86+
"@types/jasmine": "~3.6.0",
8787
"@types/jasminewd2": "^2.0.8",
8888
"@types/node": "^12.20.0",
8989
"@types/webpack-env": "^1.15.2",
@@ -109,8 +109,8 @@
109109
"hammer-simulator": "0.0.1",
110110
"igniteui-sassdoc-theme": "^1.1.4",
111111
"igniteui-typedoc-theme": "^2.0.9",
112-
"jasmine": "~3.5.0",
113-
"jasmine-core": "~3.5.0",
112+
"jasmine": "~3.6.0",
113+
"jasmine-core": "~3.6.0",
114114
"jasmine-spec-reporter": "~5.0.2",
115115
"karma": "^5.2.3",
116116
"karma-chrome-launcher": "~3.1.0",

projects/igniteui-angular/src/lib/date-common/picker-base.directive.ts

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
1-
import { ElementRef, EventEmitter, Inject, LOCALE_ID, Optional, Input, Directive, Output } from '@angular/core';
1+
import {
2+
AfterViewInit, ContentChildren, Directive, ElementRef, EventEmitter,
3+
Inject, Input, LOCALE_ID, OnDestroy, Optional, Output, QueryList
4+
} from '@angular/core';
5+
import { merge, Subject } from 'rxjs';
6+
import { takeUntil } from 'rxjs/operators';
27
import { DisplayDensityBase, DisplayDensityToken, IDisplayDensityOptions } from '../core/density';
38
import { EditorProvider } from '../core/edit-provider';
4-
import { PickerInteractionMode } from './types';
59
import { IToggleView } from '../core/navigation';
610
import { IBaseCancelableBrowserEventArgs, IBaseEventArgs } from '../core/utils';
711
import { DateRange } from '../date-range-picker/public_api';
812
import { IgxOverlayOutletDirective } from '../directives/toggle/toggle.directive';
913
import { IgxInputGroupType, IGX_INPUT_GROUP_TYPE } from '../input-group/public_api';
1014
import { OverlaySettings } from '../services/overlay/utilities';
15+
import { IgxPickerToggleComponent } from './picker-icons.common';
16+
import { PickerInteractionMode } from './types';
1117

1218
@Directive()
13-
export abstract class PickerBaseDirective extends DisplayDensityBase implements IToggleView, EditorProvider {
19+
export abstract class PickerBaseDirective extends DisplayDensityBase implements IToggleView, EditorProvider, AfterViewInit, OnDestroy {
1420
/**
1521
* The editor's input mask.
1622
*
@@ -193,6 +199,10 @@ export abstract class PickerBaseDirective extends DisplayDensityBase implements
193199
@Output()
194200
public closed = new EventEmitter<IBaseEventArgs>();
195201

202+
/** @hidden @internal */
203+
@ContentChildren(IgxPickerToggleComponent, { descendants: true })
204+
public toggleComponents: QueryList<IgxPickerToggleComponent>;
205+
196206
protected _collapsed = true;
197207
protected _type: IgxInputGroupType;
198208
protected _minValue: Date | string;
@@ -215,6 +225,8 @@ export abstract class PickerBaseDirective extends DisplayDensityBase implements
215225
return this.mode === PickerInteractionMode.DropDown;
216226
}
217227

228+
protected _destroy$ = new Subject();
229+
218230
public abstract valueChange: EventEmitter<string | Date | DateRange | null>;
219231

220232
constructor(public element: ElementRef,
@@ -225,6 +237,28 @@ export abstract class PickerBaseDirective extends DisplayDensityBase implements
225237
this.locale = this.locale || this._localeId;
226238
}
227239

240+
/** @hidden @internal */
241+
public ngAfterViewInit(): void {
242+
this.subToIconsClicked(this.toggleComponents, () => this.open());
243+
this.toggleComponents.changes.pipe(takeUntil(this._destroy$))
244+
.subscribe(() => this.subToIconsClicked(this.toggleComponents, () => this.open()));
245+
}
246+
247+
/** @hidden @internal */
248+
public ngOnDestroy(): void {
249+
this._destroy$.next();
250+
this._destroy$.complete();
251+
}
252+
253+
/** Subscribes to the click events of toggle/clear icons in a query */
254+
protected subToIconsClicked(components: QueryList<IgxPickerToggleComponent>, next: () => any) {
255+
components.forEach(toggle => {
256+
toggle.clicked
257+
.pipe(takeUntil(merge(components.changes, this._destroy$)))
258+
.subscribe(next);
259+
});
260+
};
261+
228262
public abstract select(value: Date | DateRange | string): void;
229263
public abstract open(settings?: OverlaySettings): void;
230264
public abstract toggle(settings?: OverlaySettings): void;

0 commit comments

Comments
 (0)