From cc1dc115c529c97d1041e283e1e25abee72dd2a5 Mon Sep 17 00:00:00 2001 From: Makhtar DIAGNE <makhtar.diagne@teamvitamui.com> Date: Thu, 19 Mar 2020 01:55:22 +0100 Subject: [PATCH] [TECH] Fix frontend issues --- .../ui/commons/config/UIPropertiesImpl.java | 2 + .../ui/commons/property/UIProperties.java | 2 + .../commons/rest/ApplicationController.java | 1 + .../commons/service/ApplicationService.java | 5 ++ ui/ui-frontend-common/package-lock.json | 43 +++++------------- ui/ui-frontend-common/package.json | 2 +- .../components/navbar/navbar.component.html | 2 +- .../navbar/navbar.component.spec.ts | 2 +- .../src/app/modules/startup.service.ts | 6 +-- .../src/sass/material/_menu.scss | 4 +- .../src/sass/mixins/material/_select.scss | 4 +- .../src/sass/mixins/material/_select.scss.rej | 20 -------- ui/ui-frontend/package-lock.json | 3 +- ui/ui-frontend/package.json | 2 +- ui/ui-frontend/package.json.rej | 10 ---- .../src/app/core/customer.service.spec.ts | 3 +- .../customer-colors-input.component.html | 8 ++-- .../customer-colors-input.component.spec.ts | 16 ++++++- .../customer-create.component.spec.ts | 21 ++++++++- .../customer-create.component.ts | 2 +- .../customer-list.component.spec.ts | 15 ++++-- .../customer-list.service.spec.ts | 12 +++-- .../graphic-identity-tab.component.spec.ts | 6 ++- .../graphic-identity-update.component.spec.ts | 27 +++++++++-- .../information-tab.component.spec.ts | 23 +++++++++- .../sso-tab/sso-tab.component.spec.ts | 3 +- .../customer-resolver.service.spec.ts | 3 +- .../user-information-tab.component.spec.ts | 6 ++- .../config/ui-identity-application-dev.yml | 2 +- .../ui-identity-application-recette.yml | 6 +++ .../src/main/config/vitamui-logo.png | Bin 0 -> 6330 bytes .../main/config/ui-portal-application-dev.yml | 2 +- .../config/ui-portal-application-recette.yml | 6 +++ ui/ui-portal/src/main/config/vitamui-logo.png | Bin 0 -> 6330 bytes 34 files changed, 166 insertions(+), 103 deletions(-) delete mode 100644 ui/ui-frontend-common/src/sass/mixins/material/_select.scss.rej delete mode 100644 ui/ui-frontend/package.json.rej create mode 100644 ui/ui-identity/src/main/config/vitamui-logo.png create mode 100644 ui/ui-portal/src/main/config/vitamui-logo.png diff --git a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/config/UIPropertiesImpl.java b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/config/UIPropertiesImpl.java index 7313abaf..afdfd51b 100644 --- a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/config/UIPropertiesImpl.java +++ b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/config/UIPropertiesImpl.java @@ -36,6 +36,8 @@ */ package fr.gouv.vitamui.ui.commons.config; +import java.util.Map; + import fr.gouv.vitamui.commons.rest.client.configuration.RestClientConfiguration; import fr.gouv.vitamui.ui.commons.property.BaseUrl; import fr.gouv.vitamui.ui.commons.property.UIProperties; diff --git a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/property/UIProperties.java b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/property/UIProperties.java index 5b6d657d..77b7535a 100644 --- a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/property/UIProperties.java +++ b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/property/UIProperties.java @@ -36,6 +36,8 @@ */ package fr.gouv.vitamui.ui.commons.property; +import java.util.Map; + import fr.gouv.vitamui.commons.rest.client.configuration.RestClientConfiguration; public interface UIProperties { diff --git a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/rest/ApplicationController.java b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/rest/ApplicationController.java index 32b19a2a..cc3c92ac 100644 --- a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/rest/ApplicationController.java +++ b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/rest/ApplicationController.java @@ -37,6 +37,7 @@ package fr.gouv.vitamui.ui.commons.rest; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; diff --git a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/service/ApplicationService.java b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/service/ApplicationService.java index ac5488b2..b027d421 100644 --- a/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/service/ApplicationService.java +++ b/ui/ui-commons/src/main/java/fr/gouv/vitamui/ui/commons/service/ApplicationService.java @@ -36,12 +36,17 @@ */ package fr.gouv.vitamui.ui.commons.service; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; import javax.validation.constraints.NotNull; +import javax.xml.bind.DatatypeConverter; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/ui/ui-frontend-common/package-lock.json b/ui/ui-frontend-common/package-lock.json index 10dced66..7aff7214 100644 --- a/ui/ui-frontend-common/package-lock.json +++ b/ui/ui-frontend-common/package-lock.json @@ -1,6 +1,6 @@ { "name": "ui-frontend-common", - "version": "0.0.12", + "version": "0.0.13", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4433,8 +4433,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -4455,14 +4454,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4477,20 +4474,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4607,8 +4601,7 @@ "inherits": { "version": "2.0.4", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -4620,7 +4613,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4635,7 +4627,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4643,14 +4634,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.9.0", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4669,7 +4658,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -4759,8 +4747,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -4772,7 +4759,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -4858,8 +4844,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -4895,7 +4880,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4915,7 +4899,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4959,14 +4942,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, diff --git a/ui/ui-frontend-common/package.json b/ui/ui-frontend-common/package.json index 3a734711..f3a98a6a 100644 --- a/ui/ui-frontend-common/package.json +++ b/ui/ui-frontend-common/package.json @@ -1,6 +1,6 @@ { "name": "ui-frontend-common", - "version": "0.0.12", + "version": "0.0.13", "main": "src/index.ts", "scripts": { "ng": "ng", diff --git a/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.html b/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.html index 9fc9cff8..e29804bb 100644 --- a/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.html +++ b/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.html @@ -1,7 +1,7 @@ <nav class="vitamui-navbar"> <a href="{{portalUrl}}" class="vitamui-navbar-logo"> <img *ngIf="base64Logo" [src]="trustedAppLogoUrl"> - <img *ngIf="!base64Logo" src="../../../../assets/navbar-logo.svg"> + <img *ngIf="!base64Logo" src="../../../../assets/vitamui-logo.png"> </a> <ul class="menu"> diff --git a/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.spec.ts b/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.spec.ts index 73a49c1b..3e62c813 100644 --- a/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.spec.ts +++ b/ui/ui-frontend-common/src/app/modules/components/navbar/navbar.component.spec.ts @@ -108,7 +108,7 @@ describe('NavbarComponent', () => { beforeEach(async(() => { const authServiceStub = { logout: () => { } }; - const startupServiceStub = { getPortalUrl: () => { } }; + const startupServiceStub = { getPortalUrl: () => { }, getLogo: () => { } }; TestBed.configureTestingModule({ imports: [ diff --git a/ui/ui-frontend-common/src/app/modules/startup.service.ts b/ui/ui-frontend-common/src/app/modules/startup.service.ts index cc9c22a0..e1a416ad 100644 --- a/ui/ui-frontend-common/src/app/modules/startup.service.ts +++ b/ui/ui-frontend-common/src/app/modules/startup.service.ts @@ -40,7 +40,6 @@ import { tap } from 'rxjs/operators'; import { Inject, Injectable } from '@angular/core'; import { ApplicationApiService } from './api/application-api.service'; -import { CustomerApiService } from './api/customer-api.service'; import { SecurityApiService } from './api/security-api.service'; import { ApplicationId } from './application-id.enum'; import { ApplicationService } from './application.service'; @@ -48,6 +47,7 @@ import { AuthService } from './auth.service'; import { WINDOW_LOCATION } from './injection-tokens'; import { Logger } from './logger/logger'; import { AppConfiguration, AuthUser } from './models'; +import { getColorFromMaps } from './utils/colors.util'; const WARNING_DURATION = 2000; const DARK_SUFFIX = '-dark'; @@ -88,9 +88,9 @@ export class StartupService { this.authService.logoutRedirectUiUrl = this.configurationData.LOGOUT_REDIRECT_UI_URL; }) .then(() => this.refreshUser().toPromise()) - .then(() => this.applicationApi.getAsset('navbar-logo.svg').toPromise()) + .then(() => this.applicationApi.getAsset('vitamui-logo.png').toPromise()) .then((data: any) => { - this.configurationData.LOGO = data['navbar-logo.svg']; + this.configurationData.LOGO = data['vitamui-logo.png']; }) .then(() => { diff --git a/ui/ui-frontend-common/src/sass/material/_menu.scss b/ui/ui-frontend-common/src/sass/material/_menu.scss index fb5dfb63..18058aed 100644 --- a/ui/ui-frontend-common/src/sass/material/_menu.scss +++ b/ui/ui-frontend-common/src/sass/material/_menu.scss @@ -133,7 +133,7 @@ } .mat-menu-item:hover:not([disabled]):not(.menu-cancel-button) { - background-color: lighten(var(--vitamui-secondary), 10); + background-color: var(--vitamui-secondary-light); } .mat-menu-item[disabled] { @@ -143,7 +143,7 @@ .more-action-divider { height: 10px; width: 100%; - background-color: lighten(var(--vitamui-secondary), 8); + background-color: var(--vitamui-secondary-light-8); + .mat-menu-item { border-top-color: transparent; diff --git a/ui/ui-frontend-common/src/sass/mixins/material/_select.scss b/ui/ui-frontend-common/src/sass/mixins/material/_select.scss index 83fd94e4..9f41d19b 100644 --- a/ui/ui-frontend-common/src/sass/mixins/material/_select.scss +++ b/ui/ui-frontend-common/src/sass/mixins/material/_select.scss @@ -32,12 +32,12 @@ .mat-option.mat-selected:not(.mat-option-multiple) { font-weight: 500; - color: $greeny-blue; + color: var(--vitamui-secondary); &:before { content: 'check'; font-family: 'Material Icons'; - color: $greeny-blue; + color: var(--vitamui-secondary); display: block; position: absolute; left: 10px; diff --git a/ui/ui-frontend-common/src/sass/mixins/material/_select.scss.rej b/ui/ui-frontend-common/src/sass/mixins/material/_select.scss.rej deleted file mode 100644 index 05c6efaa..00000000 --- a/ui/ui-frontend-common/src/sass/mixins/material/_select.scss.rej +++ /dev/null @@ -1,20 +0,0 @@ -diff a/ui/ui-frontend-common/src/sass/mixins/material/_select.scss b/ui/ui-frontend-common/src/sass/mixins/material/_select.scss (rejected hunks) -@@ -29,15 +29,15 @@ - .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-active):not(:hover) { - background: none; - } -- -+ - .mat-option.mat-selected:not(.mat-option-multiple) { - font-weight: 500; -- color: $greeny-blue; -+ color: var(--vitamui-secondary); - - &:before { - content: 'check'; - font-family: 'Material Icons'; -- color: $greeny-blue; -+ color: var(--vitamui-secondary); - display: block; - position: absolute; - left: 10px; diff --git a/ui/ui-frontend/package-lock.json b/ui/ui-frontend/package-lock.json index be675288..3625e90a 100644 --- a/ui/ui-frontend/package-lock.json +++ b/ui/ui-frontend/package-lock.json @@ -10445,7 +10445,8 @@ } }, "ui-frontend-common": { - "version": "file:../ui-frontend-common/ui-frontend-common-0.0.2.tgz", + "version": "file:../ui-frontend-common/ui-frontend-common-0.0.13.tgz", + "integrity": "sha512-bQ+YHuLIiBFR5E4BlWC+e/Jz+8nisnuUHlJVB2kVNSvrxMgqH5cFh4WRL1rdaU/DXcNcS/0nHK7uoRCKDWbcmQ==", "requires": { "@angular/animations": "8.0.0", "@angular/cdk": "^8.0.0", diff --git a/ui/ui-frontend/package.json b/ui/ui-frontend/package.json index 71bd508f..3d1914de 100644 --- a/ui/ui-frontend/package.json +++ b/ui/ui-frontend/package.json @@ -59,7 +59,7 @@ "moment": "^2.24.0", "rxjs": "^6.5.2", "tslib": "^1.9.0", - "ui-frontend-common": "file:../ui-frontend-common/ui-frontend-common-0.0.2.tgz", + "ui-frontend-common": "file:../ui-frontend-common/ui-frontend-common-0.0.13.tgz", "underscore": "^1.9.1", "web-animations-js": "^2.3.2", "zone.js": "~0.9.1" diff --git a/ui/ui-frontend/package.json.rej b/ui/ui-frontend/package.json.rej deleted file mode 100644 index d3db92f4..00000000 --- a/ui/ui-frontend/package.json.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/ui/ui-frontend/package.json b/ui/ui-frontend/package.json (rejected hunks) -@@ -59,7 +59,7 @@ - "moment": "^2.24.0", - "rxjs": "^6.5.2", - "tslib": "^1.9.0", -- "ui-frontend-common": "file:../ui-frontend-common/ui-frontend-common-0.0.25.tgz", -+ "ui-frontend-common": "file:../ui-frontend-common/ui-frontend-common-0.0.26.tgz", - "underscore": "^1.9.1", - "web-animations-js": "github:angular/web-animations-js#release_pr208", - "zone.js": "~0.9.1" diff --git a/ui/ui-frontend/projects/identity/src/app/core/customer.service.spec.ts b/ui/ui-frontend/projects/identity/src/app/core/customer.service.spec.ts index 345f2a87..3307e800 100644 --- a/ui/ui-frontend/projects/identity/src/app/core/customer.service.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/core/customer.service.spec.ts @@ -192,5 +192,6 @@ const expectedCustomer: Customer = { country: 'FR', }, readonly: false - }] + }], + themeColors: new Map<string, string>() }; diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.html b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.html index 094c8639..36006205 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.html +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.html @@ -1,11 +1,11 @@ <!-- TODO: Add specific colors --> <div class="d-flex" [formGroup]="colorForm"> - <openvitamui-common-input class="field-color-name" formControlName="colorName" maxlength="100" + <vitamui-common-input class="field-color-name" formControlName="colorName" maxlength="100" placeholder="Identifiant de Couleur" i18n-placeholder="Customer color name input placeholder@@customerCreateColorNamePlaceholder"> - </openvitamui-common-input> - <openvitamui-common-input class="field-color-value" formControlName="colorValue" maxlength="7" + </vitamui-common-input> + <vitamui-common-input class="field-color-value" formControlName="colorValue" maxlength="7" placeholder="Couleur RGB" i18n-placeholder="Customer color value input placeholder@@customerCreateColorValuePlaceholder"> - </openvitamui-common-input> + </vitamui-common-input> <button type="button" class="btn secondary" (click)="add()" [disabled]="buttonAddDisabled()" i18n="color input add button@@colorsInputAddButton">Ajouter</button> </div> <div class="vitamui-input-errors"> diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.spec.ts index 9dcc8372..d3423770 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-colors-input/customer-colors-input.component.spec.ts @@ -1,5 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { InjectorModule, LoggerModule } from 'ui-frontend-common'; +import { VitamUICommonTestModule } from 'ui-frontend-common/testing'; import { CustomerColorsInputComponent } from './customer-colors-input.component'; describe('CustomerColorsInputComponent', () => { @@ -8,9 +12,19 @@ describe('CustomerColorsInputComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ CustomerColorsInputComponent ] + imports: [ + ReactiveFormsModule, + HttpClientTestingModule, + VitamUICommonTestModule, + InjectorModule, + LoggerModule.forRoot(), + ], + declarations: [CustomerColorsInputComponent], + providers: [ + ] }) .compileComponents(); + })); beforeEach(() => { diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.spec.ts index 500901e9..c18726b7 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.spec.ts @@ -74,6 +74,23 @@ class OwnerFormStubComponent implements ControlValueAccessor { registerOnTouched() {} } +@Component({ + selector: 'app-customer-colors-input', + template: '', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CustomerColorsInputStubComponent), + multi: true, + }] +}) +class CustomerColorsInputStubComponent implements ControlValueAccessor { + @Input() placeholder: string; + @Input() spinnerDiameter = 25; + writeValue() {} + registerOnChange() {} + registerOnTouched() {} +} + const expectedCustomer = { enabled: true, code: '424242', @@ -101,7 +118,8 @@ const expectedCustomer = { city: 'Paris', country: 'FR', } - }] + }], + themeColors: new Map<string, string>() }; let component: CustomerCreateComponent; @@ -143,6 +161,7 @@ describe('CustomerCreateComponent', () => { declarations: [ CustomerCreateComponent, OwnerFormStubComponent, + CustomerColorsInputStubComponent, ], providers: [ { provide: MatDialogRef, useValue: matDialogRefSpy }, diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.ts index d4f22422..c916be38 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-create/customer-create.component.ts @@ -35,7 +35,7 @@ * knowledge of the CeCILL-C license and that you accept its terms. */ import { merge, Subscription } from 'rxjs'; -import { ConfirmDialogService, OtpState } from 'ui-frontend-common'; +import { ConfirmDialogService, Customer, OtpState } from 'ui-frontend-common'; import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.component.spec.ts index d86ea33e..965cbd43 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.component.spec.ts @@ -113,7 +113,8 @@ describe('CustomerListComponent', () => { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }, { id: '12', @@ -138,7 +139,8 @@ describe('CustomerListComponent', () => { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }, { id: '13', @@ -163,7 +165,8 @@ describe('CustomerListComponent', () => { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }, { id: '14', @@ -188,7 +191,8 @@ describe('CustomerListComponent', () => { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }, { id: '15', @@ -213,7 +217,8 @@ describe('CustomerListComponent', () => { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }, ]; diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.service.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.service.spec.ts index 27ac5a89..fe71ecde 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.service.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-list/customer-list.service.spec.ts @@ -98,7 +98,8 @@ const expectedCustomersPage: { values: Customer[], pageNum: number, pageSize: nu zipCode: '75009', city: 'Paris', country: 'France' - } + }, + themeColors: new Map<string, string>() }, { id: '5acc6bd8b75bfb2e46aeec41e0973280907b4bc7a918b07df78df36f501b3ba5', @@ -153,7 +154,8 @@ const expectedCustomersPage: { values: Customer[], pageNum: number, pageSize: nu zipCode: '75008', city: 'Paris', country: 'France' - } + }, + themeColors: new Map<string, string>() }, ], pageNum: 0, @@ -216,7 +218,8 @@ const customersPage: { values: Customer[], pageNum: number, pageSize: number, ha zipCode: '75009', city: 'Paris', country: 'France' - } + }, + themeColors: new Map<string, string>() }, { id: '5acc6bd8b75bfb2e46aeec41e0973280907b4bc7a918b07df78df36f501b3ba5', @@ -271,7 +274,8 @@ const customersPage: { values: Customer[], pageNum: number, pageSize: number, ha zipCode: '75008', city: 'Paris', country: 'France' - } + }, + themeColors: new Map<string, string>() }, ], pageNum: 0, diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-tab.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-tab.component.spec.ts index 141d1fb1..affccd62 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-tab.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-tab.component.spec.ts @@ -82,7 +82,8 @@ let expectedCustomer: Customer = { }, customerId: 'idCustomer', readonly: false - }] + }], + themeColors: new Map<string, string>() }; @Component({ @@ -142,7 +143,8 @@ describe('GraphicIdentityTabComponent', () => { }, customerId: 'idCustomer', readonly: false - }] + }], + themeColors: new Map<string, string>() }; const snackBarSpy = jasmine.createSpyObj('VitamUISnackBar', ['open', 'openFromComponent']); diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-update/graphic-identity-update.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-update/graphic-identity-update.component.spec.ts index 06bd2c39..7226113d 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-update/graphic-identity-update.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/graphic-identity-tab/graphic-identity-update/graphic-identity-update.component.spec.ts @@ -35,7 +35,9 @@ * knowledge of the CeCILL-C license and that you accept its terms. */ import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { forwardRef, Input } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { ENVIRONMENT } from 'ui-frontend-common'; @@ -43,6 +45,7 @@ import { BASE_URL, Customer, InjectorModule, LoggerModule, OtpState } from 'ui-f import { VitamUICommonTestModule } from 'ui-frontend-common/testing'; import { environment } from './../../../../../environments/environment'; +import { Component } from '@angular/core'; import { VitamUISnackBar } from '../../../../shared/vitamui-snack-bar'; import { GraphicIdentityUpdateComponent } from './graphic-identity-update.component'; @@ -83,9 +86,27 @@ const expectedCustomer: Customer = { }, customerId: 'idCustomer', readonly: false - }] + }], + themeColors: new Map<string, string>() }; +@Component({ + selector: 'app-customer-colors-input', + template: '', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CustomerColorsInputStubComponent), + multi: true, + }] +}) +class CustomerColorsInputStubComponent implements ControlValueAccessor { + @Input() placeholder: string; + @Input() spinnerDiameter = 25; + writeValue() {} + registerOnChange() {} + registerOnTouched() {} +} + describe('GraphicIdentityUpdateComponent', () => { let component: GraphicIdentityUpdateComponent; let fixture: ComponentFixture<GraphicIdentityUpdateComponent>; @@ -99,9 +120,9 @@ describe('GraphicIdentityUpdateComponent', () => { HttpClientTestingModule, VitamUICommonTestModule, InjectorModule, - LoggerModule.forRoot() + LoggerModule.forRoot(), ], - declarations: [GraphicIdentityUpdateComponent], + declarations: [CustomerColorsInputStubComponent, GraphicIdentityUpdateComponent], providers: [ { provide: MatDialogRef, useValue: matDialogRefSpy }, { provide: MAT_DIALOG_DATA, useValue: { customer: expectedCustomer, logo: null } }, diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/information-tab/information-tab.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/information-tab/information-tab.component.spec.ts index df85bfd2..2e638913 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/information-tab/information-tab.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/information-tab/information-tab.component.spec.ts @@ -70,7 +70,8 @@ let expectedCustomer: Customer = { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }; @Component({ @@ -91,6 +92,22 @@ class EditableDomainInputStubComponent implements ControlValueAccessor { registerOnChange() {} registerOnTouched() {} } +@Component({ + selector: 'app-customer-colors-input', + template: '', + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CustomerColorsInputStubComponent), + multi: true, + }] +}) +class CustomerColorsInputStubComponent implements ControlValueAccessor { + @Input() placeholder: string; + @Input() spinnerDiameter = 25; + writeValue() {} + registerOnChange() {} + registerOnTouched() {} +} @Component({ template: `<app-information-tab [customer]="customer" [readOnly]="readOnly"></app-information-tab>` @@ -130,7 +147,8 @@ describe('Customer InformationTabComponent', () => { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }; const customerServiceSpy = jasmine.createSpyObj('CustomerService', { patch: of({}) }); const customerCreateValidatorsSpy = jasmine.createSpyObj( @@ -148,6 +166,7 @@ describe('Customer InformationTabComponent', () => { InformationTabComponent, TestHostComponent, EditableDomainInputStubComponent, + CustomerColorsInputStubComponent, ], providers: [ { provide: CustomerService, useValue: customerServiceSpy }, diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/sso-tab/sso-tab.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/sso-tab/sso-tab.component.spec.ts index 575f682f..ef51923d 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/sso-tab/sso-tab.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-preview/sso-tab/sso-tab.component.spec.ts @@ -91,7 +91,8 @@ class TestHostComponent { city : 'Paris', country : 'DK' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }; @ViewChild(SsoTabComponent, { static: false }) component: SsoTabComponent; } diff --git a/ui/ui-frontend/projects/identity/src/app/customer/customer-resolver.service.spec.ts b/ui/ui-frontend/projects/identity/src/app/customer/customer-resolver.service.spec.ts index 846a5acc..d83e430b 100644 --- a/ui/ui-frontend/projects/identity/src/app/customer/customer-resolver.service.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/customer/customer-resolver.service.spec.ts @@ -67,7 +67,8 @@ const expectedCustomer: Customer = { city: 'paris', country: 'france' }, - owners: [] + owners: [], + themeColors: new Map<string, string>() }; describe('CustomerResolver', () => { diff --git a/ui/ui-frontend/projects/identity/src/app/user/user-preview/user-information-tab/user-information-tab.component.spec.ts b/ui/ui-frontend/projects/identity/src/app/user/user-preview/user-information-tab/user-information-tab.component.spec.ts index 063e1862..cd55d7bf 100644 --- a/ui/ui-frontend/projects/identity/src/app/user/user-preview/user-information-tab/user-information-tab.component.spec.ts +++ b/ui/ui-frontend/projects/identity/src/app/user/user-preview/user-information-tab/user-information-tab.component.spec.ts @@ -114,7 +114,8 @@ let expectedCustomer: Customer = { }, customerId: 'idCustomer', readonly : false - }] + }], + themeColors: new Map<string, string>() }; let expectedUserInfo: AdminUserProfile = { @@ -220,7 +221,8 @@ describe('UserInfoTabComponent', () => { }, customerId: 'idCustomer', readonly : false - }] + }], + themeColors: new Map<string, string>() }; expectedUserInfo = { multifactorAllowed: true, diff --git a/ui/ui-identity/src/main/config/ui-identity-application-dev.yml b/ui/ui-identity/src/main/config/ui-identity-application-dev.yml index bbb2e529..69d8d993 100644 --- a/ui/ui-identity/src/main/config/ui-identity-application-dev.yml +++ b/ui/ui-identity/src/main/config/ui-identity-application-dev.yml @@ -15,7 +15,7 @@ ui-identity: vitamui-primary-light: "#992fb1" vitamui-primary-light-20: "#ba52d1" vitamui-secondary: "#7FA1D4" - assets: /vitamui/assets/ui-identity + assets: src/main/config iam-external-client: server-host: localhost server-port: 8083 diff --git a/ui/ui-identity/src/main/config/ui-identity-application-recette.yml b/ui/ui-identity/src/main/config/ui-identity-application-recette.yml index ebe706b2..aedc74b8 100644 --- a/ui/ui-identity/src/main/config/ui-identity-application-recette.yml +++ b/ui/ui-identity/src/main/config/ui-identity-application-recette.yml @@ -10,6 +10,12 @@ spring: register: false ui-identity: + theme-colors: + vitamui-primary: "#702382" + vitamui-primary-light: "#992fb1" + vitamui-primary-light-20: "#ba52d1" + vitamui-secondary: "#7FA1D4" + assets: src/main/config iam-external-client: server-host: localhost server-port: 8083 diff --git a/ui/ui-identity/src/main/config/vitamui-logo.png b/ui/ui-identity/src/main/config/vitamui-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5fccc526e489c1e1b41fa6a4a6c5eb24a8012435 GIT binary patch literal 6330 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 literal 0 HcmV?d00001 diff --git a/ui/ui-portal/src/main/config/ui-portal-application-dev.yml b/ui/ui-portal/src/main/config/ui-portal-application-dev.yml index 80d4ac1d..1e10c574 100644 --- a/ui/ui-portal/src/main/config/ui-portal-application-dev.yml +++ b/ui/ui-portal/src/main/config/ui-portal-application-dev.yml @@ -30,7 +30,7 @@ ui-portal: vitamui-primary-light: "#992fb1" vitamui-primary-light-20: "#ba52d1" vitamui-secondary: "#7FA1D4" - assets: /vitamui/assets/ui-portal + assets: src/main/config iam-external-client: server-host: localhost server-port: 8083 diff --git a/ui/ui-portal/src/main/config/ui-portal-application-recette.yml b/ui/ui-portal/src/main/config/ui-portal-application-recette.yml index 98619d32..fd49621f 100644 --- a/ui/ui-portal/src/main/config/ui-portal-application-recette.yml +++ b/ui/ui-portal/src/main/config/ui-portal-application-recette.yml @@ -25,6 +25,12 @@ management: enabled: false ui-portal: + theme-colors: + vitamui-primary: "#702382" + vitamui-primary-light: "#992fb1" + vitamui-primary-light-20: "#ba52d1" + vitamui-secondary: "#7FA1D4" + assets: src/main/config iam-external-client: server-host: localhost server-port: 8083 diff --git a/ui/ui-portal/src/main/config/vitamui-logo.png b/ui/ui-portal/src/main/config/vitamui-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5fccc526e489c1e1b41fa6a4a6c5eb24a8012435 GIT binary patch literal 6330 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 literal 0 HcmV?d00001 -- GitLab