mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 02:57:57 +00:00 
			
		
		
		
	 7fd8b4d03a
			
		
	
	7fd8b4d03a
	
	
	
		
			
			Porting changes from https://github.com/chatwoot/chatwoot/pull/10552 --------- Co-authored-by: Pranav <pranav@chatwoot.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: Vishnu Narayanan <vishnu@chatwoot.com> Co-authored-by: Sojan <sojan@pepalo.com> Co-authored-by: iamsivin <iamsivin@gmail.com> Co-authored-by: Pranav <pranavrajs@gmail.com>
		
			
				
	
	
		
			132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <script setup>
 | |
| import { computed, defineEmits } from 'vue';
 | |
| import { OnClickOutside } from '@vueuse/components';
 | |
| import { useToggle } from '@vueuse/core';
 | |
| 
 | |
| import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue';
 | |
| import MultiselectDropdownItems from 'shared/components/ui/MultiselectDropdownItems.vue';
 | |
| 
 | |
| const props = defineProps({
 | |
|   options: {
 | |
|     type: Array,
 | |
|     default: () => [],
 | |
|   },
 | |
|   selectedItem: {
 | |
|     type: Object,
 | |
|     default: () => ({}),
 | |
|   },
 | |
|   hasThumbnail: {
 | |
|     type: Boolean,
 | |
|     default: true,
 | |
|   },
 | |
|   multiselectorTitle: {
 | |
|     type: String,
 | |
|     default: '',
 | |
|   },
 | |
|   multiselectorPlaceholder: {
 | |
|     type: String,
 | |
|     default: 'None',
 | |
|   },
 | |
|   noSearchResult: {
 | |
|     type: String,
 | |
|     default: 'No results found',
 | |
|   },
 | |
|   inputPlaceholder: {
 | |
|     type: String,
 | |
|     default: 'Search',
 | |
|   },
 | |
| });
 | |
| 
 | |
| const emit = defineEmits(['select']);
 | |
| const [showSearchDropdown, toggleDropdown] = useToggle(false);
 | |
| 
 | |
| const onCloseDropdown = () => toggleDropdown(false);
 | |
| const onClickSelectItem = value => {
 | |
|   emit('select', value);
 | |
|   onCloseDropdown();
 | |
| };
 | |
| 
 | |
| const hasValue = computed(() => {
 | |
|   if (props.selectedItem && props.selectedItem.id) {
 | |
|     return true;
 | |
|   }
 | |
|   return false;
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <template>
 | |
|   <OnClickOutside @trigger="onCloseDropdown">
 | |
|     <div class="relative w-full mb-2" @keyup.esc="onCloseDropdown">
 | |
|       <woot-button
 | |
|         variant="hollow"
 | |
|         color-scheme="secondary"
 | |
|         class="w-full px-2 border border-solid !border-n-weak dark:!border-n-weak hover:!border-n-strong dark:hover:!border-n-strong"
 | |
|         @click="
 | |
|           () => toggleDropdown() // ensure that the event is not passed to the button
 | |
|         "
 | |
|       >
 | |
|         <div class="flex gap-1">
 | |
|           <Thumbnail
 | |
|             v-if="hasValue && hasThumbnail"
 | |
|             :src="selectedItem.thumbnail"
 | |
|             size="24px"
 | |
|             :status="selectedItem.availability_status"
 | |
|             :username="selectedItem.name"
 | |
|           />
 | |
|           <div class="flex items-center justify-between w-full min-w-0">
 | |
|             <h4 v-if="!hasValue" class="text-sm text-ellipsis text-n-slate-12">
 | |
|               {{ multiselectorPlaceholder }}
 | |
|             </h4>
 | |
|             <h4
 | |
|               v-else
 | |
|               class="items-center overflow-hidden text-sm leading-tight whitespace-nowrap text-ellipsis text-n-slate-12"
 | |
|               :title="selectedItem.name"
 | |
|             >
 | |
|               {{ selectedItem.name }}
 | |
|             </h4>
 | |
|             <i
 | |
|               v-if="showSearchDropdown"
 | |
|               class="mr-1 icon i-lucide-chevron-up text-n-slate-10"
 | |
|             />
 | |
|             <i v-else class="mr-1 icon i-lucide-chevron-down text-n-slate-10" />
 | |
|           </div>
 | |
|         </div>
 | |
|       </woot-button>
 | |
|       <div
 | |
|         :class="{ 'dropdown-pane--open': showSearchDropdown }"
 | |
|         class="dropdown-pane"
 | |
|       >
 | |
|         <div class="flex items-center justify-between mb-1">
 | |
|           <h4
 | |
|             class="m-0 overflow-hidden text-sm text-n-slate-11 whitespace-nowrap text-ellipsis"
 | |
|           >
 | |
|             {{ multiselectorTitle }}
 | |
|           </h4>
 | |
|           <woot-button
 | |
|             icon="dismiss"
 | |
|             size="tiny"
 | |
|             color-scheme="secondary"
 | |
|             variant="clear"
 | |
|             @click="onCloseDropdown"
 | |
|           />
 | |
|         </div>
 | |
|         <MultiselectDropdownItems
 | |
|           v-if="showSearchDropdown"
 | |
|           :options="options"
 | |
|           :selected-items="[selectedItem]"
 | |
|           :has-thumbnail="hasThumbnail"
 | |
|           :input-placeholder="inputPlaceholder"
 | |
|           :no-search-result="noSearchResult"
 | |
|           @select="onClickSelectItem"
 | |
|         />
 | |
|       </div>
 | |
|     </div>
 | |
|   </OnClickOutside>
 | |
| </template>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .dropdown-pane {
 | |
|   @apply box-border top-[2.625rem] w-full;
 | |
| }
 | |
| </style>
 |