1+ import { LinkTo } from ' @ember/routing' ;
12import { service } from ' @ember/service' ;
23import Component from ' @glimmer/component' ;
34
45import { task } from ' ember-concurrency' ;
6+ import pluralize from ' ember-inflector/helpers/pluralize' ;
7+ import link_ from ' ember-link/helpers/link' ;
8+ import svgJar from ' ember-svg-jar/helpers/svg-jar' ;
59import { alias } from ' macro-decorators' ;
610
11+ import FollowButton from ' crates-io/components/follow-button' ;
12+ import NavTabs from ' crates-io/components/nav-tabs' ;
13+ import PageHeader from ' crates-io/components/page-header' ;
14+ import Tooltip from ' crates-io/components/tooltip' ;
15+
716export default class CrateHeader extends Component {
17+ <template >
18+ <PageHeader class =' header' data-test-heading >
19+ <h1 class =' heading' >
20+ <span data-test-crate-name >{{@ crate.name }} </span >
21+ {{#if @ version }}
22+ <small data-test-crate-version >v{{@ version.num }} </small >
23+
24+ {{#if @ version.yanked }}
25+ <span class =' yanked-badge' data-test-yanked >
26+ {{svgJar ' trash' }}
27+ Yanked
28+
29+ <Tooltip >
30+ This crate has been yanked, but it is still available for download for other crates that may be
31+ depending on it.
32+ </Tooltip >
33+ </span >
34+ {{/if }}
35+ {{/if }}
36+ </h1 >
37+
38+ {{#if @ crate.description }}
39+ <div class =' description' >
40+ {{@ crate.description }}
41+ </div >
42+ {{/if }}
43+
44+ {{#if this . keywords }}
45+ <ul class =' keywords' >
46+ {{#each this . keywords as | keyword | }}
47+ <li >
48+ <LinkTo @ route =' keyword' @ model ={{keyword.id }} data-test-keyword ={{keyword.id }} >
49+ <span class =' hash' >#</span >{{keyword.id }}
50+ </LinkTo >
51+ </li >
52+ {{/each }}
53+ </ul >
54+ {{/if }}
55+
56+ {{#if this . session.currentUser }}
57+ <FollowButton @ crate ={{@ crate }} class =' follow-button' />
58+ {{/if }}
59+ </PageHeader >
60+
61+ <NavTabs aria-label =' {{@ crate.name }} crate subpages' class =' nav' as | nav | >
62+ <nav.Tab
63+ @ link ={{if @ versionNum ( link _ ' crate.version' @ crate @ versionNum) ( link _ ' crate.index' @ crate) }}
64+ data-test-readme-tab
65+ >
66+ Readme
67+ </nav.Tab >
68+
69+ <nav.Tab @ link ={{link_ ' crate.versions' @ crate}} data-test-versions-tab >
70+ {{pluralize @ crate.num_versions ' Version' }}
71+ </nav.Tab >
72+
73+ <nav.Tab
74+ @ link ={{if
75+ @ versionNum
76+ ( link _ ' crate.version-dependencies' @ crate @ versionNum)
77+ ( link _ ' crate.dependencies' @ crate)
78+ }}
79+ data-test-deps-tab
80+ >
81+ Dependencies
82+ </nav.Tab >
83+
84+ <nav.Tab @ link ={{link_ ' crate.reverse-dependencies' @ crate}} data-test-rev-deps-tab >
85+ Dependents
86+ </nav.Tab >
87+
88+ {{#if this . isOwner }}
89+ <nav.Tab @ link ={{link_ ' crate.settings' @ crate}} data-test-settings-tab >
90+ Settings
91+ </nav.Tab >
92+ {{/if }}
93+ </NavTabs >
94+ </template >
895 @service session;
996
1097 @alias (' loadKeywordsTask.last.value' ) keywords;
@@ -26,84 +113,3 @@ export default class CrateHeader extends Component {
26113 return (await this .args .crate ? .keywords ) ?? [];
27114 });
28115}
29-
30- < PageHeader class = " header" data- test- heading>
31- < h1 class = " heading" >
32- < span data- test- crate- name> {{@crate .name }}< / span>
33- {{#if @version}}
34- < small data- test- crate- version> v{{@version .num }}< / small>
35-
36- {{#if @version .yanked }}
37- < span class = " yanked-badge" data- test- yanked>
38- {{svg- jar " trash" }}
39- Yanked
40-
41- < Tooltip>
42- This crate has been yanked, but it is still available for download for other crates that
43- may be depending on it.
44- < / Tooltip>
45- < / span>
46- {{/ if }}
47- {{/ if }}
48- < / h1>
49-
50- {{#if @crate .description }}
51- < div class = " description" >
52- {{@crate .description }}
53- < / div>
54- {{/ if }}
55-
56- {{#if this .keywords }}
57- < ul class = " keywords" >
58- {{#each this .keywords as | keyword| }}
59- < li>
60- < LinkTo @route= " keyword" @model= {{keyword .id }} data- test- keyword= {{keyword .id }}>
61- < span class = " hash" > #< / span> {{keyword .id }}
62- < / LinkTo>
63- < / li>
64- {{/ each}}
65- < / ul>
66- {{/ if }}
67-
68- {{#if this .session .currentUser }}
69- < FollowButton @crate= {{@crate}} class = " follow-button" / >
70- {{/ if }}
71- < / PageHeader>
72-
73- < NavTabs aria- label= " {{@crate.name}} crate subpages" class = " nav" as | nav| >
74- < nav .Tab
75- @link= {{if
76- @versionNum
77- (link " crate.version" @crate @versionNum)
78- (link " crate.index" @crate)
79- }}
80- data- test- readme- tab
81- >
82- Readme
83- < / nav .Tab >
84-
85- < nav .Tab @link= {{link " crate.versions" @crate}} data- test- versions- tab>
86- {{pluralize @crate .num_versions " Version" }}
87- < / nav .Tab >
88-
89- < nav .Tab
90- @link= {{if
91- @versionNum
92- (link " crate.version-dependencies" @crate @versionNum)
93- (link " crate.dependencies" @crate)
94- }}
95- data- test- deps- tab
96- >
97- Dependencies
98- < / nav .Tab >
99-
100- < nav .Tab @link= {{link " crate.reverse-dependencies" @crate}} data- test- rev- deps- tab>
101- Dependents
102- < / nav .Tab >
103-
104- {{#if this .isOwner }}
105- < nav .Tab @link= {{link " crate.settings" @crate}} data- test- settings- tab>
106- Settings
107- < / nav .Tab >
108- {{/ if }}
109- < / NavTabs>
0 commit comments