Skip to content

Commit

Permalink
[wip] feat: implement ui for editing organizations
Browse files Browse the repository at this point in the history
  • Loading branch information
PaddseL committed Jan 13, 2025
1 parent 1c4363c commit 959ea6b
Show file tree
Hide file tree
Showing 14 changed files with 554 additions and 11 deletions.
18 changes: 18 additions & 0 deletions authority-portal-frontend/src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {ActivatedRouteSnapshot, RouterModule, Routes} from '@angular/router';
import {UserRoleDto} from '@sovity.de/authority-portal-client';
import {requiresRole} from './core/services/auth/requires-role-guard';
import {AuthorityConnectorListPageComponent} from './pages/authority-connector-list-page/authority-connector-list-page/authority-connector-list-page.component';
import {AuthorityOrganizationEditPageComponent} from './pages/authority-organization-edit-page/authority-organization-edit-page/authority-organization-edit-page.component';
import {AuthorityOrganizationListPageComponent} from './pages/authority-organization-list-page/authority-organization-list-page/authority-organization-list-page.component';
import {CatalogPageComponent} from './pages/catalog-page/catalog-page/catalog-page.component';
import {CentralComponentListPageComponent} from './pages/central-component-list-page/central-component-list-page/central-component-list-page.component';
Expand Down Expand Up @@ -267,6 +268,23 @@ export const AUTHORITY_PORTAL_ROUTES: Routes = [
},
canActivate: [requiresRole],
},
{
path: 'authority/organizations/:organizationId',
component: AuthorityOrganizationListPageComponent,
data: {
requiresRole: ['AUTHORITY_USER'] satisfies UserRoleDto[],
},
canActivate: [requiresRole],
},
{
path: 'authority/organizations/:organizationId/edit',
component: AuthorityOrganizationEditPageComponent,
data: {
excludeFromTabs: true,
requiresRole: ['AUTHORITY_ADMIN'] satisfies UserRoleDto[],
},
canActivate: [requiresRole],
},
{
path: 'authority/connectors',
component: AuthorityConnectorListPageComponent,
Expand Down
2 changes: 2 additions & 0 deletions authority-portal-frontend/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {provideAppConfig} from './core/services/config/app-config-initializer';
import {AuthorityConnectorDetailPageModule} from './pages/authority-connector-detail-page/authority-connector-detail-page.module';
import {AuthorityConnectorListPageModule} from './pages/authority-connector-list-page/authority-connector-list-page.module';
import {AuthorityOrganizationDetailPageModule} from './pages/authority-organization-detail-page/authority-organization-detail-page.module';
import {AuthorityOrganizationEditPageModule} from './pages/authority-organization-edit-page/authority-organization-edit-page.module';
import {AuthorityOrganizationListPageModule} from './pages/authority-organization-list-page/authority-organization-list-page.module';
import {CatalogPageModule} from './pages/catalog-page/catalog-page.module';
import {CentralComponentListPageModule} from './pages/central-component-list-page/central-component-list-page.module';
Expand Down Expand Up @@ -93,6 +94,7 @@ import {SharedModule} from './shared/shared.module';
AuthorityConnectorListPageModule,
AuthorityOrganizationDetailPageModule,
AuthorityOrganizationListPageModule,
AuthorityOrganizationEditPageModule,
CatalogPageModule,
CentralComponentListPageModule,
ChooseParticipantCaasModule,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
* sovity GmbH - initial implementation
*/
import {Component, Inject, OnDestroy, OnInit} from '@angular/core';
import {Router} from '@angular/router';
import {Subject, distinctUntilChanged, map, takeUntil, tap} from 'rxjs';
import {take} from 'rxjs/operators';
import {Store} from '@ngxs/store';
Expand Down Expand Up @@ -79,6 +80,7 @@ export class AuthorityOrganizationDetailPageComponent
private userDeleteDialogService: UserDeleteDialogService,
private organizationDialogService: OrganizationDeleteDialogService,
private formatService: FormatService,
private router: Router,
) {
this.organizationId = childComponentInput.id;
}
Expand Down Expand Up @@ -222,6 +224,17 @@ export class AuthorityOrganizationDetailPageComponent
},
isDisabled: !['PENDING'].includes(organization.registrationStatus),
},
{
label: 'Edit Organization',
icon: 'edit',
event: () => {
this.store.dispatch(CloseOrganizationDetail);
this.router.navigate([
`/authority/organizations/${organization.id}/edit`,
]);
},
isDisabled: !this.isCurrentUserAuthorityAdmin,
},
{
label: 'Delete Organization',
icon: 'delete',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,3 @@ export interface UserDetailPageConfig {
userId: string;
organizationId: string;
}

export interface UserDetailPageConfig {
userId: string;
organizationId: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2024 sovity GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* sovity GmbH - initial implementation
*/
import {CommonModule} from '@angular/common';
import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import {NgxsModule} from '@ngxs/store';
import {SharedModule} from 'src/app/shared/shared.module';
import {AuthorityOrganizationEditPageComponent} from './authority-organization-edit-page/authority-organization-edit-page.component';
import {AuthorityOrganizationEditPageStateImpl} from './state/authority-organization-edit-page-state-impl';

@NgModule({
declarations: [AuthorityOrganizationEditPageComponent],
imports: [
CommonModule,
RouterModule,

// NGXS
NgxsModule.forFeature([AuthorityOrganizationEditPageStateImpl]),

SharedModule,
],
})
export class AuthorityOrganizationEditPageModule {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<section class="my-4 px-8 flex flex-col">
<app-loading-element
*ngIf="state.organization.isLoading"></app-loading-element>

<app-error-element
*ngIf="state.organization.isError"
errorMessage="organization"></app-error-element>

<app-header
*ngIf="state.headerBarConfig"
[headerConfig]="state.headerBarConfig"></app-header>

<app-organization-edit-form
*ngIf="form"
class="mt-5"
[orgForm]="form.group"></app-organization-edit-form>

<div *ngIf="form" class="flex justify-end gap-4 mt-6">
<a
class="btn-accent"
type="button"
routerLink="/authority/organizations/{{state.organization.data.id}}">
Back
</a>
<button
class="btn-accent"
type="button"
[disabledBtn]="!form.group.valid || state.busy"
(click)="onSubmitClick()">
Update
</button>
</div>
</section>
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Copyright (c) 2024 sovity GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* sovity GmbH - initial implementation
*/
import {Component, OnDestroy, OnInit} from '@angular/core';
import {ActivatedRoute} from '@angular/router';
import {Subject, takeUntil} from 'rxjs';
import {take} from 'rxjs/operators';
import {Store} from '@ngxs/store';
import {
Reset,
SetOrganizationId,
Submit,
} from '../state/authority-organization-edit-page-action';
import {
AuthorityOrganizationEditPageState,
DEFAULT_AUTHORITY_ORGANIZATION_EDIT_PAGE_STATE,
} from '../state/authority-organization-edit-page-state';
import {AuthorityOrganizationEditPageStateImpl} from '../state/authority-organization-edit-page-state-impl';
import {AuthorityOrganizationEditPageForm} from './authority-organization-edit-page.form';

@Component({
selector: 'app-control-center-organization-edit-page',
templateUrl: './authority-organization-edit-page.component.html',
})
export class AuthorityOrganizationEditPageComponent
implements OnInit, OnDestroy
{
form: AuthorityOrganizationEditPageForm | null = null;
state: AuthorityOrganizationEditPageState =
DEFAULT_AUTHORITY_ORGANIZATION_EDIT_PAGE_STATE;

constructor(private store: Store, private activatedRoute: ActivatedRoute) {}

ngOnInit(): void {
this.activatedRoute.params.pipe(take(1)).subscribe((params) => {
this.setOrganizationId(params.organizationId);
this.reset();
this.startListeningToState();
});
}

setOrganizationId(organizationId: string) {
this.store.dispatch(new SetOrganizationId(organizationId));
}

reset(): void {
this.store.dispatch(new Reset((form) => (this.form = form)));
}

startListeningToState(): void {
this.store
.select<AuthorityOrganizationEditPageState>(
AuthorityOrganizationEditPageStateImpl,
)
.pipe(takeUntil(this.ngOnDestroy$))
.subscribe((state) => {
this.state = state;
});
}

ngOnDestroy$ = new Subject();
ngOnDestroy(): void {
this.ngOnDestroy$.next(null);
this.ngOnDestroy$.complete();
}

onSubmitClick(): void {
this.store.dispatch(new Submit(this.form!.value));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* Copyright (c) 2024 sovity GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* sovity GmbH - initial implementation
*/
import {
OrganizationDetailsDto,
UpdateOrganizationDto,
} from '@sovity.de/authority-portal-client';
import {AuthorityOrganizationEditPageFormValue} from './authority-organization-edit-page.form-model';

export function buildFormValue(
organization: OrganizationDetailsDto,
): AuthorityOrganizationEditPageFormValue {
let billingAddressSameAsMain =
organization.mainAddress === organization.billingAddress;
let technicalContactSameAsMain =
organization.mainContactName === organization.techContactName &&
organization.mainContactPhone === organization.techContactPhone &&
organization.mainContactEmail === organization.techContactEmail;

return {
website: organization.url ?? '',
businessUnit: organization.businessUnit ?? '',
industry: organization.industry ?? '',
description: organization.description ?? '',

mainAddress: organization.mainAddress ?? '',
billingAddressSameAsMain,
billingAddress: billingAddressSameAsMain
? ''
: organization.billingAddress ?? '',

mainContactName: organization.mainContactName ?? '',
mainContactPhoneNumber: organization.mainContactPhone ?? '',
mainContactEmail: organization.mainContactEmail ?? '',
technicalContactSameAsMain,
technicalContactName: technicalContactSameAsMain
? ''
: organization.techContactName ?? '',
technicalContactPhoneNumber: technicalContactSameAsMain
? ''
: organization.techContactPhone ?? '',
technicalContactEmail: technicalContactSameAsMain
? ''
: organization.techContactEmail ?? '',
};
}

export function buildEditRequest(
formValue: AuthorityOrganizationEditPageFormValue,
): UpdateOrganizationDto {
return {
url: formValue.website,
businessUnit: formValue.businessUnit,
industry: formValue.industry,
description: formValue.description,

address: formValue.mainAddress,
billingAddress: formValue.billingAddressSameAsMain
? formValue.mainAddress
: formValue.billingAddress,

mainContactName: formValue.mainContactName,
mainContactPhone: formValue.mainContactPhoneNumber,
mainContactEmail: formValue.mainContactEmail,
techContactName: formValue.technicalContactSameAsMain
? formValue.mainContactName
: formValue.technicalContactName,
techContactPhone: formValue.technicalContactSameAsMain
? formValue.mainContactPhoneNumber
: formValue.technicalContactPhoneNumber,
techContactEmail: formValue.technicalContactSameAsMain
? formValue.mainContactEmail
: formValue.technicalContactEmail,
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright (c) 2024 sovity GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* sovity GmbH - initial implementation
*/
import {ɵFormGroupRawValue} from '@angular/forms';
import {OrganizationEditFormModel} from '../../../shared/business/organization-edit-form/organization-edit-form-model';

export interface AuthorityOrganizationEditPageFormModel
extends OrganizationEditFormModel {}

export type AuthorityOrganizationEditPageFormValue =
ɵFormGroupRawValue<AuthorityOrganizationEditPageFormModel>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2024 sovity GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* sovity GmbH - initial implementation
*/
import {FormBuilder, FormGroup} from '@angular/forms';
import {switchDisabledControls} from 'src/app/core/utils/form-utils';
import {buildOrganizationEditForm} from '../../../shared/business/organization-edit-form/organization-edit-form-builder';
import {organizationEditFormEnabledCtrls} from '../../../shared/business/organization-edit-form/organization-edit-form-enabled-ctrls';
import {
AuthorityOrganizationEditPageFormModel,
AuthorityOrganizationEditPageFormValue,
} from './authority-organization-edit-page.form-model';

export class AuthorityOrganizationEditPageForm {
group = this.buildFormGroup();

get value(): AuthorityOrganizationEditPageFormValue {
return this.group.value as AuthorityOrganizationEditPageFormValue;
}

constructor(
private formBuilder: FormBuilder,
private initialFormValue: AuthorityOrganizationEditPageFormValue,
) {}

buildFormGroup(): FormGroup<AuthorityOrganizationEditPageFormModel> {
const group: FormGroup<AuthorityOrganizationEditPageFormModel> =
buildOrganizationEditForm(this.formBuilder, this.initialFormValue);

switchDisabledControls<AuthorityOrganizationEditPageFormValue>(
group,
(value: AuthorityOrganizationEditPageFormValue) =>
organizationEditFormEnabledCtrls(value),
);

return group;
}
}
Loading

0 comments on commit 959ea6b

Please sign in to comment.