3 Commits

Author SHA1 Message Date
Manuel Romero
456bd00d47 populates 2020-06-26 14:11:33 +02:00
Manuel Romero
5a2a73a671 Provision populates from UI services 2020-06-26 14:06:57 +02:00
Manuel Romero
4fc3ea8ad2 virtual scenario injection in provision 2020-06-26 13:36:30 +02:00
22 changed files with 125 additions and 229 deletions

View File

@@ -9,5 +9,5 @@
<link rel="stylesheet" href="styles.5de5451578cdd1ad7eb0.css"></head>
<body>
<app-root></app-root>
<script src="runtime.689ba4fd6cadb82c1ac2.js" defer></script><script src="polyfills-es5.f752a17531a45fe93c1f.js" nomodule defer></script><script src="polyfills.06ba8d1a3d9dd3a8e8b9.js" defer></script><script src="scripts.5520a99f673924c17e00.js" defer></script><script src="main.e9f73c1cbb9915107acb.js" defer></script></body>
<script src="runtime.689ba4fd6cadb82c1ac2.js" defer></script><script src="polyfills-es5.f752a17531a45fe93c1f.js" nomodule defer></script><script src="polyfills.06ba8d1a3d9dd3a8e8b9.js" defer></script><script src="scripts.5520a99f673924c17e00.js" defer></script><script src="main.42ac080a238003947ee6.js" defer></script></body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "qmi-cloud-app",
"version": "1.1.5",
"version": "1.1.4",
"scripts": {
"start": "node -r esm server/server.js",
"start:dev": "nodemon -r esm server/server.js",

View File

@@ -16,7 +16,10 @@ const provisionSchema = new mongoose.Schema({
type: Date,
default: Date.now
},
scenario: String,
scenario: {
type: String,
required: true
},
scenarioVersion: {
type: String,
default: "1.0"
@@ -70,7 +73,18 @@ const provisionSchema = new mongoose.Schema({
pendingNextAction: {
type: String
}
},{
toObject: {virtuals:true},
toJSON: {virtuals:true}
});
// Foreign keys definitions
provisionSchema.virtual('_scenarioDoc', {
ref: 'Scenario',
localField: 'scenario',
foreignField: 'name',
justOne: true // for many-to-1 relationships
});
module.exports = mongoose.model('Provision', provisionSchema)

View File

@@ -15,12 +15,12 @@ const scenarioSchema = new mongoose.Schema({
},
version: {
type: String,
requred: true
required: true
},
name: {
type: String,
unique : true,
requred: true,
required: true,
index: true
},
isAdminOnly: {
@@ -31,7 +31,7 @@ const scenarioSchema = new mongoose.Schema({
type: Boolean,
default: false
},
isExternal: {
isExterrequirednal: {
type: Boolean,
default: false
},
@@ -41,7 +41,7 @@ const scenarioSchema = new mongoose.Schema({
},
title: {
type: String,
requred: true
required: true
},
description: String,
availableProductVersions: Array,
@@ -49,7 +49,7 @@ const scenarioSchema = new mongoose.Schema({
newImageName: String, //For Gen scenarios
subscription: {
type: mongoose.Types.ObjectId, ref: 'Subscription',
requred: true
required: true
}
});

View File

@@ -9,32 +9,34 @@ const options = {
useUnifiedTopology: true
};
console.log("--- MongoDB connecting...");
// Connect to DB
mongoose.connect(process.env.MONGO_URI, options);
// When successfully connected
mongoose.connection.on('connected', () => {
console.log('MongoDB connected...');
console.log('--- MongoDB connected');
});
// When successfully reconnected
mongoose.connection.on('reconnected', () => {
console.log('dbevent: reconnected');
console.log('--- MongoDB dbevent: reconnected');
});
// If the connection throws an error
mongoose.connection.on('error', (err) => {
console.log(`dbevent: error: ${err}`);
console.log(`--- MongoDB dbevent: error: ${err}`);
//console.log(`Retry mongo connect`);
//mongoose.connect(process.env.MONGO_URI, options);
});
// Get Data Models
const Scenario = require('./models/Scenario');
const Provision = require('./models/Provision');
const Destroy = require('./models/Destroy');
const User = require('./models/User');
const Scenario = require('./models/Scenario');
const VmType = require('./models/VmType');
const ApiKey = require('./models/ApiKey');
const Notification = require('./models/Notification');
@@ -82,12 +84,12 @@ const get = async (model, filter, select, skip, limit, populates, reply) => {
if ( populates ) {
populates = JSON.parse(populates);
populates.forEach(p=>{
exec = exec.populate({path: p});
populates.forEach(p=> {
exec = exec.populate(p);
});
} else {
if ( model === Provision ) {
exec = exec.populate({ path: 'user', select: 'displayName upn'}).populate({path:'destroy', select: "-user -jobId"});
exec = exec.populate({ path: 'user', select: 'displayName upn'}).populate({path:'destroy', select: "-user -jobId"}).populate({path:'_scenarioDoc', select: "-availableProductVersions -updated -created"});
}
if ( model === ApiKey ) {
@@ -120,7 +122,7 @@ const getById = async (model, id, reply) => {
try {
var exec = model.findById(id);
if ( model === Provision ) {
exec = exec.populate('user').populate('destroy');
exec = exec.populate('user').populate('destroy').populate('_scenarioDoc');
}
if ( model === ApiKey ) {
exec = exec.populate('user');
@@ -139,7 +141,7 @@ const getOne = async (model, filter, reply) => {
try {
var exec = model.findOne(filter);
if ( model === Provision ) {
exec = exec.populate('user').populate('destroy');
exec = exec.populate('user').populate('destroy').populate('_scenarioDoc');
}
if ( model === ApiKey ) {
exec = exec.populate('user');

Binary file not shown.

View File

@@ -229,39 +229,6 @@ router.delete('/:id', passport.ensureAuthenticatedAndAdmin, async (req, res, nex
}
});
/**
* @swagger
* /provisions/{id}:
* put:
* description: Update Provision by ID
* summary: Update Provision by ID
* tags:
* - admin
* parameters:
* - name: id
* in: path
* type: string
* required: true
* - in: body
* name: body
* description: Provision object
* required: true
* produces:
* - application/json
* responses:
* 200:
* description: Provision
*/
router.put('/:id', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
try {
const result = await db.provision.update(req.params.id, req.body);
return res.json(result);
} catch (error) {
next(error);
}
});
/**
* @swagger
* /provisions/{id}/logs:

View File

@@ -41,7 +41,6 @@ import { SubscriptionsService } from './services/deployopts.service';
import { TableApiKeysComponent } from './tables/table-apikeys.component';
import { ApikeyModalComponent } from './modals/edit-apikey.component';
import { VmTypeModalComponent } from './modals/edit-vmtype.component';
import { ProvisionModalComponent } from './modals/edit-provision.component';
@@ -82,8 +81,7 @@ export function markedOptions(): MarkedOptions {
TableApiKeysComponent,
ApikeyModalComponent,
TableVmTypesComponent,
VmTypeModalComponent,
ProvisionModalComponent
VmTypeModalComponent
],
imports: [
BrowserModule,

View File

@@ -2,7 +2,7 @@
<div class="modal-content text-center">
<!--Header-->
<div class="modal-header d-flex justify-content-center">
<p class="heading" [innerHTML]="info.title"></p>
<p class="heading">{{info.title}}</p>
</div>
<!--Body-->

View File

@@ -24,13 +24,13 @@ export class ApikeyModalComponent implements OnInit, OnDestroy {
ngOnInit() {
this._usersService.getUsers().subscribe(res=> {
this.users = res.results;
this.users = this.users.sort(function(a, b){return a.displayName.localeCompare(b.displayName);});
if (this.apiKey) {
this.sendData = JSON.parse(JSON.stringify(this.apiKey))
}
if (this.apiKey.user ) {
this.selectedUser = this.apiKey.user._id;
}
console.log("apiKey",this.apiKey);
if (this.apiKey) {
this.sendData = JSON.parse(JSON.stringify(this.apiKey))
}
if (this.apiKey.user ) {
this.selectedUser = this.apiKey.user._id;
}
})
}

View File

@@ -1,26 +0,0 @@
<!--Content-->
<div class="modal-content">
<div class="modal-header text-center">
<button type="button" class="close pull-right" aria-label="Close" (click)="modalRef.hide()">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title w-100 font-weight-bold">Edit Provision</h4>
</div>
<div class="modal-body" style="max-height: 650px; overflow: auto;">
<div>
<section style="padding: 20px 0px;">
<label>Onwer (*):</label>
<select class="browser-default custom-select custom-select-sm" [(ngModel)]="selectedUser">
<option *ngFor="let item of users" [value]="item._id">{{item.displayName}}</option>
</select>
</section>
</div>
</div>
<div class="modal-footer d-flex justify-content-center">
<button style="margin-right: 100px;" *ngIf="sendData._id" mdbBtn color="danger" outline="true" class="waves-light" size="sm" mdbWavesEffect (click)="delete();">Delete</button>
<button mdbBtn color="dark-green" size="sm" outline="true" class="waves-effect" mdbWavesEffect (click)="modalRef.hide()">Cancel</button>
<button mdbBtn color="dark-green" class="waves-light" size="sm" mdbWavesEffect (click)="confirm();">Save</button>
</div>
</div>
<!--/.Content-->

View File

@@ -1,45 +0,0 @@
import { Component, OnInit, OnDestroy } from '@angular/core';
import { MDBModalRef } from 'angular-bootstrap-md';
import { Subject } from 'rxjs';
import { UsersService } from '../services/users.service';
import { ProvisionsService } from '../services/provisions.service';
@Component({
selector: 'qmi-edit-provision',
templateUrl: './edit-provision.component.html',
styleUrls: ['./edit-provision.component.scss']
})
export class ProvisionModalComponent implements OnInit, OnDestroy {
provision;
action: Subject<any> = new Subject();
users;
selectedUser;
sendData : any = {};
constructor( public modalRef: MDBModalRef, private _usersService: UsersService, private _provisionsService: ProvisionsService ) {}
ngOnInit() {
var sub = this._usersService.getUsers().subscribe(res=> {
this.users = res.results;
this.users = this.users.sort(function(a, b){return a.displayName.localeCompare(b.displayName);});
sub.unsubscribe();
if (this.provision.user ) {
this.selectedUser = this.provision.user._id;
}
});
}
ngOnDestroy() {
}
confirm() : void {
this._provisionsService.updateProvisionAdmin(this.provision._id, { user: this.selectedUser } ).subscribe( res=>{
this.action.next(res);
this.modalRef.hide();
});
}
}

View File

@@ -13,7 +13,7 @@
<b>Purpose: </b> {{info.description}}
</div>
<div>
<b>Scenario: </b> {{info._scenario[0].title}} <span *ngIf="info.isExternalAccess">( External Access is enabled )</span>
<b>Scenario: </b> {{info._scenarioDoc.title}} <span *ngIf="info.isExternalAccess">( External Access is enabled )</span>
</div>
<div *ngIf="info.vmType && !info.vmImage">

View File

@@ -5,7 +5,7 @@
<div *ngIf="provisions && provisions.length" class="flexcontainer">
<div *ngFor="let provision of provisions; let i = index" class="box">
<div class="title {{provision.status}} {{provision.statusVms}} {{provision.destroy? provision.destroy.status : ''}}">
<div class="maintitle"><span *ngIf="provision._scenario && provision._scenario[0]">{{provision._scenario[0].title}}</span><span *ngIf="!provision._scenario || !provision._scenario[0]">Old scenario (please destroy)</span></div>
<div class="maintitle"><span *ngIf="provision._scenarioDoc">{{provision._scenarioDoc.title}}</span><span *ngIf="!provision._scenarioDoc">Old scenario (please destroy)</span></div>
<div class="subtitle">{{provision.scenario}} (v{{provision.scenarioVersion}})</div>
</div>
<div class="title desc {{provision.status}} {{provision.statusVms}} {{provision.destroy? provision.destroy.status : ''}}">
@@ -105,7 +105,7 @@
<div *ngIf="destroys && destroys.length" class="flexcontainer">
<div *ngFor="let provision of destroys; let i = index" class="box">
<div class="title {{provision.status}} {{provision.destroy.status}}">
<div class="maintitle"><span *ngIf="provision._scenario && provision._scenario[0]">{{provision._scenario[0].title}}</span><span *ngIf="!provision._scenario || !provision._scenario[0]">Old scenario (please delete)</span></div>
<div class="maintitle"><span *ngIf="provision._scenarioDoc">{{provision._scenarioDoc.title}}</span><span *ngIf="!provision._scenarioDoc">Old scenario (please delete)</span></div>
<div class="subtitle">{{provision.scenario}} (v{{provision.scenarioVersion}})</div>
</div>
<div class="title desc {{provision.status}} {{provision.destroy.status}}">

View File

@@ -3,7 +3,6 @@ import { ProvisionsService } from '../services/provisions.service';
import { Subscription, timer} from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { AuthGuard } from '../services/auth.guard';
import { ScenariosService } from '../services/scenarios.service';
import { AlertService } from '../services/alert.service';
import { MDBModalService } from 'angular-bootstrap-md';
import { ModalInfoComponent } from '../modals/modalinfo.component';
@@ -22,13 +21,11 @@ export class ProvisionsComponent implements OnInit {
destroys;
subscription: Subscription;
instantSubs: Subscription;
scenariosSub: Subscription;
logShow: boolean = false;
logstype: String = 'provision';
public selectedprov: Object = null;
scenarios;
constructor(private modalService: MDBModalService, private _alertService: AlertService, private _provisionsService: ProvisionsService, private _scenariosService: ScenariosService, private _auth: AuthGuard) {
constructor(private modalService: MDBModalService, private _alertService: AlertService, private _provisionsService: ProvisionsService, private _auth: AuthGuard) {
this._auth.getUserInfo().subscribe( value => {
this._userId = value? value._id : null;
});
@@ -38,7 +35,6 @@ export class ProvisionsComponent implements OnInit {
this.instantSubs = this._provisionsService.getProvisionsByUser(this._userId).subscribe( provisions=>{
provisions = provisions.results;
provisions.forEach(p=>{
p._scenario = this.scenarios.filter(s => s.name === p.scenario);
this._provisionsService.timeRunning(p);
});
this.provisions = provisions.filter(p => !p.destroy || !p.destroy.status || p.destroy.status !== 'destroyed');
@@ -47,22 +43,15 @@ export class ProvisionsComponent implements OnInit {
})
}
ngOnInit() {
this.scenariosSub = this._scenariosService.getScenariosAll().subscribe( res => {
this.scenarios = res.results;
this.scenariosSub.unsubscribe();
this.subscription = timer(0, 8000).pipe( switchMap(() => this._provisionsService.getProvisionsByUser(this._userId) ) ).subscribe(provisions => {
provisions = provisions.results;
provisions.forEach(p=>{
p._scenario = this.scenarios.filter(s => s.name === p.scenario);
this._provisionsService.timeRunning(p);
});
this.provisions = provisions.filter(p => !p.destroy || !p.destroy.status || p.destroy.status !== 'destroyed');
this.destroys = provisions.filter(p => p.destroy && p.destroy.status === 'destroyed');
})
});
ngOnInit() {
this.subscription = timer(0, 8000).pipe( switchMap(() => this._provisionsService.getProvisionsByUser(this._userId) ) ).subscribe(provisions => {
provisions = provisions.results;
provisions.forEach(p=>{
this._provisionsService.timeRunning(p);
});
this.provisions = provisions.filter(p => !p.destroy || !p.destroy.status || p.destroy.status !== 'destroyed');
this.destroys = provisions.filter(p => p.destroy && p.destroy.status === 'destroyed');
})
}
ngOnDestroy() {

View File

@@ -23,6 +23,10 @@ export class ProvisionsService {
if ( filter ){
params = params.append("filter", JSON.stringify(filter));
}
params = params.append("populates", JSON.stringify([
{ path: 'user', select: 'displayName upn' },
{ path:'destroy', select: "-user -jobId" }
]));
return this.httpClient.get(`${environment.apiVersionPath}/provisions`, { params: params });
}
@@ -30,6 +34,10 @@ export class ProvisionsService {
return this.httpClient.get(`${environment.apiVersionPath}/users/${userId}/provisions`);
}
getProvisionsById(id) : Observable<any> {
return this.httpClient.get(`${environment.apiVersionPath}/provisions/${id}`);
}
getDestroyProvisionsAdmin() : Observable<any> {
return this.httpClient.get(`${environment.apiVersionPath}/destroyprovisions`);
}
@@ -43,10 +51,6 @@ export class ProvisionsService {
return this.httpClient.delete(`${environment.apiVersionPath}/users/${userId}/provisions/${id}`);
}
updateProvisionAdmin(id, patch): Observable<any> {
return this.httpClient.put(`${environment.apiVersionPath}/provisions/${id}`, patch);
}
newDestroy(id, userId) : Observable<any> {
return this.httpClient.post(`${environment.apiVersionPath}/users/${userId}/provisions/${id}/destroy`, null);
}

View File

@@ -32,7 +32,7 @@
</span>
</td>
<th *ngIf="i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex">{{item.provision}}</th>
<th *ngIf="i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex"><a href="#" (click)="openInfoModal($event,item.provision)">{{item.provision}}</a></th>
<td *ngIf="i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex">{{item.message}}</td>
</tr>
</tbody>

View File

@@ -1,7 +1,9 @@
import { MdbTablePaginationComponent, MdbTableDirective } from 'angular-bootstrap-md';
import { MdbTablePaginationComponent, MdbTableDirective, MDBModalService } from 'angular-bootstrap-md';
import { Component, OnInit, ViewChild, HostListener, AfterViewInit, ChangeDetectorRef } from '@angular/core';
import { UsersService } from '../services/users.service';
import { ModalInfoComponent } from '../modals/modalinfo.component';
import { ProvisionsService } from '../services/provisions.service';
@Component({
selector: 'table-notifications',
@@ -24,7 +26,7 @@ export class TableNotificationsComponent implements OnInit, AfterViewInit {
this.mdbTablePagination.searchText = this.searchText;
}
constructor(private cdRef: ChangeDetectorRef, private _usersService: UsersService) {
constructor(private cdRef: ChangeDetectorRef, private _provisionsService: ProvisionsService, private _usersService: UsersService, private modalService: MDBModalService) {
}
private _initElements(): void {
@@ -79,4 +81,25 @@ export class TableNotificationsComponent implements OnInit, AfterViewInit {
});
}
openInfoModal($event, provisionId) {
$event.preventDefault();
this._provisionsService.getProvisionsById(provisionId).subscribe( res=> {
this.modalService.show(ModalInfoComponent, {
backdrop: true,
keyboard: true,
focus: true,
show: false,
ignoreBackdropClick: false,
class: 'modal-lg',
containerClass: '',
animated: true,
data: {
info: res
}
} );
})
}
}

View File

@@ -23,7 +23,7 @@
<tr>
<th>ProvisionID</th>
<th [mdbTableSort]="elements" sortBy="created" >Prov. Date <mdb-icon fas icon="sort"></mdb-icon></th>
<th [mdbTableSort]="elements" sortBy="user.displayName">Owner <mdb-icon fas icon="sort"></mdb-icon></th>
<th [mdbTableSort]="elements" sortBy="user.displayName">User <mdb-icon fas icon="sort"></mdb-icon></th>
<th [mdbTableSort]="elements" sortBy="scenario">Scenario (v)<mdb-icon fas icon="sort"></mdb-icon></th>
<th [mdbTableSort]="elements" sortBy="isExternalAccess">Ext. Access? <mdb-icon fas icon="sort"></mdb-icon></th>
<th [mdbTableSort]="elements" sortBy="statusVms">VMs (Running time)<mdb-icon fas icon="sort"></mdb-icon></th>
@@ -36,16 +36,14 @@
</thead>
<tbody>
<tr mdbTableCol *ngFor="let provision of elements; let i = index">
<td (click)="openInfoModal(provision)" scope="row" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<td (click)="openInfoModal(provision._id)" scope="row" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<a href (click)="showLogs($event, provision, 'provision')" class="lui-text-info">{{ provision._id }}</a>
</td>
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.created | date: 'MMM dd, yyyy - H:mm'}}</td>
<td *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" class="ell" title="{{provision.path}}" >
<a href (click)="openOwnerChange($event, provision)" class="lui-text-info">{{provision.user.displayName}}</a>
</td>
<td (click)="openInfoModal(provision)"*ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.scenario}} (v{{provision.scenarioVersion}})</td>
<td style="text-align: center;" (click)="openInfoModal(provision)"*ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)"><mdb-icon *ngIf="provision.isExternalAccess" fas icon="check"></mdb-icon></td>
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.created | date: 'MMM dd, yyyy - H:mm'}}</td>
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" class="ell" title="{{provision.path}}" >{{provision.user.displayName}}</td>
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">{{provision.scenario}} (v{{provision.scenarioVersion}})</td>
<td style="text-align: center;" (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)"><mdb-icon *ngIf="provision.isExternalAccess" fas icon="check"></mdb-icon></td>
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<span>
<span style="text-transform: capitalize;" class="badge badge-secondary" [ngClass]="{'badge-success': provision.statusVms === 'Running', 'badge-warning': provision.statusVms === 'Stopped' || provision.statusVms === 'Stopping' || provision.statusVms === 'Starting'}">{{provision.statusVms}}</span>
<span *ngIf="provision.statusVms === 'Starting' || provision.statusVms === 'Stopping'" class="spinner-border spinner-border-sm text-warning" role="status">
@@ -70,15 +68,15 @@
</i>
</div>
</td>
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<span style="text-transform: capitalize;" class="badge badge-secondary" [ngClass]="{'badge-warning': provision.status === 'provisioning' || provision.status === 'initializing', 'badge-success': provision.status === 'provisioned', 'badge-danger': (provision.status === 'error' || provision.status === 'error_init' || provision.status === 'error_plan') }">{{provision.status}}</span>
<span *ngIf="provision.status === 'provisioning' || provision.status === 'initializing'" class="spinner-border spinner-border-sm text-warning" role="status">
<span class="sr-only"></span>
</span>
</td>
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" style="border-left:2px solid #ccc;"><a *ngIf="provision.destroy" href (click)="showLogs($event, provision, 'destroy')" class="lui-text-info">{{provision.destroy._id}}</a></td>
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" ><span *ngIf="provision.destroy">{{provision.destroy.created | date: 'MMM dd, yyyy - H:mm'}}</span></td>
<td (click)="openInfoModal(provision)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" style="border-left:2px solid #ccc;"><a *ngIf="provision.destroy" href (click)="showLogs($event, provision, 'destroy')" class="lui-text-info">{{provision.destroy._id}}</a></td>
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)" ><span *ngIf="provision.destroy">{{provision.destroy.created | date: 'MMM dd, yyyy - H:mm'}}</span></td>
<td (click)="openInfoModal(provision._id)" *ngIf="pagingIsDisabled || (i+1 >= mdbTablePagination.firstItemIndex && i < mdbTablePagination.lastItemIndex)">
<span *ngIf="provision.destroy">
<span style="text-transform: capitalize;" class="badge badge-secondary" [ngClass]="{'badge-warning': provision.destroy.status === 'destroying', 'badge-success': provision.destroy.status === 'destroyed', 'badge-danger': provision.destroy.status === 'error'}">{{provision.destroy.status}}</span>
<span *ngIf="provision.destroy.status === 'destroying'" class="spinner-border spinner-border-sm text-warning" role="status">

View File

@@ -4,9 +4,7 @@ import { ProvisionsService } from '../services/provisions.service';
import { AlertService } from '../services/alert.service';
import { ModalInfoComponent } from '../modals/modalinfo.component';
import { ModalConfirmComponent } from '../modals/confirm.component';
import { Subscription, timer } from 'rxjs';
import { ScenariosService } from '../services/scenarios.service';
import { ProvisionModalComponent } from '../modals/edit-provision.component';
import { Subscription } from 'rxjs';
@Component({
selector: 'table-provisions',
templateUrl: './table-provisions.component.html',
@@ -39,6 +37,7 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
this.mdbTablePagination.searchText = this.searchText;
}
selectedprov: any = null;
showInfo: boolean = false;
logShow: boolean = false;
@@ -47,7 +46,7 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
maxVisibleItems: number = 25;
constructor(private modalService: MDBModalService, private _scenariosService: ScenariosService, private _alertService: AlertService, private cdRef: ChangeDetectorRef, private _provisionsService: ProvisionsService) {
constructor(private modalService: MDBModalService, private _alertService: AlertService, private cdRef: ChangeDetectorRef, private _provisionsService: ProvisionsService) {
}
@@ -58,11 +57,9 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
}
private _process(provisions) : void {
provisions.forEach( p=> {
p.user.currentUserId = p.user._id;
p._scenario = this.scenarios.filter(s => s.name === p.scenario);
provisions.forEach(p=>{
this._provisionsService.timeRunning(p);
} );
});
if ( this.elements.length === 0 ) {
this.elements = provisions;
} else {
@@ -93,17 +90,8 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
}
ngOnInit() {
var scenariosSub = this._scenariosService.getScenariosAll().subscribe( res => {
scenariosSub.unsubscribe();
this.scenarios = res.results;
/*this.subscription = timer(0, 8000).pipe( switchMap(() => this._provisionsService.getProvisionsAdmin(this.filterParams) ) ).subscribe(provisions => {
this._process(provisions.results);
});*/
this.refreshData();
});
this.refreshData();
//this._initElements();
}
@@ -125,26 +113,6 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
}
}
openOwnerChange($event, provision){
$event.preventDefault();
var modalRef = this.modalService.show(ProvisionModalComponent, {
class: 'modal-md modal-notify',
containerClass: '',
data: {
provision: provision
}
} );
var sub = modalRef.content.action.subscribe( (result: any) => {
sub.unsubscribe();
provision.user = result.user;
this._alertService.showAlert({
type: 'alert-primary',
text: `New owner ${provision.user.displayName} assigned to this provision`
});
});
}
searchItems() {
const prev = this.mdbTable.getDataSource();
@@ -243,20 +211,24 @@ export class TableProvisionsAdminComponent implements OnInit, OnDestroy, AfterVi
})
}
openInfoModal(provision) {
this.modalService.show(ModalInfoComponent, {
backdrop: true,
keyboard: true,
focus: true,
show: false,
ignoreBackdropClick: false,
class: 'modal-lg',
containerClass: '',
animated: true,
data: {
info: provision
}
} );
openInfoModal(provisionId) {
this._provisionsService.getProvisionsById(provisionId).subscribe( res=> {
this.modalService.show(ModalInfoComponent, {
backdrop: true,
keyboard: true,
focus: true,
show: false,
ignoreBackdropClick: false,
class: 'modal-lg',
containerClass: '',
animated: true,
data: {
info: res
}
} );
})
}
openConfirmDestroyModal(provision) {