SearchBox.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. <script setup>
  2. const props = defineProps({
  3. keyword: String
  4. })
  5. const searchInput = ref(null)
  6. onMounted(() => {
  7. document.addEventListener('keydown', keyListener)
  8. })
  9. onUnmounted(() => {
  10. document.removeEventListener('keydown', keyListener)
  11. })
  12. /**
  13. * Attach an event listen for ctrl+F
  14. */
  15. function keyListener(e) {
  16. if (e.key === "f" && (e.ctrlKey || e.metaKey)) {
  17. e.preventDefault();
  18. searchInput.value?.focus()
  19. }
  20. }
  21. </script>
  22. <template>
  23. <div role="search" class="field">
  24. <div class="control has-icons-right">
  25. <input
  26. ref="searchInput"
  27. id="txtSearch"
  28. type="search"
  29. tabindex="1"
  30. :aria-label="$t('commons.search')"
  31. :title="$t('commons.search')"
  32. class="input is-rounded is-search"
  33. :value="keyword"
  34. v-on:keyup="$emit('update:keyword', $event.target.value)">
  35. <span class="icon is-small is-right">
  36. <button v-if="keyword != ''" id="btnClearSearch" tabindex="1" :title="$t('commons.clear_search')" class="clear-selection delete" @click="$emit('update:keyword','')"></button>
  37. <FontAwesomeIcon v-else :icon="['fas', 'search']" />
  38. </span>
  39. </div>
  40. </div>
  41. </template>