some css and label fixes
This commit is contained in:
parent
446cbab809
commit
1f0b0f952e
@ -37,7 +37,6 @@ import { FileDetailsDialogComponent } from './dialogs/file-details-dialog/file-d
|
|||||||
import { ToastrModule } from 'ngx-toastr';
|
import { ToastrModule } from 'ngx-toastr';
|
||||||
import { ServiceWorkerModule } from '@angular/service-worker';
|
import { ServiceWorkerModule } from '@angular/service-worker';
|
||||||
import { environment } from '../environments/environment';
|
import { environment } from '../environments/environment';
|
||||||
import { ProjectDetailsDialogComponent } from './dialogs/project-details-dialog/project-details-dialog.component';
|
|
||||||
import { AuthModule } from './auth/auth.module';
|
import { AuthModule } from './auth/auth.module';
|
||||||
import { FileUploadModule } from './upload/file-upload.module';
|
import { FileUploadModule } from './upload/file-upload.module';
|
||||||
import { FullPageLoadingIndicatorComponent } from './utils/full-page-loading-indicator/full-page-loading-indicator.component';
|
import { FullPageLoadingIndicatorComponent } from './utils/full-page-loading-indicator/full-page-loading-indicator.component';
|
||||||
@ -76,7 +75,6 @@ export function HttpLoaderFactory(httpClient: HttpClient) {
|
|||||||
FilePreviewScreenComponent,
|
FilePreviewScreenComponent,
|
||||||
PdfViewerComponent,
|
PdfViewerComponent,
|
||||||
FileDetailsDialogComponent,
|
FileDetailsDialogComponent,
|
||||||
ProjectDetailsDialogComponent,
|
|
||||||
AssignOwnerDialogComponent,
|
AssignOwnerDialogComponent,
|
||||||
FullPageLoadingIndicatorComponent,
|
FullPageLoadingIndicatorComponent,
|
||||||
InitialsAvatarComponent,
|
InitialsAvatarComponent,
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<form (submit)="saveUsers()" [formGroup]="usersForm">
|
<form (submit)="saveUsers()" [formGroup]="usersForm">
|
||||||
<div class="dialog-content">
|
<div class="dialog-content">
|
||||||
<div class="red-input-group">
|
<div class="red-input-group">
|
||||||
<mat-form-field>
|
<mat-form-field floatLabel="always">
|
||||||
<mat-label>{{
|
<mat-label>{{
|
||||||
'assign-' + data.type + '-owner.dialog.single-user.label' | translate
|
'assign-' + data.type + '-owner.dialog.single-user.label' | translate
|
||||||
}}</mat-label>
|
}}</mat-label>
|
||||||
@ -22,7 +22,7 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="red-input-group">
|
<div class="red-input-group">
|
||||||
<mat-form-field *ngIf="data.type === 'project'">
|
<mat-form-field *ngIf="data.type === 'project'" floatLabel="always">
|
||||||
<mat-label>{{
|
<mat-label>{{
|
||||||
'assign-' + data.type + '-owner.dialog.multi-user.label' | translate
|
'assign-' + data.type + '-owner.dialog.multi-user.label' | translate
|
||||||
}}</mat-label>
|
}}</mat-label>
|
||||||
|
|||||||
@ -11,10 +11,9 @@ import {
|
|||||||
import { ConfirmationDialogComponent } from '../common/confirmation-dialog/confirmation-dialog.component';
|
import { ConfirmationDialogComponent } from '../common/confirmation-dialog/confirmation-dialog.component';
|
||||||
import { NotificationService, NotificationType } from '../notification/notification.service';
|
import { NotificationService, NotificationType } from '../notification/notification.service';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { AppStateService, ProjectWrapper } from '../state/app-state.service';
|
import { AppStateService } from '../state/app-state.service';
|
||||||
import { AddEditProjectDialogComponent } from './add-edit-project-dialog/add-edit-project-dialog.component';
|
import { AddEditProjectDialogComponent } from './add-edit-project-dialog/add-edit-project-dialog.component';
|
||||||
import { AssignOwnerDialogComponent } from './assign-owner-dialog/assign-owner-dialog.component';
|
import { AssignOwnerDialogComponent } from './assign-owner-dialog/assign-owner-dialog.component';
|
||||||
import { ProjectDetailsDialogComponent } from './project-details-dialog/project-details-dialog.component';
|
|
||||||
import { ManualRedactionDialogComponent } from './manual-redaction-dialog/manual-redaction-dialog.component';
|
import { ManualRedactionDialogComponent } from './manual-redaction-dialog/manual-redaction-dialog.component';
|
||||||
import { Annotations } from '@pdftron/webviewer';
|
import { Annotations } from '@pdftron/webviewer';
|
||||||
|
|
||||||
@ -250,17 +249,6 @@ export class DialogService {
|
|||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
public openProjectDetailsDialog(
|
|
||||||
$event: MouseEvent,
|
|
||||||
project: ProjectWrapper
|
|
||||||
): MatDialogRef<ProjectDetailsDialogComponent> {
|
|
||||||
$event.stopPropagation();
|
|
||||||
return this._dialog.open(ProjectDetailsDialogComponent, {
|
|
||||||
...dialogConfig,
|
|
||||||
data: project
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public openAddProjectDialog(cb?: Function): MatDialogRef<AddEditProjectDialogComponent> {
|
public openAddProjectDialog(cb?: Function): MatDialogRef<AddEditProjectDialogComponent> {
|
||||||
const ref = this._dialog.open(AddEditProjectDialogComponent, {
|
const ref = this._dialog.open(AddEditProjectDialogComponent, {
|
||||||
...dialogConfig,
|
...dialogConfig,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { Component, Inject, OnInit } from '@angular/core';
|
import { Component, Inject, OnInit } from '@angular/core';
|
||||||
import { FileStatus, FileUploadControllerService } from '@redaction/red-ui-http';
|
import { FileStatus } from '@redaction/red-ui-http';
|
||||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||||
import { download } from '../../utils/file-download-utils';
|
import { AppStateService } from '../../state/app-state.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'redaction-file-details-dialog',
|
selector: 'redaction-file-details-dialog',
|
||||||
@ -10,7 +10,7 @@ import { download } from '../../utils/file-download-utils';
|
|||||||
})
|
})
|
||||||
export class FileDetailsDialogComponent implements OnInit {
|
export class FileDetailsDialogComponent implements OnInit {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly _fileUploadControllerService: FileUploadControllerService,
|
private readonly _appStateService: AppStateService,
|
||||||
public dialogRef: MatDialogRef<FileDetailsDialogComponent>,
|
public dialogRef: MatDialogRef<FileDetailsDialogComponent>,
|
||||||
@Inject(MAT_DIALOG_DATA) public fileStatus: FileStatus
|
@Inject(MAT_DIALOG_DATA) public fileStatus: FileStatus
|
||||||
) {}
|
) {}
|
||||||
@ -18,10 +18,6 @@ export class FileDetailsDialogComponent implements OnInit {
|
|||||||
ngOnInit(): void {}
|
ngOnInit(): void {}
|
||||||
|
|
||||||
downloadRedactionReport() {
|
downloadRedactionReport() {
|
||||||
this._fileUploadControllerService
|
this._appStateService.downloadFileRedactionReport(this.fileStatus);
|
||||||
.downloadRedactionReport({ fileIds: [this.fileStatus.fileId] }, true, 'response')
|
|
||||||
.subscribe((data) => {
|
|
||||||
download(data, 'redaction-report-' + this.fileStatus.filename + '.docx');
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,43 +0,0 @@
|
|||||||
<section class="dialog">
|
|
||||||
<div [translate]="'project-details.dialog.title.label'" class="dialog-header heading-l"></div>
|
|
||||||
|
|
||||||
<div class="dialog-content">
|
|
||||||
<div class="file-details">
|
|
||||||
<div class="detail-row">
|
|
||||||
{{ projectDetails.project.projectName }}
|
|
||||||
</div>
|
|
||||||
<div class="detail-row">
|
|
||||||
{{ projectDetails.project.description }}
|
|
||||||
</div>
|
|
||||||
<div class="detail-row">
|
|
||||||
{{ projectDetails.project.date | date: 'short' }}
|
|
||||||
</div>
|
|
||||||
<div class="detail-row">
|
|
||||||
{{
|
|
||||||
'project-details.dialog.info.file-count.label'
|
|
||||||
| translate
|
|
||||||
: { fileCount: projectDetails.files ? projectDetails.files.length : 0 }
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="dialog-actions">
|
|
||||||
<button
|
|
||||||
(click)="downloadRedactionReport()"
|
|
||||||
color="primary"
|
|
||||||
mat-flat-button
|
|
||||||
translate="project-details.dialog.actions.download-redaction-report.label"
|
|
||||||
></button>
|
|
||||||
<button
|
|
||||||
(click)="reanalyseProject()"
|
|
||||||
color="primary"
|
|
||||||
mat-flat-button
|
|
||||||
translate="project-details.dialog.actions.reanalyse-project.label"
|
|
||||||
></button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button (click)="dialogRef.close()" class="dialog-close" mat-icon-button>
|
|
||||||
<mat-icon svgIcon="red:close"></mat-icon>
|
|
||||||
</button>
|
|
||||||
</section>
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
import { Component, Inject, OnInit } from '@angular/core';
|
|
||||||
import { FileUploadControllerService, ReanalysisControllerService } from '@redaction/red-ui-http';
|
|
||||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
|
||||||
import { download } from '../../utils/file-download-utils';
|
|
||||||
import { ProjectWrapper } from '../../state/app-state.service';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'redaction-project-details-dialog',
|
|
||||||
templateUrl: './project-details-dialog.component.html',
|
|
||||||
styleUrls: ['./project-details-dialog.component.scss']
|
|
||||||
})
|
|
||||||
export class ProjectDetailsDialogComponent implements OnInit {
|
|
||||||
constructor(
|
|
||||||
private readonly _fileUploadControllerService: FileUploadControllerService,
|
|
||||||
private readonly _reanalysisControllerService: ReanalysisControllerService,
|
|
||||||
public dialogRef: MatDialogRef<ProjectDetailsDialogComponent>,
|
|
||||||
@Inject(MAT_DIALOG_DATA) public projectDetails: ProjectWrapper
|
|
||||||
) {}
|
|
||||||
|
|
||||||
ngOnInit(): void {}
|
|
||||||
|
|
||||||
downloadRedactionReport() {
|
|
||||||
this._fileUploadControllerService
|
|
||||||
.downloadRedactionReportForProject(
|
|
||||||
this.projectDetails.project.projectId,
|
|
||||||
true,
|
|
||||||
'response'
|
|
||||||
)
|
|
||||||
.subscribe((data) => {
|
|
||||||
download(
|
|
||||||
data,
|
|
||||||
'redaction-report-' + this.projectDetails.project.projectName + '.docx'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
reanalyseProject() {
|
|
||||||
this._reanalysisControllerService
|
|
||||||
.reanalyzeProject(this.projectDetails.project.projectId)
|
|
||||||
.subscribe(() => {
|
|
||||||
this.dialogRef.close();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
<section>
|
<section [class.hidden]="!viewReady">
|
||||||
<div class="page-header">
|
<div class="page-header">
|
||||||
<div class="flex-1">
|
<div class="flex-1">
|
||||||
<mat-slide-toggle color="primary" labelPosition="after" [(ngModel)]="redactedView">
|
<mat-slide-toggle color="primary" labelPosition="after" [(ngModel)]="redactedView">
|
||||||
@ -273,4 +273,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!--<redaction-full-page-loading-indicator [displayed]="!viewReady"></redaction-full-page-loading-indicator>-->
|
<redaction-full-page-loading-indicator
|
||||||
|
[displayed]="!viewReady"
|
||||||
|
></redaction-full-page-loading-indicator>
|
||||||
|
|||||||
@ -48,6 +48,7 @@ export class FilePreviewScreenComponent implements OnInit {
|
|||||||
public filters: AnnotationFilters;
|
public filters: AnnotationFilters;
|
||||||
public expandedFilters: AnnotationFilters = { hint: false };
|
public expandedFilters: AnnotationFilters = { hint: false };
|
||||||
public pagesPanelActive = true;
|
public pagesPanelActive = true;
|
||||||
|
public viewReady: boolean = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
public readonly appStateService: AppStateService,
|
public readonly appStateService: AppStateService,
|
||||||
@ -91,11 +92,9 @@ export class FilePreviewScreenComponent implements OnInit {
|
|||||||
|
|
||||||
public ngOnInit(): void {
|
public ngOnInit(): void {
|
||||||
// PDFTRON cache fix
|
// PDFTRON cache fix
|
||||||
localStorage.clear();
|
|
||||||
this._reloadFiles();
|
this._reloadFiles();
|
||||||
this.appStateService.fileStatusChanged.subscribe((fileStatus) => {
|
this.appStateService.fileStatusChanged.subscribe((fileStatus) => {
|
||||||
if (fileStatus.fileId === this.fileId) {
|
if (fileStatus.fileId === this.fileId) {
|
||||||
console.log(fileStatus);
|
|
||||||
this._reloadFiles();
|
this._reloadFiles();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -184,6 +183,7 @@ export class FilePreviewScreenComponent implements OnInit {
|
|||||||
|
|
||||||
public selectPage(pageNumber: number) {
|
public selectPage(pageNumber: number) {
|
||||||
this._viewerComponent.navigateToPage(pageNumber);
|
this._viewerComponent.navigateToPage(pageNumber);
|
||||||
|
this._scrollAnnotationsToPage(pageNumber, 'always');
|
||||||
}
|
}
|
||||||
|
|
||||||
public openManualRedactionDialog($event: ManualRedactionEntry) {
|
public openManualRedactionDialog($event: ManualRedactionEntry) {
|
||||||
@ -213,17 +213,24 @@ export class FilePreviewScreenComponent implements OnInit {
|
|||||||
if (this.selectedAnnotation?.getPageNumber() === this.activeViewerPage) {
|
if (this.selectedAnnotation?.getPageNumber() === this.activeViewerPage) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const elements: any[] = this._annotationsElement.nativeElement.querySelectorAll(
|
this._scrollAnnotationsToPage(this.activeViewerPage);
|
||||||
`div[anotation-page-header="${this.activeViewerPage}"]`
|
|
||||||
);
|
|
||||||
this._scrollToFirstElement(elements);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private _scrollToFirstElement(elements: HTMLElement[]) {
|
private _scrollAnnotationsToPage(page: number, mode: 'always' | 'if-needed' = 'if-needed') {
|
||||||
|
const elements: any[] = this._annotationsElement.nativeElement.querySelectorAll(
|
||||||
|
`div[anotation-page-header="${page}"]`
|
||||||
|
);
|
||||||
|
this._scrollToFirstElement(elements, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _scrollToFirstElement(
|
||||||
|
elements: HTMLElement[],
|
||||||
|
mode: 'always' | 'if-needed' = 'if-needed'
|
||||||
|
) {
|
||||||
if (elements.length > 0) {
|
if (elements.length > 0) {
|
||||||
scrollIntoView(elements[0], {
|
scrollIntoView(elements[0], {
|
||||||
behavior: 'smooth',
|
behavior: 'smooth',
|
||||||
scrollMode: 'if-needed',
|
scrollMode: mode,
|
||||||
block: 'start',
|
block: 'start',
|
||||||
inline: 'start'
|
inline: 'start'
|
||||||
});
|
});
|
||||||
@ -445,6 +452,7 @@ export class FilePreviewScreenComponent implements OnInit {
|
|||||||
|
|
||||||
viewerReady($event: WebViewerInstance) {
|
viewerReady($event: WebViewerInstance) {
|
||||||
this.instance = $event;
|
this.instance = $event;
|
||||||
|
this.viewReady = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
handleAnnotationsAdded(annotations: Annotations.Annotation[]) {
|
handleAnnotationsAdded(annotations: Annotations.Annotation[]) {
|
||||||
|
|||||||
@ -127,6 +127,7 @@ export class PdfViewerComponent implements OnInit, AfterViewInit, OnChanges {
|
|||||||
|
|
||||||
private _disableElements() {
|
private _disableElements() {
|
||||||
this.instance.disableElements([
|
this.instance.disableElements([
|
||||||
|
'menuButton',
|
||||||
'textHighlightToolButton',
|
'textHighlightToolButton',
|
||||||
'textUnderlineToolButton',
|
'textUnderlineToolButton',
|
||||||
'textSquigglyToolButton',
|
'textSquigglyToolButton',
|
||||||
|
|||||||
@ -132,7 +132,7 @@
|
|||||||
<button
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
color="accent"
|
color="accent"
|
||||||
(click)="openProjectDetailsDialog($event, pw)"
|
(click)="downloadRedactionReport($event, pw.project)"
|
||||||
[matTooltip]="'project-listing.report.action.label' | translate"
|
[matTooltip]="'project-listing.report.action.label' | translate"
|
||||||
>
|
>
|
||||||
<mat-icon svgIcon="red:report"></mat-icon>
|
<mat-icon svgIcon="red:report"></mat-icon>
|
||||||
@ -145,6 +145,14 @@
|
|||||||
>
|
>
|
||||||
<mat-icon svgIcon="red:assign"></mat-icon>
|
<mat-icon svgIcon="red:assign"></mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
color="accent"
|
||||||
|
(click)="reanalyseProject($event, pw.project)"
|
||||||
|
mat-icon-button
|
||||||
|
[matTooltip]="'project-listing.reanalyse.action.label' | translate"
|
||||||
|
>
|
||||||
|
<mat-icon svgIcon="red:refresh"></mat-icon>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { Project } from '@redaction/red-ui-http';
|
import { FileUploadControllerService, Project } from '@redaction/red-ui-http';
|
||||||
import { AppStateService, ProjectWrapper } from '../../state/app-state.service';
|
import { AppStateService, ProjectWrapper } from '../../state/app-state.service';
|
||||||
import { UserService } from '../../user/user.service';
|
import { UserService } from '../../user/user.service';
|
||||||
import { DoughnutChartConfig } from '../../components/simple-doughnut-chart/simple-doughnut-chart.component';
|
import { DoughnutChartConfig } from '../../components/simple-doughnut-chart/simple-doughnut-chart.component';
|
||||||
import { SortingOption } from '../../utils/types';
|
import { SortingOption } from '../../utils/types';
|
||||||
import { groupBy } from '../../utils/functions';
|
import { groupBy } from '../../utils/functions';
|
||||||
import { DialogService } from '../../dialogs/dialog.service';
|
import { DialogService } from '../../dialogs/dialog.service';
|
||||||
|
import { download } from '../../utils/file-download-utils';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'redaction-project-listing-screen',
|
selector: 'redaction-project-listing-screen',
|
||||||
@ -27,6 +28,7 @@ export class ProjectListingScreenComponent implements OnInit {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
public readonly appStateService: AppStateService,
|
public readonly appStateService: AppStateService,
|
||||||
|
private readonly _fileUploadControllerService: FileUploadControllerService,
|
||||||
private readonly _userService: UserService,
|
private readonly _userService: UserService,
|
||||||
private readonly _dialogService: DialogService
|
private readonly _dialogService: DialogService
|
||||||
) {}
|
) {}
|
||||||
@ -94,8 +96,9 @@ export class ProjectListingScreenComponent implements OnInit {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public openProjectDetailsDialog($event: MouseEvent, project: ProjectWrapper) {
|
downloadRedactionReport($event: MouseEvent, project: Project) {
|
||||||
this._dialogService.openProjectDetailsDialog($event, project);
|
$event.preventDefault();
|
||||||
|
this.appStateService.downloadRedactionReport(project);
|
||||||
}
|
}
|
||||||
|
|
||||||
public openAssignProjectOwnerDialog($event: MouseEvent, project: Project) {
|
public openAssignProjectOwnerDialog($event: MouseEvent, project: Project) {
|
||||||
@ -117,4 +120,9 @@ export class ProjectListingScreenComponent implements OnInit {
|
|||||||
.sort()
|
.sort()
|
||||||
.map((status) => ({ length: obj[status], color: status }));
|
.map((status) => ({ length: obj[status], color: status }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reanalyseProject($event: MouseEvent, project: Project) {
|
||||||
|
$event.preventDefault();
|
||||||
|
this.appStateService.reanalyseProject(project);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -191,7 +191,7 @@
|
|||||||
<mat-icon svgIcon="red:trash"></mat-icon>
|
<mat-icon svgIcon="red:trash"></mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
(click)="$event.stopPropagation()"
|
(click)="downloadFileRedactionReport($event, fileStatus)"
|
||||||
color="accent"
|
color="accent"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
[matTooltip]="'project-overview.report.action.label' | translate"
|
[matTooltip]="'project-overview.report.action.label' | translate"
|
||||||
@ -210,9 +210,9 @@
|
|||||||
(click)="reanalyseFile($event, fileStatus)"
|
(click)="reanalyseFile($event, fileStatus)"
|
||||||
color="accent"
|
color="accent"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
[matTooltip]="'project-overview.bar-charts.action.label' | translate"
|
[matTooltip]="'project-overview.reanalyse.action.label' | translate"
|
||||||
>
|
>
|
||||||
<mat-icon svgIcon="red:analyse"></mat-icon>
|
<mat-icon svgIcon="red:refresh"></mat-icon>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -228,7 +228,7 @@
|
|||||||
<button mat-icon-button (click)="openEditProjectDialog($event)">
|
<button mat-icon-button (click)="openEditProjectDialog($event)">
|
||||||
<mat-icon svgIcon="red:edit"></mat-icon>
|
<mat-icon svgIcon="red:edit"></mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<button mat-icon-button (click)="openDetailsDialog($event)">
|
<button mat-icon-button (click)="downloadRedactionReport($event)">
|
||||||
<mat-icon svgIcon="red:report"></mat-icon>
|
<mat-icon svgIcon="red:report"></mat-icon>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core';
|
|||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import {
|
import {
|
||||||
FileStatus,
|
FileStatus,
|
||||||
|
FileUploadControllerService,
|
||||||
ReanalysisControllerService,
|
ReanalysisControllerService,
|
||||||
StatusControllerService
|
StatusControllerService
|
||||||
} from '@redaction/red-ui-http';
|
} from '@redaction/red-ui-http';
|
||||||
@ -16,6 +17,7 @@ import { SortingOption } from '../../utils/types';
|
|||||||
import { DoughnutChartConfig } from '../../components/simple-doughnut-chart/simple-doughnut-chart.component';
|
import { DoughnutChartConfig } from '../../components/simple-doughnut-chart/simple-doughnut-chart.component';
|
||||||
import { groupBy } from '../../utils/functions';
|
import { groupBy } from '../../utils/functions';
|
||||||
import { DialogService } from '../../dialogs/dialog.service';
|
import { DialogService } from '../../dialogs/dialog.service';
|
||||||
|
import { download } from '../../utils/file-download-utils';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'redaction-project-overview-screen',
|
selector: 'redaction-project-overview-screen',
|
||||||
@ -50,6 +52,7 @@ export class ProjectOverviewScreenComponent implements OnInit, OnDestroy {
|
|||||||
constructor(
|
constructor(
|
||||||
public readonly appStateService: AppStateService,
|
public readonly appStateService: AppStateService,
|
||||||
private readonly _activatedRoute: ActivatedRoute,
|
private readonly _activatedRoute: ActivatedRoute,
|
||||||
|
private readonly _fileUploadControllerService: FileUploadControllerService,
|
||||||
private readonly _statusControllerService: StatusControllerService,
|
private readonly _statusControllerService: StatusControllerService,
|
||||||
private readonly _notificationService: NotificationService,
|
private readonly _notificationService: NotificationService,
|
||||||
private readonly _dialogService: DialogService,
|
private readonly _dialogService: DialogService,
|
||||||
@ -152,8 +155,14 @@ export class ProjectOverviewScreenComponent implements OnInit, OnDestroy {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public openDetailsDialog($event: MouseEvent) {
|
downloadFileRedactionReport($event: MouseEvent, file: FileStatus) {
|
||||||
this._dialogService.openProjectDetailsDialog($event, this.appStateService.activeProject);
|
$event.stopPropagation();
|
||||||
|
this.appStateService.downloadFileRedactionReport(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadRedactionReport($event: MouseEvent) {
|
||||||
|
$event.stopPropagation();
|
||||||
|
this.appStateService.downloadRedactionReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
public openEditProjectDialog($event: MouseEvent) {
|
public openEditProjectDialog($event: MouseEvent) {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { EventEmitter, Injectable } from '@angular/core';
|
import { EventEmitter, Injectable } from '@angular/core';
|
||||||
import {
|
import {
|
||||||
FileStatus,
|
FileStatus,
|
||||||
|
FileUploadControllerService,
|
||||||
Project,
|
Project,
|
||||||
ProjectControllerService,
|
ProjectControllerService,
|
||||||
ReanalysisControllerService,
|
ReanalysisControllerService,
|
||||||
@ -12,6 +13,7 @@ import { Router } from '@angular/router';
|
|||||||
import { UserService } from '../user/user.service';
|
import { UserService } from '../user/user.service';
|
||||||
import { interval } from 'rxjs';
|
import { interval } from 'rxjs';
|
||||||
import { tap } from 'rxjs/operators';
|
import { tap } from 'rxjs/operators';
|
||||||
|
import { download } from '../utils/file-download-utils';
|
||||||
|
|
||||||
export interface AppState {
|
export interface AppState {
|
||||||
projects: ProjectWrapper[];
|
projects: ProjectWrapper[];
|
||||||
@ -41,6 +43,7 @@ export class AppStateService {
|
|||||||
constructor(
|
constructor(
|
||||||
private readonly _router: Router,
|
private readonly _router: Router,
|
||||||
private readonly _userService: UserService,
|
private readonly _userService: UserService,
|
||||||
|
private readonly _fileUploadControllerService: FileUploadControllerService,
|
||||||
private readonly _projectControllerService: ProjectControllerService,
|
private readonly _projectControllerService: ProjectControllerService,
|
||||||
private readonly _notificationService: NotificationService,
|
private readonly _notificationService: NotificationService,
|
||||||
private readonly _reanalysisControllerService: ReanalysisControllerService,
|
private readonly _reanalysisControllerService: ReanalysisControllerService,
|
||||||
@ -74,6 +77,13 @@ export class AppStateService {
|
|||||||
return this._appState.activeProject?.project?.ownerId === this._userService.userId;
|
return this._appState.activeProject?.project?.ownerId === this._userService.userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get isActiveProjectOwnerAndManager() {
|
||||||
|
return (
|
||||||
|
this._appState.activeProject?.project?.ownerId === this._userService.userId &&
|
||||||
|
this._userService.isManager(this._userService.user)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
get isActiveProjectMember() {
|
get isActiveProjectMember() {
|
||||||
return (
|
return (
|
||||||
this._appState.activeProject?.project?.memberIds?.indexOf(this._userService.userId) >= 0
|
this._appState.activeProject?.project?.memberIds?.indexOf(this._userService.userId) >= 0
|
||||||
@ -181,6 +191,24 @@ export class AppStateService {
|
|||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reanalyseProject(project?: Project) {
|
||||||
|
if (!project) {
|
||||||
|
project = this.activeProject.project;
|
||||||
|
}
|
||||||
|
this._reanalysisControllerService.reanalyzeProject(project.projectId).subscribe(() => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadRedactionReport(project?: Project) {
|
||||||
|
if (!project) {
|
||||||
|
project = this.activeProject.project;
|
||||||
|
}
|
||||||
|
this._fileUploadControllerService
|
||||||
|
.downloadRedactionReportForProject(project.projectId, true, 'response')
|
||||||
|
.subscribe((data) => {
|
||||||
|
download(data, 'redaction-report-' + project.projectName + '.docx');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
activateProject(projectId: string) {
|
activateProject(projectId: string) {
|
||||||
this._appState.activeFile = null;
|
this._appState.activeFile = null;
|
||||||
this._appState.activeProject = this._appState.projects.find(
|
this._appState.activeProject = this._appState.projects.find(
|
||||||
@ -295,4 +323,12 @@ export class AppStateService {
|
|||||||
.toPromise();
|
.toPromise();
|
||||||
await this.reloadActiveProjectFiles();
|
await this.reloadActiveProjectFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
downloadFileRedactionReport(file: FileStatus) {
|
||||||
|
this._fileUploadControllerService
|
||||||
|
.downloadRedactionReport({ fileIds: [file.fileId] }, true, 'response')
|
||||||
|
.subscribe((data) => {
|
||||||
|
download(data, 'redaction-report-' + file.filename + '.docx');
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,6 +17,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"manual-redaction": {
|
"manual-redaction": {
|
||||||
|
"confirm-annotation": {
|
||||||
|
"success": {
|
||||||
|
"label": "Anmerkung bestätigt!"
|
||||||
|
},
|
||||||
|
"failed": {
|
||||||
|
"label": "Fehler beim Bestätigen des Entfernens von Anmerkungen!"
|
||||||
|
}
|
||||||
|
},
|
||||||
"remove-annotation": {
|
"remove-annotation": {
|
||||||
"success": {
|
"success": {
|
||||||
"label": "Anmerkung Zum Entfernen empfohlen!"
|
"label": "Anmerkung Zum Entfernen empfohlen!"
|
||||||
@ -44,16 +52,19 @@
|
|||||||
},
|
},
|
||||||
"content": {
|
"content": {
|
||||||
"text": {
|
"text": {
|
||||||
"label": "<strong>Ausgewählter Text:</strong> {{value}}"
|
"label": "Ausgewählter Text:"
|
||||||
},
|
},
|
||||||
"dictionary": {
|
"dictionary": {
|
||||||
"add": {
|
"add": {
|
||||||
"label": "Zum Wörterbuch hinzufügen"
|
"label": "Zum Wörterbuch hinzufügen"
|
||||||
},
|
},
|
||||||
"label": "Wörterbuch"
|
"label": "Art"
|
||||||
},
|
},
|
||||||
"reason": {
|
"reason": {
|
||||||
"label": "Grund"
|
"label": "Grund"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"label": "Kommentar"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -165,6 +176,17 @@
|
|||||||
"label": "Kürzlich"
|
"label": "Kürzlich"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"table-col-names": {
|
||||||
|
"name": {
|
||||||
|
"label": "Name"
|
||||||
|
},
|
||||||
|
"owner": {
|
||||||
|
"label": "Inhaber"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"label": "Status"
|
||||||
|
}
|
||||||
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"analyzed-pages": {
|
"analyzed-pages": {
|
||||||
"label": "Analysierte Seiten"
|
"label": "Analysierte Seiten"
|
||||||
@ -194,6 +216,9 @@
|
|||||||
},
|
},
|
||||||
"name": {
|
"name": {
|
||||||
"label": "Name"
|
"label": "Name"
|
||||||
|
},
|
||||||
|
"due-date": {
|
||||||
|
"label": "Geburtstermin"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
@ -298,6 +323,9 @@
|
|||||||
"recent": {
|
"recent": {
|
||||||
"label": "Kürzlich"
|
"label": "Kürzlich"
|
||||||
},
|
},
|
||||||
|
"oldest": {
|
||||||
|
"label": "Älteste"
|
||||||
|
},
|
||||||
"alphabetically": {
|
"alphabetically": {
|
||||||
"label": "Alphabetisch"
|
"label": "Alphabetisch"
|
||||||
},
|
},
|
||||||
@ -361,6 +389,17 @@
|
|||||||
},
|
},
|
||||||
"no-project": {
|
"no-project": {
|
||||||
"label": "Angefordertes Projekt: {{projectId}} existiert nicht! <a href='/ui/projects'>Zurück zur Projektliste.</a>"
|
"label": "Angefordertes Projekt: {{projectId}} existiert nicht! <a href='/ui/projects'>Zurück zur Projektliste.</a>"
|
||||||
|
},
|
||||||
|
"legend": {
|
||||||
|
"contains-hints": {
|
||||||
|
"label": "Enthält Hinweise"
|
||||||
|
},
|
||||||
|
"contains-redactions": {
|
||||||
|
"label": "Enthält Redaktionen"
|
||||||
|
},
|
||||||
|
"contains-suggestions": {
|
||||||
|
"label": "Enthält Vorschläge zur Redaktion"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"file-preview": {
|
"file-preview": {
|
||||||
@ -446,6 +485,35 @@
|
|||||||
"label": "Nicht zugewiesen"
|
"label": "Nicht zugewiesen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"assign-file-owner": {
|
||||||
|
"dialog": {
|
||||||
|
"single-user": {
|
||||||
|
"label": "Gutachter"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"label": "File Reviewer verwalten"
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"label": "speichern"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"assign-project-owner": {
|
||||||
|
"dialog": {
|
||||||
|
"single-user": {
|
||||||
|
"label": "Inhaber"
|
||||||
|
},
|
||||||
|
"multi-user": {
|
||||||
|
"label": "Mitglieder"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"label": "Projektbesitzer und Mitglieder verwalten"
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"label": "speichern"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"unassigned": "Nicht zugewiesen",
|
"unassigned": "Nicht zugewiesen",
|
||||||
"under-review": "Wird überprüft",
|
"under-review": "Wird überprüft",
|
||||||
"under-approval": "In Genehmigung",
|
"under-approval": "In Genehmigung",
|
||||||
|
|||||||
@ -165,6 +165,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"project-listing": {
|
"project-listing": {
|
||||||
|
"report": {
|
||||||
|
"action": {
|
||||||
|
"label": "Download Redaction Report"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"reanalyse": {
|
||||||
|
"action": {
|
||||||
|
"label": "Reanalyse entire Project"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"assign": {
|
||||||
|
"action": {
|
||||||
|
"label": "Assign Owner & Members"
|
||||||
|
}
|
||||||
|
},
|
||||||
"table-header": {
|
"table-header": {
|
||||||
"title": {
|
"title": {
|
||||||
"label": "{{length}} active projects"
|
"label": "{{length}} active projects"
|
||||||
@ -291,6 +306,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"project-overview": {
|
"project-overview": {
|
||||||
|
"report": {
|
||||||
|
"action": {
|
||||||
|
"label": "Download Redaction Report"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"assign": {
|
||||||
|
"action": {
|
||||||
|
"label": "Assign Reviewer"
|
||||||
|
}
|
||||||
|
},
|
||||||
"table-header": {
|
"table-header": {
|
||||||
"title": {
|
"title": {
|
||||||
"label": "{{length}} documents"
|
"label": "{{length}} documents"
|
||||||
|
|||||||
@ -2,8 +2,7 @@
|
|||||||
viewBox="0 0 487.23 487.23"
|
viewBox="0 0 487.23 487.23"
|
||||||
width="487.23px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"
|
width="487.23px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"
|
||||||
y="0px">
|
y="0px">
|
||||||
<g>
|
<g fill="currentColor">
|
||||||
<g>
|
|
||||||
<path d="M55.323,203.641c15.664,0,29.813-9.405,35.872-23.854c25.017-59.604,83.842-101.61,152.42-101.61
|
<path d="M55.323,203.641c15.664,0,29.813-9.405,35.872-23.854c25.017-59.604,83.842-101.61,152.42-101.61
|
||||||
c37.797,0,72.449,12.955,100.23,34.442l-21.775,3.371c-7.438,1.153-13.224,7.054-14.232,14.512
|
c37.797,0,72.449,12.955,100.23,34.442l-21.775,3.371c-7.438,1.153-13.224,7.054-14.232,14.512
|
||||||
c-1.01,7.454,3.008,14.686,9.867,17.768l119.746,53.872c5.249,2.357,11.33,1.904,16.168-1.205
|
c-1.01,7.454,3.008,14.686,9.867,17.768l119.746,53.872c5.249,2.357,11.33,1.904,16.168-1.205
|
||||||
@ -17,6 +16,5 @@
|
|||||||
c-0.042,7.506,4.85,14.144,12.024,16.332c7.185,2.188,14.948-0.59,19.104-6.839l16.505-24.805
|
c-0.042,7.506,4.85,14.144,12.024,16.332c7.185,2.188,14.948-0.59,19.104-6.839l16.505-24.805
|
||||||
c44.004,43.32,104.303,70.098,170.788,70.098c100.811,0,187.481-61.561,224.446-149.059
|
c44.004,43.32,104.303,70.098,170.788,70.098c100.811,0,187.481-61.561,224.446-149.059
|
||||||
C473.197,326.043,471.903,312.157,464.635,301.184z"/>
|
C473.197,326.043,471.903,312.157,464.635,301.184z"/>
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@ -6,6 +6,16 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin-top: 13px;
|
margin-top: 13px;
|
||||||
|
|
||||||
|
.mat-form-field-underline {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-form-field-label {
|
||||||
|
opacity: 0.7 !important;
|
||||||
|
color: $grey-1 !important;
|
||||||
|
transform: translateY(-1.34em) !important;
|
||||||
|
}
|
||||||
|
|
||||||
&:first-child {
|
&:first-child {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
@ -57,6 +67,7 @@
|
|||||||
letter-spacing: 0;
|
letter-spacing: 0;
|
||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
|
color: $grey-1;
|
||||||
|
|
||||||
&.mat-checkbox-layout {
|
&.mat-checkbox-layout {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|||||||
@ -117,3 +117,17 @@ Your user doesn't have the required RED-* roles to access this application. Plea
|
|||||||
Your user doesn't have the required RED-* roles to access this application. Please contact <a href={{adminUrl}} target=_blank >{{adminName}}</a> for access!|Ihr Benutzer verfügt nicht über die erforderlichen RED- * -Rollen, um auf diese Anwendung zuzugreifen. Bitte kontaktieren Sie <a href={{adminUrl}} target=_blank >{{adminName}}</a> für den Zugriff!
|
Your user doesn't have the required RED-* roles to access this application. Please contact <a href={{adminUrl}} target=_blank >{{adminName}}</a> for access!|Ihr Benutzer verfügt nicht über die erforderlichen RED- * -Rollen, um auf diese Anwendung zuzugreifen. Bitte kontaktieren Sie <a href={{adminUrl}} target=_blank >{{adminName}}</a> für den Zugriff!
|
||||||
Your user doesn't have the required RED-* roles to access this application. Please contact {{adminName}} for access!|Ihr Benutzer verfügt nicht über die erforderlichen RED- * -Rollen, um auf diese Anwendung zuzugreifen. Bitte kontaktieren Sie {{adminName}} für den Zugriff!
|
Your user doesn't have the required RED-* roles to access this application. Please contact {{adminName}} for access!|Ihr Benutzer verfügt nicht über die erforderlichen RED- * -Rollen, um auf diese Anwendung zuzugreifen. Bitte kontaktieren Sie {{adminName}} für den Zugriff!
|
||||||
Your user doesn't have the required RED-* roles to access this application. Please contact <a href={{adminUrl}} target=_blank >your admin</a> for access!|Ihr Benutzer verfügt nicht über die erforderlichen RED- * -Rollen, um auf diese Anwendung zuzugreifen. Bitte kontaktieren Sie <a href={{adminUrl}} target=_blank >Ihren Administrator</a> für den Zugriff!
|
Your user doesn't have the required RED-* roles to access this application. Please contact <a href={{adminUrl}} target=_blank >your admin</a> for access!|Ihr Benutzer verfügt nicht über die erforderlichen RED- * -Rollen, um auf diese Anwendung zuzugreifen. Bitte kontaktieren Sie <a href={{adminUrl}} target=_blank >Ihren Administrator</a> für den Zugriff!
|
||||||
|
Annotation Confirmed!|Anmerkung bestätigt!
|
||||||
|
Error confirming Annotation removal!|Fehler beim Bestätigen des Entfernens von Anmerkungen!
|
||||||
|
Selected text:|Ausgewählter Text:
|
||||||
|
Type|Art
|
||||||
|
Owner|Inhaber
|
||||||
|
Oldest|Älteste
|
||||||
|
Contains hints |Enthält Hinweise
|
||||||
|
Contains redactions |Enthält Redaktionen
|
||||||
|
Contains suggestions for redaction |Enthält Vorschläge zur Redaktion
|
||||||
|
Reviewer|Gutachter
|
||||||
|
Manage File Reviewer|File Reviewer verwalten
|
||||||
|
Save|speichern
|
||||||
|
Members|Mitglieder
|
||||||
|
Manage Project Owner and Members|Projektbesitzer und Mitglieder verwalten
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user