Skip to content

Commit 3d60712

Browse files
committed
app: Add Rebuild Docs action button
1 parent 2a8ac02 commit 3d60712

File tree

5 files changed

+83
-0
lines changed

5 files changed

+83
-0
lines changed

app/components/version-list/row.hbs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,18 @@
128128
<menu.Item>
129129
<YankButton @version={{@version}} class="button-reset" local-class="menu-button" />
130130
</menu.Item>
131+
<menu.Item>
132+
<button
133+
class="button-reset"
134+
local-class="menu-button"
135+
type="button"
136+
disabled={{@version.rebuildDocsTask.isRunning}}
137+
data-test-id="btn-rebuild-docs"
138+
{{on 'click' (perform this.rebuildDocsTask)}}
139+
>
140+
Rebuild Docs
141+
</button>
142+
</menu.Item>
131143
</dd.Menu>
132144
</Dropdown>
133145
</PrivilegedAction>

app/components/version-list/row.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import { htmlSafe } from '@ember/template';
44
import Component from '@glimmer/component';
55
import { tracked } from '@glimmer/tracking';
66

7+
import { keepLatestTask } from 'ember-concurrency';
8+
79
import styles from './row.module.css';
810

911
export default class VersionRow extends Component {
12+
@service notifications;
1013
@service session;
1114

1215
@tracked focused = false;
@@ -59,4 +62,16 @@ export default class VersionRow extends Component {
5962
@action setFocused(value) {
6063
this.focused = value;
6164
}
65+
66+
rebuildDocsTask = keepLatestTask(async () => {
67+
let { version } = this.args;
68+
try {
69+
await version.rebuildDocs();
70+
this.notifications.success('Docs rebuild task was enqueued successfully!');
71+
} catch (error) {
72+
let reason = error?.errors?.[0]?.detail ?? 'Failed to equeue docs rebuild task.';
73+
let msg = `Error: ${reason}`;
74+
this.notifications.error(msg);
75+
}
76+
});
6277
}

app/models/version.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,8 @@ export default class Version extends Model {
200200
this.store.pushPayload(payload);
201201
await waitForPromise(this.releaseTracks.refreshTask.perform(this.crateName, false));
202202
});
203+
204+
async rebuildDocs() {
205+
return await waitForPromise(apiAction(this, { method: 'POST', path: 'rebuild_docs' }));
206+
}
203207
}

e2e/acceptance/versions.spec.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,31 @@ test.describe('Acceptance | crate versions page', { tag: '@acceptance' }, () =>
6868
await expect(v020).not.toHaveClass(/.*latest/);
6969
await expect(v020).not.toHaveClass(/.yanked/);
7070
});
71+
72+
test('triggers a rebuild for crate documentation', async ({ page, msw }) => {
73+
let user = msw.db.user.create();
74+
await msw.authenticateAs(user);
75+
76+
let crate = msw.db.crate.create({ name: 'nanomsg' });
77+
msw.db.crateOwnership.create({ crate, user });
78+
79+
msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' });
80+
msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' });
81+
msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' });
82+
msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' });
83+
84+
await page.goto('/crates/nanomsg/versions');
85+
await expect(page).toHaveURL('/crates/nanomsg/versions');
86+
87+
await expect(page.locator('[data-test-version]')).toHaveCount(4);
88+
let versions = await page.locator('[data-test-version]').evaluateAll(el => el.map(it => it.dataset.testVersion));
89+
expect(versions).toEqual(['0.2.1', '0.3.0', '0.2.0', '0.1.0']);
90+
91+
let v021 = page.locator('[data-test-version="0.2.1"]');
92+
await v021.locator('[data-test-actions-toggle]').click();
93+
await v021.getByRole('button', { name: 'Rebuild Docs' }).click();
94+
95+
let message = 'Docs rebuild task was enqueued successfully!';
96+
await expect(page.locator('[data-test-notification-message="success"]')).toHaveText(message);
97+
});
7198
});

tests/acceptance/versions-test.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,29 @@ module('Acceptance | crate versions page', function (hooks) {
8181
.hasNoClass(/.*latest/)
8282
.hasNoClass(/.yanked/);
8383
});
84+
85+
test('triggers a rebuild for crate documentation', async function (assert) {
86+
let user = this.db.user.create();
87+
this.authenticateAs(user);
88+
89+
let crate = this.db.crate.create({ name: 'nanomsg' });
90+
this.db.crateOwnership.create({ crate, user });
91+
92+
this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' });
93+
this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' });
94+
this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' });
95+
this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' });
96+
97+
await visit('/crates/nanomsg/versions');
98+
assert.strictEqual(currentURL(), '/crates/nanomsg/versions');
99+
100+
let versions = findAll('[data-test-version]').map(it => it.dataset.testVersion);
101+
assert.deepEqual(versions, ['0.2.1', '0.3.0', '0.2.0', '0.1.0']);
102+
103+
await click('[data-test-version="0.2.1"] [data-test-actions-toggle]');
104+
await click('[data-test-version="0.2.1"] [data-test-id="btn-rebuild-docs"]');
105+
106+
let message = 'Docs rebuild task was enqueued successfully!';
107+
assert.dom('[data-test-notification-message="success"]').hasText(message);
108+
});
84109
});

0 commit comments

Comments
 (0)