Skip to content
Snippets Groups Projects
SmartSearch.vue 1.34 KiB
Newer Older
  • Learn to ignore specific revisions
  • <script>
    
    import {normalizeQuery, parseTokens, compileTokens} from '@/search'
    
    export default {
      props: {
        defaultQuery: {type: String, default: '', required: false},
      },
      methods: {
        getTokenValue (key, fallback) {
          let matching = this.search.tokens.filter(t => {
            return t.field === key
          })
          if (matching.length > 0) {
            return matching[0].value
          }
          return fallback
        },
        addSearchToken (key, value) {
          if (!value) {
            // we remove existing matching tokens, if any
            this.search.tokens = this.search.tokens.filter(t => {
              return t.field != key
            })
          } else {
            let existing = this.search.tokens.filter(t => {
              return t.field === key
            })
            if (existing.length > 0) {
              // we replace the value in existing tokens, if any
              existing.forEach(t => {
                t.value = value
              })
            } else {
              // we add a new token
              this.search.tokens.push({field: key, value})
            }
          }
        },
      },
      watch: {
        'search.query' (newValue) {
          this.search.tokens = parseTokens(normalizeQuery(newValue))
        },
        'search.tokens': {
          handler (newValue) {
            this.search.query = compileTokens(newValue)
            this.page = 1
            this.fetchData()
          },
          deep: true
        },
      }
    }
    </script>