diff --git a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts index c41fd089c..f657dc156 100644 --- a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts @@ -15,12 +15,14 @@ import { GeneralConfigScreenComponent } from './screens/general-config/general-c import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component'; import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component'; import { DossierTemplatesGuard } from '@guards/dossier-templates.guard'; -import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE, WATERMARK_ID } from '@red/domain'; import { DossierTemplateExistsGuard } from '@guards/dossier-template-exists.guard'; import { EntityExistsGuard } from '@guards/entity-exists-guard.service'; import { DossierStatesListingScreenComponent } from './screens/dossier-states-listing/dossier-states-listing-screen.component'; import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component'; import { PermissionsGuard } from '../../guards/permissions-guard'; +import { WatermarksListingScreenComponent } from './screens/watermarks-listing/watermarks-listing-screen.component'; +import { BaseWatermarkScreenComponent } from './base-watermark-screen/base-watermark-screen.component'; const dossierTemplateIdRoutes: Routes = [ { @@ -69,13 +71,26 @@ const dossierTemplateIdRoutes: Routes = [ }, }, { - path: 'watermark', - component: BaseDossierTemplateScreenComponent, - canActivate: [CompositeRouteGuard], - data: { - routeGuards: [AuthGuard, RedRoleGuard], - }, - loadChildren: () => import('./screens/watermark/watermark.module').then(m => m.WatermarkModule), + path: 'watermarks', + children: [ + { + path: '', + component: WatermarksListingScreenComponent, + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard], + }, + }, + { + path: `:${WATERMARK_ID}`, + component: BaseWatermarkScreenComponent, + canActivate: [CompositeRouteGuard], + loadChildren: () => import('./screens/watermark/watermark.module').then(m => m.WatermarkModule), + data: { + routeGuards: [AuthGuard, RedRoleGuard], + }, + }, + ], }, { path: 'reports', diff --git a/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts b/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts index 5efadeea0..47b8f12ab 100644 --- a/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts +++ b/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts @@ -59,7 +59,7 @@ export class AdminSideNavComponent implements OnInit { hideIf: !this.userPreferenceService.areDevFeaturesEnabled, }, { screen: 'default-colors', label: _('admin-side-nav.default-colors') }, - { screen: 'watermark', label: _('admin-side-nav.watermark') }, + { screen: 'watermarks', label: _('admin-side-nav.watermarks') }, { screen: 'file-attributes', label: _('admin-side-nav.file-attributes') }, { screen: 'dossier-attributes', label: _('admin-side-nav.dossier-attributes') }, { screen: 'dossier-states', label: _('admin-side-nav.dossier-states') }, diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts index 569e9506f..91432eb9e 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -46,6 +46,8 @@ import { SystemPreferencesFormComponent } from './screens/general-config/system- import { ConfigureCertificateDialogComponent } from './dialogs/configure-digital-signature-dialog/configure-certificate-dialog.component'; import { PkcsSignatureConfigurationComponent } from './dialogs/configure-digital-signature-dialog/form/pkcs-signature-configuration/pkcs-signature-configuration.component'; import { KmsSignatureConfigurationComponent } from './dialogs/configure-digital-signature-dialog/form/kms-signature-configuration/kms-signature-configuration.component'; +import { WatermarksListingScreenComponent } from './screens/watermarks-listing/watermarks-listing-screen.component'; +import { BaseWatermarkScreenComponent } from './base-watermark-screen/base-watermark-screen.component'; const dialogs = [ AddEditCloneDossierTemplateDialogComponent, @@ -73,6 +75,7 @@ const screens = [ GeneralConfigScreenComponent, DossierAttributesListingScreenComponent, DossierStatesListingScreenComponent, + WatermarksListingScreenComponent, ]; const components = [ @@ -85,6 +88,7 @@ const components = [ BaseAdminScreenComponent, BaseDossierTemplateScreenComponent, BaseEntityScreenComponent, + BaseWatermarkScreenComponent, GeneralConfigFormComponent, SmtpFormComponent, SystemPreferencesFormComponent, diff --git a/apps/red-ui/src/app/modules/admin/base-watermark-screen/base-watermark-screen.component.html b/apps/red-ui/src/app/modules/admin/base-watermark-screen/base-watermark-screen.component.html new file mode 100644 index 000000000..ebc6f12c6 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/base-watermark-screen/base-watermark-screen.component.html @@ -0,0 +1,27 @@ +
+ + +
+
+ + +
+
diff --git a/apps/red-ui/src/app/modules/admin/base-watermark-screen/base-watermark-screen.component.ts b/apps/red-ui/src/app/modules/admin/base-watermark-screen/base-watermark-screen.component.ts new file mode 100644 index 000000000..c812d7357 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/base-watermark-screen/base-watermark-screen.component.ts @@ -0,0 +1,57 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { firstValueFrom } from 'rxjs'; +import { AdminDialogService } from '../services/admin-dialog.service'; +import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui'; +import { WatermarkService } from '../../../services/entity-services/watermark.service'; +import { DOSSIER_TEMPLATE_ID, WATERMARK_ID } from '@red/domain'; +import { ActivatedRoute, Router } from '@angular/router'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; + +@Component({ + templateUrl: './base-watermark-screen.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class BaseWatermarkScreenComponent { + readonly #dossierTemplateId: string; + readonly #watermarkId: string; + + constructor( + private readonly _dialogService: AdminDialogService, + private readonly _loadingService: LoadingService, + private readonly _watermarkService: WatermarkService, + private readonly _toaster: Toaster, + private readonly _route: ActivatedRoute, + private readonly _router: Router, + ) { + this.#dossierTemplateId = _route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.#watermarkId = _route.snapshot.paramMap.get(WATERMARK_ID); + } + + async openDeleteWatermarkDialog($event: MouseEvent): Promise { + const isUsed = await firstValueFrom(this._watermarkService.isWatermarkUsed(this.#watermarkId)); + + if (!isUsed) { + await this._deleteWatermark(this.#watermarkId); + return; + } + + const data = new ConfirmationDialogInput({ + question: _('watermarks-listing.watermark-is-used'), + }); + this._dialogService.openDialog('confirm', $event, data, async () => { + await this._deleteWatermark(this.#watermarkId); + }); + } + + private async _deleteWatermark(watermarkId: string): Promise { + this._loadingService.start(); + await firstValueFrom(this._watermarkService.deleteWatermark(watermarkId)); + this._toaster.success(_('watermarks-listing.action.delete-success')); + await this._router.navigate([`/main/admin/dossier-templates/${this.#dossierTemplateId}/watermarks`]); + this._loadingService.stop(); + } + + get editMode(): boolean { + return !!Number(this.#watermarkId); + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.html index 92df155d7..9a05c9caa 100644 --- a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.html @@ -3,7 +3,7 @@
-
-
+
+ + +
+ +
+
-
- - {{ 'add-dossier-dialog.form.watermark' | translate }} - -
+ +
+ + {{ 'add-dossier-dialog.form.watermark' | translate }} + + + + + {{ watermark.name }} + + + +
-
- - {{ 'add-dossier-dialog.form.watermark-preview' | translate }} - -
+
+ + {{ 'add-dossier-dialog.form.watermark' | translate }} + + + + + {{ watermark.name }} + + + +
+
diff --git a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.scss b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.scss index 077d4cb22..bc9000977 100644 --- a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.scss +++ b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.scss @@ -1,11 +1,3 @@ -.watermark { - margin-top: 24px; -} - -.watermark-preview { - margin-top: 8px; -} - .due-date { margin-top: 8px; min-height: 34px; @@ -27,3 +19,13 @@ redaction-select { flex: 1; } + +.watermark { + width: 315px; + max-width: 315px; + + mat-form-field { + margin-left: 22px; + margin-top: -10px; + } +} diff --git a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts index 440d5b370..d156b069c 100644 --- a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts @@ -1,6 +1,6 @@ import { Component, Inject, Injector, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { DOSSIER_TEMPLATE_ID, DownloadFileType, IDossierRequest, IDossierTemplate, IReportTemplate } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, DownloadFileType, IDossierRequest, IDossierTemplate, IReportTemplate, IWatermark } from '@red/domain'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { downloadTypesTranslations } from '@translations/download-types-translations'; import { BaseDialogComponent, IconButtonTypes, LoadingService, SaveOptions } from '@iqser/common-ui'; @@ -11,6 +11,7 @@ import { firstValueFrom } from 'rxjs'; import dayjs from 'dayjs'; import { Router } from '@angular/router'; import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service'; +import { WatermarkService } from '@services/entity-services/watermark.service'; interface DialogData { readonly dossierTemplateId?: string; @@ -32,6 +33,9 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On ); dossierTemplates: IDossierTemplate[]; availableReportTypes = []; + watermarks: IWatermark[] = []; + oldWatermarkId: string; + oldPreviewWatermarkID: string; constructor( private readonly _activeDossiersService: ActiveDossiersService, @@ -41,6 +45,7 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On private readonly _router: Router, private readonly _dialogService: DossiersDialogService, private readonly _loadingService: LoadingService, + private readonly _watermarkService: WatermarkService, protected readonly _injector: Injector, protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) readonly data: DialogData, @@ -68,7 +73,11 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On } async ngOnInit(): Promise { - await this.dossierTemplateChanged(this.form.get('dossierTemplateId').value); + const dossierTemplateId = this.form.get('dossierTemplateId').value; + await this.dossierTemplateChanged(dossierTemplateId); + this.watermarks = await firstValueFrom(this._watermarkService.getWatermarks(dossierTemplateId)); + this.oldWatermarkId = this.watermarks[0]?.id; + this.oldPreviewWatermarkID = this.watermarks[0]?.id; } reportTemplateValueMapper = (reportTemplate: IReportTemplate) => reportTemplate.templateId; @@ -125,8 +134,8 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On reportTemplateIds: [null], description: [null], dueDate: [null], - watermarkEnabled: [true], - watermarkPreviewEnabled: [false], + watermarkId: [null], + previewWatermarkId: [null], }, { validators: control => @@ -155,8 +164,24 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On dossierTemplateId: this.form.get(DOSSIER_TEMPLATE_ID).value, downloadFileTypes: this.form.get('downloadFileTypes').value, reportTemplateIds: this.form.get('reportTemplateIds').value, - watermarkEnabled: this.form.get('watermarkEnabled').value, - watermarkPreviewEnabled: this.form.get('watermarkPreviewEnabled').value, + watermarkId: this.form.get('watermarkId').value, + previewWatermarkId: this.form.get('previewWatermarkId').value, }; } + + isWatermarkEnabled(key: string): boolean { + return !!this.form.get(key).value; + } + + enableDisableWatermark(checked: boolean, key: string): void { + let oldValue: string; + if (key === 'watermarkId') { + this.oldWatermarkId = !checked ? this.form.get(key).value : this.oldWatermarkId; + oldValue = this.oldWatermarkId; + } else { + this.oldPreviewWatermarkID = !checked ? this.form.get(key).value : this.oldPreviewWatermarkID; + oldValue = this.oldPreviewWatermarkID; + } + this.form.get(key).setValue(checked ? oldValue : null); + } } diff --git a/apps/red-ui/src/app/services/entity-services/watermark.service.ts b/apps/red-ui/src/app/services/entity-services/watermark.service.ts index aef6ef9bc..6294e4537 100644 --- a/apps/red-ui/src/app/services/entity-services/watermark.service.ts +++ b/apps/red-ui/src/app/services/entity-services/watermark.service.ts @@ -1,6 +1,12 @@ import { Injectable, Injector } from '@angular/core'; -import { GenericService, RequiredParam, Validate } from '@iqser/common-ui'; +import { GenericService, QueryParam, RequiredParam, Validate } from '@iqser/common-ui'; import { IWatermark } from '@red/domain'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +interface IsUsedResponse { + value: boolean; +} @Injectable({ providedIn: 'root', @@ -11,17 +17,29 @@ export class WatermarkService extends GenericService { } @Validate() - saveWatermark(@RequiredParam() body: IWatermark, @RequiredParam() dossierTemplateId: string) { - return this._post(body, `${this._defaultModelPath}/${dossierTemplateId}`); + saveWatermark(@RequiredParam() body: IWatermark) { + return this._post(body, `${this._defaultModelPath}`); } @Validate() - deleteWatermark(@RequiredParam() dossierTemplateId: string) { - return super.delete({}, `${this._defaultModelPath}/${dossierTemplateId}`); + deleteWatermark(@RequiredParam() watermarkId: string) { + return super.delete({}, `${this._defaultModelPath}/${watermarkId}`); } @Validate() - getWatermark(@RequiredParam() dossierTemplateId: string) { - return this._getOne([dossierTemplateId]); + getWatermark(@RequiredParam() watermarkId: string) { + return this._getOne([watermarkId]); + } + + @Validate() + getWatermarks(@RequiredParam() dossierTemplateId: string): Observable { + const queryParams: QueryParam[] = [{ key: 'dossierTemplateId', value: dossierTemplateId }]; + return this.getAll(this._defaultModelPath, queryParams); + } + + @Validate() + isWatermarkUsed(@RequiredParam() watermarkId: string): Observable { + const queryParams: QueryParam[] = [{ key: 'watermarkId', value: watermarkId }]; + return this.getAll(`${this._defaultModelPath}/used`, queryParams).pipe(map(result => result.value)); } } diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index 86e26ec43..d849c4ea0 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -31,8 +31,7 @@ "label": "Dossier-Vorlage", "placeholder": "" }, - "watermark": "Geschwärzte Dokumente mit Wasserzeichen versehen", - "watermark-preview": "Vorschau Dokumente mit Wasserzeichen versehen" + "watermark": "Geschwärzte Dokumente mit Wasserzeichen versehen" }, "header-new": "Dossier erstellen" }, @@ -188,7 +187,7 @@ "rule-editor": "", "settings": "Einstellungen", "user-management": "", - "watermark": "" + "watermarks": "" }, "annotation-actions": { "accept-recommendation": { @@ -1089,9 +1088,7 @@ "label": "Dossier-Name", "placeholder": "Namen eingeben" }, - "template": "Dossier-Vorlage", - "watermark": "Geschwärzte Dokumente mit Wasserzeichen versehen", - "watermark-preview": "Vorschau Dokumente mit Wasserzeichen versehen" + "template": "Dossier-Vorlage" } }, "header": "{dossierName} bearbeiten", @@ -2081,7 +2078,7 @@ "watermark-screen": { "action": { "change-success": "Das Wasserzeichen wurde aktualisiert!", - "delete-success": "Das Wasserzeichen wurde gelöscht.", + "created-success": "", "error": "Fehler beim Aktualisieren des Wasserzeichens", "revert": "Rückgängig machen", "save": "Änderungen speichern" @@ -2091,11 +2088,35 @@ "color-placeholder": "", "font-size": "Schriftgröße", "font-type": "Schriftart", + "name-label": "", + "name-placeholder": "", "opacity": "Deckkraft", "orientation": "Ausrichtung", + "text-label": "", "text-placeholder": "Text eingeben" + } + }, + "watermarks-listing": { + "action": { + "delete": "", + "delete-success": "", + "edit": "" }, - "title": "Wasserzeichen" + "add-new": "", + "no-data": { + "title": "" + }, + "table-col-names": { + "created-by": "", + "created-on": "", + "modified-on": "", + "name": "", + "status": "" + }, + "table-header": { + "title": "" + }, + "watermark-is-used": "" }, "workflow": { "selection": { diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index f67ea9c87..58dff7e5d 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -31,8 +31,7 @@ "label": "Dossier Template", "placeholder": "Choose Dossier Template" }, - "watermark": "Watermark application on redacted documents", - "watermark-preview": "Watermark application on preview documents" + "watermark": "Watermark application on redacted documents" }, "header-new": "Create Dossier" }, @@ -188,7 +187,7 @@ "rule-editor": "Rule Editor", "settings": "Settings", "user-management": "User Management", - "watermark": "Watermark" + "watermarks": "Watermarks" }, "annotation-actions": { "accept-recommendation": { @@ -1089,9 +1088,7 @@ "label": "Dossier Name", "placeholder": "Enter Name" }, - "template": "Dossier Template", - "watermark": "Watermark application on redacted documents", - "watermark-preview": "Watermark application on preview documents" + "template": "Dossier Template" } }, "header": "Edit {dossierName}", @@ -2080,8 +2077,8 @@ }, "watermark-screen": { "action": { - "change-success": "Watermark updated!", - "delete-success": "Watermark deleted.", + "change-success": "Watermark has been updated!", + "created-success": "Watermark has been created!", "error": "Failed to update Watermark", "revert": "Revert", "save": "Save Changes" @@ -2091,11 +2088,35 @@ "color-placeholder": "#", "font-size": "Font Size", "font-type": "Font Type", + "name-label": "Watermark Name", + "name-placeholder": "Choose a name to identify the watermark", "opacity": "Opacity", "orientation": "Orientation", + "text-label": "Watermark Text", "text-placeholder": "Enter text" + } + }, + "watermarks-listing": { + "action": { + "delete": "Delete", + "delete-success": "Watermark has been deleted!", + "edit": "Edit" }, - "title": "Watermark" + "add-new": "New Watermark", + "no-data": { + "title": "There are no watermarks yet." + }, + "table-col-names": { + "created-by": "Created by", + "created-on": "Created on", + "modified-on": "Modified on", + "name": "Name", + "status": "Status" + }, + "table-header": { + "title": "Watermarks" + }, + "watermark-is-used": "This watermark is already in use, are you sure you want to delete it?" }, "workflow": { "selection": { diff --git a/libs/red-domain/src/index.ts b/libs/red-domain/src/index.ts index 92d56faad..a10ad047a 100644 --- a/libs/red-domain/src/index.ts +++ b/libs/red-domain/src/index.ts @@ -26,3 +26,4 @@ export * from './lib/text-highlight'; export * from './lib/permissions'; export * from './lib/license'; export * from './lib/digital-signature'; +export * from './lib/watermarks'; diff --git a/libs/red-domain/src/lib/dossier-templates/constants.ts b/libs/red-domain/src/lib/dossier-templates/constants.ts index aa890151f..871b34b58 100644 --- a/libs/red-domain/src/lib/dossier-templates/constants.ts +++ b/libs/red-domain/src/lib/dossier-templates/constants.ts @@ -8,3 +8,4 @@ export type DossierTemplateStatus = keyof typeof DossierTemplateStatuses; export const DOSSIER_TEMPLATE_ID = 'dossierTemplateId'; export const ENTITY_TYPE = 'entity'; +export const WATERMARK_ID = 'watermarkId'; diff --git a/libs/red-domain/src/lib/dossiers/dossier.model.ts b/libs/red-domain/src/lib/dossiers/dossier.model.ts index 63812d3fb..78edaac1d 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.model.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.model.ts @@ -19,8 +19,8 @@ export class Dossier implements IDossier, IListable { readonly hardDeletedTime?: string; readonly softDeletedTime?: string; readonly startDate?: string; - readonly watermarkEnabled: boolean; - readonly watermarkPreviewEnabled: boolean; + readonly watermarkId: number; + readonly previewWatermarkId: number; readonly archivedTime: string; readonly hasReviewers: boolean; readonly routerLink: string; @@ -43,8 +43,8 @@ export class Dossier implements IDossier, IListable { this.reportTemplateIds = dossier.reportTemplateIds; this.softDeletedTime = dossier.softDeletedTime; this.startDate = dossier.startDate; - this.watermarkEnabled = dossier.watermarkEnabled; - this.watermarkPreviewEnabled = dossier.watermarkPreviewEnabled; + this.watermarkId = dossier.watermarkId; + this.previewWatermarkId = dossier.previewWatermarkId; this.archivedTime = dossier.archivedTime; this.hasReviewers = !!this.memberIds && this.memberIds.length > 1; diff --git a/libs/red-domain/src/lib/dossiers/dossier.request.ts b/libs/red-domain/src/lib/dossiers/dossier.request.ts index d816d7571..d31e01c90 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.request.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.request.ts @@ -53,4 +53,12 @@ export interface IDossierRequest { * Whether a watermark will be applied to the preview files or not. */ readonly watermarkPreviewEnabled?: boolean; + /** + * Watermark id that will be applied to the redacted files. + */ + readonly watermarkId?: number; + /** + * Watermark id that will be applied to the preview files. + */ + readonly previewWatermarkId?: number; } diff --git a/libs/red-domain/src/lib/dossiers/dossier.ts b/libs/red-domain/src/lib/dossiers/dossier.ts index bd16731ac..04c081e33 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.ts @@ -17,7 +17,7 @@ export interface IDossier { readonly reportTemplateIds: List; readonly softDeletedTime?: string; readonly startDate?: string; - readonly watermarkEnabled: boolean; - readonly watermarkPreviewEnabled: boolean; + readonly watermarkId: number; + readonly previewWatermarkId: number; readonly archivedTime: string; } diff --git a/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts b/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts index bac991593..bec6d0e9a 100644 --- a/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts +++ b/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts @@ -3,7 +3,7 @@ import { IFileAttributeConfig } from './file-attribute-config'; export interface IFileAttributesConfig { delimiter?: string; encoding?: string; - keyColumn?: string + keyColumn?: string; filenameMappingColumnHeaderName?: string; fileAttributeConfigs?: IFileAttributeConfig[]; } diff --git a/libs/red-domain/src/lib/shared/index.ts b/libs/red-domain/src/lib/shared/index.ts index f66679007..6e5026112 100644 --- a/libs/red-domain/src/lib/shared/index.ts +++ b/libs/red-domain/src/lib/shared/index.ts @@ -2,7 +2,6 @@ export * from './sorters/status-sorter'; export * from './breadcrumb-types'; export * from './types'; export * from './rules'; -export * from './watermark'; export * from './default-color-type'; export * from './colors'; export * from './view-mode'; diff --git a/libs/red-domain/src/lib/shared/watermark.ts b/libs/red-domain/src/lib/shared/watermark.ts deleted file mode 100644 index 16f88f466..000000000 --- a/libs/red-domain/src/lib/shared/watermark.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface IWatermark { - fontSize?: number; - fontType?: string; - hexColor?: string; - opacity?: number; - orientation?: WatermarkOrientation; - text?: string; -} - -export const WatermarkOrientations = { - DIAGONAL: 'DIAGONAL', - HORIZONTAL: 'HORIZONTAL', - VERTICAL: 'VERTICAL', -} as const; -export type WatermarkOrientation = keyof typeof WatermarkOrientations; diff --git a/libs/red-domain/src/lib/watermarks/index.ts b/libs/red-domain/src/lib/watermarks/index.ts new file mode 100644 index 000000000..b5414a603 --- /dev/null +++ b/libs/red-domain/src/lib/watermarks/index.ts @@ -0,0 +1,2 @@ +export * from './watermark'; +export * from './watermark.model'; diff --git a/libs/red-domain/src/lib/watermarks/watermark.model.ts b/libs/red-domain/src/lib/watermarks/watermark.model.ts new file mode 100644 index 000000000..7cc6100dc --- /dev/null +++ b/libs/red-domain/src/lib/watermarks/watermark.model.ts @@ -0,0 +1,38 @@ +import { IWatermark, WatermarkOrientation } from './watermark'; +import { IListable } from '@iqser/common-ui'; + +export class Watermark implements IListable, IWatermark { + readonly id: string; + readonly dossierTemplateId: string; + enabled: boolean; + readonly fontSize: number; + readonly fontType: string; + readonly hexColor: string; + readonly opacity: number; + readonly orientation: WatermarkOrientation; + readonly text: string; + readonly name: string; + readonly createdBy?: string; + readonly dateAdded?: string; + readonly dateModified?: string; + + constructor(watermark: IWatermark) { + this.id = watermark.id; + this.dossierTemplateId = watermark.dossierTemplateId; + this.enabled = watermark.enabled; + this.fontSize = watermark.fontSize; + this.fontType = watermark.fontType; + this.hexColor = watermark.hexColor; + this.opacity = watermark.opacity; + this.orientation = watermark.orientation; + this.text = watermark.text; + this.name = watermark.name; + this.createdBy = watermark.createdBy; + this.dateAdded = watermark.dateAdded; + this.dateModified = watermark.dateModified; + } + + get searchKey(): string { + return this.name; + } +} diff --git a/libs/red-domain/src/lib/watermarks/watermark.ts b/libs/red-domain/src/lib/watermarks/watermark.ts new file mode 100644 index 000000000..deba31803 --- /dev/null +++ b/libs/red-domain/src/lib/watermarks/watermark.ts @@ -0,0 +1,22 @@ +export interface IWatermark { + id: string; + dossierTemplateId: string; + enabled: boolean; + fontSize: number; + fontType: string; + hexColor: string; + opacity: number; + orientation: WatermarkOrientation; + text: string; + name: string; + createdBy?: string; + dateAdded?: string; + dateModified?: string; +} + +export const WatermarkOrientations = { + DIAGONAL: 'DIAGONAL', + HORIZONTAL: 'HORIZONTAL', + VERTICAL: 'VERTICAL', +} as const; +export type WatermarkOrientation = keyof typeof WatermarkOrientations; diff --git a/paligo-theme/paligo-styles/redacto-theme.css b/paligo-theme/paligo-styles/redacto-theme.css index b018857da..dd85e8525 100644 --- a/paligo-theme/paligo-styles/redacto-theme.css +++ b/paligo-theme/paligo-styles/redacto-theme.css @@ -1,494 +1,494 @@ @charset "UTF-8"; -@import url("https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap"); +@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap'); .portal-header { - z-index: 1; - height: 450px; + z-index: 1; + height: 450px; } .portal-header::before { - background-color: #283241; + background-color: #283241; } .portal-header h1 { - font-size: 64px; - font-weight: 300; - line-height: 87px; - margin-top: 68px; - margin-bottom: 40px; + font-size: 64px; + font-weight: 300; + line-height: 87px; + margin-top: 68px; + margin-bottom: 40px; } .portal-header .portal-search { - max-width: 600px; - margin: auto; - position: relative; + max-width: 600px; + margin: auto; + position: relative; } .portal-header .portal-search .search-field { - width: 100%; - border: 1px solid #d3d5da; - border-radius: 8px; - background-color: #fff; + width: 100%; + border: 1px solid #d3d5da; + border-radius: 8px; + background-color: #fff; } .portal-header .portal-search .search-field::placeholder { - opacity: 0.7; + opacity: 0.7; } .portal-header .portal-search .search-field, .portal-header .portal-search .search-field::placeholder { - color: #283241; - font-size: 14px; - line-height: 18px; + color: #283241; + font-size: 14px; + line-height: 18px; } .portal-header .portal-search .search-field { - padding: 12px 17px; + padding: 12px 17px; } .portal-header .portal-search .btn { - position: absolute; - right: 0; - padding: 11px 18px; - background-color: transparent; - color: #283241; - cursor: pointer; - border-radius: 0 8px 8px 0; + position: absolute; + right: 0; + padding: 11px 18px; + background-color: transparent; + color: #283241; + cursor: pointer; + border-radius: 0 8px 8px 0; } .portal-header .portal-search .btn:hover { - background-color: #dd4d50; + background-color: #dd4d50; } @media only screen and (max-width: 768px) { - .portal-header h1 { - font-size: 42px; - font-weight: 300; - line-height: 57px; - } + .portal-header h1 { + font-size: 42px; + font-weight: 300; + line-height: 57px; + } } .portal-single-publication { - background-color: transparent; - width: 280px; + background-color: transparent; + width: 280px; } .portal-single-publication > a { - border-radius: 4px; + border-radius: 4px; } .portal-single-publication .publication-icon { - background-color: #dd4d50; + background-color: #dd4d50; } .featured-content-label { - margin-top: 24px; - text-align: center; + margin-top: 24px; + text-align: center; } .featured-content { - margin-top: 24px; - margin-bottom: 0; + margin-top: 24px; + margin-bottom: 0; } .featured-content .inner { - margin: 0; - justify-content: center; + margin: 0; + justify-content: center; } .featured-content .publication-contents { - padding: 24px 40px; - border: 1px solid #e2e4e9; - width: 100%; - margin: 0; - background-color: #fff; - border-radius: 4px; - border: none; - background-color: transparent; - width: 250px; - margin: 0 15px !important; + padding: 24px 40px; + border: 1px solid #e2e4e9; + width: 100%; + margin: 0; + background-color: #fff; + border-radius: 4px; + border: none; + background-color: transparent; + width: 250px; + margin: 0 15px !important; } .featured-content .publication-contents h4.featured-title, .featured-content .publication-contents .section-toc-title { - margin: 0; + margin: 0; } .featured-content .publication-contents h4.featured-title a, .featured-content .publication-contents .section-toc-title a { - color: #283241; + color: #283241; } .featured-content .publication-contents h4.featured-title a:hover, .featured-content .publication-contents .section-toc-title a:hover { - color: #283241; - text-decoration: underline; + color: #283241; + text-decoration: underline; } .featured-content .publication-contents .section-toc-title { - font-size: 28px; - font-weight: 300; - line-height: 36px; + font-size: 28px; + font-weight: 300; + line-height: 36px; } .featured-content .publication-contents ul { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } .featured-content .publication-contents li { - margin: 4px 0; + margin: 4px 0; } .featured-content .publication-contents li:first-child { - margin-top: 20px; + margin-top: 20px; } .featured-content .publication-contents li:last-child { - margin-bottom: 40px; + margin-bottom: 40px; } .featured-content .publication-contents li a { - color: #dd4d50; - font-size: 16px; - line-height: 24px; + color: #dd4d50; + font-size: 16px; + line-height: 24px; } .featured-content .publication-contents li a:hover { - color: #dd4d50; - text-decoration: underline; + color: #dd4d50; + text-decoration: underline; } .featured-content .publication-contents h4 span, .featured-content .publication-contents li::before { - display: none; + display: none; } .featured-content .publication-contents li a { - font-size: inherit; - line-height: inherit; + font-size: inherit; + line-height: inherit; } /* Einleitung */ .cat-panel-1:before { - content: "\f007"; + content: '\f007'; } /* Workflow */ .cat-panel-2:before { - content: "\f085"; + content: '\f085'; } /* Voraussetzungen */ .cat-panel-3:before { - content: "\f109"; + content: '\f109'; } /* Benutzermenü und -profil */ .cat-panel-4:before { - content: "\f007"; + content: '\f007'; } /* Benachrichtigungen */ .cat-panel-5:before { - content: "\f0f3"; + content: '\f0f3'; } /* Suchfunktion */ .cat-panel-6:before { - content: "\f002"; + content: '\f002'; } /* Ebenen in der Benutzeroberfläche des RedactManagers */ .cat-panel-7:before { - content: "\f248"; + content: '\f248'; } /* Rollen und Berechtigungen */ .cat-panel-8:before { - content: "\f084"; + content: '\f084'; } /* Dossier erstellen und verwalten */ .cat-panel-9:before { - content: "\f07c"; + content: '\f07c'; } /* Dokumente bearbeiten im Editor */ .cat-panel-10:before { - content: "\f15c"; + content: '\f15c'; } /* Dossier abschließen und herunterladen */ .cat-panel-11:before { - content: "\f019"; + content: '\f019'; } /* Funktionsübersicht */ .cat-panel-12:before { - content: "\f03a"; + content: '\f03a'; } /* Glossar */ .cat-panel-13:before { - content: "\f02d"; + content: '\f02d'; } /* FAQ’s (häufige Fragen) */ .cat-panel-14:before { - content: "\f059"; + content: '\f059'; } .portal-search-result { - background-color: #f4f5f7; + background-color: #f4f5f7; } .search-container { - padding-bottom: 100px; + padding-bottom: 100px; } .portal-search-result { - padding: 80px 0 0 0; + padding: 80px 0 0 0; } ul.searchresults { - border: 1px solid #e2e4e9; - background-color: #fff; - border-radius: 4px; - margin-top: 32px; + border: 1px solid #e2e4e9; + background-color: #fff; + border-radius: 4px; + margin-top: 32px; } ul.searchresults .search-highlight { - font-style: normal; + font-style: normal; } li.searchresultitem { - margin: 0 32px; - border-bottom: 1px solid #e2e4e9; - padding: 32px 8px; + margin: 0 32px; + border-bottom: 1px solid #e2e4e9; + padding: 32px 8px; } .searchresultitem.selected-searchresultitem { - background-color: transparent; - border-radius: 0; + background-color: transparent; + border-radius: 0; } .searchresulttitle { - font-size: 28px; - font-weight: 300; - line-height: 36px; - color: #283241; + font-size: 28px; + font-weight: 300; + line-height: 36px; + color: #283241; } .searchresultsnippet { - margin: 16px 0; - color: #283241; + margin: 16px 0; + color: #283241; } .search-result-breadcrumbs { - color: #dd4d50; + color: #dd4d50; } .portal-footer, .site-footer { - border-top: 1px solid #e2e4e9; - padding: 0; + border-top: 1px solid #e2e4e9; + padding: 0; } .portal-footer.portal-footer, .site-footer.portal-footer { - margin-top: 100px; + margin-top: 100px; } .portal-footer .inner, .site-footer .inner { - margin: 0; - padding: 8px 0 64px 0; - font-size: 16px; - line-height: 24px; + margin: 0; + padding: 8px 0 64px 0; + font-size: 16px; + line-height: 24px; } .portal-footer .inner > *, .site-footer .inner > * { - padding: 0; + padding: 0; } .portal-footer .inner .copyright, .site-footer .inner .copyright { - width: 50%; + width: 50%; } body { - --iqser-primary: lightblue; - --iqser-primary-rgb: 220, 230, 234; - --iqser-primary-2: orange; - --iqser-accent: blue; - --iqser-accent-rgb: 123, 234, 111; - --iqser-background: white; - --iqser-text: black; - --iqser-disabled: #9398a0; - --iqser-not-disabled-table-item: #f9fafb; - --iqser-btn-bg-hover: #e2e4e9; - --iqser-btn-bg: #f0f1f4; - --iqser-warn: #fdbd00; - --iqser-white: white; - --iqser-black: black; - --iqser-light: white; - --iqser-separator: rgba(226, 228, 233, 0.9); - --iqser-grey-1: #283241; - --iqser-grey-10: #313d4e; - --iqser-grey-7: #9398a0; - --iqser-grey-3: #aaacb3; - --iqser-grey-5: #d3d5da; - --iqser-grey-4: #e2e4e9; - --iqser-grey-6: #f0f1f4; - --iqser-grey-2: #f4f5f7; - --iqser-grey-8: #f9fafb; - --iqser-green-1: #00ff00; - --iqser-green-2: #5ce594; - --iqser-orange-1: #ff801a; - --iqser-yellow-1: #ffb83b; - --iqser-yellow-2: #fdbd00; - --iqser-yellow-rgb: 253, 189, 0; - --iqser-red-1: #dd4d50; - --iqser-red-2: #f16164; - --iqser-blue-1: #4875f7; - --iqser-blue-2: #48c9f7; - --iqser-blue-3: #5b97db; - --iqser-blue-4: #374c81; - --iqser-blue-5: #c5d3eb; - --iqser-pink-1: #f125de; - --iqser-helpmode-primary: green; + --iqser-primary: lightblue; + --iqser-primary-rgb: 220, 230, 234; + --iqser-primary-2: orange; + --iqser-accent: blue; + --iqser-accent-rgb: 123, 234, 111; + --iqser-background: white; + --iqser-text: black; + --iqser-disabled: #9398a0; + --iqser-not-disabled-table-item: #f9fafb; + --iqser-btn-bg-hover: #e2e4e9; + --iqser-btn-bg: #f0f1f4; + --iqser-warn: #fdbd00; + --iqser-white: white; + --iqser-black: black; + --iqser-light: white; + --iqser-separator: rgba(226, 228, 233, 0.9); + --iqser-grey-1: #283241; + --iqser-grey-10: #313d4e; + --iqser-grey-7: #9398a0; + --iqser-grey-3: #aaacb3; + --iqser-grey-5: #d3d5da; + --iqser-grey-4: #e2e4e9; + --iqser-grey-6: #f0f1f4; + --iqser-grey-2: #f4f5f7; + --iqser-grey-8: #f9fafb; + --iqser-green-1: #00ff00; + --iqser-green-2: #5ce594; + --iqser-orange-1: #ff801a; + --iqser-yellow-1: #ffb83b; + --iqser-yellow-2: #fdbd00; + --iqser-yellow-rgb: 253, 189, 0; + --iqser-red-1: #dd4d50; + --iqser-red-2: #f16164; + --iqser-blue-1: #4875f7; + --iqser-blue-2: #48c9f7; + --iqser-blue-3: #5b97db; + --iqser-blue-4: #374c81; + --iqser-blue-5: #c5d3eb; + --iqser-pink-1: #f125de; + --iqser-helpmode-primary: green; } .site-sidebar { - background-color: #283241; - scrollbar-color: var(--iqser-inputs-outline) var(--iqser-alt-background); - scrollbar-width: thin; - /* Track */ - /* Handle */ + background-color: #283241; + scrollbar-color: var(--iqser-inputs-outline) var(--iqser-alt-background); + scrollbar-width: thin; + /* Track */ + /* Handle */ } .site-sidebar .logo { - padding: 24px 0 30px 0 !important; + padding: 24px 0 30px 0 !important; } .site-sidebar ::-webkit-scrollbar-corner { - background: var(--iqser-alt-background); + background: var(--iqser-alt-background); } .site-sidebar::-webkit-scrollbar { - width: 11px; + width: 11px; } .site-sidebar::-webkit-scrollbar-track { - background: var(--iqser-alt-background); + background: var(--iqser-alt-background); } .site-sidebar::-webkit-scrollbar-thumb { - background: var(--iqser-inputs-outline); + background: var(--iqser-inputs-outline); } .site-sidebar-search { - padding: 0 24px; + padding: 0 24px; } .site-sidebar-search .search-field { - width: 100%; - border: 1px solid #d3d5da; - border-radius: 8px; - background-color: #fff; + width: 100%; + border: 1px solid #d3d5da; + border-radius: 8px; + background-color: #fff; } .site-sidebar-search .search-field::placeholder { - opacity: 0.7; + opacity: 0.7; } .site-sidebar-search .search-field, .site-sidebar-search .search-field::placeholder { - color: #283241; - font-size: 14px; - line-height: 18px; + color: #283241; + font-size: 14px; + line-height: 18px; } .site-sidebar-search .search-field { - padding: 7px 13px; + padding: 7px 13px; } .nav-site-sidebar { - margin-top: 16px; + margin-top: 16px; } .nav-site-sidebar .topic-link { - padding-top: 11px; - padding-bottom: 11px; - font-size: 14px; - line-height: 18px; - color: #d3d5da; + padding-top: 11px; + padding-bottom: 11px; + font-size: 14px; + line-height: 18px; + color: #d3d5da; } .nav-site-sidebar .topic-link:hover { - background-color: #313d4e; + background-color: #313d4e; } .nav-site-sidebar .active > .topic-link { - background-color: #313d4e; + background-color: #313d4e; } .nav-site-sidebar .active > a { - color: #fff; - font-weight: 600; + color: #fff; + font-weight: 600; } .nav-site-sidebar > li > a { - padding-left: 24px; + padding-left: 24px; } .nav-site-sidebar > li > ul > li > a { - padding-left: 32px; + padding-left: 32px; } .nav-site-sidebar > li > ul > li > ul > li > a { - padding-left: 40px; + padding-left: 40px; } .toc .glyphicon { - top: 5px; + top: 5px; } .toc > li > .topic-link > .glyphicon { - margin-top: 4px; + margin-top: 4px; } .toolbar { - box-shadow: none; - padding: 21px 24px; - margin-bottom: 50px; + box-shadow: none; + padding: 21px 24px; + margin-bottom: 50px; } .topic-content .breadcrumb-container { - margin-top: 40px; + margin-top: 40px; } .topic-content .breadcrumb { - font-size: 14px; - line-height: 18px; - font-weight: 600; + font-size: 14px; + line-height: 18px; + font-weight: 600; } .topic-content .breadcrumb a { - color: #283241; + color: #283241; } .topic-content .breadcrumb a:hover { - color: #dd4d50; - text-decoration: underline; + color: #dd4d50; + text-decoration: underline; } .topic-content .breadcrumb .breadcrumb-node { - color: #dd4d50; + color: #dd4d50; } main article { - margin-bottom: 0; - padding: 0; + margin-bottom: 0; + padding: 0; } section { - position: relative; + position: relative; } section > .titlepage .title { - margin: 24px 0 16px 0; + margin: 24px 0 16px 0; } #topic-content > section > .titlepage h2.title { - margin: 0 0 24px; + margin: 0 0 24px; } .image-viewport { - margin: auto; + margin: auto; } .image-viewport img { - margin: 16px auto; + margin: 16px auto; } .pager { - margin-top: 30px; - margin-bottom: 30px; - padding: 0; + margin-top: 30px; + margin-bottom: 30px; + padding: 0; } .pager li > a, .pager li > span { - color: #dd4d50; - font-size: 14px; - font-weight: 600; - line-height: 19px; - text-transform: uppercase; - padding: 0; - background-color: transparent; - border: none; - border-radius: 0; + color: #dd4d50; + font-size: 14px; + font-weight: 600; + line-height: 19px; + text-transform: uppercase; + padding: 0; + background-color: transparent; + border: none; + border-radius: 0; } .pager li > a:hover, .pager li > span:hover { - text-decoration: underline; - background-color: transparent; - color: #dd4d50; + text-decoration: underline; + background-color: transparent; + color: #dd4d50; } .checklist-reset-wrapper { - position: absolute; - right: 0; - top: 0; + position: absolute; + right: 0; + top: 0; } .warning, @@ -496,172 +496,172 @@ section > .titlepage .title { .important, .caution, .tip { - margin-top: 32px; - margin-bottom: 32px; - padding: 16px 24px 16px 68px; - background-color: #fff; - border-left: 4px solid #dd4d50; - border-radius: 4px; + margin-top: 32px; + margin-bottom: 32px; + padding: 16px 24px 16px 68px; + background-color: #fff; + border-left: 4px solid #dd4d50; + border-radius: 4px; } .warning:before, .note:before, .important:before, .caution:before, .tip:before { - color: #dd4d50; - width: 20px; - height: 20px; - text-align: center; - left: 24px; - top: calc(50% - 15px); + color: #dd4d50; + width: 20px; + height: 20px; + text-align: center; + left: 24px; + top: calc(50% - 15px); } .warning h3, .note h3, .important h3, .caution h3, .tip h3 { - padding: 0; - font-size: 18px; - font-weight: 600; - line-height: 24px; - margin-bottom: 8px; + padding: 0; + font-size: 18px; + font-weight: 600; + line-height: 24px; + margin-bottom: 8px; } .warning p, .note p, .important p, .caution p, .tip p { - line-height: 20px; + line-height: 20px; } .topic-content > section > p { - margin: 12px 0; + margin: 12px 0; } .panel { - padding: 12px 0; - border-radius: 4px; - border: none; + padding: 12px 0; + border-radius: 4px; + border: none; } .panel .panel-body > p { - margin-bottom: 12px; + margin-bottom: 12px; } .panel .panel-body > p:not(:first-of-type) { - margin-top: 18px; + margin-top: 18px; } .mediaobject { - margin-top: 20px; + margin-top: 20px; } .mediaobject img { - border-radius: 4px; - margin: 0; - box-shadow: 0 3px 12px 5px rgba(40, 50, 65, 0.14); + border-radius: 4px; + margin: 0; + box-shadow: 0 3px 12px 5px rgba(40, 50, 65, 0.14); } .mediaobject .caption > p { - font-size: 14px; - text-align: center; - font-style: italic; - margin: 0; + font-size: 14px; + text-align: center; + font-style: italic; + margin: 0; } .inlinemediaobject { - vertical-align: unset; + vertical-align: unset; } main ol, main ul { - margin: 0 0 24px; + margin: 0 0 24px; } .section-toc { - padding: 24px 40px; - border: 1px solid #e2e4e9; - width: 100%; - margin: 0; - background-color: #fff; - border-radius: 4px; + padding: 24px 40px; + border: 1px solid #e2e4e9; + width: 100%; + margin: 0; + background-color: #fff; + border-radius: 4px; } .section-toc h4.featured-title, .section-toc .section-toc-title { - margin: 0; + margin: 0; } .section-toc h4.featured-title a, .section-toc .section-toc-title a { - color: #283241; + color: #283241; } .section-toc h4.featured-title a:hover, .section-toc .section-toc-title a:hover { - color: #283241; - text-decoration: underline; + color: #283241; + text-decoration: underline; } .section-toc .section-toc-title { - font-size: 28px; - font-weight: 300; - line-height: 36px; + font-size: 28px; + font-weight: 300; + line-height: 36px; } .section-toc ul { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } .section-toc li { - margin: 4px 0; + margin: 4px 0; } .section-toc li:first-child { - margin-top: 20px; + margin-top: 20px; } .section-toc li:last-child { - margin-bottom: 40px; + margin-bottom: 40px; } .section-toc li a { - color: #dd4d50; - font-size: 16px; - line-height: 24px; + color: #dd4d50; + font-size: 16px; + line-height: 24px; } .section-toc li a:hover { - color: #dd4d50; - text-decoration: underline; + color: #dd4d50; + text-decoration: underline; } .section-toc h4 span, .section-toc li::before { - display: none; + display: none; } .section-toc li:first-child { - margin-top: 16px; + margin-top: 16px; } .section-toc li:last-child { - margin-bottom: 8px; + margin-bottom: 8px; } .procedure > li.step::before { - background-color: transparent; - border: 1px solid #dd4d50; - color: #dd4d50; - line-height: 23px; + background-color: transparent; + border: 1px solid #dd4d50; + color: #dd4d50; + line-height: 23px; } .question { - font-weight: 600; + font-weight: 600; } .question > td > p { - margin: 32px 0 18px 0; + margin: 32px 0 18px 0; } .question > td:first-child { - padding-right: 4px; + padding-right: 4px; } .fixed-toolbar article.topic :target.question:before { - content: none; + content: none; } body { - color: #283241; - background-color: #f4f5f7; - font-family: "Open Sans", sans-serif; - scrollbar-color: var(--iqser-inputs-outline) var(--iqser-alt-background); - scrollbar-width: thin; - /* Track */ - /* Handle */ + color: #283241; + background-color: #f4f5f7; + font-family: 'Open Sans', sans-serif; + scrollbar-color: var(--iqser-inputs-outline) var(--iqser-alt-background); + scrollbar-width: thin; + /* Track */ + /* Handle */ } body h1, body .h1, @@ -677,62 +677,62 @@ body h6, body .h6, body p, body pre { - margin: 0; - font-family: "Open Sans", sans-serif; + margin: 0; + font-family: 'Open Sans', sans-serif; } body ::-webkit-scrollbar-corner { - background: var(--iqser-alt-background); + background: var(--iqser-alt-background); } body::-webkit-scrollbar { - width: 11px; + width: 11px; } body::-webkit-scrollbar-track { - background: var(--iqser-alt-background); + background: var(--iqser-alt-background); } body::-webkit-scrollbar-thumb { - background: var(--iqser-inputs-outline); + background: var(--iqser-inputs-outline); } body h1, body .h1 { - font-size: 64px; - font-weight: 300; - line-height: 87px; + font-size: 64px; + font-weight: 300; + line-height: 87px; } body h2, body .h2 { - font-size: 42px; - font-weight: 300; - line-height: 57px; + font-size: 42px; + font-weight: 300; + line-height: 57px; } body h3, body .h3 { - font-size: 32px; - font-weight: 300; - line-height: 43px; + font-size: 32px; + font-weight: 300; + line-height: 43px; } body h4, body .h4 { - font-size: 28px; - font-weight: 300; - line-height: 36px; + font-size: 28px; + font-weight: 300; + line-height: 36px; } body h5, body .h5 { - font-size: 18px; - font-weight: 600; - line-height: 24px; + font-size: 18px; + font-weight: 600; + line-height: 24px; } body p { - font-size: 16px; - line-height: 24px; + font-size: 16px; + line-height: 24px; } body a { - color: #dd4d50; + color: #dd4d50; } body a:hover { - text-decoration: underline; - color: #dd4d50; + text-decoration: underline; + color: #dd4d50; } body a:focus { - color: #dd4d50; + color: #dd4d50; }