From e38f40fe3764c3325929a66aa43aa192dc484f7e Mon Sep 17 00:00:00 2001 From: Findeton Date: Thu, 28 Mar 2024 15:09:23 -0500 Subject: [PATCH 01/10] wip --- .../admin-directives/dashboard/dashboard.js | 19 +++++++++++++++++++ avAdmin/elections-api-service.js | 5 +++++ locales/en.json | 3 ++- locales/es.json | 3 ++- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index 2e73feb7..bc0e2a33 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -647,6 +647,13 @@ angular.module('avAdmin') ); } + function downloadTurnout() { + ElectionsApi.downloadTurnout(scope.election.id) + .then(function (data){ + console.log(data); + }); + } + function setAutoreload(electionId) { ElectionsApi.autoreloadStats( @@ -1390,6 +1397,17 @@ angular.module('avAdmin') return scope.hasPerms(["schedule-events", "edit"]); } }, + { + i18nString: 'downloadTurnout', + iconClass: 'fa fa-clock', + actionFunc: function() { return scope.downloadTurnout(); }, + enableFunc: function() { + return true; + }, + permsFunc: function() { + return scope.hasPerms(["view"]); + } + }, ]; scope.permittedActions = function () { @@ -1480,6 +1498,7 @@ angular.module('avAdmin') launchKeyDistributionCeremony: launchKeyDistributionCeremony, launchOpeningCeremony: launchOpeningCeremony, configureScheduledEvents: configureScheduledEvents, + downloadTurnout: downloadTurnout }); // initialize diff --git a/avAdmin/elections-api-service.js b/avAdmin/elections-api-service.js index 579ac75c..233fa97d 100644 --- a/avAdmin/elections-api-service.js +++ b/avAdmin/elections-api-service.js @@ -465,6 +465,11 @@ angular.module('avAdmin') return deferred.promise; }; + electionsapi.downloadTurnout = function (election) { + return electionsapi.command(election, "GET", "turnout"); + }; + + electionsapi.templateEl = function() { function getShareTextDefault() { var ret = angular.copy(ConfigService.share_social.default); diff --git a/locales/en.json b/locales/en.json index ce411653..188aee55 100644 --- a/locales/en.json +++ b/locales/en.json @@ -395,7 +395,8 @@ "launchOpeningCeremony": "Launch opening ceremony", "configureScheduledEvents": "Configure scheduled events", "enableOtlPeriod": "Enable Otl period...", - "disableOtlPeriod": "Disable Otl period..." + "disableOtlPeriod": "Disable Otl period...", + "downloadTurnout": "Download turnout" }, "modals": { "createHeader": "Create election", diff --git a/locales/es.json b/locales/es.json index 496cfe85..2c3c4353 100644 --- a/locales/es.json +++ b/locales/es.json @@ -363,7 +363,8 @@ "makeCandidatesPublic": "Hacer los candidatos públicos...", "makeCandidatesPrivate": "Hacer los candidatos privados...", "launchKeyDistributionCeremony": "Lanzar ceremonia de distribución de claves", - "launchOpeningCeremony": "Lanzar ceremonia de apertura" + "launchOpeningCeremony": "Lanzar ceremonia de apertura", + "downloadTurnout": "Descargar participación" }, "modals": { "createHeader": "Crear votación", From d1d7f72dde0810665a97853f7d34dabb6481ab04 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 06:28:13 -0500 Subject: [PATCH 02/10] wip --- avAdmin/elections-api-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avAdmin/elections-api-service.js b/avAdmin/elections-api-service.js index 233fa97d..696b3a09 100644 --- a/avAdmin/elections-api-service.js +++ b/avAdmin/elections-api-service.js @@ -466,7 +466,7 @@ angular.module('avAdmin') }; electionsapi.downloadTurnout = function (election) { - return electionsapi.command(election, "GET", "turnout"); + return electionsapi.command(election, "turnout", "GET"); }; From 5bcd3f7cb31916a20d7bf5fb78a97ae4600198e9 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 06:49:59 -0500 Subject: [PATCH 03/10] wip --- avAdmin/admin-directives/dashboard/dashboard.js | 2 +- avAdmin/elections-api-service.js | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index bc0e2a33..614ba5aa 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -648,7 +648,7 @@ angular.module('avAdmin') } function downloadTurnout() { - ElectionsApi.downloadTurnout(scope.election.id) + Authmethod.getTurnout(scope.election.id) .then(function (data){ console.log(data); }); diff --git a/avAdmin/elections-api-service.js b/avAdmin/elections-api-service.js index 696b3a09..579ac75c 100644 --- a/avAdmin/elections-api-service.js +++ b/avAdmin/elections-api-service.js @@ -465,11 +465,6 @@ angular.module('avAdmin') return deferred.promise; }; - electionsapi.downloadTurnout = function (election) { - return electionsapi.command(election, "turnout", "GET"); - }; - - electionsapi.templateEl = function() { function getShareTextDefault() { var ret = angular.copy(ConfigService.share_social.default); From 00ed6c26913e2adc7d237e1e7057f8e1d5bfab52 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 10:57:44 -0500 Subject: [PATCH 04/10] wip --- .../admin-directives/dashboard/dashboard.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index 614ba5aa..c4ee6792 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -648,9 +648,23 @@ angular.module('avAdmin') } function downloadTurnout() { + var turnoutData; Authmethod.getTurnout(scope.election.id) - .then(function (data){ - console.log(data); + .then(function (response){ + if (200 !== response.status) { + return; // TODO: handle error + } + + turnoutData = response.data; + var electionIds = Object.keys(response.data); + + return Promise.all(electionIds.map(function (electionId) { + ElectionsApi.getElection(electionId) + })); + }) + .then(function (electionsData) { + console.log(turnoutData); + console.log(electionsData); }); } From 94a80f39f1c1d006e980af17fab18c63b5ec0797 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 11:03:05 -0500 Subject: [PATCH 05/10] wip --- avAdmin/admin-directives/dashboard/dashboard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index c4ee6792..eff5ee6f 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -658,8 +658,8 @@ angular.module('avAdmin') turnoutData = response.data; var electionIds = Object.keys(response.data); - return Promise.all(electionIds.map(function (electionId) { - ElectionsApi.getElection(electionId) + return $q.all(electionIds.map(function (electionId) { + return ElectionsApi.getElection(electionId); })); }) .then(function (electionsData) { From 8940547a02317291b00278bcbfc8d915e0079284 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 11:17:55 -0500 Subject: [PATCH 06/10] wip --- .../admin-directives/dashboard/dashboard.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index eff5ee6f..000c6ca3 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -665,6 +665,29 @@ angular.module('avAdmin') .then(function (electionsData) { console.log(turnoutData); console.log(electionsData); + var csvFile = "ID,Name,Participation,Census,Participation quota\n"; + csvFile += Object.keys(response.data) + .map(function (electionId) { + + let ballotBoxElection = electionsData.find(function (el) { return el.id === electionId}); + return [ + "" + electionId, + ballotBoxElection.title, + "" + turnoutData[electionId].total_votes, + "" + turnoutData[electionId].users, + "" + (turnoutData[electionId].total_votes / Math.max(1, turnoutData[electionId].users)) + ].join(","); + }) + .join("\n"); + + const link = document.createElement("a"); + const file = new Blob([content], { type: 'text/csv' }); + link.href = URL.createObjectURL(file); + var fileName = "turnout_" + scope.election.id + ".csv"; + link.download = fileName; + link.click(); + URL.revokeObjectURL(link.href); + }); } From 5a9b78217ee8ab5a5fe8af9472dbee1975004377 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 11:20:11 -0500 Subject: [PATCH 07/10] wip --- avAdmin/admin-directives/dashboard/dashboard.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index 000c6ca3..17b8a0f2 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -680,14 +680,8 @@ angular.module('avAdmin') }) .join("\n"); - const link = document.createElement("a"); - const file = new Blob([content], { type: 'text/csv' }); - link.href = URL.createObjectURL(file); - var fileName = "turnout_" + scope.election.id + ".csv"; - link.download = fileName; - link.click(); - URL.revokeObjectURL(link.href); - + var blob = new $window.Blob([csvFile], {type: "text/csv"}); + $window.saveAs(blob, "turnout_" + scope.election.id + ".csv"); }); } From 213ac17291bda0e85a134f0e8106580575d5c90e Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 11:21:17 -0500 Subject: [PATCH 08/10] wip --- avAdmin/admin-directives/dashboard/dashboard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index 17b8a0f2..9034bc65 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -666,10 +666,10 @@ angular.module('avAdmin') console.log(turnoutData); console.log(electionsData); var csvFile = "ID,Name,Participation,Census,Participation quota\n"; - csvFile += Object.keys(response.data) + csvFile += Object.keys(turnoutData) .map(function (electionId) { - let ballotBoxElection = electionsData.find(function (el) { return el.id === electionId}); + var ballotBoxElection = electionsData.find(function (el) { return el.id === electionId; }); return [ "" + electionId, ballotBoxElection.title, From 038ab1cecab16b62e82003ed1d9a0211dec27cd7 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 11:24:44 -0500 Subject: [PATCH 09/10] wip --- avAdmin/admin-directives/dashboard/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index 9034bc65..2d5e097f 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -669,7 +669,7 @@ angular.module('avAdmin') csvFile += Object.keys(turnoutData) .map(function (electionId) { - var ballotBoxElection = electionsData.find(function (el) { return el.id === electionId; }); + var ballotBoxElection = electionsData.find(function (el) { return String(el.id) === String(electionId); }); return [ "" + electionId, ballotBoxElection.title, From b45d0b5bf1386caec1a90eff7027cd37c7138627 Mon Sep 17 00:00:00 2001 From: Findeton Date: Sat, 30 Mar 2024 11:28:44 -0500 Subject: [PATCH 10/10] wip --- avAdmin/admin-directives/dashboard/dashboard.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/avAdmin/admin-directives/dashboard/dashboard.js b/avAdmin/admin-directives/dashboard/dashboard.js index 2d5e097f..aa4ac26e 100644 --- a/avAdmin/admin-directives/dashboard/dashboard.js +++ b/avAdmin/admin-directives/dashboard/dashboard.js @@ -652,7 +652,10 @@ angular.module('avAdmin') Authmethod.getTurnout(scope.election.id) .then(function (response){ if (200 !== response.status) { - return; // TODO: handle error + console.log("Error fetching turnout: "); + console.log(response); + scope.error = response.data; + return; } turnoutData = response.data;