diff --git a/apps/red-ui/src/app/common/file-actions/file-actions.component.html b/apps/red-ui/src/app/common/file-actions/file-actions.component.html index e9b64eddf..a2179d019 100644 --- a/apps/red-ui/src/app/common/file-actions/file-actions.component.html +++ b/apps/red-ui/src/app/common/file-actions/file-actions.component.html @@ -1,24 +1,5 @@
- - - - - - + - - - + - - - + + + + + + + + + + + + + + + + +
diff --git a/apps/red-ui/src/app/common/service/permissions.service.ts b/apps/red-ui/src/app/common/service/permissions.service.ts index ae87066d1..251a56f1a 100644 --- a/apps/red-ui/src/app/common/service/permissions.service.ts +++ b/apps/red-ui/src/app/common/service/permissions.service.ts @@ -49,6 +49,13 @@ export class PermissionsService { ); } + displayReanalyseBtn(project?: ProjectWrapper) { + if (!project) { + project = this._appStateService.activeProject; + } + return this.isManagerAndOwner(project) && project.files.filter((file) => this.fileRequiresReanalysis(file)).length > 0; + } + canReanalyseFile(fileStatus?: FileStatusWrapper) { if (!fileStatus) { fileStatus = this._appStateService.activeFile; @@ -66,7 +73,7 @@ export class PermissionsService { return fileStatus.currentReviewer === this._userService.userId; } - canDeleteFile(fileStatus?: FileStatusWrapper, project?: Project) { + canDeleteFile(fileStatus?: FileStatusWrapper, project?: ProjectWrapper) { return this.isManagerAndOwner(project) || fileStatus.isUnassigned; } @@ -110,22 +117,22 @@ export class PermissionsService { return fileStatus.status === 'UNDER_REVIEW' && this.isReviewerOrOwner(fileStatus); } - isManagerAndOwner(project?: Project, user?: UserWrapper) { + isManagerAndOwner(project?: ProjectWrapper, user?: UserWrapper) { if (!user) { user = this._userService.user; } if (!project) { - project = this._appStateService.activeProject.project; + project = this._appStateService.activeProject; } return user.isManager && project.ownerId === user.id; } - isProjectMember(project?: Project, user?: UserWrapper) { + isProjectMember(project?: ProjectWrapper, user?: UserWrapper) { if (!user) { user = this._userService.user; } if (!project) { - project = this._appStateService.activeProject.project; + project = this._appStateService.activeProject; } return project.memberIds?.includes(user.id); } @@ -194,6 +201,6 @@ export class PermissionsService { if (!project) { project = this._appStateService.activeProject; } - return project.files.reduce((acc, file) => acc && this.canDeleteFile(file, project.project), true); + return project.files.reduce((acc, file) => acc && this.canDeleteFile(file, project), true); } } diff --git a/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts b/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts index 2a6ffd323..9398c607c 100644 --- a/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts +++ b/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts @@ -3,6 +3,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Project } from '@redaction/red-ui-http'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { AppStateService } from '../../state/app-state.service'; +import { ProjectWrapper } from '../../state/model/project.wrapper'; @Component({ selector: 'redaction-add-edit-project-dialog', @@ -16,7 +17,7 @@ export class AddEditProjectDialogComponent implements OnInit { private readonly _appStateService: AppStateService, private readonly _formBuilder: FormBuilder, public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public project: Project + @Inject(MAT_DIALOG_DATA) public project: ProjectWrapper ) {} ngOnInit(): void { diff --git a/apps/red-ui/src/app/dialogs/dialog.service.ts b/apps/red-ui/src/app/dialogs/dialog.service.ts index 0272202a8..b96956e68 100644 --- a/apps/red-ui/src/app/dialogs/dialog.service.ts +++ b/apps/red-ui/src/app/dialogs/dialog.service.ts @@ -12,6 +12,7 @@ import { ManualRedactionEntryWrapper } from '../screens/file/model/manual-redact import { AnnotationWrapper } from '../screens/file/model/annotation.wrapper'; import { ManualAnnotationDialogComponent } from './manual-redaction-dialog/manual-annotation-dialog.component'; import { ManualAnnotationService } from '../screens/file/service/manual-annotation.service'; +import { ProjectWrapper } from '../state/model/project.wrapper'; const dialogConfig = { width: '600px', @@ -124,7 +125,7 @@ export class DialogService { return ref; } - public openEditProjectDialog($event: MouseEvent, project: Project, cb?: Function): MatDialogRef { + public openEditProjectDialog($event: MouseEvent, project: ProjectWrapper, cb?: Function): MatDialogRef { $event.stopPropagation(); const ref = this._dialog.open(AddEditProjectDialogComponent, { ...dialogConfig, @@ -139,7 +140,7 @@ export class DialogService { return ref; } - public openDeleteProjectDialog($event: MouseEvent, project: Project, cb?: Function): MatDialogRef { + public openDeleteProjectDialog($event: MouseEvent, project: ProjectWrapper, cb?: Function): MatDialogRef { $event.stopPropagation(); const ref = this._dialog.open(ConfirmationDialogComponent, dialogConfig); ref.afterClosed().subscribe(async (result) => { @@ -151,7 +152,7 @@ export class DialogService { return ref; } - public openAssignProjectMembersAndOwnerDialog($event: MouseEvent, project: Project, cb?: Function): MatDialogRef { + public openAssignProjectMembersAndOwnerDialog($event: MouseEvent, project: ProjectWrapper, cb?: Function): MatDialogRef { $event?.stopPropagation(); const ref = this._dialog.open(AssignOwnerDialogComponent, { ...dialogConfig, diff --git a/apps/red-ui/src/app/screens/project-listing-screen/project-listing-screen.component.html b/apps/red-ui/src/app/screens/project-listing-screen/project-listing-screen.component.html index 7ace6afa7..5d61e2c8b 100644 --- a/apps/red-ui/src/app/screens/project-listing-screen/project-listing-screen.component.html +++ b/apps/red-ui/src/app/screens/project-listing-screen/project-listing-screen.component.html @@ -105,7 +105,7 @@
{ this._calculateData(); }); } - public downloadRedactionReport($event: MouseEvent, project: Project) { + public downloadRedactionReport($event: MouseEvent, project: ProjectWrapper) { $event.stopPropagation(); this.appStateService.downloadRedactionReport(project); } - public openAssignProjectOwnerDialog($event: MouseEvent, project: Project) { + public openAssignProjectOwnerDialog($event: MouseEvent, project: ProjectWrapper) { this._dialogService.openAssignProjectMembersAndOwnerDialog($event, project); } @@ -177,7 +177,7 @@ export class ProjectListingScreenComponent implements OnInit, OnDestroy { .map((status) => ({ length: obj[status], color: status })); } - async reanalyseProject($event: MouseEvent, project: Project) { + async reanalyseProject($event: MouseEvent, project: ProjectWrapper) { $event.stopPropagation(); await this.appStateService.reanalyzeProject(project); await this.appStateService.loadAllProjects(); @@ -272,7 +272,7 @@ export class ProjectListingScreenComponent implements OnInit, OnDestroy { this.displayedProjects = this._filteredProjects.filter((project) => project.name.toLowerCase().includes(value.query.toLowerCase())); } - openEditProjectDialog($event: MouseEvent, project: Project) { + openEditProjectDialog($event: MouseEvent, project: ProjectWrapper) { this._dialogService.openEditProjectDialog($event, project, () => { this._calculateData(); }); diff --git a/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html b/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html index 075241d4f..a0500987a 100644 --- a/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html +++ b/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.html @@ -45,6 +45,13 @@ tooltipPosition="below" icon="red:trash" > +
-
+
-
- - - {{ 'project-overview.new-rule.toast.message-project' | translate }} - - {{ 'project-overview.new-rule.toast.actions.reanalyse-all' | translate }} - -
diff --git a/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.ts b/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.ts index e259d489c..2c442625f 100644 --- a/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.ts +++ b/apps/red-ui/src/app/screens/project-overview-screen/project-overview-screen.component.ts @@ -105,13 +105,6 @@ export class ProjectOverviewScreenComponent implements OnInit, OnDestroy { this.selectedFileIds = this.displayedFiles.map((d) => d.fileId).filter((x) => this.selectedFileIds.includes(x)); } - get displayReanalyseBtn() { - return !!( - this.permissionsService.isManagerAndOwner() && - this.appStateService.activeProject.files.filter((file) => this.permissionsService.fileRequiresReanalysis(file)).length - ); - } - public reanalyseProject() { return this.appStateService.reanalyzeProject().then(() => this.reloadProjects()); } @@ -309,11 +302,11 @@ export class ProjectOverviewScreenComponent implements OnInit, OnDestroy { } public openEditProjectDialog($event: MouseEvent) { - this._dialogService.openEditProjectDialog($event, this.appStateService.activeProject.project); + this._dialogService.openEditProjectDialog($event, this.appStateService.activeProject); } public openDeleteProjectDialog($event: MouseEvent) { - this._dialogService.openDeleteProjectDialog($event, this.appStateService.activeProject.project, () => { + this._dialogService.openDeleteProjectDialog($event, this.appStateService.activeProject, () => { this._router.navigate(['/ui/projects']); }); } @@ -324,7 +317,7 @@ export class ProjectOverviewScreenComponent implements OnInit, OnDestroy { } public openAssignProjectMembersDialog(): void { - this._dialogService.openAssignProjectMembersAndOwnerDialog(null, this.appStateService.activeProject.project, () => { + this._dialogService.openAssignProjectMembersAndOwnerDialog(null, this.appStateService.activeProject, () => { this.reloadProjects(); }); } diff --git a/apps/red-ui/src/app/state/app-state.service.ts b/apps/red-ui/src/app/state/app-state.service.ts index 4d8725fab..9eca14336 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -150,7 +150,7 @@ export class AppStateService { const projects = await this._projectControllerService.getProjects().toPromise(); if (projects) { const mappedProjects = projects.map((p) => { - return new ProjectWrapper(p, this._getExistingFiles(p)); + return new ProjectWrapper(p, this._getExistingFiles(p.projectId)); }); for (const project of mappedProjects) { @@ -162,8 +162,8 @@ export class AppStateService { } } - private _getExistingFiles(project: Project) { - const found = this._appState.projects.find((p) => p.project.projectId === project.projectId); + private _getExistingFiles(projectId: string) { + const found = this._appState.projects.find((p) => p.project.projectId === projectId); return found ? found.files : []; } @@ -226,16 +226,16 @@ export class AppStateService { return files; } - async reanalyzeProject(project?: Project) { + async reanalyzeProject(project?: ProjectWrapper) { if (!project) { - project = this.activeProject.project; + project = this.activeProject; } await this._reanalysisControllerService.reanalyzeProject(project.projectId).toPromise(); } - downloadRedactionReport(project?: Project) { + downloadRedactionReport(project?: ProjectWrapper) { if (!project) { - project = this.activeProject.project; + project = this.activeProject; } this._fileManagementControllerService.downloadRedactionReportForProject(project.projectId, true, 'body').subscribe((data) => { saveAs(data, 'redaction-report-' + project.projectName + '.docx'); @@ -271,7 +271,7 @@ export class AppStateService { this._appState.activeProjectId = null; } - deleteProject(project: Project) { + deleteProject(project: ProjectWrapper) { return this._projectControllerService .deleteProject(project.projectId) .toPromise() diff --git a/apps/red-ui/src/app/state/model/project.wrapper.ts b/apps/red-ui/src/app/state/model/project.wrapper.ts index 95c737215..b08f2f69d 100644 --- a/apps/red-ui/src/app/state/model/project.wrapper.ts +++ b/apps/red-ui/src/app/state/model/project.wrapper.ts @@ -20,6 +20,18 @@ export class ProjectWrapper { this._recomputeFileStatus(); } + get projectName() { + return this.project.projectName; + } + + get description() { + return this.project.description; + } + + get ownerId() { + return this.project.ownerId; + } + get projectId() { return this.project.projectId; } diff --git a/apps/red-ui/src/assets/styles/red-grid.scss b/apps/red-ui/src/assets/styles/red-grid.scss index 1af3e49d1..4cebb435f 100644 --- a/apps/red-ui/src/assets/styles/red-grid.scss +++ b/apps/red-ui/src/assets/styles/red-grid.scss @@ -27,6 +27,10 @@ grid-column-end: span 4; } + &.span-7 { + grid-column-end: span 7; + } + &.justify-end { justify-content: flex-end; }