Skip to content

Commit a0a6b4b

Browse files
Merge pull request #56 from klippa-app/fix/add_size_observers_for_select_tail
Added size observers for components used in tail position calculation
2 parents 8eb337a + c1df4a7 commit a0a6b4b

2 files changed

Lines changed: 30 additions & 4 deletions

File tree

projects/klippa/ngx-enhancy-forms/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@klippa/ngx-enhancy-forms",
3-
"version": "20.1.0",
3+
"version": "20.1.1",
44
"publishConfig": {
55
"access": "public"
66
},

projects/klippa/ngx-enhancy-forms/src/lib/elements/select/select.component.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,12 @@ export class SelectComponent extends ValueAccessorBase<string | string[]> implem
8282

8383
private lastItemIndexReached = -1;
8484
public dropdownPositionToUse: 'auto' | 'bottom' | 'top' | 'left' | 'right' = 'bottom';
85-
private isOpen: boolean = false;
85+
private isOpen = false;
8686
private dropdownPanelOffsetX = 0;
8787
private dropdownPanelOffsetY = 0;
8888
private anchorAbsolute: HTMLDivElement;
8989
private anchorFixed: HTMLDivElement;
90+
private resizeObserver?: ResizeObserver;
9091

9192
constructor(
9293
@Optional() @Host() protected parent: FormElementComponent,
@@ -101,6 +102,7 @@ export class SelectComponent extends ValueAccessorBase<string | string[]> implem
101102
ngAfterViewInit(): void {
102103
this.addPrefix();
103104
this.addTail();
105+
this.createSizeObservers();
104106
this.updateTailPosition();
105107
this.elRef.nativeElement.querySelector('input').addEventListener('keydown', this.keyListener);
106108
}
@@ -130,6 +132,29 @@ export class SelectComponent extends ValueAccessorBase<string | string[]> implem
130132
}
131133
}
132134

135+
private createSizeObservers(): void {
136+
const ngInput = this.elRef.nativeElement.querySelector('.ng-select');
137+
const arrowWrapper = this.elRef.nativeElement.querySelector('.ng-arrow-wrapper');
138+
const prefixElement = this.elRef.nativeElement.querySelector('.prefix-tpl');
139+
140+
const elementsToObserve: HTMLElement[] = [];
141+
if (ngInput) {
142+
elementsToObserve.push(ngInput);
143+
}
144+
if (arrowWrapper) {
145+
elementsToObserve.push(arrowWrapper);
146+
}
147+
if (prefixElement) {
148+
elementsToObserve.push(prefixElement);
149+
}
150+
151+
this.resizeObserver = new ResizeObserver(() => {
152+
this.updateTailPosition();
153+
});
154+
155+
elementsToObserve.forEach(el => this.resizeObserver.observe(el));
156+
}
157+
133158
private updateTailPosition(): void {
134159
if (this.tailRef) {
135160
let offset = 0;
@@ -263,7 +288,7 @@ export class SelectComponent extends ValueAccessorBase<string | string[]> implem
263288

264289
dropdownPanel.style.position = 'fixed';
265290
this.setPanelOffsets();
266-
};
291+
}
267292

268293
private setWidthBasedOnOptionsWidths = async (): Promise<void> => {
269294
if (this.truncateOptions === false) {
@@ -300,7 +325,7 @@ export class SelectComponent extends ValueAccessorBase<string | string[]> implem
300325
this.setPanelOffsets();
301326
}
302327
}
303-
};
328+
}
304329

305330
private getAllLimitingContainers(): Array<HTMLElement> {
306331
const result = [];
@@ -429,5 +454,6 @@ export class SelectComponent extends ValueAccessorBase<string | string[]> implem
429454
ngOnDestroy(): void {
430455
super.ngOnDestroy();
431456
this.elRef.nativeElement?.querySelector('input')?.removeEventListener('keydown', this.keyListener);
457+
this.resizeObserver?.disconnect();
432458
}
433459
}

0 commit comments

Comments
 (0)