RED-3780 - updated help mode to activate highlights also for modal elements
This commit is contained in:
parent
ab64ca71ad
commit
70b6128230
@ -1,6 +1,6 @@
|
||||
<iqser-icon-button
|
||||
*ngIf="dialogButton"
|
||||
(action)="helpModeService.activateHelpMode()"
|
||||
(action)="helpModeService.activateHelpMode(true)"
|
||||
icon="iqser:help-outline"
|
||||
type="help"
|
||||
[label]="'help-mode.button-text' | translate"
|
||||
|
||||
@ -9,6 +9,7 @@ import { Router } from '@angular/router';
|
||||
export class HelpModeDirective implements OnInit {
|
||||
@Input('iqserHelpMode') elementName!: string;
|
||||
@Input() scrollableParentView!: ScrollableParentView;
|
||||
@Input() dialogElement = false;
|
||||
private _path: string;
|
||||
|
||||
constructor(
|
||||
@ -35,7 +36,8 @@ export class HelpModeDirective implements OnInit {
|
||||
this._renderer.setAttribute(helperElement, 'href', this._helpModeService.getDocsLink(this.elementName));
|
||||
this._renderer.setAttribute(helperElement, 'target', '_blank');
|
||||
this._renderer.addClass(helperElement, 'help-mode');
|
||||
this._helpModeService.addElement(helperElementName, element, helperElement, this.scrollableParentView);
|
||||
|
||||
this._helpModeService.addElement(helperElementName, element, helperElement, this.scrollableParentView, this.dialogElement);
|
||||
}
|
||||
|
||||
private _generateId(): string {
|
||||
|
||||
@ -16,10 +16,11 @@ export const ScrollableParentViews = {
|
||||
|
||||
export type ScrollableParentView = keyof typeof ScrollableParentViews;
|
||||
|
||||
interface Helper {
|
||||
export interface Helper {
|
||||
readonly element: HTMLElement;
|
||||
readonly helperElement: HTMLElement;
|
||||
readonly scrollableParentView: ScrollableParentView;
|
||||
readonly dialogElement: boolean;
|
||||
}
|
||||
|
||||
@Injectable({
|
||||
@ -34,6 +35,8 @@ export class HelpModeService {
|
||||
private readonly _helperElements: Record<string, Helper> = {};
|
||||
private readonly _renderer: Renderer2;
|
||||
|
||||
private _dialogMode = false;
|
||||
|
||||
constructor(
|
||||
@Inject(HELP_DOCS) private readonly _docs: Record<string, Record<string, string>>,
|
||||
@Inject(MANUAL_BASE_URL) private readonly _manualBaseURL: string,
|
||||
@ -69,11 +72,12 @@ export class HelpModeService {
|
||||
return this._docs[elementName] ? `${this._manualBaseURL}${this._docs[elementName][this._translateService.currentLang]}` : '';
|
||||
}
|
||||
|
||||
activateHelpMode(): void {
|
||||
activateHelpMode(dialogMode: boolean = false): void {
|
||||
if (!this.isHelpModeActive) {
|
||||
document.body.style.setProperty('overflow', 'hidden');
|
||||
this._isHelpModeActive$.next(true);
|
||||
this.openHelpModeDialog();
|
||||
this._dialogMode = dialogMode;
|
||||
setTimeout(() => {
|
||||
this._enableHelperElements();
|
||||
});
|
||||
@ -97,8 +101,14 @@ export class HelpModeService {
|
||||
});
|
||||
}
|
||||
|
||||
addElement(helperElementName: string, element: HTMLElement, helperElement: HTMLElement, scrollableParentView: ScrollableParentView): void {
|
||||
this._helperElements[helperElementName] = { element, helperElement, scrollableParentView };
|
||||
addElement(
|
||||
helperElementName: string,
|
||||
element: HTMLElement,
|
||||
helperElement: HTMLElement,
|
||||
scrollableParentView: ScrollableParentView,
|
||||
dialogElement: boolean,
|
||||
): void {
|
||||
this._helperElements[helperElementName] = { element, helperElement, scrollableParentView, dialogElement };
|
||||
}
|
||||
|
||||
updateHelperElements() {
|
||||
@ -109,14 +119,14 @@ export class HelpModeService {
|
||||
|
||||
private _isElementVisible(element: HTMLElement, scrollableParentView: ScrollableParentView): boolean {
|
||||
|
||||
const elementRect = element.getBoundingClientRect();
|
||||
let elementRect: DOMRect = element.getBoundingClientRect();
|
||||
if (elementRect.top === 0 && elementRect.left === 0 && elementRect.bottom === 0 && elementRect.bottom === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (scrollableParentView) {
|
||||
const scrollableElementId = scrollableParentView === ScrollableParentViews.VIRTUAL_SCROLL ? VIRTUAL_SCROLL_ID : ANNOTATIONS_LIST_ID;
|
||||
const scrollableElement: any = document.getElementById(scrollableElementId);
|
||||
const scrollableElement: HTMLElement = <HTMLElement>document.getElementById(scrollableElementId);
|
||||
|
||||
if (!scrollableElement) {
|
||||
return false;
|
||||
@ -133,10 +143,10 @@ export class HelpModeService {
|
||||
|
||||
if (scrollableParentView === ScrollableParentViews.VIRTUAL_SCROLL) {
|
||||
for (const id of SCROLL_BUTTONS_IDS) {
|
||||
const scroll: any = document.getElementById(id);
|
||||
const scroll: HTMLElement = <HTMLElement>document.getElementById(id);
|
||||
|
||||
const elementRect = element.getBoundingClientRect();
|
||||
const scrollRect = scroll.getBoundingClientRect();
|
||||
elementRect = element.getBoundingClientRect();
|
||||
const scrollRect = scroll?.getBoundingClientRect();
|
||||
|
||||
if (elementRect.top + elementRect.height > scrollRect.top
|
||||
&& elementRect.left + elementRect.width > scrollRect.left
|
||||
@ -168,9 +178,11 @@ export class HelpModeService {
|
||||
}
|
||||
|
||||
private _enableHelperElements() {
|
||||
Object.values(this._helperElements).forEach(({ element, helperElement, scrollableParentView }) => {
|
||||
document.body.appendChild(helperElement);
|
||||
this._updateHelperElement(element, helperElement, scrollableParentView);
|
||||
Object.values(this._helperElements).forEach(({ element, helperElement, scrollableParentView, dialogElement }) => {
|
||||
if (this._dialogMode === dialogElement ) {
|
||||
document.body.appendChild(helperElement);
|
||||
this._updateHelperElement(element, helperElement, scrollableParentView);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import { ChangeDetectionStrategy, Component, HostListener } from '@angular/core';
|
||||
import { HelpModeService } from '../help-mode.service';
|
||||
import { IqserEventTarget } from '../../utils';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
|
||||
@Component({
|
||||
selector: 'iqser-help-mode',
|
||||
@ -9,10 +10,11 @@ import { IqserEventTarget } from '../../utils';
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class HelpModeComponent {
|
||||
constructor(readonly helpModeService: HelpModeService) {}
|
||||
constructor(private readonly _dialog: MatDialog, readonly helpModeService: HelpModeService) {}
|
||||
|
||||
@HostListener('document:keydown.escape') onEscKeydownHandler(): void {
|
||||
if (!this.helpModeService.helpModeDialogIsOpened) {
|
||||
@HostListener('document:keydown.escape', ['$event']) onEscKeydownHandler(event: KeyboardEvent): void {
|
||||
if (!this.helpModeService.helpModeDialogIsOpened && this.helpModeService.isHelpModeActive) {
|
||||
event?.stopPropagation();
|
||||
this.helpModeService.deactivateHelpMode();
|
||||
}
|
||||
}
|
||||
@ -20,7 +22,8 @@ export class HelpModeComponent {
|
||||
@HostListener('document:keydown.h', ['$event']) onHKeydownHandler(event: KeyboardEvent): void {
|
||||
const node = (event.target as IqserEventTarget).localName;
|
||||
if (!this.helpModeService.isHelpModeActive && node !== 'input' && node !== 'textarea') {
|
||||
this.helpModeService.activateHelpMode();
|
||||
const dialogMode = !!this._dialog.openDialogs.length;
|
||||
this.helpModeService.activateHelpMode(dialogMode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user