Merge branch 'RED-8217' into 'master'

RED-8217: sync header layer button state with layer checkbox state.

See merge request redactmanager/red-ui!325
This commit is contained in:
Valentin-Gabriel Mihai 2024-02-29 10:25:03 +01:00
commit dc22920518
3 changed files with 28 additions and 16 deletions

View File

@ -699,6 +699,7 @@ export class FilePreviewScreenComponent
#subscribeToFileUpdates(): void { #subscribeToFileUpdates(): void {
this.addActiveScreenSubscription = this.loadAnnotations$().subscribe(); this.addActiveScreenSubscription = this.loadAnnotations$().subscribe();
this.addActiveScreenSubscription = this._viewerHeaderService.layersUpdated.subscribe();
this.addActiveScreenSubscription = this._dossiersService this.addActiveScreenSubscription = this._dossiersService
.getEntityDeleted$(this.dossierId) .getEntityDeleted$(this.dossierId)

View File

@ -1,5 +1,4 @@
import { inject, Injectable } from '@angular/core'; import { effect, inject, Injectable, signal } from '@angular/core';
import { UserPreferenceService } from '@users/user-preference.service';
import { HeaderElements } from '../../file-preview/utils/constants'; import { HeaderElements } from '../../file-preview/utils/constants';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
@ -13,48 +12,49 @@ export class LayersService {
readonly #enableIcon = this.#convertPath('/assets/icons/general/pdftron-action-disable-layers.svg'); readonly #enableIcon = this.#convertPath('/assets/icons/general/pdftron-action-disable-layers.svg');
readonly #disableIcon = this.#convertPath('/assets/icons/general/pdftron-action-enable-layers.svg'); readonly #disableIcon = this.#convertPath('/assets/icons/general/pdftron-action-enable-layers.svg');
private _active = false; readonly active = signal(false);
constructor( constructor(
private readonly _pdf: PdfViewer, private readonly _pdf: PdfViewer,
private readonly _documentViewer: REDDocumentViewer, private readonly _documentViewer: REDDocumentViewer,
private readonly _userPreferenceService: UserPreferenceService,
private readonly _translateService: TranslateService, private readonly _translateService: TranslateService,
) {} ) {
effect(() => {
this.active();
this.#updateButton();
});
}
get toggleLayersBtnTitle(): string { get toggleLayersBtnTitle(): string {
return this._translateService.instant(_('pdf-viewer.toggle-layers'), { return this._translateService.instant(_('pdf-viewer.toggle-layers'), {
active: this._active, active: this.active(),
}); });
} }
get toggleLayersBtnIcon(): string { get toggleLayersBtnIcon(): string {
const tooltipsDisabled = this._active; const tooltipsDisabled = this.active();
return tooltipsDisabled ? this.#enableIcon : this.#disableIcon; return tooltipsDisabled ? this.#enableIcon : this.#disableIcon;
} }
resetLayers() { resetLayers() {
this._active = false; this.active.set(false);
this.#updateButton();
} }
async toggleLayers(): Promise<void> { async toggleLayers(): Promise<void> {
const layers = await this._documentViewer.document.getLayersArray(); const layers = await this._documentViewer.document.getLayersArray();
layers.forEach(layer => { layers.forEach(layer => {
if ('Layout grid' === layer.name) { if ('Layout grid' === layer.name) {
layer.visible = !this._active; layer.visible = !this.active();
} }
}); });
this._documentViewer.document.setLayersArray(layers); this._documentViewer.document.setLayersArray(layers);
this._documentViewer.refreshAndUpdateView(); this._documentViewer.refreshAndUpdateView();
this._active = !this._active; this.active.update(value => !value);
this.#updateButton();
} }
#updateButton() { #updateButton() {
this._pdf.instance.UI.updateElement(HeaderElements.TOGGLE_LAYERS, { this._pdf.instance?.UI.updateElement(HeaderElements.TOGGLE_LAYERS, {
title: this.toggleLayersBtnTitle, title: this.toggleLayersBtnTitle,
img: this.toggleLayersBtnIcon, img: this.toggleLayersBtnIcon,
}); });

View File

@ -4,8 +4,8 @@ import { TranslateService } from '@ngx-translate/core';
import { IHeaderElement, RotationTypes } from '@red/domain'; import { IHeaderElement, RotationTypes } from '@red/domain';
import { FilesMapService } from '@services/files/files-map.service'; import { FilesMapService } from '@services/files/files-map.service';
import { Roles } from '@users/roles'; import { Roles } from '@users/roles';
import { fromEvent, merge, Observable, Subject } from 'rxjs'; import { fromEvent, merge, Observable, Subject, timer } from 'rxjs';
import { filter, map, tap } from 'rxjs/operators'; import { filter, map, switchMap, tap } from 'rxjs/operators';
import { HeaderElements, HeaderElementType } from '../../file-preview/utils/constants'; import { HeaderElements, HeaderElementType } from '../../file-preview/utils/constants';
import { ROTATION_ACTION_BUTTONS, ROTATION_BUTTONS, ViewerEvents } from '../utils/constants'; import { ROTATION_ACTION_BUTTONS, ROTATION_BUTTONS, ViewerEvents } from '../utils/constants';
import { ViewerEvent, VisibilityChangedEvent } from '../utils/types'; import { ViewerEvent, VisibilityChangedEvent } from '../utils/types';
@ -70,6 +70,17 @@ export class ViewerHeaderService {
); );
} }
get layersUpdated() {
const documentListener$ = timer(1000).pipe(switchMap(() => fromEvent(this._documentViewer.document, 'layersUpdated')));
return documentListener$.pipe(
tap(async () => {
const layers = await this._documentViewer.document.getLayersArray();
const layersVisible = layers.every(layer => layer.visible);
this._layersService.active.set(layersVisible);
}),
);
}
get #rectangle(): IHeaderElement { get #rectangle(): IHeaderElement {
return { return {
type: 'toolGroupButton', type: 'toolGroupButton',