summaryrefslogtreecommitdiffstats
path: root/webapp/src/app/config/config.component.ts
blob: 745e9f68cb7ac03ee91a9f7af47fb2f48a3526d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { Component, OnInit } from "@angular/core";
import { Observable } from 'rxjs/Observable';
import { FormControl, FormGroup, Validators, FormBuilder } from '@angular/forms';

// Import RxJs required methods
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/debounceTime';

import { ConfigService, IConfig, IProject, ProjectType } from "../common/config.service";
import { XDSServerService, IServerStatus } from "../common/xdsserver.service";
import { SyncthingService, ISyncThingStatus } from "../common/syncthing.service";
import { AlertService } from "../common/alert.service";
import { ISdk, SdkService } from "../common/sdk.service";

@Component({
    templateUrl: './app/config/config.component.html',
    styleUrls: ['./app/config/config.component.css']
})

// Inspired from https://embed.plnkr.co/jgDTXknPzAaqcg9XA9zq/
// and from http://plnkr.co/edit/vCdjZM?p=preview

export class ConfigComponent implements OnInit {

    config$: Observable<IConfig>;
    sdks$: Observable<ISdk[]>;
    severStatus$: Observable<IServerStatus>;
    localSTStatus$: Observable<ISyncThingStatus>;

    curProj: number;
    userEditedLabel: boolean = false;

    // TODO replace by reactive FormControl + add validation
    syncToolUrl: string;
    syncToolRetry: string;
    projectsRootDir: string;
    showApplyBtn = {    // Used to show/hide Apply buttons
        "retry": false,
        "rootDir": false,
    };

    addProjectForm: FormGroup;
    pathCtrl = new FormControl("", Validators.required);


    constructor(
        private configSvr: ConfigService,
        private xdsSvr: XDSServerService,
        private stSvr: SyncthingService,
        private sdkSvr: SdkService,
        private alert: AlertService,
        private fb: FormBuilder
    ) {
        // FIXME implement multi project support
        this.curProj = 0;
        this.addProjectForm = fb.group({
            path: this.pathCtrl,
            label: ["", Validators.nullValidator],
        });
    }

    ngOnInit() {
        this.config$ = this.configSvr.conf;
        this.sdks$ = this.sdkSvr.Sdks$;
        this.severStatus$ = this.xdsSvr.Status$;
        this.localSTStatus$ = this.stSvr.Status$;

        // Bind syncToolUrl to baseURL
        this.config$.subscribe(cfg => {
            this.syncToolUrl = cfg.localSThg.URL;
            this.syncToolRetry = String(cfg.localSThg.retry);
            this.projectsRootDir = cfg.projectsRootDir;
        });

        // Auto create label name
        this.pathCtrl.valueChanges
            .debounceTime(100)
            .filter(n => n)
            .map(n => "Project_" + n.split('/')[0])
            .subscribe(value => {
                if (value && !this.userEditedLabel) {
                    this.addProjectForm.patchValue({ label: value });
                }
            });
    }

    onKeyLabel(event: any) {
        this.userEditedLabel = (this.addProjectForm.value.label !== "");
    }

    submitGlobConf(field: string) {
        switch (field) {
            case "retry":
                let re = new RegExp('^[0-9]+$');
                let rr = parseInt(this.syncToolRetry, 10);
                if (re.test(this.syncToolRetry) && rr >= 0) {
                    this.configSvr.syncToolRetry = rr;
                } else {
                    this.alert.warning("Not a valid number", true);
                }
                break;
            case "rootDir":
                this.configSvr.projectsRootDir = this.projectsRootDir;
                break;
            default:
                return;
        }
        this.showApplyBtn[field] = false;
    }

    syncToolRestartConn() {
        this.configSvr.syncToolURL = this.syncToolUrl;
        this.configSvr.loadProjects();
    }

    onSubmit() {
        let formVal = this.addProjectForm.value;

        this.configSvr.addProject({
            label: formVal['label'],
            path: formVal['path'],
            type: ProjectType.SYNCTHING,
            // FIXME: allow to set defaultSdkID from New Project config panel
        });
    }

}