From 05e3118a0c331cc4ef8eb6558822f660a5f9690c Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Tue, 10 Sep 2019 11:47:07 +0200 Subject: [PATCH] Re-submit vetoed contributions --- app/components/add-contribution/component.js | 21 +++++----- app/components/add-contribution/template.hbs | 11 +++++ app/controllers/contributions/resubmit.js | 7 ++++ app/models/contribution.js | 8 +++- app/router.js | 1 + app/routes/contributions/resubmit.js | 25 ++++++++++++ app/services/kredits.js | 40 ++++++++++--------- app/templates/contributions/resubmit.hbs | 13 ++++++ .../dashboard/contributions/show.hbs | 2 +- tests/unit/models/contribution-test.js | 27 +++++++++++++ .../routes/contributions/resubmit-test.js | 11 +++++ 11 files changed, 137 insertions(+), 29 deletions(-) create mode 100644 app/controllers/contributions/resubmit.js create mode 100644 app/routes/contributions/resubmit.js create mode 100644 app/templates/contributions/resubmit.hbs create mode 100644 tests/unit/models/contribution-test.js create mode 100644 tests/unit/routes/contributions/resubmit-test.js diff --git a/app/components/add-contribution/component.js b/app/components/add-contribution/component.js index 0c25c85..b9533f8 100644 --- a/app/components/add-contribution/component.js +++ b/app/components/add-contribution/component.js @@ -1,6 +1,7 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; import { and, notEmpty } from '@ember/object/computed'; +import { isEmpty } from '@ember/utils'; import moment from 'moment'; export default Component.extend({ @@ -25,14 +26,17 @@ export default Component.extend({ this.set('defaultDate', moment().startOf('hour').toDate()); // Default attributes used by reset - this.set('attributes', { - contributorId: null, - kind: null, - date: this.defaultDate, - amount: null, - description: null, - url: null, - }); + if (isEmpty(this.attributes)) { + this.set('attributes', { + contributorId: null, + kind: null, + date: this.defaultDate, + amount: null, + description: null, + url: null, + details: null + }); + } this.reset(); }, @@ -67,7 +71,6 @@ export default Component.extend({ window.alert('Something went wrong. Check the browser console for details.'); }) .finally(() => this.set('inProgress', false)); - } } diff --git a/app/components/add-contribution/template.hbs b/app/components/add-contribution/template.hbs index 2d2751f..2174967 100644 --- a/app/components/add-contribution/template.hbs +++ b/app/components/add-contribution/template.hbs @@ -63,6 +63,17 @@

+ {{#if details}} + + {{/if}} +

{{input type="submit" disabled=inProgress diff --git a/app/controllers/contributions/resubmit.js b/app/controllers/contributions/resubmit.js new file mode 100644 index 0000000..ed37ace --- /dev/null +++ b/app/controllers/contributions/resubmit.js @@ -0,0 +1,7 @@ +import ContributionsNewController from 'kredits-web/controllers/contributions/new'; + +export default ContributionsNewController.extend({ + + attributes: null, + +}); diff --git a/app/models/contribution.js b/app/models/contribution.js index a19c341..c6985fa 100644 --- a/app/models/contribution.js +++ b/app/models/contribution.js @@ -1,5 +1,7 @@ import EmberObject, { computed } from '@ember/object'; +import { isEmpty } from '@ember/utils'; import bignumber from 'kredits-web/utils/cps/bignumber'; +import moment from 'moment'; export default EmberObject.extend({ @@ -24,11 +26,15 @@ export default EmberObject.extend({ init () { this._super(...arguments); - this.set('details', {}); + if (isEmpty(this.details)) this.set('details', {}); }, iso8601Date: computed('date', 'time', function() { return this.time ? `${this.date}T${this.time}` : this.date; + }), + + jsDate: computed('iso8601Date', function() { + return moment(this.iso8601Date).toDate(); }) }); diff --git a/app/router.js b/app/router.js index e2c6349..014dbc8 100644 --- a/app/router.js +++ b/app/router.js @@ -21,6 +21,7 @@ Router.map(function() { }); this.route('contributions', function() { this.route('new'); + this.route('resubmit', { path: ':id/resubmit' }); }); this.route('contributors', function() { this.route('new'); diff --git a/app/routes/contributions/resubmit.js b/app/routes/contributions/resubmit.js new file mode 100644 index 0000000..2de1d5a --- /dev/null +++ b/app/routes/contributions/resubmit.js @@ -0,0 +1,25 @@ +import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; + +export default Route.extend({ + + kredits: service(), + + model(params) { + const contribution = this.kredits.contributions.findBy('id', parseInt(params.id)); + contribution.contributorId = contribution.contributorId.toString(); + + return contribution; + }, + + setupController (controller, model) { + this._super(controller, model); + + controller.set('attributes', model.getProperties([ + 'kind', 'amount', 'description', 'url', 'details' + ])); + controller.set('attributes.contributorId', model.contributorId.toString()); + controller.set('attributes.date', model.jsDate); + } + +}); diff --git a/app/services/kredits.js b/app/services/kredits.js index a1b9ec2..58049ed 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -232,26 +232,30 @@ export default Service.extend({ }); }, - addProposal (attributes) { - console.debug('[kredits] add proposal', attributes); + // + // TODO Implement proposals with voting + // - return this.kredits.Proposal.addProposal(attributes) - .then((data) => { - console.debug('[kredits] add proposal response', data); - attributes.contributor = this.contributors.findBy('id', attributes.contributorId); - return Proposal.create(attributes); - }); - }, + // addProposal (attributes) { + // console.debug('[kredits] add proposal', attributes); + // + // return this.kredits.Proposal.addProposal(attributes) + // .then((data) => { + // console.debug('[kredits] add proposal response', data); + // attributes.contributor = this.contributors.findBy('id', attributes.contributorId); + // return Proposal.create(attributes); + // }); + // }, - getProposals () { - return this.kredits.Proposal.all() - .then((proposals) => { - return proposals.map((proposal) => { - proposal.contributor = this.contributors.findBy('id', proposal.contributorId.toString()); - return Proposal.create(proposal); - }); - }); - }, + // getProposals () { + // return this.kredits.Proposal.all() + // .then(proposals => { + // return proposals.map(proposal => { + // proposal.contributor = this.contributors.findBy('id', proposal.contributorId.toString()); + // return Proposal.create(proposal); + // }); + // }); + // }, getContributions () { return this.kredits.Contribution.all({page: {size: 200}}) diff --git a/app/templates/contributions/resubmit.hbs b/app/templates/contributions/resubmit.hbs new file mode 100644 index 0000000..79f9a46 --- /dev/null +++ b/app/templates/contributions/resubmit.hbs @@ -0,0 +1,13 @@ +

+ +
+
+

Re-submit contribution #{{model.id}}

+
+ +
+ {{add-contribution attributes=attributes contributors=sortedContributors save=(action "save")}} +
+
+ +
diff --git a/app/templates/dashboard/contributions/show.hbs b/app/templates/dashboard/contributions/show.hbs index 27d6307..b0d43b3 100644 --- a/app/templates/dashboard/contributions/show.hbs +++ b/app/templates/dashboard/contributions/show.hbs @@ -42,7 +42,7 @@ kredits will be issued.

- {{link-to "Re-submit contribution …" "signup" class="button small green"}}. + {{link-to "Re-submit contribution …" "contributions.resubmit" model class="button small green"}}.

{{/if}} diff --git a/tests/unit/models/contribution-test.js b/tests/unit/models/contribution-test.js new file mode 100644 index 0000000..4dc28a1 --- /dev/null +++ b/tests/unit/models/contribution-test.js @@ -0,0 +1,27 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import Contribution from 'kredits-web/models/contribution'; + +module('Unit | Model | contribution', function(hooks) { + setupTest(hooks); + + test('iso8601Date', function(assert) { + const model = Contribution.create({ + date: '2019-09-10' + }); + assert.equal(model.iso8601Date, '2019-09-10'); + + model.set('time', '09:33:00.141Z'); + assert.equal(model.iso8601Date, '2019-09-10T09:33:00.141Z'); + }); + + test('jsDate', function(assert) { + const model = Contribution.create({ + date: '2019-09-10', + time: '09:33:00.141Z' + }); + + assert.ok(model.jsDate instanceof Date); + assert.equal(model.jsDate.toISOString(), '2019-09-10T09:33:00.141Z'); + }); +}); diff --git a/tests/unit/routes/contributions/resubmit-test.js b/tests/unit/routes/contributions/resubmit-test.js new file mode 100644 index 0000000..3d3c75d --- /dev/null +++ b/tests/unit/routes/contributions/resubmit-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Route | contributions/resubmit', function(hooks) { + setupTest(hooks); + + test('it exists', function(assert) { + let route = this.owner.lookup('route:contributions/resubmit'); + assert.ok(route); + }); +});