RED-6973: Disabled simultaneous in-place editing.

This commit is contained in:
Nicoleta Panaghiu 2023-07-12 14:38:45 +03:00
parent d6e879b563
commit 2253905a64
5 changed files with 25 additions and 4 deletions

View File

@ -22,6 +22,7 @@ import { CustomRouteReuseStrategy } from '@iqser/common-ui/lib/utils';
import { ifLoggedIn } from '@guards/if-logged-in.guard';
import { ifNotLoggedIn } from '@guards/if-not-logged-in.guard';
import { TenantSelectComponent } from '@iqser/common-ui/lib/tenants';
import { editAttributeGuard } from '@guards/edit-attribute.guard';
const dossierTemplateIdRoutes: IqserRoutes = [
{
@ -37,6 +38,7 @@ const dossierTemplateIdRoutes: IqserRoutes = [
{
path: `:${DOSSIER_ID}`,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [editAttributeGuard],
data: {
routeGuards: [DossierFilesGuard],
breadcrumbs: [BreadcrumbTypes.dossierTemplate, BreadcrumbTypes.dossier],

View File

@ -0,0 +1,7 @@
import { CanDeactivateFn } from '@angular/router';
import { inject } from '@angular/core';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { DossierOverviewScreenComponent } from '../modules/dossier-overview/screen/dossier-overview-screen.component';
export const editAttributeGuard: CanDeactivateFn<DossierOverviewScreenComponent> = () =>
!inject(FileAttributesService).isEditingFileAttribute();

View File

@ -11,6 +11,7 @@ import dayjs from 'dayjs';
import { NavigationEnd, Router } from '@angular/router';
import { filter, map, tap } from 'rxjs/operators';
import { ConfigService } from '../../config.service';
import { Debounce } from '@iqser/common-ui/lib/utils';
@Component({
selector: 'redaction-file-attribute [fileAttribute] [file] [dossier]',
@ -28,6 +29,8 @@ export class FileAttributeComponent extends BaseFormComponent implements OnDestr
readonly #shouldClose = computed(
() =>
this.fileAttributesService.isEditingFileAttribute() &&
!!this.file &&
!!this.fileAttribute &&
(this.fileAttribute.id !== this.fileAttributesService.openAttributeEdit() ||
this.file.fileId !== this.fileAttributesService.fileEdit()),
);
@ -71,6 +74,7 @@ export class FileAttributeComponent extends BaseFormComponent implements OnDestr
return this.file.fileAttributes.attributeIdToValue[this.fileAttribute.id];
}
@Debounce(50)
@HostListener('document:click')
clickOutside() {
if (this.isInEditMode && this.closedDatepicker) {
@ -85,6 +89,7 @@ export class FileAttributeComponent extends BaseFormComponent implements OnDestr
async editFileAttribute($event: MouseEvent): Promise<void> {
if (!this.file.isInitialProcessing && this.permissionsService.canEditFileAttributes(this.file, this.dossier)) {
$event.stopPropagation();
this.fileAttributesService.openAttributeEdits.mutate(value => value.push(this.fileAttribute.id));
this.#toggleEdit();
this.fileAttributesService.setFileEdit(this.file.fileId);
this.fileAttributesService.setOpenAttributeEdit(this.fileAttribute.id);
@ -116,6 +121,13 @@ export class FileAttributeComponent extends BaseFormComponent implements OnDestr
if (this.isInEditMode) {
this.form = this.#getForm();
this.#toggleEdit();
this.fileAttributesService.openAttributeEdits.mutate(value => {
for (let index = 0; index < value.length; index++) {
if (value[index] === this.fileAttribute.id) {
value.splice(index, 1);
}
}
});
}
}
@ -153,7 +165,6 @@ export class FileAttributeComponent extends BaseFormComponent implements OnDestr
}
this.isInEditMode = !this.isInEditMode;
this.fileAttributesService.isEditingFileAttribute.set(this.isInEditMode);
if (this.isInEditMode) {
this.#focusOnEditInput();

View File

@ -47,5 +47,5 @@
</iqser-page-header>
<ng-template #viewModeSelection>
<redaction-view-mode-selection></redaction-view-mode-selection>
<redaction-view-mode-selection iqserDisableStopPropagation></redaction-view-mode-selection>
</ng-template>

View File

@ -1,5 +1,5 @@
import { EntitiesService } from '@iqser/common-ui';
import { Injectable, signal } from '@angular/core';
import { computed, Injectable, signal } from '@angular/core';
import { BehaviorSubject, Observable, of } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
import { FileAttributeConfig, FileAttributes, IFileAttributeConfig, IFileAttributesConfig } from '@red/domain';
@ -12,8 +12,9 @@ export type FileAttributesConfigMap = Readonly<Record<string, IFileAttributesCon
})
export class FileAttributesService extends EntitiesService<IFileAttributeConfig, FileAttributeConfig> {
readonly fileAttributesConfig$ = new BehaviorSubject<FileAttributesConfigMap>({});
readonly isEditingFileAttribute = signal(false);
readonly isEditingFileAttribute = computed(() => this.openAttributeEdits().length > 0);
readonly openAttributeEdits = signal([]);
readonly openAttributeEdit = signal('');
readonly fileEdit = signal('');