{"version":3,"file":"blogSearch.js","mappings":";AAAA;AACA;AACA;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA,4BAA4B,YAAY;AACxC,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW,WAAW,OAAO,oBAAoB;AAC/D,cAAc,SAAS,WAAW,OAAO,oBAAoB;AAC7D,iBAAiB,eAAe,WAAW,OAAO,oBAAoB;AACtE;AACA,SAAS;AACT,gBAAgB,QAAQ;AACxB;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAgB,EAAE,QAAQ,IAAI,IAAI;AAC/D;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB,UAAU,SAAS,GAAG,UAAU;AAC5E;AACA;AACA;AACA,8BAA8B,WAAW,2BAA2B,gBAAgB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB,UAAU,SAAS,GAAG,UAAU;AAC1E;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,uBAAuB,uBAAuB,UAAU,SAAS,GAAG,UAAU;AAC9E,gBAAgB;AAChB;AACA;AACA;AACA,qBAAqB,8BAA8B;AACnD,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,mIAAmI,kBAAkB;AACrJ;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,CAAC","sources":["webpack://build/../laviesports/assets/javascripts/blogSearch.js"],"sourcesContent":["const BlogSearch = {\r\n // Token liberado somente para o endpoint /api/collections/get/posts\r\n Token: '1f67b2941385137ce577fb4014ab4d',\r\n baseURLApi: `${window.location.origin}/admin/conteudo`,\r\n baseList: document.querySelector('[data-posts-list]'),\r\n initialPosts: '',\r\n searchParam: '',\r\n\r\n // ====================================================== //\r\n // ================ Faz o fetch dos posts =============== //\r\n // ====================================================== //\r\n api(search) {\r\n const _this = this;\r\n\r\n fetch(`${_this.baseURLApi}/api/collections/get/posts`, {\r\n method: 'post',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Cockpit-Token': `${_this.Token}`,\r\n },\r\n body: JSON.stringify({\r\n filter: {\r\n publish: true,\r\n // Pode usar $and\r\n $or: [\r\n // $options faz com que a filtragem não seja case sensitive\r\n { content: { $regex: `${search}`, $options: 'i' } },\r\n { title: { $regex: `${search}`, $options: 'i' } },\r\n // { description: { $regex: `${search}`, $options: 'i' } },\r\n ],\r\n },\r\n sort: { _o: -1 },\r\n populate: 1,\r\n }),\r\n })\r\n .then((res) => res.json())\r\n .then((res) => {\r\n // Lista os posts\r\n _this.listPosts(res.entries);\r\n\r\n // Seta o spinner de loading como false e remove o spinner\r\n _this.setIsLoading(true);\r\n\r\n // Scroll para o topo da página\r\n _this.scrollToTop();\r\n console.log(res);\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n // Seta o spinner de loading como false e remove o spinner\r\n _this.setIsLoading(false);\r\n });\r\n },\r\n\r\n // ================================================================== //\r\n // Responsável por guardar os posts iniciais ao carregar a página //\r\n // ================================================================== //\r\n maintainActualPosts() {\r\n const _this = this;\r\n const Posts = document.querySelector('[data-posts-list]').innerHTML;\r\n\r\n // Guarda os posts iniciais\r\n _this.initialPosts = Posts;\r\n },\r\n\r\n // ====================================================== //\r\n // Função para atrasar a busca, executa ao término do timer //\r\n // ====================================================== //\r\n debounce(cb, delay) {\r\n let timeout;\r\n return (...args) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n cb(...args);\r\n }, delay);\r\n };\r\n },\r\n\r\n // ====================================================== //\r\n // Faz com que o scroll volte para o topo da página após a busca //\r\n // ====================================================== //\r\n scrollToTop() {\r\n // A ancora do scroll é um span com o atributo data-anchor\r\n document.querySelector('[data-anchor]').scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n });\r\n },\r\n\r\n // ====================================================== //\r\n // == Ajusta a data dos posts para o formato brasileiro = //\r\n // ====================================================== //\r\n dateAdjust(date) {\r\n const _this = this;\r\n const dateAdjust = date.split('-').reverse().join('.');\r\n return dateAdjust;\r\n },\r\n\r\n // ====================================================== //\r\n // ========= Seta o spinner de loading no input ========= //\r\n // ====================================================== //\r\n setIsLoading(boolean) {\r\n let spinner = document.querySelector('[data-search-spinner]');\r\n boolean == true ? spinner.classList.add('-visible') : spinner.classList.remove('-visible');\r\n },\r\n\r\n // ====================================================== //\r\n // ============= Monta o template dos posts ============= //\r\n // ====================================================== //\r\n formatarData(dataString) {\r\n const data = new Date(dataString);\r\n \r\n const meses = [\r\n \"JANEIRO\", \"FEVEREIRO\", \"MARÇO\", \"ABRIL\", \"MAIO\", \"JUNHO\",\r\n \"JULHO\", \"AGOSTO\", \"SETEMBRO\", \"OUTUBRO\", \"NOVEMBRO\", \"DEZEMBRO\"\r\n ];\r\n \r\n const nomeMes = meses[data.getMonth()];\r\n const ano = data.getFullYear();\r\n \r\n const dataFormatada = `${data.getDate()} ${nomeMes}, ${ano}`;\r\n \r\n return dataFormatada;\r\n },\r\n \r\n templatePost(post) {\r\n const _this = this;\r\n\r\n var permalink = post.title.toLowerCase();\r\n permalink = permalink.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\r\n permalink = permalink.replace(/[^a-zA-Z0-9]/g, ' ');\r\n permalink = permalink.replace(/\\s\\s+/g, ' ');\r\n permalink = permalink.trim();\r\n permalink = permalink.replaceAll(' ', '-'); \r\n\r\n const image = post.thumb.path\r\n ? `
\r\n \r\n
\r\n
\r\n
\r\n \"${post.title}\"\r\n
\r\n
\r\n
\r\n
\r\n
`\r\n : \r\n `
\r\n \r\n
\r\n
\r\n
\r\n \"${post.title}\"\r\n
\r\n
\r\n
\r\n
\r\n
`;\r\n\r\n return `\r\n
\r\n ${image}\r\n
\r\n \r\n
\r\n ${this.formatarData(post.date)} \r\n ${post.categories[0]}\r\n
\r\n
\r\n `;\r\n },\r\n\r\n // ====================================================== //\r\n // =========== Lista os posts seção setada ============== //\r\n // ====================================================== //\r\n listPosts(Posts) {\r\n const _this = this;\r\n\r\n // Limpa a lista\r\n document.querySelector('[data-posts-list]').innerHTML = '';\r\n\r\n // document.createDocumentFragment agrupa os elementos para serem inseridos de uma única vez\r\n // Evita que o DOM seja atualizado a cada novo elemento\r\n const fragmentDOM = document.createDocumentFragment();\r\n\r\n if (Posts.length > 0) {\r\n Posts.forEach((post) => {\r\n const template = _this.templatePost(post);\r\n fragmentDOM.appendChild(document.createRange().createContextualFragment(template));\r\n });\r\n\r\n // Insere o fragmento no DOM\r\n document.querySelector('[data-posts-list]').appendChild(fragmentDOM);\r\n\r\n // Atualiza o lazyload\r\n window.lazyLoadInstance.update();\r\n } else {\r\n document.querySelector('[data-posts-list]').innerHTML = ` A sua pesquisa por \"${_this.searchParam}\" não teve resultados :(`;\r\n }\r\n\r\n document.querySelector('.pagination-wrapper').style.display = 'none';\r\n },\r\n\r\n // ====================================================== //\r\n // Responsável por pegar o valor do input e ajustar a regex da busca //\r\n // ====================================================== //\r\n searchRegex(value) {\r\n // Remove os espaços em branco do início e do fim e adiciona o pipe (|)\r\n // Monta a regex da seguinte forma, ex: (palavra1|palavra2|palavra3)\r\n\r\n let regex = `(${value.replace(/( )+/g, '|')})`;\r\n\r\n // Trata a regex da busca\r\n if (regex.charAt(regex.length - 2) == '|') {\r\n // remove o ultimo caracter\r\n regex = regex.replace('|', '');\r\n }\r\n // console.log('REGEX', regex);\r\n this.api(regex);\r\n },\r\n\r\n // ====================================================== //\r\n // =========== FAZ A BUSCA COM O DEBOUNCE ============== //\r\n // ====================================================== //\r\n search() {\r\n const _this = this;\r\n const search = document.getElementById('searchBlog');\r\n\r\n // Listener com o debounce com delay de 1000ms para evitar o carregamento excessivo de requisições\r\n search.addEventListener(\r\n 'input',\r\n this.debounce((e) => {\r\n if (e.target.value !== '') {\r\n // Seta o loading do input para o usuário saber que está sendo feito uma busca\r\n _this.setIsLoading(true);\r\n\r\n // Mostra os posts de acordo com o que o usuário digitou\r\n _this.searchRegex(e.target.value);\r\n _this.searchParam = e.target.value;\r\n } else {\r\n // Se o campo estiver vazio, mostra os posts iniciais\r\n document.querySelector('[data-posts-list]').innerHTML = _this.initialPosts;\r\n document.querySelector('.pagination-wrapper').style.display = 'block';\r\n\r\n window.lazyLoadInstance.update();\r\n }\r\n }, 1000)\r\n );\r\n },\r\n\r\n init() {\r\n // Pega os posts iniciais\r\n this.search();\r\n\r\n window.onload = () => {\r\n this.maintainActualPosts();\r\n };\r\n },\r\n};\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n BlogSearch.init();\r\n});\r\n"],"names":[],"sourceRoot":""}