diff --git a/src/app/features/admin/admin-routing.module.ts b/src/app/features/admin/admin-routing.module.ts index a32d10e0b6b094ae67629d8131b83dd1105867dc..897de4eb03c2827b63a39600b6a55d8a7001623d 100644 --- a/src/app/features/admin/admin-routing.module.ts +++ b/src/app/features/admin/admin-routing.module.ts @@ -18,9 +18,12 @@ import {AdminSubmissionPolicyDetailRoutable} from "@app/features/admin/component import {AdminSubmissionPolicyEditRoutable} from "@app/features/admin/components/routables/admin-submission-policy-edit/admin-submission-policy-edit.routable"; import {AdminSubmissionPolicyListRoutable} from "@app/features/admin/components/routables/admin-submission-policy-list/admin-submission-policy-list.routable"; import {AdminRoutesEnum, AppRoutesEnum} from "@app/shared/enums/routes.enum"; +import {AdminInstitutionListRoutable} from "@app/features/admin/components/routables/admin-institution-list/admin-institution-list-routable.component"; +import {AdminInstitutionCreateRoutable} from "@app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable"; +import {AdminInstitutionEditRoutable} from "@app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable"; +import {AdminInstitutionDetailRoutable} from "@app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable"; import {TRANSLATE} from "solidify-frontend"; - const routes: Routes = [ { path: AppRoutesEnum.root, @@ -141,6 +144,34 @@ const routes: Routes = [ breadcrumb: TRANSLATE("breadcrumb.admin.organizationalUnit.create"), }, }, + { + path: AdminRoutesEnum.institution, + component: AdminInstitutionListRoutable, + data: { + breadcrumb: TRANSLATE("breadcrumb.admin.institution.list"), + }, + }, + { + path: AdminRoutesEnum.institution + AppRoutesEnum.separator + AdminRoutesEnum.institutionDetail + AppRoutesEnum.separator + AppRoutesEnum.paramId, + component: AdminInstitutionDetailRoutable, + data: { + breadcrumb: TRANSLATE("breadcrumb.admin.institution.detail"), + }, + }, + { + path: AdminRoutesEnum.institution + AppRoutesEnum.separator + AdminRoutesEnum.institutionCreate, + component: AdminInstitutionCreateRoutable, + data: { + breadcrumb: TRANSLATE("breadcrumb.admin.institution.create"), + }, + }, + { + path: AdminRoutesEnum.institution + AppRoutesEnum.separator + AdminRoutesEnum.institutionEdit + AppRoutesEnum.separator + AppRoutesEnum.paramId, + component: AdminInstitutionEditRoutable, + data: { + breadcrumb: TRANSLATE("breadcrumb.admin.institution.edit"), + }, + }, ]; @NgModule({ diff --git a/src/app/features/admin/admin.module.ts b/src/app/features/admin/admin.module.ts index 59fc3a9bffbc90042125edb544cb9304e9692011..28c48678309e8ad565369e867c23c85d5d5362ad 100644 --- a/src/app/features/admin/admin.module.ts +++ b/src/app/features/admin/admin.module.ts @@ -1,14 +1,20 @@ import {NgModule} from "@angular/core"; import {AdminRoutingModule} from "@app/features/admin/admin-routing.module"; +import {AdminInstitutionDeleteDialog} from "@app/features/admin/components/dialogs/admin-institution-delete/admin-institution-delete.dialog"; import {AdminLicenseDeleteDialog} from "@app/features/admin/components/dialogs/admin-license-delete/admin-license-delete.dialog"; import {AdminOrgunitDeleteDialog} from "@app/features/admin/components/dialogs/admin-orgunit-delete/admin-orgunit-delete.dialog"; import {AdminPreservationPolicyDeleteDialog} from "@app/features/admin/components/dialogs/admin-preservation-policy-delete/admin-preservation-policy-delete.dialog"; import {AdminSubmissionPolicyDeleteDialog} from "@app/features/admin/components/dialogs/admin-submission-policy-delete/admin-submission-policy-delete.dialog"; +import {AdminInstitutionFormPresentational} from "@app/features/admin/components/presentationals/admin-institution-form/admin-institution-form.presentational"; import {AdminLicenseFormPresentational} from "@app/features/admin/components/presentationals/admin-license-form/admin-license-form.presentational"; import {AdminOrgunitFormPresentational} from "@app/features/admin/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational"; import {AdminPreservationPolicyFormPresentational} from "@app/features/admin/components/presentationals/admin-preservation-policy-form/admin-preservation-policy-form.presentational"; import {AdminSubmissionPolicyFormPresentational} from "@app/features/admin/components/presentationals/admin-submission-policy-form/admin-submission-policy-form.presentational"; import {AdminHomeRoutable} from "@app/features/admin/components/routables/admin-home/admin-home.routable"; +import {AdminInstitutionCreateRoutable} from "@app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable"; +import {AdminInstitutionDetailRoutable} from "@app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable"; +import {AdminInstitutionEditRoutable} from "@app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable"; +import {AdminInstitutionListRoutable} from "@app/features/admin/components/routables/admin-institution-list/admin-institution-list-routable.component"; import {AdminLicenseCreateRoutable} from "@app/features/admin/components/routables/admin-license-create/admin-license-create.routable"; import {AdminLicenseDetailRoutable} from "@app/features/admin/components/routables/admin-license-detail/admin-license-detail.routable"; import {AdminLicenseEditRoutable} from "@app/features/admin/components/routables/admin-license-edit/admin-license-edit.routable"; @@ -25,6 +31,7 @@ import {AdminSubmissionPolicyCreateRoutable} from "@app/features/admin/component import {AdminSubmissionPolicyDetailRoutable} from "@app/features/admin/components/routables/admin-submission-policy-detail/admin-submission-policy-detail.routable"; import {AdminSubmissionPolicyEditRoutable} from "@app/features/admin/components/routables/admin-submission-policy-edit/admin-submission-policy-edit.routable"; import {AdminState} from "@app/features/admin/stores/admin.state"; +import {AdminInstitutionState} from "@app/features/admin/stores/institution/admin-institution.state"; import {AdminLicenseState} from "@app/features/admin/stores/license/admin-license.state"; import {AdminOrganizationalUnitState} from "@app/features/admin/stores/organizational-unit/admin-organizational-unit.state"; import {AdminOrganizationalUnitSubmissionPolicyState} from "@app/features/admin/stores/organizational-unit/submission-policy/admin-organizational-unit-submission-policy.state"; @@ -49,6 +56,10 @@ const routables = [ AdminLicenseDetailRoutable, AdminLicenseEditRoutable, AdminLicenseListRoutable, + AdminInstitutionListRoutable, + AdminInstitutionDetailRoutable, + AdminInstitutionEditRoutable, + AdminInstitutionCreateRoutable, AdminOrgunitDetailRoutable, AdminOrgunitListRoutable, AdminOrgunitCreateRoutable, @@ -60,12 +71,14 @@ const dialogs = [ AdminLicenseDeleteDialog, AdminPreservationPolicyDeleteDialog, AdminOrgunitDeleteDialog, + AdminInstitutionDeleteDialog, ]; const presentationals = [ AdminSubmissionPolicyFormPresentational, AdminLicenseFormPresentational, AdminPreservationPolicyFormPresentational, AdminOrgunitFormPresentational, + AdminInstitutionFormPresentational, ]; @NgModule({ @@ -84,6 +97,7 @@ const presentationals = [ AdminSubmissionPolicyState, AdminPreservationPolicyState, AdminLicenseState, + AdminInstitutionState, AdminOrganizationalUnitState, AdminOrganizationalUnitSubmissionPolicyState, ]), diff --git a/src/app/features/admin/components/dialogs/admin-institution-delete/admin-institution-delete.dialog.ts b/src/app/features/admin/components/dialogs/admin-institution-delete/admin-institution-delete.dialog.ts new file mode 100644 index 0000000000000000000000000000000000000000..711bc66f0f61f1fd855ec1191081e741f272f3e6 --- /dev/null +++ b/src/app/features/admin/components/dialogs/admin-institution-delete/admin-institution-delete.dialog.ts @@ -0,0 +1,29 @@ +import {ChangeDetectionStrategy, Component, Inject} from "@angular/core"; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material"; +import {adminInstitutionActionNameSpace} from "@app/features/admin/stores/institution/admin-institution.action"; +import {AdminInstitutionStateModel} from "@app/features/admin/stores/institution/admin-institution.state"; +import {Institutions} from "@app/generated-api"; +import {SharedAbstractDeleteDialog} from "@app/shared/components/dialogs/shared-abstract-delete/shared-abstract-delete.dialog"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {DeleteDialog} from "@app/shared/models/delete-dialog.model"; +import {Store} from "@ngxs/store"; +import {TRANSLATE} from "solidify-frontend"; + +@Component({ + selector: "dlcm-institution-delete-dialog", + templateUrl: "../../../../../shared/components/dialogs/shared-abstract-delete/shared-abstract-delete.dialog.html", + styleUrls: ["../../../../../shared/components/dialogs/shared-abstract-delete/shared-abstract-delete.dialog.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminInstitutionDeleteDialog extends SharedAbstractDeleteDialog<Institutions, AdminInstitutionStateModel> { + public readonly KEY_TITLE: string = TRANSLATE("admin.institution.dialog.delete.title"); + public readonly KEY_MESSAGE: string = TRANSLATE("admin.institution.dialog.delete.message"); + public readonly KEY_CONFIRM_BUTTON: string = TRANSLATE("admin.institution.dialog.delete.confirm"); + public readonly KEY_CANCEL_BUTTON: string = TRANSLATE("admin.institution.dialog.delete.cancel"); + + constructor(protected store: Store, + protected dialogRef: MatDialogRef<AdminInstitutionDeleteDialog>, + @Inject(MAT_DIALOG_DATA) public data: DeleteDialog) { + super(store, dialogRef, data, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace); + } +} diff --git a/src/app/features/admin/components/presentationals/admin-institution-form/admin-institution-form.presentational.html b/src/app/features/admin/components/presentationals/admin-institution-form/admin-institution-form.presentational.html new file mode 100644 index 0000000000000000000000000000000000000000..05a96f35415acecc9da1464d5b670fe3a4df1db6 --- /dev/null +++ b/src/app/features/admin/components/presentationals/admin-institution-form/admin-institution-form.presentational.html @@ -0,0 +1,39 @@ +<form [formGroup]="form" + (ngSubmit)="onSubmit()"> + + <mat-form-field> + <mat-label>{{'admin.institution.form.name' | translate }}</mat-label> + <input matInput + [formControlName]="formDefinition.name" + [required]="isRequired(formDefinition.name)"> + <mat-error *ngIf="getFormControl(formDefinition.name).invalid">{{'required' | translate}}</mat-error> + <mat-error *ngFor="let error of getFormControl(formDefinition.name).errors?.errorsFromBackend">{{error}}</mat-error> + </mat-form-field> + + <mat-form-field> + <mat-label>{{'admin.institution.form.url' | translate }}</mat-label> + <input matInput + [formControlName]="formDefinition.url" + [required]="isRequired(formDefinition.url)"> + <mat-error *ngIf="getFormControl(formDefinition.url).invalid">{{'URL is invalid' | translate}}</mat-error> + <mat-error *ngFor="let error of getFormControl(formDefinition.url).errors?.errorsFromBackend">{{error}}</mat-error> + </mat-form-field> + + <mat-form-field> + <mat-label>{{'admin.institution.form.description' | translate }}</mat-label> + <textarea matInput cdkTextareaAutosize cdkAutosizeMinRows="5" cdkAutosizeMaxRows="10" [formControlName]="formDefinition.description"> + </textarea> + <mat-error *ngIf="getFormControl(formDefinition.description).invalid">{{'Description is invalid' | translate}}</mat-error> + <mat-error *ngFor="let error of getFormControl(formDefinition.description).errors?.errorsFromBackend">{{error}}</mat-error> + </mat-form-field> + + <div class="submit-button"> + <button *ngIf="!readonly" + mat-flat-button + color="primary" + type="submit" + [disabled]="!form.valid"> + {{'admin.institution.form.submit' | translate }} + </button> + </div> +</form> diff --git a/src/app/features/admin/components/presentationals/admin-institution-form/admin-institution-form.presentational.ts b/src/app/features/admin/components/presentationals/admin-institution-form/admin-institution-form.presentational.ts new file mode 100644 index 0000000000000000000000000000000000000000..5a1b682b047bea2cf833a1111bf87fbf41080a7f --- /dev/null +++ b/src/app/features/admin/components/presentationals/admin-institution-form/admin-institution-form.presentational.ts @@ -0,0 +1,47 @@ +import {ChangeDetectionStrategy, ChangeDetectorRef, Component} from "@angular/core"; +import {FormBuilder, Validators} from "@angular/forms"; +import {Institutions} from "@app/generated-api"; +import {SharedAbstractFormPresentational} from "@app/shared/components/presentationals/shared-abstract-form/shared-abstract-form.presentational"; +import {BaseFormDefinition} from "@app/shared/models/base-form-definition.model"; +import {PropertyName, SolidifyValidator} from "solidify-frontend"; + +@Component({ + selector: "dlcm-admin-institution-form", + templateUrl: "./admin-institution-form.presentational.html", + styleUrls: ["../../../../../shared/components/presentationals/shared-abstract-form/shared-abstract-form.presentational.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminInstitutionFormPresentational extends SharedAbstractFormPresentational<Institutions> { + public formDefinition: FormComponentFormDefinition = new FormComponentFormDefinition(); + + constructor(protected readonly _changeDetectorRef: ChangeDetectorRef, + private readonly _fb: FormBuilder) { + super(_changeDetectorRef); + } + + protected initNewForm(): void { + this.form = this._fb.group({ + [this.formDefinition.name]: ["", [Validators.required, SolidifyValidator]], + [this.formDefinition.url]: ["", [SolidifyValidator]], + [this.formDefinition.description]: ["", [SolidifyValidator]], + }); + } + + protected bindFormTo(institutions: Institutions): void { + this.form = this._fb.group({ + [this.formDefinition.name]: [institutions.name, [Validators.required, SolidifyValidator]], + [this.formDefinition.url]: [institutions.url, [SolidifyValidator]], + [this.formDefinition.description]: [institutions.description, [SolidifyValidator]], + }); + } + + protected treatmentBeforeSubmit(institutions: Institutions): Institutions { + return institutions; + } +} + +class FormComponentFormDefinition extends BaseFormDefinition { + @PropertyName() name: string; + @PropertyName() url: string; + @PropertyName() description: string; +} 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 6f74daf133bb0ad65a80fb91b8bb1821f6458c74..f597477a7b3476f046bcbd09449608d892c40904 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 @@ -38,6 +38,12 @@ export class AdminHomeRoutable extends SharedAbstractPresentational { subtitleToTranslate: TRANSLATE("admin.preservationPolicy.home.subtitle"), path: RoutesEnum.adminPreservationPolicy, }, + { + avatarIcon: "university", + titleToTranslate: TRANSLATE("admin.institution.home.title"), + subtitleToTranslate: TRANSLATE("admin.institution.home.subtitle"), + path: RoutesEnum.adminInstitution, + }, ]; constructor(private store: Store) { diff --git a/src/app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable.html b/src/app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable.html new file mode 100644 index 0000000000000000000000000000000000000000..29a58a73a7b43de341bdf218bc98ea3a87a1befd --- /dev/null +++ b/src/app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable.html @@ -0,0 +1,3 @@ +<dlcm-admin-institution-form #formPresentational + (submitChange)="create($event)" +></dlcm-admin-institution-form> diff --git a/src/app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable.ts b/src/app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable.ts new file mode 100644 index 0000000000000000000000000000000000000000..62ec7fb74810025ffa4684cb907f19889ceaf1ae --- /dev/null +++ b/src/app/features/admin/components/routables/admin-institution-create/admin-institution-create.routable.ts @@ -0,0 +1,23 @@ +import {ChangeDetectionStrategy, Component, OnInit, ViewChild} from "@angular/core"; +import {adminInstitutionActionNameSpace} from "@app/features/admin/stores/institution/admin-institution.action"; +import {AdminInstitutionStateModel} from "@app/features/admin/stores/institution/admin-institution.state"; +import {Institutions} from "@app/generated-api"; +import {SharedAbstractFormPresentational} from "@app/shared/components/presentationals/shared-abstract-form/shared-abstract-form.presentational"; +import {SharedAbstractCreateRoutable} from "@app/shared/components/routables/shared-abstract-create/shared-abstract-create.routable"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {Store} from "@ngxs/store"; + +@Component({ + selector: "dlcm-admin-institution-create-routable", + templateUrl: "./admin-institution-create.routable.html", + styleUrls: ["../../../../../shared/components/routables/shared-abstract-create/shared-abstract-create.routable.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminInstitutionCreateRoutable extends SharedAbstractCreateRoutable<Institutions, AdminInstitutionStateModel> implements OnInit { + @ViewChild("formPresentational", {static: false}) + readonly formPresentational: SharedAbstractFormPresentational<Institutions>; + + constructor(protected store: Store) { + super(store, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin); + } +} diff --git a/src/app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable.html b/src/app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable.html new file mode 100644 index 0000000000000000000000000000000000000000..77a6de3f3f832810a3170cfb14adbcb3647dc67f --- /dev/null +++ b/src/app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable.html @@ -0,0 +1,28 @@ +<div class="button-toolbar"> + <button mat-flat-button + color="primary" + (click)="edit()"> + {{KEY_EDIT_BUTTON | translate}} + </button> + <button mat-flat-button + color="accent" + [disabled]="!(currentObs| async)" + (click)="delete()"> + {{KEY_DELETE_BUTTON | translate}} + </button> +</div> + +<div class="wrapper"> + <div class="spinner-wrapper" *ngIf="isLoadingObs | async"> + <mat-spinner></mat-spinner> + </div> + + <dlcm-admin-institution-form *ngIf="(currentObs| async) != null" + [model]="currentObs| async" + [readonly]="true" + ></dlcm-admin-institution-form> + +</div> + + + diff --git a/src/app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable.ts b/src/app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable.ts new file mode 100644 index 0000000000000000000000000000000000000000..ceda27155bef4c5a43e6f1be6725c566f0d05199 --- /dev/null +++ b/src/app/features/admin/components/routables/admin-institution-detail/admin-institution-detail.routable.ts @@ -0,0 +1,31 @@ +import {ChangeDetectionStrategy, Component} from "@angular/core"; +import {MatDialog} from "@angular/material"; +import {ActivatedRoute} from "@angular/router"; +import {Institutions} from "@app/generated-api"; +import {SharedAbstractDetailRoutable} from "@app/shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {Store} from "@ngxs/store"; +import {TRANSLATE} from "solidify-frontend"; +import {AdminInstitutionStateModel} from "@app/features/admin/stores/institution/admin-institution.state"; +import {adminInstitutionActionNameSpace} from "@app/features/admin/stores/institution/admin-institution.action"; + +@Component({ + selector: "dlcm-admin-institution-detail-routable", + templateUrl: "./admin-institution-detail.routable.html", + styleUrls: ["../../../../../shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminInstitutionDetailRoutable extends SharedAbstractDetailRoutable<Institutions, AdminInstitutionStateModel> { + readonly KEY_PARAM_NAME: string = "name"; + readonly KEY_DELETE_BUTTON: string = TRANSLATE("admin.institution.button.delete"); + readonly KEY_EDIT_BUTTON: string = TRANSLATE("admin.institution.button.edit"); + + constructor(protected store: Store, + protected route: ActivatedRoute, + public dialog: MatDialog) { + super(store, route, dialog, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin); + } + + getSubResourceWithParentId(id: string): void { + } +} diff --git a/src/app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable.html b/src/app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable.html new file mode 100644 index 0000000000000000000000000000000000000000..decec7f0122b84a8fa334d12db2428ecf241082b --- /dev/null +++ b/src/app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable.html @@ -0,0 +1,8 @@ +<mat-spinner *ngIf="(isLoadingObs | async)"></mat-spinner> + +<div class="tab-content"> + <dlcm-admin-institution-form *ngIf="(currentObs | async)" + [model]="currentObs | async" + (submitChange)="update($event)" + ></dlcm-admin-institution-form> +</div> diff --git a/src/app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable.ts b/src/app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable.ts new file mode 100644 index 0000000000000000000000000000000000000000..154e1d49203c53ae300bbde6ab449b52483c9087 --- /dev/null +++ b/src/app/features/admin/components/routables/admin-institution-edit/admin-institution-edit.routable.ts @@ -0,0 +1,24 @@ +import {ChangeDetectionStrategy, Component, OnInit} from "@angular/core"; +import {ActivatedRoute} from "@angular/router"; +import {adminInstitutionActionNameSpace} from "@app/features/admin/stores/institution/admin-institution.action"; +import {AdminInstitutionStateModel} from "@app/features/admin/stores/institution/admin-institution.state"; +import {Institutions} from "@app/generated-api"; +import {SharedAbstractEditRoutable} from "@app/shared/components/routables/shared-abstract-edit/shared-abstract-edit.routable"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {Store} from "@ngxs/store"; + +@Component({ + selector: "dlcm-admin-institution-edit-routable", + templateUrl: "./admin-institution-edit.routable.html", + styleUrls: ["../../../../../shared/components/routables/shared-abstract-edit/shared-abstract-edit.routable.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminInstitutionEditRoutable extends SharedAbstractEditRoutable<Institutions, AdminInstitutionStateModel> implements OnInit { + constructor(protected store: Store, + protected route: ActivatedRoute) { + super(store, route, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, LocalStateEnum.admin); + } + + getSubResourceWithParentId(id: string): void { + } +} diff --git a/src/app/features/admin/components/routables/admin-institution-list/admin-institution-list-routable.component.ts b/src/app/features/admin/components/routables/admin-institution-list/admin-institution-list-routable.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..b99fec3bf8854e55cfadd1316747c461c8251423 --- /dev/null +++ b/src/app/features/admin/components/routables/admin-institution-list/admin-institution-list-routable.component.ts @@ -0,0 +1,53 @@ +import {ChangeDetectionStrategy, Component} from "@angular/core"; +import {adminInstitutionActionNameSpace} from "@app/features/admin/stores/institution/admin-institution.action"; +import {AdminInstitutionStateModel} from "@app/features/admin/stores/institution/admin-institution.state"; +import {Institutions} from "@app/generated-api"; +import {SharedAbstractListRoutable} from "@app/shared/components/routables/shared-abstract-list/shared-abstract-list.routable"; +import {FieldTypeEnum} from "@app/shared/enums/field-type.enum"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {Store} from "@ngxs/store"; +import {TRANSLATE} from "solidify-frontend"; + +@Component({ + selector: "dlcm-admin-institution-list-routable", + templateUrl: "../../../../../shared/components/routables/shared-abstract-list/shared-abstract-list.routable.html", + styleUrls: ["../../../../../shared/components/routables/shared-abstract-list/shared-abstract-list.routable.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminInstitutionListRoutable extends SharedAbstractListRoutable<Institutions, AdminInstitutionStateModel> { + readonly KEY_CREATE_BUTTON: string = TRANSLATE("admin.institution.button.new"); + readonly KEY_REFRESH_BUTTON: string = TRANSLATE("admin.institution.button.refresh"); + + constructor(protected store: Store) { + super(store, LocalStateEnum.admin_institution, adminInstitutionActionNameSpace, {}, LocalStateEnum.admin); + } + + defineColumns(): void { + this.columns = [ + { + field: "name", + header: TRANSLATE("admin.institution.table.header.name"), + type: FieldTypeEnum.string, + order: 0, + isFilterable: true, + isSortable: true, + }, + { + field: "creation.when" as any, + header: TRANSLATE("admin.institution.table.header.creation.when"), + type: FieldTypeEnum.datetime, + order: 0, + isFilterable: true, + isSortable: true, + }, + { + field: "lastUpdate.when" as any, + header: TRANSLATE("admin.institution.table.header.lastUpdate.when"), + type: FieldTypeEnum.datetime, + order: 0, + isFilterable: true, + isSortable: true, + }, + ]; + } +} diff --git a/src/app/features/admin/stores/admin.state.ts b/src/app/features/admin/stores/admin.state.ts index 653da64a5f127b7bad70c5cc7d677bf0300d269b..3e16119411854ea2e9b3baf7d888f3341c8ce869 100644 --- a/src/app/features/admin/stores/admin.state.ts +++ b/src/app/features/admin/stores/admin.state.ts @@ -14,12 +14,14 @@ import { import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; import {State, Store} from "@ngxs/store"; import {BaseState} from "solidify-frontend"; +import {AdminInstitutionState, AdminInstitutionStateModel} from "@app/features/admin/stores/institution/admin-institution.state"; export interface AdminStateModel extends BaseState { [LocalStateEnum.admin_submissionPolicy]: AdminSubmissionPolicyStateModel; [LocalStateEnum.admin_preservationPolicy]: AdminPreservationPolicyStateModel; [LocalStateEnum.admin_license]: AdminLicenseStateModel; [LocalStateEnum.admin_organizationalUnit]: AdminOrganizationalUnitStateModel; + [LocalStateEnum.admin_institution]: AdminInstitutionStateModel; } @State<AdminStateModel>({ @@ -30,12 +32,14 @@ export interface AdminStateModel extends BaseState { [LocalStateEnum.admin_preservationPolicy]: null, [LocalStateEnum.admin_license]: null, [LocalStateEnum.admin_organizationalUnit]: null, + [LocalStateEnum.admin_institution]: null, }, children: [ AdminSubmissionPolicyState, AdminPreservationPolicyState, AdminLicenseState, AdminOrganizationalUnitState, + AdminInstitutionState, ], }) export class AdminState { diff --git a/src/app/features/admin/stores/institution/admin-institution.action.ts b/src/app/features/admin/stores/institution/admin-institution.action.ts new file mode 100644 index 0000000000000000000000000000000000000000..db1d983ee6d301246fa59bab4e1ff3885cac618c --- /dev/null +++ b/src/app/features/admin/stores/institution/admin-institution.action.ts @@ -0,0 +1,85 @@ +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {ResourceAction, ResourceNameSpace, TypeDefaultAction} from "solidify-frontend"; +import {Institutions} from "@app/generated-api"; + +const state = LocalStateEnum.admin_institution; + +export namespace AdminInstitutionAction { + @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<Institutions> { + } + + @TypeDefaultAction(state) + export class GetAllFail extends ResourceAction.GetAllFail<Institutions> { + } + + @TypeDefaultAction(state) + export class GetById extends ResourceAction.GetById { + } + + @TypeDefaultAction(state) + export class GetByIdSuccess extends ResourceAction.GetByIdSuccess<Institutions> { + } + + @TypeDefaultAction(state) + export class GetByIdFail extends ResourceAction.GetByIdFail<Institutions> { + } + + @TypeDefaultAction(state) + export class Create extends ResourceAction.Create<Institutions> { + } + + @TypeDefaultAction(state) + export class CreateSuccess extends ResourceAction.CreateSuccess<Institutions> { + } + + @TypeDefaultAction(state) + export class CreateFail extends ResourceAction.CreateFail<Institutions> { + } + + @TypeDefaultAction(state) + export class Update extends ResourceAction.Update<Institutions> { + } + + @TypeDefaultAction(state) + export class UpdateSuccess extends ResourceAction.UpdateSuccess<Institutions> { + } + + @TypeDefaultAction(state) + export class UpdateFail extends ResourceAction.UpdateFail<Institutions> { + } + + @TypeDefaultAction(state) + export class Delete extends ResourceAction.Delete { + } + + @TypeDefaultAction(state) + export class DeleteSuccess extends ResourceAction.DeleteSuccess { + } + + @TypeDefaultAction(state) + export class DeleteFail extends ResourceAction.DeleteFail { + } +} + +export const adminInstitutionActionNameSpace: ResourceNameSpace = AdminInstitutionAction; diff --git a/src/app/features/admin/stores/institution/admin-institution.state.ts b/src/app/features/admin/stores/institution/admin-institution.state.ts new file mode 100644 index 0000000000000000000000000000000000000000..67b1674dbe5ce0bcab62ec2c0133417fa470e2cb --- /dev/null +++ b/src/app/features/admin/stores/institution/admin-institution.state.ts @@ -0,0 +1,47 @@ +import { + ApiService, + defaultResourceStateInitValue, + NotificationService, + ResourceApiEnum, + ResourceNameSpace, + ResourceState, + ResourceStateModel +} from "solidify-frontend"; +import {Institutions} from "@app/generated-api"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {AdminResourceApiEnum} from "@app/shared/enums/api.enum"; +import {adminInstitutionActionNameSpace} from "@app/features/admin/stores/institution/admin-institution.action"; +import {Actions, State, Store} from "@ngxs/store"; +import {RoutesEnum} from "@app/shared/enums/routes.enum"; +import {environment} from "../../../../../environments/environment"; + +export interface AdminInstitutionStateModel extends ResourceStateModel<Institutions> { + +} + +@State<AdminInstitutionStateModel>({ + name: LocalStateEnum.admin_institution, + defaults: { + ...defaultResourceStateInitValue, + }, +}) +export class AdminInstitutionState extends ResourceState<Institutions> { + constructor(protected apiService: ApiService, + protected store: Store, + protected notificationService: NotificationService, + protected actions$: Actions) { + super(apiService, store, notificationService, actions$, RoutesEnum.adminInstitution, environment); + } + + defineResourceNameSpace(): ResourceNameSpace { + return adminInstitutionActionNameSpace; + } + + defineState(): string { + return LocalStateEnum.admin_institution; + } + + defineUrlResource(): ResourceApiEnum { + return AdminResourceApiEnum.institutions; + } +} diff --git a/src/app/shared/enums/local-state.enum.ts b/src/app/shared/enums/local-state.enum.ts index d0e4d0f7c557b1d62dd3231052793d3af0d0224a..5cc24e8e4a332420d1363aff8ef3613881f8241a 100644 --- a/src/app/shared/enums/local-state.enum.ts +++ b/src/app/shared/enums/local-state.enum.ts @@ -27,4 +27,5 @@ export enum LocalStateEnum { admin_license = "admin_license", admin_organizationalUnit = "admin_organizationalUnit", admin_organizationalUnit_submissionPolicy = "admin_organizationalUnit_submissionPolicy", + admin_institution = "admin_institution" } diff --git a/src/app/shared/enums/routes.enum.ts b/src/app/shared/enums/routes.enum.ts index 8deee6d41fbefc997a3a7b7dde1662a8ee9f8dd3..44c7cbb7aace8a7bac8f4c5549ebf38f49e89029 100644 --- a/src/app/shared/enums/routes.enum.ts +++ b/src/app/shared/enums/routes.enum.ts @@ -46,6 +46,10 @@ export enum AdminRoutesEnum { organizationalUnitCreate = "create", organizationalUnitDetail = "detail", organizationalUnitEdit = "edit", + institution = "institution", + institutionCreate = "create", + institutionDetail = "detail", + institutionEdit = "edit", } export class RoutesEnum implements RoutesEnum { @@ -82,4 +86,8 @@ export class RoutesEnum implements RoutesEnum { static adminOrganizationalUnitCreate: string = AppRoutesEnum.admin + urlSeparator + AppRoutesEnum.organizationalUnit + urlSeparator + AdminRoutesEnum.organizationalUnitCreate; static adminOrganizationalUnitDetail: string = AppRoutesEnum.admin + urlSeparator + AppRoutesEnum.organizationalUnit + urlSeparator + AdminRoutesEnum.organizationalUnitDetail; static adminOrganizationalUnitEdit: string = AppRoutesEnum.admin + urlSeparator + AppRoutesEnum.organizationalUnit + urlSeparator + AdminRoutesEnum.organizationalUnitEdit; + static adminInstitution: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.institution; + static adminInstitutionCreate: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.institution + urlSeparator + AdminRoutesEnum.institutionCreate; + static adminInstitutionDetail: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.institution + urlSeparator + AdminRoutesEnum.institutionDetail; + static adminInstitutionEdit: string = AppRoutesEnum.admin + urlSeparator + AdminRoutesEnum.institution + urlSeparator + AdminRoutesEnum.institutionEdit; } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index cf5abbbd1bfc38e6e975d89ad05fd7d9453d67e3..bf0a7f36ec86b0a4bfc27e32f9342a40bdeee5e1 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -24,6 +24,7 @@ import {TableModule} from "primeng/table"; import {SolidifyFrontendModule} from "solidify-frontend"; import {SharedBreadcrumbPresentational} from "./components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational"; import {SharedPaginatorPresentational} from "./components/presentationals/shared-paginator/shared-paginator.presentational"; +import {TextFieldModule} from "@angular/cdk/text-field"; const routables = []; const dialogs = []; @@ -47,6 +48,7 @@ const modules = [ TableModule, TranslateModule, SolidifyFrontendModule, + TextFieldModule ]; @NgModule({ diff --git a/src/app/shared/utils/store-dialog.util.ts b/src/app/shared/utils/store-dialog.util.ts index 296543e1b0d5b4529971a219cb5c139868b6a57f..a754db841e9e712ae53e4611bdd22322eb05bdb8 100644 --- a/src/app/shared/utils/store-dialog.util.ts +++ b/src/app/shared/utils/store-dialog.util.ts @@ -6,6 +6,7 @@ import {AdminSubmissionPolicyDeleteDialog} from "@app/features/admin/components/ import {DepositDeleteDialog as DepositDeleteDialog} from "@app/features/deposit/components/dialogs/deposit-delete/deposit-delete.dialog"; import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; import {StringUtil} from "solidify-frontend"; +import {AdminInstitutionDeleteDialog} from "@app/features/admin/components/dialogs/admin-institution-delete/admin-institution-delete.dialog"; export class StoreDialogUtil { private static readonly messageNotFound: string = "There is no dialog for action '{0}' declared for the state '{1}'. Please add if statement into StoreDialogUtil static class."; @@ -26,6 +27,9 @@ export class StoreDialogUtil { if (state === LocalStateEnum.admin_license) { return AdminLicenseDeleteDialog as Component; } + if (state === LocalStateEnum.admin_institution) { + return AdminInstitutionDeleteDialog as Component; + } throw Error(StringUtil.format(StoreDialogUtil.messageNotFound, "Delete", state)); } } diff --git a/src/app/shared/utils/store-route-local.util.ts b/src/app/shared/utils/store-route-local.util.ts index a731b3c5a5700dc6232cf7d8a76ea227ec61d669..e9b72bbf76314f13f63a7e3b39bebcdd587e517e 100644 --- a/src/app/shared/utils/store-route-local.util.ts +++ b/src/app/shared/utils/store-route-local.util.ts @@ -24,6 +24,9 @@ export class StoreRouteLocalUtil { if (state === LocalStateEnum.admin_license) { return RoutesEnum.adminLicenseDetail; } + if (state === LocalStateEnum.admin_institution) { + return RoutesEnum.adminInstitutionDetail; + } throw Error(StringUtil.format(StoreRouteLocalUtil.messageNotFound, "Detail", state)); } @@ -43,6 +46,9 @@ export class StoreRouteLocalUtil { if (state === LocalStateEnum.admin_license) { return RoutesEnum.adminLicenseCreate; } + if (state === LocalStateEnum.admin_institution) { + return RoutesEnum.adminInstitutionCreate; + } throw Error(StringUtil.format(StoreRouteLocalUtil.messageNotFound, "Create", state)); } @@ -87,6 +93,9 @@ export class StoreRouteLocalUtil { if (state === LocalStateEnum.admin_license) { return RoutesEnum.adminLicenseEdit; } + if (state === LocalStateEnum.admin_institution) { + return RoutesEnum.adminInstitutionEdit; + } throw Error(StringUtil.format(StoreRouteLocalUtil.messageNotFound, "Edit", state)); } } diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 7622b91b538c9c9b3e985bd90b9e0a17a898cbc7..1df32f8acf21442e7dbfcb0fb634f76ee675f921 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1,4 +1,6 @@ { + "Description is invalid": "Description is invalid", + "URL is invalid": "URL is invalid", "access": { "organizationalUnitNotFound": "Unable to get data", "search": { @@ -25,6 +27,43 @@ }, "title": "Administration" }, + "institution": { + "button": { + "delete": "Delete", + "edit": "Edit", + "new": "Create new institution", + "refresh": "Refresh" + }, + "dialog": { + "delete": { + "cancel": "Cancel", + "confirm": "Confirm", + "message": "Are you sure you want to delete this institution?", + "title": "Confirm deletion" + } + }, + "form": { + "description": "description", + "name": "name", + "submit": "Submit", + "url": "url" + }, + "home": { + "subtitle": "Describe institution", + "title": "Institution" + }, + "table": { + "header": { + "creation": { + "when": "Creation date" + }, + "lastUpdate": { + "when": "Last update" + }, + "name": "name" + } + } + }, "license": { "button": { "delete": "Delete", @@ -193,12 +232,18 @@ }, "breadcrumb": { "access": { - "browsing": "breadcrumb.access.browsing", + "browsing": "Browsing", "detail": "Detail", "root": "Archive", "search": "Search" }, "admin": { + "institution": { + "create": "Create institution", + "detail": "License institution", + "edit": "Edit institution", + "list": "List institution" + }, "license": { "create": "Create license", "detail": "License detail", @@ -367,7 +412,7 @@ }, "home": { "button": { - "goToArchivalBrowsing": "Go to archival browsing" + "goToArchivalBrowsing": "Go to archive browsing" } }, "homePage": { @@ -385,8 +430,8 @@ }, "browsing": { "archive": { - "noArchive": "", - "noOrgUnitSelected": "" + "noArchive": "No archive for the selected organizational unit", + "noOrgUnitSelected": "No organizational unit selected" } } }, diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 7622b91b538c9c9b3e985bd90b9e0a17a898cbc7..1df32f8acf21442e7dbfcb0fb634f76ee675f921 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1,4 +1,6 @@ { + "Description is invalid": "Description is invalid", + "URL is invalid": "URL is invalid", "access": { "organizationalUnitNotFound": "Unable to get data", "search": { @@ -25,6 +27,43 @@ }, "title": "Administration" }, + "institution": { + "button": { + "delete": "Delete", + "edit": "Edit", + "new": "Create new institution", + "refresh": "Refresh" + }, + "dialog": { + "delete": { + "cancel": "Cancel", + "confirm": "Confirm", + "message": "Are you sure you want to delete this institution?", + "title": "Confirm deletion" + } + }, + "form": { + "description": "description", + "name": "name", + "submit": "Submit", + "url": "url" + }, + "home": { + "subtitle": "Describe institution", + "title": "Institution" + }, + "table": { + "header": { + "creation": { + "when": "Creation date" + }, + "lastUpdate": { + "when": "Last update" + }, + "name": "name" + } + } + }, "license": { "button": { "delete": "Delete", @@ -193,12 +232,18 @@ }, "breadcrumb": { "access": { - "browsing": "breadcrumb.access.browsing", + "browsing": "Browsing", "detail": "Detail", "root": "Archive", "search": "Search" }, "admin": { + "institution": { + "create": "Create institution", + "detail": "License institution", + "edit": "Edit institution", + "list": "List institution" + }, "license": { "create": "Create license", "detail": "License detail", @@ -367,7 +412,7 @@ }, "home": { "button": { - "goToArchivalBrowsing": "Go to archival browsing" + "goToArchivalBrowsing": "Go to archive browsing" } }, "homePage": { @@ -385,8 +430,8 @@ }, "browsing": { "archive": { - "noArchive": "", - "noOrgUnitSelected": "" + "noArchive": "No archive for the selected organizational unit", + "noOrgUnitSelected": "No organizational unit selected" } } }, diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 051a00ee2c734f7794a5e5535224dd43f0ac1213..58b620f0c4106487daaaf42217ee375d3cfa1847 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -1,4 +1,6 @@ { + "Description is invalid": "La description est invalide", + "URL is invalid": "URL invalide", "access": { "organizationalUnitNotFound": "Impossible d'obtenir les données", "search": { @@ -25,6 +27,43 @@ }, "title": "Administration" }, + "institution": { + "button": { + "delete": "Supprimer", + "edit": "Modifier", + "new": "Nouvelle institution", + "refresh": "Rafraîchir" + }, + "dialog": { + "delete": { + "cancel": "Annuler", + "confirm": "Oui", + "message": "Souhaitez-vous vraiment supprimer cette institution ?", + "title": "Confirmation de suppression" + } + }, + "form": { + "description": "Description", + "name": "Nom", + "submit": "Envoyer", + "url": "URL" + }, + "home": { + "subtitle": "Décrit l'institution", + "title": "Institution" + }, + "table": { + "header": { + "creation": { + "when": "Date de création" + }, + "lastUpdate": { + "when": "Dernière mise à jour" + }, + "name": "Nom" + } + } + }, "license": { "button": { "delete": "Supprimer", @@ -199,6 +238,12 @@ "search": "Recherche" }, "admin": { + "institution": { + "create": "Créer institution", + "detail": "Détail institution", + "edit": "Modifier institution", + "list": "Liste institution" + }, "license": { "create": "Créer licence", "detail": "Détail licence",