Skip to content

Commit e5bc311

Browse files
committed
feat: new sticky KLevelSlider component, updated the old one to Vue3 with Quasar
1 parent 730c542 commit e5bc311

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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

Comments
 (0)