Merge branch 'dev' into oauth2

This commit is contained in:
Sam
2022-06-25 21:23:15 +02:00
133 changed files with 2507 additions and 2407 deletions

View File

@ -1,6 +1,6 @@
{
"name": "fittrackee_client",
"version": "0.6.7",
"version": "0.6.8",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
@ -11,7 +11,7 @@
"i18n:report": "vue-cli-service i18n:report --src \"./src/**/*.?(js|vue)\" --locales \"./src/locales/**/*.json\""
},
"dependencies": {
"@tmcw/togeojson": "^5.1.3",
"@tmcw/togeojson": "^5.2.1",
"@vue-leaflet/vue-leaflet": "^0.6.1",
"@zxcvbn-ts/core": "^2.0.1",
"@zxcvbn-ts/language-common": "^2.0.1",
@ -20,45 +20,45 @@
"axios": "^0.26.1",
"chart.js": "^3.8.0",
"chartjs-plugin-datalabels": "^2.0.0",
"core-js": "^3.22.7",
"core-js": "^3.23.2",
"date-fns": "^2.28.0",
"date-fns-tz": "^1.3.4",
"date-fns-tz": "^1.3.5",
"leaflet": "^1.8.0",
"register-service-worker": "^1.7.1",
"vue": "^3.2.36",
"vue": "^3.2.37",
"vue-chart-3": "3.1.1",
"vue-fullscreen": "^3.1.1",
"vue-i18n": "^9.1.10",
"vue-router": "^4.0.15",
"vue-router": "^4.0.16",
"vuex": "^4.0.0-0"
},
"devDependencies": {
"@intlify/vue-i18n-loader": "^4.2.0",
"@types/chai": "^4.3.1",
"@types/mocha": "^9.1.1",
"@typescript-eslint/eslint-plugin": "^5.26.0",
"@typescript-eslint/parser": "^5.26.0",
"@vue/cli-plugin-babel": "~5.0.1",
"@vue/cli-plugin-eslint": "~5.0.1",
"@vue/cli-plugin-pwa": "~5.0.1",
"@vue/cli-plugin-router": "~5.0.1",
"@vue/cli-plugin-typescript": "~5.0.1",
"@vue/cli-plugin-unit-mocha": "~5.0.1",
"@vue/cli-plugin-vuex": "~5.0.1",
"@vue/cli-service": "~5.0.1",
"@vue/eslint-config-typescript": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^5.29.0",
"@typescript-eslint/parser": "^5.29.0",
"@vue/cli-plugin-babel": "~5.0.6",
"@vue/cli-plugin-eslint": "~5.0.6",
"@vue/cli-plugin-pwa": "~5.0.6",
"@vue/cli-plugin-router": "~5.0.6",
"@vue/cli-plugin-typescript": "~5.0.6",
"@vue/cli-plugin-unit-mocha": "~5.0.6",
"@vue/cli-plugin-vuex": "~5.0.6",
"@vue/cli-service": "~5.0.6",
"@vue/eslint-config-typescript": "^11.0.0",
"@vue/test-utils": "^2.0.0",
"chai": "^4.3.6",
"eslint": "^7.32.0",
"eslint": "^8.18.0",
"eslint-config-prettier": "^8.5.0",
"eslint-import-resolver-typescript": "^2.7.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.7.1",
"prettier": "^2.6.2",
"sass": "^1.51.2",
"eslint-plugin-vue": "^9.1.1",
"prettier": "^2.7.1",
"sass": "^1.52.3",
"sass-loader": "^13.0.0",
"typescript": "^4.7.2",
"typescript": "^4.7.4",
"vue-cli-plugin-i18n": "~2.3.1"
},
"eslintConfig": {

View File

@ -61,7 +61,7 @@
}
function scroll() {
window.onscroll = () => {
let bottom = document.querySelector('#bottom')
const bottom = document.querySelector('#bottom')
displayScrollButton.value = bottom !== null && isScrolledToBottom(bottom)
}
}

View File

