Skip to content
Snippets Groups Projects
Unverified Commit ead20c29 authored by Łukasz Łopatowski's avatar Łukasz Łopatowski Committed by GitHub
Browse files

Merge pull request #83 from nmaas-platform/1.5.3-develop

1.5.3 develop
parents 7724cac3 08de2d4e
No related branches found
No related tags found
No related merge requests found
Showing
with 19391 additions and 151 deletions
...@@ -5,7 +5,7 @@ plugins { ...@@ -5,7 +5,7 @@ plugins {
id "org.sonarqube" version "3.2.0" id "org.sonarqube" version "3.2.0"
} }
version = '1.6.0-SNAPSHOT' version = '1.5.3'
task buildGUI(type: Exec) { task buildGUI(type: Exec) {
println 'Building using Angular CLI' println 'Building using Angular CLI'
......
This diff is collapsed.
{ {
"name": "nmaas-portal", "name": "nmaas-portal",
"version": "1.5.2-SNAPSHOT", "version": "1.5.3",
"license": "Apache 2.0", "license": "Apache 2.0",
"angular-cli": {}, "angular-cli": {},
"scripts": { "scripts": {
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
"ng-terminal": "^3.1.0", "ng-terminal": "^3.1.0",
"ngx-pagination": "^5.1.0", "ngx-pagination": "^5.1.0",
"ngx-webstorage-service": "^4.1.0", "ngx-webstorage-service": "^4.1.0",
"primeflex": "^3.3.1",
"primeicons": "^4.1.0", "primeicons": "^4.1.0",
"primeng": "^11.4.5", "primeng": "^11.4.5",
"rxjs": "^6.6.7", "rxjs": "^6.6.7",
......
...@@ -20,9 +20,12 @@ import {ClusterService} from "../../../service/cluster.service"; ...@@ -20,9 +20,12 @@ import {ClusterService} from "../../../service/cluster.service";
AuthModule, AuthModule,
PipesModule, PipesModule,
], ],
exports: [
ClusterDetailsComponent
],
providers: [ providers: [
ClusterService, ClusterService,
] ]
}) })
export class ClustersModule {} export class ClustersModule {}
\ No newline at end of file
...@@ -24,7 +24,7 @@ export class ClusterDetailsComponent extends BaseComponent implements OnInit { ...@@ -24,7 +24,7 @@ export class ClusterDetailsComponent extends BaseComponent implements OnInit {
ngOnInit() { ngOnInit() {
this.clusterService.getCluster().subscribe(cluster => { this.clusterService.getCluster().subscribe(cluster => {
this.cluster = cluster; this.cluster = cluster;
this.router.navigate(['/admin/clusters/view']); // this.router.navigate(['/admin/clusters/view']);
}, () => { }, () => {
this.cluster = new Cluster(); this.cluster = new Cluster();
this.mode = ComponentMode.CREATE; this.mode = ComponentMode.CREATE;
......
...@@ -9,20 +9,22 @@ import {PipesModule} from '../../../pipe/pipes.module'; ...@@ -9,20 +9,22 @@ import {PipesModule} from '../../../pipe/pipes.module';
import {FormsModule} from '@angular/forms'; import {FormsModule} from '@angular/forms';
import {TranslateModule} from '@ngx-translate/core'; import {TranslateModule} from '@ngx-translate/core';
import {InternationalizationService} from "../../../service/internationalization.service"; import {InternationalizationService} from "../../../service/internationalization.service";
import {ClustersModule} from '../clusters/clusters.module';
@NgModule({ @NgModule({
declarations: [ declarations: [
ConfigurationDetailsComponent, ConfigurationDetailsComponent,
], ],
imports: [ imports: [
CommonModule, CommonModule,
RouterModule, RouterModule,
SharedModule, SharedModule,
AuthModule, AuthModule,
FormsModule, FormsModule,
PipesModule, PipesModule,
TranslateModule.forChild() TranslateModule.forChild(),
], ClustersModule
],
providers: [ providers: [
ConfigurationService, ConfigurationService,
InternationalizationService InternationalizationService
......
<div class="panel panel-default"> <div class="col-sm-12 col-sm-12 col-md-12" >
<div class="panel-heading">{{ 'PORTAL_CONFIGURATION.TITLE' | translate }}</div> <div class="panel panel-default">
<div class="panel-body"> <div class="panel-heading">{{ 'PORTAL_CONFIGURATION.TITLE' | translate }}</div>
<form (submit)="save()" class="form-horizontal" #configurationForm="ngForm" *ngIf="this.configuration"> <div class="panel-body">
<div class="form-group"> <form (submit)="save()" class="form-horizontal" #configurationForm="ngForm" *ngIf="this.configuration">
<label for="setMaintenance" <div class="form-group">
class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.MAINTENANCE' | translate }}</label> <label for="setMaintenance"
<div class="col-sm-10 pd-top-7"> class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.MAINTENANCE' | translate }}</label>
<input type="checkbox" id="setMaintenance" name="setMaintenance" <div class="col-sm-10 pd-top-7">
[(ngModel)]="this.configuration.maintenance" <input type="checkbox" id="setMaintenance" name="setMaintenance"
[checked]="this.configuration.maintenance === true"> [(ngModel)]="this.configuration.maintenance"
[checked]="this.configuration.maintenance === true">
</div>
</div> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="SSOLoginAllowed"
<label for="SSOLoginAllowed" class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.ALLOW_SSO_LOGIN' | translate }}</label>
class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.ALLOW_SSO_LOGIN' | translate }}</label> <div class="col-sm-10 pd-top-7">
<div class="col-sm-10 pd-top-7"> <input type="checkbox" id="SSOLoginAllowed" name="SSOLoginAllowed"
<input type="checkbox" id="SSOLoginAllowed" name="SSOLoginAllowed" [(ngModel)]="this.configuration.ssoLoginAllowed"
[(ngModel)]="this.configuration.ssoLoginAllowed" [checked]="this.configuration.ssoLoginAllowed === true">
[checked]="this.configuration.ssoLoginAllowed === true"> </div>
</div> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="defaultLang"
<label for="defaultLang" class="col-sm-2 control-label">{{'PORTAL_CONFIGURATION.DEFAULT_LANGUAGE' | translate}}</label>
class="col-sm-2 control-label">{{'PORTAL_CONFIGURATION.DEFAULT_LANGUAGE' | translate}}</label> <div class="col-sm-3">
<div class="col-sm-3"> <select id="defaultLang" #langSelect class="form-control"
<select id="defaultLang" #langSelect class="form-control" (change)="this.configuration.defaultLanguage = langSelect.value">
(change)="this.configuration.defaultLanguage = langSelect.value"> <option *ngFor="let lang of languages" [value]="lang.language"
<option *ngFor="let lang of languages" [value]="lang.language" [selected]="lang.language === configuration.defaultLanguage">{{'LANGUAGE.' + lang.language.toUpperCase() + '_LABEL' | translate}}</option>
[selected]="lang.language === configuration.defaultLanguage">{{'LANGUAGE.' + lang.language.toUpperCase() + '_LABEL' | translate}}</option> </select>
</select> </div>
</div> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="testInstance"
<label for="testInstance" class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.TEST_INSTANCE' | translate }}</label>
class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.TEST_INSTANCE' | translate }}</label> <div class="col-sm-10 pd-top-7">
<div class="col-sm-10 pd-top-7"> <input type="checkbox" id="testInstance" name="testInstance"
<input type="checkbox" id="testInstance" name="testInstance" [(ngModel)]="this.configuration.testInstance"
[(ngModel)]="this.configuration.testInstance" [checked]="this.configuration.testInstance === true">
[checked]="this.configuration.testInstance === true"> </div>
</div> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="sendAppInstanceFailureEmails"
<label for="sendAppInstanceFailureEmails" class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.SEND_APP_INSTANCE_FAILURE_EMAILS' | translate }}</label>
class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.SEND_APP_INSTANCE_FAILURE_EMAILS' | translate }}</label> <div class="col-sm-10 pd-top-7">
<div class="col-sm-10 pd-top-7"> <input type="checkbox" id="sendAppInstanceFailureEmails" name="sendAppInstanceFailureEmails"
<input type="checkbox" id="sendAppInstanceFailureEmails" name="sendAppInstanceFailureEmails" [(ngModel)]="this.configuration.sendAppInstanceFailureEmails">
[(ngModel)]="this.configuration.sendAppInstanceFailureEmails"> </div>
</div> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="registrationDomainSelectionEnabled"
<label for="registrationDomainSelectionEnabled" class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.DOMAIN_SELECTION_ENABLED' | translate }}</label>
class="col-sm-2 control-label">{{ 'PORTAL_CONFIGURATION.DOMAIN_SELECTION_ENABLED' | translate }}</label> <div class="col-sm-10 pd-top-7">
<div class="col-sm-10 pd-top-7"> <input type="checkbox" id="registrationDomainSelectionEnabled" name="registrationDomainSelectionEnabled"
<input type="checkbox" id="registrationDomainSelectionEnabled" name="registrationDomainSelectionEnabled" [(ngModel)]="this.configuration.registrationDomainSelectionEnabled">
[(ngModel)]="this.configuration.registrationDomainSelectionEnabled"> </div>
</div> </div>
</div> <div class="form-group">
<div class="form-group">
<span class="control-label col-sm-2"> <span class="control-label col-sm-2">
<strong> <strong>
...@@ -64,33 +65,37 @@ ...@@ -64,33 +65,37 @@
</strong> </strong>
</span> </span>
<div class="col-sm-10 display-emails"> <div class="col-sm-10 display-emails">
<div *ngFor="let email of configuration.appInstanceFailureEmailList; let i=index; trackBy:trackByFn" <div *ngFor="let email of configuration.appInstanceFailureEmailList; let i=index; trackBy:trackByFn"
class="col-lg-6 col-md-10 col-sm-12 pd-bottom-5 row email-row"> class="col-lg-6 col-md-10 col-sm-12 pd-bottom-5 row email-row">
<div class="email-input"> <div class="email-input">
<input class="form-control" type="text" <input class="form-control" type="text"
id="appInstanceFailureEmailList.{{i}}" id="appInstanceFailureEmailList.{{i}}"
name="appInstanceFailureEmailList.{{i}}" name="appInstanceFailureEmailList.{{i}}"
[(ngModel)]="configuration.appInstanceFailureEmailList[i]"/> [(ngModel)]="configuration.appInstanceFailureEmailList[i]"/>
</div> </div>
<button role="button" type="button" class="btn btn-default" (click)="removeEmailEntry(email)"> <button role="button" type="button" class="btn btn-default" (click)="removeEmailEntry(email)">
Remove Remove
</button> </button>
</div> </div>
<div class="pd-left-15"> <div class="pd-left-15">
<button role="button" type="button" class="btn btn-success" (click)="addEmailEntry()">Add <button role="button" type="button" class="btn btn-success" (click)="addEmailEntry()">Add
</button> </button>
</div>
</div> </div>
</div>
</div> </div>
<button class="btn btn-primary" <button class="btn btn-primary"
type="submit">{{ 'PORTAL_CONFIGURATION.SUBMIT_BUTTON' | translate }}</button> type="submit">{{ 'PORTAL_CONFIGURATION.SUBMIT_BUTTON' | translate }}</button>
<div class="alert alert-danger" style="margin-top: 5px" *ngIf="errorMsg"> <div class="alert alert-danger" style="margin-top: 5px" *ngIf="errorMsg">
{{errorMsg}} {{errorMsg}}
</div> </div>
</form> </form>
</div>
</div> </div>
</div> </div>
<app-clusterdetails></app-clusterdetails>
...@@ -70,7 +70,10 @@ export class AppDetailsComponent implements OnInit { ...@@ -70,7 +70,10 @@ export class AppDetailsComponent implements OnInit {
application => { application => {
this.app = application; this.app = application;
this.active = application.versions.some(version => this.getStateAsString(version.state) === 'ACTIVE'); this.active = application.versions.some(version => this.getStateAsString(version.state) === 'ACTIVE');
this.activeVersions = application.versions.filter(version => this.getStateAsString(version.state) === 'ACTIVE').map(version => version.version); this.activeVersions = application.versions
.filter(version => this.getStateAsString(version.state) === 'ACTIVE')
.map(version => version.version)
.sort(this.compareVersions)
// required for the tooltip to appear correctly // required for the tooltip to appear correctly
this.userDataService.selectedDomainId.subscribe((domainId) => this.updateDomainSelection(domainId)); this.userDataService.selectedDomainId.subscribe((domainId) => this.updateDomainSelection(domainId));
...@@ -84,6 +87,12 @@ export class AppDetailsComponent implements OnInit { ...@@ -84,6 +87,12 @@ export class AppDetailsComponent implements OnInit {
}); });
} }
private compareVersions(a: string, b: string): number {
const versionA = a.split('.').map(Number);
const versionB = b.split('.').map(Number);
return versionA < versionB ? 1 : versionA > versionB ? -1 : 0;
}
public onRateChanged(): void { public onRateChanged(): void {
this.appRate.refresh(); this.appRate.refresh();
} }
......
import {Pipe, PipeTransform} from '@angular/core';
@Pipe({
name: 'searchAppInstance'
})
export class AppinstanceSearchPipe implements PipeTransform {
transform(value: any[], searchValue: string, ): any[] {
if (!value || !searchValue) {
return value
}
let result = [];
value.forEach( val => {
if (val.name.toLowerCase().includes(searchValue.toLowerCase() ||
val.applicationName.toLowerCase().includes(searchValue.toLowerCase()) ||
val.id.toLowerCase().includes(searchValue.toLowerCase()))
) {
result.push(val);
}
})
return result;
}
}
...@@ -28,6 +28,8 @@ import { AddMembersModalComponent } from './modals/add-members-modal/add-members ...@@ -28,6 +28,8 @@ import { AddMembersModalComponent } from './modals/add-members-modal/add-members
import {MultiSelectModule} from 'primeng/multiselect'; import {MultiSelectModule} from 'primeng/multiselect';
import { SelectPodModalComponent } from './modals/select-pod-modal/select-pod-modal.component'; import { SelectPodModalComponent } from './modals/select-pod-modal/select-pod-modal.component';
import {TooltipModule} from 'primeng/tooltip'; import {TooltipModule} from 'primeng/tooltip';
import {AppinstanceSearchPipe} from './appinstance-search.pipe';
import {InputTextModule} from 'primeng/inputtext';
import { AppdeploymentComponent } from '../bulkDeployment/appDeployment/appchoose/appdeployment.component'; import { AppdeploymentComponent } from '../bulkDeployment/appDeployment/appchoose/appdeployment.component';
import {DropdownModule} from 'primeng/dropdown'; import {DropdownModule} from 'primeng/dropdown';
import {TimelineModule} from 'primeng/timeline'; import {TimelineModule} from 'primeng/timeline';
...@@ -45,6 +47,8 @@ import {ButtonModule} from 'primeng/button'; ...@@ -45,6 +47,8 @@ import {ButtonModule} from 'primeng/button';
AppInstanceShellViewComponent, AppInstanceShellViewComponent,
AddMembersModalComponent, AddMembersModalComponent,
SelectPodModalComponent, SelectPodModalComponent,
AppinstanceSearchPipe,
SelectPodModalComponent,
AppdeploymentComponent AppdeploymentComponent
], ],
imports: [ imports: [
...@@ -65,10 +69,12 @@ import {ButtonModule} from 'primeng/button'; ...@@ -65,10 +69,12 @@ import {ButtonModule} from 'primeng/button';
DropdownModule, DropdownModule,
TimelineModule, TimelineModule,
ButtonModule, ButtonModule,
InputTextModule,
], ],
exports: [ exports: [
AppInstanceComponent, AppInstanceComponent,
AppInstanceListComponent, AppInstanceListComponent,
AppinstanceSearchPipe
], ],
providers: [ providers: [
AppsService, AppsService,
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
</div> </div>
<div style="display: inline;" class="col-xs-12 col-sm-6 col-md-6 col-lg-6 pull-right text-right"> <div style="display: inline;" class="col-xs-12 col-sm-6 col-md-6 col-lg-6 pull-right text-right">
{{ 'APP_INSTANCES.ITEMS_PER_PAGE' | translate }}: {{ 'APP_INSTANCES.ITEMS_PER_PAGE' | translate }}:
<span id="selectionItems" class="dropdown" style="vertical-align: middle; display: inline-block;"> <span id="selectionItems" class="dropdown" style="vertical-align: middle; display: inline-block; margin-right: 10px">
<button class="dropdown-toggle btn" data-toggle="dropdown" data-close-others="true"> <button class="dropdown-toggle btn" data-toggle="dropdown" data-close-others="true">
{{maxItemsOnPage}} {{maxItemsOnPage}}
</button> </button>
...@@ -37,6 +37,8 @@ ...@@ -37,6 +37,8 @@
</li> </li>
</ul> </ul>
</span> </span>
<input pInputText name="search" id="search" placeholder="Search" type="text" [(ngModel)]="searchValue">
</div> </div>
</div> </div>
</div> </div>
...@@ -66,7 +68,7 @@ ...@@ -66,7 +68,7 @@
</thead> </thead>
<tbody> <tbody>
<ng-template ngFor let-appInstance <ng-template ngFor let-appInstance
[ngForOf]="appDeployedInstances | async | paginate: { itemsPerPage: maxItemsOnPage, currentPage: pageNumber, id: p_first }"> [ngForOf]="appDeployedInstances | async | searchAppInstance: searchValue | paginate: { itemsPerPage: maxItemsOnPage, currentPage: pageNumber, id: p_first }">
<tr [ngClass]="userHasGuestRoleInCurrentDomain() ? '' : 'clickable'" [routerLink]="userHasGuestRoleInCurrentDomain() ? [] : [appInstance.id]"> <tr [ngClass]="userHasGuestRoleInCurrentDomain() ? '' : 'clickable'" [routerLink]="userHasGuestRoleInCurrentDomain() ? [] : [appInstance.id]">
<td class="col-lg-1 col-md-1">{{appInstance?.name}}</td> <td class="col-lg-1 col-md-1">{{appInstance?.name}}</td>
<td class="col-lg-2 col-md-2">{{appInstance?.applicationName}}</td> <td class="col-lg-2 col-md-2">{{appInstance?.applicationName}}</td>
...@@ -138,5 +140,3 @@ ...@@ -138,5 +140,3 @@
screenReaderPageLabel="{{ 'PAGINATION.SCREEN_READER.PAGE' | translate }}" screenReaderPageLabel="{{ 'PAGINATION.SCREEN_READER.PAGE' | translate }}"
screenReaderCurrentLabel="{{ 'PAGINATION.SCREEN_READER.CURRENT' | translate }}"></pagination-controls> screenReaderCurrentLabel="{{ 'PAGINATION.SCREEN_READER.CURRENT' | translate }}"></pagination-controls>
</div> </div>
...@@ -18,6 +18,7 @@ import {RolesDirective} from '../../../directive/roles.directive'; ...@@ -18,6 +18,7 @@ import {RolesDirective} from '../../../directive/roles.directive';
import {JwtModule} from '@auth0/angular-jwt'; import {JwtModule} from '@auth0/angular-jwt';
import {Pipe, PipeTransform} from '@angular/core'; import {Pipe, PipeTransform} from '@angular/core';
import {HttpClientTestingModule} from '@angular/common/http/testing'; import {HttpClientTestingModule} from '@angular/common/http/testing';
import {AppinstanceSearchPipe} from '../appinstance-search.pipe';
@Pipe({ name: 'keys'}) @Pipe({ name: 'keys'})
class KeysPipe implements PipeTransform { class KeysPipe implements PipeTransform {
...@@ -58,7 +59,8 @@ describe('AppInstanceListComponent', () => { ...@@ -58,7 +59,8 @@ describe('AppInstanceListComponent', () => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [ declarations: [
AppInstanceListComponent, AppInstanceListComponent,
KeysPipe KeysPipe,
AppinstanceSearchPipe
], ],
imports: [ imports: [
FormsModule, FormsModule,
......
...@@ -56,6 +56,9 @@ export class AppInstanceListComponent implements OnInit { ...@@ -56,6 +56,9 @@ export class AppInstanceListComponent implements OnInit {
public domains: Domain[] = []; public domains: Domain[] = [];
public searchValue = '';
constructor(private appInstanceService: AppInstanceService, constructor(private appInstanceService: AppInstanceService,
public domainService: DomainService, public domainService: DomainService,
private userDataService: UserDataService, private userDataService: UserDataService,
...@@ -175,7 +178,7 @@ export class AppInstanceListComponent implements OnInit { ...@@ -175,7 +178,7 @@ export class AppInstanceListComponent implements OnInit {
this.appInstances = this.appInstances this.appInstances = this.appInstances
.pipe( .pipe(
map(app => app.filter( map(app => app.filter(
(appInst) => (this.domainId === this.appConfig.getNmaasGlobalDomainId() || this.domainId === appInst.domainId) (appInst) => (this.domainId === this.appConfig.getNmaasGlobalDomainId() || this.domainId === appInst.domainId)
) )
) )
); );
...@@ -183,8 +186,8 @@ export class AppInstanceListComponent implements OnInit { ...@@ -183,8 +186,8 @@ export class AppInstanceListComponent implements OnInit {
this.appDeployedInstances = this.appInstances this.appDeployedInstances = this.appInstances
.pipe( .pipe(
map(instances => instances.filter( map(instances => instances.filter(
app => parseAppInstanceState(app.state) !== AppInstanceState.REMOVED app => parseAppInstanceState(app.state) !== AppInstanceState.REMOVED
&& parseAppInstanceState(app.state) !== AppInstanceState.DONE && parseAppInstanceState(app.state) !== AppInstanceState.DONE
) )
) )
); );
...@@ -192,8 +195,8 @@ export class AppInstanceListComponent implements OnInit { ...@@ -192,8 +195,8 @@ export class AppInstanceListComponent implements OnInit {
this.appUndeployedInstances = this.appInstances this.appUndeployedInstances = this.appInstances
.pipe( .pipe(
map(instances => instances.filter( map(instances => instances.filter(
app => parseAppInstanceState(app.state) === AppInstanceState.REMOVED app => parseAppInstanceState(app.state) === AppInstanceState.REMOVED
|| parseAppInstanceState(app.state) === AppInstanceState.DONE || parseAppInstanceState(app.state) === AppInstanceState.DONE
) )
) )
); );
......
...@@ -20,6 +20,16 @@ ...@@ -20,6 +20,16 @@
<label class="control-label" for="{{id}}-tag-{{accessMethod.type}}">{{'APP_ACCESS_METHOD_EDIT.TAG' | translate}}: </label> <label class="control-label" for="{{id}}-tag-{{accessMethod.type}}">{{'APP_ACCESS_METHOD_EDIT.TAG' | translate}}: </label>
<input class="form-control" type="text" id="{{id}}-tag-{{accessMethod.type}}" ngDefaultControl [(ngModel)]="accessMethod.tag"> <input class="form-control" type="text" id="{{id}}-tag-{{accessMethod.type}}" ngDefaultControl [(ngModel)]="accessMethod.tag">
</div> </div>
<div class="form-group">
<label class="control-label" for="{{id}}-conditionType-{{accessMethod.conditionType}}">{{'APP_ACCESS_METHOD_EDIT.CONDITION_TYPE' | translate}}: </label>
<select class="form-control" id="{{id}}-conditionType-{{accessMethod.conditionType}}" [(ngModel)]="accessMethod.conditionType" (change)="onSelectConditionType($event)">
<option *ngFor="let s of conditionType; let i=index" value="{{s}}">{{s}}</option>
</select>
</div>
<div *ngIf="accessMethod.conditionType === 'DEPLOYMENT_PARAMETER'" class="form-group">
<label class="control-label" for="{{id}}-condition-{{accessMethod.type}}">{{'APP_ACCESS_METHOD_EDIT.CONDITION' | translate}}: </label>
<input class="form-control" type="text" id="{{id}}-condition-{{accessMethod.type}}" ngDefaultControl [(ngModel)]="accessMethod.condition">
</div>
</div> </div>
<ul class="col-sm-7"> <ul class="col-sm-7">
......
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing';
import {AppAccessMethodEditComponent} from './app-access-method-edit.component'; import {AppAccessMethodEditComponent} from './app-access-method-edit.component';
import {FormsModule} from '@angular/forms'; import {FormsModule} from '@angular/forms';
import {ServiceAccessMethodType} from '../../../model/service-access-method'; import {ServiceAccessMethodType} from '../../../model/service-access-method';
import {TranslateFakeLoader, TranslateLoader, TranslateModule} from '@ngx-translate/core'; import {TranslateFakeLoader, TranslateLoader, TranslateModule} from '@ngx-translate/core';
import {ConditionType} from '../../../model/app-access-method';
describe('AppAccessMethodEditComponent', () => { describe('AppAccessMethodEditComponent', () => {
let component: AppAccessMethodEditComponent; let component: AppAccessMethodEditComponent;
...@@ -35,7 +36,9 @@ describe('AppAccessMethodEditComponent', () => { ...@@ -35,7 +36,9 @@ describe('AppAccessMethodEditComponent', () => {
type: ServiceAccessMethodType.INTERNAL, type: ServiceAccessMethodType.INTERNAL,
name: 'd', name: 'd',
tag: 't', tag: 't',
deployParameters: {} deployParameters: {},
conditionType: ConditionType.NONE,
condition: ''
}; };
fixture.detectChanges(); fixture.detectChanges();
}); });
......
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {AppAccessMethod} from '../../../model/app-access-method'; import {AppAccessMethod, ConditionType} from '../../../model/app-access-method';
import {parseServiceAccessMethodType, ServiceAccessMethodType} from '../../../model/service-access-method'; import {parseServiceAccessMethodType, ServiceAccessMethodType} from '../../../model/service-access-method';
import {KeyValue} from '@angular/common'; import {KeyValue} from '@angular/common';
...@@ -40,6 +40,8 @@ export class AppAccessMethodEditComponent implements OnInit { ...@@ -40,6 +40,8 @@ export class AppAccessMethodEditComponent implements OnInit {
'K8S_SERVICE_SUFFIX', 'K8S_SERVICE_SUFFIX',
'K8S_SERVICE_PORT'] 'K8S_SERVICE_PORT']
public conditionType = ['NONE', 'DEPLOYMENT_PARAMETER']
constructor() { } constructor() { }
ngOnInit() { ngOnInit() {
...@@ -75,6 +77,7 @@ export class AppAccessMethodEditComponent implements OnInit { ...@@ -75,6 +77,7 @@ export class AppAccessMethodEditComponent implements OnInit {
public removeDeployParam(key: string, value: any): void { public removeDeployParam(key: string, value: any): void {
if (this.accessMethod.deployParameters.hasOwnProperty(key)) { if (this.accessMethod.deployParameters.hasOwnProperty(key)) {
this.keyValue = this.keyValue.filter(val => (val !== value)) this.keyValue = this.keyValue.filter(val => (val !== value))
delete this.accessMethod.deployParameters[key];
this.setKeyValueToDeployParam(); this.setKeyValueToDeployParam();
} }
} }
...@@ -106,4 +109,10 @@ export class AppAccessMethodEditComponent implements OnInit { ...@@ -106,4 +109,10 @@ export class AppAccessMethodEditComponent implements OnInit {
}) })
} }
public onSelectConditionType(conditionType: any) {
if (conditionType.target.value === 'NONE') {
this.accessMethod.condition = '';
}
}
} }
<nmaas-modal style="width: 600px; height: 800px">
<div class="nmaas-modal-header">{{ 'APPS_MANAGEMENT.ADD_JSON'| translate}}</div>
<div class="nmaas-modal-body">
<div style="margin-bottom: 10px">
{{ 'APPS_MANAGEMENT.ADD_JSON_INFO'| translate}}
</div>
<div style="margin-bottom: 4rem">
<p-fileUpload name="json" (onUpload)="onUpload($event)" customUpload="true" [draggable]="true"
(uploadHandler)="onUpload($event)" [multiple]="false" accept=".json" maxFileSize="1000000">
</p-fileUpload>
</div>
<div>
<div style="margin-bottom: 10px">
{{ 'APPS_MANAGEMENT.ADD_JSON_TEXTAREA'| translate}}
</div>
<textarea rows="10" cols="100" pInputTextarea [(ngModel)]="jsonText" (keyup)="this.JsonError = false; this.error = ''"></textarea>
</div>
<div class="flex flex-row justify-content-center justify-content-center mt-2">
<button *ngIf="jsonText.length >0" pButton class="btn btn-success"
(click)="sendJsonText()"> {{'APPS_MANAGEMENT.SEND_JSON' | translate}}</button>
</div>
<div *ngIf="error.length > 0" style="color: indianred">
{{error}}
</div>
<div *ngIf="JsonError" style="color: indianred">
{{'APPS_MANAGEMENT.JSON_ERROR' | translate}}
</div>
</div>
<div class="nmaas-modal-footer">
<button type="button" class="btn btn-default" (click)="modal.hide()">
{{'APP_CHANGE_STATE_MODAL.CANCEL_BUTTON' | translate}}
</button>
</div>
</nmaas-modal>
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AppAddJsonAppComponent } from './app-add-json-app.component';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import {RouterTestingModule} from '@angular/router/testing';
import {TranslateFakeLoader, TranslateLoader, TranslateModule} from '@ngx-translate/core';
describe('AppAddJsonAppComponent', () => {
let component: AppAddJsonAppComponent;
let fixture: ComponentFixture<AppAddJsonAppComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ AppAddJsonAppComponent ],
imports: [
HttpClientTestingModule,
RouterTestingModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateFakeLoader
}
}),
]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(AppAddJsonAppComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnInit, ViewChild} from '@angular/core';
import {ModalComponent} from '../../../shared';
import {AppsService} from '../../../service';
import {Router} from '@angular/router';
@Component({
selector: 'app-app-add-json-app',
templateUrl: './app-add-json-app.component.html',
styleUrls: ['./app-add-json-app.component.css']
})
export class AppAddJsonAppComponent implements OnInit {
@ViewChild(ModalComponent, {static: true})
public readonly modal: ModalComponent;
public jsonText = '';
public error = '';
public JsonError = false;
constructor(private readonly appsService: AppsService,
private readonly router: Router) {
}
ngOnInit(): void {
}
onUpload(event: any) {
console.log(event);
const file = event.files[0];
console.log(file);
const fileReader = new FileReader();
fileReader.readAsText(file);
fileReader.onload = () => {
if (typeof fileReader.result === 'string') {
try {
JSON.parse(fileReader.result);
this.appsService.createApplicationDTO(JSON.parse(fileReader.result)).subscribe(result => {
console.log('uploaded', result);
this.modal.hide();
this.router.navigate(['apps', result.id])
},
error => {
console.log(error)
if (error.message === null) {
this.JsonError = true;
} else {
this.error = error.message
}
})
} catch (e) {
console.warn('invalid json')
this.JsonError = true;
}
}
}
fileReader.onerror = (error) => {
console.log(error);
}
}
public sendJsonText() {
if (this.jsonText.length > 0) {
try {
JSON.parse(this.jsonText);
this.appsService.createApplicationDTO(JSON.parse(this.jsonText)).subscribe(result => {
console.log('uploaded', result);
this.modal.hide();
this.router.navigate(['apps', result.id])
},
error => {
console.log(error)
if (error.message === null) {
this.JsonError = true;
} else {
this.error = error.message
}
})
} catch (e) {
console.warn('invalid json')
this.JsonError = true;
}
}
}
public show() {
this.modal.show();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment