Skip to content
Snippets Groups Projects
Autocomplete.vue 3.78 KiB
Newer Older
<template>
  <div class="autocomplete-container" :class="$vuetify.breakpoint.name">
    <v-combobox accesskey="s" aria-label="søkefelt"
Ole Voldsæter's avatar
Ole Voldsæter committed
        v-model="select"
        :loading="loading"
        :items="items"
        :search-input.sync="search"
        item-text="label"
Henrik Askjer's avatar
Henrik Askjer committed
        :menu-props="{maxHeight: $vuetify.breakpoint.name === 'xs' ? 190 : 500, transition: 'fade-transition', allowOverflow: true}"
Ole Voldsæter's avatar
Ole Voldsæter committed
        prepend-inner-icon="search"
Ole Voldsæter's avatar
Ole Voldsæter committed
        return-object
        rounded
Ole Voldsæter's avatar
Ole Voldsæter committed
        hide-no-data
Henrik Askjer's avatar
Henrik Askjer committed
        auto-select-first
Ole Voldsæter's avatar
Ole Voldsæter committed
        no-filter
        hide-details
        label="Søk..."
        solo
Ole Voldsæter's avatar
Ole Voldsæter committed
        placeholder="Søk her"
Ole Voldsæter's avatar
Ole Voldsæter committed
        ref="autocomplete"
        :dense="$vuetify.breakpoint.smAndDown"
Ole Voldsæter's avatar
Ole Voldsæter committed
      >
      <template v-slot:item="data">
Henrik Askjer's avatar
Henrik Askjer committed
      <span class="search-hit">
Henrik Askjer's avatar
Henrik Askjer committed
        {{data.item.label}}
      </span>
Henrik Askjer's avatar
Henrik Askjer committed
        ({{{"b": "bm", "n": "nn", "bn": "bm, nn" }[data.item.lang] || ["søker...","ingen treff","avansert søk"][data.item.search]}})
Ole Voldsæter's avatar
Ole Voldsæter committed
      </template>
Henrik Askjer's avatar
Henrik Askjer committed
      <template slot="no-data">
        <div></div>
      </template>
Henrik Askjer's avatar
Henrik Askjer committed
    </v-combobox>
Ole Voldsæter's avatar
Ole Voldsæter committed
  </div>
</template>

<script>

  export default {
    props: {
Henrik Askjer's avatar
Henrik Askjer committed
      api: Function,
    },
    data: function() {
      return {
        loading: false,
        items: [],
        search: null,
Henrik Askjer's avatar
Henrik Askjer committed
        suggesting: null,
      }
    },
    watch: {
      search (val) {
        if (! val) {
          this.items = []
        } else {
      },
      select(item) {
Henrik Askjer's avatar
Henrik Askjer committed
        if (item) {
Henrik Askjer's avatar
Henrik Askjer committed
          if (typeof item != 'string') {
Henrik Askjer's avatar
Henrik Askjer committed
            this.suggesting = false
Henrik Askjer's avatar
Henrik Askjer committed
        }
Henrik Askjer's avatar
Henrik Askjer committed
        this.suggesting = true
        // Search options while waiting for response
        var search = 0
Henrik Askjer's avatar
Henrik Askjer committed
        if (this.items[0]) {
          if (this.items[0].time < time) {
            if (/_|\*|\|/.test(q)) {
Henrik Askjer's avatar
Henrik Askjer committed
            // Whitespace necessary in case option already exists in dropdown
            this.items.splice(0,1, {q: q, label: q +" ", time: time, search: search})
Henrik Askjer's avatar
Henrik Askjer committed
          this.items.push({q: q, label: q, time: time, search: search})
Henrik Askjer's avatar
Henrik Askjer committed
        let self = this
        self.api.get('suggest?', {params: {q: q, dict: self.$parent.lang, n: 80, scope: 'w', stage: self.$parent.stage}})
Henrik Askjer's avatar
Henrik Askjer committed
            .then(async (response) => {
Henrik Askjer's avatar
Henrik Askjer committed
                        if (self.$refs.autocomplete.searchInput == q & self.suggesting) {

                          let suggestions = response.data.a.w.map(item => ({q: q, match: item[0], label: item[0], time: time, lang: item[1]}))
Henrik Askjer's avatar
Henrik Askjer committed

                          if (/_|\*|\|/.test(q)) {
                            suggestions.unshift({q: q, label: q, time: time, search: 2})
Henrik Askjer's avatar
Henrik Askjer committed
                          }
Henrik Askjer's avatar
Henrik Askjer committed
                          if (!suggestions.length) {
Henrik Askjer's avatar
Henrik Askjer committed
                            self.items = [{q: q, label: q, time: time, search: 1}]
Henrik Askjer's avatar
Henrik Askjer committed
                          } else {
                            self.items = suggestions
                          }
Henrik Askjer's avatar
Henrik Askjer committed
                        }
                      self.loading = false
                    })

Henrik Askjer's avatar
Henrik Askjer committed
      },
Henrik Askjer's avatar
Henrik Askjer committed
      submit(item) {

          this.$emit('submit', item)
          let self = this
Henrik Askjer's avatar
Henrik Askjer committed
          setTimeout(() => {
          self.$refs.autocomplete.$refs.input.select()
          this.items = []
          this.suggesting = false
          }, 1)

      }
<style scoped>
  .search-hit {
    font-weight: bold;
    margin-right: 5px;
    color: var(--v-primary-base);
Ole Voldsæter's avatar
Ole Voldsæter committed

  .autocomplete-container {
</style>