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