aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/ng2/components/logic/generic-artifact-browser/generic-artifact-browser.component.ts
blob: c87fb511629d5a17cfad4bcd1f319372aa922fc7 (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
/*-
 * ============LICENSE_START=======================================================
 * SDC
 * ================================================================================
 * Copyright (C) 2019 Nokia. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */

import {Component, Input, ViewEncapsulation} from "@angular/core";
import {GabService, IServerResponse} from "../../../services/gab.service";
import {PathsAndNamesDefinition} from "../../../../models/paths-and-names";

const COLUMN_PREFIX: string = 'col';

@Component({
    selector: 'gab',
    templateUrl: './generic-artifact-browser.component.html',
    styleUrls:['./generic-artifact-browser.component.less'],
    encapsulation: ViewEncapsulation.None
})
export class GenericArtifactBrowserComponent {
    @Input()
    pathsandnames: PathsAndNamesDefinition[];
    @Input()
    artifactid: string;
    @Input()
    resourceid: string;

    columns: ColumnDefinition[];
    rows: any[];
    selectedRows: any[];
    isLoading: boolean;
    ready: boolean;

    constructor(private gabService: GabService) {
    }

    ngOnInit() {
        this.ready = false;
        this.isLoading = true;
        this.columns = [];
        let paths: string[] = this.pathsandnames.map(item => item.path);
        this.gabService.getArtifact(this.artifactid, this.resourceid, paths)
        .subscribe(
            response => {
            let typedServerResponse:IServerResponse = <IServerResponse>response.json();
            this.normalizeDataForNgxDatatable(typedServerResponse.data);
            },
            err => console.log(err),
            () => {
                this.ready = true;
                this.isLoading = false;
            }
        );
    }

    private normalizeDataForNgxDatatable(data: [{ [key: string]: string }]) {
        let result: NormalizationResult = this.getNormalizationResult(data, this.pathsandnames);
        this.rows = result.rows;
        this.columns = result.columns;
    }

    private getNormalizationResult(data: [{ [key: string]: string }],
                                   pathsAndNames: PathsAndNamesDefinition[]): NormalizationResult {
        //Prepare column names and column data property names
        let mappingsPathToProp = new Map<string,string>();
        let columnsDefinitions = this.normalizeColumns(pathsAndNames, mappingsPathToProp);

        //Convert rows from { "string": "string" } to { prop : "string" } format
        //This is required by NgxDatatable component
        let arrayOfRows = this.normalizeRows(data, mappingsPathToProp);

        return new NormalizationResult(arrayOfRows, columnsDefinitions);
    }

    private normalizeColumns(pathsAndNames: PathsAndNamesDefinition[], mappingsPathToProp: Map<string,string>) {
        let columnsDefinitions: ColumnDefinition[] = [];
        let index: number = 1;

        pathsAndNames.forEach(function (col) {
            let columnDataPropertyName: string = COLUMN_PREFIX + index;
            mappingsPathToProp.set(col.path, columnDataPropertyName);
            let cell: ColumnDefinition = new ColumnDefinition(col.friendlyName, columnDataPropertyName);
            columnsDefinitions.push(cell);
            index += 1;
        });
        return columnsDefinitions;
    }

    private normalizeRows(data: [{ [key: string]: string }], mappingsPathToProp: Map<string,string>) {
        let arrayOfRows = [];
        data.forEach(function (col) {
            let row = {};
            for (let key in col) {
                if (col.hasOwnProperty(key)) {
                    let columnNameAsProp = mappingsPathToProp.get(key);
                    row[columnNameAsProp] = col[key];
                }
            }
            arrayOfRows.push(row);
        });
        return arrayOfRows;
    }
}

class NormalizationResult {
    constructor(public rows: any[], public columns: ColumnDefinition[]) {}
}

export class ColumnDefinition {
    constructor(public name: string, public prop: string) {}
}