From 1524c598190f91528c952bf476cdf5af71e5c180 Mon Sep 17 00:00:00 2001 From: Alicia de Dios Fuente <Alicia.DeDiosFuente@unige.ch> Date: Thu, 12 Mar 2020 11:24:04 +0100 Subject: [PATCH] feat: added relation between org unit and research domains --- .../admin-orgunit-form.presentational.html | 12 ++ .../admin-orgunit-form.presentational.ts | 13 ++ .../admin-orgunit-create.routable.html | 1 + .../admin-orgunit-create.routable.ts | 2 + .../admin-orgunit-detail-edit.routable.html | 1 + .../admin-orgunit-detail-edit.routable.ts | 2 + .../stores/admin-organizational-unit.state.ts | 8 ++ src/app/models/index.ts | 1 + src/app/shared/enums/local-state.enum.ts | 1 + src/app/shared/shared.module.ts | 2 + .../shared-research-domain.action.ts | 129 ++++++++++++++++++ .../shared-research-domain.state.ts | 40 ++++++ src/app/shared/stores/shared.state.ts | 15 ++ src/assets/i18n/de.json | 4 + src/assets/i18n/en.json | 4 + src/assets/i18n/fr.json | 4 + 16 files changed, 239 insertions(+) create mode 100644 src/app/shared/stores/research-domain/shared-research-domain.action.ts create mode 100644 src/app/shared/stores/research-domain/shared-research-domain.state.ts diff --git a/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.html b/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.html index 289b2e87c..8819838ce 100644 --- a/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.html +++ b/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.html @@ -170,6 +170,18 @@ > </dlcm-shared-multi-select> + <dlcm-shared-multi-select *ngIf="getFormControl(formDefinition.researchDomains) as fd" + [list]="listResearchDomains" + [formControl]="fd" + [required]="formValidationHelper.hasRequiredField(fd)" + [labelKey]="'name'" + [valueKey]="'resId'" + [title]="'admin.organizationalUnit.form.researchDomains.title' | translate" + [placeholder]="'admin.organizationalUnit.form.researchDomains.placeholder' | translate" + [isWithLink]="false" + > + </dlcm-shared-multi-select> + <dlcm-shared-keyword-input *ngIf="getFormControl(formDefinition.keywords) as fd" [formControl]="fd" [readonly]="readonly" diff --git a/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.ts b/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.ts index 73ebc2f1f..55c83a3c1 100644 --- a/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.ts +++ b/src/app/features/admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational.ts @@ -17,6 +17,7 @@ import { Institution, OrganizationalUnit, PreservationPolicy, + ResearchDomain, Role, SubmissionPolicy, } from "@models"; @@ -86,6 +87,9 @@ export class AdminOrgunitFormPresentational extends SharedAbstractFormPresentati @Input() listRole: Role[]; + @Input() + listResearchDomains: ResearchDomain[]; + readonly TIME_BEFORE_DISPLAY_TOOLTIP: number = environment.timeBeforeDisplayTooltipOnInput; get personOrgUnitRoleMode(): typeof PersonOrgUnitRoleMode { @@ -114,6 +118,7 @@ export class AdminOrgunitFormPresentational extends SharedAbstractFormPresentati [this.formDefinition.personRole]: ["", [SolidifyValidator]], [this.formDefinition.fundingAgencies]: ["", [SolidifyValidator]], [this.formDefinition.institutions]: ["", [SolidifyValidator]], + [this.formDefinition.researchDomains]: ["", [SolidifyValidator]], [this.formDefinition.keywords]: [[], [SolidifyValidator]], }); } @@ -134,6 +139,7 @@ export class AdminOrgunitFormPresentational extends SharedAbstractFormPresentati [this.formDefinition.personRole]: ["", [SolidifyValidator]], [this.formDefinition.fundingAgencies]: [_.map(this.selectedFundingAgencies, LocalModelAttributeEnum.resId), [SolidifyValidator]], [this.formDefinition.institutions]: [_.map(this.selectedInstitutions, LocalModelAttributeEnum.resId), [SolidifyValidator]], + [this.formDefinition.researchDomains]: [_.map(organizationalUnit.researchDomains, LocalModelAttributeEnum.resId), [SolidifyValidator]], [this.formDefinition.keywords]: [[...organizationalUnit.keywords], [SolidifyValidator]], }); } @@ -168,6 +174,12 @@ export class AdminOrgunitFormPresentational extends SharedAbstractFormPresentati organizationalUnit.institutions.push({resId: resId}); }); } + organizationalUnit.researchDomains = []; + if (this.form.get(this.formDefinition.researchDomains).value !== "") { + this.form.get(this.formDefinition.researchDomains).value.forEach(resId => { + organizationalUnit.researchDomains.push({resId: resId}); + }); + } return organizationalUnit; } @@ -215,5 +227,6 @@ class FormComponentFormDefinition extends BaseFormDefinition { @PropertyName() personRole: string; @PropertyName() fundingAgencies: string; @PropertyName() institutions: string; + @PropertyName() researchDomains: string; @PropertyName() keywords: string; } diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.html b/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.html index 1f61c4318..0cc131a6b 100644 --- a/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.html +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.html @@ -22,6 +22,7 @@ (checkAvailableChange)="checkAvailable($event)" (dirtyChange)="updateCanDeactivate($event)" (navigate)="navigate($event)" + [listResearchDomains]="listResearchDomainObs | async" > </dlcm-admin-orgunit-form> </div> diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.ts b/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.ts index 05921abfc..92403d6ad 100644 --- a/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.ts +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable.ts @@ -17,6 +17,7 @@ import { Institution, OrganizationalUnit, PreservationPolicy, + ResearchDomain, Role, SubmissionPolicy, } from "@models"; @@ -52,6 +53,7 @@ export class AdminOrgunitCreateRoutable extends SharedAbstractCreateRoutable<Org @Select((state: LocalStateModel) => state.shared.shared_role.list) listRoleObs: Observable<Role[]>; @Select((state: LocalStateModel) => state.shared.shared_fundingAgency.list) listFundingAgenciesObs: Observable<FundingAgency[]>; @Select((state: LocalStateModel) => state.shared.shared_institution.list) listInstitutionsObs: Observable<Institution[]>; + @Select((state: LocalStateModel) => state.shared.shared_researchDomain.list) listResearchDomainObs: Observable<ResearchDomain[]>; @Select((state: LocalStateModel) => state.admin.admin_organizationalUnit.admin_organizationalUnit_fundingAgency.selected) selectedFundingAgenciesObs: Observable<FundingAgency[]>; @Select((state: LocalStateModel) => state.admin.admin_organizationalUnit.admin_organizationalUnit_institution.selected) selectedInstitutionsObs: Observable<Institution[]>; selectedPersonRole: PersonRole[] = [ diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.html b/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.html index 9313c55d3..5f8b12e90 100644 --- a/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.html +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.html @@ -29,6 +29,7 @@ [listRole]="listRoleObs | async" [listFundingAgencies]="listFundingAgenciesObs | async" [listInstitutions]="listInstitutionsObs | async" + [listResearchDomains]="listResearchDomainObs | async" [readonly]="!isEdit" (checkAvailableChange)="checkAvailable($event)" (submitChange)="update($event)" diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.ts b/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.ts index 11f292670..5d031d604 100644 --- a/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.ts +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.ts @@ -25,6 +25,7 @@ import { Institution, OrganizationalUnit, PreservationPolicy, + ResearchDomain, Role, SubmissionPolicy, } from "@models"; @@ -59,6 +60,7 @@ export class AdminOrgunitDetailEditRoutable extends SharedAbstractDetailEditComm @Select((state: LocalStateModel) => state.shared.shared_role.list) listRoleObs: Observable<Role[]>; @Select((state: LocalStateModel) => state.shared.shared_fundingAgency.list) listFundingAgenciesObs: Observable<FundingAgency[]>; @Select((state: LocalStateModel) => state.shared.shared_institution.list) listInstitutionsObs: Observable<Institution[]>; + @Select((state: LocalStateModel) => state.shared.shared_researchDomain.list) listResearchDomainObs: Observable<ResearchDomain[]>; @Select((state: LocalStateModel) => state.admin.admin_organizationalUnit.admin_organizationalUnit_personRole.selected) selectedPersonRoleObs: Observable<PersonRole[]>; @Select((state: LocalStateModel) => state.admin.admin_organizationalUnit.admin_organizationalUnit_institution.selected) selectedInstitutionsObs: Observable<Institution[]>; diff --git a/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts b/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts index 201f6cef1..bc3945c2d 100644 --- a/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts +++ b/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts @@ -51,6 +51,7 @@ import {SharedFundingAgencyAction} from "@shared/stores/funding-agency/shared-fu import {SharedInstitutionAction} from "@shared/stores/institution/shared-institution.action"; import {SharedPersonAction} from "@shared/stores/person/shared-person.action"; import {SharedPreservationPolicyAction} from "@shared/stores/preservation-policy/shared-preservation-policy.action"; +import {SharedResearchDomainAction} from "@shared/stores/research-domain/shared-research-domain.action"; import {SharedRoleAction} from "@shared/stores/role/shared-role.action"; import {SharedSubmissionPolicyAction} from "@shared/stores/submission-policy/shared-submission-policy.action"; import {Observable} from "rxjs"; @@ -222,6 +223,13 @@ export class AdminOrganizationalUnitState extends ResourceState<AdminOrganizatio this.actions$.pipe(ofActionCompleted(SharedInstitutionAction.GetAllFail)), ], }, + { + action: new SharedResearchDomainAction.GetAll(), + subActionCompletions: [ + this.actions$.pipe(ofActionCompleted(SharedResearchDomainAction.GetAllSuccess)), + this.actions$.pipe(ofActionCompleted(SharedResearchDomainAction.GetAllFail)), + ], + }, ]).subscribe(success => { if (success) { ctx.dispatch(new AdminOrgUnitAction.LoadResourceSuccess(action)); diff --git a/src/app/models/index.ts b/src/app/models/index.ts index 3e2e23746..69efa2fa7 100644 --- a/src/app/models/index.ts +++ b/src/app/models/index.ts @@ -188,6 +188,7 @@ export interface OrganizationalUnit extends OrganizationalUnitPartial { disseminationPolicies?: DisseminationPolicy[]; fundingAgencies?: FundingAgency[]; institutions?: Institution[]; + researchDomains?: ResearchDomain[]; keywords?: string[]; } diff --git a/src/app/shared/enums/local-state.enum.ts b/src/app/shared/enums/local-state.enum.ts index a4c1a1325..8a0d5ce4a 100644 --- a/src/app/shared/enums/local-state.enum.ts +++ b/src/app/shared/enums/local-state.enum.ts @@ -57,6 +57,7 @@ export enum LocalStateEnum { shared_preservationPolicy = "shared_preservationPolicy", shared_submissionPolicy = "shared_submissionPolicy", shared_dissemination_policy = "shared_disseminationPolicy", + shared_researchDomain = "shared_researchDomain", shared_organizationalUnit_submissionPolicy = "shared_organizationalUnit_submissionPolicy", shared_organizationalUnit_preservationPolicy = "shared_organizationalUnit_preservationPolicy", shared_organizationalUnit_disseminationPolicy = "shared_organizationalUnit_disseminationPolicy", diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 9dfeccee6..866f1dfb9 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -87,6 +87,7 @@ import {SharedFundingAgencyState} from "@shared/stores/funding-agency/shared-fun import {SharedOrganizationalUnitDisseminationPolicyState} from "@shared/stores/organizational-unit/dissemination-policy/shared-organizational.unit-dissemination-policy.state"; import {SharedOrganizationalUnitPreservationPolicyState} from "@shared/stores/organizational-unit/preservation-policy/shared-organizational-unit-preservation-policy.state"; import {SharedOrganizationalUnitSubmissionPolicyState} from "@shared/stores/organizational-unit/submission-policy/shared-organizational-unit-submission-policy.state"; +import {SharedResearchDomainState} from "@shared/stores/research-domain/shared-research-domain.state"; import {SharedRoleState} from "@shared/stores/role/shared-role.state"; import {HighlightModule} from "ngx-highlightjs"; import {TableModule} from "primeng/table"; @@ -207,6 +208,7 @@ const modules = [ SharedOrganizationalUnitPreservationPolicyState, SharedOrganizationalUnitDisseminationPolicyState, SharedFundingAgencyState, + SharedResearchDomainState, ]), ], exports: [ diff --git a/src/app/shared/stores/research-domain/shared-research-domain.action.ts b/src/app/shared/stores/research-domain/shared-research-domain.action.ts new file mode 100644 index 000000000..a832075aa --- /dev/null +++ b/src/app/shared/stores/research-domain/shared-research-domain.action.ts @@ -0,0 +1,129 @@ +import {ResearchDomain} from "@models"; +import { + ResourceAction, + ResourceNameSpace, + TypeDefaultAction, +} from "solidify-frontend"; +import {LocalStateEnum} from "../../enums/local-state.enum"; + +const state = LocalStateEnum.shared_researchDomain; + +export namespace SharedResearchDomainAction { + @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<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class GetAllFail extends ResourceAction.GetAllFail<ResearchDomain> { + } + + @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<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class GetByIdFail extends ResourceAction.GetByIdFail<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class Create extends ResourceAction.Create<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class CreateSuccess extends ResourceAction.CreateSuccess<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class CreateFail extends ResourceAction.CreateFail<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class Update extends ResourceAction.Update<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class UpdateSuccess extends ResourceAction.UpdateSuccess<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class UpdateFail extends ResourceAction.UpdateFail<ResearchDomain> { + } + + @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 AddInList extends ResourceAction.AddInList<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class AddInListById extends ResourceAction.AddInListById { + } + + @TypeDefaultAction(state) + export class AddInListByIdSuccess extends ResourceAction.AddInListByIdSuccess<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class AddInListByIdFail extends ResourceAction.AddInListByIdFail<ResearchDomain> { + } + + @TypeDefaultAction(state) + export class RemoveInListById extends ResourceAction.RemoveInListById { + } + + @TypeDefaultAction(state) + export class RemoveInListByListId extends ResourceAction.RemoveInListByListId { + } + + @TypeDefaultAction(state) + export class Clean extends ResourceAction.Clean { + } +} + +export const sharedResearchDomainActionNameSpace: ResourceNameSpace = SharedResearchDomainAction; diff --git a/src/app/shared/stores/research-domain/shared-research-domain.state.ts b/src/app/shared/stores/research-domain/shared-research-domain.state.ts new file mode 100644 index 000000000..8f60b408b --- /dev/null +++ b/src/app/shared/stores/research-domain/shared-research-domain.state.ts @@ -0,0 +1,40 @@ +import {AdminResourceApiEnum} from "@app/shared/enums/api.enum"; +import {ResearchDomain} from "@models"; +import { + Actions, + State, + Store, +} from "@ngxs/store"; +import {sharedResearchDomainActionNameSpace} from "@shared/stores/research-domain/shared-research-domain.action"; +import { + ApiService, + defaultResourceStateInitValue, + NotificationService, + ResourceState, + ResourceStateModel, +} from "solidify-frontend"; +import {LocalStateEnum} from "../../enums/local-state.enum"; + +export interface SharedResearchDomainStateModel extends ResourceStateModel<ResearchDomain> { +} + +@State<SharedResearchDomainStateModel>({ + name: LocalStateEnum.shared_researchDomain, + defaults: { + ...defaultResourceStateInitValue(), + }, +}) +export class SharedResearchDomainState extends ResourceState<SharedResearchDomainStateModel, ResearchDomain> { + constructor(protected apiService: ApiService, + protected store: Store, + protected notificationService: NotificationService, + protected actions$: Actions) { + super(apiService, store, notificationService, actions$, { + nameSpace: sharedResearchDomainActionNameSpace, + }); + } + + protected get _urlResource(): string { + return AdminResourceApiEnum.researchDomains; + } +} diff --git a/src/app/shared/stores/shared.state.ts b/src/app/shared/stores/shared.state.ts index 50e479774..787f18977 100644 --- a/src/app/shared/stores/shared.state.ts +++ b/src/app/shared/stores/shared.state.ts @@ -51,6 +51,11 @@ import { SharedFundingAgencyState, SharedFundingAgencyStateModel, } from "@shared/stores/funding-agency/shared-funding-agency.state"; +import {SharedResearchDomainAction} from "@shared/stores/research-domain/shared-research-domain.action"; +import { + SharedResearchDomainState, + SharedResearchDomainStateModel, +} from "@shared/stores/research-domain/shared-research-domain.state"; import {SharedRoleAction} from "@shared/stores/role/shared-role.action"; import { SharedRoleState, @@ -72,6 +77,7 @@ export interface SharedStateModel extends BaseStateModel { shared_institution: SharedInstitutionStateModel; shared_role: SharedRoleStateModel; shared_fundingAgency: SharedFundingAgencyStateModel; + shared_researchDomain: SharedResearchDomainStateModel; } @State<SharedStateModel>({ @@ -88,6 +94,7 @@ export interface SharedStateModel extends BaseStateModel { shared_institution: null, shared_role: null, shared_fundingAgency: null, + shared_researchDomain: null, }, children: [ SharedOrganizationalUnitState, @@ -100,6 +107,7 @@ export interface SharedStateModel extends BaseStateModel { SharedInstitutionState, SharedRoleState, SharedFundingAgencyState, + SharedResearchDomainState, ], }) export class SharedState { @@ -179,6 +187,13 @@ export class SharedState { this.actions$.pipe(ofActionCompleted(SharedFundingAgencyAction.GetAllFail)), ], }, + { + action: new SharedResearchDomainAction.GetAll(), + subActionCompletions: [ + this.actions$.pipe(ofActionCompleted(SharedResearchDomainAction.GetAllSuccess)), + this.actions$.pipe(ofActionCompleted(SharedResearchDomainAction.GetAllFail)), + ], + }, ], ).subscribe(isSuccess => { if (isSuccess) { diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 146c4afa3..dc65dc891 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -442,6 +442,10 @@ "description": { "placeholder": "Description" }, + "researchDomains": { + "placeholder": "Click here to add research domain", + "title": "Research Domains" + }, "disseminationPolicy": { "navigateLinkPlaceholder": "See dissemination policy detail", "placeholder": "Click here to add policy", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index af2360fc8..5c9282923 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -442,6 +442,10 @@ "description": { "placeholder": "Description" }, + "researchDomains": { + "placeholder": "Click here to add research domain", + "title": "Research Domains" + }, "disseminationPolicy": { "navigateLinkPlaceholder": "See dissemination policy detail", "placeholder": "Click here to add policy", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 3d89bc19c..042743c30 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -442,6 +442,10 @@ "description": { "placeholder": "Description" }, + "researchDomains": { + "placeholder": "Cliquer ici pour ajouter des domains de reserche", + "title": "Domaine de reserche" + }, "disseminationPolicy": { "navigateLinkPlaceholder": "Voir le détail de la politique de diffusion", "placeholder": "Cliquer ici pour ajouter des politiques", -- GitLab