UNPKG

@salla.sa/twilight-components

Version:
207 lines (202 loc) 9.33 kB
/*! * Crafted with ❤ by Salla */ import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client'; import { S as Search } from './search.js'; import { H as Helper } from './Helper.js'; import { d as defineCustomElement$4 } from './salla-button2.js'; import { d as defineCustomElement$3 } from './salla-loading2.js'; import { d as defineCustomElement$2 } from './salla-modal2.js'; const sallaSearchCss = ""; const SallaSearch$1 = /*@__PURE__*/ proxyCustomElement(class SallaSearch extends HTMLElement { constructor() { super(); this.__registerHost(); var _a; this.inputValue = ''; this.translationLoaded = false; this.loading = false; this.typing = false; this.debounce = setTimeout(() => '', 1000); /** * Set the component display without modal window. Defaults to `false` */ this.inline = false; /** * Adds a border radius to the input. Half of the height. */ this.oval = false; /** * Sets the height of the input */ this.height = 60; /** * Maximum number of words allowed in the input */ this.maxWords = 5; /** * Show submit action buttons at the end. */ this.showAction = false; this.productSlot = ((_a = this.host.querySelector('[slot="product"]')) === null || _a === void 0 ? void 0 : _a.innerHTML) || this.getDefaultProductSlot(); salla.event.on('search::open', () => this.open()); salla.lang.onLoaded(() => { this.translationLoaded = true; }); salla.event.on('modalClosed', () => this.onModalClose()); } async open() { if (!this.inline) { await this.modal.open().then(() => setTimeout(() => this.searchInput.focus(), 300)); } } onModalClose() { this.searchInput.value = ''; this.results = undefined; this.afterSearching(); this.container.classList.remove('s-search-no-results'); } handleKeyDown(ev) { var _a; if (ev.key === 'Enter' && ((_a = this.search_term) === null || _a === void 0 ? void 0 : _a.length)) { window.location.href = salla.url.get('search?q=' + encodeURI(this.search_term)); } } getDefaultProductSlot() { return '<div class="s-search-product-image-container">' + ' <img class="s-search-product-image" src="{image}" alt="{name}"/>' + '</div>' + '<div class="s-search-product-details">' + ' <div class="s-search-product-title">{name}</div> <div class="s-search-product-price">{price} <span class="s-search-product-regular-price">{regular_price}</span></div>' + '</div>'; } debounceSearch(event) { this.typing = true; clearTimeout(this.debounce); this.debounce = setTimeout(() => { this.typing = false; this.search_term = event.target.value; }, 700); } limitWordsAndSearch(event) { let value = event.target.value; const words = value.trim().split(/\s+/); if (words.length > this.maxWords) { const truncatedInput = words.slice(0, this.maxWords).join(' '); this.searchInput.value = truncatedInput; } this.debounceSearch(event); } getQueryParam(param) { const urlParams = new URLSearchParams(window.location.search); return urlParams.get(param); } handleActionClick() { if (!!this.search_term && this.search_term.length > 2) { return this.search(this.search_term); } } handleSearch(val) { this.inputValue = val; if (val.length > 2) { this.search(val); } else { this.results = undefined; this.afterSearching(); } } search(val) { this.noResults.style.display = 'none'; //run loading spinner or stop it this.loading = true; salla.product.fetch({ source: "search", source_value: val }) .then(response => { this.results = response; salla.event.emit('Products Searched', val); }) .catch(err => err !== 'Query is same as previous one!' ? this.results = undefined : null) .finally(() => this.afterSearching(/*isEmpty*/ false)); } afterSearching(isEmpty = true) { var _a; this.noResults.style.display = isEmpty || ((_a = this.results) === null || _a === void 0 ? void 0 : _a.data.length) > 0 ? 'none' : 'block'; Helper.toggleElementClassIf(this.container, 's-search-container-open', 's-search-no-results', () => { var _a; return (_a = this.results) === null || _a === void 0 ? void 0 : _a.data.length; }); this.loading = false; salla.product.api.previousQuery = ''; //avoid having error 'Query is same as previous one!' after reopen modal; this.inputValue.length < 3 ? this.container.classList.remove('s-search-no-results') : ''; } render() { var _a; const searchContent = h("div", { key: 'eb0cc353dbbe919fc0489c2c262ee017724c097a', class: { 's-search-container': true, 's-search-inline': this.inline }, ref: container => this.container = container }, h("div", { key: '8fced73d5abd5a7df0a0038e656cd453d4dc07cf', class: "s-search-input-wrapper" }, h("span", { key: '6c9699f37207f2666dacbe1b951d84f183e4d7c3', class: "s-search-icon-wrap" }, h("span", { key: '1d88ca718aac8c4ce66a20ff372d2b78e90a09dc', class: "s-search-icon", innerHTML: this.loading ? '<i class="s-search-spinner-loader"/>' : Search })), h("input", { key: 'c25f01acce8f28b1bfa4a7d02fa72b88836aa6e0', type: "search", enterkeyhint: "search", autocomplete: "off", class: "s-search-input", placeholder: salla.lang.get('blocks.header.search_placeholder'), onInput: (e) => this.limitWordsAndSearch(e), onKeyDown: e => this.handleKeyDown(e), ref: input => this.searchInput = input, style: { height: this.height + 'px', borderRadius: this.oval ? this.height / 2 + 'px' : '' } }), this.showAction ? h("salla-button", { loading: this.loading, class: { 's-search-action': true, 's-search-action-oval': this.oval }, onClick: () => this.handleActionClick() }, !this.loading && h("span", { innerHTML: Search })) : null), h("div", { key: '8d63e3293e8fe434b45096aeffbeefe3a8fbb5c8', class: "s-search-results" }, (_a = this.results) === null || _a === void 0 ? void 0 : _a.data.map((product) => h("a", { href: product.url + '?from=search-bar', class: { "s-search-product": true, 's-search-product-not-available': !product.is_available }, innerHTML: this.productSlot .replace(/\{name\}/g, product.name) .replace(/\{price\}/g, salla.money(product.price)) .replace(/\{regular_price\}/g, product.is_on_sale ? salla.money(product.regular_price) : '') .replace(/\{image\}/g, product.image.url) })), h("p", { key: '20dd4c327696b7e3fe385119a369b4fa064e73c2', ref: el => this.noResults = el, class: "s-search-no-results-placeholder" }, salla.lang.get('common.elements.no_options')))); return (this.inline ? h("div", { class: "s-search-modal" }, searchContent) : h("salla-modal", { position: "top", class: "s-search-modal", ref: modal => this.modal = modal }, searchContent)); } /** * Run it one time after load */ componentDidLoad() { this.afterSearching(); this.searchInput.value = this.getQueryParam('q'); } get host() { return this; } static get watchers() { return { "search_term": ["handleSearch"] }; } static get style() { return sallaSearchCss; } }, [0, "salla-search", { "inline": [4], "oval": [4], "height": [2], "maxWords": [2, "max-words"], "showAction": [4, "show-action"], "translationLoaded": [32], "results": [32], "loading": [32], "typing": [32], "debounce": [32], "search_term": [32] }, [[0, "keydown", "handleKeyDown"]], { "search_term": ["handleSearch"] }]); function defineCustomElement$1() { if (typeof customElements === "undefined") { return; } const components = ["salla-search", "salla-button", "salla-loading", "salla-modal"]; components.forEach(tagName => { switch (tagName) { case "salla-search": if (!customElements.get(tagName)) { customElements.define(tagName, SallaSearch$1); } break; case "salla-button": if (!customElements.get(tagName)) { defineCustomElement$4(); } break; case "salla-loading": if (!customElements.get(tagName)) { defineCustomElement$3(); } break; case "salla-modal": if (!customElements.get(tagName)) { defineCustomElement$2(); } break; } }); } const SallaSearch = SallaSearch$1; const defineCustomElement = defineCustomElement$1; export { SallaSearch, defineCustomElement }; //# sourceMappingURL=salla-search.js.map //# sourceMappingURL=salla-search.js.map