Skip to content

Commit d039e1a

Browse files
Tutorial Updates (#2051)
* Updates to the tutorial so it works on 5.11-beta --- Commit: ember-learn/super-rentals-tutorial@52a367d Script: https://github.com/ember-learn/super-rentals-tutorial/blob/52a367d4067008f3f854bf3ca0b5485e1610c396/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/52a367d4067008f3f854bf3ca0b5485e1610c396/checks * Switch to using a <form> element and FormData rather than <Input> --- Commit: ember-learn/super-rentals-tutorial@a5132bc Script: https://github.com/ember-learn/super-rentals-tutorial/blob/a5132bc00ad27196f28e10cce9c1e9dece1660d1/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/a5132bc00ad27196f28e10cce9c1e9dece1660d1/checks * [CRON] Thursday Sep 05, 2024 --- Commit: ember-learn/super-rentals-tutorial@a5132bc Script: https://github.com/ember-learn/super-rentals-tutorial/blob/a5132bc00ad27196f28e10cce9c1e9dece1660d1/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/a5132bc00ad27196f28e10cce9c1e9dece1660d1/checks * Correct link to finished app --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Monday Sep 09, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Tuesday Sep 10, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Thursday Sep 12, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Friday Sep 13, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Saturday Sep 14, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Sunday Sep 15, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Monday Sep 16, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Tuesday Sep 17, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Wednesday Sep 18, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Friday Sep 20, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Saturday Sep 21, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Sunday Sep 22, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks * [CRON] Monday Sep 23, 2024 --- Commit: ember-learn/super-rentals-tutorial@e076a15 Script: https://github.com/ember-learn/super-rentals-tutorial/blob/e076a153d94e7392fc9657461b261f339e498aef/.github/workflows/build.yml Logs: https://github.com/ember-learn/super-rentals-tutorial/commit/e076a153d94e7392fc9657461b261f339e498aef/checks --------- Co-authored-by: Tomster <tomster@emberjs.com>
1 parent e2d53ec commit d039e1a

File tree

19 files changed

+84
-54
lines changed

19 files changed

+84
-54
lines changed

guides/release/tutorial/part-1/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Welcome to the Ember Tutorial!
44

5-
In this tutorial, we will use Ember to build an application called Super Rentals. This will be a website for browsing interesting places to stay during your next vacation. Check out the [finished app](https://ember-super-rentals.netlify.com) to get a sense of the scope of the project.
5+
In this tutorial, we will use Ember to build an application called Super Rentals. This will be a website for browsing interesting places to stay during your next vacation. Check out the [finished app](https://ember-super-rentals.netlify.app) to get a sense of the scope of the project.
66

77
<img src="/images/tutorial/part-2/provider-components/homepage-with-rentals-component@2x.png" alt="The finished Super Rentals app" width="1024" height="1328">
88

guides/release/tutorial/part-1/interactive-components.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ Ember will create an _instance_ of the class whenever our component is invoked.
5858
```js { data-filename="app/components/rental/image.js" data-diff="-3,+4,+5,+6,+7,+8,+9" }
5959
import Component from '@glimmer/component';
6060

61-
export default class RentalImageComponent extends Component {}
62-
export default class RentalImageComponent extends Component {
61+
export default class RentalImage extends Component {}
62+
export default class RentalImage extends Component {
6363
constructor(...args) {
6464
super(...args);
6565
this.isLarge = false;
@@ -103,7 +103,7 @@ Since this pattern of initializing instance variables in the constructor is pret
103103
```js { data-filename="app/components/rental/image.js" data-diff="-4,-5,-6,-7,+8" }
104104
import Component from '@glimmer/component';
105105

106-
export default class RentalImageComponent extends Component {
106+
export default class RentalImage extends Component {
107107
constructor(...args) {
108108
super(...args);
109109
this.isLarge = false;
@@ -125,7 +125,7 @@ import Component from '@glimmer/component';
125125
import { tracked } from '@glimmer/tracking';
126126
import { action } from '@ember/object';
127127

128-
export default class RentalImageComponent extends Component {
128+
export default class RentalImage extends Component {
129129
isLarge = false;
130130
@tracked isLarge = false;
131131

guides/release/tutorial/part-1/orientation.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ To verify that your installation was successful, run:
2424

2525
```shell
2626
$ ember --version
27-
ember-cli: 5.9.0
28-
node: 18.20.3
27+
ember-cli: 5.11.0
28+
node: 18.20.4
2929
os: linux x64
3030
```
3131

@@ -38,7 +38,7 @@ We can create a new project using Ember CLI's `new` command. It follows the patt
3838
```shell
3939
$ ember new super-rentals --lang en
4040
installing app
41-
Ember CLI v5.9.0
41+
Ember CLI v5.11.0
4242

4343
Creating a new Ember app in /home/runner/work/super-rentals-tutorial/super-rentals-tutorial/dist/code/super-rentals:
4444
create .editorconfig
@@ -206,11 +206,11 @@ As text on the welcome page pointed out, the source code for the page is located
206206
```handlebars { data-filename="app/templates/application.hbs" data-diff="-1,-2,-3,-4,-5,-6,-7,+8" }
207207
{{page-title "SuperRentals"}}
208208
209+
{{outlet}}
210+
209211
{{! The following component displays Ember's default welcome message. }}
210212
<WelcomePage />
211213
{{! Feel free to remove this! }}
212-
213-
{{outlet}}
214214
Hello World!!!
215215
```
216216

guides/release/tutorial/part-1/reusable-components.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,15 @@ Let's start with our JavaScript file:
148148
import Component from '@glimmer/component';
149149
import ENV from 'super-rentals/config/environment';
150150

151-
export default class MapComponent extends Component {}
152-
export default class MapComponent extends Component {
151+
export default class Map extends Component {}
152+
export default class Map extends Component {
153153
get token() {
154154
return encodeURIComponent(ENV.MAPBOX_ACCESS_TOKEN);
155155
}
156156
}
157157
```
158158

159-
Here, we import the access token from the config file and return it from a `token` _[getter](https://javascript.info/property-accessors)_. This allows us to access our token as `this.token` both inside the `MapComponent` class body, as well as the component's template. It is also important to [URL-encode](https://javascript.info/url#encoding-strings) the token, just in case it contains any special characters that are not URL-safe.
159+
Here, we import the access token from the config file and return it from a `token` _[getter](https://javascript.info/property-accessors)_. This allows us to access our token as `this.token` both inside the `Map` class body, as well as the component's template. It is also important to [URL-encode](https://javascript.info/url#encoding-strings) the token, just in case it contains any special characters that are not URL-safe.
160160

161161
## Interpolating Values in Templates
162162

@@ -404,7 +404,7 @@ import ENV from 'super-rentals/config/environment';
404404
405405
const MAPBOX_API = 'https://api.mapbox.com/styles/v1/mapbox/streets-v11/static';
406406

407-
export default class MapComponent extends Component {
407+
export default class Map extends Component {
408408
get src() {
409409
let { lng, lat, width, height, zoom } = this.args;
410410

guides/release/tutorial/part-2/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Hooray, you've made it to the second part of the tutorial! In the following sect
44

55
Along the way, we'll also add some new features to our Super Rentals app. By the end of this section, we'll have implemented some search functionality and refactored a good bit of our code to use some new Ember concepts
66

7-
<img src="/images/tutorial/part-2/provider-components/filtered-results@2x.png" alt="Search functionality in the Super Rentals app" width="1024" height="798">
7+
<img src="/images/tutorial/part-2/provider-components/filtered-results@2x.png" alt="Search functionality in the Super Rentals app" width="1024" height="833">
88

99
In part two, we'll cover the following concepts:
1010

guides/release/tutorial/part-2/provider-components.md

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ In this chapter, we'll work on adding a new search feature, and refactor our `in
44

55
<!-- TODO: make this a gif instead -->
66

7-
<img src="/images/tutorial/part-2/provider-components/filtered-results@2x.png" alt="The Super Rentals app by the end of the chapter" width="1024" height="798">
7+
<img src="/images/tutorial/part-2/provider-components/filtered-results@2x.png" alt="The Super Rentals app by the end of the chapter" width="1024" height="833">
88

99
During this refactor, you will learn about:
1010

11-
- Using Ember's built-in `<Input>` component
11+
- Using forms
1212
- The provider component pattern
1313
- Using block parameters when invoking components
1414
- Yielding data to caller components
@@ -17,20 +17,22 @@ During this refactor, you will learn about:
1717

1818
As our app grows and as we add more features to it, one thing that would be really nice to have is some search functionality. It would be great if our users could just type a word into a search box and our app could just respond with matching and relevant rentals. So how could we go about implementing this feature?
1919

20-
Well, we can start simple. Before we worry about implementing the "search" part of this feature, let's just get something on the page. The first step is to add an `<input>` tag to our `index` page, and make it look pretty with a class.
20+
Well, we can start simple. Before we worry about implementing the "search" part of this feature, let's just get something on the page. The first step is to add a form with an `<input>` tag to our `index` page, and make it look pretty with a class.
2121

22-
```handlebars { data-filename="app/templates/index.hbs" data-diff="+8,+9,+10,+11,+12" }
22+
```handlebars { data-filename="app/templates/index.hbs" data-diff="+8,+9,+10,+11,+12,+13,+14" }
2323
<Jumbo>
2424
<h2>Welcome to Super Rentals!</h2>
2525
<p>We hope you find exactly what you're looking for in a place to stay.</p>
2626
<LinkTo @route="about" class="button">About Us</LinkTo>
2727
</Jumbo>
2828
2929
<div class="rentals">
30-
<label>
31-
<span>Where would you like to stay?</span>
32-
<input class="light">
33-
</label>
30+
<form>
31+
<label>
32+
<span>Where would you like to stay?</span>
33+
<input class="light">
34+
</label>
35+
</form>
3436
3537
<ul class="results">
3638
{{#each @model as |rental|}}
@@ -58,10 +60,12 @@ Let's start simple again and begin our refactor by creating a new template for o
5860

5961
```handlebars { data-filename="app/components/rentals.hbs" }
6062
<div class="rentals">
61-
<label>
62-
<span>Where would you like to stay?</span>
63-
<input class="light">
64-
</label>
63+
<form>
64+
<label>
65+
<span>Where would you like to stay?</span>
66+
<input class="light">
67+
</label>
68+
</form>
6569
6670
<ul class="results">
6771
{{#each @rentals as |rental|}}
@@ -73,18 +77,20 @@ Let's start simple again and begin our refactor by creating a new template for o
7377

7478
There is one minor change to note here: while extracting our markup into a component, we also renamed the `@model` argument to be `@rentals` instead, just in order to be a little more specific about what we're iterating over in our `{{#each}}` loop. Otherwise, all we're doing here is copy-pasting what was on our `index.hbs` page into our new component template. Now we just need to actually use our new component in the index template where we started this whole refactor! Let's render our `<Rentals>` component in our `index.hbs` template.
7579

76-
```handlebars { data-filename="app/templates/index.hbs" data-diff="-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,+19" }
80+
```handlebars { data-filename="app/templates/index.hbs" data-diff="-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,+21" }
7781
<Jumbo>
7882
<h2>Welcome to Super Rentals!</h2>
7983
<p>We hope you find exactly what you're looking for in a place to stay.</p>
8084
<LinkTo @route="about" class="button">About Us</LinkTo>
8185
</Jumbo>
8286
8387
<div class="rentals">
84-
<label>
85-
<span>Where would you like to stay?</span>
86-
<input class="light">
87-
</label>
88+
<form>
89+
<label>
90+
<span>Where would you like to stay?</span>
91+
<input class="light">
92+
</label>
93+
</form>
8894
8995
<ul class="results">
9096
{{#each @model as |rental|}}
@@ -198,28 +204,45 @@ Now, if we try running our tests, they should all pass after making this change.
198204

199205
<img src="/images/tutorial/part-2/provider-components/pass-1@2x.png" alt="The new test is passing." width="1024" height="1024">
200206

201-
## Using Ember's `<Input>`
207+
## Using a `form`
202208

203-
Now that we have our component all set up, we can finally wire up our search box and store our search query! First things first: let's create a component class to store our query state.
209+
Now that we have our component all set up, we can finally wire up our search box and store our search query! First things first: let's create a component class to store our query state and handle events from the `form` element:
204210

205211
```js { data-filename="app/components/rentals.js" }
206212
import Component from '@glimmer/component';
207213
import { tracked } from '@glimmer/tracking';
214+
import { action } from '@ember/object';
208215

209-
export default class RentalsComponent extends Component {
216+
export default class Rentals extends Component {
210217
@tracked query = '';
218+
219+
@action
220+
updateQuery(event) {
221+
let formData = new FormData(event.currentTarget);
222+
this.query = formData.get('rental-search-term');
223+
}
224+
225+
@action
226+
handleSubmit(event) {
227+
event.preventDefault();
228+
this.updateQuery(event);
229+
}
211230
}
212231
```
213232

214233
Next, we'll wire up our query state in the component template.
215234

216-
```handlebars { data-filename="app/components/rentals.hbs" data-diff="-4,+5" }
235+
```handlebars { data-filename="app/components/rentals.hbs" data-diff="-2,+3,-6,+7,+9" }
217236
<div class="rentals">
218-
<label>
219-
<span>Where would you like to stay?</span>
220-
<input class="light">
221-
<Input @value={{this.query}} class="light" />
222-
</label>
237+
<form>
238+
<form {{on "input" this.updateQuery}} {{on "submit" this.handleSubmit}}>
239+
<label>
240+
<span>Where would you like to stay?</span>
241+
<input class="light">
242+
<input name="rental-search-term" class="light">
243+
</label>
244+
<p>The results below will update as you type.</p>
245+
</form>
223246
224247
<ul class="results">
225248
{{#each @rentals as |rental|}}
@@ -229,9 +252,7 @@ Next, we'll wire up our query state in the component template.
229252
</div>
230253
```
231254

232-
Interesting! There are a few things happening in this one-line template change. First, we're moving from using a plain HTML `<input>` tag to using an `<Input>` tag instead! As it turns out, Ember provides us with a helpful little _[`<Input>` component](../../../components/built-in-components/#toc_input)_ for this exact use case. The `<Input>` component is actually just a wrapper around the `<input>` element.
233-
234-
Ember's `<Input>` component is pretty neat; it will wire up things behind the scenes such that, whenever the user types something into the input box, `this.query` changes accordingly. In other words, `this.query` is kept in sync with the value of what is being searched; we finally have the perfect way of storing the state of our search query!
255+
[`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData) is a built-in JavaScript object for handling forms. It requires the `name` attribute on the `input`. We handle both `submit` and `input` events for the form so that the query updates both when the user types into the input and when they submit the form.
235256

236257
<div class="cta">
237258
<div class="cta-note">
@@ -252,7 +273,7 @@ Now that our search query is wired up to our `<Rentals>` component, we can get i
252273
```js { data-filename="app/components/rentals/filter.js" }
253274
import Component from '@glimmer/component';
254275

255-
export default class RentalsFilterComponent extends Component {
276+
export default class RentalsFilter extends Component {
256277
get results() {
257278
let { rentals, query } = this.args;
258279

@@ -275,12 +296,15 @@ In our component template, we are not actually _rendering_ anything. Instead, we
275296

276297
Well, in order to answer this question, let's look at how the data that we're yielding is being used in the `<Rentals>` component.
277298

278-
```handlebars { data-filename="app/components/rentals.hbs" data-diff="-8,-9,-10,+11,+12,+13,+14,+15" }
299+
```handlebars { data-filename="app/components/rentals.hbs" data-diff="-11,-12,-13,+14,+15,+16,+17,+18" }
279300
<div class="rentals">
280-
<label>
281-
<span>Where would you like to stay?</span>
282-
<Input @value={{this.query}} class="light" />
283-
</label>
301+
<form {{on "input" this.updateQuery}} {{on "submit" this.handleSubmit}}>
302+
<label>
303+
<span>Where would you like to stay?</span>
304+
<input name="rental-search-term" class="light">
305+
</label>
306+
<p>The results below will update as you type.</p>
307+
</form>
284308
285309
<ul class="results">
286310
{{#each @rentals as |rental|}}
@@ -330,7 +354,7 @@ This is called the _provider component pattern_, which we see in action with one
330354

331355
Okay, now that we have a better sense of which component is rendering what and the theory behind why all of this is happening, let's answer the big unanswered question: does this even work? If we try out our search box in the UI, what happens?
332356

333-
<img src="/images/tutorial/part-2/provider-components/filtered-results@2x.png" alt="Trying out the search box." width="1024" height="798">
357+
<img src="/images/tutorial/part-2/provider-components/filtered-results@2x.png" alt="Trying out the search box." width="1024" height="833">
334358

335359
Hooray, it works! Awesome. Now that we've tried this out manually in the UI, let's write a test for this new behavior as well.
336360

guides/release/tutorial/part-2/service-injection.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ Whew! Let's look at the JavaScript class next.
8383
```js { data-filename="app/components/share-button.js" data-diff="-3,+4,+5,+6,+7,+8,+9,+10,+11,+12,+13,+14,+15,+16,+17,+18,+19,+20,+21,+22,+23,+24,+25,+26,+27,+28,+29,+30" }
8484
import Component from '@glimmer/component';
8585

86-
export default class ShareButtonComponent extends Component {}
86+
export default class ShareButton extends Component {}
8787
const TWEET_INTENT = 'https://twitter.com/intent/tweet';
8888

89-
export default class ShareButtonComponent extends Component {
89+
export default class ShareButton extends Component {
9090
get currentURL() {
9191
return window.location.href;
9292
}
@@ -324,7 +324,7 @@ import Component from '@glimmer/component';
324324

325325
const TWEET_INTENT = 'https://twitter.com/intent/tweet';
326326

327-
export default class ShareButtonComponent extends Component {
327+
export default class ShareButton extends Component {
328328
@service router;
329329

330330
get currentURL() {

public/downloads/style.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ p {
129129
font-style: italic;
130130
}
131131

132+
.rentals form p {
133+
font-size: 80%;
134+
display: block;
135+
text-align: center;
136+
}
137+
132138
.rentals input {
133139
padding: 11px;
134140
font-size: 18px;
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

0 commit comments

Comments
 (0)