Merge remote-tracking branch 'origin/master' into RED-6037
This commit is contained in:
commit
53451609c4
@ -48,7 +48,6 @@ export class AnnotationWrapper implements IListable, Record<string, unknown> {
|
||||
recommendationType: string;
|
||||
legalBasisValue: string;
|
||||
legalBasisChangeValue?: string;
|
||||
resizing = false;
|
||||
rectangle?: boolean;
|
||||
section?: string;
|
||||
reference: List;
|
||||
|
||||
@ -1,8 +1,7 @@
|
||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
templateUrl: './base-admin-screen.component.html',
|
||||
styleUrls: ['./base-admin-screen.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class BaseAdminScreenComponent {}
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
<ng-template #headerTemplate>
|
||||
<div class="table-header-actions">
|
||||
<iqser-input-with-action
|
||||
inputId="dossier-template-listing-search-input"
|
||||
[(value)]="searchService.searchValue"
|
||||
[placeholder]="'dossier-templates-listing.search' | translate"
|
||||
></iqser-input-with-action>
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
<div class="action-buttons" *ngIf="currentUser.isAdmin">
|
||||
<div [iqserHelpMode]="'edit_clone_delete_dossier_templates'" [overlappingElements]="['USER_MENU']">
|
||||
<iqser-circle-button
|
||||
[buttonId]="'delete-dossier-template-btn-' + dossierTemplateId"
|
||||
(action)="openDeleteDossierTemplateDialog($event)"
|
||||
[tooltip]="'dossier-templates-listing.action.delete' | translate"
|
||||
icon="iqser:trash"
|
||||
@ -8,6 +9,7 @@
|
||||
></iqser-circle-button>
|
||||
|
||||
<iqser-circle-button
|
||||
[buttonId]="'copy-dossier-template-btn-' + dossierTemplateId"
|
||||
(action)="openEditCloneDossierTemplateDialog($event, true)"
|
||||
[tooltip]="'dossier-templates-listing.action.clone' | translate"
|
||||
icon="iqser:copy"
|
||||
@ -15,6 +17,7 @@
|
||||
></iqser-circle-button>
|
||||
|
||||
<iqser-circle-button
|
||||
[buttonId]="'edit-dossier-template-btn-' + dossierTemplateId"
|
||||
(action)="openEditCloneDossierTemplateDialog($event)"
|
||||
[tooltip]="'dossier-templates-listing.action.edit' | translate"
|
||||
icon="iqser:edit"
|
||||
|
||||
@ -1,34 +1,34 @@
|
||||
<ng-container *ngIf="dossierStats$ | async as stats">
|
||||
<div>
|
||||
<mat-icon svgIcon="iqser:document"></mat-icon>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.documents' | translate: { count: stats.numberOfFiles } }}</span>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.documents' | translate : { count: stats.numberOfFiles } }}</span>
|
||||
</div>
|
||||
|
||||
<div *ngIf="stats.numberOfProcessingFiles">
|
||||
<mat-icon svgIcon="red:reanalyse"></mat-icon>
|
||||
<span>{{
|
||||
'dossier-overview.dossier-details.stats.processing-documents' | translate: { count: stats.numberOfProcessingFiles }
|
||||
'dossier-overview.dossier-details.stats.processing-documents' | translate : { count: stats.numberOfProcessingFiles }
|
||||
}}</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<mat-icon svgIcon="red:user"></mat-icon>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.people' | translate: { count: dossier.memberIds.length } }}</span>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.people' | translate : { count: dossier.memberIds.length } }}</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<mat-icon svgIcon="iqser:pages"></mat-icon>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.analysed-pages' | translate: { count: stats.numberOfPages | number } }}</span>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.analysed-pages' | translate : { count: stats.numberOfPages | number } }}</span>
|
||||
</div>
|
||||
|
||||
<div *ngIf="dossier.date | date: 'd MMM yyyy' as date">
|
||||
<div *ngIf="dossier.date | date : 'd MMM yyyy' as date">
|
||||
<mat-icon svgIcon="red:calendar"></mat-icon>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.created-on' | translate: { date: date } }}</span>
|
||||
<span [innerHTML]="'dossier-overview.dossier-details.stats.created-on' | translate : { date }"></span>
|
||||
</div>
|
||||
|
||||
<div *ngIf="dossier.dueDate | date: 'd MMM yyyy' as dueDate">
|
||||
<div *ngIf="dossier.dueDate | date : 'd MMM yyyy' as dueDate">
|
||||
<mat-icon svgIcon="red:lightning"></mat-icon>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.due-date' | translate: { date: dueDate } }}</span>
|
||||
<span [innerHTML]="'dossier-overview.dossier-details.stats.due-date' | translate : { date: dueDate }"></span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@ -44,7 +44,7 @@
|
||||
<!--TODO: Navigate to trash with filter on click?-->
|
||||
<div>
|
||||
<mat-icon svgIcon="iqser:trash"></mat-icon>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.deleted' | translate: { count: stats.numberOfSoftDeletedFiles } }}</span>
|
||||
<span>{{ 'dossier-overview.dossier-details.stats.deleted' | translate : { count: stats.numberOfSoftDeletedFiles } }}</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
@ -55,14 +55,14 @@
|
||||
[iqserHelpMode]="'edit_dossier_dossier_attributes'"
|
||||
class="all-caps-label show-attributes"
|
||||
>
|
||||
{{ 'dossier-overview.dossier-details.attributes.expand' | translate: { count: dossierAttributes.length } }}
|
||||
{{ 'dossier-overview.dossier-details.attributes.expand' | translate : { count: dossierAttributes.length } }}
|
||||
</div>
|
||||
|
||||
<div *ngIf="attributesExpanded" class="attributes" [iqserHelpMode]="'edit_dossier_dossier_attributes'">
|
||||
<div *ngIf="attributesExpanded" [iqserHelpMode]="'edit_dossier_dossier_attributes'" class="attributes">
|
||||
<div (click)="openEditDossierDialog('dossierAttributes')" *ngFor="let attr of dossierAttributes" class="link-property">
|
||||
<mat-icon svgIcon="red:attribute"></mat-icon>
|
||||
<span *ngIf="!attr.value"> {{ attr.label + ': -' }}</span>
|
||||
<span *ngIf="attr.value && attr.type === 'DATE'"> {{ attr.label + ': ' + (attr.value | date: 'd MMM yyyy') }}</span>
|
||||
<span *ngIf="attr.value && attr.type === 'DATE'"> {{ attr.label + ': ' + (attr.value | date : 'd MMM yyyy') }}</span>
|
||||
<span *ngIf="attr.value && attr.type === 'IMAGE'">
|
||||
{{ attr.label + ': ' + ('dossier-overview.dossier-details.attributes.image-uploaded' | translate) }}</span
|
||||
>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Dossier, DossierAttributeWithValue, DossierStats } from '@red/domain';
|
||||
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
|
||||
import { FilesService } from '@services/files/files.service';
|
||||
@ -10,7 +10,6 @@ import { DossiersDialogService } from '../../../shared-dossiers/services/dossier
|
||||
selector: 'redaction-dossier-details-stats',
|
||||
templateUrl: './dossier-details-stats.component.html',
|
||||
styleUrls: ['./dossier-details-stats.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class DossierDetailsStatsComponent implements OnInit {
|
||||
@Input() dossierAttributes: DossierAttributeWithValue[];
|
||||
|
||||
@ -40,8 +40,8 @@
|
||||
<iqser-circle-button
|
||||
(action)="upload.emit()"
|
||||
*ngIf="permissionsService.canUploadFiles(dossier)"
|
||||
[buttonId]="'upload-document-btn'"
|
||||
[icon]="'iqser:upload'"
|
||||
[id]="'upload-document-btn'"
|
||||
[iqserHelpMode]="'edit_dossier_in_dossier'"
|
||||
[overlappingElements]="['USER_MENU']"
|
||||
[tooltipPosition]="'below'"
|
||||
|
||||
@ -4,10 +4,9 @@
|
||||
class="annotation-actions"
|
||||
>
|
||||
<!-- Resize Mode for annotation -> only resize accept and deny actions are available-->
|
||||
<ng-container *ngIf="resizing">
|
||||
<ng-container *ngIf="resizing && annotationPermissions.canResizeAnnotation">
|
||||
<iqser-circle-button
|
||||
(action)="acceptResize($event)"
|
||||
*ngIf="annotationPermissions.canResizeAnnotation && annotations.length === 1 && annotations[0].resizing"
|
||||
[tooltipPosition]="tooltipPosition"
|
||||
[tooltip]="'annotation-actions.resize-accept.label' | translate"
|
||||
[type]="buttonType"
|
||||
@ -16,7 +15,6 @@
|
||||
|
||||
<iqser-circle-button
|
||||
(action)="cancelResize($event)"
|
||||
*ngIf="annotationPermissions.canResizeAnnotation && annotations.length === 1 && annotations[0].resizing"
|
||||
[tooltipPosition]="tooltipPosition"
|
||||
[tooltip]="'annotation-actions.resize-cancel.label' | translate"
|
||||
[type]="buttonType"
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core';
|
||||
import { Component, Input, OnChanges } from '@angular/core';
|
||||
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
import { AnnotationPermissions } from '@models/file/annotation.permissions';
|
||||
@ -22,7 +22,6 @@ export type AnnotationButtonType = keyof typeof AnnotationButtonTypes;
|
||||
selector: 'redaction-annotation-actions',
|
||||
templateUrl: './annotation-actions.component.html',
|
||||
styleUrls: ['./annotation-actions.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class AnnotationActionsComponent implements OnChanges {
|
||||
@Input() buttonType: AnnotationButtonType = AnnotationButtonTypes.dark;
|
||||
@ -32,6 +31,9 @@ export class AnnotationActionsComponent implements OnChanges {
|
||||
annotationPermissions: AnnotationPermissions;
|
||||
readonly roles = ROLES;
|
||||
|
||||
isVisible = true;
|
||||
isImage = true;
|
||||
|
||||
constructor(
|
||||
readonly viewModeService: ViewModeService,
|
||||
readonly helpModeService: HelpModeService,
|
||||
@ -53,22 +55,17 @@ export class AnnotationActionsComponent implements OnChanges {
|
||||
@Input()
|
||||
set annotations(annotations: AnnotationWrapper[]) {
|
||||
this._annotations = annotations.filter(a => a !== undefined);
|
||||
const viewerAnnotations = this.viewerAnnotations ?? [];
|
||||
this.isVisible = viewerAnnotations.reduce((acc, annotation) => annotation?.isVisible() && acc, true);
|
||||
this.isImage = this._annotations?.reduce((accumulator, annotation) => annotation.isImage && accumulator, true);
|
||||
}
|
||||
|
||||
get viewerAnnotations() {
|
||||
return this._annotationManager.get(this._annotations);
|
||||
}
|
||||
|
||||
get isVisible() {
|
||||
return this.viewerAnnotations?.reduce((accumulator, annotation) => annotation?.isVisible() && accumulator, true);
|
||||
}
|
||||
|
||||
get isImage() {
|
||||
return this.annotations?.reduce((accumulator, annotation) => annotation.isImage && accumulator, true);
|
||||
}
|
||||
|
||||
get resizing() {
|
||||
return this.annotations?.length === 1 && this.annotations?.[0].resizing;
|
||||
return this.annotations?.length === 1 && this.annotations?.[0].id === this._annotationManager.resizingAnnotationId;
|
||||
}
|
||||
|
||||
ngOnChanges(): void {
|
||||
|
||||
@ -1,11 +1,10 @@
|
||||
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { File } from '@red/domain';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-readonly-banner',
|
||||
templateUrl: './readonly-banner.component.html',
|
||||
styleUrls: ['./readonly-banner.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class ReadonlyBannerComponent {
|
||||
@Input() file: File;
|
||||
|
||||
@ -34,8 +34,8 @@
|
||||
<iqser-circle-button
|
||||
(action)="editingReviewer$.next(true)"
|
||||
*ngIf="(canAssignOrUnassign$ | async) && !!file.assignee"
|
||||
[buttonId]="'change-assignee'"
|
||||
[icon]="'iqser:edit'"
|
||||
[id]="'change-assignee'"
|
||||
[iqserHelpMode]="'document_features_in_editor'"
|
||||
[overlappingElements]="['USER_MENU']"
|
||||
[tooltipPosition]="'below'"
|
||||
@ -43,12 +43,12 @@
|
||||
></iqser-circle-button>
|
||||
|
||||
<iqser-circle-button
|
||||
id="assign-me"
|
||||
(action)="fileAssignService.assignToMe([file])"
|
||||
*ngIf="canAssignToSelf$ | async"
|
||||
[icon]="'red:assign-me'"
|
||||
[tooltipPosition]="'below'"
|
||||
[tooltip]="'file-preview.assign-me' | translate"
|
||||
buttonId="assign-me"
|
||||
></iqser-circle-button>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { ViewMode, ViewModes } from '@red/domain';
|
||||
import { ViewModeService } from '../../services/view-mode.service';
|
||||
import { FilePreviewStateService } from '../../services/file-preview-state.service';
|
||||
@ -15,7 +15,6 @@ import { ROLES } from '@users/roles';
|
||||
selector: 'redaction-view-switch',
|
||||
templateUrl: './view-switch.component.html',
|
||||
styleUrls: ['./view-switch.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class ViewSwitchComponent {
|
||||
readonly viewModes = ViewModes;
|
||||
@ -54,40 +53,45 @@ export class ViewSwitchComponent {
|
||||
|
||||
async #switchToRedactedView() {
|
||||
const unapprovedSuggestionsWarning = this._userPreferenceService.getUnapprovedSuggestionsWarning();
|
||||
if (!unapprovedSuggestionsWarning) {
|
||||
const suggestions = (await this._fileDataService.annotations).filter(a => a.isSuggestion);
|
||||
if (suggestions.length) {
|
||||
const displaySuggestionsInPreview = this._userPreferenceService.getDisplaySuggestionsInPreview();
|
||||
const question = displaySuggestionsInPreview
|
||||
? _('unapproved-suggestions.confirmation-dialog.displayed-question')
|
||||
: _('unapproved-suggestions.confirmation-dialog.not-displayed-question');
|
||||
const data = new ConfirmationDialogInput({
|
||||
title: _('unapproved-suggestions.confirmation-dialog.title'),
|
||||
question: question,
|
||||
confirmationText: _('unapproved-suggestions.confirmation-dialog.confirmation-text'),
|
||||
denyText: _('unapproved-suggestions.confirmation-dialog.deny-text'),
|
||||
checkboxes: [
|
||||
{
|
||||
label: _('unapproved-suggestions.confirmation-dialog.checkbox-text'),
|
||||
value: false,
|
||||
},
|
||||
],
|
||||
checkboxesValidation: false,
|
||||
});
|
||||
if (unapprovedSuggestionsWarning) {
|
||||
return this.viewModeService.switchToRedacted();
|
||||
}
|
||||
|
||||
return this._dialogService.openDialog('confirm', null, data, result => {
|
||||
if (result) {
|
||||
if (result === ConfirmOptions.SECOND_CONFIRM) {
|
||||
this._userPreferenceService.toggleUnapprovedSuggestionsWarning();
|
||||
this._toaster.success(_('unapproved-suggestions.confirmation-dialog.success-confirmation-text'), {
|
||||
params: { settingsUrl: `${this._baseHref}/main/account/warnings-preferences` },
|
||||
});
|
||||
}
|
||||
this.viewModeService.switchToRedacted();
|
||||
}
|
||||
const suggestions = (await this._fileDataService.annotations).filter(a => a.isSuggestion);
|
||||
if (!suggestions.length) {
|
||||
return this.viewModeService.switchToRedacted();
|
||||
}
|
||||
|
||||
const displaySuggestionsInPreview = this._userPreferenceService.getDisplaySuggestionsInPreview();
|
||||
const question = displaySuggestionsInPreview
|
||||
? _('unapproved-suggestions.confirmation-dialog.displayed-question')
|
||||
: _('unapproved-suggestions.confirmation-dialog.not-displayed-question');
|
||||
const data = new ConfirmationDialogInput({
|
||||
title: _('unapproved-suggestions.confirmation-dialog.title'),
|
||||
question: question,
|
||||
confirmationText: _('unapproved-suggestions.confirmation-dialog.confirmation-text'),
|
||||
denyText: _('unapproved-suggestions.confirmation-dialog.deny-text'),
|
||||
checkboxes: [
|
||||
{
|
||||
label: _('unapproved-suggestions.confirmation-dialog.checkbox-text'),
|
||||
value: false,
|
||||
},
|
||||
],
|
||||
checkboxesValidation: false,
|
||||
});
|
||||
|
||||
return this._dialogService.openDialog('confirm', null, data, result => {
|
||||
if (!result) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (result === ConfirmOptions.SECOND_CONFIRM) {
|
||||
this._userPreferenceService.toggleUnapprovedSuggestionsWarning();
|
||||
this._toaster.success(_('unapproved-suggestions.confirmation-dialog.success-confirmation-text'), {
|
||||
params: { settingsUrl: `${this._baseHref}/main/account/warnings-preferences` },
|
||||
});
|
||||
}
|
||||
}
|
||||
return this.viewModeService.switchToRedacted();
|
||||
this.viewModeService.switchToRedacted();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ import {
|
||||
AcceptRecommendationDialogComponent,
|
||||
AcceptRecommendationReturnType,
|
||||
} from '../dialogs/accept-recommendation-dialog/accept-recommendation-dialog.component';
|
||||
import { defaultDialogConfig, List } from '@iqser/common-ui';
|
||||
import { defaultDialogConfig, isJustOne, List } from '@iqser/common-ui';
|
||||
import { filter } from 'rxjs/operators';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { FilePreviewStateService } from './file-preview-state.service';
|
||||
@ -175,8 +175,12 @@ export class AnnotationActionsService {
|
||||
AcceptRecommendationDialogComponent,
|
||||
{ ...defaultDialogConfig, autoFocus: true, data: { annotations: recommendations, dossierId } },
|
||||
);
|
||||
// TODO: remove observables
|
||||
const dialogClosed = dialogRef.afterClosed().pipe(filter(value => !!value && !!value.annotations));
|
||||
dialogClosed.subscribe(({ annotations, comment: commentText }) => {
|
||||
if (isJustOne(annotations) && this._annotationManager.resizingAnnotationId === annotations[0].id) {
|
||||
this.cancelResize(null, annotations[0]).then();
|
||||
}
|
||||
const comment = commentText ? { text: commentText } : undefined;
|
||||
this.#processObsAndEmit(this._manualRedactionService.addRecommendation(annotations, dossierId, fileId, comment));
|
||||
});
|
||||
@ -185,7 +189,7 @@ export class AnnotationActionsService {
|
||||
async resize($event: MouseEvent, annotationWrapper: AnnotationWrapper) {
|
||||
$event?.stopPropagation();
|
||||
|
||||
annotationWrapper.resizing = true;
|
||||
this._annotationManager.resizingAnnotationId = annotationWrapper.id;
|
||||
|
||||
const viewerAnnotation = this._annotationManager.get(annotationWrapper);
|
||||
if (annotationWrapper.rectangle || annotationWrapper.imported || annotationWrapper.isImage) {
|
||||
@ -226,6 +230,8 @@ export class AnnotationActionsService {
|
||||
updateDictionary: result.updateDictionary,
|
||||
};
|
||||
|
||||
this.cancelResize(null, annotation).then();
|
||||
|
||||
const { fileId, dossierId } = this._state;
|
||||
const request = this._manualRedactionService.resizeOrSuggestResize([resizeRequest], dossierId, fileId);
|
||||
this.#processObsAndEmit(request);
|
||||
@ -235,7 +241,7 @@ export class AnnotationActionsService {
|
||||
async cancelResize($event: MouseEvent, annotationWrapper: AnnotationWrapper) {
|
||||
$event?.stopPropagation();
|
||||
|
||||
annotationWrapper.resizing = false;
|
||||
this._annotationManager.resizingAnnotationId = undefined;
|
||||
|
||||
this._annotationManager.delete(annotationWrapper);
|
||||
await this._annotationDrawService.draw([annotationWrapper], this._skippedService.hideSkipped, this._state.dossierTemplateId);
|
||||
|
||||
@ -9,6 +9,7 @@ import { BASE_HREF_FN, IqserPermissionsService } from '@iqser/common-ui';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { IHeaderElement } from '@red/domain';
|
||||
import { ROLES } from '@users/roles';
|
||||
import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service';
|
||||
|
||||
@Injectable()
|
||||
export class PdfAnnotationActionsService {
|
||||
@ -19,6 +20,7 @@ export class PdfAnnotationActionsService {
|
||||
readonly #convertPath = inject(BASE_HREF_FN);
|
||||
readonly #annotationActionsService = inject(AnnotationActionsService);
|
||||
readonly #iqserPermissionsService = inject(IqserPermissionsService);
|
||||
readonly #annotationManager = inject(REDAnnotationManager);
|
||||
|
||||
get(annotations: AnnotationWrapper[]): IHeaderElement[] {
|
||||
const availableActions: IHeaderElement[] = [];
|
||||
@ -28,7 +30,7 @@ export class PdfAnnotationActionsService {
|
||||
if (permissions.canResize) {
|
||||
const firstAnnotation = annotations[0];
|
||||
// if we already entered resize-mode previously
|
||||
if (firstAnnotation.resizing) {
|
||||
if (firstAnnotation.id === this.#annotationManager.resizingAnnotationId) {
|
||||
const acceptResizeButton = this.#getButton('check', _('annotation-actions.resize-accept.label'), () =>
|
||||
this.#annotationActionsService.acceptResize(null, firstAnnotation),
|
||||
);
|
||||
|
||||
@ -9,7 +9,7 @@ import {
|
||||
} from '@models/file/manual-redaction-entry.wrapper';
|
||||
import { AnnotationDrawService } from '../../pdf-viewer/services/annotation-draw.service';
|
||||
import { UserPreferenceService } from '@users/user-preference.service';
|
||||
import { BASE_HREF_FN, BaseHrefFn, IqserPermissionsService, shareDistinctLast } from '@iqser/common-ui';
|
||||
import { BASE_HREF_FN, BaseHrefFn, IqserPermissionsService, isJustOne, shareDistinctLast } from '@iqser/common-ui';
|
||||
import { toPosition } from '../utils/pdf-calculation.utils';
|
||||
import { MultiSelectService } from './multi-select.service';
|
||||
import { FilePreviewStateService } from './file-preview-state.service';
|
||||
@ -161,19 +161,24 @@ export class PdfProxyService {
|
||||
}
|
||||
|
||||
#cancelResizeIfIsResizing(annotations: Annotation[]) {
|
||||
if (annotations.length !== 1) {
|
||||
if (!isJustOne(annotations)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const annotation = annotations[0];
|
||||
const wrapper = this._fileDataService.find(annotation.Id);
|
||||
if (!wrapper?.resizing) {
|
||||
const isResizing = this._annotationManager.resizingAnnotationId === annotation.Id;
|
||||
|
||||
if (!isResizing) {
|
||||
return;
|
||||
}
|
||||
|
||||
// When resizing a rectangle, the original annotation is removed and triggers a deselect event and a new one is created
|
||||
// So we want to skip the first deselect event.
|
||||
if ((wrapper.isImage || wrapper.rectangle) && annotation.ToolName !== AnnotationToolNames.AnnotationCreateRectangle) {
|
||||
const wrapper = this._fileDataService.find(annotation.Id);
|
||||
if (
|
||||
(wrapper.rectangle || wrapper.isImage || wrapper.imported) &&
|
||||
annotation.ToolName !== AnnotationToolNames.AnnotationCreateRectangle
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@ import Annotation = Core.Annotations.Annotation;
|
||||
export class REDAnnotationManager {
|
||||
annotationSelected$: Observable<[Annotation[], string]>;
|
||||
readonly hidden = new Set<string>();
|
||||
resizingAnnotationId?: string = undefined;
|
||||
|
||||
#manager: AnnotationManager;
|
||||
|
||||
|
||||
@ -58,13 +58,13 @@
|
||||
[disabled]="disabled || !valid || !changed"
|
||||
[label]="'edit-dossier-dialog.actions.save' | translate"
|
||||
[type]="iconButtonTypes.primary"
|
||||
id="editDossierSaveButton"
|
||||
buttonId="editDossierSaveButton"
|
||||
></iqser-icon-button>
|
||||
|
||||
<iqser-icon-button
|
||||
(action)="save({ closeAfterSave: true })"
|
||||
[buttonId]="'saveAndClose'"
|
||||
[disabled]="disabled || !valid || !changed"
|
||||
[id]="'saveAndClose'"
|
||||
[label]="'edit-dossier-dialog.actions.save-and-close' | translate"
|
||||
[type]="iconButtonTypes.dark"
|
||||
></iqser-icon-button>
|
||||
@ -76,5 +76,5 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<iqser-circle-button (action)="close()" class="dialog-close" icon="iqser:close" id="editDossierCloseButton"></iqser-circle-button>
|
||||
<iqser-circle-button (action)="close()" buttonId="editDossierCloseButton" class="dialog-close" icon="iqser:close"></iqser-circle-button>
|
||||
</section>
|
||||
|
||||
@ -79,9 +79,9 @@
|
||||
<iqser-icon-button
|
||||
(action)="deleteDossier()"
|
||||
*ngIf="permissionsService.canSoftDeleteDossier(dossier)"
|
||||
[buttonId]="'deleteDossier'"
|
||||
[dialogElement]="true"
|
||||
[icon]="'iqser:trash'"
|
||||
[id]="'deleteDossier'"
|
||||
[iqserHelpMode]="'edit_dossier_delete_dossier'"
|
||||
[label]="'dossier-listing.delete.action' | translate"
|
||||
[type]="iconButtonTypes.dark"
|
||||
|
||||
@ -1,12 +1,16 @@
|
||||
import { NativeDateAdapter } from '@angular/material/core';
|
||||
import dayjs from 'dayjs';
|
||||
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
dayjs.extend(customParseFormat);
|
||||
|
||||
@Injectable()
|
||||
export class CustomDateAdapter extends NativeDateAdapter {
|
||||
parse(value: any, parseFormat: string): Date | null {
|
||||
return dayjs(value, parseFormat).toDate();
|
||||
}
|
||||
|
||||
format(date: Date, displayFormat: string): string {
|
||||
return dayjs(date).format(displayFormat);
|
||||
}
|
||||
|
||||
@ -14,9 +14,9 @@
|
||||
(action)="save.emit(value)"
|
||||
[disabled]="value === oldUser"
|
||||
[tooltip]="'assign-user.save' | translate"
|
||||
buttonId="save-assignee"
|
||||
class="pl-1"
|
||||
icon="iqser:check"
|
||||
id="save-assignee"
|
||||
tooltipPosition="below"
|
||||
></iqser-circle-button>
|
||||
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
<iqser-circle-button
|
||||
(action)="btn.action($event)"
|
||||
*ngIf="btn.type === 'circleBtn'"
|
||||
[id]="btn.id"
|
||||
[attr.aria-expanded]="btn.ariaExpanded && btn.ariaExpanded | async"
|
||||
[buttonId]="btn.id"
|
||||
[disabled]="btn.disabled"
|
||||
[icon]="btn.icon"
|
||||
[showDot]="btn.showDot"
|
||||
@ -16,12 +16,12 @@
|
||||
<!-- download redacted file-->
|
||||
<redaction-file-download-btn
|
||||
*ngIf="btn.type === 'downloadBtn'"
|
||||
[disabled]="btn.disabled"
|
||||
[dossier]="btn.dossier"
|
||||
[files]="btn.files"
|
||||
[tooltipClass]="btn.tooltipClass"
|
||||
[tooltipPosition]="tooltipPosition"
|
||||
[type]="buttonType"
|
||||
[disabled]="btn.disabled"
|
||||
></redaction-file-download-btn>
|
||||
|
||||
<!-- exclude from redaction -->
|
||||
|
||||
@ -101,13 +101,13 @@
|
||||
[disabled]="disabled"
|
||||
[label]="'add-dossier-dialog.actions.save' | translate"
|
||||
[type]="iconButtonTypes.primary"
|
||||
id="createDossierSaveButton"
|
||||
buttonId="createDossierSaveButton"
|
||||
></iqser-icon-button>
|
||||
|
||||
<iqser-icon-button
|
||||
(action)="save({ addMembers: true })"
|
||||
[buttonId]="'createDossierEditTeamButton'"
|
||||
[disabled]="disabled"
|
||||
[id]="'createDossierEditTeamButton'"
|
||||
[label]="'add-dossier-dialog.actions.save-and-add-members' | translate"
|
||||
[type]="iconButtonTypes.dark"
|
||||
icon="red:assign"
|
||||
|
||||
@ -1,13 +1,16 @@
|
||||
<section class="red-upload-download-overlay">
|
||||
<div (click)="collapsed = !collapsed" [class.expanded]="!collapsed" class="red-upload-download-header">
|
||||
<div class="title flex-2">
|
||||
{{ 'upload-status.dialog.title' | translate: { len: uploadService.files.length } }}
|
||||
{{ 'upload-status.dialog.title' | translate : { len: uploadService.files.length } }}
|
||||
</div>
|
||||
<span><mat-icon *ngIf="uploadError" [svgIcon]="'red:alert-circle'"></mat-icon></span>
|
||||
|
||||
<iqser-circle-button [icon]="'iqser:status-' + (collapsed ? 'expand' : 'collapse')" id="expand-upload-status"></iqser-circle-button>
|
||||
<iqser-circle-button
|
||||
[icon]="'iqser:status-' + (collapsed ? 'expand' : 'collapse')"
|
||||
buttonId="expand-upload-status"
|
||||
></iqser-circle-button>
|
||||
|
||||
<iqser-circle-button (action)="closeDialog()" icon="iqser:close" id="close-upload-status"></iqser-circle-button>
|
||||
<iqser-circle-button (action)="closeDialog()" buttonId="close-upload-status" icon="iqser:close"></iqser-circle-button>
|
||||
</div>
|
||||
|
||||
<div [hidden]="collapsed" class="upload-download-list">
|
||||
@ -31,9 +34,7 @@
|
||||
<div *ngIf="!model.error" class="progress">{{ model.progress }}%</div>
|
||||
</div>
|
||||
|
||||
<div *ngIf="model.error" class="error-message">
|
||||
{{ model.error?.message }}
|
||||
</div>
|
||||
<div *ngIf="model.error" [innerHTML]="model.error?.message" class="error-message"></div>
|
||||
</div>
|
||||
|
||||
<div *ngIf="!model.error" class="upload-download-progress">
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "redaction",
|
||||
"version": "3.924.0",
|
||||
"version": "3.927.0",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user