Newer
Older
//method to parse the data used for the timeline and package it to be displayed
function create_timeline_evidences(data, unique) {
var period = data.period;
var interval = data.interval;
var evidences = data.evidences;
var agents = data.agents;
var current_time = Date.now();
//go through the array of Evidence arrays and create a new array with the data to be displayed
const timeline_evidences = [];
for (var i = 0; i < evidences.length; i++) {
var bin = evidences[i];
//get the time for this specific bin
var bin_timestamp = current_time - ((period * 1000) - (interval * i * 1000));
//loop over the bin and extract all evidences for the given agent and create a new evidence for the timeline
for (var a = 0; a < agents.length; a++) {
var filtered_ev = [];
(bin === null) ? filtered_ev = [] : filtered_ev = bin.filter(ev => ev.label === agents[a].label);
if (unique == true) {
filtered_ev = filter_unique_ev(filtered_ev);
}
//console.log(filtered_ev);
const timeline_evidence = {"label" : agents[a].label,
"amount" : filtered_ev.length,
"evidences" : filtered_ev,
"time" : bin_timestamp};
timeline_evidences.push(timeline_evidence);
}
}
return timeline_evidences;
}
//method for filtering unique evidences from an array of create_donut_evidences
function filter_unique_ev(ev_array) {
//console.log(ev_array);
var unique_evs = [];
//check the format of the filtered_ev array and leave only last unique ones
for (var i = 0; i < ev_array.length; i++) {
if (unique_evs.length == 0) {
unique_evs.push(ev_array[i]);
} else {
const index = unique_evs.findIndex(e => _.isEqual(e.subject, ev_array[i].subject));
if (index > -1) {
if (ev_array[i].score > unique_evs[index]) {
unique_evs[index] = ev_array[i];
}
} else {
unique_evs.push(ev_array[i]);
}
}
}
//console.log(unique_evs);
return unique_evs;
}
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
//method for counting number of evidences per agent in the database to be used by the donut chart
function create_donut_evidences(data) {
const donut_evidences = [];
//loop over the items in the data recieved
data.forEach(function(item) {
var temp = {value: item.amount, label: item.label};
//check if an evidence with the same label as temp already exists
const duplicate = donut_evidences.some(evidence => evidence.label == temp.label);
//if no donut evidences have been created, make a new one
if (!duplicate) {
donut_evidences.push(temp);
//else loop over the evidences created to see if one exists already and update its value
} else {
donut_evidences.forEach(function(evidence) {
if (evidence.label == temp.label) {
evidence.value = evidence.value + temp.value;
}
})
}
});
return donut_evidences;
}
async function load_ranking_html(container, url) {
//d3.select(container).select("svg").remove();
clearContent(container.id);
var url_as_html = await fetchHtmlAsText(url);
const document = new DOMParser().parseFromString(url_as_html, 'text/html');
//remove the redundant bubble and radar buttons from the loaded document
var fs_bubble_button = document.getElementById("fullscreen_bubble_button");
fs_bubble_button.parentNode.removeChild(fs_bubble_button);
var fs_radar_button = document.getElementById("fullscreen_radar_button");
fs_radar_button.parentNode.removeChild(fs_radar_button);
//get the main part of the HTML and set it to the innerHTML of the container
const main = document.getElementsByTagName("main")[0];
//console.log(main);
container.innerHTML = main.innerHTML;
}
async function fetchHtmlAsText(url) {
const response = await fetch(url);
return await response.text();
}
function clearContent(elementID) {
var div = document.getElementById(elementID);
while(div.firstChild) {
div.removeChild(div.lastChild);
}
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
}
//function for the use of a Filter bar in the ranking blade
function filterFunction() {
// Declare and assign variables
var input, select, selectValue, filter, table, tr, td, i, txtValue;
input = document.getElementById("filterInput");
filter = input.value.toUpperCase();
table = document.getElementById("evTable");
tr = table.getElementsByTagName("tr");
select = document.getElementById("selectFilter");
selectValue = select.value;
console.log(select.options[select.selectedIndex].text);
//Loop over the table rows (elements) and hide those who don't match the search query
for (i = 0; i < tr.length; i++) {
//select the column of the row, depending on the selected value in the select field
if (selectValue == "subject") {
td = tr[i].getElementsByTagName("td")[0];
} else {
td = tr[i].getElementsByTagName("td")[1];
}
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}