Move smart search bar in a dedicated component mixin
This commit is contained in:
		
							parent
							
								
									47209ee5ae
								
							
						
					
					
						commit
						b1194e50de
					
				| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
<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>
 | 
			
		||||
| 
						 | 
				
			
			@ -125,19 +125,19 @@
 | 
			
		|||
import axios from 'axios'
 | 
			
		||||
import _ from '@/lodash'
 | 
			
		||||
import time from '@/utils/time'
 | 
			
		||||
import {normalizeQuery, parseTokens, compileTokens} from '@/search'
 | 
			
		||||
import {normalizeQuery, parseTokens} from '@/search'
 | 
			
		||||
 | 
			
		||||
import Pagination from '@/components/Pagination'
 | 
			
		||||
import ActionTable from '@/components/common/ActionTable'
 | 
			
		||||
import OrderingMixin from '@/components/mixins/Ordering'
 | 
			
		||||
import TranslationsMixin from '@/components/mixins/Translations'
 | 
			
		||||
import SmartSearchMixin from '@/components/mixins/SmartSearch'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  mixins: [OrderingMixin, TranslationsMixin],
 | 
			
		||||
  mixins: [OrderingMixin, TranslationsMixin, SmartSearchMixin],
 | 
			
		||||
  props: {
 | 
			
		||||
    filters: {type: Object, required: false},
 | 
			
		||||
    needsRefresh: {type: Boolean, required: false, default: false},
 | 
			
		||||
    defaultQuery: {type: String, default: ''},
 | 
			
		||||
    customObjects: {type: Array, required: false, default: () => { return [] }}
 | 
			
		||||
  },
 | 
			
		||||
  components: {
 | 
			
		||||
| 
						 | 
				
			
			@ -172,36 +172,6 @@ export default {
 | 
			
		|||
    this.fetchData()
 | 
			
		||||
  },
 | 
			
		||||
  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})
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    fetchData () {
 | 
			
		||||
      this.$emit('fetch-start')
 | 
			
		||||
      let params = _.merge({
 | 
			
		||||
| 
						 | 
				
			
			@ -282,17 +252,6 @@ export default {
 | 
			
		|||
    }
 | 
			
		||||
  },
 | 
			
		||||
  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
 | 
			
		||||
    },
 | 
			
		||||
    orderingDirection: function () {
 | 
			
		||||
      this.page = 1
 | 
			
		||||
      this.fetchData()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue