WEBVTT

1
00:00:01.340 --> 00:00:05.310
<v Jonas>Welcome to the last video of this project.</v>

2
00:00:05.310 --> 00:00:09.120
And so, let's finish this section by learning a little bit

3
00:00:09.120 --> 00:00:13.120
about how we can write some documentation for our code,

4
00:00:13.120 --> 00:00:16.070
in order to make our code easy to understand

5
00:00:16.070 --> 00:00:18.130
also for other people,

6
00:00:18.130 --> 00:00:20.950
and then, at the end of the video, I will again

7
00:00:20.950 --> 00:00:23.780
show you some challenges and some improvements

8
00:00:23.780 --> 00:00:26.823
that you can implement on this application on your own.

9
00:00:28.690 --> 00:00:32.640
So, there is a standard way of writing documentation

10
00:00:32.640 --> 00:00:37.280
for JavaScript functions and that is called JSDocs.

11
00:00:37.280 --> 00:00:41.420
So, let me choose one function here for which

12
00:00:41.420 --> 00:00:45.140
I'm gonna write some documentation and that's going to be

13
00:00:45.140 --> 00:00:46.973
this render function.

14
00:00:47.980 --> 00:00:49.420
So this one.

15
00:00:49.420 --> 00:00:52.060
So of course I'm not gonna document now

16
00:00:52.060 --> 00:00:54.540
the entire code base, but let me just show you

17
00:00:54.540 --> 00:00:57.990
how it works with this function here.

18
00:00:57.990 --> 00:01:02.990
And, we can also go to JSDoc.app, for that's JSDoc.app,

19
00:01:08.840 --> 00:01:12.710
and so, here you can find some more information besides

20
00:01:12.710 --> 00:01:14.260
what I'm going to show you now.

21
00:01:15.110 --> 00:01:18.630
So to write documentation, we basically write a

22
00:01:18.630 --> 00:01:23.270
multiline comment like this, and then a second star,

23
00:01:23.270 --> 00:01:27.390
and then you see that automatically, a JSDoc comment

24
00:01:27.390 --> 00:01:29.380
is initialized here.

25
00:01:29.380 --> 00:01:32.680
And so, if we hit enter, then you see that already

26
00:01:33.840 --> 00:01:36.810
this has a prefilled some code here.

27
00:01:36.810 --> 00:01:37.860
You see?

28
00:01:37.860 --> 00:01:41.850
So data and render are actually already the parameters

29
00:01:41.850 --> 00:01:44.130
that we have here.

30
00:01:44.130 --> 00:01:47.090
So VS code automatically found them.

31
00:01:47.090 --> 00:01:48.110
Right?

32
00:01:48.110 --> 00:01:51.453
But let's start with a quick description of this function,

33
00:01:52.300 --> 00:01:57.300
let's say, render the received object to the DOM.

34
00:02:00.810 --> 00:02:03.220
Then here the data, we can describe it

35
00:02:03.220 --> 00:02:07.760
inside of this calibrasis, so we can say

36
00:02:07.760 --> 00:02:10.700
that we expect an object here, or,

37
00:02:10.700 --> 00:02:13.840
we also expect an array of objects.

38
00:02:13.840 --> 00:02:16.993
And so that is represented with the 'or' symbol here,

39
00:02:17.910 --> 00:02:20.743
and then again object, and then array.

40
00:02:21.640 --> 00:02:24.330
So again, this means that we are expecting

41
00:02:24.330 --> 00:02:26.460
an array of objects.

42
00:02:26.460 --> 00:02:29.250
Then this here is the name of the parameter

43
00:02:30.320 --> 00:02:32.810
and then here after that we can also write

44
00:02:32.810 --> 00:02:34.760
a short description.

45
00:02:34.760 --> 00:02:35.963
So the data,

46
00:02:38.980 --> 00:02:39.873
to be rendered.

47
00:02:41.160 --> 00:02:45.600
For example a recipe. Okay?

48
00:02:45.600 --> 00:02:48.530
Then we have render here as well,

49
00:02:48.530 --> 00:02:51.400
and so here again we can define its type,

50
00:02:51.400 --> 00:02:53.373
and this one is a Boolean.

51
00:02:54.350 --> 00:02:58.100
Now, this parameter is actually optional and so,

52
00:02:58.100 --> 00:03:02.660
we can put that here, inside of these brackets,

53
00:03:02.660 --> 00:03:06.170
and we can also specify then here, the default value

54
00:03:06.170 --> 00:03:07.063
like this.

55
00:03:09.660 --> 00:03:12.883
So, another description here, so if false,

