-
+
-
@@ -305,6 +341,8 @@
workoutDurationMinutes: '',
workoutDurationSeconds: '',
workoutDistance: '',
+ workoutAscent: '',
+ workoutDescent: '',
})
const withGpx = ref(
props.workout.id ? props.workout.with_gpx : props.isCreation
@@ -343,14 +381,30 @@
const duration = workout.duration.split(':')
workoutForm.workoutDistance = `${
authUser.value.imperial_units
- ? convertDistance(workout.distance, 'km', 'mi', 2)
- : parseFloat(workout.distance.toFixed(2))
+ ? convertDistance(workout.distance, 'km', 'mi', 3)
+ : parseFloat(workout.distance.toFixed(3))
}`
workoutForm.workoutDate = workoutDateTime.workout_date
workoutForm.workoutTime = workoutDateTime.workout_time
workoutForm.workoutDurationHour = duration[0]
workoutForm.workoutDurationMinutes = duration[1]
workoutForm.workoutDurationSeconds = duration[2]
+ workoutForm.workoutAscent =
+ workout.ascent === null
+ ? ''
+ : `${
+ authUser.value.imperial_units
+ ? convertDistance(workout.ascent, 'm', 'ft', 2)
+ : parseFloat(workout.ascent.toFixed(2))
+ }`
+ workoutForm.workoutDescent =
+ workout.descent === null
+ ? ''
+ : `${
+ authUser.value.imperial_units
+ ? convertDistance(workout.descent, 'm', 'ft', 2)
+ : parseFloat(workout.descent.toFixed(2))
+ }`
}
}
function isDistanceInvalid() {
@@ -359,6 +413,11 @@
function isDurationInvalid() {
return payloadErrorMessages.value.includes('workouts.INVALID_DURATION')
}
+ function isElevationInvalid() {
+ return payloadErrorMessages.value.includes(
+ 'workouts.INVALID_ASCENT_OR_DESCENT'
+ )
+ }
function formatPayload(payload: IWorkoutForm) {
payloadErrorMessages.value = []
payload.title = workoutForm.title
@@ -376,6 +435,24 @@
payloadErrorMessages.value.push('workouts.INVALID_DISTANCE')
}
payload.workout_date = `${workoutForm.workoutDate} ${workoutForm.workoutTime}`
+ payload.ascent =
+ workoutForm.workoutAscent === ''
+ ? null
+ : authUser.value.imperial_units
+ ? convertDistance(+workoutForm.workoutAscent, 'ft', 'm', 2)
+ : +workoutForm.workoutAscent
+ payload.descent =
+ workoutForm.workoutDescent === ''
+ ? null
+ : authUser.value.imperial_units
+ ? convertDistance(+workoutForm.workoutDescent, 'ft', 'm', 2)
+ : +workoutForm.workoutDescent
+ if (
+ (payload.ascent !== null && payload.descent === null) ||
+ (payload.ascent === null && payload.descent !== null)
+ ) {
+ payloadErrorMessages.value.push('workouts.INVALID_ASCENT_OR_DESCENT')
+ }
}
function updateWorkout() {
const payload: IWorkoutForm = {
@@ -388,10 +465,17 @@
} else {
formatPayload(payload)
}
- store.dispatch(WORKOUTS_STORE.ACTIONS.EDIT_WORKOUT, {
- workoutId: props.workout.id,
- data: payload,
- })
+ if (payloadErrorMessages.value.length > 0) {
+ store.commit(
+ ROOT_STORE.MUTATIONS.SET_ERROR_MESSAGES,
+ payloadErrorMessages.value
+ )
+ } else {
+ store.dispatch(WORKOUTS_STORE.ACTIONS.EDIT_WORKOUT, {
+ workoutId: props.workout.id,
+ data: payload,
+ })
+ }
} else {
if (withGpx.value) {
if (!gpxFile) {
@@ -536,6 +620,22 @@
}
}
}
+
+ .workout-data {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ .form-item {
+ width: 30%;
+ }
+
+ @media screen and (max-width: $medium-limit) {
+ flex-direction: column;
+ .form-item {
+ width: initial;
+ }
+ }
+ }
}
}
}
diff --git a/fittrackee_client/src/locales/en/workouts.json b/fittrackee_client/src/locales/en/workouts.json
index 1d0dfd4c..0313ae1e 100644
--- a/fittrackee_client/src/locales/en/workouts.json
+++ b/fittrackee_client/src/locales/en/workouts.json
@@ -16,6 +16,7 @@
"FROM": "from",
"GPX_FILE": ".gpx file",
"HIDE_FILTERS": "hide filters",
+ "INVALID_ASCENT_OR_DESCENT": "Both elevation values must be provided and be greater than or equal to 0.",
"INVALID_DISTANCE": "The distance must be greater than 0",
"INVALID_DURATION": "The duration must be greater than 0 seconds",
"LATEST_WORKOUTS": "Latest workouts",
diff --git a/fittrackee_client/src/locales/fr/workouts.json b/fittrackee_client/src/locales/fr/workouts.json
index e34f2e09..16e5750f 100644
--- a/fittrackee_client/src/locales/fr/workouts.json
+++ b/fittrackee_client/src/locales/fr/workouts.json
@@ -16,6 +16,7 @@
"FROM": "à partir de",
"GPX_FILE": "fichier .gpx",
"HIDE_FILTERS": "masquer les filtres",
+ "INVALID_ASCENT_OR_DESCENT": "Les 2 valeurs pour l'élévation doit être fournies et être supérieures ou égales à 0.",
"INVALID_DISTANCE": "La distance doit être supérieure à 0",
"INVALID_DURATION": "La durée doit être supérieure à 0 secondes",
"LATEST_WORKOUTS": "Séances récentes",
diff --git a/fittrackee_client/src/types/workouts.ts b/fittrackee_client/src/types/workouts.ts
index 45a4831d..6262663c 100644
--- a/fittrackee_client/src/types/workouts.ts
+++ b/fittrackee_client/src/types/workouts.ts
@@ -116,6 +116,8 @@ export interface IWorkoutForm {
distance?: number
duration?: number
file?: Blob
+ ascent?: number | null
+ descent?: number | null
}
export interface IWorkoutPayload {