Skip to content

Commit e0acdcc

Browse files
authored
Merge pull request #11734 from mansona/template-tag-codemod
Migrate to `<template>` tag components
2 parents 243abe6 + b6925f2 commit e0acdcc

File tree

232 files changed

+5640
-4664
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

232 files changed

+5640
-4664
lines changed

.ember-cli

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,17 @@
55

66
Setting `disableAnalytics` to true will prevent any data from being sent.
77
*/
8-
"disableAnalytics": false
8+
"disableAnalytics": false,
9+
10+
/**
11+
Setting `componentAuthoringFormat` to "strict" will force the blueprint generators to generate GJS
12+
or GTS files for the component and the component rendering test. "loose" is the default.
13+
*/
14+
"componentAuthoringFormat": "strict",
15+
16+
/**
17+
Setting `routeAuthoringFormat` to "strict" will force the blueprint generators to generate GJS
18+
or GTS templates for routes. "loose" is the default
19+
*/
20+
"routeAuthoringFormat": "strict"
921
}

.git-blame-ignore-revs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
a0efcd29f514b404d568478423ca2c7074287a56
2+
da9ad2f8964594b6cbd75504fc43ae43e141081c
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { fn } from '@ember/helper';
2+
import { on } from '@ember/modifier';
3+
import { service } from '@ember/service';
4+
import Component from '@glimmer/component';
5+
6+
import scopedClass from 'ember-scoped-css/helpers/scoped-class';
7+
import svgJar from 'ember-svg-jar/helpers/svg-jar';
8+
import eq from 'ember-truth-helpers/helpers/eq';
9+
10+
import Dropdown from 'crates-io/components/dropdown';
11+
12+
export default class Header extends Component {
13+
/** @type {import("../services/dark-mode").default} */
14+
@service colorScheme;
15+
16+
colorSchemes = [
17+
{ mode: 'light', svg: 'sun' },
18+
{ mode: 'dark', svg: 'moon' },
19+
{ mode: 'system', svg: 'color-mode' },
20+
];
21+
22+
get icon() {
23+
return this.colorSchemes.find(({ mode }) => mode === this.colorScheme.scheme)?.svg;
24+
}
25+
26+
<template>
27+
<Dropdown data-test-dark-mode-menu ...attributes class='dropdown' as |dd|>
28+
<dd.Trigger @hideArrow={{true}} class='trigger' data-test-dark-mode-toggle>
29+
{{svgJar this.icon class=(scopedClass 'icon')}}
30+
<span class='sr-only'>Change color scheme</span>
31+
</dd.Trigger>
32+
33+
<dd.Menu class='menu' as |menu|>
34+
{{#each this.colorSchemes as |colorScheme|}}
35+
<menu.Item>
36+
<button
37+
class='menu-button button-reset {{if (eq colorScheme.mode this.colorScheme.scheme) "selected"}}'
38+
type='button'
39+
{{on 'click' (fn this.colorScheme.set colorScheme.mode)}}
40+
>
41+
{{svgJar colorScheme.svg class=(scopedClass 'icon')}}
42+
{{colorScheme.mode}}
43+
</button>
44+
</menu.Item>
45+
{{/each}}
46+
</dd.Menu>
47+
</Dropdown>
48+
</template>
49+
}

app/components/color-scheme-menu.hbs

Lines changed: 0 additions & 20 deletions
This file was deleted.

app/components/color-scheme-menu.js

Lines changed: 0 additions & 17 deletions
This file was deleted.

app/components/copy-button.js renamed to app/components/copy-button.gjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import { on } from '@ember/modifier';
12
import { service } from '@ember/service';
23
import Component from '@glimmer/component';
34

45
import { restartableTask } from 'ember-concurrency';
6+
import perform from 'ember-concurrency/helpers/perform';
57

68
export default class CrateTomlCopy extends Component {
79
@service notifications;
@@ -15,4 +17,10 @@ export default class CrateTomlCopy extends Component {
1517
this.notifications.error('Copy to clipboard failed!');
1618
}
1719
});
20+
21+
<template>
22+
<button type='button' ...attributes {{on 'click' (perform this.copyTask)}}>
23+
{{yield}}
24+
</button>
25+
</template>
1826
}

