From 096bdefe70723d7fb4ac17c51888a6c357778fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Volds=C3=A6ter?= <ole.voldsater@uib.no> Date: Fri, 28 Feb 2020 10:26:42 +0100 Subject: [PATCH] =?UTF-8?q?preview=20i=20s=C3=B8keforslag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 19 +++++++------ src/components/Preview.vue | 58 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 src/components/Preview.vue diff --git a/src/App.vue b/src/App.vue index 4884945..611cea2 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,7 +2,12 @@ <main id="app"> <img alt="Vue logo" src="./assets/logo.png"> <header> - <autocomplete :debounceTime="150" :auto-select="true" :search="search" :get-result-value="result_view" @submit="select_result" placeholder="søk..." ref="search"></autocomplete> + <autocomplete :debounceTime="100" :auto-select="true" :search="search" @submit="select_result" placeholder="søk..." ref="search"> + <template #result="{result, props}"> + <Preview v-bind="props" :searchHit="result"> + </Preview> + </template> + </autocomplete> <input type="radio" id="radio_nob" value="nob" v-model="lang"> <label for="radio_nob">Bokmål</label> <input type="radio" id="radio_nno" value="nno" v-model="lang"> @@ -17,6 +22,7 @@ <script> import axios from "axios" import Article from './components/Article.vue' +import Preview from './components/Preview.vue' import SearchResults from './components/SearchResults.vue' import Autocomplete from '@trevoreyre/autocomplete-vue' import '@trevoreyre/autocomplete-vue/dist/style.css' @@ -38,13 +44,7 @@ export default { search_results: [], lang: 'nob', waiting: true, - article: {lemmas: [], body:{pronunciation: [], definitions: [], etymology: []}}, - result_view: function(result) { - if (result._source) - return result._source.lemmas.map(x => x.lemma).join(', ') - else - return 'Alle søkeresultater...' - } + article: {lemmas: [], body:{pronunciation: [], definitions: [], etymology: []}} } }, computed: { @@ -74,7 +74,8 @@ export default { components: { Article, Autocomplete, - SearchResults + SearchResults, + Preview }, methods: { select_result: function(event) { diff --git a/src/components/Preview.vue b/src/components/Preview.vue new file mode 100644 index 0000000..0bb0676 --- /dev/null +++ b/src/components/Preview.vue @@ -0,0 +1,58 @@ +<template> + <li> + <div class="preview"> + <h4>{{searchHit.text || "Alle søkeresultater..."}}</h4> + <h5 v-if="searchHit._source">{{group_list}}</h5> + {{previewText.substring(0, 40) + (previewText ? '...' : '')}} + </div> + </li> +</template> + +<script> +import entities from '../utils/entities.js' +import languages from '../utils/languages.js' +import helpers from '../utils/helpers.js' + +export default { + name: 'Preview', + props: { + searchHit: Object + }, + computed: { + previewText: function(){ + if (! this.searchHit._source) return '' + let element = this.searchHit._source.body.definitions[0] + while (element.type_ == 'definition') element = element.elements[0] + if (element.type_ == 'example') { + element = element.quote + } else if (! element.content){ + element = {content: '', items: []} + } + + let replacements = element.items.map(item => item.text || + item.string || + entities[item.id] || + languages[item.id] || + item.id || + (item.lemmas || []).join(',')).reverse() + + let replacement = () => replacements.pop() + + return element.content.replace(/\$/gi, replacement) + }, + group_list: function() { + return helpers.group_list(this.searchHit._source.lemmas) + } + }, + components: { + + } +} + +</script> +<style scoped> +h4, h5 { + padding: 0px; + margin: 0px; +} +</style> -- GitLab