Implement batch voting

This commit is contained in:
2018-04-24 15:29:10 +02:00
parent 86c220ee55
commit 9aeb98abb4
6 changed files with 60 additions and 34 deletions
+11 -8
View File
@@ -1,20 +1,23 @@
import Component from '@ember/component'; import Component from '@ember/component';
import { inject } from '@ember/service';
import { empty } from '@ember/object/computed';
export default Component.extend({ export default Component.extend({
kredits: inject(),
tagName: 'ul', tagName: 'ul',
classNames: ['proposal-list'], classNames: ['proposal-list'],
selectedProposals: [],
submitButtonDisabled: empty('selectedProposals'),
actions: { actions: {
toggleSelect(proposalId, selected) {
confirm(proposalId) { if (selected) {
if (this.contractInteractionEnabled) { this.selectedProposals.removeObject(proposalId);
this.confirmProposal(proposalId);
} else { } else {
window.alert('Only members can vote on proposals. Please ask someone to set you up.'); this.selectedProposals.addObject(proposalId);
} }
},
} }
}
}); });
+16 -10
View File
@@ -1,12 +1,18 @@
{{#each proposals as |proposal|}} {{#each proposals as |proposal|}}
<li data-proposal-id={{proposal.id}} title="({{proposal.kind}}) {{proposal.description}}"> {{proposal-list/item
<span class="category {{proposal.kind}}">♥</span> proposal=proposal
<span class="amount">{{proposal.amount}}</span><span class="symbol">₭S</span> selectedProposals=selectedProposals
for <span class="recipient">{{proposal.contributor.name}}</span> toggleSelect=(action 'toggleSelect')
<span class="votes">({{proposal.votesCount}}/{{proposal.votesNeeded}} votes)</span> }}
{{#unless proposal.isExecuted}}
<button {{action "confirm" proposal.id}}>+1</button>
{{/unless}}
</li>
{{/each}} {{/each}}
{{#if confirmProposals}}
<center>
<button
disabled={{submitButtonDisabled}}
{{action confirmProposals selectedProposals}}
>
Submit selected
</button>
</center>
{{/if}}
+7 -2
View File
@@ -20,10 +20,15 @@ export default Controller.extend({
proposalsOpenSorted: sort('proposalsOpen', 'proposalsSorting'), proposalsOpenSorted: sort('proposalsOpen', 'proposalsSorting'),
actions: { actions: {
confirmProposal(proposalId) { confirmProposals(proposalIds) {
this.kredits.vote(proposalId).then(transaction => { if (this.kredits.currentUser.isCore) {
this.kredits.batchVote(proposalIds)
.then((transaction) => {
window.confirm('Vote submitted to Ethereum blockhain: '+transaction.hash); window.confirm('Vote submitted to Ethereum blockhain: '+transaction.hash);
}); });
} else {
window.alert('Only members can vote on proposals. Please ask someone to set you up.');
}
}, },
save(contributor) { save(contributor) {
+6 -7
View File
@@ -4,7 +4,7 @@ import RSVP from 'rsvp';
import Service from '@ember/service'; import Service from '@ember/service';
import { computed } from '@ember/object'; import { computed } from '@ember/object';
import { alias, notEmpty } from '@ember/object/computed'; import { notEmpty } from '@ember/object/computed';
import { isEmpty } from '@ember/utils'; import { isEmpty } from '@ember/utils';
import config from 'kredits-web/config/environment'; import config from 'kredits-web/config/environment';
@@ -16,8 +16,6 @@ export default Service.extend({
currentUserAccounts: null, // default to not having an account. this is the wen web3 is loaded. currentUserAccounts: null, // default to not having an account. this is the wen web3 is loaded.
currentUser: null, currentUser: null,
currentUserIsContributor: notEmpty('currentUser'),
currentUserIsCore: alias('currentUser.isCore'),
hasAccounts: notEmpty('currentUserAccounts'), hasAccounts: notEmpty('currentUserAccounts'),
accountNeedsUnlock: computed('currentUserAccounts', function() { accountNeedsUnlock: computed('currentUserAccounts', function() {
return this.currentUserAccounts && isEmpty(this.currentUserAccounts); return this.currentUserAccounts && isEmpty(this.currentUserAccounts);
@@ -68,7 +66,7 @@ export default Service.extend({
if (this.currentUserAccounts && this.currentUserAccounts.length > 0) { if (this.currentUserAccounts && this.currentUserAccounts.length > 0) {
this.getCurrentUser.then((contributorData) => { this.getCurrentUser.then((contributorData) => {
this.set('currentUser', contributorData); this.set('currentUser', Contributor.create(contributorData));
}); });
} }
return kredits; return kredits;
@@ -130,10 +128,11 @@ export default Service.extend({
}); });
}, },
vote(proposalId) { batchVote(proposalIds) {
console.debug('[kredits] vote for', proposalId); proposalIds = proposalIds.map((id) => parseInt(id))
console.debug('[kredits] vote for', proposalIds);
return this.kredits.Operator.functions.vote(proposalId) return this.kredits.Operator.functions.batchVote(proposalIds)
.then((data) => { .then((data) => {
console.debug('[kredits] vote response', data); console.debug('[kredits] vote response', data);
return data; return data;
+15
View File
@@ -46,7 +46,22 @@ ul.proposal-list {
height: 2rem; height: 2rem;
line-height: 2rem; line-height: 2rem;
padding: 0 0.6rem; padding: 0 0.6rem;
&.selected {
background-color: rgba(224,104,251, 0.6);
}
} }
} }
button {
margin-top: 1.1rem;
height: 2rem;
line-height: 2rem;
padding: 0 0.6rem;
&:disabled {
cursor: not-allowed;
color: rgba(204,204,204, 0.6);
}
}
} }
+3 -5
View File
@@ -2,7 +2,7 @@
<section id="user-account"> <section id="user-account">
{{#if kredits.currentUser }} {{#if kredits.currentUser }}
{{ kredits.currentUser.name }} {{ kredits.currentUser.name }}
{{#if kredits.currentUserIsCore }} {{#if kredits.currentUser.isCore }}
(core) (core)
{{/if}} {{/if}}
Account: {{kredits.currentUser.account}} Account: {{kredits.currentUser.account}}
@@ -32,8 +32,7 @@
<div class="content"> <div class="content">
{{!-- TODO: We need a better naming for kredits.hasAccounts --}} {{!-- TODO: We need a better naming for kredits.hasAccounts --}}
{{proposal-list proposals=proposalsOpenSorted {{proposal-list proposals=proposalsOpenSorted
confirmProposal=(action "confirmProposal") confirmProposals=(action 'confirmProposals')}}
contractInteractionEnabled=kredits.hasAccounts}}
{{!-- TODO: We need a better naming --}} {{!-- TODO: We need a better naming --}}
{{#if kredits.hasAccounts}} {{#if kredits.hasAccounts}}
@@ -50,8 +49,7 @@
<h2>Closed Proposals</h2> <h2>Closed Proposals</h2>
</header> </header>
<div class="content"> <div class="content">
{{proposal-list proposals=proposalsClosedSorted {{proposal-list proposals=proposalsClosedSorted}}
confirmProposal=(action "confirmProposal")}}
{{!-- TODO: We need a better naming --}} {{!-- TODO: We need a better naming --}}
{{#if kredits.hasAccounts}} {{#if kredits.hasAccounts}}