diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6a5fd20a78610be24414f16c851c8efbb3c0727..9f12badafe5c026f3c411da74879f9a26fa1b0ba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,6 +38,19 @@ build_and_push_latest_image: docker push $DOCKER_REPOSITORY_LOCAL:$IMAGE_TAG docker logout $DOCKER_REPOSITORY +build_and_push_alfa_image: + stage: build + only: + - /^release/ + script: + - | + export IMAGE_TAG=$(echo $CI_COMMIT_BRANCH | cut -c 9-)-alfa + docker image prune -f + docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD $DOCKER_REPOSITORY + docker build -t $DOCKER_REPOSITORY_LOCAL:$IMAGE_TAG . + docker push $DOCKER_REPOSITORY_LOCAL:$IMAGE_TAG + docker logout $DOCKER_REPOSITORY + build_and_push_release_image: stage: build image: korvoj/docker-git:26.1.3 diff --git a/build.gradle b/build.gradle index 3c08015daf9dfd2cae8c61c055c4bcac83915135..c03832281ad89bad60aa995bc88cb6e19f65e22d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id "org.sonarqube" version "3.2.0" } -version = '1.6.3' +version = '1.6.4' task buildGUI(type: Exec) { println 'Building using Angular CLI' diff --git a/package-lock.json b/package-lock.json index c09d4b064d3f9bc056eec24e09204ae4f70e44f4..4515d1ee4f14a368197be8a2a90d59b153b822d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nmaas-portal", - "version": "1.6.3", + "version": "1.6.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nmaas-portal", - "version": "1.6.3", + "version": "1.6.4", "license": "Apache 2.0", "dependencies": { "@angular/animations": "15.2.10", diff --git a/package.json b/package.json index f11bc99fb4be52844843987333ab5a770b46726e..9d59dc55841ac8f68205f687859a0390b04e0f1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nmaas-portal", - "version": "1.6.3", + "version": "1.6.4", "license": "Apache 2.0", "angular-cli": {}, "scripts": { diff --git a/src/app/appmarket/appinstance/appinstance-search.pipe.ts b/src/app/appmarket/appinstance/appinstance-search.pipe.ts index a006fa04883897f10db979e73c861d6488da4a4c..a8e2536ada7b00459c0d6dedc40d509c6801043c 100644 --- a/src/app/appmarket/appinstance/appinstance-search.pipe.ts +++ b/src/app/appmarket/appinstance/appinstance-search.pipe.ts @@ -13,13 +13,11 @@ export class AppinstanceSearchPipe implements PipeTransform { let result = []; value.forEach( val => { - if (val.name.toLowerCase().includes(searchValue.toLowerCase() || - val.applicationName.toLowerCase().includes(searchValue.toLowerCase()) || - val.id.toLowerCase().includes(searchValue.toLowerCase())) + if (val.name.toLowerCase().includes(searchValue.toLowerCase()) || + val.applicationName.toLowerCase().includes(searchValue.toLowerCase()) ) { result.push(val); } - }) return result; diff --git a/src/app/appmarket/bulkDeployment/appdeployment.service.ts b/src/app/appmarket/bulkDeployment/appdeployment.service.ts index 8ca97da1aaf043faf86a26b447f48823fb549763..b858eb65c02ee55a8cf4f49a629e26ba638c274b 100644 --- a/src/app/appmarket/bulkDeployment/appdeployment.service.ts +++ b/src/app/appmarket/bulkDeployment/appdeployment.service.ts @@ -1,6 +1,6 @@ import {Injectable} from '@angular/core'; import {ApplicationBase} from '../../model/application-base'; -import {HttpClient, HttpParams} from '@angular/common/http'; +import {HttpClient} from '@angular/common/http'; import {AppConfigService} from '../../service'; import {BulkResponse} from '../../model/bulk-response'; import {Observable} from 'rxjs'; @@ -94,9 +94,4 @@ export class AppdeploymentService { } - public removeBulkDeployment(id: number, removeAll: boolean): Observable<void> { - let params = new HttpParams() - params = params.append('removeAll', removeAll) - return this.http.delete<void>(this.getUrl() + `${id}`, {params}) - } } diff --git a/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.html b/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.html index 6ca3b86ef56dbb270004f4df691a1a17d92c8c9a..e34eee5938d37ec4330b3cd1f1ebdc2d9659707f 100644 --- a/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.html +++ b/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.html @@ -1,6 +1,2 @@ -<app-bulk-list [header]="'BULK.APP.HEADER'" - [bulks]="bulks" - [mode]="mode" - (reloadBulks)="retrieveBulks()" -></app-bulk-list> +<app-bulk-list [header]="'BULK.APP.HEADER'" [bulks]="bulks" [mode]="mode"></app-bulk-list> diff --git a/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.ts b/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.ts index 7eaed23ae6fccaf2f641ca72cdd51d8ee205f5dd..9256cfa4ea2a99172b68b96471a1312b92bb206d 100644 --- a/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.ts +++ b/src/app/appmarket/bulkDeployment/bulk-app-list/bulk-app-list.component.ts @@ -20,10 +20,6 @@ export class BulkAppListComponent implements OnInit { } ngOnInit(): void { - this.retrieveBulks(); - } - - public retrieveBulks() { if (this.authService.getRoles().find(value => value === 'ROLE_VL_MANAGER') !== undefined) { this.deployService.getBulksAppDeploymentsOwner().subscribe(data => { data = data.sort((a, b) => new Date(b.creationDate).getTime() - new Date(a.creationDate).getTime()) diff --git a/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.html b/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.html index dad549b0d8a09af20bae1208a7176f18c99a6e0c..c68bbe80370e26c7df8dfd879c91785745f46cb2 100644 --- a/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.html +++ b/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.html @@ -103,7 +103,7 @@ <a (click)="getAppBulkDetails(bulk?.id)"> {{"BULK.APP.DOWNLOAD_CSV" | translate}}</a> </li> <li *ngIf="mode === bulkTypeApp"> - <a (click)="modal.show(); setBulkToDelete(bulk)">{{ 'BULK.LIST.REMOVE' | translate }}</a> + <a (click)="modal.show()">{{ 'BULK.LIST.REMOVE' | translate }}</a> </li> </ul> </span> @@ -130,12 +130,9 @@ <p-checkbox [(ngModel)]="removeAll" binary="true"></p-checkbox> </div> </div> - <div *ngIf="errorMessage !== ''" style="margin-top: 2rem; display: flex; justify-content: start; color: indianred"> - <p>{{ 'BULK.REMOVE.ERROR' | translate}} {{errorMessage}}</p> - </div> </div> <div class="nmaas-modal-footer"> <button type="button" class="btn btn-secondary" (click)="modal.hide()">{{'APP_CHANGE_STATE_MODAL.CANCEL_BUTTON' | translate}}</button> - <button type="button" class="btn btn-primary" (click)="removeBulkDeployment()" [disabled]="false">{{'BULK.REMOVE.REMOVE' | translate}}</button> + <button type="button" class="btn btn-primary" [disabled]="false">{{'BULK.REMOVE.REMOVE' | translate}}</button> </div> </nmaas-modal> diff --git a/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.ts b/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.ts index 642bcf677efea934828cac6db1d169ea51e72982..8288379d544ee7f88744f62d8ee497a98c9d199c 100644 --- a/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.ts +++ b/src/app/appmarket/bulkDeployment/bulk-list/bulk-list.component.ts @@ -1,4 +1,4 @@ -import {Component, EventEmitter, Input, Output, QueryList, ViewChild, ViewChildren} from '@angular/core'; +import {Component, Input, QueryList, ViewChild, ViewChildren} from '@angular/core'; import {BulkDeployment} from '../../../model/bulk-deployment'; import {BulkType} from '../../../model/bulk-response'; import {SortableHeaderDirective} from '../../../service/sort-domain.directive'; @@ -42,12 +42,6 @@ export class BulkListComponent { public searchValue = ''; public removeAll = false; - public bulkToDelete; - - public errorMessage = ''; - - @Output() - public reloadBulks = new EventEmitter<void>(); constructor(private appDeploy: AppdeploymentService, private sanitizer: DomSanitizer) { @@ -153,25 +147,4 @@ export class BulkListComponent { } return null } - - public removeBulkDeployment() { - this.appDeploy.removeBulkDeployment(this.bulkToDelete.id, this.removeAll) - .subscribe({ - next: (_) => { - this.reloadData() - this.modal.hide() - }, - error: err => { - this.errorMessage = err.error.message - } - }) - } - - public setBulkToDelete(bulk: BulkDeployment) { - this.bulkToDelete = bulk - } - - private reloadData() { - this.reloadBulks.emit() - } } diff --git a/src/app/appmarket/bulkDeployment/domainDeployment/domainupload/domainupload.component.ts b/src/app/appmarket/bulkDeployment/domainDeployment/domainupload/domainupload.component.ts index ffd4a68ee14919a3d955dc362952037a00e3298c..7919ba6ecd003708201643d666a6c445a99516ba 100644 --- a/src/app/appmarket/bulkDeployment/domainDeployment/domainupload/domainupload.component.ts +++ b/src/app/appmarket/bulkDeployment/domainDeployment/domainupload/domainupload.component.ts @@ -13,9 +13,9 @@ export class DomainuploadComponent { public showProgressBar = false; - public csvText = '"domain","username","networks","domainGroups","email"\n' + - '"ExampleDomain","TestUser","","Lab1","email@domain.com"\n' + - '"ExampleDomain2","TestUser2","","Lab1","email2@domain.com"\n'; + public csvText = '"domain","username","networks","domainGroups","email","ssoEnabled"\n' + + '"ExDom1","TestUsr1","","ExGroup1","test1@user.com","true"\n' + + '"ExDom2","TestUsr2","","ExGroup2","test2@user.com","false"\n'; public errorMessage = ''; public changeDetector = false; diff --git a/src/app/shared/applications/applications.component.ts b/src/app/shared/applications/applications.component.ts index cc78bd5ac340e6aff6e2368fc027f94a5f63b0c9..03a1b40421b93fceead7206aefb4d2e6c9ffcace 100644 --- a/src/app/shared/applications/applications.component.ts +++ b/src/app/shared/applications/applications.component.ts @@ -24,6 +24,9 @@ function compareAppsPopularity(a: ApplicationBase, b: ApplicationBase, stats: an const bPop = stats[b.name] ? stats[b.name] : 0; return (aPop - bPop) * -1; // desc } +function compareAppsId(a: ApplicationBase, b: ApplicationBase): number { + return (a.id - b.id); +} @Component({ selector: 'nmaas-applications-view', @@ -53,8 +56,8 @@ export class ApplicationsViewComponent implements OnInit, OnChanges { public searchedAppName = ''; protected searchedTag = 'all'; - public sortModeList = ['NONE', 'NAME', 'RATING', 'POPULAR']; - public sortMode = 'NONE'; + public sortModeList = [ 'NAME', 'RATING', 'POPULAR', 'DATE']; + public sortMode = 'NAME'; private popStats: any = {}; @@ -73,6 +76,7 @@ export class ApplicationsViewComponent implements OnInit, OnChanges { this.popStats = data; } ) + } ngOnChanges(changes: SimpleChanges) { @@ -106,7 +110,7 @@ export class ApplicationsViewComponent implements OnInit, OnChanges { } this.applications = applications; - + this.doSearch() } protected updateSelected() { @@ -165,6 +169,8 @@ export class ApplicationsViewComponent implements OnInit, OnChanges { return [...apps].sort(compareAppsRating) case 'POPULAR': return [...apps].sort(popComp) + case 'DATE': + return [...apps].sort(compareAppsId) default: return apps } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index cdc2db3120890f34fbebed676f7baf9d1e2bcf1b..fb4946f331b4537b698bcadff73df57a83d04c90 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -51,17 +51,16 @@ import {DomainRolesDirective} from '../directive/domain-roles.directive'; import {SshKeysComponent} from './users/ssh-keys/ssh-keys.component'; import {NewSshKeyComponent} from './users/new-ssh-key/new-ssh-key.component'; import {ModalProvideSshKeyComponent} from './modal/modal-provide-ssh-key/modal-provide-ssh-key.component'; -import {ContactComponent} from './contact/contact.component'; +import { ContactComponent } from './contact/contact.component'; import {FormioModule} from '@formio/angular'; -import {PreferencesComponent} from './users/preferences/preferences.component'; +import { PreferencesComponent } from './users/preferences/preferences.component'; import {TooltipModule} from 'primeng/tooltip'; import {DropdownModule} from 'primeng/dropdown'; import {SortableHeaderDirective} from '../service/sort-domain.directive'; import {InputTextModule} from 'primeng/inputtext'; -import {DomainNamespaceAnnotationsComponent} from './domain-namespace-annotations/domain-namespace-annotations.component'; +import { DomainNamespaceAnnotationsComponent } from './domain-namespace-annotations/domain-namespace-annotations.component'; import { DEFAULT_PSM_OPTIONS } from 'angular-password-strength-meter/zxcvbn'; -import {AccessTokensComponent} from './users/access-tokens/access-tokens.component'; @NgModule({ imports: [ @@ -124,8 +123,7 @@ import {AccessTokensComponent} from './users/access-tokens/access-tokens.compone ContactComponent, PreferencesComponent, SortableHeaderDirective, - DomainNamespaceAnnotationsComponent, - AccessTokensComponent + DomainNamespaceAnnotationsComponent ], providers: [ PasswordValidator, @@ -176,8 +174,7 @@ import {AccessTokensComponent} from './users/access-tokens/access-tokens.compone ModalProvideSshKeyComponent, PreferencesComponent, SortableHeaderDirective, - DomainNamespaceAnnotationsComponent, - AccessTokensComponent + DomainNamespaceAnnotationsComponent ] }) export class SharedModule { diff --git a/src/app/shared/users/access-tokens/access-token.service.ts b/src/app/shared/users/access-tokens/access-token.service.ts deleted file mode 100644 index 50880d8ca75bd585e674529e0fd5e4aec469fe70..0000000000000000000000000000000000000000 --- a/src/app/shared/users/access-tokens/access-token.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Observable} from 'rxjs'; -import {AccessToken} from './access-token'; -import {Injectable} from '@angular/core'; -import {GenericDataService} from '../../../service/genericdata.service'; -import {HttpClient} from '@angular/common/http'; -import {AppConfigService} from '../../../service'; - -@Injectable({ - providedIn: 'root' -}) -export class AccessTokenService extends GenericDataService { - - constructor(http: HttpClient, appConfig: AppConfigService) { - super(http, appConfig); - } - - public getAll(): Observable<AccessToken[]> { - return this.http.get<AccessToken[]>(this.getUrl()) - } - - public invalidate(id: number): Observable<void> { - return this.http.put<void>(`${this.getUrl()}/${id}`, '') - } - - public createToken(tokenName: string): Observable<AccessToken> { - return this.http.post<AccessToken>(this.getUrl(), tokenName) - } - - private getUrl(): string { - return this.appConfig.getApiUrl() + '/tokens'; - } -} diff --git a/src/app/shared/users/access-tokens/access-token.ts b/src/app/shared/users/access-tokens/access-token.ts deleted file mode 100644 index 42239bc83516f6ca24d40b755fb6f828e054645b..0000000000000000000000000000000000000000 --- a/src/app/shared/users/access-tokens/access-token.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class AccessToken { - public id: number - public name: string - public userId: number - public tokenValue: string - public valid: boolean -} diff --git a/src/app/shared/users/access-tokens/access-tokens.component.css b/src/app/shared/users/access-tokens/access-tokens.component.css deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/app/shared/users/access-tokens/access-tokens.component.html b/src/app/shared/users/access-tokens/access-tokens.component.html deleted file mode 100644 index 73f8f698f8f7d66f93a926aa7305e748441c3d2a..0000000000000000000000000000000000000000 --- a/src/app/shared/users/access-tokens/access-tokens.component.html +++ /dev/null @@ -1,60 +0,0 @@ -<div style="margin-bottom: 15px;" class="panel panel-default"> - <div class="panel-heading">{{'TOKENS.HEADER' | translate}}</div> - <div class="panel-body"> - <table class="table table-hover" aria-describedby="User access tokens table"> - <thead> - <tr> - <th scope="col">{{'TOKENS.TABLE.ID' | translate}}</th> - <th scope="col">{{'TOKENS.TABLE.NAME' | translate}}</th> - <th scope="col">{{'TOKENS.TABLE.VALUE' | translate}}</th> - <th scope="col">{{'TOKENS.TABLE.VALID' | translate}}</th> - <th scope="col">{{'TOKENS.TABLE.ACTIONS' | translate}}</th> - </tr> - </thead> - <tbody> - <tr *ngFor="let token of tokensList"> - <td>{{token.id}}</td> - <td>{{token.name}}</td> - <td>{{token.tokenValue}}</td> - <td>{{token.valid}}</td> - <td> - <button type="button" class="btn btn-danger" - (click)="invalidate(token.id)">{{'TOKENS.BUTTON_INVALIDATE' | translate}}</button> - </td> - </tr> - <tr *ngIf="tokensList.length === 0"> - <td colspan="3" style="text-align: center">{{'TOKENS.NO_TOKENS' | translate}}</td> - </tr> - </tbody> - </table> - <div> - <button type="button" class="btn btn-success" - (click)="modal.show()">{{'TOKENS.NEW_TOKEN' | translate}}</button> - - </div> - </div> -</div> - -<nmaas-modal styleModal="info"> - <div class="nmaas-modal-header">{{'TOKENS.MODAL.HEADER' | translate}}</div> - <div class="nmaas-modal-body" style="height: 60%; max-height: 80vh;overflow-y: auto;"> - <form [formGroup]="requestForm" (ngSubmit)="createNewToken()"> - <div class="form-group"> - <label class="control-label" for="new-token-name"> - {{'TOKENS.MODAL.NAME' | translate}}: - </label> - <input id="new-token-name" type="text" class="form-control" formControlName="name"> - </div> - <div *ngIf="name.invalid && (name.dirty || name.touched)" class="alert alert-danger"> - <div *ngIf="name.errors.required">{{'SSH_KEYS.MODAL.ERROR.NAME_REQUIRED' | translate}}</div> - <div *ngIf="name.errors.minlength">{{'SSH_KEYS.MODAL.ERROR.NAME_MINLENGTH' | translate}}</div> - <div *ngIf="name.errors.maxlength">{{'SSH_KEYS.MODAL.ERROR.NAME_MAXLENGTH' | translate}}</div> - </div> - <input type="submit" class="btn btn-success" value="{{'SSH_KEYS.MODAL.BUTTON_ADD' | translate}}" - [disabled]="!requestForm.valid"> - <button type="button" class="btn btn-primary pull-right" - (click)="modal.hide()">{{'SSH_KEYS.MODAL.BUTTON_CANCEL' | translate}}</button> - - </form> - </div> -</nmaas-modal> diff --git a/src/app/shared/users/access-tokens/access-tokens.component.spec.ts b/src/app/shared/users/access-tokens/access-tokens.component.spec.ts deleted file mode 100644 index 410fd6ad82a9727a881b95b4e56c1f962a113eda..0000000000000000000000000000000000000000 --- a/src/app/shared/users/access-tokens/access-tokens.component.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -import {ComponentFixture, TestBed} from '@angular/core/testing'; - -import {AccessTokensComponent} from './access-tokens.component'; -import {HttpClientTestingModule} from '@angular/common/http/testing'; -import {TranslateFakeLoader, TranslateLoader, TranslateModule} from '@ngx-translate/core'; -import {ReactiveFormsModule} from '@angular/forms'; -import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; - -describe('AccessTokensComponent', () => { - let component: AccessTokensComponent; - let fixture: ComponentFixture<AccessTokensComponent>; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [AccessTokensComponent], - imports: [ - HttpClientTestingModule, - ReactiveFormsModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: TranslateFakeLoader - } - }), - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA], - }) - .compileComponents(); - - fixture = TestBed.createComponent(AccessTokensComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/shared/users/access-tokens/access-tokens.component.ts b/src/app/shared/users/access-tokens/access-tokens.component.ts deleted file mode 100644 index 8a076f18a3fd80a537e52d158de2d29dc1314957..0000000000000000000000000000000000000000 --- a/src/app/shared/users/access-tokens/access-tokens.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import {Component, OnInit, ViewChild} from '@angular/core'; -import {Observable} from 'rxjs'; -import {AccessToken} from './access-token'; -import {AccessTokenService} from './access-token.service'; -import {ModalComponent} from '../../modal'; -import {UntypedFormBuilder, UntypedFormGroup, Validators} from '@angular/forms'; - -@Component({ - selector: 'app-access-tokens', - templateUrl: './access-tokens.component.html', - styleUrls: ['./access-tokens.component.css'] -}) -export class AccessTokensComponent implements OnInit { - - public tokens: Observable<AccessToken[]> = undefined; - public tokensList: AccessToken[] = []; - - public requestForm: UntypedFormGroup = undefined; - - public newTokenName = ''; - - @ViewChild(ModalComponent, {static: true}) - public readonly modal: ModalComponent; - - constructor(private tokenService: AccessTokenService, - private formBuilder: UntypedFormBuilder) { - } - - ngOnInit() { - this.requestForm = this.formBuilder.group({ - name: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(16)]], - }) - - this.tokens = this.tokenService.getAll(); - this.getData(); - } - - getData() { - this.tokensList = []; - this.tokens.subscribe( - data => this.tokensList.push(...data), - error => console.error(error) - ) - } - - invalidate(id: number) { - this.tokenService.invalidate(id).subscribe( - (_) => this.getData(), - error => console.error(error) - ); - } - - public createNewToken() { - this.tokenService.createToken(this.requestForm.value.name.trim()).subscribe({ - next: val => { - this.tokensList.push(val) - this.requestForm.reset(); - this.modal.hide(); - }, - error: err => console.warn(err) - }) - } - - get name() { - return this.requestForm.get('name'); - } -} diff --git a/src/app/shared/users/ssh-keys/ssh-keys.component.html b/src/app/shared/users/ssh-keys/ssh-keys.component.html index fb8a78f932a3717b843e0dde2f803a767d88399e..efb4cb027d9813f2b99c014a6a7894b6ea6e829d 100644 --- a/src/app/shared/users/ssh-keys/ssh-keys.component.html +++ b/src/app/shared/users/ssh-keys/ssh-keys.component.html @@ -1,4 +1,4 @@ -<div style="margin-bottom: 15px;" class="panel panel-default"> +<div style="margin-bottom: 120px;" class="panel panel-default"> <div class="panel-heading">{{'SSH_KEYS.HEADER' | translate}}</div> <div class="panel-body"> <div class="flex justify-content-end mb-4"> diff --git a/src/app/welcome/policy-subpage/policy-subpage.component.html b/src/app/welcome/policy-subpage/policy-subpage.component.html index 6678f7b23c2ececc3bce05cca3cc5fed9b029e48..85432326d3485692302bfcf2ed785189385cf7c3 100644 --- a/src/app/welcome/policy-subpage/policy-subpage.component.html +++ b/src/app/welcome/policy-subpage/policy-subpage.component.html @@ -1,7 +1,7 @@ <div id="welcome-container" class="container-fluid" style="margin-bottom: 20px;"> <div class="center-block center text-center"><a routerLink="/" data-toggle="tooltip" data-placement="right" - title="Network Management as a Service homepage"><img src="assets/images/logo.png" alt="logo" - style="margin: 5px" /></a> + title="Network Management as a Service homepage"><img src="assets/images/logo-small.png" alt="logo" width="280px" + style="margin-top: 30px" /></a> </div> <div class="card card-body col-lg-offset-2 col-md-offset-2 col-sm-offset-2 col-lg-8 col-md-8 col-sm-8 col-xs-12" style="margin-top: 15px; font-size: 14px;"> diff --git a/src/app/welcome/profile/profile.component.html b/src/app/welcome/profile/profile.component.html index f8c17f7e5690bf61858490dcb21e28b1035f820b..f869b826e6e2744d74e6edf32beee6c2566419a6 100644 --- a/src/app/welcome/profile/profile.component.html +++ b/src/app/welcome/profile/profile.component.html @@ -34,6 +34,5 @@ [allowedModes]="[ComponentMode.PROFILVIEW, ComponentMode.EDIT]"> </nmaas-userprivileges> <nmaas-ssh-keys></nmaas-ssh-keys> - <app-access-tokens></app-access-tokens> </div> </div> diff --git a/src/app/welcome/welcome.component.css b/src/app/welcome/welcome.component.css index 916d9fd5f4c3d60529d455ec27f93dca60a91468..602888c0c136eb493886045f88d13de555487d4f 100644 --- a/src/app/welcome/welcome.component.css +++ b/src/app/welcome/welcome.component.css @@ -59,6 +59,14 @@ html, body { display: flex; } } +.banner{ + background-color : #424242; + color: #E8E8E8; + padding: 12px; + justify-self: center; + display: grid; + width: 100%; +} .button{ text-decoration: none; font-weight: bold; diff --git a/src/assets/contact/formio/vlabRequest.json b/src/assets/contact/formio/vlabRequest.json new file mode 100644 index 0000000000000000000000000000000000000000..16d32a9eddcc5a5bbca57c803caf0ad83d7eda85 --- /dev/null +++ b/src/assets/contact/formio/vlabRequest.json @@ -0,0 +1,197 @@ +{ + "display": "form", + "components": [ + { + "label": "EMAIL", + "placeholder": "EMAIL_CONTACT", + "tableView": true, + "persistent": false, + "validate": { + "required": true + }, + "key": "email", + "type": "email", + "input": true + }, + { + "label": "INSTITUTION", + "placeholder": "INSTITUTION_PLACEHOLDER", + "tableView": true, + "persistent": false, + "validate": { + "required": true + }, + "key": "institution", + "type": "textfield", + "input": true + }, + { + "label": "STUDENTS", + "placeholder": "STUDENTS_PLACEHOLDER", + "tableView": true, + "persistent": false, + "delimiter": false, + "requireDecimal": false, + "validate": { + "required": true, + "integer" : true + }, + "key": "students", + "type": "number", + "input": true + }, + { + "label": "MANAGERS", + "placeholder": "MANAGERS_PLACEHOLDER", + "tableView": true, + "persistent": false, + "delimiter": false, + "requireDecimal": false, + "validate": { + "required": true, + "integer" : true + }, + "key": "managers", + "type": "number", + "input": true + }, + { + "label": "APP_LIST", + "description": "APP_LIST_DESCRIPTION", + "hideLabel": false, + "disableAddingRemovingRows": false, + "addAnother": "APP_LIST_ADD", + "addAnotherPosition": "bottom", + "multiple": true, + "tableView": true, + "alwaysEnabled": false, + "type": "datagrid", + "input": true, + "key": "appList", + "tab": 0, + "components": [ + { + "label": "APP_LIST_SUB", + "hideLabel": true, + "tableView": true, + "type": "textfield", + "input": true, + "key": "appListName", + "placeholder": "Application name", + "tab": 0, + "inputFormat": "plain", + "row": "0-0" + } + ] + }, + { + "label": "DATES", + "disableAddingRemovingRows": true, + "hideLabel" : true, + "reorder": false, + "layoutFixed": false, + "enableRowGroups": false, + "initEmpty": false, + "tableView": false, + "key": "dates", + "type": "datagrid", + "input": true, + "components": [{ + "label": "START_DAY", + "customClass": "pl-3", + "tableView": false, + "datePicker": { + "disableWeekends": false, + "disableWeekdays": false + }, + "enableMinDateInput": false, + "enableMaxDateInput": false, + "key": "startDay", + "type": "datetime", + "input": true, + "validate": { + "required": true + }, + "enableTime": false, + "format": "dd-MM-yyyy", + "widget": { + "type": "calendar", + "displayInTimezone": "viewer", + "locale": "en", + "useLocaleSettings": false, + "allowInput": true, + "mode": "single", + "enableTime": false, + "noCalendar": false, + "format": "MM-yyyy", + "time_24hr": false, + "minDate": null, + "disableWeekends": false, + "disableWeekdays": false, + "maxDate": null + } + }, + { + "label": "END_DAY", + "customClass": "pl-3", + "tableView": true, + "datePicker": { + "disableWeekends": false, + "disableWeekdays": false + }, + "enableMinDateInput": false, + "enableMaxDateInput": false, + "key": "endDay", + "type": "datetime", + "input": true, + "validate": { + "required": true + }, + "enableTime": false, + "format": "dd-MM-yyyy", + "widget": { + "type": "calendar", + "displayInTimezone": "viewer", + "locale": "en", + "useLocaleSettings": false, + "allowInput": true, + "mode": "single", + "enableTime": false, + "noCalendar": false, + "format": "MM-yyyy", + "time_24hr": false, + "minDate": null, + "disableWeekends": false, + "disableWeekdays": false, + "maxDate": null + } + }] + }, + { + "label": "MESSAGE_ADDITIONAL", + "placeholder": "MESSAGE_ADDITIONAL_PLACEHOLDER", + "autoExpand": false, + "showCharCount": true, + "tableView": true, + "persistent": false, + "validate": { + "required": true, + "minLength": 0, + "maxLength": 600 + }, + "key": "message", + "type": "textarea", + "rows": 5, + "input": true + }, + { + "type": "button", + "label": "Submit", + "key": "submit", + "disableOnInvalid": true, + "input": true, + "tableView": false + } + ] + } + \ No newline at end of file