WIP on refactoring help mode logic
This commit is contained in:
parent
0bab458476
commit
24fbe8de35
@ -1,17 +1,11 @@
|
|||||||
.help-mode-on-mouse-over {
|
.help-mode {
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: -5px;
|
|
||||||
left: -5px;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
padding-right: 5px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
transition: all 0.25s;
|
transition: all 0.25s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.help-highlight,
|
.help-highlight,
|
||||||
.help-mode-on-mouse-over:hover {
|
.help-mode:hover {
|
||||||
background: rgba(92, 229, 148, 0.5);
|
background: rgba(92, 229, 148, 0.5);
|
||||||
box-shadow: 0 0 0 2px var(--iqser-helpmode-primary) inset;
|
box-shadow: 0 0 0 2px var(--iqser-helpmode-primary) inset;
|
||||||
cursor: help;
|
cursor: help;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2 } from '@angular/core';
|
import { Directive, ElementRef, Input, OnInit, Renderer2 } from '@angular/core';
|
||||||
import { HelpModeService } from './help-mode.service';
|
import { HelpModeService } from './help-mode.service';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
@ -24,28 +24,18 @@ export class HelpModeDirective implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _createHelperElement() {
|
private _createHelperElement() {
|
||||||
const elementNameWithId = `${this.elementName}-${this._getRandomId()}`;
|
|
||||||
const element = this._elementRef.nativeElement as HTMLElement;
|
const element = this._elementRef.nativeElement as HTMLElement;
|
||||||
|
const helperElementName = `${this.elementName}-${this._generateId()}`;
|
||||||
|
|
||||||
if (!this._isDisabledElement()) {
|
const helperElement = this._renderer.createElement('a') as HTMLElement;
|
||||||
const helperElement = this._renderer.createElement('div') as HTMLElement;
|
this._renderer.setAttribute(helperElement, 'href', this._helpModeService.getDocsLink(this.elementName));
|
||||||
this._renderer.addClass(helperElement, 'help-mode-on-mouse-over');
|
this._renderer.setAttribute(helperElement, 'target', '_blank');
|
||||||
this._renderer.addClass(helperElement, `help-mode-on-mouse-over-${this.elementName}`);
|
this._renderer.addClass(helperElement, 'help-mode');
|
||||||
|
this._helpModeService.addElement(helperElementName, element, helperElement);
|
||||||
this._helpModeService.addElement(elementNameWithId, element, helperElement);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private _isDisabledElement() {
|
private _generateId(): string {
|
||||||
return this._path === 'dossiers' && this.elementName === 'filter-for-status';
|
return Math.random().toString(36).substring(2, 9);
|
||||||
}
|
|
||||||
|
|
||||||
private _getRandomId(): string {
|
|
||||||
return Math.random().toString(36).substr(2, 9);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@HostListener('click') onClick(): void {
|
|
||||||
this._helpModeService.openDocsFor(this.elementName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,7 @@ export class HelpModeService {
|
|||||||
private readonly _helpModeDialogIsOpened$ = new BehaviorSubject(false);
|
private readonly _helpModeDialogIsOpened$ = new BehaviorSubject(false);
|
||||||
readonly helpModeDialogIsOpened$ = this._helpModeDialogIsOpened$.asObservable();
|
readonly helpModeDialogIsOpened$ = this._helpModeDialogIsOpened$.asObservable();
|
||||||
|
|
||||||
private readonly _elements: Record<string, Helper> = {};
|
private readonly _helperElements: Record<string, Helper> = {};
|
||||||
private readonly _renderer: Renderer2;
|
private readonly _renderer: Renderer2;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@ -53,29 +53,29 @@ export class HelpModeService {
|
|||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
openDocsFor(elementName: string): void {
|
getDocsLink(elementName: string): string {
|
||||||
if (this.isHelpModeActive) {
|
return `${this._manualBaseURL}${this._docs[elementName][this._translateService.currentLang]}`;
|
||||||
window.open(`${this._manualBaseURL}${this._docs[elementName][this._translateService.currentLang]}`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
activateHelpMode(): void {
|
activateHelpMode(): void {
|
||||||
this._isHelpModeActive$.next(true);
|
if (!this.isHelpModeActive) {
|
||||||
this.openHelpModeDialog();
|
this._isHelpModeActive$.next(true);
|
||||||
this._enableHelperElements();
|
this.openHelpModeDialog();
|
||||||
|
setTimeout(() => {
|
||||||
|
this._enableHelperElements();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deactivateHelpMode(): void {
|
deactivateHelpMode(): void {
|
||||||
this._isHelpModeActive$.next(false);
|
if (this.isHelpModeActive) {
|
||||||
this._disableHelperElements();
|
this._isHelpModeActive$.next(false);
|
||||||
|
this._disableHelperElements();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
highlightHelperElements(): void {
|
highlightHelperElements(): void {
|
||||||
if (!this.isHelpModeActive) {
|
Object.values(this._helperElements).forEach(({ helperElement }) => {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.values(this._elements).forEach(({ helperElement }) => {
|
|
||||||
this._renderer.addClass(helperElement, 'help-highlight');
|
this._renderer.addClass(helperElement, 'help-highlight');
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this._renderer.removeClass(helperElement, 'help-highlight');
|
this._renderer.removeClass(helperElement, 'help-highlight');
|
||||||
@ -83,21 +83,46 @@ export class HelpModeService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
addElement(elementName: string, element: HTMLElement, helperElement: HTMLElement): void {
|
addElement(helperElementName: string, element: HTMLElement, helperElement: HTMLElement): void {
|
||||||
this._elements[elementName] = { element, helperElement };
|
this._helperElements[helperElementName] = { element, helperElement };
|
||||||
|
}
|
||||||
|
|
||||||
|
updateHelperElements() {
|
||||||
|
Object.values(this._helperElements).forEach(({element, helperElement }) => {
|
||||||
|
this._updateHelperElement(element, helperElement);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private _updateHelperElement(element: HTMLElement, helperElement: HTMLElement) {
|
||||||
|
const dimensions = this._getElementDimensions(element);
|
||||||
|
helperElement.style.cssText = `
|
||||||
|
top:${dimensions.y}px;
|
||||||
|
left:${dimensions.x}px;
|
||||||
|
width:${dimensions.width}px;
|
||||||
|
height:${dimensions.height}px;
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _enableHelperElements() {
|
private _enableHelperElements() {
|
||||||
Object.values(this._elements).forEach(({ element, helperElement }) => {
|
Object.values(this._helperElements).forEach(({ element, helperElement }) => {
|
||||||
this._renderer.setStyle(element, 'position', 'relative');
|
document.body.appendChild(helperElement)
|
||||||
this._renderer.appendChild(element, helperElement);
|
this._updateHelperElement(element, helperElement);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _disableHelperElements() {
|
private _disableHelperElements() {
|
||||||
Object.values(this._elements).forEach(({ element, helperElement }) => {
|
Object.values(this._helperElements).forEach(({ helperElement }) => {
|
||||||
this._renderer.removeStyle(element, 'position');
|
document.body.removeChild(helperElement)
|
||||||
this._renderer.removeChild(element, helperElement);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _getElementDimensions(element: HTMLElement) {
|
||||||
|
const rect = element.getBoundingClientRect();
|
||||||
|
return {
|
||||||
|
y: rect.top + window.pageYOffset,
|
||||||
|
x: rect.left + window.pageXOffset,
|
||||||
|
height: rect.height,
|
||||||
|
width: rect.width,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,14 @@ export class HelpModeComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@HostListener('click') onClick(): void {
|
@HostListener('click') onClick(): void {
|
||||||
this.helpModeService.highlightHelperElements();
|
if (this.helpModeService.isHelpModeActive) {
|
||||||
|
this.helpModeService.highlightHelperElements();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@HostListener('window:resize') onResize(event: any) {
|
||||||
|
if (this.helpModeService.isHelpModeActive) {
|
||||||
|
this.helpModeService.updateHelperElements();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<div class="page-header">
|
<div class="page-header">
|
||||||
<div *ngIf="pageLabel" class="breadcrumb">{{ pageLabel }}</div>
|
<div *ngIf="pageLabel" class="breadcrumb">{{ pageLabel }}</div>
|
||||||
|
|
||||||
<div *ngIf="filters$ | async as filters" [iqserHelpMode]="helpModeKey" class="filters">
|
<div *ngIf="filters$ | async as filters" class="filters">
|
||||||
<div *ngIf="filters.length && searchPosition !== searchPositions.beforeFilters" translate="filters.filter-by"></div>
|
<div *ngIf="filters.length && searchPosition !== searchPositions.beforeFilters" translate="filters.filter-by"></div>
|
||||||
|
|
||||||
<ng-container *ngIf="searchPosition === searchPositions.beforeFilters" [ngTemplateOutlet]="searchBar"></ng-container>
|
<ng-container *ngIf="searchPosition === searchPositions.beforeFilters" [ngTemplateOutlet]="searchBar"></ng-container>
|
||||||
@ -16,7 +16,6 @@
|
|||||||
(click)="resetFilters()"
|
(click)="resetFilters()"
|
||||||
*ngIf="showResetFilters$ | async"
|
*ngIf="showResetFilters$ | async"
|
||||||
class="reset-filters"
|
class="reset-filters"
|
||||||
iqserHelpMode="reset-filters"
|
|
||||||
translate="reset-filters"
|
translate="reset-filters"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
@ -30,7 +29,6 @@
|
|||||||
*ngIf="!config.hide"
|
*ngIf="!config.hide"
|
||||||
[icon]="config.icon"
|
[icon]="config.icon"
|
||||||
[id]="config.label.replace('.', '-')"
|
[id]="config.label.replace('.', '-')"
|
||||||
[iqserHelpMode]="config.helpModeKey"
|
|
||||||
[label]="config.label | translate"
|
[label]="config.label | translate"
|
||||||
[type]="config.type"
|
[type]="config.type"
|
||||||
></iqser-icon-button>
|
></iqser-icon-button>
|
||||||
@ -43,7 +41,6 @@
|
|||||||
*ngIf="!config.hide"
|
*ngIf="!config.hide"
|
||||||
[disabled]="config.disabled$ && (config.disabled$ | async)"
|
[disabled]="config.disabled$ && (config.disabled$ | async)"
|
||||||
[icon]="config.icon"
|
[icon]="config.icon"
|
||||||
[iqserHelpMode]="config.helpModeKey"
|
|
||||||
[tooltip]="config.label"
|
[tooltip]="config.label"
|
||||||
tooltipPosition="below"
|
tooltipPosition="below"
|
||||||
></iqser-circle-button>
|
></iqser-circle-button>
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
<ng-container [ngTemplateOutlet]="bulkActions"></ng-container>
|
<ng-container [ngTemplateOutlet]="bulkActions"></ng-container>
|
||||||
|
|
||||||
<iqser-quick-filters *ngIf="quickFilters$ | async" iqserHelpMode="dossiers-quickfilter-my-dossiers"></iqser-quick-filters>
|
<iqser-quick-filters *ngIf="quickFilters$ | async"></iqser-quick-filters>
|
||||||
|
|
||||||
<!-- Custom content-->
|
<!-- Custom content-->
|
||||||
<ng-content></ng-content>
|
<ng-content></ng-content>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user