From 079cca5f918bb884a0fd1d4848542187bbf675ca Mon Sep 17 00:00:00 2001 From: Steven Zou Date: Tue, 14 Mar 2017 18:01:18 +0800 Subject: [PATCH] merge latest ui code to fix block issues --- .../account-settings-modal.component.ts | 2 +- .../password/password-setting.component.ts | 2 +- .../password/password-setting.service.ts | 18 ++++-- .../password/reset-password.component.ts | 6 +- .../account/sign-in/sign-in.component.html | 4 +- .../app/account/sign-in/sign-in.component.ts | 20 +++++- .../app/account/sign-up/sign-up.component.ts | 11 +++- src/ui_ng/src/app/app-config.service.ts | 41 ++++++++++++ src/ui_ng/src/app/app-config.ts | 20 ++++++ src/ui_ng/src/app/app.module.ts | 15 +++-- .../base/navigator/navigator.component.css | 9 +++ .../base/navigator/navigator.component.html | 11 +++- .../app/base/navigator/navigator.component.ts | 46 +++++++++++--- .../config/auth/config-auth.component.html | 5 +- .../app/config/auth/config-auth.component.ts | 2 +- .../src/app/config/config.component.html | 2 + src/ui_ng/src/app/config/config.component.ts | 63 ++++++++++++++++++- src/ui_ng/src/app/config/config.service.ts | 16 +++++ .../config/email/config-email.component.html | 2 - src/ui_ng/src/app/harbor-routing.module.ts | 33 +++++----- src/ui_ng/src/app/log/audit-log.component.ts | 2 +- .../src/app/project/project.component.ts | 2 +- .../app/repository/mock-verfied-signature.ts | 10 --- .../src/app/repository/repository.service.ts | 36 +++++------ .../tag-repository.component.html | 2 +- .../tag-repository.component.ts | 49 ++++++++++----- src/ui_ng/src/app/user/user.component.html | 2 +- src/ui_ng/src/index.html | 13 ++-- src/ui_ng/src/ng/i18n/lang/en-lang.json | 12 +++- src/ui_ng/src/ng/i18n/lang/zh-lang.json | 12 +++- 30 files changed, 351 insertions(+), 117 deletions(-) create mode 100644 src/ui_ng/src/app/app-config.service.ts create mode 100644 src/ui_ng/src/app/app-config.ts delete mode 100644 src/ui_ng/src/app/repository/mock-verfied-signature.ts diff --git a/src/ui_ng/src/app/account/account-settings/account-settings-modal.component.ts b/src/ui_ng/src/app/account/account-settings/account-settings-modal.component.ts index bb81493dc..a3f43f2ef 100644 --- a/src/ui_ng/src/app/account/account-settings/account-settings-modal.component.ts +++ b/src/ui_ng/src/app/account/account-settings/account-settings-modal.component.ts @@ -118,7 +118,7 @@ export class AccountSettingsModalComponent implements OnInit, AfterViewChecked { this.session.updateAccountSettings(this.account) .then(() => { this.isOnCalling = false; - this.close(); + this.opened = false; this.msgService.announceMessage(200, "PROFILE.SAVE_SUCCESS", AlertType.SUCCESS); }) .catch(error => { diff --git a/src/ui_ng/src/app/account/password/password-setting.component.ts b/src/ui_ng/src/app/account/password/password-setting.component.ts index 6c8dd8248..4fcd04d15 100644 --- a/src/ui_ng/src/app/account/password/password-setting.component.ts +++ b/src/ui_ng/src/app/account/password/password-setting.component.ts @@ -117,7 +117,7 @@ export class PasswordSettingComponent implements AfterViewChecked { }) .then(() => { this.onCalling = false; - this.close(); + this.opened = false; this.msgService.announceMessage(200, "CHANGE_PWD.SAVE_SUCCESS", AlertType.SUCCESS); }) .catch(error => { diff --git a/src/ui_ng/src/app/account/password/password-setting.service.ts b/src/ui_ng/src/app/account/password/password-setting.service.ts index d5f0db427..2d16ca8fb 100644 --- a/src/ui_ng/src/app/account/password/password-setting.service.ts +++ b/src/ui_ng/src/app/account/password/password-setting.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Headers, Http, RequestOptions } from '@angular/http'; +import { Headers, Http, RequestOptions, URLSearchParams } from '@angular/http'; import 'rxjs/add/operator/toPromise'; import { PasswordSetting } from './password-setting'; @@ -52,10 +52,18 @@ export class PasswordSettingService { return Promise.reject("Invalid reset uuid or password"); } - return this.http.post(resetPasswordEndpoint, JSON.stringify({ - "reset_uuid": uuid, - "password": newPassword - }), this.options) + let formHeaders = new Headers({ + "Content-Type": 'application/x-www-form-urlencoded' + }); + let formOptions: RequestOptions = new RequestOptions({ + headers: formHeaders + }); + + let body: URLSearchParams = new URLSearchParams(); + body.set("reset_uuid", uuid); + body.set("password", newPassword); + + return this.http.post(resetPasswordEndpoint, body.toString(), formOptions) .toPromise() .then(response => response) .catch(error => { diff --git a/src/ui_ng/src/app/account/password/reset-password.component.ts b/src/ui_ng/src/app/account/password/reset-password.component.ts index 75bd52c92..0e22af2ff 100644 --- a/src/ui_ng/src/app/account/password/reset-password.component.ts +++ b/src/ui_ng/src/app/account/password/reset-password.component.ts @@ -44,7 +44,9 @@ export class ResetPasswordComponent implements OnInit{ } public getValidationState(key: string): boolean { - return this.validationState && this.validationState[key]; + return this.validationState && + this.validationState[key] && + key === 'reNewPassword'?this.samePassword():true; } public open(): void { @@ -76,10 +78,12 @@ export class ResetPasswordComponent implements OnInit{ this.onGoing = true; this.pwdService.resetPassword(this.resetUuid, this.password) .then(() => { + this.onGoing = false; this.resetOk = true; this.inlineAlert.showInlineSuccess({message:'RESET_PWD.RESET_OK'}); }) .catch(error => { + this.onGoing = false; if(accessErrorHandler(error, this.msgService)){ this.close(); }else{ diff --git a/src/ui_ng/src/app/account/sign-in/sign-in.component.html b/src/ui_ng/src/app/account/sign-in/sign-in.component.html index c4de78af5..d95ef7203 100644 --- a/src/ui_ng/src/app/account/sign-in/sign-in.component.html +++ b/src/ui_ng/src/app/account/sign-in/sign-in.component.html @@ -31,9 +31,9 @@ {{ 'SIGN_IN.INVALID_MSG' | translate }} - {{ 'BUTTON.SIGN_UP_LINK' | translate }} + {{ 'BUTTON.SIGN_UP_LINK' | translate }} -> + \ No newline at end of file diff --git a/src/ui_ng/src/app/account/sign-in/sign-in.component.ts b/src/ui_ng/src/app/account/sign-in/sign-in.component.ts index 40cd828a1..f69d11619 100644 --- a/src/ui_ng/src/app/account/sign-in/sign-in.component.ts +++ b/src/ui_ng/src/app/account/sign-in/sign-in.component.ts @@ -10,6 +10,9 @@ import { SignUpComponent } from '../sign-up/sign-up.component'; import { harborRootRoute } from '../../shared/shared.const'; import { ForgotPasswordComponent } from '../password/forgot-password.component'; +import { AppConfigService } from '../../app-config.service'; +import { AppConfig } from '../../app-config'; + //Define status flags for signing in states export const signInStatusNormal = 0; export const signInStatusOnGoing = 1; @@ -23,6 +26,7 @@ export const signInStatusError = -1; export class SignInComponent implements AfterViewChecked, OnInit { private redirectUrl: string = ""; + private appConfig: AppConfig = new AppConfig(); //Form reference signInForm: NgForm; @ViewChild('signInForm') currentForm: NgForm; @@ -41,13 +45,19 @@ export class SignInComponent implements AfterViewChecked, OnInit { constructor( private router: Router, private session: SessionService, - private route: ActivatedRoute + private route: ActivatedRoute, + private appConfigService: AppConfigService ) { } ngOnInit(): void { + this.appConfig = this.appConfigService.getConfig(); this.route.queryParams .subscribe(params => { this.redirectUrl = params["redirect_url"] || ""; + let isSignUp = params["sign_up"] || ""; + if (isSignUp != "") { + this.signUp();//Open sign up + } }); } @@ -65,6 +75,12 @@ export class SignInComponent implements AfterViewChecked, OnInit { return this.currentForm.form.valid; } + //Whether show the 'sign up' link + public get selfSignUp(): boolean { + return this.appConfig.auth_mode === 'db_auth' + && this.appConfig.self_registration; + } + //General error handler private handleError(error) { //Set error status @@ -124,7 +140,7 @@ export class SignInComponent implements AfterViewChecked, OnInit { if (this.redirectUrl === "") { //Routing to the default location this.router.navigateByUrl(harborRootRoute); - }else{ + } else { this.router.navigateByUrl(this.redirectUrl); } }) diff --git a/src/ui_ng/src/app/account/sign-up/sign-up.component.ts b/src/ui_ng/src/app/account/sign-up/sign-up.component.ts index 86cb22ed8..60743f587 100644 --- a/src/ui_ng/src/app/account/sign-up/sign-up.component.ts +++ b/src/ui_ng/src/app/account/sign-up/sign-up.component.ts @@ -9,6 +9,8 @@ import { UserService } from '../../user/user.service'; import { errorHandler } from '../../shared/shared.utils'; import { InlineAlertComponent } from '../../shared/inline-alert/inline-alert.component'; +import { Modal } from 'clarity-angular'; + @Component({ selector: 'sign-up', templateUrl: "sign-up.component.html" @@ -30,6 +32,9 @@ export class SignUpComponent { @ViewChild(InlineAlertComponent) private inlienAlert: InlineAlertComponent; + @ViewChild(Modal) + private modal: Modal; + private getNewUser(): User { return this.newUserForm.getData(); } @@ -55,7 +60,7 @@ export class SignUpComponent { open(): void { this.newUserForm.reset();//Reset form this.formValueChanged = false; - this.opened = true; + this.modal.open(); } close(): void { @@ -74,7 +79,7 @@ export class SignUpComponent { } confirmCancel(): void { - this.opened = false; + this.modal.close(); } //Create new user @@ -97,7 +102,7 @@ export class SignUpComponent { this.userService.addUser(u) .then(() => { this.onGoing = false; - this.close(); + this.modal.close(); }) .catch(error => { this.onGoing = false; diff --git a/src/ui_ng/src/app/app-config.service.ts b/src/ui_ng/src/app/app-config.service.ts new file mode 100644 index 000000000..529ab1739 --- /dev/null +++ b/src/ui_ng/src/app/app-config.service.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@angular/core'; +import { Headers, Http, RequestOptions } from '@angular/http'; +import 'rxjs/add/operator/toPromise'; + +import { AppConfig } from './app-config'; + +export const systemInfoEndpoint = "/api/systeminfo"; +/** + * Declare service to handle the bootstrap options + * + * + * @export + * @class GlobalSearchService + */ +@Injectable() +export class AppConfigService { + private headers = new Headers({ + "Content-Type": 'application/json' + }); + private options = new RequestOptions({ + headers: this.headers + }); + + //Store the application configuration + private configurations: AppConfig = new AppConfig(); + + constructor(private http: Http) { } + + public load(): Promise { + return this.http.get(systemInfoEndpoint, this.options).toPromise() + .then(response => this.configurations = response.json() as AppConfig) + .catch(error => { + //Catch the error + console.error("Failed to load bootstrap options with error: ", error); + }); + } + + public getConfig(): AppConfig { + return this.configurations; + } +} \ No newline at end of file diff --git a/src/ui_ng/src/app/app-config.ts b/src/ui_ng/src/app/app-config.ts new file mode 100644 index 000000000..80bf3f61c --- /dev/null +++ b/src/ui_ng/src/app/app-config.ts @@ -0,0 +1,20 @@ +export class AppConfig { + constructor(){ + //Set default value + this.with_notary = false; + this.with_admiral = false; + this.admiral_endpoint = ""; + this.auth_mode = "db_auth"; + this.registry_url = ""; + this.project_creation_restriction = "everyone"; + this.self_registration = true; + } + + with_notary: boolean; + with_admiral: boolean; + admiral_endpoint: string; + auth_mode: string; + registry_url: string; + project_creation_restriction: string; + self_registration: boolean; +} \ No newline at end of file diff --git a/src/ui_ng/src/app/app.module.ts b/src/ui_ng/src/app/app.module.ts index 4799a97d2..3f117d6b5 100644 --- a/src/ui_ng/src/app/app.module.ts +++ b/src/ui_ng/src/app/app.module.ts @@ -16,17 +16,14 @@ import { MyMissingTranslationHandler } from './i18n/missing-trans.handler'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; import { Http } from '@angular/http'; -import { SessionService } from './shared/session.service'; +import { AppConfigService } from './app-config.service'; export function HttpLoaderFactory(http: Http) { return new TranslateHttpLoader(http, 'ng/i18n/lang/', '-lang.json'); } -export function initConfig(session: SessionService) { - return () => { - console.info("app init here"); - return Promise.resolve(true); - }; +export function initConfig(configService: AppConfigService) { + return () => configService.load(); } @NgModule({ @@ -51,10 +48,12 @@ export function initConfig(session: SessionService) { } }) ], - providers: [{ + providers: [ + AppConfigService, + { provide: APP_INITIALIZER, useFactory: initConfig, - deps: [SessionService], + deps: [AppConfigService], multi: true }], bootstrap: [AppComponent] diff --git a/src/ui_ng/src/app/base/navigator/navigator.component.css b/src/ui_ng/src/app/base/navigator/navigator.component.css index 8fcf6818c..66a64add0 100644 --- a/src/ui_ng/src/app/base/navigator/navigator.component.css +++ b/src/ui_ng/src/app/base/navigator/navigator.component.css @@ -17,4 +17,13 @@ .lang-selected { font-weight: bold; +} + +.nav-divider { + display: inline-block; + width: 1px; + height: 40px; + background-color: #fafafa; + position: relative; + top: 10px; } \ No newline at end of file diff --git a/src/ui_ng/src/app/base/navigator/navigator.component.html b/src/ui_ng/src/app/base/navigator/navigator.component.html index c297f3e3d..c17f0b958 100644 --- a/src/ui_ng/src/app/base/navigator/navigator.component.html +++ b/src/ui_ng/src/app/base/navigator/navigator.component.html @@ -5,12 +5,19 @@ Harbor +
+ {{'SIGN_IN.HEADER_LINK' | translate}} + + {{'SIGN_UP.TITLE' | translate}} -