app/components/copy-button.hbs

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { LinkTo } from '@ember/routing';
2+
3+
import scopedClass from 'ember-scoped-css/helpers/scoped-class';
4+
import svgJar from 'ember-svg-jar/helpers/svg-jar';
5+
6+
import formatNum from 'crates-io/helpers/format-num';
7+
8+
<template>
9+
<ul class='list'>
10+
{{#each @crates as |crate|}}
11+
<li>
12+
<LinkTo @route='crate' @model={{crate.id}} class='link'>
13+
{{crate.name}}
14+
({{crate.max_version}})
15+
{{svgJar 'download-arrow' class=(scopedClass 'download-icon')}}
16+
{{formatNum crate.downloads}}
17+
</LinkTo>
18+
</li>
19+
{{/each}}
20+
</ul>
21+
</template>

app/components/crate-downloads-list.hbs

Lines changed: 0 additions & 11 deletions
This file was deleted.

app/components/crate-header.gjs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import { LinkTo } from '@ember/routing';
2+
import { service } from '@ember/service';
3+
import Component from '@glimmer/component';
4+
5+
import { 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';
9+
import { alias } from 'macro-decorators';
10+
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+
16+
export default class CrateHeader extends Component {
17+
@service session;
18+
19+
@alias('loadKeywordsTask.last.value') keywords;
20+
21+
constructor() {
22+
super(...arguments);
23+
24+
this.loadKeywordsTask.perform().catch(() => {
25+
// ignore all errors and just don't display keywords if the request fails
26+
});
27+
}
28+
29+
get isOwner() {
30+
let userId = this.session.currentUser?.id;
31+
return this.args.crate?.hasOwnerUser(userId) ?? false;
32+
}
33+
34+
loadKeywordsTask = task(async () => {
35+
return (await this.args.crate?.keywords) ?? [];
36+
});
37+
38+
<template>
39+
<PageHeader class='header' data-test-heading>
40+
<h1 class='heading'>
41+
<span data-test-crate-name>{{@crate.name}}</span>
42+
{{#if @version}}
43+
<small data-test-crate-version>v{{@version.num}}</small>
44+
45+
{{#if @version.yanked}}
46+
<span class='yanked-badge' data-test-yanked>
47+
{{svgJar 'trash'}}
48+
Yanked
49+
50+
<Tooltip>
51+
This crate has been yanked, but it is still available for download for other crates that may be
52+
depending on it.
53+
</Tooltip>
54+
</span>
55+
{{/if}}
56+
{{/if}}
57+
</h1>
58+
59+
{{#if @crate.description}}
60+
<div class='description'>
61+
{{@crate.description}}
62+
</div>
63+
{{/if}}
64+
65+
{{#if this.keywords}}
66+
<ul class='keywords'>
67+
{{#each this.keywords as |keyword|}}
68+
<li>
69+
<LinkTo @route='keyword' @model={{keyword.id}} data-test-keyword={{keyword.id}}>
70+
<span class='hash'>#</span>{{keyword.id}}
71+
</LinkTo>
72+
</li>
73+
{{/each}}
74+
</ul>
75+
{{/if}}
76+
77+
{{#if this.session.currentUser}}
78+
<FollowButton @crate={{@crate}} class='follow-button' />
79+
{{/if}}
80+
</PageHeader>
81+
82+
<NavTabs aria-label='{{@crate.name}} crate subpages' class='nav' as |nav|>
83+
<nav.Tab
84+
@link={{if @versionNum (link_ 'crate.version' @crate @versionNum) (link_ 'crate.index' @crate)}}
85+
data-test-readme-tab
86+
>
87+
Readme
88+
</nav.Tab>
89+
90+
<nav.Tab @link={{link_ 'crate.versions' @crate}} data-test-versions-tab>
91+
{{pluralize @crate.num_versions 'Version'}}
92+
</nav.Tab>
93+
94+
<nav.Tab
95+
@link={{if
96+
@versionNum
97+
(link_ 'crate.version-dependencies' @crate @versionNum)
98+
(link_ 'crate.dependencies' @crate)
99+
}}
100+
data-test-deps-tab
101+
>
102+
Dependencies
103+
</nav.Tab>
104+
105+
<nav.Tab @link={{link_ 'crate.reverse-dependencies' @crate}} data-test-rev-deps-tab>
106+
Dependents
107+
</nav.Tab>
108+
109+
{{#if this.isOwner}}
110+
<nav.Tab @link={{link_ 'crate.settings' @crate}} data-test-settings-tab>
111+
Settings
112+
</nav.Tab>
113+
{{/if}}
114+
</NavTabs>
115+
</template>
116+
}

0 commit comments

Comments
 (0)