Skip to content

Commit c443cdf

Browse files
committed
Merge branch 'dev'
2 parents 35bb760 + ba9cb88 commit c443cdf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+121195
-8107
lines changed

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
npm-debug.log

Dockerfile

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,7 @@
1-
FROM node:8
2-
3-
# Copy dependency info
4-
COPY package*.json /usr/src/app/
5-
6-
# Change working directory
1+
FROM node:11.12.0
72
WORKDIR /usr/src/app/
8-
9-
# Install dependencies
3+
COPY package*.json ./
104
RUN npm install
11-
12-
# Copy source code
13-
COPY . /usr/src/app/
14-
15-
# Expose API port to the outside
5+
COPY . .
166
EXPOSE 5000
17-
18-
# Launch application
197
CMD ["npm","start"]

appcache.sh

Lines changed: 0 additions & 32 deletions
This file was deleted.

cache.extra

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
/
2+
index.html
13
package.json
24
manifest.json
35
node_modules/chosen-js/chosen-sprite.png

components/2d_network.html

Lines changed: 340 additions & 293 deletions
Large diffs are not rendered by default.

components/3d_network.html

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<div id="3DNet"></div>
22

33
<div class="view-controls">
4-
<button type="button" id="toggle-3DNet-settings" class="btn btn-light btn-sm" data-toggle="button" title="3D Network Settings">
4+
<button type="button" id="toggle-3DNet-settings" class="btn btn-light btn-sm" data-toggle="button" title="Toggle 3D Network Settings">
55
<span class="oi oi-cog"></span>
66
</button>
7-
<button type="button" class="btn btn-light btn-sm" data-toggle="modal" data-target="#export_3d_modal" title="Export Network">
7+
<button type="button" class="btn btn-light btn-sm" data-toggle="modal" data-target="#export_3d-modal" title="Export 3D Network">
88
<span class="oi oi-data-transfer-download"></span>
99
</button>
1010
<button type="button" id="reload-3DNet" class="btn btn-light btn-sm" title="Refresh Network">
@@ -25,49 +25,45 @@
2525
<!-- Tab panes -->
2626
<div class="tab-content">
2727
<div id="threeDNodeConfigurations" class="tab-pane fade show active" role="tabpanel">
28-
<div class="form-group row">
29-
<div class="col-4"><a href="#" data-toggle="tooltip" title="What do you want to see when you hover over a node?">Tooltip</a></div>
30-
<div class="col-8">
31-
<select id="3DNet-node-tooltip-variable" class="custom-select custom-select-sm nodeVariables"></select>
32-
</div>
28+
<div class="form-group row" title="What do you want to see when you hover over a node?">
29+
<div class="col-4"><label for="3DNet-node-tooltip-variable">Tooltip</label></div>
30+
<div class="col-8"><select id="3DNet-node-tooltip-variable" class="custom-select custom-select-sm nodeVariables"></select></div>
3331
</div>
3432
<div class="form-group row">
35-
<div class="col-4">Color</div>
33+
<div class="col-4" title="Launch Global Color Options">Color</div>
3634
<div class="col-8"><button class="btn btn-sm btn-light w-100 launch-color-options">Color Options</button></div>
3735
</div>
38-
<div class="form-group row">
39-
<div class="col-4"><a href="#" data-toggle="tooltip" title="Size nodes in proportion to which variable?">Size By</a></div>
36+
<div class="form-group row" title="Size nodes in proportion to which variable?">
37+
<div class="col-4"><label for="3DNet-node-radius-variable">Size By</label></div>
4038
<div class="col-8"><select id="3DNet-node-radius-variable" class="custom-select custom-select-sm nodeVariables"></select></div>
4139
</div>
42-
<div class="form-group row">
43-
<div class="col-4"><a href="#" data-toggle="tooltip" title="How large should the nodes be?">Size</a></div>
40+
<div class="form-group row" title="How large should the nodes be?">
41+
<div class="col-4"><label for="3DNet-node-radius">Size</label></div>
4442
<div class="col-8"><input type="range" id="3DNet-node-radius" min=".1" value="4" step=".1" max="20" /></div>
4543
</div>
4644
</div>
4745
<div id="threeDLinkConfigurations" class="tab-pane fade" role="tabpanel">
48-
<div class="form-group row">
49-
<div class="col-4"><a href="#" data-toggle="tooltip" title="What do you want to see when you hover over a node?">Tooltip</a></div>
50-
<div class="col-8">
51-
<select id="3DNet-link-tooltip-variable" class="custom-select custom-select-sm linkVariables"></select>
52-
</div>
46+
<div class="form-group row" title="What do you want to see when you hover over a node?">
47+
<div class="col-4"><label for="3DNet-link-tooltip-variable">Tooltip</label></div>
48+
<div class="col-8"><select id="3DNet-link-tooltip-variable" class="custom-select custom-select-sm linkVariables"></select></div>
5349
</div>
5450
<div class="form-group row">
55-
<div class="col-4">Color</div>
51+
<div class="col-4" title="Launch Global Color Options">Color</div>
5652
<div class="col-8"><button class="btn btn-sm btn-light w-100 launch-color-options">Color Options</button></div>
5753
</div>
58-
<div class="form-group row">
59-
<div class="col-4"><a href="#" data-toggle="tooltip" title="How transparent should the links be?">Transparency</a></div>
54+
<div class="form-group row" title="How transparent should the links be?">
55+
<div class="col-4"><label for="3DNet-link-transparency">Transparency</label></div>
6056
<div class="col-8"><input type="range" id="3DNet-link-transparency" min="0" max="1" value="0" step="0.01" /></div>
6157
</div>
62-
<div class="form-group row">
63-
<div class="col-4"><a href="#" data-toggle="tooltip" title="How wide should the links be?">Width</a></div>
58+
<div class="form-group row" title="How wide should the links be?">
59+
<div class="col-4"><label for="3DNet-link-width">Width</label></div>
6460
<div class="col-8"><input type="range" id="3DNet-link-width" min=".1" value="1.6" step=".1" max="20" /></div>
6561
</div>
6662
</div>
6763
</div>
6864
</div>
6965

