diff --git a/app/controllers/crate/settings.js b/app/controllers/crate/settings.js index f421e246d0f..1fd26ab7200 100644 --- a/app/controllers/crate/settings.js +++ b/app/controllers/crate/settings.js @@ -1,5 +1,7 @@ import Controller from '@ember/controller'; +import { action } from '@ember/object'; import { service } from '@ember/service'; +import { tracked } from '@glimmer/tracking'; import { task } from 'ember-concurrency'; @@ -8,6 +10,12 @@ export default class CrateSettingsController extends Controller { crate = null; username = ''; + @tracked addOwnerVisible = false; + + @action showAddOwnerForm() { + this.addOwnerVisible = true; + this.username = ''; + } addOwnerTask = task(async () => { const username = this.username; @@ -20,6 +28,7 @@ export default class CrateSettingsController extends Controller { } else { this.notifications.success(`An invite has been sent to ${username}`); } + this.addOwnerVisible = false; } catch (error) { let detail = error.errors?.[0]?.detail; if (detail && !detail.startsWith('{')) { diff --git a/app/styles/crate/settings.module.css b/app/styles/crate/settings.module.css index 6ace00a8453..699bbff540d 100644 --- a/app/styles/crate/settings.module.css +++ b/app/styles/crate/settings.module.css @@ -1,3 +1,9 @@ +.owners-header { + display: flex; + justify-content: space-between; + align-items: center; +} + .email-form { display: flex; justify-content: space-between; @@ -8,6 +14,7 @@ background-color: light-dark(white, #141413); border-radius: var(--space-3xs); box-shadow: 0 1px 3px light-dark(hsla(51, 90%, 42%, .35), #232321); + margin-bottom: var(--space-s); } .email-input-label { diff --git a/app/templates/crate/settings.hbs b/app/templates/crate/settings.hbs index 4d3b5a9cefa..29eaa2cacd6 100644 --- a/app/templates/crate/settings.hbs +++ b/app/templates/crate/settings.hbs @@ -2,17 +2,22 @@ -

Add Owner

- -
- - - -
+
+

Owners

+ {{#unless this.addOwnerVisible}} + + {{/unless}} +
-

Owners

+{{#if this.addOwnerVisible}} +
+ + + +
+{{/if}}
{{#each this.crate.owner_team as |team|}} diff --git a/e2e/acceptance/settings/add-owner.spec.ts b/e2e/acceptance/settings/add-owner.spec.ts index 43f53cbdf0f..fb975266dc3 100644 --- a/e2e/acceptance/settings/add-owner.spec.ts +++ b/e2e/acceptance/settings/add-owner.spec.ts @@ -19,12 +19,14 @@ test.describe('Acceptance | Settings | Add Owner', { tag: '@acceptance' }, () => test('attempting to add owner without username', async ({ page }) => { await page.goto('/crates/nanomsg/settings'); + await page.click('[data-test-add-owner-button]'); await page.fill('input[name="username"]', ''); await expect(page.locator('[data-test-save-button]')).toBeDisabled(); }); test('attempting to add non-existent owner', async ({ page }) => { await page.goto('/crates/nanomsg/settings'); + await page.click('[data-test-add-owner-button]'); await page.fill('input[name="username"]', 'spookyghostboo'); await page.click('[data-test-save-button]'); @@ -39,6 +41,7 @@ test.describe('Acceptance | Settings | Add Owner', { tag: '@acceptance' }, () => msw.db.user.create({ name: 'iain8' }); await page.goto('/crates/nanomsg/settings'); + await page.click('[data-test-add-owner-button]'); await page.fill('input[name="username"]', 'iain8'); await page.click('[data-test-save-button]'); @@ -54,6 +57,7 @@ test.describe('Acceptance | Settings | Add Owner', { tag: '@acceptance' }, () => msw.db.team.create({ org: 'rust-lang', name: 'crates-io' }); await page.goto('/crates/nanomsg/settings'); + await page.click('[data-test-add-owner-button]'); await page.fill('input[name="username"]', 'github:rust-lang:crates-io'); await page.click('[data-test-save-button]'); diff --git a/tests/acceptance/settings/add-owner-test.js b/tests/acceptance/settings/add-owner-test.js index d1cc9051707..b7810aa0770 100644 --- a/tests/acceptance/settings/add-owner-test.js +++ b/tests/acceptance/settings/add-owner-test.js @@ -30,6 +30,7 @@ module('Acceptance | Settings | Add Owner', function (hooks) { prepare(this); await visit('/crates/nanomsg/settings'); + await click('[data-test-add-owner-button]'); await fillIn('input[name="username"]', ''); assert.dom('[data-test-save-button]').isDisabled(); }); @@ -38,6 +39,7 @@ module('Acceptance | Settings | Add Owner', function (hooks) { prepare(this); await visit('/crates/nanomsg/settings'); + await click('[data-test-add-owner-button]'); await fillIn('input[name="username"]', 'spookyghostboo'); await click('[data-test-save-button]'); @@ -54,6 +56,7 @@ module('Acceptance | Settings | Add Owner', function (hooks) { this.db.user.create({ name: 'iain8' }); await visit('/crates/nanomsg/settings'); + await click('[data-test-add-owner-button]'); await fillIn('input[name="username"]', 'iain8'); await click('[data-test-save-button]'); @@ -69,6 +72,7 @@ module('Acceptance | Settings | Add Owner', function (hooks) { this.db.team.create({ org: 'rust-lang', name: 'crates-io' }); await visit('/crates/nanomsg/settings'); + await click('[data-test-add-owner-button]'); await fillIn('input[name="username"]', 'github:rust-lang:crates-io'); await click('[data-test-save-button]'); diff --git a/tests/routes/crate/settings-test.js b/tests/routes/crate/settings-test.js index 4147d45db9f..77e6e7d52df 100644 --- a/tests/routes/crate/settings-test.js +++ b/tests/routes/crate/settings-test.js @@ -46,8 +46,7 @@ module('Route | crate.settings', hooks => { await visit(`/crates/${crate.name}/settings`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings`); - // This is the Add Owner button. - assert.dom('[data-test-save-button]').exists(); + assert.dom('[data-test-add-owner-button]').exists(); assert.dom('[data-test-owners]').exists(); assert.dom(`[data-test-owner-user="${user.login}"]`).exists(); assert.dom('[data-test-remove-owner-button]').exists();