{"version":3,"file":"tag.js","mappings":"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","sources":["webpack://build/../leafjoias/assets/javascripts/components/utilities.js","webpack://build/../leafjoias/assets/javascripts/pages/tag/filters.js","webpack://build/../leafjoias/assets/javascripts/components/infinityScroll.js","webpack://build/../leafjoias/assets/javascripts/pages/tag.js"],"sourcesContent":["// ===============================================================\r\n// ADIÇÃO MANUAL DE ASSET\r\n// ===============================================================\r\n// Usado para incluir assets no código de forma manual, conforme a necessidade\r\nexport function addAsset(source, onloadCallback) {\r\n\r\n if (!source || source === '') return console.error(`addAsset: caminho não definido.`)\r\n\r\n if (source.includes('.js')) {\r\n const scriptTag = document.createElement('script')\r\n scriptTag.setAttribute('src', source);\r\n\r\n if (onloadCallback && typeof onloadCallback === 'function') {\r\n scriptTag.onload = onloadCallback\r\n }\r\n\r\n return document.body.appendChild(scriptTag)\r\n\r\n } else if (source.includes('.css')) {\r\n const linkTag = document.createElement('link')\r\n linkTag.setAttribute('rel', 'stylesheet')\r\n linkTag.setAttribute('type', 'text/css')\r\n linkTag.setAttribute('href', source)\r\n return document.head.appendChild(linkTag)\r\n\r\n } else {\r\n const error = `addAsset: Erro ao criar o asset. Tipo de script não definido, ou não possui tratamento para este tipo de asset.`\r\n return console.error(error, source)\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// BUSCA O CARRINHO ATIVO\r\n// ===============================================================\r\nexport async function getCart() {\r\n try {\r\n const response = await fetch('/carrinho');\r\n const cart = await response.json();\r\n return cart;\r\n } catch (error) {\r\n console.error('Erro ao buscar os dados do carrinho');\r\n console.error(error);\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// SERIALIZE ARRAY\r\n// ===============================================================\r\nexport function serializeArray(form) {\r\n\r\n const formData = new FormData(form);\r\n const data = {};\r\n\r\n for (const [name, value] of formData) {\r\n data[name] = value\r\n }\r\n\r\n const formBody = [];\r\n\r\n for (const key in data) {\r\n const encodeKey = encodeURIComponent(key)\r\n const encodeValue = encodeURIComponent(data[key])\r\n formBody.push(`${encodeKey}=${encodeValue}`)\r\n }\r\n\r\n return formBody = formBody.join('&')\r\n \r\n}\r\n\r\n// ===============================================================\r\n// URL ENCODE FORM DATA\r\n// ===============================================================\r\nexport function urlencodeFormData(formData) {\r\n let string = '';\r\n\r\n function encode(s) {\r\n return encodeURIComponent(s).replace(/%20/g, '+');\r\n }\r\n\r\n for (const pair of formData.entries()) {\r\n if (typeof pair[1] == 'string') {\r\n string += (string ? '&' : '') + encode(pair[0]) + '=' + encode(pair[1]);\r\n }\r\n }\r\n return string;\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE TOGGLE\r\n// ===============================================================\r\nexport function slideToggle(contentWrapper, content, duration = 500) {\r\n let initialHeight = window.getComputedStyle(contentWrapper).height;\r\n\r\n if (initialHeight == '0px') {\r\n return slideDown(contentWrapper, content, duration);\r\n } else {\r\n return slideUp(contentWrapper, duration);\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE UP\r\n// ===============================================================\r\nexport function slideUp(contentWrapper, duration = 500) {\r\n contentWrapper.style.height = '0px';\r\n contentWrapper.style.transition = `height ${duration} ease`;\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE DOWN\r\n// ===============================================================\r\nexport function slideDown(contentWrapper, content, duration = 500) {\r\n let innerHeight = content.clientHeight;\r\n\r\n contentWrapper.style.height = `${innerHeight}px`;\r\n contentWrapper.style.transition = `height ${duration} ease`;\r\n}\r\n\r\n// ===============================================================\r\n// UPDATE DISCOUNT IN PRODUCT BLOCK\r\n// ===============================================================\r\nexport function updatePriceBlock() {\r\n const priceEls = document.querySelectorAll('[data-init-price]');\r\n\r\n if (priceEls == null) return;\r\n\r\n priceEls.forEach((priceEl) => {\r\n const discount = priceEl.dataset.discountPercent;\r\n\r\n priceEl.dispatchEvent(new Event('change'));\r\n\r\n // discount\r\n if (discount != '0') {\r\n priceEl.style.setProperty('--discount', `'-${discount}%'`);\r\n }\r\n });\r\n}\r\n\r\n// ===============================================================\r\n// PREÇO POR AJAX\r\n// ===============================================================\r\nexport function getPriceProd() {\r\n var selectors = document.querySelectorAll('[data-update-price]');\r\n var attr = 'update-price';\r\n\r\n if (selectors.length() > 0) {\r\n selectors.forEach((selector) => {\r\n var prodId = selector.dataset(attr);\r\n var url = '/produto/preco/' + prodId;\r\n\r\n if (prodId != '' && prodId != null) {\r\n $.ajax({\r\n url: url,\r\n type: 'GET',\r\n })\r\n .done((resp) => {\r\n selector.innerHTML = resp;\r\n })\r\n .fail((resp) => {\r\n console.error(resp);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// DEBOUNCE\r\n// ===============================================================\r\n/*\r\n Debounce retorna uma função que enquanto continuar sendo chamada não é executada\r\n A função só será executada quando para de ser chamada por N milisegundos\r\n Útil para melhorar a performance de códigos que são executados muitas vezes por segundo, como o $(window).resize()\r\n\r\n Ex:\r\n \r\n $(window).resize(debounce(function() {\r\n // código a ser executado\r\n }, 500))\r\n \r\n No exemplo acima a função só será executada 500ms depois do último resize\r\n Abra o link abaixo e redimensione a janela branca e acompanhe o output do console\r\n Exemplo codepen: https://codepen.io/valkervieira/pen/oNgqyWY\r\n\r\n Um caso comum de uso é em lojas onde a seleção de um filtro na página de tag recarrega automáticamente a página\r\n Com o debounce o usuário pode escolher vários filtros rapidamente e a página só recarrega quando parar de escolher\r\n*/\r\n\r\nexport function debounce(func, wait, immediate) {\r\n var timeout;\r\n immediate || (immediate = true);\r\n\r\n return function () {\r\n var context = this,\r\n args = arguments;\r\n\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n\r\n var callNow = immediate && !timeout;\r\n\r\n clearTimeout(timeout);\r\n\r\n timeout = setTimeout(later, wait);\r\n\r\n if (callNow) func.apply(context, args);\r\n };\r\n}\r\n\r\n// ===============================================================\r\n// THROTTLE\r\n// ===============================================================\r\n/*\r\n Throttle diminui a frequencia que uma função é executada\r\n Enquanto no debounce a função só é executada quando para de ser chamada, no throttle ela\r\n continua sendo executada só que em um intervalo mínimo de N milisegundos (default = 250)\r\n\r\n Ex:\r\n\r\n $(window).resize(throttle() {\r\n // código a ser executado\r\n }, 500)\r\n\r\n No exemplo acima a função resize é chamada várias vezes por segundo mas só é executada 1 vez a cada 500ms\r\n Abra o link abaixo, redimensione a janela branca e acompanhe o console\r\n Exemplo codepen: https://codepen.io/valkervieira/pen/yLyKEPW\r\n\r\n Um caso comum de uso é checar se o scroll passou de um determinado ponto, para fixar um header ou alterar algum elemento do DOM\r\n*/\r\nexport function throttle(fn, threshhold, scope) {\r\n threshhold || (threshhold = 250);\r\n var last, deferTimer;\r\n return function () {\r\n var context = scope || this;\r\n\r\n var now = +new Date(),\r\n args = arguments;\r\n if (last && now < last + threshhold) {\r\n // hold on to it\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n fn.apply(context, args);\r\n }, threshhold);\r\n } else {\r\n last = now;\r\n fn.apply(context, args);\r\n }\r\n };\r\n}\r\n\r\n// ===============================================================\r\n// FORMAT MONEY\r\n// ===============================================================\r\nexport function formatMoney(value) {\r\n // FORMATA UM VALOR\r\n return (\r\n 'R$ ' +\r\n value\r\n .toFixed(2)\r\n .replace('.', ',')\r\n .replace(/(\\d)(?=(\\d{3})+\\,)/g, '$1.')\r\n );\r\n}\r\n\r\n// ===============================================================\r\n// FORMAT VALUE\r\n// ===============================================================\r\n\r\nexport const formatValue = function (value = '') {\r\n let parsedValue = value;\r\n if (typeof value === 'number') {\r\n parsedValue = value.toFixed(2).toString();\r\n }\r\n return parsedValue.replace('.', ',');\r\n};\r\n\r\n// ===============================================================\r\n// VALIDA QUANTIDADE\r\n// ===============================================================\r\nexport function validateQuantity(_val) {\r\n // VALIDA SE A QUANTIDADE INFORMADA É UM NÚMERO\r\n if (!isNaN(_val)) {\r\n if (parseInt(_val) > 0) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ===============================================================\r\n// CLEAR NUMBER\r\n// ===============================================================\r\nexport function getClearNumber(_val) {\r\n // RETORNA UM NÚMERO LIMPO COMO INT\r\n if (!isNaN(_val)) {\r\n var clearNumber = parseInt(_val);\r\n\r\n return clearNumber;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ===============================================================\r\n// BUSCA\r\n// ===============================================================\r\nexport function setSearch() {\r\n const toggleButton = document.querySelectorAll('[data-toggle-search]');\r\n const search = document.querySelector('[data-search-container]');\r\n const input = document.querySelector('[data-search-input]');\r\n\r\n toggleButton.length > 0 && toggleButton.forEach(button => {\r\n button.addEventListener('click', () => {\r\n\r\n if (search.classList.contains('open')) {\r\n search.classList.remove('open');\r\n\r\n } else {\r\n search.classList.add('open');\r\n setTimeout(() => { input.focus() }, 400);\r\n }\r\n })\r\n })\r\n}\r\n","import { addAsset } from \"../../components/utilities\";\r\n\r\nexport const FilterComponent = {\r\n root: document.querySelector('#component-products-filter-root'),\r\n button: document.querySelector('#open-filter-mobile'),\r\n settings: window.filterSettings || false,\r\n showPriceSlider: false,\r\n instance: false,\r\n\r\n sortArrayValues: function (array, property) {\r\n // Ordenação inicial baseada no valor da propriedade\r\n let sortedArray = array.sort((a, b) => {\r\n if (a[property] < b[property]) return -1;\r\n if (a[property] > b[property]) return 1;\r\n return 0;\r\n });\r\n\r\n // Definir ordenação customizada dos tamanhos\r\n const customOrder = ['pp', 'p', 'm', 'g', 'gg', 'xg', 'xgg'];\r\n sortedArray.forEach(item => {\r\n item.sort = 99; // Define um valor padrão alto para itens não encontrados\r\n customOrder.forEach((order, index) => {\r\n if (item[property].toLowerCase() === order) item.sort = index;\r\n });\r\n });\r\n\r\n // Ordenar novamente baseado na ordem customizada\r\n sortedArray.sort((a, b) => {\r\n if (a.sort < b.sort) return -1;\r\n if (a.sort > b.sort) return 1;\r\n return 0;\r\n });\r\n\r\n return sortedArray;\r\n },\r\n\r\n setTagTypes: function () {\r\n const { settings } = FilterComponent;\r\n const tags = [];\r\n\r\n if (settings.aggregations) {\r\n const aggregations = settings.aggregations\r\n\r\n // Filtro de categoria\r\n if (aggregations.types.categoria) tags.push({\r\n title: 'Categoria',\r\n type: 'categoria',\r\n style: 'list',\r\n options: FilterComponent.sortArrayValues(aggregations.types.categoria, 'title')\r\n })\r\n }\r\n\r\n return tags\r\n },\r\n\r\n setPropeties: function () {\r\n const { settings } = FilterComponent;\r\n const properties = [];\r\n\r\n if (settings.aggregations) {\r\n const aggregations = settings.aggregations\r\n\r\n // Filtros Atributo 1 \r\n if (aggregations.properties.property1.length > 0) properties.push({\r\n title: 'Cor',\r\n property: 'property1',\r\n style: 'colors',\r\n colorsProps: {\r\n showTitle: true,\r\n showColor: true,\r\n },\r\n options: FilterComponent.sortArrayValues(aggregations.properties.property1, 'value'),\r\n patterns: settings.patterns\r\n });\r\n\r\n // Filtros Atributo 2\r\n if (aggregations.properties.property2.length > 0) properties.push({\r\n title: 'Tamanho',\r\n property: 'property2',\r\n style: 'list',\r\n options: FilterComponent.sortArrayValues(aggregations.properties.property2, 'value'),\r\n patterns: settings.patterns\r\n })\r\n\r\n // Filtros Atributo 3\r\n // if (aggregations.properties.property3.length > 0) properties.push({\r\n // title: 'Fragrância',\r\n // property: 'property3',\r\n // style: 'list',\r\n // options: FilterComponent.sortArrayValues(aggregations.properties.property3, 'value'),\r\n // patterns: settings.patterns\r\n // });\r\n\r\n }\r\n\r\n return properties\r\n },\r\n\r\n setPricesRanges: function () {\r\n const { settings, showPriceSlider } = FilterComponent\r\n let priceSettings = {\r\n price: false,\r\n priceProps: false\r\n }\r\n\r\n // Exibe o slider de preço. Caso tenha faixas de preço,\r\n // preferência fica para as faixas (abaixo)\r\n if (showPriceSlider) {\r\n priceSettings.price = [\r\n settings.aggregations.min_price,\r\n settings.aggregations.max_price\r\n ]\r\n }\r\n\r\n // Exibe as opções de faixa de preço\r\n if (settings.prices_range.length > 0) {\r\n priceSettings.priceProps = {\r\n mode: 'options',\r\n options: settings.prices_range\r\n }\r\n priceSettings.price = [\r\n settings.aggregations.min_price,\r\n settings.aggregations.max_price\r\n ]\r\n }\r\n\r\n return priceSettings\r\n },\r\n\r\n setFilters: function () {\r\n const { root } = FilterComponent;\r\n const tags = FilterComponent.setTagTypes()\r\n const properties = FilterComponent.setPropeties()\r\n const priceSettings = FilterComponent.setPricesRanges()\r\n\r\n const componentFilters = new Vnda.Component.ProductsFilter({\r\n mode: 'drawer',\r\n hasSort: true,\r\n filterOnClick: false,\r\n resetMode: 'all',\r\n tags,\r\n properties,\r\n price: priceSettings.price,\r\n priceProps: priceSettings.priceProps\r\n });\r\n\r\n // Renderiza o componente\r\n componentFilters.render(root);\r\n FilterComponent.instance = componentFilters\r\n root.dispatchEvent(new Event('vnda:filter-component-loaded'))\r\n },\r\n\r\n loadFilters: function () {\r\n const { settings } = FilterComponent;\r\n if (!settings) return;\r\n addAsset(settings.script, FilterComponent.setFilters)\r\n addAsset(settings.styles)\r\n },\r\n\r\n show: function () {\r\n const { root } = FilterComponent;\r\n\r\n if (!FilterComponent.instance) {\r\n FilterComponent.loadFilters()\r\n root.addEventListener('vnda:filter-component-loaded', () => {\r\n FilterComponent.instance.toggle()\r\n })\r\n } else {\r\n FilterComponent.instance.toggle()\r\n }\r\n },\r\n\r\n init: function () {\r\n\r\n const { root, button } = FilterComponent\r\n\r\n if (!root) return\r\n\r\n if (button) {\r\n button.addEventListener('click', () => {\r\n FilterComponent.show()\r\n })\r\n } else {\r\n FilterComponent.loadFilters()\r\n }\r\n }\r\n}\r\n","const InfinityScroll = {\r\n params: window._pagination,\r\n priceProds: {\r\n selector: '[data-update-price]',\r\n attr: 'update-price',\r\n },\r\n productsWrapper: document.querySelectorAll('.section-list-products')[0],\r\n productWrapper: document.querySelectorAll('.list-products')[0],\r\n button: document.querySelector('[data-load-more]'),\r\n stopLoading: function () {\r\n const button = this.button;\r\n\r\n if (button != null) button.parentElement.removeChild(button);\r\n },\r\n setCurrentPage: function (_number) {\r\n const totalPages = this.params.totalPages;\r\n\r\n if (_number <= totalPages) {\r\n this.params.currentPage = _number;\r\n\r\n if (this.params.currentPage >= totalPages) this.stopLoading();\r\n\r\n if (_number < totalPages) return (this.params.nextUrl = this.params.pages[_number].url);\r\n }\r\n },\r\n\r\n setScript: function (script) {\r\n const newScript = document.createElement('script');\r\n newScript.innerText = script.innerText;\r\n return document.body.appendChild(newScript);\r\n },\r\n\r\n loadProducts: async function () {\r\n const nextUrl = this.params.nextUrl;\r\n const response = await fetch(nextUrl);\r\n const data = await response.text();\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(data, 'text/html');\r\n const script = doc.querySelector('[data-product-variants]');\r\n\r\n // Busca por scripts para compra rápida\r\n const scripts = doc.querySelectorAll('[data-variants-script]');\r\n if (scripts.length > 0)\r\n scripts.forEach((script) => {\r\n InfinityScroll.setScript(script);\r\n });\r\n\r\n return doc.querySelectorAll('.product-block');\r\n },\r\n updatePrice: function () {\r\n window.Vnda.Component.Price.update();\r\n },\r\n getNextPage: async function () {\r\n const currentPage = this.params.currentPage;\r\n const wrapper = this.productsWrapper;\r\n const productWrapper = this.productWrapper;\r\n\r\n if (!wrapper.classList.contains('-searching')) {\r\n this.productsWrapper.classList.add('-searching');\r\n this.button.classList.add('-searching');\r\n\r\n const newProducts = await this.loadProducts();\r\n\r\n newProducts.forEach((product) => {\r\n productWrapper.appendChild(product);\r\n });\r\n\r\n this.setCurrentPage(currentPage + 1);\r\n\r\n window.ProductPurchase.init(true);\r\n lazyLoadInstance.update();\r\n this.updatePrice();\r\n\r\n wrapper.classList.remove('-searching');\r\n this.button.classList.remove('-searching');\r\n }\r\n },\r\n\r\n init: function () {\r\n const button = this.button;\r\n\r\n if (typeof this.params != undefined) {\r\n if (button != null) {\r\n button.addEventListener(\r\n 'click',\r\n () => {\r\n this.getNextPage();\r\n },\r\n { passive: true }\r\n );\r\n }\r\n }\r\n },\r\n};\r\n\r\nexport default InfinityScroll;\r\n","import { FilterComponent } from './tag/filters';\r\nimport InfinityScroll from '../components/infinityScroll';\r\nimport { updatePriceBlock } from '../components/utilities.js';\r\n\r\nconst Tag = {\r\n init: function () {\r\n FilterComponent.init();\r\n updatePriceBlock();\r\n InfinityScroll.init();\r\n },\r\n};\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n Tag.init();\r\n})\r\n"],"names":["addAsset","source","onloadCallback","console","error","includes","scriptTag","document","createElement","setAttribute","onload","body","appendChild","linkTag","head","FilterComponent","root","querySelector","button","settings","window","filterSettings","showPriceSlider","instance","sortArrayValues","array","property","sortedArray","sort","a","b","customOrder","forEach","item","order","index","toLowerCase","setTagTypes","tags","aggregations","types","categoria","push","title","type","style","options","setPropeties","properties","property1","length","colorsProps","showTitle","showColor","patterns","property2","setPricesRanges","priceSettings","price","priceProps","min_price","max_price","prices_range","mode","setFilters","componentFilters","Vnda","Component","ProductsFilter","hasSort","filterOnClick","resetMode","render","dispatchEvent","Event","loadFilters","script","styles","show","toggle","addEventListener","init","InfinityScroll","params","_pagination","priceProds","selector","attr","productsWrapper","querySelectorAll","productWrapper","stopLoading","this","parentElement","removeChild","setCurrentPage","_number","totalPages","currentPage","nextUrl","pages","url","setScript","newScript","innerText","loadProducts","async","response","fetch","data","text","doc","DOMParser","parseFromString","scripts","updatePrice","Price","update","getNextPage","wrapper","classList","contains","add","product","ProductPurchase","lazyLoadInstance","remove","undefined","passive","Tag","priceEls","priceEl","discount","dataset","discountPercent","setProperty","updatePriceBlock"],"sourceRoot":""}