Skip to content

Commit 8be5fb1

Browse files
committed
feat(popover, notification-center): added 'stickToWindow' (#DS-3621)
1 parent 4aa1066 commit 8be5fb1

File tree

7 files changed

+52
-9
lines changed

7 files changed

+52
-9
lines changed

packages/components-dev/popover/module.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export class DevApp {
100100
selectedTrigger: string = this.TRIGGERS.CLICK;
101101
selectedSize: PopUpSizes = PopUpSizes.Medium;
102102
layoutClass: string = 'layout-row layout-align-center-center';
103+
stickToWindow: PopUpPlacements;
103104
content: string = 'button text';
104105
userDefinedPlacementPriority: string[] = ['bottom', 'right'];
105106
multipleSelected: string[] = [];

packages/components-dev/popover/template.html

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,19 @@
139139
</kbq-form-field>
140140
</div>
141141

142-
<div
143-
class="kbq-form__row"
144-
[style.display]="selectedElement === ELEMENTS.CONFIRM_BUTTON ? 'initial' : 'none'"
145-
>
146-
<label for="layout" class="kbq-form__label">Set confirm button text</label>
142+
<div class="kbq-form__row">
143+
<label for="layout" class="kbq-form__label">Stick to window</label>
147144

148145
<kbq-form-field id="layout" class="kbq-form__control">
149-
<input kbqInput [(ngModel)]="confirmButtonText" />
146+
<kbq-select [placeholder]="'Select layout'" [(value)]="stickToWindow">
147+
<kbq-option [value]="popUpPlacements.Top">{{ popUpPlacements.Top }}</kbq-option>
148+
<kbq-option [value]="popUpPlacements.Right">{{ popUpPlacements.Right }}</kbq-option>
149+
<kbq-option [value]="popUpPlacements.Bottom">{{ popUpPlacements.Bottom }}</kbq-option>
150+
<kbq-option [value]="popUpPlacements.Left">{{ popUpPlacements.Left }}</kbq-option>
151+
</kbq-select>
150152
</kbq-form-field>
151153
</div>
154+
<br />
152155
</div>
153156
<div class="flex dev-left-padding layout-align-center-center">
154157
<label for="trigger" class="flex kbq-form__label">Choose kbqPlacement</label>
@@ -309,6 +312,7 @@ <h3>Configuration:</h3>
309312
[kbqPopoverPlacementPriority]="multipleSelected"
310313
[kbqPopoverSize]="selectedSize"
311314
[kbqTrigger]="selectedTrigger"
315+
[kbqPopoverStickToWindow]="stickToWindow"
312316
(kbqPopoverPlacementChange)="onStrategyPlacementChange($event)"
313317
(kbqPopoverVisibleChange)="onPopoverVisibleChange($event)"
314318
>

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ export abstract class KbqPopUpTrigger<T> implements OnInit, OnDestroy {
112112

113113
triggerName: string;
114114

115+
overlayRef: OverlayRef | null;
116+
117+
stickToWindow: PopUpPlacements.Top | PopUpPlacements.Right | PopUpPlacements.Bottom | PopUpPlacements.Left | string;
118+
115119
abstract disabled: boolean;
116120
abstract arrow: boolean;
117121
abstract trigger: string;
@@ -133,7 +137,6 @@ export abstract class KbqPopUpTrigger<T> implements OnInit, OnDestroy {
133137
protected _disabled: boolean;
134138
protected _customClass: string;
135139

136-
protected overlayRef: OverlayRef | null;
137140
protected portal: ComponentPortal<T>;
138141
protected instance: any | null;
139142

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
TemplateRef
1212
} from '@angular/core';
1313
import { BehaviorSubject, Observable, Subject } from 'rxjs';
14-
import { PopUpVisibility } from './constants';
14+
import { PopUpPlacements, PopUpVisibility } from './constants';
1515
import { KbqPopUpTrigger } from './pop-up-trigger';
1616

1717
@Directive({
@@ -162,4 +162,20 @@ export abstract class KbqPopUp implements OnDestroy {
162162
protected addEventListenerForHide() {
163163
this.elementRef.nativeElement.addEventListener('mouseleave', () => this.hide(0));
164164
}
165+
166+
protected setStickPosition() {
167+
const oppositeSide = {
168+
[PopUpPlacements.Top]: PopUpPlacements.Bottom,
169+
[PopUpPlacements.Bottom]: PopUpPlacements.Top,
170+
[PopUpPlacements.Right]: PopUpPlacements.Left,
171+
[PopUpPlacements.Left]: PopUpPlacements.Right
172+
}[this.trigger.stickToWindow];
173+
174+
if (!this.trigger.stickToWindow || !oppositeSide) return;
175+
176+
this.arrow = false;
177+
178+
this.renderer.setStyle(this.trigger.overlayRef?.overlayElement, this.trigger.stickToWindow, 0);
179+
this.renderer.setStyle(this.trigger.overlayRef?.overlayElement, oppositeSide, 'unset');
180+
}
165181
}

packages/components/notification-center/notification-center.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ export class KbqNotificationCenterComponent extends KbqPopUp implements AfterVie
177177
`${this.offset!.toString()}px`
178178
);
179179
}
180+
181+
this.setStickPosition();
180182
});
181183

182184
this.service.changes.subscribe(() => this.changeDetectorRef.markForCheck());
@@ -322,6 +324,13 @@ export class KbqNotificationCenterTrigger
322324
}
323325
}
324326

327+
@Input() stickToWindow:
328+
| PopUpPlacements.Top
329+
| PopUpPlacements.Right
330+
| PopUpPlacements.Bottom
331+
| PopUpPlacements.Left
332+
| string;
333+
325334
/** @docs-private */
326335
get hasClickTrigger(): boolean {
327336
return this.trigger.includes(PopUpTriggers.Click);

packages/components/popover/popover.component.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ export class KbqPopoverComponent extends KbqPopUp implements AfterViewInit {
9595
this.prefix,
9696
`${this.offset!.toString()}px`
9797
);
98+
99+
this.setStickPosition();
98100
}
99101
});
100102
}
@@ -108,7 +110,7 @@ export class KbqPopoverComponent extends KbqPopUp implements AfterViewInit {
108110

109111
this.isContentTopOverflow = scrollTop > 0;
110112

111-
this.isContentBottomOverflow = scrollTop + offsetHeight < scrollHeight;
113+
this.isContentBottomOverflow = Math.round(scrollTop + offsetHeight) < scrollHeight;
112114

113115
super.detectChanges();
114116
}
@@ -195,6 +197,13 @@ export class KbqPopoverTrigger extends KbqPopUpTrigger<KbqPopoverComponent> impl
195197
super.updatePlacementPriority(value);
196198
}
197199

200+
@Input('kbqPopoverStickToWindow') stickToWindow:
201+
| PopUpPlacements.Top
202+
| PopUpPlacements.Right
203+
| PopUpPlacements.Bottom
204+
| PopUpPlacements.Left
205+
| string;
206+
198207
@Input()
199208
get hasBackdrop(): boolean {
200209
return this._hasBackdrop;

packages/docs-examples/components/notification-center/notification-center-popover/notification-center-popover-example.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<kbq-navbar-item
3535
#trigger="kbqNotificationCenterTrigger"
3636
kbqNotificationCenterTrigger
37+
[stickToWindow]="'right'"
3738
[popoverMode]="true"
3839
[popoverHeight]="'430px'"
3940
>

0 commit comments

Comments
 (0)