<template> <div class="search-container"> <div class="text search-text"> Search within display </div> <el-autocomplete class="search-box" placeholder="Search" v-model="searchText" :fetch-suggestions="fetchSuggestions" @keyup.enter="$emit('search', searchText)" @select="$emit('search', $event.value)" :teleported=false popper-class="autocomplete-popper"> </el-autocomplete> <map-svg-icon icon="magnifyingGlass" class="magnify" @click="$emit('search', searchText)"/> <div v-if="failedSearch" class="text not-found-text"> '{{failedSearch}}' not found </div> </div> </template> <script> /* eslint-disable no-alert, no-console */ import { MapSvgIcon } from '@abi-software/svg-sprite'; import { ElAutocomplete as Autocomplete } from "element-plus"; export default { name: "SearchControls", props: { failedSearch: undefined, }, components: { Autocomplete, MapSvgIcon, }, methods: { fetchSuggestions: function(term, cb) { if (term === "") { cb([]); } else { this.$emit('fetch-suggestions', { term, cb }); } }, }, data: function () { return { searchText: "", }; }, }; </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="scss"> .search-container { display:flex; flex-direction: row; .text { margin-left: 8px; margin-top: 7px; font-weight: 500; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; line-height:18px; } .search-text { margin-top: 8px; color: $grey; font-size: 14px; margin-left: 1rem; } .not-found-text { margin-top: 8px; color: $warning; font-size: 0.8rem; margin-left: 0.5rem; } :deep(.search-box) { margin-top: 2px; margin-left:0.5rem; height:28px; width:137px; .el-input__inner { height:26px; line-height:28px; border-radius: 4px; &:focus { border-color: $app-primary-color; } } } .magnify { margin-top: 2px; margin-left:0.5rem; background: $app-primary-color; border-radius: 4px; height:28px; width:28px; cursor: pointer; &:hover { box-shadow: -3px 2px 4px 0 rgba(0,0,0,0.25); } } :deep(.autocomplete-popper) { min-width:137px!important; width: auto!important; } } </style>