@ -31,7 +31,7 @@
const emit = defineEmits(['updateValue'])
let text = ref('')
const text = ref('')
function updateText(event: Event & { target: HTMLInputElement }) {
emit('updateValue', event.target.value)

View File

@ -33,8 +33,8 @@
})
const route = useRoute()
let isOpen = ref(false)
let dropdownOptions = props.options.map((option) => option)
const isOpen = ref(false)
const dropdownOptions = props.options.map((option) => option)
function toggleDropdown() {
isOpen.value = !isOpen.value

View File

@ -63,7 +63,7 @@
onBeforeMount(async () => await setZxcvbnOptions(language.value))
function calculatePasswordStrength(password: string) {
let zxcvbnResult = zxcvbn(password)
const zxcvbnResult = zxcvbn(password)
passwordScore.value = zxcvbnResult.score
passwordStrength.value = getPasswordStrength(passwordScore.value)
passwordSuggestions.value = zxcvbnResult.feedback.suggestions

View File

@ -55,7 +55,7 @@
function getSum(total: any, value: any): number {
return getNumber(total) + getNumber(value)
}
let chartData: ComputedRef<ChartData<'bar'>> = computed(() => ({
const chartData: ComputedRef<ChartData<'bar'>> = computed(() => ({
labels: props.labels,
// workaround to avoid dataset modification
datasets: JSON.parse(JSON.stringify(props.datasets)),

View File

@ -134,7 +134,7 @@
setup(props) {
const store = useStore()
let displayedData: Ref<TStatisticsDatasetKeys> = ref('total_distance')
const displayedData: Ref<TStatisticsDatasetKeys> = ref('total_distance')
const statistics: ComputedRef<TStatisticsFromApi> = computed(
() => store.getters[STATS_STORE.GETTERS.USER_STATS]
)

View File

@ -53,7 +53,7 @@
const store = useStore()
const { sports, user } = toRefs(props)
let page = ref(1)
const page = ref(1)
const per_page = 5
const initWorkoutsCount =
props.user.nb_workouts >= per_page ? per_page : props.user.nb_workouts

View File

@ -49,8 +49,8 @@
const { sports, user } = toRefs(props)
const dateFormat = 'yyyy-MM-dd'
let day = ref(new Date())
let calendarDates = ref(getCalendarStartAndEnd(day.value, props.user.weekm))
const day = ref(new Date())
const calendarDates = ref(getCalendarStartAndEnd(day.value, props.user.weekm))
const calendarWorkouts: ComputedRef<IWorkout[]> = computed(
() => store.getters[WORKOUTS_STORE.GETTERS.CALENDAR_WORKOUTS]
)

View File

@ -102,7 +102,7 @@
const language: ComputedRef<string> = computed(
() => store.getters[ROOT_STORE.GETTERS.LANGUAGE]
)
let isMenuOpen = ref(false)
const isMenuOpen = ref(false)
function openMenu() {
isMenuOpen.value = true

View File

@ -42,7 +42,7 @@
const emit = defineEmits(['arrowClick', 'timeFrameUpdate'])
let selectedTimeFrame = ref('month')
const selectedTimeFrame = ref('month')
const timeFrames = ['week', 'month', 'year']
function onUpdateTimeFrame(timeFrame: string) {

View File

@ -41,7 +41,7 @@
const { t } = useI18n()
const { sports, user } = toRefs(props)
let selectedTimeFrame = ref('month')
const selectedTimeFrame = ref('month')
const chartParams: Ref<IStatisticsDateParams> = ref(
getChartParams(selectedTimeFrame.value)
)

View File

@ -164,7 +164,7 @@
const appConfig: ComputedRef<TAppConfig> = computed(
() => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]
)
let displayModal: Ref<string> = ref('')
const displayModal: Ref<string> = ref('')
const formErrors = ref(false)
const displayUserEmailForm: Ref<boolean> = ref(false)
const newUserEmail: Ref<string> = ref('')

View File

@ -59,7 +59,7 @@
const fileSizeLimit = appConfig.value.max_single_file_size
? getReadableFileSize(appConfig.value.max_single_file_size)
: ''
let pictureFile: Ref<File | null> = ref(null)
const pictureFile: Ref<File | null> = ref(null)
function deleteUserPicture() {
store.dispatch(AUTH_USER_STORE.ACTIONS.DELETE_PICTURE)

View File

@ -123,8 +123,8 @@
const revocationSuccessful: ComputedRef<boolean> = computed(
() => store.getters[OAUTH2_STORE.GETTERS.REVOCATION_SUCCESSFUL]
)
let displayModal: Ref<boolean> = ref(false)
let messageToDisplay: Ref<string | null> = ref(null)
const displayModal: Ref<boolean> = ref(false)
const messageToDisplay: Ref<string | null> = ref(null)
onBeforeMount(() => {
loadClient()

View File

@ -70,7 +70,7 @@
})
function getClientsQuery(newQuery: LocationQuery): IOauth2ClientsPayload {
let clientsQuery: IOauth2ClientsPayload = {}
const clientsQuery: IOauth2ClientsPayload = {}
if (newQuery.page) {
clientsQuery.page = getNumberQueryValue(newQuery.page, defaultPage)
}

View File

@ -77,14 +77,14 @@
const { t } = useI18n()
let displayDistance = ref(true)
let beginElevationAtZero = ref(true)
const displayDistance = ref(true)
const beginElevationAtZero = ref(true)
const datasets: ComputedRef<IWorkoutChartData> = computed(() =>
getDatasets(props.workoutData.chartData, t, props.authUser.imperial_units)
)
const fromKmUnit = getUnitTo('km')
const fromMUnit = getUnitTo('m')
let chartData: ComputedRef<ChartData<'line'>> = computed(() => ({
const chartData: ComputedRef<ChartData<'line'>> = computed(() => ({
labels: displayDistance.value
? datasets.value.distance_labels
: datasets.value.duration_labels,

View File

@ -75,7 +75,7 @@
const workout: ComputedRef<IWorkout> = computed(
() => props.workoutData.workout
)
let segmentId: Ref<number | null> = ref(
const segmentId: Ref<number | null> = ref(
route.params.workoutId ? +route.params.segmentId : null
)
const segment: ComputedRef<IWorkoutSegment | null> = computed(() =>
@ -83,7 +83,7 @@
? workout.value.segments[+segmentId.value - 1]
: null
)
let displayModal: Ref<boolean> = ref(false)
const displayModal: Ref<boolean> = ref(false)
const sport = computed(() =>
props.sports
? props.sports.find(

View File

@ -301,7 +301,7 @@
workoutDurationSeconds: '',
workoutDistance: '',
})
let withGpx = ref(
const withGpx = ref(
props.workout.id ? props.workout.with_gpx : props.isCreation
)
let gpxFile: File | null = null

View File

@ -71,7 +71,7 @@
class="fa fa-map-o"
aria-hidden="true"
/>
{{ workout.title }}
<span class="title">{{ workout.title }}</span>
</router-link>
<StaticMap
v-if="workout.with_gpx && hoverWorkoutId === workout.id"
@ -182,7 +182,7 @@
import { WORKOUTS_STORE } from '@/store/constants'
import { IPagination } from '@/types/api'
import { ITranslatedSport } from '@/types/sports'
import { IUserProfile } from '@/types/user'
import { IAuthUserProfile } from '@/types/user'
import { IWorkout, TWorkoutsPayload } from '@/types/workouts'
import { useStore } from '@/use/useStore'
import { getQuery, sortList, workoutsPayloadKeys } from '@/utils/api'
@ -192,7 +192,7 @@
import { defaultOrder } from '@/utils/workouts'
interface Props {
user: IUserProfile
user: IAuthUserProfile
sports: ITranslatedSport[]
}
const props = defineProps<Props>()
@ -238,7 +238,7 @@
}
function getWorkoutsQuery(newQuery: LocationQuery): TWorkoutsPayload {
let workoutQuery = getQuery(newQuery, orderByList, defaultOrder.order_by, {
const workoutQuery = getQuery(newQuery, orderByList, defaultOrder.order_by, {
defaultSort: defaultOrder.order,
})
Object.keys(newQuery)
@ -258,7 +258,7 @@
...payload,
}
Object.entries(convertedPayload).map((entry) => {
if (entry[0].match('speed|distance')) {
if (entry[0].match('speed|distance') && entry[1]) {
convertedPayload[entry[0]] = convertDistance(+entry[1], 'mi', 'km')
}
})
@ -326,6 +326,14 @@
position: relative;
.fa-map-o {
font-size: 0.75em;
padding-right: $default-padding * 0.5;
}
.nav-item {
white-space: nowrap;
.title {
word-break: break-word;
white-space: normal;
}
}
.static-map {
display: none;

View File

@ -84,7 +84,7 @@
const sports: ComputedRef<ISport[]> = computed(
() => store.getters[SPORTS_STORE.GETTERS.SPORTS]
)
let markerCoordinates: Ref<TCoordinates> = ref({
const markerCoordinates: Ref<TCoordinates> = ref({
latitude: null,
longitude: null,
})

File diff suppressed because it is too large Load Diff