176 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
| 
 | |
|     <el-select
 | |
|         :class="'pl-20 mr-40'"
 | |
|         v-model="real_model"
 | |
|         @input="change"
 | |
|         filterable
 | |
|         remote
 | |
|         reserve-keyword
 | |
|         :placeholder="placeholder"
 | |
|         :remote-method="remoteMethod"
 | |
|         :loading="loading">
 | |
|         <div v-if="loading" class="el-select-dropdown__wrap" slot="empty">
 | |
|             <p class="el-select-dropdown__empty loading">
 | |
|                 {{ loadingText }}
 | |
|             </p>
 | |
|         </div>
 | |
| 
 | |
|         <div v-else-if="options.length != 0" class="el-select-dropdown__wrap" slot="empty">
 | |
|             <p class="el-select-dropdown__empty">
 | |
|                 {{ noMatchingDataText }}
 | |
|             </p>
 | |
|         </div>
 | |
| 
 | |
|         <div v-else-if="options.length == 0" slot="empty">
 | |
|             <p class="el-select-dropdown__empty">
 | |
|                 {{ noDataText }}
 | |
|             </p>
 | |
|         </div>
 | |
| 
 | |
|         <template v-if="icon" slot="prefix">
 | |
|             <span class="el-input__suffix-inner el-select-icon">
 | |
|                 <i :class="'select-icon-position el-input__icon fa fa-' + icon"></i>
 | |
|             </span>
 | |
|         </template>
 | |
| 
 | |
|         <el-option v-if="!group" v-for="option in selectOptions"
 | |
|             :key="option.id"
 | |
|             :label="option.name"
 | |
|             :value="option.id">
 | |
|         </el-option>
 | |
| 
 | |
|         <el-option-group
 | |
|             v-if="group"
 | |
|             v-for="(options, name) in selectOptions"
 | |
|             :key="name"
 | |
|             :label="name">
 | |
|             <el-option
 | |
|                 v-for="(label, value) in options"
 | |
|                 :key="value"
 | |
|                 :label="label"
 | |
|                 :value="value">
 | |
|             </el-option>
 | |
|         </el-option-group>
 | |
|     </el-select>
 | |
| 
 | |
| </template>
 | |
| 
 | |
| <style>
 | |
|     .el-select {
 | |
|         display: inline;
 | |
|     }
 | |
| </style>
 | |
| 
 | |
| <script>
 | |
|     import { Select, Option, OptionGroup } from 'element-ui';
 | |
| 
 | |
|     export default {
 | |
|         name: 'akaunting-select',
 | |
| 
 | |
|         components: {
 | |
|             [Select.name]: Select,
 | |
|             [Option.name]: Option,
 | |
|             [OptionGroup.name]: OptionGroup,
 | |
|         },
 | |
| 
 | |
|         props: {
 | |
|             name: {
 | |
|                 type: String,
 | |
|                 default: null,
 | |
|                 description: "Selectbox attribute name"
 | |
|             },
 | |
|             placeholder: {
 | |
|                 type: String,
 | |
|                 default: '',
 | |
|                 description: "Selectbox input placeholder text"
 | |
|             },
 | |
|             options: null,
 | |
|             value: {
 | |
|                 type: String,
 | |
|                 default: null,
 | |
|                 description: "Selectbox selected value"
 | |
|             },
 | |
| 
 | |
|             icon: {
 | |
|                 type: String,
 | |
|                 description: "Prepend icon (left)"
 | |
|             },
 | |
| 
 | |
|             group:  {
 | |
|                 type: Boolean,
 | |
|                 default: false,
 | |
|                 description: "Selectbox option group status"
 | |
|             },
 | |
| 
 | |
|             loadingText: {
 | |
|                 type: String,
 | |
|                 default: 'Loading...',
 | |
|                 description: "Selectbox loading message"
 | |
|             },
 | |
|             noDataText: {
 | |
|                 type: String,
 | |
|                 default: 'No Data',
 | |
|                 description: "Selectbox empty options message"
 | |
|             },
 | |
|             noMatchingDataText: {
 | |
|                 type: String,
 | |
|                 default: 'No Matchign Data',
 | |
|                 description: "Selectbox search option not found item message"
 | |
|             },
 | |
| 
 | |
|             remoteAction: {
 | |
|                 type: String,
 | |
|                 default: null,
 | |
|                 description: "Selectbox remote action path"
 | |
|             },
 | |
|             remoteType: {
 | |
|                 type: String,
 | |
|                 default: 'invoice',
 | |
|                 description: "Ger remote item type."
 | |
|             },
 | |
|         },
 | |
| 
 | |
|         data() {
 | |
|             return {
 | |
|                 list: [],
 | |
|                 selectOptions: this.options,
 | |
|                 real_model: this.model,
 | |
|                 loading: false,
 | |
|             }
 | |
|         },
 | |
| 
 | |
|         mounted() {
 | |
|             this.real_model = this.value;
 | |
| 
 | |
|             this.$emit('interface', this.real_model);
 | |
|         },
 | |
| 
 | |
|         methods: {
 | |
|             change() {
 | |
|                 this.$emit('change', this.real_model);
 | |
|                 this.$emit('interface', this.real_model);
 | |
| 
 | |
|                 this.selectOptions.forEach(item => {
 | |
|                     if (item.id == this.real_model) {
 | |
|                         this.$emit('label', item.name);
 | |
|                         this.$emit('option', item);
 | |
| 
 | |
|                         return;
 | |
|                     }
 | |
|                 });
 | |
|             },
 | |
|             remoteMethod() {
 | |
| 
 | |
|             },
 | |
|         },
 | |
| 
 | |
|         watch: {
 | |
|             options: function (options) {
 | |
|                 // update options
 | |
|                 //this.selectOptions = options;
 | |
|             }
 | |
|         },
 | |
|     }
 | |
| </script>
 |