101596ff7d181b6286abfc1aa35c0f45db46f99f
[src/xds/xds-agent.git] / webapp / src / app / config / config.component.ts
1 import { Component, ViewChild, OnInit } from "@angular/core";
2 import { Observable } from 'rxjs/Observable';
3 import { FormControl, FormGroup, Validators, FormBuilder } from '@angular/forms';
4 import { CollapseModule } from 'ngx-bootstrap/collapse';
5
6 import { ConfigService, IConfig } from "../services/config.service";
7 import { ProjectService, IProject } from "../services/project.service";
8 import { XDSAgentService, IAgentStatus, IXDSConfig } from "../services/xdsagent.service";
9 import { AlertService } from "../services/alert.service";
10 import { ProjectAddModalComponent } from "../projects/projectAddModal.component";
11 import { SdkService, ISdk } from "../services/sdk.service";
12 import { SdkAddModalComponent } from "../sdks/sdkAddModal.component";
13
14 @Component({
15     templateUrl: './app/config/config.component.html',
16     styleUrls: ['./app/config/config.component.css']
17 })
18
19 // Inspired from https://embed.plnkr.co/jgDTXknPzAaqcg9XA9zq/
20 // and from http://plnkr.co/edit/vCdjZM?p=preview
21
22 export class ConfigComponent implements OnInit {
23     @ViewChild('childProjectModal') childProjectModal: ProjectAddModalComponent;
24     @ViewChild('childSdkModal') childSdkModal: SdkAddModalComponent;
25
26     config$: Observable<IConfig>;
27     projects$: Observable<IProject[]>;
28     sdks$: Observable<ISdk[]>;
29     agentStatus$: Observable<IAgentStatus>;
30
31     curProj: number;
32     curServer: number;
33     curServerID: string;
34     userEditedLabel: boolean = false;
35
36     gConfigIsCollapsed: boolean = true;
37     sdksIsCollapsed: boolean = true;
38     projectsIsCollapsed: boolean = false;
39
40     // TODO replace by reactive FormControl + add validation
41     xdsServerConnected: boolean = false;
42     xdsServerUrl: string;
43     xdsServerRetry: string;
44     projectsRootDir: string;    // FIXME: should be remove when projectAddModal will always return full path
45     showApplyBtn = {    // Used to show/hide Apply buttons
46         "retry": false,
47         "rootDir": false,
48     };
49
50     constructor(
51         private configSvr: ConfigService,
52         private projectSvr: ProjectService,
53         private xdsAgentSvr: XDSAgentService,
54         private sdkSvr: SdkService,
55         private alert: AlertService,
56     ) {
57     }
58
59     ngOnInit() {
60         this.config$ = this.configSvr.Conf$;
61         this.projects$ = this.projectSvr.Projects$;
62         this.sdks$ = this.sdkSvr.Sdks$;
63         this.agentStatus$ = this.xdsAgentSvr.Status$;
64
65         // FIXME support multiple servers
66         this.curServer = 0;
67
68         // Bind xdsServerUrl to baseURL
69         this.xdsAgentSvr.XdsConfig$.subscribe(cfg => {
70             if (!cfg || cfg.servers.length < 1) {
71                 return;
72             }
73             let svr = cfg.servers[this.curServer];
74             this.curServerID = svr.id;
75             this.xdsServerConnected = svr.connected;
76             this.xdsServerUrl = svr.url;
77             this.xdsServerRetry = String(svr.connRetry);
78             this.projectsRootDir = ''; // SEB FIXME: add in go config? cfg.projectsRootDir;
79         });
80     }
81
82     submitGlobConf(field: string) {
83         switch (field) {
84             case "retry":
85                 let re = new RegExp('^[0-9]+$');
86                 let rr = parseInt(this.xdsServerRetry, 10);
87                 if (re.test(this.xdsServerRetry) && rr >= 0) {
88                     this.xdsAgentSvr.setServerRetry(this.curServerID, rr);
89                 } else {
90                     this.alert.warning("Not a valid number", true);
91                 }
92                 break;
93             case "rootDir":
94                 this.configSvr.projectsRootDir = this.projectsRootDir;
95                 break;
96             default:
97                 return;
98         }
99         this.showApplyBtn[field] = false;
100     }
101
102     xdsAgentRestartConn() {
103         let url = this.xdsServerUrl;
104         this.xdsAgentSvr.setServerUrl(this.curServerID, url);
105         this.configSvr.loadProjects();
106     }
107
108 }