Skip to content

Commit e0a6bbc

Browse files
committed
Continuing New Workout Method
Used Helper Functions for Data Validation in new workout objects, defined new global variables or higher hierarchy local scoped variables for reference, and separated rendering code for workout markers to its own functions. Working on ensuring custom styles load correctly for markers and that added workouts successfully render to a list and hide the workout input fields when added.
1 parent 48bf334 commit e0a6bbc

File tree

1 file changed

+70
-16
lines changed

1 file changed

+70
-16
lines changed

15-Mapty/starter/script.js

Lines changed: 70 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,10 @@
33
// prettier-ignore
44
const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
55

6-
const form = document.querySelector('.form');
7-
const containerWorkouts = document.querySelector('.workouts');
8-
const inputType = document.querySelector('.form__input--type');
9-
const inputDistance = document.querySelector('.form__input--distance');
10-
const inputDuration = document.querySelector('.form__input--duration');
11-
const inputCadence = document.querySelector('.form__input--cadence');
12-
const inputElevation = document.querySelector('.form__input--elevation');
13-
6+
//Global variables
147
let map, mapEvent;
158

9+
//Main Object Class for Workouts
1610
class Workout{
1711
date = new Date();
1812
id = (Date.now() + '').slice(-10);
@@ -24,7 +18,11 @@ class Workout{
2418
}
2519
}
2620

21+
//Derived Class Running that uses Workout
2722
class Running extends Workout{
23+
24+
type = 'running';
25+
2826
constructor(coords, distance, duration, cadence) {
2927
super(coords, distance, duration);
3028
this.cadence = cadence;
@@ -39,7 +37,11 @@ class Running extends Workout{
3937

4038
}
4139

40+
//Derived Class Cycling that uses Workout
4241
class Cycling extends Workout{
42+
43+
type = 'cycling';
44+
4345
constructor(coords, distance, duration, elevationGain) {
4446
super(coords, distance, duration);
4547
this.elevationGain = elevationGain;
@@ -60,9 +62,19 @@ console.log(run1, cycling1) */
6062

6163
//////////////////////////////////////////////
6264
//APPLICATION ARCHITECTURE
65+
const form = document.querySelector('.form');
66+
const containerWorkouts = document.querySelector('.workouts');
67+
const inputType = document.querySelector('.form__input--type');
68+
const inputDistance = document.querySelector('.form__input--distance');
69+
const inputDuration = document.querySelector('.form__input--duration');
70+
const inputCadence = document.querySelector('.form__input--cadence');
71+
const inputElevation = document.querySelector('.form__input--elevation');
72+
6373
class App {
6474
#map;
6575
#mapEvent;
76+
#workouts = [];
77+
6678
constructor() {
6779
this._getPosition();
6880
form.addEventListener('submit', this._newWorkout.bind(this));
@@ -103,22 +115,64 @@ class App {
103115
}
104116

105117
_newWorkout(e) {
118+
const validInputs = (...inputs) =>
119+
inputs.every(inp => Number.isFinite(inp));
120+
121+
const allPositive = (...inputs) => inputs.every(inp => inp > 0);
122+
106123
e.preventDefault();
107-
console.log(this)
108-
//Clear input fields
109-
inputDistance.value = inputDuration.value = inputCadence.value = inputElevation.value = '';
110-
111-
//Display the Marker
112-
const {lat, lng} = this.#mapEvent.latlng;
124+
125+
// Get data from the form
126+
const type = inputType.value;
127+
const distance = +inputDistance.value;
128+
const duration = +inputDuration.value;
129+
const { lat, lng } = this.#mapEvent.latlng;
130+
let workout;
113131

114-
L.marker([lat, lng])
132+
// If workout is running, create running
133+
if(type === 'running') {
134+
const cadence = +inputCadence.value;
135+
//Check if data is valid
136+
if (!validInputs(distance, duration, cadence) ||
137+
!allPositive(distance, duration, cadence) )
138+
return alert('Inputs have to be positive numbers!')
139+
140+
workout = new Running([lat, lng], distance, duration, cadence);
141+
}
142+
143+
// If workout is cycling, create cycling
144+
if(type === 'cycling') {
145+
const elevation = +inputElevation.value;
146+
//Check if data is valid
147+
if (!validInputs(distance, duration, elevation) ||
148+
!allPositive(distance, duration))
149+
return alert('Inputs have to be positive numbers!')
150+
151+
workout = new Cycling([lat, lng], distance, duration, elevation);
152+
}
153+
154+
// Add new object to workout array
155+
this.#workouts.push(workout);
156+
//console.log(workout);
157+
158+
// Render workout on map as marker
159+
this._renderWorkoutMarker(workout)
160+
161+
// Render workout on list
162+
163+
//Hide form & Clear input fields
164+
inputDistance.value = inputDuration.value = inputCadence.value = inputElevation.value = '';
165+
}
166+
167+
_renderWorkoutMarker(workout) {
168+
L.marker(workout.coords)
115169
.addTo(this.#map)
116170
.bindPopup( L.popup({
117171
maxWidth: 250,
118172
minWidth: 100,
119173
autoClose: false,
120174
closeOnClick: false,
121-
className: 'running-popup'}) ).setPopupContent('Workout').openPopup();
175+
className: `${workout.type}-popup`}) ).setPopupContent(workout.distance).openPopup();
122176
}
123177
}
124178

0 commit comments

Comments
 (0)