Skip to content

Commit 1c9d7e5

Browse files
authored
Merge pull request #6415 from Turbo87/yanked-version-display
Show README and metadata for yanked crates/versions
2 parents b9efced + 730089d commit 1c9d7e5

File tree

5 files changed

+138
-105
lines changed

5 files changed

+138
-105
lines changed

app/components/crate-header.hbs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@
33
<span data-test-crate-name>{{@crate.name}}</span>
44
{{#if @version}}
55
<small data-test-crate-version>v{{@version.num}}</small>
6+
7+
{{#if @version.yanked}}
8+
<span local-class="yanked-badge" data-test-yanked>
9+
{{svg-jar "trash"}}
10+
Yanked
11+
12+
<EmberTooltip>
13+
This crate has been yanked, but it is still available for download for other crates that
14+
may be depending on it.
15+
</EmberTooltip>
16+
</span>
17+
{{/if}}
618
{{/if}}
719
</h1>
820

app/components/crate-header.module.css

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,26 @@
1212
}
1313
}
1414

15+
.yanked-badge {
16+
background: #d30000;
17+
border-radius: 99999px;
18+
padding: var(--space-3xs) var(--space-s);
19+
font-size: var(--space-s);
20+
color: white;
21+
align-self: center;
22+
display: inline-flex;
23+
align-items: center;
24+
gap: var(--space-3xs);
25+
white-space: nowrap;
26+
cursor: default;
27+
28+
svg {
29+
width: 1em;
30+
height: 1em;
31+
flex-shrink: 0;
32+
}
33+
}
34+
1535
.description {
1636
margin-top: var(--space-xs);
1737
line-height: 1.35;

app/styles/application.module.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,7 @@ noscript {
180180
flex-direction: column;
181181
padding: var(--main-layout-padding);
182182
}
183+
184+
:global(.ember-tooltip) {
185+
font-weight: normal;
186+
}

app/templates/crate/version.hbs

Lines changed: 92 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -6,115 +6,102 @@
66
@versionNum={{this.requestedVersion}}
77
/>
88

9-
{{#if this.currentVersion.yanked}}
10-
<div>
11-
<p>
12-
This crate has been yanked, but it is still available for download for other crates that
13-
may be depending on it.
14-
</p>
15-
<p>
16-
You may wish to <LinkTo @route="crate.versions" @model={{this.crate}}>view all versions</LinkTo> to find
17-
one that has not been yanked.
18-
</p>
9+
<div local-class='crate-info'>
10+
<div local-class="docs" data-test-docs>
11+
{{#if this.loadReadmeTask.isRunning}}
12+
<div local-class="readme-spinner">
13+
<Placeholder local-class="placeholder-title" />
14+
<Placeholder local-class="placeholder-text" />
15+
<Placeholder local-class="placeholder-text" />
16+
<Placeholder local-class="placeholder-text" />
17+
<Placeholder local-class="placeholder-text" />
18+
<Placeholder local-class="placeholder-text" />
19+
<Placeholder local-class="placeholder-subtitle" />
20+
<Placeholder local-class="placeholder-text" />
21+
<Placeholder local-class="placeholder-text" />
22+
<Placeholder local-class="placeholder-text" />
23+
</div>
24+
{{else if this.readme}}
25+
<article aria-label="Readme" data-test-readme>
26+
<RenderedHtml @html={{this.readme}} local-class="readme" />
27+
</article>
28+
{{else}}
29+
<div local-class="no-readme" data-test-no-readme>
30+
{{this.crate.name}} v{{this.currentVersion.num}} appears to have no <code>README.md</code> file
31+
</div>
32+
{{/if}}
1933
</div>
20-
{{else}}
21-
<div local-class='crate-info'>
22-
<div local-class="docs">
23-
{{#if this.loadReadmeTask.isRunning}}
24-
<div local-class="readme-spinner">
25-
<Placeholder local-class="placeholder-title" />
26-
<Placeholder local-class="placeholder-text" />
27-
<Placeholder local-class="placeholder-text" />
28-
<Placeholder local-class="placeholder-text" />
29-
<Placeholder local-class="placeholder-text" />
30-
<Placeholder local-class="placeholder-text" />
31-
<Placeholder local-class="placeholder-subtitle" />
32-
<Placeholder local-class="placeholder-text" />
33-
<Placeholder local-class="placeholder-text" />
34-
<Placeholder local-class="placeholder-text" />
35-
</div>
36-
{{else if this.readme}}
37-
<article aria-label="Readme" data-test-readme>
38-
<RenderedHtml @html={{this.readme}} local-class="readme" />
39-
</article>
40-
{{else}}
41-
<div local-class="no-readme" data-test-no-readme>
42-
{{this.crate.name}} v{{this.currentVersion.num}} appears to have no <code>README.md</code> file
43-
</div>
44-
{{/if}}
45-
</div>
4634

47-
<CrateSidebar
48-
@crate={{this.crate}}
49-
@version={{this.currentVersion}}
50-
@requestedVersion={{this.requestedVersion}}
51-
local-class="sidebar"
52-
/>
53-
</div>
35+
<CrateSidebar
36+
@crate={{this.crate}}
37+
@version={{this.currentVersion}}
38+
@requestedVersion={{this.requestedVersion}}
39+
local-class="sidebar"
40+
/>
41+
</div>
5442

55-
<div local-class='crate-downloads'>
56-
<div local-class='stats'>
57-
{{#if this.downloadsContext.num}}
58-
<h3 data-test-crate-stats-label>
59-
Stats Overview for {{this.downloadsContext.num}}
60-
<LinkTo @route="crate" @model={{this.crate}}>(see all)</LinkTo>
61-
</h3>
43+
<div local-class='crate-downloads'>
44+
<div local-class='stats'>
45+
{{#if this.downloadsContext.num}}
46+
<h3 data-test-crate-stats-label>
47+
Stats Overview for {{this.downloadsContext.num}}
48+
<LinkTo @route="crate" @model={{this.crate}}>(see all)</LinkTo>
49+
</h3>
6250

63-
{{else}}
64-
<h3 data-test-crate-stats-label>Stats Overview</h3>
65-
{{/if}}
66-
<div local-class='stat'>
67-
<span local-class='num'>
68-
{{svg-jar "download"}}
69-
<span local-class="num__align">{{ format-num this.downloadsContext.downloads }}</span>
70-
</span>
71-
<span local-class="stat-description">Downloads all time</span>
72-
</div>
73-
<div local-class='stat'>
74-
<span local-class="num">
75-
{{svg-jar "crate"}}
76-
<span local-class="num__align">{{ this.crate.versions.length }}</span>
77-
</span>
78-
<span local-class="stat-description">Versions published</span>
79-
</div>
51+
{{else}}
52+
<h3 data-test-crate-stats-label>Stats Overview</h3>
53+
{{/if}}
54+
<div local-class='stat'>
55+
<span local-class='num'>
56+
{{svg-jar "download"}}
57+
<span local-class="num__align">{{ format-num this.downloadsContext.downloads }}</span>
58+
</span>
59+
<span local-class="stat-description">Downloads all time</span>
8060
</div>
81-
<div local-class='graph'>
82-
<h4>Downloads over the last 90 days</h4>
83-
<div local-class="toggle-stacked">
84-
<span local-class="toggle-stacked-label">Display as </span>
85-
<Dropdown as |dd|>
86-
<dd.Trigger local-class="trigger">
87-
<span local-class="trigger-label">
88-
{{#if this.stackedGraph}}
89-
Stacked
90-
{{else}}
91-
Unstacked
92-
{{/if}}
93-
</span>
94-
</dd.Trigger>
95-
<dd.Menu as |menu|>
96-
<menu.Item>
97-
<button
98-
type="button"
99-
local-class="dropdown-button"
100-
{{on "click" this.setStackedGraph}}
101-
>
102-
Stacked
103-
</button>
104-
</menu.Item>
105-
<menu.Item>
106-
<button
107-
type="button"
108-
local-class="dropdown-button"
109-
{{on "click" this.setUnstackedGraph}}
110-
>
111-
Unstacked
112-
</button>
113-
</menu.Item>
114-
</dd.Menu>
115-
</Dropdown>
116-
</div>
117-
<DownloadGraph @data={{this.downloads}} @stacked={{this.stackedGraph}} local-class="graph-data" />
61+
<div local-class='stat'>
62+
<span local-class="num">
63+
{{svg-jar "crate"}}
64+
<span local-class="num__align">{{ this.crate.versions.length }}</span>
65+
</span>
66+
<span local-class="stat-description">Versions published</span>
67+
</div>
68+
</div>
69+
<div local-class='graph'>
70+
<h4>Downloads over the last 90 days</h4>
71+
<div local-class="toggle-stacked">
72+
<span local-class="toggle-stacked-label">Display as </span>
73+
<Dropdown as |dd|>
74+
<dd.Trigger local-class="trigger">
75+
<span local-class="trigger-label">
76+
{{#if this.stackedGraph}}
77+
Stacked
78+
{{else}}
79+
Unstacked
80+
{{/if}}
81+
</span>
82+
</dd.Trigger>
83+
<dd.Menu as |menu|>
84+
<menu.Item>
85+
<button
86+
type="button"
87+
local-class="dropdown-button"
88+
{{on "click" this.setStackedGraph}}
89+
>
90+
Stacked
91+
</button>
92+
</menu.Item>
93+
<menu.Item>
94+
<button
95+
type="button"
96+
local-class="dropdown-button"
97+
{{on "click" this.setUnstackedGraph}}
98+
>
99+
Unstacked
100+
</button>
101+
</menu.Item>
102+
</dd.Menu>
103+
</Dropdown>
118104
</div>
105+
<DownloadGraph @data={{this.downloads}} @stacked={{this.stackedGraph}} local-class="graph-data" />
119106
</div>
120-
{{/if}}
107+
</div>

tests/routes/crate/version/model-test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ module('Route | crate.version | model() hook', function (hooks) {
1919
assert.strictEqual(currentURL(), `/crates/foo/1.2.3`);
2020
assert.dom('[data-test-crate-name]').hasText('foo');
2121
assert.dom('[data-test-crate-version]').hasText('v1.2.3');
22+
assert.dom('[data-test-yanked]').exists();
23+
assert.dom('[data-test-docs]').exists();
2224
assert.dom('[data-test-notification-message]').doesNotExist();
2325
});
2426

@@ -49,6 +51,8 @@ module('Route | crate.version | model() hook', function (hooks) {
4951
assert.strictEqual(currentURL(), `/crates/foo`);
5052
assert.dom('[data-test-crate-name]').hasText('foo');
5153
assert.dom('[data-test-crate-version]').hasText('v2.0.0');
54+
assert.dom('[data-test-yanked]').doesNotExist();
55+
assert.dom('[data-test-docs]').exists();
5256
assert.dom('[data-test-notification-message]').doesNotExist();
5357
});
5458

@@ -62,6 +66,8 @@ module('Route | crate.version | model() hook', function (hooks) {
6266
assert.strictEqual(currentURL(), `/crates/foo`);
6367
assert.dom('[data-test-crate-name]').hasText('foo');
6468
assert.dom('[data-test-crate-version]').hasText('v1.0.0');
69+
assert.dom('[data-test-yanked]').doesNotExist();
70+
assert.dom('[data-test-docs]').exists();
6571
assert.dom('[data-test-notification-message]').doesNotExist();
6672
});
6773

@@ -77,6 +83,8 @@ module('Route | crate.version | model() hook', function (hooks) {
7783
assert.strictEqual(currentURL(), `/crates/foo`);
7884
assert.dom('[data-test-crate-name]').hasText('foo');
7985
assert.dom('[data-test-crate-version]').hasText('v2.0.0-beta.2');
86+
assert.dom('[data-test-yanked]').doesNotExist();
87+
assert.dom('[data-test-docs]').exists();
8088
assert.dom('[data-test-notification-message]').doesNotExist();
8189
});
8290

@@ -90,6 +98,8 @@ module('Route | crate.version | model() hook', function (hooks) {
9098
assert.strictEqual(currentURL(), `/crates/foo`);
9199
assert.dom('[data-test-crate-name]').hasText('foo');
92100
assert.dom('[data-test-crate-version]').hasText('v2.0.0-beta.1');
101+
assert.dom('[data-test-yanked]').exists();
102+
assert.dom('[data-test-docs]').exists();
93103
assert.dom('[data-test-notification-message]').doesNotExist();
94104
});
95105
});

0 commit comments

Comments
 (0)