This repository has been archived on 2021-05-25. You can view files and clone it, but cannot push or open issues or pull requests.
pyRCV2/test.html

150 lines
4.6 KiB
HTML
Raw Normal View History

2020-10-17 18:40:18 +11:00
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>pyRCV2 test</title>
</head>
<body>
<input type="file" id="bltFile">
<button onclick="clickBtn();">OK</button>
2020-10-17 23:09:23 +11:00
<select id="numbers"><option value="native" selected>Native</option><option value="rational">Rational</option></select>
2020-10-17 18:40:18 +11:00
2020-10-17 22:20:13 +11:00
<table id="result"></table>
2020-10-17 18:40:18 +11:00
<script src="http://peterolson.github.com/BigRational.js/BigInt_BigRat.min.js"></script>
<script src="bundle.js"></script>
<script>
async function clickBtn() {
2020-10-17 23:09:23 +11:00
// Set numbers class
if (document.getElementById('numbers').value == 'native') {
py.pyRCV2.numbers.set_numclass(py.pyRCV2.numbers.Native);
}
if (document.getElementById('numbers').value == 'rational') {
py.pyRCV2.numbers.set_numclass(py.pyRCV2.numbers.Rational);
}
2020-10-17 22:20:13 +11:00
// Read BLT file
2020-10-17 18:40:18 +11:00
let bltFile = document.getElementById('bltFile').files[0];
let text = await bltFile.text();
2020-10-17 22:20:13 +11:00
// Initialise table rows
let tblResults = document.getElementById('result');
2020-10-17 23:09:29 +11:00
tblResults.innerHTML = '';
let candMap = {}; // candidate name -> rows
2020-10-17 22:20:13 +11:00
// Step election
let worker = new Worker('worker.js');
let election, elComment, elExhausted1, elExhausted2, elQuota;
2020-10-17 22:20:13 +11:00
worker.onmessage = function(evt) {
if (evt.data.type == 'init') {
election = evt.data.election;
// Comment row
elComment = document.createElement('tr');
let elTd = document.createElement('td');
elComment.appendChild(elTd);
tblResults.appendChild(elComment);
// Candidates
for (let candidate of election.candidates) {
let elTr1 = document.createElement('tr');
let elTr2 = document.createElement('tr');
elTd = document.createElement('td');
elTd.setAttribute('rowspan', '2');
elTd.style.borderTop = '1px solid black';
elTd.innerText = candidate;
elTr1.appendChild(elTd);
tblResults.appendChild(elTr1);
tblResults.appendChild(elTr2);
candMap[candidate] = [elTr1, elTr2];
}
// Exhausted votes row
elExhausted1 = document.createElement('tr');
elExhausted2 = document.createElement('tr');
2020-10-17 22:20:13 +11:00
elTd = document.createElement('td');
elTd.setAttribute('rowspan', '2');
2020-10-17 22:20:13 +11:00
elTd.style.borderTop = '1px solid black';
elTd.innerText = 'Exhausted';
elExhausted1.appendChild(elTd);
tblResults.appendChild(elExhausted1);
tblResults.appendChild(elExhausted2);
2020-10-17 22:20:13 +11:00
// Quota row
elQuota = document.createElement('tr');
2020-10-17 22:20:13 +11:00
elTd = document.createElement('td');
elTd.style.borderTop = '1px solid black';
elTd.innerText = 'Quota';
elQuota.appendChild(elTd);
tblResults.appendChild(elQuota);
2020-10-17 22:20:13 +11:00
}
if (evt.data.type == 'result') {
let result = evt.data.result;
// Display results
elTd = document.createElement('td');
elTd.innerText = result.comment;
elComment.appendChild(elTd);
for (let [candidate, countCard] of result.candidates) {
[elTr1, elTr2] = candMap[candidate];
elTd = document.createElement('td');
elTd.style.borderTop = '1px solid black';
if (countCard.transfers != '0.00') {
elTd.innerText = countCard.transfers;
}
elTr1.appendChild(elTd);
elTd = document.createElement('td');
if (countCard.state == py.pyRCV2.model.CandidateState.WITHDRAWN) {
elTd.innerText = 'WD';
} else if (countCard.state == py.pyRCV2.model.CandidateState.ELECTED || countCard.state == py.pyRCV2.model.CandidateState.PROVISIONALLY_ELECTED) {
elTd.innerText = countCard.votes;
elTd.style.fontWeight = 'bold';
} else if (countCard.state == py.pyRCV2.model.CandidateState.EXCLUDED) {
elTd.innerText = 'EX';
} else {
elTd.innerText = countCard.votes;
}
elTr2.appendChild(elTd);
}
// Display exhausted votes
elTd = document.createElement('td');
elTd.style.borderTop = '1px solid black';
if (result.exhausted.transfers != '0.00') {
elTd.innerText = result.exhausted.transfers;
}
elExhausted1.appendChild(elTd);
elTd = document.createElement('td');
elTd.innerText = result.exhausted.votes;
elExhausted2.appendChild(elTd);
// Display quota
elTd = document.createElement('td');
elTd.style.borderTop = '1px solid black';
elTd.innerText = result.quota;
elQuota.appendChild(elTd);
2020-10-17 22:20:13 +11:00
}
}
worker.onerror = function(evt) {
throw evt;
}
worker.postMessage(text);
2020-10-17 18:40:18 +11:00
}
</script>
</body>
</html>