56
00:03:13.830 --> 00:03:16.893
create markup string,

57
00:03:18.900 --> 00:03:21.683
instead of rendering to the DOM.

58
00:03:22.520 --> 00:03:26.331
Now, you might ask, what is the big advantage of this,

59
00:03:26.331 --> 00:03:28.900
and of course the most obvious one, is that

60
00:03:28.900 --> 00:03:31.530
if you're working with someone else on your project,

61
00:03:31.530 --> 00:03:34.360
they can now more easily understand what exactly

62
00:03:34.360 --> 00:03:36.110
your function is doing.

63
00:03:36.110 --> 00:03:39.510
Because, this standard way of writing it,

64
00:03:39.510 --> 00:03:41.290
everyone understands.

65
00:03:41.290 --> 00:03:44.950
Or at least everyone that is familiar with this

66
00:03:44.950 --> 00:03:47.030
JSDoc format.

67
00:03:47.030 --> 00:03:49.580
Because, if everyone describes their function

68
00:03:49.580 --> 00:03:52.600
in the same way, using this standard, then,

69
00:03:52.600 --> 00:03:55.670
that becomes really easy for everyone to understand

70
00:03:55.670 --> 00:03:57.573
the documentation of each other.

71
00:03:59.120 --> 00:04:02.510
Now what's also great about this, is that JavaScript

72
00:04:02.510 --> 00:04:05.900
or actually VS code, takes this data,

73
00:04:05.900 --> 00:04:08.220
and then when we hover over the function,

74
00:04:08.220 --> 00:04:12.170
it will take that data, and give us this nice overview

75
00:04:12.170 --> 00:04:13.223
of the function.

76
00:04:14.180 --> 00:04:16.920
So here you can see that parameter is data,

77
00:04:16.920 --> 00:04:20.200
and then with the description, and here the same,

78
00:04:20.200 --> 00:04:22.023
also to the script and for render,

79
00:04:23.040 --> 00:04:26.560
here we can also see that the render is optional,

80
00:04:26.560 --> 00:04:30.050
so we have this question mark, and it should be a Boolean.

81
00:04:30.050 --> 00:04:30.883
Okay?

82
00:04:30.883 --> 00:04:34.210
And then for the data, we can also see that it receives

83
00:04:34.210 --> 00:04:37.850
any or an array of any type.

84
00:04:37.850 --> 00:04:41.300
And the same happens when we, take a look at that

85
00:04:41.300 --> 00:04:42.603
in some other file.

86
00:04:44.160 --> 00:04:46.150
So it looks a little bit different,

87
00:04:46.150 --> 00:04:48.733
but the main information, is still here.

88
00:04:50.590 --> 00:04:51.490
Okay?

89
00:04:51.490 --> 00:04:53.550
But we can add more, than just

90
00:04:53.550 --> 00:04:55.860
the description of these parameters.

91
00:04:55.860 --> 00:04:59.780
For example, we can also write, or describe

92
00:04:59.780 --> 00:05:01.293
what this function returns.

93
00:05:02.630 --> 00:05:05.053
And so usually, it doesn't return anything,

94
00:05:06.020 --> 00:05:08.320
and so that's then undefined, but,

95
00:05:08.320 --> 00:05:10.360
it might also be a string.

96
00:05:10.360 --> 00:05:14.013
And so that in case, that render here is set to false.

97
00:05:15.480 --> 00:05:16.313
Right?

98
00:05:17.840 --> 00:05:22.713
Let's write that here, is returned,

99
00:05:24.810 --> 00:05:27.683
if render, is false.

100
00:05:28.760 --> 00:05:33.760
Next, we can also define the this keyword so,

101
00:05:33.800 --> 00:05:36.190
I think this is another interesting one,

102
00:05:36.190 --> 00:05:38.880
and so here the this keyword points,

103
00:05:38.880 --> 00:05:40.603
to the Vue object itself,

104
00:05:42.810 --> 00:05:45.013
so let's just write Vue object,

105
00:05:46.010 --> 00:05:47.573
so let's see what happens then.

106
00:05:49.080 --> 00:05:52.220
Oh and here, object is basically the description

107
00:05:53.690 --> 00:05:57.650
so here, it expects the type basically.

108
00:05:57.650 --> 00:06:00.577
So let's actually put here, that it is an object,

109
00:06:00.577 --> 00:06:04.170
and so then here we can say that it's a Vue,

110
00:06:04.170 --> 00:06:05.333
let's say instance.

111
00:06:08.250 --> 00:06:11.263
Alright, so that makes more sense.

