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