Passed
Push — master ( 34ef5e...ffe1e4 )
by Marcel
08:33
created

js/navigation.js   A

Complexity

Total Complexity 25
Complexity/F 2.5

Size

Lines of Code 172
Function Count 10

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 123
c 0
b 0
f 0
dl 0
loc 172
rs 10
wmc 25
mnd 15
bc 15
fnc 10
bpm 1.5
cpm 2.5
noi 1
1
/**
2
 * Data Analytics
3
 *
4
 * This file is licensed under the Affero General Public License version 3 or
5
 * later. See the LICENSE.md file.
6
 *
7
 * @author Marcel Scherello <[email protected]>
8
 * @copyright 2019 Marcel Scherello
9
 */
10
/** global: OCA */
11
/** global: OCP */
12
/** global: OC */
13
'use strict';
14
15
/**
16
 * @namespace OCA.Analytics.Navigation
17
 */
18
OCA.Analytics.Navigation = {
19
20
    init: function (datasetId) {
21
        document.getElementById('navigationDatasets').innerHTML = '';
22
        OCA.Analytics.Backend.getDatasets(datasetId);
23
    },
24
25
    handleNewDatasetButton: function () {
26
        OCA.Analytics.Backend.createDataset();
27
    },
28
29
    createDemoReport: function () {
30
        OCA.Analytics.Backend.createDataset('DEMO');
31
    },
32
33
    buildNavigation: function (data) {
34
        for (let navigation of data) {
35
            OCA.Analytics.Navigation.buildNavigationRow(navigation);
36
        }
37
    },
38
39
    buildNavigationRow: function (data) {
40
        let li = document.createElement('li');
41
        let typeIcon;
42
43
        let a = document.createElement('a');
44
        a.setAttribute('href', '#/r/' + data.id);
45
        let typeINT = parseInt(data.type);
46
        if (typeINT === OCA.Analytics.TYPE_INTERNAL_FILE) {
47
            typeIcon = 'icon-file';
48
        } else if (typeINT === OCA.Analytics.TYPE_INTERNAL_DB) {
49
            typeIcon = 'icon-projects';
50
        } else if (typeINT === OCA.Analytics.TYPE_GIT || typeINT === OCA.Analytics.TYPE_EXTERNAL_FILE) {
51
            typeIcon = 'icon-external';
52
        } else if (typeINT === OCA.Analytics.TYPE_SHARED) {
53
            if (document.getElementById('config').value === 'true') {
54
                // don´t show shared reports in advanced config mode as no config is possible
55
                return;
56
            }
57
            typeIcon = 'icon-shared';
58
        } else if (typeINT === OCA.Analytics.TYPE_EMPTY_GROUP) {
59
            typeIcon = 'icon-folder';
60
            li.classList.add('collapsible');
61
        } else {
62
            typeIcon = '';
63
        }
64
65
        if (typeIcon) {
66
            a.classList.add(typeIcon);
67
        }
68
        a.innerText = data.name;
69
        a.dataset.id = data.id;
70
        a.dataset.type = data.type;
71
        a.dataset.name = data.name;
72
73
74
        let ulSublist = document.createElement('ul');
75
        ulSublist.id = 'dataset-' + data.id;
76
77
        li.appendChild(a);
78
        if (typeINT !== OCA.Analytics.TYPE_SHARED) {
79
            let divUtils = OCA.Analytics.Navigation.buildNavigationUtils(data);
80
            let divMenu = OCA.Analytics.Navigation.buildNavigationMenu(data);
81
            li.appendChild(divUtils);
82
            li.appendChild(divMenu);
83
        }
84
85
        if (data.type === OCA.Analytics.TYPE_EMPTY_GROUP) {
86
            li.appendChild(ulSublist);
87
            a.addEventListener('click', OCA.Analytics.Navigation.handleGroupClicked);
88
        } else {
89
            a.addEventListener('click', OCA.Analytics.Navigation.handleNavigationClicked);
90
        }
91
92
        let categoryList;
93
        if (parseInt(data.parent) !== 0) {
94
            categoryList = document.getElementById('dataset-' + data.parent);
95
        } else {
96
            categoryList = document.getElementById('navigationDatasets');
97
        }
98
        categoryList.appendChild(li);
99
    },
100
101
    buildNavigationUtils: function (data) {
102
        let divUtils = document.createElement('div');
103
        divUtils.classList.add('app-navigation-entry-utils');
104
        let ulUtils = document.createElement('ul');
105
106
        let liMenuButton = document.createElement('li');
107
        liMenuButton.classList.add('app-navigation-entry-utils-menu-button');
108
        let button = document.createElement('button');
109
        button.addEventListener('click', OCA.Analytics.Navigation.handleOptionsClicked);
110
        button.dataset.id = data.id;
111
        button.dataset.name = data.name;
112
        button.dataset.type = data.type;
113
        liMenuButton.appendChild(button);
114
        ulUtils.appendChild(liMenuButton);
115
        divUtils.appendChild(ulUtils);
116
117
        return divUtils;
118
    },
119
120
    buildNavigationMenu: function (data) {
0 ignored issues
show
Unused Code introduced by
The parameter data is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
121
        let divMenu = document.createElement('div');
122
        divMenu.classList.add('app-navigation-entry-menu');
123
        let ulMenu = document.createElement('ul');
124
125
        let liEdit = document.createElement('li');
126
        let aEdit = document.createElement('a');
127
        aEdit.href = '#';
128
        let spanEditIcon = document.createElement('span');
129
        spanEditIcon.classList.add('icon-rename');
130
        let spanEditText = document.createElement('span');
131
        spanEditText.innerText = 'Edit';
132
        aEdit.appendChild(spanEditIcon);
133
        aEdit.appendChild(spanEditText);
134
        liEdit.appendChild(aEdit);
135
        ulMenu.appendChild(liEdit);
136
137
        let liAdvanced = document.createElement('li');
138
        let aAdvanced = document.createElement('a');
139
        aAdvanced.href = '#';
140
        let spanAdvancedIcon = document.createElement('span');
141
        spanAdvancedIcon.classList.add('icon-category-customization');
142
        let spanAdvancedText = document.createElement('span');
143
        spanAdvancedText.innerText = 'Advanced';
144
        aAdvanced.appendChild(spanAdvancedIcon);
145
        aAdvanced.appendChild(spanAdvancedText);
146
        liAdvanced.appendChild(aAdvanced);
147
        ulMenu.appendChild(liAdvanced);
148
        divMenu.appendChild(ulMenu);
149
150
        return divMenu;
151
    },
152
153
    handleNavigationClicked: function (evt) {
154
        let activeCategory = document.querySelector('#navigationDatasets .active');
155
        if (evt) {
156
            if (activeCategory) {
157
                activeCategory.classList.remove('active');
158
            }
159
            evt.target.classList.add('active');
160
        }
161
        if (document.getElementById('config').value === 'true') {
162
            OCA.Analytics.Sidebar.showSidebar(evt);
163
            evt.stopPropagation();
164
        } else {
165
            OCA.Analytics.UI.resetContent();
166
            OCA.Analytics.Sidebar.hideSidebar();
167
            OCA.Analytics.Backend.getData();
168
        }
169
    },
170
171
    handleOptionsClicked: function (evt) {
172
        OCA.Analytics.Sidebar.showSidebar(evt);
173
        evt.stopPropagation();
174
    },
175
176
    handleGroupClicked: function (evt) {
177
        if (evt.target.parentNode.classList.contains('open')) {
178
            evt.target.parentNode.classList.remove('open');
179
        } else {
180
            evt.target.parentNode.classList.add('open');
181
        }
182
        evt.stopPropagation();
183
    },
184
};