window.addEventListener('DOMContentLoaded', function (event) { const typeId = document.querySelector('#article-search').dataset.typeId; Vue.directive('click-outside', { bind: function (el, binding, vnode) { el.clickOutsideEvent = function (event) { // here I check that click was outside the el and his children if (!(el == event.target || el.contains(event.target))) { // and if it did, call method provided in attribute value vnode.context[binding.expression](event); } }; document.body.addEventListener('click', el.clickOutsideEvent); }, unbind: function (el) { document.body.removeEventListener('click', el.clickOutsideEvent); }, }); var search = new Vue({ el: '.search-wrapper', data: { siteId: null, language: '', apiUrl: '', mode: '', search: '', searchVisible: false, articles: [], tags: [], featuredTags: [], featuredTagsLoaded: false, searchYield: false, }, mounted() { this.searchContent(false).then((data) => { var urlTagID = this.getUrlParam('tagId'); if (urlTagID) { var tagName = ''; this.tags.forEach(function (item, index) { if (urlTagID == item.id) tagName = item.name; }); if (tagName != '') { this.searchByTag(tagName, urlTagID); } } }); }, created() { this.language = document.getElementById('language').value; this.siteId = document.getElementById('siteId').value; this.apiUrl = document.getElementById('serverUrl').value; this.mode = document.getElementById('mode').value; }, watch: { search: function (val) { // Start the search only when user enters 3 or more letters this.searchVisible = false; if (val == '') { this.searchContent(false); } else if (val.length >= 3 && !this.searchYield) { this.searchContent(true); } else { searchResults.$data.articles = []; searchResults.$data.tags = []; searchResults.$data.resultMessage = 'No results.'; } this.searchYield = false; }, articles: function (val) { this.totalPages = Math.ceil(val.length / 3); this.currentPage = 1; this.resultCount = val.length; }, }, methods: { fetchData: function () { return new Promise((resolve, reject) => { var url = this.apiUrl + 'api/dynamic/' + 'searchArticles?q=' + this.search + '&language=' + this.language + '&siteId=' + this.siteId + '&mode=' + this.mode + '&typeId=' + typeId; axios .get(url) .then((response) => { resolve(response.data); }) .catch((error) => { reject(error); }); }); }, fetchDataTag: function (tagId) { return new Promise((resolve, reject) => { var url = this.apiUrl + 'api/dynamic/' + 'searchArticlesByTag?tagId=' + tagId + '&language=' + this.language + '&siteId=' + this.siteId + '&mode=' + this.mode + '&typeId=' + typeId; axios .get(url) .then((response) => { resolve(response.data); }) .catch((error) => { reject(error); }); }); }, goTo: function (url) { document.location.href = url; }, searchContent: function (showSearch) { return new Promise((resolve, reject) => { this.search = $('#article-search').val(); this.fetchData() .then((data) => { if ((data.articles && data.articles.length != 0 ) || (data.tags && data.tags.length != 0)) { if (showSearch) this.searchVisible = true; // Hacky solution to get two VUE instances to communicate with each other with jquery. searchResults.$data.articles = data.articles; searchResults.$data.tags = data.tags; var searchText = ''; if (this.search != '') { searchText = '
"' + this.search + '"'; } searchResults.$data.resultMessage = 'Search results' + searchText; } else { this.searchVisible = false; // Hacky solution to get two VUE instances to communicate with each other with jquery. searchResults.$data.articles = []; searchResults.$data.tags = []; searchResults.$data.resultMessage = 'No results.'; } this.articles = data.articles; if (!showSearch && !this.featuredTagsLoaded) { this.featuredTagsLoaded = true; this.featuredTags = data.tags; } this.tags = data.tags; resolve(data); }) .catch((error) => { reject(error); }); }); }, searchContentTag: function (tagId) { this.search = $('#article-search').val(); this.fetchDataTag(tagId) .then((data) => { if (data.articles.length != 0) { this.searchVisible = false; // Hacky solution to get two VUE instances to communicate with each other with jquery. searchResults.$data.articles = data.articles; var searchText = ''; if (this.search != '') { searchText = '
"' + this.search + '"'; } searchResults.$data.resultMessage = 'Search results' + searchText; } else { this.searchVisible = false; // Hacky solution to get two VUE instances to communicate with each other with jquery. searchResults.$data.articles = []; searchResults.$data.resultMessage = 'No results.'; } this.articles = data.articles; // console.log(data); }) .catch((error) => { // console.log(error); }); }, changeSearch: function () {}, closeAutoComplete: function (event) { // do something - probably hide the dropdown menu / modal etc. this.searchVisible = false; }, searchByTag: function (tagName, tagId) { this.searchYield = true; this.searchContentTag(tagId); this.searchVisible = false; this.search = tagName; }, getUrlParam: function (name) { var results = new RegExp('[?&]' + name + '=([^&#]*)').exec( window.location.search ); return results !== null ? results[1] || 0 : false; }, }, }); var searchResults = new Vue({ el: '.search-result', data: { resultJSON: null, articles: null, paginatedArticles: null, tags: null, resultMessage: 'No results.', totalPages: 0, currentPage: 0, resultCount: 0, itemsPerPage: 8, }, mounted() {}, created() { this.apiUrl = document.getElementById('serverUrl').value; this.siteId = document.getElementById('siteId').value; }, watch: { articles: function (val) { this.resultCount = val.length; this.totalPages = Math.ceil(this.resultCount / this.itemsPerPage); this.currentPage = 0; this.paginatedArticles = this.paginate(val); }, currentPage: function (val) { this.paginatedArticles = this.paginate(this.articles); }, }, methods: { goTo: function (url) { document.location.href = url; }, addToBasket: function (id, name, checkout) { const data = {"siteId":this.siteId,"productId":id,"quantity":"1","orderId": getCookie('orderId') || 0 } axios.post(this.apiUrl + 'ecom/addToBasket', data).then(function(response){ //!sessionStorage.getItem('orderId') && sessionStorage.setItem('orderId', response.data.id) !getCookie('orderId') && setCookie('orderId', response.data.id, 1) basketProducts.updateBasket(response.data, name) if(checkout) goToCheckout() }) }, setPage: function (number) { this.currentPage = number; }, paginate: function (list) { if (list !== null) { this.resultCount = list.length; if (this.currentPage >= this.totalPages) { this.currentPage = this.totalPages - 1; } var index = this.currentPage * this.itemsPerPage; return list.slice(index, index + this.itemsPerPage); } else { return null; } }, }, computed: {}, }); });