Skip to content

Commit f1c435a

Browse files
committed
fix: proposal UIs
1 parent cc47c1d commit f1c435a

File tree

12 files changed

+1855
-1516
lines changed

12 files changed

+1855
-1516
lines changed

Diff for: imports/api/chain/server/methods.js

+224-227
Large diffs are not rendered by default.

Diff for: imports/api/proposals/server/methods.js

+255-161
Large diffs are not rendered by default.

Diff for: imports/ui/components/Activities.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export default class Activites extends Component {
7171
case "/cosmos.gov.v1beta1.MsgSubmitProposal":
7272
const proposalId = _.get(this.props, 'events[2].attributes[0].value', null)
7373
const proposalLink = proposalId ? `/proposals/${proposalId}` : "#";
74-
return <p><Account address={msg.proposer} /> <MsgType type={msg["@type"]} /> <T>activities.withTitle</T> <Link to={proposalLink}>{msg.content.value.title}</Link><T>common.fullStop</T></p>
74+
return <p><Account address={msg.proposer} /> <MsgType type={msg["@type"]} /> <T>activities.withTitle</T> <Link to={proposalLink}>{msg.content.title}</Link><T>common.fullStop</T></p>
7575
case "/cosmos.gov.v1beta1.MsgDeposit":
7676
return <p><Account address={msg.depositor} /> {(this.props.invalid) ? <T>activities.failedTo</T> : ''}<MsgType type={msg["@type"]} /> <em className="text-info">{msg.amount.map((amount, i) => new Coin(amount.amount, amount.denom).toString(6)).join(', ')}</em> <T>activities.to</T> <Link to={"/proposals/" + msg.proposal_id}><T>proposals.proposal</T> {msg.proposal_id}</Link><T>common.fullStop</T></p>
7777
case "/cosmos.gov.v1beta1.MsgVote":

Diff for: imports/ui/ledger/LedgerActions.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -771,10 +771,10 @@ class WithdrawButton extends LedgerButton {
771771
Meteor.call('transaction.execute', { from: this.state.user }, this.getPath(), (err, res) => {
772772
if (res) {
773773
Meteor.call('isValidator', this.state.user, (error, result) => {
774-
if (result && result.address) {
774+
if (result && result.operator_address) {
775775
res.value.msg.push({
776776
type: 'cosmos-sdk/MsgWithdrawValidatorCommission',
777-
value: { validator_address: result.address }
777+
value: { validator_address: result.operator_address }
778778
})
779779
}
780780
callback(res, res)

Diff for: imports/ui/proposals/List.jsx

+66-67
Original file line numberDiff line numberDiff line change
@@ -12,80 +12,79 @@ import voca from 'voca';
1212
const T = i18n.createComponent();
1313

1414
const ProposalRow = (props) => {
15-
16-
return <tr>
17-
<th className="d-none d-sm-table-cell counter">{props.proposal.proposalId}</th>
18-
<td className="title"><Link to={"/proposals/" + props.proposal.proposalId}>{props.proposal.content.title}</Link></td>
19-
<td className="status"><ProposalStatusIcon status={props.proposal.status} /><span className="d-none d-sm-inline"> {voca.chain(props.proposal.status.substr(16)).replace('_', ' ').titleCase().value()}</span></td>
20-
<td className="submit-block"><TimeStamp time={props.proposal.submit_time} /></td>
21-
<td className="voting-start">{(props.proposal.voting_start_time != "0001-01-01T00:00:00Z") ? <TimeStamp time={props.proposal.voting_start_time} /> : 'Not started'}</td>
22-
<td className="deposit text-right">{props.proposal.total_deposit ? props.proposal.total_deposit.map((deposit, i) => {
23-
return <div key={i}>{new Coin(deposit.amount, deposit.denom).toString()}</div>
24-
}) : '0'}</td>
25-
</tr>
15+
return <tr>
16+
<th className="d-none d-sm-table-cell counter">{props.proposal.proposalId}</th>
17+
<td className="title"><Link to={"/proposals/"+props.proposal.proposalId}>{props.proposal.content.title}</Link></td>
18+
<td className="status"><ProposalStatusIcon status={props.proposal.status}/><span className="d-none d-sm-inline"> {voca.chain(props.proposal.status.substr(16)).replace('_', ' ').titleCase().value()}</span></td>
19+
<td className="submit-block"><TimeStamp time={props.proposal.submit_time}/></td>
20+
<td className="voting-start">{(props.proposal.voting_start_time != "0001-01-01T00:00:00Z")?<TimeStamp time={props.proposal.voting_start_time}/>:'Not started'}</td>
21+
<td className="deposit text-right">{props.proposal.total_deposit?props.proposal.total_deposit.map((deposit, i) => {
22+
return <div key={i}>{new Coin(deposit.amount, deposit.denom).toString(6)}</div>
23+
}):'0'}</td>
24+
</tr>
2625
}
2726

28-
export default class List extends Component {
29-
constructor(props) {
30-
super(props);
31-
if (Meteor.isServer) {
32-
if (this.props.proposals.length > 0) {
33-
this.state = {
34-
proposals: this.props.proposals.map((proposal, i) => {
35-
return <ProposalRow key={i} index={i} proposal={proposal} />
36-
})
27+
export default class List extends Component{
28+
constructor(props){
29+
super(props);
30+
if (Meteor.isServer){
31+
if (this.props.proposals.length > 0){
32+
this.state = {
33+
proposals: this.props.proposals.map((proposal, i) => {
34+
return <ProposalRow key={i} index={i} proposal={proposal} />
35+
})
36+
}
37+
}
38+
}
39+
else{
40+
this.state = {
41+
proposals: null
42+
}
3743
}
38-
}
39-
}
40-
else {
41-
this.state = {
42-
proposals: null
43-
}
4444
}
45-
}
4645

47-
static getDerivedStateFromProps(props, state) {
48-
if (state.user !== localStorage.getItem(CURRENTUSERADDR)) {
49-
return { user: localStorage.getItem(CURRENTUSERADDR) };
46+
static getDerivedStateFromProps(props, state) {
47+
if (state.user !== localStorage.getItem(CURRENTUSERADDR)) {
48+
return {user: localStorage.getItem(CURRENTUSERADDR)};
49+
}
50+
return null;
5051
}
51-
return null;
52-
}
5352

54-
componentDidUpdate(prevState) {
55-
if (this.props.proposals != prevState.proposals) {
56-
if (this.props.proposals.length > 0) {
57-
this.setState({
58-
proposals: this.props.proposals.map((proposal, i) => {
59-
return <ProposalRow key={i} index={i} proposal={proposal} />
60-
})
61-
})
62-
}
53+
componentDidUpdate(prevState){
54+
if (this.props.proposals != prevState.proposals){
55+
if (this.props.proposals.length > 0){
56+
this.setState({
57+
proposals: this.props.proposals.map((proposal, i) => {
58+
return <ProposalRow key={i} index={i} proposal={proposal} />
59+
})
60+
})
61+
}
62+
}
6363
}
64-
}
6564

66-
render() {
67-
if (this.props.loading) {
68-
return <Spinner type="grow" color="primary" />
69-
}
70-
else {
71-
return (
72-
<div>
73-
{/* {this.state.user?<SubmitProposalButton history={this.props.history}/>:null} */}
74-
<Table striped className="proposal-list">
75-
<thead>
76-
<tr>
77-
<th className="d-none d-sm-table-cell counter"><i className="fas fa-hashtag"></i> <T>proposals.proposalID</T></th>
78-
<th className="title"><i className="material-icons">view_headline</i> <span className="d-none d-sm-inline"><T>proposals.title</T></span></th>
79-
<th className="status"><i className="fas fa-toggle-on"></i> <span className="d-none d-sm-inline"><T>proposals.status</T></span></th>
80-
<th className="submit-block"><i className="fas fa-box"></i> <span className="d-none d-sm-inline"><T>proposals.submitTime</T> (UTC)</span></th>
81-
<th className="voting-start"><i className="fas fa-box-open"></i> <span className="d-none d-sm-inline"><T>proposals.votingStartTime</T> (UTC)</span></th>
82-
<th className="deposit text-right"><i className="material-icons">attach_money</i> <span className="d-none d-sm-inline"><T>proposals.totalDeposit</T></span></th>
83-
</tr>
84-
</thead>
85-
<tbody>{this.state.proposals}</tbody>
86-
</Table>
87-
</div>
88-
)
65+
render(){
66+
if (this.props.loading){
67+
return <Spinner type="grow" color="primary" />
68+
}
69+
else{
70+
return (
71+
<div>
72+
{/* {this.state.user?<SubmitProposalButton history={this.props.history} denom={Coin.StakingCoin.denom}/>:null} */}
73+
<Table striped className="proposal-list">
74+
<thead>
75+
<tr>
76+
<th className="d-none d-sm-table-cell counter"><i className="fas fa-hashtag"></i> <T>proposals.proposalID</T></th>
77+
<th className="title"><i className="material-icons">view_headline</i> <span className="d-none d-sm-inline"><T>proposals.title</T></span></th>
78+
<th className="status"><i className="fas fa-toggle-on"></i> <span className="d-none d-sm-inline"><T>proposals.status</T></span></th>
79+
<th className="submit-block"><i className="fas fa-box"></i> <span className="d-none d-sm-inline"><T>proposals.submitTime</T> (UTC)</span></th>
80+
<th className="voting-start"><i className="fas fa-box-open"></i> <span className="d-none d-sm-inline"><T>proposals.votingStartTime</T> (UTC)</span></th>
81+
<th className="deposit text-right"><i className="material-icons">attach_money</i> <span className="d-none d-sm-inline"><T>proposals.totalDeposit</T></span></th>
82+
</tr>
83+
</thead>
84+
<tbody>{this.state.proposals}</tbody>
85+
</Table>
86+
</div>
87+
)
88+
}
8989
}
90-
}
91-
}
90+
}

Diff for: imports/ui/proposals/ListContainer.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import { Meteor } from 'meteor/meteor';
2-
import { withTracker } from 'meteor/react-meteor-data';
3-
import { Proposals } from '/imports/api/proposals/proposals.js';
4-
import List from './List.jsx';
1+
import { Meteor } from "meteor/meteor";
2+
import { withTracker } from "meteor/react-meteor-data";
3+
import { Proposals } from "/imports/api/proposals/proposals.js";
4+
import List from "./List.jsx";
55

66
export default ProposalListContainer = withTracker((props) => {
7-
let proposalsHandle; let proposals; let
8-
proposalsExist;
7+
let proposalsHandle, proposals, proposalsExist;
98
let loading = true;
109

1110
if (Meteor.isClient) {
12-
proposalsHandle = Meteor.subscribe('proposals.list');
11+
proposalsHandle = Meteor.subscribe("proposals.list");
1312
loading = !proposalsHandle.ready();
1413
}
1514

Diff for: imports/ui/proposals/Proposal.jsx

+10-11
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,16 @@ export default class Proposal extends Component{
6666

6767
componentDidUpdate(prevProps){
6868
if (this.props.proposal != prevProps.proposal){
69-
// console.log(this.props.proposal.value);
7069
this.setState({
7170
proposal: this.props.proposal,
7271
deposit: <div>{this.props.proposal.total_deposit?this.props.proposal.total_deposit.map((deposit, i) => {
73-
return <div key={i}>{new Coin(deposit.amount, deposit.denom).toString()}</div>
72+
return <div key={i}>{new Coin(deposit.amount, deposit.denom).toString(6)}</div>
7473
}):''} </div>
7574
});
7675

7776
let now = moment();
7877
const powerReduction = Meteor.settings.public.powerReduction || Coin.StakingCoin.fraction;
79-
let totalVotingPower = this.props.chain.activeVotingPower * powerReduction;
78+
let totalVotingPower = (this.props.activeVotingPower || this.props.chain.activeVotingPower) * powerReduction;
8079
if (this.props.proposal.voting_start_time != '0001-01-01T00:00:00Z'){
8180
if (now.diff(moment(this.props.proposal.voting_start_time)) > 0){
8281
let endVotingTime = moment(this.props.proposal.voting_end_time);
@@ -97,7 +96,7 @@ export default class Proposal extends Component{
9796
abstainPercent: (totalVotes>0)?parseInt(this.props.proposal.tally.abstain)/totalVotes*100:0,
9897
noPercent: (totalVotes>0)?parseInt(this.props.proposal.tally.no)/totalVotes*100:0,
9998
noWithVetoPercent: (totalVotes>0)?parseInt(this.props.proposal.tally.no_with_veto)/totalVotes*100:0,
100-
proposalValid: (this.state.totalVotes/totalVotingPower > parseFloat(this.props.chain.gov.tallyParams.quorum))?true:false
99+
proposalValid: (this.state.totalVotes/totalVotingPower > parseFloat(this.props.chain.gov.tally_params.quorum))?true:false
101100
})
102101
}
103102
else{
@@ -116,7 +115,7 @@ export default class Proposal extends Component{
116115
abstainPercent: (totalVotes>0)?parseInt(this.props.proposal.final_tally_result.abstain)/totalVotes*100:0,
117116
noPercent: (totalVotes>0)?parseInt(this.props.proposal.final_tally_result.no)/totalVotes*100:0,
118117
noWithVetoPercent: (totalVotes>0)?parseInt(this.props.proposal.final_tally_result.no_with_veto)/totalVotes*100:0,
119-
proposalValid: (this.state.totalVotes/totalVotingPower > parseFloat(this.props.chain.gov.tallyParams.quorum))?true:false
118+
proposalValid: (this.state.totalVotes/totalVotingPower > parseFloat(this.props.chain.gov.tally_params.quorum))?true:false
120119
})
121120
}
122121
}
@@ -263,7 +262,7 @@ export default class Proposal extends Component{
263262
</Col>
264263
<Col className="voting-power-percent data" md={3}>
265264
<i className="material-icons d-md-none">equalizer</i>
266-
{(vote.votingPower!==undefined)?numbro(vote.votingPower/this.state.totalVotes).format('0,0.00%'):""}
265+
{(vote.votingPower!==undefined)?numbro(vote.votingPower/this.state.totalVotes).format('0,0.000000%'):""}
267266
</Col>
268267
</Row></Card>
269268
)}
@@ -280,7 +279,7 @@ export default class Proposal extends Component{
280279
// console.log(this.state.proposal);
281280
const proposalId = Number(this.props.proposal.proposalId), maxProposalId = Number(this.props.proposalCount);
282281
const powerReduction = Meteor.settings.public.powerReduction || Coin.StakingCoin.fraction;
283-
let totalVotingPower = this.props.chain.activeVotingPower * powerReduction;
282+
let totalVotingPower = (this.props.activeVotingPower || this.props.chain.activeVotingPower) * powerReduction;
284283
let proposalType = this.props.proposal.content["@type"].split('.');
285284
proposalType = proposalType[proposalType.length-1].match(/[A-Z]+[^A-Z]*|[^A-Z]+/g).join(" ");
286285

@@ -294,7 +293,7 @@ export default class Proposal extends Component{
294293
<Row className="mb-2 border-top">
295294
<Col md={3} className="label"><T>proposals.proposalID</T></Col>
296295
<Col md={this.state.user?6:9} className="value">{this.props.proposal.proposalId}</Col>
297-
{/* {this.state.user?<Col md={3}><ProposalActionButtons history={this.props.history} proposalId={proposalId}/></Col>:null} */}
296+
{/* {(this.state.user && !this.state.voteEnded) ?<Col md={3}><ProposalActionButtons history={this.props.history} proposalId={proposalId}/></Col>:null} */}
298297
</Row>
299298
<Row className="mb-2 border-top">
300299
<Col md={3} className="label"><T>proposals.proposer</T></Col>
@@ -316,7 +315,7 @@ export default class Proposal extends Component{
316315
{(this.props.proposal.content.type === 'cosmos-sdk/CommunityPoolSpendProposal')?<Row className="mb-2 border-top">
317316
<Col md={3} className="label"><T>proposals.amount</T></Col>
318317
<Col md={9} className="value"> {this.props.proposal.content.amount.map((amount, j) => {
319-
return <div key={j}>{new Coin(amount.amount, amount.denom).toString()}</div>
318+
return <div key={j}>{new Coin(amount.amount, amount.denom).toString(6)}</div>
320319
})}</Col>
321320
</Row>:null}
322321
<Row className="mb-2 border-top">
@@ -338,7 +337,7 @@ export default class Proposal extends Component{
338337
return <li key={i}>
339338
<Account address={deposit.depositor} />
340339
{deposit.amount.map((amount, j) => {
341-
return <div key={j}>{new Coin(amount.amount, amount.denom).toString()}</div>
340+
return <div key={j}>{new Coin(amount.amount, amount.denom).toString(6)}</div>
342341
})}
343342
</li>
344343
}):''}
@@ -439,7 +438,7 @@ export default class Proposal extends Component{
439438
<Card body className="tally-info">
440439
<em>
441440
<T _purify={false} percent={numbro(this.state.totalVotes/totalVotingPower).format("0.00%")}>proposals.percentageVoted</T><br/>
442-
{this.state.proposalValid?<T _props={{className:'text-success'}} tentative={(!this.state.voteEnded)?'(tentatively) ':''} _purify={false}>proposals.validMessage</T>:(this.state.voteEnded)?<T _props={{className:'text-danger'}} quorum={numbro(this.props.chain.gov.tallyParams.quorum).format("0.00%")} _purify={false}>proposals.invalidMessage</T>:<T moreVotes={numbro((totalVotingPower*this.props.chain.gov.tallyParams.quorum-this.state.totalVotes)/Meteor.settings.public.powerReduction).format("0,0")} _purify={false}>proposals.moreVoteMessage</T>}
441+
{this.state.proposalValid?<T _props={{className:'text-success'}} tentative={(!this.state.voteEnded)?'(tentatively) ':''} _purify={false}>proposals.validMessage</T>:(this.state.voteEnded)?<T _props={{className:'text-danger'}} quorum={numbro(this.props.chain.gov.tally_params.quorum).format("0.00%")} _purify={false}>proposals.invalidMessage</T>:<T moreVotes={numbro((totalVotingPower*this.props.chain.gov.tally_params.quorum-this.state.totalVotes)/Meteor.settings.public.powerReduction).format("0,0")} _purify={false}>proposals.moreVoteMessage</T>}
443442
</em>
444443
</Card>
445444
</Col>

0 commit comments

Comments
 (0)