mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-04 04:57:51 +00:00 
			
		
		
		
	* feat: Form select component to use with onboarding form * Update Select.vue * Update WithLabel.vue
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<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>
 |