diff --git a/src/app/app.module.ts b/src/app/app.module.ts index fe54c4c6b70a3366aa204a6cceb6a297b3420b44..93335b99f6432706ac32ec106da3d4c4bd50919b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -49,6 +49,7 @@ import {NgxsLoggerPluginModule} from "@ngxs/logger-plugin"; import {NgxsRouterPluginModule} from "@ngxs/router-plugin"; import {NgxsModule} from "@ngxs/store"; import {CustomMatPaginatorIntlService} from "@shared/services/custom-mat-paginator-intl.service"; +import {ErrorsSkipperService} from "@shared/services/errors-skipper.service"; import xml from "highlight.js/lib/languages/xml"; import {HighlightModule} from "ngx-highlightjs"; import { @@ -192,7 +193,7 @@ export function hljsLanguages(): any { {provide: MAT_DATE_LOCALE, useValue: navigator.language}, {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]}, {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS}, - + ErrorsSkipperService, ], entryComponents: [ ...dialogs, diff --git a/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts b/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts index 050cd2da7905a9b8072dbda081dc46cfa2ba42da..dd443d70d92686adf5601c76215e9dbb52415efd 100644 --- a/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts +++ b/src/app/components/presentationals/main-toolbar/abstract-main-toolbar/abstract-main-toolbar.presentational.ts @@ -93,7 +93,7 @@ export abstract class AbstractMainToolbarPresentational extends SharedAbstractPr { path: RoutesEnum.organizationalUnit, labelToTranslate: TRANSLATE("app.toolbar.organizationalUnit"), - isVisible: () => this.logged && PermissionUtil.isUserHavePermission(ApplicationRolePermissionEnum.adminPermission, this.userRoles), + isVisible: () => this.logged && PermissionUtil.isUserHavePermission(ApplicationRolePermissionEnum.userPermission, this.userRoles), icon: "building", }, { diff --git a/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html b/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html index 0ed8cb6e5138d8a82efc8070fa6bd87ac40fdcbf..cf949f5768ddaf8e44b2b0227f68377e262d9e0d 100644 --- a/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html +++ b/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.html @@ -1,54 +1,86 @@ <form [formGroup]="form" + [class.form-two-columns]="isManager" (ngSubmit)="onSubmit()" > - <mat-form-field> - <mat-label>{{'organizationalUnit.name' | translate }}</mat-label> - <input [formControlName]="formDefinition.name" - matInput - [placeholder]="'organizationalUnit.name' | translate" - [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> + <ng-template #formPublic> + <mat-form-field> + <mat-label>{{'organizationalUnit.name' | translate }}</mat-label> + <input [formControlName]="formDefinition.name" + matInput + [placeholder]="'organizationalUnit.name' | translate" + [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> - <input [formControlName]="formDefinition.description" - matInput - [placeholder]="'organizationalUnit.description' | translate" - [required]="isRequired(formDefinition.description)" - > - <mat-error *ngIf="getFormControl(formDefinition.description).invalid">{{'required' | translate}}</mat-error> - <mat-error *ngFor="let error of getFormControl(formDefinition.description).errors?.errorsFromBackend">{{error}}</mat-error> - </mat-form-field> + <mat-form-field> + <input [formControlName]="formDefinition.description" + matInput + [placeholder]="'organizationalUnit.description' | translate" + [required]="isRequired(formDefinition.description)" + > + <mat-error *ngIf="getFormControl(formDefinition.description).invalid">{{'required' | translate}}</mat-error> + <mat-error *ngFor="let error of getFormControl(formDefinition.description).errors?.errorsFromBackend">{{error}}</mat-error> + </mat-form-field> - <mat-form-field> - <input [formControlName]="formDefinition.openingDate" - matInput - [matDatepicker]="openingDateDatepicker" - [placeholder]="'organizationalUnit.openingDate' | translate" - > - <mat-datepicker-toggle matSuffix - [for]="openingDateDatepicker" - ></mat-datepicker-toggle> - <mat-datepicker [touchUi]="breakpointService.isSmallerThanMd()" - #openingDateDatepicker - ></mat-datepicker> - </mat-form-field> + <mat-form-field *ngIf="getFormControl(formDefinition.url) as fd"> + <input [formControl]="fd" + solidifyValidation + matInput + [placeholder]="'organizationalUnit.form.url' | translate" + > + <mat-error>{{formValidationHelper.getFormError(fd)}}</mat-error> + </mat-form-field> - <mat-form-field> - <input [formControlName]="formDefinition.closingDate" - matInput - [matDatepicker]="closingDateDatepicker" - [placeholder]="'organizationalUnit.closingDate' | translate" - > - <mat-datepicker-toggle matSuffix - [for]="closingDateDatepicker" - ></mat-datepicker-toggle> - <mat-datepicker [touchUi]="breakpointService.isSmallerThanMd()" - #closingDateDatepicker - ></mat-datepicker> - </mat-form-field> + <mat-form-field> + <input [formControlName]="formDefinition.openingDate" + matInput + [matDatepicker]="openingDateDatepicker" + [placeholder]="'organizationalUnit.openingDate' | translate" + > + <mat-datepicker-toggle matSuffix + [for]="openingDateDatepicker" + ></mat-datepicker-toggle> + <mat-datepicker [touchUi]="breakpointService.isSmallerThanMd()" + #openingDateDatepicker + ></mat-datepicker> + </mat-form-field> + + <mat-form-field> + <input [formControlName]="formDefinition.closingDate" + matInput + [matDatepicker]="closingDateDatepicker" + [placeholder]="'organizationalUnit.closingDate' | translate" + > + <mat-datepicker-toggle matSuffix + [for]="closingDateDatepicker" + ></mat-datepicker-toggle> + <mat-datepicker [touchUi]="breakpointService.isSmallerThanMd()" + #closingDateDatepicker + ></mat-datepicker> + </mat-form-field> + </ng-template> + + <div *ngIf="isManager; else isNotManager" + class="two-columns-wrapper" + > + <div class="left-part"> + <ng-container *ngTemplateOutlet="formPublic"></ng-container> + </div> + <div class="right-part"> + <dlcm-shared-person-orgunit-role [formControl]="form.get(formDefinition.personRole)" + [mode]="personOrgUnitRoleMode.person" + [selectedPersonOrOrgUnitRole]="selectedPersonRole" + [listPerson]="listPerson" + [listRole]="listRole" + ></dlcm-shared-person-orgunit-role> + </div> + </div> + + <ng-template #isNotManager> + <ng-container *ngTemplateOutlet="formPublic"></ng-container> + </ng-template> <div class="submit-button"> <button *ngIf="!readonly" diff --git a/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.ts b/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.ts index 87740c88fef25aa8a92bcb7d364b5b8ffac59012..3b9f28397ff33ae2009ef219dc24b3dc025a5386 100644 --- a/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.ts +++ b/src/app/features/organizational-unit/components/presentationals/orgunit-form/orgunit-form.presentational.ts @@ -1,3 +1,5 @@ +import {PersonExtended} from "@admin/models/person-extended.model"; +import {PersonRole} from "@admin/models/person-role.model"; import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -11,10 +13,12 @@ import { import {OrganizationalUnitExtended} from "@app/features/deposit/models/organizational-unit-extended.model"; import { PreservationPolicy, + Role, SubmissionPolicy, } 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 {PersonOrgUnitRoleMode} from "@shared/components/presentationals/shared-person-orgunit-role/shared-person-orgunit-role.presentational"; import {BreakpointService} from "@shared/services/breakpoint.service"; import { DateUtil, @@ -37,6 +41,22 @@ export class OrgunitFormPresentational extends SharedAbstractFormPresentational< @Input() listPreservationPolicies: PreservationPolicy[]; + @Input() + selectedPersonRole: PersonRole[]; + + @Input() + listPerson: PersonExtended[]; + + @Input() + listRole: Role[]; + + @Input() + isManager: boolean; + + get personOrgUnitRoleMode(): typeof PersonOrgUnitRoleMode { + return PersonOrgUnitRoleMode; + } + constructor(protected readonly _changeDetectorRef: ChangeDetectorRef, private readonly _fb: FormBuilder, public readonly breakpointService: BreakpointService) { @@ -47,9 +67,10 @@ export class OrgunitFormPresentational extends SharedAbstractFormPresentational< this.form = this._fb.group({ [this.formDefinition.name]: ["", [Validators.required, SolidifyValidator]], [this.formDefinition.description]: ["", [SolidifyValidator]], + [this.formDefinition.url]: ["", [SolidifyValidator]], [this.formDefinition.openingDate]: [""], [this.formDefinition.closingDate]: [""], - [this.formDefinition.submissionPolicies]: [], + [this.formDefinition.personRole]: ["", [SolidifyValidator]], }); } @@ -57,8 +78,10 @@ export class OrgunitFormPresentational extends SharedAbstractFormPresentational< this.form = this._fb.group({ [this.formDefinition.name]: [organizationalUnit.name, [Validators.required, SolidifyValidator]], [this.formDefinition.description]: [organizationalUnit.description, [SolidifyValidator]], + [this.formDefinition.url]: [organizationalUnit.url, [SolidifyValidator]], [this.formDefinition.openingDate]: [organizationalUnit.openingDate], [this.formDefinition.closingDate]: [organizationalUnit.closingDate], + [this.formDefinition.personRole]: ["", [SolidifyValidator]], }); } @@ -72,7 +95,8 @@ export class OrgunitFormPresentational extends SharedAbstractFormPresentational< class FormComponentFormDefinition extends BaseFormDefinition { @PropertyName() name: string; @PropertyName() description: string; + @PropertyName() url: string; @PropertyName() closingDate: string; @PropertyName() openingDate: string; - @PropertyName() submissionPolicies: string; + @PropertyName() personRole: string; } diff --git a/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.html b/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.html index f0a9f722e5a93a2e2be48849beaf2773c3fc6223..775e7bd517a77fdb2c9cef718ff90e2665292aa6 100644 --- a/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.html +++ b/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.html @@ -6,7 +6,8 @@ <mat-icon>navigate_before</mat-icon> {{KEY_BACK_BUTTON | translate}} </button> - <button mat-button + <button *ngIf="currentUserIsManager | async | isTrue" + mat-button color="primary" (click)="edit()" > @@ -16,13 +17,17 @@ </div> <div class="wrapper" - [dlcmSpinner]="isLoadingObs | async" + [dlcmSpinner]="isLoadingWithDependencyObs | async" > <dlcm-orgunit-form #formPresentational - *ngIf="!(isLoadingObs | async) && (currentObs | async)" + *ngIf="isReadyToBeDisplayedObs | async" [model]="currentObs| async" + [isManager]="currentUserIsManager | async" [listSubmissionPolicies]="listSubmissionPoliciesObs | async" [listPreservationPolicies]="listPreservationPoliciesObs | async" + [listPerson]="listPersonObs | async" + [listRole]="listRoleObs | async" + [selectedPersonRole]="selectedPersonRoleObs | async" [readonly]="true" > </dlcm-orgunit-form> diff --git a/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.ts b/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.ts index 72a5e88159f24083609d4e996272655030f19231..e94d96e8d02ac55a03805b2cfb715a45df35e1c6 100644 --- a/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.ts +++ b/src/app/features/organizational-unit/components/routables/orgunit-detail/orgunit-detail.routable.ts @@ -1,14 +1,22 @@ +import {PersonExtended} from "@admin/models/person-extended.model"; +import {PersonRole} from "@admin/models/person-role.model"; import { ChangeDetectionStrategy, + ChangeDetectorRef, Component, + OnInit, } from "@angular/core"; import {MatDialog} from "@angular/material"; import {ActivatedRoute} from "@angular/router"; import {OrganizationalUnitExtended} from "@app/features/deposit/models/organizational-unit-extended.model"; import {orgUnitActionNameSpace} from "@app/features/organizational-unit/stores/organizational-unit.action"; -import {OrganizationalUnitStateModel} from "@app/features/organizational-unit/stores/organizational-unit.state"; +import { + OrganizationalUnitState, + OrganizationalUnitStateModel, +} from "@app/features/organizational-unit/stores/organizational-unit.state"; import { PreservationPolicy, + Role, SubmissionPolicy, } from "@app/generated-api"; import {SharedAbstractDetailRoutable} from "@app/shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable"; @@ -27,20 +35,45 @@ import {TRANSLATE} from "solidify-frontend"; styleUrls: ["../../../../../shared/components/routables/shared-abstract-detail/shared-abstract-detail.routable.scss"], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class OrgunitDetailRoutable extends SharedAbstractDetailRoutable<OrganizationalUnitExtended, OrganizationalUnitStateModel> { +export class OrgunitDetailRoutable extends SharedAbstractDetailRoutable<OrganizationalUnitExtended, OrganizationalUnitStateModel> implements OnInit { + @Select(OrganizationalUnitState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>; + @Select(OrganizationalUnitState.isReadyToBeDisplayed) isReadyToBeDisplayedObs: Observable<boolean>; + @Select(OrganizationalUnitState.currentUserIsManager) currentUserIsManager: Observable<boolean>; @Select((state: LocalStateModel) => state.shared.shared_submissionPolicy.list) listSubmissionPoliciesObs: Observable<SubmissionPolicy[]>; @Select((state: LocalStateModel) => state.shared.shared_preservationPolicy.list) listPreservationPoliciesObs: Observable<PreservationPolicy[]>; + @Select((state: LocalStateModel) => state.shared.shared_person.list) listPersonObs: Observable<PersonExtended[]>; + @Select((state: LocalStateModel) => state.shared.shared_role.list) listRoleObs: Observable<Role[]>; + @Select((state: LocalStateModel) => state.organizationalUnit.organizationalUnit_personRole.selected) selectedPersonRoleObs: Observable<PersonRole[]>; readonly KEY_PARAM_NAME: string = "name"; readonly KEY_DELETE_BUTTON: string = TRANSLATE("organizationalUnit.delete"); readonly KEY_EDIT_BUTTON: string = TRANSLATE("organizationalUnit.edit"); + // private _isManager: boolean = false; + // + // set isManager(value: boolean) { + // if (isTrue(value) && isFalse(this._isManager)) { + // console.error("TEST", this._resId); + // this.store.dispatch(new OrgUnitPersonRoleAction.GetAll(this._resId)); + // } + // this._isManager = value; + // } + // + // get isManager(): boolean { + // return this._isManager; + // } + constructor(protected store: Store, protected route: ActivatedRoute, - public dialog: MatDialog) { + public dialog: MatDialog, + private readonly _changeDetector: ChangeDetectorRef) { super(store, route, dialog, LocalStateEnum.organizationalUnit, orgUnitActionNameSpace); } + ngOnInit(): void { + super.ngOnInit(); + } + getSubResourceWithParentId(id: string): void { } } diff --git a/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.html b/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.html index 68660c06af64a7e956e2cc7428f6b1aafa9ac634..9d16207a52539f9c50e593cb91ffda3c7c89abef 100644 --- a/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.html +++ b/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.html @@ -9,13 +9,17 @@ </div> <div class="wrapper" - [dlcmSpinner]="isLoadingObs | async" + [dlcmSpinner]="isLoadingWithDependencyObs | async" > <dlcm-orgunit-form #formPresentational - *ngIf="currentObs | async" + *ngIf="isReadyToBeDisplayedObs | async" [model]="currentObs | async" + [isManager]="true" [listSubmissionPolicies]="listSubmissionPoliciesObs | async" [listPreservationPolicies]="listPreservationPoliciesObs | async" + [listPerson]="listPersonObs | async" + [listRole]="listRoleObs | async" + [selectedPersonRole]="selectedPersonRoleObs | async" (submitChange)="update($event)" > </dlcm-orgunit-form> diff --git a/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.ts b/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.ts index 426059ea4856117e7cbc93e1b01bc34992afefbd..88e8db9fd7c2aa86503f83077dd4bcf865eb9a5c 100644 --- a/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.ts +++ b/src/app/features/organizational-unit/components/routables/orgunit-edit/orgunit-edit.routable.ts @@ -1,3 +1,5 @@ +import {PersonExtended} from "@admin/models/person-extended.model"; +import {PersonRole} from "@admin/models/person-role.model"; import { ChangeDetectionStrategy, Component, @@ -5,9 +7,13 @@ import { import {ActivatedRoute} from "@angular/router"; import {OrganizationalUnitExtended} from "@app/features/deposit/models/organizational-unit-extended.model"; import {orgUnitActionNameSpace} from "@app/features/organizational-unit/stores/organizational-unit.action"; -import {OrganizationalUnitStateModel} from "@app/features/organizational-unit/stores/organizational-unit.state"; +import { + OrganizationalUnitState, + OrganizationalUnitStateModel, +} from "@app/features/organizational-unit/stores/organizational-unit.state"; import { PreservationPolicy, + Role, SubmissionPolicy, } from "@app/generated-api"; import {SharedAbstractEditRoutable} from "@app/shared/components/routables/shared-abstract-edit/shared-abstract-edit.routable"; @@ -17,6 +23,7 @@ import { Select, Store, } from "@ngxs/store"; +import {OrgUnitPersonRoleAction} from "@orgunit/stores/person-role/organizational-unit-person-role.action"; import {Observable} from "rxjs"; @Component({ @@ -26,8 +33,13 @@ import {Observable} from "rxjs"; changeDetection: ChangeDetectionStrategy.OnPush, }) export class OrgunitEditRoutable extends SharedAbstractEditRoutable<OrganizationalUnitExtended, OrganizationalUnitStateModel> { + @Select(OrganizationalUnitState.isLoadingWithDependency) isLoadingWithDependencyObs: Observable<boolean>; + @Select(OrganizationalUnitState.isReadyToBeDisplayed) isReadyToBeDisplayedObs: Observable<boolean>; @Select((state: LocalStateModel) => state.shared.shared_submissionPolicy.list) listSubmissionPoliciesObs: Observable<SubmissionPolicy[]>; @Select((state: LocalStateModel) => state.shared.shared_preservationPolicy.list) listPreservationPoliciesObs: Observable<PreservationPolicy[]>; + @Select((state: LocalStateModel) => state.shared.shared_person.list) listPersonObs: Observable<PersonExtended[]>; + @Select((state: LocalStateModel) => state.shared.shared_role.list) listRoleObs: Observable<Role[]>; + @Select((state: LocalStateModel) => state.organizationalUnit.organizationalUnit_personRole.selected) selectedPersonRoleObs: Observable<PersonRole[]>; constructor(protected store: Store, protected route: ActivatedRoute) { @@ -35,5 +47,6 @@ export class OrgunitEditRoutable extends SharedAbstractEditRoutable<Organization } getSubResourceWithParentId(id: string): void { + this.store.dispatch(new OrgUnitPersonRoleAction.GetAll(id)); } } diff --git a/src/app/features/organizational-unit/organizational-unit-routing.module.ts b/src/app/features/organizational-unit/organizational-unit-routing.module.ts index 299df0e1c54889f58cd3e3068d9b6e31b3e35297..2c2d00899dc48778443e318dd8c207daf6a402ec 100644 --- a/src/app/features/organizational-unit/organizational-unit-routing.module.ts +++ b/src/app/features/organizational-unit/organizational-unit-routing.module.ts @@ -8,6 +8,7 @@ import { OrganizationalUnitRoutesEnum, } from "@app/shared/enums/routes.enum"; import {DlcmRoutes} from "@app/shared/models/dlcm-route.model"; +import {OrganizationalUnitRoleGuardService} from "@shared/guards/organizational-unit-role-guard.service"; import {CanDeactivateGuard} from "@shared/services/can-deactivate-guard.service"; import {TRANSLATE} from "solidify-frontend"; @@ -30,6 +31,7 @@ const routes: DlcmRoutes = [ data: { breadcrumb: TRANSLATE("breadcrumb.organizationalUnit.edit"), }, + canActivate: [OrganizationalUnitRoleGuardService], canDeactivate: [CanDeactivateGuard], }, ]; diff --git a/src/app/features/organizational-unit/organizational-unit.module.ts b/src/app/features/organizational-unit/organizational-unit.module.ts index 82ff7d1a550aeeb6fcd3ac8a69be9451b8627a4c..69f43c90684f4124f3127a08966729da10108225 100644 --- a/src/app/features/organizational-unit/organizational-unit.module.ts +++ b/src/app/features/organizational-unit/organizational-unit.module.ts @@ -8,6 +8,7 @@ import {OrganizationalUnitState} from "@app/features/organizational-unit/stores/ import {SharedModule} from "@app/shared/shared.module"; import {TranslateModule} from "@ngx-translate/core"; import {NgxsModule} from "@ngxs/store"; +import {OrganizationalUnitPersonRoleState} from "@orgunit/stores/person-role/organizational-unit-person-role.state"; const routables = [ OrgunitDetailRoutable, @@ -33,6 +34,7 @@ const presentationals = [ TranslateModule.forChild({}), NgxsModule.forFeature([ OrganizationalUnitState, + OrganizationalUnitPersonRoleState, ]), ], entryComponents: [ diff --git a/src/app/features/organizational-unit/stores/organizational-unit.action.ts b/src/app/features/organizational-unit/stores/organizational-unit.action.ts index a60197f11bb31bd0969dee577e06f55ed494f102..21a835cf6080cab86f360c43f61f5835619f649d 100644 --- a/src/app/features/organizational-unit/stores/organizational-unit.action.ts +++ b/src/app/features/organizational-unit/stores/organizational-unit.action.ts @@ -88,6 +88,20 @@ export namespace OrgUnitAction { @TypeDefaultAction(state) export class Clean extends ResourceAction.Clean { } + + export class ComputeCurrentUserIsManager { + static readonly type: string = `[${state}] Compute Current User Is Manager`; + + constructor() { + } + } + + export class SaveCurrentUserIsManagerAndRetrievePersonRoleIfManager { + static readonly type: string = `[${state}]Save Current User Is Manager And Retrieve Person Role If Manager`; + + constructor(public isManager: boolean) { + } + } } export const orgUnitActionNameSpace: ResourceNameSpace = OrgUnitAction; diff --git a/src/app/features/organizational-unit/stores/organizational-unit.state.ts b/src/app/features/organizational-unit/stores/organizational-unit.state.ts index 18c47f9b3dcbe3749777d38ef224b9dc49df5c99..86613d51d7a1dc5d66382d19993176896fa56ba0 100644 --- a/src/app/features/organizational-unit/stores/organizational-unit.state.ts +++ b/src/app/features/organizational-unit/stores/organizational-unit.state.ts @@ -1,39 +1,75 @@ import {OrganizationalUnitExtended} from "@app/features/deposit/models/organizational-unit-extended.model"; -import {orgUnitActionNameSpace} from "@app/features/organizational-unit/stores/organizational-unit.action"; -import {AdminResourceApiEnum} from "@app/shared/enums/api.enum"; +import { + OrgUnitAction, + orgUnitActionNameSpace, +} from "@app/features/organizational-unit/stores/organizational-unit.action"; +import { + AccessResourceApiEnum, + AdminResourceApiEnum, +} from "@app/shared/enums/api.enum"; import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; import {RoutesEnum} from "@app/shared/enums/routes.enum"; +import {DepositStateModel} from "@deposit/stores/deposit.state"; import { + Action, Actions, + ofActionCompleted, + Selector, State, + StateContext, Store, } from "@ngxs/store"; +import {OrgUnitPersonRoleAction} from "@orgunit/stores/person-role/organizational-unit-person-role.action"; +import { + OrganizationalUnitPersonRoleState, + OrganizationalUnitPersonRoleStateModel, +} from "@orgunit/stores/person-role/organizational-unit-person-role.state"; +import {OrganizationalUnitRoleHelper} from "@shared/guards/organizational-unit-role-guard.service"; +import {ErrorsSkipperService} from "@shared/services/errors-skipper.service"; +import {SharedPersonAction} from "@shared/stores/person/shared-person.action"; +import {SharedRoleAction} from "@shared/stores/role/shared-role.action"; +import {Observable} from "rxjs"; +import {tap} from "rxjs/operators"; import { ApiService, + defaultRelation3TiersStateInitValue, defaultResourceStateInitValue, + isFalse, + isNullOrUndefined, + isTrue, + isUndefined, NotificationService, + OverrideDefaultAction, ResourceState, ResourceStateModel, + StoreUtil, TRANSLATE, urlSeparator, } from "solidify-frontend"; export interface OrganizationalUnitStateModel extends ResourceStateModel<OrganizationalUnitExtended> { + organizationalUnit_personRole: OrganizationalUnitPersonRoleStateModel; + currentUserIsManager: boolean; } @State<OrganizationalUnitStateModel>({ name: LocalStateEnum.organizationalUnit, defaults: { ...defaultResourceStateInitValue, + currentUserIsManager: undefined, + organizationalUnit_personRole: {...defaultRelation3TiersStateInitValue}, }, - children: [], + children: [ + OrganizationalUnitPersonRoleState, + ], }) export class OrganizationalUnitState extends ResourceState<OrganizationalUnitExtended> { constructor(protected apiService: ApiService, protected store: Store, protected notificationService: NotificationService, - protected actions$: Actions) { + protected actions$: Actions, + protected errorsSkipperService: ErrorsSkipperService) { super(apiService, store, notificationService, actions$, { nameSpace: orgUnitActionNameSpace, routeRedirectUrlAfterSuccessCreateAction: (resId: string) => RoutesEnum.organizationalUnitDetail + urlSeparator + resId, @@ -46,6 +82,147 @@ export class OrganizationalUnitState extends ResourceState<OrganizationalUnitExt } protected get _urlResource(): string { - return AdminResourceApiEnum.organizationalUnits; + return this.store.selectSnapshot(OrganizationalUnitState.currentUserIsManager) ? AdminResourceApiEnum.organizationalUnits : AccessResourceApiEnum.organizationalUnits; + } + + @Selector() + static currentUserIsManager(state: OrganizationalUnitStateModel): boolean | undefined { + return state.currentUserIsManager; + } + + @Selector() + static current(state: OrganizationalUnitStateModel): OrganizationalUnitExtended { + return state.current; + } + + @Selector() + static isLoading(state: OrganizationalUnitStateModel): boolean { + return StoreUtil.isLoadingState(state); + } + + @Selector() + static isLoadingWithDependency(state: OrganizationalUnitStateModel): boolean { + return this.isLoading(state) + || isUndefined(this.currentUserIsManager(state)) + || StoreUtil.isLoadingState(state.organizationalUnit_personRole); + } + + @Selector() + static isReadyToBeDisplayed(state: OrganizationalUnitStateModel): boolean { + return !isNullOrUndefined(state.current) + && !isUndefined(this.currentUserIsManager(state)) + && (isFalse(this.currentUserIsManager(state)) || !isNullOrUndefined(state.organizationalUnit_personRole.selected)); + } + + @Action(OrgUnitAction.LoadResource) + loadResource(ctx: StateContext<DepositStateModel>, action: OrgUnitAction.LoadResource): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter + 1, + }); + + StoreUtil.dispatchParallelActionAndWaitForSubActionsCompletion(ctx, [ + { + action: new SharedPersonAction.GetAll(), + subActionCompletions: [ + this.actions$.pipe(ofActionCompleted(SharedPersonAction.GetAllSuccess)), + this.actions$.pipe(ofActionCompleted(SharedPersonAction.GetAllFail)), + ], + }, + { + action: new SharedRoleAction.GetAll(), + subActionCompletions: [ + this.actions$.pipe(ofActionCompleted(SharedRoleAction.GetAllSuccess)), + this.actions$.pipe(ofActionCompleted(SharedRoleAction.GetAllFail)), + ], + }, + ]).subscribe(success => { + if (success) { + ctx.dispatch(new OrgUnitAction.LoadResourceSuccess(action)); + } else { + ctx.dispatch(new OrgUnitAction.LoadResourceFail(action)); + } + }); + } + + @OverrideDefaultAction() + @Action(OrgUnitAction.GetByIdSuccess) + getByIdSuccess(ctx: StateContext<OrganizationalUnitStateModel>, action: OrgUnitAction.GetByIdSuccess): void { + ctx.patchState({ + current: action.model, + isLoadingCounter: ctx.getState().isLoadingCounter - 1, + }); + + ctx.dispatch(new OrgUnitAction.ComputeCurrentUserIsManager()); + } + + @Action(OrgUnitAction.ComputeCurrentUserIsManager) + computeCurrentUserIsManager(ctx: StateContext<OrganizationalUnitStateModel>, action: OrgUnitAction.ComputeCurrentUserIsManager): void | Observable<any> { + return OrganizationalUnitRoleHelper.isManagerOfOrgUnit(ctx.getState().current.resId, this.store).pipe( + tap(isManager => { + ctx.dispatch(new OrgUnitAction.SaveCurrentUserIsManagerAndRetrievePersonRoleIfManager(isManager)); + }), + ); + } + + @Action(OrgUnitAction.SaveCurrentUserIsManagerAndRetrievePersonRoleIfManager) + saveCurrentUserIsManagerAndRetrievePersonRoleIfManager(ctx: StateContext<OrganizationalUnitStateModel>, action: OrgUnitAction.SaveCurrentUserIsManagerAndRetrievePersonRoleIfManager): void { + ctx.patchState({ + currentUserIsManager: action.isManager, + }); + if (isTrue(action.isManager)) { + const orgUnitId = ctx.getState().current.resId; + this.store.dispatch(new OrgUnitPersonRoleAction.GetAll(orgUnitId)); + } + } + + @OverrideDefaultAction() + @Action(OrgUnitAction.Create) + create(ctx: StateContext<OrganizationalUnitStateModel>, action: OrgUnitAction.Create): Observable<OrganizationalUnitExtended> { + return super.internalCreate(ctx, action) + .pipe( + tap(model => { + this.updateSubResource(model, action, ctx) + .subscribe(success => { + if (success) { + ctx.dispatch(new OrgUnitAction.CreateSuccess(action, model)); + } else { + ctx.dispatch(new OrgUnitAction.CreateFail(action)); + } + }); + }), + ); + } + + @OverrideDefaultAction() + @Action(OrgUnitAction.Update) + update(ctx: StateContext<OrganizationalUnitStateModel>, action: OrgUnitAction.Update): Observable<OrganizationalUnitExtended> { + return super.internalUpdate(ctx, action) + .pipe( + tap(model => { + this.updateSubResource(model, action, ctx) + .subscribe(success => { + if (success) { + ctx.dispatch(new OrgUnitAction.UpdateSuccess(action, model)); + } else { + ctx.dispatch(new OrgUnitAction.UpdateFail(action)); + } + }); + }), + ); + } + + private updateSubResource(model: OrganizationalUnitExtended, action: OrgUnitAction.Create | OrgUnitAction.Update, ctx: StateContext<OrganizationalUnitStateModel>): Observable<boolean> { + const orgUnitId = model.resId; + const newPersonRole = action.modelFormControlEvent.formControl.get("personRole").value; + + return StoreUtil.dispatchSequentialActionAndWaitForSubActionsCompletion(ctx, [ + { + action: new OrgUnitPersonRoleAction.Update(orgUnitId, newPersonRole), + subActionCompletions: [ + this.actions$.pipe(ofActionCompleted(OrgUnitPersonRoleAction.UpdateSuccess)), + this.actions$.pipe(ofActionCompleted(OrgUnitPersonRoleAction.UpdateFail)), + ], + }, + ]); } } diff --git a/src/app/features/organizational-unit/stores/person-role/organizational-unit-person-role.action.ts b/src/app/features/organizational-unit/stores/person-role/organizational-unit-person-role.action.ts new file mode 100644 index 0000000000000000000000000000000000000000..ba03af95077ff5add9f2e750270e6fca107ca03d --- /dev/null +++ b/src/app/features/organizational-unit/stores/person-role/organizational-unit-person-role.action.ts @@ -0,0 +1,110 @@ +import {PersonRole} from "@admin/models/person-role.model"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import { + Relation3TiersAction, + Relation3TiersNameSpace, + TypeDefaultAction, +} from "solidify-frontend"; + +const state = LocalStateEnum.organizationalUnit_personRole; + +export namespace OrgUnitPersonRoleAction { + + @TypeDefaultAction(state) + export class GetAll extends Relation3TiersAction.GetAll { + } + + @TypeDefaultAction(state) + export class GetAllSuccess extends Relation3TiersAction.GetAllSuccess<PersonRole> { + } + + @TypeDefaultAction(state) + export class GetAllFail extends Relation3TiersAction.GetAllFail { + } + + @TypeDefaultAction(state) + export class GetById extends Relation3TiersAction.GetById { + } + + @TypeDefaultAction(state) + export class GetByIdSuccess extends Relation3TiersAction.GetByIdSuccess<PersonRole> { + } + + @TypeDefaultAction(state) + export class GetByIdFail extends Relation3TiersAction.GetByIdFail { + } + + @TypeDefaultAction(state) + export class Update extends Relation3TiersAction.Update { + } + + @TypeDefaultAction(state) + export class UpdateSuccess extends Relation3TiersAction.UpdateSuccess { + } + + @TypeDefaultAction(state) + export class UpdateFail extends Relation3TiersAction.UpdateFail { + } + + // @TypeDefaultAction(state) + // export class UpdateRelation extends Relation3TiersAction.UpdateRelation<OrganizationalUnitPreservationPolicy> { + // } + // + // @TypeDefaultAction(state) + // export class UpdateRelationSuccess extends Relation3TiersAction.UpdateRelationSuccess<OrganizationalUnitPreservationPolicy> { + // } + // + // @TypeDefaultAction(state) + // export class UpdateRelationFail extends Relation3TiersAction.UpdateRelationFail<OrganizationalUnitPreservationPolicy> { + // } + + @TypeDefaultAction(state) + export class Create extends Relation3TiersAction.Create { + } + + @TypeDefaultAction(state) + export class CreateSuccess extends Relation3TiersAction.CreateSuccess { + } + + @TypeDefaultAction(state) + export class CreateFail extends Relation3TiersAction.CreateFail { + } + + @TypeDefaultAction(state) + export class CreateResource extends Relation3TiersAction.CreateResource { + } + + @TypeDefaultAction(state) + export class CreateResourceSuccess extends Relation3TiersAction.CreateResourceSuccess { + } + + @TypeDefaultAction(state) + export class CreateResourceFail extends Relation3TiersAction.CreateResourceFail { + } + + // @TypeDefaultAction(state) + // export class DeleteList extends Relation3TiersAction.DeleteList { + // } + // + // @TypeDefaultAction(state) + // export class DeleteListSuccess extends Relation3TiersAction.DeleteListSuccess { + // } + // + // @TypeDefaultAction(state) + // export class DeleteListFail extends Relation3TiersAction.DeleteListFail { + // } + + @TypeDefaultAction(state) + export class Delete extends Relation3TiersAction.Delete { + } + + @TypeDefaultAction(state) + export class DeleteSuccess extends Relation3TiersAction.DeleteSuccess { + } + + @TypeDefaultAction(state) + export class DeleteFail extends Relation3TiersAction.DeleteFail { + } +} + +export const orgUnitPersonRoleActionNameSpace: Relation3TiersNameSpace = OrgUnitPersonRoleAction; diff --git a/src/app/features/organizational-unit/stores/person-role/organizational-unit-person-role.state.ts b/src/app/features/organizational-unit/stores/person-role/organizational-unit-person-role.state.ts new file mode 100644 index 0000000000000000000000000000000000000000..d8473edbed9bd71ec2955de7fb88b8c11e9a185d --- /dev/null +++ b/src/app/features/organizational-unit/stores/person-role/organizational-unit-person-role.state.ts @@ -0,0 +1,50 @@ +import {OrganizationalUnitPersonRole} from "@admin/models/organizational-unit-person-role.model"; +import {PersonRole} from "@admin/models/person-role.model"; +import {ApiResourceNameEnum} from "@app/shared/enums/api-resource-name.enum"; +import {AdminResourceApiEnum} from "@app/shared/enums/api.enum"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; + +import { + Actions, + State, + Store, +} from "@ngxs/store"; +import {orgUnitPersonRoleActionNameSpace} from "@orgunit/stores/person-role/organizational-unit-person-role.action"; +import { + ApiService, + defaultRelation3TiersStateInitValue, + NotificationService, + Relation3TiersForm, + Relation3TiersState, + Relation3TiersStateModel, +} from "solidify-frontend"; + +export interface OrganizationalUnitPersonRoleStateModel extends Relation3TiersStateModel<PersonRole> { +} + +@State<OrganizationalUnitPersonRoleStateModel>({ + name: LocalStateEnum.organizationalUnit_personRole, + defaults: { + ...defaultRelation3TiersStateInitValue, + }, +}) +// OrganizationalUnitPersonController +export class OrganizationalUnitPersonRoleState extends Relation3TiersState<PersonRole, OrganizationalUnitPersonRole> { + constructor(protected apiService: ApiService, + protected store: Store, + protected notificationService: NotificationService, + protected actions$: Actions) { + super(apiService, store, notificationService, actions$, { + nameSpace: orgUnitPersonRoleActionNameSpace, + resourceName: ApiResourceNameEnum.PERSON, + }); + } + + protected get _urlResource(): string { + return AdminResourceApiEnum.organizationalUnits; + } + + protected convertResourceInForm(resource: PersonRole): Relation3TiersForm { + return {id: resource.resId, listId: resource.roles.map(r => r.resId)}; + } +} diff --git a/src/app/shared/enums/local-state.enum.ts b/src/app/shared/enums/local-state.enum.ts index d603325c3ec9e858371979f89ce1985673e9f007..8b0854eae68f9e0c2fefeae56d0af39c05016297 100644 --- a/src/app/shared/enums/local-state.enum.ts +++ b/src/app/shared/enums/local-state.enum.ts @@ -18,6 +18,8 @@ export enum LocalStateEnum { deposit_dataFile_statusHistory = "deposit_dataFile_statusHistory", organizationalUnit = "organizationalUnit", + organizationalUnit_personRole = "organizationalUnit_personRole", + oauth2Client = "oauth2Client", shared = "shared", diff --git a/src/app/shared/guards/organizational-unit-role-guard.service.ts b/src/app/shared/guards/organizational-unit-role-guard.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..3e90477bd8ec0c033189fdd4854e5668adc368f8 --- /dev/null +++ b/src/app/shared/guards/organizational-unit-role-guard.service.ts @@ -0,0 +1,70 @@ +import {Injectable} from "@angular/core"; +import { + ActivatedRouteSnapshot, + CanActivate, + Router, +} from "@angular/router"; +import {AppState} from "@app/stores/app.state"; +import {AppOrgUnitPersonRoleAction} from "@app/stores/organizational-unit-person-role/app-organizational-unit-person-role.action"; +import {Store} from "@ngxs/store"; +import {RoleEnum} from "@shared/enums/role.enum"; +import {AppRoutesEnum} from "@shared/enums/routes.enum"; +import {UserApplicationRoleEnum} from "@shared/enums/user-application-role.enum"; +import { + Observable, + of, +} from "rxjs"; +import {map} from "rxjs/operators"; +import {ApiService} from "solidify-frontend"; + +@Injectable({ + providedIn: "root", +}) +export class OrganizationalUnitRoleGuardService implements CanActivate { + constructor(public router: Router, + public store: Store, + public apiService: ApiService) { + } + + canActivate(route: ActivatedRouteSnapshot): Observable<boolean> { + return OrganizationalUnitRoleHelper.isManagerOfOrgUnit(route.params[AppRoutesEnum.paramIdWithoutPrefixParam], this.store); + + // const applicationRoles = this.store.selectSnapshot(AppState.currentUserApplicationRolesResId); + // if (applicationRoles.includes(UserApplicationRoleEnum.admin) || applicationRoles.includes(UserApplicationRoleEnum.root)) { + // return of(true); + // } + // const listAuthorizedOrgUnitId = this.store.selectSnapshot(AppState.listAuthorizedOrganizationalUnitId); + // const orgUnitId: string = route.params[AppRoutesEnum.paramIdWithoutPrefixParam]; + // + // if (!listAuthorizedOrgUnitId.includes(orgUnitId)) { + // return of(false); + // } + // const currentPersonId = this.store.selectSnapshot(AppState.currentPerson).resId; + // return this.store.dispatch(new AppOrgUnitPersonRoleAction.GetById(orgUnitId, currentPersonId)).pipe( + // map(state => { + // const currentRoleOnOrgUnit = this.store.selectSnapshot(AppState.currentOrgUnitPersonRoleResId); + // return currentRoleOnOrgUnit.includes(RoleEnum.MANAGER); + // }), + // ); + } +} + +export class OrganizationalUnitRoleHelper { + public static isManagerOfOrgUnit(orgUnitId: string, store: Store): Observable<boolean> { + const applicationRoles = store.selectSnapshot(AppState.currentUserApplicationRolesResId); + if (applicationRoles.includes(UserApplicationRoleEnum.admin) || applicationRoles.includes(UserApplicationRoleEnum.root)) { + return of(true); + } + const listAuthorizedOrgUnitId = store.selectSnapshot(AppState.listAuthorizedOrganizationalUnitId); + if (!listAuthorizedOrgUnitId.includes(orgUnitId)) { + return of(false); + } + const currentPersonId = store.selectSnapshot(AppState.currentPerson).resId; + return store.dispatch(new AppOrgUnitPersonRoleAction.GetById(orgUnitId, currentPersonId)).pipe( + map(state => { + const currentRoleOnOrgUnit = store.selectSnapshot(AppState.currentOrgUnitPersonRoleResId); + return currentRoleOnOrgUnit.includes(RoleEnum.MANAGER); + }), + ); + } +} diff --git a/src/app/shared/services/dlcm-errors-handler.service.ts b/src/app/shared/services/dlcm-errors-handler.service.ts index f9ace01b6d6eba28049f21a381b7210dc97e2bd9..83904417cc8d2c8572a33f1599577c9802fc7177 100644 --- a/src/app/shared/services/dlcm-errors-handler.service.ts +++ b/src/app/shared/services/dlcm-errors-handler.service.ts @@ -5,6 +5,7 @@ import { } from "@angular/core"; import {AppAction} from "@app/stores/app.action"; import {Store} from "@ngxs/store"; +import {ErrorsSkipperService} from "@shared/services/errors-skipper.service"; import { ENVIRONMENT, ErrorDto, @@ -19,18 +20,23 @@ import { export class DlcmErrorsHandlerService extends GlobalErrorsHandlerService { // Error handling is important and needs to be loaded first. // Because of this we should manually inject the services with Injector. + constructor(protected injector: Injector) { super(injector); } handleError(error: Error | HttpErrorResponse): void { const environment = this.injector.get(ENVIRONMENT); + const errorSkipper = this.injector.get(ErrorsSkipperService); if (error === environment.errorToSkipInErrorHandler) { return; } const httpErrorKeyToSkipInErrorHandler = environment.httpErrorKeyToSkipInErrorHandler; if (error instanceof HttpErrorResponse) { + if (errorSkipper.shouldBeSkipped(error.status)) { + return; + } const errorDto = error.error as ErrorDto; if (ErrorHelper.isErrorToTreat(error, httpErrorKeyToSkipInErrorHandler)) { // Server Error @@ -44,6 +50,7 @@ export class DlcmErrorsHandlerService extends GlobalErrorsHandlerService { } super.handleError(error); + console.error(error); } } diff --git a/src/app/shared/services/errors-skipper.service.ts b/src/app/shared/services/errors-skipper.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..0982f280581533f82572ea8d1adde2ece92694bb --- /dev/null +++ b/src/app/shared/services/errors-skipper.service.ts @@ -0,0 +1,44 @@ +import {Injectable} from "@angular/core"; +import {isNullOrUndefined} from "solidify-frontend"; + +@Injectable({ + providedIn: "root", +}) +export class ErrorsSkipperService { + private _errorHttpCodeToSkipTemporary: number[]; + + constructor() { + this.init(); + } + + init(): void { + if (isNullOrUndefined(this._errorHttpCodeToSkipTemporary)) { + this._errorHttpCodeToSkipTemporary = []; + } + } + + addErrorSoSkip(error: number): void { + if (!this._errorHttpCodeToSkipTemporary.includes(error)) { + this._errorHttpCodeToSkipTemporary.push(error); + } + } + + removeErrorSoSkip(error: number): void { + if (!this._errorHttpCodeToSkipTemporary.includes(error)) { + return; + } + const index = this._errorHttpCodeToSkipTemporary.indexOf(error); + if (index === -1) { + return; + } + this._errorHttpCodeToSkipTemporary.splice(index, 1); + } + + shouldBeSkipped(error: number): boolean { + if (this._errorHttpCodeToSkipTemporary.includes(error)) { + this.removeErrorSoSkip(error); + return true; + } + return false; + } +} 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 aa1d2e3e2bc17192c5a2729be94e1eaef056c1a6..4c6f4c81e37c5271f4cbe78ebd67fd42dd2a89d1 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 @@ -20,11 +20,18 @@ import {environment} from "../../../environments/environment"; export interface AppAuthorizedOrganizationalUnitStateModel extends ResourceStateModel<OrganizationalUnit> { } +// WARNING : IN SOME CASE WE NEED TO FILTER TO GET ONLY OPENED ORG UNIT +const getQueryParameter = () => { + const queryParameters = new QueryParameters(environment.defaultEnumValuePageSizeOption); + queryParameters.search.searchItems.set("openOnly", "false"); + return queryParameters; +}; + @State<AppAuthorizedOrganizationalUnitStateModel>({ name: LocalStateEnum.application_authorizedOrganizationalUnit, defaults: { ...defaultResourceStateInitValue, - queryParameters: new QueryParameters(environment.defaultEnumValuePageSizeOption), + queryParameters: getQueryParameter(), }, }) export class AppAuthorizedOrganizationalUnitState extends ResourceState<OrganizationalUnit> { @@ -41,4 +48,35 @@ export class AppAuthorizedOrganizationalUnitState extends ResourceState<Organiza protected get _urlResource(): string { 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; + // }), + // ); + // } } diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 4d5dd2cbf320704c2a1a61a9c623935b22a12d3b..75fec7fd1f044180ab55ff8b13562b06780d855f 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -895,6 +895,9 @@ "delete": "Delete", "description": "Description", "edit": "Edit", + "form": { + "url": "Url" + }, "name": "Name", "new": "Create new organizational unit", "notification": { diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 4d5dd2cbf320704c2a1a61a9c623935b22a12d3b..75fec7fd1f044180ab55ff8b13562b06780d855f 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -895,6 +895,9 @@ "delete": "Delete", "description": "Description", "edit": "Edit", + "form": { + "url": "Url" + }, "name": "Name", "new": "Create new organizational unit", "notification": { diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 1cf83328a6900fd18ba4b17f9c218a37be805b11..2033c54c1f68848ee2378ef91e52c47f6f4f11c6 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -895,6 +895,9 @@ "delete": "Supprimer", "description": "Description", "edit": "Modifier", + "form": { + "url": "Url" + }, "name": "Nom", "new": "Créer nouvelle unité organisationnelle", "notification": {