All language subtitles for 13. Rendering Workouts

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 1 00:00:01,470 --> 00:00:03,482 So let's now render new workouts 2 2 00:00:03,482 --> 00:00:06,853 in the sidebar of our user interface. 3 3 00:00:08,610 --> 00:00:11,120 And so what I mean with rendering 4 4 00:00:11,120 --> 00:00:14,980 is to basically create a list item like this 5 5 00:00:14,980 --> 00:00:17,010 for each workout. 6 6 00:00:17,010 --> 00:00:18,160 All right? 7 7 00:00:18,160 --> 00:00:23,040 So each workout here contains this like short description, 8 8 00:00:23,040 --> 00:00:26,760 containing the type of the workout and then the date 9 9 00:00:26,760 --> 00:00:28,860 and actually that's also exactly 10 10 00:00:28,860 --> 00:00:30,823 what we get here in the popup. 11 11 00:00:31,770 --> 00:00:35,087 And then, of course, we have all the relevant data 12 12 00:00:35,087 --> 00:00:37,053 of the workout in case. 13 13 00:00:38,097 --> 00:00:40,100 And so let's now go back and do that 14 14 00:00:40,100 --> 00:00:43,503 and here we are still in the newWorkout method. 15 15 00:00:44,420 --> 00:00:48,560 And so down here is where we're gonna render the workout. 16 16 00:00:48,560 --> 00:00:50,670 However, just like before, 17 17 00:00:50,670 --> 00:00:53,870 we are actually gonna create a new method, 18 18 00:00:53,870 --> 00:00:56,250 which is gonna be called renderWorkout. 19 19 00:00:57,280 --> 00:01:00,143 And here I'm seeing that I forgot the underscore. 20 20 00:01:02,460 --> 00:01:03,403 Like this. 21 21 00:01:05,110 --> 00:01:07,407 And so now let's create renderWorkout 22 22 00:01:09,888 --> 00:01:12,455 and so this function will also take in an object 23 23 00:01:12,455 --> 00:01:14,053 of a workout. 24 24 00:01:14,990 --> 00:01:16,600 All right, and so here, 25 25 00:01:16,600 --> 00:01:19,853 all we have to do now is to call this method. 26 26 00:01:21,540 --> 00:01:26,370 So renderWorkout and then pass in the workout 27 27 00:01:26,370 --> 00:01:29,990 and so with this, we delegated this functionality 28 28 00:01:29,990 --> 00:01:34,100 to this method and so let's now start working on it. 29 29 00:01:34,100 --> 00:01:35,700 And so what we're gonna do here 30 30 00:01:35,700 --> 00:01:38,390 is basically some DOM manipulation. 31 31 00:01:38,390 --> 00:01:40,740 So we're gonna create some markup. 32 32 00:01:40,740 --> 00:01:42,780 So basically some HTML 33 33 00:01:42,780 --> 00:01:45,170 and then we will insert that into the DOM 34 34 00:01:45,170 --> 00:01:47,393 whenever there is a new workout. 35 35 00:01:49,940 --> 00:01:52,990 And so let's actually get the code right here 36 36 00:01:52,990 --> 00:01:57,740 from the HTML and I already have it here commented out. 37 37 00:01:57,740 --> 00:02:01,003 So let's actually go up a little bit more. 38 38 00:02:02,690 --> 00:02:06,040 So you see that we actually have a ul, 39 39 00:02:06,040 --> 00:02:10,020 which stands for unordered list called workout. 40 40 00:02:10,020 --> 00:02:12,993 Then in there, the first child is actually a form. 41 41 00:02:14,480 --> 00:02:16,310 Okay, and only after that, 42 42 00:02:16,310 --> 00:02:19,380 we then start adding these list items 43 43 00:02:19,380 --> 00:02:21,263 with the class of workout. 44 44 00:02:22,180 --> 00:02:25,800 Now, the first one here is a workout for running. 45 45 00:02:25,800 --> 00:02:29,253 And then the second one is a workout for cycling. 46 46 00:02:30,170 --> 00:02:31,460 All right? 47 47 00:02:31,460 --> 00:02:35,340 So let's basically take what both of them have in common, 48 48 00:02:35,340 --> 00:02:39,360 which is basically this first part here, 49 49 00:02:39,360 --> 00:02:41,460 which is the distance in kilometers 50 50 00:02:41,460 --> 00:02:43,400 and also the duration. 51 51 00:02:43,400 --> 00:02:45,080 So these are the same 52 52 00:02:45,080 --> 00:02:47,420 but then on running, here we have the pace 53 53 00:02:47,420 --> 00:02:49,260 in minutes per kilometer, 54 54 00:02:49,260 --> 00:02:51,480 while here, we have kilometers per hour, 55 55 00:02:51,480 --> 00:02:52,780 which is the speed 56 56 00:02:52,780 --> 00:02:56,010 and here, of course, we have the elevation gain, 57 57 00:02:56,010 --> 00:02:57,970 which has this emoji here, 58 58 00:02:57,970 --> 00:03:01,100 while here we have these steps per minute. 59 59 00:03:01,100 --> 00:03:04,350 And so let's start by taking the HTML here 60 60 00:03:04,350 --> 00:03:06,830 that is common to both workouts 61 61 00:03:06,830 --> 00:03:10,440 and then after that, we will implement this remaining part 62 62 00:03:10,440 --> 00:03:12,830 of both running and cycling. 63 63 00:03:12,830 --> 00:03:14,800 So I'm copying it 64 64 00:03:14,800 --> 00:03:19,097 and so then here, let's create const html 65 65 00:03:20,930 --> 00:03:22,180 and then as always, 66 66 00:03:22,180 --> 00:03:26,300 we are gonna use a template literal for this 67 67 00:03:26,300 --> 00:03:28,340 because they're really amazing, 68 68 00:03:28,340 --> 00:03:30,210 they're really actually perfect 69 69 00:03:30,210 --> 00:03:31,803 for doing this kind of stuff. 70 70 00:03:33,890 --> 00:03:34,723 Okay. 71 71 00:03:34,723 --> 00:03:38,070 So this indentation looks about right. 72 72 00:03:38,070 --> 00:03:40,210 Of course, it would work just the same 73 73 00:03:40,210 --> 00:03:43,610 as it was before but this then looks a bit nicer 74 74 00:03:43,610 --> 00:03:47,860 because it follows the natural structure of HTML. 75 75 00:03:47,860 --> 00:03:52,040 Okay, and now all we have to is to replace everything here 76 76 00:03:52,040 --> 00:03:53,930 with the real data. 77 77 00:03:53,930 --> 00:03:56,320 And let's start with the easy parts. 78 78 00:03:56,320 --> 00:03:59,980 So this one here is, of course, the distance. 79 79 00:03:59,980 --> 00:04:04,003 And so let's add workout.distance. 80 80 00:04:05,580 --> 00:04:08,663 And then down here, we have workout.duration. 81 81 00:04:12,080 --> 00:04:13,463 Dot duration. 82 82 00:04:15,570 --> 00:04:19,650 Then up here, we actually also have the id 83 83 00:04:19,650 --> 00:04:24,350 and so here we once again have this custom data attribute, 84 84 00:04:24,350 --> 00:04:27,240 which in this case, I called data-id. 85 85 00:04:27,240 --> 00:04:31,470 And remember that we use data properties like this one 86 86 00:04:31,470 --> 00:04:32,900 to usually build a bridge 87 87 00:04:32,900 --> 00:04:36,120 between the user interface and the data that we have 88 88 00:04:36,120 --> 00:04:37,590 in our application. 89 89 00:04:37,590 --> 00:04:39,480 And so in a future video, 90 90 00:04:39,480 --> 00:04:42,300 this one here will become very important. 91 91 00:04:42,300 --> 00:04:45,750 But for now, let's simply add the id here, 92 92 00:04:45,750 --> 00:04:50,750 just like before, so workout.id. 93 93 00:04:52,320 --> 00:04:56,540 Then next up, here we need to specify whether the workout 94 94 00:04:56,540 --> 00:04:59,500 is a running or a cycling workout 95 95 00:04:59,500 --> 00:05:01,283 because it's this class here 96 96 00:05:01,283 --> 00:05:04,710 that will then give the list item that green 97 97 00:05:04,710 --> 00:05:06,573 or that orange border. 98 98 00:05:07,610 --> 00:05:11,323 So remember, that is stored at workout.name. 99 99 00:05:12,970 --> 00:05:16,980 Then here, we have this emoji here, which is for running 100 100 00:05:16,980 --> 00:05:19,640 but for cycling, we have this other one. 101 101 00:05:19,640 --> 00:05:21,900 So this guy on the bicycle. 102 102 00:05:21,900 --> 00:05:24,410 And I hope that you can see these emojis 103 103 00:05:24,410 --> 00:05:27,920 just as well as I can here in the video 104 104 00:05:27,920 --> 00:05:30,710 because I know that, I think on some systems, 105 105 00:05:30,710 --> 00:05:32,500 this doesn't really work. 106 106 00:05:32,500 --> 00:05:35,400 But in that case, that's of course, no problem. 107 107 00:05:35,400 --> 00:05:39,350 It doesn't really matter if you can see the emoji or not. 108 108 00:05:39,350 --> 00:05:41,210 But anyway, what I'm gonna do here 109 109 00:05:41,210 --> 00:05:43,270 is to use the turnary operator 110 110 00:05:43,270 --> 00:05:46,410 to check whatever the runner here 111 111 00:05:46,410 --> 00:05:49,280 should be displayed or the cycler. 112 112 00:05:49,280 --> 00:05:51,040 So that's easy. 113 113 00:05:51,040 --> 00:05:54,370 Workout.name and then we just need to test 114 114 00:05:54,370 --> 00:05:55,653 if it is running. 115 115 00:05:57,550 --> 00:06:02,550 So if it is, then we want basically this to be the output 116 116 00:06:03,240 --> 00:06:06,770 and otherwise, this cycler. 117 117 00:06:06,770 --> 00:06:08,230 And here I need to close that 118 118 00:06:09,810 --> 00:06:11,523 and that's actually it. 119 119 00:06:12,670 --> 00:06:14,650 So one more time, the turnary operator 120 120 00:06:14,650 --> 00:06:16,921 is super important. 121 121 00:06:16,921 --> 00:06:19,690 So as you see, we are still using the fundamentals 122 122 00:06:19,690 --> 00:06:23,023 that we learned right in the very, very first section. 123 123 00:06:24,200 --> 00:06:26,830 So I said back then that they were important 124 124 00:06:26,830 --> 00:06:28,253 and indeed, they were. 125 125 00:06:29,970 --> 00:06:33,270 Now, finally, here we have basically this description 126 126 00:06:33,270 --> 00:06:34,610 of the workout. 127 127 00:06:34,610 --> 00:06:38,150 And it is composed of the workout.name essentially 128 128 00:06:38,150 --> 00:06:41,820 and then also the date but nicely formatted. 129 129 00:06:41,820 --> 00:06:44,990 And the way that we're gonna generate this description 130 130 00:06:44,990 --> 00:06:47,890 is by adding a new method on the workout, 131 131 00:06:47,890 --> 00:06:49,640 which will then create a description 132 132 00:06:49,640 --> 00:06:51,420 like this one immediately 133 133 00:06:51,420 --> 00:06:55,233 when the workout gets actually generated. 134 134 00:06:56,600 --> 00:06:57,920 Okay? 135 135 00:06:57,920 --> 00:07:01,250 So as I was just saying, here in the workout, 136 136 00:07:01,250 --> 00:07:03,503 I will create setDescription. 137 137 00:07:10,436 --> 00:07:12,720 And so this is where we now need this array 138 138 00:07:12,720 --> 00:07:14,060 that I gave you in the beginning 139 139 00:07:14,060 --> 00:07:15,053 with these months. 140 140 00:07:16,460 --> 00:07:19,040 So I didn't feel like writing it all out. 141 141 00:07:19,040 --> 00:07:20,790 And so here it is. 142 142 00:07:20,790 --> 00:07:23,750 And by the way, I have this comment here, 143 143 00:07:23,750 --> 00:07:25,610 which is something that we can use 144 144 00:07:25,610 --> 00:07:28,760 to tell Prettier, so that Prettier extension 145 145 00:07:28,760 --> 00:07:31,390 that we are using to format our code, 146 146 00:07:31,390 --> 00:07:34,320 so this comment here we can use whenever we want 147 147 00:07:34,320 --> 00:07:37,950 to tell prettier to ignore the next line. 148 148 00:07:37,950 --> 00:07:40,250 So let me see what happens if I take this out. 149 149 00:07:41,830 --> 00:07:45,480 So then you see I have everything here line by line 150 150 00:07:45,480 --> 00:07:46,803 and I don't like that. 151 151 00:07:47,880 --> 00:07:50,623 And so this is much nicer in this case. 152 152 00:07:51,650 --> 00:07:53,010 Okay. 153 153 00:07:53,010 --> 00:07:55,850 But anyway, let's now set the description. 154 154 00:07:55,850 --> 00:07:58,733 So this.description. 155 155 00:07:59,570 --> 00:08:02,220 So the description will be based on the name 156 156 00:08:02,220 --> 00:08:03,400 of the activity 157 157 00:08:04,310 --> 00:08:08,400 and actually, I don't mean name, I mean type here. 158 158 00:08:08,400 --> 00:08:10,980 And I believe that down there, 159 159 00:08:10,980 --> 00:08:13,033 I used name instead of type. 160 160 00:08:14,150 --> 00:08:16,230 So let's check that. 161 161 00:08:16,230 --> 00:08:18,920 And ja, for some reason, I used name. 162 162 00:08:18,920 --> 00:08:22,470 Hopefully, you didn't get too confused by that. 163 163 00:08:22,470 --> 00:08:27,140 So of course, that is workout.type and not .name. 164 164 00:08:27,140 --> 00:08:30,343 So it's the type that can be either running or cycling. 165 165 00:08:31,450 --> 00:08:32,290 All right? 166 166 00:08:32,290 --> 00:08:34,950 And so that's what we will use now here 167 167 00:08:34,950 --> 00:08:37,120 to create the description. 168 168 00:08:37,120 --> 00:08:39,410 So a new template literal 169 169 00:08:39,410 --> 00:08:40,590 and then here we actually want 170 170 00:08:40,590 --> 00:08:44,070 to make this type here uppercase. 171 171 00:08:44,070 --> 00:08:45,490 So the first letter 172 172 00:08:45,490 --> 00:08:50,490 and so we can take this.type, 173 173 00:08:50,690 --> 00:08:51,880 the first character 174 174 00:08:52,970 --> 00:08:54,320 and then toUppercase 175 175 00:08:55,922 --> 00:08:56,860 and so this is nothing new. 176 176 00:08:56,860 --> 00:08:58,823 We have done this many times before. 177 177 00:09:00,216 --> 00:09:02,630 And then simply the rest 178 178 00:09:04,150 --> 00:09:05,203 of this type. 179 179 00:09:06,870 --> 00:09:10,920 So slice starting from position one. 180 180 00:09:10,920 --> 00:09:15,570 So that is the type of the activity in uppercase on 181 181 00:09:17,420 --> 00:09:19,700 and so now we want basically the month 182 182 00:09:19,700 --> 00:09:20,973 and also the day. 183 183 00:09:22,210 --> 00:09:24,360 So we know already that we have the date 184 184 00:09:24,360 --> 00:09:27,930 of the workout in this.date 185 185 00:09:27,930 --> 00:09:32,930 and then we can use getMonth on that. 186 186 00:09:33,350 --> 00:09:36,270 And so remember that this will be here, 187 187 00:09:36,270 --> 00:09:39,090 a number between zero and 11. 188 188 00:09:39,090 --> 00:09:42,310 And so that's very nice for a zero-based array 189 189 00:09:42,310 --> 00:09:45,920 because we can now essentially use this number here 190 190 00:09:45,920 --> 00:09:50,430 to retrieve any value out of our month array. 191 191 00:09:50,430 --> 00:09:53,130 So if getMonth returns zero, 192 192 00:09:53,130 --> 00:09:56,420 then month at position zero is gonna be January 193 193 00:09:56,420 --> 00:09:59,363 and the same is, of course, true for all the other months. 194 194 00:10:01,000 --> 00:10:03,270 So this one here will give us the month 195 195 00:10:04,460 --> 00:10:07,530 and then all we need is the day. 196 196 00:10:07,530 --> 00:10:08,843 And so this.date.getDate. 197 197 00:10:16,050 --> 00:10:17,980 And that should be it. 198 198 00:10:17,980 --> 00:10:20,870 So now whenever a new object is created, 199 199 00:10:20,870 --> 00:10:25,015 then automatically the description should be set. 200 200 00:10:25,015 --> 00:10:26,958 And so here we now need to do, of course, 201 201 00:10:26,958 --> 00:10:28,625 this.setDescription. 202 202 00:10:32,388 --> 00:10:33,320 Now, right? 203 203 00:10:33,320 --> 00:10:35,540 And in fact, it should not be here 204 204 00:10:35,540 --> 00:10:40,540 but it should be down here in each of the child classes. 205 205 00:10:40,840 --> 00:10:43,760 So why is that you might be asking? 206 206 00:10:43,760 --> 00:10:46,030 Well, that's because that's the class 207 207 00:10:46,030 --> 00:10:50,170 that contains the type that we need for this calculation. 208 208 00:10:50,170 --> 00:10:51,140 Okay? 209 209 00:10:51,140 --> 00:10:53,173 So we need to cut that from here 210 210 00:10:53,173 --> 00:10:56,743 and actually calculate it in each of these. 211 211 00:10:58,330 --> 00:11:01,450 And of course, this will work perfectly fine 212 212 00:11:01,450 --> 00:11:03,230 because through the scope chain, 213 213 00:11:03,230 --> 00:11:06,080 this constructor method will get access 214 214 00:11:06,080 --> 00:11:09,350 to all the methods of the parent class. 215 215 00:11:09,350 --> 00:11:12,730 And so, of course, that includes this one here. 216 216 00:11:12,730 --> 00:11:15,740 And so then as the method is executed here, 217 217 00:11:15,740 --> 00:11:18,630 it will also get access to the type. 218 218 00:11:18,630 --> 00:11:22,780 And so this is the reason why we can use the type here, 219 219 00:11:22,780 --> 00:11:25,570 even though it is not defined in this class 220 220 00:11:25,570 --> 00:11:28,065 but only in the child class. 221 221 00:11:28,065 --> 00:11:30,950 So again, we could not call this method 222 222 00:11:30,950 --> 00:11:32,730 on a workout object 223 223 00:11:32,730 --> 00:11:35,120 because that doesn't have a type. 224 224 00:11:35,120 --> 00:11:36,890 But that's no problem anyway 225 225 00:11:36,890 --> 00:11:40,423 because we never actually create new workout objects. 226 226 00:11:42,250 --> 00:11:44,620 Now, all right, but with all that being said, 227 227 00:11:44,620 --> 00:11:46,651 let's now come back here 228 228 00:11:46,651 --> 00:11:48,433 and use this here. 229 229 00:11:51,020 --> 00:11:52,993 So workout.description. 230 230 00:11:54,630 --> 00:11:57,290 So that's the part that is common to both. 231 231 00:11:57,290 --> 00:12:00,290 Now let's get the rest of it. 232 232 00:12:00,290 --> 00:12:04,430 So all of this but this one is only for running. 233 233 00:12:04,430 --> 00:12:06,130 So let's copy it 234 234 00:12:06,130 --> 00:12:08,520 and now here after this part, 235 235 00:12:08,520 --> 00:12:11,680 or actually here, we can now say if 236 236 00:12:13,410 --> 00:12:16,080 workout.type 237 237 00:12:17,290 --> 00:12:20,880 equals running, 238 238 00:12:20,880 --> 00:12:23,853 then we want to add something to the HTML. 239 239 00:12:25,500 --> 00:12:30,500 So html plus equal and then this code right here. 240 240 00:12:32,800 --> 00:12:33,993 So give it a save. 241 241 00:12:34,997 --> 00:12:36,930 Then here let's fix the indentation 242 242 00:12:36,930 --> 00:12:38,603 or actually, it's good like this. 243 243 00:12:39,658 --> 00:12:41,103 Well, actually it isn't. 244 244 00:12:43,860 --> 00:12:45,840 So I'm just using multiple cursors 245 245 00:12:46,890 --> 00:12:50,130 and yeah, that's better. 246 246 00:12:50,130 --> 00:12:51,673 Just do the same thing here. 247 247 00:12:54,340 --> 00:12:55,200 Okay. 248 248 00:12:55,200 --> 00:12:57,680 And so now here, of course, we need to change it 249 249 00:12:57,680 --> 00:12:59,610 to a let variable 250 250 00:12:59,610 --> 00:13:01,360 because otherwise, we will not be able 251 251 00:13:01,360 --> 00:13:03,943 to add anything to that string. 252 252 00:13:07,060 --> 00:13:11,897 And so here, let's now write workout.pace 253 253 00:13:15,040 --> 00:13:16,173 and then down here, 254 254 00:13:17,390 --> 00:13:21,523 so that's workout.cadence. 255 255 00:13:23,610 --> 00:13:27,850 Now, this value here is actually calculated by JavaScript. 256 256 00:13:27,850 --> 00:13:30,200 And so the result of this calculation 257 257 00:13:30,200 --> 00:13:32,570 might be some very weird number 258 258 00:13:32,570 --> 00:13:35,773 and so let's simply round that to one decimal place. 259 259 00:13:37,260 --> 00:13:38,370 So toFixed 260 260 00:13:39,890 --> 00:13:42,470 and with just one decimal place. 261 261 00:13:42,470 --> 00:13:43,800 Okay. 262 262 00:13:43,800 --> 00:13:46,143 And now just copying this part. 263 263 00:13:51,690 --> 00:13:56,690 So if it's cycling, then we want to get just this part. 264 264 00:13:57,430 --> 00:13:59,430 So again, this is the common part. 265 265 00:13:59,430 --> 00:14:01,853 This is the one that is different. 266 266 00:14:06,210 --> 00:14:10,373 So again, add on to the already existing HTML string. 267 267 00:14:14,080 --> 00:14:17,390 And then each time the indentation is a bit different, 268 268 00:14:17,390 --> 00:14:19,653 don't have any idea why that is. 269 269 00:14:22,010 --> 00:14:23,563 But now it is correct. 270 270 00:14:24,910 --> 00:14:27,860 And here, this is probably the speed 271 271 00:14:33,110 --> 00:14:35,687 and then here it is the elevationGain 272 272 00:14:39,470 --> 00:14:42,840 so I guess that's just called elevation 273 273 00:14:42,840 --> 00:14:43,853 but I'm not sure. 274 274 00:14:46,520 --> 00:14:48,133 Let's just go back there. 275 275 00:14:51,420 --> 00:14:54,520 So yeah, it's called elevationGain here. 276 276 00:14:54,520 --> 00:14:56,710 We could have just called it elevation 277 277 00:14:56,710 --> 00:14:59,630 because that's how it's called in other parts 278 278 00:14:59,630 --> 00:15:01,060 of the application. 279 279 00:15:01,060 --> 00:15:04,153 But nevermind, let's just leave it like this for now. 280 280 00:15:04,990 --> 00:15:09,320 And here, this speed is also calculated by JavaScript. 281 281 00:15:09,320 --> 00:15:11,870 So let's round this one as well. 282 282 00:15:11,870 --> 00:15:14,990 And with this, we actually have the HTML generated. 283 283 00:15:14,990 --> 00:15:18,690 Now all we need to do is to insert that HTML 284 284 00:15:18,690 --> 00:15:20,550 into our DOM. 285 285 00:15:20,550 --> 00:15:24,493 So where will we inject this HTML? 286 286 00:15:25,340 --> 00:15:28,760 Well, let's take a look here at the parent element 287 287 00:15:28,760 --> 00:15:30,473 and that is workouts. 288 288 00:15:31,410 --> 00:15:33,180 However, as I mentioned before, 289 289 00:15:33,180 --> 00:15:35,690 the first child of the workouts 290 290 00:15:35,690 --> 00:15:37,680 is actually this form 291 291 00:15:37,680 --> 00:15:39,280 and only the second element 292 292 00:15:39,280 --> 00:15:42,460 should then become the first activity. 293 293 00:15:42,460 --> 00:15:45,630 And therefore, we cannot simply attach 294 294 00:15:45,630 --> 00:15:48,180 the new workout element 295 295 00:15:48,180 --> 00:15:50,120 to this ul element 296 296 00:15:50,120 --> 00:15:53,210 because we could either insert it as a first child 297 297 00:15:53,210 --> 00:15:54,840 or as a last child. 298 298 00:15:54,840 --> 00:15:57,620 But we don't want any of those options. 299 299 00:15:57,620 --> 00:16:02,220 So instead, we will insert it close to this form 300 300 00:16:02,220 --> 00:16:05,453 but basically insert it as a sibling element. 301 301 00:16:07,080 --> 00:16:08,270 All right? 302 302 00:16:08,270 --> 00:16:10,300 So again, I will take the form 303 303 00:16:10,300 --> 00:16:13,000 and then that is where I'm gonna call 304 304 00:16:13,000 --> 00:16:15,423 the insertAdjacentHTML method. 305 305 00:16:17,150 --> 00:16:18,490 So form.insertAdjacentHTML 306 306 00:16:21,940 --> 00:16:22,950 and then here, remember, 307 307 00:16:22,950 --> 00:16:25,600 I have to choose between four strings 308 308 00:16:25,600 --> 00:16:28,160 and so that's these four here. 309 309 00:16:28,160 --> 00:16:31,430 And so the one I'm gonna choose is afterend 310 310 00:16:31,430 --> 00:16:34,320 because this one will basically add the new element 311 311 00:16:34,320 --> 00:16:38,460 as a sibling element at the end of the form. 312 312 00:16:38,460 --> 00:16:41,930 So we discussed these strings before already. 313 313 00:16:41,930 --> 00:16:44,853 So you can always go back there if necessary. 314 314 00:16:46,960 --> 00:16:47,793 Okay. 315 315 00:16:49,040 --> 00:16:52,590 And with this, I think we should be complete. 316 316 00:16:52,590 --> 00:16:54,483 We already called it up here. 317 317 00:16:55,980 --> 00:16:56,930 Right? 318 318 00:16:56,930 --> 00:16:59,133 And so let's now actually try it. 319 319 00:17:00,640 --> 00:17:02,723 So let's just reload here manually. 320 320 00:17:06,907 --> 00:17:08,010 Okay. 321 321 00:17:08,010 --> 00:17:10,810 And now let's just add a simple running 322 322 00:17:13,410 --> 00:17:15,751 and now we get a problem. 323 323 00:17:15,751 --> 00:17:18,879 So toUppercase is not a function. 324 324 00:17:18,879 --> 00:17:21,249 And indeed, it isn't. 325 325 00:17:21,249 --> 00:17:25,166 So it has to be UpperCase with the C uppercase. 326 326 00:17:26,350 --> 00:17:27,733 So let's see now. 327 327 00:17:29,830 --> 00:17:31,830 And again, just putting any numbers here 328 328 00:17:32,750 --> 00:17:34,750 and there it is. 329 329 00:17:34,750 --> 00:17:38,170 So here is our very first workout rendered 330 330 00:17:38,170 --> 00:17:40,310 to the user interface. 331 331 00:17:40,310 --> 00:17:43,640 So that's beautiful, really cool. 332 332 00:17:43,640 --> 00:17:46,453 Let's now try this with cycling as well. 333 333 00:17:48,390 --> 00:17:50,760 And yeah, it does appear here 334 334 00:17:50,760 --> 00:17:53,610 and also it appears before the one 335 335 00:17:53,610 --> 00:17:55,620 that we had previously. 336 336 00:17:55,620 --> 00:17:59,630 And so that is the effect of choosing the afterend string 337 337 00:17:59,630 --> 00:18:03,190 in the insertAdjacentHTML method. 338 338 00:18:03,190 --> 00:18:05,670 All right, so that's amazing 339 339 00:18:05,670 --> 00:18:07,380 but what we need to do next 340 340 00:18:07,380 --> 00:18:09,820 is to then actually hide this form 341 341 00:18:09,820 --> 00:18:12,910 whenever a new input here happens. 342 342 00:18:12,910 --> 00:18:14,102 Right? 343 343 00:18:14,102 --> 00:18:17,113 And so let's go do that now. 344 344 00:18:18,940 --> 00:18:23,723 And so we need to go back here to our, well, where is that? 345 345 00:18:26,180 --> 00:18:27,990 Here in the new workout. 346 346 00:18:27,990 --> 00:18:30,620 So here we want to hide the form. 347 347 00:18:30,620 --> 00:18:32,900 And so let's create yet another method, 348 348 00:18:32,900 --> 00:18:35,003 which is gonna be called hide form. 349 349 00:18:36,260 --> 00:18:40,140 So I can already copy or actually cut this one here 350 350 00:18:40,140 --> 00:18:42,930 and call the method before I've written it. 351 351 00:18:42,930 --> 00:18:44,970 So that's no problem. 352 352 00:18:44,970 --> 00:18:48,963 So hideMap will be the name of this method. 353 353 00:18:50,180 --> 00:18:53,020 And now let's actually create that. 354 354 00:18:53,020 --> 00:18:55,370 And of course, it's not hideMap, it's hideForm. 355 355 00:18:58,060 --> 00:19:01,273 So let's do it here right after showForm. 356 356 00:19:02,390 --> 00:19:04,710 So that makes sense, right. 357 357 00:19:04,710 --> 00:19:06,013 So hideForm. 358 358 00:19:08,960 --> 00:19:10,960 So the first thing that we need to do 359 359 00:19:10,960 --> 00:19:12,830 is to empty the inputs 360 360 00:19:16,410 --> 00:19:20,123 and then we need to add this hidden class back on. 361 361 00:19:23,950 --> 00:19:26,730 Now, right, so that's add 362 362 00:19:26,730 --> 00:19:28,303 but as we will see in a second, 363 363 00:19:28,303 --> 00:19:31,070 this is not yet gonna be enough. 364 364 00:19:31,070 --> 00:19:33,403 But let's actually see what I mean here. 365 365 00:19:37,760 --> 00:19:39,490 So did you see this animation here 366 366 00:19:39,490 --> 00:19:41,063 that happened in the beginning? 367 367 00:19:42,130 --> 00:19:45,163 Well, we will need to undo that here in a second. 368 368 00:19:47,220 --> 00:19:48,850 So you see that this one here, 369 369 00:19:48,850 --> 00:19:51,453 basically did slide up a little bit. 370 370 00:19:52,497 --> 00:19:53,330 All right? 371 371 00:19:53,330 --> 00:19:54,860 But that's not what we want. 372 372 00:19:54,860 --> 00:19:56,980 So here in this version of the app, 373 373 00:19:56,980 --> 00:19:58,233 let's see what happens. 374 374 00:19:59,310 --> 00:20:03,020 So as the form appears, everything slides down here. 375 375 00:20:03,020 --> 00:20:05,733 And now watch what happens as I hit Enter. 376 376 00:20:07,650 --> 00:20:08,930 So you saw that? 377 377 00:20:08,930 --> 00:20:11,670 Basically it looked as if that form 378 378 00:20:11,670 --> 00:20:14,820 was replaced with this new activity here. 379 379 00:20:14,820 --> 00:20:16,280 And so to do that, 380 380 00:20:16,280 --> 00:20:21,240 it's not enough to simply add back the hidden class here 381 381 00:20:21,240 --> 00:20:23,923 because that will then also trigger the animation. 382 382 00:20:24,790 --> 00:20:29,620 So instead, we need to hide the form immediately first. 383 383 00:20:29,620 --> 00:20:33,100 So form.style.display. 384 384 00:20:35,790 --> 00:20:40,700 So we immediately need to set the display to none. 385 385 00:20:40,700 --> 00:20:43,450 But then we will actually have to put it back 386 386 00:20:43,450 --> 00:20:45,563 after the animation had finished. 387 387 00:20:46,940 --> 00:20:48,330 So let's take a look here 388 388 00:20:48,330 --> 00:20:50,570 at the form style actually 389 389 00:20:50,570 --> 00:20:52,070 so I can show you what I mean. 390 390 00:20:55,020 --> 00:20:56,320 Okay. 391 391 00:20:56,320 --> 00:20:58,590 So this is the transition that I mean 392 392 00:20:58,590 --> 00:21:00,870 and it is because of this one 393 393 00:21:00,870 --> 00:21:04,990 that the hidden class has that animation of sliding. 394 394 00:21:04,990 --> 00:21:08,273 So that's this transform here, all right? 395 395 00:21:09,440 --> 00:21:13,120 So this animations happens over one second. 396 396 00:21:13,120 --> 00:21:16,913 And the original value of the display property is grid. 397 397 00:21:18,030 --> 00:21:19,480 And so what we will do now 398 398 00:21:19,480 --> 00:21:23,200 is to basically after one second set this display 399 399 00:21:23,200 --> 00:21:24,443 back to grid. 400 400 00:21:25,740 --> 00:21:28,250 So that's kind of a dirty trick here 401 401 00:21:28,250 --> 00:21:30,563 but in order to build the layout like this, 402 402 00:21:30,563 --> 00:21:32,670 this is what we have to do. 403 403 00:21:32,670 --> 00:21:34,577 And it's also a good time 404 404 00:21:34,577 --> 00:21:37,723 to bring back or setTimeout function. 405 405 00:21:39,320 --> 00:21:42,490 And remember that all that setTimeout does 406 406 00:21:42,490 --> 00:21:44,780 is to call a certain callback function 407 407 00:21:44,780 --> 00:21:46,323 after a certain time. 408 408 00:21:48,760 --> 00:21:50,650 So let's use a simple arrow function here 409 409 00:21:50,650 --> 00:21:52,670 to make it really simple. 410 410 00:21:52,670 --> 00:21:57,670 So form.style.display 411 411 00:21:57,670 --> 00:22:01,440 should be set to grid. 412 412 00:22:01,440 --> 00:22:04,690 And this should happen after one second. 413 413 00:22:04,690 --> 00:22:06,960 So 1,000 milliseconds 414 414 00:22:06,960 --> 00:22:10,137 and so yeah, let's see now. 415 415 00:22:15,540 --> 00:22:17,040 All right, so again you saw 416 416 00:22:17,040 --> 00:22:19,370 that animation happening there 417 417 00:22:19,370 --> 00:22:22,080 but now let's see if we get our desired result 418 418 00:22:23,260 --> 00:22:25,623 and yes, there it is. 419 419 00:22:26,480 --> 00:22:29,650 So indeed, we did now immediately hide the form 420 420 00:22:29,650 --> 00:22:31,390 and then after one second, 421 421 00:22:31,390 --> 00:22:34,710 we brought back the original display property. 422 422 00:22:34,710 --> 00:22:37,030 And so all that's really left to do 423 423 00:22:37,030 --> 00:22:39,580 is to basically add the same description 424 424 00:22:39,580 --> 00:22:40,880 that we have here 425 425 00:22:40,880 --> 00:22:41,753 to this popup. 426 426 00:22:42,810 --> 00:22:45,160 And we will also add a nice emoji, 427 427 00:22:45,160 --> 00:22:48,410 so this running guy for running 428 428 00:22:48,410 --> 00:22:52,633 and then cycling, as you see here, for the cycling workouts. 429 429 00:22:54,260 --> 00:22:58,373 Okay, and this code we can actually get from here. 430 430 00:22:59,800 --> 00:23:03,023 So from renderWorkout, we already have this. 431 431 00:23:06,090 --> 00:23:07,683 So where is the marker? 432 432 00:23:09,600 --> 00:23:11,120 Ah, here it is. 433 433 00:23:11,120 --> 00:23:13,200 So here is where we set the content 434 434 00:23:14,250 --> 00:23:16,663 and so again, a template literal. 435 435 00:23:19,910 --> 00:23:22,950 All right, so this is how we set the emoji 436 436 00:23:22,950 --> 00:23:25,730 and then all we need now is the description 437 437 00:23:25,730 --> 00:23:26,563 of the workout. 438 438 00:23:30,187 --> 00:23:33,713 .description and that should be it. 439 439 00:23:38,790 --> 00:23:41,620 All right, so that works beautifully 440 440 00:23:41,620 --> 00:23:43,493 and now just for cycling, 441 441 00:23:46,430 --> 00:23:47,713 and yes. 442 442 00:23:49,270 --> 00:23:50,880 So here's the cycling emoji, 443 443 00:23:50,880 --> 00:23:52,350 here's the description 444 444 00:23:52,350 --> 00:23:56,940 and so this now works exactly as it does in our demo. 445 445 00:23:56,940 --> 00:23:59,620 Great, so we are almost finished actually 446 446 00:23:59,620 --> 00:24:00,863 with our application. 447 447 00:24:02,040 --> 00:24:05,120 So let's take a look at our flowchart here. 448 448 00:24:05,120 --> 00:24:06,810 And so what we're missing now 449 449 00:24:06,810 --> 00:24:09,940 is to move the map to the workout location 450 450 00:24:09,940 --> 00:24:12,490 whenever we click on one of the workouts 451 451 00:24:12,490 --> 00:24:14,070 that we just created. 452 452 00:24:14,070 --> 00:24:16,963 And so that's gonna be the topic of the next video. 37478

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.