Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions app/controllers/crate/settings.js
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -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;
Expand All @@ -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('{')) {
Expand Down
7 changes: 7 additions & 0 deletions app/styles/crate/settings.module.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
.owners-header {
display: flex;
justify-content: space-between;
align-items: center;
}

.email-form {
display: flex;
justify-content: space-between;
Expand All @@ -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 {
Expand Down
25 changes: 15 additions & 10 deletions app/templates/crate/settings.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,22 @@

<CrateHeader @crate={{this.crate}} />

<h2>Add Owner</h2>

<form local-class="email-form" {{on "submit" (prevent-default (perform this.addOwnerTask))}}>
<label local-class="email-input-label" for='new-owner-username'>
Username
</label>
<Input @type="text" id="new-owner-username" @value={{this.username}} placeholder="Username" local-class="email-input" name="username" />
<button type="submit" disabled={{not this.username}} class="button button--small" data-test-save-button>Save</button>
</form>
<div local-class="owners-header">
<h2>Owners</h2>
{{#unless this.addOwnerVisible}}
<button type="button" class="button button--small" data-test-add-owner-button {{on "click" this.showAddOwnerForm}}>Add Owner</button>
{{/unless}}
</div>

<h2>Owners</h2>
{{#if this.addOwnerVisible}}
<form local-class="email-form" {{on "submit" (prevent-default (perform this.addOwnerTask))}}>
<label local-class="email-input-label" for='new-owner-username'>
Username
</label>
<Input @type="text" id="new-owner-username" @value={{this.username}} placeholder="Username" local-class="email-input" name="username" />
<button type="submit" disabled={{not this.username}} class="button button--small" data-test-save-button>Save</button>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tend to like specific verbs on forms, so maybe:

Suggested change
<button type="submit" disabled={{not this.username}} class="button button--small" data-test-save-button>Save</button>
<button type="submit" disabled={{not this.username}} class="button button--small" data-test-save-button>Add Owner</button>

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hahaha, I have a commit here already for a follow-up PR that pretty much does that 😂

</form>
{{/if}}

<div local-class='list' data-test-owners>
{{#each this.crate.owner_team as |team|}}
Expand Down
4 changes: 4 additions & 0 deletions e2e/acceptance/settings/add-owner.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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]');

Expand All @@ -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]');

Expand All @@ -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]');

Expand Down
4 changes: 4 additions & 0 deletions tests/acceptance/settings/add-owner-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});
Expand All @@ -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]');

Expand All @@ -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]');

Expand All @@ -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]');

Expand Down
3 changes: 1 addition & 2 deletions tests/routes/crate/settings-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Loading