From 8f841522a38e85fa64a7d43a54bc68716004b8bb Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Fri, 6 Apr 2018 14:04:44 +0200 Subject: [PATCH] Refactor add-contributor component to DDAU --- app/components/add-contributor/component.js | 102 +++++++++----------- app/components/add-contributor/template.hbs | 29 +++--- app/controllers/index.js | 11 ++- app/templates/index.hbs | 9 +- app/utils/cps/is-present.js | 8 ++ package-lock.json | 36 ++++--- package.json | 1 + 7 files changed, 101 insertions(+), 95 deletions(-) create mode 100644 app/utils/cps/is-present.js diff --git a/app/components/add-contributor/component.js b/app/components/add-contributor/component.js index 77483fa..bf9dc3b 100644 --- a/app/components/add-contributor/component.js +++ b/app/components/add-contributor/component.js @@ -1,81 +1,67 @@ -import Ember from 'ember'; -import Contributor from 'kredits-web/models/contributor'; +import Component from 'ember-component'; +import computed, { and } from 'ember-computed'; +import injectService from 'ember-service/inject'; +import isPresent from 'kredits-web/utils/cps/is-present'; -const { - Component, - isPresent, - inject: { - service - }, - computed -} = Ember; export default Component.extend({ + kredits: injectService(), - kredits: service(), + // Default attributes used by reset + attributes: { + address: null, + name: null, + kind: 'person', + url: null, + github_username: null, + github_uid: null, + wiki_username: null, + profileHash: null, + isCore: false, + }, - newContributor: null, - inProgress: false, + didInsertElement() { + this._super(...arguments); + this.reset(); + }, - isValidAddress: function() { + isValidAddress: computed('kredits.ethProvider', 'address', function() { // TODO: add proper address validation - return this.get('newContributor.address') !== ''; - }.property('kredits.ethProvider', 'newContributor.address'), - - isValidName: function() { - return isPresent(this.get('newContributor.name')); - }.property('newContributor.name'), - - isValidURL: function() { - return isPresent(this.get('newContributor.url')); - }.property('newContributor.url'), - - isValidGithubUID: function() { - return isPresent(this.get('newContributor.github_uid')); - }.property('newContributor.github_uid'), - - isValidGithubUsername: function() { - return isPresent(this.get('newContributor.github_username')); - }.property('newContributor.github_username'), - - isValidWikiUsername: function() { - return isPresent(this.get('newContributor.wiki_username')); - }.property('newContributor.wiki_username'), - - isValid: computed.and( + return this.get('address') !== ''; + }), + isValidName: isPresent('name'), + isValidURL: isPresent('url'), + isValidGithubUID: isPresent('github_uid'), + isValidGithubUsername: isPresent('github_username'), + isValidWikiUsername: isPresent('wiki_username'), + isValid: and( 'isValidAddress', 'isValidName', 'isValidGithubUID' ), reset: function() { - this.setProperties({ - newContributor: Contributor.create({ kind: 'person' }), - inProgress: false - }); + this.setProperties(this.get('attributes')); }, actions: { - - save() { - if (!this.get('contractInteractionEnabled')) { - alert('Only core team members can add new contributors. Please ask someone to set you up.'); + submit() { + if (!this.get('isValid')) { + alert('Invalid data. Please review and try again.'); return; } - if (this.get('isValid')) { - this.set('inProgress', true); + let attributes = Object.keys(this.get('attributes')); + let contributor = this.getProperties(attributes); + let saved = this.save(contributor); - this.get('kredits').addContributor(this.get('newContributor')).then(contributor => { - this.reset(); - this.get('contributors').pushObject(contributor); - window.scroll(0,0); - }); - } else { - alert('Invalid data. Please review and try again.'); - } + // The promise handles inProgress + this.set('inProgress', saved); + + saved.then(() => { + this.reset(); + window.scroll(0,0); + }); } - } - }); diff --git a/app/components/add-contributor/template.hbs b/app/components/add-contributor/template.hbs index eaa5818..ded7d47 100644 --- a/app/components/add-contributor/template.hbs +++ b/app/components/add-contributor/template.hbs @@ -1,6 +1,9 @@ -
+

- {{input type="checkbox" name="is-core" id="is-core" checked=newContributor.isCore}} + {{input name="is-core" + type="checkbox" + id="is-core" + checked=isCore}} @@ -9,51 +12,53 @@ {{input name="address" type="text" placeholder="0xF18E631Ea191aE4ebE70046Fcb01a436554421BA4" - value=newContributor.address + value=address class=(if isValidAddress 'valid' '')}}

- + +

{{input name="name" type="text" placeholder="Name" - value=newContributor.name + value=name class=(if isValidName 'valid' '')}}

{{input name="url" type="text" placeholder="URL" - value=newContributor.url + value=url class=(if isValidURL 'valid' '')}}

{{input name="github_uid" type="text" placeholder="GitHub UID (123)" - value=newContributor.github_uid + value=github_uid class=(if isValidGithubUID 'valid' '')}}

{{input name="github_username" type="text" placeholder="GitHub username" - value=newContributor.github_username + value=github_username class=(if isValidGithubUsername 'valid' '')}}

{{input name="wiki_username" type="text" placeholder="Wiki Username" - value=newContributor.wiki_username + value=wiki_username class=(if isValidWikiUsername 'valid' '')}}

- {{input type="submit" value=(if inProgress 'Processing' 'Save') disabled=inProgress}} + {{input type="submit" + disabled=(is-pending inProgress) + value=(if (is-pending inProgress) 'Processing' 'Save')}}

diff --git a/app/controllers/index.js b/app/controllers/index.js index 1f2ecda..e502daf 100644 --- a/app/controllers/index.js +++ b/app/controllers/index.js @@ -116,13 +116,18 @@ export default Ember.Controller.extend({ actions: { - confirmProposal(proposalId) { this.get('kredits').vote(proposalId).then(transaction => { window.confirm('Vote submitted to Ethereum blockhain: '+transaction.hash); }); + }, + + save(contributor) { + return this.get('kredits').addContributor(contributor) + .then((contributor) => { + this.get('model.contributors').pushObject(contributor); + return contributor; + }); } - } - }); diff --git a/app/templates/index.hbs b/app/templates/index.hbs index 49817d1..5dfcad5 100644 --- a/app/templates/index.hbs +++ b/app/templates/index.hbs @@ -65,8 +65,11 @@
- {{add-contributor contributors=model.contributors - newContributor=model.newContributor - contractInteractionEnabled=contractInteractionEnabled}} + {{!-- + TODO: + only show the form if currentUser.isCore else show: + Only core team members can add new contributors. Please ask someone to set you up. + --}} + {{add-contributor contributors=model.contributors save=(action 'save')}}
diff --git a/app/utils/cps/is-present.js b/app/utils/cps/is-present.js new file mode 100644 index 0000000..c11e1ea --- /dev/null +++ b/app/utils/cps/is-present.js @@ -0,0 +1,8 @@ +import computed from 'ember-computed'; +import { isPresent } from 'ember-utils'; + +export default function(key) { + return computed(key, function() { + return isPresent(this.get(key)); + }); +} diff --git a/package-lock.json b/package-lock.json index fabcead..c8b812b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3144,6 +3144,11 @@ "safe-buffer": "5.1.1" }, "dependencies": { + "core-util-is": { + "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -3163,13 +3168,6 @@ "safe-buffer": "5.1.1", "string_decoder": "1.0.3", "util-deprecate": "1.0.2" - }, - "dependencies": { - "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - } } }, "string_decoder": { @@ -3462,6 +3460,11 @@ "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, "dependencies": { + "convert-source-map": { + "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", + "integrity": "sha512-8iaBspZWViJD+h8epOgGyXGWH2wSDLzQ8w9qDs/L7W67IfnEeXKu/Q1cPeWpIrRJc9Mvzbn6hKxnL3goD5ncwQ==", + "dev": true + }, "minimatch": { "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-NyXjqu1IwcqH6nv5vmMtaG3iw7kdV3g6MwlUBZkc3Vn5b5AMIWYKfptvzipoyFfhlfOgBQ9zoTxQMravF1QTnw==", @@ -5668,11 +5671,6 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, - "convert-source-map": { - "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", - "integrity": "sha512-8iaBspZWViJD+h8epOgGyXGWH2wSDLzQ8w9qDs/L7W67IfnEeXKu/Q1cPeWpIrRJc9Mvzbn6hKxnL3goD5ncwQ==", - "dev": true - }, "copy-dereference": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/copy-dereference/-/copy-dereference-1.0.0.tgz", @@ -22277,7 +22275,7 @@ "ember-cli-babel": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.12.0.tgz", - "integrity": "sha512-LMwZ3Xf3Q3jQUXaJtLLJsbbhRZRNv/iea64lZ8OgqZp1fh66CSXfmqV3L9QSuYQKPDNqFiu2v6IpOT08C6GU6w==", + "integrity": "sha1-Otzb4SeNofzQuQOPE2DLSsXUQUw=", "dev": true, "requires": { "amd-name-resolver": "0.0.7", @@ -23378,7 +23376,7 @@ "ember-weakmap": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/ember-weakmap/-/ember-weakmap-3.1.1.tgz", - "integrity": "sha512-rfW3A1m3NFsHd/NuHyBkssU0Qf0zGcJmASGfhjZc7fIQeBZvSLIFYZTej+W+YBLPtED9h/SVW63DHTRY5PUR4Q==", + "integrity": "sha1-KubgCAtbgM8NEI93Utxp6pYD29c=", "dev": true, "requires": { "browserslist": "2.11.3", @@ -23389,7 +23387,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -23398,7 +23396,7 @@ "ember-cli-babel": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.12.0.tgz", - "integrity": "sha512-LMwZ3Xf3Q3jQUXaJtLLJsbbhRZRNv/iea64lZ8OgqZp1fh66CSXfmqV3L9QSuYQKPDNqFiu2v6IpOT08C6GU6w==", + "integrity": "sha1-Otzb4SeNofzQuQOPE2DLSsXUQUw=", "dev": true, "requires": { "amd-name-resolver": "0.0.7", @@ -25695,7 +25693,7 @@ } }, "kredits-contracts": { - "version": "github:67P/truffle-kredits#4d2ba2a4bf1bb3ceb1ae9c768abfc73a9cf5ab00", + "version": "github:67P/truffle-kredits#bdd99d58cf601d9fadd81c7f0cbd61e57cf552b5", "dev": true }, "lcid": { @@ -28245,7 +28243,7 @@ }, "slash": { "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, "snapdragon": { @@ -29020,7 +29018,7 @@ }, "trim-right": { "version": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, "true-case-path": { diff --git a/package.json b/package.json index f798f8f..524671d 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "ember-load-initializers": "^0.5.1", "ember-macro-helpers": "0.17.0", "ember-parachute": "0.1.0", + "ember-promise-helpers": "1.0.6", "ember-resolver": "^2.0.3", "ember-truth-helpers": "1.3.0", "ethers": "^3.0.8",