112
00:06:12.170 --> 00:06:14.660
And here, you already can see that the function

113
00:06:14.660 --> 00:06:17.773
is going to return either undefined or a string.

114
00:06:19.530 --> 00:06:23.090
So let's try another one, and you see there are a lot of

115
00:06:23.090 --> 00:06:26.090
different options, and again, you can check them out

116
00:06:26.090 --> 00:06:28.970
in the website that I just told you,

117
00:06:28.970 --> 00:06:31.070
but another one that I like is the author,

118
00:06:33.050 --> 00:06:37.110
and so here you can put your own name,

119
00:06:37.110 --> 00:06:39.760
and just to finish, there is another one called todo,

120
00:06:40.680 --> 00:06:42.440
and so here we can specify,

121
00:06:42.440 --> 00:06:44.970
everything that we still need to do.

122
00:06:44.970 --> 00:06:48.903
Let's just say finish, the implementation.

123
00:06:50.170 --> 00:06:52.120
And so again, when we come here,

124
00:06:52.120 --> 00:06:54.710
it then contains all of this data,

125
00:06:54.710 --> 00:06:56.693
at the same, when we see it here.

126
00:06:58.840 --> 00:06:59.970
Alright?

127
00:06:59.970 --> 00:07:04.180
And so, in your own projects, you can go ahead and add,

128
00:07:04.180 --> 00:07:07.530
maybe not all of this but, at least part,

129
00:07:07.530 --> 00:07:09.130
to some of your functions.

130
00:07:09.130 --> 00:07:11.490
Like at least the most important ones

131
00:07:11.490 --> 00:07:13.860
so that when you come back to them, in like

132
00:07:13.860 --> 00:07:18.650
one or five years or so, that you can still know

133
00:07:18.650 --> 00:07:20.460
what exactly they do.

134
00:07:20.460 --> 00:07:24.450
And what data they get in and what hey output.

135
00:07:24.450 --> 00:07:28.120
Alright. And that's it for this project.

136
00:07:28.120 --> 00:07:31.380
Now, here in package.json, remember we also have

137
00:07:31.380 --> 00:07:35.340
this build command, so basically to actually build

138
00:07:35.340 --> 00:07:37.580
the final project files like

139
00:07:37.580 --> 00:07:40.520
with compression and tree shaking and all of that,

140
00:07:40.520 --> 00:07:43.000
before we then deploy it to a server.

141
00:07:43.000 --> 00:07:45.800
But we will actually do that in the next section

142
00:07:45.800 --> 00:07:48.360
and so for now, let's leave it like this

143
00:07:48.360 --> 00:07:51.223
and really call this application finished now.

144
00:07:52.970 --> 00:07:56.180
However, before we go, once again,

145
00:07:56.180 --> 00:08:00.130
I have a couple of ideas for features and improvements

146
00:08:00.130 --> 00:08:03.030
that you can implement in this application.

147
00:08:03.030 --> 00:08:06.240
So let's start with some easy changes and then

148
00:08:06.240 --> 00:08:09.183
all the way to really complex feature additions.

149
00:08:10.100 --> 00:08:13.820
So to start, you could display the number of pages

150
00:08:13.820 --> 00:08:16.820
between the two pagination buttons.

151
00:08:16.820 --> 00:08:19.890
And so with that, the user would then immediately know,

152
00:08:19.890 --> 00:08:22.770
how many ages there are, which is a little bit more

153
00:08:22.770 --> 00:08:24.570
user friendly.

154
00:08:24.570 --> 00:08:28.460
Also about the search results, you could add the ability,

155
00:08:28.460 --> 00:08:32.560
for the user to sort the search results by the duration

156
00:08:32.560 --> 00:08:36.990
or by the number of ingredients of the found recipes.

157
00:08:36.990 --> 00:08:39.920
However, that data is actually not available

158
00:08:39.920 --> 00:08:43.820
on the search results, well, unless I do some changes

159
00:08:43.820 --> 00:08:46.210
to the API I guess.

160
00:08:46.210 --> 00:08:49.560
So maybe I might do that so you can actually implement

161
00:08:49.560 --> 00:08:51.270
this idea here.

162
00:08:51.270 --> 00:08:55.140
Otherwise, you would have to basically get this information

163
00:08:55.140 --> 00:08:57.960
for all of the recipes in the search results

164
00:08:57.960 --> 00:09:00.650
but that that would require quite a lot of work

165
00:09:00.650 --> 00:09:04.120
and also a lot of API calls.

166
00:09:04.120 --> 00:09:08.070
Next, another thing that you could do, is to perform

