From d2bcf1f60dc15415d0a3c62c0d53383732e34cf3 Mon Sep 17 00:00:00 2001 From: Levin Herr Date: Thu, 27 Jun 2024 19:17:30 +0200 Subject: [PATCH] :sparkles: Improve autocomplete-input (#2714) --- .../vue/components/StationAutocomplete.vue | 77 +++++++++++++++---- 1 file changed, 63 insertions(+), 14 deletions(-) diff --git a/resources/vue/components/StationAutocomplete.vue b/resources/vue/components/StationAutocomplete.vue index b6e7e74ca..9cec12ae5 100644 --- a/resources/vue/components/StationAutocomplete.vue +++ b/resources/vue/components/StationAutocomplete.vue @@ -7,6 +7,7 @@ import '@vuepic/vue-datepicker/dist/main.css' import {DateTime} from "luxon"; import {useUserStore} from "../stores/user"; import AutocompleteListEntry from "./Checkin/AutocompleteListEntry.vue"; +import Spinner from "./Spinner.vue"; export default { setup() { @@ -17,7 +18,7 @@ export default { }, name: "StationAutocomplete", emits: ["update:station", "update:time", "update:travelType"], - components: {AutocompleteListEntry, FullScreenModal, VueDatePicker}, + components: {Spinner, AutocompleteListEntry, FullScreenModal, VueDatePicker}, props: { station: { type: Object, @@ -61,6 +62,7 @@ export default { selectedStation: null, selectedType: null, fetchingGps: false, + fetchingTextInput: false, travelTypes: [ {value: "express", color: "rgba(197,199,196,0.5)", icon: "fa-train", contrast: true}, {value: "regional", color: "rgba(193,18,28,0.5)", icon: "fa-train"}, @@ -100,14 +102,17 @@ export default { this.loading = false; return; } - let query = this.stationInput.replace(/%2F/, " ").replace(/\//, " "); - fetch(`/api/v1/trains/station/autocomplete/${query}`).then((response) => { - response.json().then((result) => { - this.autocompleteList = result.data; - this.loading = false; - }); + + this.fetchAutocomplete().then((result) => { + this.autocompleteList = result.data; + this.loading = false; }); }, + async fetchAutocomplete() { + let query = this.stationInput.replace(/%2F/, " ").replace(/\//, " "); + const res = await fetch(`/api/v1/trains/station/autocomplete/${query}`); + return await res.json(); + }, showPicker() { this.$refs.picker.openMenu(); }, @@ -115,7 +120,13 @@ export default { this.$emit("update:time", DateTime.fromJSDate(this.date).setZone('UTC').toISO()); }, setStationFromText() { - this.setStation({name: this.stationInput}); + this.fetchingTextInput = true; + this.fetchAutocomplete().then((result) => { + this.fetchingTextInput = false; + this.setStation(result.data.shift()); + }).catch(() => { + this.fetchingTextInput = false; + }); }, setStation(item) { this.stationInput = item.name; @@ -148,6 +159,10 @@ export default { notyf.error(trans("stationboard.position-unavailable")); } ); + }, + clearInput() { + this.stationInput = ""; + this.$refs.stationInput.focus(); } }, watch: { @@ -184,14 +199,22 @@ export default {