HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/blijegasten/blijegasten.be/resources/js/site/components/searchHandler.js
/* ==========================================================================
    Search handler

    TODO: Rewrite this into js-classes when you're using it then commit it back to KMS plx
 ========================================================================== */

const SearchHandler = {

    form: null,
    apiRoute: null,
    searchField: null,
    resultsArea: null,
    lastSearchValue: '',

    init: function () {

        SearchHandler.searchbar = document.querySelector('.js-search');

        if (SearchHandler.searchbar) {

            SearchHandler.apiRoute = SearchHandler.searchbar.dataset.apiRoute;

            SearchHandler.searchField = SearchHandler.searchbar.querySelector('.js-search-field');
            SearchHandler.resultsArea = SearchHandler.searchbar.querySelector('.js-search-results');

            SearchHandler.searchField.addEventListener('focus', SearchHandler.typeEvent);
            SearchHandler.searchField.addEventListener('keyup', SearchHandler.typeEvent);
            SearchHandler.searchField.addEventListener('keypress', debounce(SearchHandler.searchEvent, 300));

            // If there is a click on the document
            document.addEventListener('click', function (event) {

                // And if it's outside the searchbar we close it (else we probably click on a search result :)
                const isClickInside = SearchHandler.searchbar.contains(event.target);
                if(!isClickInside) SearchHandler.resultsArea.hidden = true;
            });

        }
    },

    typeEvent: function (event) {
        const searchValue = SearchHandler.searchField.value;

        SearchHandler.resultsArea.hidden = false;

        if(searchValue !== SearchHandler.lastSearchValue) {
            SearchHandler.showNoResultMessage(searchValue);
        }
    },

    searchEvent: async function (event) {

        const searchValue = SearchHandler.searchField.value;

        // We need atleast 3 characters
        if(searchValue.length <= 3) return;

        SearchHandler.lastSearchValue = searchValue;

        const searchResultCategories = await SearchHandler.search(searchValue);

        if(searchResultCategories.length <= 0) {
            return;
        }

        let resultHtml = '';

        Object.keys(searchResultCategories).forEach( key => {

            const resultsForCategory = searchResultCategories[key];

            resultsForCategory.forEach( result => {
                resultHtml += '<a class="c-searchbar__result" href="' + result.route + '">' + result.name + '<span class="c-searchbar__result-category">in ' + result.typeName +  '</span></a>';
            });
        });

        SearchHandler.resultsArea.innerHTML = resultHtml;
    },

    search: function (query) {
        return new Promise(function(resolve, reject) {
            Ajax.post(
                SearchHandler.apiRoute,
                {query: query},
                function (xhr) {

                    if(xhr.status !== 200) {
                        reject();
                    }

                    const response = JSON.parse(xhr.response);
                    resolve(response);
                }
            );
        });
    },

    showNoResultMessage: function(term) {

        SearchHandler.lastSearchValue = term;

        const noResultHref = SearchHandler.searchbar.action + "?" + SearchHandler.searchField.name + "=" + term;
        SearchHandler.resultsArea.innerHTML = "<a class='c-searchbar__no-results' href='" + noResultHref + "'>" + SearchHandler.resultsArea.dataset.noResult + " <strong>" + term + "</strong></a>";
    },

    processSearchResponse: function (response) {
        if (!SearchHandler.validateSearchResponse(response)) return;
        if (typeof response.data !== 'undefined' && response.data.length > 0) {
            while (this.resultHolder.children.length > 0) {
                this.resultHolder.removeChild(this.resultHolder.firstChild);
            }

            console.log(response.data);
            length = response.data.length;
            let items = [];

            for (let index = 0; index < length; index++) {
                console.log(response.data[index]);
                let item = {
                    id: response.data[index].id,
                    type: response.data[index].type,
                    name: response.data[index].attributes.translation[0].attributes.name,
                };
                items.push(item);
            }

            this.resultHolder.appendChild(document.createElement('ul'));

            for (let index = 0; index < length; index++) {
                let element = document.createElement('li');
                element.setAttribute('data-id', items[index].id);
                element.setAttribute('data-type', items[index].type);
                element.innerText = items[index].name;

                this.resultHolder.children[0].appendChild(element);
            }
        } else {
            while (this.resultHolder.children.length > 0) {
                this.resultHolder.removeChild(this.resultHolder.firstChild);
            }
            this.resultHolder.innerHTML = "<p>Geen zoekresultaten</p>";
        }
    },

    validateSearchResponse: function (response) {
        if (
            isset(response) &&
            response.hasOwnProperty('data') &&
            response.hasOwnProperty('meta')
        ) return response;

        console.error('Search response was not valid');
        return false;
    }
};

SearchHandler.init();