Skip to content

Commit e0c08c1

Browse files
committed
feat(pop-up): refactoring KbqPopUpTrigger, KbqPopUp (#DS-2852)
1 parent dced216 commit e0c08c1

20 files changed

+111
-319
lines changed

.commitlintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const scope_types = [
4040
'popover',
4141
'progress-bar',
4242
'progress-spinner',
43+
'pop-up',
4344
'radio',
4445
'schematics',
4546
'scrolling',
Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,37 @@
1-
import { ElementRef, inject, Renderer2 } from '@angular/core';
1+
import { Renderer2 } from '@angular/core';
22

3-
export const applyPopupMargins = (element: ElementRef, name: string, value: string) => {
4-
const renderer = inject(Renderer2);
5-
const classList = element.nativeElement.classList;
3+
export const applyPopupMargins = (renderer: Renderer2, element: HTMLElement, name: string, value: string) => {
4+
const classList = element.classList;
65

76
if (
87
classList.contains(`${name}_placement-top`) ||
98
classList.contains(`${name}_placement-top-left`) ||
109
classList.contains(`${name}_placement-top-right`)
1110
) {
12-
renderer.setStyle(element.nativeElement, 'margin-bottom', value);
11+
renderer.setStyle(element, 'margin-bottom', value);
1312
}
1413

1514
if (
1615
classList.contains(`${name}_placement-right`) ||
1716
classList.contains(`${name}_placement-right-top`) ||
1817
classList.contains(`${name}_placement-right-bottom`)
1918
) {
20-
renderer.setStyle(element.nativeElement, 'margin-left', value);
19+
renderer.setStyle(element, 'margin-left', value);
2120
}
2221

2322
if (
2423
classList.contains(`${name}_placement-bottom`) ||
2524
classList.contains(`${name}_placement-bottom-left`) ||
2625
classList.contains(`${name}_placement-bottom-right`)
2726
) {
28-
renderer.setStyle(element.nativeElement, 'margin-top', value);
27+
renderer.setStyle(element, 'margin-top', value);
2928
}
3029

3130
if (
3231
classList.contains(`${name}_placement-left`) ||
3332
classList.contains(`${name}_placement-left-top`) ||
3433
classList.contains(`${name}_placement-left-bottom`)
3534
) {
36-
renderer.setStyle(element.nativeElement, 'margin-right', value);
35+
renderer.setStyle(element, 'margin-right', value);
3736
}
3837
};

packages/components/core/pop-up/pop-up-trigger.ts

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {
77
Overlay,
88
OverlayConfig,
99
OverlayRef,
10-
ScrollDispatcher
10+
ScrollDispatcher,
11+
ScrollStrategy
1112
} from '@angular/cdk/overlay';
1213
import { ComponentPortal } from '@angular/cdk/portal';
1314
import {
@@ -19,7 +20,8 @@ import {
1920
OnInit,
2021
TemplateRef,
2122
Type,
22-
ViewContainerRef
23+
ViewContainerRef,
24+
inject
2325
} from '@angular/core';
2426
import { ENTER, ESCAPE, SPACE } from '@koobiq/cdk/keycodes';
2527
import { Observable, Subject, Subscription } from 'rxjs';
@@ -34,6 +36,15 @@ import { PopUpPlacements, PopUpTriggers } from './constants';
3436

3537
@Directive()
3638
export abstract class KbqPopUpTrigger<T> implements OnInit, OnDestroy {
39+
protected overlay: Overlay = inject(Overlay);
40+
protected elementRef: ElementRef = inject(ElementRef);
41+
protected ngZone: NgZone = inject(NgZone);
42+
protected scrollDispatcher: ScrollDispatcher = inject(ScrollDispatcher);
43+
protected hostView: ViewContainerRef = inject(ViewContainerRef);
44+
protected direction = inject(Directionality, { optional: true });
45+
46+
protected abstract scrollStrategy: () => ScrollStrategy;
47+
3748
isOpen: boolean = false;
3849

3950
enterDelay: number = 0;
@@ -66,22 +77,10 @@ export abstract class KbqPopUpTrigger<T> implements OnInit, OnDestroy {
6677
protected listeners = new Map<string, EventListener>();
6778
protected closingActionsSubscription: Subscription;
6879

69-
protected readonly availablePositions: { [key: string]: ConnectionPositionPair };
80+
protected readonly availablePositions: { [key: string]: ConnectionPositionPair } = POSITION_MAP;
7081
protected readonly destroyed = new Subject<void>();
7182
protected triggerName: string;
7283

73-
protected constructor(
74-
protected overlay: Overlay,
75-
protected elementRef: ElementRef,
76-
protected ngZone: NgZone,
77-
protected scrollDispatcher: ScrollDispatcher,
78-
protected hostView: ViewContainerRef,
79-
protected scrollStrategy,
80-
protected direction?: Directionality
81-
) {
82-
this.availablePositions = POSITION_MAP;
83-
}
84-
8584
abstract updateClassMap(newPlacement?: string): void;
8685

8786
abstract updateData(): void;
@@ -217,7 +216,7 @@ export abstract class KbqPopUpTrigger<T> implements OnInit, OnDestroy {
217216

218217
this.overlayRef = this.overlay.create({
219218
...this.overlayConfig,
220-
direction: this.direction,
219+
direction: this.direction || undefined,
221220
positionStrategy: strategy,
222221
scrollStrategy: this.scrollStrategy()
223222
});

packages/components/core/pop-up/pop-up.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { AnimationEvent } from '@angular/animations';
2-
import { ChangeDetectorRef, Directive, EventEmitter, OnDestroy, TemplateRef } from '@angular/core';
2+
import { ChangeDetectorRef, Directive, EventEmitter, inject, OnDestroy, Renderer2, TemplateRef } from '@angular/core';
33
import { Observable, Subject } from 'rxjs';
44
import { PopUpVisibility } from './constants';
55

66
@Directive()
77
export abstract class KbqPopUp implements OnDestroy {
8+
protected renderer: Renderer2 = inject(Renderer2);
9+
protected changeDetectorRef: ChangeDetectorRef = inject(ChangeDetectorRef);
10+
811
header: string | TemplateRef<any>;
912
content: string | TemplateRef<any>;
1013
context: { $implicit: any } | null;
@@ -29,8 +32,6 @@ export abstract class KbqPopUp implements OnDestroy {
2932
private showTimeoutId: any;
3033
private hideTimeoutId: any;
3134

32-
protected constructor(private changeDetectorRef: ChangeDetectorRef) {}
33-
3435
ngOnDestroy() {
3536
clearTimeout(this.showTimeoutId);
3637
clearTimeout(this.hideTimeoutId);

packages/components/ellipsis-center/ellipsis-center.directive.ts

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,5 @@
1-
import { FocusMonitor } from '@angular/cdk/a11y';
2-
import { Directionality } from '@angular/cdk/bidi';
3-
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
4-
import {
5-
AfterViewInit,
6-
Directive,
7-
ElementRef,
8-
Inject,
9-
Input,
10-
NgModule,
11-
NgZone,
12-
OnDestroy,
13-
OnInit,
14-
Optional,
15-
Renderer2,
16-
ViewContainerRef
17-
} from '@angular/core';
18-
import { KBQ_TOOLTIP_SCROLL_STRATEGY, KbqTooltipTrigger } from '@koobiq/components/tooltip';
1+
import { AfterViewInit, Directive, Input, NgModule, OnDestroy, OnInit, Renderer2 } from '@angular/core';
2+
import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
193
import { Subject, Subscription } from 'rxjs';
204
import { debounceTime } from 'rxjs/operators';
215

@@ -44,18 +28,8 @@ export class KbqEllipsisCenterDirective extends KbqTooltipTrigger implements OnI
4428

4529
private readonly debounceInterval: number = 50;
4630

47-
constructor(
48-
overlay: Overlay,
49-
elementRef: ElementRef<HTMLElement>,
50-
ngZone: NgZone,
51-
scrollDispatcher: ScrollDispatcher,
52-
hostView: ViewContainerRef,
53-
@Inject(KBQ_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,
54-
@Optional() direction: Directionality,
55-
focusMonitor: FocusMonitor,
56-
private renderer: Renderer2
57-
) {
58-
super(overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction, focusMonitor);
31+
constructor(private renderer: Renderer2) {
32+
super();
5933
}
6034

6135
override ngOnInit(): void {

packages/components/form-field/password-toggle.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,18 @@
1-
import { FocusMonitor } from '@angular/cdk/a11y';
2-
import { Directionality } from '@angular/cdk/bidi';
3-
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
41
import {
52
AfterViewInit,
63
ChangeDetectionStrategy,
74
ChangeDetectorRef,
85
Component,
9-
ElementRef,
106
Inject,
117
Input,
12-
NgZone,
13-
Optional,
148
TemplateRef,
159
ViewChild,
16-
ViewContainerRef,
1710
ViewEncapsulation,
1811
forwardRef
1912
} from '@angular/core';
2013
import { KBQ_FORM_FIELD_REF, KbqFormFieldRef, PopUpTriggers } from '@koobiq/components/core';
2114
import { KbqIconButton } from '@koobiq/components/icon';
22-
import { KBQ_TOOLTIP_SCROLL_STRATEGY, KbqTooltipTrigger } from '@koobiq/components/tooltip';
15+
import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
2316

2417
@Component({
2518
selector: `kbq-password-toggle`,
@@ -66,18 +59,10 @@ export class KbqPasswordToggle extends KbqTooltipTrigger implements AfterViewIni
6659
}
6760

6861
constructor(
69-
overlay: Overlay,
70-
elementRef: ElementRef,
71-
ngZone: NgZone,
72-
scrollDispatcher: ScrollDispatcher,
73-
hostView: ViewContainerRef,
74-
@Inject(KBQ_TOOLTIP_SCROLL_STRATEGY) scrollStrategy,
75-
focusMonitor: FocusMonitor,
76-
@Optional() direction: Directionality,
7762
@Inject(forwardRef(() => KBQ_FORM_FIELD_REF)) private formField: KbqFormFieldRef,
7863
private changeDetector: ChangeDetectorRef
7964
) {
80-
super(overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction, focusMonitor);
65+
super();
8166

8267
this.trigger = `${PopUpTriggers.Hover}`;
8368
}

packages/components/navbar/navbar-item.component.ts

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';
2-
import { Directionality } from '@angular/cdk/bidi';
32
import { coerceBooleanProperty } from '@angular/cdk/coercion';
4-
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
53
import { DOCUMENT } from '@angular/common';
64
import {
75
AfterContentInit,
@@ -18,7 +16,6 @@ import {
1816
OnDestroy,
1917
Optional,
2018
TemplateRef,
21-
ViewContainerRef,
2219
ViewEncapsulation
2320
} from '@angular/core';
2421
import { IFocusableOption } from '@koobiq/cdk/a11y';
@@ -28,7 +25,7 @@ import { PopUpPlacements, PopUpTriggers, toBoolean } from '@koobiq/components/co
2825
import { KbqDropdownTrigger } from '@koobiq/components/dropdown';
2926
import { KbqFormField } from '@koobiq/components/form-field';
3027
import { KbqIcon } from '@koobiq/components/icon';
31-
import { KBQ_TOOLTIP_SCROLL_STRATEGY, KbqTooltipTrigger, TooltipModifier } from '@koobiq/components/tooltip';
28+
import { KbqTooltipTrigger, TooltipModifier } from '@koobiq/components/tooltip';
3229
import { EMPTY, Subject, merge } from 'rxjs';
3330
import { take, takeUntil } from 'rxjs/operators';
3431
import { KbqVerticalNavbar } from './vertical-navbar.component';
@@ -456,18 +453,10 @@ export class KbqNavbarItem extends KbqTooltipTrigger implements AfterContentInit
456453
public rectangleElement: KbqNavbarRectangleElement,
457454
public navbarFocusableItem: KbqNavbarFocusableItem,
458455
private changeDetectorRef: ChangeDetectorRef,
459-
overlay: Overlay,
460-
elementRef: ElementRef,
461-
ngZone: NgZone,
462-
scrollDispatcher: ScrollDispatcher,
463-
hostView: ViewContainerRef,
464-
@Inject(KBQ_TOOLTIP_SCROLL_STRATEGY) scrollStrategy,
465-
focusMonitor: FocusMonitor,
466-
@Optional() direction: Directionality,
467456
@Optional() private dropdownTrigger: KbqDropdownTrigger,
468457
@Optional() private bento: KbqNavbarBento
469458
) {
470-
super(overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction, focusMonitor);
459+
super();
471460

472461
if (this.hasDropDownTrigger) {
473462
this.dropdownTrigger.openByArrowDown = false;
@@ -588,17 +577,9 @@ export class KbqNavbarToggle extends KbqTooltipTrigger implements OnDestroy {
588577
constructor(
589578
public navbar: KbqVerticalNavbar,
590579
private changeDetectorRef: ChangeDetectorRef,
591-
overlay: Overlay,
592-
elementRef: ElementRef,
593-
ngZone: NgZone,
594-
scrollDispatcher: ScrollDispatcher,
595-
hostView: ViewContainerRef,
596-
@Inject(KBQ_TOOLTIP_SCROLL_STRATEGY) scrollStrategy,
597-
focusMonitor: FocusMonitor,
598-
@Optional() direction: Directionality,
599580
@Optional() @Inject(DOCUMENT) private document: any
600581
) {
601-
super(overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction, focusMonitor);
582+
super();
602583

603584
this.placement = PopUpPlacements.Right;
604585

packages/components/popover/popover-confirm.component.ts

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
1-
import { Directionality } from '@angular/cdk/bidi';
2-
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
31
import {
42
ChangeDetectionStrategy,
5-
ChangeDetectorRef,
63
Component,
74
Directive,
8-
ElementRef,
95
EventEmitter,
106
Inject,
117
InjectionToken,
128
Input,
13-
NgZone,
149
Optional,
1510
Output,
16-
ViewContainerRef,
1711
ViewEncapsulation
1812
} from '@angular/core';
1913
import { Subject } from 'rxjs';
2014
import { takeUntil } from 'rxjs/operators';
2115
import { kbqPopoverAnimations } from './popover-animations';
22-
import { KBQ_POPOVER_SCROLL_STRATEGY, KbqPopoverComponent, KbqPopoverTrigger } from './popover.component';
16+
import { KbqPopoverComponent, KbqPopoverTrigger } from './popover.component';
2317

2418
export const KBQ_POPOVER_CONFIRM_TEXT = new InjectionToken<string>('');
2519
export const KBQ_POPOVER_CONFIRM_BUTTON_TEXT = new InjectionToken<string>('');
@@ -39,8 +33,8 @@ export class KbqPopoverConfirmComponent extends KbqPopoverComponent {
3933

4034
confirmText: string;
4135

42-
constructor(changeDetectorRef: ChangeDetectorRef) {
43-
super(changeDetectorRef);
36+
constructor() {
37+
super();
4438
}
4539
}
4640

@@ -83,17 +77,10 @@ export class KbqPopoverConfirmTrigger extends KbqPopoverTrigger {
8377
private _confirmButtonText: string = 'Да';
8478

8579
constructor(
86-
overlay: Overlay,
87-
elementRef: ElementRef,
88-
ngZone: NgZone,
89-
scrollDispatcher: ScrollDispatcher,
90-
hostView: ViewContainerRef,
91-
@Inject(KBQ_POPOVER_SCROLL_STRATEGY) scrollStrategy,
92-
@Optional() direction: Directionality,
9380
@Optional() @Inject(KBQ_POPOVER_CONFIRM_TEXT) confirmText: string,
9481
@Optional() @Inject(KBQ_POPOVER_CONFIRM_BUTTON_TEXT) confirmButtonText: string
9582
) {
96-
super(overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction);
83+
super();
9784

9885
this.confirmText = confirmText || 'Вы уверены, что хотите продолжить?';
9986
this.confirmButtonText = confirmButtonText || 'Да';

0 commit comments

Comments
 (0)