diff --git a/src/app/features/admin/admin.module.ts b/src/app/features/admin/admin.module.ts index a249171543481ed01fd109dbeb8cc3e493c54fcb..fa6ba6e8d3b5f73526438f5c1a07fb20a864fe98 100644 --- a/src/app/features/admin/admin.module.ts +++ b/src/app/features/admin/admin.module.ts @@ -65,6 +65,7 @@ const presentationals = []; AdminOrganizationalUnitPersonRoleState, AdminOrganizationalUnitFundingAgencyState, AdminOrganizationalUnitInstitutionState, + AdminOrganizationalUnitAdditionalFieldsFormState, AdminUserState, AdminOaiSetState, AdminOAuth2ClientState, diff --git a/src/app/features/admin/organizational-unit/admin-organizational-unit-routing.module.ts b/src/app/features/admin/organizational-unit/admin-organizational-unit-routing.module.ts index 5771b6c1563110986224ad2ca957e05f36f5f8ec..0cf78ed2f28e1981550fb0cb16484d728027f5df 100644 --- a/src/app/features/admin/organizational-unit/admin-organizational-unit-routing.module.ts +++ b/src/app/features/admin/organizational-unit/admin-organizational-unit-routing.module.ts @@ -14,6 +14,7 @@ import { } from "@shared/enums/routes.enum"; import {CanDeactivateGuard} from "@shared/services/can-deactivate-guard.service"; import {MARK_AS_TRANSLATABLE} from "solidify-frontend"; +import {AdminOrgUnitAdditionalFieldsFormListRoutable} from "@admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form-list.routable"; const routes: Routes = [ { @@ -35,7 +36,23 @@ const routes: Routes = [ }, canDeactivate: [CanDeactivateGuard], }, - ], + ] + }, + { + path: AdminRoutesEnum.organizationalUnitAdditionalFieldsForm + AppRoutesEnum.separator + AppRoutesEnum.paramId, + component: AdminOrgUnitAdditionalFieldsFormListRoutable, + data: { + breadcrumbMemoizedSelector: AdminOrganizationalUnitState.currentTitle, + }, + children: [ + { + path: AdminRoutesEnum.organizationalUnitEdit, + data: { + breadcrumb: MARK_AS_TRANSLATABLE("breadcrumb.admin.organizationalUnit.additionalFieldsForm.edit"), + }, + canDeactivate: [CanDeactivateGuard], + }, + ] }, { path: AdminRoutesEnum.organizationalUnitCreate, diff --git a/src/app/features/admin/organizational-unit/components/routables/admin-orgunit-detail-edit/admin-organizational-unit-detail-edit.routable.ts b/src/app/features/admin/organizational-unit/components/routables/admin-orgunit-detail-edit/admin-organizational-unit-detail-edit.routable.ts index bdee68e700af3db7a008aca3968976479ed8bfa9..7448bd876f4a9d126373e016feb20b6a702db58f 100644 --- a/src/app/features/admin/organizational-unit/components/routables/admin-orgunit-detail-edit/admin-organizational-unit-detail-edit.routable.ts +++ b/src/app/features/admin/organizational-unit/components/routables/admin-orgunit-detail-edit/admin-organizational-unit-detail-edit.routable.ts @@ -51,10 +51,14 @@ import {SharedRoleState} from "@shared/stores/role/shared-role.state"; import {SharedSubmissionPolicyState} from "@shared/stores/submission-policy/shared-submission-policy.state"; import {Observable} from "rxjs"; import { + MARK_AS_TRANSLATABLE, MemoizedUtil, OverrideProperty, ResourceNameSpace, } from "solidify-frontend"; +import {Tab} from "@shared/components/containers/shared-tabs/shared-tabs.container"; +import {AdminRoutesEnum, AppRoutesEnum, DepositRoutesEnum} from "@shared/enums/routes.enum"; +import {IconNameEnum} from "@shared/enums/icon-name.enum"; @Component({ selector: "dlcm-admin-organizational-unit-detail-edit-routable", @@ -83,6 +87,27 @@ export class AdminOrganizationalUnitDetailEditRoutable extends SharedAbstractDet readonly KEY_PARAM_NAME: keyof OrganizationalUnit & string = "name"; + private get rootUrl(): string[] { + return [AppRoutesEnum.admin, AdminRoutesEnum.organizationalUnit]; + } + + listTabs: Tab[] = [ + { + id: TabEnum.METADATA, + suffixUrl: DepositRoutesEnum.metadata, + icon: IconNameEnum.metadata, + titleToTranslate: MARK_AS_TRANSLATABLE("admin.organizationalUnit.detail"), + route: () => [...this.rootUrl, AdminRoutesEnum.organizationalUnitDetail, this._resId], + }, + { + id: TabEnum.ADDITIONAL_FIELDS_FORM, + suffixUrl: DepositRoutesEnum.metadata, + icon: IconNameEnum.files, + titleToTranslate: MARK_AS_TRANSLATABLE("admin.organizationalUnit.additionalFieldsForm"), + route: () => [...this.rootUrl, AdminRoutesEnum.organizationalUnitAdditionalFieldsForm, this._resId], + }, + ]; + constructor(protected _store: Store, protected _route: ActivatedRoute, protected readonly _actions$: Actions, @@ -105,3 +130,8 @@ export class AdminOrganizationalUnitDetailEditRoutable extends SharedAbstractDet this._store.dispatch(new AdminOrganizationalUnitInstitutionAction.GetAll(id)); } } + +enum TabEnum { + METADATA = "METADATA", + ADDITIONAL_FIELDS_FORM = "ADDITIONAL_FIELDS_FORM", +} diff --git a/src/app/features/admin/organizational-unit/stores/admin-organizational-unit.state.ts b/src/app/features/admin/organizational-unit/stores/admin-organizational-unit.state.ts index 873d8f0fa751293c09b21e010a6b2b1460b153c5..6f8c283556e50ea146f0b51822c94feaad56833d 100644 --- a/src/app/features/admin/organizational-unit/stores/admin-organizational-unit.state.ts +++ b/src/app/features/admin/organizational-unit/stores/admin-organizational-unit.state.ts @@ -32,6 +32,11 @@ import { AdminOrganizationalUnitSubmissionPolicyState, AdminOrganizationalUnitSubmissionPolicyStateModel, } from "@admin/organizational-unit/stores/submission-policy/admin-organizational-unit-submission-policy.state"; +import { + AdminOrganizationalUnitAdditionalFieldsFormState, + AdminOrganizationalUnitAdditionalFieldsFormStateModel, + defaultAdminOrganizationalUnitAdditionalFieldsFormStateModel +} from "@admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.state"; import {Injectable} from "@angular/core"; import {DepositStateModel} from "@deposit/stores/deposit.state"; import {OrganizationalUnit} from "@models"; @@ -56,6 +61,7 @@ import {tap} from "rxjs/internal/operators/tap"; import { ApiService, defaultAssociationStateInitValue, + defaultCompositionStateInitValue, defaultRelation2TiersStateInitValue, defaultRelation3TiersStateInitValue, defaultResourceStateInitValue, @@ -80,6 +86,7 @@ export interface AdminOrganizationalUnitStateModel extends ResourceStateModel<Or admin_organizationalUnit_personRole: AdminOrganizationalUnitPersonRoleStateModel; admin_organizationalUnit_fundingAgency: AdminOrganizationalUnitFundingAgencyStateModel; admin_organizationalUnit_institution: AdminOrganizationalUnitInstitutionStateModel; + admin_organizationalUnit_additionalFieldsForm: AdminOrganizationalUnitAdditionalFieldsFormStateModel; } @Injectable() @@ -93,6 +100,7 @@ export interface AdminOrganizationalUnitStateModel extends ResourceStateModel<Or admin_organizationalUnit_personRole: {...defaultRelation3TiersStateInitValue()}, admin_organizationalUnit_fundingAgency: {...defaultAssociationStateInitValue()}, admin_organizationalUnit_institution: {...defaultAssociationStateInitValue()}, + admin_organizationalUnit_additionalFieldsForm: {...defaultAdminOrganizationalUnitAdditionalFieldsFormStateModel()} }, children: [ AdminOrganizationalUnitSubmissionPolicyState, @@ -101,6 +109,7 @@ export interface AdminOrganizationalUnitStateModel extends ResourceStateModel<Or AdminOrganizationalUnitPersonRoleState, AdminOrganizationalUnitFundingAgencyState, AdminOrganizationalUnitInstitutionState, + AdminOrganizationalUnitAdditionalFieldsFormState ], }) export class AdminOrganizationalUnitState extends ResourceState<AdminOrganizationalUnitStateModel, OrganizationalUnit> { diff --git a/src/app/features/admin/orgunit/admin-orgunit.module.ts b/src/app/features/admin/orgunit/admin-orgunit.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..b5752b4f6a31cb66e0f803c471c53c5a288f94ba --- /dev/null +++ b/src/app/features/admin/orgunit/admin-orgunit.module.ts @@ -0,0 +1,52 @@ +import {AdminOrgunitRoutingModule} from "@admin/orgunit/admin-orgunit-routing.module"; +import {AdminOrgunitDeleteDialog} from "@admin/orgunit/components/dialogs/admin-orgunit-delete/admin-orgunit-delete.dialog"; +import {AdminOrgunitFormPresentational} from "@admin/orgunit/components/presentationals/admin-orgunit-form/admin-orgunit-form.presentational"; +import {AdminOrgunitCreateRoutable} from "@admin/orgunit/components/routables/admin-orgunit-create/admin-orgunit-create.routable"; +import {AdminOrgunitDetailEditRoutable} from "@admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable"; +import {AdminOrgunitListRoutable} from "@admin/orgunit/components/routables/admin-orgunit-list/admin-orgunit-list.routable"; +import {AdminOrganizationalUnitState} from "@admin/orgunit/stores/admin-organizational-unit.state"; +import {NgModule} from "@angular/core"; +import {SharedModule} from "@app/shared/shared.module"; +import {TranslateModule} from "@ngx-translate/core"; +import {NgxsModule} from "@ngxs/store"; +import {AdminOrgUnitAdditionalFieldsFormListRoutable} from "@admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form-list.routable"; + +const routables = [ + AdminOrgunitCreateRoutable, + AdminOrgunitDetailEditRoutable, + AdminOrgunitListRoutable, + AdminOrgUnitAdditionalFieldsFormListRoutable +]; +const containers = []; +const dialogs = [ + AdminOrgunitDeleteDialog, +]; +const presentationals = [ + AdminOrgunitFormPresentational, +]; + +@NgModule({ + declarations: [ + ...routables, + ...containers, + ...dialogs, + ...presentationals, + ], + imports: [ + SharedModule, + AdminOrgunitRoutingModule, + TranslateModule.forChild({}), + NgxsModule.forFeature([ + AdminOrganizationalUnitState, + ]), + ], + entryComponents: [ + ...dialogs, + ], + exports: [ + ...routables, + ], + providers: [], +}) +export class AdminOrgunitModule { +} diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form-list.routable.ts b/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form-list.routable.ts new file mode 100644 index 0000000000000000000000000000000000000000..3fcfa6626204e11998990c0e631dcebc3d3b475c --- /dev/null +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form-list.routable.ts @@ -0,0 +1,110 @@ +import {ChangeDetectionStrategy, ChangeDetectorRef, Component} from "@angular/core"; +import {AdditionalFieldsForm} from "@models"; +import {MARK_AS_TRANSLATABLE, MemoizedUtil, OrderEnum, QueryParameters} from "solidify-frontend"; +import {FieldTypeEnum} from "@shared/enums/field-type.enum"; +import {DataTableColumns} from "@shared/models/data-table-columns.model"; +import {Store} from "@ngxs/store"; +import {Observable} from "rxjs"; +import { + AdminOrganizationalUnitAdditionalFieldsFormState, +} from "@admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.state"; +import { + AdminOrganizationalUnitAdditionalFieldsFormAction, +} from "@admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.action"; +import {debounceTime, distinctUntilChanged, tap} from "rxjs/operators"; +import {AdminRoutesEnum, AppRoutesEnum, DepositRoutesEnum} from "@shared/enums/routes.enum"; +import {Tab} from "@shared/components/containers/shared-tabs/shared-tabs.container"; +import {IconNameEnum} from "@shared/enums/icon-name.enum"; +import {ActivatedRoute} from "@angular/router"; + +@Component({ + selector: "dlcm-admin-orgunit-additional-fields-form-routable", + templateUrl: "./admin-orgunit-additional-fields-form.routable.html", + styleUrls: ["./admin-orgunit-additional-fields-form.routable.scss"], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminOrgUnitAdditionalFieldsFormListRoutable { + isLoadingObs: Observable<boolean> = MemoizedUtil.isLoading(this._store, AdminOrganizationalUnitAdditionalFieldsFormState); + + _orgUnitResId: string; + _resId: string; + + private currentTab: Tab; + + additionalFieldsFormObs: Observable<AdditionalFieldsForm[]>; + queryParametersObs: Observable<QueryParameters> = MemoizedUtil.select(this._store, AdminOrganizationalUnitAdditionalFieldsFormState, (state) => state.queryParameters); + + columns: DataTableColumns<AdditionalFieldsForm>[]; + + private get rootUrl(): string[] { + return [AppRoutesEnum.admin, AdminRoutesEnum.organizationalUnit]; + } + + listTabs: Tab[] = [ + { + id: TabEnum.METADATA, + suffixUrl: DepositRoutesEnum.metadata, + icon: IconNameEnum.metadata, + titleToTranslate: MARK_AS_TRANSLATABLE("admin.organizationalUnit.detail"), + route: () => [...this.rootUrl, AdminRoutesEnum.organizationalUnitDetail, this._orgUnitResId], + }, + { + id: TabEnum.ADDITIONAL_FIELDS_FORM, + suffixUrl: DepositRoutesEnum.metadata, + icon: IconNameEnum.files, + titleToTranslate: MARK_AS_TRANSLATABLE("admin.organizationalUnit.additionalFieldsForm"), + route: () => [...this.rootUrl, AdminRoutesEnum.organizationalUnitAdditionalFieldsForm, this._orgUnitResId], + }, + ]; + + constructor(protected readonly _store: Store, protected readonly _route: ActivatedRoute, private readonly _changeDetector: ChangeDetectorRef) { + this.retrieveResIdFromUrl(); + this.defineColumns(); + + this.additionalFieldsFormObs = MemoizedUtil.select(this._store, AdminOrganizationalUnitAdditionalFieldsFormState, + (state) => state.list) + .pipe( + debounceTime(400), + distinctUntilChanged() + ); + } + + protected retrieveResIdFromUrl(): void { + this._orgUnitResId = this._route.snapshot.paramMap.get(AppRoutesEnum.paramIdWithoutPrefixParam); + } + + onQueryParametersEvent(queryParameters: QueryParameters): void { + this._store.dispatch(new AdminOrganizationalUnitAdditionalFieldsFormAction.ChangeQueryParameters(this._orgUnitResId, queryParameters)); + this._changeDetector.detectChanges(); // Allow to display spinner the first time + } + + defineColumns(): void { + this.columns = [ + { + field: "name", + header: MARK_AS_TRANSLATABLE("admin.organizationalUnit.additionalFields.table.header.name"), + type: FieldTypeEnum.string, + order: OrderEnum.none, + isFilterable: true, + isSortable: true, + }, + { + field: "creation.when" as any, + header: MARK_AS_TRANSLATABLE("admin.organizationalUnit.additionalFields.table.header.creation.when"), + type: FieldTypeEnum.datetime, + order: OrderEnum.ascending, + isFilterable: true, + isSortable: true, + }, + ]; + } + + setCurrentTab($event: Tab): void { + this.currentTab = $event; + } +} + +enum TabEnum { + METADATA = "METADATA", + ADDITIONAL_FIELDS_FORM = "ADDITIONAL_FIELDS_FORM", +} diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form.routable.html b/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form.routable.html new file mode 100644 index 0000000000000000000000000000000000000000..afddfd424d1300a92aeb2ccfad4979e032fb5e65 --- /dev/null +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form.routable.html @@ -0,0 +1,21 @@ +<div class="additional-fields-form"> + + <dlcm-shared-tabs-container [tabs]="listTabs" + [isLoading]="isLoadingObs | async" + (tabChange)="setCurrentTab($event)" + ></dlcm-shared-tabs-container> + + <dlcm-shared-data-table [columns]="columns" + [datas]="additionalFieldsFormObs | async" + [queryParameters]="queryParametersObs | async" + [isLoading]="isLoadingObs | async" + (queryParametersChange)="onQueryParametersEvent($event)" + ></dlcm-shared-data-table> + + <div class="wrapper" + [dlcmSpinner]="isLoadingObs | async" + > + + </div> + +</div> diff --git a/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form.routable.scss b/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form.routable.scss new file mode 100644 index 0000000000000000000000000000000000000000..b9bc65ea450fe2c81372502f895811531a324ae8 --- /dev/null +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-additional-fields-form-list/admin-orgunit-additional-fields-form.routable.scss @@ -0,0 +1,3 @@ +:host { + width: 100%; +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..20c782bb363f0b201af97cc82f7148616eb0f21d --- /dev/null +++ b/src/app/features/admin/orgunit/components/routables/admin-orgunit-detail-edit/admin-orgunit-detail-edit.routable.html @@ -0,0 +1,53 @@ +<dlcm-shared-tabs-container [tabs]="listTabs" + [isLoading]="isLoadingObs | async" + (tabChange)="setCurrentTab($event)" +></dlcm-shared-tabs-container> + +<lib-empty-container + cdkTrapFocus + solidifyShortCuts + [solidifyFocusFirstElement]="true" + (onEscape)="backToList()" +> + <dlcm-shared-banner-edit-mode [isEdit]="isEdit"></dlcm-shared-banner-edit-mode> + + + <dlcm-button-toolbar-detail [mode]="isEdit ? 'edit' : 'detail'" + [formPresentational]="formPresentational" + [currentModel]="currentObs | async" + (editChange)="edit()" + (deleteChange)="delete()" + (backToDetailChange)="backToDetail()" + (backToListChange)="backToList()" + > + </dlcm-button-toolbar-detail> + + <div class="wrapper" + [dlcmSpinner]="isLoadingWithDependencyObs | async" + > + <dlcm-admin-orgunit-form #formPresentational + [solidifyFocusFirstElement]="isEdit" + *ngIf="isReadyToBeDisplayedObs | async" + [model]="currentObs| async" + [selectedSubmissionPolicies]="selectedSubmissionPoliciesObs | async" + [selectedPreservationPolicies]="selectedPreservationPoliciesObs | async" + [selectedDisseminationPolicies]="selectedDisseminationPoliciesObs | async" + [selectedPersonRole]="selectedPersonRoleObs | async" + [selectedFundingAgencies]="selectedFundingAgenciesObs | async" + [selectedInstitutions]="selectedInstitutionsObs | async" + [listSubmissionPolicies]="listSubmissionPoliciesObs | async" + [listPreservationPolicies]="listPreservationPoliciesObs | async" + [listDisseminationPolicies]="listDisseminationPoliciesObs | async" + [researchDomainSources]="researchDomainSourcesObs | async" + [defaultPlatformLicenseId]="(systemPropertyObs | async)?.defaultLicense" + [listRole]="listRoleObs | async" + [readonly]="!isEdit" + [editAvailable]="editAvailable" + (checkAvailableChange)="checkAvailable($event)" + (submitChange)="update($event)" + (dirtyChange)="updateCanDeactivate($event)" + (navigate)="navigate($event)" + (editChange)="edit()" + ></dlcm-admin-orgunit-form> + </div> +</lib-empty-container> diff --git a/src/app/features/admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.action.ts b/src/app/features/admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.action.ts new file mode 100644 index 0000000000000000000000000000000000000000..280943f57da625fb16dd77fe3039d1b7e6ae1003 --- /dev/null +++ b/src/app/features/admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.action.ts @@ -0,0 +1,103 @@ +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {AdditionalFieldsForm} from "@models"; +import { + BaseAction, BaseSubAction, + CompositionAction, + CompositionNameSpace, QueryParameters, + TypeDefaultAction, +} from "solidify-frontend"; + +const state = LocalStateEnum.admin_organizationalUnit_additionalFieldsForm; + +export namespace AdminOrganizationalUnitAdditionalFieldsFormAction { + @TypeDefaultAction(state) + export class GetAll extends CompositionAction.GetAll { + } + + @TypeDefaultAction(state) + export class GetAllSuccess extends CompositionAction.GetAllSuccess<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class GetAllFail extends CompositionAction.GetAllFail { + } + + @TypeDefaultAction(state) + export class GetById extends CompositionAction.GetById { + } + + @TypeDefaultAction(state) + export class GetByIdSuccess extends CompositionAction.GetByIdSuccess<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class GetByIdFail extends CompositionAction.GetByIdFail { + } + + @TypeDefaultAction(state) + export class Update extends CompositionAction.Update<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class UpdateSuccess extends CompositionAction.UpdateSuccess<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class UpdateFail extends CompositionAction.UpdateFail<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class Create extends CompositionAction.Create<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class CreateSuccess extends CompositionAction.CreateSuccess<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class CreateFail extends CompositionAction.CreateFail<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class Delete extends CompositionAction.Delete<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class DeleteSuccess extends CompositionAction.DeleteSuccess<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class DeleteFail extends CompositionAction.DeleteFail<AdditionalFieldsForm> { + } + + @TypeDefaultAction(state) + export class ChangeQueryParameters extends CompositionAction.ChangeQueryParameters { + static readonly type: string = `[${state}] Change Query Parameters`; + + constructor(public parentId: string, public queryParameters: QueryParameters, public keepCurrentContext: boolean = false, public getAllAfterChange: boolean = true) { + super(parentId, queryParameters, keepCurrentContext, getAllAfterChange); + } + } + + export class GetCurrentMetadataForm extends BaseAction { + static readonly type: string = `[${state}] Get Current Metadata Form`; + + constructor(public parentId: string) { + super(); + } + } + + export class GetCurrentMetadataFormSuccess extends BaseSubAction<GetCurrentMetadataForm> { + static readonly type: string = `[${state}] Get Current Metadata Form Success`; + + constructor(public parentAction: GetCurrentMetadataForm, public currentForm: AdditionalFieldsForm) { + super(parentAction); + } + } + + export class GetCurrentMetadataFormFail extends BaseSubAction<GetCurrentMetadataForm> { + static readonly type: string = `[${state}] Get Current Metadata Form Fail`; + } +} + +export const adminOrganizationalUnitAdditionalFieldsFormActionNameSpace: CompositionNameSpace = AdminOrganizationalUnitAdditionalFieldsFormAction; diff --git a/src/app/features/admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.state.ts b/src/app/features/admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.state.ts new file mode 100644 index 0000000000000000000000000000000000000000..3481898ac97b8766d7e5bbfb0c7b880911d38a20 --- /dev/null +++ b/src/app/features/admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.state.ts @@ -0,0 +1,90 @@ +import {Injectable} from "@angular/core"; +import {LocalStateEnum} from "@app/shared/enums/local-state.enum"; +import {AdditionalFieldsForm} from "@models"; +import { + Action, + Actions, + State, StateContext, + Store, +} from "@ngxs/store"; +import {ApiResourceNameEnum} from "@shared/enums/api-resource-name.enum"; +import {AdminResourceApiEnum} from "@shared/enums/api.enum"; +import { + ApiService, + CompositionState, + CompositionStateModel, + defaultCompositionStateInitValue, + NotificationService, QueryParameters, SolidifyStateError, +} from "solidify-frontend"; +import {Observable} from "rxjs"; +import {catchError, tap} from "rxjs/operators"; +import GetCurrentMetadataFormSuccess = AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataFormSuccess; +import GetCurrentMetadataFormFail = AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataFormFail; +import { + AdminOrganizationalUnitAdditionalFieldsFormAction, + adminOrganizationalUnitAdditionalFieldsFormActionNameSpace +} from "@admin/orgunit/stores/additional-fields-form/admin-organizational-unit-additional-fields-form.action"; + +export const defaultAdminOrganizationalUnitAdditionalFieldsFormStateModel: () => AdminOrganizationalUnitAdditionalFieldsFormStateModel = () => + ({ + ...defaultCompositionStateInitValue(), + queryParameters: new QueryParameters(20), + loaded: false + }); + +export interface AdminOrganizationalUnitAdditionalFieldsFormStateModel extends CompositionStateModel<AdditionalFieldsForm> { + loaded: boolean; +} + +@Injectable() +@State<AdminOrganizationalUnitAdditionalFieldsFormStateModel>({ + name: LocalStateEnum.admin_organizationalUnit_additionalFieldsForm, + defaults: { + ...defaultAdminOrganizationalUnitAdditionalFieldsFormStateModel(), + }, +}) +export class AdminOrganizationalUnitAdditionalFieldsFormState extends CompositionState<AdminOrganizationalUnitAdditionalFieldsFormStateModel, AdditionalFieldsForm> { + constructor(protected apiService: ApiService, + protected store: Store, + protected notificationService: NotificationService, + protected actions$: Actions) { + super(apiService, store, notificationService, actions$, { + nameSpace: adminOrganizationalUnitAdditionalFieldsFormActionNameSpace, + resourceName: ApiResourceNameEnum.ADDITIONAL_FIELDS_FORM, + }); + } + + protected get _urlResource(): string { + return AdminResourceApiEnum.organizationalUnits; + } + + @Action(AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataForm) + getCurrentMetadataForm(ctx: StateContext<AdminOrganizationalUnitAdditionalFieldsFormStateModel>, action: AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataForm): Observable<AdditionalFieldsForm> { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter + 1 + }); + return this.apiService.getByIdInPath<AdditionalFieldsForm>(`${this._urlResource}/${action.parentId}/${this._resourceName}/${ApiResourceNameEnum.CURRENT_VERSION}`).pipe( + tap(result => ctx.dispatch(new GetCurrentMetadataFormSuccess(action, result))), + catchError(error => { + ctx.dispatch(new GetCurrentMetadataFormFail(action)); + throw new SolidifyStateError(this, error); + }) + ); + } + + @Action(AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataFormSuccess) + getCurrentMetadataFormSuccess(ctx: StateContext<AdminOrganizationalUnitAdditionalFieldsFormStateModel>, action: AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataFormSuccess): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter - 1, + current: action.currentForm, + loaded: true + }); + } + + @Action(AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataFormFail) + getCurrentMetadataFormFail(ctx: StateContext<AdminOrganizationalUnitAdditionalFieldsFormStateModel>, action: AdminOrganizationalUnitAdditionalFieldsFormAction.GetCurrentMetadataFormFail): void { + ctx.patchState({ + isLoadingCounter: ctx.getState().isLoadingCounter - 1 + }); + } +} diff --git a/src/app/shared/enums/local-state.enum.ts b/src/app/shared/enums/local-state.enum.ts index 54b703c86025f15105c12857ff4f091303d42b8d..d8454c8bf342f311328695c2d74815f44cd7a478 100644 --- a/src/app/shared/enums/local-state.enum.ts +++ b/src/app/shared/enums/local-state.enum.ts @@ -100,6 +100,7 @@ export enum LocalStateEnum { admin_organizationalUnit_personRole = "admin_organizationalUnit_personRole", admin_organizationalUnit_fundingAgency = "admin_organizationalUnit_fundingAgency", admin_organizationalUnit_institution = "admin_organizationalUnit_institution", + admin_organizationalUnit_additionalFieldsForm = "admin_organizationalUnit_additionalFieldsForm", admin_fundingAgencies_organizationalUnit = "admin_fundingAgencies_organizationalUnit", admin_institution = "admin_institution", admin_researchDomain = "admin_researchDomain", diff --git a/src/app/shared/enums/routes.enum.ts b/src/app/shared/enums/routes.enum.ts index 8a7c2898f695f239df20d2e45f3a507426ba393b..5f9e05e792b104a1f40ed77d66599f314780d2ba 100644 --- a/src/app/shared/enums/routes.enum.ts +++ b/src/app/shared/enums/routes.enum.ts @@ -89,6 +89,7 @@ export enum AdminRoutesEnum { organizationalUnitCreate = "create", organizationalUnitDetail = "detail", organizationalUnitEdit = "edit", + organizationalUnitAdditionalFieldsForm = "additional-fields-form", institution = "institution", institutionCreate = "create", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 9828a61639f0a657eb0d056fafab6299422a66d6..9ff8c15f4b36075719321d5d2f5a359befd736dd 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -468,6 +468,17 @@ } }, "organizationalUnit": { + "additionalFieldsForm" : "Métadonnées supplémentaires", + "additionalFields" : { + "table" : { + "header" : { + "name" : "Nom", + "creation" : { + "when" : "Date de création" + } + } + } + }, "dialog": { "delete": { "cancel": "Annuler", @@ -476,6 +487,7 @@ "title": "Confirmer suppresion" } }, + "detail" : "Détail", "form": { "closingDate": "Fermeture", "description": {