diff --git a/app/components/donation-goals.js b/app/components/donation-goals.js index 899fdd4d8..7d5a7fa42 100644 --- a/app/components/donation-goals.js +++ b/app/components/donation-goals.js @@ -3,7 +3,7 @@ import Ember from 'ember'; const { Component, computed: { - and, alias, bool, filterBy, not, notEmpty, setDiff, sort + alias, filterBy, not, notEmpty, setDiff, sort } } = Ember; @@ -49,12 +49,10 @@ export default Component.extend({ /** * Indicates if the user can activate donations for this project. * - * This is possible if at least one donation goal has been added. - * * @property canActivateDonations * @type {Boolean} */ - canActivateDonations: and('hasExistingDonationGoals', '_donationsInactive'), + canActivateDonations: alias('project.canActivateDonations'), /** * Indicates if the user can cancel adding or editing a donation goal. @@ -86,8 +84,6 @@ export default Component.extend({ hasExistingDonationGoals: notEmpty('_existingDonationGoals'), _currentlyEditingDonationGoals: notEmpty('_editedDonationGoals'), - _donationsActive: bool('project.stripeConnectPlan.id'), - _donationsInactive: not('_donationsActive'), _editedDonationGoals: filterBy('project.donationGoals', 'isEditing'), _existingDonationGoals: setDiff('project.donationGoals', '_newDonationGoals'), _newDonationGoals: filterBy('project.donationGoals', 'isNew') diff --git a/app/controllers/project/settings/donations/goals.js b/app/controllers/project/settings/donations/goals.js index 0a9accdc2..bd1ef9840 100644 --- a/app/controllers/project/settings/donations/goals.js +++ b/app/controllers/project/settings/donations/goals.js @@ -75,10 +75,6 @@ export default Controller.extend({ } }, - reloadAccount() { - get(this, 'stripeConnectAccount').reload(); - }, - /** * Action which commits changes to a donation goal. * diff --git a/app/models/project.js b/app/models/project.js index a993d03dd..83fe24465 100644 --- a/app/models/project.js +++ b/app/models/project.js @@ -7,6 +7,7 @@ const { computed, computed: { alias, filterBy, gt }, get } = Ember; export default Model.extend({ base64IconData: attr(), + canActivateDonations: attr(), closedTasksCount: attr('number'), description: attr(), donationsActive: attr(), diff --git a/app/styles/components/project-menu.scss b/app/styles/components/project-menu.scss index bde6d2a0e..23dd33ddd 100644 --- a/app/styles/components/project-menu.scss +++ b/app/styles/components/project-menu.scss @@ -18,7 +18,7 @@ display: block; font-weight: 500; margin-bottom: -1px; - padding: 6px 14px; + padding: 6px 10px; text-decoration: none; &.active { diff --git a/app/templates/components/payments/account-setup.hbs b/app/templates/components/payments/account-setup.hbs index d0382100d..7cad0a332 100644 --- a/app/templates/components/payments/account-setup.hbs +++ b/app/templates/components/payments/account-setup.hbs @@ -20,3 +20,9 @@ stripeConnectAccount=stripeConnectAccount submit=(action onBankAccountInformationSubmitted) }} + +{{#if project.canActivateDonations}} +

Start taking donations

+

Go set your donation goals and start accepting donations now.

+ {{link-to 'Donations' 'project.settings.donations.goals' project class='button default activate-donations'}} +{{/if}} diff --git a/app/templates/project/settings/donations/payments.hbs b/app/templates/project/settings/donations/payments.hbs index f6095ab66..e15d85cbc 100644 --- a/app/templates/project/settings/donations/payments.hbs +++ b/app/templates/project/settings/donations/payments.hbs @@ -6,6 +6,7 @@ onRecipientDetailsSubmitted=(action 'onRecipientDetailsSubmitted') onVerificationDocumentSubmitted=(action 'onVerificationDocumentSubmitted') organizationName=project.organization.name + project=project stripeConnectAccount=stripeConnectAccount }} diff --git a/tests/acceptance/project-donation-goals-test.js b/tests/acceptance/project-donation-goals-test.js index 4ac4fc6b2..cc84bc79e 100644 --- a/tests/acceptance/project-donation-goals-test.js +++ b/tests/acceptance/project-donation-goals-test.js @@ -186,7 +186,8 @@ test('it allows activating donations for the project', function(assert) { let project = createProjectWithSluggedRoute(); let { organization } = project; - server.createList('donation-goal', 1, { project }); + project.attrs.canActivateDonations = true; + project.save(); authenticateAsMemberOfRole(this.application, server, organization, 'owner'); diff --git a/tests/integration/components/donation-goals-test.js b/tests/integration/components/donation-goals-test.js index 6d5de6f35..84da9364a 100644 --- a/tests/integration/components/donation-goals-test.js +++ b/tests/integration/components/donation-goals-test.js @@ -248,20 +248,16 @@ test('it calls provided "add" action with project as parameter when add button i this.$('.add').click(); }); -test('it allows activating donations if there are persisted records', function(assert) { +test('it allows activating donations if canActivateDonations is true', function(assert) { assert.expect(2); - let mockGoals = [ - Object.create({ isEditing: false, isLoaded: true, isNew: false }) - ]; - function activateDonationsHandler() { assert.ok(true, 'Action was called when button was clicked'); } setHandlers(this, { activateDonationsHandler }); - set(this, 'project', Object.create({ donationGoals: mockGoals })); + set(this, 'project', Object.create({ canActivateDonations: true })); this.render(hbs`{{donation-goals activateDonations=activateDonationsHandler add=addHandler edit=editHandler project=project}}`); @@ -270,14 +266,10 @@ test('it allows activating donations if there are persisted records', function(a this.$('.activate-donations').click(); }); -test('it prevents activating donations if there are no persisted records', function(assert) { +test('it prevents activating donations if canActivateDonations is false', function(assert) { assert.expect(1); - let mockGoals = [ - Object.create({ isEditing: false, isLoaded: true, isNew: true }) - ]; - - set(this, 'project', Object.create({ donationGoals: mockGoals })); + set(this, 'project', Object.create({ canActivateDonations: false })); this.render(hbs`{{donation-goals add=addHandler edit=editHandler project=project}}`); diff --git a/tests/integration/components/payments/account-setup-test.js b/tests/integration/components/payments/account-setup-test.js index 8dc3ae7c0..f510301a3 100644 --- a/tests/integration/components/payments/account-setup-test.js +++ b/tests/integration/components/payments/account-setup-test.js @@ -32,6 +32,7 @@ function renderPage() { onRecipientDetailsSubmitted=onRecipientDetailsSubmitted onVerificationDocumentSubmitted=onVerificationDocumentSubmitted organizationName=project.organization.name + project=project stripeConnectAccount=stripeConnectAccount }} `); @@ -181,3 +182,13 @@ test('it works properly when account is fully verified', function(assert) { assert.ok(page.rendersFundsRecipientVerified, 'Funds recipient component is rendered in verified state.'); assert.ok(page.rendersBankAccountVerified, 'Bank account component is rendered in verified state.'); }); + +test('it renders a link to set up donation goals when possible', function(assert) { + assert.expect(1); + + this.set('project', { canActivateDonations: true }); + + renderPage(); + + assert.ok(page.rendersLinkToDonationGoals, 'Renders link to donation goals.'); +}); diff --git a/tests/pages/components/payments/account-setup.js b/tests/pages/components/payments/account-setup.js index d03abaf59..4600102ac 100644 --- a/tests/pages/components/payments/account-setup.js +++ b/tests/pages/components/payments/account-setup.js @@ -19,6 +19,8 @@ export default { rendersFundsRecipientVerified: isVisible('.funds-recipient.account-setup__section--verified'), rendersFundsRecipientVerifying: isVisible('.funds-recipient.account-setup__section--verifying'), + rendersLinkToDonationGoals: isVisible('a.activate-donations'), + createAccount, bankAccount, contactInfo, diff --git a/tests/unit/models/project-test.js b/tests/unit/models/project-test.js index 674ca1e70..e2a29d4bc 100644 --- a/tests/unit/models/project-test.js +++ b/tests/unit/models/project-test.js @@ -29,10 +29,10 @@ test('it exists', function(assert) { }); testForAttributes('project', [ - 'base64IconData', 'closedTasksCount', 'description', 'donationsActive', - 'iconLargeUrl', 'iconThumbUrl', 'longDescriptionBody', - 'longDescriptionMarkdown', 'openTasksCount', 'slug', 'title', - 'totalMonthlyDonated' + 'base64IconData', 'canActivateDonations', 'closedTasksCount', + 'description', 'donationsActive', 'iconLargeUrl', 'iconThumbUrl', + 'longDescriptionBody', 'longDescriptionMarkdown', 'openTasksCount', + 'slug', 'title', 'totalMonthlyDonated' ]); testForBelongsTo('project', 'organization');