AdvancedOptionsInput.vue (4084B)
1 <template> 2 <div> 3 Default units: 4 <select v-model="globalOptions.defaultUnitSystem" aria-label="Default units"> 5 <option value="imperial">Miles</option> 6 <option value="metric">Kilometers</option> 7 </select> 8 </div> 9 10 <div> 11 Target set: 12 <target-set-selector :setType="props.type" 13 :default-unit-system="globalOptions.defaultUnitSystem" 14 v-model:selected-target-set="options.selectedTargetSet" v-model:target-sets="targetSets" 15 :customWorkoutNames="props.type === Calculators.Workout ? 16 (options as WorkoutOptions).customTargetNames : false"/> 17 </div> 18 19 <div v-if="props.type === Calculators.Workout"> 20 Workout name customization: 21 <select v-model="(options as WorkoutOptions).customTargetNames" 22 aria-label="Workout name customization"> 23 <option :value="false">Disabled</option> 24 <option :value="true">Enabled</option> 25 </select> 26 </div> 27 28 <div v-if="batchOptions && props.type === Calculators.Workout" 29 v-show="(options as WorkoutOptions).customTargetNames"> 30 Batch column label: 31 <input v-model="batchOptions.label" :placeholder="formatDistance(batchOptions.input, false)" 32 aria-label="Batch column label"/> 33 </div> 34 35 <div v-if="props.type === Calculators.Race || props.type === Calculators.Workout"> 36 Prediction model: 37 <select v-model="globalOptions.racePredictionOptions.model" 38 aria-label="Prediction model"> 39 <option :value="RacePredictionModels.AverageModel">Average</option> 40 <option :value="RacePredictionModels.PurdyPointsModel">Purdy Points Model</option> 41 <option :value="RacePredictionModels.VO2MaxModel">V̇O₂ Max Model</option> 42 <option :value="RacePredictionModels.CameronModel">Cameron's Model</option> 43 <option :value="RacePredictionModels.RiegelModel">Riegel's Model</option> 44 </select> 45 </div> 46 47 <div v-if="props.type === Calculators.Race || props.type === Calculators.Workout" 48 v-show="globalOptions.racePredictionOptions.model == RacePredictionModels.AverageModel 49 || globalOptions.racePredictionOptions.model == RacePredictionModels.RiegelModel"> 50 Riegel exponent: 51 <decimal-input v-model="globalOptions.racePredictionOptions.riegelExponent" 52 aria-label="Riegel exponent" :min="1" :max="1.3" :digits="2" :step="0.01"/> 53 (default: 1.06) 54 </div> 55 </template> 56 57 <script setup lang="ts"> 58 import { Calculators } from '@/core/calculators'; 59 import type { BatchOptions, GlobalOptions, PaceOptions, RaceOptions, SplitOptions, 60 WorkoutOptions } from '@/core/calculators'; 61 import { RacePredictionModels } from '@/core/racePrediction'; 62 import type { TargetSets } from '@/core/targets'; 63 import { formatDistance } from '@/core/units'; 64 65 import DecimalInput from '@/components/DecimalInput.vue'; 66 import TargetSetSelector from '@/components/TargetSetSelector.vue'; 67 68 import useObjectModel from '@/composables/useObjectModel'; 69 70 type CalculatorOptions = PaceOptions | RaceOptions | SplitOptions | WorkoutOptions; 71 72 const props = defineProps<{ 73 /* 74 * The batch calculator options (if applicable) 75 */ 76 batchOptions?: BatchOptions, 77 78 /* 79 * The global options 80 */ 81 globalOptions: GlobalOptions, 82 83 /* 84 * The calculator options 85 */ 86 options: CalculatorOptions, 87 88 /* 89 * The calculator type 90 */ 91 type: Calculators, 92 93 /* 94 * The calculator target sets 95 */ 96 targetSets: TargetSets, 97 }>(); 98 99 // Generate internal refs tied to batchOptions, globalOptions, options and targetSets props 100 const emit = defineEmits([ 101 'update:batchOptions', 'update:globalOptions', 'update:options', 'update:targetSets' 102 ]); 103 const batchOptions = useObjectModel<BatchOptions | undefined>(() => props.batchOptions, (x) => 104 emit('update:batchOptions', x)); 105 const globalOptions = useObjectModel<GlobalOptions>(() => props.globalOptions, (x) => 106 emit('update:globalOptions', x)); 107 const options = useObjectModel<CalculatorOptions>(() => props.options, (x) => 108 emit('update:options', x)); 109 const targetSets = useObjectModel<TargetSets>(() => props.targetSets, (x) => 110 emit('update:targetSets', x)); 111 </script>