diff --git a/src/components/Autocomplete.vue b/src/components/Autocomplete.vue index 781f2fa2d48e14921a316a807f5abc69cbb59104..d80298048f3e1647de4b52361f65f8ed7f0748b0 100644 --- a/src/components/Autocomplete.vue +++ b/src/components/Autocomplete.vue @@ -29,7 +29,7 @@ <span class="search-hit"> {{data.item.label}} </span> - ({{data.item.lang? data.item.lang[1] ? "bm, nn" : {"bob": "bm", "nob": "nn"}[data.item.lang[0]] : data.item.mode}}) + ({{data.item.lang? data.item.lang[1] ? "bm, nn" : {"bob": "bm", "nob": "nn"}[data.item.lang[0]] : ["fulltekst","fritekst","avansert søk"][data.item.mode]}}) </template> <template slot="no-data"> <div></div> @@ -79,42 +79,37 @@ // Keep full text search in the list while requesting suggestions if (this.items[0]) { if (this.items[0].time < time) { - this.items.splice(0,1, {q: q, label: q, time: time, mode: 'fritekst'}) + if (/_|\*|\|/.test(q)) { + this.items.splice(0,1, {q: q, label: q, time: time, mode: 2}) + } else { + this.items.splice(0,1, {q: q+"*", label: q, time: time, mode: 1}) + } + } } else { - this.items.push({q: q, label: q, time: time}) + this.items.splice(0,1, {q: q+"*", label: q, time: time, mode: 1}) } let self = this self.api.get('suggest?', {params: {q: q, dict: self.$parent.lang, n: 80, scope: 'nf'}}) .then(async (response) => { if (self.$refs.autocomplete.searchInput == q & self.suggesting) { - let word_hits = response.data.a.n.map(item => ({q: q, match: item[0], label: item[0], time: time, lang: item[1]})) - let text_hits = response.data.a.f.map(item => ({q: q, match: item[0], label: item[0], time: time, mode: 0})) + let word_matches = response.data.a.n.map(item => ({q: q, match: item[0], label: item[0], time: time, lang: item[1]})) + let text_matches = response.data.a.f.map(item => ({q: q, match: item[0], label: item[0], time: time, mode: 0})) - let hits = [] - if( q.charAt(q.length-1) === '!') hits = text_hits.concat(word_hits) - else hits = word_hits.concat(text_hits) + let suggestions = [] + if( q.charAt(q.length-1) === '!') suggestions = text_matches.concat(word_matches) + else suggestions = word_matches.concat(text_matches) if (/_|\*|\|/.test(q)) { - hits.push({q: q, label: q + ' ', time: time, mode: "mønster"}) + suggestions.unshift({q: q, label: q, time: time, mode: 2}) + } else { + suggestions.push({q: q+"*", label: q + ' ', time: time, mode: 1}) } - - response.data.a.n.forEach((item) => { - let match = item[0] - let hit = {q: q, match: match, label: match, time: time, lang: item[1]} - hits.push(hit) - - }); - response.data.a.f.forEach((item) => { - let match = item[0] - let hit = {q: q, match: match, label: match, time: time, mode: "fulltekst"} - hits.push(hit) - }); // whitespace necessary because duplicates aren't allowed in the dropdown - hits.push({q: q, label: q + ' ', time: time, mode: "fritekst"}) - self.items = hits + + self.items = suggestions } self.loading = false }) diff --git a/src/components/DictionaryView.vue b/src/components/DictionaryView.vue index 5dbf2da79e204d30b33bd9b7af9cf0c31c12de2a..901ea4fe9909c6afc5d4a6817f3933271d6fb97a 100644 --- a/src/components/DictionaryView.vue +++ b/src/components/DictionaryView.vue @@ -87,6 +87,7 @@ const oda_api = setup({ }) + const api_endpoint = process.env.VUE_APP_API_PREFIX + '/api/dict' const oda_dev = 'https://oda.uib.no/opal/dev' @@ -151,16 +152,14 @@ function navigate_to_search(self, query) { function navigate_to_word(self, word) { - let event = self.event ? self.event : {q: word, - match: word} - + let query = self.event ? self.event : {q: word} // Get article IDs - oda_api.get('articles?', {params: {lord: event.match, dict: self.lang}}).then((response) => { - event.article_ids = response.data + oda_api.get('articles?', {params: {lord: query.match || query.q, dict: self.lang}}).then((response) => { + let article_ids = response.data let unwrapped = [] - for (const d in event.article_ids) { - event.article_ids[d].forEach(i => unwrapped.push({ + for (const d in article_ids) { + article_ids[d].forEach(i => unwrapped.push({ dictionary: d, id: i })) @@ -174,14 +173,17 @@ function navigate_to_word(self, word) { .then((response) => { self.search_results = response.map((element, index) => { return Object.assign(element.data, { - match: event.match, dictionary: unwrapped[index].dictionary }) }) self.article = null if (! self.search_results.length) { - dicts[self.lang] - self.error = `Ordet «${event.match}» finnes ikke i ${dicts}` + if (query.match) { + self.error = `Ordet «${query.match}» finnes ikke i ${dicts[self.lang]}` + } else { + self.error = `Søk på «${query.q}» gir ingen treff i ${dicts[self.lang]}. Søk med * inne i ordet dersom du er usikker på skrivemåten. Bruk knappen «begge ordbøkene» om du har søkt i feil ordbok.` + } + } else { self.error = null @@ -242,35 +244,22 @@ export default { methods: { select_result: function (event) { this.event = event - if (event.match) { - let route = `/${this.lang}/w/${event.match}` - this.$router.push(route) - navigate_to_word(this) - } else { - this.waiting_for_articles = true - this.article = null - - event.match = '<fritekstsøk>' - let route = `/${this.lang}/search/${event.q}` - this.$router.push(route) - navigate_to_search(this, event.q) - } + let route = `/${this.lang}/search/${event.match || event.q}` + this.$router.push(route) + navigate_to_word(this) + // Tracking + let props = {query: event.q} + if (event.match) props.match = event.match this.$plausible.trackEvent(event.update_lang ? "language" : 'dropdown selection', { - props: { - query: event.q, - match: event.match - } + props: props }) }, update_lang_form: function (lang) { this.lang = lang - if(this.$route.name == 'word') { - navigate_to_word(this, this.$route.params.word) - } - else if (this.$route.name == 'search') { - navigate_to_search(this, this.$route.params.query) - } + let route = `/${this.lang}/search/${this.$route.params.query}` + this.$router.push(route) + navigate_to_word(this, this.$route.params.query) }, article_link_click: function(item) { if (this.article && this.article.article_id == item.article_id){