RaceCalculator.vue (2655B)
1 <template> 2 <div class="calculator"> 3 <h2>Input Race Result</h2> 4 <div class="input"> 5 <pace-input v-model="raceOptions.input" label="Input race"/> 6 </div> 7 8 <details> 9 <summary> 10 <h2>Race Statistics</h2> 11 </summary> 12 <div> 13 Purdy points: <b>{{ formatNumber(raceStats.purdyPoints, 0, 1, true) }}</b> 14 </div> 15 <div> 16 V̇O₂: <b>{{ formatNumber(raceStats.vo2, 0, 1, true) }}</b> ml/kg/min 17 (<b>{{ formatNumber(raceStats.vo2MaxPercentage, 0, 1, true) }}%</b> of max) 18 </div> 19 <div> 20 V̇O₂ Max: <b>{{ formatNumber(raceStats.vo2Max, 0, 1, true) }}</b> 21 ml/kg/min 22 </div> 23 </details> 24 25 <details> 26 <summary> 27 <h2>Advanced Options</h2> 28 </summary> 29 <advanced-options-input v-model:globalOptions="globalOptions" 30 v-model:options="raceOptions" v-model:targetSets="targetSets" :type="Calculators.Race"/> 31 </details> 32 33 <h2>Equivalent Race Results</h2> 34 <single-output-table class="output" show-pace :calculate-result="x => 35 calculateRaceResults(raceOptions.input, x, globalOptions.racePredictionOptions, 36 globalOptions.defaultUnitSystem, true)" 37 :targets="targetSets[raceOptions.selectedTargetSet] ? 38 targetSets[raceOptions.selectedTargetSet].targets : []"/> 39 </div> 40 </template> 41 42 <script setup lang="ts"> 43 import { computed } from 'vue'; 44 45 import { Calculators, calculateRaceResults, calculateRaceStats, defaultGlobalOptions, 46 defaultRaceOptions } from '@/core/calculators'; 47 import type { GlobalOptions, RaceOptions, RaceStats } from '@/core/calculators'; 48 import { defaultRaceTargetSets } from '@/core/targets'; 49 import type { StandardTargetSets } from '@/core/targets'; 50 import { formatNumber } from '@/core/units'; 51 52 import AdvancedOptionsInput from '@/components/AdvancedOptionsInput.vue'; 53 import PaceInput from '@/components/PaceInput.vue'; 54 import SingleOutputTable from '@/components/SingleOutputTable.vue'; 55 56 import useStorage from '@/composables/useStorage'; 57 58 /* 59 * The global options 60 */ 61 const globalOptions = useStorage<GlobalOptions>('global-options', defaultGlobalOptions); 62 63 /* 64 * The race calculator options 65 */ 66 const raceOptions = useStorage<RaceOptions>('race-calculator-options', defaultRaceOptions); 67 68 /* 69 * The race calculator target sets 70 */ 71 const targetSets = useStorage<StandardTargetSets>('race-calculator-target-sets', 72 defaultRaceTargetSets); 73 74 /* 75 * The statistics for the current input race 76 */ 77 const raceStats = computed<RaceStats>(() => calculateRaceStats(raceOptions.value.input)); 78 </script> 79 80 <style scoped> 81 @import '@/assets/target-calculator.css'; 82 </style>