| <template> |
| <div class="search-global"> |
| <b-form-group |
| :label="$t('global.form.search')" |
| :label-for="`searchInput-${_uid}`" |
| label-class="invisible" |
| class="mb-2" |
| > |
| <b-input-group size="md" class="align-items-center"> |
| <b-input-group-prepend> |
| <icon-search class="search-icon" /> |
| </b-input-group-prepend> |
| <b-form-input |
| :id="`searchInput-${_uid}`" |
| ref="searchInput" |
| v-model="filter" |
| class="search-input" |
| type="text" |
| :aria-label="$t('global.form.search')" |
| :placeholder="placeholder" |
| @input="onChangeInput" |
| > |
| </b-form-input> |
| <b-button |
| v-if="filter" |
| variant="link" |
| class="btn-icon-only input-action-btn" |
| :title="$t('global.ariaLabel.clearSearch')" |
| @click="onClearSearch" |
| > |
| <icon-close /> |
| <span class="sr-only">{{ $t('global.ariaLabel.clearSearch') }}</span> |
| </b-button> |
| </b-input-group> |
| </b-form-group> |
| </div> |
| </template> |
| |
| <script> |
| import IconSearch from '@carbon/icons-vue/es/search/16'; |
| import IconClose from '@carbon/icons-vue/es/close/20'; |
| import { useI18n } from 'vue-i18n'; |
| import i18n from '@/i18n'; |
| |
| export default { |
| name: 'Search', |
| components: { IconSearch, IconClose }, |
| props: { |
| placeholder: { |
| type: String, |
| default: function () { |
| return i18n.global.t('global.form.search'); |
| }, |
| }, |
| }, |
| data() { |
| return { |
| $t: useI18n().t, |
| filter: null, |
| }; |
| }, |
| methods: { |
| onChangeInput() { |
| this.$emit('change-search', this.filter); |
| }, |
| onClearSearch() { |
| this.filter = ''; |
| this.$emit('clear-search'); |
| this.$refs.searchInput.focus(); |
| }, |
| }, |
| }; |
| </script> |
| |
| <style lang="scss" scoped> |
| @import '@/assets/styles/bmc/helpers/_index.scss'; |
| @import '@/assets/styles/bootstrap/_helpers.scss'; |
| |
| .search-input { |
| padding-left: ($spacer * 2); |
| } |
| .search-icon { |
| position: absolute; |
| left: 10px; |
| top: 12px; |
| z-index: 4; |
| stroke: gray('400'); |
| } |
| </style> |