feat: Form select component to use with onboarding form (#8852)
* feat: Form select component to use with onboarding form * Update Select.vue * Update WithLabel.vue
This commit is contained in:
committed by
GitHub
parent
1b753720c1
commit
4368bdb2bc
92
app/javascript/v3/components/Form/Select.vue
Normal file
92
app/javascript/v3/components/Form/Select.vue
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
<template>
|
||||||
|
<with-label
|
||||||
|
:label="label"
|
||||||
|
:icon="icon"
|
||||||
|
:name="name"
|
||||||
|
:has-error="hasError"
|
||||||
|
:error-message="errorMessage"
|
||||||
|
>
|
||||||
|
<select
|
||||||
|
:id="id"
|
||||||
|
:selected="value"
|
||||||
|
:name="name"
|
||||||
|
:class="{
|
||||||
|
'text-slate-400': !value,
|
||||||
|
'text-slate-900 dark:text-slate-100': value,
|
||||||
|
'pl-9': icon,
|
||||||
|
}"
|
||||||
|
class="mb-0 block w-full px-3 py-2 pr-6 border-0 rounded-xl shadow-sm outline-none appearance-none select-caret ring-1 ring-inset placeholder:text-slate-400 focus:ring-2 focus:ring-inset focus:ring-woot-500 sm:text-sm sm:leading-6 dark:bg-slate-700 dark:ring-slate-600 dark:focus:ring-woot-500 ring-slate-200"
|
||||||
|
@input="onInput"
|
||||||
|
>
|
||||||
|
<option value="" disabled selected class="hidden">
|
||||||
|
{{ placeholder }}
|
||||||
|
</option>
|
||||||
|
<slot>
|
||||||
|
<option v-for="opt in options" :key="opt.value" :value="opt.value">
|
||||||
|
{{ opt.label }}
|
||||||
|
</option>
|
||||||
|
</slot>
|
||||||
|
</select>
|
||||||
|
</with-label>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import WithLabel from './WithLabel.vue';
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
WithLabel,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
hasError: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
errorMessage: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onInput(e) {
|
||||||
|
this.$emit('input', e.target.value);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
.select-caret {
|
||||||
|
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28110, 111, 115%29'></polygon></svg>");
|
||||||
|
background-origin: content-box;
|
||||||
|
background-position: right -1rem center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: 9px 6px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
57
app/javascript/v3/components/Form/WithLabel.vue
Normal file
57
app/javascript/v3/components/Form/WithLabel.vue
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<template>
|
||||||
|
<div class="space-y-1">
|
||||||
|
<label
|
||||||
|
v-if="label"
|
||||||
|
:for="name"
|
||||||
|
class="flex justify-between text-sm font-medium leading-6 text-slate-900 dark:text-white"
|
||||||
|
:class="{ 'text-red-500': hasError }"
|
||||||
|
>
|
||||||
|
<slot name="label">
|
||||||
|
{{ label }}
|
||||||
|
</slot>
|
||||||
|
</label>
|
||||||
|
<div class="w-full">
|
||||||
|
<div class="flex items-center relative w-full">
|
||||||
|
<fluent-icon
|
||||||
|
v-if="icon"
|
||||||
|
size="16"
|
||||||
|
:icon="icon"
|
||||||
|
class="absolute left-2 transform text-slate-400 dark:text-slate-600 w-5 h-5"
|
||||||
|
/>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
v-if="errorMessage && hasError"
|
||||||
|
class="text-xs text-red-400 leading-2"
|
||||||
|
>
|
||||||
|
{{ errorMessage }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
label: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
hasError: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
errorMessage: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
Reference in New Issue
Block a user