mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-31 08:26:31 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			153 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="dropdown-selector" :data-e2e="`${dataE2e}`">
 | |
|     <select :id="this.selectorId"
 | |
|             :data-select-by-group="groupSelector"
 | |
|             :data-combine-tags="dataCombineTags"
 | |
|             :data-select-multiple-all-selected="dataSelectMultipleAllSelected"
 | |
|             :data-select-multiple-name="dataSelectMultipleName"
 | |
|             :data-placeholder="placeholder"
 | |
|             :data-view-mode="viewMode"
 | |
|     >
 | |
|       <template v-if="groupSelector">
 | |
|         <optgroup v-for="group in this.options" :label="group.label" :key="group.label">
 | |
|           <option v-for="option in group.options"
 | |
|             :key="option.value"
 | |
|             :value="option.value"
 | |
|             :selected="option.value == selectedValue || (Array.isArray(selectedValue) && selectedValue.some(e => e == option.value))"
 | |
|             :data-selected="option.value == selectedValue || (Array.isArray(selectedValue) && selectedValue.some(e => e == option.value))"
 | |
|             :data-params="JSON.stringify(option.params)"
 | |
|             :data-group="group.label">
 | |
|             {{ option.label }}
 | |
|           </option>
 | |
|         </optgroup>
 | |
|       </template>
 | |
|       <template v-else>
 | |
|         <option
 | |
|           v-for="option in this.options"
 | |
|           :key="option.value"
 | |
|           :value="option.value"
 | |
|           :selected="option.value == selectedValue || (Array.isArray(selectedValue) && selectedValue.some(e => e == option.value))"
 | |
|           :data-selected="option.value == selectedValue || (Array.isArray(selectedValue) && selectedValue.some(e => e == option.value))"
 | |
|           :data-params="JSON.stringify(option.params)">
 | |
|           {{ option.label }}
 | |
|         </option>
 | |
|       </template>
 | |
|     </select>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| export default {
 | |
|   name: 'DropdownSelector',
 | |
|   props: {
 | |
|     options: Array,
 | |
|     selectorId: String,
 | |
|     groupSelector: {
 | |
|       type: Boolean,
 | |
|       default: false
 | |
|     },
 | |
|     noEmptyOption: {
 | |
|       type: Boolean,
 | |
|       default: true
 | |
|     },
 | |
|     placeholder: {
 | |
|       type: String,
 | |
|       default: ''
 | |
|     },
 | |
|     selectedValue: {
 | |
|       type: [String, Number, Boolean, Array],
 | |
|       default: null
 | |
|     },
 | |
|     singleSelect: {
 | |
|       type: Boolean,
 | |
|       default: true
 | |
|     },
 | |
|     closeOnSelect: {
 | |
|       type: Boolean,
 | |
|       default: true
 | |
|     },
 | |
|     selectAppearance: {
 | |
|       type: String,
 | |
|       default: 'simple'
 | |
|     },
 | |
|     disableSearch: {
 | |
|       type: Boolean,
 | |
|       default: false
 | |
|     },
 | |
|     labelHTML: {
 | |
|       type: Boolean,
 | |
|       default: false
 | |
|     },
 | |
|     tagLabel: {
 | |
|       type: Function
 | |
|     },
 | |
|     optionClass: {
 | |
|       type: String,
 | |
|       default: ''
 | |
|     },
 | |
|     dataCombineTags: {
 | |
|       type: Boolean,
 | |
|       default: false
 | |
|     },
 | |
|     dataSelectMultipleAllSelected: {
 | |
|       type: String,
 | |
|       default: ''
 | |
|     },
 | |
|     dataSelectMultipleName: {
 | |
|       type: String,
 | |
|       default: ''
 | |
|     },
 | |
|     optionLabel: {
 | |
|       type: Function
 | |
|     },
 | |
|     onOpen: {
 | |
|       type: Function
 | |
|     },
 | |
|     inputTagMode: {
 | |
|       type: Boolean,
 | |
|       default: false
 | |
|     },
 | |
|     viewMode: {
 | |
|       type: Boolean,
 | |
|       default: false
 | |
|     },
 | |
|     dataE2e: {
 | |
|       type: String,
 | |
|       default: ''
 | |
|     },
 | |
|     onChange: Function
 | |
| 
 | |
|   },
 | |
|   mounted() {
 | |
|     dropdownSelector.init(`#${this.selectorId}`, {
 | |
|       inputTagMode: this.inputTagMode,
 | |
|       optionClass: this.optionClass,
 | |
|       optionLabel: this.optionLabel,
 | |
|       noEmptyOption: this.noEmptyOption,
 | |
|       singleSelect: this.singleSelect,
 | |
|       closeOnSelect: this.closeOnSelect,
 | |
|       selectAppearance: this.selectAppearance,
 | |
|       disableSearch: this.disableSearch,
 | |
|       tagLabel: this.tagLabel,
 | |
|       labelHTML: this.labelHTML,
 | |
|       onOpen: this.onOpen,
 | |
|       dataE2e: this.dataE2e,
 | |
|       onChange: () => {
 | |
|         if (this.onChange) this.onChange();
 | |
|         this.selectChanged(dropdownSelector.getValues(`#${this.selectorId}`));
 | |
|       }
 | |
|     });
 | |
|   },
 | |
|   methods: {
 | |
|     selectChanged(value) {
 | |
|       this.$emit(
 | |
|         'dropdown:changed',
 | |
|         value
 | |
|       );
 | |
|     },
 | |
|     selectValues(value) {
 | |
|       dropdownSelector.selectValues(`#${this.selectorId}`, value);
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 |