From ee7d6317c8434160fe30e3d51584f85287554ccb Mon Sep 17 00:00:00 2001 From: N1XUS Date: Mon, 28 Aug 2023 09:05:08 +0300 Subject: [PATCH] fix(core): datepicker outer focustrap (#10396) --- .../lib/date-picker/date-picker.component.ts | 12 ++++++++- .../datetime-picker.component.ts | 25 +++++++++++-------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/libs/core/src/lib/date-picker/date-picker.component.ts b/libs/core/src/lib/date-picker/date-picker.component.ts index 28057ee17de..e0398519418 100644 --- a/libs/core/src/lib/date-picker/date-picker.component.ts +++ b/libs/core/src/lib/date-picker/date-picker.component.ts @@ -41,7 +41,7 @@ import { FormItemControl, PopoverFormMessageService, registerFormItemControl } f import { PopoverService } from '@fundamental-ngx/core/popover'; import { InputGroupInputDirective } from '@fundamental-ngx/core/input-group'; import { createMissingDateImplementationError } from './errors'; -import { DynamicComponentService, Nullable } from '@fundamental-ngx/cdk/utils'; +import { DynamicComponentService, FocusTrapService, Nullable } from '@fundamental-ngx/cdk/utils'; import { FormStates } from '@fundamental-ngx/cdk/forms'; import { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode'; import { FD_DATE_PICKER_COMPONENT, FD_DATE_PICKER_MOBILE_CONFIG } from './tokens'; @@ -430,6 +430,11 @@ export class DatePickerComponent /** @hidden */ private readonly _dynamicComponentService = inject(DynamicComponentService); + /** @hidden */ + private readonly _focusTrapService = inject(FocusTrapService, { + optional: true + }); + /** @hidden */ private _mobileComponentRef: Nullable>>; @@ -529,6 +534,11 @@ export class DatePickerComponent const calendar = this._calendars.first; this._calendarComponent = calendar; setTimeout(() => { + if (this._calendarComponent) { + this._focusTrapService?.pauseCurrentFocusTrap(); + } else { + this._focusTrapService?.unpauseCurrentFocusTrap(); + } calendar?.setCurrentlyDisplayed(this._calendarPendingDate); calendar?.initialFocus(); }); diff --git a/libs/core/src/lib/datetime-picker/datetime-picker.component.ts b/libs/core/src/lib/datetime-picker/datetime-picker.component.ts index fe88d16cad8..5d56e760aef 100644 --- a/libs/core/src/lib/datetime-picker/datetime-picker.component.ts +++ b/libs/core/src/lib/datetime-picker/datetime-picker.component.ts @@ -33,7 +33,7 @@ import { InputGroupInputDirective } from '@fundamental-ngx/core/input-group'; import { createMissingDateImplementationError } from './errors'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; -import { DynamicComponentService, Nullable } from '@fundamental-ngx/cdk/utils'; +import { DynamicComponentService, FocusTrapService, Nullable } from '@fundamental-ngx/cdk/utils'; import { FormStates } from '@fundamental-ngx/cdk/forms'; import { DateTimePicker } from './datetime-picker.model'; import { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode'; @@ -369,18 +369,13 @@ export class DatetimePickerComponent /** @hidden Reference to the inner calendar component. */ @ViewChild(CalendarComponent, { static: false }) private set _calendarCmp(calendar: CalendarComponent) { - if (!this.isOpen) { - return; - } - - calendar?.setCurrentlyDisplayed(this._calendarPendingDate); - calendar?.initialFocus(); + setTimeout(() => { + calendar?.setCurrentlyDisplayed(this._calendarPendingDate); + calendar?.initialFocus(); + }); this._calendarComponent = calendar; } - /** @hidden */ - _calendarComponent: CalendarComponent; - /** @hidden */ @ViewChild('inputGroupComponent', { read: ElementRef @@ -397,6 +392,9 @@ export class DatetimePickerComponent @ViewChild('pickerTemplate') private readonly _pickerTemplate: TemplateRef; + /** @hidden */ + _calendarComponent: CalendarComponent; + /** @hidden */ _message: string | null = null; @@ -452,6 +450,11 @@ export class DatetimePickerComponent /** @hidden */ private readonly _dynamicComponentService = inject(DynamicComponentService); + /** @hidden */ + private readonly _focusTrapService = inject(FocusTrapService, { + optional: true + }); + /** @hidden */ private _mobileComponentRef: Nullable>>; @@ -591,6 +594,7 @@ export class DatetimePickerComponent /** Opens the popover. */ openPopover(): void { if (!this.isOpen && !this.disabled) { + this._focusTrapService?.pauseCurrentFocusTrap(); this._showPopoverContents = true; this._changeDetRef.detectChanges(); this.isOpen = true; @@ -606,6 +610,7 @@ export class DatetimePickerComponent this.onClose.emit(); this.isOpen = false; this._onOpenStateChanged(this.isOpen); + this._focusTrapService?.unpauseCurrentFocusTrap(); this.handleOnTouched(); }