167
00:09:08.070 --> 00:09:11.540
the validation of ingredients, right in the view

168
00:09:11.540 --> 00:09:14.700
so, before actually submitting the form.

169
00:09:14.700 --> 00:09:18.660
So for example, while the user is inputting the ingredients,

170
00:09:18.660 --> 00:09:22.220
you could warn the ahead of time, that for example

171
00:09:22.220 --> 00:09:23.710
the format is wrong.

172
00:09:23.710 --> 00:09:28.260
And so that would then again, be a little bit user friendly.

173
00:09:28.260 --> 00:09:31.960
Also, maybe alternatively, you could actually improve

174
00:09:31.960 --> 00:09:34.370
the input of the ingredients.

175
00:09:34.370 --> 00:09:38.170
So instead of having the quantity unit and description

176
00:09:38.170 --> 00:09:42.070
all in one field, you could add a different field for

177
00:09:42.070 --> 00:09:43.950
these three data points,

178
00:09:43.950 --> 00:09:47.030
and then read all that data into your application.

179
00:09:47.030 --> 00:09:50.470
And, besides that, you could also allow for more

180
00:09:50.470 --> 00:09:52.320
than six ingredients.

181
00:09:52.320 --> 00:09:55.410
So there's a lot to improve, I guess,

182
00:09:55.410 --> 00:09:58.300
here in the @recipe functionality.

183
00:09:58.300 --> 00:10:00.100
But of course here in the videos,

184
00:10:00.100 --> 00:10:03.430
I had to keep it kinda simple in order not to make

185
00:10:03.430 --> 00:10:05.133
like a 20 hour project.

186
00:10:06.210 --> 00:10:07.043
Okay.

187
00:10:07.043 --> 00:10:10.010
So these are some of the more simpler improvements

188
00:10:10.010 --> 00:10:12.450
you can make, and now, let's talk about

189
00:10:12.450 --> 00:10:15.620
four additional features that could be implemented

190
00:10:15.620 --> 00:10:17.380
in this application.

191
00:10:17.380 --> 00:10:21.060
And the first one would be a shopping list feature.

192
00:10:21.060 --> 00:10:24.440
So somewhere on each recipe, you could have a button

193
00:10:24.440 --> 00:10:28.010
which would then add all the ingredients of that recipe,

194
00:10:28.010 --> 00:10:29.950
to some kind of list.

195
00:10:29.950 --> 00:10:32.150
And so, you could then display that list

196
00:10:32.150 --> 00:10:36.930
on the user interface for example, in another hidden panel

197
00:10:36.930 --> 00:10:40.740
in the menu bar besides the bookmarks for example,

198
00:10:40.740 --> 00:10:44.120
and so that list would then contain all the ingredients

199
00:10:44.120 --> 00:10:47.240
that you might add from different recipes.

200
00:10:47.240 --> 00:10:50.173
And actually, the original version of Forkify,

201
00:10:50.173 --> 00:10:54.040
that I had in my previous course, had this functionality,

202
00:10:54.040 --> 00:10:57.300
but in this version too I had to remove that feature,

203
00:10:57.300 --> 00:11:01.530
in order to make place for the add recipe functionality

204
00:11:01.530 --> 00:11:05.493
which is new and which I think is way more important.

205
00:11:06.330 --> 00:11:09.450
Now, the next feature that you can try to implement,

206
00:11:09.450 --> 00:11:12.610
is a weekly meal planning feature.

207
00:11:12.610 --> 00:11:15.900
So, you can make this as crazy as you would like

208
00:11:15.900 --> 00:11:19.690
but, in the easiest form, you would simply assign recipes

209
00:11:19.690 --> 00:11:23.430
to the next seven days, and then show them somewhere

210
00:11:23.430 --> 00:11:25.470
on a weekly calender.

211
00:11:25.470 --> 00:11:29.370
And for this one, you could add like a drop down menu to

212
00:11:29.370 --> 00:11:31.970
each of the recipes and from there,

213
00:11:31.970 --> 00:11:35.530
choose which of the next seven days, you want to assign

214
00:11:35.530 --> 00:11:37.300
that recipe to.

215
00:11:37.300 --> 00:11:41.620
And then, in the menu bar, you could again have like a panel

216
00:11:41.620 --> 00:11:44.350
which shows the next seven days and then

217
00:11:44.350 --> 00:11:48.030
which of the recipes was assigned to each day.

218
00:11:48.030 --> 00:11:51.520
But of course you could make it also a lot more complex.

219
00:11:51.520 --> 00:11:53.960
This is just the first simple implementation

220
00:11:53.960 --> 00:11:55.283
that comes to my mind.

