1 line
274 KiB
Plaintext
1 line
274 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/views/workouts/WorkoutsView.vue","webpack:///./src/components/Workouts/WorkoutsFilters.vue","webpack:///./src/components/Workouts/WorkoutsFilters.vue?161a","webpack:///./src/components/Workouts/WorkoutsFilters.vue?45da","webpack:///./src/components/Workouts/WorkoutsList.vue","webpack:///./src/components/Workouts/WorkoutsList.vue?4e15","webpack:///./src/components/Workouts/WorkoutsList.vue?3ddd","webpack:///./src/views/workouts/WorkoutsView.vue?afea","webpack:///./src/views/workouts/WorkoutsView.vue?c9bc","webpack:///./src/components/Workouts/WorkoutsFilters.vue?463b","webpack:///./src/components/Workout/WorkoutDetail/WorkoutMap.vue?015a","webpack:///./src/views/workouts/Workout.vue","webpack:///./src/components/Workout/WorkoutChart.vue","webpack:///./src/components/Workout/WorkoutChart.vue?936b","webpack:///./src/components/Workout/WorkoutChart.vue?99f8","webpack:///./src/components/Workout/WorkoutDetail/index.vue","webpack:///./src/components/Workout/WorkoutDetail/WorkoutCardTitle.vue","webpack:///./src/components/Workout/WorkoutDetail/WorkoutCardTitle.vue?d900","webpack:///./src/components/Workout/WorkoutDetail/WorkoutCardTitle.vue?5151","webpack:///./src/components/Workout/WorkoutDetail/WorkoutData.vue","webpack:///./src/components/Workout/WorkoutDetail/WorkoutRecord.vue","webpack:///./src/components/Workout/WorkoutDetail/WorkoutRecord.vue?eef2","webpack:///./src/components/Workout/WorkoutDetail/WorkoutRecord.vue?2ca7","webpack:///./src/components/Workout/WorkoutDetail/WorkoutWeather.vue","webpack:///./src/components/Workout/WorkoutDetail/WorkoutWeather.vue?b55e","webpack:///./src/components/Workout/WorkoutDetail/WorkoutWeather.vue?d419","webpack:///./src/components/Workout/WorkoutDetail/WorkoutData.vue?75c9","webpack:///./src/components/Workout/WorkoutDetail/WorkoutData.vue?3d6c","webpack:///./src/components/Workout/WorkoutDetail/WorkoutMap.vue","webpack:///./src/components/Workout/WorkoutDetail/WorkoutMap.vue?ffa0","webpack:///./src/components/Workout/WorkoutDetail/WorkoutMap.vue?0f49","webpack:///./src/components/Workout/WorkoutDetail/index.vue?18b8","webpack:///./src/components/Workout/WorkoutDetail/index.vue?7f4b","webpack:///./src/components/Workout/WorkoutNotes.vue","webpack:///./src/components/Workout/WorkoutNotes.vue?9d7d","webpack:///./src/components/Workout/WorkoutNotes.vue?fea4","webpack:///./src/components/Workout/WorkoutSegments.vue","webpack:///./src/components/Workout/WorkoutSegments.vue?0d6f","webpack:///./src/components/Workout/WorkoutSegments.vue?12ef","webpack:///./src/views/workouts/Workout.vue?bcf8","webpack:///./src/views/workouts/Workout.vue?05c5","webpack:///./src/views/workouts/WorkoutsView.vue?cd68","webpack:///./src/components/Workout/WorkoutNotes.vue?bf09","webpack:///./src/components/Workout/WorkoutChart.vue?0c03","webpack:///./src/components/Workout/WorkoutDetail/WorkoutCardTitle.vue?ecb7","webpack:///./node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js","webpack:///./src/components/Workout/WorkoutEdition.vue","webpack:///./src/components/Workout/WorkoutEdition.vue?6283","webpack:///./src/components/Workout/WorkoutEdition.vue?0b48","webpack:///./src/components/Workout/WorkoutSegments.vue?6726","webpack:///./src/components/Workout/WorkoutDetail/WorkoutWeather.vue?cd23","webpack:///./src/views/workouts/AddWorkout.vue","webpack:///./src/views/workouts/AddWorkout.vue?8f86","webpack:///./src/views/workouts/AddWorkout.vue?6832","webpack:///./src/views/workouts/Workout.vue?ba45","webpack:///./src/components/Workouts/WorkoutsList.vue?74ff","webpack:///./src/views/workouts/EditWorkout.vue","webpack:///./src/views/workouts/EditWorkout.vue?313d","webpack:///./src/views/workouts/EditWorkout.vue?5a5b","webpack:///./src/components/Workout/WorkoutEdition.vue?d63c","webpack:///./src/components/Workout/WorkoutDetail/WorkoutRecord.vue?54aa","webpack:///./src/components/Workout/WorkoutDetail/WorkoutData.vue?f67b","webpack:///./src/components/Workout/WorkoutDetail/index.vue?61ea","webpack:///./node_modules/@tmcw/togeojson/dist/togeojson.umd.js"],"names":["id","class","authUser","username","hiddenFilters","sports","translatedSports","toggleFilters","aria-hidden","$t","user","value","name","type","$route","query","from","handleFilterChange","to","sport_id","filter","s","sport","key","label","min","step","distance_from","distance_to","duration_from","pattern","placeholder","duration_to","ave_speed_from","ave_speed_to","max_speed_from","max_speed_to","onFilter","props","Object","required","emits","setup","emit","t","route","router","params","assign","event","target","push","path","newQuery","render","__scopeId","workouts","length","toLowerCase","pagination","total","sort","sortList","order_by","orderByList","message","reloadWorkouts","capitalize","workout","title","sport-label","onHover","with_gpx","hoverWorkoutId","display-hover","format","Number","distance","toFixed","moving","ave_speed","max_speed","components","FilterSelects","NoWorkouts","Pagination","StaticMap","store","useStore","getters","GETTERS","USER_WORKOUTS","WORKOUTS_PAGINATION","getWorkoutsQuery","loadWorkouts","payload","dispatch","ACTIONS","GET_USER_WORKOUTS","queryParam","queryValue","defaultSort","order","keys","k","includes","map","workoutId","getDateWithTZ","WorkoutsFilters","WorkoutsList","AUTH_USER_PROFILE","SPORTS","workoutData","markerCoordinates","displaySegment","updateCoordinates","segments","notes","loading","content","checked","displayDistance","updateDisplayDistance","emitEmptyCoordinates","LineChart","datasets","chartData","labels","distance_labels","duration_labels","JSON","parse","stringify","speed","elevation","coordinates","options","responsive","maintainAspectRatio","animation","layout","padding","top","scales","grid","drawOnChartArea","ticks","count","callback","formatDuration","bounds","display","text","position","beginAtZero","elements","point","pointStyle","pointRadius","plugins","datalabels","tooltip","interaction","intersect","mode","callbacks","context","dataset","formattedValue","yAxisID","tooltipItems","emitCoordinates","dataIndex","replace","duration","Date","toISOString","substr","latitude","longitude","lineChartProps","displayModal","deleteWorkout","workoutObject","updateDisplayModal","previousUrl","segmentId","workoutDate","workoutTime","nextUrl","record_type","withPause","pauses","aveSpeed","maxSpeed","maxAlt","minAlt","src","alt","ascent","descent","String","weatherStart","weatherEnd","icon","temperature","humidity","wind","WorkoutRecord","WorkoutWeather","geoJson","jsonData","center","zoom","ref","fitBounds","url","getApiUrl","attribution","appConfig","map_attribution","geojson","lat-lng","LGeoJson","LMap","LMarker","LTileLayer","getGeoJson","gpxContent","DOMParser","parseFromString","e","console","error","getCenter","workoutMap","leafletObject","APP_CONFIG","gpx","WorkoutCardTitle","WorkoutData","WorkoutMap","Boolean","getWorkoutObjectUrl","previous_workout","next_workout","getWorkoutObject","segment","urls","workout_date","timezone","max_alt","min_alt","records","segment_id","weather_end","weather_start","workout_time","DELETE_WORKOUT","newSegmentId","find","index","NotFound","WorkoutChart","WorkoutDetail","WorkoutNotes","WorkoutSegments","GET_WORKOUT_DATA","WORKOUT_DATA","newWorkoutId","commit","MUTATIONS","EMPTY_WORKOUT","debounce","fn","time","timeout","args","this","clearTimeout","setTimeout","apply","capitalizeFirstLetter","string","charAt","toUpperCase","slice","propsBinder","methods","leafletElement","setMethodName","newVal","oldVal","remapEvents","contextAttrs","result","attrName","startsWith","eventName","toLocaleLowerCase","resetWebpackIcon","async","Icon","modules","Promise","all","Default","prototype","_getIconUrl","mergeOptions","iconRetinaUrl","default","iconUrl","shadowUrl","provideLeafletWrapper","methodName","wrapped","warn","wrapper","updateLeafletWrapper","leafletMethod","WINDOW_OR_GLOBAL","self","global","undefined","GLOBAL_LEAFLET_OPT","props$1","pane","custom","layerType","visible","setup$1","leafletRef","addLayer","removeLayer","componentOptions","componentMethods","addThisLayer","removeThisLayer","val","old","attributionControl","$parent","removeAttribution","addAttribution","isVisible","bindPopup","bindTooltip","getTooltip","unbindTooltip","popup","getPopup","unbindPopup","ready","slots","style","props$2","interactive","bubblingMouseEvents","props$3","stroke","color","weight","opacity","lineCap","lineJoin","dashArray","dashOffset","fill","fillColor","fillOpacity","fillRule","className","props$4","latLng","Array","radius","props$6","setup$6","setPosition","remove","render$1","props$b","setup$b","layerOptions","layerMethods","layer","props$d","setup$d","layerGroupMethods","clearLayers","addData","toGeoJSON","getBounds","script$8","useGlobalLeaflet","geoJSON","DomEvent","L","listeners","attrs","on","$slots","props$e","zIndex","tileSize","noWrap","minZoom","maxZoom","setup$e","props$f","iconSize","iconAnchor","popupAnchor","tooltipAnchor","shadowRetinaUrl","shadowSize","shadowAnchor","bgPos","script$d","maxBounds","paddingBottomRight","paddingTopLeft","worldCopyJump","crs","maxBoundsViscosity","inertia","inertiaDeceleration","inertiaMaxSpeed","easeLinearity","zoomAnimation","zoomAnimationThreshold","fadeAnimation","markerZoomAnimation","noBlockingAnimations","root","blueprint","layersToAdd","layersInControl","registerControl","registerLayerControl","eventHandlers","getZoom","l","updateVisibleProp","CRS","latLngBounds","beforeMapMount","optionsCrs","EPSG3857","layerControl","exist","_leaflet_id","lControlLayer","forEach","lControl","addControl","setZoom","animate","prevBounds","newBounds","isValid","oldBounds","lastSetBounds","boundsChanged","equals","fitBoundsOptions","newCenter","oldCenter","lastSetCenter","lat","lng","panTo","moveEndHandler","overlayAddHandler","overlayRemoveHandler","width","height","props$h","draggable","zIndexOffset","setup$g","dragging","enable","disable","latlng","oldLatLng","getLatLng","setLatLng","script$e","getElement","html","innerHTML","newIcon","setIcon","marker","latLngSync","props$i","latLngs","smoothFactor","noClip","props$j","props$k","props$n","tms","subdomains","detectRetina","setup$m","gridLayerOptions","gridLayerMethods","script$j","tileLayer","for","isCreation","updateWorkout","withGpx","disabled","updateWithGpx","workoutDataObject","is_active","accept","updateFile","fileSizeLimit","gpx_limit_import","zipSizeLimit","workoutDurationHour","workoutDurationMinutes","workoutDurationSeconds","workoutDistance","input","updateNotes","errorMessages","onCancel","formatWorkoutForm","max_single_file_size","max_zip_file_size","ERROR_MESSAGES","workoutForm","gpxFile","files","workoutDateTime","split","formatPayload","EDIT_WORKOUT","data","errorMessage","SET_ERROR_MESSAGES","file","ADD_WORKOUT","ADD_WORKOUT_WITHOUT_GPX","go","newWorkout","previousWorkout","EMPTY_ERROR_MESSAGES","WorkoutEdition","exports","normalize","textContent","n","getElementsByTagName","o","r","parseFloat","i","isNaN","getElementsByTagNameNS","parentNode","tagName","links","href","getAttribute","a","extendedValues","c","properties","_gpxType","geometry","line","times","g","coordinateProperties","entries","u","m","p","h","heartRate","extensions","f","extendedProperties","heartRates","d","heart","y","N","x","T","b","charCodeAt","S","A","xml","attributes","childNodes","nodeName","nodeValue","trim","B","E","parseInt","F","P","coords","v","geoms","coordTimes","address","styleUrl","styleHash","styleMapHash","normal","description","timespan","begin","end","timestamp","visibility","geometries","M","toString","features","gpxGen","kml","kmlGen","tcx","tcxGen","defineProperty"],"mappings":"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","file":"static/js/workouts.733b9b2c.js","sourcesContent":["<template>\n <div id=\"workouts\" v-if=\"authUser.username\" class=\"view\">\n <div class=\"container workouts-container\">\n <div class=\"filters-container\" :class=\"{ hidden: hiddenFilters }\">\n <WorkoutsFilters\n :sports=\"translatedSports\"\n :authUser=\"authUser\"\n @filter=\"toggleFilters\"\n />\n </div>\n <div class=\"display-filters\">\n <div @click=\"toggleFilters\">\n <i\n :class=\"`fa fa-caret-${hiddenFilters ? 'down' : 'up'}`\"\n aria-hidden=\"true\"\n />\n <span>\n {{ $t(`workouts.${hiddenFilters ? 'DISPLAY' : 'HIDE'}_FILTERS`) }}\n </span>\n </div>\n </div>\n <div class=\"list-container\">\n <WorkoutsList :user=\"authUser\" :sports=\"translatedSports\" />\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { ComputedRef, computed, defineComponent, ref } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n import WorkoutsFilters from '@/components/Workouts/WorkoutsFilters.vue'\n import WorkoutsList from '@/components/Workouts/WorkoutsList.vue'\n import { AUTH_USER_STORE, SPORTS_STORE } from '@/store/constants'\n import { ISport, ITranslatedSport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { useStore } from '@/use/useStore'\n import { translateSports } from '@/utils/sports'\n\n export default defineComponent({\n name: 'WorkoutsView',\n components: {\n WorkoutsFilters,\n WorkoutsList,\n },\n setup() {\n const { t } = useI18n()\n const store = useStore()\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n const translatedSports: ComputedRef<ITranslatedSport[]> = computed(() =>\n translateSports(sports.value, t)\n )\n const hiddenFilters = ref(true)\n\n function toggleFilters() {\n hiddenFilters.value = !hiddenFilters.value\n }\n\n return {\n authUser,\n hiddenFilters,\n translatedSports,\n toggleFilters,\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n #workouts {\n height: 100%;\n\n .workouts-container {\n display: flex;\n flex-direction: row;\n @media screen and (max-width: $medium-limit) {\n flex-direction: column;\n }\n\n .filters-container,\n .list-container {\n display: flex;\n flex-direction: column;\n }\n\n .filters-container {\n width: 25%;\n @media screen and (max-width: $medium-limit) {\n width: 100%;\n\n @media screen and (max-width: $small-limit) {\n &.hidden {\n display: none;\n }\n }\n }\n }\n\n .display-filters {\n display: none;\n font-size: 0.8em;\n padding: 0 $default-padding * 2;\n\n span {\n cursor: pointer;\n font-weight: bold;\n padding-left: $default-padding * 0.5;\n }\n .fa {\n cursor: pointer;\n }\n\n @media screen and (max-width: $small-limit) {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n }\n }\n\n .list-container {\n width: 75%;\n @media screen and (max-width: $medium-limit) {\n width: 100%;\n }\n }\n }\n }\n</style>\n","<template>\n <div class=\"workouts-filters\">\n <div class=\"box\">\n <div class=\"form\">\n <div class=\"form-items-group\">\n <div class=\"form-item\">\n <label> {{ $t('workouts.FROM') }}: </label>\n <input\n name=\"from\"\n type=\"date\"\n :value=\"$route.query.from\"\n @change=\"handleFilterChange\"\n />\n </div>\n <div class=\"form-item\">\n <label> {{ $t('workouts.TO') }}: </label>\n <input\n name=\"to\"\n type=\"date\"\n :value=\"$route.query.to\"\n @change=\"handleFilterChange\"\n />\n </div>\n </div>\n\n <div class=\"form-items-group\">\n <div class=\"form-item\">\n <label> {{ $t('workouts.SPORT', 1) }}:</label>\n <select\n name=\"sport_id\"\n :value=\"$route.query.sport_id\"\n @change=\"handleFilterChange\"\n >\n <option value=\"\" />\n <option\n v-for=\"sport in translatedSports.filter((s) =>\n authUser.sports_list.includes(s.id)\n )\"\n :value=\"sport.id\"\n :key=\"sport.id\"\n >\n {{ sport.label }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-items-group\">\n <div class=\"form-item\">\n <label> {{ $t('workouts.DISTANCE') }} (km): </label>\n <div class=\"form-inputs-group\">\n <input\n name=\"distance_from\"\n type=\"number\"\n min=\"0\"\n step=\"1\"\n :value=\"$route.query.distance_from\"\n @change=\"handleFilterChange\"\n />\n <span>{{ $t('workouts.TO') }}</span>\n <input\n name=\"distance_to\"\n type=\"number\"\n min=\"0\"\n step=\"1\"\n :value=\"$route.query.distance_to\"\n @change=\"handleFilterChange\"\n />\n </div>\n </div>\n </div>\n\n <div class=\"form-items-group\">\n <div class=\"form-item\">\n <label> {{ $t('workouts.DURATION') }} (km): </label>\n <div class=\"form-inputs-group\">\n <input\n name=\"duration_from\"\n :value=\"$route.query.duration_from\"\n @change=\"handleFilterChange\"\n pattern=\"^([0-9]*[0-9]):([0-5][0-9])$\"\n placeholder=\"hh:mm\"\n type=\"text\"\n />\n <span>{{ $t('workouts.TO') }}</span>\n <input\n name=\"duration_to\"\n :value=\"$route.query.duration_to\"\n @change=\"handleFilterChange\"\n pattern=\"^([0-9]*[0-9]):([0-5][0-9])$\"\n placeholder=\"hh:mm\"\n type=\"text\"\n />\n </div>\n </div>\n </div>\n\n <div class=\"form-items-group\">\n <div class=\"form-item\">\n <label> {{ $t('workouts.AVE_SPEED') }} (km): </label>\n <div class=\"form-inputs-group\">\n <input\n min=\"0\"\n name=\"ave_speed_from\"\n :value=\"$route.query.ave_speed_from\"\n @change=\"handleFilterChange\"\n step=\"1\"\n type=\"number\"\n />\n <span>{{ $t('workouts.TO') }}</span>\n <input\n min=\"0\"\n name=\"ave_speed_to\"\n :value=\"$route.query.ave_speed_to\"\n @change=\"handleFilterChange\"\n step=\"1\"\n type=\"number\"\n />\n </div>\n </div>\n </div>\n\n <div class=\"form-items-group\">\n <div class=\"form-item\">\n <label> {{ $t('workouts.MAX_SPEED') }} (km): </label>\n\n <div class=\"form-inputs-group\">\n <input\n min=\"0\"\n name=\"max_speed_from\"\n :value=\"$route.query.max_speed_from\"\n @change=\"handleFilterChange\"\n step=\"1\"\n type=\"number\"\n />\n <span>{{ $t('workouts.TO') }}</span>\n <input\n min=\"0\"\n name=\"max_speed_to\"\n :value=\"$route.query.max_speed_to\"\n @change=\"handleFilterChange\"\n step=\"1\"\n type=\"number\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"form-button\">\n <button class=\"confirm\" @click=\"onFilter\">\n {{ $t('buttons.FILTER') }}\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { computed, ComputedRef, defineComponent, PropType, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { LocationQuery, useRoute, useRouter } from 'vue-router'\n\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { translateSports } from '@/utils/sports'\n\n export default defineComponent({\n name: 'WorkoutsFilters',\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n sports: {\n type: Object as PropType<ISport[]>,\n required: true,\n },\n },\n emits: ['filter'],\n setup(props, { emit }) {\n const { t } = useI18n()\n const route = useRoute()\n const router = useRouter()\n\n const translatedSports: ComputedRef<ISport[]> = computed(() =>\n translateSports(props.sports, t)\n )\n let params: LocationQuery = Object.assign({}, route.query)\n\n function handleFilterChange(event: Event & { target: HTMLInputElement }) {\n if (event.target.value === '') {\n delete params[event.target.name]\n } else {\n params[event.target.name] = event.target.value\n }\n }\n function onFilter() {\n emit('filter')\n if ('page' in params) {\n params['page'] = '1'\n }\n router.push({ path: '/workouts', query: params })\n }\n\n watch(\n () => route.query,\n (newQuery) => {\n params = Object.assign({}, newQuery)\n }\n )\n\n return { translatedSports, onFilter, handleFilterChange }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base.scss';\n\n .workouts-filters {\n .form {\n display: flex;\n flex-direction: column;\n padding-top: 0;\n\n .form-items-group {\n display: flex;\n flex-direction: column;\n padding: $default-padding * 0.5;\n\n .form-item {\n display: flex;\n flex-direction: column;\n\n .form-inputs-group {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n align-items: center;\n\n input {\n width: 34%;\n }\n span {\n padding: $default-padding * 0.5;\n }\n }\n\n input {\n height: 16px;\n }\n\n select {\n height: 36px;\n padding: 0 $default-padding * 0.5;\n }\n }\n }\n }\n\n .form-button {\n display: flex;\n justify-content: center;\n\n button {\n margin: $default-padding * 2 $default-padding * 0.5 $default-padding\n $default-padding * 0.5;\n width: 100%;\n }\n }\n\n @media screen and (max-width: $medium-limit) {\n .form {\n flex-direction: row;\n padding-top: $default-padding * 0.5;\n\n .form-items-group {\n padding: 0 $default-padding * 0.5;\n height: 100%;\n\n .form-item {\n label {\n font-size: 0.9em;\n }\n\n .form-inputs-group {\n flex-direction: column;\n justify-content: normal;\n padding: 0;\n\n input {\n width: 75%;\n }\n }\n }\n }\n }\n\n .form-button {\n button {\n margin: $default-padding $default-padding * 0.5;\n width: 100%;\n }\n }\n }\n @media screen and (max-width: $small-limit) {\n .form {\n flex-direction: column;\n padding-top: 0;\n\n .form-items-group {\n padding: $default-padding * 0.5;\n\n .form-item {\n label {\n font-size: 1em;\n }\n\n .form-inputs-group {\n flex-direction: row;\n justify-content: space-around;\n align-items: center;\n input {\n width: 50%;\n }\n span {\n padding: $default-padding * 0.5;\n }\n }\n }\n }\n }\n .form-button {\n button {\n margin: $default-padding $default-padding * 0.5;\n }\n }\n }\n }\n</style>\n","\n import { computed, ComputedRef, defineComponent, PropType, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { LocationQuery, useRoute, useRouter } from 'vue-router'\n\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { translateSports } from '@/utils/sports'\n\n export default defineComponent({\n name: 'WorkoutsFilters',\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n sports: {\n type: Object as PropType<ISport[]>,\n required: true,\n },\n },\n emits: ['filter'],\n setup(props, { emit }) {\n const { t } = useI18n()\n const route = useRoute()\n const router = useRouter()\n\n const translatedSports: ComputedRef<ISport[]> = computed(() =>\n translateSports(props.sports, t)\n )\n let params: LocationQuery = Object.assign({}, route.query)\n\n function handleFilterChange(event: Event & { target: HTMLInputElement }) {\n if (event.target.value === '') {\n delete params[event.target.name]\n } else {\n params[event.target.name] = event.target.value\n }\n }\n function onFilter() {\n emit('filter')\n if ('page' in params) {\n params['page'] = '1'\n }\n router.push({ path: '/workouts', query: params })\n }\n\n watch(\n () => route.query,\n (newQuery) => {\n params = Object.assign({}, newQuery)\n }\n )\n\n return { translatedSports, onFilter, handleFilterChange }\n },\n })\n","import { render } from \"./WorkoutsFilters.vue?vue&type=template&id=78f33062&scoped=true\"\nimport script from \"./WorkoutsFilters.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutsFilters.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutsFilters.vue?vue&type=style&index=0&id=78f33062&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-78f33062\"\n\nexport default script","<template>\n <div class=\"workouts-list\">\n <div class=\"box\" :class=\"{ 'empty-table': workouts.length === 0 }\">\n <div class=\"total\">\n <span class=\"total-label\">\n {{ $t('common.TOTAL').toLowerCase() }}:\n </span>\n <span v-if=\"pagination.total !== null\">\n {{ pagination.total }}\n {{ $t('workouts.WORKOUT', pagination.total) }}\n </span>\n </div>\n <FilterSelects\n :sort=\"sortList\"\n :order_by=\"orderByList\"\n :query=\"query\"\n message=\"workouts\"\n @updateSelect=\"reloadWorkouts\"\n />\n <div class=\"workouts-table responsive-table\" v-if=\"workouts.length > 0\">\n <Pagination\n class=\"top-pagination\"\n :pagination=\"pagination\"\n path=\"/workouts\"\n :query=\"query\"\n />\n <table>\n <thead>\n <tr>\n <th class=\"sport-col\" />\n <th>{{ capitalize($t('workouts.WORKOUT', 1)) }}</th>\n <th>{{ capitalize($t('workouts.DATE')) }}</th>\n <th>{{ capitalize($t('workouts.DISTANCE')) }}</th>\n <th>{{ capitalize($t('workouts.DURATION')) }}</th>\n <th>{{ capitalize($t('workouts.AVE_SPEED')) }}</th>\n <th>{{ capitalize($t('workouts.MAX_SPEED')) }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"workout in workouts\" :key=\"workout.id\">\n <td class=\"sport-col\">\n <span class=\"cell-heading\">\n {{ $t('workouts.SPORT', 1) }}\n </span>\n <SportImage\n :title=\"\n sports.filter((s) => s.id === workout.sport_id)[0]\n .translatedLabel\n \"\n :sport-label=\"\n sports.filter((s) => s.id === workout.sport_id)[0].label\n \"\n />\n </td>\n <td\n class=\"workout-title\"\n @mouseover=\"onHover(workout.id)\"\n @mouseleave=\"onHover(null)\"\n >\n <span class=\"cell-heading\">\n {{ capitalize($t('workouts.WORKOUT', 1)) }}\n </span>\n <router-link\n class=\"nav-item\"\n :to=\"{ name: 'Workout', params: { workoutId: workout.id } }\"\n >\n <i\n v-if=\"workout.with_gpx\"\n class=\"fa fa-map-o\"\n aria-hidden=\"true\"\n />\n {{ workout.title }}\n </router-link>\n <StaticMap\n v-if=\"workout.with_gpx && hoverWorkoutId === workout.id\"\n :workout=\"workout\"\n :display-hover=\"true\"\n />\n </td>\n <td>\n <span class=\"cell-heading\">\n {{ $t('workouts.DATE') }}\n </span>\n {{\n format(\n getDateWithTZ(workout.workout_date, user.timezone),\n 'dd/MM/yyyy HH:mm'\n )\n }}\n </td>\n <td class=\"text-right\">\n <span class=\"cell-heading\">\n {{ $t('workouts.DISTANCE') }}\n </span>\n {{ Number(workout.distance).toFixed(2) }} km\n </td>\n <td class=\"text-right\">\n <span class=\"cell-heading\">\n {{ $t('workouts.DURATION') }}\n </span>\n {{ workout.moving }}\n </td>\n <td class=\"text-right\">\n <span class=\"cell-heading\">\n {{ $t('workouts.AVE_SPEED') }}\n </span>\n {{ workout.ave_speed }} km/h\n </td>\n <td class=\"text-right\">\n <span class=\"cell-heading\">\n {{ $t('workouts.MAX_SPEED') }}\n </span>\n {{ workout.max_speed }} km/h\n </td>\n </tr>\n </tbody>\n </table>\n <Pagination :pagination=\"pagination\" path=\"/workouts\" :query=\"query\" />\n </div>\n </div>\n <NoWorkouts v-if=\"workouts.length === 0\" />\n <div id=\"bottom\" />\n </div>\n</template>\n\n<script lang=\"ts\">\n import { format } from 'date-fns'\n import {\n ComputedRef,\n PropType,\n Ref,\n computed,\n defineComponent,\n ref,\n watch,\n capitalize,\n onBeforeMount,\n } from 'vue'\n import { LocationQuery, useRoute, useRouter } from 'vue-router'\n\n import FilterSelects from '@/components/Common/FilterSelects.vue'\n import Pagination from '@/components/Common/Pagination.vue'\n import StaticMap from '@/components/Common/StaticMap.vue'\n import NoWorkouts from '@/components/Workouts/NoWorkouts.vue'\n import { WORKOUTS_STORE } from '@/store/constants'\n import { IPagination } from '@/types/api'\n import { ITranslatedSport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkout, TWorkoutsPayload } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { getQuery, sortList, workoutsPayloadKeys } from '@/utils/api'\n import { getDateWithTZ } from '@/utils/dates'\n import { defaultOrder } from '@/utils/workouts'\n\n export default defineComponent({\n name: 'WorkoutsList',\n components: {\n FilterSelects,\n NoWorkouts,\n Pagination,\n StaticMap,\n },\n props: {\n user: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n sports: {\n type: Object as PropType<ITranslatedSport[]>,\n },\n },\n setup() {\n const store = useStore()\n const route = useRoute()\n const router = useRouter()\n\n const orderByList: string[] = [\n 'ave_speed',\n 'distance',\n 'duration',\n 'workout_date',\n ]\n const workouts: ComputedRef<IWorkout[]> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.USER_WORKOUTS]\n )\n const pagination: ComputedRef<IPagination> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUTS_PAGINATION]\n )\n let query: TWorkoutsPayload = getWorkoutsQuery(route.query)\n const hoverWorkoutId: Ref<string | null> = ref(null)\n\n onBeforeMount(() => {\n loadWorkouts(query)\n })\n\n function loadWorkouts(payload: TWorkoutsPayload) {\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_USER_WORKOUTS, payload)\n }\n function reloadWorkouts(queryParam: string, queryValue: string) {\n const newQuery: LocationQuery = Object.assign({}, route.query)\n newQuery[queryParam] = queryValue\n if (queryParam === 'per_page') {\n newQuery['page'] = '1'\n }\n query = getWorkoutsQuery(newQuery)\n router.push({ path: '/workouts', query })\n }\n\n function getWorkoutsQuery(newQuery: LocationQuery): TWorkoutsPayload {\n query = getQuery(newQuery, orderByList, defaultOrder.order_by, {\n defaultSort: defaultOrder.order,\n query,\n })\n Object.keys(newQuery)\n .filter((k) => workoutsPayloadKeys.includes(k))\n .map((k) => {\n if (typeof newQuery[k] === 'string') {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n query[k] = newQuery[k]\n }\n })\n return query\n }\n\n function onHover(workoutId: string | null) {\n hoverWorkoutId.value = workoutId\n }\n\n watch(\n () => route.query,\n async (newQuery) => {\n query = getWorkoutsQuery(newQuery)\n loadWorkouts(query)\n }\n )\n\n return {\n query,\n hoverWorkoutId,\n orderByList,\n pagination,\n sortList,\n workouts,\n capitalize,\n format,\n getDateWithTZ,\n onHover,\n reloadWorkouts,\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base.scss';\n .workouts-list {\n display: flex;\n flex-direction: column;\n margin-bottom: 50px;\n width: 100%;\n\n .box {\n padding: $default-padding $default-padding * 2;\n @media screen and (max-width: $small-limit) {\n &.empty-table {\n display: none;\n }\n }\n\n .total {\n display: flex;\n gap: $default-padding * 0.5;\n .total-label {\n font-weight: bold;\n }\n }\n\n .top-pagination {\n display: none;\n\n @media screen and (max-width: $small-limit) {\n display: flex;\n }\n }\n ::v-deep(.pagination-center) {\n @media screen and (max-width: $small-limit) {\n ul {\n margin-top: 0;\n }\n }\n }\n\n .workouts-table {\n .sport-col {\n padding-right: 0;\n }\n .workout-title {\n max-width: 90px;\n position: relative;\n .fa-map-o {\n font-size: 0.75em;\n }\n .static-map {\n display: none;\n box-shadow: 3px 3px 3px 1px lightgrey;\n }\n }\n .workout-title:hover .static-map {\n display: block;\n }\n .sport-img {\n height: 20px;\n width: 20px;\n }\n @media screen and (max-width: $small-limit) {\n .sport-col {\n display: flex;\n justify-content: center;\n padding: $default-padding;\n }\n .workout-title {\n max-width: initial;\n }\n .workout-title:hover .static-map {\n display: none;\n }\n }\n }\n }\n\n .more-workouts {\n display: flex;\n justify-content: center;\n padding: $default-padding;\n }\n }\n</style>\n","\n import { format } from 'date-fns'\n import {\n ComputedRef,\n PropType,\n Ref,\n computed,\n defineComponent,\n ref,\n watch,\n capitalize,\n onBeforeMount,\n } from 'vue'\n import { LocationQuery, useRoute, useRouter } from 'vue-router'\n\n import FilterSelects from '@/components/Common/FilterSelects.vue'\n import Pagination from '@/components/Common/Pagination.vue'\n import StaticMap from '@/components/Common/StaticMap.vue'\n import NoWorkouts from '@/components/Workouts/NoWorkouts.vue'\n import { WORKOUTS_STORE } from '@/store/constants'\n import { IPagination } from '@/types/api'\n import { ITranslatedSport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkout, TWorkoutsPayload } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { getQuery, sortList, workoutsPayloadKeys } from '@/utils/api'\n import { getDateWithTZ } from '@/utils/dates'\n import { defaultOrder } from '@/utils/workouts'\n\n export default defineComponent({\n name: 'WorkoutsList',\n components: {\n FilterSelects,\n NoWorkouts,\n Pagination,\n StaticMap,\n },\n props: {\n user: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n sports: {\n type: Object as PropType<ITranslatedSport[]>,\n },\n },\n setup() {\n const store = useStore()\n const route = useRoute()\n const router = useRouter()\n\n const orderByList: string[] = [\n 'ave_speed',\n 'distance',\n 'duration',\n 'workout_date',\n ]\n const workouts: ComputedRef<IWorkout[]> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.USER_WORKOUTS]\n )\n const pagination: ComputedRef<IPagination> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUTS_PAGINATION]\n )\n let query: TWorkoutsPayload = getWorkoutsQuery(route.query)\n const hoverWorkoutId: Ref<string | null> = ref(null)\n\n onBeforeMount(() => {\n loadWorkouts(query)\n })\n\n function loadWorkouts(payload: TWorkoutsPayload) {\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_USER_WORKOUTS, payload)\n }\n function reloadWorkouts(queryParam: string, queryValue: string) {\n const newQuery: LocationQuery = Object.assign({}, route.query)\n newQuery[queryParam] = queryValue\n if (queryParam === 'per_page') {\n newQuery['page'] = '1'\n }\n query = getWorkoutsQuery(newQuery)\n router.push({ path: '/workouts', query })\n }\n\n function getWorkoutsQuery(newQuery: LocationQuery): TWorkoutsPayload {\n query = getQuery(newQuery, orderByList, defaultOrder.order_by, {\n defaultSort: defaultOrder.order,\n query,\n })\n Object.keys(newQuery)\n .filter((k) => workoutsPayloadKeys.includes(k))\n .map((k) => {\n if (typeof newQuery[k] === 'string') {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n query[k] = newQuery[k]\n }\n })\n return query\n }\n\n function onHover(workoutId: string | null) {\n hoverWorkoutId.value = workoutId\n }\n\n watch(\n () => route.query,\n async (newQuery) => {\n query = getWorkoutsQuery(newQuery)\n loadWorkouts(query)\n }\n )\n\n return {\n query,\n hoverWorkoutId,\n orderByList,\n pagination,\n sortList,\n workouts,\n capitalize,\n format,\n getDateWithTZ,\n onHover,\n reloadWorkouts,\n }\n },\n })\n","import { render } from \"./WorkoutsList.vue?vue&type=template&id=977fe558&scoped=true\"\nimport script from \"./WorkoutsList.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutsList.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutsList.vue?vue&type=style&index=0&id=977fe558&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-977fe558\"\n\nexport default script","\n import { ComputedRef, computed, defineComponent, ref } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n import WorkoutsFilters from '@/components/Workouts/WorkoutsFilters.vue'\n import WorkoutsList from '@/components/Workouts/WorkoutsList.vue'\n import { AUTH_USER_STORE, SPORTS_STORE } from '@/store/constants'\n import { ISport, ITranslatedSport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { useStore } from '@/use/useStore'\n import { translateSports } from '@/utils/sports'\n\n export default defineComponent({\n name: 'WorkoutsView',\n components: {\n WorkoutsFilters,\n WorkoutsList,\n },\n setup() {\n const { t } = useI18n()\n const store = useStore()\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n const translatedSports: ComputedRef<ITranslatedSport[]> = computed(() =>\n translateSports(sports.value, t)\n )\n const hiddenFilters = ref(true)\n\n function toggleFilters() {\n hiddenFilters.value = !hiddenFilters.value\n }\n\n return {\n authUser,\n hiddenFilters,\n translatedSports,\n toggleFilters,\n }\n },\n })\n","import { render } from \"./WorkoutsView.vue?vue&type=template&id=22a8a7cd&scoped=true\"\nimport script from \"./WorkoutsView.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutsView.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutsView.vue?vue&type=style&index=0&id=22a8a7cd&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-22a8a7cd\"\n\nexport default script","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutsFilters.vue?vue&type=style&index=0&id=78f33062&lang=scss&scoped=true\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutMap.vue?vue&type=style&index=0&id=76f3a2e8&lang=scss&scoped=true\"","<template>\n <div id=\"workout\" class=\"view\">\n <div class=\"container\">\n <div class=\"workout-container\" v-if=\"sports.length > 0\">\n <div v-if=\"workoutData.workout.id\">\n <WorkoutDetail\n :workoutData=\"workoutData\"\n :sports=\"sports\"\n :authUser=\"authUser\"\n :markerCoordinates=\"markerCoordinates\"\n :displaySegment=\"displaySegment\"\n />\n <WorkoutChart\n v-if=\"\n workoutData.workout.with_gpx && workoutData.chartData.length > 0\n \"\n :workoutData=\"workoutData\"\n :authUser=\"authUser\"\n :displaySegment=\"displaySegment\"\n @getCoordinates=\"updateCoordinates\"\n />\n <WorkoutSegments\n v-if=\"!displaySegment && workoutData.workout.segments.length > 1\"\n :segments=\"workoutData.workout.segments\"\n />\n <WorkoutNotes\n v-if=\"!displaySegment\"\n :notes=\"workoutData.workout.notes\"\n />\n <div id=\"bottom\" />\n </div>\n <div v-else>\n <NotFound v-if=\"!workoutData.loading\" target=\"WORKOUT\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n import {\n ComputedRef,\n Ref,\n computed,\n defineComponent,\n ref,\n watch,\n onBeforeMount,\n onUnmounted,\n } from 'vue'\n import { useRoute } from 'vue-router'\n\n import NotFound from '@/components/Common/NotFound.vue'\n import WorkoutChart from '@/components/Workout/WorkoutChart.vue'\n import WorkoutDetail from '@/components/Workout/WorkoutDetail/index.vue'\n import WorkoutNotes from '@/components/Workout/WorkoutNotes.vue'\n import WorkoutSegments from '@/components/Workout/WorkoutSegments.vue'\n import {\n AUTH_USER_STORE,\n SPORTS_STORE,\n WORKOUTS_STORE,\n } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkoutData, IWorkoutPayload, TCoordinates } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n\n export default defineComponent({\n name: 'Workout',\n components: {\n NotFound,\n WorkoutChart,\n WorkoutDetail,\n WorkoutNotes,\n WorkoutSegments,\n },\n props: {\n displaySegment: {\n type: Boolean,\n required: true,\n },\n },\n setup(props) {\n const route = useRoute()\n const store = useStore()\n\n onBeforeMount(() => {\n const payload: IWorkoutPayload = { workoutId: route.params.workoutId }\n if (props.displaySegment) {\n payload.segmentId = route.params.segmentId\n }\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, payload)\n })\n\n const workoutData: ComputedRef<IWorkoutData> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUT_DATA]\n )\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n let markerCoordinates: Ref<TCoordinates> = ref({\n latitude: null,\n longitude: null,\n })\n\n function updateCoordinates(coordinates: TCoordinates) {\n markerCoordinates.value = {\n latitude: coordinates.latitude,\n longitude: coordinates.longitude,\n }\n }\n\n watch(\n () => route.params.workoutId,\n async (newWorkoutId) => {\n if (newWorkoutId) {\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, {\n workoutId: newWorkoutId,\n })\n }\n }\n )\n watch(\n () => route.params.segmentId,\n async (newSegmentId) => {\n if (route.params.workoutId) {\n const payload: IWorkoutPayload = {\n workoutId: route.params.workoutId,\n }\n if (newSegmentId) {\n payload.segmentId = newSegmentId\n }\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, payload)\n }\n }\n )\n\n onUnmounted(() => {\n store.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_WORKOUT)\n })\n\n return {\n authUser,\n markerCoordinates,\n sports,\n workoutData,\n updateCoordinates,\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n #workout {\n display: flex;\n .container {\n width: 100%;\n padding: 0;\n .workout-container {\n width: 100%;\n }\n .workout-loading {\n height: $app-height;\n width: 100%;\n .loading {\n display: flex;\n align-items: center;\n height: 100%;\n }\n }\n }\n }\n</style>\n","<template>\n <div id=\"workout-chart\">\n <Card>\n <template #title>{{ $t('workouts.ANALYSIS') }} </template>\n <template #content>\n <div class=\"chart-radio\">\n <label>\n <input\n type=\"radio\"\n name=\"distance\"\n :checked=\"displayDistance\"\n @click=\"updateDisplayDistance\"\n />\n {{ $t('workouts.DISTANCE') }}\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"duration\"\n :checked=\"!displayDistance\"\n @click=\"updateDisplayDistance\"\n />\n {{ $t('workouts.DURATION') }}\n </label>\n </div>\n <LineChart\n v-bind=\"lineChartProps\"\n class=\"line-chart\"\n @mouseleave=\"emitEmptyCoordinates\"\n />\n <div class=\"no-data-cleaning\">\n {{ $t('workouts.NO_DATA_CLEANING') }}\n </div>\n </template>\n </Card>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { ChartData, ChartOptions } from 'chart.js'\n import { ComputedRef, PropType, computed, defineComponent, ref } from 'vue'\n import { LineChart, useLineChart } from 'vue-chart-3'\n import { useI18n } from 'vue-i18n'\n\n import { IUserProfile } from '@/types/user'\n import {\n IWorkoutChartData,\n IWorkoutData,\n TCoordinates,\n } from '@/types/workouts'\n import { getDatasets } from '@/utils/workouts'\n\n export default defineComponent({\n name: 'WorkoutChart',\n components: {\n LineChart,\n },\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n workoutData: {\n type: Object as PropType<IWorkoutData>,\n required: true,\n },\n },\n emits: ['getCoordinates'],\n setup(props, { emit }) {\n const { t } = useI18n()\n\n let displayDistance = ref(true)\n const datasets: ComputedRef<IWorkoutChartData> = computed(() =>\n getDatasets(props.workoutData.chartData, t)\n )\n let chartData: ComputedRef<ChartData<'line'>> = computed(() => ({\n labels: displayDistance.value\n ? datasets.value.distance_labels\n : datasets.value.duration_labels,\n datasets: JSON.parse(\n JSON.stringify([\n datasets.value.datasets.speed,\n datasets.value.datasets.elevation,\n ])\n ),\n }))\n const coordinates: ComputedRef<TCoordinates[]> = computed(\n () => datasets.value.coordinates\n )\n const options = computed<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: true,\n animation: false,\n layout: {\n padding: {\n top: 22,\n },\n },\n scales: {\n [displayDistance.value ? 'xDistance' : 'xDuration']: {\n grid: {\n drawOnChartArea: false,\n },\n ticks: {\n count: 10,\n callback: function (value) {\n return displayDistance.value\n ? Number(value).toFixed(2)\n : formatDuration(value)\n },\n },\n type: 'linear',\n bounds: 'data',\n title: {\n display: true,\n text: displayDistance.value\n ? t('workouts.DISTANCE') + ' (km)'\n : t('workouts.DURATION'),\n },\n },\n ySpeed: {\n grid: {\n drawOnChartArea: false,\n },\n position: 'left',\n title: {\n display: true,\n text: t('workouts.SPEED') + ' (km/h)',\n },\n },\n yElevation: {\n beginAtZero: true,\n grid: {\n drawOnChartArea: false,\n },\n position: 'right',\n title: {\n display: true,\n text: t('workouts.ELEVATION') + ' (m)',\n },\n },\n },\n elements: {\n point: {\n pointStyle: 'circle',\n pointRadius: 0,\n },\n },\n plugins: {\n datalabels: {\n display: false,\n },\n tooltip: {\n interaction: {\n intersect: false,\n mode: 'index',\n },\n callbacks: {\n label: function (context) {\n const label = ` ${context.dataset.label}: ${context.formattedValue}`\n return context.dataset.yAxisID === 'yElevation'\n ? label + ' m'\n : label + ' km/h'\n },\n title: function (tooltipItems) {\n if (tooltipItems.length > 0) {\n emitCoordinates(coordinates.value[tooltipItems[0].dataIndex])\n }\n return tooltipItems.length === 0\n ? ''\n : displayDistance.value\n ? `${t('workouts.DISTANCE')}: ${tooltipItems[0].label} km`\n : `${t('workouts.DURATION')}: ${formatDuration(\n tooltipItems[0].label.replace(',', '')\n )}`\n },\n },\n },\n },\n }))\n\n function updateDisplayDistance() {\n displayDistance.value = !displayDistance.value\n }\n function formatDuration(duration: string | number): string {\n return new Date(+duration * 1000).toISOString().substr(11, 8)\n }\n function emitCoordinates(coordinates: TCoordinates) {\n emit('getCoordinates', coordinates)\n }\n function emitEmptyCoordinates() {\n emitCoordinates({ latitude: null, longitude: null })\n }\n\n const { lineChartProps } = useLineChart({\n chartData,\n options,\n })\n return {\n displayDistance,\n lineChartProps,\n emitEmptyCoordinates,\n updateDisplayDistance,\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n #workout-chart {\n ::v-deep(.card) {\n .card-title {\n text-transform: capitalize;\n }\n .card-content {\n display: flex;\n flex-direction: column;\n .chart-radio {\n width: 100%;\n display: flex;\n justify-content: center;\n label {\n padding: 0 $default-padding;\n }\n }\n .no-data-cleaning {\n font-size: 0.85em;\n font-style: italic;\n }\n }\n\n @media screen and (max-width: $small-limit) {\n .card-content {\n padding: $default-padding 0;\n .no-data-cleaning {\n padding: 0 $default-padding * 2;\n }\n }\n }\n }\n }\n</style>\n","\n import { ChartData, ChartOptions } from 'chart.js'\n import { ComputedRef, PropType, computed, defineComponent, ref } from 'vue'\n import { LineChart, useLineChart } from 'vue-chart-3'\n import { useI18n } from 'vue-i18n'\n\n import { IUserProfile } from '@/types/user'\n import {\n IWorkoutChartData,\n IWorkoutData,\n TCoordinates,\n } from '@/types/workouts'\n import { getDatasets } from '@/utils/workouts'\n\n export default defineComponent({\n name: 'WorkoutChart',\n components: {\n LineChart,\n },\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n workoutData: {\n type: Object as PropType<IWorkoutData>,\n required: true,\n },\n },\n emits: ['getCoordinates'],\n setup(props, { emit }) {\n const { t } = useI18n()\n\n let displayDistance = ref(true)\n const datasets: ComputedRef<IWorkoutChartData> = computed(() =>\n getDatasets(props.workoutData.chartData, t)\n )\n let chartData: ComputedRef<ChartData<'line'>> = computed(() => ({\n labels: displayDistance.value\n ? datasets.value.distance_labels\n : datasets.value.duration_labels,\n datasets: JSON.parse(\n JSON.stringify([\n datasets.value.datasets.speed,\n datasets.value.datasets.elevation,\n ])\n ),\n }))\n const coordinates: ComputedRef<TCoordinates[]> = computed(\n () => datasets.value.coordinates\n )\n const options = computed<ChartOptions<'line'>>(() => ({\n responsive: true,\n maintainAspectRatio: true,\n animation: false,\n layout: {\n padding: {\n top: 22,\n },\n },\n scales: {\n [displayDistance.value ? 'xDistance' : 'xDuration']: {\n grid: {\n drawOnChartArea: false,\n },\n ticks: {\n count: 10,\n callback: function (value) {\n return displayDistance.value\n ? Number(value).toFixed(2)\n : formatDuration(value)\n },\n },\n type: 'linear',\n bounds: 'data',\n title: {\n display: true,\n text: displayDistance.value\n ? t('workouts.DISTANCE') + ' (km)'\n : t('workouts.DURATION'),\n },\n },\n ySpeed: {\n grid: {\n drawOnChartArea: false,\n },\n position: 'left',\n title: {\n display: true,\n text: t('workouts.SPEED') + ' (km/h)',\n },\n },\n yElevation: {\n beginAtZero: true,\n grid: {\n drawOnChartArea: false,\n },\n position: 'right',\n title: {\n display: true,\n text: t('workouts.ELEVATION') + ' (m)',\n },\n },\n },\n elements: {\n point: {\n pointStyle: 'circle',\n pointRadius: 0,\n },\n },\n plugins: {\n datalabels: {\n display: false,\n },\n tooltip: {\n interaction: {\n intersect: false,\n mode: 'index',\n },\n callbacks: {\n label: function (context) {\n const label = ` ${context.dataset.label}: ${context.formattedValue}`\n return context.dataset.yAxisID === 'yElevation'\n ? label + ' m'\n : label + ' km/h'\n },\n title: function (tooltipItems) {\n if (tooltipItems.length > 0) {\n emitCoordinates(coordinates.value[tooltipItems[0].dataIndex])\n }\n return tooltipItems.length === 0\n ? ''\n : displayDistance.value\n ? `${t('workouts.DISTANCE')}: ${tooltipItems[0].label} km`\n : `${t('workouts.DURATION')}: ${formatDuration(\n tooltipItems[0].label.replace(',', '')\n )}`\n },\n },\n },\n },\n }))\n\n function updateDisplayDistance() {\n displayDistance.value = !displayDistance.value\n }\n function formatDuration(duration: string | number): string {\n return new Date(+duration * 1000).toISOString().substr(11, 8)\n }\n function emitCoordinates(coordinates: TCoordinates) {\n emit('getCoordinates', coordinates)\n }\n function emitEmptyCoordinates() {\n emitCoordinates({ latitude: null, longitude: null })\n }\n\n const { lineChartProps } = useLineChart({\n chartData,\n options,\n })\n return {\n displayDistance,\n lineChartProps,\n emitEmptyCoordinates,\n updateDisplayDistance,\n }\n },\n })\n","import { render } from \"./WorkoutChart.vue?vue&type=template&id=2230775e&scoped=true\"\nimport script from \"./WorkoutChart.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutChart.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutChart.vue?vue&type=style&index=0&id=2230775e&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-2230775e\"\n\nexport default script","<template>\n <div class=\"workout-detail\">\n <Modal\n v-if=\"displayModal\"\n :title=\"$t('common.CONFIRMATION')\"\n :message=\"$t('workouts.WORKOUT_DELETION_CONFIRMATION')\"\n @confirmAction=\"deleteWorkout(workoutObject.workoutId)\"\n @cancelAction=\"updateDisplayModal(false)\"\n />\n <Card>\n <template #title>\n <WorkoutCardTitle\n :sport=\"sport\"\n :workoutObject=\"workoutObject\"\n @displayModal=\"updateDisplayModal(true)\"\n />\n </template>\n <template #content>\n <WorkoutMap\n :workoutData=\"workoutData\"\n :markerCoordinates=\"markerCoordinates\"\n />\n <WorkoutData :workoutObject=\"workoutObject\" />\n </template>\n </Card>\n </div>\n</template>\n\n<script lang=\"ts\">\n import {\n ComputedRef,\n PropType,\n Ref,\n computed,\n defineComponent,\n ref,\n watch,\n } from 'vue'\n import { useRoute } from 'vue-router'\n\n import WorkoutCardTitle from '@/components/Workout/WorkoutDetail/WorkoutCardTitle.vue'\n import WorkoutData from '@/components/Workout/WorkoutDetail/WorkoutData.vue'\n import WorkoutMap from '@/components/Workout/WorkoutDetail/WorkoutMap.vue'\n import { WORKOUTS_STORE } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import {\n IWorkout,\n IWorkoutData,\n IWorkoutObject,\n IWorkoutSegment,\n TCoordinates,\n } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { formatWorkoutDate, getDateWithTZ } from '@/utils/dates'\n\n export default defineComponent({\n name: 'WorkoutDetail',\n components: {\n WorkoutCardTitle,\n WorkoutData,\n WorkoutMap,\n },\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n displaySegment: {\n type: Boolean,\n required: true,\n },\n markerCoordinates: {\n type: Object as PropType<TCoordinates>,\n required: false,\n },\n sports: {\n type: Object as PropType<ISport[]>,\n },\n workoutData: {\n type: Object as PropType<IWorkoutData>,\n required: true,\n },\n },\n setup(props) {\n const route = useRoute()\n const store = useStore()\n\n function getWorkoutObjectUrl(\n workout: IWorkout,\n displaySegment: boolean,\n segmentId: number | null\n ): Record<string, string | null> {\n const previousUrl =\n displaySegment && segmentId && segmentId !== 1\n ? `/workouts/${workout.id}/segment/${segmentId - 1}`\n : !displaySegment && workout.previous_workout\n ? `/workouts/${workout.previous_workout}`\n : null\n const nextUrl =\n displaySegment && segmentId && segmentId < workout.segments.length\n ? `/workouts/${workout.id}/segment/${segmentId + 1}`\n : !displaySegment && workout.next_workout\n ? `/workouts/${workout.next_workout}`\n : null\n return {\n previousUrl,\n nextUrl,\n }\n }\n function getWorkoutObject(\n workout: IWorkout,\n segment: IWorkoutSegment | null\n ): IWorkoutObject {\n const urls = getWorkoutObjectUrl(\n workout,\n props.displaySegment,\n segmentId.value ? +segmentId.value : null\n )\n const workoutDate = formatWorkoutDate(\n getDateWithTZ(\n props.workoutData.workout.workout_date,\n props.authUser.timezone\n )\n )\n return {\n ascent: segment ? segment.ascent : workout.ascent,\n aveSpeed: segment ? segment.ave_speed : workout.ave_speed,\n distance: segment ? segment.distance : workout.distance,\n descent: segment ? segment.descent : workout.descent,\n duration: segment ? segment.duration : workout.duration,\n maxAlt: segment ? segment.max_alt : workout.max_alt,\n maxSpeed: segment ? segment.max_speed : workout.max_speed,\n minAlt: segment ? segment.min_alt : workout.min_alt,\n moving: segment ? segment.moving : workout.moving,\n nextUrl: urls.nextUrl,\n pauses: segment ? segment.pauses : workout.pauses,\n previousUrl: urls.previousUrl,\n records: segment ? [] : workout.records,\n segmentId: segment ? segment.segment_id : null,\n title: workout.title,\n type: props.displaySegment ? 'SEGMENT' : 'WORKOUT',\n workoutDate: workoutDate.workout_date,\n weatherEnd: segment ? null : workout.weather_end,\n workoutId: workout.id,\n weatherStart: segment ? null : workout.weather_start,\n workoutTime: workoutDate.workout_time,\n }\n }\n function updateDisplayModal(value: boolean) {\n displayModal.value = value\n }\n function deleteWorkout(workoutId: string) {\n store.dispatch(WORKOUTS_STORE.ACTIONS.DELETE_WORKOUT, {\n workoutId: workoutId,\n })\n }\n\n const workout: ComputedRef<IWorkout> = computed(\n () => props.workoutData.workout\n )\n let segmentId: Ref<number | null> = ref(\n route.params.workoutId ? +route.params.segmentId : null\n )\n const segment: ComputedRef<IWorkoutSegment | null> = computed(() =>\n workout.value.segments.length > 0 && segmentId.value\n ? workout.value.segments[+segmentId.value - 1]\n : null\n )\n let displayModal: Ref<boolean> = ref(false)\n\n watch(\n () => route.params.segmentId,\n async (newSegmentId) => {\n if (newSegmentId) {\n segmentId.value = +newSegmentId\n }\n }\n )\n\n return {\n sport: computed(() =>\n props.sports\n ? props.sports.find(\n (sport) => sport.id === props.workoutData.workout.sport_id\n )\n : {}\n ),\n workoutObject: computed(() =>\n getWorkoutObject(workout.value, segment.value)\n ),\n displayModal,\n deleteWorkout,\n updateDisplayModal,\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n .workout-detail {\n display: flex;\n ::v-deep(.card) {\n width: 100%;\n .card-content {\n display: flex;\n flex-direction: row;\n @media screen and (max-width: $medium-limit) {\n flex-direction: column;\n }\n }\n }\n }\n</style>\n","<template>\n <div id=\"workout-card-title\">\n <div\n class=\"workout-previous workout-arrow\"\n :class=\"{ inactive: !workoutObject.previousUrl }\"\n :title=\"\n workoutObject.previousUrl\n ? $t(`workouts.PREVIOUS_${workoutObject.type}`)\n : $t(`workouts.NO_PREVIOUS_${workoutObject.type}`)\n \"\n @click=\"\n workoutObject.previousUrl\n ? $router.push(workoutObject.previousUrl)\n : null\n \"\n >\n <i class=\"fa fa-chevron-left\" aria-hidden=\"true\" />\n </div>\n <div class=\"workout-card-title\">\n <SportImage :sport-label=\"sport.label\" />\n <div class=\"workout-title-date\">\n <div class=\"workout-title\" v-if=\"workoutObject.type === 'WORKOUT'\">\n {{ workoutObject.title }}\n <i\n class=\"fa fa-edit\"\n aria-hidden=\"true\"\n @click=\"\n $router.push({\n name: 'EditWorkout',\n params: { workoutId: workoutObject.workoutId },\n })\n \"\n />\n <i\n class=\"fa fa-trash\"\n aria-hidden=\"true\"\n @click=\"emit('displayModal', true)\"\n />\n </div>\n <div class=\"workout-title\" v-else>\n {{ workoutObject.title }}\n <span class=\"workout-segment\">\n —\n <i class=\"fa fa-map-marker\" aria-hidden=\"true\" />\n {{ $t('workouts.SEGMENT') }}\n {{ workoutObject.segmentId + 1 }}\n </span>\n </div>\n <div class=\"workout-date\">\n {{ workoutObject.workoutDate }} -\n {{ workoutObject.workoutTime }}\n <span class=\"workout-link\">\n <router-link\n v-if=\"workoutObject.type === 'SEGMENT'\"\n :to=\"{\n name: 'Workout',\n params: { workoutId: workoutObject.workoutId },\n }\"\n >\n > {{ $t('workouts.BACK_TO_WORKOUT') }}\n </router-link></span\n >\n </div>\n </div>\n </div>\n <div\n class=\"workout-next workout-arrow\"\n :class=\"{ inactive: !workoutObject.nextUrl }\"\n :title=\"\n workoutObject.nextUrl\n ? $t(`workouts.NEXT_${workoutObject.type}`)\n : $t(`workouts.NO_NEXT_${workoutObject.type}`)\n \"\n @click=\"\n workoutObject.nextUrl ? $router.push(workoutObject.nextUrl) : null\n \"\n >\n <i class=\"fa fa-chevron-right\" aria-hidden=\"true\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { PropType, defineComponent } from 'vue'\n\n import { ISport } from '@/types/sports'\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutCardTitle',\n props: {\n sport: {\n type: Object as PropType<ISport>,\n required: true,\n },\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n emits: ['displayModal'],\n setup(props, { emit }) {\n return { emit }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n\n #workout-card-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .workout-arrow {\n cursor: pointer;\n &.inactive {\n color: var(--disabled-color);\n cursor: default;\n }\n }\n\n .workout-card-title {\n display: flex;\n flex-grow: 1;\n .sport-img {\n height: 35px;\n width: 35px;\n padding: 0 $default-padding;\n }\n .workout-date {\n font-size: 0.8em;\n font-weight: normal;\n }\n .workout-segment {\n font-weight: normal;\n }\n .workout-link {\n padding-left: $default-padding;\n }\n\n .fa {\n padding: 0 $default-padding * 0.3;\n }\n\n @media screen and (max-width: $small-limit) {\n .fa-trash,\n .fa-edit {\n border: solid 1px var(--card-border-color);\n border-radius: $border-radius;\n margin-left: $default-margin * 0.5;\n padding: 0 $default-padding;\n }\n }\n }\n }\n</style>\n","\n import { PropType, defineComponent } from 'vue'\n\n import { ISport } from '@/types/sports'\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutCardTitle',\n props: {\n sport: {\n type: Object as PropType<ISport>,\n required: true,\n },\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n emits: ['displayModal'],\n setup(props, { emit }) {\n return { emit }\n },\n })\n","import { render } from \"./WorkoutCardTitle.vue?vue&type=template&id=9cab340c&scoped=true\"\nimport script from \"./WorkoutCardTitle.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutCardTitle.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutCardTitle.vue?vue&type=style&index=0&id=9cab340c&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-9cab340c\"\n\nexport default script","<template>\n <div id=\"workout-info\">\n <div class=\"workout-data\">\n <i class=\"fa fa-clock-o\" aria-hidden=\"true\" />\n {{ $t('workouts.DURATION') }}: <span>{{ workoutObject.moving }}</span>\n <WorkoutRecord :workoutObject=\"workoutObject\" record_type=\"LD\" />\n <div v-if=\"withPause\">\n ({{ $t('workouts.PAUSES') }}: <span>{{ workoutObject.pauses }}</span> -\n {{ $t('workouts.TOTAL_DURATION') }}:\n <span>{{ workoutObject.duration }})</span>\n </div>\n </div>\n <div class=\"workout-data\">\n <i class=\"fa fa-road\" aria-hidden=\"true\" />\n {{ $t('workouts.DISTANCE') }}:\n <span>{{ workoutObject.distance }} km</span>\n <WorkoutRecord :workoutObject=\"workoutObject\" record_type=\"FD\" />\n </div>\n <div class=\"workout-data\">\n <i class=\"fa fa-tachometer\" aria-hidden=\"true\" />\n {{ $t('workouts.AVERAGE_SPEED') }}:\n <span>{{ workoutObject.aveSpeed }} km/h</span\n ><WorkoutRecord :workoutObject=\"workoutObject\" record_type=\"AS\" /><br />\n {{ $t('workouts.MAX_SPEED') }}:\n <span>{{ workoutObject.maxSpeed }} km/h</span>\n <WorkoutRecord :workoutObject=\"workoutObject\" record_type=\"MS\" />\n </div>\n <div\n class=\"workout-data\"\n v-if=\"workoutObject.maxAlt !== null && workoutObject.minAlt !== null\"\n >\n <img\n class=\"mountains\"\n src=\"/img/workouts/mountains.svg\"\n :alt=\"$t('workouts.ELEVATION')\"\n />\n {{ $t('workouts.MIN_ALTITUDE') }}:\n <span>{{ workoutObject.minAlt }} m</span><br />\n {{ $t('workouts.MAX_ALTITUDE') }}:\n <span>{{ workoutObject.maxAlt }} m</span>\n </div>\n <div\n class=\"workout-data\"\n v-if=\"workoutObject.ascent !== null && workoutObject.descent !== null\"\n >\n <i class=\"fa fa-location-arrow\" aria-hidden=\"true\" />\n {{ $t('workouts.ASCENT') }}: <span>{{ workoutObject.ascent }} m</span\n ><br />\n {{ $t('workouts.DESCENT') }}: <span>{{ workoutObject.descent }} m</span>\n </div>\n <WorkoutWeather :workoutObject=\"workoutObject\" />\n </div>\n</template>\n\n<script lang=\"ts\">\n import { PropType, computed, defineComponent } from 'vue'\n\n import WorkoutRecord from '@/components/Workout/WorkoutDetail/WorkoutRecord.vue'\n import WorkoutWeather from '@/components/Workout/WorkoutDetail/WorkoutWeather.vue'\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutData',\n components: {\n WorkoutRecord,\n WorkoutWeather,\n },\n props: {\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n setup(props) {\n return {\n withPause: computed(\n () =>\n props.workoutObject.pauses !== '0:00:00' &&\n props.workoutObject.pauses !== null\n ),\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n #workout-info {\n display: flex;\n flex-direction: column;\n padding: $default-padding $default-padding * 2;\n width: 100%;\n .mountains {\n margin-bottom: -3px;\n height: 16px;\n filter: var(--workout-img-color);\n }\n .workout-data {\n text-transform: capitalize;\n padding: $default-padding * 0.5 0;\n\n span {\n font-weight: bold;\n text-transform: lowercase;\n }\n }\n\n @media screen and (max-width: $small-limit) {\n padding: $default-padding;\n }\n }\n</style>\n","<template>\n <span\n class=\"workout-record\"\n v-if=\"\n workoutObject.records &&\n workoutObject.records.find((record) => record.record_type === record_type)\n \"\n >\n <sup>\n <i class=\"fa fa-trophy\" aria-hidden=\"true\" />\n </sup>\n </span>\n</template>\n\n<script lang=\"ts\">\n import { defineComponent, PropType } from 'vue'\n\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutRecord',\n props: {\n record_type: {\n type: String,\n required: true,\n },\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n .workout-record {\n sup {\n font-size: 75%;\n line-height: 0;\n }\n }\n</style>\n","\n import { defineComponent, PropType } from 'vue'\n\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutRecord',\n props: {\n record_type: {\n type: String,\n required: true,\n },\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n })\n","import { render } from \"./WorkoutRecord.vue?vue&type=template&id=da96984c&scoped=true\"\nimport script from \"./WorkoutRecord.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutRecord.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutRecord.vue?vue&type=style&index=0&id=da96984c&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-da96984c\"\n\nexport default script","<template>\n <div\n id=\"workout-weather\"\n v-if=\"workoutObject.weatherStart && workoutObject.weatherEnd\"\n >\n <table class=\"weather-table\">\n <thead>\n <tr>\n <th />\n <th>\n <div class=\"weather-th\">\n {{ $t('workouts.START') }}\n <img\n class=\"weather-img\"\n :src=\"`/img/weather/${workoutObject.weatherStart.icon}.svg`\"\n :alt=\"\n $t(\n `workouts.WEATHER.DARK_SKY.${workoutObject.weatherStart.icon}`\n )\n \"\n :title=\"\n $t(\n `workouts.WEATHER.DARK_SKY.${workoutObject.weatherStart.icon}`\n )\n \"\n />\n </div>\n </th>\n <th>\n <div class=\"weather-th\">\n {{ $t('workouts.END') }}\n <img\n class=\"weather-img\"\n :src=\"`/img/weather/${workoutObject.weatherEnd.icon}.svg`\"\n :alt=\"\n $t(\n `workouts.WEATHER.DARK_SKY.${workoutObject.weatherEnd.icon}`\n )\n \"\n :title=\"\n $t(\n `workouts.WEATHER.DARK_SKY.${workoutObject.weatherEnd.icon}`\n )\n \"\n />\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <img\n class=\"weather-img weather-img-small\"\n src=\"/img/weather/temperature.svg\"\n :alt=\"$t(`workouts.WEATHER.TEMPERATURE`)\"\n :title=\"$t(`workouts.WEATHER.TEMPERATURE`)\"\n />\n </td>\n <td>\n {{ Number(workoutObject.weatherStart.temperature).toFixed(1) }}°C\n </td>\n <td>\n {{ Number(workoutObject.weatherEnd.temperature).toFixed(1) }}°C\n </td>\n </tr>\n <tr>\n <td>\n <img\n class=\"weather-img weather-img-small\"\n src=\"/img/weather/pour-rain.svg\"\n :alt=\"$t(`workouts.WEATHER.HUMIDITY`)\"\n :title=\"$t(`workouts.WEATHER.HUMIDITY`)\"\n />\n </td>\n <td>\n {{ Number(workoutObject.weatherStart.humidity * 100).toFixed(1) }}%\n </td>\n <td>\n {{ Number(workoutObject.weatherEnd.humidity * 100).toFixed(1) }}%\n </td>\n </tr>\n <tr>\n <td>\n <img\n class=\"weather-img weather-img-small\"\n src=\"/img/weather/breeze.svg\"\n :alt=\"$t(`workouts.WEATHER.WIND`)\"\n :title=\"$t(`workouts.WEATHER.WIND`)\"\n />\n </td>\n <td>{{ Number(workoutObject.weatherStart.wind).toFixed(1) }}m/s</td>\n <td>{{ Number(workoutObject.weatherEnd.wind).toFixed(1) }}m/s</td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { defineComponent, PropType } from 'vue'\n\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutWeather',\n props: {\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n #workout-weather {\n padding-top: $default-padding;\n .weather-img {\n height: 30px;\n filter: var(--workout-img-color);\n }\n .weather-img-small {\n height: 20px;\n }\n .weather-table {\n width: 100%;\n text-align: center;\n\n .weather-th {\n display: flex;\n flex-direction: column;\n text-transform: capitalize;\n }\n\n tbody {\n font-size: 0.8em;\n }\n }\n }\n</style>\n","\n import { defineComponent, PropType } from 'vue'\n\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutWeather',\n props: {\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n })\n","import { render } from \"./WorkoutWeather.vue?vue&type=template&id=7eb41918&scoped=true\"\nimport script from \"./WorkoutWeather.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutWeather.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutWeather.vue?vue&type=style&index=0&id=7eb41918&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-7eb41918\"\n\nexport default script","\n import { PropType, computed, defineComponent } from 'vue'\n\n import WorkoutRecord from '@/components/Workout/WorkoutDetail/WorkoutRecord.vue'\n import WorkoutWeather from '@/components/Workout/WorkoutDetail/WorkoutWeather.vue'\n import { IWorkoutObject } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutData',\n components: {\n WorkoutRecord,\n WorkoutWeather,\n },\n props: {\n workoutObject: {\n type: Object as PropType<IWorkoutObject>,\n required: true,\n },\n },\n setup(props) {\n return {\n withPause: computed(\n () =>\n props.workoutObject.pauses !== '0:00:00' &&\n props.workoutObject.pauses !== null\n ),\n }\n },\n })\n","import { render } from \"./WorkoutData.vue?vue&type=template&id=45a7f031&scoped=true\"\nimport script from \"./WorkoutData.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutData.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutData.vue?vue&type=style&index=0&id=45a7f031&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-45a7f031\"\n\nexport default script","<template>\n <div id=\"workout-map\">\n <div v-if=\"workoutData.loading\" class=\"leaflet-container\" />\n <div v-else>\n <div class=\"leaflet-container\" v-if=\"workoutData.workout.with_gpx\">\n <LMap\n v-if=\"geoJson.jsonData && center && bounds.length === 2\"\n :zoom=\"13\"\n :center=\"center\"\n :bounds=\"bounds\"\n ref=\"workoutMap\"\n @ready=\"fitBounds(bounds)\"\n >\n <LTileLayer\n :url=\"`${getApiUrl()}workouts/map_tile/{s}/{z}/{x}/{y}.png`\"\n :attribution=\"appConfig.map_attribution\"\n :bounds=\"bounds\"\n />\n <LGeoJson :geojson=\"geoJson.jsonData\" />\n <LMarker\n v-if=\"markerCoordinates.latitude\"\n :lat-lng=\"[markerCoordinates.latitude, markerCoordinates.longitude]\"\n />\n </LMap>\n </div>\n <div v-else class=\"no-map\">{{ $t('workouts.NO_MAP') }}</div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { gpx } from '@tmcw/togeojson'\n import { LGeoJson, LMap, LMarker, LTileLayer } from '@vue-leaflet/vue-leaflet'\n import { ComputedRef, PropType, computed, defineComponent, ref } from 'vue'\n\n import { ROOT_STORE } from '@/store/constants'\n import { TAppConfig } from '@/types/application'\n import { GeoJSONData } from '@/types/geojson'\n import { IWorkoutData, TCoordinates } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { getApiUrl } from '@/utils'\n\n export default defineComponent({\n name: 'WorkoutMap',\n components: {\n LGeoJson,\n LMap,\n LMarker,\n LTileLayer,\n },\n props: {\n workoutData: {\n type: Object as PropType<IWorkoutData>,\n },\n markerCoordinates: {\n type: Object as PropType<TCoordinates>,\n required: false,\n },\n },\n setup(props) {\n const store = useStore()\n\n function getGeoJson(gpxContent: string): GeoJSONData {\n if (!gpxContent || gpxContent !== '') {\n try {\n const jsonData = gpx(\n new DOMParser().parseFromString(gpxContent, 'text/xml')\n )\n return { jsonData }\n } catch (e) {\n console.error('Invalid gpx content')\n return {}\n }\n }\n return {}\n }\n function getCenter(bounds: ComputedRef<number[][]>): number[] {\n return [\n (bounds.value[0][0] + bounds.value[1][0]) / 2,\n (bounds.value[0][1] + bounds.value[1][1]) / 2,\n ]\n }\n function fitBounds(bounds: number[][]) {\n if (workoutMap.value?.leafletObject) {\n workoutMap.value?.leafletObject.fitBounds(bounds)\n }\n }\n\n const workoutMap = ref<null | {\n leafletObject: { fitBounds: (bounds: number[][]) => null }\n }>(null)\n const bounds = computed(() =>\n props.workoutData\n ? [\n [\n props.workoutData.workout.bounds[0],\n props.workoutData.workout.bounds[1],\n ],\n [\n props.workoutData.workout.bounds[2],\n props.workoutData.workout.bounds[3],\n ],\n ]\n : []\n )\n const appConfig: ComputedRef<TAppConfig> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n )\n const center = computed(() => getCenter(bounds))\n const geoJson = computed(() =>\n props.workoutData && props.workoutData.gpx\n ? getGeoJson(props.workoutData.gpx)\n : {}\n )\n\n return {\n appConfig,\n bounds,\n center,\n geoJson,\n workoutMap,\n fitBounds,\n getApiUrl,\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n #workout-map {\n padding: $default-padding 0;\n .leaflet-container,\n .no-map {\n height: 400px;\n width: 600px;\n }\n .no-map {\n line-height: 400px;\n }\n\n @media screen and (max-width: $small-limit) {\n padding: 0;\n .leaflet-container {\n width: 100%;\n height: 300px;\n }\n .no-map {\n display: none;\n }\n }\n }\n</style>\n","\n import { gpx } from '@tmcw/togeojson'\n import { LGeoJson, LMap, LMarker, LTileLayer } from '@vue-leaflet/vue-leaflet'\n import { ComputedRef, PropType, computed, defineComponent, ref } from 'vue'\n\n import { ROOT_STORE } from '@/store/constants'\n import { TAppConfig } from '@/types/application'\n import { GeoJSONData } from '@/types/geojson'\n import { IWorkoutData, TCoordinates } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { getApiUrl } from '@/utils'\n\n export default defineComponent({\n name: 'WorkoutMap',\n components: {\n LGeoJson,\n LMap,\n LMarker,\n LTileLayer,\n },\n props: {\n workoutData: {\n type: Object as PropType<IWorkoutData>,\n },\n markerCoordinates: {\n type: Object as PropType<TCoordinates>,\n required: false,\n },\n },\n setup(props) {\n const store = useStore()\n\n function getGeoJson(gpxContent: string): GeoJSONData {\n if (!gpxContent || gpxContent !== '') {\n try {\n const jsonData = gpx(\n new DOMParser().parseFromString(gpxContent, 'text/xml')\n )\n return { jsonData }\n } catch (e) {\n console.error('Invalid gpx content')\n return {}\n }\n }\n return {}\n }\n function getCenter(bounds: ComputedRef<number[][]>): number[] {\n return [\n (bounds.value[0][0] + bounds.value[1][0]) / 2,\n (bounds.value[0][1] + bounds.value[1][1]) / 2,\n ]\n }\n function fitBounds(bounds: number[][]) {\n if (workoutMap.value?.leafletObject) {\n workoutMap.value?.leafletObject.fitBounds(bounds)\n }\n }\n\n const workoutMap = ref<null | {\n leafletObject: { fitBounds: (bounds: number[][]) => null }\n }>(null)\n const bounds = computed(() =>\n props.workoutData\n ? [\n [\n props.workoutData.workout.bounds[0],\n props.workoutData.workout.bounds[1],\n ],\n [\n props.workoutData.workout.bounds[2],\n props.workoutData.workout.bounds[3],\n ],\n ]\n : []\n )\n const appConfig: ComputedRef<TAppConfig> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n )\n const center = computed(() => getCenter(bounds))\n const geoJson = computed(() =>\n props.workoutData && props.workoutData.gpx\n ? getGeoJson(props.workoutData.gpx)\n : {}\n )\n\n return {\n appConfig,\n bounds,\n center,\n geoJson,\n workoutMap,\n fitBounds,\n getApiUrl,\n }\n },\n })\n","import { render } from \"./WorkoutMap.vue?vue&type=template&id=76f3a2e8&scoped=true\"\nimport script from \"./WorkoutMap.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutMap.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutMap.vue?vue&type=style&index=0&id=76f3a2e8&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-76f3a2e8\"\n\nexport default script","\n import {\n ComputedRef,\n PropType,\n Ref,\n computed,\n defineComponent,\n ref,\n watch,\n } from 'vue'\n import { useRoute } from 'vue-router'\n\n import WorkoutCardTitle from '@/components/Workout/WorkoutDetail/WorkoutCardTitle.vue'\n import WorkoutData from '@/components/Workout/WorkoutDetail/WorkoutData.vue'\n import WorkoutMap from '@/components/Workout/WorkoutDetail/WorkoutMap.vue'\n import { WORKOUTS_STORE } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import {\n IWorkout,\n IWorkoutData,\n IWorkoutObject,\n IWorkoutSegment,\n TCoordinates,\n } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { formatWorkoutDate, getDateWithTZ } from '@/utils/dates'\n\n export default defineComponent({\n name: 'WorkoutDetail',\n components: {\n WorkoutCardTitle,\n WorkoutData,\n WorkoutMap,\n },\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n displaySegment: {\n type: Boolean,\n required: true,\n },\n markerCoordinates: {\n type: Object as PropType<TCoordinates>,\n required: false,\n },\n sports: {\n type: Object as PropType<ISport[]>,\n },\n workoutData: {\n type: Object as PropType<IWorkoutData>,\n required: true,\n },\n },\n setup(props) {\n const route = useRoute()\n const store = useStore()\n\n function getWorkoutObjectUrl(\n workout: IWorkout,\n displaySegment: boolean,\n segmentId: number | null\n ): Record<string, string | null> {\n const previousUrl =\n displaySegment && segmentId && segmentId !== 1\n ? `/workouts/${workout.id}/segment/${segmentId - 1}`\n : !displaySegment && workout.previous_workout\n ? `/workouts/${workout.previous_workout}`\n : null\n const nextUrl =\n displaySegment && segmentId && segmentId < workout.segments.length\n ? `/workouts/${workout.id}/segment/${segmentId + 1}`\n : !displaySegment && workout.next_workout\n ? `/workouts/${workout.next_workout}`\n : null\n return {\n previousUrl,\n nextUrl,\n }\n }\n function getWorkoutObject(\n workout: IWorkout,\n segment: IWorkoutSegment | null\n ): IWorkoutObject {\n const urls = getWorkoutObjectUrl(\n workout,\n props.displaySegment,\n segmentId.value ? +segmentId.value : null\n )\n const workoutDate = formatWorkoutDate(\n getDateWithTZ(\n props.workoutData.workout.workout_date,\n props.authUser.timezone\n )\n )\n return {\n ascent: segment ? segment.ascent : workout.ascent,\n aveSpeed: segment ? segment.ave_speed : workout.ave_speed,\n distance: segment ? segment.distance : workout.distance,\n descent: segment ? segment.descent : workout.descent,\n duration: segment ? segment.duration : workout.duration,\n maxAlt: segment ? segment.max_alt : workout.max_alt,\n maxSpeed: segment ? segment.max_speed : workout.max_speed,\n minAlt: segment ? segment.min_alt : workout.min_alt,\n moving: segment ? segment.moving : workout.moving,\n nextUrl: urls.nextUrl,\n pauses: segment ? segment.pauses : workout.pauses,\n previousUrl: urls.previousUrl,\n records: segment ? [] : workout.records,\n segmentId: segment ? segment.segment_id : null,\n title: workout.title,\n type: props.displaySegment ? 'SEGMENT' : 'WORKOUT',\n workoutDate: workoutDate.workout_date,\n weatherEnd: segment ? null : workout.weather_end,\n workoutId: workout.id,\n weatherStart: segment ? null : workout.weather_start,\n workoutTime: workoutDate.workout_time,\n }\n }\n function updateDisplayModal(value: boolean) {\n displayModal.value = value\n }\n function deleteWorkout(workoutId: string) {\n store.dispatch(WORKOUTS_STORE.ACTIONS.DELETE_WORKOUT, {\n workoutId: workoutId,\n })\n }\n\n const workout: ComputedRef<IWorkout> = computed(\n () => props.workoutData.workout\n )\n let segmentId: Ref<number | null> = ref(\n route.params.workoutId ? +route.params.segmentId : null\n )\n const segment: ComputedRef<IWorkoutSegment | null> = computed(() =>\n workout.value.segments.length > 0 && segmentId.value\n ? workout.value.segments[+segmentId.value - 1]\n : null\n )\n let displayModal: Ref<boolean> = ref(false)\n\n watch(\n () => route.params.segmentId,\n async (newSegmentId) => {\n if (newSegmentId) {\n segmentId.value = +newSegmentId\n }\n }\n )\n\n return {\n sport: computed(() =>\n props.sports\n ? props.sports.find(\n (sport) => sport.id === props.workoutData.workout.sport_id\n )\n : {}\n ),\n workoutObject: computed(() =>\n getWorkoutObject(workout.value, segment.value)\n ),\n displayModal,\n deleteWorkout,\n updateDisplayModal,\n }\n },\n })\n","import { render } from \"./index.vue?vue&type=template&id=a17554ea&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=ts\"\nexport * from \"./index.vue?vue&type=script&lang=ts\"\n\nimport \"./index.vue?vue&type=style&index=0&id=a17554ea&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-a17554ea\"\n\nexport default script","<template>\n <div id=\"workout-note\">\n <Card>\n <template #title>{{ $t('workouts.NOTES') }}</template>\n <template #content>\n {{ notes && notes !== '' ? notes : $t('workouts.NO_NOTES') }}</template\n >\n </Card>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { defineComponent } from 'vue'\n\n export default defineComponent({\n name: 'WorkoutNotes',\n props: {\n notes: {\n type: String,\n required: false,\n },\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base.scss';\n #workout-note {\n ::v-deep(.card-content) {\n font-style: italic;\n }\n }\n</style>\n","\n import { defineComponent } from 'vue'\n\n export default defineComponent({\n name: 'WorkoutNotes',\n props: {\n notes: {\n type: String,\n required: false,\n },\n },\n })\n","import { render } from \"./WorkoutNotes.vue?vue&type=template&id=5c47d30a&scoped=true\"\nimport script from \"./WorkoutNotes.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutNotes.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutNotes.vue?vue&type=style&index=0&id=5c47d30a&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-5c47d30a\"\n\nexport default script","<template>\n <div id=\"workout-segments\">\n <Card>\n <template #title>{{ $t('workouts.SEGMENT', 2) }}</template>\n <template #content>\n <ul>\n <li v-for=\"(segment, index) in segments\" :key=\"segment.segment_id\">\n <router-link\n :to=\"{\n name: 'WorkoutSegment',\n params: {\n workoutId: segment.workout_id,\n segmentId: index + 1,\n },\n }\"\n >{{ $t('workouts.SEGMENT', 1) }} {{ index + 1 }}</router-link\n >\n ({{ $t('workouts.DISTANCE') }}: {{ segment.distance }} km,\n {{ $t('workouts.DURATION') }}: {{ segment.duration }})\n </li>\n </ul>\n </template>\n </Card>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { PropType, defineComponent } from 'vue'\n\n import { IWorkoutSegment } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutSegments',\n props: {\n segments: {\n type: Object as PropType<IWorkoutSegment[]>,\n required: true,\n },\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n #workout-segments {\n ::v-deep(.card) {\n .card-title {\n text-transform: capitalize;\n }\n .card-content {\n padding-bottom: 0;\n padding-top: 0;\n a {\n font-weight: bold;\n }\n ul {\n padding: 0 $default-padding;\n list-style: square;\n }\n }\n }\n }\n</style>\n","\n import { PropType, defineComponent } from 'vue'\n\n import { IWorkoutSegment } from '@/types/workouts'\n\n export default defineComponent({\n name: 'WorkoutSegments',\n props: {\n segments: {\n type: Object as PropType<IWorkoutSegment[]>,\n required: true,\n },\n },\n })\n","import { render } from \"./WorkoutSegments.vue?vue&type=template&id=5c40d110&scoped=true\"\nimport script from \"./WorkoutSegments.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutSegments.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutSegments.vue?vue&type=style&index=0&id=5c40d110&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-5c40d110\"\n\nexport default script","\n import {\n ComputedRef,\n Ref,\n computed,\n defineComponent,\n ref,\n watch,\n onBeforeMount,\n onUnmounted,\n } from 'vue'\n import { useRoute } from 'vue-router'\n\n import NotFound from '@/components/Common/NotFound.vue'\n import WorkoutChart from '@/components/Workout/WorkoutChart.vue'\n import WorkoutDetail from '@/components/Workout/WorkoutDetail/index.vue'\n import WorkoutNotes from '@/components/Workout/WorkoutNotes.vue'\n import WorkoutSegments from '@/components/Workout/WorkoutSegments.vue'\n import {\n AUTH_USER_STORE,\n SPORTS_STORE,\n WORKOUTS_STORE,\n } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkoutData, IWorkoutPayload, TCoordinates } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n\n export default defineComponent({\n name: 'Workout',\n components: {\n NotFound,\n WorkoutChart,\n WorkoutDetail,\n WorkoutNotes,\n WorkoutSegments,\n },\n props: {\n displaySegment: {\n type: Boolean,\n required: true,\n },\n },\n setup(props) {\n const route = useRoute()\n const store = useStore()\n\n onBeforeMount(() => {\n const payload: IWorkoutPayload = { workoutId: route.params.workoutId }\n if (props.displaySegment) {\n payload.segmentId = route.params.segmentId\n }\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, payload)\n })\n\n const workoutData: ComputedRef<IWorkoutData> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUT_DATA]\n )\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n let markerCoordinates: Ref<TCoordinates> = ref({\n latitude: null,\n longitude: null,\n })\n\n function updateCoordinates(coordinates: TCoordinates) {\n markerCoordinates.value = {\n latitude: coordinates.latitude,\n longitude: coordinates.longitude,\n }\n }\n\n watch(\n () => route.params.workoutId,\n async (newWorkoutId) => {\n if (newWorkoutId) {\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, {\n workoutId: newWorkoutId,\n })\n }\n }\n )\n watch(\n () => route.params.segmentId,\n async (newSegmentId) => {\n if (route.params.workoutId) {\n const payload: IWorkoutPayload = {\n workoutId: route.params.workoutId,\n }\n if (newSegmentId) {\n payload.segmentId = newSegmentId\n }\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, payload)\n }\n }\n )\n\n onUnmounted(() => {\n store.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_WORKOUT)\n })\n\n return {\n authUser,\n markerCoordinates,\n sports,\n workoutData,\n updateCoordinates,\n }\n },\n })\n","import { render } from \"./Workout.vue?vue&type=template&id=05bdbd04&scoped=true\"\nimport script from \"./Workout.vue?vue&type=script&lang=ts\"\nexport * from \"./Workout.vue?vue&type=script&lang=ts\"\n\nimport \"./Workout.vue?vue&type=style&index=0&id=05bdbd04&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-05bdbd04\"\n\nexport default script","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutsView.vue?vue&type=style&index=0&id=22a8a7cd&lang=scss&scoped=true\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutNotes.vue?vue&type=style&index=0&id=5c47d30a&lang=scss&scoped=true\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutChart.vue?vue&type=style&index=0&id=2230775e&lang=scss&scoped=true\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutCardTitle.vue?vue&type=style&index=0&id=9cab340c&lang=scss&scoped=true\"","import { watch, ref, provide, h, inject, onUnmounted, onBeforeUnmount, onMounted, nextTick, render as render$3, reactive, computed } from 'vue';\n\nconst debounce = (fn, time) => {\n let timeout;\n\n return function (...args) {\n const context = this;\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n fn.apply(context, args);\n timeout = null;\n }, time);\n };\n};\n\nconst capitalizeFirstLetter = (string) => {\n if (!string || typeof string.charAt !== \"function\") {\n return string;\n }\n return string.charAt(0).toUpperCase() + string.slice(1);\n};\n\nconst propsBinder = (methods, leafletElement, props) => {\n for (const key in props) {\n const setMethodName = \"set\" + capitalizeFirstLetter(key);\n if (methods[setMethodName]) {\n watch(\n () => props[key],\n (newVal, oldVal) => {\n methods[setMethodName](newVal, oldVal);\n }\n );\n } else if (leafletElement[setMethodName]) {\n watch(\n () => props[key],\n (newVal) => {\n leafletElement[setMethodName](newVal);\n }\n );\n }\n }\n};\n\nconst remapEvents = (contextAttrs) => {\n const result = {};\n for (const attrName in contextAttrs) {\n if (\n attrName.startsWith(\"on\") &&\n !attrName.startsWith(\"onUpdate\") &&\n attrName !== \"onReady\"\n ) {\n const eventName = attrName.slice(2).toLocaleLowerCase();\n result[eventName] = contextAttrs[attrName];\n }\n }\n return result;\n};\n\nconst resetWebpackIcon = async (Icon) => {\n const modules = await Promise.all([\n import('leaflet/dist/images/marker-icon-2x.png'),\n import('leaflet/dist/images/marker-icon.png'),\n import('leaflet/dist/images/marker-shadow.png'),\n ]);\n\n delete Icon.Default.prototype._getIconUrl;\n\n Icon.Default.mergeOptions({\n iconRetinaUrl: modules[0].default,\n iconUrl: modules[1].default,\n shadowUrl: modules[2].default,\n });\n};\n\n/**\n * Wraps a placeholder function and provides it with the given name.\n * The wrapper can later be updated with {@link updateLeafletWrapper}\n * to provide a different function.\n *\n * @param {String} methodName Key used to provide the wrapper function\n */\nconst provideLeafletWrapper = (methodName) => {\n const wrapped = ref(() =>\n console.warn(`Method ${methodName} has been invoked without being replaced`)\n );\n const wrapper = (...args) => wrapped.value(...args);\n // eslint-disable-next-line vue/no-ref-as-operand\n wrapper.wrapped = wrapped;\n provide(methodName, wrapper);\n\n return wrapper;\n};\n\n/**\n * Change the function that will be executed when an injected Leaflet wrapper\n * is invoked.\n *\n * @param {*} wrapper Provided wrapper whose wrapped function is to be updated\n * @param {function} leafletMethod New method to be wrapped by the wrapper\n */\nconst updateLeafletWrapper = (wrapper, leafletMethod) =>\n (wrapper.wrapped.value = leafletMethod);\n\nconst WINDOW_OR_GLOBAL =\n (typeof self === \"object\" && self.self === self && self) ||\n (typeof global === \"object\" && global.global === global && global) ||\n undefined;\n\nconst GLOBAL_LEAFLET_OPT = \"useGlobalLeaflet\";\n\nconst props = {\n options: {\n type: Object,\n default: () => ({}),\n },\n};\n\nconst setup = (props) => {\n return { options: props.options, methods: {} };\n};\n\nconst props$1 = {\n ...props,\n pane: {\n type: String,\n default: \"overlayPane\",\n },\n attribution: {\n type: String,\n default: null,\n },\n name: {\n type: String,\n custom: true,\n default: undefined,\n },\n layerType: {\n type: String,\n custom: true,\n default: undefined,\n },\n visible: {\n type: Boolean,\n custom: true,\n default: true,\n },\n};\n\nconst setup$1 = (props, leafletRef, context) => {\n const addLayer = inject(\"addLayer\");\n const removeLayer = inject(\"removeLayer\");\n const {\n options: componentOptions,\n methods: componentMethods,\n } = setup(props);\n\n const options = {\n ...componentOptions,\n attribution: props.attribution,\n pane: props.pane,\n };\n\n const addThisLayer = () => addLayer({ leafletObject: leafletRef.value });\n const removeThisLayer = () =>\n removeLayer({ leafletObject: leafletRef.value });\n\n const methods = {\n ...componentMethods,\n setAttribution(val, old) {\n const attributionControl = this.$parent.leafletObject.attributionControl;\n attributionControl.removeAttribution(old).addAttribution(val);\n },\n setName() {\n removeThisLayer();\n if (props.visible) {\n addThisLayer();\n }\n },\n setLayerType() {\n removeThisLayer();\n if (props.visible) {\n addThisLayer();\n }\n },\n setVisible(isVisible) {\n if (leafletRef.value) {\n if (isVisible) {\n addThisLayer();\n } else {\n removeThisLayer();\n }\n }\n },\n bindPopup({ leafletObject }) {\n leafletRef.value.bindPopup(leafletObject);\n },\n bindTooltip({ leafletObject }) {\n leafletRef.value.bindTooltip(leafletObject);\n },\n unbindTooltip() {\n const tooltip = leafletRef.value ? leafletRef.value.getTooltip() : null;\n if (tooltip) {\n tooltip.unbindTooltip();\n }\n },\n unbindPopup() {\n const popup = leafletRef.value ? leafletRef.value.getPopup() : null;\n if (popup) {\n popup.unbindPopup();\n }\n },\n updateVisibleProp(value) {\n /**\n * Triggers when the visible prop needs to be updated\n * @type {boolean}\n * @property {boolean} value - value of the visible property\n */\n context.emit(\"update:visible\", value);\n },\n };\n\n provide(\"bindPopup\", methods.bindPopup);\n provide(\"bindTooltip\", methods.bindTooltip);\n provide(\"unbindTooltip\", methods.unbindTooltip);\n provide(\"unbindPopup\", methods.unbindPopup);\n\n onUnmounted(() => {\n methods.unbindPopup();\n methods.unbindTooltip();\n removeThisLayer();\n });\n\n return { options, methods };\n};\n\nconst render = (ready, slots) => {\n if (ready && slots.default) {\n return h(\"div\", { style: { display: \"none\" } }, slots.default());\n }\n};\n\nconst props$2 = {\n ...props,\n interactive: {\n type: Boolean,\n default: true,\n },\n bubblingMouseEvents: {\n type: Boolean,\n default: true,\n },\n};\n\nconst setup$2 = (props) => {\n const { options: componentOptions, methods } = setup(props);\n const options = {\n ...componentOptions,\n interactive: props.interactive,\n bubblingMouseEvents: props.bubblingMouseEvents,\n };\n\n return { options, methods };\n};\n\nconst props$3 = {\n ...props$1,\n ...props$2,\n stroke: {\n type: Boolean,\n custom: true,\n default: true,\n },\n color: {\n type: String,\n custom: true,\n default: \"#3388ff\",\n },\n weight: {\n type: Number,\n custom: true,\n default: 3,\n },\n opacity: {\n type: Number,\n custom: true,\n default: 1.0,\n },\n lineCap: {\n type: String,\n custom: true,\n default: \"round\",\n },\n lineJoin: {\n type: String,\n custom: true,\n default: \"round\",\n },\n dashArray: {\n type: String,\n custom: true,\n default: null,\n },\n dashOffset: {\n type: String,\n custom: true,\n default: null,\n },\n fill: {\n type: Boolean,\n custom: true,\n default: false,\n },\n fillColor: {\n type: String,\n custom: true,\n default: \"#3388ff\",\n },\n fillOpacity: {\n type: Number,\n custom: true,\n default: 0.2,\n },\n fillRule: {\n type: String,\n custom: true,\n default: \"evenodd\",\n },\n className: {\n type: String,\n custom: true,\n default: null,\n },\n};\n\nconst setup$3 = (props, leafletRef, context) => {\n const { options: layerOptions, methods: layerMethods } = setup$1(\n props,\n leafletRef,\n context\n );\n const {\n options: interactiveLayerOptions,\n methods: interactiveLayerMethods,\n } = setup$2(props);\n\n const removeLayer = inject(\"removeLayer\");\n\n const options = {\n ...layerOptions,\n ...interactiveLayerOptions,\n stroke: props.stroke,\n color: props.color,\n weight: props.weight,\n opacity: props.opacity,\n lineCap: props.lineCap,\n lineJoin: props.lineJoin,\n dashArray: props.dashArray,\n dashOffset: props.dashOffset,\n fill: props.fill,\n fillColor: props.fillColor,\n fillOpacity: props.fillOpacity,\n fillRule: props.fillRule,\n className: props.className,\n };\n const methods = {\n ...layerMethods,\n ...interactiveLayerMethods,\n setStroke(stroke) {\n leafletRef.value.setStyle({ stroke });\n },\n setColor(color) {\n leafletRef.value.setStyle({ color });\n },\n setWeight(weight) {\n leafletRef.value.setStyle({ weight });\n },\n setOpacity(opacity) {\n leafletRef.value.setStyle({ opacity });\n },\n setLineCap(lineCap) {\n leafletRef.value.setStyle({ lineCap });\n },\n setLineJoin(lineJoin) {\n leafletRef.value.setStyle({ lineJoin });\n },\n setDashArray(dashArray) {\n leafletRef.value.setStyle({ dashArray });\n },\n setDashOffset(dashOffset) {\n leafletRef.value.setStyle({ dashOffset });\n },\n setFill(fill) {\n leafletRef.value.setStyle({ fill });\n },\n setFillColor(fillColor) {\n leafletRef.value.setStyle({ fillColor });\n },\n setFillOpacity(fillOpacity) {\n leafletRef.value.setStyle({ fillOpacity });\n },\n setFillRule(fillRule) {\n leafletRef.value.setStyle({ fillRule });\n },\n setClassName(className) {\n leafletRef.value.setStyle({ className });\n },\n };\n\n onBeforeUnmount(() => {\n removeLayer({ leafletObject: leafletRef.value });\n });\n\n return { options, methods };\n};\n\nconst props$4 = {\n ...props$3,\n latLng: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n /**\n * Radius of the marker in pixels.\n */\n radius: {\n type: Number,\n default: null,\n },\n};\n\nconst setup$4 = (props, leafletRef, context) => {\n const { options: pathOptions, methods: pathMethods } = setup$3(\n props,\n leafletRef,\n context\n );\n const options = {\n ...pathOptions,\n ...props,\n };\n const methods = {\n ...pathMethods,\n setRadius(radius) {\n leafletRef.value.setRadius(radius);\n },\n setLatLng(latLng) {\n leafletRef.value.setLatLng(latLng);\n },\n };\n\n return { options, methods };\n};\n\nconst props$5 = {\n ...props$4,\n /**\n * Radius of the circle in meters.\n */\n radius: {\n type: Number,\n default: null,\n },\n};\n\nconst setup$5 = (props, leafletRef, context) => {\n const {\n options: circleMarkerOptions,\n methods: circleMarkerMethods,\n } = setup$4(props, leafletRef, context);\n\n const options = {\n ...circleMarkerOptions,\n ...props,\n };\n\n const methods = {\n ...circleMarkerMethods,\n };\n\n return { options, methods };\n};\n\n/**\n * Circle component, lets you add and personalize circles on the map\n */\nvar script = {\n name: \"LCircle\",\n props: props$5,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$5(props, leafletRef, context);\n\n onMounted(async () => {\n const { circle, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = circle(props.latLng, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript.__file = \"src/components/LCircle.vue\";\n\n/**\n * Circle Marker component, lets you add and personalize circle markers on the map\n */\nvar script$1 = {\n name: \"LCircleMarker\",\n props: props$4,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$4(props, leafletRef, context);\n\n onMounted(async () => {\n const { circleMarker, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = circleMarker(props.latLng, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$1.__file = \"src/components/LCircleMarker.vue\";\n\nconst props$6 = {\n ...props,\n position: {\n type: String,\n default: \"topright\",\n },\n};\n\nconst setup$6 = (props, leafletRef) => {\n const {\n options: componentOptions,\n methods: componentMethods,\n } = setup(props);\n const options = {\n ...componentOptions,\n position: props.position,\n };\n\n const methods = {\n ...componentMethods,\n setPosition(position) {\n if (leafletRef.value) {\n leafletRef.value.setPosition(position);\n }\n },\n };\n\n onUnmounted(() => {\n if (leafletRef.value) {\n leafletRef.value.remove();\n }\n });\n\n return { options, methods };\n};\n\nconst render$1 = (slots) => {\n if (slots.default) {\n return h(\"div\", { ref: \"root\" }, slots.default());\n }\n return null;\n};\n\nvar script$2 = {\n name: \"LControl\",\n props: {\n ...props$6,\n disableClickPropagation: {\n type: Boolean,\n custom: true,\n default: true,\n },\n disableScrollPropagation: {\n type: Boolean,\n custom: true,\n default: false,\n },\n },\n setup(props, context) {\n const leafletRef = ref({});\n const root = ref(null);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const registerControl = inject(\"registerControl\");\n\n const { options, methods } = setup$6(props, leafletRef);\n\n onMounted(async () => {\n const { Control, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n const LControl = Control.extend({\n onAdd() {\n return root.value;\n },\n });\n\n leafletRef.value = new LControl(options);\n propsBinder(methods, leafletRef.value, props);\n registerControl({ leafletObject: leafletRef.value });\n\n if (props.disableClickPropagation) {\n DomEvent.disableClickPropagation(root.value);\n }\n if (props.disableScrollPropagation) {\n DomEvent.disableScrollPropagation(root.value);\n }\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { root, leafletObject: leafletRef };\n },\n render() {\n return render$1(this.$slots);\n },\n};\n\nscript$2.__file = \"src/components/LControl.vue\";\n\nconst props$7 = {\n ...props$6,\n prefix: {\n type: String,\n default: \"Vue-Leaflet\",\n custom: true,\n },\n};\n\nconst setup$7 = (props, leafletRef) => {\n const { options: controlOptions, methods: controlMethods } = setup$6(\n props,\n leafletRef\n );\n const options = {\n ...controlOptions,\n prefix: props.prefix,\n };\n\n const methods = {\n ...controlMethods,\n setPrefix(prefix) {\n leafletRef.value.setPrefix(prefix);\n },\n };\n\n return { options, methods };\n};\n\nvar script$3 = {\n name: \"LControlAttribution\",\n props: props$7,\n setup(props, context) {\n const leafletRef = ref({});\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const registerControl = inject(\"registerControl\");\n\n const { options, methods } = setup$7(props, leafletRef);\n\n onMounted(async () => {\n const { control } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = control.attribution(options);\n propsBinder(methods, leafletRef.value, props);\n registerControl({ leafletObject: leafletRef.value });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { leafletObject: leafletRef.value };\n },\n render() {\n return null;\n },\n};\n\nscript$3.__file = \"src/components/LControlAttribution.vue\";\n\nconst props$8 = {\n ...props$6,\n collapsed: {\n type: Boolean,\n default: true,\n },\n autoZIndex: {\n type: Boolean,\n default: true,\n },\n hideSingleBase: {\n type: Boolean,\n default: false,\n },\n sortLayers: {\n type: Boolean,\n default: false,\n },\n sortFunction: {\n type: Function,\n default: undefined,\n },\n};\n\nconst setup$8 = (props, leafletRef) => {\n const { options: controlOptions } = setup$6(props, leafletRef);\n const options = {\n ...controlOptions,\n collapsed: props.collapsed,\n autoZIndex: props.autoZIndex,\n hideSingleBase: props.hideSingleBase,\n sortLayers: props.sortLayers,\n sortFunction: props.sortFunction,\n };\n\n const methods = {\n addLayer(layer) {\n if (layer.layerType === \"base\") {\n leafletRef.value.addBaseLayer(layer.leafletObject, layer.name);\n } else if (layer.layerType === \"overlay\") {\n leafletRef.value.addOverlay(layer.leafletObject, layer.name);\n }\n },\n removeLayer(layer) {\n leafletRef.value.removeLayer(layer.leafletObject);\n },\n };\n return { options, methods };\n};\n\nvar script$4 = {\n name: \"LControlLayers\",\n props: props$8,\n setup(props, context) {\n const leafletRef = ref({});\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const registerLayerControl = inject(\"registerLayerControl\");\n\n const { options, methods } = setup$8(props, leafletRef);\n\n onMounted(async () => {\n const { control } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = control.layers(null, null, options);\n\n propsBinder(methods, leafletRef.value, props);\n\n registerLayerControl({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { leafletObject: leafletRef.value };\n },\n render() {\n return null;\n },\n};\n\nscript$4.__file = \"src/components/LControlLayers.vue\";\n\nconst props$9 = {\n ...props$6,\n maxWidth: {\n type: Number,\n default: 100,\n },\n metric: {\n type: Boolean,\n default: true,\n },\n imperial: {\n type: Boolean,\n default: true,\n },\n updateWhenIdle: {\n type: Boolean,\n default: false,\n },\n};\n\nconst setup$9 = (props, leafletRef) => {\n const { options: controlOptions, methods: controlMethods } = setup$6(\n props,\n leafletRef\n );\n const options = {\n ...controlOptions,\n maxWidth: props.maxWidth,\n metric: props.metric,\n imperial: props.imperial,\n updateWhenIdle: props.updateWhenIdle,\n };\n\n return { options, methods: controlMethods };\n};\n\nvar script$5 = {\n name: \"LControlScale\",\n props: props$9,\n setup(props, context) {\n const leafletRef = ref({});\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const registerControl = inject(\"registerControl\");\n\n const { options, methods } = setup$9(props, leafletRef);\n\n onMounted(async () => {\n const { control } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = control.scale(options);\n propsBinder(methods, leafletRef.value, props);\n registerControl({ leafletObject: leafletRef.value });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { leafletObject: leafletRef.value };\n },\n render() {\n return null;\n },\n};\n\nscript$5.__file = \"src/components/LControlScale.vue\";\n\nconst props$a = {\n ...props$6,\n zoomInText: {\n type: String,\n default: \"+\",\n },\n zoomInTitle: {\n type: String,\n default: \"Zoom in\",\n },\n zoomOutText: {\n type: String,\n default: \"-\",\n },\n zoomOutTitle: {\n type: String,\n default: \"Zoom out\",\n },\n};\n\nconst setup$a = (props, leafletRef) => {\n const { options: controlOptions, methods: controlMethods } = setup$6(\n props,\n leafletRef\n );\n const options = {\n ...controlOptions,\n zoomInText: props.zoomInText,\n zoomInTitle: props.zoomInTitle,\n zoomOutText: props.zoomOutText,\n zoomOutTitle: props.zoomOutTitle,\n };\n\n return { options, methods: controlMethods };\n};\n\nvar script$6 = {\n name: \"LControlZoom\",\n props: props$a,\n setup(props, context) {\n const leafletRef = ref({});\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const registerControl = inject(\"registerControl\");\n\n const { options, methods } = setup$a(props, leafletRef);\n\n onMounted(async () => {\n const { control } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = control.zoom(options);\n propsBinder(methods, leafletRef.value, props);\n registerControl({ leafletObject: leafletRef.value });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { leafletObject: leafletRef.value };\n },\n render() {\n return null;\n },\n};\n\nscript$6.__file = \"src/components/LControlZoom.vue\";\n\nconst props$b = {\n ...props$1,\n};\n\nconst setup$b = (props, leafletRef, context) => {\n const { options: layerOptions, methods: layerMethods } = setup$1(\n props,\n leafletRef,\n context\n );\n\n const options = {\n ...layerOptions,\n };\n\n const methods = {\n ...layerMethods,\n addLayer(layer) {\n leafletRef.value.addLayer(layer.leafletObject);\n },\n removeLayer(layer) {\n leafletRef.value.removeLayer(layer.leafletObject);\n },\n };\n\n provide(\"addLayer\", methods.addLayer);\n provide(\"removeLayer\", methods.removeLayer);\n\n return { options, methods };\n};\n\nconst props$c = {\n ...props$b,\n};\n\nconst setup$c = (props, leafletRef) => {\n const { options: layerOptions, methods: layerGroupMethods } = setup$b(\n props,\n leafletRef\n );\n\n const options = {\n ...layerOptions,\n ...props,\n };\n\n const methods = {\n ...layerGroupMethods,\n };\n\n return { options, methods };\n};\n\nvar script$7 = {\n props: props$c,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { methods, options } = setup$c(props, leafletRef);\n\n onMounted(async () => {\n const { featureGroup, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = featureGroup(options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$7.__file = \"src/components/LFeatureGroup.vue\";\n\nconst props$d = {\n ...props$b,\n geojson: {\n type: [Object, Array],\n default: () => ({}),\n },\n};\n\nconst setup$d = (props, leafletRef) => {\n const { options: layerOptions, methods: layerGroupMethods } = setup$b(\n props,\n leafletRef\n );\n\n const options = {\n ...layerOptions,\n ...props,\n };\n\n const methods = {\n ...layerGroupMethods,\n setGeojson(newVal) {\n leafletRef.value.clearLayers();\n leafletRef.value.addData(newVal);\n },\n getGeoJSONData() {\n return leafletRef.value.toGeoJSON();\n },\n getBounds() {\n return leafletRef.value.getBounds();\n },\n };\n\n return { options, methods };\n};\n\nvar script$8 = {\n props: props$d,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { methods, options } = setup$d(props, leafletRef);\n\n onMounted(async () => {\n const { geoJSON, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = geoJSON(props.geojson, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$8.__file = \"src/components/LGeoJson.vue\";\n\nconst props$e = {\n ...props$1,\n pane: {\n type: String,\n default: \"tilePane\",\n },\n opacity: {\n type: Number,\n custom: false,\n default: 1.0,\n },\n zIndex: {\n type: Number,\n default: 1,\n },\n tileSize: {\n type: Number,\n default: 256,\n },\n noWrap: {\n type: Boolean,\n default: false,\n },\n minZoom: {\n type: Number,\n default: 0,\n },\n maxZoom: {\n type: Number,\n default: undefined,\n },\n};\n\nconst setup$e = (props, leafletRef, context) => {\n const { options: layerOptions, methods: layerMethods } = setup$1(\n props,\n leafletRef,\n context\n );\n const options = {\n ...layerOptions,\n pane: props.pane,\n opacity: props.opacity,\n zIndex: props.zIndex,\n tileSize: props.tileSize,\n noWrap: props.noWrap,\n minZoom: props.minZoom,\n maxZoom: props.maxZoom,\n };\n return { options, methods: { ...layerMethods } };\n};\n\nvar script$9 = {\n props: {\n ...props$e,\n childRender: {\n type: Function,\n required: true,\n },\n },\n setup(props, context) {\n const leafletRef = ref({});\n const tileComponents = ref({});\n const root = ref(null);\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$e(props, leafletRef, context);\n\n onMounted(async () => {\n const { GridLayer, DomEvent, DomUtil } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n methods.onUnload = (e) => {\n const key = leafletRef.value._tileCoordsToKey(e.coords);\n if (tileComponents[key]) {\n tileComponents[key].innerHTML = \"\";\n tileComponents[key] = undefined;\n }\n };\n\n methods.setTileComponent = () => {\n leafletRef.value.redraw();\n };\n\n const GLayer = GridLayer.extend({\n createTile(coords) {\n const key = leafletRef.value._tileCoordsToKey(coords);\n tileComponents[key] = DomUtil.create(\"div\");\n\n let vNode = h(\n { setup: props.childRender, props: [\"coords\"] },\n { coords }\n );\n render$3(vNode, tileComponents[key]);\n\n return tileComponents[key];\n },\n });\n\n leafletRef.value = new GLayer(options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n leafletRef.value.on(\"tileunload\", methods.onUnload);\n\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n\n onUnmounted(() => {\n leafletRef.value.off(\"tileunload\", methods.unLoad);\n });\n\n return { root, ready, leafletObject: leafletRef };\n },\n render() {\n if (this.ready) {\n return h(\"div\", { style: { display: \"none\" }, ref: \"root\" });\n }\n return null;\n },\n};\n\nscript$9.__file = \"src/components/LGridLayer.vue\";\n\nconst props$f = {\n iconUrl: {\n type: String,\n custom: true,\n default: null,\n },\n iconRetinaUrl: {\n type: String,\n custom: true,\n default: null,\n },\n iconSize: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n iconAnchor: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n popupAnchor: {\n type: [Object, Array],\n custom: true,\n default: () => [0, 0],\n },\n tooltipAnchor: {\n type: [Object, Array],\n custom: true,\n default: () => [0, 0],\n },\n shadowUrl: {\n type: String,\n custom: true,\n default: null,\n },\n shadowRetinaUrl: {\n type: String,\n custom: true,\n default: null,\n },\n shadowSize: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n shadowAnchor: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n bgPos: {\n type: [Object, Array],\n custom: true,\n default: () => [0, 0],\n },\n className: {\n type: String,\n custom: true,\n default: \"\",\n },\n options: {\n type: Object,\n custom: true,\n default: () => ({}),\n },\n};\n\n/**\n * Icon component, lets you add and custom icons to the map\n */\nvar script$a = {\n name: \"LIcon\",\n props: {\n ...props$f,\n ...props,\n },\n setup(props, context) {\n const root = ref(null);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const canSetParentHtml = inject(\"canSetParentHtml\");\n const setParentHtml = inject(\"setParentHtml\");\n const setIcon = inject(\"setIcon\");\n\n let onDomEvent;\n let offDomEvent;\n let divIcon;\n let icon;\n let iconObject = undefined;\n\n const createIcon = (el, recreationNeeded, htmlSwapNeeded) => {\n const elHtml = el && el.innerHTML;\n if (!recreationNeeded) {\n if (htmlSwapNeeded && iconObject && canSetParentHtml()) {\n setParentHtml(elHtml);\n }\n return;\n }\n\n const listeners = remapEvents(context.attrs);\n if (iconObject) {\n offDomEvent(iconObject, listeners);\n }\n\n const { options: componentOptions } = setup(props);\n const options = {\n ...componentOptions,\n iconUrl: props.iconUrl,\n iconRetinaUrl: props.iconRetinaUrl,\n iconSize: props.iconSize,\n iconAnchor: props.iconAnchor,\n popupAnchor: props.popupAnchor,\n tooltipAnchor: props.tooltipAnchor,\n shadowUrl: props.shadowUrl,\n shadowRetinaUrl: props.shadowRetinaUrl,\n shadowSize: props.shadowSize,\n shadowAnchor: props.shadowAnchor,\n bgPos: props.bgPos,\n className: props.className,\n html: elHtml || props.html,\n };\n\n iconObject = options.html ? divIcon(options) : icon(options);\n onDomEvent(iconObject, listeners);\n setIcon(iconObject);\n };\n\n const scheduleCreateIcon = () => {\n nextTick(() => createIcon(root.value, true, false));\n };\n\n const scheduleHtmlSwap = () => {\n nextTick(() => createIcon(root.value, false, true));\n };\n\n const methods = {\n setIconUrl: scheduleCreateIcon,\n setIconRetinaUrl: scheduleCreateIcon,\n setIconSize: scheduleCreateIcon,\n setIconAnchor: scheduleCreateIcon,\n setPopupAnchor: scheduleCreateIcon,\n setTooltipAnchor: scheduleCreateIcon,\n setShadowUrl: scheduleCreateIcon,\n setShadowRetinaUrl: scheduleCreateIcon,\n setShadowAnchor: scheduleCreateIcon,\n setBgPos: scheduleCreateIcon,\n setClassName: scheduleCreateIcon,\n setHtml: scheduleCreateIcon,\n };\n\n onMounted(async () => {\n const { DomEvent, divIcon: lDivIcon, icon: lIcon } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n onDomEvent = DomEvent.on;\n offDomEvent = DomEvent.off;\n divIcon = lDivIcon;\n icon = lIcon;\n\n propsBinder(methods, {}, props);\n\n const observer = new MutationObserver(scheduleHtmlSwap);\n observer.observe(root.value, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true,\n });\n scheduleCreateIcon();\n });\n\n return { root };\n },\n render() {\n const content = this.$slots.default ? this.$slots.default() : undefined;\n return h(\"div\", { ref: \"root\" }, content);\n },\n};\n\nscript$a.__file = \"src/components/LIcon.vue\";\n\n/**\n * @typedef {import('leaflet/dist/leaflet-src.esm.js').LatLngBounds} LatLngBounds\n */\n\nconst props$g = {\n ...props$1,\n url: {\n type: String,\n required: true,\n },\n bounds: {\n type: [Array, Object],\n required: true,\n },\n opacity: {\n type: Number,\n custom: true,\n default: 1.0,\n },\n alt: {\n type: String,\n default: \"\",\n },\n interactive: {\n type: Boolean,\n default: false,\n },\n crossOrigin: {\n type: Boolean,\n default: false,\n },\n errorOverlayUrl: {\n type: String,\n custom: true,\n default: \"\",\n },\n zIndex: {\n type: Number,\n custom: true,\n default: 1,\n },\n className: {\n type: String,\n default: \"\",\n },\n};\n\nconst setup$f = (setupProps, LeafletRef, context) => {\n const { options: layerOptions, methods: layerMethods } = setup$1(\n setupProps,\n LeafletRef,\n context\n );\n const options = {\n ...layerOptions,\n ...setupProps,\n };\n\n const methods = {\n ...layerMethods,\n /**\n * Sets the opacity of the overlay.\n * @param {number} opacity\n */\n setOpacity(opacity) {\n return LeafletRef.value.setOpacity(opacity);\n },\n /**\n * Changes the URL of the image.\n * @param {string} url\n */\n setUrl(url) {\n return LeafletRef.value.setUrl(url);\n },\n /**\n * Update the bounds that this ImageOverlay covers\n * @param {LatLngBounds | Array<Array<number>>} bounds\n */\n setBounds(bounds) {\n return LeafletRef.value.setBounds(bounds);\n },\n /**\n * Get the bounds that this ImageOverlay covers\n * @returns {LatLngBounds}\n */\n getBounds() {\n return LeafletRef.value.getBounds();\n },\n /**\n * Returns the instance of HTMLImageElement used by this overlay.\n * @returns {HTMLElement}\n */\n getElement() {\n return LeafletRef.value.getElement();\n },\n /**\n * Brings the layer to the top of all overlays.\n */\n bringToFront() {\n return LeafletRef.value.bringToFront();\n },\n /**\n * Brings the layer to the bottom of all overlays.\n */\n bringToBack() {\n return LeafletRef.value.bringToBack();\n },\n /**\n * Changes the zIndex of the image overlay.\n * @param {number} zIndex\n */\n setZIndex(zIndex) {\n return LeafletRef.value.setZIndex(zIndex);\n },\n };\n\n return { options, methods };\n};\n\n/**\n * ImageOverlay component, render a plain image instead of a geospatial map.\n */\nvar script$b = {\n name: \"LImageOverlay\",\n props: props$g,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$f(props, leafletRef, context);\n\n onMounted(async () => {\n const { imageOverlay, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n leafletRef.value = imageOverlay(props.url, props.bounds, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$b.__file = \"src/components/LImageOverlay.vue\";\n\nvar script$c = {\n props: props$b,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { methods } = setup$b(props, leafletRef, context);\n\n onMounted(async () => {\n const { layerGroup, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n leafletRef.value = layerGroup(props.options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$c.__file = \"src/components/LLayerGroup.vue\";\n\nvar script$d = {\n emits: [\"ready\", \"update:zoom\", \"update:center\", \"update:bounds\"],\n props: {\n ...props,\n /**\n * The center of the map, supports .sync modifier\n */\n center: {\n type: [Object, Array],\n default: () => [0, 0],\n },\n /**\n * The bounds of the map, supports .sync modifier\n */\n bounds: {\n type: [Array, Object],\n default: undefined,\n },\n /**\n * The max bounds of the map\n */\n maxBounds: {\n type: [Array, Object],\n default: undefined,\n },\n /**\n * The zoom of the map, supports .sync modifier\n */\n zoom: {\n type: Number,\n default: 0,\n },\n /**\n * The minZoom of the map\n */\n minZoom: {\n type: Number,\n default: undefined,\n },\n /**\n * The maxZoom of the map\n */\n maxZoom: {\n type: Number,\n default: undefined,\n },\n /**\n * The paddingBottomRight of the map\n */\n paddingBottomRight: {\n type: Array,\n default: undefined,\n },\n /**\n * The paddingTopLeft of the map\n */\n paddingTopLeft: {\n type: Array,\n default: undefined,\n },\n /**\n * The padding of the map\n */\n padding: {\n type: Array,\n default: undefined,\n },\n /**\n * The worldCopyJump option for the map\n */\n worldCopyJump: {\n type: Boolean,\n default: false,\n },\n /**\n * The CRS to use for the map. Can be an object that defines a coordinate reference\n * system for projecting geographical points into screen coordinates and back\n * (see https://leafletjs.com/reference-1.7.1.html#crs-l-crs-base), or a string\n * name identifying one of Leaflet's defined CRSs, such as \"EPSG4326\".\n */\n crs: {\n type: [String, Object],\n default: \"EPSG3857\",\n },\n maxBoundsViscosity: {\n type: Number,\n default: undefined,\n },\n inertia: {\n type: Boolean,\n default: undefined,\n },\n inertiaDeceleration: {\n type: Number,\n default: undefined,\n },\n inertiaMaxSpeed: {\n type: Number,\n default: undefined,\n },\n easeLinearity: {\n type: Number,\n default: undefined,\n },\n zoomAnimation: {\n type: Boolean,\n default: undefined,\n },\n zoomAnimationThreshold: {\n type: Number,\n default: undefined,\n },\n fadeAnimation: {\n type: Boolean,\n default: undefined,\n },\n markerZoomAnimation: {\n type: Boolean,\n default: undefined,\n },\n noBlockingAnimations: {\n type: Boolean,\n default: false,\n },\n useGlobalLeaflet: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, context) {\n const root = ref(null);\n const blueprint = reactive({\n ready: false,\n leafletRef: {},\n layersToAdd: [],\n layersInControl: [],\n });\n const { options: componentOptions } = setup(props);\n const options = {\n ...componentOptions,\n minZoom: props.minZoom,\n maxZoom: props.maxZoom,\n maxBounds: props.maxBounds,\n maxBoundsViscosity: props.maxBoundsViscosity,\n worldCopyJump: props.worldCopyJump,\n crs: props.crs,\n center: props.center,\n zoom: props.zoom,\n inertia: props.inertia,\n inertiaDeceleration: props.inertiaDeceleration,\n inertiaMaxSpeed: props.inertiaMaxSpeed,\n easeLinearity: props.easeLinearity,\n zoomAnimation: props.zoomAnimation,\n zoomAnimationThreshold: props.zoomAnimationThreshold,\n fadeAnimation: props.fadeAnimation,\n markerZoomAnimation: props.markerZoomAnimation,\n };\n\n const addLayer = provideLeafletWrapper(\"addLayer\");\n const removeLayer = provideLeafletWrapper(\"removeLayer\");\n const registerControl = provideLeafletWrapper(\"registerControl\");\n const registerLayerControl = provideLeafletWrapper(\"registerLayerControl\");\n provide(GLOBAL_LEAFLET_OPT, props.useGlobalLeaflet);\n\n const eventHandlers = {\n moveEndHandler() {\n /**\n * Triggers when zoom is updated\n * @type {number,string}\n */\n context.emit(\"update:zoom\", blueprint.leafletRef.getZoom());\n /**\n * Triggers when center is updated\n * @type {object,array}\n */\n context.emit(\"update:center\", blueprint.leafletRef.getCenter());\n\n /**\n * Triggers when bounds are updated\n * @type {object}\n */\n context.emit(\"update:bounds\", blueprint.leafletRef.getBounds());\n },\n overlayAddHandler(e) {\n const layer = blueprint.layersInControl.find((l) => l.name === e.name);\n if (layer) {\n layer.updateVisibleProp(true);\n }\n },\n overlayRemoveHandler(e) {\n const layer = blueprint.layersInControl.find((l) => l.name === e.name);\n if (layer) {\n layer.updateVisibleProp(false);\n }\n },\n };\n\n onMounted(async () => {\n if (props.useGlobalLeaflet) {\n WINDOW_OR_GLOBAL.L = WINDOW_OR_GLOBAL.L || (await import('leaflet'));\n }\n const {\n map,\n CRS,\n Icon,\n latLngBounds,\n latLng,\n DomEvent,\n } = props.useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n try {\n options.beforeMapMount && (await options.beforeMapMount());\n } catch (error) {\n console.error(\n `The following error occurred running the provided beforeMapMount hook ${error.message}`\n );\n }\n\n await resetWebpackIcon(Icon);\n\n const optionsCrs =\n typeof options.crs == \"string\" ? CRS[options.crs] : options.crs;\n options.crs = optionsCrs || CRS.EPSG3857;\n\n const methods = {\n addLayer(layer) {\n if (layer.layerType !== undefined) {\n if (blueprint.layerControl === undefined) {\n blueprint.layersToAdd.push(layer);\n } else {\n const exist = blueprint.layersInControl.find(\n (l) =>\n l.leafletObject._leaflet_id ===\n layer.leafletObject._leaflet_id\n );\n if (!exist) {\n blueprint.layerControl.addLayer(layer);\n blueprint.layersInControl.push(layer);\n }\n }\n }\n if (layer.visible !== false) {\n blueprint.leafletRef.addLayer(layer.leafletObject);\n }\n },\n removeLayer(layer) {\n if (layer.layerType !== undefined) {\n if (blueprint.layerControl === undefined) {\n blueprint.layersToAdd = blueprint.layersToAdd.filter(\n (l) => l.name !== layer.name\n );\n } else {\n blueprint.layerControl.removeLayer(layer.leafletObject);\n blueprint.layersInControl = blueprint.layersInControl.filter(\n (l) =>\n l.leafletObject._leaflet_id !==\n layer.leafletObject._leaflet_id\n );\n }\n }\n blueprint.leafletRef.removeLayer(layer.leafletObject);\n },\n\n registerLayerControl(lControlLayer) {\n blueprint.layerControl = lControlLayer;\n blueprint.layersToAdd.forEach((layer) => {\n blueprint.layerControl.addLayer(layer);\n });\n blueprint.layersToAdd = [];\n\n registerControl(lControlLayer);\n },\n\n registerControl(lControl) {\n blueprint.leafletRef.addControl(lControl.leafletObject);\n },\n\n setZoom(newVal) {\n const zoom = blueprint.leafletRef.getZoom();\n if (newVal !== zoom) {\n blueprint.leafletRef.setZoom(newVal, {\n animate: props.noBlockingAnimations ? false : null,\n });\n }\n },\n\n setPaddingBottomRight(newVal) {\n blueprint.paddingBottomRight = newVal;\n },\n setPaddingTopLeft(newVal) {\n blueprint.paddingTopLeft = newVal;\n },\n setPadding(newVal) {\n blueprint.padding = newVal;\n },\n setCrs(newVal) {\n const prevBounds = blueprint.leafletRef.getBounds();\n blueprint.leafletRef.options.crs = newVal;\n blueprint.leafletRef.fitBounds(prevBounds, {\n animate: false,\n padding: [0, 0],\n });\n },\n fitBounds(bounds) {\n blueprint.leafletRef.fitBounds(bounds, {\n animate: this.noBlockingAnimations ? false : null,\n });\n },\n setBounds(newVal) {\n if (!newVal) {\n return;\n }\n const newBounds = latLngBounds(newVal);\n if (!newBounds.isValid()) {\n return;\n }\n const oldBounds =\n blueprint.lastSetBounds || blueprint.leafletRef.getBounds();\n const boundsChanged = !oldBounds.equals(newBounds, 0); // set maxMargin to 0 - check exact equals\n if (boundsChanged) {\n blueprint.lastSetBounds = newBounds;\n blueprint.leafletRef.fitBounds(newBounds, this.fitBoundsOptions);\n }\n },\n\n setCenter(newVal) {\n if (newVal == null) {\n return;\n }\n const newCenter = latLng(newVal);\n const oldCenter =\n blueprint.lastSetCenter || blueprint.leafletRef.getCenter();\n if (\n oldCenter.lat !== newCenter.lat ||\n oldCenter.lng !== newCenter.lng\n ) {\n blueprint.lastSetCenter = newCenter;\n blueprint.leafletRef.panTo(newCenter, {\n animate: this.noBlockingAnimations ? false : null,\n });\n }\n },\n };\n\n updateLeafletWrapper(addLayer, methods.addLayer);\n updateLeafletWrapper(removeLayer, methods.removeLayer);\n updateLeafletWrapper(registerControl, methods.registerControl);\n updateLeafletWrapper(registerLayerControl, methods.registerLayerControl);\n\n blueprint.leafletRef = map(root.value, options);\n\n propsBinder(methods, blueprint.leafletRef, props);\n const listeners = remapEvents(context.attrs);\n\n blueprint.leafletRef.on(\n \"moveend\",\n debounce(eventHandlers.moveEndHandler, 100)\n );\n blueprint.leafletRef.on(\"overlayadd\", eventHandlers.overlayAddHandler);\n blueprint.leafletRef.on(\n \"overlayremove\",\n eventHandlers.overlayRemoveHandler\n );\n DomEvent.on(blueprint.leafletRef, listeners);\n blueprint.ready = true;\n nextTick(() => context.emit(\"ready\", blueprint.leafletRef));\n });\n\n onBeforeUnmount(() => {\n if (blueprint.leafletRef) {\n blueprint.leafletRef.remove();\n }\n });\n\n const leafletObject = computed(() => blueprint.leafletRef);\n const ready = computed(() => blueprint.ready);\n return { root, ready, leafletObject };\n },\n render() {\n return h(\n \"div\",\n { style: { width: \"100%\", height: \"100%\" }, ref: \"root\" },\n this.ready ? this.$slots.default() : {}\n );\n },\n};\n\nscript$d.__file = \"src/components/LMap.vue\";\n\nconst props$h = {\n ...props$1,\n pane: {\n type: String,\n default: \"markerPane\",\n },\n draggable: {\n type: Boolean,\n custom: true,\n default: false,\n },\n latLng: {\n type: [Object, Array],\n custom: true,\n default: null,\n },\n icon: {\n type: [Object],\n default: () => undefined,\n custom: false,\n },\n zIndexOffset: {\n type: Number,\n custom: false,\n default: null,\n },\n};\n\nconst setup$g = (props, leafletRef, context) => {\n const { options: layerOptions, methods: layerMethods } = setup$1(\n props,\n leafletRef,\n context\n );\n const options = {\n ...layerOptions,\n ...props,\n };\n\n const methods = {\n ...layerMethods,\n setDraggable(value) {\n if (leafletRef.value.dragging) {\n value\n ? leafletRef.value.dragging.enable()\n : leafletRef.value.dragging.disable();\n }\n },\n latLngSync(event) {\n context.emit(\"update:latLng\", event.latlng);\n context.emit(\"update:lat-lng\", event.latlng);\n },\n setLatLng(newVal) {\n if (newVal == null) {\n return;\n }\n\n if (leafletRef.value) {\n const oldLatLng = leafletRef.value.getLatLng();\n if (!oldLatLng || !oldLatLng.equals(newVal)) {\n leafletRef.value.setLatLng(newVal);\n }\n }\n },\n };\n return { options, methods };\n};\n\n/**\n * Marker component, lets you add and personalize markers on the map\n */\nvar script$e = {\n name: \"LMarker\",\n props: props$h,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n provide(\"canSetParentHtml\", () => !!leafletRef.value.getElement());\n provide(\n \"setParentHtml\",\n (html) => (leafletRef.value.getElement().innerHTML = html)\n );\n provide(\n \"setIcon\",\n (newIcon) => leafletRef.value.setIcon && leafletRef.value.setIcon(newIcon)\n );\n const { options, methods } = setup$g(props, leafletRef, context);\n if (options.icon === undefined) {\n // If the options objection has a property named 'icon', then Leaflet will overwrite\n // the default icon with it for the marker, _even if it is undefined_.\n // This leads to the issue discussed in https://github.com/vue-leaflet/vue-leaflet/issues/130\n delete options.icon;\n }\n\n onMounted(async () => {\n const { marker, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n leafletRef.value = marker(props.latLng, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n leafletRef.value.on(\"move\", debounce(methods.latLngSync, 100));\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$e.__file = \"src/components/LMarker.vue\";\n\nconst props$i = {\n ...props$3,\n latLngs: {\n type: Array,\n default: () => [],\n },\n smoothFactor: {\n type: Number,\n custom: true,\n default: 1.0,\n },\n noClip: {\n type: Boolean,\n custom: true,\n default: false,\n },\n};\n\nconst setup$h = (props, leafletRef, context) => {\n const { options: pathOptions, methods: pathMethods } = setup$3(\n props,\n leafletRef,\n context\n );\n const options = {\n ...pathOptions,\n ...props,\n };\n\n const methods = {\n ...pathMethods,\n setSmoothFactor(smoothFactor) {\n leafletRef.value.setStyle({ smoothFactor });\n },\n setNoClip(noClip) {\n leafletRef.value.setStyle({ noClip });\n },\n addLatLng(latLng) {\n leafletRef.value.addLatLng(latLng);\n },\n };\n return { options, methods };\n};\n\nconst props$j = {\n ...props$i,\n};\n\nconst setup$i = (props, leafletRef, context) => {\n const { options: polylineOptions, methods: polylineMethods } = setup$h(\n props,\n leafletRef,\n context\n );\n const options = {\n ...polylineOptions,\n ...props,\n };\n\n const methods = {\n ...polylineMethods,\n toGeoJSON(precision) {\n return leafletRef.value.toGeoJSON(precision);\n },\n };\n\n return { options, methods };\n};\n\n/**\n * Polygon component, lets you add and customize polygon regions on the map\n */\nvar script$f = {\n name: \"LPolygon\",\n props: props$j,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$i(props, leafletRef, context);\n\n onMounted(async () => {\n const { polygon, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = polygon(props.latLngs, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$f.__file = \"src/components/LPolygon.vue\";\n\n/**\n * Polyline component, lets you add and personalize polylines on the map\n */\nvar script$g = {\n name: \"LPolyline\",\n props: props$i,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$h(props, leafletRef, context);\n\n onMounted(async () => {\n const { polyline, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = polyline(props.latLngs, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$g.__file = \"src/components/LPolyline.vue\";\n\nconst props$k = {\n ...props,\n content: {\n type: String,\n default: null,\n },\n};\n\nconst setup$j = (props, leafletRef) => {\n const { options, methods: componentMethods } = setup(props);\n const methods = {\n ...componentMethods,\n setContent(newVal) {\n if (leafletRef.value && newVal !== null && newVal !== undefined) {\n leafletRef.value.setContent(newVal);\n }\n },\n };\n return { options, methods };\n};\n\nconst render$2 = (slots) => {\n if (slots.default) {\n return h(\"div\", { ref: \"root\" }, slots.default());\n }\n return null;\n};\n\nconst props$l = {\n ...props$k,\n latLng: {\n type: [Object, Array],\n default: () => [],\n },\n};\n\nconst setup$k = (props, leafletRef) => {\n const { options, methods } = setup$j(props, leafletRef);\n const unbindPopup = inject(\"unbindPopup\");\n\n onBeforeUnmount(() => {\n unbindPopup();\n });\n\n return { options, methods };\n};\n\n/**\n * Display a popup on the map\n */\nvar script$h = {\n name: \"LPopup\",\n props: props$l,\n setup(props, context) {\n const leafletRef = ref({});\n const root = ref(null);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const bindPopup = inject(\"bindPopup\");\n\n const { options, methods } = setup$k(props, leafletRef);\n\n onMounted(async () => {\n const { popup, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = popup(options);\n\n if (props.latLng !== undefined) {\n leafletRef.value.setLatLng(props.latLng);\n }\n\n propsBinder(methods, leafletRef.value, props);\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n leafletRef.value.setContent(props.content || root.value);\n bindPopup({ leafletObject: leafletRef.value });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { root, leafletObject: leafletRef };\n },\n render() {\n return render$2(this.$slots);\n },\n};\n\nscript$h.__file = \"src/components/LPopup.vue\";\n\nconst props$m = {\n ...props$j,\n bounds: {\n type: Array,\n default: undefined,\n },\n};\n\nconst setup$l = (props, leafletRef, context) => {\n const { options: polygonOptions, methods: polygonMethods } = setup$i(\n props,\n leafletRef,\n context\n );\n const options = {\n ...polygonOptions,\n ...props,\n };\n\n const methods = {\n ...polygonMethods,\n setBounds(latLngBounds) {\n leafletRef.value.setBounds(latLngBounds);\n },\n setLatLngs(latLngs) {\n // Calling setLatLngs on a Leaflet rectangle will convert it\n // to a polygon. So instead, we call setBounds here to ensure\n // that the rectangle remains a rectangle, defined by the\n // bounds of the points in the latLngs array.\n leafletRef.value.setBounds(latLngs);\n },\n };\n\n return { options, methods };\n};\n\n/**\n * Rectangle component, lets you add and customize rectangular regions on the map\n */\nvar script$i = {\n name: \"LRectangle\",\n props: props$m,\n setup(props, context) {\n const leafletRef = ref({});\n const ready = ref(false);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$l(props, leafletRef, context);\n\n onMounted(async () => {\n const { rectangle, latLngBounds, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n const bounds =\n props.bounds && props.bounds.length\n ? latLngBounds(props.bounds)\n : latLngBounds(props.latLngs);\n leafletRef.value = rectangle(bounds, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n ready.value = true;\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n\n return { ready, leafletObject: leafletRef };\n },\n render() {\n return render(this.ready, this.$slots);\n },\n};\n\nscript$i.__file = \"src/components/LRectangle.vue\";\n\nconst props$n = {\n ...props$e,\n tms: {\n type: Boolean,\n default: false,\n },\n subdomains: {\n type: String,\n default: \"abc\",\n },\n detectRetina: {\n type: Boolean,\n default: false,\n },\n url: {\n type: String,\n default: null,\n },\n};\n\nconst setup$m = (props, leafletRef) => {\n const {\n options: gridLayerOptions,\n methods: gridLayerMethods,\n } = setup$e(props, leafletRef);\n const options = {\n ...gridLayerOptions,\n tms: props.tms,\n subdomains: props.subdomains,\n detectRetina: props.detectRetina,\n };\n return {\n options,\n methods: {\n ...gridLayerMethods,\n },\n };\n};\n\nvar script$j = {\n props: props$n,\n setup(props, context) {\n const leafletRef = ref({});\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$m(props, leafletRef);\n\n onMounted(async () => {\n const { tileLayer, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n leafletRef.value = tileLayer(props.url, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n\n return { leafletObject: leafletRef };\n },\n render() {\n return null;\n },\n};\n\nscript$j.__file = \"src/components/LTileLayer.vue\";\n\nconst props$o = {\n ...props$k,\n};\n\nconst setup$n = (props, leafletRef) => {\n const { options, methods } = setup$j(props, leafletRef);\n const unbindTooltip = inject(\"unbindTooltip\");\n\n onBeforeUnmount(() => {\n unbindTooltip();\n });\n\n return { options, methods };\n};\n\n/**\n * Display a tooltip on the map\n */\nvar script$k = {\n name: \"LTooltip\",\n props: props$o,\n setup(props, context) {\n const leafletRef = ref({});\n const root = ref(null);\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const bindTooltip = inject(\"bindTooltip\");\n\n const { options, methods } = setup$n(props, leafletRef);\n\n onMounted(async () => {\n const { tooltip, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = tooltip(options);\n\n propsBinder(methods, leafletRef.value, props);\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n leafletRef.value.setContent(props.content || root.value);\n bindTooltip({ leafletObject: leafletRef.value });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { root, leafletObject: leafletRef };\n },\n render() {\n return render$2(this.$slots);\n },\n};\n\nscript$k.__file = \"src/components/LTooltip.vue\";\n\nconst props$p = {\n ...props$n,\n baseUrl: {\n type: String,\n default: null,\n required: true,\n },\n layers: {\n type: String,\n default: \"\",\n },\n styles: {\n type: String,\n default: \"\",\n },\n format: {\n type: String,\n default: \"image/jpeg\",\n },\n transparent: {\n type: Boolean,\n custom: false,\n },\n version: {\n type: String,\n default: \"1.1.1\",\n },\n crs: {\n default: null,\n },\n upperCase: {\n type: Boolean,\n default: false,\n },\n};\n\nconst setup$o = (props, leafletRef) => {\n const {\n options: tileLayerOptions,\n methods: tileLayerMethods,\n } = setup$m(props, leafletRef);\n const options = {\n ...tileLayerOptions,\n layers: props.layers,\n styles: props.styles,\n format: props.format,\n transparent: props.transparent,\n version: props.version,\n crs: props.crs,\n upperCase: props.upperCase,\n };\n return {\n options,\n methods: {\n ...tileLayerMethods,\n },\n };\n};\n\nvar script$l = {\n props: props$p,\n setup(props, context) {\n const leafletRef = ref({});\n\n const useGlobalLeaflet = inject(GLOBAL_LEAFLET_OPT);\n const addLayer = inject(\"addLayer\");\n\n const { options, methods } = setup$o(props, leafletRef);\n\n onMounted(async () => {\n const { tileLayer, DomEvent } = useGlobalLeaflet\n ? WINDOW_OR_GLOBAL.L\n : await import('leaflet/dist/leaflet-src.esm');\n\n leafletRef.value = tileLayer.wms(props.baseUrl, options);\n\n const listeners = remapEvents(context.attrs);\n DomEvent.on(leafletRef.value, listeners);\n\n propsBinder(methods, leafletRef.value, props);\n addLayer({\n ...props,\n ...methods,\n leafletObject: leafletRef.value,\n });\n nextTick(() => context.emit(\"ready\", leafletRef.value));\n });\n return { leafletObject: leafletRef.value };\n },\n render() {\n return null;\n },\n};\n\nscript$l.__file = \"src/components/LWmsTileLayer.vue\";\n\nexport { script as LCircle, script$1 as LCircleMarker, script$2 as LControl, script$3 as LControlAttribution, script$4 as LControlLayers, script$5 as LControlScale, script$6 as LControlZoom, script$7 as LFeatureGroup, script$8 as LGeoJson, script$9 as LGridLayer, script$a as LIcon, script$b as LImageOverlay, script$c as LLayerGroup, script$d as LMap, script$e as LMarker, script$f as LPolygon, script$g as LPolyline, script$h as LPopup, script$i as LRectangle, script$j as LTileLayer, script$k as LTooltip, script$l as LWmsTileLayer };\n//# sourceMappingURL=vue-leaflet.esm.js.map\n","<template>\n <div\n id=\"workout-edition\"\n class=\"center-card center-card with-margin\"\n :class=\"{ 'center-form': workout && workout.with_gpx }\"\n >\n <Card>\n <template #title>{{\n $t(`workouts.${isCreation ? 'ADD' : 'EDIT'}_WORKOUT`)\n }}</template>\n <template #content>\n <div id=\"workout-form\">\n <form @submit.prevent=\"updateWorkout\">\n <div class=\"form-items\">\n <div class=\"form-item-radio\" v-if=\"isCreation\">\n <div>\n <input\n id=\"withGpx\"\n type=\"radio\"\n :checked=\"withGpx\"\n :disabled=\"loading\"\n @click=\"updateWithGpx\"\n />\n <label for=\"withGpx\">{{ $t('workouts.WITH_GPX') }}</label>\n </div>\n <div>\n <input\n id=\"withoutGpx\"\n type=\"radio\"\n :checked=\"!withGpx\"\n :disabled=\"loading\"\n @click=\"updateWithGpx\"\n />\n <label for=\"withoutGpx\">{{\n $t('workouts.WITHOUT_GPX')\n }}</label>\n </div>\n </div>\n <div class=\"form-item\">\n <label> {{ $t('workouts.SPORT', 1) }}: </label>\n <select\n id=\"sport\"\n required\n :disabled=\"loading\"\n v-model=\"workoutDataObject.sport_id\"\n >\n <option\n v-for=\"sport in translatedSports.filter((s) => s.is_active)\"\n :value=\"sport.id\"\n :key=\"sport.id\"\n >\n {{ sport.label }}\n </option>\n </select>\n </div>\n <div class=\"form-item\" v-if=\"isCreation && withGpx\">\n <label for=\"gpxFile\">\n {{ $t('workouts.GPX_FILE') }}\n {{ $t('workouts.ZIP_ARCHIVE_DESCRIPTION') }}:\n </label>\n <input\n id=\"gpxFile\"\n name=\"gpxFile\"\n type=\"file\"\n accept=\".gpx, .zip\"\n :disabled=\"loading\"\n @input=\"updateFile\"\n />\n <div class=\"files-help info-box\">\n <div>\n <strong>{{ $t('workouts.GPX_FILE') }}:</strong>\n <ul>\n <li>\n {{ $t('workouts.MAX_SIZE') }}: {{ fileSizeLimit }}\n </li>\n </ul>\n </div>\n <div>\n <strong>{{ $t('workouts.ZIP_ARCHIVE') }}:</strong>\n <ul>\n <li>{{ $t('workouts.NO_FOLDER') }}</li>\n <li>\n {{ $t('workouts.MAX_FILES') }}: {{ gpx_limit_import }}\n </li>\n <li>{{ $t('workouts.MAX_SIZE') }}: {{ zipSizeLimit }}</li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"form-item\" v-else>\n <label for=\"title\"> {{ $t('workouts.TITLE') }}: </label>\n <input\n id=\"title\"\n name=\"title\"\n type=\"text\"\n :required=\"!isCreation\"\n :disabled=\"loading\"\n v-model=\"workoutDataObject.title\"\n />\n </div>\n <div v-if=\"!withGpx\">\n <div class=\"workout-date-duration\">\n <div class=\"form-item\">\n <label>{{ $t('workouts.WORKOUT_DATE') }}:</label>\n <div class=\"workout-date-time\">\n <input\n id=\"workout-date\"\n name=\"workout-date\"\n type=\"date\"\n required\n :disabled=\"loading\"\n v-model=\"workoutDataObject.workoutDate\"\n />\n <input\n id=\"workout-time\"\n name=\"workout-time\"\n class=\"workout-time\"\n type=\"time\"\n required\n :disabled=\"loading\"\n v-model=\"workoutDataObject.workoutTime\"\n />\n </div>\n </div>\n <div class=\"form-item\">\n <label>{{ $t('workouts.DURATION') }}:</label>\n <div>\n <input\n id=\"workout-duration-hour\"\n name=\"workout-duration-hour\"\n class=\"workout-duration\"\n type=\"text\"\n placeholder=\"HH\"\n pattern=\"^([0-9]*[0-9])$\"\n required\n :disabled=\"loading\"\n v-model=\"workoutDataObject.workoutDurationHour\"\n />\n :\n <input\n id=\"workout-duration-minutes\"\n name=\"workout-duration-minutes\"\n class=\"workout-duration\"\n type=\"text\"\n pattern=\"^([0-5][0-9])$\"\n placeholder=\"MM\"\n required\n :disabled=\"loading\"\n v-model=\"workoutDataObject.workoutDurationMinutes\"\n />\n :\n <input\n id=\"workout-duration-seconds\"\n name=\"workout-duration-seconds\"\n class=\"workout-duration\"\n type=\"text\"\n pattern=\"^([0-5][0-9])$\"\n placeholder=\"SS\"\n required\n :disabled=\"loading\"\n v-model=\"workoutDataObject.workoutDurationSeconds\"\n />\n </div>\n </div>\n </div>\n <div class=\"form-item\">\n <label>{{ $t('workouts.DISTANCE') }} (km):</label>\n <input\n name=\"workout-distance\"\n type=\"number\"\n min=\"0\"\n step=\"0.1\"\n required\n :disabled=\"loading\"\n v-model=\"workoutDataObject.workoutDistance\"\n />\n </div>\n </div>\n <div class=\"form-item\">\n <label> {{ $t('workouts.NOTES') }}: </label>\n <CustomTextArea\n name=\"notes\"\n :input=\"workoutDataObject.notes\"\n :disabled=\"loading\"\n @updateValue=\"updateNotes\"\n />\n </div>\n </div>\n <ErrorMessage :message=\"errorMessages\" v-if=\"errorMessages\" />\n <div v-if=\"loading\">\n <Loader />\n </div>\n <div v-else class=\"form-buttons\">\n <button class=\"confirm\" type=\"submit\" :disabled=\"loading\">\n {{ $t('buttons.SUBMIT') }}\n </button>\n <button class=\"cancel\" @click.prevent=\"onCancel\">\n {{ $t('buttons.CANCEL') }}\n </button>\n </div>\n </form>\n </div>\n </template>\n </Card>\n </div>\n</template>\n\n<script lang=\"ts\">\n import {\n ComputedRef,\n PropType,\n defineComponent,\n computed,\n reactive,\n ref,\n watch,\n onMounted,\n onUnmounted,\n } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useRouter } from 'vue-router'\n\n import { ROOT_STORE, WORKOUTS_STORE } from '@/store/constants'\n import { TAppConfig } from '@/types/application'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkout, IWorkoutForm } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { formatWorkoutDate, getDateWithTZ } from '@/utils/dates'\n import { getReadableFileSize } from '@/utils/files'\n import { translateSports } from '@/utils/sports'\n\n export default defineComponent({\n name: 'WorkoutEdition',\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n isCreation: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n sports: {\n type: Object as PropType<ISport[]>,\n required: true,\n },\n workout: {\n type: Object as PropType<IWorkout>,\n required: false,\n },\n },\n setup(props) {\n const { t } = useI18n()\n const store = useStore()\n const router = useRouter()\n\n onMounted(() => {\n if (props.workout && props.workout.id) {\n formatWorkoutForm(props.workout)\n }\n })\n\n const translatedSports: ComputedRef<ISport[]> = computed(() =>\n translateSports(props.sports, t)\n )\n const appConfig: ComputedRef<TAppConfig> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n )\n const fileSizeLimit = appConfig.value.max_single_file_size\n ? getReadableFileSize(appConfig.value.max_single_file_size)\n : ''\n const gpx_limit_import = appConfig.value.gpx_limit_import\n const zipSizeLimit = appConfig.value.max_zip_file_size\n ? getReadableFileSize(appConfig.value.max_zip_file_size)\n : ''\n const errorMessages: ComputedRef<string | string[] | null> = computed(\n () => store.getters[ROOT_STORE.GETTERS.ERROR_MESSAGES]\n )\n const workoutForm = reactive({\n sport_id: '',\n title: '',\n notes: '',\n workoutDate: '',\n workoutTime: '',\n workoutDurationHour: '',\n workoutDurationMinutes: '',\n workoutDurationSeconds: '',\n workoutDistance: '',\n })\n let withGpx = ref(\n props.workout ? props.workout.with_gpx : props.isCreation\n )\n let gpxFile: File | null = null\n\n function updateNotes(value: string) {\n workoutForm.notes = value\n }\n function updateWithGpx() {\n withGpx.value = !withGpx.value\n }\n function updateFile(event: Event & { target: HTMLInputElement }) {\n if (event.target.files) {\n gpxFile = event.target.files[0]\n }\n }\n function formatWorkoutForm(workout: IWorkout) {\n workoutForm.sport_id = `${workout.sport_id}`\n workoutForm.title = workout.title\n workoutForm.notes = workout.notes\n if (!workout.with_gpx) {\n const workoutDateTime = formatWorkoutDate(\n getDateWithTZ(workout.workout_date, props.authUser.timezone),\n 'yyyy-MM-dd'\n )\n const duration = workout.duration.split(':')\n workoutForm.workoutDistance = `${workout.distance}`\n workoutForm.workoutDate = workoutDateTime.workout_date\n workoutForm.workoutTime = workoutDateTime.workout_time\n workoutForm.workoutDurationHour = duration[0]\n workoutForm.workoutDurationMinutes = duration[1]\n workoutForm.workoutDurationSeconds = duration[2]\n }\n }\n function formatPayload(payload: IWorkoutForm) {\n payload.title = workoutForm.title\n payload.distance = +workoutForm.workoutDistance\n payload.duration =\n +workoutForm.workoutDurationHour * 3600 +\n +workoutForm.workoutDurationMinutes * 60 +\n +workoutForm.workoutDurationSeconds\n payload.workout_date = `${workoutForm.workoutDate} ${workoutForm.workoutTime}`\n }\n function updateWorkout() {\n const payload: IWorkoutForm = {\n sport_id: +workoutForm.sport_id,\n notes: workoutForm.notes,\n }\n if (props.workout) {\n if (props.workout.with_gpx) {\n payload.title = workoutForm.title\n } else {\n formatPayload(payload)\n }\n store.dispatch(WORKOUTS_STORE.ACTIONS.EDIT_WORKOUT, {\n workoutId: props.workout.id,\n data: payload,\n })\n } else {\n if (withGpx.value) {\n if (!gpxFile) {\n const errorMessage = 'workouts.NO_FILE_PROVIDED'\n store.commit(\n ROOT_STORE.MUTATIONS.SET_ERROR_MESSAGES,\n errorMessage\n )\n return\n }\n payload.file = gpxFile\n store.dispatch(WORKOUTS_STORE.ACTIONS.ADD_WORKOUT, payload)\n } else {\n formatPayload(payload)\n store.dispatch(\n WORKOUTS_STORE.ACTIONS.ADD_WORKOUT_WITHOUT_GPX,\n payload\n )\n }\n }\n }\n function onCancel() {\n if (props.workout) {\n router.push({\n name: 'Workout',\n params: { workoutId: props.workout.id },\n })\n } else {\n router.go(-1)\n }\n }\n\n watch(\n () => props.workout,\n async (\n newWorkout: IWorkout | undefined,\n previousWorkout: IWorkout | undefined\n ) => {\n if (newWorkout !== previousWorkout && newWorkout && newWorkout.id) {\n formatWorkoutForm(newWorkout)\n }\n }\n )\n\n onUnmounted(() => store.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES))\n\n return {\n appConfig,\n errorMessages,\n fileSizeLimit,\n gpx_limit_import,\n translatedSports,\n withGpx,\n zipSizeLimit,\n workoutDataObject: workoutForm,\n onCancel,\n updateFile,\n updateNotes,\n updateWithGpx,\n updateWorkout,\n }\n },\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @import '~@/scss/base';\n\n #workout-edition {\n @media screen and (max-width: $small-limit) {\n &.center-form {\n margin: 50px auto;\n }\n }\n\n ::v-deep(.card) {\n .card-title {\n text-align: center;\n text-transform: uppercase;\n }\n\n .card-content {\n @media screen and (max-width: $medium-limit) {\n padding: $default-padding 0;\n }\n\n #workout-form {\n .form-items {\n display: flex;\n flex-direction: column;\n\n input {\n height: 20px;\n }\n\n .workout-date-duration {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n\n @media screen and (max-width: $medium-limit) {\n flex-direction: column;\n }\n }\n\n .form-item {\n display: flex;\n flex-direction: column;\n padding: $default-padding;\n\n .workout-date-time {\n display: flex;\n #workout-date {\n margin-right: $default-margin;\n }\n }\n\n .workout-duration {\n width: 25px;\n }\n }\n\n .form-item-radio {\n display: flex;\n justify-content: space-around;\n label {\n font-weight: normal;\n @media screen and (max-width: $medium-limit) {\n font-size: 0.9em;\n }\n }\n input {\n margin-top: -2px;\n vertical-align: middle;\n }\n }\n }\n\n .form-buttons {\n display: flex;\n justify-content: flex-end;\n button {\n margin: $default-padding * 0.5;\n }\n }\n\n .files-help {\n display: flex;\n justify-content: space-around;\n margin-top: $default-margin;\n div {\n display: flex;\n @media screen and (max-width: $medium-limit) {\n flex-direction: column;\n }\n ul {\n margin: 0;\n padding: 0 $default-padding * 2;\n }\n }\n }\n }\n }\n }\n }\n</style>\n","\n import {\n ComputedRef,\n PropType,\n defineComponent,\n computed,\n reactive,\n ref,\n watch,\n onMounted,\n onUnmounted,\n } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useRouter } from 'vue-router'\n\n import { ROOT_STORE, WORKOUTS_STORE } from '@/store/constants'\n import { TAppConfig } from '@/types/application'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkout, IWorkoutForm } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n import { formatWorkoutDate, getDateWithTZ } from '@/utils/dates'\n import { getReadableFileSize } from '@/utils/files'\n import { translateSports } from '@/utils/sports'\n\n export default defineComponent({\n name: 'WorkoutEdition',\n props: {\n authUser: {\n type: Object as PropType<IUserProfile>,\n required: true,\n },\n isCreation: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n sports: {\n type: Object as PropType<ISport[]>,\n required: true,\n },\n workout: {\n type: Object as PropType<IWorkout>,\n required: false,\n },\n },\n setup(props) {\n const { t } = useI18n()\n const store = useStore()\n const router = useRouter()\n\n onMounted(() => {\n if (props.workout && props.workout.id) {\n formatWorkoutForm(props.workout)\n }\n })\n\n const translatedSports: ComputedRef<ISport[]> = computed(() =>\n translateSports(props.sports, t)\n )\n const appConfig: ComputedRef<TAppConfig> = computed(\n () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n )\n const fileSizeLimit = appConfig.value.max_single_file_size\n ? getReadableFileSize(appConfig.value.max_single_file_size)\n : ''\n const gpx_limit_import = appConfig.value.gpx_limit_import\n const zipSizeLimit = appConfig.value.max_zip_file_size\n ? getReadableFileSize(appConfig.value.max_zip_file_size)\n : ''\n const errorMessages: ComputedRef<string | string[] | null> = computed(\n () => store.getters[ROOT_STORE.GETTERS.ERROR_MESSAGES]\n )\n const workoutForm = reactive({\n sport_id: '',\n title: '',\n notes: '',\n workoutDate: '',\n workoutTime: '',\n workoutDurationHour: '',\n workoutDurationMinutes: '',\n workoutDurationSeconds: '',\n workoutDistance: '',\n })\n let withGpx = ref(\n props.workout ? props.workout.with_gpx : props.isCreation\n )\n let gpxFile: File | null = null\n\n function updateNotes(value: string) {\n workoutForm.notes = value\n }\n function updateWithGpx() {\n withGpx.value = !withGpx.value\n }\n function updateFile(event: Event & { target: HTMLInputElement }) {\n if (event.target.files) {\n gpxFile = event.target.files[0]\n }\n }\n function formatWorkoutForm(workout: IWorkout) {\n workoutForm.sport_id = `${workout.sport_id}`\n workoutForm.title = workout.title\n workoutForm.notes = workout.notes\n if (!workout.with_gpx) {\n const workoutDateTime = formatWorkoutDate(\n getDateWithTZ(workout.workout_date, props.authUser.timezone),\n 'yyyy-MM-dd'\n )\n const duration = workout.duration.split(':')\n workoutForm.workoutDistance = `${workout.distance}`\n workoutForm.workoutDate = workoutDateTime.workout_date\n workoutForm.workoutTime = workoutDateTime.workout_time\n workoutForm.workoutDurationHour = duration[0]\n workoutForm.workoutDurationMinutes = duration[1]\n workoutForm.workoutDurationSeconds = duration[2]\n }\n }\n function formatPayload(payload: IWorkoutForm) {\n payload.title = workoutForm.title\n payload.distance = +workoutForm.workoutDistance\n payload.duration =\n +workoutForm.workoutDurationHour * 3600 +\n +workoutForm.workoutDurationMinutes * 60 +\n +workoutForm.workoutDurationSeconds\n payload.workout_date = `${workoutForm.workoutDate} ${workoutForm.workoutTime}`\n }\n function updateWorkout() {\n const payload: IWorkoutForm = {\n sport_id: +workoutForm.sport_id,\n notes: workoutForm.notes,\n }\n if (props.workout) {\n if (props.workout.with_gpx) {\n payload.title = workoutForm.title\n } else {\n formatPayload(payload)\n }\n store.dispatch(WORKOUTS_STORE.ACTIONS.EDIT_WORKOUT, {\n workoutId: props.workout.id,\n data: payload,\n })\n } else {\n if (withGpx.value) {\n if (!gpxFile) {\n const errorMessage = 'workouts.NO_FILE_PROVIDED'\n store.commit(\n ROOT_STORE.MUTATIONS.SET_ERROR_MESSAGES,\n errorMessage\n )\n return\n }\n payload.file = gpxFile\n store.dispatch(WORKOUTS_STORE.ACTIONS.ADD_WORKOUT, payload)\n } else {\n formatPayload(payload)\n store.dispatch(\n WORKOUTS_STORE.ACTIONS.ADD_WORKOUT_WITHOUT_GPX,\n payload\n )\n }\n }\n }\n function onCancel() {\n if (props.workout) {\n router.push({\n name: 'Workout',\n params: { workoutId: props.workout.id },\n })\n } else {\n router.go(-1)\n }\n }\n\n watch(\n () => props.workout,\n async (\n newWorkout: IWorkout | undefined,\n previousWorkout: IWorkout | undefined\n ) => {\n if (newWorkout !== previousWorkout && newWorkout && newWorkout.id) {\n formatWorkoutForm(newWorkout)\n }\n }\n )\n\n onUnmounted(() => store.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES))\n\n return {\n appConfig,\n errorMessages,\n fileSizeLimit,\n gpx_limit_import,\n translatedSports,\n withGpx,\n zipSizeLimit,\n workoutDataObject: workoutForm,\n onCancel,\n updateFile,\n updateNotes,\n updateWithGpx,\n updateWorkout,\n }\n },\n })\n","import { render } from \"./WorkoutEdition.vue?vue&type=template&id=8eb73dd0&scoped=true\"\nimport script from \"./WorkoutEdition.vue?vue&type=script&lang=ts\"\nexport * from \"./WorkoutEdition.vue?vue&type=script&lang=ts\"\n\nimport \"./WorkoutEdition.vue?vue&type=style&index=0&id=8eb73dd0&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-8eb73dd0\"\n\nexport default script","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutSegments.vue?vue&type=style&index=0&id=5c40d110&lang=scss&scoped=true\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutWeather.vue?vue&type=style&index=0&id=7eb41918&lang=scss&scoped=true\"","<template>\n <div id=\"add-workout\" class=\"view\">\n <div class=\"container\">\n <WorkoutEdition\n :authUser=\"authUser\"\n :sports=\"sports\"\n :isCreation=\"true\"\n :loading=\"workoutData.loading\"\n />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { computed, defineComponent, ComputedRef } from 'vue'\n\n import WorkoutEdition from '@/components/Workout/WorkoutEdition.vue'\n import {\n AUTH_USER_STORE,\n SPORTS_STORE,\n WORKOUTS_STORE,\n } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkoutData } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n\n export default defineComponent({\n name: 'AddWorkout',\n components: {\n WorkoutEdition,\n },\n setup() {\n const store = useStore()\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const workoutData: ComputedRef<IWorkoutData> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUT_DATA]\n )\n return { authUser, sports, workoutData }\n },\n })\n</script>\n","\n import { computed, defineComponent, ComputedRef } from 'vue'\n\n import WorkoutEdition from '@/components/Workout/WorkoutEdition.vue'\n import {\n AUTH_USER_STORE,\n SPORTS_STORE,\n WORKOUTS_STORE,\n } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkoutData } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n\n export default defineComponent({\n name: 'AddWorkout',\n components: {\n WorkoutEdition,\n },\n setup() {\n const store = useStore()\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const workoutData: ComputedRef<IWorkoutData> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUT_DATA]\n )\n return { authUser, sports, workoutData }\n },\n })\n","import { render } from \"./AddWorkout.vue?vue&type=template&id=725b1388\"\nimport script from \"./AddWorkout.vue?vue&type=script&lang=ts\"\nexport * from \"./AddWorkout.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./Workout.vue?vue&type=style&index=0&id=05bdbd04&lang=scss&scoped=true\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutsList.vue?vue&type=style&index=0&id=977fe558&lang=scss&scoped=true\"","<template>\n <div id=\"edit-workout\" class=\"view\">\n <div class=\"container\">\n <WorkoutEdition\n :authUser=\"authUser\"\n :sports=\"sports\"\n :workout=\"workoutData.workout\"\n :loading=\"workoutData.loading\"\n />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n import {\n computed,\n defineComponent,\n watch,\n onBeforeMount,\n ComputedRef,\n } from 'vue'\n import { useRoute } from 'vue-router'\n\n import WorkoutEdition from '@/components/Workout/WorkoutEdition.vue'\n import {\n AUTH_USER_STORE,\n SPORTS_STORE,\n WORKOUTS_STORE,\n } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkoutData } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n\n export default defineComponent({\n name: 'EditWorkout',\n components: {\n WorkoutEdition,\n },\n setup() {\n const route = useRoute()\n const store = useStore()\n\n onBeforeMount(() => {\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, {\n workoutId: route.params.workoutId,\n })\n })\n\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n const workoutData: ComputedRef<IWorkoutData> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUT_DATA]\n )\n\n watch(\n () => route.params.workoutId,\n async (newWorkoutId) => {\n if (!newWorkoutId) {\n store.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_WORKOUT)\n }\n }\n )\n\n return { authUser, sports, workoutData }\n },\n })\n</script>\n","\n import {\n computed,\n defineComponent,\n watch,\n onBeforeMount,\n ComputedRef,\n } from 'vue'\n import { useRoute } from 'vue-router'\n\n import WorkoutEdition from '@/components/Workout/WorkoutEdition.vue'\n import {\n AUTH_USER_STORE,\n SPORTS_STORE,\n WORKOUTS_STORE,\n } from '@/store/constants'\n import { ISport } from '@/types/sports'\n import { IUserProfile } from '@/types/user'\n import { IWorkoutData } from '@/types/workouts'\n import { useStore } from '@/use/useStore'\n\n export default defineComponent({\n name: 'EditWorkout',\n components: {\n WorkoutEdition,\n },\n setup() {\n const route = useRoute()\n const store = useStore()\n\n onBeforeMount(() => {\n store.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, {\n workoutId: route.params.workoutId,\n })\n })\n\n const authUser: ComputedRef<IUserProfile> = computed(\n () => store.getters[AUTH_USER_STORE.GETTERS.AUTH_USER_PROFILE]\n )\n const sports: ComputedRef<ISport[]> = computed(\n () => store.getters[SPORTS_STORE.GETTERS.SPORTS]\n )\n const workoutData: ComputedRef<IWorkoutData> = computed(\n () => store.getters[WORKOUTS_STORE.GETTERS.WORKOUT_DATA]\n )\n\n watch(\n () => route.params.workoutId,\n async (newWorkoutId) => {\n if (!newWorkoutId) {\n store.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_WORKOUT)\n }\n }\n )\n\n return { authUser, sports, workoutData }\n },\n })\n","import { render } from \"./EditWorkout.vue?vue&type=template&id=e7ec5396\"\nimport script from \"./EditWorkout.vue?vue&type=script&lang=ts\"\nexport * from \"./EditWorkout.vue?vue&type=script&lang=ts\"\nscript.render = render\n\nexport default script","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutEdition.vue?vue&type=style&index=0&id=8eb73dd0&lang=scss&scoped=true\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutRecord.vue?vue&type=style&index=0&id=da96984c&lang=scss&scoped=true\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./WorkoutData.vue?vue&type=style&index=0&id=45a7f031&lang=scss&scoped=true\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./index.vue?vue&type=style&index=0&id=a17554ea&lang=scss&scoped=true\"","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).toGeoJSON={})}(this,(function(e){\"use strict\";function t(e){return e&&e.normalize&&e.normalize(),e&&e.textContent||\"\"}function n(e,t){const n=e.getElementsByTagName(t);return n.length?n[0]:null}function o(e){const o={};if(e){const s=n(e,\"line\");if(s){const e=t(n(s,\"color\")),r=parseFloat(t(n(s,\"opacity\"))),i=parseFloat(t(n(s,\"width\")));e&&(o.stroke=e),isNaN(r)||(o[\"stroke-opacity\"]=r),isNaN(i)||(o[\"stroke-width\"]=96*i/25.4)}}return o}function s(e,o){const s={};let r,i;for(i=0;i<o.length;i++)r=n(e,o[i]),r&&(s[o[i]]=t(r));return s}function r(e){const n=s(e,[\"name\",\"cmt\",\"desc\",\"type\",\"time\",\"keywords\"]),o=e.getElementsByTagNameNS(\"http://www.garmin.com/xmlschemas/GpxExtensions/v3\",\"*\");for(let s=0;s<o.length;s++){const r=o[s];r.parentNode.parentNode===e&&(n[r.tagName.replace(\":\",\"_\")]=t(r))}const r=e.getElementsByTagName(\"link\");r.length&&(n.links=[]);for(let e=0;e<r.length;e++)n.links.push(Object.assign({href:r[e].getAttribute(\"href\")},s(r[e],[\"text\",\"type\"])));return n}function i(e){const o=[parseFloat(e.getAttribute(\"lon\")),parseFloat(e.getAttribute(\"lat\"))],s=n(e,\"ele\"),r=n(e,\"gpxtpx:hr\")||n(e,\"hr\"),i=n(e,\"time\");let l;s&&(l=parseFloat(t(s)),isNaN(l)||o.push(l));const a={coordinates:o,time:i?t(i):null,extendedValues:[]};r&&a.extendedValues.push([\"heart\",parseFloat(t(r))]);const c=n(e,\"extensions\");if(null!==c)for(const e of[\"speed\",\"course\",\"hAcc\",\"vAcc\"]){const o=parseFloat(t(n(c,e)));isNaN(o)||a.extendedValues.push([e,o])}return a}function l(e){const t=a(e,\"rtept\");if(t)return{type:\"Feature\",properties:Object.assign(r(e),o(n(e,\"extensions\")),{_gpxType:\"rte\"}),geometry:{type:\"LineString\",coordinates:t.line}}}function a(e,t){const n=e.getElementsByTagName(t);if(n.length<2)return;const o=[],s=[],r={};for(let e=0;e<n.length;e++){const t=i(n[e]);o.push(t.coordinates),t.time&&s.push(t.time);for(let o=0;o<t.extendedValues.length;o++){const[s,i]=t.extendedValues[o],l=\"heart\"===s?s:s+\"s\";r[l]||(r[l]=Array(n.length).fill(null)),r[l][e]=i}}return{line:o,times:s,extendedValues:r}}function c(e){const t=e.getElementsByTagName(\"trkseg\"),s=[],i=[],l=[];for(let e=0;e<t.length;e++){const n=a(t[e],\"trkpt\");n&&(l.push(n),n.times&&n.times.length&&i.push(n.times))}if(0===l.length)return;const c=l.length>1,g=Object.assign(r(e),o(n(e,\"extensions\")),{_gpxType:\"trk\"},i.length?{coordinateProperties:{times:c?i:i[0]}}:{});for(let e=0;e<l.length;e++){const t=l[e];s.push(t.line);for(const[n,o]of Object.entries(t.extendedValues)){let t=g;\"heart\"===n&&(g.coordinateProperties||(g.coordinateProperties={}),t=g.coordinateProperties),c?(t[n]||(t[n]=l.map((e=>new Array(e.line.length).fill(null)))),t[n][e]=o):t[n]=o}}return{type:\"Feature\",properties:g,geometry:c?{type:\"MultiLineString\",coordinates:s}:{type:\"LineString\",coordinates:s[0]}}}function*g(e){const t=e.getElementsByTagName(\"trk\"),n=e.getElementsByTagName(\"rte\"),o=e.getElementsByTagName(\"wpt\");for(let e=0;e<t.length;e++){const n=c(t[e]);n&&(yield n)}for(let e=0;e<n.length;e++){const t=l(n[e]);t&&(yield t)}for(let e=0;e<o.length;e++)yield(a=o[e],{type:\"Feature\",properties:Object.assign(r(a),s(a,[\"sym\"])),geometry:{type:\"Point\",coordinates:i(a).coordinates}});var a}const u=[[\"heartRate\",\"heartRates\"],[\"Cadence\",\"cadences\"],[\"Speed\",\"speeds\"],[\"Watts\",\"watts\"]],m=[[\"TotalTimeSeconds\",\"totalTimeSeconds\"],[\"DistanceMeters\",\"distanceMeters\"],[\"MaximumSpeed\",\"maxSpeed\"],[\"AverageHeartRateBpm\",\"avgHeartRate\"],[\"MaximumHeartRateBpm\",\"maxHeartRate\"],[\"AvgSpeed\",\"avgSpeed\"],[\"AvgWatts\",\"avgWatts\"],[\"MaxWatts\",\"maxWatts\"]];function p(e,o){const s=[];for(const[r,i]of o){let o=n(e,r);if(!o){const t=e.getElementsByTagNameNS(\"http://www.garmin.com/xmlschemas/ActivityExtension/v2\",r);t.length&&(o=t[0])}const l=parseFloat(t(o));isNaN(l)||s.push([i,l])}return s}function h(e){const o=t(n(e,\"LongitudeDegrees\")),s=t(n(e,\"LatitudeDegrees\"));if(!o.length||!s.length)return null;const r=[parseFloat(o),parseFloat(s)],i=n(e,\"AltitudeMeters\"),l=n(e,\"HeartRateBpm\"),a=n(e,\"Time\");let c;return i&&(c=parseFloat(t(i)),isNaN(c)||r.push(c)),{coordinates:r,time:a?t(a):null,heartRate:l?parseFloat(t(l)):null,extensions:p(e,u)}}function f(e,t){const n=e.getElementsByTagName(t),o=[],s=[],r=[];if(n.length<2)return null;const i={extendedProperties:{}};for(let e=0;e<n.length;e++){const t=h(n[e]);if(null!==t){o.push(t.coordinates),t.time&&s.push(t.time),t.heartRate&&r.push(t.heartRate);for(const[o,s]of t.extensions)i.extendedProperties[o]||(i.extendedProperties[o]=Array(n.length).fill(null)),i.extendedProperties[o][e]=s}}return Object.assign(i,{line:o,times:s,heartRates:r})}function d(e){const o=e.getElementsByTagName(\"Track\"),s=[],r=[],i=[],l=[];let a;const c=function(e){const t={};for(const[n,o]of e)t[n]=o;return t}(p(e,m)),g=n(e,\"Name\");g&&(c.name=t(g));for(let e=0;e<o.length;e++)a=f(o[e],\"Trackpoint\"),a&&(s.push(a.line),a.times.length&&r.push(a.times),a.heartRates.length&&i.push(a.heartRates),l.push(a.extendedProperties));for(let e=0;e<l.length;e++){const t=l[e];for(const n in t)1===o.length?c[n]=a.extendedProperties[n]:(c[n]||(c[n]=s.map((e=>Array(e.length).fill(null)))),c[n][e]=t[n])}if(0!==s.length)return(r.length||i.length)&&(c.coordinateProperties=Object.assign(r.length?{times:1===s.length?r[0]:r}:{},i.length?{heart:1===s.length?i[0]:i}:{})),{type:\"Feature\",properties:c,geometry:{type:1===s.length?\"LineString\":\"MultiLineString\",coordinates:1===s.length?s[0]:s}}}function*y(e){const t=e.getElementsByTagName(\"Lap\");for(let e=0;e<t.length;e++){const n=d(t[e]);n&&(yield n)}const n=e.getElementsByTagName(\"Courses\");for(let e=0;e<n.length;e++){const t=d(n[e]);t&&(yield t)}}const N=/\\s*/g,x=/^\\s*|\\s*$/g,T=/\\s+/;function b(e){if(!e||!e.length)return 0;let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n)|0;return t}function S(e){return e.replace(N,\"\").split(\",\").map(parseFloat)}function k(e){return e.replace(x,\"\").split(T).map(S)}function A(e){if(void 0!==e.xml)return e.xml;if(e.tagName){let t=e.tagName;for(let n=0;n<e.attributes.length;n++)t+=e.attributes[n].name+e.attributes[n].value;for(let n=0;n<e.childNodes.length;n++)t+=A(e.childNodes[n]);return t}return\"#text\"===e.nodeName?(e.nodeValue||e.value||\"\").trim():\"#cdata-section\"===e.nodeName?e.nodeValue:\"\"}const B=[\"Polygon\",\"LineString\",\"Point\",\"Track\",\"gx:Track\"];function E(e,o,s){let r=t(n(o,\"color\"))||\"\";const i=\"stroke\"==s||\"fill\"===s?s:s+\"-color\";\"#\"===r.substr(0,1)&&(r=r.substr(1)),6===r.length||3===r.length?e[i]=r:8===r.length&&(e[s+\"-opacity\"]=parseInt(r.substr(0,2),16)/255,e[i]=\"#\"+r.substr(6,2)+r.substr(4,2)+r.substr(2,2))}function F(e,o,s,r){const i=parseFloat(t(n(o,s)));isNaN(i)||(e[r]=i)}function P(e){let n=e.getElementsByTagName(\"coord\");const o=[],s=[];0===n.length&&(n=e.getElementsByTagName(\"gx:coord\"));for(let e=0;e<n.length;e++)o.push(t(n[e]).split(\" \").map(parseFloat));const r=e.getElementsByTagName(\"when\");for(let e=0;e<r.length;e++)s.push(t(r[e]));return{coords:o,times:s}}function v(e){let o,s,r,i,l;const a=[],c=[];if(n(e,\"MultiGeometry\"))return v(n(e,\"MultiGeometry\"));if(n(e,\"MultiTrack\"))return v(n(e,\"MultiTrack\"));if(n(e,\"gx:MultiTrack\"))return v(n(e,\"gx:MultiTrack\"));for(r=0;r<B.length;r++)if(s=e.getElementsByTagName(B[r]),s)for(i=0;i<s.length;i++)if(o=s[i],\"Point\"===B[r])a.push({type:\"Point\",coordinates:S(t(n(o,\"coordinates\")))});else if(\"LineString\"===B[r])a.push({type:\"LineString\",coordinates:k(t(n(o,\"coordinates\")))});else if(\"Polygon\"===B[r]){const e=o.getElementsByTagName(\"LinearRing\"),s=[];for(l=0;l<e.length;l++)s.push(k(t(n(e[l],\"coordinates\"))));a.push({type:\"Polygon\",coordinates:s})}else if(\"Track\"===B[r]||\"gx:Track\"===B[r]){const e=P(o);a.push({type:\"LineString\",coordinates:e.coords}),e.times.length&&c.push(e.times)}return{geoms:a,coordTimes:c}}function L(e,o,s,r){const i=v(e);let l;const a={},c=t(n(e,\"name\")),g=t(n(e,\"address\"));let u=t(n(e,\"styleUrl\"));const m=t(n(e,\"description\")),p=n(e,\"TimeSpan\"),h=n(e,\"TimeStamp\"),f=n(e,\"ExtendedData\");let d=n(e,\"IconStyle\"),y=n(e,\"LabelStyle\"),N=n(e,\"LineStyle\"),x=n(e,\"PolyStyle\");const T=n(e,\"visibility\");if(c&&(a.name=c),g&&(a.address=g),u){\"#\"!==u[0]&&(u=\"#\"+u),a.styleUrl=u,o[u]&&(a.styleHash=o[u]),s[u]&&(a.styleMapHash=s[u],a.styleHash=o[s[u].normal]);const e=r[a.styleHash];e&&(d||(d=n(e,\"IconStyle\")),y||(y=n(e,\"LabelStyle\")),N||(N=n(e,\"LineStyle\")),x||(x=n(e,\"PolyStyle\")))}if(m&&(a.description=m),p){const e=t(n(p,\"begin\")),o=t(n(p,\"end\"));a.timespan={begin:e,end:o}}if(h&&(a.timestamp=t(n(h,\"when\"))),d){E(a,d,\"icon\"),F(a,d,\"scale\",\"icon-scale\"),F(a,d,\"heading\",\"icon-heading\");const e=n(d,\"hotSpot\");if(e){const t=parseFloat(e.getAttribute(\"x\")),n=parseFloat(e.getAttribute(\"y\"));isNaN(t)||isNaN(n)||(a[\"icon-offset\"]=[t,n])}const o=n(d,\"Icon\");if(o){const e=t(n(o,\"href\"));e&&(a.icon=e)}}if(y&&(E(a,y,\"label\"),F(a,y,\"scale\",\"label-scale\")),N&&(E(a,N,\"stroke\"),F(a,N,\"width\",\"stroke-width\")),x){E(a,x,\"fill\");const e=t(n(x,\"fill\")),o=t(n(x,\"outline\"));e&&(a[\"fill-opacity\"]=\"1\"===e?a[\"fill-opacity\"]||1:0),o&&(a[\"stroke-opacity\"]=\"1\"===o?a[\"stroke-opacity\"]||1:0)}if(f){const e=f.getElementsByTagName(\"Data\"),o=f.getElementsByTagName(\"SimpleData\");for(l=0;l<e.length;l++)a[e[l].getAttribute(\"name\")]=t(n(e[l],\"value\"));for(l=0;l<o.length;l++)a[o[l].getAttribute(\"name\")]=t(o[l])}T&&(a.visibility=t(T)),i.coordTimes.length&&(a.coordinateProperties={times:1===i.coordTimes.length?i.coordTimes[0]:i.coordTimes});const b={type:\"Feature\",geometry:0===i.geoms.length?null:1===i.geoms.length?i.geoms[0]:{type:\"GeometryCollection\",geometries:i.geoms},properties:a};return e.getAttribute(\"id\")&&(b.id=e.getAttribute(\"id\")),b}function*M(e){const o={},s={},r={},i=e.getElementsByTagName(\"Placemark\"),l=e.getElementsByTagName(\"Style\"),a=e.getElementsByTagName(\"StyleMap\");for(let e=0;e<l.length;e++){const t=b(A(l[e])).toString(16);o[\"#\"+l[e].getAttribute(\"id\")]=t,s[t]=l[e]}for(let e=0;e<a.length;e++){o[\"#\"+a[e].getAttribute(\"id\")]=b(A(a[e])).toString(16);const s=a[e].getElementsByTagName(\"Pair\"),i={};for(let e=0;e<s.length;e++)i[t(n(s[e],\"key\"))]=t(n(s[e],\"styleUrl\"));r[\"#\"+a[e].getAttribute(\"id\")]=i}for(let e=0;e<i.length;e++){const t=L(i[e],o,r,s);t&&(yield t)}}e.gpx=function(e){return{type:\"FeatureCollection\",features:Array.from(g(e))}},e.gpxGen=g,e.kml=function(e){return{type:\"FeatureCollection\",features:Array.from(M(e))}},e.kmlGen=M,e.tcx=function(e){return{type:\"FeatureCollection\",features:Array.from(y(e))}},e.tcxGen=y,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n//# sourceMappingURL=togeojson.umd.js.map\n"],"sourceRoot":""} |