adrema/resources/js/components/FSelect.vue

131 lines
3.5 KiB
Vue
Raw Normal View History

2021-04-10 19:45:11 +02:00
<template>
2021-08-22 16:15:16 +02:00
<label class="field-wrap" :for="id" :class="`field-wrap-${size}`">
<span v-if="label" class="field-label">
{{ label }}
<span v-show="required" class="text-red-800">&nbsp;*</span>
</span>
<div class="real-field-wrap" :class="`size-${size}`">
2022-08-23 23:49:19 +02:00
<select :disabled="disabled" :name="name" :value="value" @change="trigger">
2021-08-22 16:15:16 +02:00
<option v-if="placeholder" v-html="placeholder" :value="null"></option>
2021-04-10 19:45:11 +02:00
2022-05-17 00:04:00 +02:00
<option
v-for="option in parsedOptions"
:key="option.id"
v-html="option.name"
:value="option.id"
2021-08-22 16:15:16 +02:00
></option>
</select>
2021-08-22 16:49:38 +02:00
<div class="info-wrap">
2021-08-22 16:15:16 +02:00
<div v-if="hint" v-tooltip="hint">
2022-02-12 15:22:22 +01:00
<svg-sprite src="info-button" class="info-button"></svg-sprite>
2021-08-22 16:15:16 +02:00
</div>
<div class="px-1 relative" v-if="size != 'xs'">
2022-02-12 15:22:22 +01:00
<svg-sprite class="chevron w-3 h-3 fill-current" src="chevron-down"></svg-sprite>
2021-08-22 16:15:16 +02:00
</div>
<div class="px-1 relative" v-if="size == 'xs'">
2022-02-12 15:22:22 +01:00
<svg-sprite class="chevron w-2 h-2 fill-current" src="chevron-down"></svg-sprite>
2021-04-10 19:45:11 +02:00
</div>
</div>
</div>
</label>
</template>
<script>
2021-08-22 16:15:16 +02:00
import map from 'lodash/map';
2021-04-10 19:45:11 +02:00
export default {
props: {
2021-08-22 16:15:16 +02:00
disabled: {
type: Boolean,
2022-05-17 00:04:00 +02:00
default: function () {
return false;
},
2021-08-22 16:15:16 +02:00
},
2021-04-10 19:45:11 +02:00
id: {},
inset: {
type: Boolean,
2022-05-17 00:04:00 +02:00
default: false,
2021-04-10 19:45:11 +02:00
},
size: {
2022-05-17 00:04:00 +02:00
default: function () {
return 'base';
},
2021-04-10 19:45:11 +02:00
},
emptyLabel: {
default: false,
2022-05-17 00:04:00 +02:00
type: Boolean,
2021-04-10 19:45:11 +02:00
},
value: {
2022-05-17 00:04:00 +02:00
default: undefined,
2021-04-10 19:45:11 +02:00
},
label: {
2022-05-17 00:04:00 +02:00
default: null,
2021-04-10 19:45:11 +02:00
},
required: {
type: Boolean,
2022-05-17 00:04:00 +02:00
default: false,
2021-04-10 19:45:11 +02:00
},
placeholder: {
default: '--kein--',
2022-05-17 00:04:00 +02:00
type: String,
2021-04-10 19:45:11 +02:00
},
def: {
required: false,
type: Number,
2022-05-17 00:04:00 +02:00
default: -1,
2021-04-10 19:45:11 +02:00
},
2022-08-23 23:49:19 +02:00
name: {
required: true,
},
2021-04-10 19:45:11 +02:00
hint: {},
options: {
2022-05-17 00:04:00 +02:00
default: function () {
return [];
},
},
2021-04-10 19:45:11 +02:00
},
computed: {
parsedOptions() {
2021-08-22 16:15:16 +02:00
return Array.isArray(this.options)
? this.options
: map(this.options, (value, key) => {
2022-05-17 00:04:00 +02:00
return {name: value, id: key};
});
},
2021-04-10 19:45:11 +02:00
},
methods: {
trigger(v) {
2022-05-17 00:04:00 +02:00
this.$emit(
'input',
isNaN(parseInt(v.target.value)) ? (v.target.value ? v.target.value : null) : parseInt(v.target.value)
2021-04-10 19:45:11 +02:00
);
},
clear() {
this.$emit('input', null);
2022-05-17 00:04:00 +02:00
},
2021-04-10 19:45:11 +02:00
},
mounted() {
if (this.def !== -1 && typeof this.value === 'undefined') {
this.$emit('input', this.def);
return;
}
if (this.placeholder && typeof this.value === 'undefined') {
this.$emit('input', null);
}
2022-05-17 00:04:00 +02:00
},
2021-04-10 19:45:11 +02:00
};
</script>
<style scope>
.inset-bg {
2022-05-17 00:04:00 +02:00
background: linear-gradient(
to bottom,
hsl(247.5, 66.7%, 97.6%) 0%,
hsl(247.5, 66.7%, 97.6%) 41%,
hsl(0deg 0% 100%) 41%,
hsl(180deg 0% 100%) 100%
);
2021-04-10 19:45:11 +02:00
}
</style>