Skip to content

Commit 0aac9d7

Browse files
authored
Merge branch 'development' into fix-memory-leaks
2 parents 1f9b98e + 876f20d commit 0aac9d7

File tree

4 files changed

+30
-44
lines changed

4 files changed

+30
-44
lines changed

libs/common-docs/src/lib/common/top-menu/top-menu.component.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,11 @@ export class TopMenuComponent implements AfterViewInit {
4444
this.http
4545
.get<{ url: string; version: string; unprefixedUrl: string }[]>('assets/json/versions.json')
4646
.subscribe((data) => {
47-
this.previousDocs.push(data[0]);
48-
this.previousDocs = this.previousDocs.concat(data.reverse()).slice(0, -1);
47+
this.previousDocs = data.sort((versionA, versionB) => {
48+
const versionAsNumberA = Number(versionA.version.split('.').join(''));
49+
const versionAsNumberB = Number(versionB.version.split('.').join(''));
50+
return versionAsNumberB - versionAsNumberA;
51+
});
4952
});
5053

5154
this.http.get<{ version: string }>('assets/json/current-version.json').subscribe((data: { version: string }) => {

src/component-loader/component-loader.class.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ export class ComponentLoader<T extends object> {
226226
);
227227
}
228228
this._contentRef?.viewRef?.destroy();
229+
this._componentRef?.destroy();
229230

230231
this._contentRef = void 0;
231232
this._componentRef = void 0;
@@ -312,12 +313,16 @@ export class ComponentLoader<T extends object> {
312313
if (!this._componentRef || !this._componentRef.location) {
313314
return;
314315
}
316+
317+
let unsubscribeOutsideClick = Function.prototype;
318+
let unsubscribeEscClick = Function.prototype;
319+
315320
// why: should run after first event bubble
316321
if (this._listenOpts.outsideClick) {
317322
const target = this._componentRef.location.nativeElement;
318323
setTimeout(() => {
319324
if (this._renderer && this._elementRef) {
320-
this._globalListener = registerOutsideClick(this._renderer, {
325+
unsubscribeOutsideClick = registerOutsideClick(this._renderer, {
321326
targets: [target, this._elementRef.nativeElement],
322327
outsideClick: this._listenOpts.outsideClick,
323328
hide: () => this._listenOpts.hide && this._listenOpts.hide()
@@ -327,12 +332,17 @@ export class ComponentLoader<T extends object> {
327332
}
328333
if (this._listenOpts.outsideEsc && this._renderer && this._elementRef) {
329334
const target = this._componentRef.location.nativeElement;
330-
this._globalListener = registerEscClick(this._renderer, {
335+
unsubscribeEscClick = registerEscClick(this._renderer, {
331336
targets: [target, this._elementRef.nativeElement],
332337
outsideEsc: this._listenOpts.outsideEsc,
333338
hide: () => this._listenOpts.hide && this._listenOpts.hide()
334339
});
335340
}
341+
342+
this._globalListener = () => {
343+
unsubscribeOutsideClick();
344+
unsubscribeEscClick();
345+
};
336346
}
337347

338348
getInnerComponent(): ComponentRef<T> | undefined {

src/datepicker/bs-datepicker-input.directive.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ export class BsDatepickerInputDirective implements ControlValueAccessor, Validat
190190
}
191191

192192
this._picker.bsValue = this._value;
193+
this._onChange(this._value);
193194
}
194195

195196
setDisabledState(isDisabled: boolean): void {

src/datepicker/testing/bs-daterangepicker.spec.ts

Lines changed: 12 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
77
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
88
import { By } from '@angular/platform-browser';
99
import { BsCustomDates } from '../themes/bs/bs-custom-dates-view.component';
10+
import { firstValueFrom } from 'rxjs';
1011

1112
@Component({
1213
selector: 'test-cmp',
@@ -87,7 +88,7 @@ describe('daterangepicker:', () => {
8788
expect(timepickerZone).not.toBeTruthy();
8889
});
8990

90-
it('should update time when time is changed in timepicker', () => {
91+
it('should update time when time is changed in timepicker', (done) => {
9192
const directive = getDaterangepickerDirective(fixture);
9293
directive.bsConfig = {
9394
withTimepicker: true
@@ -119,6 +120,7 @@ describe('daterangepicker:', () => {
119120
.subscribe(view => {
120121
expect(view[0].getMinutes()).toEqual(ranges[1].value[0].getMinutes());
121122
expect(view[1].getMinutes()).toEqual(ranges[1].value[1].getMinutes());
123+
done();
122124
});
123125
});
124126

@@ -185,7 +187,7 @@ describe('daterangepicker:', () => {
185187
expect(getDaterangepickerContainer(datepicker)).toBeNull();
186188
});
187189

188-
it('should display correct date range in input when selected from ranges', () => {
190+
it('should display correct date range in input when selected from ranges', (done) => {
189191
const datepicker = showDatepicker(fixture);
190192
const ranges = [
191193
{
@@ -207,6 +209,7 @@ describe('daterangepicker:', () => {
207209
.select(state => state.selectedRange)
208210
.subscribe(view => {
209211
expect(view).toEqual(ranges[0].value);
212+
done();
210213
});
211214
});
212215

@@ -230,31 +233,6 @@ describe('daterangepicker:', () => {
230233

231234
const rangesButton = document.querySelector('.bs-datepicker-predefined-btns');
232235
expect(rangesButton.childElementCount).toEqual(ranges.length);
233-
234-
});
235-
236-
it('should display correct date range in input when selected from ranges', () => {
237-
const datepicker = showDatepicker(fixture);
238-
const ranges = [
239-
{
240-
label: 'Last 7 days',
241-
value: [new Date('12-10-2019'), new Date('12-16-2019')]
242-
},
243-
{
244-
label: 'Next 7 days',
245-
value: [new Date('12-16-2019'), new Date('12-22-2019')]
246-
}
247-
];
248-
datepicker.bsConfig.ranges = ranges;
249-
const datepickerContainerInstance = getDaterangepickerContainer(datepicker);
250-
datepickerContainerInstance.setRangeOnCalendar(ranges[0]);
251-
252-
fixture.detectChanges();
253-
datepickerContainerInstance[`_store`]
254-
.select(state => state.selectedRange)
255-
.subscribe(view => {
256-
expect(view).toEqual(ranges[0].value);
257-
});
258236
});
259237

260238
it('should correctly display the selected range button with active custom class', () => {
@@ -286,7 +264,7 @@ describe('daterangepicker:', () => {
286264
expect(activeRangeButton[0].innerHTML.trim()).toEqual(ranges[0].label);
287265
});
288266

289-
it('should not allow to select date behind max value', () => {
267+
it('should not allow to select date behind max value', async () => {
290268
const datepicker = showDatepicker(fixture);
291269
datepicker.bsConfig.maxDate = new Date();
292270
datepicker.bsConfig.maxDateRange = 10;
@@ -300,15 +278,12 @@ describe('daterangepicker:', () => {
300278
value: [correctDateStart, correctDateEnd]
301279
};
302280

303-
datepickerContainerInstance.setMaxDateRangeOnCalendar(correctDateStart);
281+
datepickerContainerInstance.setMaxDateRangeOnCalendar(correctDateEnd);
304282
datepickerContainerInstance.setRangeOnCalendar(selectedRange);
305283
fixture.detectChanges();
306284

307-
datepickerContainerInstance[`_store`]
308-
.select(state => state)
309-
.subscribe(view => {
310-
expect(view.maxDate).toEqual(correctDateEnd);
311-
});
285+
let view = await firstValueFrom(datepickerContainerInstance[`_store`].select((state) => state));
286+
expect(view.maxDate).toEqual(correctDateEnd);
312287

313288
const incorrectCaseStart = new Date(new Date().setDate(new Date().getDate() - 5));
314289
const incorrectCaseEnd = new Date(new Date().setDate(new Date().getDate() + 15));
@@ -321,10 +296,7 @@ describe('daterangepicker:', () => {
321296
datepickerContainerInstance.setRangeOnCalendar(selectedRange1);
322297
fixture.detectChanges();
323298

324-
datepickerContainerInstance[`_store`]
325-
.select(state => state)
326-
.subscribe(view => {
327-
expect(view.maxDate).not.toEqual(incorrectCaseEnd);
328-
});
329-
});
299+
view = await firstValueFrom(datepickerContainerInstance[`_store`].select((state) => state));
300+
expect(view.maxDate).not.toEqual(incorrectCaseEnd);
330301
});
302+
});

0 commit comments

Comments
 (0)