Client - upgrade Vue to 3.3 and move to Vite
This commit is contained in:
@ -29,13 +29,14 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, ref, onBeforeMount, onMounted } from 'vue'
|
||||
import { computed, ref, onBeforeMount, onMounted } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import Footer from '@/components/Footer.vue'
|
||||
import NavBar from '@/components/NavBar.vue'
|
||||
import NoConfig from '@/components/NoConfig.vue'
|
||||
import { ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { localeFromLanguage } from '@/utils/locales'
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { AxiosRequestConfig } from 'axios'
|
||||
import type { AxiosRequestConfig } from 'axios'
|
||||
|
||||
export const pendingRequests = new Map()
|
||||
|
||||
|
@ -49,9 +49,7 @@
|
||||
</div>
|
||||
<template v-if="appConfig.about">
|
||||
<p class="about-instance">{{ $t('about.ABOUT_THIS_INSTANCE') }}</p>
|
||||
<div
|
||||
v-html="snarkdown(linkifyAndClean(appConfig.about))"
|
||||
/>
|
||||
<div v-html="snarkdown(linkifyAndClean(appConfig.about))" />
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
@ -59,10 +57,11 @@
|
||||
|
||||
<script lang="ts" setup>
|
||||
import snarkdown from 'snarkdown'
|
||||
import { ComputedRef, computed, capitalize } from 'vue'
|
||||
import { computed, capitalize } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import { ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { linkifyAndClean } from '@/utils/inputs'
|
||||
|
||||
@ -113,7 +112,7 @@
|
||||
}
|
||||
.about-instance {
|
||||
font-weight: bold;
|
||||
margin-top: $default-margin*3;
|
||||
margin-top: $default-margin * 3;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
@ -73,7 +73,7 @@
|
||||
:disabled="!edition"
|
||||
/>
|
||||
</label>
|
||||
<label class="about-label" for="about">
|
||||
<label class="about-label" for="about">
|
||||
{{ $t('admin.ABOUT.TEXT') }}:
|
||||
</label>
|
||||
<span class="textarea-description">
|
||||
@ -88,7 +88,13 @@
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
v-html="snarkdown(linkifyAndClean(appData.about ? appData.about : $t('admin.NO_TEXT_ENTERED')))"
|
||||
v-html="
|
||||
snarkdown(
|
||||
linkifyAndClean(
|
||||
appData.about ? appData.about : $t('admin.NO_TEXT_ENTERED')
|
||||
)
|
||||
)
|
||||
"
|
||||
class="textarea-content"
|
||||
/>
|
||||
<label class="privacy-policy-label" for="privacy_policy">
|
||||
@ -106,7 +112,15 @@
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
v-html="snarkdown(linkifyAndClean(appData.privacy_policy ? appData.privacy_policy : $t('admin.NO_TEXT_ENTERED')))"
|
||||
v-html="
|
||||
snarkdown(
|
||||
linkifyAndClean(
|
||||
appData.privacy_policy
|
||||
? appData.privacy_policy
|
||||
: $t('admin.NO_TEXT_ENTERED')
|
||||
)
|
||||
)
|
||||
"
|
||||
class="textarea-content"
|
||||
/>
|
||||
<ErrorMessage :message="errorMessages" v-if="errorMessages" />
|
||||
@ -137,19 +151,12 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import snarkdown from 'snarkdown'
|
||||
import {
|
||||
ComputedRef,
|
||||
capitalize,
|
||||
computed,
|
||||
reactive,
|
||||
withDefaults,
|
||||
onBeforeMount,
|
||||
toRefs,
|
||||
} from 'vue'
|
||||
import { capitalize, computed, reactive, onBeforeMount, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
import { ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig, TAppConfigForm } from '@/types/application'
|
||||
import type { TAppConfig, TAppConfigForm } from '@/types/application'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { getFileSizeInMB } from '@/utils/files'
|
||||
import { linkifyAndClean } from '@/utils/inputs'
|
||||
@ -187,19 +194,17 @@
|
||||
|
||||
function updateForm(appConfig: TAppConfig) {
|
||||
Object.keys(appData).map((key) => {
|
||||
['max_single_file_size', 'max_zip_file_size'].includes(key)
|
||||
? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
(appData[key] = getFileSizeInMB(appConfig[key]))
|
||||
: ['about', 'privacy_policy'].includes(key)
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
? appData[key] = appConfig[key]!== null
|
||||
? appConfig[key]
|
||||
: ''
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
: (appData[key] = appConfig[key])
|
||||
;['max_single_file_size', 'max_zip_file_size'].includes(key)
|
||||
? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
(appData[key] = getFileSizeInMB(appConfig[key]))
|
||||
: ['about', 'privacy_policy'].includes(key)
|
||||
? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
(appData[key] = appConfig[key] !== null ? appConfig[key] : '')
|
||||
: // eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
(appData[key] = appConfig[key])
|
||||
})
|
||||
}
|
||||
function onCancel() {
|
||||
@ -232,7 +237,7 @@
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
textarea {
|
||||
textarea {
|
||||
margin-bottom: $default-padding;
|
||||
}
|
||||
.textarea-description {
|
||||
@ -242,6 +247,5 @@
|
||||
margin-bottom: $default-margin;
|
||||
padding: $default-padding;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
|
@ -54,18 +54,18 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { capitalize, onMounted, toRefs, withDefaults } from 'vue'
|
||||
import { capitalize, onMounted, toRefs } from 'vue'
|
||||
|
||||
import AppStatsCards from '@/components/Administration/AppStatsCards.vue'
|
||||
import Card from '@/components/Common/Card.vue'
|
||||
import { IAppStatistics, TAppConfig } from '@/types/application'
|
||||
import type { IAppStatistics, TAppConfig } from '@/types/application'
|
||||
|
||||
interface Props {
|
||||
appConfig: TAppConfig
|
||||
appStatistics?: IAppStatistics
|
||||
}
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
appStatistics: () => ({} as IAppStatistics),
|
||||
appStatistics: () => ({}) as IAppStatistics,
|
||||
})
|
||||
|
||||
const { appConfig, appStatistics } = toRefs(props)
|
||||
|
@ -84,11 +84,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed } from 'vue'
|
||||
import { computed } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { ROOT_STORE, SPORTS_STORE } from '@/store/constants'
|
||||
import { ITranslatedSport } from '@/types/sports'
|
||||
import type { ITranslatedSport } from '@/types/sports'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { translateSports } from '@/utils/sports'
|
||||
|
||||
|
@ -134,8 +134,6 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
computed,
|
||||
reactive,
|
||||
watch,
|
||||
@ -143,15 +141,17 @@
|
||||
onBeforeMount,
|
||||
onUnmounted,
|
||||
} from 'vue'
|
||||
import { LocationQuery, useRoute, useRouter } from 'vue-router'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import type { LocationQuery } from 'vue-router'
|
||||
|
||||
import FilterSelects from '@/components/Common/FilterSelects.vue'
|
||||
import Pagination from '@/components/Common/Pagination.vue'
|
||||
import UserPicture from '@/components/User/UserPicture.vue'
|
||||
import UsersNameFilter from '@/components/Users/UsersNameFilter.vue'
|
||||
import { AUTH_USER_STORE, ROOT_STORE, USERS_STORE } from '@/store/constants'
|
||||
import { IPagination, TPaginationPayload } from '@/types/api'
|
||||
import { IAuthUserProfile, IUserProfile } from '@/types/user'
|
||||
import type { IPagination, TPaginationPayload } from '@/types/api'
|
||||
import type { IAuthUserProfile, IUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { getQuery, sortList } from '@/utils/api'
|
||||
import { formatDate } from '@/utils/dates'
|
||||
|
@ -27,7 +27,7 @@
|
||||
import { computed, toRefs } from 'vue'
|
||||
|
||||
import StatCard from '@/components/Common/StatCard.vue'
|
||||
import { IAppStatistics } from '@/types/application'
|
||||
import type { IAppStatistics } from '@/types/application'
|
||||
import { getReadableFileSize } from '@/utils/files'
|
||||
|
||||
interface Props {
|
||||
|
@ -15,7 +15,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, watch, withDefaults } from 'vue'
|
||||
import { ref, watch } from 'vue'
|
||||
|
||||
interface Props {
|
||||
name: string
|
||||
|
@ -7,9 +7,10 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, toRefs, withDefaults } from 'vue'
|
||||
import { computed, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import { TUnit } from '@/types/units'
|
||||
import type { TUnit } from '@/types/units'
|
||||
import { units, convertDistance } from '@/utils/units'
|
||||
|
||||
interface Props {
|
||||
|
@ -29,7 +29,7 @@
|
||||
import { ref, toRefs, watch } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import { IDropdownOption, TDropdownOptions } from '@/types/forms'
|
||||
import type { IDropdownOption, TDropdownOptions } from '@/types/forms'
|
||||
interface Props {
|
||||
options: TDropdownOptions
|
||||
selected: string
|
||||
|
@ -11,7 +11,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { toRefs, withDefaults } from 'vue'
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
interface Props {
|
||||
title: string
|
||||
|
@ -45,7 +45,7 @@
|
||||
<script setup lang="ts">
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { TPaginationPayload } from '@/types/api'
|
||||
import type { TPaginationPayload } from '@/types/api'
|
||||
|
||||
interface Props {
|
||||
order_by: string[]
|
||||
|
@ -56,7 +56,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'EmailSent',
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'ErrorImg',
|
||||
}
|
||||
|
@ -87,7 +87,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Password',
|
||||
}
|
||||
|
@ -44,7 +44,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'CyclingSport',
|
||||
}
|
||||
|
@ -26,7 +26,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'CyclingTransport',
|
||||
}
|
||||
|
@ -1,38 +1,47 @@
|
||||
<template>
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Capa_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 491.737 491.737"
|
||||
style="enable-background: new 0 0 491.737 491.737"
|
||||
xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<desc
|
||||
id="cyclingVirtualDescription">
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Capa_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 491.737 491.737"
|
||||
style="enable-background: new 0 0 491.737 491.737"
|
||||
xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<desc id="cyclingVirtualDescription">
|
||||
silhouette of a person riding a bicycle with virtual indicator
|
||||
</desc>
|
||||
<path
|
||||
d="m 321.097,112.359 c 20.973,12.338 47.985,5.315 60.293,-15.652 12.34,-20.973 5.35,-47.974 -15.623,-60.304 -21.009,-12.332 -47.99,-5.317 -60.314,15.65 -12.324,20.983 -5.35,47.974 15.644,60.306 z"
|
||||
id="path3" /><path
|
||||
d="m 393.081,264.102 c -2.414,0 -4.8,0.194 -7.169,0.362 l -14.431,-71.605 4.702,-1.757 c 10.666,-3.987 16.093,-15.868 12.098,-26.54 -3.994,-10.681 -15.946,-16.084 -26.531,-12.09 l -51.823,19.38 -2.321,-18.864 c 6.3,-13.193 5.541,-29.78 -4.767,-41.482 -21.224,-24.092 -47.12,-12.508 -55.191,-5.976 l -106.884,86.555 0.016,0.024 c -3.319,2.893 -6.089,6.485 -7.86,10.842 -2.191,5.396 -2.596,11.067 -1.564,16.384 -8.503,0.669 -15.255,7.571 -15.255,16.246 0,9.085 7.346,16.44 16.432,16.48 l -6.797,15.906 c -8.62,-2.465 -17.674,-3.866 -27.066,-3.866 C 44.27,264.102 0,308.354 0,362.754 c 0,54.403 44.27,98.663 98.668,98.663 54.403,0 98.652,-44.26 98.652,-98.663 0,-36.228 -19.683,-67.867 -48.858,-85.024 l 10.957,-25.652 h 17.767 l 60.281,24.462 -32.201,52.773 c -8.297,13.612 -3.994,31.382 9.615,39.685 4.691,2.86 9.878,4.229 15,4.229 9.729,0 19.234,-4.929 24.677,-13.838 l 29.339,-48.095 19.072,11.511 c -5.447,12.227 -8.54,25.726 -8.54,39.95 0,54.403 44.254,98.663 98.652,98.663 54.402,0 98.656,-44.26 98.656,-98.663 0,-54.401 -44.254,-98.653 -98.656,-98.653 z M 98.668,436.671 c -40.756,0 -73.923,-33.161 -73.923,-73.917 0,-40.756 33.167,-73.909 73.923,-73.909 5.944,0 11.649,0.896 17.188,2.224 L 95.38,338.962 c -11.758,1.619 -20.843,11.598 -20.843,23.792 0,13.323 10.808,24.132 24.13,24.132 8.767,0 16.367,-4.745 20.589,-11.76 h 52.065 c -5.926,34.862 -36.133,61.545 -72.653,61.545 z m 72.654,-86.288 h -52.065 c -0.355,-0.588 -0.708,-1.176 -1.112,-1.732 l 20.476,-47.901 c 17.058,11.026 29.172,28.845 32.701,49.633 z m 125.459,-60.208 7.666,-12.564 c 4.416,-7.233 5.431,-16.038 2.774,-24.084 -2.661,-8.046 -8.718,-14.515 -16.562,-17.704 l -52.725,-21.395 32.443,-26.281 1.804,14.691 c 0.756,6.267 4.366,11.841 9.761,15.12 3.271,1.981 6.979,2.988 10.698,2.988 2.435,0 4.88,-0.435 7.218,-1.306 l 48.15,-18.001 13.627,67.691 c -18.268,6.162 -34.117,17.51 -45.848,32.314 z m 78.615,47.458 -38.003,-22.94 c 7.877,-9.118 17.787,-16.319 29.205,-20.734 z m 17.685,99.038 c -40.757,0 -73.907,-33.161 -73.907,-73.917 0,-9.544 1.965,-18.597 5.268,-26.983 l 44.541,26.888 c 0,0.032 -0.016,0.064 -0.016,0.095 0,13.323 10.808,24.132 24.114,24.132 13.322,0 24.118,-10.81 24.118,-24.132 0,-10.478 -6.721,-19.307 -16.06,-22.64 l -10.277,-51.043 c 0.756,-0.024 1.463,-0.226 2.22,-0.226 40.757,0 73.911,33.153 73.911,73.909 -10e-4,40.756 -33.155,73.917 -73.912,73.917 z"
|
||||
id="path5" />
|
||||
<g
|
||||
id="g10174"
|
||||
transform="rotate(-45,60.058765,120.50397)"><path
|
||||
d="m 100.16593,30.670651 c -5.521751,5.521749 -5.521751,14.11256 0,19.638597 17.79324,17.793301 28.22948,42.342094 28.22948,67.502302 0,25.77277 -9.81917,49.70354 -27.61257,67.50231 -5.521761,5.52175 -5.521761,14.11256 0,19.63859 2.45267,2.45269 6.13811,4.29754 9.81916,4.29754 3.68106,0 7.36234,-1.22848 9.81921,-4.29754 23.31927,-23.31932 36.20348,-54.00119 36.20348,-87.1365 0,-33.134258 -12.88856,-63.816092 -36.20348,-87.136525 -6.14243,-5.530298 -14.73279,-5.530298 -20.25443,-0.0085 z"
|
||||
id="path3370"
|
||||
style="stroke-width:1.09578" /><path
|
||||
d="m 83.597679,66.875252 c -5.52175,-5.521722 -14.11255,-5.521722 -19.63857,0 -5.52175,5.521756 -5.52175,14.11259 0,19.6386 8.59071,8.5907 12.88856,19.638598 12.88856,31.294418 0,11.66021 -4.90967,23.31931 -12.88856,31.29441 -5.52175,5.52175 -5.52175,14.11256 0,19.63859 2.45267,2.45269 6.13812,4.29754 9.81917,4.29754 3.68105,0 7.36233,-1.22847 9.81917,-4.29754 13.50002,-13.50004 21.479501,-31.91025 20.862591,-50.93191 0.61209,-19.026028 -6.750211,-37.431868 -20.862591,-50.93189 z"
|
||||
id="path3372"
|
||||
style="stroke-width:1.09578" /><path
|
||||
d="m 54.143079,118.42081 c 0,11.86074 -9.61798,21.47512 -21.4795,21.47512 -11.861488,0 -21.4795,-9.61372 -21.4795,-21.47512 0,-11.86141 9.618012,-21.479498 21.4795,-21.479498 11.86152,0 21.4795,9.618008 21.4795,21.479498"
|
||||
id="path3378"
|
||||
style="stroke-width:1.09578" /></g></svg>
|
||||
d="m 321.097,112.359 c 20.973,12.338 47.985,5.315 60.293,-15.652 12.34,-20.973 5.35,-47.974 -15.623,-60.304 -21.009,-12.332 -47.99,-5.317 -60.314,15.65 -12.324,20.983 -5.35,47.974 15.644,60.306 z"
|
||||
id="path3"
|
||||
/>
|
||||
<path
|
||||
d="m 393.081,264.102 c -2.414,0 -4.8,0.194 -7.169,0.362 l -14.431,-71.605 4.702,-1.757 c 10.666,-3.987 16.093,-15.868 12.098,-26.54 -3.994,-10.681 -15.946,-16.084 -26.531,-12.09 l -51.823,19.38 -2.321,-18.864 c 6.3,-13.193 5.541,-29.78 -4.767,-41.482 -21.224,-24.092 -47.12,-12.508 -55.191,-5.976 l -106.884,86.555 0.016,0.024 c -3.319,2.893 -6.089,6.485 -7.86,10.842 -2.191,5.396 -2.596,11.067 -1.564,16.384 -8.503,0.669 -15.255,7.571 -15.255,16.246 0,9.085 7.346,16.44 16.432,16.48 l -6.797,15.906 c -8.62,-2.465 -17.674,-3.866 -27.066,-3.866 C 44.27,264.102 0,308.354 0,362.754 c 0,54.403 44.27,98.663 98.668,98.663 54.403,0 98.652,-44.26 98.652,-98.663 0,-36.228 -19.683,-67.867 -48.858,-85.024 l 10.957,-25.652 h 17.767 l 60.281,24.462 -32.201,52.773 c -8.297,13.612 -3.994,31.382 9.615,39.685 4.691,2.86 9.878,4.229 15,4.229 9.729,0 19.234,-4.929 24.677,-13.838 l 29.339,-48.095 19.072,11.511 c -5.447,12.227 -8.54,25.726 -8.54,39.95 0,54.403 44.254,98.663 98.652,98.663 54.402,0 98.656,-44.26 98.656,-98.663 0,-54.401 -44.254,-98.653 -98.656,-98.653 z M 98.668,436.671 c -40.756,0 -73.923,-33.161 -73.923,-73.917 0,-40.756 33.167,-73.909 73.923,-73.909 5.944,0 11.649,0.896 17.188,2.224 L 95.38,338.962 c -11.758,1.619 -20.843,11.598 -20.843,23.792 0,13.323 10.808,24.132 24.13,24.132 8.767,0 16.367,-4.745 20.589,-11.76 h 52.065 c -5.926,34.862 -36.133,61.545 -72.653,61.545 z m 72.654,-86.288 h -52.065 c -0.355,-0.588 -0.708,-1.176 -1.112,-1.732 l 20.476,-47.901 c 17.058,11.026 29.172,28.845 32.701,49.633 z m 125.459,-60.208 7.666,-12.564 c 4.416,-7.233 5.431,-16.038 2.774,-24.084 -2.661,-8.046 -8.718,-14.515 -16.562,-17.704 l -52.725,-21.395 32.443,-26.281 1.804,14.691 c 0.756,6.267 4.366,11.841 9.761,15.12 3.271,1.981 6.979,2.988 10.698,2.988 2.435,0 4.88,-0.435 7.218,-1.306 l 48.15,-18.001 13.627,67.691 c -18.268,6.162 -34.117,17.51 -45.848,32.314 z m 78.615,47.458 -38.003,-22.94 c 7.877,-9.118 17.787,-16.319 29.205,-20.734 z m 17.685,99.038 c -40.757,0 -73.907,-33.161 -73.907,-73.917 0,-9.544 1.965,-18.597 5.268,-26.983 l 44.541,26.888 c 0,0.032 -0.016,0.064 -0.016,0.095 0,13.323 10.808,24.132 24.114,24.132 13.322,0 24.118,-10.81 24.118,-24.132 0,-10.478 -6.721,-19.307 -16.06,-22.64 l -10.277,-51.043 c 0.756,-0.024 1.463,-0.226 2.22,-0.226 40.757,0 73.911,33.153 73.911,73.909 -10e-4,40.756 -33.155,73.917 -73.912,73.917 z"
|
||||
id="path5"
|
||||
/>
|
||||
<g id="g10174" transform="rotate(-45,60.058765,120.50397)">
|
||||
<path
|
||||
d="m 100.16593,30.670651 c -5.521751,5.521749 -5.521751,14.11256 0,19.638597 17.79324,17.793301 28.22948,42.342094 28.22948,67.502302 0,25.77277 -9.81917,49.70354 -27.61257,67.50231 -5.521761,5.52175 -5.521761,14.11256 0,19.63859 2.45267,2.45269 6.13811,4.29754 9.81916,4.29754 3.68106,0 7.36234,-1.22848 9.81921,-4.29754 23.31927,-23.31932 36.20348,-54.00119 36.20348,-87.1365 0,-33.134258 -12.88856,-63.816092 -36.20348,-87.136525 -6.14243,-5.530298 -14.73279,-5.530298 -20.25443,-0.0085 z"
|
||||
id="path3370"
|
||||
style="stroke-width: 1.09578"
|
||||
/>
|
||||
<path
|
||||
d="m 83.597679,66.875252 c -5.52175,-5.521722 -14.11255,-5.521722 -19.63857,0 -5.52175,5.521756 -5.52175,14.11259 0,19.6386 8.59071,8.5907 12.88856,19.638598 12.88856,31.294418 0,11.66021 -4.90967,23.31931 -12.88856,31.29441 -5.52175,5.52175 -5.52175,14.11256 0,19.63859 2.45267,2.45269 6.13812,4.29754 9.81917,4.29754 3.68105,0 7.36233,-1.22847 9.81917,-4.29754 13.50002,-13.50004 21.479501,-31.91025 20.862591,-50.93191 0.61209,-19.026028 -6.750211,-37.431868 -20.862591,-50.93189 z"
|
||||
id="path3372"
|
||||
style="stroke-width: 1.09578"
|
||||
/>
|
||||
<path
|
||||
d="m 54.143079,118.42081 c 0,11.86074 -9.61798,21.47512 -21.4795,21.47512 -11.861488,0 -21.4795,-9.61372 -21.4795,-21.47512 0,-11.86141 9.618012,-21.479498 21.4795,-21.479498 11.86152,0 21.4795,9.618008 21.4795,21.479498"
|
||||
id="path3378"
|
||||
style="stroke-width: 1.09578"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'CyclingVirtual',
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Hiking',
|
||||
}
|
||||
|
@ -44,7 +44,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'MountainBiking',
|
||||
}
|
||||
|
@ -64,7 +64,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'MountainBikingElectric',
|
||||
}
|
||||
|
@ -50,7 +50,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Mountaineering',
|
||||
}
|
||||
|
@ -138,7 +138,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'OpenWaterSwimming',
|
||||
}
|
||||
|
@ -33,7 +33,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Paragliding',
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Rowing',
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Running',
|
||||
}
|
||||
|
@ -35,7 +35,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'SkiingAlpine',
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'SkiingCrossCountry',
|
||||
}
|
||||
|
@ -55,7 +55,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Snowshoes',
|
||||
}
|
||||
|
@ -37,7 +37,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Trail',
|
||||
}
|
||||
|
@ -25,7 +25,7 @@
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'Walking',
|
||||
}
|
||||
|
@ -38,14 +38,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
ComputedRef,
|
||||
computed,
|
||||
onUnmounted,
|
||||
onMounted,
|
||||
toRefs,
|
||||
withDefaults,
|
||||
} from 'vue'
|
||||
import { computed, onUnmounted, onMounted, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import { ROOT_STORE } from '@/store/constants'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
@ -8,7 +8,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Ref, onMounted, ref, toRefs, withDefaults, onUnmounted } from 'vue'
|
||||
import { onMounted, ref, toRefs, onUnmounted } from 'vue'
|
||||
import type { Ref } from 'vue'
|
||||
|
||||
import Error from '@/components/Common/Error.vue'
|
||||
interface Props {
|
||||
|
@ -51,9 +51,9 @@
|
||||
<script setup lang="ts">
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { IPagination, TPaginationPayload } from '@/types/api'
|
||||
import { IOauth2ClientsPayload } from '@/types/oauth'
|
||||
import { TWorkoutsPayload } from '@/types/workouts'
|
||||
import type { IPagination, TPaginationPayload } from '@/types/api'
|
||||
import type { IOauth2ClientsPayload } from '@/types/oauth'
|
||||
import type { TWorkoutsPayload } from '@/types/workouts'
|
||||
import { rangePagination } from '@/utils/api'
|
||||
|
||||
interface Props {
|
||||
|
@ -30,7 +30,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Ref, ref, toRefs, watch, withDefaults } from 'vue'
|
||||
import { ref, toRefs, watch } from 'vue'
|
||||
import type { Ref } from 'vue'
|
||||
|
||||
import PasswordStrength from '@/components/Common/PasswordStength.vue'
|
||||
|
||||
|
@ -29,15 +29,8 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { zxcvbn } from '@zxcvbn-ts/core'
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
computed,
|
||||
ref,
|
||||
onBeforeMount,
|
||||
toRefs,
|
||||
watch,
|
||||
} from 'vue'
|
||||
import { computed, ref, onBeforeMount, toRefs, watch } from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
@ -23,9 +23,9 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { toRefs, withDefaults } from 'vue'
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { IWorkout } from '@/types/workouts'
|
||||
import type { IWorkout } from '@/types/workouts'
|
||||
import { getApiUrl } from '@/utils'
|
||||
|
||||
interface Props {
|
||||
|
@ -5,13 +5,14 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { ChartOptions, LayoutItem } from 'chart.js'
|
||||
import { PropType, computed, defineComponent } from 'vue'
|
||||
import type { ChartOptions, LayoutItem } from 'chart.js'
|
||||
import { computed, defineComponent } from 'vue'
|
||||
import type { PropType } from 'vue'
|
||||
import { BarChart, useBarChart } from 'vue-chart-3'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { IChartDataset } from '@/types/chart'
|
||||
import { TStatisticsDatasetKeys } from '@/types/statistics'
|
||||
import type { IChartDataset } from '@/types/chart'
|
||||
import type { TStatisticsDatasetKeys } from '@/types/statistics'
|
||||
import { formatTooltipValue } from '@/utils/tooltip'
|
||||
|
||||
export default defineComponent({
|
||||
|
@ -81,28 +81,20 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import {
|
||||
ComputedRef,
|
||||
PropType,
|
||||
Ref,
|
||||
computed,
|
||||
defineComponent,
|
||||
ref,
|
||||
watch,
|
||||
onBeforeMount,
|
||||
} from 'vue'
|
||||
import { computed, defineComponent, ref, watch, onBeforeMount } from 'vue'
|
||||
import type { ComputedRef, PropType, Ref } from 'vue'
|
||||
|
||||
import Chart from '@/components/Common/StatsChart/Chart.vue'
|
||||
import { STATS_STORE } from '@/store/constants'
|
||||
import { ISport } from '@/types/sports'
|
||||
import {
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type {
|
||||
IStatisticsChartData,
|
||||
TStatisticsDatasetKeys,
|
||||
IStatisticsDateParams,
|
||||
TStatisticsFromApi,
|
||||
IStatisticsParams,
|
||||
} from '@/types/statistics'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { formatStats } from '@/utils/statistics'
|
||||
|
||||
|
@ -33,14 +33,15 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, ref, onBeforeMount, toRefs } from 'vue'
|
||||
import { computed, ref, onBeforeMount, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import WorkoutCard from '@/components/Workout/WorkoutCard.vue'
|
||||
import NoWorkouts from '@/components/Workouts/NoWorkouts.vue'
|
||||
import { WORKOUTS_STORE } from '@/store/constants'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IUserProfile } from '@/types/user'
|
||||
import { IWorkout } from '@/types/workouts'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IUserProfile } from '@/types/user'
|
||||
import type { IWorkout } from '@/types/workouts'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { defaultOrder } from '@/utils/workouts'
|
||||
|
||||
|
@ -26,11 +26,12 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { addDays, format, isSameDay, isSameMonth, isToday } from 'date-fns'
|
||||
import { Ref, ref, toRefs, watch, onMounted } from 'vue'
|
||||
import { ref, toRefs, watch, onMounted } from 'vue'
|
||||
import type { Ref } from 'vue'
|
||||
|
||||
import CalendarWorkouts from '@/components/Dashboard/UserCalendar/CalendarWorkouts.vue'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IWorkout } from '@/types/workouts'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IWorkout } from '@/types/workouts'
|
||||
import { getDateWithTZ } from '@/utils/dates'
|
||||
|
||||
interface Props {
|
||||
|
@ -7,7 +7,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Locale, format, addDays } from 'date-fns'
|
||||
import { format, addDays } from 'date-fns'
|
||||
import type { Locale } from 'date-fns'
|
||||
|
||||
interface Props {
|
||||
startDate: Date
|
||||
|
@ -21,7 +21,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Locale, format } from 'date-fns'
|
||||
import { format } from 'date-fns'
|
||||
import type { Locale } from 'date-fns'
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
interface Props {
|
||||
|
@ -30,7 +30,7 @@
|
||||
<script setup lang="ts">
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { IWorkout } from '@/types/workouts'
|
||||
import type { IWorkout } from '@/types/workouts'
|
||||
interface Props {
|
||||
displayHARecord: boolean
|
||||
workout: IWorkout
|
||||
|
@ -41,8 +41,8 @@
|
||||
|
||||
import CalendarWorkout from '@/components/Dashboard/UserCalendar/CalendarWorkout.vue'
|
||||
import CalendarWorkoutsChart from '@/components/Dashboard/UserCalendar/CalendarWorkoutsChart.vue'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IWorkout } from '@/types/workouts'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IWorkout } from '@/types/workouts'
|
||||
import { getSportColor, getSportLabel, sportIdColors } from '@/utils/sports'
|
||||
import { getDonutDatasets } from '@/utils/workouts'
|
||||
|
||||
|
@ -28,8 +28,8 @@
|
||||
|
||||
import CalendarWorkout from '@/components/Dashboard/UserCalendar/CalendarWorkout.vue'
|
||||
import DonutChart from '@/components/Dashboard/UserCalendar/DonutChart.vue'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IWorkout } from '@/types/workouts'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IWorkout } from '@/types/workouts'
|
||||
import { getSportColor, getSportLabel } from '@/utils/sports'
|
||||
|
||||
interface Props {
|
||||
@ -88,7 +88,8 @@
|
||||
.more-workouts {
|
||||
background: whitesmoke;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2),
|
||||
box-shadow:
|
||||
0 4px 8px 0 rgba(0, 0, 0, 0.2),
|
||||
0 6px 20px 0 rgba(0, 0, 0, 0.19);
|
||||
position: absolute;
|
||||
top: 52px;
|
||||
|
@ -26,16 +26,18 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Locale, addMonths, format, subMonths } from 'date-fns'
|
||||
import { ComputedRef, computed, ref, toRefs, onBeforeMount } from 'vue'
|
||||
import { addMonths, format, subMonths } from 'date-fns'
|
||||
import type { Locale } from 'date-fns'
|
||||
import { computed, ref, toRefs, onBeforeMount } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import CalendarCells from '@/components/Dashboard/UserCalendar/CalendarCells.vue'
|
||||
import CalendarDays from '@/components/Dashboard/UserCalendar/CalendarDays.vue'
|
||||
import CalendarHeader from '@/components/Dashboard/UserCalendar/CalendarHeader.vue'
|
||||
import { ROOT_STORE, WORKOUTS_STORE } from '@/store/constants'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import { IWorkout, TWorkoutsPayload } from '@/types/workouts'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import type { IWorkout, TWorkoutsPayload } from '@/types/workouts'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { getCalendarStartAndEnd } from '@/utils/dates'
|
||||
import { defaultOrder } from '@/utils/workouts'
|
||||
|
@ -20,8 +20,8 @@
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import StatChart from '@/components/Common/StatsChart/index.vue'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IUserProfile } from '@/types/user'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IUserProfile } from '@/types/user'
|
||||
|
||||
interface Props {
|
||||
sports: ISport[]
|
||||
|
@ -35,7 +35,7 @@
|
||||
import { toRefs } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { ICardRecord, IRecord, IRecordsBySports } from '@/types/workouts'
|
||||
import type { ICardRecord, IRecord, IRecordsBySports } from '@/types/workouts'
|
||||
import { sortRecords } from '@/utils/records'
|
||||
|
||||
interface Props {
|
||||
|
@ -24,8 +24,8 @@
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import RecordsCard from '@/components/Dashboard/UserRecords/RecordsCard.vue'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { getRecordsBySports } from '@/utils/records'
|
||||
import { translateSports } from '@/utils/sports'
|
||||
|
||||
|
@ -31,12 +31,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, toRefs } from 'vue'
|
||||
import { computed, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import StatCard from '@/components/Common/StatCard.vue'
|
||||
import { TUnit } from '@/types/units'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { TUnit } from '@/types/units'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { convertDistance, units } from '@/utils/units'
|
||||
interface Props {
|
||||
user: IAuthUserProfile
|
||||
@ -56,17 +57,28 @@
|
||||
: distanceUnitFrom
|
||||
const totalDistance: ComputedRef<number> = computed(() =>
|
||||
user.value.imperial_units
|
||||
? convertDistance(user.value.total_distance, distanceUnitFrom, distanceUnitTo, 2)
|
||||
: parseFloat(user.value.total_distance.toFixed(2)))
|
||||
? convertDistance(
|
||||
user.value.total_distance,
|
||||
distanceUnitFrom,
|
||||
distanceUnitTo,
|
||||
2
|
||||
)
|
||||
: parseFloat(user.value.total_distance.toFixed(2))
|
||||
)
|
||||
const ascentUnitFrom: TUnit = 'm'
|
||||
const ascentUnitTo: TUnit = user.value.imperial_units
|
||||
? units[ascentUnitFrom].defaultTarget
|
||||
: ascentUnitFrom
|
||||
const totalAscent: ComputedRef<number> = computed(() =>
|
||||
user.value.imperial_units
|
||||
? convertDistance(user.value.total_ascent, ascentUnitFrom, ascentUnitTo, 2)
|
||||
: parseFloat(user.value.total_ascent.toFixed(2)))
|
||||
|
||||
? convertDistance(
|
||||
user.value.total_ascent,
|
||||
ascentUnitFrom,
|
||||
ascentUnitTo,
|
||||
2
|
||||
)
|
||||
: parseFloat(user.value.total_ascent.toFixed(2))
|
||||
)
|
||||
|
||||
function get_duration(total_duration: ComputedRef<string>) {
|
||||
const duration = total_duration.value.match(/day/g)
|
||||
|
@ -93,12 +93,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, Ref, computed, ref, capitalize } from 'vue'
|
||||
import { computed, ref, capitalize } from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
|
||||
import UserPicture from '@/components/User/UserPicture.vue'
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { IDropdownOption } from '@/types/forms'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { IDropdownOption } from '@/types/forms'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { availableLanguages } from '@/utils/locales'
|
||||
|
||||
|
@ -25,11 +25,12 @@
|
||||
|
||||
<script lang="ts" setup>
|
||||
import snarkdown from 'snarkdown'
|
||||
import { ComputedRef, capitalize, computed } from 'vue'
|
||||
import { capitalize, computed } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { dateStringFormats, formatDate } from '@/utils/dates'
|
||||
import { linkifyAndClean } from '@/utils/inputs'
|
||||
|
@ -10,16 +10,13 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@import '~@/scss/vars.scss';
|
||||
|
||||
.privacy-policy-message {
|
||||
background: var(--alert-background-color);
|
||||
color: var(--alert-color);
|
||||
border-radius: $border-radius;
|
||||
padding: $default-padding $default-padding*2;
|
||||
padding: $default-padding $default-padding * 2;
|
||||
}
|
||||
</style>
|
||||
|
@ -8,7 +8,7 @@
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
:id="sport.id"
|
||||
:id="`${sport.id}`"
|
||||
:name="sport.label"
|
||||
:checked="selectedSportIds.includes(sport.id)"
|
||||
@input="updateSelectedSportIds(sport.id)"
|
||||
@ -20,10 +20,11 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, inject, withDefaults, toRefs } from 'vue'
|
||||
import { computed, inject, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { ISport, ITranslatedSport } from '@/types/sports'
|
||||
import type { ISport, ITranslatedSport } from '@/types/sports'
|
||||
import { translateSports } from '@/utils/sports'
|
||||
|
||||
interface Props {
|
||||
@ -38,7 +39,7 @@
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const sportColors = inject('sportColors')
|
||||
const sportColors: Record<string, string> | undefined = inject('sportColors')
|
||||
const { selectedSportIds } = toRefs(props)
|
||||
const translatedSports: ComputedRef<ITranslatedSport[]> = computed(() =>
|
||||
translateSports(props.userSports, t)
|
||||
|
@ -22,15 +22,16 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, Ref, computed, ref, toRefs, watch } from 'vue'
|
||||
import { computed, ref, toRefs, watch } from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import StatChart from '@/components/Common/StatsChart/index.vue'
|
||||
import StatsMenu from '@/components/Statistics/StatsMenu.vue'
|
||||
import SportsMenu from '@/components/Statistics/StatsSportsMenu.vue'
|
||||
import { ISport, ITranslatedSport } from '@/types/sports'
|
||||
import { IStatisticsDateParams } from '@/types/statistics'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { ISport, ITranslatedSport } from '@/types/sports'
|
||||
import type { IStatisticsDateParams } from '@/types/statistics'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { translateSports } from '@/utils/sports'
|
||||
import { getStatsDateParams, updateChartParams } from '@/utils/statistics'
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { toRefs, withDefaults } from 'vue'
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import UserAuthForm from '@/components/User/UserAuthForm.vue'
|
||||
|
||||
|
@ -34,11 +34,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, ComputedRef, toRefs } from 'vue'
|
||||
import { computed, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import UserPicture from '@/components/User/UserPicture.vue'
|
||||
import { AUTH_USER_STORE } from '@/store/constants'
|
||||
import { IAuthUserProfile, IUserProfile } from '@/types/user'
|
||||
import type { IAuthUserProfile, IUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
||||
interface Props {
|
||||
|
@ -120,20 +120,12 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
computed,
|
||||
ref,
|
||||
toRefs,
|
||||
withDefaults,
|
||||
watch,
|
||||
onUnmounted,
|
||||
} from 'vue'
|
||||
import { computed, ref, toRefs, watch, onUnmounted } from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
|
||||
import { AUTH_USER_STORE, ROOT_STORE, USERS_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import { IAuthUserProfile, IUserProfile } from '@/types/user'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import type { IAuthUserProfile, IUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { formatDate, getDateFormat } from '@/utils/dates'
|
||||
import { localeFromLanguage } from '@/utils/locales'
|
||||
|
@ -56,10 +56,11 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, ComputedRef } from 'vue'
|
||||
import { computed } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import { ROOT_STORE } from '@/store/constants'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { getDateFormat } from '@/utils/dates'
|
||||
import { languageLabels } from '@/utils/locales'
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
import UserHeader from '@/components/User/ProfileDisplay/UserHeader.vue'
|
||||
import UserProfileTabs from '@/components/User/UserProfileTabs.vue'
|
||||
import { IUserProfile } from '@/types/user'
|
||||
import type { IUserProfile } from '@/types/user'
|
||||
|
||||
interface Props {
|
||||
user: IUserProfile
|
||||
|
@ -28,7 +28,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Ref, ref, toRefs, watch, withDefaults } from 'vue'
|
||||
import { ref, toRefs, watch } from 'vue'
|
||||
import type { Ref } from 'vue'
|
||||
|
||||
import { timeZones } from '@/utils/timezone'
|
||||
|
||||
|
@ -105,8 +105,6 @@
|
||||
<script setup lang="ts">
|
||||
import { isBefore, subDays } from 'date-fns'
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
computed,
|
||||
reactive,
|
||||
ref,
|
||||
@ -115,12 +113,13 @@
|
||||
watch,
|
||||
onUnmounted,
|
||||
} from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
|
||||
import authApi from '@/api/authApi'
|
||||
import PasswordInput from '@/components/Common/PasswordInput.vue'
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import {
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import type {
|
||||
IAuthUserProfile,
|
||||
IUserAccountPayload,
|
||||
IExportRequest,
|
||||
|
@ -62,10 +62,15 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import { ComputedRef, computed, reactive, onMounted, onUnmounted } from 'vue'
|
||||
import { computed, reactive, onMounted, onUnmounted } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { IUserProfile, IUserPayload, IAuthUserProfile } from '@/types/user'
|
||||
import type {
|
||||
IUserProfile,
|
||||
IUserPayload,
|
||||
IAuthUserProfile,
|
||||
} from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { formatDate } from '@/utils/dates'
|
||||
|
||||
|
@ -33,12 +33,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, Ref, computed, ref, toRefs, onUnmounted } from 'vue'
|
||||
import { computed, ref, toRefs, onUnmounted } from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
|
||||
import UserPicture from '@/components/User/UserPicture.vue'
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import { IUserProfile } from '@/types/user'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import type { IUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { getReadableFileSize } from '@/utils/files'
|
||||
|
||||
|
@ -165,11 +165,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, reactive, onMounted, onUnmounted } from 'vue'
|
||||
import { computed, reactive, onMounted, onUnmounted } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import TimezoneDropdown from '@/components/User/ProfileEdition/TimezoneDropdown.vue'
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { IUserPreferencesPayload, IAuthUserProfile } from '@/types/user'
|
||||
import type { IUserPreferencesPayload, IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { availableDateFormatOptions } from '@/utils/dates'
|
||||
import { availableLanguages } from '@/utils/locales'
|
||||
|
@ -17,10 +17,7 @@
|
||||
<div class="policy-content">
|
||||
<PrivacyPolicy />
|
||||
</div>
|
||||
<label
|
||||
for="accepted_policy"
|
||||
class="accepted_policy"
|
||||
>
|
||||
<label for="accepted_policy" class="accepted_policy">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="accepted_policy"
|
||||
@ -49,11 +46,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, ref, onUnmounted, toRefs } from 'vue'
|
||||
import { computed, ref, onUnmounted, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import PrivacyPolicy from '@/components/PrivacyPolicy.vue'
|
||||
import {AUTH_USER_STORE, ROOT_STORE} from '@/store/constants'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
||||
interface Props {
|
||||
@ -67,11 +65,12 @@
|
||||
const errorMessages: ComputedRef<string | string[] | null> = computed(
|
||||
() => store.getters[ROOT_STORE.GETTERS.ERROR_MESSAGES]
|
||||
)
|
||||
const acceptedPolicy= ref(false)
|
||||
const acceptedPolicy = ref(false)
|
||||
|
||||
function onSubmit() {
|
||||
store.dispatch(
|
||||
AUTH_USER_STORE.ACTIONS.ACCEPT_PRIVACY_POLICY, acceptedPolicy.value
|
||||
AUTH_USER_STORE.ACTIONS.ACCEPT_PRIVACY_POLICY,
|
||||
acceptedPolicy.value
|
||||
)
|
||||
}
|
||||
|
||||
@ -93,14 +92,14 @@
|
||||
|
||||
.policy-content {
|
||||
height: 500px;
|
||||
border:1px solid #ccc;
|
||||
border: 1px solid #ccc;
|
||||
overflow: auto;
|
||||
margin: $default-margin;
|
||||
border-radius: $border-radius;
|
||||
|
||||
@media screen and (max-width: $small-limit) {
|
||||
margin: $default-margin 0;
|
||||
font-size: .9em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.privacy-policy-text {
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
import UserProfileTabs from '@/components/User/UserProfileTabs.vue'
|
||||
import { AUTH_USER_STORE } from '@/store/constants'
|
||||
import { IUserProfile } from '@/types/user'
|
||||
import type { IUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
||||
interface Props {
|
||||
@ -34,7 +34,14 @@
|
||||
const store = useStore()
|
||||
|
||||
const { user, tab } = toRefs(props)
|
||||
const tabs = ['PROFILE', 'ACCOUNT', 'PICTURE', 'PREFERENCES', 'SPORTS', 'PRIVACY-POLICY']
|
||||
const tabs = [
|
||||
'PROFILE',
|
||||
'ACCOUNT',
|
||||
'PICTURE',
|
||||
'PREFERENCES',
|
||||
'SPORTS',
|
||||
'PRIVACY-POLICY',
|
||||
]
|
||||
const loading = computed(
|
||||
() => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]
|
||||
)
|
||||
|
@ -89,8 +89,8 @@
|
||||
import { computed, reactive } from 'vue'
|
||||
|
||||
import { OAUTH2_STORE } from '@/store/constants'
|
||||
import { IOAuth2ClientPayload } from '@/types/oauth'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { IOAuth2ClientPayload } from '@/types/oauth'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { admin_oauth2_scopes, oauth2_scopes } from '@/utils/oauth'
|
||||
|
||||
|
@ -39,11 +39,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, ComputedRef, onBeforeMount } from 'vue'
|
||||
import { computed, onBeforeMount } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import { OAUTH2_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { IOAuth2Client } from '@/types/oauth'
|
||||
import type { IOAuth2Client } from '@/types/oauth'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
||||
const route = useRoute()
|
||||
|
@ -110,17 +110,15 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
capitalize,
|
||||
computed,
|
||||
onBeforeMount,
|
||||
toRefs,
|
||||
ref,
|
||||
onUnmounted,
|
||||
withDefaults,
|
||||
watch,
|
||||
} from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import { OAUTH2_STORE, ROOT_STORE } from '@/store/constants'
|
||||
|
@ -37,14 +37,16 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, onBeforeMount, toRefs, watch } from 'vue'
|
||||
import { LocationQuery, useRoute } from 'vue-router'
|
||||
import { computed, onBeforeMount, toRefs, watch } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import type { LocationQuery } from 'vue-router'
|
||||
|
||||
import Pagination from '@/components/Common/Pagination.vue'
|
||||
import { OAUTH2_STORE } from '@/store/constants'
|
||||
import { IPagination } from '@/types/api'
|
||||
import { IOAuth2Client, IOauth2ClientsPayload } from '@/types/oauth'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { IPagination } from '@/types/api'
|
||||
import type { IOAuth2Client, IOauth2ClientsPayload } from '@/types/oauth'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { defaultPage, getNumberQueryValue } from '@/utils/api'
|
||||
import { formatDate } from '@/utils/dates'
|
||||
|
@ -8,7 +8,7 @@
|
||||
import { onUnmounted, toRefs } from 'vue'
|
||||
|
||||
import { OAUTH2_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
||||
interface Props {
|
||||
|
@ -163,22 +163,14 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
ComputedRef,
|
||||
computed,
|
||||
onUnmounted,
|
||||
reactive,
|
||||
ref,
|
||||
toRefs,
|
||||
watch,
|
||||
withDefaults,
|
||||
} from 'vue'
|
||||
import { computed, onUnmounted, reactive, ref, toRefs, watch } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import PasswordInput from '@/components/Common/PasswordInput.vue'
|
||||
import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import { ILoginRegisterFormData } from '@/types/user'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import type { ILoginRegisterFormData } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
|
||||
interface Props {
|
||||
@ -197,7 +189,7 @@
|
||||
username: '',
|
||||
email: '',
|
||||
password: '',
|
||||
accepted_policy: false
|
||||
accepted_policy: false,
|
||||
})
|
||||
const buttonText: ComputedRef<string> = computed(() =>
|
||||
getButtonText(props.action)
|
||||
@ -336,7 +328,7 @@
|
||||
.accepted_policy {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: .85em;
|
||||
font-size: 0.85em;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
|
||||
import { IUserProfile } from '@/types/user'
|
||||
import type { IUserProfile } from '@/types/user'
|
||||
import { getApiUrl } from '@/utils'
|
||||
|
||||
interface Props {
|
||||
|
@ -26,7 +26,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { onMounted, toRefs, withDefaults } from 'vue'
|
||||
import { onMounted, toRefs } from 'vue'
|
||||
|
||||
interface Props {
|
||||
tabs: string[]
|
||||
|
@ -165,12 +165,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, inject, reactive, toRefs, watch } from 'vue'
|
||||
import { computed, inject, reactive, toRefs, watch } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { AUTH_USER_STORE, ROOT_STORE, SPORTS_STORE } from '@/store/constants'
|
||||
import { ISport, ITranslatedSport } from '@/types/sports'
|
||||
import { IUserProfile, IUserSportPreferencesPayload } from '@/types/user'
|
||||
import type { ISport, ITranslatedSport } from '@/types/sports'
|
||||
import type { IUserProfile, IUserSportPreferencesPayload } from '@/types/user'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { translateSports } from '@/utils/sports'
|
||||
|
||||
|
@ -138,15 +138,17 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Locale, formatDistance } from 'date-fns'
|
||||
import { ComputedRef, computed, toRefs, withDefaults } from 'vue'
|
||||
import { formatDistance } from 'date-fns'
|
||||
import type { Locale } from 'date-fns'
|
||||
import { computed, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
|
||||
import StaticMap from '@/components/Common/StaticMap.vue'
|
||||
import UserPicture from '@/components/User/UserPicture.vue'
|
||||
import { ROOT_STORE } from '@/store/constants'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IUserProfile } from '@/types/user'
|
||||
import { IWorkout } from '@/types/workouts'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IUserProfile } from '@/types/user'
|
||||
import type { IWorkout } from '@/types/workouts'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { formatDate } from '@/utils/dates'
|
||||
|
||||
@ -157,8 +159,8 @@
|
||||
sport?: ISport
|
||||
}
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
workout: () => ({} as IWorkout),
|
||||
sport: () => ({} as ISport),
|
||||
workout: () => ({}) as IWorkout,
|
||||
sport: () => ({}) as ISport,
|
||||
})
|
||||
|
||||
const store = useStore()
|
||||
|
@ -19,7 +19,7 @@
|
||||
import { toRefs } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { IWeather } from '@/types/workouts'
|
||||
import type { IWeather } from '@/types/workouts'
|
||||
import { getWindSpeed } from '@/utils/units'
|
||||
import { convertDegreeToDirection } from '@/utils/weather'
|
||||
|
||||
|
@ -100,8 +100,8 @@
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import authApi from '@/api/authApi'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IWorkoutObject } from '@/types/workouts'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IWorkoutObject } from '@/types/workouts'
|
||||
|
||||
interface Props {
|
||||
sport: ISport
|
||||
|
@ -51,15 +51,16 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ChartData, ChartOptions } from 'chart.js'
|
||||
import { ComputedRef, computed, ref, toRefs } from 'vue'
|
||||
import type { ChartData, ChartOptions } from 'chart.js'
|
||||
import { computed, ref, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { LineChart, useLineChart } from 'vue-chart-3'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { htmlLegendPlugin } from '@/components/Workout/WorkoutDetail/WorkoutChart/legend'
|
||||
import { TUnit } from '@/types/units'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import {
|
||||
import type { TUnit } from '@/types/units'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import type {
|
||||
IWorkoutChartData,
|
||||
IWorkoutData,
|
||||
TCoordinates,
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { Chart, LegendItem } from 'chart.js'
|
||||
import { Chart } from 'chart.js'
|
||||
import type { LegendItem } from 'chart.js'
|
||||
|
||||
const getOrCreateLegendList = (id: string): HTMLUListElement => {
|
||||
const legendContainer = document.getElementById(id)
|
||||
|
@ -114,7 +114,7 @@
|
||||
|
||||
import WorkoutRecord from '@/components/Workout/WorkoutDetail/WorkoutRecord.vue'
|
||||
import WorkoutWeather from '@/components/Workout/WorkoutDetail/WorkoutWeather.vue'
|
||||
import { IWorkoutObject } from '@/types/workouts'
|
||||
import type { IWorkoutObject } from '@/types/workouts'
|
||||
|
||||
interface Props {
|
||||
workoutObject: IWorkoutObject
|
||||
|
@ -14,7 +14,7 @@
|
||||
import { LIcon, LMarker } from '@vue-leaflet/vue-leaflet'
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { TCoordinates } from '@/types/workouts'
|
||||
import type { TCoordinates } from '@/types/workouts'
|
||||
|
||||
interface Props {
|
||||
markerCoordinates: TCoordinates
|
||||
|
@ -16,6 +16,7 @@
|
||||
:zoomAnimation="false"
|
||||
ref="workoutMap"
|
||||
@ready="fitBounds(bounds)"
|
||||
:use-global-leaflet="false"
|
||||
>
|
||||
<LControlLayers />
|
||||
<LControl
|
||||
@ -90,14 +91,15 @@
|
||||
LMarker,
|
||||
LTileLayer,
|
||||
} from '@vue-leaflet/vue-leaflet'
|
||||
import { ComputedRef, computed, ref, toRefs, withDefaults } from 'vue'
|
||||
import { computed, ref, toRefs } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import 'leaflet/dist/leaflet.css'
|
||||
|
||||
import CustomMarker from '@/components/Workout/WorkoutDetail/WorkoutMap/CustomMarker.vue'
|
||||
import { ROOT_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import { GeoJSONData } from '@/types/geojson'
|
||||
import { IWorkoutData, TCoordinates } from '@/types/workouts'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import type { GeoJSONData } from '@/types/geojson'
|
||||
import type { IWorkoutData, TCoordinates } from '@/types/workouts'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { getApiUrl } from '@/utils'
|
||||
|
||||
@ -106,7 +108,7 @@
|
||||
markerCoordinates?: TCoordinates
|
||||
}
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
markerCoordinates: () => ({} as TCoordinates),
|
||||
markerCoordinates: () => ({}) as TCoordinates,
|
||||
})
|
||||
|
||||
const store = useStore()
|
||||
|
@ -16,7 +16,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { toRefs, withDefaults } from 'vue'
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { linkifyAndClean } from '@/utils/inputs'
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
<script setup lang="ts">
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { IWorkoutObject } from '@/types/workouts'
|
||||
import type { IWorkoutObject } from '@/types/workouts'
|
||||
|
||||
interface Props {
|
||||
recordType: string
|
||||
|
@ -31,7 +31,7 @@
|
||||
<script setup lang="ts">
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import { IWorkoutSegment } from '@/types/workouts'
|
||||
import type { IWorkoutSegment } from '@/types/workouts'
|
||||
|
||||
interface Props {
|
||||
segments: IWorkoutSegment[]
|
||||
|
@ -121,7 +121,7 @@
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import WeatherWind from '@/components/Workout/WorkoutDetail/WeatherWind.vue'
|
||||
import { IWorkoutObject } from '@/types/workouts'
|
||||
import type { IWorkoutObject } from '@/types/workouts'
|
||||
import { getTemperature } from '@/utils/units'
|
||||
|
||||
interface Props {
|
||||
|
@ -32,24 +32,17 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
computed,
|
||||
ref,
|
||||
toRefs,
|
||||
watch,
|
||||
withDefaults,
|
||||
} from 'vue'
|
||||
import { computed, ref, toRefs, watch } from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import WorkoutCardTitle from '@/components/Workout/WorkoutDetail/WorkoutCardTitle.vue'
|
||||
import WorkoutData from '@/components/Workout/WorkoutDetail/WorkoutData.vue'
|
||||
import WorkoutMap from '@/components/Workout/WorkoutDetail/WorkoutMap/index.vue'
|
||||
import { WORKOUTS_STORE } from '@/store/constants'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import {
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import type {
|
||||
IWorkout,
|
||||
IWorkoutData,
|
||||
IWorkoutObject,
|
||||
@ -67,7 +60,7 @@
|
||||
markerCoordinates?: TCoordinates
|
||||
}
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
markerCoordinates: () => ({} as TCoordinates),
|
||||
markerCoordinates: () => ({}) as TCoordinates,
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
@ -267,8 +267,6 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
computed,
|
||||
reactive,
|
||||
ref,
|
||||
@ -276,16 +274,16 @@
|
||||
watch,
|
||||
onMounted,
|
||||
onUnmounted,
|
||||
withDefaults,
|
||||
} from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
import { ROOT_STORE, WORKOUTS_STORE } from '@/store/constants'
|
||||
import { TAppConfig } from '@/types/application'
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import { IWorkout, IWorkoutForm } from '@/types/workouts'
|
||||
import type { TAppConfig } from '@/types/application'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import type { IWorkout, IWorkoutForm } from '@/types/workouts'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { formatWorkoutDate, getDateWithTZ } from '@/utils/dates'
|
||||
import { getReadableFileSize } from '@/utils/files'
|
||||
@ -302,7 +300,7 @@
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
isCreation: false,
|
||||
loading: false,
|
||||
workout: () => ({} as IWorkout),
|
||||
workout: () => ({}) as IWorkout,
|
||||
})
|
||||
|
||||
const { t } = useI18n()
|
||||
|
@ -186,12 +186,14 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComputedRef, computed, toRefs, watch, onMounted } from 'vue'
|
||||
import { computed, toRefs, watch, onMounted } from 'vue'
|
||||
import type { ComputedRef } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { LocationQuery, useRoute, useRouter } from 'vue-router'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import type { LocationQuery } from 'vue-router'
|
||||
|
||||
import { ISport } from '@/types/sports'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import type { ISport } from '@/types/sports'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import { translateSports } from '@/utils/sports'
|
||||
import { units } from '@/utils/units'
|
||||
|
||||
|
@ -168,27 +168,20 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
computed,
|
||||
ref,
|
||||
toRefs,
|
||||
watch,
|
||||
capitalize,
|
||||
onBeforeMount,
|
||||
} from 'vue'
|
||||
import { LocationQuery, useRoute, useRouter } from 'vue-router'
|
||||
import { computed, ref, toRefs, watch, capitalize, onBeforeMount } from 'vue'
|
||||
import type { ComputedRef, Ref } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import type { LocationQuery } from 'vue-router'
|
||||
|
||||
import FilterSelects from '@/components/Common/FilterSelects.vue'
|
||||
import Pagination from '@/components/Common/Pagination.vue'
|
||||
import StaticMap from '@/components/Common/StaticMap.vue'
|
||||
import NoWorkouts from '@/components/Workouts/NoWorkouts.vue'
|
||||
import { ROOT_STORE, WORKOUTS_STORE } from '@/store/constants'
|
||||
import { IPagination } from '@/types/api'
|
||||
import { ITranslatedSport } from '@/types/sports'
|
||||
import { IAuthUserProfile } from '@/types/user'
|
||||
import { IWorkout, TWorkoutsPayload } from '@/types/workouts'
|
||||
import type { IPagination } from '@/types/api'
|
||||
import type { ITranslatedSport } from '@/types/sports'
|
||||
import type { IAuthUserProfile } from '@/types/user'
|
||||
import type { IWorkout, TWorkoutsPayload } from '@/types/workouts'
|
||||
import { useStore } from '@/use/useStore'
|
||||
import { getQuery, sortList, workoutsPayloadKeys } from '@/utils/api'
|
||||
import { formatDate } from '@/utils/dates'
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Directive, DirectiveBinding } from 'vue'
|
||||
import type { Directive, DirectiveBinding } from 'vue'
|
||||
|
||||
interface ClickOutsideHTMLElement extends HTMLElement {
|
||||
clickOutsideEvent?: (event: MouseEvent | TouchEvent) => void
|
||||
|
@ -1,29 +1,29 @@
|
||||
import { createI18n, LocaleMessages, VueMessageType } from 'vue-i18n'
|
||||
import { createI18n } from 'vue-i18n'
|
||||
|
||||
/**
|
||||
* Load locale messages
|
||||
*
|
||||
* The loaded `JSON` locale messages is pre-compiled by `@intlify/vue-i18n-loader`, which is integrated into `vue-cli-plugin-i18n`.
|
||||
* See: https://github.com/intlify/vue-i18n-loader#rocket-i18n-resource-pre-compilation
|
||||
*/
|
||||
|
||||
function loadLocaleMessages(): Record<string, LocaleMessages<VueMessageType>> {
|
||||
const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.ts$/i)
|
||||
const messages: Record<string, LocaleMessages<VueMessageType>> = {}
|
||||
locales.keys().forEach((key) => {
|
||||
const matched = key.match(/([A-Za-z0-9-_]+)\./i)
|
||||
if (matched && matched.length > 1) {
|
||||
const locale = matched[1]
|
||||
messages[locale] = locales(key).default
|
||||
}
|
||||
})
|
||||
return messages
|
||||
}
|
||||
import deMessages from '@/locales/de/de'
|
||||
import enMessages from '@/locales/en/en'
|
||||
import esMessages from '@/locales/es/es'
|
||||
import frMessages from '@/locales/fr/fr'
|
||||
import glMessages from '@/locales/gl/gl'
|
||||
import itMessages from '@/locales/it/it'
|
||||
import nbMessages from '@/locales/nb/nb'
|
||||
import nlMessages from '@/locales/nl/nl'
|
||||
import plMessages from '@/locales/pl/pl'
|
||||
|
||||
export default createI18n({
|
||||
legacy: false,
|
||||
locale: 'en',
|
||||
fallbackLocale: 'en',
|
||||
globalInjection: true,
|
||||
messages: loadLocaleMessages(),
|
||||
messages: {
|
||||
de: deMessages,
|
||||
en: enMessages,
|
||||
es: esMessages,
|
||||
fr: frMessages,
|
||||
gl: glMessages,
|
||||
it: itMessages,
|
||||
nb: nbMessages,
|
||||
nl: nlMessages,
|
||||
pl: plMessages,
|
||||
},
|
||||
})
|
||||
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"ABOUT_THIS_INSTANCE": "Über diese Instanz",
|
||||
"CONTACT_ADMIN": "Kontaktiere den Administrator",
|
||||
"FITTRACKEE_DESCRIPTION": "<strong>FitTrackee</strong> ist ein selbst-gehosteter Outdoor-Aktivitäts-Tracker.",
|
||||
"FITTRACKEE_LICENSE": "unter {0} Lizenz ",
|
||||
"SOURCE_CODE": "Quellcode",
|
||||
"WEATHER_DATA_FROM": "Wetterdaten von:"
|
||||
"ABOUT_THIS_INSTANCE": "Über diese Instanz",
|
||||
"CONTACT_ADMIN": "Kontaktiere den Administrator",
|
||||
"FITTRACKEE_DESCRIPTION": "<strong>FitTrackee</strong> ist ein selbst-gehosteter Outdoor-Aktivitäts-Tracker.",
|
||||
"FITTRACKEE_LICENSE": "unter {0} Lizenz ",
|
||||
"SOURCE_CODE": "Quellcode",
|
||||
"WEATHER_DATA_FROM": "Wetterdaten von:"
|
||||
}
|
||||
|
@ -1,66 +1,66 @@
|
||||
{
|
||||
"ABOUT": {
|
||||
"DESCRIPTION": "Zusätzliche Informationen, die für deine Nutzer nützlich sein könnten. Markdown-Syntax wird unterstützt.",
|
||||
"TEXT": "Detaillierte Instanz-Informationen"
|
||||
"ABOUT": {
|
||||
"DESCRIPTION": "Zusätzliche Informationen, die für deine Nutzer nützlich sein könnten. Markdown-Syntax wird unterstützt.",
|
||||
"TEXT": "Detaillierte Instanz-Informationen"
|
||||
},
|
||||
"ACTION": "Aktion",
|
||||
"ACTIVATE_USER_ACCOUNT": "Aktiviere Konto",
|
||||
"ACTIVE": "Aktiv",
|
||||
"ADMIN": "Admin",
|
||||
"ADMINISTRATION": "Administration",
|
||||
"ADMIN_RIGHTS_DELETE_USER_ACCOUNT": "Hinzufügen/Entfernen von Administratorrechten, Lösche Nutzerkonto.",
|
||||
"APPLICATION": "Anwendung",
|
||||
"APP_CONFIG": {
|
||||
"ADMIN_CONTACT": "Kontakt-E-Mail des Administrators",
|
||||
"MAX_FILES_IN_ZIP_LABEL": "Max. Dateianzahl im zip Archiv",
|
||||
"MAX_USERS_HELP": "Wenn 0, gibt es keine Registrierungslimitierung..",
|
||||
"MAX_USERS_LABEL": "Max. Anzahl aktiver Nutzer",
|
||||
"NO_CONTACT_EMAIL": "keine Kontakt-E-Mail",
|
||||
"SINGLE_UPLOAD_MAX_SIZE_LABEL": "Max. Größe der hochgeladenen Dateien (in Mb)",
|
||||
"TITLE": "Anwendungskonfiguration",
|
||||
"ZIP_UPLOAD_MAX_SIZE_LABEL": "Max. Größe des zip Archives (in Mb)"
|
||||
},
|
||||
"BACK_TO_ADMIN": "Zurück zu Admin",
|
||||
"CONFIRM_USER_ACCOUNT_DELETION": "Möchtest du wirklich das {0} Konto löschen? Alle Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.",
|
||||
"CONFIRM_USER_PASSWORD_RESET": "Möchtest du wirklich das {0} Passwort zurücksetzen?",
|
||||
"CURRENT_EMAIL": "Aktuelle E-Mail",
|
||||
"DELETE_USER": "Lösche Nutzer",
|
||||
"EMAIL_SENDING_DISABLED": "E-Mail-Versand ist deaktiviert.",
|
||||
"ENABLE_DISABLE_SPORTS": "Aktivieren/Deaktivieren von Sportarten.",
|
||||
"NEW_EMAIL": "Neue E-Mail",
|
||||
"NO_TEXT_ENTERED": "Kein Text eingegeben",
|
||||
"PASSWORD_RESET_SUCCESSFUL": "Das wasswort wurde zurückgesetzt.",
|
||||
"PRIVACY_POLICY_DESCRIPTION": "Füge deine eigene Datenschutzrichtlinie hinzu oder leer lassen, um die standardmäßige zu verwenden. Markdown-Syntax wird unterstützt.",
|
||||
"REGISTRATION_DISABLED": "Registrierung ist derzeit deaktiviert.",
|
||||
"REGISTRATION_ENABLED": "Registrierung ist derzeit aktiviert.",
|
||||
"RESET_USER_PASSWORD": "Passwort zurücksetzen",
|
||||
"SPORTS": {
|
||||
"TABLE": {
|
||||
"ACTIVE": "Aktiv",
|
||||
"HAS_WORKOUTS": "Trainings existieren",
|
||||
"IMAGE": "Bild",
|
||||
"LABEL": "Titel"
|
||||
},
|
||||
"ACTION": "Aktion",
|
||||
"ACTIVATE_USER_ACCOUNT": "Aktiviere Konto",
|
||||
"ACTIVE": "Aktiv",
|
||||
"ADMIN": "Admin",
|
||||
"ADMINISTRATION": "Administration",
|
||||
"ADMIN_RIGHTS_DELETE_USER_ACCOUNT": "Hinzufügen/Entfernen von Administratorrechten, Lösche Nutzerkonto.",
|
||||
"APPLICATION": "Anwendung",
|
||||
"APP_CONFIG": {
|
||||
"ADMIN_CONTACT": "Kontakt-E-Mail des Administrators",
|
||||
"MAX_FILES_IN_ZIP_LABEL": "Max. Dateianzahl im zip Archiv",
|
||||
"MAX_USERS_HELP": "Wenn 0, gibt es keine Registrierungslimitierung..",
|
||||
"MAX_USERS_LABEL": "Max. Anzahl aktiver Nutzer",
|
||||
"NO_CONTACT_EMAIL": "keine Kontakt-E-Mail",
|
||||
"SINGLE_UPLOAD_MAX_SIZE_LABEL": "Max. Größe der hochgeladenen Dateien (in Mb)",
|
||||
"TITLE": "Anwendungskonfiguration",
|
||||
"ZIP_UPLOAD_MAX_SIZE_LABEL": "Max. Größe des zip Archives (in Mb)"
|
||||
"TITLE": "Sportarten Administration"
|
||||
},
|
||||
"UPDATE_APPLICATION_DESCRIPTION": "Aktualisiere Anwemdungskonfiguration.",
|
||||
"UPDATE_USER_EMAIL": "Aktualisiere E-Mail",
|
||||
"USER": "Nutzer",
|
||||
"USERS": {
|
||||
"SELECTS": {
|
||||
"ORDER_BY": {
|
||||
"ADMIN": "Adminstatus",
|
||||
"CREATED_AT": "Registrierungsdatum",
|
||||
"IS_ACTIVE": "Accountstatus",
|
||||
"USERNAME": "Nutzername",
|
||||
"WORKOUTS_COUNT": "Trainingsanzahl"
|
||||
}
|
||||
},
|
||||
"BACK_TO_ADMIN": "Zurück zu Admin",
|
||||
"CONFIRM_USER_ACCOUNT_DELETION": "Möchtest du wirklich das {0} Konto löschen? Alle Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.",
|
||||
"CONFIRM_USER_PASSWORD_RESET": "Möchtest du wirklich das {0} Passwort zurücksetzen?",
|
||||
"CURRENT_EMAIL": "Aktuelle E-Mail",
|
||||
"DELETE_USER": "Lösche Nutzer",
|
||||
"EMAIL_SENDING_DISABLED": "E-Mail-Versand ist deaktiviert.",
|
||||
"ENABLE_DISABLE_SPORTS": "Aktivieren/Deaktivieren von Sportarten.",
|
||||
"NEW_EMAIL": "Neue E-Mail",
|
||||
"NO_TEXT_ENTERED": "Kein Text eingegeben",
|
||||
"PASSWORD_RESET_SUCCESSFUL": "Das wasswort wurde zurückgesetzt.",
|
||||
"PRIVACY_POLICY_DESCRIPTION": "Füge deine eigene Datenschutzrichtlinie hinzu oder leer lassen, um die standardmäßige zu verwenden. Markdown-Syntax wird unterstützt.",
|
||||
"REGISTRATION_DISABLED": "Registrierung ist derzeit deaktiviert.",
|
||||
"REGISTRATION_ENABLED": "Registrierung ist derzeit aktiviert.",
|
||||
"RESET_USER_PASSWORD": "Passwort zurücksetzen",
|
||||
"SPORTS": {
|
||||
"TABLE": {
|
||||
"ACTIVE": "Aktiv",
|
||||
"HAS_WORKOUTS": "Trainings existieren",
|
||||
"IMAGE": "Bild",
|
||||
"LABEL": "Titel"
|
||||
},
|
||||
"TITLE": "Sportarten Administration"
|
||||
"TABLE": {
|
||||
"ADD_ADMIN_RIGHTS": "Administratorrechte hinzufügen",
|
||||
"REMOVE_ADMIN_RIGHTS": "Administratorrechte entfernen"
|
||||
},
|
||||
"UPDATE_APPLICATION_DESCRIPTION": "Aktualisiere Anwemdungskonfiguration.",
|
||||
"UPDATE_USER_EMAIL": "Aktualisiere E-Mail",
|
||||
"USER": "Nutzer",
|
||||
"USERS": {
|
||||
"SELECTS": {
|
||||
"ORDER_BY": {
|
||||
"ADMIN": "Adminstatus",
|
||||
"CREATED_AT": "Registrierungsdatum",
|
||||
"IS_ACTIVE": "Accountstatus",
|
||||
"USERNAME": "Nutzername",
|
||||
"WORKOUTS_COUNT": "Trainingsanzahl"
|
||||
}
|
||||
},
|
||||
"TABLE": {
|
||||
"ADD_ADMIN_RIGHTS": "Administratorrechte hinzufügen",
|
||||
"REMOVE_ADMIN_RIGHTS": "Administratorrechte entfernen"
|
||||
},
|
||||
"TITLE": "Administration - Benutzer"
|
||||
},
|
||||
"USER_EMAIL_UPDATE_SUCCESSFUL": "Die E-Mail Adresse wurde aktualisiert."
|
||||
"TITLE": "Administration - Benutzer"
|
||||
},
|
||||
"USER_EMAIL_UPDATE_SUCCESSFUL": "Die E-Mail Adresse wurde aktualisiert."
|
||||
}
|
||||
|
@ -1,44 +1,44 @@
|
||||
{
|
||||
"ERROR": {
|
||||
"<time> is missing in gpx file": "<time>-Element fehlt in der .gpx-Datei.",
|
||||
"Network Error": "Netzwerkfehler.",
|
||||
"UNKNOWN": "Fehler. Bitte versuche es erneut oder kontaktiere den Administrator.",
|
||||
"at least one file in zip archive exceeds size limit, please check the archive": "Mindestens eine Datei im ZIP-Archiv überschreitet das Größenlimit, bitte überprüfe das Archiv.",
|
||||
"completed request already exists": "Eine Anfrage zum vollständigen Export existiert bereits.",
|
||||
"email: valid email must be provided": "E-Mail: Eine gültige E-Mail muss angegeben werden.",
|
||||
"error during gpx file parsing": "Fehler beim Einlesen der GPX-Datei",
|
||||
"error during gpx processing": "Fehler bei der GPX-Verarbeitung.",
|
||||
"error on getting configuration": "Fehler beim Abrufen der Konfiguration.",
|
||||
"error when saving workout": "Fehler beim Speichern des Workouts.",
|
||||
"error when updating configuration": "Fehler beim Aktualisieren der Konfiguration",
|
||||
"error, please try again or contact the administrator": "Fehler. Bitte versuche es erneut oder kontaktiere den Administrator.",
|
||||
"error, registration is disabled": "Fehler. Die Registrierung ist deaktiviert.",
|
||||
"file extension not allowed": "Dateierweiterung ist nicht erlaubt.",
|
||||
"file size is greater than the allowed size": "Die Datei ist größer als erlaubt.",
|
||||
"gpx file is invalid": "Die .gpx-Datei ist ungültig.",
|
||||
"invalid credentials": "Ungültige Anmeldedaten.",
|
||||
"invalid payload": "Die bereitgestellten Daten sind ungültig.",
|
||||
"invalid token, please log in again": "Ungültiges Token, bitte erneut anmelden.",
|
||||
"invalid token, please request a new token": "Ungültiges Token, bitte erneut anmelden.",
|
||||
"new email must be different than current email": "Die neue E-Mail muss sich von der aktuellen E-Mail unterscheiden",
|
||||
"no file part": "Keine Datei angegeben.",
|
||||
"no selected file": "Keine Datei ausgewählt.",
|
||||
"no tracks in gpx file": "Kein Track (<trk>) in der .gpx-Datei.",
|
||||
"ongoing request exists": "Eine Anfrage zum Datenexport existiert bereits.",
|
||||
"password: password and password confirmation do not match": "Passwort: Passwort und Passwortbestätigung stimmen nicht überein.",
|
||||
"provide a valid auth token": "Gebe ein gültiges Authentifizierungstoken an.",
|
||||
"signature expired, please log in again": "Die Signatur ist abgelaufen. Bitte melde dich erneut an.",
|
||||
"sorry, that username is already taken": "Es tut mir leid, der Benutzername ist schon vergeben.",
|
||||
"sport does not exist": "Sportart existiert nicht.",
|
||||
"successfully registered": "Registrierung erfolgreich.",
|
||||
"the number of files in the archive exceeds the limit": "Die Anzahl der Dateien im Archiv überschreitet die Begrenzung.",
|
||||
"user does not exist": "Der Nutzer existiert nicht.",
|
||||
"valid email must be provided for admin contact": "Um den Administrator zu kontaktieren, muss eine gültige E-Mail-Adresse angegeben werden",
|
||||
"you can not delete your account, no other user has admin rights": "Du kannst Dein Konto nicht löschen, da kein anderer Nutzer hat Administratorrechte besitzt.",
|
||||
"you do not have permissions": "Du hast keine Berechtigung."
|
||||
},
|
||||
"PAGINATION": {
|
||||
"NEXT": "Nächste",
|
||||
"PREVIOUS": "Vorhergehende"
|
||||
}
|
||||
"ERROR": {
|
||||
"<time> is missing in gpx file": "<time>-Element fehlt in der .gpx-Datei.",
|
||||
"Network Error": "Netzwerkfehler.",
|
||||
"UNKNOWN": "Fehler. Bitte versuche es erneut oder kontaktiere den Administrator.",
|
||||
"at least one file in zip archive exceeds size limit, please check the archive": "Mindestens eine Datei im ZIP-Archiv überschreitet das Größenlimit, bitte überprüfe das Archiv.",
|
||||
"completed request already exists": "Eine Anfrage zum vollständigen Export existiert bereits.",
|
||||
"email: valid email must be provided": "E-Mail: Eine gültige E-Mail muss angegeben werden.",
|
||||
"error during gpx file parsing": "Fehler beim Einlesen der GPX-Datei",
|
||||
"error during gpx processing": "Fehler bei der GPX-Verarbeitung.",
|
||||
"error on getting configuration": "Fehler beim Abrufen der Konfiguration.",
|
||||
"error when saving workout": "Fehler beim Speichern des Workouts.",
|
||||
"error when updating configuration": "Fehler beim Aktualisieren der Konfiguration",
|
||||
"error, please try again or contact the administrator": "Fehler. Bitte versuche es erneut oder kontaktiere den Administrator.",
|
||||
"error, registration is disabled": "Fehler. Die Registrierung ist deaktiviert.",
|
||||
"file extension not allowed": "Dateierweiterung ist nicht erlaubt.",
|
||||
"file size is greater than the allowed size": "Die Datei ist größer als erlaubt.",
|
||||
"gpx file is invalid": "Die .gpx-Datei ist ungültig.",
|
||||
"invalid credentials": "Ungültige Anmeldedaten.",
|
||||
"invalid payload": "Die bereitgestellten Daten sind ungültig.",
|
||||
"invalid token, please log in again": "Ungültiges Token, bitte erneut anmelden.",
|
||||
"invalid token, please request a new token": "Ungültiges Token, bitte erneut anmelden.",
|
||||
"new email must be different than current email": "Die neue E-Mail muss sich von der aktuellen E-Mail unterscheiden",
|
||||
"no file part": "Keine Datei angegeben.",
|
||||
"no selected file": "Keine Datei ausgewählt.",
|
||||
"no tracks in gpx file": "Kein Track (<trk>) in der .gpx-Datei.",
|
||||
"ongoing request exists": "Eine Anfrage zum Datenexport existiert bereits.",
|
||||
"password: password and password confirmation do not match": "Passwort: Passwort und Passwortbestätigung stimmen nicht überein.",
|
||||
"provide a valid auth token": "Gebe ein gültiges Authentifizierungstoken an.",
|
||||
"signature expired, please log in again": "Die Signatur ist abgelaufen. Bitte melde dich erneut an.",
|
||||
"sorry, that username is already taken": "Es tut mir leid, der Benutzername ist schon vergeben.",
|
||||
"sport does not exist": "Sportart existiert nicht.",
|
||||
"successfully registered": "Registrierung erfolgreich.",
|
||||
"the number of files in the archive exceeds the limit": "Die Anzahl der Dateien im Archiv überschreitet die Begrenzung.",
|
||||
"user does not exist": "Der Nutzer existiert nicht.",
|
||||
"valid email must be provided for admin contact": "Um den Administrator zu kontaktieren, muss eine gültige E-Mail-Adresse angegeben werden",
|
||||
"you can not delete your account, no other user has admin rights": "Du kannst Dein Konto nicht löschen, da kein anderer Nutzer hat Administratorrechte besitzt.",
|
||||
"you do not have permissions": "Du hast keine Berechtigung."
|
||||
},
|
||||
"PAGINATION": {
|
||||
"NEXT": "Nächste",
|
||||
"PREVIOUS": "Vorhergehende"
|
||||
}
|
||||
}
|
||||
|
@ -1,19 +1,19 @@
|
||||
{
|
||||
"ACCOUNT-CONFIRMATION-RESEND": "Bestätigungs-E-Mail erneut senden",
|
||||
"AUTHORIZE": "Autorisieren",
|
||||
"BACK": "Zurück",
|
||||
"CANCEL": "Abbrechen",
|
||||
"CLEAR_FILTER": "Filter löschen",
|
||||
"DELETE_MY_ACCOUNT": "Mein Konto löschen",
|
||||
"DISABLE": "Deaktivieren",
|
||||
"EDIT": "Bearbeiten",
|
||||
"ENABLE": "Aktivieren",
|
||||
"FILTER": "Filter",
|
||||
"LOGIN": "Anmelden",
|
||||
"NO": "Nein",
|
||||
"REGISTER": "Registrieren",
|
||||
"REQUEST_DATA_EXPORT": "Daten-Export anfragen",
|
||||
"RESET": "Zurücksetzen",
|
||||
"SUBMIT": "Speichern",
|
||||
"YES": "Ja"
|
||||
"ACCOUNT-CONFIRMATION-RESEND": "Bestätigungs-E-Mail erneut senden",
|
||||
"AUTHORIZE": "Autorisieren",
|
||||
"BACK": "Zurück",
|
||||
"CANCEL": "Abbrechen",
|
||||
"CLEAR_FILTER": "Filter löschen",
|
||||
"DELETE_MY_ACCOUNT": "Mein Konto löschen",
|
||||
"DISABLE": "Deaktivieren",
|
||||
"EDIT": "Bearbeiten",
|
||||
"ENABLE": "Aktivieren",
|
||||
"FILTER": "Filter",
|
||||
"LOGIN": "Anmelden",
|
||||
"NO": "Nein",
|
||||
"REGISTER": "Registrieren",
|
||||
"REQUEST_DATA_EXPORT": "Daten-Export anfragen",
|
||||
"RESET": "Zurücksetzen",
|
||||
"SUBMIT": "Speichern",
|
||||
"YES": "Ja"
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user