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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; 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 { ConfigService } from '@services/config.service';
import * as moment from 'moment'; import * as moment from 'moment';
import { TranslateService } from '@ngx-translate/core'; 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 { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
import { RouterHistoryService } from '@services/router-history.service'; import { RouterHistoryService } from '@services/router-history.service';
import { LicenseReportService } from '../../services/licence-report.service';
@Component({ @Component({
selector: 'redaction-license-information-screen', selector: 'redaction-license-information-screen',
@ -47,7 +48,7 @@ export class LicenseInformationScreenComponent implements OnInit {
private readonly _loadingService: LoadingService, private readonly _loadingService: LoadingService,
readonly routerHistoryService: RouterHistoryService, readonly routerHistoryService: RouterHistoryService,
private readonly _translateService: TranslateService, private readonly _translateService: TranslateService,
private readonly _licenseReportController: LicenseReportControllerService, private readonly _licenseReportService: LicenseReportService,
) { ) {
_loadingService.start(); _loadingService.start();
} }
@ -68,15 +69,15 @@ export class LicenseInformationScreenComponent implements OnInit {
endDate: endDate.toDate(), endDate: endDate.toDate(),
}; };
const promises = [ const promises = [
this._licenseReportController.licenseReport(currentConfig).toPromise(), this._licenseReportService.licenseReport(currentConfig).toPromise(),
this._licenseReportController.licenseReport({}).toPromise(), this._licenseReportService.licenseReport({}).toPromise(),
]; ];
if (endDate.isBefore(moment())) { if (endDate.isBefore(moment())) {
const unlicensedConfig = { const unlicensedConfig = {
startDate: endDate.toDate(), startDate: endDate.toDate(),
}; };
promises.push(this._licenseReportController.licenseReport(unlicensedConfig).toPromise()); promises.push(this._licenseReportService.licenseReport(unlicensedConfig).toPromise());
} }
Promise.all(promises).then(reports => { Promise.all(promises).then(reports => {
@ -131,7 +132,7 @@ export class LicenseInformationScreenComponent implements OnInit {
} }
promises.push( promises.push(
this._licenseReportController this._licenseReportService
.licenseReport({ .licenseReport({
startDate: moment(`01-${m + 1}-${y}`, 'DD-MM-YYYY').toDate(), startDate: moment(`01-${m + 1}-${y}`, 'DD-MM-YYYY').toDate(),
endDate: moment(`01-${nm + 1}-${ny}`, '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 { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { AppStateService } from '@state/app-state.service'; 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 { download } from '@utils/file-download-utils';
import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui'; import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui';
import { PermissionsService } from '@services/permissions.service'; 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 { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { AdminDialogService } from '../../services/admin-dialog.service'; import { AdminDialogService } from '../../services/admin-dialog.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { ReportTemplateService } from '@services/report-template.service';
interface Placeholder { interface Placeholder {
placeholder: string; placeholder: string;
@ -38,7 +39,7 @@ export class ReportsScreenComponent implements OnInit {
private readonly _activatedRoute: ActivatedRoute, private readonly _activatedRoute: ActivatedRoute,
private readonly _appStateService: AppStateService, private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _reportTemplateService: ReportTemplateControllerService, private readonly _reportTemplateService: ReportTemplateService,
private readonly _dialogService: AdminDialogService, private readonly _dialogService: AdminDialogService,
private readonly _toaster: Toaster, private readonly _toaster: Toaster,
private readonly _loadingService: LoadingService, private readonly _loadingService: LoadingService,
@ -120,7 +121,7 @@ export class ReportsScreenComponent implements OnInit {
} }
private async _deleteTemplate(template: ReportTemplate) { 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(); await this._loadReportTemplates();
} }

View File

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

View File

@ -5,12 +5,13 @@ import { environment } from '@environments/environment';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; 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 { ActivatedRoute } from '@angular/router';
import { BASE_HREF } from '../../../../tokens'; import { BASE_HREF } from '../../../../tokens';
import { stampPDFPage } from '@utils/page-stamper'; import { stampPDFPage } from '@utils/page-stamper';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { WatermarkService } from '../../services/watermark.service';
export const DEFAULT_WATERMARK: WatermarkModel = { export const DEFAULT_WATERMARK: WatermarkModel = {
text: null, text: null,
@ -37,7 +38,7 @@ export class WatermarkScreenComponent implements OnInit {
constructor( constructor(
readonly permissionsService: PermissionsService, readonly permissionsService: PermissionsService,
@Inject(BASE_HREF) private readonly _baseHref: string, @Inject(BASE_HREF) private readonly _baseHref: string,
private readonly _watermarkControllerService: WatermarkControllerService, private readonly _watermarkService: WatermarkService,
private readonly _toaster: Toaster, private readonly _toaster: Toaster,
private readonly _http: HttpClient, private readonly _http: HttpClient,
private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _changeDetectorRef: ChangeDetectorRef,
@ -79,8 +80,8 @@ export class WatermarkScreenComponent implements OnInit {
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId; const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const observable = watermark.text const observable = watermark.text
? this._watermarkControllerService.saveWatermark(watermark, dossierTemplateId) ? this._watermarkService.saveWatermark(watermark, dossierTemplateId)
: this._watermarkControllerService.deleteWatermark(dossierTemplateId); : this._watermarkService.deleteWatermark(dossierTemplateId);
observable.toPromise().then( observable.toPromise().then(
() => { () => {
@ -108,7 +109,7 @@ export class WatermarkScreenComponent implements OnInit {
} }
private _loadWatermark() { private _loadWatermark() {
this._watermarkControllerService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe( this._watermarkService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe(
watermark => { watermark => {
this._watermark = watermark; this._watermark = watermark;
this.configForm.setValue({ ...this._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 { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core';
import { PermissionsService } from '@services/permissions.service'; 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 { InputWithActionComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { File } from '@models/file/file'; import { File } from '@models/file/file';
import { ReanalysisService } from '@services/reanalysis.service';
@Component({ @Component({
selector: 'redaction-page-exclusion', selector: 'redaction-page-exclusion',
@ -19,7 +20,7 @@ export class PageExclusionComponent implements OnChanges {
constructor( constructor(
readonly permissionsService: PermissionsService, readonly permissionsService: PermissionsService,
private readonly _reanalysisControllerService: ReanalysisControllerService, private readonly _reanalysisService: ReanalysisService,
private readonly _toaster: Toaster, private readonly _toaster: Toaster,
private readonly _loadingService: LoadingService, private readonly _loadingService: LoadingService,
) {} ) {}
@ -56,7 +57,7 @@ export class PageExclusionComponent implements OnChanges {
endPage, endPage,
}; };
}); });
await this._reanalysisControllerService await this._reanalysisService
.excludePages( .excludePages(
{ {
pageRanges: pageRanges, pageRanges: pageRanges,
@ -75,7 +76,7 @@ export class PageExclusionComponent implements OnChanges {
async includePagesRange(range: PageRange): Promise<void> { async includePagesRange(range: PageRange): Promise<void> {
this._loadingService.start(); this._loadingService.start();
await this._reanalysisControllerService await this._reanalysisService
.includePages( .includePages(
{ {
pageRanges: [range], pageRanges: [range],

View File

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

View File

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

View File

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

View File

@ -1,10 +1,11 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; 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 { FormBuilder, FormGroup } from '@angular/forms';
import { Dossier } from '@state/model/dossier'; import { Dossier } from '@state/model/dossier';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { downloadTypesTranslations } from '../../../../../translations/download-types-translations'; import { downloadTypesTranslations } from '../../../../../translations/download-types-translations';
import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossiersService } from '@services/entity-services/dossiers.service';
import { ReportTemplateService } from '@services/report-template.service';
@Component({ @Component({
selector: 'redaction-edit-dossier-download-package', selector: 'redaction-edit-dossier-download-package',
@ -24,7 +25,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS
constructor( constructor(
private readonly _dossiersService: DossiersService, private readonly _dossiersService: DossiersService,
private readonly _reportTemplateController: ReportTemplateControllerService, private readonly _reportTemplateController: ReportTemplateService,
private readonly _formBuilder: FormBuilder, 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 { AnnotationSourceComponent } from './components/file-workload/components/annotation-source/annotation-source.component';
import { OverlayModule } from '@angular/cdk/overlay'; import { OverlayModule } from '@angular/cdk/overlay';
import { SharedDossiersModule } from './shared/shared-dossiers.module'; import { SharedDossiersModule } from './shared/shared-dossiers.module';
import { PlatformSearchService } from './shared/services/platform-search.service';
const screens = [FilePreviewScreenComponent, SearchScreenComponent]; const screens = [FilePreviewScreenComponent, SearchScreenComponent];
@ -84,6 +85,7 @@ const services = [
PdfViewerDataService, PdfViewerDataService,
AnnotationDrawService, AnnotationDrawService,
AnnotationProcessingService, AnnotationProcessingService,
PlatformSearchService,
]; ];
@NgModule({ @NgModule({

View File

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

View File

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

View File

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

View File

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

View File

@ -1,11 +1,12 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Core, WebViewerInstance } from '@pdftron/webviewer'; 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 { hexToRgb } from '@utils/functions';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { UserPreferenceService } from '@services/user-preference.service'; import { UserPreferenceService } from '@services/user-preference.service';
import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossiersService } from '@services/entity-services/dossiers.service';
import { RedactionLogService } from './redaction-log.service';
import Annotation = Core.Annotations.Annotation; import Annotation = Core.Annotations.Annotation;
@Injectable() @Injectable()
@ -13,7 +14,7 @@ export class AnnotationDrawService {
constructor( constructor(
private readonly _appStateService: AppStateService, private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService, private readonly _dossiersService: DossiersService,
private readonly _redactionLogControllerService: RedactionLogControllerService, private readonly _redactionLogService: RedactionLogService,
private readonly _userPreferenceService: UserPreferenceService, private readonly _userPreferenceService: UserPreferenceService,
) {} ) {}
@ -29,7 +30,7 @@ export class AnnotationDrawService {
annotationManager.drawAnnotationsFromList(annotations); annotationManager.drawAnnotationsFromList(annotations);
if (this._userPreferenceService.areDevFeaturesEnabled) { if (this._userPreferenceService.areDevFeaturesEnabled) {
this._redactionLogControllerService this._redactionLogService
.getSectionGrid(this._dossiersService.activeDossierId, this._appStateService.activeFileId) .getSectionGrid(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
.subscribe(sectionGrid => { .subscribe(sectionGrid => {
this._drawSections(activeViewer, 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 { 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 { 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 { TranslateService } from '@ngx-translate/core';
import { tap } from 'rxjs/operators'; import { tap } from 'rxjs/operators';
import { UserService } from '@services/user.service'; 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'; import { DossiersService } from '@services/entity-services/dossiers.service';
@Injectable() @Injectable()
export class ManualAnnotationService { export class ManualAnnotationService extends GenericService<ManualAddResponse> {
CONFIG: { CONFIG: {
[key in AnnotationActionMode]: string; [key in AnnotationActionMode]: string;
}; };
@ -24,10 +33,11 @@ export class ManualAnnotationService {
private readonly _userService: UserService, private readonly _userService: UserService,
private readonly _translateService: TranslateService, private readonly _translateService: TranslateService,
private readonly _toaster: Toaster, private readonly _toaster: Toaster,
private readonly _manualRedactionControllerService: ManualRedactionControllerService,
private readonly _permissionsService: PermissionsService, private readonly _permissionsService: PermissionsService,
private readonly _errorMessageService: ErrorMessageService, private readonly _errorMessageService: ErrorMessageService,
protected readonly _injector: Injector,
) { ) {
super(_injector, 'manualRedaction');
this.CONFIG = { this.CONFIG = {
add: 'addRedaction', add: 'addRedaction',
'recategorize-image': 'recategorizeImage', 'recategorize-image': 'recategorizeImage',
@ -47,17 +57,8 @@ export class ManualAnnotationService {
_makeRequest(mode: AnnotationActionMode, body: any, secondParam: any = null, modifyDictionary = false) { _makeRequest(mode: AnnotationActionMode, body: any, secondParam: any = null, modifyDictionary = false) {
const obs = !secondParam const obs = !secondParam
? this._manualRedactionControllerService[this.CONFIG[mode]]( ? this[this.CONFIG[mode]](body, this._dossiersService.activeDossierId, this._appStateService.activeFileId)
body, : this[this.CONFIG[mode]](body, secondParam, this._dossiersService.activeDossierId, this._appStateService.activeFileId);
this._dossiersService.activeDossierId,
this._appStateService.activeFileId,
)
: this._manualRedactionControllerService[this.CONFIG[mode]](
body,
secondParam,
this._dossiersService.activeDossierId,
this._appStateService.activeFileId,
);
return obs.pipe( return obs.pipe(
tap( tap(
@ -72,25 +73,26 @@ export class ManualAnnotationService {
); );
} }
// Comments @Validate()
// this wraps /manualRedaction/comment/add addComment(
addComment(comment: string, annotationId: string) { @RequiredParam() comment: string,
return this._manualRedactionControllerService.addComment( @RequiredParam() annotationId: string,
{ text: comment }, dossierId = this._dossiersService.activeDossierId,
annotationId, fileId = this._appStateService.activeFileId,
this._dossiersService.activeDossierId, ) {
this._appStateService.activeFileId, const url = `${this._defaultModelPath}/comment/add/${dossierId}/${fileId}/${annotationId}`;
); return this._post<CommentResponse>({ text: comment }, url);
} }
// this wraps /manualRedaction/comment/undo @Validate()
deleteComment(commentId: string, annotationId: string) { deleteComment(
return this._manualRedactionControllerService.undoComment( @RequiredParam() commentId: string,
annotationId, @RequiredParam() annotationId: string,
commentId, dossierId = this._dossiersService.activeDossierId,
this._dossiersService.activeDossierId, fileId = this._appStateService.activeFileId,
this._appStateService.activeFileId, ) {
); const url = `${this._defaultModelPath}/comment/undo/${dossierId}/${fileId}/${annotationId}/${commentId}`;
return super.delete({}, url);
} }
addRecommendation(annotation: AnnotationWrapper) { addRecommendation(annotation: AnnotationWrapper) {
@ -116,7 +118,7 @@ export class ManualAnnotationService {
// this wraps // this wraps
// /manualRedaction/redaction/recategorize // /manualRedaction/redaction/recategorize
// /manualRedaction/request/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'; const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'recategorize-image' : 'request-image-recategorization';
return this._makeRequest(mode, { annotationId, type, comment }); return this._makeRequest(mode, { annotationId, type, comment });
} }
@ -132,14 +134,14 @@ export class ManualAnnotationService {
// this wraps // this wraps
// /manualRedaction/redaction/force // /manualRedaction/redaction/force
// /manualRedaction/request/force // /manualRedaction/request/force
forceRedaction(request: ForceRedactionRequest) { force(request: ForceRedactionRequest) {
const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'force-redaction' : 'request-force-redaction'; const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'force-redaction' : 'request-force-redaction';
return this._makeRequest(mode, request); return this._makeRequest(mode, request);
} }
// this wraps // this wraps
// /manualRedaction/approve // /manualRedaction/approve
approveRequest(annotationId: string, addToDictionary: boolean = false) { approve(annotationId: string, addToDictionary: boolean = false) {
// for only here - approve the request // for only here - approve the request
return this._makeRequest('approve', { addOrRemoveFromDictionary: addToDictionary }, annotationId, addToDictionary); 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) { private _getMessage(mode: AnnotationActionMode, modifyDictionary?: boolean, error: boolean = false) {
const type = modifyDictionary ? 'dictionary' : 'manual-redaction'; const type = modifyDictionary ? 'dictionary' : 'manual-redaction';
const resultType = error ? 'error' : 'success'; const resultType = error ? 'error' : 'success';

View File

@ -1,17 +1,14 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { forkJoin, Observable, of } from 'rxjs'; import { forkJoin, Observable, of } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators'; 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 { FileDataModel } from '@models/file/file-data.model';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { File } from '@models/file/file'; import { File } from '@models/file/file';
import { DossiersService } from '@services/entity-services/dossiers.service'; 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() @Injectable()
export class PdfViewerDataService { export class PdfViewerDataService {
@ -19,21 +16,18 @@ export class PdfViewerDataService {
private readonly _appStateService: AppStateService, private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService, private readonly _dossiersService: DossiersService,
private readonly _permissionsService: PermissionsService, private readonly _permissionsService: PermissionsService,
private readonly _man: ManualRedactionControllerService, private readonly _fileManagementService: FileManagementService,
private readonly _fileManagementControllerService: FileManagementControllerService, private readonly _redactionLogService: RedactionLogService,
private readonly _redactionLogControllerService: RedactionLogControllerService, private readonly _viewedPagesService: ViewedPagesService,
private readonly _viewedPagesControllerService: ViewedPagesControllerService,
) {} ) {}
loadActiveFileRedactionLog() { loadActiveFileRedactionLog() {
return this._redactionLogControllerService return this._redactionLogService.getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId).pipe(
.getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId) tap(
.pipe( redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page),
tap( catchError(() => of({})),
redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page), ),
catchError(() => of({})), );
),
);
} }
loadActiveFileData(): Observable<FileDataModel> { loadActiveFileData(): Observable<FileDataModel> {
@ -48,7 +42,7 @@ export class PdfViewerDataService {
getViewedPagesForActiveFile() { getViewedPagesForActiveFile() {
if (this._permissionsService.canMarkPagesAsViewed()) { if (this._permissionsService.canMarkPagesAsViewed()) {
return this._viewedPagesControllerService return this._viewedPagesService
.getViewedPages(this._dossiersService.activeDossierId, this._appStateService.activeFileId) .getViewedPages(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
.pipe(catchError(() => of({ pages: [] }))); .pipe(catchError(() => of({ pages: [] })));
} }
@ -56,6 +50,6 @@ export class PdfViewerDataService {
} }
downloadOriginalFile(file: File): Observable<any> { 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, StatusBarConfig,
Toaster, Toaster,
} from '@iqser/common-ui'; } 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 { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
import { filter } from 'rxjs/operators'; 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 { LongPressEvent } from '@shared/directives/long-press.directive';
import { FileActionService } from '../../services/file-action.service'; import { FileActionService } from '../../services/file-action.service';
import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossiersService } from '@services/entity-services/dossiers.service';
import { FileManagementService } from '../../services/file-management.service';
@Component({ @Component({
selector: 'redaction-file-actions', selector: 'redaction-file-actions',
@ -66,7 +67,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
private readonly _dialogService: DossiersDialogService, private readonly _dialogService: DossiersDialogService,
private readonly _fileActionService: FileActionService, private readonly _fileActionService: FileActionService,
private readonly _loadingService: LoadingService, private readonly _loadingService: LoadingService,
private readonly _fileManagementControllerService: FileManagementControllerService, private readonly _fileManagementService: FileManagementService,
private readonly _userService: UserService, private readonly _userService: UserService,
private readonly _toaster: Toaster, private readonly _toaster: Toaster,
private readonly _userPreferenceService: UserPreferenceService, private readonly _userPreferenceService: UserPreferenceService,
@ -135,8 +136,8 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
}), }),
async () => { async () => {
this._loadingService.start(); this._loadingService.start();
await this._fileManagementControllerService await this._fileManagementService
.deleteFiles([this.file.fileId], this.file.dossierId) .delete([this.file.fileId], this.file.dossierId)
.toPromise() .toPromise()
.catch(error => { .catch(error => {
this._toaster.error(_('error.http.generic'), { params: error }); this._toaster.error(_('error.http.generic'), { params: error });

View File

@ -1,7 +1,6 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
import { ReanalysisControllerService } from '@redaction/red-ui-http';
import { File } from '@models/file/file'; import { File } from '@models/file/file';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { DossiersDialogService } from '../../services/dossiers-dialog.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 { FilesService } from '@services/entity-services/files.service';
import { ConfirmationDialogInput } from '@iqser/common-ui'; import { ConfirmationDialogInput } from '@iqser/common-ui';
import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossiersService } from '@services/entity-services/dossiers.service';
import { ReanalysisService } from '@services/reanalysis.service';
@Injectable() @Injectable()
export class FileActionService { export class FileActionService {
@ -17,17 +17,17 @@ export class FileActionService {
private readonly _permissionsService: PermissionsService, private readonly _permissionsService: PermissionsService,
private readonly _userService: UserService, private readonly _userService: UserService,
private readonly _fileService: FilesService, private readonly _fileService: FilesService,
private readonly _reanalysisControllerService: ReanalysisControllerService, private readonly _reanalysisService: ReanalysisService,
private readonly _appStateService: AppStateService, private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService, private readonly _dossiersService: DossiersService,
) {} ) {}
reanalyseFile(file = this._appStateService.activeFile) { 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) { 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) { async assignToMe(files?: File[], callback?: Function) {
@ -78,7 +78,7 @@ export class FileActionService {
} }
ocrFiles(files: File[]) { ocrFiles(files: File[]) {
return this._reanalysisControllerService.ocrFiles( return this._reanalysisService.ocrFiles(
files.map(f => f.fileId), files.map(f => f.fileId),
this._dossiersService.activeDossierId, 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 { FileUploadModel } from '../model/file-upload.model';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { HttpErrorResponse, HttpEventType } from '@angular/common/http'; import { HttpErrorResponse, HttpEventType } from '@angular/common/http';
@ -6,10 +6,11 @@ import { interval, Subscription } from 'rxjs';
import { ConfigService } from '@services/config.service'; import { ConfigService } from '@services/config.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { UploadDownloadDialogService } from './upload-download-dialog.service'; 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 { 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 { DossiersService } from '@services/entity-services/dossiers.service';
import { HeadersConfiguration } from '../../../../../../../libs/common-ui/src/lib/utils/headers-configuration';
export interface ActiveUpload { export interface ActiveUpload {
subscription: Subscription; subscription: Subscription;
@ -17,7 +18,7 @@ export interface ActiveUpload {
} }
@Injectable() @Injectable()
export class FileUploadService { export class FileUploadService extends GenericService<FileUploadResult> {
static readonly MAX_PARALLEL_UPLOADS = 5; static readonly MAX_PARALLEL_UPLOADS = 5;
files: FileUploadModel[] = []; files: FileUploadModel[] = [];
groupedFiles: { [key: string]: FileUploadModel[] } = {}; groupedFiles: { [key: string]: FileUploadModel[] } = {};
@ -32,11 +33,11 @@ export class FileUploadService {
private readonly _applicationRef: ApplicationRef, private readonly _applicationRef: ApplicationRef,
private readonly _translateService: TranslateService, private readonly _translateService: TranslateService,
private readonly _configService: ConfigService, private readonly _configService: ConfigService,
private readonly _uploadControllerService: UploadControllerService,
private readonly _dialogService: UploadDownloadDialogService, private readonly _dialogService: UploadDownloadDialogService,
private readonly _errorMessageService: ErrorMessageService, private readonly _errorMessageService: ErrorMessageService,
protected readonly _injector: Injector,
) { ) {
this._uploadControllerService.defaultHeaders = this._uploadControllerService.defaultHeaders.append('ngsw-bypass', 'true'); super(_injector, 'upload');
interval(2500).subscribe(() => { interval(2500).subscribe(() => {
this._handleUploads(); 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) { private _addFileToGroup(file: FileUploadModel) {
if (!this.groupedFiles[file.dossierId]) { if (!this.groupedFiles[file.dossierId]) {
this.groupedFiles[file.dossierId] = []; this.groupedFiles[file.dossierId] = [];
@ -155,7 +173,7 @@ export class FileUploadService {
private _createSubscription(uploadFile: FileUploadModel) { private _createSubscription(uploadFile: FileUploadModel) {
this.activeUploads++; this.activeUploads++;
const obs = this._uploadControllerService.uploadFileForm(uploadFile.dossierId, uploadFile.file, 'events', true); const obs = this.uploadFileForm(uploadFile.dossierId, uploadFile.file);
return obs.subscribe( return obs.subscribe(
async event => { async event => {
if (event.type === HttpEventType.UploadProgress) { 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 { 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 { ActivationEnd, Router } from '@angular/router';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
import { forkJoin, Observable, of, Subject } from 'rxjs'; 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 { DictionaryService } from '@shared/services/dictionary.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { ReanalysisService } from '@services/reanalysis.service';
export interface AppState { export interface AppState {
activeFileId?: string; activeFileId?: string;
@ -35,7 +36,7 @@ export class AppStateService {
private readonly _userService: UserService, private readonly _userService: UserService,
private readonly _dossiersService: DossiersService, private readonly _dossiersService: DossiersService,
private readonly _filesService: FilesService, private readonly _filesService: FilesService,
private readonly _reanalysisControllerService: ReanalysisControllerService, private readonly _reanalysisService: ReanalysisService,
private readonly _dictionaryService: DictionaryService, private readonly _dictionaryService: DictionaryService,
private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _fileAttributesService: FileAttributesService, private readonly _fileAttributesService: FileAttributesService,
@ -176,7 +177,7 @@ export class AppStateService {
} }
async reanalyzeDossier({ id } = this._dossiersService.activeDossier) { 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) { 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 { catchError, filter, mergeMap, take, tap } from 'rxjs/operators';
import { ConfigService } from '@services/config.service'; import { ConfigService } from '@services/config.service';
import { Title } from '@angular/platform-browser'; import { Title } from '@angular/platform-browser';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { KeycloakEventType, KeycloakService } from 'keycloak-angular'; import { KeycloakEventType, KeycloakService } from 'keycloak-angular';
import { GeneralSettingsService } from '@services/general-settings.service';
export function configurationInitializer( export function configurationInitializer(
keycloakService: KeycloakService, keycloakService: KeycloakService,
title: Title, title: Title,
configService: ConfigService, configService: ConfigService,
generalSettingsControllerService: GeneralSettingsControllerService, generalSettingsService: GeneralSettingsService,
) { ) {
return () => return () =>
keycloakService.keycloakEvents$ keycloakService.keycloakEvents$
.pipe( .pipe(
filter(event => event.type === KeycloakEventType.OnReady), filter(event => event.type === KeycloakEventType.OnReady),
mergeMap(() => generalSettingsControllerService.getGeneralConfigurations()), mergeMap(() => generalSettingsService.getGeneralConfigurations()),
tap(configuration => configService.updateDisplayName(configuration.displayName)), tap(configuration => configService.updateDisplayName(configuration.displayName)),
catchError(() => { catchError(() => {
title.setTitle('RedactManager'); 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 './model/models';
export * from './variables'; export * from './variables';
export * from './configuration'; export * from './configuration';
export * from './api.module';
export * from './red-types'; export * from './red-types';