opnform/resources/js/components/forms/RatingInput.vue

86 lines
2.1 KiB
Vue
Raw Normal View History

2022-09-20 19:59:52 +00:00
<template>
2023-11-28 08:24:57 +00:00
<input-wrapper
2023-12-01 20:24:38 +00:00
v-bind="inputWrapperProps"
2023-11-28 08:24:57 +00:00
>
<template #label>
<slot name="label" />
</template>
2022-09-20 19:59:52 +00:00
<div class="stars-outer">
<div v-for="i in numberOfStars" :key="i"
2023-08-28 11:17:22 +00:00
class="cursor-pointer inline-block text-gray-200 dark:text-gray-800"
:class="{'!text-yellow-400 active-star':i<=compVal, '!text-yellow-200 !dark:text-yellow-800 hover-star':i>compVal && i<=hoverRating, '!cursor-not-allowed':disabled}"
2022-09-20 19:59:52 +00:00
role="button" @click="setRating(i)"
2023-08-28 11:17:22 +00:00
@mouseenter="onMouseHover(i)"
@mouseleave="hoverRating = -1"
2022-09-20 19:59:52 +00:00
>
<svg class="w-8 h-8" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path
d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"
/>
</svg>
</div>
</div>
2023-11-28 08:24:57 +00:00
<template #help>
<slot name="help" />
</template>
<template #error>
<slot name="error" />
</template>
</input-wrapper>
2022-09-20 19:59:52 +00:00
</template>
<script>
2023-11-28 08:24:57 +00:00
import { inputProps, useFormInput } from './useFormInput.js'
import InputWrapper from './components/InputWrapper.vue'
2022-09-20 19:59:52 +00:00
export default {
name: 'RatingInput',
2023-11-28 08:24:57 +00:00
components: { InputWrapper },
2022-09-20 19:59:52 +00:00
props: {
2023-11-28 08:24:57 +00:00
...inputProps,
2022-09-20 19:59:52 +00:00
numberOfStars: { type: Number, default: 5 }
},
2023-11-28 08:24:57 +00:00
setup (props, context) {
return {
2023-12-01 20:24:38 +00:00
...useFormInput(props, context)
2023-11-28 08:24:57 +00:00
}
},
2022-09-20 19:59:52 +00:00
data () {
return {
2023-08-28 11:17:22 +00:00
hoverRating: -1
2022-09-20 19:59:52 +00:00
}
},
2023-08-28 11:17:22 +00:00
mounted () {
if (!this.compVal) this.compVal = 0
},
2022-09-20 19:59:52 +00:00
updated () {
2023-08-28 11:17:22 +00:00
if (!this.compVal) {
2022-09-20 19:59:52 +00:00
this.compVal = 0
}
},
methods: {
2023-08-28 11:17:22 +00:00
onMouseHover (i) {
this.hoverRating = (this.disabled) ? -1 : i
},
2022-09-20 19:59:52 +00:00
setRating (val) {
2023-08-28 11:17:22 +00:00
if (this.disabled) {
return
}
2022-09-20 19:59:52 +00:00
if (this.compVal === val) {
this.compVal = 0
} else {
this.compVal = val
}
}
}
}
</script>