221
00:11:56.120 --> 00:12:00.060
And now finally, so, actually I have three features for you

222
00:12:00.060 --> 00:12:01.470
and not four.

223
00:12:01.470 --> 00:12:04.370
And this last one is the most complex one,

224
00:12:04.370 --> 00:12:08.670
and it is to get nutrition data, for each ingredient

225
00:12:08.670 --> 00:12:12.710
of a certain recipe from a special food API.

226
00:12:12.710 --> 00:12:15.570
And the best API for food that I know

227
00:12:15.570 --> 00:12:18.450
is the spoonacular API.

228
00:12:18.450 --> 00:12:20.630
So, you could check out their website,

229
00:12:20.630 --> 00:12:23.510
and their documentation, and from there,

230
00:12:23.510 --> 00:12:27.790
for each of the ingredients for example, get the calories.

231
00:12:27.790 --> 00:12:30.890
And then, you could calculate the total calories,

232
00:12:30.890 --> 00:12:34.750
of one recipe and maybe also per serving.

233
00:12:34.750 --> 00:12:39.060
And there is a lot of other different and interesting stuff

234
00:12:39.060 --> 00:12:42.930
that you could do, with this application together with the

235
00:12:42.930 --> 00:12:44.830
spoonacular API.

236
00:12:44.830 --> 00:12:47.490
So, the possibilities are endless here,

237
00:12:47.490 --> 00:12:49.470
if you want to have some fun.

238
00:12:49.470 --> 00:12:50.750
Alright?

239
00:12:50.750 --> 00:12:54.540
So, these are just some of my suggestions, but I'm sure

240
00:12:54.540 --> 00:12:57.240
that you can come up with even more.

241
00:12:57.240 --> 00:12:59.900
So, I've seen some really creative stuff from

242
00:12:59.900 --> 00:13:03.400
students of this course in other projects.

243
00:13:03.400 --> 00:13:05.500
And hopefully, you can come up with

244
00:13:05.500 --> 00:13:07.083
some of your own as well.

245
00:13:08.130 --> 00:13:11.220
And with this, we now actually reach the end

246
00:13:11.220 --> 00:13:15.040
of this biggest project, of this course.

247
00:13:15.040 --> 00:13:19.290
And I hope that you had as much fun building it, as I had

248
00:13:19.290 --> 00:13:22.820
while going through this, together with you.

249
00:13:22.820 --> 00:13:26.970
And this is really a great, great achievement.

250
00:13:26.970 --> 00:13:28.350
Really well done.

251
00:13:28.350 --> 00:13:30.280
Congratulations.

252
00:13:30.280 --> 00:13:33.340
So, even if you just coded along with me,

253
00:13:33.340 --> 00:13:36.430
you still learned a tremendous amount of skills

254
00:13:36.430 --> 00:13:40.580
throughout this project and of course throughout the entire

255
00:13:40.580 --> 00:13:45.400
last like 50 or 60 hours of course videos.

256
00:13:45.400 --> 00:13:49.080
And now, I would really love to see your implementation

257
00:13:49.080 --> 00:13:51.680
of at least a couple of these challenges

258
00:13:51.680 --> 00:13:53.430
that I just told you here.

259
00:13:53.430 --> 00:13:56.590
Because, I think that they will be really beneficial

260
00:13:56.590 --> 00:14:00.120
for your own learning and so maybe, you can take some hours

261
00:14:00.120 --> 00:14:03.610
when you have the time, and, really continue practicing

262
00:14:03.610 --> 00:14:05.150
your skills here.

263
00:14:05.150 --> 00:14:08.900
And, if you do that, please make sure to share

264
00:14:08.900 --> 00:14:12.580
some of your screenshots of the implementations that you do

265
00:14:12.580 --> 00:14:13.610
on twitter.

266
00:14:13.610 --> 00:14:16.120
So, I really would love to see that.

267
00:14:16.120 --> 00:14:20.340
But, anyway, it's actually not time to say goodbye

268
00:14:20.340 --> 00:14:23.880
to this project yet because in the next section,

269
00:14:23.880 --> 00:14:27.910
we will deploy this project onto a live server,

270
00:14:27.910 --> 00:14:30.420
so that you can share it with the world

271
00:14:30.420 --> 00:14:33.440
and like with everyone that you know.

272
00:14:33.440 --> 00:14:37.420
So, there is still a lot of interesting stuff to learn.

273
00:14:37.420 --> 00:14:40.810
So, when you're ready implementing these challenges,

274
00:14:40.810 --> 00:14:43.263
then let's go to the next section.

