script.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. data_ns = "http://www.example.com/";
  2. $(function() {
  3. var pageURL = $(location).attr("href");
  4. if (pageURL.indexOf("index.html") >= 0){
  5. getSavedProjects();
  6. }
  7. if (pageURL.indexOf("dashboard.html") >= 0){
  8. loadDashboardForProject();
  9. $("#assetOverviewText").hide();
  10. }
  11. });
  12. function loadDashboardForProject(){
  13. setUpDashboardSliders();
  14. refreshWeights();
  15. $.get( "http://0.0.0.0:8080/myapp/APIresources/project-assets/"+localStorage.getItem("graph-id"), function( data ) {
  16. $("#json-response").text(JSON.stringify(data, null, 5));
  17. assetIDs = data["dataAssetIDs"];
  18. $.each( assetIDs, function( index, value ) {
  19. toAppend = '<a id=\'asset-'+index+'\' data-identifier=\''+value["Identifier"]+'\' data-title=\''+value["Title"]+'\' class="dropdown-item" onclick="visualisationForAsset(\''+value["Identifier"]+'\',\''+index+'\');getHistoricalChart(\''+value["Identifier"]+'\')">'+value["Title"]+'</a>';
  20. $("#asset-dropdown").append(toAppend);
  21. });
  22. });
  23. $.get( "http://0.0.0.0:8080/myapp/web-api/project-details/"+localStorage.getItem("graph-id"), function( details ) {
  24. $("#projectTitle").text(details[0]["Project-Name"]);
  25. $("#projectDescription").text(details[0]["Project-Description"]);
  26. });
  27. }
  28. function updateProject(){
  29. // fas fa-sync-alt fa-sm text-white-50
  30. $("#updateFA").removeClass("fas fa-sync-alt fa-sm text-white-50")
  31. $("#updateFA").addClass("spinner-border spinner-border-sm")
  32. $.get( "http://0.0.0.0:8080/myapp/web-api/update-project/"+localStorage.getItem("graph-id"),
  33. function( data ) {
  34. $("#json-response").text(JSON.stringify(data, null, 5));
  35. $("#updateFA").removeClass("spinner-border spinner-border-sm")
  36. $("#updateFA").addClass("fas fa-sync-alt fa-sm text-white-50")
  37. console.log("reloading dashboard")
  38. $("#asset-dropdown").empty();
  39. cleanGraphs();
  40. loadDashboardForProject();
  41. });
  42. }
  43. function cleanGraphs(){
  44. $("#radar_chart").remove();
  45. $("#aggregatedDataValue").append('<canvas id="radar_chart"></canvas>');
  46. $("#latest_chart").remove();
  47. $("#latest").append('<canvas id="latest_chart"></canvas>');
  48. $("#historical_chart").remove();
  49. $("#historical").append('<canvas id="historical_chart"></canvas>');
  50. }
  51. function setUpDashboardSliders(){
  52. $('#dataDimension').slider();
  53. $("#dataDimension").on("slide", function(slideEvt) {
  54. $("#dataDimensionValue").text(slideEvt.value);
  55. });
  56. $('#usageDimension').slider();
  57. $("#usageDimension").on("slide", function(slideEvt) {
  58. $("#usageDimensionValue").text(slideEvt.value);
  59. });
  60. $('#technicalDimension').slider();
  61. $("#technicalDimension").on("slide", function(slideEvt) {
  62. $("#technicalDimensionValue").text(slideEvt.value);
  63. });
  64. $('#qualityDimension').slider();
  65. $("#qualityDimension").on("slide", function(slideEvt) {
  66. $("#qualityDimensionValue").text(slideEvt.value);
  67. });
  68. }
  69. function getWeights(){
  70. dataDim = $("#dataDimension").val();
  71. usageDim = $("#usageDimension").val();
  72. techDim = $("#technicalDimension").val();
  73. qualDim = $("#qualityDimension").val();
  74. total = parseInt(dataDim) + parseInt(usageDim) + parseInt(techDim) + parseInt(qualDim);
  75. dataDim = dataDim / total;
  76. usageDim = usageDim / total;
  77. techDim = techDim / total;
  78. qualDim = qualDim / total;
  79. formData = {};
  80. formData["Data-Dimension"] = dataDim;
  81. formData["Usage-Dimension"] = usageDim;
  82. formData["Infrastructure-Dimension"] = techDim;
  83. formData["Quality-Dimension"] = qualDim;
  84. return formData;
  85. }
  86. function refreshWeights(){
  87. weights = getWeights();
  88. formData = {};
  89. formData["weighting"] = weights;
  90. formData["graphID"] = localStorage.getItem("graph-id");
  91. $.ajax('http://0.0.0.0:8080/myapp/web-api/compute-aggregate', {
  92. type: 'POST',
  93. data: JSON.stringify(formData),
  94. success: function(responseData, textStatus, jqXHR) {
  95. $("#json-response").text(JSON.stringify(responseData, null, 5))
  96. cleanGraphs();
  97. assets = []
  98. values = []
  99. avrg = 0;
  100. $.each(responseData, function(index, value) {
  101. $.each(value, function(key, value){
  102. assets.push(key)
  103. values.push(value)
  104. // values.push({'x': index, 'y': value})
  105. avrg = avrg + value;
  106. });
  107. });
  108. avrg = avrg / assets.length;
  109. avrgTrendline = []
  110. $.each(assets, function(index, value) {
  111. avrgTrendline.push(avrg)
  112. });
  113. var data = {
  114. labels: assets,
  115. datasets: [
  116. {
  117. label: "Data Assets",
  118. data : values,
  119. borderColor: "red",
  120. fill: false,
  121. showLine: false
  122. },
  123. {
  124. label: "Average Data Value",
  125. data: avrgTrendline,
  126. fill: false,
  127. borderColor: "blue",
  128. type: 'line',
  129. pointRadius: 0
  130. }
  131. ]
  132. }
  133. var ctx = document.getElementById("radar_chart").getContext('2d');
  134. var myRadarChart = new Chart(ctx, {
  135. type: 'line',
  136. data : data,
  137. options: {
  138. layout: {
  139. padding: {
  140. left: 0,
  141. right: 0,
  142. top: 0,
  143. bottom: 0
  144. }
  145. },
  146. scales: {
  147. xAxes: [{
  148. ticks: {
  149. display: false
  150. },
  151. scaleLabel: {
  152. display: true,
  153. labelString: 'Data Assets'
  154. }
  155. }],
  156. yAxes: [{
  157. scaleLabel: {
  158. display: true,
  159. labelString: 'Data Valuation (in %)'
  160. }
  161. }]
  162. }
  163. }
  164. });
  165. if ($("#dropdownMenuButton").val() > -1){
  166. assetID = $("#asset-"+$("#dropdownMenuButton").val()).data("identifier")
  167. visualisationForAsset(assetID, $("#dropdownMenuButton").val());
  168. getHistoricalChart(assetID);
  169. }
  170. },
  171. error: function (responseData, textStatus, errorThrown) {
  172. alert('POST failed.');
  173. }
  174. });
  175. }
  176. function getSavedProjects(){
  177. // http://0.0.0.0:8080/myapp/web-api/sample-projects
  178. $.get( "http://0.0.0.0:8080/myapp/web-api/saved-projects", function( data ) {
  179. $("#json-response").text(JSON.stringify(data, null, 5))
  180. $.each(data, function( index, value ) {
  181. $("#dataProjects").prepend(generateCardForDataProject(value["Project-Name"],value["Project-Description"],value["Overall-Value"], value["Project-URI"]))
  182. });
  183. });
  184. }
  185. function visualisationForAsset(assetID, index) {
  186. dataPoints = [];
  187. labels = [];
  188. $("#latest_chart").remove();
  189. $("#latest").append('<canvas id="latest_chart"></canvas>');
  190. $("#historical_chart").remove();
  191. $("#historical").append('<canvas id="historical_chart"></canvas>');
  192. $("#dropdownMenuButton").data("lastValue",index);
  193. $("#dropdownMenuButton").text($("#asset-"+index).data("title"))
  194. $("#dropdownMenuButton").val(parseInt(index))
  195. weights = getWeights();
  196. formData = {};
  197. formData["weighting"] = weights;
  198. formData["graphID"] = localStorage.getItem("graph-id");
  199. formData["dataAssetID"] = assetID;
  200. $.ajax('http://0.0.0.0:8080/myapp/APIresources/calculateValue', {
  201. type: 'POST',
  202. data: JSON.stringify(formData),
  203. success: function(responseData, textStatus, jqXHR) {
  204. $("#json-response").text(JSON.stringify(responseData, null, 5));
  205. $.each(responseData, function(key, value){
  206. if ("dataValue" == key) { return; }
  207. if ("assetID" == key) { return; }
  208. if ("date" == key) { return; }
  209. dataPoints.push(parseInt(value));
  210. labels.push(key);
  211. });
  212. var data = {
  213. labels: labels,
  214. datasets: [{
  215. label: "Valuation",
  216. backgroundColor: ["blue","green","red","yellow","cyan","magenta","brown","lightsalmon"],
  217. data: dataPoints,
  218. borderWidth: 1
  219. }]
  220. };
  221. var ctx = document.getElementById("latest_chart").getContext('2d');
  222. var latestChart = new Chart(ctx, {
  223. type: 'bar',
  224. data : data,
  225. options: {
  226. legend: { display: false },
  227. scales: {
  228. yAxes: [{
  229. ticks: {
  230. beginAtZero: true
  231. }
  232. }]
  233. }
  234. }
  235. });
  236. assetTitle = $("#asset-"+index).data("title")
  237. populateAssetValueOverview(assetID, assetTitle, responseData)
  238. },
  239. error: function (responseData, textStatus, errorThrown) {
  240. alert('POST failed.');
  241. }
  242. });
  243. }
  244. function populateAssetValueOverview(assetID, assetTitle, json){
  245. // TODO: change this accordingly
  246. // techdim = Infrastructure dimension
  247. $("#assetOverviewText").show();
  248. $("#chosenDatasetTitle").text(assetTitle)
  249. $("#chosenAssetID").text(assetID)
  250. $("#assetObservationValueDate").text(json["date"])
  251. $("#assetObservationValue").text(json["dataValue"]+"%")
  252. weights = getWeights();
  253. dv = parseInt(json["dataValue"])
  254. total = 100 - dv;
  255. datadim = parseInt(json["trustMetric"])
  256. usagedim = ((((parseInt(json["createdOnMetric"]) + parseInt(json["lastModificationDateMetric"])) / 2) + ((parseInt(json["createdByMetric"]) + parseInt(json["classOfCreatorMetric"])) / 2))) / 2
  257. techdim = parseInt(json["dataManagementMetric"])
  258. qualdim = (parseInt(json["accuracyMetric"]) + parseInt(json["completenessMetric"])) / 2;
  259. // ratioTotal = datadim + usagedim + techdim + qualdim;
  260. // datadim = ((datadim * parseFloat(weights["Data-Dimension"])) * dv);// / ratioTotal;
  261. // usagedim = ((usagedim * parseFloat(weights["Usage-Dimension"])) * dv);// / ratioTotal;
  262. // techdim = ((techdim * parseFloat(weights["Infrastructure-Dimension"])) * dv);// / ratioTotal;
  263. // qualdim = ((qualdim * parseFloat(weights["Quality-Dimension"])) * dv);// / ratioTotal;
  264. datadim = (datadim * parseFloat(weights["Data-Dimension"]));
  265. usagedim = (usagedim * parseFloat(weights["Usage-Dimension"]));
  266. techdim = (techdim * parseFloat(weights["Infrastructure-Dimension"]));
  267. qualdim = (qualdim * parseFloat(weights["Quality-Dimension"]));
  268. $("#data-dimension-pb").css("width", String(datadim)+"%");
  269. $("#technical-dimension-pb").css("width", String(techdim)+"%");
  270. $("#usage-dimension-pb").css("width", String(usagedim)+"%");
  271. $("#quality-dimension-pb").css("width", String(qualdim)+"%");
  272. if (datadim > 0) $("#data-dimension-age").text(String(Math.round(datadim))+"%");
  273. if (usagedim > 0) $("#usage-dimension-age").text(String(Math.round(usagedim))+"%");
  274. if (techdim > 0) $("#technical-dimension-age").text(String(Math.round(techdim))+"%");
  275. if (qualdim > 0) $("#quality-dimension-age").text(String(Math.round(qualdim))+"%");
  276. }
  277. function getHistoricalChart(assetID){
  278. weights = getWeights();
  279. formData = {};
  280. formData["weighting"] = weights;
  281. formData["graphID"] = localStorage.getItem("graph-id");
  282. formData["dataAssetID"] = assetID;
  283. dates = [];
  284. objects = [];
  285. $("#latest_chart").remove();
  286. $("#latest").append('<canvas id="latest_chart"></canvas>');
  287. $("#historical_chart").remove();
  288. $("#historical").append('<canvas id="historical_chart"></canvas>');
  289. $.ajax('http://0.0.0.0:8080/myapp/APIresources/assetHistory', {
  290. type: 'POST',
  291. data: JSON.stringify(formData),
  292. success: function(responseData, textStatus, jqXHR) {
  293. // $("#json-response").text(JSON.stringify(responseData, null, 5));
  294. $.each(responseData, function(index, item){
  295. $.each(item, function(key, value){
  296. objects.push(value);
  297. dates.push(key);
  298. });
  299. });
  300. datasetsConstruction = {};
  301. $.each(objects, function(index, item){
  302. $.each(item, function(key, value){
  303. if ("assetID" == key) { return; }
  304. if ("date" == key) { return; }
  305. if (!(key in datasetsConstruction)){
  306. datasetsConstruction[key] = [];
  307. }
  308. datasetsConstruction[key].push(value);
  309. });
  310. });
  311. colors = ["goldenrod","blue","green","red","yellow","cyan","magenta","brown","lightsalmon"];
  312. datasets = [];
  313. i=0;
  314. $.each(datasetsConstruction, function(key, value){
  315. theObject = {};
  316. theObject["label"] = key;
  317. theObject["data"] = value;
  318. theObject["borderColor"] = colors[i];
  319. theObject["fill"] = false;
  320. i = i + 1;
  321. datasets.push(theObject);
  322. });
  323. var data = {
  324. labels: dates,
  325. datasets: datasets,
  326. };
  327. var config = {
  328. type: 'line',
  329. data : data,
  330. options: {
  331. responsive: true,
  332. title: {
  333. display: false,
  334. },
  335. tooltips: {
  336. mode: 'index',
  337. intersect: false,
  338. },
  339. hover: {
  340. mode: 'nearest',
  341. intersect: true
  342. },
  343. scales: {
  344. xAxes: [{
  345. display: true,
  346. scaleLabel: {
  347. display: true,
  348. labelString: 'Month'
  349. }
  350. }],
  351. yAxes: [{
  352. display: true,
  353. scaleLabel: {
  354. display: true,
  355. labelString: 'Value'
  356. }
  357. }]
  358. }
  359. }
  360. }
  361. var ctx = document.getElementById("historical_chart").getContext('2d');
  362. var historicalChart = new Chart(ctx, config);
  363. },
  364. error: function (responseData, textStatus, errorThrown) {
  365. alert('POST failed.');
  366. }
  367. });
  368. }
  369. function updateConnectorURLField(){
  370. urlField = $("#inputState")[0].options[$("#inputState")[0].options.selectedIndex].value;
  371. $("#connectorURL").val(urlField);
  372. }
  373. function generateCardForDataProject(dataProjectTitle, dataProjectDescription, dataProjectOverallValue, dataProjectURI){
  374. card = `
  375. <div class="col-lg-4" onclick="openDataDashboard('[[%%DataProjectURI%%]]')">
  376. <div class="card border-left-warning shadow py-2" style="margin-bottom:20px">
  377. <div class="card-body">
  378. <div class="row no-gutters align-items-center">
  379. <div class="col mr-2">
  380. <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">[[%%DataProjectTitle%%]]</div>
  381. <div class="h6 mb-0 font-weight-bold text-gray-800">[[%%DataProjectDescription%%]]</div>
  382. </div>
  383. <div class="col-auto">
  384. <i class="fas fa-balance-scale fa-3x text-gray-300"><span style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: black; font-size:35px">[[%%DataProjectOverallValue%%]]</span></i>
  385. </div>
  386. </div>
  387. </div>
  388. </div>
  389. </div>
  390. `;
  391. card = card.replace("[[%%DataProjectURI%%]]", dataProjectURI);
  392. card = card.replace("[[%%DataProjectTitle%%]]", dataProjectTitle);
  393. card = card.replace("[[%%DataProjectDescription%%]]", dataProjectDescription);
  394. // card = card.replace("[[%%DataProjectOverallValue%%]]", dataProjectOverallValue);
  395. card = card.replace("[[%%DataProjectOverallValue%%]]", "");
  396. return card;
  397. }
  398. function importData() {
  399. formData = {};
  400. formData["Project-Name"] = $("#projectName").val();
  401. formData["Connector"] = $("#inputState")[0].options[$("#inputState")[0].options.selectedIndex].id;
  402. formData["Connector-URL"] = $("#connectorURL").val();
  403. formData["Metric-Settings"] = {};
  404. formData["Project-Description"] = $("#projectDescription").val();
  405. $.ajax('http://0.0.0.0:8080/myapp/web-api/create-project', {
  406. type: 'POST',
  407. data: JSON.stringify(formData),
  408. success: function(responseData, textStatus, jqXHR) {
  409. $("#json-response").text(JSON.stringify(responseData, null, 5));
  410. $(".recentAssessment").hide();
  411. $(".recentAssessmentIcon").show(); // call overall value to get the value for overlay
  412. $(".generateLoadingCard").val(responseData["Project-Graph-ID"]);
  413. $(".generateLoadingCard").attr("onclick","openDataDashboard('"+responseData["Project-Graph-ID"]+"')");
  414. },
  415. error: function (responseData, textStatus, errorThrown) {
  416. $(".recentAssessment").hide();
  417. $(".recentAssessmentFailedIcon").show();
  418. }
  419. });
  420. $("#dataProjects").prepend(generateLoadingCard(formData["Project-Name"],formData["Project-Description"]));
  421. $(".recentAssessmentIcon").hide();
  422. $(".recentAssessmentFailedIcon").hide();
  423. }
  424. function openDataDashboard(graphID){
  425. localStorage.setItem("graph-id",graphID.replace(data_ns,""));
  426. window.open("dashboard.html", "_self");
  427. }
  428. function generateLoadingCard(dataProjectTitle, dataProjectDescription){
  429. card = `
  430. <div class="col-lg-4 generateLoadingCard">
  431. <div class="card border-left-success shadow py-2" style="margin-bottom:20px">
  432. <div class="card-body">
  433. <div class="row no-gutters align-items-center">
  434. <div class="col mr-2">
  435. <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">[[%%DataProjectTitle%%]]</div>
  436. <div class="h6 mb-0 font-weight-bold text-gray-800">[[%%DataProjectDescription%%]]</div>
  437. </div>
  438. <div class="col-auto">
  439. <div class="spinner-border text-success recentAssessment" role="status" aria-hidden="true"></div>
  440. <i class="fas fa-balance-scale fa-3x text-gray-300 recentAssessmentIcon"></i>
  441. <i class="fas fa-times-circle fa-3x text-gray-300 recentAssessmentFailedIcon"></i>
  442. </div>
  443. </div>
  444. </div>
  445. </div>
  446. </div>
  447. `;
  448. card = card.replace("[[%%DataProjectTitle%%]]", dataProjectTitle);
  449. card = card.replace("[[%%DataProjectDescription%%]]", dataProjectDescription);
  450. return card;
  451. }
  452. function generateCardForExplaination(style){
  453. card = `
  454. <div class="col-lg-12">
  455. <div class="card border-left-[[%%style%%]] shadow py-2" style="margin-bottom:20px">
  456. <div class="card-body">
  457. [[%text%]]
  458. </div>
  459. </div>
  460. </div>
  461. `;
  462. if (style == 'Data')
  463. card = card.replace("[[%%style%%]]", 'success');
  464. if (style == 'Infrastructure')
  465. card = card.replace("[[%%style%%]]", 'warning');
  466. if (style == 'Usage')
  467. card = card.replace("[[%%style%%]]", 'danger');
  468. if (style == 'Quality')
  469. card = card.replace("[[%%style%%]]", 'primary');
  470. return card;
  471. }