From 7a55c3802944f33dfcc0477e41e359a31537085d Mon Sep 17 00:00:00 2001
From: mbraidot <mbraidot@buenosaires.gob.ar>
Date: Tue, 23 Apr 2019 17:02:31 -0300
Subject: [PATCH] =?UTF-8?q?El=20formulario=20de=20votaci=C3=B3n=20se=20lle?=
 =?UTF-8?q?na=20con=20las=20opciones=20del=20SC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 web/dist/index.html          |   6 +-
 web/dist/js/vendor/ballot.js | 173 +++++++++++++++++++++++------------
 web/dist/smartVotar.html     |  37 ++++----
 3 files changed, 132 insertions(+), 84 deletions(-)

diff --git a/web/dist/index.html b/web/dist/index.html
index ec95e5b..4a4e6cf 100644
--- a/web/dist/index.html
+++ b/web/dist/index.html
@@ -39,7 +39,7 @@
                         <i class="fas fa-plus" aria-hidden="true"></i>
                     </span>
                 </a>
-                <form action="">
+                <form action="smartVotar.html">
                     <div class="alert alert-danger" role="alert" id="errorForm">
                         <p>Comprobá los siguientes errores del formulario:</p>
                         <ul></ul>
@@ -111,8 +111,8 @@
             },
             submitHandler: function (form) {
                 // do other things for a valid form
-                //form.submit();
-                ver_votacion('');
+                form.submit();
+                //ver_votacion('');
             },
             messages: {
                 input_address: {
diff --git a/web/dist/js/vendor/ballot.js b/web/dist/js/vendor/ballot.js
index 6ced18f..66a6951 100644
--- a/web/dist/js/vendor/ballot.js
+++ b/web/dist/js/vendor/ballot.js
@@ -219,6 +219,17 @@ function setup_existing_contract(abi, addr) {
     return;
 }
 
+function setup_existing_instance(abi, addr) {
+    if (api_version() == 0) {
+        var MyContract = window.web3.eth.contract(abi);
+        console.log(MyContract);
+        contract = MyContract.at(addr);
+        return contract;
+    }
+    window.alert('Do not know how to deal with contracts at this API version (' + window.web3.version.api + ').');
+    return;
+}
+
 function add_proposal(pos) {
     var div = document.getElementById('newtable');
     if (!div)
@@ -386,53 +397,18 @@ async function nueva_votacion(arguments,proposals) {
     if (mainaddr[netid] == undefined)
         return;
 
-    //var f = document.forms['form_create_new_ballot'];
-    
-    /*var arguments = [];
-    arguments.push(document.getElementById('_title').value);
-    arguments.push(document.getElementById('start_date').value);
-    arguments.push(document.getElementById('voteBefore').value);
-    arguments.push(document.getElementById('percentOfRegisteredVotersReqToBeValid').value);
-    arguments.push(document.getElementById('percentOfVotesCastToWin').value);
-    arguments.push(document.getElementById('countNonvotesAsBlanks').value);
-    arguments.push(document.getElementById('maxVotesPerVoter').value);
-    arguments.push(document.getElementById('maxVotesPerProposal').value);
-    var p;
-    var proposals = [];
-    for (var i = 1; p = document.getElementById('proposal' + i); i++){
-        proposals.push(web3.fromAscii(p.value));
-    }*/
     for (var i = 0; i < proposals.length; i++){
         proposals[i] = web3.fromAscii(proposals[i]);
     }
 
-    //var newdiv = document.getElementById('newcontract');
-    //var localstatus = addchild(newdiv, 'p', 'Trying to access your account.');
     alertarLoading('Trying to access your account.');
     await access_accounts();
-    //localstatus.innerHTML = 'Creating new voting contract.';
     alertarLoading('Creating new voting contract.');
 
     var contract = setup_existing_contract(abiNew, mainaddr[netid]);
     if (!contract)
         return;
 
-    /*var rcpt;
-    if (api_version() == 0)
-        contract.newBallot.call(
-            arguments[0],
-            arguments[1],
-            arguments[2],
-            arguments[3],
-            arguments[4],
-            arguments[5],
-            arguments[6],
-            arguments[7],
-            proposals, {
-                gas: 2111000
-            },
-            contract_created
-        );*/
     console.log(arguments,proposals);
     try
     {
@@ -459,9 +435,6 @@ async function nueva_votacion(arguments,proposals) {
 
 async function contract_created(err, rcpt) {
     console.log(rcpt);
-    /*if (!rcpt)
-        return;*/
-    //ver_votacion( newaddr );
 }
 
 async function ver_votacion(addr) {
@@ -481,6 +454,7 @@ async function ver_votacion(addr) {
         ver_votacion2(addr, code);
     });
 }
+
 async function ver_votacion2(addr, code) {
     console.log('Contract code', code);
     if (code == '0x') {
@@ -491,33 +465,107 @@ async function ver_votacion2(addr, code) {
         'encoding': 'hex'
     });
     console.log('keccak3: ', keccak3);
-    if (keccak3 != ballot_keccak3) {
+    /*if (keccak3 != ballot_keccak3) {
          alertar('No hay una votación en esa dirección.');
         return;
-    }
-    var contract = setup_existing_contract(abiBallot, addr);
+    }*/
+    var contract = setup_existing_instance(abiBallot, addr);
     if (!contract)
         return;
-    var detailpromises;
-    // make sure we have just a single verdiv
-    var verdiv;
-    while (verdiv = document.getElementById('verdiv'))
-        verdiv.parent.removeChild(verdiv);
-    verdiv = addchild(rootdiv, 'div', undefined, {
-        'id': 'verdiv'
-    });
-    // Get headline
-    var proposaldiv = addchild(verdiv, 'p', 'Proposal:')
-    contract.methods.proposal().call({})
-        .then(
-            function showproposal(result) {
-                proposaldiv.innerHTML = 'Proposal: ' + result;
-            },
-            function failproposal(err) {
-                proposaldiv.innerHTML = 'Failed to get proposal: ' + err
-            }
-        );
+    
+    try
+    {
+        // Getting the title
+        contract.ballotTitle.call({ gas: 2111000 }, getBallotTitle);
+        // Getting the proposal list
+        // @TODO: get the proposal mapping's length
+        contract.proposalList.call(0, { gas: 2111000 }, getProposalList);
+        contract.proposalList.call(1, { gas: 2111000 }, getProposalList);
+        // Getting the ballot dates
+        contract.ballotVoteStarts.call({ gas: 2111000 }, getBallotVoteStarts);
+        contract.ballotVoteBefore.call({ gas: 2111000 }, getBallotVoteBefore);
+
+        close_alertar();
+        
+    }
+    catch (error)
+    {
+        alertar(error);
+    }
+}
+
+///////////////////////////////////////////////////////////
+// UTILS for ballot form creation
+///////////////////////////////////////////////////////////
+async function getBallotVoteStarts(err, rcpt){
+    if(err){
+        alertar(err);
+    }else{
+        $('#comienza_votacion').text(getDateFromTimestamp(rcpt));
+        var today = new Date();
+        if(rcpt > today.getTime()){
+            $("#form_votacion :input").prop("disabled", true);
+            alertar("La votación no ha comenzado aún.");
+        }
+    }
+}
+async function getBallotVoteBefore(err, rcpt){
+    if(err){
+        alertar(err);
+    }else{
+        $('#termina_votacion').text(getDateFromTimestamp(rcpt));
+        var today = new Date();
+        if(rcpt < today.getTime()){
+            $("#form_votacion :input").prop("disabled", true);
+            alertar("La votación ha finalizado.");
+        }
+    }
+}
+
+async function getBallotTitle(err, rcpt){
+    if(err){
+        alertar(err);
+    }else{
+        $('#titulo_votacion').text(rcpt);
+    }
+}
+
+async function getProposalList(err, rcpt){
+
+    if(err){
+        alertar(err);
+    }else{
+        var num = $('#proposals div').length;
+        var element = '<div class="radio"> \
+            <input type="radio" name="votacion" id="vote_'+num+'" required="required" aria-required="true"> \
+            <label for="vote_'+num+'">'+hex2ascii(rcpt)+'</label> \
+        </div>';
+        $('#proposals').append(element);
+
+    }
+}
+
+function hex2ascii(hexx) {
+    var hex = hexx.toString();
+    var str = '';
+    for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2)
+        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
+    return str;
 }
+function pad (str, max) {
+    str = str.toString();
+    return str.length < max ? pad("0" + str, max) : str;
+}
+function getDateFromTimestamp(timestamp){
+    var date_timestamp = new Date(parseInt(timestamp));
+    var date = pad(date_timestamp.getDate(),2) + '-' + pad(date_timestamp.getMonth()+1, 2) + '-' + date_timestamp.getFullYear() + ' ';
+    date += pad(date_timestamp.getHours(),2) + ':' + pad(date_timestamp.getMinutes(),2) + ':' + pad(date_timestamp.getSeconds(),2) + ' Hs.';
+
+    return date;
+}
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 
 function access_accounts() {
     if (gotEth) {
@@ -565,4 +613,9 @@ function alertarSuccess(err){
     document.getElementById('alert-wrapper').innerHTML = '<div class="alert alert-success" role="alert" id="alert"><i class="fas fa-check" aria-hidden="true"></i> <span id="alert-content"></span></div>';
     document.getElementById('alert-content').innerHTML = err;
     document.getElementById('alert').style.display = "block";
+}
+
+function close_alertar(){
+    document.getElementById('alert-content').innerHTML = '';
+    document.getElementById('alert').style.display = "none";
 }
\ No newline at end of file
diff --git a/web/dist/smartVotar.html b/web/dist/smartVotar.html
index 2e04b73..9e24222 100644
--- a/web/dist/smartVotar.html
+++ b/web/dist/smartVotar.html
@@ -32,12 +32,16 @@
         <div id="alert-wrapper"></div>
         <div id="voterow" class="row hide">
             <section>
-                <h1 class="page-header">Título de la votación</h1>
-                <p class="max-container"><b>Dirección:</b> 0xe3e08934b6fa0b68972c08e0f545cee31ed039
-                    <a class="btn-default btn btn-lg btn-address" aria-label="Cambiar dirección" href="smartVote.html">
+                <h1 class="page-header" id="titulo_votacion">Título de la votación</h1>
+                <p class="max-container"><b>Dirección:</b> <span id="contract_address">0xe3e08934b6fa0b68972c08e0f545cee31ed039</span>
+                    <a class="btn-default btn btn-lg btn-address" aria-label="Cambiar dirección" href="index.html">
                         Cambiar
                     </a>
                 </p>
+                <p class="max-container">
+                    <b>Comienza:</b> <span id="comienza_votacion"></span><br />
+                    <b>Termina:</b> <span id="termina_votacion"></span>
+                </p>
                 <div class="resultados" style="display: none;">
                     <h2>Resultados</h2>
                     <div class="res_op">
@@ -110,29 +114,13 @@
                     </table>
 
                 </div>
-                <form action="">
+                <form action="" id="form_votacion">
                     <div class="alert alert-danger" role="alert" id="errorForm">
                         <p>Comprobá los siguientes errores del formulario:</p>
                         <ul></ul>
                     </div>
-                    <fieldset class="form-group votar">
+                    <fieldset class="form-group votar" id="proposals">
                         <legend>Opciones para votar</legend>
-                        <div class="radio">
-                            <input type="radio" name="votacion" id="vote_0" required="required" aria-required="true">
-                            <label for="vote_0">Opción 1</label>
-                        </div>
-                        <div class="radio">
-                            <input type="radio" name="votacion" id="vote_1">
-                            <label for="vote_1">Opción 2</label>
-                        </div>
-                        <div class="radio">
-                            <input type="radio" name="votacion" id="vote_3">
-                            <label for="vote_3">Opción 3</label>
-                        </div>
-                        <div class="radio">
-                            <input type="radio" name="votacion" id="vote_4">
-                            <label for="vote_4">Opción 4</label>
-                        </div>
                     </fieldset>
                     <div class="form-group col-sm-6 col-sm-push-6">
                         <button class="btn-primary btn btn-block" type="submit" id="submit">Votar</button>
@@ -185,6 +173,13 @@
         var container = $('#errorForm');
 
 
+        var url = new URL(window.location.href);
+        var input_address = url.searchParams.get("input_address");
+        if(typeof input_address != "undefined" && input_address != ""){
+            $("#contract_address").text(input_address);
+            ver_votacion(input_address);
+        }
+
         $("form").validate({
             focusInvalid: false,
             errorContainer: container,
-- 
GitLab