From e44fbf81108ab234026b01053ae04cb9bfba7fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Silke=20Gr=C3=BCber?= <57660644+SGrueber@users.noreply.github.com> Date: Thu, 8 Oct 2020 13:24:40 +0200 Subject: [PATCH] fix: display and edit the b2b user's active status in the organization management of the myAccount (#397) --- .../user-profile-form/user-profile-form.component.html | 8 +++++--- .../user-profile-form.component.spec.ts | 3 +++ .../src/app/models/b2b-user/b2b-user.interface.ts | 10 +++++----- .../src/app/models/b2b-user/b2b-user.mapper.spec.ts | 9 +++++---- .../src/app/models/b2b-user/b2b-user.mapper.ts | 10 +++++----- .../src/app/models/b2b-user/b2b-user.model.ts | 1 + .../user-create/user-create-page.component.spec.ts | 1 + .../pages/user-create/user-create-page.component.ts | 2 ++ .../pages/user-detail/user-detail-page.component.html | 3 +++ .../user-edit-profile-page.component.spec.ts | 1 + .../user-edit-profile-page.component.ts | 2 ++ .../src/app/pages/users/users-page.component.html | 5 ++++- src/assets/i18n/de_DE.json | 2 ++ src/assets/i18n/en_US.json | 2 ++ src/assets/i18n/fr_FR.json | 2 ++ 15 files changed, 43 insertions(+), 18 deletions(-) diff --git a/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.html b/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.html index d855a091b9..faa370ef0b 100644 --- a/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.html +++ b/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.html @@ -19,9 +19,13 @@ required: 'account.user.new.lastname.error.required' }" > +
+ +
-
+
-
-
diff --git a/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.spec.ts b/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.spec.ts index 6a41cddcce..5e24a2940f 100644 --- a/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.spec.ts +++ b/projects/organization-management/src/app/components/user-profile-form/user-profile-form.component.spec.ts @@ -9,6 +9,7 @@ import { instance, mock, when } from 'ts-mockito'; import { AppFacade } from 'ish-core/facades/app.facade'; import { Locale } from 'ish-core/models/locale/locale.model'; import { ErrorMessageComponent } from 'ish-shared/components/common/error-message/error-message.component'; +import { CheckboxComponent } from 'ish-shared/forms/components/checkbox/checkbox.component'; import { InputComponent } from 'ish-shared/forms/components/input/input.component'; import { SelectTitleComponent } from 'ish-shared/forms/components/select-title/select-title.component'; import { SpecialValidators } from 'ish-shared/forms/validators/special-validators'; @@ -28,6 +29,7 @@ describe('User Profile Form Component', () => { await TestBed.configureTestingModule({ imports: [ReactiveFormsModule, RouterTestingModule, TranslateModule.forRoot()], declarations: [ + MockComponent(CheckboxComponent), MockComponent(ErrorMessageComponent), MockComponent(InputComponent), MockComponent(SelectTitleComponent), @@ -61,5 +63,6 @@ describe('User Profile Form Component', () => { expect(element.querySelector('[controlname=firstName]')).toBeTruthy(); expect(element.querySelector('[controlname=lastName]')).toBeTruthy(); expect(element.querySelector('[controlname=phone]')).toBeTruthy(); + expect(element.querySelector('[controlname=active]')).toBeTruthy(); }); }); diff --git a/projects/organization-management/src/app/models/b2b-user/b2b-user.interface.ts b/projects/organization-management/src/app/models/b2b-user/b2b-user.interface.ts index 34f737a358..3be3d2efcd 100644 --- a/projects/organization-management/src/app/models/b2b-user/b2b-user.interface.ts +++ b/projects/organization-management/src/app/models/b2b-user/b2b-user.interface.ts @@ -1,6 +1,6 @@ -import { Attribute } from 'ish-core/models/attribute/attribute.model'; +import { Link } from 'ish-core/models/link/link.model'; +import { UserData } from 'ish-core/models/user/user.interface'; -export interface B2bUserData { - login: string; - attributes: Attribute[]; -} +export type B2bUserData = UserData & { active: boolean }; + +export type B2bUserDataLink = Link & { login: string }; diff --git a/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.spec.ts b/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.spec.ts index 789609403b..000837fccb 100644 --- a/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.spec.ts +++ b/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.spec.ts @@ -1,9 +1,8 @@ import { Address } from 'ish-core/models/address/address.model'; import { PaymentInstrument } from 'ish-core/models/payment-instrument/payment-instrument.model'; -import { UserData } from 'ish-core/models/user/user.interface'; import { BasketMockData } from 'ish-core/utils/dev/basket-mock-data'; -import { B2bUserData } from './b2b-user.interface'; +import { B2bUserData, B2bUserDataLink } from './b2b-user.interface'; import { B2bUserMapper } from './b2b-user.mapper'; describe('B2b User Mapper', () => { @@ -15,11 +14,13 @@ describe('B2b User Mapper', () => { preferredInvoiceToAddress: BasketMockData.getAddress(), preferredShipToAddress: { urn: 'urn:1234' } as Address, preferredPaymentInstrument: { id: '1234' } as PaymentInstrument, - } as UserData; + active: true, + } as B2bUserData; const user = B2bUserMapper.fromData(userData); expect(user).toMatchInlineSnapshot(` Object { + "active": true, "birthday": undefined, "businessPartnerNo": undefined, "department": undefined, @@ -54,7 +55,7 @@ describe('B2b User Mapper', () => { { name: 'firstName', value: 'Patricia' }, { name: 'lastName', value: 'Miller' }, ], - } as B2bUserData, + } as B2bUserDataLink, ]; const users = B2bUserMapper.fromListData(userListData); diff --git a/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.ts b/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.ts index b67ff9bb1b..181f1a2d1c 100644 --- a/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.ts +++ b/projects/organization-management/src/app/models/b2b-user/b2b-user.mapper.ts @@ -1,22 +1,22 @@ import { AttributeHelper } from 'ish-core/models/attribute/attribute.helper'; -import { UserData } from 'ish-core/models/user/user.interface'; import { UserMapper } from 'ish-core/models/user/user.mapper'; -import { B2bUserData } from './b2b-user.interface'; +import { B2bUserData, B2bUserDataLink } from './b2b-user.interface'; import { B2bUser } from './b2b-user.model'; export class B2bUserMapper { - static fromData(user: UserData): B2bUser { - return UserMapper.fromData(user); + static fromData(user: B2bUserData): B2bUser { + return { ...UserMapper.fromData(user), active: user.active }; } - static fromListData(data: B2bUserData[]): B2bUser[] { + static fromListData(data: B2bUserDataLink[]): B2bUser[] { if (data) { return data.map(e => ({ login: e.login, firstName: AttributeHelper.getAttributeValueByAttributeName(e.attributes, 'firstName'), lastName: AttributeHelper.getAttributeValueByAttributeName(e.attributes, 'lastName'), roleIDs: AttributeHelper.getAttributeValueByAttributeName(e.attributes, 'roleIDs'), + // ToDo: #IS-31051: map the active flag })); } else { throw new Error('data is required'); diff --git a/projects/organization-management/src/app/models/b2b-user/b2b-user.model.ts b/projects/organization-management/src/app/models/b2b-user/b2b-user.model.ts index 0b47075fd7..e45da7ec27 100644 --- a/projects/organization-management/src/app/models/b2b-user/b2b-user.model.ts +++ b/projects/organization-management/src/app/models/b2b-user/b2b-user.model.ts @@ -2,4 +2,5 @@ import { User } from 'ish-core/models/user/user.model'; export interface B2bUser extends Partial { roleIDs?: string[]; + active?: boolean; } diff --git a/projects/organization-management/src/app/pages/user-create/user-create-page.component.spec.ts b/projects/organization-management/src/app/pages/user-create/user-create-page.component.spec.ts index fa62ce0e4e..999c696342 100644 --- a/projects/organization-management/src/app/pages/user-create/user-create-page.component.spec.ts +++ b/projects/organization-management/src/app/pages/user-create/user-create-page.component.spec.ts @@ -57,6 +57,7 @@ describe('User Create Page Component', () => { lastName: ['Boldner', [Validators.required]], email: ['test@gmail.com', [Validators.required, SpecialValidators.email]], preferredLanguage: ['en_US', [Validators.required]], + active: [true], }), }); diff --git a/projects/organization-management/src/app/pages/user-create/user-create-page.component.ts b/projects/organization-management/src/app/pages/user-create/user-create-page.component.ts index 0caee415ca..cae5c2b919 100644 --- a/projects/organization-management/src/app/pages/user-create/user-create-page.component.ts +++ b/projects/organization-management/src/app/pages/user-create/user-create-page.component.ts @@ -25,6 +25,7 @@ export class UserCreatePageComponent implements OnInit { firstName: ['', [Validators.required]], lastName: ['', [Validators.required]], email: ['', [Validators.required, SpecialValidators.email]], + active: [true], phone: [''], birthday: [''], preferredLanguage: ['en_US', [Validators.required]], @@ -59,6 +60,7 @@ export class UserCreatePageComponent implements OnInit { firstName: formValue.profile.firstName, lastName: formValue.profile.lastName, email: formValue.profile.email, + active: formValue.profile.active, phoneHome: formValue.profile.phone, birthday: formValue.profile.birthday === '' ? undefined : formValue.birthday, // TODO: see IS-22276 preferredLanguage: formValue.profile.preferredLanguage, diff --git a/projects/organization-management/src/app/pages/user-detail/user-detail-page.component.html b/projects/organization-management/src/app/pages/user-detail/user-detail-page.component.html index 514b34ccdc..724b8e55e5 100644 --- a/projects/organization-management/src/app/pages/user-detail/user-detail-page.component.html +++ b/projects/organization-management/src/app/pages/user-detail/user-detail-page.component.html @@ -12,6 +12,9 @@

{{ 'account.user.details.profile.heading' | translate }}

{{ 'account.user.details.profile.name' | translate }}
{{ user.title }} {{ user.firstName }} {{ user.lastName }} + {{ + 'account.user.list.status.inactive' | translate + }}
{{ 'account.user.details.profile.email' | translate }}
{{ user.email }}
diff --git a/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.spec.ts b/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.spec.ts index 0ef49c3a81..a00062c808 100644 --- a/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.spec.ts +++ b/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.spec.ts @@ -57,6 +57,7 @@ describe('User Edit Profile Page Component', () => { title: [component.user.title, [Validators.required]], firstName: [component.user.firstName, [Validators.required]], lastName: [component.user.lastName, [Validators.required]], + active: [true], preferredLanguage: [component.user.preferredLanguage, [Validators.required]], }), }); diff --git a/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.ts b/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.ts index eb294a02cb..928f74c074 100644 --- a/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.ts +++ b/projects/organization-management/src/app/pages/user-edit-profile/user-edit-profile-page.component.ts @@ -50,6 +50,7 @@ export class UserEditProfilePageComponent implements OnInit, OnDestroy { title: [userProfile.title ? userProfile.title : ''], firstName: [userProfile.firstName, [Validators.required]], lastName: [userProfile.lastName, [Validators.required]], + active: [userProfile.active], phone: [userProfile.phoneHome], }); } @@ -67,6 +68,7 @@ export class UserEditProfilePageComponent implements OnInit, OnDestroy { title: formValue.title, firstName: formValue.firstName, lastName: formValue.lastName, + active: formValue.active, phoneHome: formValue.phone, }; this.organizationManagementFacade.updateUser(user); diff --git a/projects/organization-management/src/app/pages/users/users-page.component.html b/projects/organization-management/src/app/pages/users/users-page.component.html index a099717ad9..1319644562 100644 --- a/projects/organization-management/src/app/pages/users/users-page.component.html +++ b/projects/organization-management/src/app/pages/users/users-page.component.html @@ -12,7 +12,10 @@

- {{ user.firstName }} {{ user.lastName }} + {{ user.firstName }} {{ user.lastName }} + {{ + 'account.user.list.status.inactive' | translate + }}
diff --git a/src/assets/i18n/de_DE.json b/src/assets/i18n/de_DE.json index e2be2e9639..8ac8b50a0a 100644 --- a/src/assets/i18n/de_DE.json +++ b/src/assets/i18n/de_DE.json @@ -407,6 +407,7 @@ "account.update_profile.phone.error.maxlength": "Die Telefonnummer darf nicht länger als 20 Zeichen sein.", "account.update_profile.phone.label": "Telefon", "account.update_profile.text": "Sie können Ihr persönliches Profil im Folgenden aktualisieren.", + "account.user.active.label": "Aktiv", "account.user.breadcrumbs.new_user.text": "Neuer Benutzer", "account.user.delete_user.confirmation": "Der Benutzer wurde gelöscht.", "account.user.delete_user_dialog.are_you_sure_paragraph": "Wollen Sie diesen Benutzer wirklich entfernen?", @@ -425,6 +426,7 @@ "account.user.email.invalid.error": "Bitte geben Sie eine gültige E-Mail-Adresse an.", "account.user.email.label": "E-Mail", "account.user.list.link.add_user": "Benutzer hinzufügen", + "account.user.list.status.inactive": "(Inaktiv)", "account.user.login.error.required": "Bitte geben Sie einen Anmeldenamen an.", "account.user.login.invalid.error": "Bitte geben Sie einen gültigen Anmeldenamen an.", "account.user.new.Budget.error.valid": "Geben Sie einen gültigen Geldbetrag ein (Budget).", diff --git a/src/assets/i18n/en_US.json b/src/assets/i18n/en_US.json index 42b6bc14a4..1b8f09664f 100644 --- a/src/assets/i18n/en_US.json +++ b/src/assets/i18n/en_US.json @@ -407,6 +407,7 @@ "account.update_profile.phone.error.maxlength": "The phone number must not exceed 20 characters.", "account.update_profile.phone.label": "Phone", "account.update_profile.text": "You can update your personal profile information below.", + "account.user.active.label": "Active", "account.user.breadcrumbs.new_user.text": "New User", "account.user.delete_user.confirmation": "The user has been deleted.", "account.user.delete_user_dialog.are_you_sure_paragraph": "Do you really want to delete this user?", @@ -425,6 +426,7 @@ "account.user.email.invalid.error": "Please enter a valid e-mail address.", "account.user.email.label": "E-mail", "account.user.list.link.add_user": "Add User", + "account.user.list.status.inactive": "(Inactive)", "account.user.login.error.required": "Please enter a login.", "account.user.login.invalid.error": "Please enter a valid login.", "account.user.new.Budget.error.valid": "Please enter a valid money value (budget).", diff --git a/src/assets/i18n/fr_FR.json b/src/assets/i18n/fr_FR.json index fece8550b7..d4964c24b0 100644 --- a/src/assets/i18n/fr_FR.json +++ b/src/assets/i18n/fr_FR.json @@ -407,6 +407,7 @@ "account.update_profile.phone.error.maxlength": "Le numéro de téléphone ne doit pas dépasser 20 caractères.", "account.update_profile.phone.label": "Téléphone", "account.update_profile.text": "Vous pouvez mettre à jour les informations de votre profil personnel ci-dessous.", + "account.user.active.label": "Actif", "account.user.breadcrumbs.new_user.text": "Nouvel utilisateur", "account.user.delete_user.confirmation": "L’utilisateur a été supprimé.", "account.user.delete_user_dialog.are_you_sure_paragraph": "Voulez-vous vraiment supprimer cet utilisateur?", @@ -425,6 +426,7 @@ "account.user.email.invalid.error": "Veuillez entrer une adresse courriel valide.", "account.user.email.label": "Courriel", "account.user.list.link.add_user": "Ajouter un utilisateur", + "account.user.list.status.inactive": "(Inactif)", "account.user.login.error.required": "Veuillez entrer un nom d’utilisateur.", "account.user.login.invalid.error": "Veuillez entrer un nom d’utilisateur valide.", "account.user.new.Budget.error.valid": "Veuillez entrer une valeur monétaire valide (budget).",