2022-09-20 19:59:52 +00:00
|
|
|
<template>
|
|
|
|
<div :class="wrapperClass" :style="inputStyle">
|
|
|
|
<label v-if="label" :for="id?id:name"
|
|
|
|
:class="[theme.default.label,{'uppercase text-xs':uppercaseLabels, 'text-sm':!uppercaseLabels}]"
|
|
|
|
>
|
|
|
|
{{ label }}
|
|
|
|
<span v-if="required" class="text-red-500 required-dot">*</span>
|
|
|
|
</label>
|
2023-04-19 08:13:50 +00:00
|
|
|
<small v-if="help && helpPosition=='above_input'" :class="theme.default.help" class="flex mb-1">
|
|
|
|
<slot name="help"><span class="field-help" v-html="help" /></slot>
|
|
|
|
</small>
|
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-04-19 08:13:50 +00:00
|
|
|
<small v-if="help && helpPosition=='below_input'" :class="theme.default.help">
|
|
|
|
<slot name="help"><span class="field-help" v-html="help" /></slot>
|
2022-09-20 19:59:52 +00:00
|
|
|
</small>
|
|
|
|
<has-error v-if="hasValidation" :form="form" :field="name" />
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
2023-01-21 11:57:37 +00:00
|
|
|
import inputMixin from '~/mixins/forms/input.js'
|
2022-09-20 19:59:52 +00:00
|
|
|
|
|
|
|
export default {
|
|
|
|
name: 'RatingInput',
|
|
|
|
|
|
|
|
mixins: [inputMixin],
|
|
|
|
|
|
|
|
props: {
|
|
|
|
numberOfStars: { type: Number, default: 5 }
|
|
|
|
},
|
|
|
|
|
|
|
|
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) {
|
2023-03-22 14:49:52 +00:00
|
|
|
return
|
|
|
|
}
|
2022-09-20 19:59:52 +00:00
|
|
|
if (this.compVal === val) {
|
|
|
|
this.compVal = 0
|
|
|
|
} else {
|
|
|
|
this.compVal = val
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|