1
+ <template >
2
+ <div v-if =" isVisible && props.visible"
3
+ class =" k-level-slider flex items-baseline justify-center bg-white q-px-sm q-py-md" >
4
+ <q-slider v-if =" dataArray" snap class =" text-primary" v-model =" sliderVal" :vertical =" props.vertical"
5
+ :reverse =" props.reverse ?? props.vertical" :height =" 150" :width =" 4" :markers =" props.markers" :label-always =" false"
6
+ :max =" dataArray.length - 1" label :label-value =" getFormatedLevel(dataArray[sliderVal])"
7
+ :switch-label-side =" props.switchLabelSide ?? props.vertical" @change =" onLevelChanged" />
8
+ <q-slider v-else class =" text-primary" :model-value =" sliderVal" :vertical =" props.vertical"
9
+ :reverse =" props.reverse ?? props.vertical" :height =" 150" :width =" 4" :markers =" props.markers" :label-always =" false"
10
+ :min =" sliderMinValue" :max =" sliderMaxValue" :step =" sliderInterval" label
11
+ :label-value =" getFormatedLevel(sliderVal)" :switch-label-side =" props.switchLabelSide ?? props.vertical"
12
+ @change =" onLevelChanged" @update:model-value =" val => sliderVal = val" />
13
+ <p class =" text-accent text-caption no-margin"
14
+ style =" writing-mode : vertical-lr ; transform-origin : center ; transform : rotate (180deg );" >
15
+ <b >{{ $t(CurrentActivity.selectableLevels.label) }} - {{ getFormatedLevel(CurrentActivity.selectedLevel) }}</b >
16
+ </p >
17
+ </div >
18
+ </template >
19
+
20
+ <script setup>
21
+ import { computed , ref } from ' vue'
22
+ import { useCurrentActivity } from ' ../../../../core/client/composables'
23
+
24
+ // ==PROPS==
25
+ const props = defineProps ({
26
+ vertical: {
27
+ type: Boolean ,
28
+ default: false
29
+ },
30
+ reverse: {
31
+ type: Boolean ,
32
+ default: null
33
+ },
34
+ visible: {
35
+ type: Boolean ,
36
+ default: true
37
+ },
38
+ switchLabelSide: {
39
+ type: Boolean ,
40
+ default: null
41
+ },
42
+ markers: {
43
+ type: Boolean ,
44
+ default: true
45
+ }
46
+ })
47
+
48
+ // ==REFS==
49
+ const sliderVal = ref (0 )
50
+
51
+ // ==MISC HOOKS==
52
+ const { CurrentActivity } = useCurrentActivity ()
53
+
54
+ // ==COMPUTED==
55
+ const isVisible = computed (() => sliderValues .value ? sliderValues .value .length > 0 : (sliderMinValue .value !== undefined && sliderMaxValue .value !== undefined ))
56
+ // const isLazy = computed(() => _.get(CurrentActivity.value.selectableLevels, 'lazy', true))
57
+ const sliderValues = computed (() => _ .get (CurrentActivity .value .selectableLevels , ' values' ))
58
+ const dataArray = computed (() => sliderValues .value ? [... sliderValues .value ].sort ((a , b ) => a - b) : null )
59
+ const sliderMinValue = computed (() => _ .get (CurrentActivity .value .selectableLevels , ' range.min' ))
60
+ const sliderMaxValue = computed (() => _ .get (CurrentActivity .value .selectableLevels , ' range.max' ))
61
+ const sliderInterval = computed (() => _ .get (CurrentActivity .value .selectableLevels , ' range.interval' , 1 ))
62
+
63
+ // ==MISC FUNCTIONS==
64
+ function onLevelChanged (level ) {
65
+ if (dataArray .value ) {
66
+ CurrentActivity .value .setSelectedLevel (dataArray .value [level])
67
+ } else {
68
+ CurrentActivity .value .setSelectedLevel (level)
69
+ }
70
+ }
71
+ function getFormatedLevel (level ) {
72
+ const unit = _ .get (CurrentActivity .value .selectableLevels , ' unit' )
73
+ return ` ${ level || CurrentActivity .value .selectedLevel } ${ unit} `
74
+ }
75
+ </script >
76
+
77
+ <style >
78
+ .k-level-slider {
79
+ border : 1px solid lightgrey ;
80
+ }
81
+ </style >
0 commit comments