33// prettier-ignore
44const 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
147let map , mapEvent ;
158
9+ //Main Object Class for Workouts
1610class 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
2722class 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
4241class 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+
6373class 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