1/** 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16import { Component, OnInit } from '@angular/core'; 17import { MatSnackBar, MatTableDataSource, PageEvent } from '@angular/material'; 18 19import { AppService } from '../../appservice'; 20import { Host } from '../../model/host'; 21import { Lab } from '../../model/lab'; 22import { LabService } from './lab.service'; 23import { MenuBaseClass } from '../menu_base'; 24 25/** Component that handles lab and host menu. */ 26@Component({ 27 selector: 'app-lab', 28 templateUrl: './lab.component.html', 29 providers: [ LabService ], 30 styleUrls: ['./lab.component.scss'], 31}) 32export class LabComponent extends MenuBaseClass implements OnInit { 33 labColumnTitles = [ 34 '_index', 35 'name', 36 'owner', 37 'admin', 38 'hostCount', 39 ]; 40 hostColumnTitles = [ 41 '_index', 42 'name', 43 'hostname', 44 'ip', 45 'host_equipment', 46 'vtslab_version', 47 ]; 48 labCount = -1; 49 labPageIndex = 0; 50 51 constructor(private labService: LabService, 52 appService: AppService, 53 snackBar: MatSnackBar) { 54 super(appService, snackBar); 55 } 56 57 labDataSource = new MatTableDataSource<Lab>(); 58 hostDataSource = new MatTableDataSource<Host>(); 59 60 ngOnInit(): void { 61 // For labs and hosts, it does not use query pagination. 62 this.getHosts(); 63 } 64 65 /** Gets hosts. 66 * @param size A number, at most this many results will be returned. 67 * @param offset A Number of results to skip. 68 */ 69 getHosts(size = 0, offset = 0) { 70 this.loading = true; 71 // Labs will not use filter for query. 72 const filterJSON = ''; 73 this.labService.getLabs(size, offset, filterJSON, '', '') 74 .subscribe( 75 (response) => { 76 this.loading = false; 77 if (response.labs) { 78 this.count = response.labs.length; 79 this.hostDataSource.data = response.labs; 80 this.setLabs(response.labs); 81 } 82 }, 83 (error) => this.showSnackbar(`[${error.status}] ${error.name}`) 84 ); 85 } 86 87 /** Sets labs from given hosts. 88 * @param hosts A list of Host instances. 89 */ 90 setLabs(hosts: Host[]) { 91 if (hosts == null || hosts.length === 0) { return; } 92 const labMap = new Map(); 93 hosts.forEach(function(host) { 94 if (labMap.has(host.name)) { 95 labMap.get(host.name).hosts.push(host); 96 } else { 97 labMap.set(host.name, {name: host.name, owner: host.owner, admin: host.admin, hosts: [host]}); 98 } 99 }); 100 const labs: Lab[] = []; 101 labMap.forEach((value) => labs.push(value)); 102 this.labDataSource.data = labs; 103 } 104} 105