Compare commits

...

6 Commits

Author SHA1 Message Date
Dominique Eifländer
f182be3db0 Merge branch 'RED10758' into 'master'
RED-10758: Fix remove and recategorize request in applicationType DocuMine

See merge request redactmanager/red-ui!767
2025-01-29 09:30:57 +01:00
Rosario Allegro
81a32f6d58 RED-10758: Fix remove and recategorize request in applicationType DocuMine 2025-01-28 15:34:17 +01:00
Dan Percic
82552b1748 Merge branch 'VM/RED-9580' into 'master'
RED-9580 - added getOne method for stats service to call new users stats...

Closes RED-9580

See merge request redactmanager/red-ui!765
2024-12-13 11:29:39 +01:00
Valentin Mihai
af7a45d739 RED-9580 - added getOne method for stats service to call new users stats endpoint and updated data from "delete user dialog" with new backend data 2024-12-13 12:03:17 +02:00
Valentin Mihai
0f16644944 Merge branch 'master' into VM/RED-9580 2024-12-11 19:24:25 +02:00
Valentin Mihai
bfe409305c RED-9580 - use new user stats endpoint for everything related to User Management 2024-12-04 15:47:30 +02:00
11 changed files with 54 additions and 7 deletions

View File

@ -22,6 +22,8 @@ import { ConfigureCertificateDialogComponent } from '../dialogs/configure-digita
import { EditColorDialogComponent } from '../dialogs/edit-color-dialog/edit-color-dialog.component'; import { EditColorDialogComponent } from '../dialogs/edit-color-dialog/edit-color-dialog.component';
import { SmtpAuthDialogComponent } from '../dialogs/smtp-auth-dialog/smtp-auth-dialog.component'; import { SmtpAuthDialogComponent } from '../dialogs/smtp-auth-dialog/smtp-auth-dialog.component';
import { UploadDictionaryDialogComponent } from '../dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component'; import { UploadDictionaryDialogComponent } from '../dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component';
import { UserStatsService } from './user-stats.service';
import { result } from 'lodash-es';
type DialogType = type DialogType =
| 'confirm' | 'confirm'
@ -73,19 +75,26 @@ export class AdminDialogService extends DialogService<DialogType> {
private readonly _activeDossiersService: ActiveDossiersService, private readonly _activeDossiersService: ActiveDossiersService,
private readonly _loadingService: LoadingService, private readonly _loadingService: LoadingService,
private readonly _userService: UserService, private readonly _userService: UserService,
private readonly _userStatsService: UserStatsService,
private readonly _reportTemplateService: ReportTemplateService, private readonly _reportTemplateService: ReportTemplateService,
) { ) {
super(_dialog); super(_dialog);
} }
deleteUsers(userIds: string[], cb?: () => Promise<void> | void): void { async deleteUsers(userIds: string[], cb?: () => Promise<void> | void): Promise<void> {
const userStats = await firstValueFrom(this._userStatsService.getOne(userIds[0]));
const data: IConfirmationDialogData = { const data: IConfirmationDialogData = {
title: _('confirm-delete-users.title'), title: _('confirm-delete-users.title'),
question: _('confirm-delete-users.warning'), question: _('confirm-delete-users.warning'),
confirmationText: _('confirm-delete-users.delete'), confirmationText: _('confirm-delete-users.delete'),
denyText: _('confirm-delete-users.cancel'), denyText: _('confirm-delete-users.cancel'),
titleColor: TitleColors.WARN, titleColor: TitleColors.WARN,
translateParams: { usersCount: 1, dossiersCount: this._getUsersDossiersCount(userIds) }, translateParams: {
usersCount: 1,
dossiersCount: userStats.numberOfDossierOwnerships,
documentsCount: userStats.numberOfAssignedFiles,
},
checkboxes: [ checkboxes: [
{ value: false, label: _('confirm-delete-users.impacted-dossiers') }, { value: false, label: _('confirm-delete-users.impacted-dossiers') },
{ value: false, label: _('confirm-delete-users.impacted-documents') }, { value: false, label: _('confirm-delete-users.impacted-documents') },

View File

@ -0,0 +1,10 @@
import { StatsService } from '@iqser/common-ui';
import { IUserStats, USER_ID, UserStats } from '@red/domain';
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class UserStatsService extends StatsService<UserStats, IUserStats> {
protected readonly _primaryKey = USER_ID;
protected readonly _entityClass = UserStats;
protected readonly _defaultModelPath = 'user-stats';
}

View File

@ -137,7 +137,11 @@ export class AnnotationActionsService {
let recategorizeBody: List<IRecategorizationRequest> | IBulkRecategorizationRequest; let recategorizeBody: List<IRecategorizationRequest> | IBulkRecategorizationRequest;
if (result.option === RedactOrHintOptions.ONLY_HERE || result.option === RectangleRedactOptions.ONLY_THIS_PAGE) { if (
result.option === RedactOrHintOptions.ONLY_HERE ||
result.option === RectangleRedactOptions.ONLY_THIS_PAGE ||
this.#isDocumine
) {
recategorizeBody = annotations.map(annotation => { recategorizeBody = annotations.map(annotation => {
const body: IRecategorizationRequest = { const body: IRecategorizationRequest = {
annotationId: annotation.id, annotationId: annotation.id,
@ -167,6 +171,7 @@ export class AnnotationActionsService {
}; };
} }
result.pageNumbers = result.pageNumbers || [];
await this.#processObsAndEmit( await this.#processObsAndEmit(
this._manualRedactionService.recategorizeRedactions( this._manualRedactionService.recategorizeRedactions(
recategorizeBody, recategorizeBody,
@ -606,6 +611,7 @@ export class AnnotationActionsService {
redactions: AnnotationWrapper[], redactions: AnnotationWrapper[],
dialogResult: RemoveRedactionResult, dialogResult: RemoveRedactionResult,
): List<IRemoveRedactionRequest | IBulkLocalRemoveRequest> { ): List<IRemoveRedactionRequest | IBulkLocalRemoveRequest> {
dialogResult.pageNumbers = dialogResult.pageNumbers || [];
if (dialogResult.bulkLocal || !!dialogResult.pageNumbers.length) { if (dialogResult.bulkLocal || !!dialogResult.pageNumbers.length) {
return dialogResult.positions.map((position, index) => ({ return dialogResult.positions.map((position, index) => ({
value: redactions[index].value, value: redactions[index].value,

View File

@ -1,6 +1,6 @@
import { inject, Injectable } from '@angular/core'; import { inject, Injectable } from '@angular/core';
import { StatsService } from '@iqser/common-ui'; import { StatsService } from '@iqser/common-ui';
import { DashboardStats, DOSSIER_ID, DossierStats, IDossierStats } from '@red/domain'; import { DOSSIER_ID, DossierStats, IDossierStats } from '@red/domain';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { UserService } from '@users/user.service'; import { UserService } from '@users/user.service';
import { NGXLogger } from 'ngx-logger'; import { NGXLogger } from 'ngx-logger';

View File

@ -642,7 +642,7 @@
"confirm-delete-users": { "confirm-delete-users": {
"cancel": "Keep {usersCount, plural, one{user} other{users}}", "cancel": "Keep {usersCount, plural, one{user} other{users}}",
"delete": "Delete {usersCount, plural, one{user} other{users}}", "delete": "Delete {usersCount, plural, one{user} other{users}}",
"impacted-documents": "All documents pending review from the {usersCount, plural, one{user} other{users}} will be impacted", "impacted-documents": "{documentsCount} {documentsCount, plural, one{document} other{documents}} will be impacted",
"impacted-dossiers": "{dossiersCount} {dossiersCount, plural, one{dossier} other{dossiers}} will be impacted", "impacted-dossiers": "{dossiersCount} {dossiersCount, plural, one{dossier} other{dossiers}} will be impacted",
"title": "Delete {usersCount, plural, one{user} other{users}} from workspace", "title": "Delete {usersCount, plural, one{user} other{users}} from workspace",
"toast-error": "Please confirm that you understand the consequences of this action.", "toast-error": "Please confirm that you understand the consequences of this action.",

View File

@ -642,7 +642,7 @@
"confirm-delete-users": { "confirm-delete-users": {
"cancel": "Keep {usersCount, plural, one{user} other{users}}", "cancel": "Keep {usersCount, plural, one{user} other{users}}",
"delete": "Delete {usersCount, plural, one{user} other{users}}", "delete": "Delete {usersCount, plural, one{user} other{users}}",
"impacted-documents": "All documents pending review from the {usersCount, plural, one{user} other{users}} will be impacted", "impacted-documents": "{documentsCount} {documentsCount, plural, one{document} other{documents}} will be impacted",
"impacted-dossiers": "{dossiersCount} {dossiersCount, plural, one{dossier} other{dossiers}} will be impacted", "impacted-dossiers": "{dossiersCount} {dossiersCount, plural, one{dossier} other{dossiers}} will be impacted",
"title": "Delete {usersCount, plural, one{user} other{users}} from workspace", "title": "Delete {usersCount, plural, one{user} other{users}} from workspace",
"toast-error": "Please confirm that you understand the consequences of this action.", "toast-error": "Please confirm that you understand the consequences of this action.",

@ -1 +1 @@
Subproject commit 58382ddfeed1d6d4d61f03abd1bbb0dd840afa94 Subproject commit 7f13fa62d3d2b346c609bc4978cff75f37f1ee6b

View File

@ -0,0 +1 @@
export const USER_ID = 'userId';

View File

@ -1,3 +1,6 @@
export * from './user.model'; export * from './user.model';
export * from './profile'; export * from './profile';
export * from './types'; export * from './types';
export * from './user-stats';
export * from './user-stats.model';
export * from './constants';

View File

@ -0,0 +1,13 @@
import { IUserStats } from './user-stats';
export class UserStats implements IUserStats {
readonly numberOfDossierMemberships: number;
readonly numberOfDossierOwnerships: number;
readonly numberOfAssignedFiles: number;
constructor(userStats: IUserStats) {
this.numberOfAssignedFiles = userStats.numberOfAssignedFiles;
this.numberOfDossierOwnerships = userStats.numberOfAssignedFiles;
this.numberOfAssignedFiles = userStats.numberOfAssignedFiles;
}
}

View File

@ -0,0 +1,5 @@
export interface IUserStats {
numberOfDossierMemberships: number;
numberOfDossierOwnerships: number;
numberOfAssignedFiles: number;
}