diff --git a/src/portal/.browserslistrc b/src/portal/.browserslistrc new file mode 100644 index 0000000000..427441dc93 --- /dev/null +++ b/src/portal/.browserslistrc @@ -0,0 +1,17 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/src/portal/README.md b/src/portal/README.md index ceec0b813a..1ee23b69c6 100644 --- a/src/portal/README.md +++ b/src/portal/README.md @@ -2,4 +2,100 @@ Harbor UI ============ -This is the project based on Clarity and Angular to build Harbor UI. \ No newline at end of file +This is the project based on Clarity and Angular to build Harbor UI. + + + +Start +============ +1. npm install (should trigger 'npm postinstall') +2. npm run postinstall (if not triggered, manually run this step) +3. create "proxy.config.json" file with below content under "portal" directory, and replace "hostname" with an available Harbor hostname +4. npm run start +5. open your browser on https://localhost:4200 +```json +{ + "/api/*": { + "target": "https://hostname", + "secure": false, + "changeOrigin": true, + "logLevel": "debug" + }, + "/service/*": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/c/login": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/c/oidc/login": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/sign_in": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/c/log_out": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/sendEmail": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/language": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/reset": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/c/userExists": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/reset_password": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/i18n/lang/*.json": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug", + "pathRewrite": { "^/src$": "" } + }, + "/swagger.json": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/swagger2.json": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/chartrepo/*": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + }, + "/LICENSE": { + "target": "https://hostname", + "secure": false, + "logLevel": "debug" + } +} +``` diff --git a/src/portal/angular.json b/src/portal/angular.json index 9e6cff76a5..3c99cbd693 100644 --- a/src/portal/angular.json +++ b/src/portal/angular.json @@ -11,10 +11,15 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { + "allowedCommonJsDependencies": [ + "swagger-ui", + "js-yaml" + ], "outputPath": "dist", "index": "src/index.html", "main": "src/main.ts", - "tsConfig": "src/tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", "extractCss": true, "assets": [ "src/images", @@ -31,12 +36,12 @@ { "input": "src/css/dark-theme.scss", "bundleName": "dark-theme", - "lazy": true + "inject": false }, { "input": "src/css/light-theme.scss", "bundleName": "light-theme", - "lazy": true + "inject": false } ], "scripts": [ @@ -92,9 +97,10 @@ "test": { "builder": "@angular-devkit/build-angular:karma", "options": { - "tsConfig": "src/tsconfig.spec.json", + "tsConfig": "tsconfig.spec.json", "main": "src/test.ts", - "karmaConfig": "./karma.conf.js", + "polyfills": "src/polyfills.ts", + "karmaConfig": "karma.conf.js", "scripts": [ "node_modules/core-js/client/shim.min.js", "node_modules/mutationobserver-shim/dist/mutationobserver.min.js", diff --git a/src/portal/browserslist b/src/portal/browserslist deleted file mode 100644 index 37371cb04b..0000000000 --- a/src/portal/browserslist +++ /dev/null @@ -1,11 +0,0 @@ -# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries -# -# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed - -> 0.5% -last 2 versions -Firefox ESR -not dead -not IE 9-11 \ No newline at end of file diff --git a/src/portal/favicon.ico b/src/portal/favicon.ico deleted file mode 100644 index 8b3d012439..0000000000 Binary files a/src/portal/favicon.ico and /dev/null differ diff --git a/src/portal/package-lock.json b/src/portal/package-lock.json index 4a1fd517c1..79870cfeaf 100644 --- a/src/portal/package-lock.json +++ b/src/portal/package-lock.json @@ -2448,33 +2448,19 @@ } }, "@ngx-translate/core": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-10.0.2.tgz", - "integrity": "sha512-7nM3DrJaqKswwtJlbu2kuKNl+hE8Isr18sKsKvGGpSxQk+G0gO0reDlx2PhUNus7TJTkA1C59vU/JoN8hIvZ4g==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", + "integrity": "sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg==", "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } + "tslib": "^2.0.0" } }, "@ngx-translate/http-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-3.0.1.tgz", - "integrity": "sha1-ILD5i8bCUyESnT4zAqs8xInApCo=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-6.0.0.tgz", + "integrity": "sha512-LCekn6qCbeXWlhESCxU1rAbZz33WzDG0lI7Ig0pYC1o5YxJWrkU9y3Y4tNi+jakQ7R6YhTR2D3ox6APxDtA0wA==", "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } + "tslib": "^2.0.0" } }, "@nodelib/fs.scandir": { diff --git a/src/portal/package.json b/src/portal/package.json index 42b7a16f53..3c0c9a3103 100644 --- a/src/portal/package.json +++ b/src/portal/package.json @@ -1,6 +1,6 @@ { "name": "harbor", - "version": "2.2.0", + "version": "2.3.0", "description": "Harbor UI with Clarity", "angular-cli": {}, "scripts": { @@ -39,8 +39,8 @@ "@clr/ui": "^4.0.2", "@fortawesome/fontawesome-free": "^5.1.0-4", "@ng-bootstrap/ng-bootstrap": "^7.0.0", - "@ngx-translate/core": "^10.0.2", - "@ngx-translate/http-loader": "^3.0.1", + "@ngx-translate/core": "^13.0.0", + "@ngx-translate/http-loader": "^6.0.0", "@types/jquery": "^2.0.41", "@webcomponents/custom-elements": "^1.0.0", "@webcomponents/webcomponentsjs": "^2.0.0", diff --git a/src/portal/scripts/generate-build-timestamp.js b/src/portal/scripts/generate-build-timestamp.js index a3fcbf035f..db83541a2d 100644 --- a/src/portal/scripts/generate-build-timestamp.js +++ b/src/portal/scripts/generate-build-timestamp.js @@ -3,6 +3,7 @@ */ const fs = require('fs'); const data = fs.readFileSync('src/environments/environment.prod.ts', 'utf8').split('\n'); +const timestamp = new Date().getTime(); let buildTimestampIndex = 0; data.forEach((item,index) => { @@ -10,10 +11,29 @@ data.forEach((item,index) => { buildTimestampIndex = index; } }); +// modify buildTimestamp value in src/environments/environment.prod.ts file if (buildTimestampIndex > 0) { - const timestamp = new Date().getTime(); data[buildTimestampIndex] = ` buildTimestamp: ${timestamp},`; fs.writeFileSync('src/environments/environment.prod.ts', data.join('\n'), 'utf8'); } +// modify below lines in src/index.html to add buildTimestamp query string, in case of css cache in different builds +// +// +const indexHtmlData = fs.readFileSync('src/index.html', 'utf8').split('\n'); +let lightIndex = 0; +let darkIndex =0; +indexHtmlData.forEach((item,index) => { + if(item.indexOf('light-theme.css') !== -1) { + lightIndex = index; + } + if(item.indexOf('dark-theme.css') !== -1) { + darkIndex = index; + } +}); +if (lightIndex > 0 && darkIndex > 0) { + indexHtmlData[lightIndex] = ` `; + indexHtmlData[darkIndex] = ` `; + fs.writeFileSync('src/index.html', indexHtmlData.join('\n'), 'utf8'); +} \ No newline at end of file diff --git a/src/portal/server/controllers/scanners.ts b/src/portal/server/controllers/scanners.ts index 694ed1c17e..80c68e3e1c 100644 --- a/src/portal/server/controllers/scanners.ts +++ b/src/portal/server/controllers/scanners.ts @@ -1,4 +1,4 @@ -import { Scanner } from '../../src/app/config/scanner/scanner'; +import { Scanner } from '../../src/app/base/left-side-nav/interrogation-services/scanner/scanner'; import { Request, Response } from "express"; diff --git a/src/portal/server/src/mock-api.ts b/src/portal/server/src/mock-api.ts index ef39f56556..dabd140413 100644 --- a/src/portal/server/src/mock-api.ts +++ b/src/portal/server/src/mock-api.ts @@ -1,7 +1,7 @@ import express from "express"; import { Express } from 'express'; import * as Controllers from '../controllers'; -import { CURRENT_BASE_HREF } from "../../src/lib/utils/utils"; +import { CURRENT_BASE_HREF } from "../../src/app/shared/units/utils"; const mockApi: Express = express(); diff --git a/src/portal/src/app/account/account.module.ts b/src/portal/src/app/account/account.module.ts index 630226b5b6..f641fdf804 100644 --- a/src/portal/src/app/account/account.module.ts +++ b/src/portal/src/app/account/account.module.ts @@ -12,40 +12,35 @@ // See the License for the specific language governing permissions and // limitations under the License. import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { CoreModule } from '../core/core.module'; +import { RouterModule, Routes } from '@angular/router'; import { SharedModule } from '../shared/shared.module'; -import { PasswordSettingComponent } from './password-setting/password-setting.component'; -import { AccountSettingsModalComponent } from './account-settings/account-settings-modal.component'; import { SignUpComponent } from './sign-up/sign-up.component'; -import { ForgotPasswordComponent } from './password-setting/forgot-password/forgot-password.component'; -import { ResetPasswordComponent } from './password-setting/reset-password/reset-password.component'; import { SignUpPageComponent } from './sign-up/sign-up-page.component'; -import { PasswordSettingService } from './password-setting/password-setting.service'; -import { AccountSettingsModalService } from './account-settings/account-settings-modal-service.service'; - +import { SignInComponent } from "./sign-in/sign-in.component"; +import { SignInGuard } from "../shared/router-guard/sign-in-guard-activate.service"; +import { TopRepoService } from "./sign-in/top-repo/top-repository.service"; +import { TopRepoComponent } from "./sign-in/top-repo/top-repo.component"; +const routes: Routes = [ + { + path: 'sign-in', + canActivate: [SignInGuard], + component: SignInComponent + } +]; @NgModule({ imports: [ - CoreModule, - RouterModule, + RouterModule.forChild(routes), SharedModule, ], declarations: [ - PasswordSettingComponent, - AccountSettingsModalComponent, SignUpComponent, - ForgotPasswordComponent, - ResetPasswordComponent, - SignUpPageComponent], - exports: [ - PasswordSettingComponent, - AccountSettingsModalComponent, - ForgotPasswordComponent, - ResetPasswordComponent, - SignUpComponent, - SignUpPageComponent], - - providers: [PasswordSettingService, AccountSettingsModalService] + SignUpPageComponent, + SignInComponent, + TopRepoComponent, + ], + providers: [ + TopRepoService + ] }) export class AccountModule { } diff --git a/src/portal/src/app/account/password-setting/reset-password/reset-password.component.html b/src/portal/src/app/account/password-setting/reset-password/reset-password.component.html deleted file mode 100644 index 5ad506b803..0000000000 --- a/src/portal/src/app/account/password-setting/reset-password/reset-password.component.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - diff --git a/src/portal/src/app/account/password-setting/reset-password/reset-password.component.scss b/src/portal/src/app/account/password-setting/reset-password/reset-password.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/portal/src/app/account/password-setting/reset-password/reset-password.component.spec.ts b/src/portal/src/app/account/password-setting/reset-password/reset-password.component.spec.ts deleted file mode 100644 index 48a2efba1d..0000000000 --- a/src/portal/src/app/account/password-setting/reset-password/reset-password.component.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { ResetPasswordComponent } from './reset-password.component'; -import { FormsModule } from '@angular/forms'; -import { PasswordSettingService } from '../password-setting.service'; -import { RouterTestingModule } from '@angular/router/testing'; -import { MessageHandlerService } from '../../../shared/message-handler/message-handler.service'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { ClarityModule } from '@clr/angular'; -import { InlineAlertComponent } from '../../../shared/inline-alert/inline-alert.component'; -import { ErrorHandler } from '../../../../lib/utils/error-handler'; - -describe('ResetPasswordComponent', () => { - let component: ResetPasswordComponent; - let fixture: ComponentFixture; - let fakePasswordSettingService = null; - let fakeMessageHandlerService = null; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - TranslateModule.forRoot(), - FormsModule, - RouterTestingModule, - BrowserAnimationsModule, - ClarityModule - ], - declarations: [ResetPasswordComponent, InlineAlertComponent], - providers: [ - TranslateService, - { provide: PasswordSettingService, useValue: fakePasswordSettingService }, - { provide: MessageHandlerService, useValue: fakeMessageHandlerService }, - ErrorHandler - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ResetPasswordComponent); - component = fixture.componentInstance; - component.inlineAlert = TestBed.createComponent(InlineAlertComponent).componentInstance; - component.open(); - fixture.autoDetectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/portal/src/app/account/password-setting/reset-password/reset-password.component.ts b/src/portal/src/app/account/password-setting/reset-password/reset-password.component.ts deleted file mode 100644 index b51e777308..0000000000 --- a/src/portal/src/app/account/password-setting/reset-password/reset-password.component.ts +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Project Harbor Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import { Component, ViewChild, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { NgForm } from '@angular/forms'; - -import { PasswordSettingService } from '../password-setting.service'; -import { InlineAlertComponent } from '../../../shared/inline-alert/inline-alert.component'; -import { MessageHandlerService } from '../../../shared/message-handler/message-handler.service'; -import { CommonRoutes } from "../../../../lib/entities/shared.const"; - -@Component({ - selector: 'reset-password', - templateUrl: "reset-password.component.html", - styleUrls: ['./reset-password.component.scss', '../password-setting.component.scss', '../../../common.scss'] -}) -export class ResetPasswordComponent implements OnInit { - opened: boolean = true; - onGoing: boolean = false; - password: string = ""; - private validationState: any = { - "newPassword": true, - "reNewPassword": true - }; - resetUuid: string = ""; - resetOk: boolean = false; - confirmPwd: string = ""; - - @ViewChild("resetPwdForm", {static: true}) resetPwdForm: NgForm; - @ViewChild(InlineAlertComponent) - inlineAlert: InlineAlertComponent; - - constructor( - private pwdService: PasswordSettingService, - private route: ActivatedRoute, - private msgHandler: MessageHandlerService, - private router: Router) { } - - ngOnInit(): void { - this.route.queryParams.subscribe(params => this.resetUuid = params["reset_uuid"] || ""); - } - - public get showProgress(): boolean { - return this.onGoing; - } - - public get isValid(): boolean { - return this.resetPwdForm && this.resetPwdForm.valid && this.samePassword(); - } - - public get btnCancelCaption(): string { - if (!this.resetOk) { - return 'BUTTON.CANCEL'; - } else { - return 'BUTTON.CLOSE'; - } - } - - public getValidationState(key: string): boolean { - return this.validationState && - this.validationState[key]; - } - - public open(): void { - this.resetOk = false; - this.onGoing = false; - this.validationState = { - "newPassword": true, - "reNewPassword": true - }; - this.resetPwdForm.resetForm(); - this.inlineAlert.close(); - - this.opened = true; - } - - public close(): void { - // If already reset password ok, navigator to sign-in - if (this.resetOk) { - this.router.navigateByUrl(CommonRoutes.EMBEDDED_SIGN_IN); - } - this.opened = false; - } - - public send(): void { - // Double confirm to avoid improper situations - if (!this.password) { - return; - } - - if (!this.isValid) { - return; - } - - this.onGoing = true; - this.pwdService.resetPassword(this.resetUuid, this.password) - .subscribe(() => { - this.onGoing = false; - this.resetOk = true; - this.inlineAlert.showInlineSuccess({ message: 'RESET_PWD.RESET_OK' }); - }, error => { - this.onGoing = false; - if (this.msgHandler.isAppLevel(error)) { - this.close(); - } else { - this.inlineAlert.showInlineError(error); - } - }); - } - - public handleValidation(key: string, flag: boolean): void { - if (!flag) { - this.validationState[key] = true; - } else { - this.validationState[key] = this.getControlValidationState(key); - if (this.validationState[key]) { - this.validationState["reNewPassword"] = this.samePassword(); - } - } - } - - getControlValidationState(key: string): boolean { - if (this.resetPwdForm) { - let control = this.resetPwdForm.controls[key]; - if (control) { - return control.valid; - } - } - - return false; - } - - samePassword(): boolean { - if (this.resetPwdForm) { - let control1 = this.resetPwdForm.controls["newPassword"]; - let control2 = this.resetPwdForm.controls["reNewPassword"]; - if (control1 && control2) { - return control1.value === control2.value; - } - } - - return false; - } -} diff --git a/src/portal/src/app/shared/sign-in-credential.ts b/src/portal/src/app/account/sign-in/sign-in-credential.ts similarity index 100% rename from src/portal/src/app/shared/sign-in-credential.ts rename to src/portal/src/app/account/sign-in/sign-in-credential.ts diff --git a/src/portal/src/app/sign-in/sign-in.component.html b/src/portal/src/app/account/sign-in/sign-in.component.html similarity index 100% rename from src/portal/src/app/sign-in/sign-in.component.html rename to src/portal/src/app/account/sign-in/sign-in.component.html diff --git a/src/portal/src/app/sign-in/sign-in.component.scss b/src/portal/src/app/account/sign-in/sign-in.component.scss similarity index 100% rename from src/portal/src/app/sign-in/sign-in.component.scss rename to src/portal/src/app/account/sign-in/sign-in.component.scss diff --git a/src/portal/src/app/sign-in/sign-in.component.spec.ts b/src/portal/src/app/account/sign-in/sign-in.component.spec.ts similarity index 93% rename from src/portal/src/app/sign-in/sign-in.component.spec.ts rename to src/portal/src/app/account/sign-in/sign-in.component.spec.ts index ee75f23af2..3336576830 100644 --- a/src/portal/src/app/sign-in/sign-in.component.spec.ts +++ b/src/portal/src/app/account/sign-in/sign-in.component.spec.ts @@ -1,11 +1,11 @@ -import { waitForAsync, ComponentFixture, getTestBed, inject, TestBed } from '@angular/core/testing'; +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { SignInComponent } from './sign-in.component'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { RouterTestingModule } from '@angular/router/testing'; -import { AppConfigService } from '../services/app-config.service'; -import { SessionService } from '../shared/session.service'; +import { AppConfigService } from '../../services/app-config.service'; +import { SessionService } from '../../shared/services/session.service'; import { CookieService } from 'ngx-cookie'; -import { SkinableConfig } from "../services/skinable-config.service"; +import { SkinableConfig } from "../../services/skinable-config.service"; import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; import { ClarityModule } from "@clr/angular"; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; diff --git a/src/portal/src/app/sign-in/sign-in.component.ts b/src/portal/src/app/account/sign-in/sign-in.component.ts similarity index 91% rename from src/portal/src/app/sign-in/sign-in.component.ts rename to src/portal/src/app/account/sign-in/sign-in.component.ts index facdd0536e..151eaabc0a 100644 --- a/src/portal/src/app/sign-in/sign-in.component.ts +++ b/src/portal/src/app/account/sign-in/sign-in.component.ts @@ -15,19 +15,19 @@ import { Component, OnInit } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; import { Input, ViewChild, AfterViewChecked } from '@angular/core'; import { NgForm } from '@angular/forms'; -import { SessionService } from '../shared/session.service'; -import { SignInCredential } from '../shared/sign-in-credential'; -import { SignUpComponent } from '../account/sign-up/sign-up.component'; -import { ForgotPasswordComponent } from '../account/password-setting/forgot-password/forgot-password.component'; -import { AppConfigService } from '../services/app-config.service'; -import { AppConfig } from '../services/app-config'; -import { User } from '../user/user'; +import { SessionService } from '../../shared/services/session.service'; +import { SignUpComponent } from '../sign-up/sign-up.component'; +import { ForgotPasswordComponent } from '../../base/password-setting/forgot-password/forgot-password.component'; +import { AppConfigService } from '../../services/app-config.service'; +import { AppConfig } from '../../services/app-config'; +import { User } from '../../base/left-side-nav/user/user'; import { CookieService, CookieOptions } from 'ngx-cookie'; -import { SkinableConfig } from "../services/skinable-config.service"; -import {ModalEvent} from "../base/modal-event"; -import {modalEvents} from "../base/modal-events.const"; -import {AboutDialogComponent} from "../shared/about-dialog/about-dialog.component"; -import { CommonRoutes, CONFIG_AUTH_MODE } from "../../lib/entities/shared.const"; +import { SkinableConfig } from "../../services/skinable-config.service"; +import {ModalEvent} from "../../base/modal-event"; +import {modalEvents} from "../../base/modal-events.const"; +import {AboutDialogComponent} from "../../shared/components/about-dialog/about-dialog.component"; +import { CommonRoutes, CONFIG_AUTH_MODE } from "../../shared/entities/shared.const"; +import { SignInCredential } from "./sign-in-credential"; // Define status flags for signing in states export const signInStatusNormal = 0; @@ -247,7 +247,7 @@ export class SignInComponent implements AfterViewChecked, OnInit { // Remeber me this.remeberMe(); - // Redirect to the right route + // Redirect to the right router-guard if (this.redirectUrl === "") { // Routing to the default location this.router.navigateByUrl(CommonRoutes.HARBOR_DEFAULT); diff --git a/src/portal/src/app/sign-in/sign-in.service.spec.ts b/src/portal/src/app/account/sign-in/sign-in.service.spec.ts similarity index 100% rename from src/portal/src/app/sign-in/sign-in.service.spec.ts rename to src/portal/src/app/account/sign-in/sign-in.service.spec.ts diff --git a/src/portal/src/app/sign-in/sign-in.service.ts b/src/portal/src/app/account/sign-in/sign-in.service.ts similarity index 93% rename from src/portal/src/app/sign-in/sign-in.service.ts rename to src/portal/src/app/account/sign-in/sign-in.service.ts index 7c805ef703..109c3248be 100644 --- a/src/portal/src/app/sign-in/sign-in.service.ts +++ b/src/portal/src/app/account/sign-in/sign-in.service.ts @@ -13,10 +13,10 @@ // limitations under the License. import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; -import { SignInCredential } from '../shared/sign-in-credential'; import { map, catchError } from "rxjs/operators"; import { Observable, throwError as observableThrowError } from "rxjs"; -import { HTTP_FORM_OPTIONS } from "../../lib/utils/utils"; +import { HTTP_FORM_OPTIONS } from "../../shared/units/utils"; +import { SignInCredential } from "./sign-in-credential"; const signInUrl = '/c/login'; /** * diff --git a/src/portal/src/app/sign-in/top-repo/top-repo.component.html b/src/portal/src/app/account/sign-in/top-repo/top-repo.component.html similarity index 100% rename from src/portal/src/app/sign-in/top-repo/top-repo.component.html rename to src/portal/src/app/account/sign-in/top-repo/top-repo.component.html diff --git a/src/portal/src/app/sign-in/top-repo/top-repo.component.scss b/src/portal/src/app/account/sign-in/top-repo/top-repo.component.scss similarity index 100% rename from src/portal/src/app/sign-in/top-repo/top-repo.component.scss rename to src/portal/src/app/account/sign-in/top-repo/top-repo.component.scss diff --git a/src/portal/src/app/sign-in/top-repo/top-repo.component.spec.ts b/src/portal/src/app/account/sign-in/top-repo/top-repo.component.spec.ts similarity index 95% rename from src/portal/src/app/sign-in/top-repo/top-repo.component.spec.ts rename to src/portal/src/app/account/sign-in/top-repo/top-repo.component.spec.ts index e2f44d7d89..286382d12b 100644 --- a/src/portal/src/app/sign-in/top-repo/top-repo.component.spec.ts +++ b/src/portal/src/app/account/sign-in/top-repo/top-repo.component.spec.ts @@ -8,7 +8,7 @@ import { FormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; import { of } from 'rxjs'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../shared/services/message-handler.service'; import { TopRepoService } from './top-repository.service'; describe('TopRepoComponent', () => { let component: TopRepoComponent; diff --git a/src/portal/src/app/sign-in/top-repo/top-repo.component.ts b/src/portal/src/app/account/sign-in/top-repo/top-repo.component.ts similarity index 86% rename from src/portal/src/app/sign-in/top-repo/top-repo.component.ts rename to src/portal/src/app/account/sign-in/top-repo/top-repo.component.ts index d3a3e598b9..12fa890987 100644 --- a/src/portal/src/app/sign-in/top-repo/top-repo.component.ts +++ b/src/portal/src/app/account/sign-in/top-repo/top-repo.component.ts @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. import { Component, OnInit } from '@angular/core'; -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../shared/services/message-handler.service'; import { TopRepoService } from './top-repository.service'; -import { Repository } from "../../../../ng-swagger-gen/models/repository"; -import { ListMode } from "../../../lib/entities/shared.const"; +import { Repository } from "../../../../../ng-swagger-gen/models/repository"; +import { ListMode } from "../../../shared/entities/shared.const"; @Component({ diff --git a/src/portal/src/app/sign-in/top-repo/top-repository.service.spec.ts b/src/portal/src/app/account/sign-in/top-repo/top-repository.service.spec.ts similarity index 100% rename from src/portal/src/app/sign-in/top-repo/top-repository.service.spec.ts rename to src/portal/src/app/account/sign-in/top-repo/top-repository.service.spec.ts diff --git a/src/portal/src/app/sign-in/top-repo/top-repository.service.ts b/src/portal/src/app/account/sign-in/top-repo/top-repository.service.ts similarity index 90% rename from src/portal/src/app/sign-in/top-repo/top-repository.service.ts rename to src/portal/src/app/account/sign-in/top-repo/top-repository.service.ts index a98da0d0d1..79e2fd3652 100644 --- a/src/portal/src/app/sign-in/top-repo/top-repository.service.ts +++ b/src/portal/src/app/account/sign-in/top-repo/top-repository.service.ts @@ -15,8 +15,8 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { map, catchError } from "rxjs/operators"; import { Observable, throwError as observableThrowError } from "rxjs"; -import { Repository } from "../../../../ng-swagger-gen/models/repository"; -import { CURRENT_BASE_HREF, HTTP_GET_OPTIONS } from "../../../lib/utils/utils"; +import { Repository } from "../../../../../ng-swagger-gen/models/repository"; +import { CURRENT_BASE_HREF, HTTP_GET_OPTIONS } from "../../../shared/units/utils"; export const topRepoEndpoint = CURRENT_BASE_HREF + "/repositories/top"; /** diff --git a/src/portal/src/app/sign-in/top-repo/top-repository.ts b/src/portal/src/app/account/sign-in/top-repo/top-repository.ts similarity index 100% rename from src/portal/src/app/sign-in/top-repo/top-repository.ts rename to src/portal/src/app/account/sign-in/top-repo/top-repository.ts diff --git a/src/portal/src/app/account/sign-up/sign-up-page.component.spec.ts b/src/portal/src/app/account/sign-up/sign-up-page.component.spec.ts index c03b3031e9..b0ba973980 100644 --- a/src/portal/src/app/account/sign-up/sign-up-page.component.spec.ts +++ b/src/portal/src/app/account/sign-up/sign-up-page.component.spec.ts @@ -1,13 +1,13 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { UserService } from '../../user/user.service'; +import { UserService } from '../../base/left-side-nav/user/user.service'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { MessageService } from '../../global-message/message.service'; +import { MessageService } from '../../shared/components/global-message/message.service'; import { RouterTestingModule } from '@angular/router/testing'; import { SignUpPageComponent } from './sign-up-page.component'; import { FormsModule } from '@angular/forms'; -import { NewUserFormComponent } from '../../shared/new-user-form/new-user-form.component'; -import { SessionService } from '../../shared/session.service'; +import { NewUserFormComponent } from '../../shared/components/new-user-form/new-user-form.component'; +import { SessionService } from '../../shared/services/session.service'; describe('SignUpPageComponent', () => { let component: SignUpPageComponent; diff --git a/src/portal/src/app/account/sign-up/sign-up-page.component.ts b/src/portal/src/app/account/sign-up/sign-up-page.component.ts index 2cd751a612..2c793e07a9 100644 --- a/src/portal/src/app/account/sign-up/sign-up-page.component.ts +++ b/src/portal/src/app/account/sign-up/sign-up-page.component.ts @@ -14,11 +14,11 @@ import { Component, ViewChild, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { NewUserFormComponent } from '../../shared/new-user-form/new-user-form.component'; -import { User } from '../../user/user'; -import { UserService } from '../../user/user.service'; -import { AlertType } from '../../shared/shared.const'; -import { MessageService } from '../../global-message/message.service'; +import { NewUserFormComponent } from '../../shared/components/new-user-form/new-user-form.component'; +import { User } from '../../base/left-side-nav/user/user'; +import { UserService } from '../../base/left-side-nav/user/user.service'; +import { MessageService } from '../../shared/components/global-message/message.service'; +import { AlertType } from "../../shared/entities/shared.const"; @Component({ selector: 'sign-up-page', diff --git a/src/portal/src/app/account/sign-up/sign-up.component.spec.ts b/src/portal/src/app/account/sign-up/sign-up.component.spec.ts index a40fc9f4a4..91ba40bd5c 100644 --- a/src/portal/src/app/account/sign-up/sign-up.component.spec.ts +++ b/src/portal/src/app/account/sign-up/sign-up.component.spec.ts @@ -1,16 +1,16 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { ClarityModule } from "@clr/angular"; import { SignUpComponent } from './sign-up.component'; -import { SessionService } from '../../shared/session.service'; -import { UserService } from '../../user/user.service'; +import { SessionService } from '../../shared/services/session.service'; +import { UserService } from '../../base/left-side-nav/user/user.service'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { NewUserFormComponent } from '../../shared/new-user-form/new-user-form.component'; +import { NewUserFormComponent } from '../../shared/components/new-user-form/new-user-form.component'; import { FormsModule } from '@angular/forms'; -import { InlineAlertComponent } from '../../shared/inline-alert/inline-alert.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { of } from 'rxjs'; -import { ErrorHandler } from '../../../lib/utils/error-handler'; +import { ErrorHandler } from '../../shared/units/error-handler'; +import { InlineAlertComponent } from "../../shared/components/inline-alert/inline-alert.component"; describe('SignUpComponent', () => { let component: SignUpComponent; diff --git a/src/portal/src/app/account/sign-up/sign-up.component.ts b/src/portal/src/app/account/sign-up/sign-up.component.ts index d42a9b2837..92ab61efb9 100644 --- a/src/portal/src/app/account/sign-up/sign-up.component.ts +++ b/src/portal/src/app/account/sign-up/sign-up.component.ts @@ -12,14 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. import { Component, Output, ViewChild, EventEmitter } from '@angular/core'; -import { Modal } from '../../../lib/services/interface'; - -import { NewUserFormComponent } from '../../shared/new-user-form/new-user-form.component'; -import { User } from '../../user/user'; -import { SessionService } from '../../shared/session.service'; -import { UserService } from '../../user/user.service'; -import { InlineAlertComponent } from '../../shared/inline-alert/inline-alert.component'; - +import { Modal } from '../../shared/services/interface'; +import { NewUserFormComponent } from '../../shared/components/new-user-form/new-user-form.component'; +import { User } from '../../base/left-side-nav/user/user'; +import { SessionService } from '../../shared/services/session.service'; +import { UserService } from '../../base/left-side-nav/user/user.service'; +import { InlineAlertComponent } from "../../shared/components/inline-alert/inline-alert.component"; @Component({ selector: 'sign-up', diff --git a/src/portal/src/app/all-pipes/all-pipes.module.ts b/src/portal/src/app/all-pipes/all-pipes.module.ts deleted file mode 100644 index 80f69f7dfc..0000000000 --- a/src/portal/src/app/all-pipes/all-pipes.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { SelectArtifactIconPipe } from './select-artifact-icon/select-artifact-icon.pipe'; - - - -@NgModule({ - declarations: [SelectArtifactIconPipe], - imports: [ - CommonModule - ], - exports: [ - SelectArtifactIconPipe - ] -}) -export class AllPipesModule { } diff --git a/src/portal/src/app/all-pipes/select-artifact-icon/select-artifact-icon.pipe.spec.ts b/src/portal/src/app/all-pipes/select-artifact-icon/select-artifact-icon.pipe.spec.ts deleted file mode 100644 index 6928752ee5..0000000000 --- a/src/portal/src/app/all-pipes/select-artifact-icon/select-artifact-icon.pipe.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { SelectArtifactIconPipe } from './select-artifact-icon.pipe'; - -describe('SelectArtifactIconPipe', () => { - let mockTypeImage = "IMAGE"; - let mockTypeChart = "CHART"; - let mockTypecnab = "CNAB"; - it('create an instance', () => { - const pipe = new SelectArtifactIconPipe(); - expect(pipe).toBeTruthy(); - }); - it('it should success get adress of icon', () => { - const pipe = new SelectArtifactIconPipe(); - expect(pipe.transform(mockTypeImage, '')).toBe('images/artifact-image.svg'); - expect(pipe.transform(mockTypeChart, '')).toBe('images/artifact-chart.svg'); - expect(pipe.transform(mockTypecnab, '')).toBe('images/artifact-cnab.svg'); - expect(pipe.transform("", '')).toBe('images/artifact-default.svg'); - - }); -}); diff --git a/src/portal/src/app/all-pipes/select-artifact-icon/select-artifact-icon.pipe.ts b/src/portal/src/app/all-pipes/select-artifact-icon/select-artifact-icon.pipe.ts deleted file mode 100644 index 876007cfa4..0000000000 --- a/src/portal/src/app/all-pipes/select-artifact-icon/select-artifact-icon.pipe.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { artifactImages, artifactDefault } from '../../project/repository/artifact/artifact'; - -@Pipe({ - name: 'selectArtifactIcon' -}) -export class SelectArtifactIconPipe implements PipeTransform { - - transform(value: string, ...args: any[]): any { - - if (artifactImages.some(image => image === value)) { - return 'images/artifact-' + value.toLowerCase() + '.svg'; - } else { - return artifactDefault; - } - } - -} diff --git a/src/portal/src/app/app.component.spec.ts b/src/portal/src/app/app.component.spec.ts index a79509a58e..37873fffe5 100644 --- a/src/portal/src/app/app.component.spec.ts +++ b/src/portal/src/app/app.component.spec.ts @@ -18,7 +18,7 @@ import { Title } from '@angular/platform-browser'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { CookieService } from 'ngx-cookie'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { SessionService } from './shared/session.service'; +import { SessionService } from './shared/services/session.service'; import { AppConfigService } from './services/app-config.service'; import { AppComponent } from './app.component'; import { ClarityModule } from "@clr/angular"; diff --git a/src/portal/src/app/app.component.ts b/src/portal/src/app/app.component.ts index a8dba24ae9..5cd7507a42 100644 --- a/src/portal/src/app/app.component.ts +++ b/src/portal/src/app/app.component.ts @@ -13,15 +13,13 @@ // limitations under the License. import { Component } from '@angular/core'; import { Title } from '@angular/platform-browser'; - import { TranslateService } from '@ngx-translate/core'; -import { CookieService } from 'ngx-cookie'; - -import { SessionService } from './shared/session.service'; import { AppConfigService } from './services/app-config.service'; import { ThemeService } from './services/theme.service'; import { THEME_ARRAY, ThemeInterface } from './services/theme'; -import { clone } from '../lib/utils/utils'; +import { clone } from './shared/units/utils'; +import { DEFAULT_LANG_LOCALSTORAGE_KEY, DeFaultLang, supportedLangs } from "./shared/entities/shared.const"; +import { forkJoin, Observable } from "rxjs"; const HAS_STYLE_MODE: string = 'styleModeLocal'; @@ -31,17 +29,16 @@ const HAS_STYLE_MODE: string = 'styleModeLocal'; }) export class AppComponent { themeArray: ThemeInterface[] = clone(THEME_ARRAY); - styleMode: string = this.themeArray[0].showStyle; constructor( private translate: TranslateService, - private cookie: CookieService, - private session: SessionService, private appConfigService: AppConfigService, private titleService: Title, public theme: ThemeService ) { + // init language + this.initLanguage(); // Override page title let key: string = "APP_TITLE.HARBOR"; if (this.appConfigService.isIntegrationMode()) { @@ -67,4 +64,37 @@ export class AppComponent { } }); } + initLanguage() { + /** + * due to the bug(https://github.com/ngx-translate/core/issues/1258) of translate module + * we have to call use method for all supported languages + * use method will load related language json from backend server + */ + const usedLangs: Array> = []; + supportedLangs.forEach(lang => { + usedLangs.push(this.translate.use(lang)); + }); + forkJoin(usedLangs).subscribe(() => { // use target lang after all langs json loaded + this.translate.addLangs(supportedLangs); + this.translate.setDefaultLang(DeFaultLang); + let selectedLang: string = DeFaultLang; + if (localStorage && localStorage.getItem(DEFAULT_LANG_LOCALSTORAGE_KEY)) {// If user has selected lang, then directly use it + selectedLang = localStorage.getItem(DEFAULT_LANG_LOCALSTORAGE_KEY); + } else {// If user has not selected lang, then use browser language(if contained in supportedLangs) + const browserCultureLang: string = this.translate + .getBrowserCultureLang() + .toLowerCase(); + if (browserCultureLang && browserCultureLang.trim() !== "") { + if (supportedLangs && supportedLangs.length > 0) { + if (supportedLangs.find(lang => lang === browserCultureLang)) { + selectedLang = browserCultureLang; + } + } + } + } + localStorage.setItem(DEFAULT_LANG_LOCALSTORAGE_KEY, selectedLang); + this.translate.use(selectedLang); + } + ); + } } diff --git a/src/portal/src/app/app.module.ts b/src/portal/src/app/app.module.ts index ab9ae96411..3652f25fe1 100644 --- a/src/portal/src/app/app.module.ts +++ b/src/portal/src/app/app.module.ts @@ -12,86 +12,68 @@ // See the License for the specific language governing permissions and // limitations under the License. import { BrowserModule } from '@angular/platform-browser'; -import { NgModule, APP_INITIALIZER, LOCALE_ID, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { NgModule, APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { AppComponent } from './app.component'; import { InterceptHttpService } from './services/intercept-http.service'; - -import { BaseModule } from './base/base.module'; import { HarborRoutingModule } from './harbor-routing.module'; -import { SharedModule } from './shared/shared.module'; -import { AccountModule } from './account/account.module'; -import { SignInModule } from './sign-in/sign-in.module'; -import { ConfigurationModule } from './config/config.module'; -import { DeveloperCenterModule } from './dev-center/dev-center.module'; -import { registerLocaleData } from '@angular/common'; - -import { TranslateService } from "@ngx-translate/core"; import { AppConfigService } from './services/app-config.service'; import { SkinableConfig } from "./services/skinable-config.service"; -import { ProjectConfigComponent } from './project/project-config/project-config.component'; +import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { CookieModule } from "ngx-cookie"; +import { + MissingTranslationHandler, + MissingTranslationHandlerParams, + TranslateLoader, + TranslateModule +} from "@ngx-translate/core"; +import { + ProjectDefaultService, + ProjectService, + UserPermissionDefaultService, + UserPermissionService +} from "./shared/services"; +import { ErrorHandler } from "./shared/units/error-handler"; +import { MessageHandlerService } from "./shared/services/message-handler.service"; +import { HarborTranslateLoaderService } from "./services/harbor-translate-loader.service"; -import zh from '@angular/common/locales/zh-Hans'; -import es from '@angular/common/locales/es'; -import localeFr from '@angular/common/locales/fr'; -import localePt from '@angular/common/locales/pt-PT'; -import localeTr from '@angular/common/locales/tr'; -import { DevCenterComponent } from './dev-center/dev-center.component'; -import { VulnerabilityPageComponent } from './vulnerability-page/vulnerability-page.component'; -import { GcPageComponent } from './gc-page/gc-page.component'; -import { OidcOnboardModule } from './oidc-onboard/oidc-onboard.module'; -import { LicenseModule } from './license/license.module'; -import { InterrogationServicesComponent } from "./interrogation-services/interrogation-services.component"; -import { LabelsComponent } from './labels/labels.component'; -import { ProjectQuotasComponent } from './project-quotas/project-quotas.component'; -import { HarborLibraryModule } from "../lib/harbor-library.module"; -import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { AllPipesModule } from './all-pipes/all-pipes.module'; -import { DistributionModule } from './distribution/distribution.module'; -import { SystemRobotAccountsModule } from './system-robot-accounts/system-robot-accounts.module'; -registerLocaleData(zh, 'zh-cn'); -registerLocaleData(es, 'es-es'); -registerLocaleData(localeFr, 'fr-fr'); -registerLocaleData(localePt, 'pt-br'); -registerLocaleData(localeTr, 'tr-tr'); - -export function initConfig(configService: AppConfigService, skinableService: SkinableConfig) { +function initConfig(configService: AppConfigService, skinableService: SkinableConfig) { return () => { skinableService.getCustomFile().subscribe(); configService.load().subscribe(); }; } -export function getCurrentLanguage(translateService: TranslateService) { - return translateService.currentLang; +class MyMissingTranslationHandler implements MissingTranslationHandler { + handle(params: MissingTranslationHandlerParams) { + const missingText: string = "{Harbor}"; + return params.key || missingText; + } } + + + @NgModule({ declarations: [ AppComponent, - ProjectConfigComponent, - VulnerabilityPageComponent, - GcPageComponent, - InterrogationServicesComponent, - LabelsComponent, - ProjectQuotasComponent ], imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: HarborTranslateLoaderService + }, + missingTranslationHandler: { + provide: MissingTranslationHandler, + useClass: MyMissingTranslationHandler + } + }), BrowserModule, - SharedModule, - BaseModule, - AccountModule, - SignInModule, + BrowserAnimationsModule, + HttpClientModule, HarborRoutingModule, - ConfigurationModule, - DeveloperCenterModule, - OidcOnboardModule, - LicenseModule, - HarborLibraryModule, - AllPipesModule, - DistributionModule, - SystemRobotAccountsModule - ], - exports: [ + CookieModule.forRoot(), ], providers: [ AppConfigService, @@ -102,9 +84,10 @@ export function getCurrentLanguage(translateService: TranslateService) { deps: [AppConfigService, SkinableConfig], multi: true }, - { provide: LOCALE_ID, useValue: "en-US" }, - { provide: HTTP_INTERCEPTORS, useClass: InterceptHttpService, multi: true } - + { provide: HTTP_INTERCEPTORS, useClass: InterceptHttpService, multi: true }, + { provide: ProjectService, useClass: ProjectDefaultService }, + { provide: ErrorHandler, useClass: MessageHandlerService }, + { provide: UserPermissionService, useClass: UserPermissionDefaultService }, ], schemas: [ CUSTOM_ELEMENTS_SCHEMA diff --git a/src/portal/src/app/account/account-settings/account-settings-modal-service.service.spec.ts b/src/portal/src/app/base/account-settings/account-settings-modal-service.service.spec.ts similarity index 100% rename from src/portal/src/app/account/account-settings/account-settings-modal-service.service.spec.ts rename to src/portal/src/app/base/account-settings/account-settings-modal-service.service.spec.ts diff --git a/src/portal/src/app/account/account-settings/account-settings-modal-service.service.ts b/src/portal/src/app/base/account-settings/account-settings-modal-service.service.ts similarity index 84% rename from src/portal/src/app/account/account-settings/account-settings-modal-service.service.ts rename to src/portal/src/app/base/account-settings/account-settings-modal-service.service.ts index bf290ff6f3..3c8cf11bae 100644 --- a/src/portal/src/app/account/account-settings/account-settings-modal-service.service.ts +++ b/src/portal/src/app/base/account-settings/account-settings-modal-service.service.ts @@ -2,12 +2,14 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { catchError, map } from 'rxjs/operators'; import { throwError as observableThrowError, Observable } from 'rxjs'; -import { CURRENT_BASE_HREF } from "../../../lib/utils/utils"; +import { CURRENT_BASE_HREF } from "../../shared/units/utils"; -@Injectable() +@Injectable({ + providedIn: 'root' +}) export class AccountSettingsModalService { constructor(private http: HttpClient) { } diff --git a/src/portal/src/app/account/account-settings/account-settings-modal.component.html b/src/portal/src/app/base/account-settings/account-settings-modal.component.html similarity index 100% rename from src/portal/src/app/account/account-settings/account-settings-modal.component.html rename to src/portal/src/app/base/account-settings/account-settings-modal.component.html diff --git a/src/portal/src/app/account/account-settings/account-settings-modal.component.scss b/src/portal/src/app/base/account-settings/account-settings-modal.component.scss similarity index 100% rename from src/portal/src/app/account/account-settings/account-settings-modal.component.scss rename to src/portal/src/app/base/account-settings/account-settings-modal.component.scss diff --git a/src/portal/src/app/account/account-settings/account-settings-modal.component.spec.ts b/src/portal/src/app/base/account-settings/account-settings-modal.component.spec.ts similarity index 93% rename from src/portal/src/app/account/account-settings/account-settings-modal.component.spec.ts rename to src/portal/src/app/base/account-settings/account-settings-modal.component.spec.ts index eebf34f4ec..b475a1c1ae 100644 --- a/src/portal/src/app/account/account-settings/account-settings-modal.component.spec.ts +++ b/src/portal/src/app/base/account-settings/account-settings-modal.component.spec.ts @@ -1,23 +1,23 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AccountSettingsModalComponent } from './account-settings-modal.component'; -import { SessionService } from "../../shared/session.service"; -import { MessageHandlerService } from "../../shared/message-handler/message-handler.service"; -import { SearchTriggerService } from "../../base/global-search/search-trigger.service"; +import { SessionService } from "../../shared/services/session.service"; +import { MessageHandlerService } from "../../shared/services/message-handler.service"; +import { SearchTriggerService } from "../../shared/components/global-search/search-trigger.service"; import { AccountSettingsModalService } from './account-settings-modal-service.service'; import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectorRef } from '@angular/core'; import { ClarityModule } from "@clr/angular"; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { FormsModule } from '@angular/forms'; -import { InlineAlertComponent } from '../../shared/inline-alert/inline-alert.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { of } from 'rxjs'; import { Router } from '@angular/router'; -import { clone } from '../../../lib/utils/utils'; -import { ConfirmationDialogComponent } from '../../shared/confirmation-dialog/confirmation-dialog.component'; -import { ConfirmationDialogService } from '../../shared/confirmation-dialog/confirmation-dialog.service'; -import { ConfirmationMessage } from '../../shared/confirmation-dialog/confirmation-message'; -import { ErrorHandler } from '../../../lib/utils/error-handler'; +import { clone } from '../../shared/units/utils'; +import { ErrorHandler } from '../../shared/units/error-handler'; +import { ConfirmationDialogComponent } from "../../shared/components/confirmation-dialog"; +import { InlineAlertComponent } from "../../shared/components/inline-alert/inline-alert.component"; +import { ConfirmationDialogService } from "../global-confirmation-dialog/confirmation-dialog.service"; +import { ConfirmationMessage } from "../global-confirmation-dialog/confirmation-message"; describe('AccountSettingsModalComponent', () => { let component: AccountSettingsModalComponent; diff --git a/src/portal/src/app/account/account-settings/account-settings-modal.component.ts b/src/portal/src/app/base/account-settings/account-settings-modal.component.ts similarity index 92% rename from src/portal/src/app/account/account-settings/account-settings-modal.component.ts rename to src/portal/src/app/base/account-settings/account-settings-modal.component.ts index 433a4e3f32..bc59983e51 100644 --- a/src/portal/src/app/account/account-settings/account-settings-modal.component.ts +++ b/src/portal/src/app/base/account-settings/account-settings-modal.component.ts @@ -1,4 +1,3 @@ -import { ChangeDetectorRef } from '@angular/core'; // Copyright Project Harbor Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,26 +11,24 @@ import { ChangeDetectorRef } from '@angular/core'; // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + +import { ChangeDetectorRef } from '@angular/core'; import { Component, OnInit, ViewChild, AfterViewChecked } from "@angular/core"; import { NgForm } from "@angular/forms"; import { Router, NavigationExtras } from "@angular/router"; -import { ConfirmationMessage } from '../../shared/confirmation-dialog/confirmation-message'; - -import { SessionUser } from "../../shared/session-user"; -import { SessionService } from "../../shared/session.service"; -import { InlineAlertComponent } from "../../shared/inline-alert/inline-alert.component"; -import { MessageHandlerService } from "../../shared/message-handler/message-handler.service"; -import { SearchTriggerService } from "../../base/global-search/search-trigger.service"; +import { SessionUser } from "../../shared/entities/session-user"; +import { SessionService } from "../../shared/services/session.service"; +import { MessageHandlerService } from "../../shared/services/message-handler.service"; +import { SearchTriggerService } from "../../shared/components/global-search/search-trigger.service"; import { AccountSettingsModalService } from './account-settings-modal-service.service'; -import { ConfirmationDialogComponent } from "../../shared/confirmation-dialog/confirmation-dialog.component"; -import { - ConfirmationTargets, - ConfirmationButtons -} from "../../shared/shared.const"; -import { randomWord } from '../../shared/shared.utils'; +import { randomWord } from '../../shared/units/shared.utils'; import { ResetSecret } from './account'; -import { CopyInputComponent } from "../../../lib/components/push-image/copy-input.component"; -import { CommonRoutes } from "../../../lib/entities/shared.const"; +import { CopyInputComponent } from "../../shared/components/push-image/copy-input.component"; +import { CommonRoutes, ConfirmationButtons, ConfirmationTargets } from "../../shared/entities/shared.const"; +import { ConfirmationDialogComponent } from "../../shared/components/confirmation-dialog"; +import { InlineAlertComponent } from "../../shared/components/inline-alert/inline-alert.component"; +import { ConfirmationMessage } from "../global-confirmation-dialog/confirmation-message"; + @Component({ selector: "account-settings-modal", templateUrl: "account-settings-modal.component.html", @@ -224,7 +221,7 @@ export class AccountSettingsModalComponent implements OnInit, AfterViewChecked { // Log out system logOut(): void { - // Naviagte to the sign in route + // Naviagte to the sign in router-guard // Appending 'signout' means destroy session cache let navigatorExtra: NavigationExtras = { queryParams: { signout: true } diff --git a/src/portal/src/app/account/account-settings/account.ts b/src/portal/src/app/base/account-settings/account.ts similarity index 100% rename from src/portal/src/app/account/account-settings/account.ts rename to src/portal/src/app/base/account-settings/account.ts diff --git a/src/portal/src/app/base/base.module.ts b/src/portal/src/app/base/base.module.ts index 4f5ffd6be8..dfeeb6717a 100644 --- a/src/portal/src/app/base/base.module.ts +++ b/src/portal/src/app/base/base.module.ts @@ -13,37 +13,127 @@ // limitations under the License. import { NgModule } from '@angular/core'; import { SharedModule } from '../shared/shared.module'; -import { RouterModule } from '@angular/router'; -import { ProjectModule } from '../project/project.module'; -import { UserModule } from '../user/user.module'; -import { AccountModule } from '../account/account.module'; -import { GroupModule } from '../group/group.module'; -import { NavigatorComponent } from './navigator/navigator.component'; -import { GlobalSearchComponent } from './global-search/global-search.component'; -import { FooterComponent } from './footer/footer.component'; +import { RouterModule, Routes } from '@angular/router'; import { HarborShellComponent } from './harbor-shell/harbor-shell.component'; -import { SearchResultComponent } from './global-search/search-result.component'; - -import { SearchTriggerService } from './global-search/search-trigger.service'; +import { SystemAdminGuard } from "../shared/router-guard/system-admin-activate.service"; +import { MemberGuard } from "../shared/router-guard/member-guard-activate.service"; +import { ProjectRoutingResolver } from "../services/routing-resolvers/project-routing-resolver.service"; +import { PasswordSettingComponent } from "./password-setting/password-setting.component"; +import { AccountSettingsModalComponent } from "./account-settings/account-settings-modal.component"; +import { ForgotPasswordComponent } from "./password-setting/forgot-password/forgot-password.component"; +import { GlobalConfirmationDialogComponent } from "./global-confirmation-dialog/global-confirmation-dialog.component"; +const routes: Routes = [ + { + path: '', + component: HarborShellComponent, + children: [ + { path: '', redirectTo: 'projects', pathMatch: 'full' }, + { + path: 'projects', + loadChildren: () => import('./left-side-nav/projects/projects.module').then(m => m.ProjectsModule) + }, + { + path: 'logs', + loadChildren: () => import('./left-side-nav/log/log.module').then(m => m.LogModule) + }, + { + path: 'users', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/user/user.module').then(m => m.UserModule) + }, + { + path: 'robot-accounts', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/system-robot-accounts/system-robot-accounts.module') + .then(m => m.SystemRobotAccountsModule) + }, + { + path: 'groups', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/group/group.module').then(m => m.GroupModule) + }, + { + path: 'registries', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/registries/endpoint.module').then(m => m.EndpointModule) + }, + { + path: 'replications', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/replication/replication.module').then(m => m.ReplicationModule) + }, + { + path: 'distribution', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/distribution/distribution.module').then(m => m.DistributionModule) + }, + { + path: 'interrogation-services', + canActivate: [SystemAdminGuard], + loadChildren: () => + import('./left-side-nav/interrogation-services/interrogation-services.module') + .then(m => m.InterrogationServicesModule) + }, + { + path: 'labels', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/labels/labels.module').then(m => m.LabelsModule) + }, + { + path: 'project-quotas', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/project-quotas/project-quotas.module').then(m => m.ProjectQuotasModule) + }, + { + path: 'gc', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/gc-page/gc.module').then(m => m.GcModule) + }, + { + path: 'configs', + canActivate: [SystemAdminGuard], + loadChildren: () => import('./left-side-nav/config/config.module').then(m => m.ConfigurationModule) + }, + { + path: 'projects/:id', + loadChildren: () => import('./project/project.module').then(m => m.ProjectModule), + canActivate: [MemberGuard], + resolve: { + projectResolver: ProjectRoutingResolver + } + }, + { + path: 'projects/:id/repositories', + loadChildren: () => import('./project/repository/artifact/artifact.module').then(m => m.ArtifactModule), + canActivate: [MemberGuard], + resolve: { + projectResolver: ProjectRoutingResolver + } + }, + { + path: 'projects/:id/helm-charts', + canActivate: [MemberGuard], + resolve: { + projectResolver: ProjectRoutingResolver + }, + loadChildren: () => import('./project/helm-chart/helm-chart-detail/helm-chart-detail.module').then(m => m.HelmChartListModule), + }, + ] + } +]; @NgModule({ imports: [ SharedModule, - ProjectModule, - UserModule, - AccountModule, - RouterModule, - GroupModule + RouterModule.forChild(routes), ], declarations: [ - NavigatorComponent, - GlobalSearchComponent, - FooterComponent, HarborShellComponent, - SearchResultComponent, - ], - exports: [ HarborShellComponent, NavigatorComponent, SearchResultComponent ], - providers: [SearchTriggerService] + PasswordSettingComponent, + AccountSettingsModalComponent, + ForgotPasswordComponent, + GlobalConfirmationDialogComponent + ] }) export class BaseModule { diff --git a/src/portal/src/app/base/footer/footer.component.html b/src/portal/src/app/base/footer/footer.component.html deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/portal/src/app/base/footer/footer.component.spec.ts b/src/portal/src/app/base/footer/footer.component.spec.ts deleted file mode 100644 index 30acbc4f67..0000000000 --- a/src/portal/src/app/base/footer/footer.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FooterComponent } from './footer.component'; - -describe('FooterComponent', () => { - let component: FooterComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [FooterComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FooterComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/portal/src/lib/components/confirmation-dialog/confirmation-batch-message.ts b/src/portal/src/app/base/global-confirmation-dialog/confirmation-batch-message.ts similarity index 100% rename from src/portal/src/lib/components/confirmation-dialog/confirmation-batch-message.ts rename to src/portal/src/app/base/global-confirmation-dialog/confirmation-batch-message.ts diff --git a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.service.spec.ts b/src/portal/src/app/base/global-confirmation-dialog/confirmation-dialog.service.spec.ts similarity index 100% rename from src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.service.spec.ts rename to src/portal/src/app/base/global-confirmation-dialog/confirmation-dialog.service.spec.ts diff --git a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.service.ts b/src/portal/src/app/base/global-confirmation-dialog/confirmation-dialog.service.ts similarity index 97% rename from src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.service.ts rename to src/portal/src/app/base/global-confirmation-dialog/confirmation-dialog.service.ts index d1d5f6b855..187e0bc03a 100644 --- a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.service.ts +++ b/src/portal/src/app/base/global-confirmation-dialog/confirmation-dialog.service.ts @@ -17,7 +17,9 @@ import { Subject } from "rxjs"; import { ConfirmationMessage } from './confirmation-message'; import { ConfirmationAcknowledgement } from './confirmation-state-message'; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class ConfirmationDialogService { confirmationAnnoucedSource = new Subject(); confirmationConfirmSource = new Subject(); diff --git a/src/portal/src/lib/components/confirmation-dialog/confirmation-message.ts b/src/portal/src/app/base/global-confirmation-dialog/confirmation-message.ts similarity index 96% rename from src/portal/src/lib/components/confirmation-dialog/confirmation-message.ts rename to src/portal/src/app/base/global-confirmation-dialog/confirmation-message.ts index 501cc6ec55..bed0718efb 100644 --- a/src/portal/src/lib/components/confirmation-dialog/confirmation-message.ts +++ b/src/portal/src/app/base/global-confirmation-dialog/confirmation-message.ts @@ -14,7 +14,7 @@ import { ConfirmationTargets, ConfirmationButtons -} from "../../entities/shared.const"; +} from "../../shared/entities/shared.const"; export class ConfirmationMessage { public constructor( diff --git a/src/portal/src/app/shared/confirmation-dialog/confirmation-state-message.ts b/src/portal/src/app/base/global-confirmation-dialog/confirmation-state-message.ts similarity index 91% rename from src/portal/src/app/shared/confirmation-dialog/confirmation-state-message.ts rename to src/portal/src/app/base/global-confirmation-dialog/confirmation-state-message.ts index 275ce396ef..ac2767d625 100644 --- a/src/portal/src/app/shared/confirmation-dialog/confirmation-state-message.ts +++ b/src/portal/src/app/base/global-confirmation-dialog/confirmation-state-message.ts @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -import { ConfirmationState, ConfirmationTargets } from '../shared.const'; +import { ConfirmationState, ConfirmationTargets } from '../../shared/entities/shared.const'; export class ConfirmationAcknowledgement { constructor(state: ConfirmationState, data: any, source: ConfirmationTargets) { diff --git a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.html b/src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.html similarity index 100% rename from src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.html rename to src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.html diff --git a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.scss b/src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.scss similarity index 100% rename from src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.scss rename to src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.scss diff --git a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.spec.ts b/src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.spec.ts similarity index 80% rename from src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.spec.ts rename to src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.spec.ts index fa34f3f7d9..b42e5ea26d 100644 --- a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.spec.ts +++ b/src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.spec.ts @@ -1,6 +1,5 @@ -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { ConfirmationDialogComponent } from './confirmation-dialog.component'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { BrowserAnimationsModule, NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ClarityModule } from '@clr/angular'; @@ -9,10 +8,11 @@ import { RouterTestingModule } from '@angular/router/testing'; import { of } from 'rxjs'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ConfirmationDialogService } from './confirmation-dialog.service'; +import { GlobalConfirmationDialogComponent } from "./global-confirmation-dialog.component"; describe('ConfirmationDialogComponent', () => { - let component: ConfirmationDialogComponent; - let fixture: ComponentFixture; + let component: GlobalConfirmationDialogComponent; + let fixture: ComponentFixture; const mockConfirmationDialogService = { confirmationAnnouced$: of({ title: "title", @@ -36,7 +36,7 @@ describe('ConfirmationDialogComponent', () => { NoopAnimationsModule, HttpClientTestingModule ], - declarations: [ConfirmationDialogComponent], + declarations: [GlobalConfirmationDialogComponent], providers: [ TranslateService, { provide: ConfirmationDialogService, useValue: mockConfirmationDialogService }, @@ -46,7 +46,7 @@ describe('ConfirmationDialogComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(ConfirmationDialogComponent); + fixture = TestBed.createComponent(GlobalConfirmationDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.ts b/src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.ts similarity index 87% rename from src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.ts rename to src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.ts index ecb1c75401..b8b43e1fd5 100644 --- a/src/portal/src/app/shared/confirmation-dialog/confirmation-dialog.component.ts +++ b/src/portal/src/app/base/global-confirmation-dialog/global-confirmation-dialog.component.ts @@ -14,19 +14,19 @@ import { Component, OnDestroy } from '@angular/core'; import { Subscription } from "rxjs"; import { TranslateService } from '@ngx-translate/core'; - -import { ConfirmationDialogService } from './confirmation-dialog.service'; import { ConfirmationMessage } from './confirmation-message'; -import { ConfirmationAcknowledgement } from './confirmation-state-message'; -import { ConfirmationState, ConfirmationTargets, ConfirmationButtons } from '../shared.const'; +import { ConfirmationButtons, ConfirmationState, ConfirmationTargets } from "../../shared/entities/shared.const"; +import { ConfirmationDialogService } from "./confirmation-dialog.service"; +import { ConfirmationAcknowledgement } from "./confirmation-state-message"; + @Component({ - selector: 'confiramtion-dialog', - templateUrl: 'confirmation-dialog.component.html', - styleUrls: ['confirmation-dialog.component.scss'] + selector: 'global-confirmation-dialog', + templateUrl: 'global-confirmation-dialog.component.html', + styleUrls: ['global-confirmation-dialog.component.scss'] }) -export class ConfirmationDialogComponent implements OnDestroy { +export class GlobalConfirmationDialogComponent implements OnDestroy { opened: boolean = false; dialogTitle: string = ""; dialogContent: string = ""; diff --git a/src/portal/src/app/base/harbor-shell/harbor-shell.component.html b/src/portal/src/app/base/harbor-shell/harbor-shell.component.html index ab320db0d5..233d71c1f8 100644 --- a/src/portal/src/app/base/harbor-shell/harbor-shell.component.html +++ b/src/portal/src/app/base/harbor-shell/harbor-shell.component.html @@ -111,5 +111,5 @@ - + diff --git a/src/portal/src/app/base/harbor-shell/harbor-shell.component.spec.ts b/src/portal/src/app/base/harbor-shell/harbor-shell.component.spec.ts index f1d61f3afd..0ffc74411a 100644 --- a/src/portal/src/app/base/harbor-shell/harbor-shell.component.spec.ts +++ b/src/portal/src/app/base/harbor-shell/harbor-shell.component.spec.ts @@ -1,26 +1,26 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { SessionService } from '../../shared/session.service'; +import { SessionService } from '../../shared/services/session.service'; import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { SearchTriggerService } from '../global-search/search-trigger.service'; +import { SearchTriggerService } from '../../shared/components/global-search/search-trigger.service'; import { HarborShellComponent } from './harbor-shell.component'; import { ClarityModule } from "@clr/angular"; import { of } from 'rxjs'; -import { ConfigScannerService } from "../../config/scanner/config-scanner.service"; +import { ConfigScannerService } from "../left-side-nav/interrogation-services/scanner/config-scanner.service"; import { modalEvents } from '../modal-events.const'; -import { AccountSettingsModalComponent } from '../../account/account-settings/account-settings-modal.component'; -import { PasswordSettingComponent } from '../../account/password-setting/password-setting.component'; -import { AboutDialogComponent } from '../../shared/about-dialog/about-dialog.component'; +import { PasswordSettingComponent } from '../password-setting/password-setting.component'; +import { AboutDialogComponent } from '../../shared/components/about-dialog/about-dialog.component'; import { FormsModule } from '@angular/forms'; -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; -import { AccountSettingsModalService } from '../../account/account-settings/account-settings-modal-service.service'; -import { PasswordSettingService } from '../../account/password-setting/password-setting.service'; +import { MessageHandlerService } from '../../shared/services/message-handler.service'; +import { PasswordSettingService } from '../password-setting/password-setting.service'; import { SkinableConfig } from '../../services/skinable-config.service'; -import { InlineAlertComponent } from '../../shared/inline-alert/inline-alert.component'; import { AppConfigService } from "../../services/app-config.service"; -import { ErrorHandler } from '../../../lib/utils/error-handler'; +import { ErrorHandler } from '../../shared/units/error-handler'; +import { AccountSettingsModalComponent } from "../account-settings/account-settings-modal.component"; +import { InlineAlertComponent } from "../../shared/components/inline-alert/inline-alert.component"; +import { AccountSettingsModalService } from "../account-settings/account-settings-modal-service.service"; describe('HarborShellComponent', () => { let component: HarborShellComponent; diff --git a/src/portal/src/app/base/harbor-shell/harbor-shell.component.ts b/src/portal/src/app/base/harbor-shell/harbor-shell.component.ts index 6a8ee6fe5d..0c135fa442 100644 --- a/src/portal/src/app/base/harbor-shell/harbor-shell.component.ts +++ b/src/portal/src/app/base/harbor-shell/harbor-shell.component.ts @@ -15,21 +15,19 @@ import { Component, OnInit, ViewChild, OnDestroy } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; import { Subscription } from "rxjs"; import { AppConfigService } from '../../services/app-config.service'; - import { ModalEvent } from '../modal-event'; import { modalEvents } from '../modal-events.const'; - -import { AccountSettingsModalComponent } from '../../account/account-settings/account-settings-modal.component'; -import { PasswordSettingComponent } from '../../account/password-setting/password-setting.component'; -import { NavigatorComponent } from '../navigator/navigator.component'; -import { SessionService } from '../../shared/session.service'; -import { AboutDialogComponent } from '../../shared/about-dialog/about-dialog.component'; -import { SearchTriggerService } from '../global-search/search-trigger.service'; -import { CommonRoutes } from "../../../lib/entities/shared.const"; -import { ConfigScannerService, SCANNERS_DOC } from "../../config/scanner/config-scanner.service"; +import { PasswordSettingComponent } from '../password-setting/password-setting.component'; +import { NavigatorComponent } from '../../shared/components/navigator/navigator.component'; +import { SessionService } from '../../shared/services/session.service'; +import { AboutDialogComponent } from '../../shared/components/about-dialog/about-dialog.component'; +import { SearchTriggerService } from '../../shared/components/global-search/search-trigger.service'; +import { CommonRoutes } from "../../shared/entities/shared.const"; +import { ConfigScannerService, SCANNERS_DOC } from "../left-side-nav/interrogation-services/scanner/config-scanner.service"; import { THEME_ARRAY, ThemeInterface } from "../../services/theme"; -import { clone } from "../../../lib/utils/utils"; +import { clone } from "../../shared/units/utils"; import { ThemeService } from "../../services/theme.service"; +import { AccountSettingsModalComponent } from "../account-settings/account-settings-modal.component"; const HAS_SHOWED_SCANNER_INFO: string = 'hasShowScannerInfo'; const YES: string = 'yes'; diff --git a/src/portal/src/app/config/auth/config-auth.component.html b/src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.html similarity index 100% rename from src/portal/src/app/config/auth/config-auth.component.html rename to src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.html diff --git a/src/portal/src/app/config/auth/config-auth.component.scss b/src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.scss similarity index 100% rename from src/portal/src/app/config/auth/config-auth.component.scss rename to src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.scss diff --git a/src/portal/src/app/config/auth/config-auth.component.spec.ts b/src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.spec.ts similarity index 87% rename from src/portal/src/app/config/auth/config-auth.component.spec.ts rename to src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.spec.ts index 8c993916c0..715979873f 100644 --- a/src/portal/src/app/config/auth/config-auth.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.spec.ts @@ -1,17 +1,17 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../../shared/services/message-handler.service'; import { ConfirmMessageHandler } from '../config.msg.utils'; -import { AppConfigService } from '../../services/app-config.service'; -import { ConfigurationService } from '../config.service'; +import { AppConfigService } from '../../../../services/app-config.service'; +import { ConfigurationService } from '../../../../services/config.service'; import { ConfigurationAuthComponent } from './config-auth.component'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { CUSTOM_ELEMENTS_SCHEMA, SimpleChange } from '@angular/core'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { of } from 'rxjs'; -import { ErrorHandler } from "../../../lib/utils/error-handler"; -import { SystemInfoService } from "../../../lib/services"; -import { clone } from '../../../lib/utils/utils'; -import { CONFIG_AUTH_MODE } from '../../../lib/entities/shared.const'; +import { ErrorHandler } from "../../../../shared/units/error-handler"; +import { SystemInfoService } from "../../../../shared/services"; +import { clone } from '../../../../shared/units/utils'; +import { CONFIG_AUTH_MODE } from '../../../../shared/entities/shared.const'; describe('ConfigurationAuthComponent', () => { let component: ConfigurationAuthComponent; diff --git a/src/portal/src/app/config/auth/config-auth.component.ts b/src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.ts similarity index 92% rename from src/portal/src/app/config/auth/config-auth.component.ts rename to src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.ts index b28ae023bf..00d14e5d36 100644 --- a/src/portal/src/app/config/auth/config-auth.component.ts +++ b/src/portal/src/app/base/left-side-nav/config/auth/config-auth.component.ts @@ -14,17 +14,16 @@ import { Component, Input, ViewChild, SimpleChanges, OnChanges, OnInit, Output, EventEmitter } from '@angular/core'; import { NgForm } from '@angular/forms'; import { Subscription } from "rxjs"; -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../../shared/services/message-handler.service'; import { ConfirmMessageHandler } from '../config.msg.utils'; -import { AppConfigService } from '../../services/app-config.service'; -import { ConfigurationService } from '../config.service'; -import { Configuration } from "../../../lib/components/config/config"; -import { ErrorHandler } from "../../../lib/utils/error-handler"; -import { errorHandler as errorHandlerFn } from "../../../lib/utils/shared/shared.utils"; - -import { SystemInfoService } from "../../../lib/services"; -import { clone, isEmpty, getChanges as getChangesFunc } from "../../../lib/utils/utils"; -import { CONFIG_AUTH_MODE } from "../../../lib/entities/shared.const"; +import { AppConfigService } from '../../../../services/app-config.service'; +import { ConfigurationService } from '../../../../services/config.service'; +import { ErrorHandler } from "../../../../shared/units/error-handler"; +import { SystemInfoService } from "../../../../shared/services"; +import { clone, isEmpty, getChanges as getChangesFunc } from "../../../../shared/units/utils"; +import { CONFIG_AUTH_MODE } from "../../../../shared/entities/shared.const"; +import { errorHandler } from "../../../../shared/units/shared.utils"; +import { Configuration } from "../config"; const fakePass = 'aWpLOSYkIzJTTU4wMDkx'; @Component({ @@ -49,7 +48,7 @@ export class ConfigurationAuthComponent implements OnChanges, OnInit { private appConfigService: AppConfigService, private confirmMessageHandler: ConfirmMessageHandler, private systemInfo: SystemInfoService, - private errorHandler: ErrorHandler, + private errorHandlerEntity: ErrorHandler, ) { } ngOnInit() { @@ -58,7 +57,7 @@ export class ConfigurationAuthComponent implements OnChanges, OnInit { getSystemInfo(): void { this.systemInfo.getSystemInfo() .subscribe(systemInfo => (this.redirectUrl = systemInfo.external_url) - , error => this.errorHandler.error(error)); + , error => this.errorHandlerEntity.error(error)); } get checkable() { return this.currentConfig && @@ -144,7 +143,7 @@ export class ConfigurationAuthComponent implements OnChanges, OnInit { this.msgHandler.showSuccess('CONFIG.TEST_LDAP_SUCCESS'); }, error => { this.testingOnGoing = false; - let err = errorHandlerFn(error); + let err = errorHandler(error); if (!err || !err.trim()) { err = 'UNKNOWN'; } @@ -165,10 +164,9 @@ export class ConfigurationAuthComponent implements OnChanges, OnInit { this.msgHandler.showSuccess('CONFIG.TEST_OIDC_SUCCESS'); }, error => { this.testingOnGoing = false; - this.errorHandler.error(error); + this.errorHandlerEntity.error(error); }); } - } public get showTestingServerBtn(): boolean { diff --git a/src/portal/src/app/config/config.component.html b/src/portal/src/app/base/left-side-nav/config/config.component.html similarity index 100% rename from src/portal/src/app/config/config.component.html rename to src/portal/src/app/base/left-side-nav/config/config.component.html diff --git a/src/portal/src/app/config/config.component.scss b/src/portal/src/app/base/left-side-nav/config/config.component.scss similarity index 100% rename from src/portal/src/app/config/config.component.scss rename to src/portal/src/app/base/left-side-nav/config/config.component.scss diff --git a/src/portal/src/app/config/config.component.spec.ts b/src/portal/src/app/base/left-side-nav/config/config.component.spec.ts similarity index 84% rename from src/portal/src/app/config/config.component.spec.ts rename to src/portal/src/app/base/left-side-nav/config/config.component.spec.ts index e92e6606f5..4cdac61ae4 100644 --- a/src/portal/src/app/config/config.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/config/config.component.spec.ts @@ -1,17 +1,17 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { SessionService } from '../shared/session.service'; -import { ConfirmationDialogService } from '../shared/confirmation-dialog/confirmation-dialog.service'; -import { MessageHandlerService } from '../shared/message-handler/message-handler.service'; +import { SessionService } from '../../../shared/services/session.service'; +import { MessageHandlerService } from '../../../shared/services/message-handler.service'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ClarityModule } from "@clr/angular"; -import { AppConfigService } from '../services/app-config.service'; -import { ConfigurationService } from './config.service'; +import { AppConfigService } from '../../../services/app-config.service'; +import { ConfigurationService } from '../../../services/config.service'; import { ConfigurationComponent } from './config.component'; import { of } from 'rxjs'; -import { ConfirmationAcknowledgement } from '../shared/confirmation-dialog/confirmation-state-message'; -import { ConfirmationState, ConfirmationTargets } from '../shared/shared.const'; -import { Configuration } from '../../lib/components/config/config'; +import { Configuration } from './config'; +import { ConfirmationState, ConfirmationTargets } from "../../../shared/entities/shared.const"; +import { ConfirmationDialogService } from "../../global-confirmation-dialog/confirmation-dialog.service"; +import { ConfirmationAcknowledgement } from "../../global-confirmation-dialog/confirmation-state-message"; describe('ConfigurationComponent', () => { let component: ConfigurationComponent; diff --git a/src/portal/src/app/config/config.component.ts b/src/portal/src/app/base/left-side-nav/config/config.component.ts similarity index 88% rename from src/portal/src/app/config/config.component.ts rename to src/portal/src/app/base/left-side-nav/config/config.component.ts index 284d696e56..0e0e25322b 100644 --- a/src/portal/src/app/config/config.component.ts +++ b/src/portal/src/app/base/left-side-nav/config/config.component.ts @@ -13,17 +13,17 @@ // limitations under the License. import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; import { Subscription } from "rxjs"; -import { ConfirmationTargets, ConfirmationState } from '../shared/shared.const'; -import { SessionService } from '../shared/session.service'; -import { ConfirmationDialogService } from '../shared/confirmation-dialog/confirmation-dialog.service'; -import { MessageHandlerService } from '../shared/message-handler/message-handler.service'; -import { AppConfigService } from '../services/app-config.service'; +import { SessionService } from '../../../shared/services/session.service'; +import { MessageHandlerService } from '../../../shared/services/message-handler.service'; +import { AppConfigService } from '../../../services/app-config.service'; import { ConfigurationAuthComponent } from './auth/config-auth.component'; import { ConfigurationEmailComponent } from './email/config-email.component'; -import { ConfigurationService } from './config.service'; -import { Configuration, StringValueItem } from "../../lib/components/config/config"; -import { SystemSettingsComponent } from "../../lib/components/config/system/system-settings.component"; -import { clone, isEmpty } from "../../lib/utils/utils"; +import { ConfigurationService } from '../../../services/config.service'; +import { Configuration, StringValueItem } from "./config"; +import { SystemSettingsComponent } from "./system/system-settings.component"; +import { clone, isEmpty } from "../../../shared/units/utils"; +import { ConfirmationDialogService } from "../../global-confirmation-dialog/confirmation-dialog.service"; +import { ConfirmationState, ConfirmationTargets } from "../../../shared/entities/shared.const"; const fakePass = 'aWpLOSYkIzJTTU4wMDkx'; const TabLinkContentMap = { diff --git a/src/portal/src/app/config/config.module.ts b/src/portal/src/app/base/left-side-nav/config/config.module.ts similarity index 56% rename from src/portal/src/app/config/config.module.ts rename to src/portal/src/app/base/left-side-nav/config/config.module.ts index 1934c4fd7e..d1f80dad2f 100644 --- a/src/portal/src/app/config/config.module.ts +++ b/src/portal/src/app/base/left-side-nav/config/config.module.ts @@ -13,37 +13,33 @@ // limitations under the License. import { NgModule } from "@angular/core"; -import { CoreModule } from "../core/core.module"; -import { SharedModule } from "../shared/shared.module"; - +import { SharedModule } from "../../../shared/shared.module"; import { ConfigurationComponent } from "./config.component"; -import { ConfigurationService } from "./config.service"; import { ConfirmMessageHandler } from "./config.msg.utils"; import { ConfigurationAuthComponent } from "./auth/config-auth.component"; import { ConfigurationEmailComponent } from "./email/config-email.component"; -import { ConfigurationScannerComponent } from "./scanner/config-scanner.component"; -import { NewScannerModalComponent } from "./scanner/new-scanner-modal/new-scanner-modal.component"; -import { NewScannerFormComponent } from "./scanner/new-scanner-form/new-scanner-form.component"; -import { ConfigScannerService } from "./scanner/config-scanner.service"; -import { ScannerMetadataComponent } from "./scanner/scanner-metadata/scanner-metadata.component"; - +import { SystemSettingsComponent } from "./system/system-settings.component"; +import { RouterModule, Routes } from "@angular/router"; +const routes: Routes = [ + { + path: '', + component: ConfigurationComponent + } +]; @NgModule({ - imports: [CoreModule, SharedModule], + imports: [ + SharedModule, + RouterModule.forChild(routes) + ], declarations: [ ConfigurationComponent, ConfigurationAuthComponent, ConfigurationEmailComponent, - ConfigurationScannerComponent, - NewScannerModalComponent, - NewScannerFormComponent, - ScannerMetadataComponent + SystemSettingsComponent ], - exports: [ConfigurationComponent], providers: [ - ConfigurationService, ConfirmMessageHandler, - ConfigScannerService, ] }) export class ConfigurationModule { diff --git a/src/portal/src/app/config/config.msg.utils.ts b/src/portal/src/app/base/left-side-nav/config/config.msg.utils.ts similarity index 63% rename from src/portal/src/app/config/config.msg.utils.ts rename to src/portal/src/app/base/left-side-nav/config/config.msg.utils.ts index 58e5553883..6a6a87240e 100644 --- a/src/portal/src/app/config/config.msg.utils.ts +++ b/src/portal/src/app/base/left-side-nav/config/config.msg.utils.ts @@ -1,7 +1,7 @@ -import { ConfirmationDialogService } from '../shared/confirmation-dialog/confirmation-dialog.service'; -import { ConfirmationMessage } from '../shared/confirmation-dialog/confirmation-message'; -import { ConfirmationTargets } from '../shared/shared.const'; import { Injectable } from '@angular/core'; +import { ConfirmationDialogService } from "../../global-confirmation-dialog/confirmation-dialog.service"; +import { ConfirmationTargets } from "../../../shared/entities/shared.const"; +import { ConfirmationMessage } from "../../global-confirmation-dialog/confirmation-message"; @Injectable() export class ConfirmMessageHandler { diff --git a/src/portal/src/lib/components/config/config.ts b/src/portal/src/app/base/left-side-nav/config/config.ts similarity index 100% rename from src/portal/src/lib/components/config/config.ts rename to src/portal/src/app/base/left-side-nav/config/config.ts diff --git a/src/portal/src/app/config/email/config-email.component.html b/src/portal/src/app/base/left-side-nav/config/email/config-email.component.html similarity index 100% rename from src/portal/src/app/config/email/config-email.component.html rename to src/portal/src/app/base/left-side-nav/config/email/config-email.component.html diff --git a/src/portal/src/app/config/email/config-email.component.scss b/src/portal/src/app/base/left-side-nav/config/email/config-email.component.scss similarity index 100% rename from src/portal/src/app/config/email/config-email.component.scss rename to src/portal/src/app/base/left-side-nav/config/email/config-email.component.scss diff --git a/src/portal/src/app/config/email/config-email.component.spec.ts b/src/portal/src/app/base/left-side-nav/config/email/config-email.component.spec.ts similarity index 92% rename from src/portal/src/app/config/email/config-email.component.spec.ts rename to src/portal/src/app/base/left-side-nav/config/email/config-email.component.spec.ts index 66d8317738..e7da3538d0 100644 --- a/src/portal/src/app/config/email/config-email.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/config/email/config-email.component.spec.ts @@ -1,12 +1,12 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../../shared/services/message-handler.service'; import { ConfirmMessageHandler } from '../config.msg.utils'; -import { ConfigurationService } from '../config.service'; +import { ConfigurationService } from '../../../../services/config.service'; import { ConfigurationEmailComponent } from './config-email.component'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { clone } from '../../../lib/utils/utils'; +import { clone } from '../../../../shared/units/utils'; import { of } from 'rxjs'; describe('ConfigurationEmailComponent', () => { diff --git a/src/portal/src/app/config/email/config-email.component.ts b/src/portal/src/app/base/left-side-nav/config/email/config-email.component.ts similarity index 93% rename from src/portal/src/app/config/email/config-email.component.ts rename to src/portal/src/app/base/left-side-nav/config/email/config-email.component.ts index 170b8db3ad..c180cbfda5 100644 --- a/src/portal/src/app/config/email/config-email.component.ts +++ b/src/portal/src/app/base/left-side-nav/config/email/config-email.component.ts @@ -13,13 +13,13 @@ // limitations under the License. import { Component, Input, ViewChild, SimpleChanges, OnChanges, Output, EventEmitter } from '@angular/core'; import { NgForm } from '@angular/forms'; -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../../shared/services/message-handler.service'; import { ConfirmMessageHandler } from '../config.msg.utils'; -import { ConfigurationService } from '../config.service'; -import { Configuration } from "../../../lib/components/config/config"; -import { isEmpty, getChanges as getChangesFunc, clone } from "../../../lib/utils/utils"; -import { errorHandler } from "../../../lib/utils/shared/shared.utils"; -const fakePass = 'aWpLOSYkIzJTTU4wMDkx'; +import { ConfigurationService } from '../../../../services/config.service'; +import { Configuration } from "../config"; +import { isEmpty, getChanges as getChangesFunc, clone } from "../../../../shared/units/utils"; +import { errorHandler } from "../../../../shared/units/shared.utils"; + @Component({ selector: 'config-email', templateUrl: "config-email.component.html", diff --git a/src/portal/src/lib/components/config/system/system-settings.component.html b/src/portal/src/app/base/left-side-nav/config/system/system-settings.component.html similarity index 100% rename from src/portal/src/lib/components/config/system/system-settings.component.html rename to src/portal/src/app/base/left-side-nav/config/system/system-settings.component.html diff --git a/src/portal/src/lib/components/config/system/system-settings.component.scss b/src/portal/src/app/base/left-side-nav/config/system/system-settings.component.scss similarity index 83% rename from src/portal/src/lib/components/config/system/system-settings.component.scss rename to src/portal/src/app/base/left-side-nav/config/system/system-settings.component.scss index d9bafdb5e0..7338f1c770 100644 --- a/src/portal/src/lib/components/config/system/system-settings.component.scss +++ b/src/portal/src/app/base/left-side-nav/config/system/system-settings.component.scss @@ -112,3 +112,27 @@ transform: translateY(-50%); } } +.info-tips-icon { + color: grey; +} + +.info-tips-icon:hover { + color: #007CBB; +} + +.replication-config { + margin-top: 0; + margin-bottom: 0; +} + +.replication-text { + font-size: 14px; + font-weight: 600; +} + +.replication-tooltip { + top: -8px; +} +.margin-top-3px { + margin-top: 3px; +} diff --git a/src/portal/src/lib/components/config/system/system-settings.component.spec.ts b/src/portal/src/app/base/left-side-nav/config/system/system-settings.component.spec.ts similarity index 81% rename from src/portal/src/lib/components/config/system/system-settings.component.spec.ts rename to src/portal/src/app/base/left-side-nav/config/system/system-settings.component.spec.ts index 2bfee9bc8c..2cd8931da8 100644 --- a/src/portal/src/lib/components/config/system/system-settings.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/config/system/system-settings.component.spec.ts @@ -1,19 +1,14 @@ import { ComponentFixture, ComponentFixtureAutoDetect, TestBed } from '@angular/core/testing'; -import { HarborLibraryModule } from "../../../harbor-library.module"; -import { IServiceConfig, SERVICE_CONFIG } from "../../../entities/service.config"; import { SystemSettingsComponent } from "./system-settings.component"; -import { ConfigurationService, SystemInfoService } from "../../../services"; -import { ErrorHandler } from "../../../utils/error-handler"; +import { SystemInfoService } from "../../../../shared/services"; +import { ErrorHandler } from "../../../../shared/units/error-handler"; import { of } from "rxjs"; import { StringValueItem } from "../config"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -import { CURRENT_BASE_HREF } from "../../../utils/utils"; +import { SharedTestingModule } from "../../../../shared/shared.module"; describe('SystemSettingsComponent', () => { let component: SystemSettingsComponent; let fixture: ComponentFixture; - const config: IServiceConfig = { - baseEndpoint: CURRENT_BASE_HREF + "/testing" - }; const mockedAllowlist = { id: 1, project_id: 1, @@ -41,17 +36,18 @@ describe('SystemSettingsComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HarborLibraryModule, + SharedTestingModule, BrowserAnimationsModule ], providers: [ - ConfigurationService, { provide: ErrorHandler, useValue: fakedErrorHandler }, { provide: SystemInfoService, useValue: fakedSystemInfoService }, - { provide: SERVICE_CONFIG, useValue: config }, // open auto detect { provide: ComponentFixtureAutoDetect, useValue: true } - ] + ], + declarations: [ + SystemSettingsComponent + ] }); }); beforeEach(() => { diff --git a/src/portal/src/lib/components/config/system/system-settings.component.ts b/src/portal/src/app/base/left-side-nav/config/system/system-settings.component.ts similarity index 91% rename from src/portal/src/lib/components/config/system/system-settings.component.ts rename to src/portal/src/app/base/left-side-nav/config/system/system-settings.component.ts index 1b8163d303..f8ad46e5f0 100644 --- a/src/portal/src/lib/components/config/system/system-settings.component.ts +++ b/src/portal/src/app/base/left-side-nav/config/system/system-settings.component.ts @@ -5,24 +5,22 @@ import { Output, EventEmitter, ViewChild, - Inject, OnChanges, SimpleChanges, ElementRef } from '@angular/core'; import {NgForm} from '@angular/forms'; import {Configuration, StringValueItem} from '../config'; -import {SERVICE_CONFIG, IServiceConfig} from '../../../entities/service.config'; -import {clone, isEmpty, getChanges, compareValue} from '../../../utils/utils'; -import {ErrorHandler} from '../../../utils/error-handler'; -import {ConfirmationMessage} from '../../confirmation-dialog/confirmation-message'; -import {ConfirmationDialogComponent} from '../../confirmation-dialog/confirmation-dialog.component'; -import {ConfirmationState, ConfirmationTargets} from '../../../entities/shared.const'; -import {ConfirmationAcknowledgement} from '../../confirmation-dialog/confirmation-state-message'; -import { - ConfigurationService, SystemCVEAllowlist, SystemInfo, SystemInfoService, VulnerabilityItem -} from '../../../services'; +import { clone, isEmpty, getChanges, compareValue, CURRENT_BASE_HREF } from '../../../../shared/units/utils'; +import {ErrorHandler} from '../../../../shared/units/error-handler'; +import {ConfirmationMessage} from '../../../global-confirmation-dialog/confirmation-message'; +import {ConfirmationDialogComponent} from '../../../../shared/components/confirmation-dialog'; +import {ConfirmationState, ConfirmationTargets} from '../../../../shared/entities/shared.const'; +import {ConfirmationAcknowledgement} from '../../../global-confirmation-dialog/confirmation-state-message'; +import { SystemCVEAllowlist, SystemInfo, SystemInfoService, +} from '../../../../shared/services'; import {forkJoin} from "rxjs"; +import { ConfigurationService } from "../../../../services/config.service"; const fakePass = 'aWpLOSYkIzJTTU4wMDkx'; const ONE_THOUSAND: number = 1000; @@ -32,7 +30,7 @@ const TARGET_BLANK = "_blank"; @Component({ selector: 'system-settings', templateUrl: './system-settings.component.html', - styleUrls: ['./system-settings.component.scss', '../registry-config.component.scss'] + styleUrls: ['./system-settings.component.scss'] }) export class SystemSettingsComponent implements OnChanges, OnInit { config: Configuration = new Configuration(); @@ -161,7 +159,7 @@ export class SystemSettingsComponent implements OnChanges, OnInit { this.onGoing = true; let observables = []; if (!isEmpty(changes)) { - observables.push(this.configService.saveConfigurations(changes)); + observables.push(this.configService.saveConfiguration(changes)); } if (!compareValue(this.systemAllowlistOrigin, this.systemAllowlist)) { observables.push(this.systemInfoService.updateSystemAllowlist(this.systemAllowlist)); @@ -197,7 +195,7 @@ export class SystemSettingsComponent implements OnChanges, OnInit { retrieveConfig(): void { this.onGoing = true; - this.configService.getConfigurations() + this.configService.getConfiguration() .subscribe((configurations: Configuration) => { this.onGoing = false; // Add two password fields @@ -263,13 +261,11 @@ export class SystemSettingsComponent implements OnChanges, OnInit { } } - constructor(@Inject(SERVICE_CONFIG) private configInfo: IServiceConfig, + constructor( private configService: ConfigurationService, private errorHandler: ErrorHandler, private systemInfoService: SystemInfoService) { - if (this.configInfo && this.configInfo.systemInfoEndpoint) { - this.downloadLink = this.configInfo.systemInfoEndpoint + "/getcert"; - } + this.downloadLink = CURRENT_BASE_HREF + "/systeminfo/getcert"; } ngOnInit() { diff --git a/src/portal/src/app/distribution/base.scss b/src/portal/src/app/base/left-side-nav/distribution/base.scss similarity index 100% rename from src/portal/src/app/distribution/base.scss rename to src/portal/src/app/base/left-side-nav/distribution/base.scss diff --git a/src/portal/src/app/distribution/distribution-instances/distribution-instances.component.html b/src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.html similarity index 100% rename from src/portal/src/app/distribution/distribution-instances/distribution-instances.component.html rename to src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.html diff --git a/src/portal/src/app/distribution/distribution-instances/distribution-instances.component.scss b/src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.scss similarity index 95% rename from src/portal/src/app/distribution/distribution-instances/distribution-instances.component.scss rename to src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.scss index 63b7653489..11ceadcd95 100644 --- a/src/portal/src/app/distribution/distribution-instances/distribution-instances.component.scss +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.scss @@ -1,4 +1,4 @@ -@import "../base.scss"; +@import "../base"; $refrsh-btn-color: #007CBB; .refresh-btn { @include refresh-button diff --git a/src/portal/src/app/distribution/distribution-instances/distribution-instances.component.spec.ts b/src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.spec.ts similarity index 92% rename from src/portal/src/app/distribution/distribution-instances/distribution-instances.component.spec.ts rename to src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.spec.ts index 16b3397e48..1a76f46a0c 100644 --- a/src/portal/src/app/distribution/distribution-instances/distribution-instances.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.spec.ts @@ -1,16 +1,16 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { ClarityModule } from '@clr/angular'; -import { SharedModule } from '../../shared/shared.module'; +import { SharedTestingModule } from '../../../../shared/shared.module'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { DistributionInstancesComponent } from './distribution-instances.component'; -import { PreheatService } from "../../../../ng-swagger-gen/services/preheat.service"; -import { Instance } from '../../../../ng-swagger-gen/models/instance'; +import { PreheatService } from "../../../../../../ng-swagger-gen/services/preheat.service"; +import { Instance } from '../../../../../../ng-swagger-gen/models/instance'; import { HttpHeaders, HttpResponse } from '@angular/common/http'; import { of } from 'rxjs'; import { delay } from 'rxjs/operators'; -import { Metadata } from '../../../../ng-swagger-gen/models/metadata'; +import { Metadata } from '../../../../../../ng-swagger-gen/models/metadata'; import { DistributionSetupModalComponent } from '../distribution-setup-modal/distribution-setup-modal.component'; describe('DistributionInstanceComponent', () => { @@ -101,7 +101,7 @@ describe('DistributionInstanceComponent', () => { imports: [ ClarityModule, TranslateModule, - SharedModule, + SharedTestingModule, HttpClientTestingModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA], diff --git a/src/portal/src/app/distribution/distribution-instances/distribution-instances.component.ts b/src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.ts similarity index 92% rename from src/portal/src/app/distribution/distribution-instances/distribution-instances.component.ts rename to src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.ts index 0c3e1c940d..60924e6b12 100644 --- a/src/portal/src/app/distribution/distribution-instances/distribution-instances.component.ts +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution-instances/distribution-instances.component.ts @@ -1,4 +1,4 @@ -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../../shared/services/message-handler.service'; import { Component, OnInit, ViewChild, OnDestroy } from '@angular/core'; import { Subscription, @@ -7,28 +7,24 @@ import { throwError as observableThrowError } from 'rxjs'; import { DistributionSetupModalComponent } from '../distribution-setup-modal/distribution-setup-modal.component'; -import { OperationService } from '../../../lib/components/operation/operation.service'; -import { - ConfirmationState, - ConfirmationTargets, - ConfirmationButtons -} from '../../shared/shared.const'; -import { ConfirmationDialogService } from '../../shared/confirmation-dialog/confirmation-dialog.service'; -import { ConfirmationMessage } from '../../shared/confirmation-dialog/confirmation-message'; +import { OperationService } from '../../../../shared/components/operation/operation.service'; import { operateChanges, OperateInfo, OperationState -} from '../../../lib/components/operation/operate'; +} from '../../../../shared/components/operation/operate'; import { TranslateService } from '@ngx-translate/core'; import { map, catchError, finalize } from 'rxjs/operators'; -import { errorHandler } from '../../../lib/utils/shared/shared.utils'; -import { clone, DEFAULT_PAGE_SIZE } from '../../../lib/utils/utils'; -import { Instance } from "../../../../ng-swagger-gen/models/instance"; -import { PreheatService } from "../../../../ng-swagger-gen/services/preheat.service"; -import { Metadata } from '../../../../ng-swagger-gen/models/metadata'; +import { clone, DEFAULT_PAGE_SIZE } from '../../../../shared/units/utils'; +import { Instance } from "../../../../../../ng-swagger-gen/models/instance"; +import { PreheatService } from "../../../../../../ng-swagger-gen/services/preheat.service"; +import { Metadata } from '../../../../../../ng-swagger-gen/models/metadata'; import { FrontInstance, HEALTHY, UNHEALTHY } from '../distribution-interface'; import { ClrDatagridStateInterface } from '@clr/angular'; +import { ConfirmationDialogService } from "../../../global-confirmation-dialog/confirmation-dialog.service"; +import { ConfirmationButtons, ConfirmationState, ConfirmationTargets } from "../../../../shared/entities/shared.const"; +import { errorHandler } from "../../../../shared/units/shared.utils"; +import { ConfirmationMessage } from "../../../global-confirmation-dialog/confirmation-message"; interface MultiOperateData { operation: string; diff --git a/src/portal/src/app/distribution/distribution-interface.ts b/src/portal/src/app/base/left-side-nav/distribution/distribution-interface.ts similarity index 87% rename from src/portal/src/app/distribution/distribution-interface.ts rename to src/portal/src/app/base/left-side-nav/distribution/distribution-interface.ts index c555ceca42..6e6adcf172 100644 --- a/src/portal/src/app/distribution/distribution-interface.ts +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution-interface.ts @@ -1,4 +1,4 @@ -import { Instance } from '../../../ng-swagger-gen/models/instance'; +import { Instance } from '../../../../../ng-swagger-gen/models/instance'; export class AuthMode { static NONE = 'NONE'; diff --git a/src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.html b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.html similarity index 100% rename from src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.html rename to src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.html diff --git a/src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.scss b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.scss similarity index 100% rename from src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.scss rename to src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.scss diff --git a/src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.spec.ts b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.spec.ts similarity index 92% rename from src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.spec.ts rename to src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.spec.ts index 9fa751520d..5161a4febf 100644 --- a/src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.spec.ts @@ -1,12 +1,12 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { TranslateModule } from '@ngx-translate/core'; import { ClarityModule } from '@clr/angular'; -import { SharedModule } from '../../shared/shared.module'; +import { SharedTestingModule } from '../../../../shared/shared.module'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { DistributionSetupModalComponent } from './distribution-setup-modal.component'; -import { PreheatService } from "../../../../ng-swagger-gen/services/preheat.service"; -import { Instance } from '../../../../ng-swagger-gen/models/instance'; +import { PreheatService } from "../../../../../../ng-swagger-gen/services/preheat.service"; +import { Instance } from '../../../../../../ng-swagger-gen/models/instance'; import { of } from 'rxjs'; import { delay } from 'rxjs/operators'; @@ -37,7 +37,7 @@ describe('DistributionSetupModalComponent', () => { imports: [ ClarityModule, TranslateModule, - SharedModule, + SharedTestingModule, HttpClientTestingModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA], diff --git a/src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.ts b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.ts similarity index 94% rename from src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.ts rename to src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.ts index 81004ccd04..18aa2c1862 100644 --- a/src/portal/src/app/distribution/distribution-setup-modal/distribution-setup-modal.component.ts +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.ts @@ -1,4 +1,4 @@ -import { MessageHandlerService } from '../../shared/message-handler/message-handler.service'; +import { MessageHandlerService } from '../../../../shared/services/message-handler.service'; import { Component, EventEmitter, @@ -10,18 +10,18 @@ import { } from '@angular/core'; import { NgForm } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; -import { errorHandler } from '../../../lib/utils/shared/shared.utils'; -import { PreheatService } from '../../../../ng-swagger-gen/services/preheat.service'; -import { Instance } from '../../../../ng-swagger-gen/models/instance'; +import { PreheatService } from '../../../../../../ng-swagger-gen/services/preheat.service'; +import { Instance } from '../../../../../../ng-swagger-gen/models/instance'; import { AuthMode, FrontInstance } from '../distribution-interface'; -import { clone } from '../../../lib/utils/utils'; -import { InlineAlertComponent } from '../../shared/inline-alert/inline-alert.component'; +import { clone } from '../../../../shared/units/utils'; import { ClrLoadingState } from '@clr/angular'; -import { Metadata } from '../../../../ng-swagger-gen/models/metadata'; -import { operateChanges, OperateInfo, OperationState } from '../../../lib/components/operation/operate'; -import { OperationService } from '../../../lib/components/operation/operation.service'; +import { Metadata } from '../../../../../../ng-swagger-gen/models/metadata'; +import { operateChanges, OperateInfo, OperationState } from '../../../../shared/components/operation/operate'; +import { OperationService } from '../../../../shared/components/operation/operation.service'; import { debounceTime, distinctUntilChanged, filter, finalize, switchMap } from 'rxjs/operators'; import { Subject, Subscription } from 'rxjs'; +import { InlineAlertComponent } from "../../../../shared/components/inline-alert/inline-alert.component"; +import { errorHandler } from "../../../../shared/units/shared.utils"; const DEFAULT_PROVIDER: string = 'dragonfly'; diff --git a/src/portal/src/app/distribution/distribution.module.ts b/src/portal/src/app/base/left-side-nav/distribution/distribution.module.ts similarity index 53% rename from src/portal/src/app/distribution/distribution.module.ts rename to src/portal/src/app/base/left-side-nav/distribution/distribution.module.ts index 2a850b8d8c..fcd10fe0c6 100644 --- a/src/portal/src/app/distribution/distribution.module.ts +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution.module.ts @@ -1,11 +1,21 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { DistributionInstancesComponent } from './distribution-instances/distribution-instances.component'; import { DistributionSetupModalComponent } from './distribution-setup-modal/distribution-setup-modal.component'; -import { SharedModule } from '../shared/shared.module'; +import { SharedModule } from '../../../shared/shared.module'; +import { RouterModule, Routes } from "@angular/router"; +const routes: Routes = [ + { + path: 'instances', + component: DistributionInstancesComponent + }, + { path: '', redirectTo: 'instances', pathMatch: 'full' }, +]; @NgModule({ - imports: [CommonModule, SharedModule], + imports: [ + SharedModule, + RouterModule.forChild(routes) + ], declarations: [ DistributionSetupModalComponent, DistributionInstancesComponent diff --git a/src/portal/src/app/gc-page/gc-page.component.html b/src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.html similarity index 100% rename from src/portal/src/app/gc-page/gc-page.component.html rename to src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.html diff --git a/src/portal/src/app/gc-page/gc-page.component.scss b/src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.scss similarity index 100% rename from src/portal/src/app/gc-page/gc-page.component.scss rename to src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.scss diff --git a/src/portal/src/app/gc-page/gc-page.component.spec.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.spec.ts similarity index 94% rename from src/portal/src/app/gc-page/gc-page.component.spec.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.spec.ts index 41ef3be18b..01857ee1de 100644 --- a/src/portal/src/app/gc-page/gc-page.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.spec.ts @@ -2,7 +2,7 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { ClarityModule } from '@clr/angular'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { SessionService } from "../shared/session.service"; +import { SessionService } from "../../../shared/services/session.service"; import { GcPageComponent } from './gc-page.component'; describe('GcPageComponent', () => { diff --git a/src/portal/src/app/gc-page/gc-page.component.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.ts similarity index 87% rename from src/portal/src/app/gc-page/gc-page.component.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.ts index 00bf2a3dcc..90cef9fb52 100644 --- a/src/portal/src/app/gc-page/gc-page.component.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc-page.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from "@angular/core"; -import { SessionService } from "../shared/session.service"; +import { SessionService } from "../../../shared/services/session.service"; @Component({ selector: "app-gc-page", diff --git a/src/portal/src/app/base/left-side-nav/gc-page/gc.module.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc.module.ts new file mode 100644 index 0000000000..447fbadf87 --- /dev/null +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc.module.ts @@ -0,0 +1,33 @@ +import { NgModule } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; +import { GcPageComponent } from "./gc-page.component"; +import { GcComponent } from "./gc/gc.component"; +import { GcHistoryComponent } from "./gc/gc-history/gc-history.component"; +import { GcRepoService } from "./gc/gc.service"; +import { SharedModule } from "../../../shared/shared.module"; +import { GcApiDefaultRepository, GcApiRepository } from "./gc/gc.api.repository"; +import { GcViewModelFactory } from "./gc/gc.viewmodel.factory"; + +const routes: Routes = [ + { + path: '', + component: GcPageComponent + } +]; +@NgModule({ + imports: [ + SharedModule, + RouterModule.forChild(routes) + ], + declarations: [ + GcPageComponent, + GcComponent, + GcHistoryComponent + ], + providers: [ + GcRepoService, + {provide: GcApiRepository, useClass: GcApiDefaultRepository }, + GcViewModelFactory + ] +}) +export class GcModule {} diff --git a/src/portal/src/lib/components/config/gc/gc-history/gc-history.component.html b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.html similarity index 100% rename from src/portal/src/lib/components/config/gc/gc-history/gc-history.component.html rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.html diff --git a/src/portal/src/lib/components/config/gc/gc-history/gc-history.component.scss b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.scss similarity index 100% rename from src/portal/src/lib/components/config/gc/gc-history/gc-history.component.scss rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.scss diff --git a/src/portal/src/lib/components/config/gc/gc-history/gc-history.component.spec.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.spec.ts similarity index 93% rename from src/portal/src/lib/components/config/gc/gc-history/gc-history.component.spec.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.spec.ts index c3cd1d3afb..565a2c225a 100644 --- a/src/portal/src/lib/components/config/gc/gc-history/gc-history.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.spec.ts @@ -1,19 +1,17 @@ import { ComponentFixture, ComponentFixtureAutoDetect, - fakeAsync, TestBed, - tick, waitForAsync } from '@angular/core/testing'; -import { SharedModule } from '../../../../utils/shared/shared.module'; import { GcRepoService } from "../gc.service"; import { of } from 'rxjs'; import { GcViewModelFactory } from "../gc.viewmodel.factory"; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { ErrorHandler } from '../../../../utils/error-handler'; +import { ErrorHandler } from '../../../../../shared/units/error-handler'; import { GcHistoryComponent } from './gc-history.component'; import { GcJobData } from "../gcLog"; +import { SharedTestingModule } from "../../../../../shared/shared.module"; describe('GcHistoryComponent', () => { let component: GcHistoryComponent; @@ -64,7 +62,7 @@ describe('GcHistoryComponent', () => { TestBed.configureTestingModule({ declarations: [GcHistoryComponent], imports: [ - SharedModule, + SharedTestingModule, TranslateModule.forRoot() ], providers: [ diff --git a/src/portal/src/lib/components/config/gc/gc-history/gc-history.component.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.ts similarity index 93% rename from src/portal/src/lib/components/config/gc/gc-history/gc-history.component.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.ts index 1ecb868cab..1bc51754f5 100644 --- a/src/portal/src/lib/components/config/gc/gc-history/gc-history.component.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc-history/gc-history.component.ts @@ -2,9 +2,9 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { GcRepoService } from "../gc.service"; import { GcJobViewModel } from "../gcLog"; import { GcViewModelFactory } from "../gc.viewmodel.factory"; -import { ErrorHandler } from "../../../../utils/error-handler"; +import { ErrorHandler } from "../../../../../shared/units/error-handler"; import { Subscription, timer } from "rxjs"; -import { REFRESH_TIME_DIFFERENCE } from '../../../../entities/shared.const'; +import { REFRESH_TIME_DIFFERENCE } from '../../../../../shared/entities/shared.const'; const JOB_STATUS = { PENDING: "pending", RUNNING: "running" diff --git a/src/portal/src/lib/components/config/gc/gc.api.repository.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.api.repository.ts similarity index 64% rename from src/portal/src/lib/components/config/gc/gc.api.repository.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.api.repository.ts index 9c9f754de9..f5c8699dfc 100644 --- a/src/portal/src/lib/components/config/gc/gc.api.repository.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.api.repository.ts @@ -1,9 +1,8 @@ - -import { Injectable, Inject } from '@angular/core'; +import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { throwError as observableThrowError, Observable } from 'rxjs'; -import { catchError, map } from 'rxjs/operators'; -import { SERVICE_CONFIG, IServiceConfig } from "../../../entities/service.config"; +import { catchError } from 'rxjs/operators'; +import { CURRENT_BASE_HREF } from "../../../../shared/units/utils"; export abstract class GcApiRepository { abstract postSchedule(param): Observable; @@ -24,44 +23,43 @@ export abstract class GcApiRepository { @Injectable() export class GcApiDefaultRepository extends GcApiRepository { constructor( - private http: HttpClient, - @Inject(SERVICE_CONFIG) private config: IServiceConfig + private http: HttpClient ) { super(); } public postSchedule(param): Observable { - return this.http.post(`${this.config.gcEndpoint}/schedule`, param) + return this.http.post(`${CURRENT_BASE_HREF}/system/gc/schedule`, param) .pipe(catchError(error => observableThrowError(error))); } public putSchedule(param): Observable { - return this.http.put(`${this.config.gcEndpoint}/schedule`, param) + return this.http.put(`${CURRENT_BASE_HREF}/system/gc/schedule`, param) .pipe(catchError(error => observableThrowError(error))); } public getSchedule(): Observable { - return this.http.get(`${this.config.gcEndpoint}/schedule`) + return this.http.get(`${CURRENT_BASE_HREF}/system/gc/schedule`) .pipe(catchError(error => observableThrowError(error))); } public getLog(id): Observable { - return this.http.get(`${this.config.gcEndpoint}/${id}/log`) + return this.http.get(`${CURRENT_BASE_HREF}/system/gc/${id}/log`) .pipe(catchError(error => observableThrowError(error))); } public getStatus(id): Observable { - return this.http.get(`${this.config.gcEndpoint}/id`) + return this.http.get(`${CURRENT_BASE_HREF}/system/gc/${id}`) .pipe(catchError(error => observableThrowError(error))); } public getJobs(): Observable { - return this.http.get(`${this.config.gcEndpoint}`) + return this.http.get(`${CURRENT_BASE_HREF}/system/gc`) .pipe(catchError(error => observableThrowError(error))); } public getLogLink(id) { - return `${this.config.gcEndpoint}/${id}/log`; + return `${CURRENT_BASE_HREF}/system/gc/${id}/log`; } } diff --git a/src/portal/src/lib/components/config/gc/gc.component.html b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.html similarity index 100% rename from src/portal/src/lib/components/config/gc/gc.component.html rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.html diff --git a/src/portal/src/lib/components/config/gc/gc.component.scss b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.scss similarity index 100% rename from src/portal/src/lib/components/config/gc/gc.component.scss rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.scss diff --git a/src/portal/src/lib/components/config/gc/gc.component.spec.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.spec.ts similarity index 79% rename from src/portal/src/lib/components/config/gc/gc.component.spec.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.spec.ts index 08ea2b5c98..12e112bdaf 100644 --- a/src/portal/src/lib/components/config/gc/gc.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.spec.ts @@ -1,24 +1,20 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { GcComponent } from './gc.component'; -import { SERVICE_CONFIG, IServiceConfig } from '../../../entities/service.config'; import { GcApiRepository, GcApiDefaultRepository} from './gc.api.repository'; import { GcRepoService } from './gc.service'; -import { SharedModule } from "../../../utils/shared/shared.module"; -import { ErrorHandler } from '../../../utils/error-handler/error-handler'; +import { ErrorHandler } from '../../../../shared/units/error-handler'; import { GcViewModelFactory } from './gc.viewmodel.factory'; -import { CronScheduleComponent } from '../../cron-schedule/cron-schedule.component'; -import { CronTooltipComponent } from "../../cron-schedule/cron-tooltip/cron-tooltip.component"; +import { CronScheduleComponent } from '../../../../shared/components/cron-schedule'; +import { CronTooltipComponent } from "../../../../shared/components/cron-schedule"; import { of } from 'rxjs'; import { GcJobData } from './gcLog'; -import { CURRENT_BASE_HREF } from "../../../utils/utils"; +import { CURRENT_BASE_HREF } from "../../../../shared/units/utils"; +import { SharedTestingModule } from "../../../../shared/shared.module"; describe('GcComponent', () => { let component: GcComponent; let fixture: ComponentFixture; let gcRepoService: GcRepoService; - let config: IServiceConfig = { - systemInfoEndpoint: CURRENT_BASE_HREF + "/system/gc" - }; let mockSchedule = []; let mockJobs: GcJobData[] = [ { @@ -48,12 +44,11 @@ describe('GcComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - SharedModule + SharedTestingModule ], declarations: [ GcComponent, CronScheduleComponent, CronTooltipComponent], providers: [ { provide: GcApiRepository, useClass: GcApiDefaultRepository }, - { provide: SERVICE_CONFIG, useValue: config }, { provide: ErrorHandler, useValue: fakedErrorHandler }, GcRepoService, GcViewModelFactory diff --git a/src/portal/src/lib/components/config/gc/gc.component.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.ts similarity index 94% rename from src/portal/src/lib/components/config/gc/gc.component.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.ts index b6b311d392..6d17e50338 100644 --- a/src/portal/src/lib/components/config/gc/gc.component.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.component.ts @@ -15,9 +15,9 @@ import { ONE_MINITUE, THREE_SECONDS, GCSchedule } from "./gc.const"; -import { ErrorHandler } from "../../../utils/error-handler"; -import { CronScheduleComponent } from "../../cron-schedule/cron-schedule.component"; -import { OriginCron } from '../../../services/interface'; +import { ErrorHandler } from "../../../../shared/units/error-handler"; +import { CronScheduleComponent } from "../../../../shared/components/cron-schedule/cron-schedule.component"; +import { OriginCron } from '../../../../shared/services/interface'; import { finalize } from "rxjs/operators"; @Component({ selector: "gc-config", diff --git a/src/portal/src/lib/components/config/gc/gc.const.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.const.ts similarity index 86% rename from src/portal/src/lib/components/config/gc/gc.const.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.const.ts index 121d40b4cd..d16beb88e5 100644 --- a/src/portal/src/lib/components/config/gc/gc.const.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.const.ts @@ -1,4 +1,4 @@ -import { OriginCron } from "../../../services"; +import { OriginCron } from "../../../../shared/services"; export const SCHEDULE_TYPE_NONE = "None"; diff --git a/src/portal/src/lib/components/config/gc/gc.service.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.service.ts similarity index 94% rename from src/portal/src/lib/components/config/gc/gc.service.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.service.ts index 7d3f1c8752..ee5ab69eac 100644 --- a/src/portal/src/lib/components/config/gc/gc.service.ts +++ b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { Observable, Subscription, Subject, of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { GcApiRepository } from './gc.api.repository'; -import { ErrorHandler } from '../../../utils/error-handler'; +import { ErrorHandler } from '../../../../shared/units/error-handler'; import { GcJobData } from './gcLog'; @@ -11,8 +11,7 @@ export class GcRepoService { constructor( private gcApiRepository: GcApiRepository, - private errorHandler: ErrorHandler) { - } + ) {} public manualGc(shouldDeleteUntagged: boolean, isDryRun: boolean): Observable { const param = { diff --git a/src/portal/src/lib/components/config/gc/gc.viewmodel.factory.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gc.viewmodel.factory.ts similarity index 100% rename from src/portal/src/lib/components/config/gc/gc.viewmodel.factory.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gc.viewmodel.factory.ts diff --git a/src/portal/src/lib/components/config/gc/gcLog.ts b/src/portal/src/app/base/left-side-nav/gc-page/gc/gcLog.ts similarity index 100% rename from src/portal/src/lib/components/config/gc/gcLog.ts rename to src/portal/src/app/base/left-side-nav/gc-page/gc/gcLog.ts diff --git a/src/portal/src/app/group/add-group-modal/add-group-modal.component.html b/src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.html similarity index 100% rename from src/portal/src/app/group/add-group-modal/add-group-modal.component.html rename to src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.html diff --git a/src/portal/src/app/group/add-group-modal/add-group-modal.component.scss b/src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.scss similarity index 100% rename from src/portal/src/app/group/add-group-modal/add-group-modal.component.scss rename to src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.scss diff --git a/src/portal/src/app/group/add-group-modal/add-group-modal.component.spec.ts b/src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.spec.ts similarity index 84% rename from src/portal/src/app/group/add-group-modal/add-group-modal.component.spec.ts rename to src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.spec.ts index f5556590bf..1c50479f2b 100644 --- a/src/portal/src/app/group/add-group-modal/add-group-modal.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.spec.ts @@ -1,13 +1,12 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { ClarityModule } from '@clr/angular'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { TranslateModule } from '@ngx-translate/core'; import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectorRef } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { GroupService } from "../group.service"; -import { MessageHandlerService } from "./../../shared/message-handler/message-handler.service"; -import { SessionService } from "./../../shared/session.service"; -import { UserGroup } from "./../group"; -import { AppConfigService } from "../../services/app-config.service"; +import { MessageHandlerService } from "../../../../shared/services/message-handler.service"; +import { SessionService } from "../../../../shared/services/session.service"; +import { AppConfigService } from "../../../../services/app-config.service"; import { AddGroupModalComponent } from './add-group-modal.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; diff --git a/src/portal/src/app/group/add-group-modal/add-group-modal.component.ts b/src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.ts similarity index 89% rename from src/portal/src/app/group/add-group-modal/add-group-modal.component.ts rename to src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.ts index 5ebd2eb9e8..8f4d4188a9 100644 --- a/src/portal/src/app/group/add-group-modal/add-group-modal.component.ts +++ b/src/portal/src/app/base/left-side-nav/group/add-group-modal/add-group-modal.component.ts @@ -4,11 +4,11 @@ import { Subscription } from "rxjs"; import { Component, OnInit, EventEmitter, Output, ChangeDetectorRef, OnDestroy, ViewChild } from "@angular/core"; import { NgForm } from "@angular/forms"; import { GroupService } from "../group.service"; -import { MessageHandlerService } from "./../../shared/message-handler/message-handler.service"; -import { SessionService } from "./../../shared/session.service"; -import { UserGroup } from "./../group"; -import { AppConfigService } from "../../services/app-config.service"; -import { GroupType } from "../../../lib/entities/shared.const"; +import { MessageHandlerService } from "../../../../shared/services/message-handler.service"; +import { SessionService } from "../../../../shared/services/session.service"; +import { UserGroup } from "../group"; +import { AppConfigService } from "../../../../services/app-config.service"; +import { GroupType } from "../../../../shared/entities/shared.const"; @Component({ selector: "hbr-add-group-modal", diff --git a/src/portal/src/app/group/group.component.html b/src/portal/src/app/base/left-side-nav/group/group.component.html similarity index 100% rename from src/portal/src/app/group/group.component.html rename to src/portal/src/app/base/left-side-nav/group/group.component.html diff --git a/src/portal/src/app/group/group.component.scss b/src/portal/src/app/base/left-side-nav/group/group.component.scss similarity index 100% rename from src/portal/src/app/group/group.component.scss rename to src/portal/src/app/base/left-side-nav/group/group.component.scss diff --git a/src/portal/src/app/group/group.component.spec.ts b/src/portal/src/app/base/left-side-nav/group/group.component.spec.ts similarity index 82% rename from src/portal/src/app/group/group.component.spec.ts rename to src/portal/src/app/base/left-side-nav/group/group.component.spec.ts index fb832c463e..dc907d3cad 100644 --- a/src/portal/src/app/group/group.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/group/group.component.spec.ts @@ -4,13 +4,13 @@ import { ClarityModule } from '@clr/angular'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { FormsModule } from '@angular/forms'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { SessionService } from "./../shared/session.service"; +import { SessionService } from "../../../shared/services/session.service"; import { GroupService } from "./group.service"; import { of } from "rxjs"; -import { ConfirmationDialogService } from "./../shared/confirmation-dialog/confirmation-dialog.service"; -import { MessageHandlerService } from '../shared/message-handler/message-handler.service'; -import { AppConfigService } from '../services/app-config.service'; -import { OperationService } from "../../lib/components/operation/operation.service"; +import { MessageHandlerService } from '../../../shared/services/message-handler.service'; +import { AppConfigService } from '../../../services/app-config.service'; +import { OperationService } from "../../../shared/components/operation/operation.service"; +import { ConfirmationDialogService } from "../../global-confirmation-dialog/confirmation-dialog.service"; describe('GroupComponent', () => { let component: GroupComponent; diff --git a/src/portal/src/app/group/group.component.ts b/src/portal/src/app/base/left-side-nav/group/group.component.ts similarity index 87% rename from src/portal/src/app/group/group.component.ts rename to src/portal/src/app/base/left-side-nav/group/group.component.ts index d0067e0c54..fbfdbd5bbd 100644 --- a/src/portal/src/app/group/group.component.ts +++ b/src/portal/src/app/base/left-side-nav/group/group.component.ts @@ -1,26 +1,25 @@ import { of, Subscription, forkJoin } from "rxjs"; import { flatMap, catchError } from "rxjs/operators"; -import { SessionService } from "./../shared/session.service"; +import { SessionService } from "../../../shared/services/session.service"; import { TranslateService } from "@ngx-translate/core"; import { Component, OnInit, ViewChild, OnDestroy } from "@angular/core"; -import { - ConfirmationTargets, - ConfirmationState, - ConfirmationButtons -} from "../shared/shared.const"; - -import { ConfirmationMessage } from "../shared/confirmation-dialog/confirmation-message"; -import { ConfirmationDialogService } from "./../shared/confirmation-dialog/confirmation-dialog.service"; import { AddGroupModalComponent } from "./add-group-modal/add-group-modal.component"; import { UserGroup } from "./group"; import { GroupService } from "./group.service"; -import { MessageHandlerService } from "../shared/message-handler/message-handler.service"; +import { MessageHandlerService } from "../../../shared/services/message-handler.service"; import { throwError as observableThrowError } from "rxjs"; -import { AppConfigService } from '../services/app-config.service'; -import { OperationService } from "../../lib/components/operation/operation.service"; -import { operateChanges, OperateInfo, OperationState } from "../../lib/components/operation/operate"; -import { errorHandler } from "../../lib/utils/shared/shared.utils"; -import { GroupType } from "../../lib/entities/shared.const"; +import { AppConfigService } from '../../../services/app-config.service'; +import { OperationService } from "../../../shared/components/operation/operation.service"; +import { operateChanges, OperateInfo, OperationState } from "../../../shared/components/operation/operate"; +import { + ConfirmationButtons, + ConfirmationState, + ConfirmationTargets, + GroupType +} from "../../../shared/entities/shared.const"; +import { ConfirmationDialogService } from "../../global-confirmation-dialog/confirmation-dialog.service"; +import { errorHandler } from "../../../shared/units/shared.utils"; +import { ConfirmationMessage } from "../../global-confirmation-dialog/confirmation-message"; @Component({ selector: "app-group", diff --git a/src/portal/src/app/base/left-side-nav/group/group.module.ts b/src/portal/src/app/base/left-side-nav/group/group.module.ts new file mode 100644 index 0000000000..baf0736471 --- /dev/null +++ b/src/portal/src/app/base/left-side-nav/group/group.module.ts @@ -0,0 +1,23 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from '../../../shared/shared.module'; +import { GroupComponent } from './group.component'; +import { AddGroupModalComponent } from './add-group-modal/add-group-modal.component'; +import { RouterModule, Routes } from "@angular/router"; + +const routes: Routes = [ + { + path: '', + component: GroupComponent, + } +]; +@NgModule({ + imports: [ + SharedModule, + RouterModule.forChild(routes), + ], + declarations: [ + GroupComponent, + AddGroupModalComponent + ] +}) +export class GroupModule { } diff --git a/src/portal/src/app/group/group.service.spec.ts b/src/portal/src/app/base/left-side-nav/group/group.service.spec.ts similarity index 100% rename from src/portal/src/app/group/group.service.spec.ts rename to src/portal/src/app/base/left-side-nav/group/group.service.spec.ts diff --git a/src/portal/src/app/group/group.service.ts b/src/portal/src/app/base/left-side-nav/group/group.service.ts similarity index 96% rename from src/portal/src/app/group/group.service.ts rename to src/portal/src/app/base/left-side-nav/group/group.service.ts index 9876b4ec69..4d042473a4 100644 --- a/src/portal/src/app/group/group.service.ts +++ b/src/portal/src/app/base/left-side-nav/group/group.service.ts @@ -3,12 +3,14 @@ import {catchError, map} from 'rxjs/operators'; import { Injectable } from "@angular/core"; import { HttpClient } from "@angular/common/http"; import { UserGroup } from "./group"; -import { CURRENT_BASE_HREF, HTTP_GET_OPTIONS, HTTP_JSON_OPTIONS } from "../../lib/utils/utils"; +import { CURRENT_BASE_HREF, HTTP_GET_OPTIONS, HTTP_JSON_OPTIONS } from "../../../shared/units/utils"; const userGroupEndpoint = CURRENT_BASE_HREF + "/usergroups"; const ldapGroupSearchEndpoint = CURRENT_BASE_HREF + "/ldap/groups/search?groupname="; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class GroupService { constructor(private http: HttpClient) {} diff --git a/src/portal/src/app/group/group.ts b/src/portal/src/app/base/left-side-nav/group/group.ts similarity index 100% rename from src/portal/src/app/group/group.ts rename to src/portal/src/app/base/left-side-nav/group/group.ts diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.html b/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.html similarity index 100% rename from src/portal/src/app/interrogation-services/interrogation-services.component.html rename to src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.html diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.scss b/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.scss similarity index 100% rename from src/portal/src/app/interrogation-services/interrogation-services.component.scss rename to src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.scss diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.spec.ts similarity index 92% rename from src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.spec.ts index c087ce0611..82bd9f416b 100644 --- a/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.spec.ts @@ -1,6 +1,6 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { InterrogationServicesComponent } from './interrogation-services.component'; -import { SharedModule } from "../shared/shared.module"; +import { SharedTestingModule } from "../../../shared/shared.module"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { ClarityModule } from "@clr/angular"; import { TranslateService } from "@ngx-translate/core"; @@ -12,7 +12,7 @@ describe('InterrogationServicesComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - SharedModule, + SharedTestingModule, BrowserAnimationsModule, ClarityModule, ], diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.ts similarity index 100% rename from src/portal/src/app/interrogation-services/interrogation-services.component.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.component.ts diff --git a/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.module.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.module.ts new file mode 100644 index 0000000000..254e6d3351 --- /dev/null +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/interrogation-services.module.ts @@ -0,0 +1,70 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from "@angular/core"; +import { SharedModule } from "../../../shared/shared.module"; +import { NewScannerModalComponent } from "./scanner/new-scanner-modal/new-scanner-modal.component"; +import { ScannerMetadataComponent } from "./scanner/scanner-metadata/scanner-metadata.component"; +import { NewScannerFormComponent } from "./scanner/new-scanner-form/new-scanner-form.component"; +import { ConfigScannerService } from "./scanner/config-scanner.service"; +import { RouterModule, Routes } from "@angular/router"; +import { ConfigurationScannerComponent } from "./scanner/config-scanner.component"; +import { VulnerabilityConfigComponent } from "./vulnerability/vulnerability-config.component"; +import { InterrogationServicesComponent } from "./interrogation-services.component"; +import { ScanAllRepoService } from "./vulnerability/scanAll.service"; +import { ScanApiDefaultRepository, ScanApiRepository } from "./vulnerability/scanAll.api.repository"; + + +const routes: Routes = [ + { + path: '', + component: InterrogationServicesComponent, + children: [ + { + path: 'scanners', + component: ConfigurationScannerComponent + }, + { + path: 'vulnerability', + component: VulnerabilityConfigComponent + }, + { + path: '', + redirectTo: 'scanners', + pathMatch: 'full' + }, + ] + } +]; +@NgModule({ + imports: [ + SharedModule, + RouterModule.forChild(routes), + ], + declarations: [ + NewScannerModalComponent, + NewScannerFormComponent, + ScannerMetadataComponent, + ConfigurationScannerComponent, + InterrogationServicesComponent, + VulnerabilityConfigComponent + ], + providers: [ + ConfigScannerService, + ScanAllRepoService, + {provide: ScanApiRepository, useClass: ScanApiDefaultRepository }, + ] +}) +export class InterrogationServicesModule { +} diff --git a/src/portal/src/app/config/scanner/config-scanner.component.html b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html similarity index 100% rename from src/portal/src/app/config/scanner/config-scanner.component.html rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html diff --git a/src/portal/src/app/config/scanner/config-scanner.component.scss b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.scss similarity index 100% rename from src/portal/src/app/config/scanner/config-scanner.component.scss rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.scss diff --git a/src/portal/src/app/config/scanner/config-scanner.component.spec.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.spec.ts similarity index 89% rename from src/portal/src/app/config/scanner/config-scanner.component.spec.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.spec.ts index 36200f1d81..b28e225dc2 100644 --- a/src/portal/src/app/config/scanner/config-scanner.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.spec.ts @@ -4,14 +4,14 @@ import { ClarityModule } from "@clr/angular"; import { of } from "rxjs"; import { ConfigurationScannerComponent } from "./config-scanner.component"; import { ConfigScannerService } from "./config-scanner.service"; -import { MessageHandlerService } from "../../shared/message-handler/message-handler.service"; -import { ConfirmationDialogService } from "../../shared/confirmation-dialog/confirmation-dialog.service"; -import { SharedModule } from "../../shared/shared.module"; +import { MessageHandlerService } from "../../../../shared/services/message-handler.service"; +import { SharedTestingModule } from "../../../../shared/shared.module"; import { ScannerMetadataComponent } from "./scanner-metadata/scanner-metadata.component"; import { NewScannerModalComponent } from "./new-scanner-modal/new-scanner-modal.component"; import { NewScannerFormComponent } from "./new-scanner-form/new-scanner-form.component"; import { TranslateService } from "@ngx-translate/core"; -import { ErrorHandler } from "../../../lib/utils/error-handler"; +import { ErrorHandler } from "../../../../shared/units/error-handler"; +import { ConfirmationDialogService } from "../../../global-confirmation-dialog/confirmation-dialog.service"; describe('ConfigurationScannerComponent', () => { let mockScannerMetadata = { @@ -47,7 +47,7 @@ describe('ConfigurationScannerComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - SharedModule, + SharedTestingModule, BrowserAnimationsModule, ClarityModule, ], diff --git a/src/portal/src/app/config/scanner/config-scanner.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.ts similarity index 92% rename from src/portal/src/app/config/scanner/config-scanner.component.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.ts index bc077e9105..1311a61e76 100644 --- a/src/portal/src/app/config/scanner/config-scanner.component.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.ts @@ -3,17 +3,17 @@ import { Scanner } from "./scanner"; import { NewScannerModalComponent } from "./new-scanner-modal/new-scanner-modal.component"; import { ConfigScannerService, SCANNERS_DOC } from "./config-scanner.service"; import { finalize } from "rxjs/operators"; -import { MessageHandlerService } from "../../shared/message-handler/message-handler.service"; -import { ConfirmationButtons, ConfirmationState, ConfirmationTargets } from "../../shared/shared.const"; -import { ConfirmationDialogService } from "../../shared/confirmation-dialog/confirmation-dialog.service"; -import { ConfirmationMessage } from '../../shared/confirmation-dialog/confirmation-message'; -import { ErrorHandler } from "../../../lib/utils/error-handler"; -import { clone } from "../../../lib/utils/utils"; +import { MessageHandlerService } from "../../../../shared/services/message-handler.service"; +import { ErrorHandler } from "../../../../shared/units/error-handler"; +import { clone } from "../../../../shared/units/utils"; +import { ConfirmationDialogService } from "../../../global-confirmation-dialog/confirmation-dialog.service"; +import { ConfirmationButtons, ConfirmationState, ConfirmationTargets } from "../../../../shared/entities/shared.const"; +import { ConfirmationMessage } from "../../../global-confirmation-dialog/confirmation-message"; @Component({ selector: 'config-scanner', templateUrl: "config-scanner.component.html", - styleUrls: ['./config-scanner.component.scss', '../config.component.scss'] + styleUrls: ['./config-scanner.component.scss', '../../config/config.component.scss'] }) export class ConfigurationScannerComponent implements OnInit, OnDestroy { scanners: Scanner[] = []; diff --git a/src/portal/src/app/config/scanner/config-scanner.service.spec.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.service.spec.ts similarity index 81% rename from src/portal/src/app/config/scanner/config-scanner.service.spec.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.service.spec.ts index 2c50aab4eb..05af33fde9 100644 --- a/src/portal/src/app/config/scanner/config-scanner.service.spec.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.service.spec.ts @@ -1,12 +1,12 @@ import { TestBed, inject } from '@angular/core/testing'; -import { SharedModule } from "../../shared/shared.module"; +import { SharedTestingModule } from "../../../../shared/shared.module"; import { ConfigScannerService } from "./config-scanner.service"; describe('TagService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - SharedModule + SharedTestingModule ], providers: [ ConfigScannerService diff --git a/src/portal/src/app/config/scanner/config-scanner.service.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.service.ts similarity index 97% rename from src/portal/src/app/config/scanner/config-scanner.service.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.service.ts index 582cbe3089..bac505dbf1 100644 --- a/src/portal/src/app/config/scanner/config-scanner.service.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.service.ts @@ -4,11 +4,13 @@ import { forkJoin, Observable, throwError as observableThrowError } from "rxjs"; import { catchError, map } from "rxjs/operators"; import { HttpClient } from "@angular/common/http"; import { ScannerMetadata } from "./scanner-metadata"; -import { CURRENT_BASE_HREF } from "../../../lib/utils/utils"; +import { CURRENT_BASE_HREF } from "../../../../shared/units/utils"; export const SCANNERS_DOC: string = "https://goharbor.io/blog/harbor-1.10-release/#vulnerability-scanning-with-pluggable-scanners"; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class ConfigScannerService { constructor( private http: HttpClient) {} diff --git a/src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.html b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.html similarity index 100% rename from src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.html rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.html diff --git a/src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.scss b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.scss similarity index 100% rename from src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.scss rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.scss diff --git a/src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.spec.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.spec.ts similarity index 97% rename from src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.spec.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.spec.ts index cbc24883f6..9637851504 100644 --- a/src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.spec.ts @@ -3,7 +3,7 @@ import { NewScannerFormComponent } from "./new-scanner-form.component"; import { FormBuilder } from "@angular/forms"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { ClarityModule } from "@clr/angular"; -import { SharedModule } from "../../../shared/shared.module"; +import { SharedTestingModule } from "../../../../../shared/shared.module"; import { ConfigScannerService } from "../config-scanner.service"; import { of } from "rxjs"; import { TranslateService } from "@ngx-translate/core"; @@ -29,7 +29,7 @@ describe('NewScannerFormComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - SharedModule, + SharedTestingModule, BrowserAnimationsModule, ClarityModule, ], diff --git a/src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.ts similarity index 100% rename from src/portal/src/app/config/scanner/new-scanner-form/new-scanner-form.component.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.ts diff --git a/src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.html b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.html similarity index 100% rename from src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.html rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.html diff --git a/src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.spec.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.spec.ts similarity index 95% rename from src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.spec.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.spec.ts index 72dee4a928..bf5352e1f1 100644 --- a/src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.spec.ts @@ -2,14 +2,13 @@ import { ComponentFixture, ComponentFixtureAutoDetect, fakeAsync, TestBed, tick import { ClrLoadingState } from "@clr/angular"; import { ConfigScannerService } from "../config-scanner.service"; import { NewScannerModalComponent } from "./new-scanner-modal.component"; -import { MessageHandlerService } from "../../../shared/message-handler/message-handler.service"; +import { MessageHandlerService } from "../../../../../shared/services/message-handler.service"; import { NewScannerFormComponent } from "../new-scanner-form/new-scanner-form.component"; import { FormBuilder } from "@angular/forms"; import { of, Subscription } from "rxjs"; import { delay } from "rxjs/operators"; -import { SharedModule as AppSharedModule } from "../../../shared/shared.module"; +import { SharedTestingModule } from "../../../../../shared/shared.module"; import { Scanner } from "../scanner"; -import { SharedModule } from "../../../../lib/utils/shared/shared.module"; describe('NewScannerModalComponent', () => { let component: NewScannerModalComponent; @@ -38,8 +37,7 @@ describe('NewScannerModalComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - SharedModule, - AppSharedModule + SharedTestingModule, ], declarations: [ NewScannerFormComponent, diff --git a/src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.ts similarity index 97% rename from src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.ts index e768b6cc8d..287932b7ce 100644 --- a/src/portal/src/app/config/scanner/new-scanner-modal/new-scanner-modal.component.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.ts @@ -4,14 +4,14 @@ import { NewScannerFormComponent } from "../new-scanner-form/new-scanner-form.co import { ConfigScannerService } from "../config-scanner.service"; import { ClrLoadingState } from "@clr/angular"; import { finalize } from "rxjs/operators"; -import { InlineAlertComponent } from "../../../shared/inline-alert/inline-alert.component"; -import { MessageHandlerService } from "../../../shared/message-handler/message-handler.service"; +import { MessageHandlerService } from "../../../../../shared/services/message-handler.service"; import { TranslateService } from "@ngx-translate/core"; +import { InlineAlertComponent } from "../../../../../shared/components/inline-alert/inline-alert.component"; @Component({ selector: "new-scanner-modal", templateUrl: "new-scanner-modal.component.html", - styleUrls: ['../../../common.scss'] + styleUrls: ['../../../../../common.scss'] }) export class NewScannerModalComponent { testMap: any = {}; diff --git a/src/portal/src/app/config/scanner/scanner-metadata.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata.ts similarity index 100% rename from src/portal/src/app/config/scanner/scanner-metadata.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata.ts diff --git a/src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.component.spec.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.component.spec.ts similarity index 90% rename from src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.component.spec.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.component.spec.ts index ee9130904a..cf956bfc36 100644 --- a/src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.component.spec.ts @@ -1,11 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { ClarityModule } from "@clr/angular"; -import { SharedModule } from "../../../shared/shared.module"; +import { SharedTestingModule } from "../../../../../shared/shared.module"; import { ConfigScannerService } from "../config-scanner.service"; import { of } from "rxjs"; import { ScannerMetadataComponent } from "./scanner-metadata.component"; -import { ErrorHandler } from "../../../../lib/utils/error-handler"; +import { ErrorHandler } from "../../../../../shared/units/error-handler"; describe('ScannerMetadataComponent', () => { let mockScannerMetadata = { @@ -29,7 +29,7 @@ describe('ScannerMetadataComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - SharedModule, + SharedTestingModule, BrowserAnimationsModule, ClarityModule, ], diff --git a/src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.component.ts similarity index 92% rename from src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.component.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.component.ts index 9ae5236562..c24385088e 100644 --- a/src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.component.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.component.ts @@ -6,9 +6,8 @@ import { ConfigScannerService } from "../config-scanner.service"; import { finalize } from "rxjs/operators"; import { ScannerMetadata } from "../scanner-metadata"; import { DatePipe } from "@angular/common"; -import { TranslateService } from "@ngx-translate/core"; -import { ErrorHandler } from "../../../../lib/utils/error-handler"; -import {DATABASE_NEXT_UPDATE_PROPERTY, DATABASE_UPDATED_PROPERTY} from "../../../../lib/utils/utils"; +import { ErrorHandler } from "../../../../../shared/units/error-handler"; +import {DATABASE_NEXT_UPDATE_PROPERTY, DATABASE_UPDATED_PROPERTY} from "../../../../../shared/units/utils"; @Component({ selector: 'scanner-metadata', diff --git a/src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.html b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.html similarity index 100% rename from src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.html rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.html diff --git a/src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.scss b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.scss similarity index 100% rename from src/portal/src/app/config/scanner/scanner-metadata/scanner-metadata.scss rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner-metadata/scanner-metadata.scss diff --git a/src/portal/src/app/config/scanner/scanner.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner.ts similarity index 100% rename from src/portal/src/app/config/scanner/scanner.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/scanner/scanner.ts diff --git a/src/portal/src/lib/components/config/vulnerability/scanAll.api.repository.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/scanAll.api.repository.ts similarity index 64% rename from src/portal/src/lib/components/config/vulnerability/scanAll.api.repository.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/scanAll.api.repository.ts index a1b3115dd5..0c009f2747 100644 --- a/src/portal/src/lib/components/config/vulnerability/scanAll.api.repository.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/scanAll.api.repository.ts @@ -1,9 +1,9 @@ - -import { Injectable, Inject } from '@angular/core'; +import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { throwError as observableThrowError, Observable } from 'rxjs'; -import { catchError, map } from 'rxjs/operators'; -import { SERVICE_CONFIG, IServiceConfig } from "../../../entities/service.config"; +import { catchError } from 'rxjs/operators'; +import { CURRENT_BASE_HREF } from "../../../../shared/units/utils"; + export abstract class ScanApiRepository { abstract postSchedule(param): Observable; @@ -18,23 +18,22 @@ export abstract class ScanApiRepository { export class ScanApiDefaultRepository extends ScanApiRepository { constructor( private http: HttpClient, - @Inject(SERVICE_CONFIG) private config: IServiceConfig ) { super(); } public postSchedule(param): Observable { - return this.http.post(`${this.config.ScanAllEndpoint}/schedule`, param) + return this.http.post(`${CURRENT_BASE_HREF}/system/scanAll/schedule`, param) .pipe(catchError(error => observableThrowError(error))); } public putSchedule(param): Observable { - return this.http.put(`${this.config.ScanAllEndpoint}/schedule`, param) + return this.http.put(`${CURRENT_BASE_HREF}/system/scanAll/schedule`, param) .pipe(catchError(error => observableThrowError(error))); } public getSchedule(): Observable { - return this.http.get(`${this.config.ScanAllEndpoint}/schedule`) + return this.http.get(`${CURRENT_BASE_HREF}/system/scanAll/schedule`) .pipe(catchError(error => observableThrowError(error))); } diff --git a/src/portal/src/lib/components/config/vulnerability/scanAll.service.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/scanAll.service.ts similarity index 87% rename from src/portal/src/lib/components/config/vulnerability/scanAll.service.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/scanAll.service.ts index 1baf7ee15c..c3cde3482e 100644 --- a/src/portal/src/lib/components/config/vulnerability/scanAll.service.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/scanAll.service.ts @@ -1,11 +1,11 @@ import { Injectable } from '@angular/core'; import {Observable, throwError as observableThrowError} from 'rxjs'; import { ScanApiRepository } from './scanAll.api.repository'; -import { ErrorHandler } from '../../../utils/error-handler'; +import { ErrorHandler } from '../../../../shared/units/error-handler'; import {HttpClient} from "@angular/common/http"; -import {ScanningMetrics} from "../config"; +import {ScanningMetrics} from "../../config/config"; import {catchError, map} from "rxjs/operators"; -import { CURRENT_BASE_HREF } from "../../../utils/utils"; +import { CURRENT_BASE_HREF } from "../../../../shared/units/utils"; @Injectable() @@ -13,8 +13,7 @@ export class ScanAllRepoService { constructor( private http: HttpClient, - private scanApiRepository: ScanApiRepository, - private errorHandler: ErrorHandler) { + private scanApiRepository: ScanApiRepository) { } public manualScan(): Observable { diff --git a/src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.html b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.html similarity index 100% rename from src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.html rename to src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.html diff --git a/src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.scss b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.scss similarity index 84% rename from src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.scss rename to src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.scss index c41c45d90b..c77f407d49 100644 --- a/src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.scss +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.scss @@ -109,3 +109,27 @@ .badge { min-width: 30px; } +.info-tips-icon { + color: grey; +} + +.info-tips-icon:hover { + color: #007CBB; +} + +.replication-config { + margin-top: 0; + margin-bottom: 0; +} + +.replication-text { + font-size: 14px; + font-weight: 600; +} + +.replication-tooltip { + top: -8px; +} +.margin-top-3px { + margin-top: 3px; +} diff --git a/src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.spec.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.spec.ts similarity index 80% rename from src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.spec.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.spec.ts index 837ad5fbd6..401b7e547f 100644 --- a/src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.spec.ts @@ -1,20 +1,15 @@ -import { ComponentFixture, TestBed, waitForAsync, fakeAsync, tick, ComponentFixtureAutoDetect } from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync, ComponentFixtureAutoDetect } from '@angular/core/testing'; import { VulnerabilityConfigComponent } from "./vulnerability-config.component"; import { ScanAllRepoService } from "./scanAll.service"; import { of } from "rxjs"; import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; -import { IServiceConfig, SERVICE_CONFIG } from "../../../entities/service.config"; -import { ScanningMetrics, Triggers } from "../config"; -import { SharedModule } from "../../../utils/shared/shared.module"; -import { ErrorHandler } from "../../../utils/error-handler"; -import { CURRENT_BASE_HREF } from "../../../utils/utils"; -import { Scanner } from "../../../../app/config/scanner/scanner"; +import { ScanningMetrics, Triggers } from "../../config/config"; +import { ErrorHandler } from "../../../../shared/units/error-handler"; +import { Scanner } from "../scanner/scanner"; +import { SharedTestingModule } from "../../../../shared/shared.module"; let component: VulnerabilityConfigComponent; let fixture: ComponentFixture; -let config: IServiceConfig = { - configurationEndpoint: CURRENT_BASE_HREF + '/configurations/testing' -}; let mockedSchedule = {"schedule": null}; let mockedScheduledMetrics: ScanningMetrics = { total: 50, @@ -66,7 +61,7 @@ describe('VulnerabilityConfigComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - SharedModule, + SharedTestingModule, ], schemas: [ CUSTOM_ELEMENTS_SCHEMA @@ -77,7 +72,6 @@ describe('VulnerabilityConfigComponent', () => { providers: [ {provide: ErrorHandler, useValue: fakedErrorHandler}, {provide: ScanAllRepoService, useValue: fakedScanAllRepoService}, - { provide: SERVICE_CONFIG, useValue: config }, // open auto detect { provide: ComponentFixtureAutoDetect, useValue: true } ] diff --git a/src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.ts similarity index 90% rename from src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.ts rename to src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.ts index 8d8c011d85..523430217f 100644 --- a/src/portal/src/lib/components/config/vulnerability/vulnerability-config.component.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/vulnerability/vulnerability-config.component.ts @@ -1,20 +1,20 @@ import { Component, ViewChild, OnInit, OnDestroy } from '@angular/core'; import { finalize } from "rxjs/operators"; -import { ScanningMetrics, Triggers } from '../config'; -import { ErrorHandler } from '../../../utils/error-handler'; +import { ScanningMetrics, Triggers } from '../../config/config'; +import { ErrorHandler } from '../../../../shared/units/error-handler'; import { TranslateService } from '@ngx-translate/core'; import { ScanAllRepoService } from './scanAll.service'; -import { OriginCron } from '../../../services'; -import { CronScheduleComponent } from "../../cron-schedule"; -import { DATABASE_UPDATED_PROPERTY, VULNERABILITY_SCAN_STATUS } from "../../../utils/utils"; -import { errorHandler as errorHandFn} from "../../../utils/shared/shared.utils"; +import { OriginCron } from '../../../../shared/services'; +import { CronScheduleComponent } from "../../../../shared/components/cron-schedule"; +import { DATABASE_UPDATED_PROPERTY, VULNERABILITY_SCAN_STATUS } from "../../../../shared/units/utils"; import { DatePipe } from "@angular/common"; +import { errorHandler } from "../../../../shared/units/shared.utils"; const SCHEDULE_TYPE_NONE = "None"; @Component({ selector: 'vulnerability-config', templateUrl: './vulnerability-config.component.html', - styleUrls: ['./vulnerability-config.component.scss', '../registry-config.component.scss'] + styleUrls: ['./vulnerability-config.component.scss'] }) export class VulnerabilityConfigComponent implements OnInit, OnDestroy { onGoing: boolean; @@ -43,7 +43,7 @@ export class VulnerabilityConfigComponent implements OnInit, OnDestroy { hasDefaultScanner: boolean = false; constructor( private scanningService: ScanAllRepoService, - private errorHandler: ErrorHandler, + private errorHandlerEntity: ErrorHandler, private translate: TranslateService, ) { } @@ -89,7 +89,7 @@ export class VulnerabilityConfigComponent implements OnInit, OnDestroy { .subscribe(schedule => { this.initSchedule(schedule); }, error => { - this.errorHandler.error(error); + this.errorHandlerEntity.error(error); }); } getScanners() { @@ -114,7 +114,7 @@ export class VulnerabilityConfigComponent implements OnInit, OnDestroy { this.onGettingUpdatedTimeStr = false; this.translate.get("SCANNER.NO_DEFAULT_SCANNER") .subscribe(res => { - this.errorHandler.warning(res); + this.errorHandlerEntity.warning(res); } ); } @@ -232,7 +232,7 @@ export class VulnerabilityConfigComponent implements OnInit, OnDestroy { .pipe(finalize(() => this.onSubmitting = false)) .subscribe(() => { this.translate.get("CONFIG.SCANNING.TRIGGER_SCAN_ALL_SUCCESS").subscribe((res: string) => { - this.errorHandler.info(res); + this.errorHandlerEntity.info(res); }); // reset metrics and then get new metrics this.scanningMetrics = null; @@ -241,11 +241,11 @@ export class VulnerabilityConfigComponent implements OnInit, OnDestroy { , error => { if (error && error.status && error.status === 412) { this.translate.get("CONFIG.SCANNING.TRIGGER_SCAN_ALL_FAIL", - { error: '' + errorHandFn(error) }).subscribe((res: string) => { - this.errorHandler.error(res); + { error: '' + errorHandler(error) }).subscribe((res: string) => { + this.errorHandlerEntity.error(res); }); } else { - this.errorHandler.error(error); + this.errorHandlerEntity.error(error); } }); } @@ -267,26 +267,26 @@ export class VulnerabilityConfigComponent implements OnInit, OnDestroy { this.translate .get("CONFIG.SAVE_SUCCESS") .subscribe((res) => { - this.errorHandler.info(res); + this.errorHandlerEntity.info(res); this.CronScheduleComponent.resetSchedule(); }); this.reset(cron); }, error => { - this.errorHandler.error(error); + this.errorHandlerEntity.error(error); } ); } else { this.scanningService.postSchedule(this.CronScheduleComponent.scheduleType, cron) .subscribe(response => { this.translate.get("CONFIG.SAVE_SUCCESS").subscribe((res) => { - this.errorHandler.info(res); + this.errorHandlerEntity.info(res); this.CronScheduleComponent.resetSchedule(); }); this.reset(cron); }, error => { - this.errorHandler.error(error); + this.errorHandlerEntity.error(error); } ); } diff --git a/src/portal/src/app/labels/labels.component.html b/src/portal/src/app/base/left-side-nav/labels/labels.component.html similarity index 100% rename from src/portal/src/app/labels/labels.component.html rename to src/portal/src/app/base/left-side-nav/labels/labels.component.html diff --git a/src/portal/src/app/labels/labels.component.spec.ts b/src/portal/src/app/base/left-side-nav/labels/labels.component.spec.ts similarity index 91% rename from src/portal/src/app/labels/labels.component.spec.ts rename to src/portal/src/app/base/left-side-nav/labels/labels.component.spec.ts index 3f9915d172..a54c9159ff 100644 --- a/src/portal/src/app/labels/labels.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/labels/labels.component.spec.ts @@ -5,7 +5,7 @@ import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; import { TranslateService } from "@ngx-translate/core"; import { ClarityModule } from "@clr/angular"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -import { SharedModule } from "../shared/shared.module"; +import { SharedTestingModule } from "../../../shared/shared.module"; describe('LabelsComponent', () => { let component: LabelsComponent; @@ -14,7 +14,7 @@ describe('LabelsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - SharedModule, + SharedTestingModule, BrowserAnimationsModule, ClarityModule, ], diff --git a/src/portal/src/app/labels/labels.component.ts b/src/portal/src/app/base/left-side-nav/labels/labels.component.ts similarity index 100% rename from src/portal/src/app/labels/labels.component.ts rename to src/portal/src/app/base/left-side-nav/labels/labels.component.ts diff --git a/src/portal/src/app/log/log-page.component.ts b/src/portal/src/app/base/left-side-nav/labels/labels.module.ts similarity index 55% rename from src/portal/src/app/log/log-page.component.ts rename to src/portal/src/app/base/left-side-nav/labels/labels.module.ts index a688f3880f..3465b9be9e 100644 --- a/src/portal/src/app/log/log-page.component.ts +++ b/src/portal/src/app/base/left-side-nav/labels/labels.module.ts @@ -11,12 +11,27 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -import { Component } from '@angular/core'; -@Component({ - selector: 'log-page', - templateUrl: './log-page.component.html' +import { NgModule } from "@angular/core"; +import { SharedModule } from "../../../shared/shared.module";; +import { RouterModule, Routes } from "@angular/router"; +import { LabelsComponent } from "./labels.component"; + + +const routes: Routes = [ + { + path: '', + component: LabelsComponent + }, +]; +@NgModule({ + imports: [ + SharedModule, + RouterModule.forChild(routes), + ], + declarations: [ + LabelsComponent, + ], }) - -export class LogPageComponent { +export class LabelsModule { } diff --git a/src/portal/src/app/log/log.module.ts b/src/portal/src/app/base/left-side-nav/log/log.module.ts similarity index 66% rename from src/portal/src/app/log/log.module.ts rename to src/portal/src/app/base/left-side-nav/log/log.module.ts index 3712d7e457..2c62127b3c 100644 --- a/src/portal/src/app/log/log.module.ts +++ b/src/portal/src/app/base/left-side-nav/log/log.module.ts @@ -12,18 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. import { NgModule } from '@angular/core'; -import { AuditLogComponent } from './audit-log.component'; -import { SharedModule } from '../shared/shared.module'; -import { LogPageComponent } from './log-page.component'; +import { SharedModule } from '../../../shared/shared.module'; +import { RecentLogComponent } from "./recent-log.component"; +import { RouterModule, Routes } from "@angular/router"; +const routes: Routes = [ + { + path: '', + component: RecentLogComponent + }, +]; @NgModule({ - imports: [SharedModule], - declarations: [ - AuditLogComponent, - LogPageComponent + imports: [ + SharedModule, + RouterModule.forChild(routes), ], - exports: [ - AuditLogComponent, - LogPageComponent] + declarations: [ + RecentLogComponent, + ] }) export class LogModule { } diff --git a/src/portal/src/lib/components/log/recent-log.component.html b/src/portal/src/app/base/left-side-nav/log/recent-log.component.html similarity index 100% rename from src/portal/src/lib/components/log/recent-log.component.html rename to src/portal/src/app/base/left-side-nav/log/recent-log.component.html diff --git a/src/portal/src/lib/components/log/recent-log.component.scss b/src/portal/src/app/base/left-side-nav/log/recent-log.component.scss similarity index 100% rename from src/portal/src/lib/components/log/recent-log.component.scss rename to src/portal/src/app/base/left-side-nav/log/recent-log.component.scss diff --git a/src/portal/src/lib/components/log/recent-log.component.spec.ts b/src/portal/src/app/base/left-side-nav/log/recent-log.component.spec.ts similarity index 85% rename from src/portal/src/lib/components/log/recent-log.component.spec.ts rename to src/portal/src/app/base/left-side-nav/log/recent-log.component.spec.ts index 9bc35b46cc..75eaae60bb 100644 --- a/src/portal/src/lib/components/log/recent-log.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/log/recent-log.component.spec.ts @@ -1,25 +1,20 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; import { RecentLogComponent } from './recent-log.component'; -import { SERVICE_CONFIG, IServiceConfig } from '../../entities/service.config'; -import { ErrorHandler } from '../../utils/error-handler'; -import { SharedModule } from '../../utils/shared/shared.module'; -import { FilterComponent } from '../filter/filter.component'; -import { click, CURRENT_BASE_HREF } from '../../utils/utils'; +import { ErrorHandler } from '../../../shared/units/error-handler'; +import { FilterComponent } from '../../../shared/components/filter/filter.component'; +import { click } from '../../../shared/units/utils'; import { of } from 'rxjs'; -import { AuditLog } from "../../../../ng-swagger-gen/models/audit-log"; -import { AuditlogService } from "../../../../ng-swagger-gen/services/auditlog.service"; +import { AuditLog } from "../../../../../ng-swagger-gen/models/audit-log"; +import { AuditlogService } from "../../../../../ng-swagger-gen/services/auditlog.service"; import { HttpHeaders, HttpResponse } from "@angular/common/http"; import { delay } from "rxjs/operators"; +import { SharedTestingModule } from "../../../shared/shared.module"; describe('RecentLogComponent (inline template)', () => { let component: RecentLogComponent; let fixture: ComponentFixture; - let serviceConfig: IServiceConfig; let auditlogService: AuditlogService; - let testConfig: IServiceConfig = { - logBaseEndpoint: CURRENT_BASE_HREF + "/logs/testing" - }; const fakedErrorHandler = { error() { return undefined; @@ -76,13 +71,12 @@ describe('RecentLogComponent (inline template)', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - SharedModule + SharedTestingModule ], declarations: [FilterComponent, RecentLogComponent], providers: [ { provide: ErrorHandler, useValue: fakedErrorHandler }, { provide: AuditlogService, useValue: fakedAuditlogService }, - { provide: SERVICE_CONFIG, useValue: testConfig }, ] }); @@ -91,7 +85,6 @@ describe('RecentLogComponent (inline template)', () => { beforeEach(() => { fixture = TestBed.createComponent(RecentLogComponent); component = fixture.componentInstance; - serviceConfig = TestBed.get(SERVICE_CONFIG); auditlogService = fixture.debugElement.injector.get(AuditlogService); fixture.detectChanges(); }); @@ -99,12 +92,6 @@ describe('RecentLogComponent (inline template)', () => { it('should be created', () => { expect(component).toBeTruthy(); }); - - it('should inject the SERVICE_CONFIG', () => { - expect(serviceConfig).toBeTruthy(); - expect(serviceConfig.logBaseEndpoint).toEqual(CURRENT_BASE_HREF + "/logs/testing"); - }); - it('should get data from AccessLogService', waitForAsync(() => { expect(auditlogService).toBeTruthy(); fixture.detectChanges(); diff --git a/src/portal/src/lib/components/log/recent-log.component.ts b/src/portal/src/app/base/left-side-nav/log/recent-log.component.ts similarity index 90% rename from src/portal/src/lib/components/log/recent-log.component.ts rename to src/portal/src/app/base/left-side-nav/log/recent-log.component.ts index b6440e310b..a00b7767b3 100644 --- a/src/portal/src/lib/components/log/recent-log.component.ts +++ b/src/portal/src/app/base/left-side-nav/log/recent-log.component.ts @@ -11,11 +11,11 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, Input } from '@angular/core'; -import { ErrorHandler } from '../../utils/error-handler'; +import { Component, OnInit } from '@angular/core'; +import { ErrorHandler } from '../../../shared/units/error-handler'; import { finalize } from "rxjs/operators"; -import { AuditlogService } from "../../../../ng-swagger-gen/services/auditlog.service"; -import { AuditLog } from "../../../../ng-swagger-gen/models/audit-log"; +import { AuditlogService } from "../../../../../ng-swagger-gen/services/auditlog.service"; +import { AuditLog } from "../../../../../ng-swagger-gen/models/audit-log"; import ListAuditLogsParams = AuditlogService.ListAuditLogsParams; import { ClrDatagridStateInterface } from '@clr/angular'; @@ -31,7 +31,6 @@ export class RecentLogComponent implements OnInit { currentTerm: string; defaultFilter = "username"; isOpenFilterTag: boolean; - @Input() withTitle: boolean = false; pageSize: number = 15; currentPage: number = 1; // Double bound to pagination component totalCount: number = 0; diff --git a/src/portal/src/app/project-quotas/project-quotas.component.html b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.html similarity index 100% rename from src/portal/src/app/project-quotas/project-quotas.component.html rename to src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.html diff --git a/src/portal/src/app/project-quotas/project-quotas.component.scss b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.scss similarity index 100% rename from src/portal/src/app/project-quotas/project-quotas.component.scss rename to src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.scss diff --git a/src/portal/src/app/project-quotas/project-quotas.component.spec.ts b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.spec.ts similarity index 63% rename from src/portal/src/app/project-quotas/project-quotas.component.spec.ts rename to src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.spec.ts index 477442e56f..00d7080909 100644 --- a/src/portal/src/app/project-quotas/project-quotas.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.spec.ts @@ -1,17 +1,17 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ProjectQuotasComponent } from './project-quotas.component'; -import { TranslateModule } from "@ngx-translate/core"; +import { ProjectQuotasContainerComponent } from './project-quotas-container.component'; import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; -import { MessageHandlerService } from "../shared/message-handler/message-handler.service"; -import { SessionService } from "../shared/session.service"; -import { SessionUser } from "../shared/session-user"; -import { ConfigurationService } from "../config/config.service"; +import { MessageHandlerService } from "../../../shared/services/message-handler.service"; +import { SessionService } from "../../../shared/services/session.service"; +import { SessionUser } from "../../../shared/entities/session-user"; +import { ConfigurationService } from "../../../services/config.service"; import { of } from "rxjs"; -import { Configuration } from "../../lib/components/config/config"; +import { Configuration } from "../config/config"; +import { SharedTestingModule } from "../../../shared/shared.module"; -describe('ProjectQuotasComponent', () => { - let component: ProjectQuotasComponent; - let fixture: ComponentFixture; +describe('ProjectQuotasContainerComponent', () => { + let component: ProjectQuotasContainerComponent; + let fixture: ComponentFixture; const mockedUser: SessionUser = { user_id: 1, username: 'admin', @@ -41,11 +41,10 @@ describe('ProjectQuotasComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ - TranslateModule.forRoot() + SharedTestingModule ], - declarations: [ ProjectQuotasComponent ], + declarations: [ ProjectQuotasContainerComponent ], providers: [ - MessageHandlerService, {provide: MessageHandlerService, useValue: fakedMessageHandlerService}, {provide: SessionService, useValue: fakedSessionService}, {provide: ConfigurationService, useValue: fakedConfigurationService} @@ -58,7 +57,7 @@ describe('ProjectQuotasComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(ProjectQuotasComponent); + fixture = TestBed.createComponent(ProjectQuotasContainerComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/portal/src/app/project-quotas/project-quotas.component.ts b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.ts similarity index 66% rename from src/portal/src/app/project-quotas/project-quotas.component.ts rename to src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.ts index 81aee065be..2c4b9ccf1c 100644 --- a/src/portal/src/app/project-quotas/project-quotas.component.ts +++ b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas-container.component.ts @@ -1,16 +1,16 @@ import { Component, OnInit } from '@angular/core'; -import { SessionService } from "../shared/session.service"; -import { ConfigurationService } from "../config/config.service"; -import { MessageHandlerService } from "../shared/message-handler/message-handler.service"; +import { SessionService } from "../../../shared/services/session.service"; +import { ConfigurationService } from "../../../services/config.service"; +import { MessageHandlerService } from "../../../shared/services/message-handler.service"; import { finalize } from "rxjs/operators"; -import { Configuration } from "../../lib/components/config/config"; +import { Configuration } from "../config/config"; @Component({ selector: 'app-project-quotas', - templateUrl: './project-quotas.component.html', - styleUrls: ['./project-quotas.component.scss'] + templateUrl: './project-quotas-container.component.html', + styleUrls: ['./project-quotas-container.component.scss'] }) -export class ProjectQuotasComponent implements OnInit { +export class ProjectQuotasContainerComponent implements OnInit { allConfig: Configuration = new Configuration(); loading: boolean = false; constructor(private session: SessionService, diff --git a/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas.module.ts b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas.module.ts new file mode 100644 index 0000000000..7f317552a0 --- /dev/null +++ b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas.module.ts @@ -0,0 +1,42 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from "@angular/core"; +import { SharedModule } from "../../../shared/shared.module"; +import { RouterModule, Routes } from "@angular/router"; +import { ProjectQuotasContainerComponent } from "./project-quotas-container.component"; +import { ProjectQuotasComponent } from "./project-quotas/project-quotas.component"; +import { EditProjectQuotasComponent } from "./project-quotas/edit-project-quotas/edit-project-quotas.component"; +import { QuotaService } from "../../../shared/services"; + + +const routes: Routes = [ + { + path: '', + component: ProjectQuotasContainerComponent + }, +]; +@NgModule({ + imports: [ + SharedModule, + RouterModule.forChild(routes), + ], + declarations: [ + ProjectQuotasContainerComponent, + ProjectQuotasComponent, + EditProjectQuotasComponent + ], +}) +export class ProjectQuotasModule { +} diff --git a/src/portal/src/lib/components/config/project-quotas/edit-project-quotas/edit-project-quotas.component.html b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas/edit-project-quotas/edit-project-quotas.component.html similarity index 98% rename from src/portal/src/lib/components/config/project-quotas/edit-project-quotas/edit-project-quotas.component.html rename to src/portal/src/app/base/left-side-nav/project-quotas/project-quotas/edit-project-quotas/edit-project-quotas.component.html index 98f3365a81..8aedc89804 100644 --- a/src/portal/src/lib/components/config/project-quotas/edit-project-quotas/edit-project-quotas.component.html +++ b/src/portal/src/app/base/left-side-nav/project-quotas/project-quotas/edit-project-quotas/edit-project-quotas.component.html @@ -1,6 +1,6 @@ - +