Skip to content
Snippets Groups Projects
App.vue 5.35 KiB
Newer Older
Ole Voldsæter's avatar
Ole Voldsæter committed
<template>
Ole Voldsæter's avatar
Ole Voldsæter committed
    <img alt="Vue logo" src="./assets/logo.png">
      <autocomplete :debounceTime="50" :auto-select="true" :search="search" :get-result-value="result_view" @submit="select_result" placeholder="søk..." ref="search"></autocomplete>
Ole Voldsæter's avatar
Ole Voldsæter committed
      <input type="radio" id="radio_nob" value="nob" v-model="lang">
Ole Voldsæter's avatar
Ole Voldsæter committed
      <label for="radio_nob">Bokmål</label>
Ole Voldsæter's avatar
Ole Voldsæter committed
      <input type="radio" id="radio_nno" value="nno" v-model="lang">
Ole Voldsæter's avatar
Ole Voldsæter committed
      <label for="radio_nno">Nynorsk</label>
    </header>
    <img id="spinner" :class="waiting ? 'show' : 'hide'" src="./assets/spinner.gif" alt="Venter på innhold" />
Ole Voldsæter's avatar
Ole Voldsæter committed
    <SearchResults :hits="search_results" :lang="lang" @search-hit-click="search_hit_click" />
    <Article :article="article" @article-click="article_link_click" />
Ole Voldsæter's avatar
Ole Voldsæter committed
</template>

<script>
Ole Voldsæter's avatar
Ole Voldsæter committed
import axios from "axios"
Ole Voldsæter's avatar
Ole Voldsæter committed
import Article from './components/Article.vue'
Ole Voldsæter's avatar
Ole Voldsæter committed
import SearchResults from './components/SearchResults.vue'
import Autocomplete from '@trevoreyre/autocomplete-vue'
import '@trevoreyre/autocomplete-vue/dist/style.css'
Ole Voldsæter's avatar
Ole Voldsæter committed
var api_endpoint = 'https://ordbok-dev.aws.uib.no/cache/article'
Ole Voldsæter's avatar
Ole Voldsæter committed

Ole Voldsæter's avatar
Ole Voldsæter committed
window.onpopstate = function (event) {
  if (event.state) {
Ole Voldsæter's avatar
Ole Voldsæter committed
    app.__vue__._data.article = event.state.article
    app.__vue__._data.search_results = event.state.search_results
Ole Voldsæter's avatar
Ole Voldsæter committed
export default {
  name: 'app',
  data: function() {
    return {
Ole Voldsæter's avatar
Ole Voldsæter committed
      search_results: [],
Ole Voldsæter's avatar
Ole Voldsæter committed
      lang: 'nob',
      waiting: true,
      article: {lemmas: [], body:{pronunciation: [], definitions: [], etymology: []}},
      result_view: function(result) {
Ole Voldsæter's avatar
Ole Voldsæter committed
        if (result._source)
          return result._source.lemmas.map(x => x.lemma).join(', ')
Ole Voldsæter's avatar
Ole Voldsæter committed
        else
          return 'Alle søkeresultater...'
Ole Voldsæter's avatar
Ole Voldsæter committed
  computed: {
    search: function() {
      let self = this
      return function(q) {
                return new Promise(resolve => {
Ole Voldsæter's avatar
Ole Voldsæter committed
                  return axios.post(api_endpoint + '/' + self.lang + '/_search/',
Ole Voldsæter's avatar
Ole Voldsæter committed
                                    {
                                        "suggest": {
                                          "suggest" : {
                                            "prefix" : q,
                                            "completion" : {
                                              "field" : "suggest"
                                            }
                                          }
                                        }
                                      }).then(function(response) {
                                        let hits = response.data.suggest.suggest[0].options
                                        if(q.length) hits = hits.concat({q: q})
                                        resolve(hits)
                                      })
                                    })
        }
      }
    },
Ole Voldsæter's avatar
Ole Voldsæter committed
  components: {
Ole Voldsæter's avatar
Ole Voldsæter committed
    SearchResults
  },
  methods: {
    select_result: function(event) {
      this.$refs.search.value = ''
      document.activeElement.blur()
Ole Voldsæter's avatar
Ole Voldsæter committed
      if(event._source){
        this.search_results = []
        this.article = event._source
Ole Voldsæter's avatar
Ole Voldsæter committed
        history.pushState({article: this.article, search_results: this.search_results}, '', '/' + this.lang + '/' + event._id)
Ole Voldsæter's avatar
Ole Voldsæter committed
      }else{
Ole Voldsæter's avatar
Ole Voldsæter committed
        var self = this
        self.waiting = true
        self.article = {lemmas: [], body:{pronunciation: [], definitions: [], etymology: []}}
        axios.get(api_endpoint + '/' + self.lang + '/_search?q=' + event.q)
        .then(function(response){
          self.search_results = response.data.hits.hits
          history.pushState({article: self.article, search_results: self.search_results}, '', '/' + self.lang + '/_search?q=' + event.q)
          self.waiting = false
        })
Ole Voldsæter's avatar
Ole Voldsæter committed
      }
Ole Voldsæter's avatar
Ole Voldsæter committed
    },
    article_link_click: function(item) {
      var self = this
      self.waiting = true
      axios.get(api_endpoint + '/' + self.lang + '/' + item.article_id)
      .then(function(response){
        self.article = response.data._source
        self.waiting = false
        history.replaceState({article: self.article, search_results: self.search_results}, '')
      })
    },
    search_hit_click: function(article){
      this.search_results = []
      this.article = article
      history.replaceState({article: article, search_results: []}, '')
    }
  },
  mounted: function(){
Ole Voldsæter's avatar
Ole Voldsæter committed
    this.lang = this.$route.params.lang || 'nob'
    var self = this;
Ole Voldsæter's avatar
Ole Voldsæter committed
    if(this.$route.query.q) {
      axios.get(api_endpoint + '/' + self.lang + '/_search?q=' + self.$route.query.q)
Ole Voldsæter's avatar
Ole Voldsæter committed
      .then(function(response){
        self.search_results = response.data.hits.hits
        self.waiting = false
Ole Voldsæter's avatar
Ole Voldsæter committed
      })
    }
Ole Voldsæter's avatar
Ole Voldsæter committed
    else if(this.$route.params.id){
      axios.get(api_endpoint + '/' + self.lang + '/' + self.$route.params.id)
      .then(function(response){
        self.article = response.data._source
        self.waiting = false
Ole Voldsæter's avatar
Ole Voldsæter committed
        history.replaceState({article: self.article, search_results: self.search_results}, '')
Ole Voldsæter's avatar
Ole Voldsæter committed
    }
    else {
      this.waiting = false
    }
  },
  watch: {
    $route(to, from) {
      this.lang = this.$route.params.lang || 'nob'
    }
Ole Voldsæter's avatar
Ole Voldsæter committed
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
  margin-top: 60px;
  margin-left: 30%;
Ole Voldsæter's avatar
Ole Voldsæter committed
  margin-right: 10%;
Ole Voldsæter's avatar
Ole Voldsæter committed
}
.show {
  display: block;
}

.hide {
  display: none;
}

.autocomplete {
  width: 25em;
}
Ole Voldsæter's avatar
Ole Voldsæter committed
</style>