From a787e33abf43523d2f2e4cd02008836f60bc6884 Mon Sep 17 00:00:00 2001 From: Florent Poittevin <florent.poittevin@unige.ch> Date: Mon, 28 Oct 2019 12:29:04 +0100 Subject: [PATCH] feat: replace deposit org unit select component by searchable select component --- .../deposit-form.presentational.html | 27 ++++----- .../deposit-form.presentational.ts | 14 +++-- .../deposit-create.routable.html | 1 - .../deposit-create/deposit-create.routable.ts | 2 - .../deposit-metadata.routable.html | 1 - .../deposit-metadata.routable.ts | 2 - ...p-authorized-organizational-unit.action.ts | 2 +- ...pp-authorized-organizational-unit.state.ts | 55 ++++++++----------- 8 files changed, 44 insertions(+), 60 deletions(-) diff --git a/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.html b/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.html index db9371c78..bd6d34d4c 100644 --- a/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.html +++ b/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.html @@ -4,21 +4,18 @@ > <div class="two-columns-wrapper"> <div class="left-part"> - <mat-form-field *ngIf="getFormControl(formDefinition.organizationalUnitId) as fd"> - <mat-label>{{'deposit.organizationUnit' | translate }}</mat-label> - <mat-select [solidifyValidation]="errors" - [formControl]="fd" - [required]="formValidationHelper.hasRequiredField(fd)" - (selectionChange)="orgUnitSelectionChange($event)" - > - <mat-option *ngFor="let orgUnit of organizationalUnits" - [value]="orgUnit.resId" - > - {{orgUnit.name}} - </mat-option> - </mat-select> - <mat-error #errors></mat-error> - </mat-form-field> + <dlcm-shared-searchable-single-select *ngIf="getFormControl(formDefinition.organizationalUnitId) as fd" + solidifyValidation + [resourceNameSpace]="appAuthorizedOrganizationalUnitNameSpace" + [state]="appAuthorizedOrganizationalUnitState" + [formControl]="fd" + [required]="formValidationHelper.hasRequiredField(fd)" + [labelKey]="'name'" + [valueKey]="'resId'" + [placeholder]="'deposit.organizationUnit' | translate" + (valueChange)="orgUnitSelectionChange($event)" + > + </dlcm-shared-searchable-single-select> <mat-form-field *ngIf="getFormControl(formDefinition.title) as fd"> <input [formControl]="fd" diff --git a/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts b/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts index 3799ed75e..b7371a3b7 100644 --- a/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts +++ b/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts @@ -12,7 +12,6 @@ import { FormBuilder, Validators, } from "@angular/forms"; -import {MatSelectChange} from "@angular/material"; import {MatDialog} from "@angular/material/dialog"; import {DepositExtended} from "@app/features/deposit/models/deposits-extended.model"; import {OrganizationalUnitExtended} from "@app/features/deposit/models/organizational-unit-extended.model"; @@ -29,6 +28,8 @@ import {LocalModelAttributeEnum} from "@app/shared/enums/model-attribute.enum"; import {BaseFormDefinition} from "@app/shared/models/base-form-definition.model"; import {sharedLicenseActionNameSpace} from "@app/shared/stores/license/shared-license.action"; import {sharedPersonActionNameSpace} from "@app/shared/stores/person/shared-person.action"; +import {appAuthorizedOrganizationalUnitNameSpace} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action"; +import {AppAuthorizedOrganizationalUnitState} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state"; import {DepositPersonDialog} from "@deposit/components/dialogs/deposit-person/deposit-person.dialog"; import {SharedSearchableMultiSelectPresentational} from "@shared/components/presentationals/shared-searchable-multi-select/shared-searchable-multi-select.presentational"; import {BreakpointService} from "@shared/services/breakpoint.service"; @@ -78,9 +79,6 @@ export class DepositFormPresentational extends SharedAbstractFormPresentational< @Input() listPreservationPolicies: PreservationPolicy[]; - @Input() - organizationalUnits: OrganizationalUnitExtended[]; - @Input() selectedPersons: PersonExtended[]; @@ -103,6 +101,10 @@ export class DepositFormPresentational extends SharedAbstractFormPresentational< sharedLicenseActionNameSpace: ResourceNameSpace = sharedLicenseActionNameSpace; sharedLicenseState: typeof SharedLicenseState = SharedLicenseState; + + appAuthorizedOrganizationalUnitNameSpace: ResourceNameSpace = appAuthorizedOrganizationalUnitNameSpace; + appAuthorizedOrganizationalUnitState: typeof AppAuthorizedOrganizationalUnitState = AppAuthorizedOrganizationalUnitState; + licenceCallback: (value: License) => string = (value: License) => value.openLicenseId + " (" + value.title + ")"; private readonly _orgUnitValueBS: BehaviorSubject<string | undefined> = new BehaviorSubject<string | undefined>(undefined); @@ -209,8 +211,8 @@ export class DepositFormPresentational extends SharedAbstractFormPresentational< return this.form.get(this.formDefinition.authors).value.includes(this.personConnected.resId); } - orgUnitSelectionChange($event: MatSelectChange): void { - this._orgUnitValueBS.next($event.value); + orgUnitSelectionChange(orgUnitResId: string): void { + this._orgUnitValueBS.next(orgUnitResId); let valueChange: boolean = false; this.subscribe(this.selectedOrgUnit.pipe( skipWhile(o => o === null || o === undefined), diff --git a/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.html b/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.html index 053164e9c..e3290068f 100644 --- a/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.html +++ b/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.html @@ -7,7 +7,6 @@ [languages]="languagesObs | async" [listSubmissionPolicies]="listSubmissionPoliciesObs | async" [listPreservationPolicies]="listPreservationPoliciesObs | async" - [organizationalUnits]="organizationalUnitsObs | async" [personConnected]="personConnectedObs | async" [listPersons]="listPersonObs | async" [selectedOrgUnit]="selectedOrgUnitObs" diff --git a/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.ts b/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.ts index a8546cd6c..07d41e7a7 100644 --- a/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.ts +++ b/src/app/features/deposit/components/routables/deposit-create/deposit-create.routable.ts @@ -13,7 +13,6 @@ import { } from "@app/features/deposit/stores/deposit.state"; import { Language, - OrganizationalUnit, Person, PreservationPolicy, SubmissionPolicy, @@ -45,7 +44,6 @@ export class DepositCreateRoutable extends SharedAbstractCreateRoutable<DepositE @Select((state: LocalStateModel) => state.deposit.form) formObs: Observable<FormState>; @Select((state: LocalStateModel) => state.shared.shared_language.list) languagesObs: Observable<Language[]>; @Select((state: LocalStateModel) => state.shared.shared_person.list) listPersonObs: Observable<Person[]>; - @Select((state: LocalStateModel) => state.application.application_authorizedOrganizationalUnit.list) organizationalUnitsObs: Observable<OrganizationalUnit[]>; @Select((state: LocalStateModel) => state.shared.shared_organizationalUnit.shared_organizationalUnit_preservationPolicy.selected) listPreservationPoliciesObs: Observable<PreservationPolicy[]>; @Select((state: LocalStateModel) => state.shared.shared_organizationalUnit.shared_organizationalUnit_submissionPolicy.selected) listSubmissionPoliciesObs: Observable<SubmissionPolicy[]>; @Select((state: LocalStateModel) => state.application.application_person.current) personConnectedObs: Observable<Person>; diff --git a/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.html b/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.html index 38aeaf8b3..54687075c 100644 --- a/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.html +++ b/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.html @@ -4,7 +4,6 @@ [languages]="languagesObs | async" [listSubmissionPolicies]="listSubmissionPoliciesObs | async" [listPreservationPolicies]="listPreservationPoliciesObs | async" - [organizationalUnits]="organizationalUnitsObs | async" [listPersons]="listPersonObs | async" [selectedPersons]="selectedPersonObs | async" [personConnected]="personConnectedObs | async" diff --git a/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts b/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts index d39ced45c..c0f9c4ad2 100644 --- a/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts +++ b/src/app/features/deposit/components/routables/deposit-metadata/deposit-metadata.routable.ts @@ -8,7 +8,6 @@ import { import {MatDialog} from "@angular/material"; import {ActivatedRoute} from "@angular/router"; import { - AccessOrganizationalUnit, Deposit, Language, Person, @@ -60,7 +59,6 @@ export class DepositMetadataRoutable extends SharedAbstractEditRoutable<DepositE @Select((state: LocalStateModel) => state.application.application_person.current) personConnectedObs: Observable<Person>; @Select((state: LocalStateModel) => state.shared.shared_language.list) languagesObs: Observable<Language[]>; @Select((state: LocalStateModel) => state.shared.shared_person.list) listPersonObs: Observable<Person[]>; - @Select((state: LocalStateModel) => state.application.application_authorizedOrganizationalUnit.list) organizationalUnitsObs: Observable<AccessOrganizationalUnit[]>; @Select((state: LocalStateModel) => state.deposit.deposit_dataFile.list) listDataFileObs: Observable<DepositDataFile[]>; @Select((state: LocalStateModel) => state.deposit.deposit_person.selected) selectedPersonObs: Observable<Person[]>; @Select((state: LocalStateModel) => state.deposit.current) currentDepositObs: Observable<Deposit>; diff --git a/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action.ts b/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action.ts index 0dec8cfb6..e0ede9b01 100644 --- a/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action.ts +++ b/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action.ts @@ -90,4 +90,4 @@ export namespace AppAuthorizedOrganizationalUnitAction { } } -export const appAuthorizedOrganizationalUnit: ResourceNameSpace = AppAuthorizedOrganizationalUnitAction; +export const appAuthorizedOrganizationalUnitNameSpace: ResourceNameSpace = AppAuthorizedOrganizationalUnitAction; diff --git a/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state.ts b/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state.ts index 4c6f4c81e..37148c70e 100644 --- a/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state.ts +++ b/src/app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state.ts @@ -1,8 +1,9 @@ import {OrganizationalUnit} from "@app/generated-api"; import {AdminResourceApiEnum} from "@app/shared/enums/api.enum"; -import {appAuthorizedOrganizationalUnit} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action"; +import {appAuthorizedOrganizationalUnitNameSpace} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action"; import { Actions, + Selector, State, Store, } from "@ngxs/store"; @@ -14,6 +15,7 @@ import { QueryParameters, ResourceState, ResourceStateModel, + StoreUtil, } from "solidify-frontend"; import {environment} from "../../../environments/environment"; @@ -41,7 +43,7 @@ export class AppAuthorizedOrganizationalUnitState extends ResourceState<Organiza protected notificationService: NotificationService, protected actions$: Actions) { super(apiService, store, notificationService, actions$, { - nameSpace: appAuthorizedOrganizationalUnit, + nameSpace: appAuthorizedOrganizationalUnitNameSpace, }); } @@ -49,34 +51,23 @@ export class AppAuthorizedOrganizationalUnitState extends ResourceState<Organiza return AdminResourceApiEnum.authorizedOrganizationalUnits; } - // @OverrideDefaultAction() - // @Action(AppAuthorizedOrganizationalUnitAction.GetAll) - // getAll(ctx: StateContext<ResourceStateModel<PersonExtended>>, action: AppAuthorizedOrganizationalUnitAction.GetAll): Observable<CollectionTyped<OrganizationalUnit>> { - // action.queryParameters.sort - // return super.getAll(ctx, action); - // ctx.patchState({ - // isLoadingCounter: ctx.getState().isLoadingCounter + 1, - // queryParameters: StoreUtil.getQueryParametersToApply(action.queryParameters, ctx), - // }); - // let url = this._urlResource; - // const searchItems = ctx.getState().queryParameters.search.searchItems; - // const fullName = searchItems.get("fullName"); - // if (!isNullOrUndefined(fullName) && !isWhiteString(fullName)) { - // searchItems.set("search", `i-firstName~${fullName},i-lastName~${fullName},i-orcid~${fullName}`); - // searchItems.set("match", "any"); - // searchItems.delete("fullName"); - // url = this._urlResource + urlSeparator + ApiActionEnum.SEARCH; - // } - // return this.apiService.get<OrganizationalUnit>(url, ctx.getState().queryParameters) - // .pipe( - // StoreUtil.cancelUncompleted(ctx, this.actions$, [SharedPersonAction.GetAll]), - // tap((collection: CollectionTyped<PersonExtended>) => { - // ctx.dispatch(new SharedPersonAction.GetAllSuccess(action, collection)); - // }), - // catchError(error => { - // ctx.dispatch(new SharedPersonAction.GetAllFail(action)); - // throw error; - // }), - // ); - // } + @Selector() + static list<T>(state: ResourceStateModel<T>): T[] { + return state.list; + } + + @Selector() + static total<T>(state: ResourceStateModel<T>): number { + return state.total; + } + + @Selector() + static current<T>(state: ResourceStateModel<T>): T { + return state.current; + } + + @Selector() + static isLoading<T>(state: ResourceStateModel<T>): boolean { + return StoreUtil.isLoadingState(state); + } } -- GitLab