Skip to content
Snippets Groups Projects

OER-Campus: Fixes for Quicksearch Vue component

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Jan-Hendrik Willms
    Edited
    oer-qs.patch 5.00 KiB
    Index: resources/vue/components/Quicksearch.vue
    ===================================================================
    --- resources/vue/components/Quicksearch.vue	(revision 61227)
    +++ resources/vue/components/Quicksearch.vue	(working copy)
    @@ -2,13 +2,12 @@
         <span :class="'quicksearch_container' + (containerclass ? ' ' + containerclass : '')">
             <input type="hidden"
                    :name="name"
    -               :value="value"
    +               :value="returnValue"
                    v-if="!autocomplete">
             <input type="text"
                    :name="autocomplete ? name : null"
    -               :value="autocomplete ? value : needle"
    +               v-model="inputValue"
                    autocomplete="off"
    -               @input="search"
                    @blur="reset"
                    @keydown.up="selectUp"
                    @keydown.down="selectDown"
    @@ -69,62 +68,52 @@
                 debounceTimeout: null,
                 selected: null,
                 results: [],
    -            errorMessage: null
    +            errorMessage: null,
    +            inputValue: this.autocomplete ? this.value : this.needle,
    +            returnValue: this.autocomplete ? this.value : this.needle
             };
         },
         methods: {
    -        search (event) {
    -            let searchtext = event.target.value;
    -            let v = this;
    -            if (this.autocomplete) {
    -                v.value = searchtext;
    -            } else {
    -                v.needle = searchtext;
    -            }
    -            this.$emit('input', searchtext);
    +        search (needle) {
    +            this.$emit('input', needle);
    +
                 clearTimeout(this.debounceTimeout);
                 this.debounceTimeout = setTimeout(() => {
    -                if (searchtext.length > 2) {
    +                let data = []
    +                if ($(this.$el).closest("form").length > 0) {
    +                    data = $(this.$el).closest("form").serializeArray();
    +                }
    +                data.push({
    +                    name: "request",
    +                    value: needle
    +                });
     
    -                    let data = []
    -                    if ($(event.target).closest("form").length > 0) {
    -                        data = $(event.target)
    -                            .closest("form")
    -                            .serializeArray();
    -                    }
    -                    data.push({
    -                        name: "request",
    -                        value: searchtext
    -                    });
    +                $.post(
    +                    STUDIP.URLHelper.getURL("dispatch.php/quicksearch/response/" + this.searchtype),
    +                    data
    +                ).done(response => {
    +                    this.selected = null;
    +                    this.results = response;
    +                    this.errorMessage = null;
    +                }).fail(response => {
    +                    this.errorMessage = response.responseText;
    +                }).always(() => {
    +                    this.searching = false;
    +                });
     
    -                    $.ajax({
    -                        url: STUDIP.URLHelper.getURL("dispatch.php/quicksearch/response/" + v.searchtype),
    -                        data: data,
    -                        type: "post",
    -                        success: function (response) {
    -                            v.selected = null;
    -                            v.results = response;
    -                            v.searching = false;
    -                            v.errorMessage = null;
    -                        },
    -                        error: function (response) {
    -                            v.errorMessage = response.responseText;
    -                        }
    -                    });
    -                    this.searching = true;
    -                }
    +                this.searching = true;
                 }, 500);
             },
             select (result) {
    -            this.results = [];
    -            this.needle = result.item_search_name;
    -            let v = this;
    +            this.inputValue = result.item_search_name;
                 if (this.autocomplete) {
    -                this.value = result.item_search_name;
    +                this.returnValue = result.item_search_name;
                 } else {
    -                this.value = result.item_id;
    +                this.returnValue = result.item_id;
                 }
    -            this.$emit('select', result);
    +            this.results = [];
    +
    +            this.$emit('select', this.returnValue);
             },
             selectUp () {
                 if (this.selected > 0) {
    @@ -151,8 +140,10 @@
                 return false;
             },
             reset () {
    -            this.results = [];
    -            this.selected = null;
    +            setTimeout(() => {
    +                this.results = [];
    +                this.selected = null;
    +            }, 300);
             }
         },
         computed: {
    @@ -159,6 +150,13 @@
             isVisible() {
                 return this.results.length > 0 || this.errorMessage !== null;
             }
    +    },
    +    watch: {
    +        inputValue (needle) {
    +            if (needle.length > 2) {
    +                this.search(needle);
    +            }
    +        }
         }
     }
     </script>
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment