From 3a3ed950baf9c95c435fea40dbb811e4497fd10e Mon Sep 17 00:00:00 2001 From: Florent POITTEVIN <poittevin.florent@gmail.com> Date: Wed, 9 Jun 2021 16:18:10 +0200 Subject: [PATCH 1/2] feat(admin events): [AOU-552] new page to list application events --- src/app/enums/index.ts | 42 +++++ .../features/admin/admin-routing.module.ts | 9 + src/app/features/admin/admin.module.ts | 2 + .../admin-application-event-routing.module.ts | 39 +++++ .../admin-application-event.module.ts | 45 +++++ ...application-event-form.presentational.html | 93 +++++++++++ ...application-event-form.presentational.scss | 5 + ...n-application-event-form.presentational.ts | 83 ++++++++++ ...pplication-event-detail-edit.routable.html | 32 ++++ ...pplication-event-detail-edit.routable.scss | 1 + ...-application-event-detail-edit.routable.ts | 59 +++++++ ...admin-application-event-list.routable.scss | 1 + .../admin-application-event-list.routable.ts | 131 +++++++++++++++ .../stores/admin-application-event.action.ts | 156 ++++++++++++++++++ .../stores/admin-application-event.state.ts | 74 +++++++++ .../admin-home/admin-home.routable.ts | 7 + src/app/features/admin/stores/admin.state.ts | 4 +- src/app/icons.ts | 5 + src/app/models/index.ts | 14 ++ src/app/shared/enums/api.enum.ts | 4 + src/app/shared/enums/icon-name.enum.ts | 1 + src/app/shared/enums/label-translate.enum.ts | 3 + src/app/shared/enums/routes.enum.ts | 6 + src/app/shared/enums/state.enum.ts | 1 + .../shared/services/store-dialog.service.ts | 5 +- .../shared/services/store-route.service.ts | 8 +- src/assets/i18n/de.json | 18 +- src/assets/i18n/en.json | 16 ++ src/assets/i18n/fr.json | 16 ++ 29 files changed, 874 insertions(+), 6 deletions(-) create mode 100644 src/app/features/admin/application-event/admin-application-event-routing.module.ts create mode 100644 src/app/features/admin/application-event/admin-application-event.module.ts create mode 100644 src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html create mode 100644 src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.scss create mode 100644 src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts create mode 100644 src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.html create mode 100644 src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.scss create mode 100644 src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.ts create mode 100644 src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.scss create mode 100644 src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts create mode 100644 src/app/features/admin/application-event/stores/admin-application-event.action.ts create mode 100644 src/app/features/admin/application-event/stores/admin-application-event.state.ts diff --git a/src/app/enums/index.ts b/src/app/enums/index.ts index 28ba0eae2..3ce3774e6 100644 --- a/src/app/enums/index.ts +++ b/src/app/enums/index.ts @@ -1030,6 +1030,48 @@ export namespace Enums { }, ]; + export type EventTypeEnum = + "PUBLICATION_TO_VALIDATE" + | "PUBLICATION_CREATED" + | "PUBLICATION_SUBMITTED" + | "PUBLICATION_REJECTED" + | "COMMENT_IN_PUBLICATION" + | "PUBLICATION_FEEDBACK_REQUIRED"; + export const EventTypeEnum = { + PUBLICATION_TO_VALIDATE: "PUBLICATION_TO_VALIDATE" as EventTypeEnum, + PUBLICATION_CREATED: "PUBLICATION_CREATED" as EventTypeEnum, + PUBLICATION_SUBMITTED: "PUBLICATION_SUBMITTED" as EventTypeEnum, + PUBLICATION_REJECTED: "PUBLICATION_REJECTED" as EventTypeEnum, + COMMENT_IN_PUBLICATION: "COMMENT_IN_PUBLICATION" as EventTypeEnum, + PUBLICATION_FEEDBACK_REQUIRED: "PUBLICATION_FEEDBACK_REQUIRED" as EventTypeEnum, + }; + export const EventTypeEnumTranslate: KeyValue[] = [ + { + key: EventTypeEnum.PUBLICATION_TO_VALIDATE, + value: MARK_AS_TRANSLATABLE("enum.eventType.publicationToValidate"), + }, + { + key: EventTypeEnum.PUBLICATION_CREATED, + value: MARK_AS_TRANSLATABLE("enum.eventType.publicationCreated"), + }, + { + key: EventTypeEnum.PUBLICATION_SUBMITTED, + value: MARK_AS_TRANSLATABLE("enum.eventType.publicationSubmitted"), + }, + { + key: EventTypeEnum.PUBLICATION_REJECTED, + value: MARK_AS_TRANSLATABLE("enum.eventType.publicationRejected"), + }, + { + key: EventTypeEnum.COMMENT_IN_PUBLICATION, + value: MARK_AS_TRANSLATABLE("enum.eventType.commentInPublication"), + }, + { + key: EventTypeEnum.PUBLICATION_FEEDBACK_REQUIRED, + value: MARK_AS_TRANSLATABLE("enum.eventType.publicationFeedbackRequired"), + }, + ]; + export type NotificationTypeEnum = "PUBLICATION_CREATED_RESEARCH_GROUP" | "PUBLICATION_CREATED_STRUCTURE" diff --git a/src/app/features/admin/admin-routing.module.ts b/src/app/features/admin/admin-routing.module.ts index 88673481a..cf6b6a1c9 100644 --- a/src/app/features/admin/admin-routing.module.ts +++ b/src/app/features/admin/admin-routing.module.ts @@ -27,6 +27,15 @@ const routes: Routes = [ }, canActivate: [ApplicationRoleGuardService], }, + { + path: AdminRoutesEnum.applicationEvent, + // @ts-ignore Dynamic import + loadChildren: () => import("./application-event/admin-application-event.module").then(m => m.AdminApplicationEventModule), + data: { + breadcrumb: LabelTranslateEnum.events, + }, + canActivate: [ApplicationRoleGuardService], + }, { path: AdminRoutesEnum.structure, // @ts-ignore Dynamic import diff --git a/src/app/features/admin/admin.module.ts b/src/app/features/admin/admin.module.ts index 6c71f9389..25b0d3ec9 100644 --- a/src/app/features/admin/admin.module.ts +++ b/src/app/features/admin/admin.module.ts @@ -1,3 +1,4 @@ +import {AdminApplicationEventState} from "@admin/application-event/stores/admin-application-event.state"; import {AdminResearchGroupState} from "@admin/research-group/stores/admin-research-group.state"; import {AdminRoleState} from "@admin/role/stores/admin-role.state"; import {AdminStructureState} from "@admin/structure/stores/admin-structure.state"; @@ -36,6 +37,7 @@ const presentationals = []; NgxsModule.forFeature([ AdminState, AdminLicenseState, + AdminApplicationEventState, AdminStructureState, AdminResearchGroupState, AdminUserState, diff --git a/src/app/features/admin/application-event/admin-application-event-routing.module.ts b/src/app/features/admin/application-event/admin-application-event-routing.module.ts new file mode 100644 index 000000000..e31b8dc7b --- /dev/null +++ b/src/app/features/admin/application-event/admin-application-event-routing.module.ts @@ -0,0 +1,39 @@ +import {AdminApplicationEventDetailEditRoutable} from "@admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable"; +import {AdminApplicationEventListRoutable} from "@admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable"; +import {adminApplicationEventActionNameSpace} from "@admin/application-event/stores/admin-application-event.action"; +import {AdminApplicationEventState} from "@admin/application-event/stores/admin-application-event.state"; +import {NgModule} from "@angular/core"; +import {RouterModule} from "@angular/router"; +import { + AdminRoutesEnum, + AppRoutesEnum, +} from "@shared/enums/routes.enum"; +import { + ResourceExistGuardService, + SolidifyRoutes, +} from "solidify-frontend"; + +const routes: SolidifyRoutes = [ + { + path: AppRoutesEnum.root, + component: AdminApplicationEventListRoutable, + data: {}, + }, + { + path: AdminRoutesEnum.applicationEventDetail + AppRoutesEnum.separator + AppRoutesEnum.paramId, + component: AdminApplicationEventDetailEditRoutable, + data: { + breadcrumbMemoizedSelector: AdminApplicationEventState.currentTitle, + nameSpace: adminApplicationEventActionNameSpace, + resourceState: AdminApplicationEventState, + }, + canActivate: [ResourceExistGuardService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class AdminApplicationEventRoutingModule { +} diff --git a/src/app/features/admin/application-event/admin-application-event.module.ts b/src/app/features/admin/application-event/admin-application-event.module.ts new file mode 100644 index 000000000..33db39df9 --- /dev/null +++ b/src/app/features/admin/application-event/admin-application-event.module.ts @@ -0,0 +1,45 @@ +import {AdminApplicationEventRoutingModule} from "@admin/application-event/admin-application-event-routing.module"; +import {AdminApplicationEventFormPresentational} from "@admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational"; +import {AdminApplicationEventDetailEditRoutable} from "@admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable"; +import {AdminApplicationEventListRoutable} from "@admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable"; +import {AdminApplicationEventState} from "@admin/application-event/stores/admin-application-event.state"; +import {NgModule} from "@angular/core"; +import {SharedModule} from "@app/shared/shared.module"; +import {TranslateModule} from "@ngx-translate/core"; +import {NgxsModule} from "@ngxs/store"; + +const routables = [ + AdminApplicationEventDetailEditRoutable, + AdminApplicationEventListRoutable, +]; +const containers = []; +const dialogs = []; +const presentationals = [ + AdminApplicationEventFormPresentational, +]; + +@NgModule({ + declarations: [ + ...routables, + ...containers, + ...dialogs, + ...presentationals, + ], + imports: [ + SharedModule, + AdminApplicationEventRoutingModule, + TranslateModule.forChild({}), + NgxsModule.forFeature([ + AdminApplicationEventState, + ]), + ], + entryComponents: [ + ...dialogs, + ], + exports: [ + ...routables, + ], + providers: [], +}) +export class AdminApplicationEventModule { +} diff --git a/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html new file mode 100644 index 000000000..94aa53924 --- /dev/null +++ b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html @@ -0,0 +1,93 @@ +<form (ngSubmit)="onSubmit()" + [formGroup]="form" +> + <solidify-detail-presentation [centerTemplate]="centerTemplate" + [iconName]="iconNameEnum.events" + [rightTemplate]="rightTemplate" + ></solidify-detail-presentation> + + <ng-template #centerTemplate> + <mat-form-field *ngIf="getFormControl(formDefinition.eventType) as fd" + [appearance]="appearanceInputMaterial" + [floatLabel]="positionLabelInputMaterial" + solidifyTooltipOnEllipsis + > + <mat-label>{{labelTranslateEnum.type | translate}}</mat-label> + <mat-select [formControl]="fd" + [required]="formValidationHelper.hasRequiredField(fd)" + [solidifyValidation]="errors" + > + <mat-option *ngFor="let type of notificationTypeEnumTranslate" + [value]="type.key" + > + {{type.value | translate}} + </mat-option> + </mat-select> + <mat-error #errors></mat-error> + </mat-form-field> + + <mat-form-field *ngIf="getFormControl(formDefinition.deposit) as fd" + [appearance]="appearanceInputMaterial" + [floatLabel]="positionLabelInputMaterial" + solidifyTooltipOnEllipsis + > + <mat-label>{{labelTranslateEnum.deposit | translate}}</mat-label> + <input [formControl]="fd" + [required]="formValidationHelper.hasRequiredField(fd)" + [solidifyValidation]="errors" + matInput + > + <mat-error #errors></mat-error> + </mat-form-field> + + <mat-form-field *ngIf="getFormControl(formDefinition.emitter) as fd" + [appearance]="appearanceInputMaterial" + [floatLabel]="positionLabelInputMaterial" + solidifyTooltipOnEllipsis + > + <mat-label>{{labelTranslateEnum.emitter | translate}}</mat-label> + <input [formControl]="fd" + [required]="formValidationHelper.hasRequiredField(fd)" + [solidifyValidation]="errors" + matInput + > + <mat-error #errors></mat-error> + </mat-form-field> + + <mat-form-field *ngIf="getFormControl(formDefinition.message) as fd" + [appearance]="appearanceInputMaterial" + [floatLabel]="positionLabelInputMaterial" + class="mat-form-field" + solidifyTooltipOnEllipsis + > + <mat-label>{{labelTranslateEnum.message | translate}}</mat-label> + <textarea [formControl]="fd" + [required]="formValidationHelper.hasRequiredField(fd)" + [solidifyValidation]="errors" + cdkAutosizeMaxRows="10" + cdkAutosizeMinRows="5" + cdkTextareaAutosize + matInput + > + </textarea> + <mat-error #errors></mat-error> + </mat-form-field> + </ng-template> + + <ng-template #rightTemplate> + + <button (click)="goToDeposit()" + (onEnter)="goToDeposit()" + solidifyAlternativeButton + solidifyShortCuts + > + {{labelTranslateEnum.seeDeposit | translate}} + </button> + + </ng-template> + + <aou-shared-additional-information-panel-container *ngIf="model | isNotNullNorUndefined" + [resource]="model" + > + </aou-shared-additional-information-panel-container> +</form> diff --git a/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.scss b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.scss new file mode 100644 index 000000000..9f422acd8 --- /dev/null +++ b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.scss @@ -0,0 +1,5 @@ +@import "~solidify-frontend/lib/components/presentationals/abstract-form/abstract-form.presentational.scss"; + +:host { + +} diff --git a/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts new file mode 100644 index 000000000..e330797a4 --- /dev/null +++ b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts @@ -0,0 +1,83 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + Injector, +} from "@angular/core"; +import { + FormBuilder, + Validators, +} from "@angular/forms"; +import {Enums} from "@enums"; +import {ApplicationEvent} from "@models"; +import {IconNameEnum} from "@shared/enums/icon-name.enum"; +import {LabelTranslateEnum} from "@shared/enums/label-translate.enum"; +import {RoutesEnum} from "@shared/enums/routes.enum"; +import { + AbstractFormPresentational, + BaseFormDefinition, + KeyValue, + PropertyName, + SolidifyValidator, +} from "solidify-frontend"; + +@Component({ + selector: "aou-admin-application-event-form", + templateUrl: "./admin-application-event-form.presentational.html", + styleUrls: ["./admin-application-event-form.presentational.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminApplicationEventFormPresentational extends AbstractFormPresentational<ApplicationEvent> { + formDefinition: FormComponentFormDefinition = new FormComponentFormDefinition(); + + notificationTypeEnumTranslate: KeyValue[] = Enums.NotificationType.NotificationTypeEnumTranslate; + + get labelTranslateEnum(): typeof LabelTranslateEnum { + return LabelTranslateEnum; + } + + get iconNameEnum(): typeof IconNameEnum { + return IconNameEnum; + } + + constructor(protected readonly _changeDetectorRef: ChangeDetectorRef, + protected readonly _elementRef: ElementRef, + private readonly _fb: FormBuilder, + protected readonly _injector: Injector) { + super(_changeDetectorRef, _elementRef, _injector); + } + + protected initNewForm(): void { + this.form = this._fb.group({ + [this.formDefinition.eventType]: ["", [Validators.required, SolidifyValidator]], + [this.formDefinition.deposit]: ["", [Validators.required, SolidifyValidator]], + [this.formDefinition.emitter]: ["", [Validators.required, SolidifyValidator]], + [this.formDefinition.message]: ["", [Validators.required, SolidifyValidator]], + }); + } + + protected bindFormTo(applicationEvent: ApplicationEvent): void { + this.form = this._fb.group({ + [this.formDefinition.eventType]: [applicationEvent.eventType?.resId, [Validators.required, SolidifyValidator]], + [this.formDefinition.deposit]: [applicationEvent.publication?.title, [Validators.required, SolidifyValidator]], + [this.formDefinition.emitter]: [applicationEvent.triggerBy?.fullName, [Validators.required, SolidifyValidator]], + [this.formDefinition.message]: [applicationEvent.message, [Validators.required, SolidifyValidator]], + }); + } + + protected treatmentBeforeSubmit(applicationEvent: ApplicationEvent): ApplicationEvent { + return applicationEvent; + } + + goToDeposit(): void { + this._navigateBS.next([RoutesEnum.depositToValidateDetail, this.model.publication.resId]); + } +} + +class FormComponentFormDefinition extends BaseFormDefinition { + @PropertyName() eventType: string; + @PropertyName() deposit: string; + @PropertyName() emitter: string; + @PropertyName() message: string; +} diff --git a/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.html b/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.html new file mode 100644 index 000000000..cc6d630a3 --- /dev/null +++ b/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.html @@ -0,0 +1,32 @@ +<solidify-empty-container solidifyShortCuts + [solidifyFocusFirstElement]="true" + (onEscape)="isEdit ? backToDetail() : backToList()" +> + <solidify-button-toolbar-detail [mode]="isEdit ? 'edit' : 'detail'" + [formPresentational]="formPresentational" + [currentModel]="currentObs | async" + [deleteAvailable]="deleteAvailable" + [editAvailable]="editAvailable" + (editChange)="edit()" + (deleteChange)="delete()" + (backToDetailChange)="backToDetail()" + (backToListChange)="backToList()" + > + </solidify-button-toolbar-detail> + + <div class="wrapper" + [solidifySpinner]="isLoadingWithDependencyObs | async" + > + <aou-admin-application-event-form #formPresentational + *ngIf="isReadyToBeDisplayedObs | async" + [model]="currentObs| async" + [readonly]="!isEdit" + [editAvailable]="editAvailable" + (submitChange)="update($event)" + (checkAvailableChange)="checkAvailable($event)" + (navigate)="navigate($event)" + (dirtyChange)="updateCanDeactivate($event)" + (editChange)="edit()" + ></aou-admin-application-event-form> + </div> +</solidify-empty-container> diff --git a/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.scss b/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.scss new file mode 100644 index 000000000..973133dad --- /dev/null +++ b/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.scss @@ -0,0 +1 @@ +@import "~solidify-frontend/lib/components/routables/abstract-detail-edit-common/abstract-detail-edit-common.routable.scss"; diff --git a/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.ts b/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.ts new file mode 100644 index 000000000..87dbbc0c1 --- /dev/null +++ b/src/app/features/admin/application-event/components/routables/admin-application-event-detail-edit/admin-application-event-detail-edit.routable.ts @@ -0,0 +1,59 @@ +import {adminApplicationEventActionNameSpace} from "@admin/application-event/stores/admin-application-event.action"; +import { + AdminApplicationEventState, + AdminApplicationEventStateModel, +} from "@admin/application-event/stores/admin-application-event.state"; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Injector, +} from "@angular/core"; +import {MatDialog} from "@angular/material/dialog"; +import {ActivatedRoute} from "@angular/router"; +import {ApplicationEvent} from "@models"; +import { + Actions, + Select, + Store, +} from "@ngxs/store"; +import {StateEnum} from "@shared/enums/state.enum"; +import {Observable} from "rxjs"; +import { + AbstractDetailEditCommonRoutable, + OverrideProperty, +} from "solidify-frontend"; + +@Component({ + selector: "aou-admin-application-event-detail-edit-routable", + templateUrl: "./admin-application-event-detail-edit.routable.html", + styleUrls: ["./admin-application-event-detail-edit.routable.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminApplicationEventDetailEditRoutable extends AbstractDetailEditCommonRoutable<ApplicationEvent, AdminApplicationEventStateModel> { + @Select(AdminApplicationEventState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>; + @Select(AdminApplicationEventState.isReadyToBeDisplayed) isReadyToBeDisplayedObs: Observable<boolean>; + + @OverrideProperty() + getByIdIfAlreadyInState: boolean = false; + + @OverrideProperty() + readonly editAvailable: boolean = false; + + @OverrideProperty() + readonly deleteAvailable: boolean = false; + + readonly KEY_PARAM_NAME: keyof ApplicationEvent & string = "resId"; + + constructor(protected _store: Store, + protected _route: ActivatedRoute, + protected readonly _actions$: Actions, + protected readonly _changeDetector: ChangeDetectorRef, + public _dialog: MatDialog, + protected readonly _injector: Injector) { + super(_store, _route, _actions$, _changeDetector, _dialog, StateEnum.admin_applicationEvent, _injector, adminApplicationEventActionNameSpace, StateEnum.admin); + } + + getSubResourceWithParentId(id: string): void { + } +} diff --git a/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.scss b/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.scss new file mode 100644 index 000000000..315fdfa7c --- /dev/null +++ b/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.scss @@ -0,0 +1 @@ +@import "~solidify-frontend/lib/components/routables/abstract-list/abstract-list.routable.scss"; diff --git a/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts b/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts new file mode 100644 index 000000000..f126cc408 --- /dev/null +++ b/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts @@ -0,0 +1,131 @@ +import {adminApplicationEventActionNameSpace} from "@admin/application-event/stores/admin-application-event.action"; +import {AdminApplicationEventStateModel} from "@admin/application-event/stores/admin-application-event.state"; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Injector, +} from "@angular/core"; +import {MatDialog} from "@angular/material/dialog"; +import {ActivatedRoute} from "@angular/router"; +import {sharedPersonActionNameSpace} from "@app/shared/stores/person/shared-person.action"; +import {Enums} from "@enums"; +import { + ApplicationEvent, + Deposit, + Person, +} from "@models"; +import { + Actions, + Store, +} from "@ngxs/store"; +import {LabelTranslateEnum} from "@shared/enums/label-translate.enum"; +import {sharedDepositActionNameSpace} from "@shared/stores/deposit/shared-deposit.action"; +import {SharedDepositState} from "@shared/stores/deposit/shared-deposit.state"; +import {SharedPersonState} from "@shared/stores/person/shared-person.state"; +import { + AbstractListRoutable, + DataTableFieldTypeEnum, + OrderEnum, + ResourceNameSpace, + RouterExtensionService, + Sort, +} from "solidify-frontend"; +import {StateEnum} from "../../../../../../shared/enums/state.enum"; + +@Component({ + selector: "aou-admin-application-event-list-routable", + templateUrl: "../../../../../../../../node_modules/solidify-frontend/lib/components/routables/abstract-list/abstract-list.routable.html", + styleUrls: ["./admin-application-event-list.routable.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminApplicationEventListRoutable extends AbstractListRoutable<ApplicationEvent, AdminApplicationEventStateModel> { + readonly KEY_CREATE_BUTTON: string = undefined; + readonly KEY_BACK_BUTTON: string | undefined = LabelTranslateEnum.backToAdmin; + readonly KEY_PARAM_NAME: keyof ApplicationEvent & string = "resId"; + + sharedDepositSort: Sort<Deposit> = { + field: "title", + order: OrderEnum.ascending, + }; + sharedDepositActionNameSpace: ResourceNameSpace = sharedDepositActionNameSpace; + sharedDepositState: typeof SharedDepositState = SharedDepositState; + + sharedPersonSort: Sort<Person> = { + field: "fullName", + order: OrderEnum.ascending, + }; + sharedPersonActionNameSpace: ResourceNameSpace = sharedPersonActionNameSpace; + sharedPersonState: typeof SharedPersonState = SharedPersonState; + + constructor(protected readonly _store: Store, + protected readonly _changeDetector: ChangeDetectorRef, + protected readonly _route: ActivatedRoute, + protected readonly _routerExt: RouterExtensionService, + protected readonly _actions$: Actions, + protected readonly _dialog: MatDialog, + protected readonly _injector: Injector) { + super(_store, _changeDetector, _route, _routerExt, _actions$, _dialog, StateEnum.admin_applicationEvent, adminApplicationEventActionNameSpace, _injector, { + canCreate: false, + }, StateEnum.admin); + } + + conditionDisplayEditButton(model: ApplicationEvent | undefined): boolean { + return false; + } + + conditionDisplayDeleteButton(model: ApplicationEvent | undefined): boolean { + return false; + } + + defineColumns(): void { + this.columns = [ + { + field: "eventType.resId", + header: LabelTranslateEnum.type, + type: DataTableFieldTypeEnum.singleSelect, + filterableField: "eventType.resId", + sortableField: "eventType.name", + order: OrderEnum.none, + filterEnum: Enums.NotificationType.NotificationTypeEnumTranslate, + isFilterable: true, + isSortable: true, + translate: true, + }, + { + field: "publication.title", + header: LabelTranslateEnum.deposit, + type: DataTableFieldTypeEnum.searchableSingleSelect, + order: OrderEnum.none, + filterableField: "publication.resId", + resourceNameSpace: this.sharedDepositActionNameSpace, + resourceState: this.sharedDepositState as any, + searchableSingleSelectSort: this.sharedDepositSort, + resourceLabelKey: "title", + isFilterable: true, + isSortable: true, + }, + { + field: "triggerBy.fullName", + header: LabelTranslateEnum.emitter, + type: DataTableFieldTypeEnum.searchableSingleSelect, + order: OrderEnum.none, + filterableField: "triggerBy.resId", + sortableField: "triggerBy.lastName", + resourceNameSpace: this.sharedPersonActionNameSpace, + resourceState: this.sharedPersonState as any, + searchableSingleSelectSort: this.sharedPersonSort, + isFilterable: false, + isSortable: true, + }, + { + field: "creation.when" as any, + header: LabelTranslateEnum.created, + type: DataTableFieldTypeEnum.datetime, + order: OrderEnum.none, + isFilterable: true, + isSortable: true, + }, + ]; + } +} diff --git a/src/app/features/admin/application-event/stores/admin-application-event.action.ts b/src/app/features/admin/application-event/stores/admin-application-event.action.ts new file mode 100644 index 000000000..e4cf8d956 --- /dev/null +++ b/src/app/features/admin/application-event/stores/admin-application-event.action.ts @@ -0,0 +1,156 @@ +import { + ApplicationEvent, + License, +} from "@models"; +import {StateEnum} from "../../../../shared/enums/state.enum"; +import { + ResourceAction, + ResourceNameSpace, + TypeDefaultAction, +} from "solidify-frontend"; + +const state = StateEnum.admin_applicationEvent; + +export namespace AdminApplicationEventAction { + @TypeDefaultAction(state) + export class LoadResource extends ResourceAction.LoadResource { + } + + @TypeDefaultAction(state) + export class LoadResourceSuccess extends ResourceAction.LoadResourceSuccess { + } + + @TypeDefaultAction(state) + export class LoadResourceFail extends ResourceAction.LoadResourceFail { + } + + @TypeDefaultAction(state) + export class ChangeQueryParameters extends ResourceAction.ChangeQueryParameters { + } + + @TypeDefaultAction(state) + export class GetAll extends ResourceAction.GetAll { + } + + @TypeDefaultAction(state) + export class GetAllSuccess extends ResourceAction.GetAllSuccess<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class GetAllFail extends ResourceAction.GetAllFail<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class GetByListId extends ResourceAction.GetByListId { + } + + @TypeDefaultAction(state) + export class GetByListIdSuccess extends ResourceAction.GetByListIdSuccess { + } + + @TypeDefaultAction(state) + export class GetByListIdFail extends ResourceAction.GetByListIdFail { + } + + @TypeDefaultAction(state) + export class GetById extends ResourceAction.GetById { + } + + @TypeDefaultAction(state) + export class GetByIdSuccess extends ResourceAction.GetByIdSuccess<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class GetByIdFail extends ResourceAction.GetByIdFail<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class Create extends ResourceAction.Create<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class CreateSuccess extends ResourceAction.CreateSuccess<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class CreateFail extends ResourceAction.CreateFail<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class Update extends ResourceAction.Update<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class UpdateSuccess extends ResourceAction.UpdateSuccess<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class UpdateFail extends ResourceAction.UpdateFail<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class Delete extends ResourceAction.Delete { + } + + @TypeDefaultAction(state) + export class DeleteSuccess extends ResourceAction.DeleteSuccess { + } + + @TypeDefaultAction(state) + export class DeleteFail extends ResourceAction.DeleteFail { + } + + @TypeDefaultAction(state) + export class DeleteList extends ResourceAction.DeleteList { + } + + @TypeDefaultAction(state) + export class DeleteListSuccess extends ResourceAction.DeleteListSuccess { + } + + @TypeDefaultAction(state) + export class DeleteListFail extends ResourceAction.DeleteListFail { + } + + @TypeDefaultAction(state) + export class AddInList extends ResourceAction.AddInList<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class AddInListById extends ResourceAction.AddInListById { + } + + @TypeDefaultAction(state) + export class AddInListByIdSuccess extends ResourceAction.AddInListByIdSuccess<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class AddInListByIdFail extends ResourceAction.AddInListByIdFail<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class RemoveInListById extends ResourceAction.RemoveInListById { + } + + @TypeDefaultAction(state) + export class RemoveInListByListId extends ResourceAction.RemoveInListByListId { + } + + @TypeDefaultAction(state) + export class LoadNextChunkList extends ResourceAction.LoadNextChunkList { + } + + @TypeDefaultAction(state) + export class LoadNextChunkListSuccess extends ResourceAction.LoadNextChunkListSuccess<ApplicationEvent> { + } + + @TypeDefaultAction(state) + export class LoadNextChunkListFail extends ResourceAction.LoadNextChunkListFail { + } + + @TypeDefaultAction(state) + export class Clean extends ResourceAction.Clean { + } +} + +export const adminApplicationEventActionNameSpace: ResourceNameSpace = AdminApplicationEventAction; diff --git a/src/app/features/admin/application-event/stores/admin-application-event.state.ts b/src/app/features/admin/application-event/stores/admin-application-event.state.ts new file mode 100644 index 000000000..df3e5280d --- /dev/null +++ b/src/app/features/admin/application-event/stores/admin-application-event.state.ts @@ -0,0 +1,74 @@ +import {adminApplicationEventActionNameSpace} from "@admin/application-event/stores/admin-application-event.action"; +import {Injectable} from "@angular/core"; +import {ApplicationEvent} from "@models"; +import { + Actions, + Selector, + State, + Store, +} from "@ngxs/store"; +import {ApiEnum} from "@shared/enums/api.enum"; +import { + ApiService, + defaultResourceStateInitValue, + isNullOrUndefined, + NotificationService, + ResourceState, + ResourceStateModel, + StoreUtil, +} from "solidify-frontend"; +import {StateEnum} from "../../../../shared/enums/state.enum"; + +export interface AdminApplicationEventStateModel extends ResourceStateModel<ApplicationEvent> { +} + +@Injectable() +@State<AdminApplicationEventStateModel>({ + name: StateEnum.admin_applicationEvent, + defaults: { + ...defaultResourceStateInitValue(), + }, +}) +export class AdminApplicationEventState extends ResourceState<AdminApplicationEventStateModel, ApplicationEvent> { + constructor(protected apiService: ApiService, + protected store: Store, + protected notificationService: NotificationService, + protected actions$: Actions) { + super(apiService, store, notificationService, actions$, { + nameSpace: adminApplicationEventActionNameSpace, + }); + } + + protected get _urlResource(): string { + return ApiEnum.adminApplicationEvents; + } + + @Selector() + static isLoading(state: AdminApplicationEventStateModel): boolean { + return StoreUtil.isLoadingState(state); + } + + @Selector() + static isLoadingWithDependency(state: AdminApplicationEventStateModel): boolean { + return this.isLoading(state); + } + + @Selector() + static currentTitle(state: AdminApplicationEventStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current?.creation?.when; + } + + @Selector() + static isReadyToBeDisplayed(state: AdminApplicationEventStateModel): boolean { + return this.isReadyToBeDisplayedInCreateMode + && !isNullOrUndefined(state.current); + } + + @Selector() + static isReadyToBeDisplayedInCreateMode(state: AdminApplicationEventStateModel): boolean { + return true; + } +} diff --git a/src/app/features/admin/components/routables/admin-home/admin-home.routable.ts b/src/app/features/admin/components/routables/admin-home/admin-home.routable.ts index 2c3082298..240b2d8e5 100644 --- a/src/app/features/admin/components/routables/admin-home/admin-home.routable.ts +++ b/src/app/features/admin/components/routables/admin-home/admin-home.routable.ts @@ -74,6 +74,13 @@ export class AdminHomeRoutable extends AbstractHomeRoutable { path: RoutesEnum.adminRole, permission: ApplicationRolePermissionEnum.rootPermission, }, + { + avatarIcon: IconNameEnum.events, + titleToTranslate: LabelTranslateEnum.events, + subtitleToTranslate: MARK_AS_TRANSLATABLE("admin.events.home.subtitle"), + path: RoutesEnum.adminApplicationEvent, + permission: ApplicationRolePermissionEnum.noPermission, + }, ]; constructor(protected readonly _store: Store, diff --git a/src/app/features/admin/stores/admin.state.ts b/src/app/features/admin/stores/admin.state.ts index 5193c67f0..77af1ba55 100644 --- a/src/app/features/admin/stores/admin.state.ts +++ b/src/app/features/admin/stores/admin.state.ts @@ -1,15 +1,16 @@ +import {AdminApplicationEventState} from "@admin/application-event/stores/admin-application-event.state"; import {AdminLicenseState} from "@admin/license/stores/admin-license.state"; import {AdminResearchGroupState} from "@admin/research-group/stores/admin-research-group.state"; import {AdminRoleState} from "@admin/role/stores/admin-role.state"; import {AdminStructureState} from "@admin/structure/stores/admin-structure.state"; import {AdminUserState} from "@admin/user/stores/admin-user.state"; import {Injectable} from "@angular/core"; -import {StateEnum} from "../../../shared/enums/state.enum"; import { State, Store, } from "@ngxs/store"; import {BaseStateModel} from "solidify-frontend"; +import {StateEnum} from "../../../shared/enums/state.enum"; export interface AdminStateModel extends BaseStateModel { } @@ -26,6 +27,7 @@ export interface AdminStateModel extends BaseStateModel { AdminUserState, AdminRoleState, AdminResearchGroupState, + AdminApplicationEventState, ], }) export class AdminState { diff --git a/src/app/icons.ts b/src/app/icons.ts index ab14aa09e..d54d5bca5 100644 --- a/src/app/icons.ts +++ b/src/app/icons.ts @@ -915,6 +915,11 @@ export const icons: IconInfos[] = [ lib: IconLibEnum.image, icon: "pmid.png", }, + { + name: IconNameEnum.events, + lib: IconLibEnum.materialIcon, + icon: "notifications", + }, { name: IconNameEnum.file, lib: IconLibEnum.fontAwesome, diff --git a/src/app/models/index.ts b/src/app/models/index.ts index ecf5d2ecc..dea60bca9 100644 --- a/src/app/models/index.ts +++ b/src/app/models/index.ts @@ -4,6 +4,8 @@ import {Enums} from "@enums"; import {BaseResource} from "solidify-frontend"; import {ApplicationRole as ApplicationRolePartial} from "../generated-api/model/application-role.partial.model"; import {Application as ApplicationPartial} from "../generated-api/model/application.partial.model"; +import {Event as ApplicationEventPartial} from "../generated-api/model/event.partial.model"; +import {EventEventType as ApplicationEventEventTypePartial} from "../generated-api/model/event-event-type.partial.model"; import {ChangeInfo as ChangeInfoPartial} from "../generated-api/model/change-info.partial.model"; import {Collection as CollectionPartial} from "../generated-api/model/collection.partial.model"; import {Institution as InstitutionPartial} from "../generated-api/model/institution.partial.model"; @@ -32,6 +34,18 @@ export interface ApplicationRole extends ApplicationRolePartial, BaseResource { export interface Application extends ApplicationPartial { } +export interface ApplicationEvent extends ApplicationEventPartial { + eventType?: ApplicationEventEventType; + publication?: Deposit; + triggerBy?: Person; +} + +export interface ApplicationEventEventType extends ApplicationEventEventTypePartial { + name?: string; + creation?: ChangeInfo; + lastUpdate?: ChangeInfo; +} + export interface ChangeInfo extends ChangeInfoPartial { } diff --git a/src/app/shared/enums/api.enum.ts b/src/app/shared/enums/api.enum.ts index 190485921..a7f7cf49c 100644 --- a/src/app/shared/enums/api.enum.ts +++ b/src/app/shared/enums/api.enum.ts @@ -29,6 +29,10 @@ export class ApiEnum { return environment.admin; } + static get adminApplicationEvents(): string { + return ApiEnum.admin + SEPARATOR + ApiResourceNameEnum.EVENTS; + } + static get adminOrcid(): string { return ApiEnum.admin + SEPARATOR + ApiResourceNameEnum.ORCID; } diff --git a/src/app/shared/enums/icon-name.enum.ts b/src/app/shared/enums/icon-name.enum.ts index 5d19aa772..ba6db5c6f 100644 --- a/src/app/shared/enums/icon-name.enum.ts +++ b/src/app/shared/enums/icon-name.enum.ts @@ -178,5 +178,6 @@ export class IconNameEnum extends IconNamePartialEnum { @PropertyName() static comments: string; @PropertyName() static validatorComments: string; @PropertyName() static pmid: string; + @PropertyName() static events: string; @PropertyName() static file: string; } diff --git a/src/app/shared/enums/label-translate.enum.ts b/src/app/shared/enums/label-translate.enum.ts index 57f7a5b9b..7e5a2c347 100644 --- a/src/app/shared/enums/label-translate.enum.ts +++ b/src/app/shared/enums/label-translate.enum.ts @@ -107,6 +107,7 @@ export class LabelTranslateEnum { static submitAFile: string = MARK_AS_TRANSLATABLE("general.button.submitAFile"); static continue: string = MARK_AS_TRANSLATABLE("general.button.continue"); static okayIUnderstand: string = MARK_AS_TRANSLATABLE("general.button.okayIUnderstand"); + static seeDeposit: string = MARK_AS_TRANSLATABLE("general.button.seeDeposit"); static home: string = MARK_AS_TRANSLATABLE("general.label.home"); static uploadAvatar: string = MARK_AS_TRANSLATABLE("general.label.uploadAvatar"); @@ -161,6 +162,8 @@ export class LabelTranslateEnum { static disseminationPolicies: string = MARK_AS_TRANSLATABLE("general.label.disseminationPolicies"); static license: string = MARK_AS_TRANSLATABLE("general.label.license"); static licenses: string = MARK_AS_TRANSLATABLE("general.label.licenses"); + static events: string = MARK_AS_TRANSLATABLE("general.label.events"); + static event: string = MARK_AS_TRANSLATABLE("general.label.event"); static institution: string = MARK_AS_TRANSLATABLE("general.label.institution"); static institutions: string = MARK_AS_TRANSLATABLE("general.label.institutions"); static researchArea: string = MARK_AS_TRANSLATABLE("general.label.researchArea"); diff --git a/src/app/shared/enums/routes.enum.ts b/src/app/shared/enums/routes.enum.ts index 706357dfb..4bec35bed 100644 --- a/src/app/shared/enums/routes.enum.ts +++ b/src/app/shared/enums/routes.enum.ts @@ -52,6 +52,9 @@ export enum AdminRoutesEnum { licenseEdit = "edit", licenseDetail = "detail", + applicationEvent = "application-event", + applicationEventDetail = "detail", + researchGroup = "research-group", researchGroupCreate = "create", researchGroupEdit = "edit", @@ -103,6 +106,9 @@ export class RoutesEnum implements RoutesPartialEnum { static adminLicenseCreate: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.license + urlSeparator + AdminRoutesEnum.licenseCreate; static adminLicenseDetail: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.license + urlSeparator + AdminRoutesEnum.licenseDetail; + static adminApplicationEvent: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.applicationEvent; + static adminApplicationEventDetail: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.applicationEvent + urlSeparator + AdminRoutesEnum.applicationEventDetail; + static adminResearchGroup: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.researchGroup; static adminResearchGroupCreate: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.researchGroup + urlSeparator + AdminRoutesEnum.researchGroupCreate; static adminResearchGroupDetail: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.researchGroup + urlSeparator + AdminRoutesEnum.researchGroupDetail; diff --git a/src/app/shared/enums/state.enum.ts b/src/app/shared/enums/state.enum.ts index 4877786de..7cdb64936 100644 --- a/src/app/shared/enums/state.enum.ts +++ b/src/app/shared/enums/state.enum.ts @@ -25,6 +25,7 @@ enum StateExtendEnum { deposit_statusHistory = "deposit_statusHistory", admin = "admin", + admin_applicationEvent = "admin_applicationEvent", admin_license = "admin_license", admin_researchGroup = "admin_researchGroup", admin_structure = "admin_structure", diff --git a/src/app/shared/services/store-dialog.service.ts b/src/app/shared/services/store-dialog.service.ts index 364e1230a..bb36d40bb 100644 --- a/src/app/shared/services/store-dialog.service.ts +++ b/src/app/shared/services/store-dialog.service.ts @@ -1,18 +1,18 @@ import {adminLicenseActionNameSpace} from "@admin/license/stores/admin-license.action"; import {adminResearchGroupActionNameSpace} from "@admin/research-group/stores/admin-research-group.action"; +import {adminRoleActionNameSpace} from "@admin/role/stores/admin-role.action"; import {adminStructureActionNameSpace} from "@admin/structure/stores/admin-structure.action"; import {adminUserActionNameSpace} from "@admin/user/stores/admin-user.action"; -import {adminRoleActionNameSpace} from "@admin/role/stores/admin-role.action"; import {Injectable} from "@angular/core"; import {depositActionNameSpace} from "@app/features/deposit/stores/deposit.action"; import {environment} from "@environments/environment"; -import {StateEnum} from "../enums/state.enum"; import { AbstractStoreDialogService, DeleteDialogData, isNotNullNorUndefined, MARK_AS_TRANSLATABLE, } from "solidify-frontend"; +import {StateEnum} from "../enums/state.enum"; @Injectable({ providedIn: "root", @@ -40,7 +40,6 @@ export class StoreDialogService extends AbstractStoreDialogService { sharedDeleteDialogData.message = MARK_AS_TRANSLATABLE("admin.structure.dialog.delete.message"); sharedDeleteDialogData.resourceNameSpace = adminStructureActionNameSpace; } - if (state === StateEnum.admin_user) { sharedDeleteDialogData.message = MARK_AS_TRANSLATABLE("admin.user.dialog.delete.message"); sharedDeleteDialogData.resourceNameSpace = adminUserActionNameSpace; diff --git a/src/app/shared/services/store-route.service.ts b/src/app/shared/services/store-route.service.ts index fe39e69ff..30e833086 100644 --- a/src/app/shared/services/store-route.service.ts +++ b/src/app/shared/services/store-route.service.ts @@ -1,8 +1,8 @@ import {Injectable} from "@angular/core"; import {environment} from "@environments/environment"; -import {StateEnum} from "../enums/state.enum"; import {RoutesEnum} from "@shared/enums/routes.enum"; import {AbstractStoreRouteService} from "solidify-frontend"; +import {StateEnum} from "../enums/state.enum"; @Injectable({ providedIn: "root", @@ -44,6 +44,9 @@ export class StoreRouteService extends AbstractStoreRouteService { if (state === StateEnum.admin_license) { return RoutesEnum.adminLicenseDetail; } + if (state === StateEnum.admin_applicationEvent) { + return RoutesEnum.adminApplicationEventDetail; + } if (state === StateEnum.admin_structure) { return RoutesEnum.adminStructureDetail; } @@ -66,6 +69,9 @@ export class StoreRouteService extends AbstractStoreRouteService { if (state === StateEnum.admin_license) { return RoutesEnum.adminLicense; } + if (state === StateEnum.admin_applicationEvent) { + return RoutesEnum.adminApplicationEvent; + } if (state === StateEnum.admin_structure) { return RoutesEnum.adminStructure; } diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 7174ff17b..e6bbe42ec 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1,5 +1,10 @@ { "admin": { + "events": { + "home": { + "subtitle": "admin.events.home.subtitle" + } + }, "license": { "dialog": { "delete": { @@ -349,6 +354,14 @@ "thesis": "enum.depositSubType.thesis", "workingPaper": "enum.depositSubType.workingPaper" }, + "eventType": { + "commentInPublication": "enum.eventType.commentInPublication", + "publicationCreated": "enum.eventType.publicationCreated", + "publicationFeedbackRequired": "enum.eventType.publicationFeedbackRequired", + "publicationRejected": "enum.eventType.publicationRejected", + "publicationSubmitted": "enum.eventType.publicationSubmitted", + "publicationToValidate": "enum.eventType.publicationToValidate" + }, "fileType": { "appendix": "enum.fileType.appendix", "articleAcceptedVersion": "enum.fileType.articleAcceptedVersion", @@ -560,6 +573,7 @@ "saveWithoutSubmit": "general.button.saveWithoutSubmit", "see": "Anschauen", "seeContributorDetail": "Details zum Beitragenden anschauen", + "seeDeposit": "general.button.seeDeposit", "seeDisseminationPolicyDetail": "Details zur Veröffentlichungsrichtlinie anschauen", "seeFundingAgencyDetail": "Details zur Förderagentur anschauen", "seeInstitutionDetail": "Siehe Details der Institution", @@ -759,6 +773,8 @@ "end": "general.label.end", "endDate": "Enddatum", "enteringMembersOfTheCollaboration": "general.label.enteringMembersOfTheCollaboration", + "event": "general.label.event", + "events": "general.label.events", "example": "Beispiel", "executions": "Ausführungen", "expiration": "Ablauf", @@ -1185,4 +1201,4 @@ "title": "Benutzerhandbuch", "tooltipClose": "Benutzerhandbuch schliessen" } -} \ No newline at end of file +} diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 6d005d66d..5dda4fda3 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1,5 +1,10 @@ { "admin": { + "events": { + "home": { + "subtitle": "Describes events issued as a result of user actions" + } + }, "license": { "dialog": { "delete": { @@ -349,6 +354,14 @@ "thesis": "Thesis", "workingPaper": "Working paper" }, + "eventType": { + "commentInPublication": "New comment", + "publicationCreated": "Creation", + "publicationFeedbackRequired": "Request for information", + "publicationRejected": "Reject", + "publicationSubmitted": "Approval", + "publicationToValidate": "Submit for approval" + }, "fileType": { "appendix": "enum.fileType.appendix", "articleAcceptedVersion": "enum.fileType.articleAcceptedVersion", @@ -560,6 +573,7 @@ "saveWithoutSubmit": "Save without submitting", "see": "See", "seeContributorDetail": "See contributor detail", + "seeDeposit": "See the deposit", "seeDisseminationPolicyDetail": "See dissemination detail", "seeFundingAgencyDetail": "See funding agency detail", "seeInstitutionDetail": "See institution detail", @@ -759,6 +773,8 @@ "end": "End", "endDate": "End date", "enteringMembersOfTheCollaboration": "Enter collaboration members", + "event": "Event", + "events": "Events", "example": "Example", "executions": "Executions", "expiration": "Expiration", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index b724e7469..7c83203af 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -1,5 +1,10 @@ { "admin": { + "events": { + "home": { + "subtitle": "Décrit les évènements émis suite à des actions utilisateurs" + } + }, "license": { "dialog": { "delete": { @@ -349,6 +354,14 @@ "thesis": "Thèse", "workingPaper": "Working paper" }, + "eventType": { + "commentInPublication": "Nouveau commentaire", + "publicationCreated": "Création", + "publicationFeedbackRequired": "Demande d'information", + "publicationRejected": "Rejet", + "publicationSubmitted": "Approbation", + "publicationToValidate": "Soumission pour validation" + }, "fileType": { "appendix": "enum.fileType.appendix", "articleAcceptedVersion": "enum.fileType.articleAcceptedVersion", @@ -560,6 +573,7 @@ "saveWithoutSubmit": "Sauvegarder sans soumettre", "see": "Voir", "seeContributorDetail": "Voir le détail des contributeurs-trices", + "seeDeposit": "Voir le dépôt", "seeDisseminationPolicyDetail": "general.button.seeDisseminationPolicyDetail", "seeFundingAgencyDetail": "Voir le détail des organismes de financement", "seeInstitutionDetail": "Voir les détails de l'institution", @@ -759,6 +773,8 @@ "end": "Fin", "endDate": "Date de fin", "enteringMembersOfTheCollaboration": "Saisir des membres de la collaboration", + "event": "Événement", + "events": "Événements", "example": "Exemple", "executions": "Exécutions", "expiration": "Expiration", -- GitLab From c7fc21bbc4a9f64e51d54d5c3fcbc3fda2297a9a Mon Sep 17 00:00:00 2001 From: Florent POITTEVIN <poittevin.florent@gmail.com> Date: Fri, 18 Jun 2021 09:54:14 +0200 Subject: [PATCH 2/2] fix: MR --- src/app/enums/index.ts | 54 ++++++++++--------- ...application-event-form.presentational.html | 2 +- ...n-application-event-form.presentational.ts | 2 +- .../admin-application-event-list.routable.ts | 4 +- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/app/enums/index.ts b/src/app/enums/index.ts index 3ce3774e6..9d2955527 100644 --- a/src/app/enums/index.ts +++ b/src/app/enums/index.ts @@ -1004,32 +1004,7 @@ export namespace Enums { ]; } - export namespace NotificationType { - - export type FrequencyEnum = - "IMMEDIATELY" - | "DAILY" - | "WEEKLY"; - export const FrequencyEnum = { - IMMEDIATELY: "IMMEDIATELY" as FrequencyEnum, - DAILY: "DAILY" as FrequencyEnum, - WEEKLY: "WEEKLY" as FrequencyEnum, - }; - export const FrequencyEnumTranslate: KeyValue[] = [ - { - key: FrequencyEnum.IMMEDIATELY, - value: MARK_AS_TRANSLATABLE("enum.frequency.immediately"), - }, - { - key: FrequencyEnum.DAILY, - value: MARK_AS_TRANSLATABLE("enum.frequency.daily"), - }, - { - key: FrequencyEnum.WEEKLY, - value: MARK_AS_TRANSLATABLE("enum.frequency.weekly"), - }, - ]; - + export namespace EventType { export type EventTypeEnum = "PUBLICATION_TO_VALIDATE" | "PUBLICATION_CREATED" @@ -1071,6 +1046,33 @@ export namespace Enums { value: MARK_AS_TRANSLATABLE("enum.eventType.publicationFeedbackRequired"), }, ]; + } + + export namespace NotificationType { + + export type FrequencyEnum = + "IMMEDIATELY" + | "DAILY" + | "WEEKLY"; + export const FrequencyEnum = { + IMMEDIATELY: "IMMEDIATELY" as FrequencyEnum, + DAILY: "DAILY" as FrequencyEnum, + WEEKLY: "WEEKLY" as FrequencyEnum, + }; + export const FrequencyEnumTranslate: KeyValue[] = [ + { + key: FrequencyEnum.IMMEDIATELY, + value: MARK_AS_TRANSLATABLE("enum.frequency.immediately"), + }, + { + key: FrequencyEnum.DAILY, + value: MARK_AS_TRANSLATABLE("enum.frequency.daily"), + }, + { + key: FrequencyEnum.WEEKLY, + value: MARK_AS_TRANSLATABLE("enum.frequency.weekly"), + }, + ]; export type NotificationTypeEnum = "PUBLICATION_CREATED_RESEARCH_GROUP" diff --git a/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html index 94aa53924..e502a76b5 100644 --- a/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html +++ b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.html @@ -17,7 +17,7 @@ [required]="formValidationHelper.hasRequiredField(fd)" [solidifyValidation]="errors" > - <mat-option *ngFor="let type of notificationTypeEnumTranslate" + <mat-option *ngFor="let type of eventTypeEnumTranslate" [value]="type.key" > {{type.value | translate}} diff --git a/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts index e330797a4..7bcffebb4 100644 --- a/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts +++ b/src/app/features/admin/application-event/components/presentationals/admin-application-event-form/admin-application-event-form.presentational.ts @@ -31,7 +31,7 @@ import { export class AdminApplicationEventFormPresentational extends AbstractFormPresentational<ApplicationEvent> { formDefinition: FormComponentFormDefinition = new FormComponentFormDefinition(); - notificationTypeEnumTranslate: KeyValue[] = Enums.NotificationType.NotificationTypeEnumTranslate; + eventTypeEnumTranslate: KeyValue[] = Enums.EventType.EventTypeEnumTranslate; get labelTranslateEnum(): typeof LabelTranslateEnum { return LabelTranslateEnum; diff --git a/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts b/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts index f126cc408..1a22a3901 100644 --- a/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts +++ b/src/app/features/admin/application-event/components/routables/admin-application-event-list/admin-application-event-list.routable.ts @@ -87,7 +87,7 @@ export class AdminApplicationEventListRoutable extends AbstractListRoutable<Appl filterableField: "eventType.resId", sortableField: "eventType.name", order: OrderEnum.none, - filterEnum: Enums.NotificationType.NotificationTypeEnumTranslate, + filterEnum: Enums.EventType.EventTypeEnumTranslate, isFilterable: true, isSortable: true, translate: true, @@ -122,7 +122,7 @@ export class AdminApplicationEventListRoutable extends AbstractListRoutable<Appl field: "creation.when" as any, header: LabelTranslateEnum.created, type: DataTableFieldTypeEnum.datetime, - order: OrderEnum.none, + order: OrderEnum.descending, isFilterable: true, isSortable: true, }, -- GitLab