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:
commit
fac3fe46cb
@ -5,7 +5,6 @@ import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http';
|
||||
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
|
||||
import { ApiModule, GeneralSettingsControllerService } from '@redaction/red-ui-http';
|
||||
import { ApiPathInterceptor } from '@utils/api-path-interceptor';
|
||||
import { MissingTranslationHandler, TranslateCompiler, TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||
import { languageInitializer } from '@i18n/language.initializer';
|
||||
@ -36,6 +35,7 @@ import { DatePipe } from '@shared/pipes/date.pipe';
|
||||
import * as links from '../assets/help-mode/links.json';
|
||||
import { HELP_DOCS, IqserHelpModeModule, MAX_RETRIES_ON_SERVER_ERROR, ServerErrorInterceptor, ToastComponent } from '@iqser/common-ui';
|
||||
import { KeycloakService } from 'keycloak-angular';
|
||||
import { GeneralSettingsService } from '@services/general-settings.service';
|
||||
|
||||
export function httpLoaderFactory(httpClient: HttpClient): PruningTranslationLoader {
|
||||
return new PruningTranslationLoader(httpClient, '/assets/i18n/', '.json');
|
||||
@ -64,7 +64,6 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp
|
||||
FileUploadDownloadModule,
|
||||
HttpClientModule,
|
||||
AuthModule,
|
||||
ApiModule,
|
||||
AppRoutingModule,
|
||||
MonacoEditorModule,
|
||||
IqserHelpModeModule,
|
||||
@ -121,7 +120,7 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp
|
||||
provide: APP_INITIALIZER,
|
||||
multi: true,
|
||||
useFactory: configurationInitializer,
|
||||
deps: [KeycloakService, Title, ConfigService, GeneralSettingsControllerService],
|
||||
deps: [KeycloakService, Title, ConfigService, GeneralSettingsService],
|
||||
},
|
||||
{
|
||||
provide: MONACO_PATH,
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { Component } from '@angular/core';
|
||||
import * as moment from 'moment';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { Notification, NotificationControllerService, NotificationResponse } from '@redaction/red-ui-http';
|
||||
import { Notification, NotificationResponse } from '@redaction/red-ui-http';
|
||||
import { DatePipe } from '@shared/pipes/date.pipe';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
@ -9,6 +9,7 @@ import { UserService } from '@services/user.service';
|
||||
import { NotificationType, NotificationTypeEnum } from '@models/notification-types';
|
||||
import { notificationsTranslations } from '../../translations/notifications-translations';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { NotificationsService } from '@services/notifications.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-notifications',
|
||||
@ -23,12 +24,12 @@ export class NotificationsComponent {
|
||||
constructor(
|
||||
private readonly _translateService: TranslateService,
|
||||
private readonly _userService: UserService,
|
||||
private readonly _notificationControllerService: NotificationControllerService,
|
||||
private readonly _notificationsService: NotificationsService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _datePipe: DatePipe,
|
||||
) {
|
||||
this._notificationControllerService.getNotifications(false).subscribe((response: NotificationResponse) => {
|
||||
this._notificationsService.getNotifications(false).subscribe((response: NotificationResponse) => {
|
||||
this.notifications = response.notifications.filter(notification => this._isSupportedType(notification));
|
||||
this._groupNotifications(this.notifications);
|
||||
this.hasUnreadNotifications = this.notifications?.filter(n => !n.readDate).length > 0;
|
||||
@ -47,7 +48,7 @@ export class NotificationsComponent {
|
||||
async markRead(notification: Notification, $event, isRead: boolean = true) {
|
||||
$event.stopPropagation();
|
||||
const ids = [`${notification.id}`];
|
||||
await this._notificationControllerService.toggleNotificationRead(ids, isRead).toPromise();
|
||||
await this._notificationsService.toggleNotificationRead(ids, isRead).toPromise();
|
||||
if (isRead) {
|
||||
notification.readDate = moment().format('YYYY-MM-DDTHH:mm:ss Z');
|
||||
} else {
|
||||
|
||||
@ -42,6 +42,10 @@ import { TrashScreenComponent } from './screens/trash/trash-screen.component';
|
||||
import { AuditService } from './services/audit.service';
|
||||
import { DigitalSignatureService } from './services/digital-signature.service';
|
||||
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
|
||||
import { LicenseReportService } from './services/licence-report.service';
|
||||
import { RulesService } from './services/rules.service';
|
||||
import { SmtpConfigService } from './services/smtp-config.service';
|
||||
import { WatermarkService } from './services/watermark.service';
|
||||
|
||||
const dialogs = [
|
||||
AddEditDossierTemplateDialogComponent,
|
||||
@ -92,7 +96,15 @@ const components = [
|
||||
|
||||
@NgModule({
|
||||
declarations: [...components],
|
||||
providers: [AdminDialogService, AuditService, DigitalSignatureService],
|
||||
providers: [
|
||||
AdminDialogService,
|
||||
AuditService,
|
||||
DigitalSignatureService,
|
||||
LicenseReportService,
|
||||
RulesService,
|
||||
SmtpConfigService,
|
||||
WatermarkService,
|
||||
],
|
||||
imports: [CommonModule, SharedModule, AdminRoutingModule, NgxChartsModule, ColorPickerModule, MonacoEditorModule],
|
||||
})
|
||||
export class AdminModule {}
|
||||
|
||||
@ -1,16 +1,13 @@
|
||||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import { AdminDialogService } from '../../services/admin-dialog.service';
|
||||
import {
|
||||
GeneralConfigurationModel,
|
||||
GeneralSettingsControllerService,
|
||||
SMTPConfiguration,
|
||||
SmtpConfigurationControllerService,
|
||||
} from '@redaction/red-ui-http';
|
||||
import { GeneralConfigurationModel, SMTPConfiguration } from '@redaction/red-ui-http';
|
||||
import { ConfigService } from '@services/config.service';
|
||||
import { AutoUnsubscribe, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { UserService } from '@services/user.service';
|
||||
import { GeneralSettingsService } from '@services/general-settings.service';
|
||||
import { SmtpConfigService } from '../../services/smtp-config.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-general-config-screen',
|
||||
@ -34,8 +31,8 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI
|
||||
private readonly _loadingService: LoadingService,
|
||||
private readonly _dialogService: AdminDialogService,
|
||||
private readonly _configService: ConfigService,
|
||||
private readonly _smtpConfigService: SmtpConfigurationControllerService,
|
||||
private readonly _generalSettingsControllerService: GeneralSettingsControllerService,
|
||||
private readonly _smtpConfigService: SmtpConfigService,
|
||||
private readonly _generalSettingsService: GeneralSettingsService,
|
||||
) {
|
||||
super();
|
||||
|
||||
@ -110,8 +107,8 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI
|
||||
|
||||
const configFormValues = this.configForm.getRawValue();
|
||||
|
||||
await this._generalSettingsControllerService.updateGeneralConfigurations(configFormValues).toPromise();
|
||||
this._initialGeneralConfiguration = await this._generalSettingsControllerService.getGeneralConfigurations().toPromise();
|
||||
await this._generalSettingsService.updateGeneralConfigurations(configFormValues).toPromise();
|
||||
this._initialGeneralConfiguration = await this._generalSettingsService.getGeneralConfigurations().toPromise();
|
||||
this._configService.updateDisplayName(this._initialGeneralConfiguration.displayName);
|
||||
this._loadingService.stop();
|
||||
}
|
||||
@ -141,7 +138,7 @@ export class GeneralConfigScreenComponent extends AutoUnsubscribe implements OnI
|
||||
private async _loadData() {
|
||||
this._loadingService.start();
|
||||
try {
|
||||
this._initialGeneralConfiguration = await this._generalSettingsControllerService.getGeneralConfigurations().toPromise();
|
||||
this._initialGeneralConfiguration = await this._generalSettingsService.getGeneralConfigurations().toPromise();
|
||||
this.configForm.patchValue(this._initialGeneralConfiguration, { emitEvent: false });
|
||||
} catch (e) {}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { LicenseReport, LicenseReportControllerService } from '@redaction/red-ui-http';
|
||||
import { LicenseReport } from '@redaction/red-ui-http';
|
||||
import { ConfigService } from '@services/config.service';
|
||||
import * as moment from 'moment';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@ -7,6 +7,7 @@ import { ButtonConfig, IconButtonTypes, LoadingService } from '@iqser/common-ui'
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { UserService } from '@services/user.service';
|
||||
import { RouterHistoryService } from '@services/router-history.service';
|
||||
import { LicenseReportService } from '../../services/licence-report.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-license-information-screen',
|
||||
@ -47,7 +48,7 @@ export class LicenseInformationScreenComponent implements OnInit {
|
||||
private readonly _loadingService: LoadingService,
|
||||
readonly routerHistoryService: RouterHistoryService,
|
||||
private readonly _translateService: TranslateService,
|
||||
private readonly _licenseReportController: LicenseReportControllerService,
|
||||
private readonly _licenseReportService: LicenseReportService,
|
||||
) {
|
||||
_loadingService.start();
|
||||
}
|
||||
@ -68,15 +69,15 @@ export class LicenseInformationScreenComponent implements OnInit {
|
||||
endDate: endDate.toDate(),
|
||||
};
|
||||
const promises = [
|
||||
this._licenseReportController.licenseReport(currentConfig).toPromise(),
|
||||
this._licenseReportController.licenseReport({}).toPromise(),
|
||||
this._licenseReportService.licenseReport(currentConfig).toPromise(),
|
||||
this._licenseReportService.licenseReport({}).toPromise(),
|
||||
];
|
||||
|
||||
if (endDate.isBefore(moment())) {
|
||||
const unlicensedConfig = {
|
||||
startDate: endDate.toDate(),
|
||||
};
|
||||
promises.push(this._licenseReportController.licenseReport(unlicensedConfig).toPromise());
|
||||
promises.push(this._licenseReportService.licenseReport(unlicensedConfig).toPromise());
|
||||
}
|
||||
|
||||
Promise.all(promises).then(reports => {
|
||||
@ -131,7 +132,7 @@ export class LicenseInformationScreenComponent implements OnInit {
|
||||
}
|
||||
|
||||
promises.push(
|
||||
this._licenseReportController
|
||||
this._licenseReportService
|
||||
.licenseReport({
|
||||
startDate: moment(`01-${m + 1}-${y}`, 'DD-MM-YYYY').toDate(),
|
||||
endDate: moment(`01-${nm + 1}-${ny}`, 'DD-MM-YYYY').toDate(),
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { PlaceholdersResponse, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http';
|
||||
import { PlaceholdersResponse, ReportTemplate } from '@redaction/red-ui-http';
|
||||
import { download } from '@utils/file-download-utils';
|
||||
import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
@ -13,6 +13,7 @@ import { removeBraces } from '@utils/functions';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { AdminDialogService } from '../../services/admin-dialog.service';
|
||||
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
|
||||
import { ReportTemplateService } from '@services/report-template.service';
|
||||
|
||||
interface Placeholder {
|
||||
placeholder: string;
|
||||
@ -38,7 +39,7 @@ export class ReportsScreenComponent implements OnInit {
|
||||
private readonly _activatedRoute: ActivatedRoute,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dossierTemplatesService: DossierTemplatesService,
|
||||
private readonly _reportTemplateService: ReportTemplateControllerService,
|
||||
private readonly _reportTemplateService: ReportTemplateService,
|
||||
private readonly _dialogService: AdminDialogService,
|
||||
private readonly _toaster: Toaster,
|
||||
private readonly _loadingService: LoadingService,
|
||||
@ -120,7 +121,7 @@ export class ReportsScreenComponent implements OnInit {
|
||||
}
|
||||
|
||||
private async _deleteTemplate(template: ReportTemplate) {
|
||||
await this._reportTemplateService.deleteTemplate(template.dossierTemplateId, template.templateId).toPromise();
|
||||
await this._reportTemplateService.delete(template.dossierTemplateId, template.templateId).toPromise();
|
||||
await this._loadReportTemplates();
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
.editor-container {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
padding-top: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
ngx-monaco-editor {
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
|
||||
import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
import { RulesControllerService } from '@redaction/red-ui-http';
|
||||
import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { saveAs } from 'file-saver';
|
||||
@ -9,6 +8,7 @@ import { ActivatedRoute } from '@angular/router';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
|
||||
import { RulesService } from '../../services/rules.service';
|
||||
import ICodeEditor = monaco.editor.ICodeEditor;
|
||||
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
|
||||
import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions;
|
||||
@ -17,6 +17,7 @@ import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorCon
|
||||
selector: 'redaction-rules-screen',
|
||||
templateUrl: './rules-screen.component.html',
|
||||
styleUrls: ['./rules-screen.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class RulesScreenComponent extends ComponentHasChanges implements OnInit {
|
||||
readonly iconButtonTypes = IconButtonTypes;
|
||||
@ -38,7 +39,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
|
||||
|
||||
constructor(
|
||||
readonly permissionsService: PermissionsService,
|
||||
private readonly _rulesControllerService: RulesControllerService,
|
||||
private readonly _rulesService: RulesService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dossierTemplatesService: DossierTemplatesService,
|
||||
private readonly _toaster: Toaster,
|
||||
@ -88,7 +89,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
|
||||
|
||||
async save(): Promise<void> {
|
||||
this._loadingService.start();
|
||||
await this._rulesControllerService
|
||||
await this._rulesService
|
||||
.uploadRules({
|
||||
rules: this._codeEditor.getModel().getValue(),
|
||||
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
|
||||
@ -148,8 +149,8 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
|
||||
|
||||
private async _initialize() {
|
||||
this._loadingService.start();
|
||||
await this._rulesControllerService
|
||||
.downloadRules(this._dossierTemplatesService.activeDossierTemplateId)
|
||||
await this._rulesService
|
||||
.download(this._dossierTemplatesService.activeDossierTemplateId)
|
||||
.toPromise()
|
||||
.then(
|
||||
rules => {
|
||||
|
||||
@ -5,12 +5,13 @@ import { environment } from '@environments/environment';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
|
||||
import { WatermarkControllerService, WatermarkModel } from '@redaction/red-ui-http';
|
||||
import { WatermarkModel } from '@redaction/red-ui-http';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { BASE_HREF } from '../../../../tokens';
|
||||
import { stampPDFPage } from '@utils/page-stamper';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
|
||||
import { WatermarkService } from '../../services/watermark.service';
|
||||
|
||||
export const DEFAULT_WATERMARK: WatermarkModel = {
|
||||
text: null,
|
||||
@ -37,7 +38,7 @@ export class WatermarkScreenComponent implements OnInit {
|
||||
constructor(
|
||||
readonly permissionsService: PermissionsService,
|
||||
@Inject(BASE_HREF) private readonly _baseHref: string,
|
||||
private readonly _watermarkControllerService: WatermarkControllerService,
|
||||
private readonly _watermarkService: WatermarkService,
|
||||
private readonly _toaster: Toaster,
|
||||
private readonly _http: HttpClient,
|
||||
private readonly _changeDetectorRef: ChangeDetectorRef,
|
||||
@ -79,8 +80,8 @@ export class WatermarkScreenComponent implements OnInit {
|
||||
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
|
||||
|
||||
const observable = watermark.text
|
||||
? this._watermarkControllerService.saveWatermark(watermark, dossierTemplateId)
|
||||
: this._watermarkControllerService.deleteWatermark(dossierTemplateId);
|
||||
? this._watermarkService.saveWatermark(watermark, dossierTemplateId)
|
||||
: this._watermarkService.deleteWatermark(dossierTemplateId);
|
||||
|
||||
observable.toPromise().then(
|
||||
() => {
|
||||
@ -108,7 +109,7 @@ export class WatermarkScreenComponent implements OnInit {
|
||||
}
|
||||
|
||||
private _loadWatermark() {
|
||||
this._watermarkControllerService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe(
|
||||
this._watermarkService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe(
|
||||
watermark => {
|
||||
this._watermark = watermark;
|
||||
this.configForm.setValue({ ...this._watermark });
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
20
apps/red-ui/src/app/modules/admin/services/rules.service.ts
Normal file
20
apps/red-ui/src/app/modules/admin/services/rules.service.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
@ -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']);
|
||||
}
|
||||
}
|
||||
@ -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]);
|
||||
}
|
||||
}
|
||||
@ -1,9 +1,10 @@
|
||||
import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
import { PageRange, ReanalysisControllerService } from '@redaction/red-ui-http';
|
||||
import { PageRange } from '@redaction/red-ui-http';
|
||||
import { InputWithActionComponent, LoadingService, Toaster } from '@iqser/common-ui';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { File } from '@models/file/file';
|
||||
import { ReanalysisService } from '@services/reanalysis.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-page-exclusion',
|
||||
@ -19,7 +20,7 @@ export class PageExclusionComponent implements OnChanges {
|
||||
|
||||
constructor(
|
||||
readonly permissionsService: PermissionsService,
|
||||
private readonly _reanalysisControllerService: ReanalysisControllerService,
|
||||
private readonly _reanalysisService: ReanalysisService,
|
||||
private readonly _toaster: Toaster,
|
||||
private readonly _loadingService: LoadingService,
|
||||
) {}
|
||||
@ -56,7 +57,7 @@ export class PageExclusionComponent implements OnChanges {
|
||||
endPage,
|
||||
};
|
||||
});
|
||||
await this._reanalysisControllerService
|
||||
await this._reanalysisService
|
||||
.excludePages(
|
||||
{
|
||||
pageRanges: pageRanges,
|
||||
@ -75,7 +76,7 @@ export class PageExclusionComponent implements OnChanges {
|
||||
|
||||
async includePagesRange(range: PageRange): Promise<void> {
|
||||
this._loadingService.start();
|
||||
await this._reanalysisControllerService
|
||||
await this._reanalysisService
|
||||
.includePages(
|
||||
{
|
||||
pageRanges: [range],
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core';
|
||||
import { ViewedPages, ViewedPagesControllerService } from '@redaction/red-ui-http';
|
||||
import { ViewedPages } from '@redaction/red-ui-http';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
import { ConfigService } from '@services/config.service';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { ViewedPagesService } from '../../shared/services/viewed-pages.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-page-indicator',
|
||||
@ -24,7 +25,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy {
|
||||
private _subscription: Subscription;
|
||||
|
||||
constructor(
|
||||
private readonly _viewedPagesControllerService: ViewedPagesControllerService,
|
||||
private readonly _viewedPagesService: ViewedPagesService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _configService: ConfigService,
|
||||
@ -105,7 +106,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy {
|
||||
// }
|
||||
|
||||
private _markPageRead() {
|
||||
this._viewedPagesControllerService
|
||||
this._viewedPagesService
|
||||
.addPage({ page: this.number }, this._dossiersService.activeDossierId, this._appStateService.activeFileId)
|
||||
.subscribe(() => {
|
||||
if (this.activePage) {
|
||||
@ -117,7 +118,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
private _markPageUnread() {
|
||||
this._viewedPagesControllerService
|
||||
this._viewedPagesService
|
||||
.removePage(this._dossiersService.activeDossierId, this._appStateService.activeFileId, this.number)
|
||||
.subscribe(() => {
|
||||
this.viewedPages?.pages?.splice(
|
||||
|
||||
@ -1,18 +1,13 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { MatDialogRef } from '@angular/material/dialog';
|
||||
import {
|
||||
DossierRequest,
|
||||
DownloadFileType,
|
||||
IDossierTemplate,
|
||||
ReportTemplate,
|
||||
ReportTemplateControllerService,
|
||||
} from '@redaction/red-ui-http';
|
||||
import { DossierRequest, DownloadFileType, IDossierTemplate, ReportTemplate } from '@redaction/red-ui-http';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import * as moment from 'moment';
|
||||
import { downloadTypesTranslations } from '../../../../translations/download-types-translations';
|
||||
import { IconButtonTypes } from '@iqser/common-ui';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
|
||||
import { ReportTemplateService } from '@services/report-template.service';
|
||||
|
||||
@Component({
|
||||
templateUrl: './add-dossier-dialog.component.html',
|
||||
@ -34,7 +29,7 @@ export class AddDossierDialogComponent {
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _dossierTemplatesService: DossierTemplatesService,
|
||||
private readonly _formBuilder: FormBuilder,
|
||||
private readonly _reportTemplateController: ReportTemplateControllerService,
|
||||
private readonly _reportTemplateController: ReportTemplateService,
|
||||
readonly dialogRef: MatDialogRef<AddDossierDialogComponent>,
|
||||
) {
|
||||
this._filterInvalidDossierTemplates();
|
||||
|
||||
@ -12,7 +12,7 @@ import {
|
||||
TableColumnConfig,
|
||||
TitleColors,
|
||||
} from '@iqser/common-ui';
|
||||
import { FileManagementControllerService, IFile } from '@redaction/red-ui-http';
|
||||
import { IFile } from '@redaction/red-ui-http';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import * as moment from 'moment';
|
||||
import { ConfigService } from '@services/config.service';
|
||||
@ -22,6 +22,7 @@ import { distinctUntilChanged, map } from 'rxjs/operators';
|
||||
import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { FilesService } from '@services/entity-services/files.service';
|
||||
import { FileManagementService } from '../../../shared/services/file-management.service';
|
||||
|
||||
interface FileListItem extends IFile, IListable {
|
||||
readonly canRestore: boolean;
|
||||
@ -55,7 +56,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
|
||||
|
||||
constructor(
|
||||
protected readonly _injector: Injector,
|
||||
private readonly _fileManagementController: FileManagementControllerService,
|
||||
private readonly _fileManagementService: FileManagementService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _filesService: FilesService,
|
||||
private readonly _loadingService: LoadingService,
|
||||
@ -113,7 +114,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
|
||||
|
||||
private async _restore(files: FileListItem[]): Promise<void> {
|
||||
const fileIds = files.map(f => f.fileId);
|
||||
await this._fileManagementController.restoreFiles(fileIds, this.dossier.id).toPromise();
|
||||
await this._fileManagementService.restore(fileIds, this.dossier.id).toPromise();
|
||||
this._removeFromList(fileIds);
|
||||
await this._appStateService.reloadActiveDossierFiles();
|
||||
this.updateDossier.emit();
|
||||
@ -121,7 +122,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
|
||||
|
||||
private async _hardDelete(files: FileListItem[]) {
|
||||
const fileIds = files.map(f => f.fileId);
|
||||
await this._fileManagementController.hardDeleteFile(this.dossier.id, fileIds).toPromise();
|
||||
await this._fileManagementService.hardDelete(this.dossier.id, fileIds).toPromise();
|
||||
this._removeFromList(fileIds);
|
||||
this.updateDossier.emit();
|
||||
}
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
||||
import { DownloadFileType, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http';
|
||||
import { DownloadFileType, ReportTemplate } from '@redaction/red-ui-http';
|
||||
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||
import { Dossier } from '@state/model/dossier';
|
||||
import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
|
||||
import { downloadTypesTranslations } from '../../../../../translations/download-types-translations';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { ReportTemplateService } from '@services/report-template.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-edit-dossier-download-package',
|
||||
@ -24,7 +25,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS
|
||||
|
||||
constructor(
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _reportTemplateController: ReportTemplateControllerService,
|
||||
private readonly _reportTemplateController: ReportTemplateService,
|
||||
private readonly _formBuilder: FormBuilder,
|
||||
) {}
|
||||
|
||||
|
||||
@ -39,6 +39,7 @@ import { AnnotationsListComponent } from './components/file-workload/components/
|
||||
import { AnnotationSourceComponent } from './components/file-workload/components/annotation-source/annotation-source.component';
|
||||
import { OverlayModule } from '@angular/cdk/overlay';
|
||||
import { SharedDossiersModule } from './shared/shared-dossiers.module';
|
||||
import { PlatformSearchService } from './shared/services/platform-search.service';
|
||||
|
||||
const screens = [FilePreviewScreenComponent, SearchScreenComponent];
|
||||
|
||||
@ -84,6 +85,7 @@ const services = [
|
||||
PdfViewerDataService,
|
||||
AnnotationDrawService,
|
||||
AnnotationProcessingService,
|
||||
PlatformSearchService,
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { FileManagementControllerService, ReanalysisControllerService } from '@redaction/red-ui-http';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
import { File } from '@models/file/file';
|
||||
import { FileActionService } from '../../../../shared/services/file-action.service';
|
||||
@ -10,8 +9,10 @@ import { CircleButtonTypes, ConfirmationDialogInput, ListingService, LoadingServ
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { Dossier } from '@state/model/dossier';
|
||||
import { LongPressEvent } from '../../../../../shared/directives/long-press.directive';
|
||||
import { UserPreferenceService } from '../../../../../../services/user-preference.service';
|
||||
import { LongPressEvent } from '@shared/directives/long-press.directive';
|
||||
import { UserPreferenceService } from '@services/user-preference.service';
|
||||
import { FileManagementService } from '../../../../shared/services/file-management.service';
|
||||
import { ReanalysisService } from '@services/reanalysis.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-dossier-overview-bulk-actions',
|
||||
@ -29,8 +30,8 @@ export class DossierOverviewBulkActionsComponent {
|
||||
constructor(
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dialogService: DossiersDialogService,
|
||||
private readonly _fileManagementControllerService: FileManagementControllerService,
|
||||
private readonly _reanalysisControllerService: ReanalysisControllerService,
|
||||
private readonly _fileManagementService: FileManagementService,
|
||||
private readonly _reanalysisService: ReanalysisService,
|
||||
private readonly _permissionsService: PermissionsService,
|
||||
private readonly _fileActionService: FileActionService,
|
||||
private readonly _loadingService: LoadingService,
|
||||
@ -134,8 +135,8 @@ export class DossierOverviewBulkActionsComponent {
|
||||
}),
|
||||
async () => {
|
||||
this._loadingService.start();
|
||||
await this._fileManagementControllerService
|
||||
.deleteFiles(
|
||||
await this._fileManagementService
|
||||
.delete(
|
||||
this.selectedFiles.map(item => item.fileId),
|
||||
this.dossier.dossierId,
|
||||
)
|
||||
@ -158,7 +159,7 @@ export class DossierOverviewBulkActionsComponent {
|
||||
|
||||
reanalyse() {
|
||||
const fileIds = this.selectedFiles.filter(file => file.analysisRequired).map(file => file.fileId);
|
||||
this._performBulkAction(this._reanalysisControllerService.reanalyzeFilesForDossier(fileIds, this.dossier.id));
|
||||
this._performBulkAction(this._reanalysisService.reanalyzeFilesForDossier(fileIds, this.dossier.id));
|
||||
}
|
||||
|
||||
ocr() {
|
||||
|
||||
@ -28,7 +28,7 @@ import { PermissionsService } from '@services/permissions.service';
|
||||
import { timer } from 'rxjs';
|
||||
import { UserPreferenceService } from '@services/user-preference.service';
|
||||
import { UserService } from '@services/user.service';
|
||||
import { FileManagementControllerService, FileStatus, List } from '@redaction/red-ui-http';
|
||||
import { FileStatus, List } from '@redaction/red-ui-http';
|
||||
import { PdfViewerDataService } from '../../services/pdf-viewer-data.service';
|
||||
import { download } from '@utils/file-download-utils';
|
||||
import { ViewMode } from '@models/file/view-mode';
|
||||
@ -44,6 +44,7 @@ import { User } from '@models/user';
|
||||
import { FilesService } from '@services/entity-services/files.service';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { Dossier } from '@state/model/dossier';
|
||||
import { FileManagementService } from '../../shared/services/file-management.service';
|
||||
import Annotation = Core.Annotations.Annotation;
|
||||
|
||||
const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f'];
|
||||
@ -99,7 +100,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
|
||||
private readonly _fileDownloadService: PdfViewerDataService,
|
||||
private readonly _filesService: FilesService,
|
||||
private readonly _ngZone: NgZone,
|
||||
private readonly _fileManagementControllerService: FileManagementControllerService,
|
||||
private readonly _fileManagementService: FileManagementService,
|
||||
private readonly _loadingService: LoadingService,
|
||||
private readonly _filterService: FilterService,
|
||||
private readonly _translateService: TranslateService,
|
||||
@ -515,8 +516,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
|
||||
}
|
||||
|
||||
downloadOriginalFile() {
|
||||
this.addSubscription = this._fileManagementControllerService
|
||||
.downloadOriginalFile(this.fileData.file.dossierId, this.fileId, true, this.fileData.file.cacheIdentifier, 'response')
|
||||
this.addSubscription = this._fileManagementService
|
||||
.downloadOriginalFile(this.fileData.file.dossierId, this.fileId, 'response', true, this.fileData.file.cacheIdentifier)
|
||||
.subscribe(data => {
|
||||
download(data, this.fileData.file.filename);
|
||||
});
|
||||
|
||||
@ -9,7 +9,7 @@ import {
|
||||
SearchPositions,
|
||||
TableColumnConfig,
|
||||
} from '@iqser/common-ui';
|
||||
import { List, MatchedDocument, SearchControllerService, SearchResult } from '@redaction/red-ui-http';
|
||||
import { List, MatchedDocument, SearchResult } from '@redaction/red-ui-http';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { debounceTime, map, skip, switchMap, tap } from 'rxjs/operators';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
@ -18,6 +18,7 @@ import { fileStatusTranslations } from '../../translations/file-status-translati
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { RouterHistoryService } from '@services/router-history.service';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { PlatformSearchService } from '../../shared/services/platform-search.service';
|
||||
|
||||
interface ListItem extends IListable {
|
||||
readonly dossierId: string;
|
||||
@ -69,7 +70,7 @@ export class SearchScreenComponent extends ListingComponent<ListItem> implements
|
||||
private readonly _dossiersService: DossiersService,
|
||||
readonly routerHistoryService: RouterHistoryService,
|
||||
private readonly _translateService: TranslateService,
|
||||
private readonly _searchControllerService: SearchControllerService,
|
||||
private readonly _platformSearchService: PlatformSearchService,
|
||||
) {
|
||||
super(_injector);
|
||||
this.searchService.skip = true;
|
||||
@ -108,7 +109,7 @@ export class SearchScreenComponent extends ListingComponent<ListItem> implements
|
||||
}
|
||||
|
||||
private _search(searchInput: SearchInput): Observable<SearchResult> {
|
||||
return this._searchControllerService.search({
|
||||
return this._platformSearchService.search({
|
||||
dossierIds: [...searchInput.dossierIds],
|
||||
queryString: searchInput.query ?? '',
|
||||
page: 1,
|
||||
|
||||
@ -29,7 +29,7 @@ export class AnnotationActionsService {
|
||||
$event?.stopPropagation();
|
||||
annotations.forEach(annotation => {
|
||||
this._processObsAndEmit(
|
||||
this._manualAnnotationService.approveRequest(annotation.id, annotation.isModifyDictionary),
|
||||
this._manualAnnotationService.approve(annotation.id, annotation.isModifyDictionary),
|
||||
annotation,
|
||||
annotationsChanged,
|
||||
);
|
||||
@ -47,7 +47,7 @@ export class AnnotationActionsService {
|
||||
this._dialogService.openDialog('forceRedaction', $event, null, (request: ForceRedactionRequest) => {
|
||||
annotations.forEach(annotation => {
|
||||
this._processObsAndEmit(
|
||||
this._manualAnnotationService.forceRedaction({
|
||||
this._manualAnnotationService.force({
|
||||
...request,
|
||||
annotationId: annotation.id,
|
||||
}),
|
||||
@ -98,7 +98,7 @@ export class AnnotationActionsService {
|
||||
this._dialogService.openDialog('recategorizeImage', $event, annotations, (data: { type: string; comment: string }) => {
|
||||
annotations.forEach(annotation => {
|
||||
this._processObsAndEmit(
|
||||
this._manualAnnotationService.recategorizeImage(annotation.annotationId, data.type, data.comment),
|
||||
this._manualAnnotationService.recategorizeImg(annotation.annotationId, data.type, data.comment),
|
||||
annotation,
|
||||
annotationsChanged,
|
||||
);
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Core, WebViewerInstance } from '@pdftron/webviewer';
|
||||
import { Rectangle, RedactionLogControllerService, SectionGrid, SectionRectangle } from '@redaction/red-ui-http';
|
||||
import { Rectangle, SectionGrid, SectionRectangle } from '@redaction/red-ui-http';
|
||||
import { hexToRgb } from '@utils/functions';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
|
||||
import { UserPreferenceService } from '@services/user-preference.service';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { RedactionLogService } from './redaction-log.service';
|
||||
import Annotation = Core.Annotations.Annotation;
|
||||
|
||||
@Injectable()
|
||||
@ -13,7 +14,7 @@ export class AnnotationDrawService {
|
||||
constructor(
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _redactionLogControllerService: RedactionLogControllerService,
|
||||
private readonly _redactionLogService: RedactionLogService,
|
||||
private readonly _userPreferenceService: UserPreferenceService,
|
||||
) {}
|
||||
|
||||
@ -29,7 +30,7 @@ export class AnnotationDrawService {
|
||||
annotationManager.drawAnnotationsFromList(annotations);
|
||||
|
||||
if (this._userPreferenceService.areDevFeaturesEnabled) {
|
||||
this._redactionLogControllerService
|
||||
this._redactionLogService
|
||||
.getSectionGrid(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
|
||||
.subscribe(sectionGrid => {
|
||||
this._drawSections(activeViewer, sectionGrid);
|
||||
|
||||
@ -1,8 +1,17 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Injectable, Injector } from '@angular/core';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { AddRedactionRequest, ForceRedactionRequest, ManualRedactionControllerService } from '@redaction/red-ui-http';
|
||||
import {
|
||||
AddRedactionRequest,
|
||||
ApproveRequest,
|
||||
CommentResponse,
|
||||
ForceRedactionRequest,
|
||||
ImageRecategorizationRequest,
|
||||
LegalBasisChangeRequest,
|
||||
ManualAddResponse,
|
||||
RemoveRedactionRequest,
|
||||
} from '@redaction/red-ui-http';
|
||||
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
|
||||
import { ErrorMessageService, Toaster } from '@iqser/common-ui';
|
||||
import { ErrorMessageService, GenericService, RequiredParam, Toaster, Validate } from '@iqser/common-ui';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { tap } from 'rxjs/operators';
|
||||
import { UserService } from '@services/user.service';
|
||||
@ -13,7 +22,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
|
||||
@Injectable()
|
||||
export class ManualAnnotationService {
|
||||
export class ManualAnnotationService extends GenericService<ManualAddResponse> {
|
||||
CONFIG: {
|
||||
[key in AnnotationActionMode]: string;
|
||||
};
|
||||
@ -24,10 +33,11 @@ export class ManualAnnotationService {
|
||||
private readonly _userService: UserService,
|
||||
private readonly _translateService: TranslateService,
|
||||
private readonly _toaster: Toaster,
|
||||
private readonly _manualRedactionControllerService: ManualRedactionControllerService,
|
||||
private readonly _permissionsService: PermissionsService,
|
||||
private readonly _errorMessageService: ErrorMessageService,
|
||||
protected readonly _injector: Injector,
|
||||
) {
|
||||
super(_injector, 'manualRedaction');
|
||||
this.CONFIG = {
|
||||
add: 'addRedaction',
|
||||
'recategorize-image': 'recategorizeImage',
|
||||
@ -47,17 +57,8 @@ export class ManualAnnotationService {
|
||||
|
||||
_makeRequest(mode: AnnotationActionMode, body: any, secondParam: any = null, modifyDictionary = false) {
|
||||
const obs = !secondParam
|
||||
? this._manualRedactionControllerService[this.CONFIG[mode]](
|
||||
body,
|
||||
this._dossiersService.activeDossierId,
|
||||
this._appStateService.activeFileId,
|
||||
)
|
||||
: this._manualRedactionControllerService[this.CONFIG[mode]](
|
||||
body,
|
||||
secondParam,
|
||||
this._dossiersService.activeDossierId,
|
||||
this._appStateService.activeFileId,
|
||||
);
|
||||
? this[this.CONFIG[mode]](body, this._dossiersService.activeDossierId, this._appStateService.activeFileId)
|
||||
: this[this.CONFIG[mode]](body, secondParam, this._dossiersService.activeDossierId, this._appStateService.activeFileId);
|
||||
|
||||
return obs.pipe(
|
||||
tap(
|
||||
@ -72,25 +73,26 @@ export class ManualAnnotationService {
|
||||
);
|
||||
}
|
||||
|
||||
// Comments
|
||||
// this wraps /manualRedaction/comment/add
|
||||
addComment(comment: string, annotationId: string) {
|
||||
return this._manualRedactionControllerService.addComment(
|
||||
{ text: comment },
|
||||
annotationId,
|
||||
this._dossiersService.activeDossierId,
|
||||
this._appStateService.activeFileId,
|
||||
);
|
||||
@Validate()
|
||||
addComment(
|
||||
@RequiredParam() comment: string,
|
||||
@RequiredParam() annotationId: string,
|
||||
dossierId = this._dossiersService.activeDossierId,
|
||||
fileId = this._appStateService.activeFileId,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/comment/add/${dossierId}/${fileId}/${annotationId}`;
|
||||
return this._post<CommentResponse>({ text: comment }, url);
|
||||
}
|
||||
|
||||
// this wraps /manualRedaction/comment/undo
|
||||
deleteComment(commentId: string, annotationId: string) {
|
||||
return this._manualRedactionControllerService.undoComment(
|
||||
annotationId,
|
||||
commentId,
|
||||
this._dossiersService.activeDossierId,
|
||||
this._appStateService.activeFileId,
|
||||
);
|
||||
@Validate()
|
||||
deleteComment(
|
||||
@RequiredParam() commentId: string,
|
||||
@RequiredParam() annotationId: string,
|
||||
dossierId = this._dossiersService.activeDossierId,
|
||||
fileId = this._appStateService.activeFileId,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/comment/undo/${dossierId}/${fileId}/${annotationId}/${commentId}`;
|
||||
return super.delete({}, url);
|
||||
}
|
||||
|
||||
addRecommendation(annotation: AnnotationWrapper) {
|
||||
@ -116,7 +118,7 @@ export class ManualAnnotationService {
|
||||
// this wraps
|
||||
// /manualRedaction/redaction/recategorize
|
||||
// /manualRedaction/request/recategorize
|
||||
recategorizeImage(annotationId: string, type: string, comment: string) {
|
||||
recategorizeImg(annotationId: string, type: string, comment: string) {
|
||||
const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'recategorize-image' : 'request-image-recategorization';
|
||||
return this._makeRequest(mode, { annotationId, type, comment });
|
||||
}
|
||||
@ -132,14 +134,14 @@ export class ManualAnnotationService {
|
||||
// this wraps
|
||||
// /manualRedaction/redaction/force
|
||||
// /manualRedaction/request/force
|
||||
forceRedaction(request: ForceRedactionRequest) {
|
||||
force(request: ForceRedactionRequest) {
|
||||
const mode: AnnotationActionMode = this._permissionsService.isApprover() ? 'force-redaction' : 'request-force-redaction';
|
||||
return this._makeRequest(mode, request);
|
||||
}
|
||||
|
||||
// this wraps
|
||||
// /manualRedaction/approve
|
||||
approveRequest(annotationId: string, addToDictionary: boolean = false) {
|
||||
approve(annotationId: string, addToDictionary: boolean = false) {
|
||||
// for only here - approve the request
|
||||
return this._makeRequest('approve', { addOrRemoveFromDictionary: addToDictionary }, annotationId, addToDictionary);
|
||||
}
|
||||
@ -213,6 +215,109 @@ export class ManualAnnotationService {
|
||||
}
|
||||
}
|
||||
|
||||
@Validate()
|
||||
addRedaction(@RequiredParam() body: AddRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
|
||||
const url = `${this._defaultModelPath}/redaction/add/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
recategorizeImage(
|
||||
@RequiredParam() body: ImageRecategorizationRequest,
|
||||
@RequiredParam() dossierId: string,
|
||||
@RequiredParam() fileId: string,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/redaction/recategorize/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
requestImageRecategorization(
|
||||
@RequiredParam() body: ImageRecategorizationRequest,
|
||||
@RequiredParam() dossierId: string,
|
||||
@RequiredParam() fileId: string,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/request/recategorize/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
legalBasisChange(@RequiredParam() body: LegalBasisChangeRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
|
||||
const url = `${this._defaultModelPath}/redaction/legalBasisChange/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
requestLegalBasisChange(
|
||||
@RequiredParam() body: LegalBasisChangeRequest,
|
||||
@RequiredParam() dossierId: string,
|
||||
@RequiredParam() fileId: string,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/request/legalBasis/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
requestRemoveRedaction(
|
||||
@RequiredParam() body: RemoveRedactionRequest,
|
||||
@RequiredParam() dossierId: string,
|
||||
@RequiredParam() fileId: string,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/request/remove/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
approveRequest(
|
||||
@RequiredParam() body: ApproveRequest,
|
||||
@RequiredParam() annotationId: string,
|
||||
@RequiredParam() dossierId: string,
|
||||
@RequiredParam() fileId: string,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/approve/${dossierId}/${fileId}`;
|
||||
return this._post<unknown>(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
declineRequest(@RequiredParam() annotationId: string, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
|
||||
const url = `${this._defaultModelPath}/decline/${dossierId}/${fileId}/${annotationId}`;
|
||||
return this._post<unknown>({}, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
undo(@RequiredParam() annotationId: string, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
|
||||
const url = `${this._defaultModelPath}/undo/${dossierId}/${fileId}/${annotationId}`;
|
||||
return super.delete({}, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
removeRedaction(@RequiredParam() body: RemoveRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
|
||||
const url = `${this._defaultModelPath}/redaction/remove/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
requestAddRedaction(@RequiredParam() body: AddRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
|
||||
const url = `${this._defaultModelPath}/request/add/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
forceRedaction(@RequiredParam() body: ForceRedactionRequest, @RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
|
||||
const url = `${this._defaultModelPath}/redaction/force/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
@Validate()
|
||||
requestForceRedaction(
|
||||
@RequiredParam() body: ForceRedactionRequest,
|
||||
@RequiredParam() dossierId: string,
|
||||
@RequiredParam() fileId: string,
|
||||
) {
|
||||
const url = `${this._defaultModelPath}/request/force/${dossierId}/${fileId}`;
|
||||
return this._post(body, url);
|
||||
}
|
||||
|
||||
private _getMessage(mode: AnnotationActionMode, modifyDictionary?: boolean, error: boolean = false) {
|
||||
const type = modifyDictionary ? 'dictionary' : 'manual-redaction';
|
||||
const resultType = error ? 'error' : 'success';
|
||||
|
||||
@ -1,17 +1,14 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { forkJoin, Observable, of } from 'rxjs';
|
||||
import { catchError, map, tap } from 'rxjs/operators';
|
||||
import {
|
||||
FileManagementControllerService,
|
||||
ManualRedactionControllerService,
|
||||
RedactionLogControllerService,
|
||||
ViewedPagesControllerService,
|
||||
} from '@redaction/red-ui-http';
|
||||
import { FileDataModel } from '@models/file/file-data.model';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
import { File } from '@models/file/file';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { FileManagementService } from '../shared/services/file-management.service';
|
||||
import { RedactionLogService } from './redaction-log.service';
|
||||
import { ViewedPagesService } from '../shared/services/viewed-pages.service';
|
||||
|
||||
@Injectable()
|
||||
export class PdfViewerDataService {
|
||||
@ -19,21 +16,18 @@ export class PdfViewerDataService {
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _permissionsService: PermissionsService,
|
||||
private readonly _man: ManualRedactionControllerService,
|
||||
private readonly _fileManagementControllerService: FileManagementControllerService,
|
||||
private readonly _redactionLogControllerService: RedactionLogControllerService,
|
||||
private readonly _viewedPagesControllerService: ViewedPagesControllerService,
|
||||
private readonly _fileManagementService: FileManagementService,
|
||||
private readonly _redactionLogService: RedactionLogService,
|
||||
private readonly _viewedPagesService: ViewedPagesService,
|
||||
) {}
|
||||
|
||||
loadActiveFileRedactionLog() {
|
||||
return this._redactionLogControllerService
|
||||
.getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
|
||||
.pipe(
|
||||
tap(
|
||||
redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page),
|
||||
catchError(() => of({})),
|
||||
),
|
||||
);
|
||||
return this._redactionLogService.getRedactionLog(this._dossiersService.activeDossierId, this._appStateService.activeFileId).pipe(
|
||||
tap(
|
||||
redactionLog => redactionLog.redactionLogEntry.sort((a, b) => a.positions[0].page - b.positions[0].page),
|
||||
catchError(() => of({})),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
loadActiveFileData(): Observable<FileDataModel> {
|
||||
@ -48,7 +42,7 @@ export class PdfViewerDataService {
|
||||
|
||||
getViewedPagesForActiveFile() {
|
||||
if (this._permissionsService.canMarkPagesAsViewed()) {
|
||||
return this._viewedPagesControllerService
|
||||
return this._viewedPagesService
|
||||
.getViewedPages(this._dossiersService.activeDossierId, this._appStateService.activeFileId)
|
||||
.pipe(catchError(() => of({ pages: [] })));
|
||||
}
|
||||
@ -56,6 +50,6 @@ export class PdfViewerDataService {
|
||||
}
|
||||
|
||||
downloadOriginalFile(file: File): Observable<any> {
|
||||
return this._fileManagementControllerService.downloadOriginalFile(file.dossierId, file.fileId, true, file.cacheIdentifier, 'body');
|
||||
return this._fileManagementService.downloadOriginalFile(file.dossierId, file.fileId, 'body', true, file.cacheIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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');
|
||||
}
|
||||
}
|
||||
@ -13,7 +13,7 @@ import {
|
||||
StatusBarConfig,
|
||||
Toaster,
|
||||
} from '@iqser/common-ui';
|
||||
import { FileManagementControllerService, FileStatus } from '@redaction/red-ui-http';
|
||||
import { FileStatus } from '@redaction/red-ui-http';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { UserService } from '@services/user.service';
|
||||
import { filter } from 'rxjs/operators';
|
||||
@ -21,6 +21,7 @@ import { UserPreferenceService } from '@services/user-preference.service';
|
||||
import { LongPressEvent } from '@shared/directives/long-press.directive';
|
||||
import { FileActionService } from '../../services/file-action.service';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { FileManagementService } from '../../services/file-management.service';
|
||||
|
||||
@Component({
|
||||
selector: 'redaction-file-actions',
|
||||
@ -66,7 +67,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
|
||||
private readonly _dialogService: DossiersDialogService,
|
||||
private readonly _fileActionService: FileActionService,
|
||||
private readonly _loadingService: LoadingService,
|
||||
private readonly _fileManagementControllerService: FileManagementControllerService,
|
||||
private readonly _fileManagementService: FileManagementService,
|
||||
private readonly _userService: UserService,
|
||||
private readonly _toaster: Toaster,
|
||||
private readonly _userPreferenceService: UserPreferenceService,
|
||||
@ -135,8 +136,8 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
|
||||
}),
|
||||
async () => {
|
||||
this._loadingService.start();
|
||||
await this._fileManagementControllerService
|
||||
.deleteFiles([this.file.fileId], this.file.dossierId)
|
||||
await this._fileManagementService
|
||||
.delete([this.file.fileId], this.file.dossierId)
|
||||
.toPromise()
|
||||
.catch(error => {
|
||||
this._toaster.error(_('error.http.generic'), { params: error });
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { UserService } from '@services/user.service';
|
||||
import { ReanalysisControllerService } from '@redaction/red-ui-http';
|
||||
import { File } from '@models/file/file';
|
||||
import { PermissionsService } from '@services/permissions.service';
|
||||
import { DossiersDialogService } from '../../services/dossiers-dialog.service';
|
||||
@ -9,6 +8,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { FilesService } from '@services/entity-services/files.service';
|
||||
import { ConfirmationDialogInput } from '@iqser/common-ui';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { ReanalysisService } from '@services/reanalysis.service';
|
||||
|
||||
@Injectable()
|
||||
export class FileActionService {
|
||||
@ -17,17 +17,17 @@ export class FileActionService {
|
||||
private readonly _permissionsService: PermissionsService,
|
||||
private readonly _userService: UserService,
|
||||
private readonly _fileService: FilesService,
|
||||
private readonly _reanalysisControllerService: ReanalysisControllerService,
|
||||
private readonly _reanalysisService: ReanalysisService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _dossiersService: DossiersService,
|
||||
) {}
|
||||
|
||||
reanalyseFile(file = this._appStateService.activeFile) {
|
||||
return this._reanalysisControllerService.reanalyzeFile(this._dossiersService.activeDossier.id, file.fileId, true);
|
||||
return this._reanalysisService.reanalyzeFilesForDossier([file.fileId], this._dossiersService.activeDossier.id, true);
|
||||
}
|
||||
|
||||
toggleAnalysis(file = this._appStateService.activeFile) {
|
||||
return this._reanalysisControllerService.toggleAnalysis(file.dossierId, file.fileId, !file.excluded);
|
||||
return this._reanalysisService.toggleAnalysis(file.dossierId, file.fileId, !file.excluded);
|
||||
}
|
||||
|
||||
async assignToMe(files?: File[], callback?: Function) {
|
||||
@ -78,7 +78,7 @@ export class FileActionService {
|
||||
}
|
||||
|
||||
ocrFiles(files: File[]) {
|
||||
return this._reanalysisControllerService.ocrFiles(
|
||||
return this._reanalysisService.ocrFiles(
|
||||
files.map(f => f.fileId),
|
||||
this._dossiersService.activeDossierId,
|
||||
);
|
||||
|
||||
@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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]);
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
import { ApplicationRef, Injectable } from '@angular/core';
|
||||
import { ApplicationRef, Injectable, Injector } from '@angular/core';
|
||||
import { FileUploadModel } from '../model/file-upload.model';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { HttpErrorResponse, HttpEventType } from '@angular/common/http';
|
||||
@ -6,10 +6,11 @@ import { interval, Subscription } from 'rxjs';
|
||||
import { ConfigService } from '@services/config.service';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { UploadDownloadDialogService } from './upload-download-dialog.service';
|
||||
import { UploadControllerService } from '@redaction/red-ui-http';
|
||||
import { FileUploadResult } from '@redaction/red-ui-http';
|
||||
import { isCsv } from '@utils/file-drop-utils';
|
||||
import { ErrorMessageService } from '@iqser/common-ui';
|
||||
import { ErrorMessageService, GenericService, RequiredParam, Validate } from '@iqser/common-ui';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { HeadersConfiguration } from '../../../../../../../libs/common-ui/src/lib/utils/headers-configuration';
|
||||
|
||||
export interface ActiveUpload {
|
||||
subscription: Subscription;
|
||||
@ -17,7 +18,7 @@ export interface ActiveUpload {
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class FileUploadService {
|
||||
export class FileUploadService extends GenericService<FileUploadResult> {
|
||||
static readonly MAX_PARALLEL_UPLOADS = 5;
|
||||
files: FileUploadModel[] = [];
|
||||
groupedFiles: { [key: string]: FileUploadModel[] } = {};
|
||||
@ -32,11 +33,11 @@ export class FileUploadService {
|
||||
private readonly _applicationRef: ApplicationRef,
|
||||
private readonly _translateService: TranslateService,
|
||||
private readonly _configService: ConfigService,
|
||||
private readonly _uploadControllerService: UploadControllerService,
|
||||
private readonly _dialogService: UploadDownloadDialogService,
|
||||
private readonly _errorMessageService: ErrorMessageService,
|
||||
protected readonly _injector: Injector,
|
||||
) {
|
||||
this._uploadControllerService.defaultHeaders = this._uploadControllerService.defaultHeaders.append('ngsw-bypass', 'true');
|
||||
super(_injector, 'upload');
|
||||
interval(2500).subscribe(() => {
|
||||
this._handleUploads();
|
||||
});
|
||||
@ -120,6 +121,23 @@ export class FileUploadService {
|
||||
}
|
||||
}
|
||||
|
||||
@Validate()
|
||||
uploadFileForm(@RequiredParam() dossierId: string, file?: Blob) {
|
||||
const formParams = new FormData();
|
||||
|
||||
if (file !== undefined) {
|
||||
formParams.append('file', file);
|
||||
}
|
||||
|
||||
const headers = HeadersConfiguration.getHeaders({ contentType: false }).append('ngsw-bypass', 'true');
|
||||
|
||||
return this._http.post<FileUploadResult>(`/${this._defaultModelPath}/${dossierId}`, formParams, {
|
||||
headers,
|
||||
observe: 'events',
|
||||
reportProgress: true,
|
||||
});
|
||||
}
|
||||
|
||||
private _addFileToGroup(file: FileUploadModel) {
|
||||
if (!this.groupedFiles[file.dossierId]) {
|
||||
this.groupedFiles[file.dossierId] = [];
|
||||
@ -155,7 +173,7 @@ export class FileUploadService {
|
||||
|
||||
private _createSubscription(uploadFile: FileUploadModel) {
|
||||
this.activeUploads++;
|
||||
const obs = this._uploadControllerService.uploadFileForm(uploadFile.dossierId, uploadFile.file, 'events', true);
|
||||
const obs = this.uploadFileForm(uploadFile.dossierId, uploadFile.file);
|
||||
return obs.subscribe(
|
||||
async event => {
|
||||
if (event.type === HttpEventType.UploadProgress) {
|
||||
|
||||
22
apps/red-ui/src/app/services/general-settings.service.ts
Normal file
22
apps/red-ui/src/app/services/general-settings.service.ts
Normal 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`);
|
||||
}
|
||||
}
|
||||
32
apps/red-ui/src/app/services/notifications.service.ts
Normal file
32
apps/red-ui/src/app/services/notifications.service.ts
Normal 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]);
|
||||
}
|
||||
}
|
||||
57
apps/red-ui/src/app/services/reanalysis.service.ts
Normal file
57
apps/red-ui/src/app/services/reanalysis.service.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
61
apps/red-ui/src/app/services/report-template.service.ts
Normal file
61
apps/red-ui/src/app/services/report-template.service.ts
Normal 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 }),
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Colors, IFile, ReanalysisControllerService } from '@redaction/red-ui-http';
|
||||
import { Colors, IFile } from '@redaction/red-ui-http';
|
||||
import { ActivationEnd, Router } from '@angular/router';
|
||||
import { UserService } from '@services/user.service';
|
||||
import { forkJoin, Observable, of, Subject } from 'rxjs';
|
||||
@ -15,6 +15,7 @@ import { FilesService } from '@services/entity-services/files.service';
|
||||
import { DictionaryService } from '@shared/services/dictionary.service';
|
||||
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
|
||||
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
|
||||
import { ReanalysisService } from '@services/reanalysis.service';
|
||||
|
||||
export interface AppState {
|
||||
activeFileId?: string;
|
||||
@ -35,7 +36,7 @@ export class AppStateService {
|
||||
private readonly _userService: UserService,
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _filesService: FilesService,
|
||||
private readonly _reanalysisControllerService: ReanalysisControllerService,
|
||||
private readonly _reanalysisService: ReanalysisService,
|
||||
private readonly _dictionaryService: DictionaryService,
|
||||
private readonly _dossierTemplatesService: DossierTemplatesService,
|
||||
private readonly _fileAttributesService: FileAttributesService,
|
||||
@ -176,7 +177,7 @@ export class AppStateService {
|
||||
}
|
||||
|
||||
async reanalyzeDossier({ id } = this._dossiersService.activeDossier) {
|
||||
await this._reanalysisControllerService.reanalyzeDossier(id, true).toPromise();
|
||||
await this._reanalysisService.reanalyzeDossier(id, true).toPromise();
|
||||
}
|
||||
|
||||
async activateFile(dossierId: string, fileId: string) {
|
||||
|
||||
@ -1,21 +1,21 @@
|
||||
import { GeneralSettingsControllerService } from '@redaction/red-ui-http';
|
||||
import { catchError, filter, mergeMap, take, tap } from 'rxjs/operators';
|
||||
import { ConfigService } from '@services/config.service';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { of } from 'rxjs';
|
||||
import { KeycloakEventType, KeycloakService } from 'keycloak-angular';
|
||||
import { GeneralSettingsService } from '@services/general-settings.service';
|
||||
|
||||
export function configurationInitializer(
|
||||
keycloakService: KeycloakService,
|
||||
title: Title,
|
||||
configService: ConfigService,
|
||||
generalSettingsControllerService: GeneralSettingsControllerService,
|
||||
generalSettingsService: GeneralSettingsService,
|
||||
) {
|
||||
return () =>
|
||||
keycloakService.keycloakEvents$
|
||||
.pipe(
|
||||
filter(event => event.type === KeycloakEventType.OnReady),
|
||||
mergeMap(() => generalSettingsControllerService.getGeneralConfigurations()),
|
||||
mergeMap(() => generalSettingsService.getGeneralConfigurations()),
|
||||
tap(configuration => configService.updateDisplayName(configuration.displayName)),
|
||||
catchError(() => {
|
||||
title.setTitle('RedactManager');
|
||||
|
||||
@ -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 }],
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -2,5 +2,4 @@ export * from './api/api';
|
||||
export * from './model/models';
|
||||
export * from './variables';
|
||||
export * from './configuration';
|
||||
export * from './api.module';
|
||||
export * from './red-types';
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user