diff --git a/src/app/components/presentationals/main-toolbar/main-toolbar-desktop-vertical/main-toolbar-desktop-vertical.presentational.scss b/src/app/components/presentationals/main-toolbar/main-toolbar-desktop-vertical/main-toolbar-desktop-vertical.presentational.scss index 33ec3684a976491fa221d308eb32ad8f3a7ebe50..77b40e0185b6bf714e946d4a1ff74f3c415dab42 100644 --- a/src/app/components/presentationals/main-toolbar/main-toolbar-desktop-vertical/main-toolbar-desktop-vertical.presentational.scss +++ b/src/app/components/presentationals/main-toolbar/main-toolbar-desktop-vertical/main-toolbar-desktop-vertical.presentational.scss @@ -95,7 +95,7 @@ dlcm-theme-selector ::ng-deep { background-color: $dark-grey; } - &.is-keybord-selected { + &.is-keyboard-selected { background-color: $grey; } diff --git a/src/app/features/admin/dissemination-policy/components/presentationals/admin-dissemination-policy-form/admin-dissemination-policy-form.presentational.html b/src/app/features/admin/dissemination-policy/components/presentationals/admin-dissemination-policy-form/admin-dissemination-policy-form.presentational.html index 4afb288bd6c332b91eb208e0711b49f3443c4e09..6a37aa5c28cafca76dc08149e19da18bf83f3edc 100644 --- a/src/app/features/admin/dissemination-policy/components/presentationals/admin-dissemination-policy-form/admin-dissemination-policy-form.presentational.html +++ b/src/app/features/admin/dissemination-policy/components/presentationals/admin-dissemination-policy-form/admin-dissemination-policy-form.presentational.html @@ -48,7 +48,8 @@ <button *ngIf="!readonly" mat-flat-button color="primary" - (keydown.enter)="onSubmit()" + solidifyShortCuts + (onEnter)="onSubmit()" type="submit" [disabled]="!form.valid || !form.dirty" > diff --git a/src/app/features/home/components/presentationals/home-browsing-org-unit/home-browsing-org-unit.presentational.scss b/src/app/features/home/components/presentationals/home-browsing-org-unit/home-browsing-org-unit.presentational.scss index 713ec030c7cb1a04dd8d5918f5e87c99897e0aa6..74a027768fb5e2acc6f78463f21068ce32294025 100644 --- a/src/app/features/home/components/presentationals/home-browsing-org-unit/home-browsing-org-unit.presentational.scss +++ b/src/app/features/home/components/presentationals/home-browsing-org-unit/home-browsing-org-unit.presentational.scss @@ -37,7 +37,7 @@ $padding-vertical: 10px; background-color: $extra-light-grey } - &.is-keybord-selected { + &.is-keyboard-selected { cursor: initial; background-color: $extra-light-grey } diff --git a/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html b/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html index b9561a42d800b9f19549ad397acb3338c73b23b4..d5857e7e819a26990925353f593cbb1865210271 100644 --- a/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html +++ b/src/app/shared/components/containers/shared-tabs/shared-tabs.container.html @@ -1,7 +1,6 @@ <ul class="tabs-header-container"> <li *ngFor="let tab of tabs; trackBy: trackByFn" class="tab-header" - tabindex="0" [tabIndex]="0" [class.hide]="!(isDisplayed(tab) | async)" [class.is-active]="tab === currentTab" diff --git a/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.scss b/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.scss index 53af944e984a7595f2d28c0ba75a8263b6441eab..e606739186faa4c3218a59799dced286989a9e55 100644 --- a/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.scss +++ b/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.scss @@ -90,7 +90,7 @@ $min-height-result: $height-overlay/2 + $height-input; color: $primary-color; } - &.is-keybord-selected { + &.is-keyboard-selected { background-color: rgba(0, 0, 0, 0.04); color: $primary-color; } diff --git a/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.ts b/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.ts index 849b4e494d6cd46a713d050d98157454b3efcfee..89f21b724775881ca7dce03f372dfb330d351c2b 100644 --- a/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.ts +++ b/src/app/shared/components/presentationals/shared-abstract-content/shared-abstract-content.presentational.ts @@ -10,7 +10,6 @@ import { BehaviorSubject, Observable, } from "rxjs"; -import {take} from "rxjs/operators"; import { BaseResourceType, isEmptyString, @@ -31,6 +30,9 @@ export abstract class SharedAbstractContentPresentational<TResource extends Base @Output("closeByTabChange") readonly closeByTabObs: Observable<void> = ObservableUtil.asObservable(this._closeByTabBS); + private readonly _closeByShiftTabBS: BehaviorSubject<void> = new BehaviorSubject<void>(undefined); + @Output("closeByShiftTabChange") + readonly closeByShiftTabObs: Observable<void> = ObservableUtil.asObservable(this._closeByShiftTabBS); constructor() { super(); @@ -40,6 +42,9 @@ export abstract class SharedAbstractContentPresentational<TResource extends Base this._closeByTabBS.next(); } + closeByShiftTab(): void { + this._closeByShiftTabBS.next(); + } ngOnInit(): void { super.ngOnInit(); @@ -65,6 +70,7 @@ export abstract class SharedAbstractContentPresentational<TResource extends Base } selectNextResource(): void { + debugger const val = this.host.list; let activeValIndex = -1; for (let index = 0; index < val.length; index++) { diff --git a/src/app/shared/components/presentationals/shared-abstract-multi-select/shared-abstract-multi-select.presentational.ts b/src/app/shared/components/presentationals/shared-abstract-multi-select/shared-abstract-multi-select.presentational.ts index 40250951f6e80ba29d0a9d3cafd20434445765ca..efd8a77d56b56ca8e4657f2e9f945200d8a8c742 100644 --- a/src/app/shared/components/presentationals/shared-abstract-multi-select/shared-abstract-multi-select.presentational.ts +++ b/src/app/shared/components/presentationals/shared-abstract-multi-select/shared-abstract-multi-select.presentational.ts @@ -209,37 +209,54 @@ export abstract class SharedAbstractMultiSelectPresentational<TResource extends this._closeOverlay(overlayRef); }), )); - this.subscribe(componentRef.instance.closeByTabObs.pipe( - tap(() => { - this.closeOverlays(); - }, - ))); } private _observeClickBackdrop(componentRef: ComponentRef<SharedAbstractContentPresentational<TResource>>, overlayRef: OverlayRef): void { + this.subscribe(overlayRef.backdropClick().pipe( tap(() => { this._closeOverlay(overlayRef); }), )); + this.subscribe(componentRef.instance.closeByTabObs.pipe( + tap(() => { + debugger + this._closeOverlay(overlayRef, true); + }, + ))); + this.subscribe(componentRef.instance.closeByShiftTabObs.pipe( + tap(() => { + debugger + this._closeOverlay(overlayRef, false); + }, + ))); } - private _closeOverlay(overlayRef: OverlayRef, keepInOverlayRefs?: boolean): void { + private _closeOverlay(overlayRef: OverlayRef, isByTab: boolean = true, keepInOverlayRefs?: boolean): void { + debugger overlayRef.detach(); if (!keepInOverlayRefs) { this._overlayRefs.delete(overlayRef); } - this._tabulationService.focusNext(this._elementToReFocus); - this.formControl.markAsTouched(); this._changeDetector.detectChanges(); + if (isByTab) { + this._tabulationService.focusNext(this._elementToReFocus); + } else { + this._tabulationService.focusPrev(this._elementToReFocus); + } } - closeOverlays(): void { - this._overlayRefs.forEach(overlayRef => this._closeOverlay(overlayRef, true)); + private _closeOverlays(isByTab: boolean = true): void { + this._overlayRefs.forEach(overlayRef => this._closeOverlay(overlayRef, isByTab, true)); this._overlayRefs.clear(); } + closeOverlays(keyEvent: KeyboardEvent, isByTab: boolean = true): void { + keyEvent.preventDefault(); + this._closeOverlays(isByTab); + } + private _getPosition(elementToConnectTo: ElementRef): FlexibleConnectedPositionStrategy { return this._overlay.position() .flexibleConnectedTo(elementToConnectTo) diff --git a/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.html b/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.html index a1ff7a9b1710b922463487790e0adcd4b8b3b69c..4d08f8c19374e892b36bdf78957b33ec4adc0525 100644 --- a/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.html +++ b/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.html @@ -1,39 +1,48 @@ <lib-empty-container solidifyShortCuts - (onEscape)="close()"> -<div class="button-wrapper"> - <mat-icon class="close" - (click)="close()" - >close - </mat-icon> -</div> -<div class="result" - [class.no-data]="host?.list?.length === 0" + cdkTrapFocus + [solidifyFocusFirstElement]="true" + (keydown.tab)="closeByTab()" + (keydown.shift.tab)="closeByShiftTab()" + (onEscape)="close()" + (keydown.enter)="select(host.list[indexSelected])" > - <ng-template [ngIf]="host.list | isNonEmptyArray" - [ngIfElse]="noData" + <a [tabindex]="0" + ></a> + <div class="button-wrapper"> + <mat-icon class="close" + (click)="close()" + >close + </mat-icon> + </div> + <div class="result" + [class.no-data]="host?.list?.length === 0" > + <ng-template [ngIf]="host.list | isNonEmptyArray" + [ngIfElse]="noData" + > - <ul> - <ng-container *ngFor="let value of host.list"> - <li *ngIf="!host.hideItemSelected || !isActive(value)" - [value]="value[host.valueKey]" - [class.is-active]="isActive(value)" - (click)="select(value)" - > - <span class="label">{{value[host.labelKey]}}</span> - <span *ngIf="value[host.extraInfoLabelKey] | isNonEmptyString" - class="extra-info" - ><img *ngIf="host.extraInfoImage" - [src]="'assets/images/'+ host.extraInfoImage" - [alt]="host.extraInfoImage" + <ul> + <ng-container *ngFor="let value of host.list; let i = index"> + <li *ngIf="!host.hideItemSelected || !isActive(value)" + [value]="value[host.valueKey]" + [class.is-keyboard-selected]="i === indexSelected" + [class.is-active]="isActive(value)" + (click)="select(value)" > - {{value[host.extraInfoLabelKey]}}</span> - </li> - </ng-container> - </ul> - </ng-template> - <ng-template #noData> - {{noDataToSelect | translate}} - </ng-template> -</div> + <span class="label">{{value[host.labelKey]}}</span> + <span *ngIf="value[host.extraInfoLabelKey] | isNonEmptyString" + class="extra-info" + ><img *ngIf="host.extraInfoImage" + [src]="'assets/images/'+ host.extraInfoImage" + [alt]="host.extraInfoImage" + > + {{value[host.extraInfoLabelKey]}}</span> + </li> + </ng-container> + </ul> + </ng-template> + <ng-template #noData> + {{noDataToSelect | translate}} + </ng-template> + </div> </lib-empty-container> diff --git a/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.ts b/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.ts index 16c92cd7446fe6f2155cd55f9c927e35d846fca7..91758a125c3a3b7dc1af39b9ede3bb06d1348345 100644 --- a/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.ts +++ b/src/app/shared/components/presentationals/shared-multi-select-content/shared-multi-select-content.presentational.ts @@ -25,8 +25,6 @@ import { }) export class SharedMultiSelectContentPresentational<TResource extends BaseResourceType> extends SharedAbstractContentPresentational<TResource> { - // TODO add navigation to this component when issue of host fixed. - @Input() host: any; // (SharedMultiSelectPresentational<TResource>;) CAUSE RUNTIME ERROR WHEN AOT BUILD WITHOUT SOURCEMAP. Following error on polyfills.js: Uncaught TypeError: Object prototype may only be an Object or null: undefined diff --git a/src/app/shared/components/presentationals/shared-multi-select-default-value-content/shared-multi-select-default-value-content.presentational.html b/src/app/shared/components/presentationals/shared-multi-select-default-value-content/shared-multi-select-default-value-content.presentational.html index 0d6155ac846858cfd4026f7bfa0e13af2aa0c590..df8cd9fa6f171463783418bd104b941342b01cfa 100644 --- a/src/app/shared/components/presentationals/shared-multi-select-default-value-content/shared-multi-select-default-value-content.presentational.html +++ b/src/app/shared/components/presentationals/shared-multi-select-default-value-content/shared-multi-select-default-value-content.presentational.html @@ -1,7 +1,8 @@ <lib-empty-container [solidifyFocusFirstElement]="true" solidifyShortCuts cdkTrapFocus - (keydown.tab)="close()" + (keydown.tab)="closeByTab()" + (keydown.shift.tab)="closeByShiftTab()" (onEscape)="close()" (onEnter)="select(host.list[indexSelected])" > @@ -28,7 +29,7 @@ <li *ngIf="!host.hideItemSelected || !isActive(value)" [value]="value[host.valueKey]" - [class.is-keybord-selected]="indexSelected === i" + [class.is-keyboard-selected]="indexSelected === i" [class.is-active]="isActive(value)" (click)="select(value)" > diff --git a/src/app/shared/components/presentationals/shared-multi-select/shared-multi-select.presentational.html b/src/app/shared/components/presentationals/shared-multi-select/shared-multi-select.presentational.html index 322916b697df389ad988c0752d2223a2a23f9fe7..df77a9bed9aff7303e6d1cac203bbe42de9a19e1 100644 --- a/src/app/shared/components/presentationals/shared-multi-select/shared-multi-select.presentational.html +++ b/src/app/shared/components/presentationals/shared-multi-select/shared-multi-select.presentational.html @@ -64,8 +64,6 @@ #input matInput (focus)="openOverlay(input)" - (keydown.tab)="closeOverlays()" - (keydown.shift.tab)="closeOverlays()" readonly [placeholder]="placeholder ? placeholder : ('component.multiSelect.placeholder' | translate)" [disabled]="formControl.disabled" diff --git a/src/app/shared/components/presentationals/shared-searchable-multi-select-content/shared-searchable-multi-select-content.presentational.html b/src/app/shared/components/presentationals/shared-searchable-multi-select-content/shared-searchable-multi-select-content.presentational.html index d17df98231eafdef2f71ef024d7cd6fe57aaf629..6b574c752b54f4ff4d6566597f1b89007adf32fa 100644 --- a/src/app/shared/components/presentationals/shared-searchable-multi-select-content/shared-searchable-multi-select-content.presentational.html +++ b/src/app/shared/components/presentationals/shared-searchable-multi-select-content/shared-searchable-multi-select-content.presentational.html @@ -2,7 +2,8 @@ [dlcmAutoScrollIntoView]="!navigationResId" (keydown.tab)="closeByTab()" (keydown.escape)="closeByTab()" - (keydown.shift.tab)="closeByTab()"> + (keydown.shift.tab)="closeByShiftTab()" +> <div class="input"> <mat-form-field class="form-field"> <input #input @@ -28,7 +29,7 @@ <li *ngIf="!host.hideItemSelected || !isActive(value)" [value]="value[host.valueKey]" [dlcmAutoScrollIntoView]="value.resId === navigationResId" - [class.is-keybord-selected]="value.resId === navigationResId" + [class.is-keyboard-selected]="value.resId === navigationResId" [class.is-active]="isActive(value)" (click)="select(value)" > diff --git a/src/app/shared/components/presentationals/shared-searchable-single-select-content/shared-searchable-single-select-content.presentational.html b/src/app/shared/components/presentationals/shared-searchable-single-select-content/shared-searchable-single-select-content.presentational.html index c985e3dfd54be0689bc9012d5fa55105b8355c9d..19b18d5cedd4b22033457b4b8e5473bd193923e0 100644 --- a/src/app/shared/components/presentationals/shared-searchable-single-select-content/shared-searchable-single-select-content.presentational.html +++ b/src/app/shared/components/presentationals/shared-searchable-single-select-content/shared-searchable-single-select-content.presentational.html @@ -1,6 +1,6 @@ <form [formGroup]="form" [dlcmAutoScrollIntoView]="!navigationResId" - (keydown.shift.tab)="closeByTab()" + (keydown.shift.tab)="closeByShiftTab()" (keydown.enter)="select(getFocusedResource())" (keydown.tab)="closeByTab()"> <div class="input"> @@ -28,7 +28,7 @@ <li #itemList *ngFor="let value of (listObs | async)" [value]="value[host.valueKey]" [dlcmAutoScrollIntoView]="value.resId === navigationResId" - [class.is-keybord-selected]="value.resId === navigationResId" + [class.is-keyboard-selected]="value.resId === navigationResId" [class.is-active]="isActive(value)" (keydown.enter)="select(getFocusedResource())" (click)="select(value)" diff --git a/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.html b/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.html index 035925d24749f37f2a8b4449997561bbe7179202..8d569d920ca8609e014da6e9d841ca630fd45a7f 100644 --- a/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.html +++ b/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.html @@ -17,8 +17,8 @@ <input #inputElement matInput [autocomplete]="'off'" - (keydown.tab)="closeOverlays()" - (keydown.shift.tab)="closeOverlays()" + (keydown.tab)="closeOverlays(true)" + (keydown.shift.tab)="closeOverlays(false)" (focus)="openOverlay($event)" [formControlName]="formDefinition.value" > diff --git a/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.ts b/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.ts index 9314a94e68ab23a0db755e7530319c0ecf9147d6..4b3cdfdacc597c35fd1a8c4edbbe0b7d305a3998 100644 --- a/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.ts +++ b/src/app/shared/components/presentationals/shared-searchable-single-select/shared-searchable-single-select.presentational.ts @@ -288,11 +288,17 @@ export class SharedSearchableSingleSelectPresentational<TStateModel extends Reso )); } - closeOverlays(): void { + closeOverlays(isFocusNext: boolean = true): void { this._overlayRefs.forEach(overlayRef => this._closeOverlay(overlayRef, true)); this._overlayRefs.clear(); - const elementToFocus = this._tabulationService.getNext(this.openElementToRefocus); - this._tabulationService.focusNext(elementToFocus); + if (isFocusNext) { + const elementToFocus = this._tabulationService.getNext(this.openElementToRefocus); + this._tabulationService.focusNext(elementToFocus); + } else { + const elementToFocus = this._tabulationService.getPrev(this.openElementToRefocus); + this._tabulationService.focusPrev(elementToFocus); + } + } private _observeCloseEventInOverlay(componentRef: ComponentRef<SharedSearchableSingleSelectContentPresentational<TResource>>, overlayRef: OverlayRef): void { @@ -301,11 +307,6 @@ export class SharedSearchableSingleSelectPresentational<TStateModel extends Reso this._closeOverlay(overlayRef); }), )); - this.subscribe(componentRef.instance.closeByTabObs.pipe( - tap(() => { - this.closeOverlays(); - }), - )); } private _observeClickBackdrop(componentRef: ComponentRef<SharedSearchableSingleSelectContentPresentational<TResource>>, overlayRef: OverlayRef): void { @@ -314,6 +315,11 @@ export class SharedSearchableSingleSelectPresentational<TStateModel extends Reso this._closeOverlay(overlayRef); }), )); + this.subscribe(componentRef.instance.closeByTabObs.pipe( + tap(() => { + this.closeOverlays(); + }), + )); } private _closeOverlay(overlayRef: OverlayRef, keepInOverlayRefs?: boolean): void {