From ff2c07fd9f58ddcac7579aebd58008dad8c54a20 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ole=20Volds=C3=A6ter?= <ole.voldsater@uib.no>
Date: Mon, 14 Oct 2019 15:46:28 +0200
Subject: [PATCH] =?UTF-8?q?fullstendig=20s=C3=B8k?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/App.vue                      | 42 ++++++++++++++++++++++++++------
 src/components/Article.vue       |  4 +--
 src/components/Header.vue        | 15 ++++--------
 src/components/SearchResults.vue | 34 ++++++++++++++++++++++++++
 src/utils/helpers.js             | 11 +++++++++
 5 files changed, 86 insertions(+), 20 deletions(-)
 create mode 100644 src/components/SearchResults.vue
 create mode 100644 src/utils/helpers.js

diff --git a/src/App.vue b/src/App.vue
index 3082f389..8e35c881 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -4,13 +4,15 @@
     <div class="">
       <autocomplete :search="search" :get-result-value="result_view" @submit="select_result" placeholder="søk..."></autocomplete>
     </div>
+    <SearchResults :hits="search_results" />
     <Article :article="article" />
   </div>
 </template>
 
 <script>
-import axios from "axios";
+import axios from "axios"
 import Article from './components/Article.vue'
+import SearchResults from './components/SearchResults.vue'
 import Autocomplete from '@trevoreyre/autocomplete-vue'
 import '@trevoreyre/autocomplete-vue/dist/style.css'
 
@@ -28,6 +30,8 @@ export default {
   data: function() {
     return {
       article_id: parseInt(window.location.href.split("/").pop()),
+      search_query: window.location.href.split("?q=")[1],
+      search_results: [],
       article: {lemmas: []},
       search: function(q) {
         return new Promise(resolve => {
@@ -41,32 +45,53 @@ export default {
                                     }
                                   }
                                 }
-                              }).then(response => resolve(response.data.suggest.suggest[0].options))
+                              }).then(function(response) {
+                                let hits = response.data.suggest.suggest[0].options
+                                if(q.length) hits = hits.concat({q: q})
+                                resolve(hits)
+                              })
         })
       },
       result_view: function(result) {
-        return result._source.lemmas.map(x => x.word).join(', ')
+        if (result._source)
+          return result._source.lemmas.map(x => x.word).join(', ')
+        else
+          return 'Alle søkeresultater...'
       }
     }
   },
   components: {
     Article,
-    Autocomplete
+    Autocomplete,
+    SearchResults
   },
   methods: {
     select_result: function(event) {
-      this.article = event._source
-      history.pushState(this.article, this.article.lemmas.map(x => x.word).join(', '), event._id)
+      if(event._source){
+        this.search_results = []
+        this.article = event._source
+        history.pushState(this.article, this.article.lemmas.map(x => x.word).join(', '), event._id)
+      }else{
+        window.location.href="search?q=" + event.q
+      }
     }
   },
   mounted: function(){
     var self = this;
-    axios.get('https://search-ordbok-prototype-6qpfmm6fz5jvy5ba3e6blryeqe.eu-west-1.es.amazonaws.com/ordbok/_doc/' + self.article_id)
+    if(this.search_query) {
+      axios.get('https://search-ordbok-prototype-6qpfmm6fz5jvy5ba3e6blryeqe.eu-west-1.es.amazonaws.com/ordbok/_search?q=' + self.search_query)
+      .then(function(response){
+        self.search_results = response.data.hits.hits
+      })
+    }
+    else
+    {
+      axios.get('https://search-ordbok-prototype-6qpfmm6fz5jvy5ba3e6blryeqe.eu-west-1.es.amazonaws.com/ordbok/_doc/' + self.article_id)
       .then(function(response){
         self.article = response.data._source
         history.replaceState(self.article, self.article.lemmas.map(x => x.word).join(', '))
       })
-
+    }
   }
 }
 </script>
@@ -79,6 +104,7 @@ export default {
   color: #2c3e50;
   margin-top: 60px;
   margin-left: 30%;
+  margin-right: 10%;
 }
 
 .autocomplete {
diff --git a/src/components/Article.vue b/src/components/Article.vue
index 352048d5..33c76848 100644
--- a/src/components/Article.vue
+++ b/src/components/Article.vue
@@ -1,7 +1,7 @@
 <template>
-  <div class="article">
+  <div class="article" v-show="article.lemmas.length">
     <Header :lemmas="article.lemmas" />
-    <div class="">
+    <div class="" v-if="article.etymology">
       <h3>Etymologi</h3>
         <ul>
           <DefElement v-for="(element, index) in article.etymology" :key="index" :body='element' v-if="element.content" />
diff --git a/src/components/Header.vue b/src/components/Header.vue
index 50bccf65..f31b9e63 100644
--- a/src/components/Header.vue
+++ b/src/components/Header.vue
@@ -19,9 +19,10 @@
 </template>
 
 <script>
-import VueTooltipster from './vue-tooltipster.vue';
-import jQuery from 'jquery';
-window.jQuery = jQuery;
+import helpers from '../utils/helpers.js'
+import VueTooltipster from './vue-tooltipster.vue'
+import jQuery from 'jquery'
+window.jQuery = jQuery
 
 export default {
   name: 'Header',
@@ -37,13 +38,7 @@ export default {
       ).join(', ')
     },
     group_list: function() {
-      var grp_collection = new Set()
-      this.lemmas.forEach(function(lemma){
-        lemma.inflection_groups.forEach(function(grp){
-          grp_collection.add(grp.group_designation)
-        })
-      })
-      return Array.from(grp_collection).join(';')
+      return helpers.group_list(this.lemmas)
     }
   },
   components: {
diff --git a/src/components/SearchResults.vue b/src/components/SearchResults.vue
new file mode 100644
index 00000000..fe2b4356
--- /dev/null
+++ b/src/components/SearchResults.vue
@@ -0,0 +1,34 @@
+<template>
+  <div class="">
+    <h2 v-if="hits.length">Søkeresultater</h2>
+    <ul>
+      <li v-for="result in extended_results">
+        <a :href="result.id">{{result.label}}</a> ({{result.classification}})
+      </li>
+    </ul>
+  </div>
+</template>
+
+<script>
+import helpers from '../utils/helpers.js'
+export default {
+  name: 'SearchResults',
+  props: {
+    hits: Array
+  },
+  computed: {
+    extended_results: function(){
+      return this.hits.map(
+        function(hit){
+          return {
+              id: hit._id,
+              label: hit._source.lemmas.map(x => x.word).join(', '),
+              article: hit._source,
+              classification: helpers.group_list(hit._source.lemmas)
+          }
+      })
+    }
+  }
+}
+
+</script>
diff --git a/src/utils/helpers.js b/src/utils/helpers.js
new file mode 100644
index 00000000..460db5eb
--- /dev/null
+++ b/src/utils/helpers.js
@@ -0,0 +1,11 @@
+var group_list = function(grps) {
+  var grp_collection = new Set()
+  grps.forEach(function(lemma){
+    lemma.inflection_groups.forEach(function(grp){
+      grp_collection.add(grp.group_designation)
+    })
+  })
+  return Array.from(grp_collection).join(';')
+}
+
+export default { group_list}
-- 
GitLab