+ {{#link-to 'proposals.new'}}Create new proposal{{/link-to}} +
diff --git a/app/components/add-proposal/component.js b/app/components/add-proposal/component.js new file mode 100644 index 0000000..70a990a --- /dev/null +++ b/app/components/add-proposal/component.js @@ -0,0 +1,60 @@ +import Ember from 'ember'; + +const { + Component, + inject: { + service + }, + computed +} = Ember; + +export default Component.extend({ + + kredits: service(), + + proposal: null, + inProgress: false, + + isValidRecipient: computed('proposal.recipientAddress', function() { + return this.get('kredits.web3Instance').isAddress(this.get('proposal.recipientAddress')); + }), + + isValidAmount: computed('proposal.amount', function() { + // TODO + return true; + }), + + isValidUrl: computed('proposal.url', function() { + // TODO + return true; + }), + + isValidIpfsHash: computed('proposal.ipfsHash', function() { + // TODO + return true; + }), + + isValid: computed.and('isValidRecipient', 'isValidAmount', 'isValidUrl', + 'isValidIpfsHash'), + + actions: { + save() { + if (this.get('isValid')) { + this.set('inProgress', true); + + this.get('kredits').addProposal(this.get('proposal')) + .then(() => { + this.attrs.onSave(); + }).catch((error) => { + Ember.Logger.error('Error creating the proposal', error); + alert('Something went wrong.'); + }).finally(() => { + this.set('inProgress', false); + }); + } else { + alert('Invalid data. Please review and try again.'); + } + } + } + +}); diff --git a/app/components/add-proposal/template.hbs b/app/components/add-proposal/template.hbs new file mode 100644 index 0000000..636b34f --- /dev/null +++ b/app/components/add-proposal/template.hbs @@ -0,0 +1,31 @@ +
+ diff --git a/app/controllers/proposals/new.js b/app/controllers/proposals/new.js new file mode 100644 index 0000000..a557d7c --- /dev/null +++ b/app/controllers/proposals/new.js @@ -0,0 +1,27 @@ +import Ember from 'ember'; +import QueryParams from 'ember-parachute'; + +export const queryParams = new QueryParams({ + recipient: { + defaultValue: '' + }, + amount: { + defaultValue: '' + }, + url: { + defaultValue: '' + }, + ipfsHash: { + defaultValue: '' + } +}); + +export default Ember.Controller.extend(queryParams.Mixin, { + + actions: { + onSave() { + this.transitionToRoute('index'); + } + } + +}); diff --git a/app/router.js b/app/router.js index 23c14c6..7f9f715 100644 --- a/app/router.js +++ b/app/router.js @@ -8,6 +8,9 @@ const Router = Ember.Router.extend({ Router.map(function() { this.route('spinner'); + this.route('proposals', function() { + this.route('new'); + }); }); export default Router; diff --git a/app/routes/proposals/new.js b/app/routes/proposals/new.js new file mode 100644 index 0000000..3326e8d --- /dev/null +++ b/app/routes/proposals/new.js @@ -0,0 +1,15 @@ +import Ember from 'ember'; +import Proposal from 'kredits-web/models/proposal'; + +export default Ember.Route.extend({ + + model(params) { + return Proposal.create({ + recipientAddress: params.recipient, + amount: params.amount, + url: params.url, + ipfsHash: params.ipfsHash + }); + } + +}); diff --git a/app/services/kredits.js b/app/services/kredits.js index a3c4147..98f97fd 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -66,7 +66,7 @@ export default Ember.Service.extend({ Ember.Logger.debug('[kredits] read from contract', contract); return new Ember.RSVP.Promise((resolve, reject) => { this.get(contract)[contractMethod](...args, (err, data) => { - if (err) { reject(err); } + if (err) { reject(err); return; } resolve(data); }); }); @@ -144,7 +144,7 @@ export default Ember.Service.extend({ Ember.Logger.debug('[kredits] vote for', proposalId); return new Ember.RSVP.Promise((resolve, reject) => { this.get('kreditsContract').vote(proposalId, (err, data) => { - if (err) { reject(err); } + if (err) { reject(err); return; } Ember.Logger.debug('[kredits] vote response', data); resolve(data); }); @@ -168,7 +168,7 @@ export default Ember.Service.extend({ contributor.set('ipfsHash', ipfsHash); console.debug('ADD', address, name, ipfsHash, isCore, id); this.get('kreditsContract').addContributor(address, name, ipfsHash, isCore, id, (err, data) => { - if (err) { reject(err); } + if (err) { reject(err); return; } Ember.Logger.debug('[kredits] add contributor response', data); resolve(contributor); }); @@ -176,6 +176,23 @@ export default Ember.Service.extend({ }); }, + addProposal(proposal) { + return new Ember.RSVP.Promise((resolve, reject) => { + const { + recipientAddress, + amount, + url, + ipfsHash + } = proposal.getProperties('recipientAddress', 'amount', 'url', 'ipfsHash'); + + this.get('kreditsContract').addProposal(recipientAddress, amount, url, ipfsHash, (err, data) => { + if (err) { reject(err); return; } + Ember.Logger.debug('[kredits] add proposal response', data); + resolve(); + }); + }); + }, + logKreditsContract: function() { Ember.Logger.debug('[kredits] kreditsContract', this.get('kreditsContract')); }.on('init') diff --git a/app/styles/app.scss b/app/styles/app.scss index 9fa25b3..d8f2e8a 100644 --- a/app/styles/app.scss +++ b/app/styles/app.scss @@ -65,6 +65,22 @@ section { } } } + + proposals-open, proposals-closed { + .actions { + padding-top: 3rem; + font-size: 1rem; + color: lightblue; + text-align: center; + @include media($mobile) { + padding-top: 2rem; + } + + a { + color: lightblue; + } + } + } } button, input[type=submit] { diff --git a/app/styles/components/_add-contributor.scss b/app/styles/components/_add-contributor.scss index 1d7226e..9ea5753 100644 --- a/app/styles/components/_add-contributor.scss +++ b/app/styles/components/_add-contributor.scss @@ -1,4 +1,4 @@ -section#add-contributor { +section#add-contributor, section#add-proposal { form { @@ -8,6 +8,10 @@ section#add-contributor { &.actions { padding-top: 1rem; text-align: center; + a { + color: lightblue; + margin-left: 1rem; + } } } diff --git a/app/templates/index.hbs b/app/templates/index.hbs index b4e0bb6..d995bbf 100644 --- a/app/templates/index.hbs +++ b/app/templates/index.hbs @@ -22,6 +22,10 @@ {{proposal-list proposals=proposalsOpenSorted confirmAction="confirmProposal" contractInteractionEnabled=contractInteractionEnabled}} + ++ {{#link-to 'proposals.new'}}Create new proposal{{/link-to}} +
{{/if}} @@ -33,6 +37,10 @@+ {{#link-to 'proposals.new'}}Create new proposal{{/link-to}} +