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