70-
<div id="export_3d_modal" class="modal fade" tabindex="-1" role="dialog" data-backdrop="false">
66+
<div id="export_3d-modal" class="modal fade" tabindex="-1" role="dialog" data-backdrop="false">
7167
<div class="modal-dialog" role="document">
7268
<div class="modal-content">
7369
<div class="modal-header">

components/aggregation.html

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
<div class="view-controls">
2+
<button type="button" id="aggregation-settings-toggle" class="btn btn-light btn-sm" title="Toggle Aggregation Settings">
3+
<span class="oi oi-cog"></span>
4+
</button>
5+
<button type="button" class="btn btn-light btn-sm" data-toggle="modal" data-target="#aggregation-export-modal" title="Export Aggregation data">
6+
<span class="oi oi-data-transfer-download"></span>
7+
</button>
8+
</div>
9+
10+
<div id="aggregation" class="table-sm"></div>
11+
12+
<div id="aggregation-settings-pane" class="left-pane">
13+
<ul class="nav nav-tabs" role="tablist">
14+
<li class="nav-item active">
15+
<a href="#aggregation-settings" id="aggregation-tab" class="nav-link active" aria-controls="aggregation" role="tab" data-toggle="tab">Aggregation</a>
16+
</li>
17+
</ul>
18+
<div class="tab-content">
19+
<div class="tab-pane fade show active" role="tabpanel" aria-labelledby="aggregation-tab">
20+
<div class="form-group row" title="What data would you like to aggregate?">
21+
<div class="col-4">Data</div>
22+
<div class="col-8">
23+
<div class="btn-group btn-group-toggle btn-group-sm w-100" data-toggle="buttons">
24+
<label class="btn btn-light col active">
25+
<input type="radio" name="aggregate-dataset" data-value="node" autocomplete="off" checked> Nodes
26+
</label>
27+
<label class="btn btn-light col">
28+
<input type="radio" name="aggregate-dataset" data-value="link" autocomplete="off"> Links
29+
</label>
30+
<label class="btn btn-light">
31+
<input type="radio" name="aggregate-dataset" data-value="cluster" autocomplete="off"> Clusters
32+
</label>
33+
</div>
34+
</div>
35+
</div>
36+
<div class="form-group row" title="What data field would you like to aggregate on?">
37+
<div class="col-4">Variable</div>
38+
<div class="col-8">
39+
<select id="aggregate-variable" class="custom-select custom-select-sm"></select>
40+
</div>
41+
</div>
42+
<div class="form-group row" title="Would you like to group variables that are close together?">
43+
<div class="col-4">Binning</div>
44+
<div class="col-8">
45+
<div class="btn-group btn-group-toggle btn-group-sm w-100" data-toggle="buttons">
46+
<label class="btn btn-light col active">
47+
<input type="radio" name="aggregate-binning" data-value="off" autocomplete="off" checked> Unbinned
48+
</label>
49+
<label class="btn btn-light col">
50+
<input type="radio" name="aggregate-binning" data-value="on" autocomplete="off"> Binned
51+
</label>
52+
</div>
53+
</div>
54+
</div>
55+
<div class="form-group row" id="aggregate-bins-row" title="How many bins would you like to sort that data into?">
56+
<div class="col-4">Number of Bins</div>
57+
<div class="col-8">
58+
<input id="aggregate-bins" class="custom-select custom-select-sm" type="number" min="1" value="10" step="1"></input>
59+
</div>
60+
</div>
61+
</div>
62+
</div>
63+
</div>
64+
65+
<div id="aggregation-export-modal" class="modal fade" tabindex="-1" role="dialog" data-backdrop="false">
66+
<div class="modal-dialog" role="document">
67+
<div class="modal-content">
68+
<div class="modal-header">
69+
<h5 class="modal-title">Export Aggregation</h5>
70+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
71+
<span aria-hidden="true">&times;</span>
72+
</button>
73+
</div>
74+
<div class="modal-body">
75+
<div class="form-group row">
76+
<div class="col-9">
77+
<input type="text" id="export-aggregation-file-name" class="form-control form-control-sm" placeholder="Filename" />
78+
</div>
79+
<div class="col-3">
80+
<select id="export-aggregation-file-type" class="form-control form-control-sm">
81+
<option selected>csv</option>
82+
<option>xlsx</option>
83+
<option>json</option>
84+
</select>
85+
</div>
86+
</div>
87+
</div>
88+
<div class="modal-footer">
89+
<button type="button" class="btn btn-error" data-dismiss="modal">Cancel</button>
90+
<button type="button" id="aggregation-export" class="btn btn-primary" data-dismiss="modal">Export</button>
91+
</div>
92+
</div><!-- /.modal-content -->
93+
</div><!-- /.modal-dialog -->
94+
</div><!-- /.modal -->
95+
96+
<script>
97+
(function(){
98+
99+
let data = [];
100+
101+
let aggregation = new Tabulator("#aggregation", {
102+
height: "calc(100% - 60px) !important",
103+
layout: "fitColumns"
104+
});
105+
106+
function updateColumns(){
107+
let dataset = $('input[name=aggregate-dataset]:checked').data('value');
108+
$('#aggregate-variable').html(
109+
session.data[dataset + 'Fields']
110+
.map(l => `<option value="${l}">${app.titleize(l)}</option>`)
111+
.join('\n')
112+
).val(dataset === 'cluster' ? 'ID' : 'cluster');
113+
}
114+
115+
function updateTable(){
116+
let dataset = $('input[name=aggregate-dataset]:checked').data('value');
117+
let column = $('#aggregate-variable').val();
118+
let binned = $('[name="aggregate-binning"]:checked').data('value') === 'on';
119+
let values = [];
120+
data = [];
121+
let rawdata = app['getVisible' + dataset[0].toUpperCase() + dataset.slice(1) + 's']();
122+
let n = rawdata.length;
123+
if(binned){
124+
let values = rawdata.map(r => r[column]).sort((a, b) => a - b);
125+
let perBin = Math.ceil(n/$('#aggregate-bins').val());
126+
values.forEach((row, i) => {
127+
let bin = data[Math.floor(i/perBin)];
128+
if(bin){
129+
bin.n++;
130+
bin.max = row;
131+
bin[column] = bin.min + '-' + bin.max;
132+
} else {
133+
data.push({
134+
n: 1,
135+
min: row,
136+
max: row
137+
});
138+
}
139+
});
140+
console.log(data);
141+
} else {
142+
rawdata.forEach(row => {
143+
let val = row[column];
144+
if(values.includes(val)){
145+
data[values.indexOf(val)].n++;
146+
} else {
147+
values.push(val);
148+
let newRow = {};
149+
newRow[column] = val;
150+
newRow.n = 1;
151+
data.push(newRow);
152+
}
153+
});
154+
}
155+
data.forEach(row => row.percent = (row.n/n*100).toLocaleString() + '%');
156+
aggregation.setColumns([
157+
{title: app.titleize(dataset + ' ' + column), field: column},
158+
{title: 'Number of ' + app.titleize(dataset) + 's', field: 'n'},
159+
{title: 'Percentage', field: 'percent', headerSort: false}
160+
]);
161+
aggregation.setData(data);
162+
if(!binned){
163+
aggregation.setSort([
164+
{column: 'n', dir: 'desc'},
165+
{column: column, dir: 'asc'}
166+
]);
167+
}
168+
}
169+
170+
$('#aggregation-settings-toggle').click(function(){
171+
let pane = $('#aggregation-settings-pane');
172+
if(pane.is(':visible')){
173+
pane.animate({left: '-400px'}, function(){ pane.hide(); });
174+
} else {
175+
pane.show(0, function(){ pane.animate({left: '0px'}); });
176+
}
177+
});
178+
179+
$('input[name="aggregate-dataset"]').on('change', e => {
180+
updateColumns();
181+
updateTable();
182+
});
183+
184+
$('#aggregate-variable').on('change', updateTable);
185+
186+
$('[name="aggregate-binning"]').on('change', function(){
187+
let val = $(this).data('value');
188+
if(val == 'on'){
189+
$('#aggregate-bins-row').css('display', 'flex');
190+
} else {
191+
$('#aggregate-bins-row').slideUp();
192+
}
193+
updateTable();
194+
});
195+
196+
$('#aggregate-bins').on('change', updateTable);
197+
198+
$('#aggregation-export').click(function(){
199+
let format = $('#export-aggregation-file-type').val();
200+
let name = $('#export-aggregation-file-name').val();
201+
if(format === 'csv'){
202+
let blob = new Blob([Papa.unparse(data)], {type: 'text/csv;charset=utf-8'});
203+
saveAs(blob, name + '.' + format);
204+
} else if(format === 'xlsx'){
205+
let wb = XLSX.utils.book_new();
206+
let ws = XLSX.utils.json_to_sheet(data);
207+
XLSX.utils.book_append_sheet(wb, ws, name);
208+
XLSX.writeFile(wb, name + '.' + format);
209+
} else {
210+
let blob = new Blob([JSON.stringify(data)], {type: 'application/json;charset=utf-8'});
211+
saveAs(blob, name + '.' + format);
212+
}
213+
});
214+
215+
$('#aggregation').parent().css('z-index', 1000);
216+
217+
$(window)
218+
.on('link-threshold-change', updateTable);
219+
220+
updateColumns();
221+
updateTable();
222+
})();
223+
</script>

components/auditor.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<button type="button" id="toggle-auditor-settings" class="btn btn-light btn-sm">
1616
<span class="oi oi-cog"></span>
1717
</button>
18-
<button type="button" class="btn btn-light btn-sm" data-toggle="modal" data-target="#auditor-export_modal">
18+
<button type="button" class="btn btn-light btn-sm" data-toggle="modal" data-target="#auditor-export-modal">
1919
<span class="oi oi-data-transfer-download"></span>
2020
</button>
2121
</div>
@@ -61,7 +61,7 @@
6161
</div>
6262
</div>
6363

64-
<div id="auditor-export_modal" class="modal fade" tabindex="-1" role="dialog" data-backdrop="false">
64+
<div id="auditor-export-modal" class="modal fade" tabindex="-1" role="dialog" data-backdrop="false">
6565
<div class="modal-dialog" role="document">
6666
<div class="modal-content">
6767
<div class="modal-header">

0 commit comments

Comments
 (0)