Pull request #299: Red ui http remove

Merge in RED/ui from red-ui-http-remove to master

* commit '9eaff7370a1d34f2a29c5068aaec546a5d29c5bd':
  fix rebase errors
  remove api module, add notifications service
  add platform search service
  add watermark service
  add viewed pages service
  update file upload service
  add smtp service
  add rules service
  add report template service
  add redaction log service
  add reanalysis service
  update manual annotation service
  add licence report service
  add general settings service
  remove unused services from api module
  add file management service
This commit is contained in:
Dan Percic 2021-10-14 22:14:19 +02:00
commit fac3fe46cb
41 changed files with 701 additions and 227 deletions

View File

@ -5,7 +5,6 @@ import { ActivatedRoute, Router } from '@angular/router';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http';
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
import { ApiModule, GeneralSettingsControllerService } from '@redaction/red-ui-http';
import { ApiPathInterceptor } from '@utils/api-path-interceptor';
import { MissingTranslationHandler, TranslateCompiler, TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { languageInitializer } from '@i18n/language.initializer';
@ -36,6 +35,7 @@ import { DatePipe } from '@shared/pipes/date.pipe';
import * as links from '../assets/help-mode/links.json';
import { HELP_DOCS, IqserHelpModeModule, MAX_RETRIES_ON_SERVER_ERROR, ServerErrorInterceptor, ToastComponent } from '@iqser/common-ui';
import { KeycloakService } from 'keycloak-angular';
import { GeneralSettingsService } from '@services/general-settings.service';
export function httpLoaderFactory(httpClient: HttpClient): PruningTranslationLoader {
return new PruningTranslationLoader(httpClient, '/assets/i18n/', '.json');
@ -64,7 +64,6 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp
FileUploadDownloadModule,
HttpClientModule,
AuthModule,
ApiModule,
AppRoutingModule,
MonacoEditorModule,
IqserHelpModeModule,
@ -121,7 +120,7 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp
provide: APP_INITIALIZER,
multi: true,
useFactory: configurationInitializer,
deps: [KeycloakService, Title, ConfigService, GeneralSettingsControllerService],
deps: [KeycloakService, Title, ConfigService, GeneralSettingsService],
},
{
provide: MONACO_PATH,

View File

@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import * as moment from 'moment';
import { TranslateService } from '@ngx-translate/core';
import { Notification, NotificationControllerService, NotificationResponse } from '@redaction/red-ui-http';
import { Notification, NotificationResponse } from '@redaction/red-ui-http';
import { DatePipe } from '@shared/pipes/date.pipe';
import { AppStateService } from '@state/app-state.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@ -9,6 +9,7 @@ import { UserService } from '@services/user.service';
import { NotificationType, NotificationTypeEnum } from '@models/notification-types';
import { notificationsTranslations } from '../../translations/notifications-translations';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { NotificationsService } from '@services/notifications.service';
@Component({
selector: 'redaction-notifications',
@ -23,12 +24,12 @@ export class NotificationsComponent {
constructor(
private readonly _translateService: TranslateService,
private readonly _userService: UserService,
private readonly _notificationControllerService: NotificationControllerService,
private readonly _notificationsService: NotificationsService,
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _datePipe: DatePipe,
) {
this._notificationControllerService.getNotifications(false).subscribe((response: NotificationResponse) => {
this._notificationsService.getNotifications(false).subscribe((response: NotificationResponse) => {
this.notifications = response.notifications.filter(notification => this._isSupportedType(notification));
this._groupNotifications(this.notifications);
this.hasUnreadNotifications = this.notifications?.filter(n => !n.readDate).length > 0;
@ -47,7 +48,7 @@ export class NotificationsComponent {
async markRead(notification: Notification, $event, isRead: boolean = true) {
$event.stopPropagation();
const ids = [`${notification.id}`];
await this._notificationControllerService.toggleNotificationRead(ids, isRead).toPromise();
await this._notificationsService.toggleNotificationRead(ids, isRead).toPromise();
if (isRead) {
notification.readDate = moment().format('YYYY-MM-DDTHH:mm:ss Z');
} else {

View File

@ -42,6 +42,10 @@ import { TrashScreenComponent } from './screens/trash/trash-screen.component';
import { AuditService } from './services/audit.service';
import { DigitalSignatureService } from './services/digital-signature.service';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { LicenseReportService } from './services/licence-report.service';
import { RulesService } from './services/rules.service';
import { SmtpConfigService } from './services/smtp-config.service';
import { WatermarkService } from './services/watermark.service';
const dialogs = [
AddEditDossierTemplateDialogComponent,
@ -92,7 +96,15 @@ const components = [
@NgModule({
declarations: [...components],
providers: [AdminDialogService, AuditService, DigitalSignatureService],
providers: [
AdminDialogService,
AuditService,
DigitalSignatureService,
LicenseReportService,
RulesService,
SmtpConfigService,
WatermarkService,
],
imports: [CommonModule, SharedModule, AdminRoutingModule, NgxChartsModule, ColorPickerModule, MonacoEditorModule],
})
export class AdminModule {}

View File

@ -1,16 +1,13 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AdminDialogService } from '../../services/admin-dialog.service';
import {
GeneralConfigurationModel,
GeneralSettingsControllerService,
SMTPConfiguration,
SmtpConfigurationControllerService,
} from '@redaction/red-ui-http';
import { GeneralConfigurationModel, SMTPConfiguration } from '@redaction/red-ui-http';
import { ConfigService } from '@services/config.service';
import { AutoUnsubscribe, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service';
import { GeneralSettingsService } from '@services/general-settings.service';
import { SmtpConfigService } from '../../services/smtp-config.service';
@Component({
selector: 'redaction-general-config-screen',
@ -34,8 +31,8 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI
private readonly _loadingService: LoadingService,
private readonly _dialogService: AdminDialogService,
private readonly _configService: ConfigService,
private readonly _smtpConfigService: SmtpConfigurationControllerService,
private readonly _generalSettingsControllerService: GeneralSettingsControllerService,
private readonly _smtpConfigService: SmtpConfigService,
private readonly _generalSettingsService: GeneralSettingsService,
) {
super();
@ -110,8 +107,8 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI
const configFormValues = this.configForm.getRawValue();
await this._generalSettingsControllerService.updateGeneralConfigurations(configFormValues).toPromise();
this._initialGeneralConfiguration = await this._generalSettingsControllerService.getGeneralConfigurations().toPromise();
await this._generalSettingsService.updateGeneralConfigurations(configFormValues).toPromise();
this._initialGeneralConfiguration = await this._generalSettingsService.getGeneralConfigurations().toPromise();
this._configService.updateDisplayName(this._initialGeneralConfiguration.displayName);
this._loadingService.stop();
}
@ -141,7 +138,7 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI
private async _loadData() {
this._loadingService.start();
try {
this._initialGeneralConfiguration = await this._generalSettingsControllerService.getGeneralConfigurations().toPromise();
this._initialGeneralConfiguration = await this._generalSettingsService.getGeneralConfigurations().toPromise();
this.configForm.patchValue(this._initialGeneralConfiguration, { emitEvent: false });
} catch (e) {}

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { LicenseReport, LicenseReportControllerService } from '@redaction/red-ui-http';
import { LicenseReport } from '@redaction/red-ui-http';
import { ConfigService } from '@services/config.service';
import * as moment from 'moment';
import { TranslateService } from '@ngx-translate/core';
@ -7,6 +7,7 @@ import { ButtonConfig, IconButtonTypes, LoadingService } from '@iqser/common-ui'
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service';
import { RouterHistoryService } from '@services/router-history.service';
import { LicenseReportService } from '../../services/licence-report.service';
@Component({
selector: 'redaction-license-information-screen',
@ -47,7 +48,7 @@ export class LicenseInformationScreenComponent implements OnInit {
private readonly _loadingService: LoadingService,
readonly routerHistoryService: RouterHistoryService,
private readonly _translateService: TranslateService,
private readonly _licenseReportController: LicenseReportControllerService,
private readonly _licenseReportService: LicenseReportService,
) {
_loadingService.start();
}
@ -68,15 +69,15 @@ export class LicenseInformationScreenComponent implements OnInit {
endDate: endDate.toDate(),
};
const promises = [
this._licenseReportController.licenseReport(currentConfig).toPromise(),
this._licenseReportController.licenseReport({}).toPromise(),
this._licenseReportService.licenseReport(currentConfig).toPromise(),
this._licenseReportService.licenseReport({}).toPromise(),
];
if (endDate.isBefore(moment())) {
const unlicensedConfig = {
startDate: endDate.toDate(),
};
promises.push(this._licenseReportController.licenseReport(unlicensedConfig).toPromise());
promises.push(this._licenseReportService.licenseReport(unlicensedConfig).toPromise());
}
Promise.all(promises).then(reports => {
@ -131,7 +132,7 @@ export class LicenseInformationScreenComponent implements OnInit {
}
promises.push(
this._licenseReportController
this._licenseReportService
.licenseReport({
startDate: moment(`01-${m + 1}-${y}`, 'DD-MM-YYYY').toDate(),
endDate: moment(`01-${nm + 1}-${ny}`, 'DD-MM-YYYY').toDate(),

View File

@ -1,7 +1,7 @@
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { AppStateService } from '@state/app-state.service';
import { PlaceholdersResponse, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http';
import { PlaceholdersResponse, ReportTemplate } from '@redaction/red-ui-http';
import { download } from '@utils/file-download-utils';
import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui';
import { PermissionsService } from '@services/permissions.service';
@ -13,6 +13,7 @@ import { removeBraces } from '@utils/functions';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { ReportTemplateService } from '@services/report-template.service';
interface Placeholder {
placeholder: string;
@ -38,7 +39,7 @@ export class ReportsScreenComponent implements OnInit {
private readonly _activatedRoute: ActivatedRoute,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _reportTemplateService: ReportTemplateControllerService,
private readonly _reportTemplateService: ReportTemplateService,
private readonly _dialogService: AdminDialogService,
private readonly _toaster: Toaster,
private readonly _loadingService: LoadingService,
@ -120,7 +121,7 @@ export class ReportsScreenComponent implements OnInit {
}
private async _deleteTemplate(template: ReportTemplate) {
await this._reportTemplateService.deleteTemplate(template.dossierTemplateId, template.templateId).toPromise();
await this._reportTemplateService.delete(template.dossierTemplateId, template.templateId).toPromise();
await this._loadReportTemplates();
}

View File

@ -1,6 +1,7 @@
.editor-container {
width: 100%;
padding: 15px;
padding-top: 15px;
padding-left: 15px;
}
ngx-monaco-editor {

View File

@ -1,6 +1,5 @@
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { PermissionsService } from '@services/permissions.service';
import { RulesControllerService } from '@redaction/red-ui-http';
import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { TranslateService } from '@ngx-translate/core';
import { saveAs } from 'file-saver';
@ -9,6 +8,7 @@ import { ActivatedRoute } from '@angular/router';
import { AppStateService } from '@state/app-state.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { RulesService } from '../../services/rules.service';
import ICodeEditor = monaco.editor.ICodeEditor;
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions;
@ -17,6 +17,7 @@ import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorCon
selector: 'redaction-rules-screen',
templateUrl: './rules-screen.component.html',
styleUrls: ['./rules-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class RulesScreenComponent extends ComponentHasChanges implements OnInit {
readonly iconButtonTypes = IconButtonTypes;
@ -38,7 +39,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
constructor(
readonly permissionsService: PermissionsService,
private readonly _rulesControllerService: RulesControllerService,
private readonly _rulesService: RulesService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _toaster: Toaster,
@ -88,7 +89,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
async save(): Promise<void> {
this._loadingService.start();
await this._rulesControllerService
await this._rulesService
.uploadRules({
rules: this._codeEditor.getModel().getValue(),
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
@ -148,8 +149,8 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
private async _initialize() {
this._loadingService.start();
await this._rulesControllerService
.downloadRules(this._dossierTemplatesService.activeDossierTemplateId)
await this._rulesService
.download(this._dossierTemplatesService.activeDossierTemplateId)
.toPromise()
.then(
rules => {

View File

@ -5,12 +5,13 @@ import { environment } from '@environments/environment';
import { HttpClient } from '@angular/common/http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { WatermarkControllerService, WatermarkModel } from '@redaction/red-ui-http';
import { WatermarkModel } from '@redaction/red-ui-http';
import { ActivatedRoute } from '@angular/router';
import { BASE_HREF } from '../../../../tokens';
import { stampPDFPage } from '@utils/page-stamper';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { WatermarkService } from '../../services/watermark.service';
export const DEFAULT_WATERMARK: WatermarkModel = {
text: null,
@ -37,7 +38,7 @@ export class WatermarkScreenComponent implements OnInit {
constructor(
readonly permissionsService: PermissionsService,
@Inject(BASE_HREF) private readonly _baseHref: string,
private readonly _watermarkControllerService: WatermarkControllerService,
private readonly _watermarkService: WatermarkService,
private readonly _toaster: Toaster,
private readonly _http: HttpClient,
private readonly _changeDetectorRef: ChangeDetectorRef,
@ -79,8 +80,8 @@ export class WatermarkScreenComponent implements OnInit {
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const observable = watermark.text
? this._watermarkControllerService.saveWatermark(watermark, dossierTemplateId)
: this._watermarkControllerService.deleteWatermark(dossierTemplateId);
? this._watermarkService.saveWatermark(watermark, dossierTemplateId)
: this._watermarkService.deleteWatermark(dossierTemplateId);
observable.toPromise().then(
() => {
@ -108,7 +109,7 @@ export class WatermarkScreenComponent implements OnInit {
}
private _loadWatermark() {
this._watermarkControllerService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe(
this._watermarkService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe(
watermark => {
this._watermark = watermark;
this.configForm.setValue({ ...this._watermark });

View File

@ -0,0 +1,24 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, QueryParam, RequiredParam, Validate } from '@iqser/common-ui';
import { LicenseReport, LicenseReportRequest } from '@redaction/red-ui-http';
@Injectable()
export class LicenseReportService extends GenericService<LicenseReport> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'report');
}
@Validate()
licenseReport(@RequiredParam() body: LicenseReportRequest, limit?: number, offset?: number) {
const queryParams: QueryParam[] = [];
if (limit) {
queryParams.push({ key: 'limit', value: limit });
}
if (offset) {
queryParams.push({ key: 'offset', value: offset });
}
return this._post(body, `${this._defaultModelPath}/license`, queryParams);
}
}

View File

@ -0,0 +1,20 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, RequiredParam, Validate } from '@iqser/common-ui';
import { Rules } from '@redaction/red-ui-http';
@Injectable()
export class RulesService extends GenericService<Rules> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'rules');
}
@Validate()
download(@RequiredParam() dossierTemplateId: string) {
return this._getOne([dossierTemplateId]);
}
@Validate()
uploadRules(@RequiredParam() body: Rules) {
return this._post<unknown>(body);
}
}

View File

@ -0,0 +1,24 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, RequiredParam, Validate } from '@iqser/common-ui';
import { SMTPConfiguration } from '@redaction/red-ui-http';
@Injectable()
export class SmtpConfigService extends GenericService<unknown> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'configuration');
}
@Validate()
updateSMTPConfiguration(@RequiredParam() body: SMTPConfiguration) {
return this._post(body, `${this._defaultModelPath}/smtp`);
}
@Validate()
testSMTPConfiguration(@RequiredParam() body: SMTPConfiguration) {
return this._post(body, `${this._defaultModelPath}/smtp/test`);
}
getCurrentSMTPConfiguration() {
return this._getOne(['smtp']);
}
}

View File

@ -0,0 +1,25 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, RequiredParam, Validate } from '@iqser/common-ui';
import { WatermarkModel } from '@redaction/red-ui-http';
@Injectable()
export class WatermarkService extends GenericService<WatermarkModel> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'watermark');
}
@Validate()
saveWatermark(@RequiredParam() body: WatermarkModel, @RequiredParam() dossierTemplateId: string) {
return this._post(body, `${this._defaultModelPath}/${dossierTemplateId}`);
}
@Validate()
deleteWatermark(@RequiredParam() dossierTemplateId: string) {
return super.delete({}, `${this._defaultModelPath}/${dossierTemplateId}`);
}
@Validate()
getWatermark(@RequiredParam() dossierTemplateId: string) {
return this._getOne([dossierTemplateId]);
}
}

View File

@ -1,9 +1,10 @@
import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core';
import { PermissionsService } from '@services/permissions.service';
import { PageRange, ReanalysisControllerService } from '@redaction/red-ui-http';
import { PageRange } from '@redaction/red-ui-http';
import { InputWithActionComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { File } from '@models/file/file';
import { ReanalysisService } from '@services/reanalysis.service';
@Component({
selector: 'redaction-page-exclusion',
@ -19,7 +20,7 @@ export class PageExclusionComponent implements OnChanges {
constructor(
readonly permissionsService: PermissionsService,
private readonly _reanalysisControllerService: ReanalysisControllerService,
private readonly _reanalysisService: ReanalysisService,
private readonly _toaster: Toaster,
private readonly _loadingService: LoadingService,
) {}
@ -56,7 +57,7 @@ export class PageExclusionComponent implements OnChanges {
endPage,
};
});
await this._reanalysisControllerService
await this._reanalysisService
.excludePages(
{
pageRanges: pageRanges,
@ -75,7 +76,7 @@ export class PageExclusionComponent implements OnChanges {
async includePagesRange(range: PageRange): Promise<void> {
this._loadingService.start();
await this._reanalysisControllerService
await this._reanalysisService
.includePages(
{
pageRanges: [range],

View File

@ -1,10 +1,11 @@
import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core';
import { ViewedPages, ViewedPagesControllerService } from '@redaction/red-ui-http';
import { ViewedPages } from '@redaction/red-ui-http';
import { AppStateService } from '@state/app-state.service';
import { PermissionsService } from '@services/permissions.service';
import { ConfigService } from '@services/config.service';
import { Subscription } from 'rxjs';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { ViewedPagesService } from '../../shared/services/viewed-pages.service';
@Component({
selector: 'redaction-page-indicator',
@ -24,7 +25,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy {
private _subscription: Subscription;
constructor(
private readonly _viewedPagesControllerService: ViewedPagesControllerService,
private readonly _viewedPagesService: ViewedPagesService,
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _configService: ConfigService,
@ -105,7 +106,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy {
// }
private _markPageRead() {
this._viewedPagesControllerService
this._viewedPagesService
.addPage({ page: this.number }, this._dossiersService.activeDossierId, this._appStateService.activeFileId)
.subscribe(() => {
if (this.activePage) {
@ -117,7 +118,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy {
}
private _markPageUnread() {
this._viewedPagesControllerService
this._viewedPagesService
.removePage(this._dossiersService.activeDossierId, this._appStateService.activeFileId, this.number)
.subscribe(() => {
this.viewedPages?.pages?.splice(

View File

@ -1,18 +1,13 @@
import { Component } from '@angular/core';
import { MatDialogRef } from '@angular/material/dialog';
import {
DossierRequest,
DownloadFileType,
IDossierTemplate,
ReportTemplate,
ReportTemplateControllerService,
} from '@redaction/red-ui-http';
import { DossierRequest, DownloadFileType, IDossierTemplate, ReportTemplate } from '@redaction/red-ui-http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import * as moment from 'moment';
import { downloadTypesTranslations } from '../../../../translations/download-types-translations';
import { IconButtonTypes } from '@iqser/common-ui';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { ReportTemplateService } from '@services/report-template.service';
@Component({
templateUrl: './add-dossier-dialog.component.html',
@ -34,7 +29,7 @@ export class AddDossierDialogComponent {
private readonly _dossiersService: DossiersService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _formBuilder: FormBuilder,
private readonly _reportTemplateController: ReportTemplateControllerService,
private readonly _reportTemplateController: ReportTemplateService,
readonly dialogRef: MatDialogRef<AddDossierDialogComponent>,
) {
this._filterInvalidDossierTemplates();

View File

@ -12,7 +12,7 @@ import {
TableColumnConfig,
TitleColors,
} from '@iqser/common-ui';
import { FileManagementControllerService, IFile } from '@redaction/red-ui-http';
import { IFile } from '@redaction/red-ui-http';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import * as moment from 'moment';
import { ConfigService } from '@services/config.service';
@ -22,6 +22,7 @@ import { distinctUntilChanged, map } from 'rxjs/operators';
import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
import { AppStateService } from '@state/app-state.service';
import { FilesService } from '@services/entity-services/files.service';
import { FileManagementService } from '../../../shared/services/file-management.service';
interface FileListItem extends IFile, IListable {
readonly canRestore: boolean;
@ -55,7 +56,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
constructor(
protected readonly _injector: Injector,
private readonly _fileManagementController: FileManagementControllerService,
private readonly _fileManagementService: FileManagementService,
private readonly _appStateService: AppStateService,
private readonly _filesService: FilesService,
private readonly _loadingService: LoadingService,
@ -113,7 +114,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
private async _restore(files: FileListItem[]): Promise<void> {
const fileIds = files.map(f => f.fileId);
await this._fileManagementController.restoreFiles(fileIds, this.dossier.id).toPromise();
await this._fileManagementService.restore(fileIds, this.dossier.id).toPromise();
this._removeFromList(fileIds);
await this._appStateService.reloadActiveDossierFiles();
this.updateDossier.emit();
@ -121,7 +122,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
private async _hardDelete(files: FileListItem[]) {
const fileIds = files.map(f => f.fileId);
await this._fileManagementController.hardDeleteFile(this.dossier.id, fileIds).toPromise();
await this._fileManagementService.hardDelete(this.dossier.id, fileIds).toPromise();
this._removeFromList(fileIds);
this.updateDossier.emit();
}

View File

@ -1,10 +1,11 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { DownloadFileType, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http';
import { DownloadFileType, ReportTemplate } from '@redaction/red-ui-http';
import { FormBuilder, FormGroup } from '@angular/forms';
import { Dossier } from '@state/model/dossier';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { downloadTypesTranslations } from '../../../../../translations/download-types-translations';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { ReportTemplateService } from '@services/report-template.service';
@Component({
selector: 'redaction-edit-dossier-download-package',
@ -24,7 +25,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS
constructor(
private readonly _dossiersService: DossiersService,
private readonly _reportTemplateController: ReportTemplateControllerService,
private readonly _reportTemplateController: ReportTemplateService,
private readonly _formBuilder: FormBuilder,
) {}

View File

@ -39,6 +39,7 @@ import { AnnotationsListComponent } from './components/file-workload/components/
import { AnnotationSourceComponent } from './components/file-workload/components/annotation-source/annotation-source.component';
import { OverlayModule } from '@angular/cdk/overlay';
import { SharedDossiersModule } from './shared/shared-dossiers.module';
import { PlatformSearchService } from './shared/services/platform-search.service';
const screens = [FilePreviewScreenComponent, SearchScreenComponent];
@ -84,6 +85,7 @@ const services = [
PdfViewerDataService,
AnnotationDrawService,
AnnotationProcessingService,
PlatformSearchService,
];
@NgModule({

View File

@ -1,6 +1,5 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { AppStateService } from '@state/app-state.service';
import { FileManagementControllerService, ReanalysisControllerService } from '@redaction/red-ui-http';
import { PermissionsService } from '@services/permissions.service';
import { File } from '@models/file/file';
import { FileActionService } from '../../../../shared/services/file-action.service';
@ -10,8 +9,10 @@ import { CircleButtonTypes, ConfirmationDialogInput, ListingService, LoadingServ
import { TranslateService } from '@ngx-translate/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { Dossier } from '@state/model/dossier';
import { LongPressEvent } from '../../../../../shared/directives/long-press.directive';
import { UserPreferenceService } from '../../../../../../services/user-preference.service';
import { LongPressEvent } from '@shared/directives/long-press.directive';
import { UserPreferenceService } from '@services/user-preference.service';
import { FileManagementService } from '../../../../shared/services/file-management.service';
import { ReanalysisService } from '@services/reanalysis.service';
@Component({
selector: 'redaction-dossier-overview-bulk-actions',
@ -29,8 +30,8 @@ export class DossierOverviewBulkActionsComponent {
constructor(
private readonly _appStateService: AppStateService,
private readonly _dialogService: DossiersDialogService,
private readonly _fileManagementControllerService: FileManagementControllerService,
private readonly _reanalysisControllerService: ReanalysisControllerService,
private readonly _fileManagementService: FileManagementService,
private readonly _reanalysisService: ReanalysisService,
private readonly _permissionsService: PermissionsService,
private readonly _fileActionService: FileActionService,
private readonly _loadingService: LoadingService,
@ -134,8 +135,8 @@ export class DossierOverviewBulkActionsComponent {
}),
async () => {
this._loadingService.start();
await this._fileManagementControllerService
.deleteFiles(
await this._fileManagementService
.delete(
this.selectedFiles.map(item => item.fileId),
this.dossier.dossierId,
)
@ -158,7 +159,7 @@ export class DossierOverviewBulkActionsComponent {
reanalyse() {
const fileIds = this.selectedFiles.filter(file => file.analysisRequired).map(file => file.fileId);
this._performBulkAction(this._reanalysisControllerService.reanalyzeFilesForDossier(fileIds, this.dossier.id));
this._performBulkAction(this._reanalysisService.reanalyzeFilesForDossier(fileIds, this.dossier.id));
}
ocr() {

View File

@ -28,7 +28,7 @@ import { PermissionsService } from '@services/permissions.service';
import { timer } from 'rxjs';
import { UserPreferenceService } from '@services/user-preference.service';
import { UserService } from '@services/user.service';
import { FileManagementControllerService, FileStatus, List } from '@redaction/red-ui-http';
import { FileStatus, List } from '@redaction/red-ui-http';
import { PdfViewerDataService } from '../../services/pdf-viewer-data.service';
import { download } from '@utils/file-download-utils';
import { ViewMode } from '@models/file/view-mode';
@ -44,6 +44,7 @@ import { User } from '@models/user';
import { FilesService } from '@services/entity-services/files.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { Dossier } from '@state/model/dossier';
import { FileManagementService } from '../../shared/services/file-management.service';
import Annotation = Core.Annotations.Annotation;
const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f'];
@ -99,7 +100,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
private readonly _fileDownloadService: PdfViewerDataService,
private readonly _filesService: FilesService,
private readonly _ngZone: NgZone,
private readonly _fileManagementControllerService: FileManagementControllerService,
private readonly _fileManagementService: FileManagementService,
private readonly _loadingService: LoadingService,
private readonly _filterService: FilterService,
private readonly _translateService: TranslateService,
@ -515,8 +516,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
}
downloadOriginalFile() {
this.addSubscription = this._fileManagementControllerService
.downloadOriginalFile(this.fileData.file.dossierId, this.fileId, true, this.fileData.file.cacheIdentifier, 'response')
this.addSubscription = this._fileManagementService
.downloadOriginalFile(this.fileData.file.dossierId, this.fileId, 'response', true, this.fileData.file.cacheIdentifier)
.subscribe(data => {
download(data, this.fileData.file.filename);
});

View File

@ -9,7 +9,7 @@ import {
SearchPositions,
TableColumnConfig,
} from '@iqser/common-ui';
import { List, MatchedDocument, SearchControllerService, SearchResult } from '@redaction/red-ui-http';
import { List, MatchedDocument, SearchResult } from '@redaction/red-ui-http';
import { BehaviorSubject, Observable } from 'rxjs';
import { debounceTime, map, skip, switchMap, tap } from 'rxjs/operators';
import { ActivatedRoute, Router } from '@angular/router';
@ -18,6 +18,7 @@ import { fileStatusTranslations } from '../../translations/file-status-translati
import { TranslateService } from '@ngx-translate/core';
import { RouterHistoryService } from '@services/router-history.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { PlatformSearchService } from '../../shared/services/platform-search.service';
interface ListItem extends IListable {
readonly dossierId: string;
@ -69,7 +70,7 @@ export class SearchScreenComponent extends ListingComponent<ListItem> implements
private readonly _dossiersService: DossiersService,
readonly routerHistoryService: RouterHistoryService,
private readonly _translateService: TranslateService,
private readonly _searchControllerService: SearchControllerService,
private readonly _platformSearchService: PlatformSearchService,
) {
super(_injector);
this.searchService.skip = true;
@ -108,7 +109,7 @@ export class SearchScreenComponent extends ListingComponent<ListItem> implements
}
private _search(searchInput: SearchInput): Observable<SearchResult> {
return this._searchControllerService.search({
return this._platformSearchService.search({
dossierIds: [...searchInput.dossierIds],
queryString: searchInput.query ?? '',
page: 1,

View File

@ -29,7 +29,7 @@ export class AnnotationActionsService {
$event?.stopPropagation();
annotations.forEach(annotation => {
this._processObsAndEmit(
this._manualAnnotationService.approveRequest(annotation.id, annotation.isModifyDictionary),
this._manualAnnotationService.approve(annotation.id, annotation.isModifyDictionary),
annotation,
annotationsChanged,
);
@ -47,7 +47,7 @@ export class AnnotationActionsService {
this._dialogService.openDialog('forceRedaction', $event, null, (request: ForceRedactionRequest) => {
annotations.forEach(annotation => {
this._processObsAndEmit(
this._manualAnnotationService.forceRedaction({
this._manualAnnotationService.force({
...request,
annotationId: annotation.id,
}),
@ -98,7 +98,7 @@ export class AnnotationActionsService {
this._dialogService.openDialog('recategorizeImage', $event, annotations, (data: { type: string; comment: string }) => {
annotations.forEach(annotation => {
this._processObsAndEmit(
this._manualAnnotationService.recategorizeImage(annotation.annotationId, data.type, data.comment),
this._manualAnnotationService.recategorizeImg(annotation.annotationId, data.type, data.comment),
annotation,
annotationsChanged,
);

View File

@ -1,11 +1,12 @@
import { Injectable } from '@angular/core';
import { Core, WebViewerInstance } from '@pdftron/webviewer';
import { Rectangle, RedactionLogControllerService, SectionGrid, SectionRectangle } from '@redaction/red-ui-http';
import { Rectangle, SectionGrid, SectionRectangle } from '@redaction/red-ui-http';
import { hexToRgb } from '@utils/functions';
import { AppStateService } from '@state/app-state.service';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { UserPreferenceService } from '@services/user-preference.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { RedactionLogService } from './redaction-log.service';
import Annotation = Core.Annotations.Annotation;
@Injectable()
@ -13,7 +14,7 @@ export class AnnotationDrawService {
constructor(
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _redactionLogControllerService: RedactionLogControllerService,
private readonly _redactionLogService: RedactionLogService,
private readonly _userPreferenceService: UserPreferenceService,
) {}
@ -29,7 +30,7 @@ export class AnnotationDrawService {
annotationManager.drawAnnotationsFromList(annotations);
if (this._userPreferenceService.areDevFeaturesEnabled) {
this._redactionLogControllerService
this._redactionLogService
.getSectionGrid(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
.subscribe(sectionGrid => {
this._drawSections(activeViewer, sectionGrid);

View File

@ -1,8 +1,17 @@
import { Injectable } from '@angular/core';
import { Injectable, Injector } from '@angular/core';
import { AppStateService } from '@state/app-state.service';
import { AddRedactionRequest, ForceRedactionRequest, ManualRedactionControllerService } from '@redaction/red-ui-http';
import {
AddRedactionRequest,
ApproveRequest,
CommentResponse,
ForceRedactionRequest,
ImageRecategorizationRequest,
LegalBasisChangeRequest,
ManualAddResponse,
RemoveRedactionRequest,
} from '@redaction/red-ui-http';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { ErrorMessageService, Toaster } from '@iqser/common-ui';
import { ErrorMessageService, GenericService, RequiredParam, Toaster, Validate } from '@iqser/common-ui';
import { TranslateService } from '@ngx-translate/core';
import { tap } from 'rxjs/operators';
import { UserService } from '@services/user.service';
@ -13,7 +22,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossiersService } from '@services/entity-services/dossiers.service';
@Injectable()
export class ManualAnnotationService {
export class ManualAnnotationService extends GenericService<ManualAddResponse> {
CONFIG: {
[key in AnnotationActionMode]: string;
};
@ -24,10 +33,11 @@ export class ManualAnnotationService {
private readonly _userService: UserService,
private readonly _translateService: TranslateService,
private readonly _toaster: Toaster,
private readonly _manualRedactionControllerService: ManualRedactionControllerService,
private readonly _permissionsService: PermissionsService,
private readonly _errorMessageService: ErrorMessageService,
protected readonly _injector: Injector,
) {
super(_injector, 'manualRedaction');
this.CONFIG = {
add: 'addRedaction',
'recategorize-image': 'recategorizeImage',
@ -47,17 +57,8 @@ export class ManualAnnotationService {
_makeRequest(mode: AnnotationActionMode, body: any, secondParam: any = null, modifyDictionary = false) {
const obs = !secondParam
? this._manualRedactionControllerService[this.CONFIG[mode]](
body,
this._dossiersService.activeDossierId,
this._appStateService.activeFileId,
)
: this._manualRedactionControllerService[this.CONFIG[mode]](
body,
secondParam,
this._dossiersService.activeDossierId,
this._appStateService.activeFileId,
);
? this[this.CONFIG[mode]](body, this._dossiersService.activeDossierId, this._appStateService.activeFileId)
: this[this.CONFIG[mode]](body, secondParam, this._dossiersService.activeDossierId, this._appStateService.activeFileId);
return obs.pipe(
tap(
@ -72,25 +73,26 @@ export class ManualAnnotationService {
);
}
// Comments
// this wraps /manualRedaction/comment/add
addComment(comment: string, annotationId: string) {
return this._manualRedactionControllerService.addComment(
{ text: comment },
annotationId,
this._dossiersService.activeDossierId,
this._appStateService.activeFileId,
);
@Validate()
addComment(
@RequiredParam() comment: string,
@RequiredParam() annotationId: string,
dossierId = this._dossiersService.activeDossierId,
fileId = this._appStateService.activeFileId,
) {
const url = `${this._defaultModelPath}/comment/add/${dossierId}/${fileId}/${annotationId}`;
return this._post<CommentResponse>({ text: comment }, url);
}
// this wraps /manualRedaction/comment/undo
deleteComment(commentId: string, annotationId: string) {
return this._manualRedactionControllerService.undoComment(
annotationId,
commentId,
this._dossiersService.activeDossierId,
this._appStateService.activeFileId,
);
@Validate()
deleteComment(
@RequiredParam() commentId: string,
@RequiredParam() annotationId: string,
dossierId = this._dossiersService.activeDossierId,
fileId = this._appStateService.activeFileId,
) {
const url = `${this._defaultModelPath}/comment/undo/${dossierId}/${fileId}/${annotationId}/${commentId}`;
return super.delete({}, url);
}
addRecommendation(annotation: AnnotationWrapper) {
@ -116,7 +118,7 @@ export class ManualAnnotationService {
// this wraps
// /manualRedaction/redaction/recategorize
// /manualRedaction/request/recategorize
recategorizeImage(annotationId: string, type: string, comment: string) {
recategorizeImg(annotationId: string, type: string, comment: string) {
const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'recategorize-image' : 'request-image-recategorization';
return this._makeRequest(mode, { annotationId, type, comment });
}
@ -132,14 +134,14 @@ export class ManualAnnotationService {
// this wraps
// /manualRedaction/redaction/force
// /manualRedaction/request/force
forceRedaction(request: ForceRedactionRequest) {
force(request: ForceRedactionRequest) {
const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'force-redaction' : 'request-force-redaction';
return this._makeRequest(mode, request);
}
// this wraps
// /manualRedaction/approve
approveRequest(annotationId: string, addToDictionary: boolean = false) {
approve(annotationId: string, addToDictionary: boolean = false) {
// for only here - approve the request
return this._makeRequest('approve', { addOrRemoveFromDictionary: addToDictionary }, annotationId, addToDictionary);
}
@ -213,6 +215,109 @@ export class ManualAnnotationService {
}
}
@Validate()
addRedaction(@RequiredParam() body: AddRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/redaction/add/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
recategorizeImage(
@RequiredParam() body: ImageRecategorizationRequest,
@RequiredParam() dossierId: string,
@RequiredParam() fileId: string,
) {
const url = `${this._defaultModelPath}/redaction/recategorize/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
requestImageRecategorization(
@RequiredParam() body: ImageRecategorizationRequest,
@RequiredParam() dossierId: string,
@RequiredParam() fileId: string,
) {
const url = `${this._defaultModelPath}/request/recategorize/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
legalBasisChange(@RequiredParam() body: LegalBasisChangeRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/redaction/legalBasisChange/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
requestLegalBasisChange(
@RequiredParam() body: LegalBasisChangeRequest,
@RequiredParam() dossierId: string,
@RequiredParam() fileId: string,
) {
const url = `${this._defaultModelPath}/request/legalBasis/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
requestRemoveRedaction(
@RequiredParam() body: RemoveRedactionRequest,
@RequiredParam() dossierId: string,
@RequiredParam() fileId: string,
) {
const url = `${this._defaultModelPath}/request/remove/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
approveRequest(
@RequiredParam() body: ApproveRequest,
@RequiredParam() annotationId: string,
@RequiredParam() dossierId: string,
@RequiredParam() fileId: string,
) {
const url = `${this._defaultModelPath}/approve/${dossierId}/${fileId}`;
return this._post<unknown>(body, url);
}
@Validate()
declineRequest(@RequiredParam() annotationId: string, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/decline/${dossierId}/${fileId}/${annotationId}`;
return this._post<unknown>({}, url);
}
@Validate()
undo(@RequiredParam() annotationId: string, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/undo/${dossierId}/${fileId}/${annotationId}`;
return super.delete({}, url);
}
@Validate()
removeRedaction(@RequiredParam() body: RemoveRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/redaction/remove/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
requestAddRedaction(@RequiredParam() body: AddRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/request/add/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
forceRedaction(@RequiredParam() body: ForceRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
const url = `${this._defaultModelPath}/redaction/force/${dossierId}/${fileId}`;
return this._post(body, url);
}
@Validate()
requestForceRedaction(
@RequiredParam() body: ForceRedactionRequest,
@RequiredParam() dossierId: string,
@RequiredParam() fileId: string,
) {
const url = `${this._defaultModelPath}/request/force/${dossierId}/${fileId}`;
return this._post(body, url);
}
private _getMessage(mode: AnnotationActionMode, modifyDictionary?: boolean, error: boolean = false) {
const type = modifyDictionary ? 'dictionary' : 'manual-redaction';
const resultType = error ? 'error' : 'success';

View File

@ -1,17 +1,14 @@
import { Injectable } from '@angular/core';
import { forkJoin, Observable, of } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';
import {
FileManagementControllerService,
ManualRedactionControllerService,
RedactionLogControllerService,
ViewedPagesControllerService,
} from '@redaction/red-ui-http';
import { FileDataModel } from '@models/file/file-data.model';
import { AppStateService } from '@state/app-state.service';
import { PermissionsService } from '@services/permissions.service';
import { File } from '@models/file/file';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { FileManagementService } from '../shared/services/file-management.service';
import { RedactionLogService } from './redaction-log.service';
import { ViewedPagesService } from '../shared/services/viewed-pages.service';
@Injectable()
export class PdfViewerDataService {
@ -19,21 +16,18 @@ export class PdfViewerDataService {
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _permissionsService: PermissionsService,
private readonly _man: ManualRedactionControllerService,
private readonly _fileManagementControllerService: FileManagementControllerService,
private readonly _redactionLogControllerService: RedactionLogControllerService,
private readonly _viewedPagesControllerService: ViewedPagesControllerService,
private readonly _fileManagementService: FileManagementService,
private readonly _redactionLogService: RedactionLogService,
private readonly _viewedPagesService: ViewedPagesService,
) {}
loadActiveFileRedactionLog() {
return this._redactionLogControllerService
.getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
.pipe(
tap(
redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page),
catchError(() => of({})),
),
);
return this._redactionLogService.getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId).pipe(
tap(
redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page),
catchError(() => of({})),
),
);
}
loadActiveFileData(): Observable<FileDataModel> {
@ -48,7 +42,7 @@ export class PdfViewerDataService {
getViewedPagesForActiveFile() {
if (this._permissionsService.canMarkPagesAsViewed()) {
return this._viewedPagesControllerService
return this._viewedPagesService
.getViewedPages(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
.pipe(catchError(() => of({ pages: [] })));
}
@ -56,6 +50,6 @@ export class PdfViewerDataService {
}
downloadOriginalFile(file: File): Observable<any> {
return this._fileManagementControllerService.downloadOriginalFile(file.dossierId, file.fileId, true, file.cacheIdentifier, 'body');
return this._fileManagementService.downloadOriginalFile(file.dossierId, file.fileId, 'body', true, file.cacheIdentifier);
}
}

View File

@ -0,0 +1,27 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, QueryParam, RequiredParam, Validate } from '@iqser/common-ui';
import { RedactionLog, SectionGrid } from '@redaction/red-ui-http';
@Injectable({
providedIn: 'root',
})
export class RedactionLogService extends GenericService<unknown> {
constructor(protected readonly _injector: Injector) {
super(_injector, '');
}
@Validate()
getRedactionLog(@RequiredParam() dossierId: string, @RequiredParam() fileId: string, withManualRedactions?: boolean) {
const queryParams: QueryParam[] = [];
if (withManualRedactions) {
queryParams.push({ key: 'withManualRedactions', value: withManualRedactions });
}
return this._getOne<RedactionLog>([dossierId, fileId], 'redactionLog', queryParams);
}
@Validate()
getSectionGrid(@RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
return this._getOne<SectionGrid>([dossierId, fileId], 'sectionGrid');
}
}

View File

@ -13,7 +13,7 @@ import {
StatusBarConfig,
Toaster,
} from '@iqser/common-ui';
import { FileManagementControllerService, FileStatus } from '@redaction/red-ui-http';
import { FileStatus } from '@redaction/red-ui-http';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service';
import { filter } from 'rxjs/operators';
@ -21,6 +21,7 @@ import { UserPreferenceService } from '@services/user-preference.service';
import { LongPressEvent } from '@shared/directives/long-press.directive';
import { FileActionService } from '../../services/file-action.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { FileManagementService } from '../../services/file-management.service';
@Component({
selector: 'redaction-file-actions',
@ -66,7 +67,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
private readonly _dialogService: DossiersDialogService,
private readonly _fileActionService: FileActionService,
private readonly _loadingService: LoadingService,
private readonly _fileManagementControllerService: FileManagementControllerService,
private readonly _fileManagementService: FileManagementService,
private readonly _userService: UserService,
private readonly _toaster: Toaster,
private readonly _userPreferenceService: UserPreferenceService,
@ -135,8 +136,8 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
}),
async () => {
this._loadingService.start();
await this._fileManagementControllerService
.deleteFiles([this.file.fileId], this.file.dossierId)
await this._fileManagementService
.delete([this.file.fileId], this.file.dossierId)
.toPromise()
.catch(error => {
this._toaster.error(_('error.http.generic'), { params: error });

View File

@ -1,7 +1,6 @@
import { Injectable } from '@angular/core';
import { AppStateService } from '@state/app-state.service';
import { UserService } from '@services/user.service';
import { ReanalysisControllerService } from '@redaction/red-ui-http';
import { File } from '@models/file/file';
import { PermissionsService } from '@services/permissions.service';
import { DossiersDialogService } from '../../services/dossiers-dialog.service';
@ -9,6 +8,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FilesService } from '@services/entity-services/files.service';
import { ConfirmationDialogInput } from '@iqser/common-ui';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { ReanalysisService } from '@services/reanalysis.service';
@Injectable()
export class FileActionService {
@ -17,17 +17,17 @@ export class FileActionService {
private readonly _permissionsService: PermissionsService,
private readonly _userService: UserService,
private readonly _fileService: FilesService,
private readonly _reanalysisControllerService: ReanalysisControllerService,
private readonly _reanalysisService: ReanalysisService,
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
) {}
reanalyseFile(file = this._appStateService.activeFile) {
return this._reanalysisControllerService.reanalyzeFile(this._dossiersService.activeDossier.id, file.fileId, true);
return this._reanalysisService.reanalyzeFilesForDossier([file.fileId], this._dossiersService.activeDossier.id, true);
}
toggleAnalysis(file = this._appStateService.activeFile) {
return this._reanalysisControllerService.toggleAnalysis(file.dossierId, file.fileId, !file.excluded);
return this._reanalysisService.toggleAnalysis(file.dossierId, file.fileId, !file.excluded);
}
async assignToMe(files?: File[], callback?: Function) {
@ -78,7 +78,7 @@ export class FileActionService {
}
ocrFiles(files: File[]) {
return this._reanalysisControllerService.ocrFiles(
return this._reanalysisService.ocrFiles(
files.map(f => f.fileId),
this._dossiersService.activeDossierId,
);

View File

@ -0,0 +1,69 @@
import { GenericService, List, QueryParam, RequiredParam, Validate } from '@iqser/common-ui';
import { Injectable, Injector } from '@angular/core';
import { HeadersConfiguration } from '../../../../../../../../libs/common-ui/src/lib/utils/headers-configuration';
import { HttpHeaders, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class FileManagementService extends GenericService<unknown> {
constructor(protected readonly _injector: Injector) {
super(_injector, '');
}
@Validate()
delete(@RequiredParam() body: List, @RequiredParam() dossierId: string) {
return super._post(body, `delete/${dossierId}`);
}
@Validate()
hardDelete(@RequiredParam() dossierId: string, @RequiredParam() fileIds: List) {
const queryParams = fileIds.map<QueryParam>(id => ({ key: 'fileIds', value: id }));
return super.delete({}, `delete/hard-delete/${dossierId}`, queryParams);
}
@Validate()
restore(@RequiredParam() body: List, @RequiredParam() dossierId: string) {
return this._post(body, `delete/restore/${dossierId}`);
}
downloadOriginalFile(dossierId: string, fileId: string, observe?: 'body', inline?: boolean, indicator?: string): Observable<Blob>;
downloadOriginalFile(
dossierId: string,
fileId: string,
observe?: 'response',
inline?: boolean,
indicator?: string,
): Observable<HttpResponse<Blob>>;
@Validate()
downloadOriginalFile(
@RequiredParam() dossierId: string,
@RequiredParam() fileId: string,
observe: 'body' | 'response' = 'body',
inline?: boolean,
indicator?: string,
) {
const queryParams: QueryParam[] = [];
if (inline) {
queryParams.push({ key: 'inline', value: inline });
}
if (indicator) {
queryParams.push({ key: 'indicator', value: indicator });
}
let headers = new HttpHeaders();
const httpHeaderAcceptSelected = HeadersConfiguration.selectHeaderAccept(['*/*']);
if (httpHeaderAcceptSelected !== undefined) {
headers = headers.set('Accept', httpHeaderAcceptSelected);
}
return this._http.request('get', `/download/original/${encodeURIComponent(dossierId)}/${encodeURIComponent(fileId)}`, {
responseType: 'blob',
params: this._queryParams(queryParams),
headers: headers,
observe: observe,
});
}
}

View File

@ -0,0 +1,14 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService } from '@iqser/common-ui';
import { SearchRequest, SearchResult } from '@redaction/red-ui-http';
@Injectable()
export class PlatformSearchService extends GenericService<SearchResult> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'search');
}
search(body: SearchRequest) {
return this._post(body);
}
}

View File

@ -0,0 +1,27 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, RequiredParam, Validate } from '@iqser/common-ui';
import { ViewedPages, ViewedPagesRequest } from '@redaction/red-ui-http';
@Injectable({
providedIn: 'root',
})
export class ViewedPagesService extends GenericService<unknown> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'viewedPages');
}
@Validate()
addPage(@RequiredParam() body: ViewedPagesRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
return this._post(body, `${this._defaultModelPath}/${dossierId}/${fileId}`);
}
@Validate()
removePage(@RequiredParam() dossierId: string, @RequiredParam() fileId: string, @RequiredParam() page: number) {
return super.delete({}, `${this._defaultModelPath}/${dossierId}/${fileId}/${page}`);
}
@Validate()
getViewedPages(@RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
return this._getOne<ViewedPages>([dossierId, fileId]);
}
}

View File

@ -1,4 +1,4 @@
import { ApplicationRef, Injectable } from '@angular/core';
import { ApplicationRef, Injectable, Injector } from '@angular/core';
import { FileUploadModel } from '../model/file-upload.model';
import { AppStateService } from '@state/app-state.service';
import { HttpErrorResponse, HttpEventType } from '@angular/common/http';
@ -6,10 +6,11 @@ import { interval, Subscription } from 'rxjs';
import { ConfigService } from '@services/config.service';
import { TranslateService } from '@ngx-translate/core';
import { UploadDownloadDialogService } from './upload-download-dialog.service';
import { UploadControllerService } from '@redaction/red-ui-http';
import { FileUploadResult } from '@redaction/red-ui-http';
import { isCsv } from '@utils/file-drop-utils';
import { ErrorMessageService } from '@iqser/common-ui';
import { ErrorMessageService, GenericService, RequiredParam, Validate } from '@iqser/common-ui';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { HeadersConfiguration } from '../../../../../../../libs/common-ui/src/lib/utils/headers-configuration';
export interface ActiveUpload {
subscription: Subscription;
@ -17,7 +18,7 @@ export interface ActiveUpload {
}
@Injectable()
export class FileUploadService {
export class FileUploadService extends GenericService<FileUploadResult> {
static readonly MAX_PARALLEL_UPLOADS = 5;
files: FileUploadModel[] = [];
groupedFiles: { [key: string]: FileUploadModel[] } = {};
@ -32,11 +33,11 @@ export class FileUploadService {
private readonly _applicationRef: ApplicationRef,
private readonly _translateService: TranslateService,
private readonly _configService: ConfigService,
private readonly _uploadControllerService: UploadControllerService,
private readonly _dialogService: UploadDownloadDialogService,
private readonly _errorMessageService: ErrorMessageService,
protected readonly _injector: Injector,
) {
this._uploadControllerService.defaultHeaders = this._uploadControllerService.defaultHeaders.append('ngsw-bypass', 'true');
super(_injector, 'upload');
interval(2500).subscribe(() => {
this._handleUploads();
});
@ -120,6 +121,23 @@ export class FileUploadService {
}
}
@Validate()
uploadFileForm(@RequiredParam() dossierId: string, file?: Blob) {
const formParams = new FormData();
if (file !== undefined) {
formParams.append('file', file);
}
const headers = HeadersConfiguration.getHeaders({ contentType: false }).append('ngsw-bypass', 'true');
return this._http.post<FileUploadResult>(`/${this._defaultModelPath}/${dossierId}`, formParams, {
headers,
observe: 'events',
reportProgress: true,
});
}
private _addFileToGroup(file: FileUploadModel) {
if (!this.groupedFiles[file.dossierId]) {
this.groupedFiles[file.dossierId] = [];
@ -155,7 +173,7 @@ export class FileUploadService {
private _createSubscription(uploadFile: FileUploadModel) {
this.activeUploads++;
const obs = this._uploadControllerService.uploadFileForm(uploadFile.dossierId, uploadFile.file, 'events', true);
const obs = this.uploadFileForm(uploadFile.dossierId, uploadFile.file);
return obs.subscribe(
async event => {
if (event.type === HttpEventType.UploadProgress) {

View File

@ -0,0 +1,22 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, RequiredParam, Validate } from '@iqser/common-ui';
import { GeneralConfigurationModel } from '@redaction/red-ui-http';
import { tap } from 'rxjs/operators';
@Injectable({
providedIn: 'root',
})
export class GeneralSettingsService extends GenericService<GeneralConfigurationModel> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'configuration');
}
getGeneralConfigurations() {
return this._getOne(['general']).pipe(tap(console.log));
}
@Validate()
updateGeneralConfigurations(@RequiredParam() body: GeneralConfigurationModel) {
return this._post<unknown>(body, `${this._defaultModelPath}/general`);
}
}

View File

@ -0,0 +1,32 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, List, QueryParam, RequiredParam, Validate } from '@iqser/common-ui';
import { NotificationResponse } from '@redaction/red-ui-http';
@Injectable({
providedIn: 'root',
})
export class NotificationsService extends GenericService<NotificationResponse> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'notification');
}
@Validate()
getNotifications(@RequiredParam() includeSeen: boolean) {
let queryParam: QueryParam;
if (includeSeen !== undefined && includeSeen !== null) {
queryParam = { key: 'includeSeen', value: includeSeen };
}
return this._getOne([], this._defaultModelPath, [queryParam]);
}
@Validate()
toggleNotificationRead(@RequiredParam() body: List, @RequiredParam() setRead: boolean) {
let queryParam: QueryParam;
if (setRead !== undefined && setRead !== null) {
queryParam = { key: 'setRead', value: setRead };
}
return this._post(body, `${this._defaultModelPath}/toggle-read`, [queryParam]);
}
}

View File

@ -0,0 +1,57 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, List, QueryParam, RequiredParam, Validate } from '@iqser/common-ui';
import { PageExclusionRequest } from '@redaction/red-ui-http';
@Injectable({
providedIn: 'root',
})
export class ReanalysisService extends GenericService<unknown> {
constructor(protected readonly _injector: Injector) {
super(_injector, '');
}
@Validate()
excludePages(@RequiredParam() body: PageExclusionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
return this._post(body, `exclude-pages/${dossierId}/${fileId}`);
}
@Validate()
includePages(@RequiredParam() body: PageExclusionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
return this._post(body, `include-pages/${dossierId}/${fileId}`);
}
@Validate()
reanalyzeFilesForDossier(@RequiredParam() body: List, @RequiredParam() dossierId: string, force?: boolean) {
const queryParams: QueryParam[] = [];
if (force) {
queryParams.push({ key: 'force', value: force });
}
return this._post(body, `reanalyze/${dossierId}/bulk`, queryParams);
}
@Validate()
toggleAnalysis(@RequiredParam() dossierId: string, @RequiredParam() fileId: string, excluded?: boolean) {
const queryParams: QueryParam[] = [];
if (excluded) {
queryParams.push({ key: 'excluded', value: excluded });
}
return this._post({}, `toggle-analysis/${dossierId}/${fileId}`, queryParams);
}
@Validate()
ocrFiles(@RequiredParam() body: List, @RequiredParam() dossierId: string) {
return this._post(body, `ocr/reanalyze/${dossierId}/bulk`);
}
@Validate()
reanalyzeDossier(@RequiredParam() dossierId: string, force?: boolean) {
const queryParams: QueryParam[] = [];
if (force) {
queryParams.push({ key: 'force', value: force });
}
return this._post({}, `reanalyze/${dossierId}`, queryParams);
}
}

View File

@ -0,0 +1,61 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService, RequiredParam, Validate } from '@iqser/common-ui';
import { PlaceholdersResponse, ReportTemplate } from '@redaction/red-ui-http';
import { Observable } from 'rxjs';
import { HttpResponse } from '@angular/common/http';
import { HeadersConfiguration } from '../../../../../libs/common-ui/src/lib/utils/headers-configuration';
@Injectable({
providedIn: 'root',
})
export class ReportTemplateService extends GenericService<unknown> {
constructor(protected readonly _injector: Injector) {
super(_injector, 'templateUpload');
}
@Validate()
uploadTemplateForm(@RequiredParam() dossierTemplateId: string, multiFileReport?: boolean, file?: Blob) {
const formParams = new FormData();
if (multiFileReport !== undefined) {
formParams.append('multiFileReport', <any>multiFileReport);
}
if (file !== undefined) {
formParams.append('file', <any>file);
}
return this._http.post(`/${this._defaultModelPath}/${dossierTemplateId}`, formParams, {
observe: 'body',
});
}
@Validate()
delete(@RequiredParam() dossierTemplateId: string, @RequiredParam() templateId: string) {
return super.delete({}, `${this._defaultModelPath}/${dossierTemplateId}/${templateId}`);
}
@Validate()
getAvailableReportTemplates(@RequiredParam() dossierTemplateId: string) {
return this.getAll<ReportTemplate[]>(`${this._defaultModelPath}/${dossierTemplateId}`);
}
@Validate()
getAvailablePlaceholders(@RequiredParam() dossierTemplateId: string) {
return this._getOne<PlaceholdersResponse>([dossierTemplateId], 'placeholders');
}
downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'response'): Observable<HttpResponse<Blob>>;
downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'body'): Observable<Blob>;
@Validate()
downloadReportTemplate(
@RequiredParam() dossierTemplateId: string,
@RequiredParam() templateId: string,
observe: 'body' | 'response' = 'body',
) {
return this._http.request('get', `/${this._defaultModelPath}/${dossierTemplateId}/${templateId}`, {
responseType: 'blob',
observe: observe,
headers: HeadersConfiguration.getHeaders({ contentType: false }),
});
}
}

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Colors, IFile, ReanalysisControllerService } from '@redaction/red-ui-http';
import { Colors, IFile } from '@redaction/red-ui-http';
import { ActivationEnd, Router } from '@angular/router';
import { UserService } from '@services/user.service';
import { forkJoin, Observable, of, Subject } from 'rxjs';
@ -15,6 +15,7 @@ import { FilesService } from '@services/entity-services/files.service';
import { DictionaryService } from '@shared/services/dictionary.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { ReanalysisService } from '@services/reanalysis.service';
export interface AppState {
activeFileId?: string;
@ -35,7 +36,7 @@ export class AppStateService {
private readonly _userService: UserService,
private readonly _dossiersService: DossiersService,
private readonly _filesService: FilesService,
private readonly _reanalysisControllerService: ReanalysisControllerService,
private readonly _reanalysisService: ReanalysisService,
private readonly _dictionaryService: DictionaryService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _fileAttributesService: FileAttributesService,
@ -176,7 +177,7 @@ export class AppStateService {
}
async reanalyzeDossier({ id } = this._dossiersService.activeDossier) {
await this._reanalysisControllerService.reanalyzeDossier(id, true).toPromise();
await this._reanalysisService.reanalyzeDossier(id, true).toPromise();
}
async activateFile(dossierId: string, fileId: string) {

View File

@ -1,21 +1,21 @@
import { GeneralSettingsControllerService } from '@redaction/red-ui-http';
import { catchError, filter, mergeMap, take, tap } from 'rxjs/operators';
import { ConfigService } from '@services/config.service';
import { Title } from '@angular/platform-browser';
import { of } from 'rxjs';
import { KeycloakEventType, KeycloakService } from 'keycloak-angular';
import { GeneralSettingsService } from '@services/general-settings.service';
export function configurationInitializer(
keycloakService: KeycloakService,
title: Title,
configService: ConfigService,
generalSettingsControllerService: GeneralSettingsControllerService,
generalSettingsService: GeneralSettingsService,
) {
return () =>
keycloakService.keycloakEvents$
.pipe(
filter(event => event.type === KeycloakEventType.OnReady),
mergeMap(() => generalSettingsControllerService.getGeneralConfigurations()),
mergeMap(() => generalSettingsService.getGeneralConfigurations()),
tap(configuration => configService.updateDisplayName(configuration.displayName)),
catchError(() => {
title.setTitle('RedactManager');

View File

@ -1,65 +0,0 @@
import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';
import { Configuration } from './configuration';
import { HttpClient } from '@angular/common/http';
import { FileManagementControllerService } from './api/fileManagementController.service';
import { GeneralSettingsControllerService } from './api/generalSettingsController.service';
import { InfoControllerService } from './api/infoController.service';
import { LicenseReportControllerService } from './api/licenseReportController.service';
import { ManualRedactionControllerService } from './api/manualRedactionController.service';
import { ReanalysisControllerService } from './api/reanalysisController.service';
import { RedactionLogControllerService } from './api/redactionLogController.service';
import { ReportTemplateControllerService } from './api/reportTemplateController.service';
import { RulesControllerService } from './api/rulesController.service';
import { SmtpConfigurationControllerService } from './api/smtpConfigurationController.service';
import { UploadControllerService } from './api/uploadController.service';
import { VersionsControllerService } from './api/versionsController.service';
import { ViewedPagesControllerService } from './api/viewedPagesController.service';
import { WatermarkControllerService } from './api/watermarkController.service';
import { SearchControllerService } from './api/searchController.service';
import { NotificationControllerService } from './api/notificationController.service';
import { StatusReportControllerService } from './api/statusReportController.service';
@NgModule({
imports: [],
declarations: [],
exports: [],
providers: [
FileManagementControllerService,
GeneralSettingsControllerService,
InfoControllerService,
LicenseReportControllerService,
ManualRedactionControllerService,
ReanalysisControllerService,
RedactionLogControllerService,
ReportTemplateControllerService,
RulesControllerService,
SmtpConfigurationControllerService,
UploadControllerService,
VersionsControllerService,
ViewedPagesControllerService,
WatermarkControllerService,
SearchControllerService,
NotificationControllerService,
StatusReportControllerService,
],
})
export class ApiModule {
constructor(@Optional() @SkipSelf() parentModule: ApiModule, @Optional() http: HttpClient) {
if (parentModule) {
throw new Error('ApiModule is already loaded. Import in your base AppModule only.');
}
if (!http) {
throw new Error(
'You need to import the HttpClientModule in your AppModule! \n' +
'See also https://github.com/angular/angular/issues/20575',
);
}
}
public static forRoot(configurationFactory: () => Configuration): ModuleWithProviders<any> {
return {
ngModule: ApiModule,
providers: [{ provide: Configuration, useFactory: configurationFactory }],
};
}
}

View File

@ -2,5 +2,4 @@ export * from './api/api';
export * from './model/models';
export * from './variables';
export * from './configuration';
export * from './api.module';
export * from './red-types';