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/SBogers10/csb.komma.pro/resources/js/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: document.getElementById('searchForm'),
    searchBar: document.getElementById('searchbar'),
    resultHolder: document.getElementById('searchresults'),
    searchUrl: null,

    init : function() {
        if(this.form && isset(this.form.dataset.searchUrl)) {
            this.searchUrl = this.form.dataset.searchUrl;
            let languageId = this.searchBar.dataset.languageId;
            console.debug('searchHandler initialized with searchUrl: ' + this.searchUrl);

            this.searchBar.addEventListener('keydown', debounce(function () {
                SearchHandler.search(SearchHandler.searchBar.value, 1, 5, languageId);
            }, 200));
        }
    },

    search: function(term, page = 1, amount = 10, language_id = null) {
        if(term === "") return;

        let xhr = new XMLHttpRequest();
        let token = document.querySelector('meta[name="csrf-token"]').content;

        let queryParams = {
            'term': term,
            'page': page,
            'amount': amount,
            'language_id': language_id
        };

        let queryUrlPart = '';
        for(let param in queryParams) queryUrlPart += ((queryUrlPart !== '') ? '&' : '?')+param+'='+encodeURIComponent(queryParams[param]);

        xhr.open('get', this.searchUrl+queryUrlPart, true);
        xhr.responseType = 'json';
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
        xhr.setRequestHeader('X-CSRF-TOKEN', token);
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                if(xhr.status === 200) {
                    SearchHandler.processSearchResponse(xhr.response);
                } else {
                    console.error('SearchHandler: Could not search because of an error. '+xhr.statusText);
                }
            }
        };
        xhr.send();
    },

    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();