Engagement Rings - The Perfect Ring For Your Special Moment (2024)

<${args.templates.productListHeader} />

<${args.templates.filters} />

Showing ${helpers.getCurrentPage() * 60 - (60 - 1)} - ${totalpagecount} of ${helpers.getTotalProductsCount()} Results

<${args.templates.products} /> <${args.templates.productListFooter} />

${helpers.isFilterDrawerOpen() ? html`

` : ''}

<${args.templates.footer} /> `; } }, header: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var filterOptions = helpers.getTemplateOptions('filters'); return html`

Filter ${helpers.getTotalProductsCount() ? '('+helpers.getTotalProductsCount()+')' : ''} Filter ${helpers.getTotalProductsCount() ? '('+helpers.getTotalProductsCount()+')' : ''}

Sort By

${filterOptions.includeSortOptionsInFilters ? '' : html` <${args.templates.sortOptions} /> `}

`; } }, productReviews: { // Custom template to render variants render: function(html, args) { var product = args.props.product; if (typeof product.metafields.okendo == 'undefined' || typeof product.metafields.okendo.summaryData == 'undefined' || typeof product.metafields.okendo.StarRatingSnippet == 'undefined') { return null; } var reviewCount = product.metafields.okendo.summaryData.value.reviewCount; var reviewCountStr = `(${ reviewCount })`; if (reviewCount == 0 ) { reviewCountStr = ''; } var starRattingSnippet = product.metafields.okendo.StarRatingSnippet.value.replaceAll(["#oke-star-"], "#lovisa-star-") + reviewCountStr; return html``; } }, product: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var product = props.product; var price = product.price; var compareAtPrice = product.compare_at_price; var productOptions = helpers.getTemplateOptions('product'); // Retrieve the product link using the productPageUrl helper var productLink = productOptions.productPageUrl(product) var variants = product.variants; var tags = product.tags; var badge = ''; var offer = ''; var offerProperty = ''; var badgeStyles = ''; var isOnlyInStore = false; var isOnlyInStoreClass = ''; if (tags.length) { tags.forEach(function(tag) { if (tag === 'in-store') { isOnlyInStore = true; isOnlyInStoreClass = 'hide'; } if (tag.includes('offer:')) { var badgeParts = tag.split(':'); badge = badgeParts[1]; offer = badgeParts[1]; badge = badge.replaceAll("-", " "); if (badgeParts[2]) { var badgeBackgroundColour = badgeParts[2]; badgeStyles = `background-color: ${badgeBackgroundColour};`; } if (badgeParts[3]) { var badgeTextColour = badgeParts[3]; badgeStyles = `${badgeStyles} color: ${badgeTextColour};`; } } }); if (offer != '') { offerProperty = offer.replace('-for-','-'); } } if (!badge) { var collections = product.collections; var collectionsMetaObject = window.theme.collectionMetaobjects; var tempbadge = false; for (var i = 0; i < collectionsMetaObject.length; i++) { for (var j = 0; j < collections.length; j++) { if (collections[j].title == collectionsMetaObject[i].collection_name) { badge = collectionsMetaObject[i].badge_text; badgeStyles = `background-color: ${collectionsMetaObject[i].badge_background_color}`; badgeStyles = `${badgeStyles}; color: ${collectionsMetaObject[i].badge_text_color};`; tempbadge = true; break; } } if (tempbadge) { break; } } } return html`
${product.images.length > 1 ? html` ` : html` `}

<${args.templates.addToCartForm} product=${product} /> <${args.templates.productObj} product=${product} />

${badge !='' ? html`

${badge}

` : ''}

${product.title}

${helpers.isStorefrontAPICallPending() ? html` ` : html` ${helpers.isProductOnSale(compareAtPrice, price) ? html` ${helpers.formatCurrency(price)} ` : ''} ${helpers.formatCurrency(compareAtPrice === null ? price : compareAtPrice)} `} ${helpers.isProductOnSale(compareAtPrice, price) ? html` ${ Math.round(((compareAtPrice - price) * 100) / compareAtPrice) }% Off ` : '' }

<${args.templates.productReviews} product=${product} />

`; } }, filters: { options: { collapsible: true, includeSortOptionsInFilters: false, autoCollapse: true, showAppliedFilters: true, showClearAllFilters: true, showClearActionForIndividualFilters: true, showMatchingProductsCount: true, defaultExpandedFilters: [], showFiltersInDrawer: () => { return window.innerWidth <= 768; } }, render: function(html, args) { var props = args.props; var labels = args.labels; var helpers = props.helpers; var filters = helpers.getFilters(); var appliedFilters = helpers.getAppliedFilters(true); var showClearAllFiltersAction = props.showClearAllFilters && appliedFilters.length; var classes = ['filters']; if (props.collapsible) { classes.push('collapsible'); } var className = classes.join(' '); return html`

${props.showAppliedFilters ? html` <${args.templates.appliedFilters} /> ` : ''} ${showClearAllFiltersAction ? html`

{ helpers.clearAllFilters(); clearAllFilterDataLayerEvent(props); }}> ${labels.filters.clearAllFilters}

` : ''}

<${args.templates.filtersHeader} /> ${props.includeSortOptionsInFilters === 'top' ? html` <${args.templates.sortOptionInFilters} /> ` : ''} ${filters.map( filter => html` <${args.templates.filter} filter=${filter} /> ` )} ${props.includeSortOptionsInFilters === true || props.includeSortOptionsInFilters === 'bottom' ? html` <${args.templates.sortOptionInFilters} /> ` : ''}

`; }, callbacks: { afterEveryRender: function(helpers) { const searchInputs = document.querySelectorAll('.search__input'); if (!searchInputs || searchInputs.length === 0) { return; } searchInputs.forEach(inputEL => { inputEL.addEventListener('focus', function() { const filtersDrawer = document.querySelector('.show-filters-in-drawer'); if (filtersDrawer && helpers.isFilterDrawerOpen()) { helpers.closeFilterDrawer(); } }); }); var product_card_show_variants = document.querySelectorAll(".product-card__variants--show"); product_card_show_variants.forEach((variant) => { variant.classList.remove('product-card__variants--show'); }); setTimeout(function() { var relatedProductCards = document.querySelectorAll('.product-card'); if (relatedProductCards && relatedProductCards.length) { relatedProductCards.forEach(productCardElement => { new window.theme.ProductCard(productCardElement, 'tagalys'); }); } }, 2000); setTimeout(function() { var filterBarElement = document.querySelector('.collection__tabs'); var filterWrapperElement = document.querySelector('.filter-wrapper'); var headerElement = document.querySelector('#shopify-section-header'); var headerElementHeight = (headerElement) ? headerElement.getBoundingClientRect().height : 0; var categorySubnavElement = document.querySelector('#shopify-section-category-subnavigation'); var categorySubnavElementHeight = (categorySubnavElement) ? categorySubnavElement.getBoundingClientRect().height : 0; var headerHeight = ((headerElementHeight) + (categorySubnavElementHeight) - 2); if (filterBarElement && window.innerWidth < theme.settings.grid_medium) { this.filterBar = stickybits(".plp-header", { stickyBitStickyOffset: headerHeight, useStickyClasses: true, useGetBoundingClientRect: true }); } if (filterWrapperElement && window.innerWidth > theme.settings.grid_medium) { this.filterWrapper = stickybits(".filter-wrapper", { stickyBitStickyOffset: headerHeight, useStickyClasses: true, useGetBoundingClientRect: true }); } }, 1000) } } }, filtersHeader: { render: function(html, args) { var props = args.props; var labels = args.labels; return html``; } }, appliedFilters: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var appliedFilters = helpers.getAppliedFilters(true); if (!appliedFilters.length) { return html``; } return html`
    ${appliedFilters.map(appliedFilter => { if (appliedFilter.type === 'range') { return html`
  • { helpers.clearFilter(appliedFilter.id); removeFilterDataLayerEvent(props, appliedFilter.id); }} class="applied-filter"> ${helpers.labelFormatter( appliedFilter.display_format, appliedFilter.selected_min, appliedFilter.currency )} - ${helpers.labelFormatter( appliedFilter.display_format, appliedFilter.selected_max, appliedFilter.currency )} <${args.templates.closeIcon} />
  • `; } return appliedFilter.items.map(filterItem => { return html`
  • { helpers.clearFilter(appliedFilter.id, filterItem.id); removeFilterDataLayerEvent(props, appliedFilter.id, filterItem); }} > ${filterItem.name} <${args.templates.closeIcon} />
  • `; }); })}
`; } }, filter: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var classes = ['collection__filter', 'filter']; var isCollapseOpen = false; if (props.collapsible) { isCollapseOpen = helpers.isCollapsibleFilterExpanded(props.filter.id); if (isCollapseOpen) { classes.push('expanded'); } else { classes.push('collapsed'); } } var className = classes.join(' '); return html`

<${args.templates.filterHeader} filterHeading=${props.filter.name} filterId=${props.filter.id} /> <${args.templates.filterItems} filter=${props.filter} />

`; } }, filterHeader: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var filterOptions = helpers.getTemplateOptions('filters'); var showClearActionForIndividualFilters = filterOptions.showClearActionForIndividualFilters && helpers.isFilterApplied(props.filterId); var toggleCollapsibleFilter = () => { helpers.toggleCollapsibleFilter(props.filterId); }; var clearFilter = event => { event.stopPropagation(); helpers.clearFilter(props.filterId); removeFilterDataLayerEvent(props, props.filterId); }; return html`

${props.filterHeading}

${showClearActionForIndividualFilters ? html`

${labels.filters.clearIndividualFilter}

` : ''} ${filterOptions.collapsible ? html` <${args.templates.downArrow} /> ` : ''}

`; } }, filterItems: { render: function(html, args) { var props = args.props; if (props.filter.type === 'checkbox') { return html`

<${args.templates.filterCheckBoxes} filterId=${props.filter.id} filterItems=${props.filter.items} />

`; } return html`

<${args.templates.rangeSliderFilterItem} filter=${props.filter} />

`; } }, filterCheckBoxes: { render: function(html, args) { var props = args.props; return html`
    ${props.filterItems.map(filterItem => { return html` <${args.templates.checkboxFilterItem} filterId=${props.filterId} filterItem=${filterItem} > ${ filterItem.selected && filterItem.items ? html` <${args.templates.filterCheckBoxes} filterId=${props.filterId} filterItems=${filterItem.items} /> ` : '' } ${args.templates.checkboxFilterItem}> `; })}
`; } }, checkboxFilterItem: { render: function(html, args) { var props = args.props; var helpers = props.helpers; const onFilterClick = event => { event.stopPropagation(); if (props.filterItem.selected) { helpers.clearFilter(props.filterId, props.filterItem.id); removeFilterDataLayerEvent(props, props.filterId, props.filterItem); } else { helpers.applyFilter(props.filterId, props.filterItem.id); applyFilterDataLayerEvent(props); } }; return html`
  • ${props.filterItem.name} ${props.showMatchingProductsCount ? html` (${props.filterItem.count}) ` : ''} ${props.children}
  • `; } }, rangeSliderFilterItem: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var priceLabel = 'Any'; if (props.sliderInputValues[0] > props.filter.min && props.sliderInputValues[1] < props.filter.max) { priceLabel = 'Between ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[0], props.filter.currency) + ' - ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[1], props.filter.currency); } else if (props.sliderInputValues[0] > props.filter.min) { priceLabel = 'Above ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[0], props.filter.currency); } else if (props.sliderInputValues[1] < props.filter.max) { priceLabel = 'Below ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[1], props.filter.currency); } var minPriceValue = window.Currency.formatMoney( props.sliderInputValues[0] * 100, window.Currency.moneyFormats[window.Shopify.currency.active].money_format ); var maxPriceValue = window.Currency.formatMoney( props.sliderInputValues[1] * 100, window.Currency.moneyFormats[window.Shopify.currency.active].money_format ); var priceValueLeft = '0%'; if (props.sliderInputValues[0] > props.filter.min) { priceValueLeft = ((props.sliderInputValues[0] - props.filter.min) / props.filter.max) * 100; priceValueLeft += '%'; } var priceValueRight = '0%'; if (props.sliderInputValues[1] < props.filter.max) { // eslint-disable-next-line no-mixed-operators priceValueRight = (100 - props.sliderInputValues[1] / props.filter.max) * 100; priceValueRight += '%'; } var priceValueLeftClass = ''; var priceValueRightClass = ''; if (document.querySelector('.noUi-handle-lower.noUi-active')) { priceValueLeftClass = 'drag'; } if (document.querySelector('.noUi-handle-upper.noUi-active')) { priceValueRightClass = 'drag'; } return html`

    ${priceLabel}

    ${minPriceValue} ${maxPriceValue}

    `; } }, sortOptionInFilters: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var filterOptions = helpers.getTemplateOptions('filters'); var appliedSortOption = helpers.getAppliedSortOption(); var sortOptions = helpers.getSortOptions(); let classes = ['filter']; let isCollapseOpen = false; if (filterOptions.collapsible) { isCollapseOpen = helpers.isCollapsibleFilterExpanded('sort_options'); if (isCollapseOpen) { classes.push('expanded'); } else { classes.push('collapsed'); } } var className = classes.join(' '); return html`

    <${args.templates.filterHeader} filterHeading=${labels.sortOptions.sortBy} filterId=${'sort_options'} />

      ${sortOptions.map(sortOption => { const checked = sortOption.id === appliedSortOption.id; return html`
    • { helpers.applySortOption(sortOption.id); clickSortOptionDataLayerEvent(helpers); }} > ${sortOption.label}
    • `; })}
    `; } }, downArrow: { // eslint-disable-next-line no-unused-vars render: function(html, args) { return html` `; } }, addToCartForm: { render: function(html, args) { var product = args.props.product; var variants = product.variants; var isOnlyInStore = false; var tags = product.tags; if (tags.length) { tags.forEach(function(tag) { if (tag === 'in-store') { isOnlyInStore = true; } }); } return html` `; } }, variantOption: { render: function(html, args) { var product = args.props.product; var variants = product.variants; return html`

    Please select an option below to add to cart.

    ${variants.map(variant => { if (variant.available) { return html`

    `; } else { return html`

    `; } })}

    ${variants.map(variant => { if (variant.available) { return html`

    `; } else { return html`

    `; } })}

    `; } }, variantSelect: { render: function(html, args) { var product = args.props.product; var variants = product.variants; return html` `; } }, productObj: { // Custom template to render variants render: function(html, args) { var product = args.props.product; return html` `; } }, products: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var products = helpers.getProducts(); return html` ${products.map( (product, index) => html` <${args.templates.product} key=${index} product=${product} /> ` )} `; }, callbacks: { // eslint-disable-next-line no-unused-vars afterInitialRender: function(helpers) { setTimeout(function() { var relatedProductCards = document.querySelectorAll('.product-card'); if (relatedProductCards && relatedProductCards.length) { relatedProductCards.forEach(productCardElement => { new window.theme.ProductCard(productCardElement, 'tagalys'); }); } }, 2000); } } }, sortOptions: { render: function(html, args) { var props = args.props; var labels = args.labels; var helpers = props.helpers; var sortOptions = helpers.getSortOptions(); var appliedSortOption = helpers.getAppliedSortOption(); var applySortOption = event => { helpers.applySortOption(event.target.value); clickSortOptionDataLayerEvent(helpers); }; return html` `; } }, productListHeader: { render: function(html, args) { return html` <${args.templates.infoAndActions} /> `; } }, noResults: { options: '', render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; return html`

    ${labels.searchResults.noResultsHeading.heading} "${helpers.getQuery()}" ${labels.searchResults.noResultsHeading.subHeading}

    <${args.templates.noResultsWidgets} />

    `; } }, paginationLinks: { options: { showNumberedPageLinks: true, numberedPageLinksWindowSize: 3, showPreviousPageLink: true, showFirstPageLink: true, showNextPageLink: true, scrollTop: true }, render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var pagesToDisplay = helpers.getPagesToDisplay(props.numberedPageLinksWindowSize); if(pagesToDisplay.length <= 1){ return; } var currentPage = helpers.getCurrentPage(); var hasPreviousPage = helpers.hasPreviousPage(); var hasNextPage = helpers.hasNextPage(); var goToFirstPage = () => { helpers.goToPage(1); }; return html`
      ${props.showFirstPageLink ? html`
    • ` : ''} ${props.showPreviousPageLink ? html`
    • ` : ''} ${props.showNumberedPageLinks ? pagesToDisplay.map(pageDetail => { console.log('showNumberedPageLinks' , pageDetail) var classes = ['ais-pagination__item']; var showEllipsis = pageDetail.jumpAfter; if (pageDetail.current) { classes.push('ais-pagination__item--active'); } if (pageDetail.jumpAfter) { classes.push('page-jump-over'); } var className = classes.join(' '); if(pageDetail.page == helpers.getTotalPages()) { return html ``; } return html`
    • `; }) : ''} ${props.showNextPageLink ? html` ${ (helpers.getCurrentPage() != helpers.getTotalPages()) ? html `
    • ` : html `
    • ` }
    • ` : ''}
    `; } }, pagination: { render: function(html, args) { var props = args.props; var helpers = props.helpers; if (props.infiniteScroll) { if (helpers.canLoadNextResults(props.showLoadNextAfterEvery)) { return html` <${args.templates.loadNext} /> `; } return ''; } return html`

    <${args.templates.paginationLinks} />

    `; } }, infoAndActions: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var filterOptions = helpers.getTemplateOptions('filters'); var getResultsLabel = () => { return labels.searchResults.productsCount.replace('', helpers.getTotalProductsCount()); }; return html`

    Filter ${helpers.getTotalProductsCount() ? '('+helpers.getTotalProductsCount()+')' : ''} ${filterOptions.includeSortOptionsInFilters ? '' : html` <${args.templates.sortOptions} /> `}

    `; } }, callbacks: { onSuccessfulAPICall: function(response, helpers) { var product_card_show_variants = document.querySelectorAll(".product-card__variants--show"); product_card_show_variants.forEach((variant) => { variant.classList.remove('product-card__variants--show'); }); setTimeout(function() { var filterBarElement = document.querySelector('.collection__tabs'); var filterWrapperElement = document.querySelector('.filter-wrapper'); var headerElement = document.querySelector('#shopify-section-header'); var headerElementHeight = (headerElement) ? headerElement.getBoundingClientRect().height : 0; var categorySubnavElement = document.querySelector('#shopify-section-category-subnavigation'); var categorySubnavElementHeight = (categorySubnavElement) ? categorySubnavElement.getBoundingClientRect().height : 0; var headerHeight = ((headerElementHeight) + (categorySubnavElementHeight) - 2); if (filterWrapperElement && window.innerWidth > theme.settings.grid_medium) { this.filterWrapper = stickybits(".filter-wrapper", { stickyBitStickyOffset: headerHeight, useStickyClasses: true, useGetBoundingClientRect: true }); } }, 1000) return response; } } } var shopifyProductListingPageTemplates = { widget: { labels: { searchResults: { heading: { standard: " search results for ''", corrected: "No results for ''. Showing results for '' instead", partialMatches: "No products exactly match ''. Showing products that partially match." }, productsCount: '()', noResultsHeading: { heading: 'Sorry! We couldn’t find any search results for ', subHeading: 'Try searching again using a different keyword or spelling' } }, filters: { heading: 'Filters', clearAllFilters: 'Clear all', clearIndividualFilter: 'Clear', drawerFilterToggle: 'Filter by', rangeFilterValueSeparator: 'to' }, sortOptions: { sortBy: 'Sort by' }, pagination: { firstPage: 'First', previousPage: 'Previous', nextPage: 'Next', loadNext: 'Load more', loading: 'Loading...' } }, options: { includeTagalysCSS: false, canAppendQueryStringToUrl: true, limit: 16 }, render: function(html, args) { var props = args.props; var helpers = props.helpers; if (helpers.isInitialLoading()) { return html` <${args.templates.loader} /> `; } let classes = ['plp', 'search-results', 'page-width-wide']; if (helpers.isFilterDrawerOpen()) { classes.push('filter-drawer-opened'); } if (helpers.isLoading()) { classes.push('loading'); } if (helpers.canShowFiltersInDrawer()) { classes.push('show-filters-in-drawer'); } var className = classes.join(' '); return html`

    <${args.templates.header} />

    <${args.templates.productListHeader} />

    <${args.templates.filters} />

    <${args.templates.products} /> <${args.templates.productListFooter} />

    ${helpers.isFilterDrawerOpen() ? html`

    ` : ''}

    <${args.templates.footer} />

    `; } }, header: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var filterOptions = helpers.getTemplateOptions('filters'); return html`

    Filter ${helpers.getTotalProductsCount() ? '('+helpers.getTotalProductsCount()+')' : ''} Filter ${helpers.getTotalProductsCount() ? '('+helpers.getTotalProductsCount()+')' : ''}

    Sort By

    ${filterOptions.includeSortOptionsInFilters ? '' : html` <${args.templates.sortOptions} /> `}

    `; } }, productReviews: { // Custom template to render variants render: function(html, args) { var product = args.props.product; if (typeof product.metafields.okendo == 'undefined' || typeof product.metafields.okendo.summaryData == 'undefined' || typeof product.metafields.okendo.StarRatingSnippet == 'undefined') { return null; } var reviewCount = product.metafields.okendo.summaryData.value.reviewCount; var reviewCountStr = `(${ reviewCount })`; if (reviewCount == 0 ) { reviewCountStr = ''; } var starRattingSnippet = product.metafields.okendo.StarRatingSnippet.value.replaceAll(["#oke-star-"], "#lovisa-star-") + reviewCountStr; return html``; } }, product: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var product = props.product; var price = product.price; var compareAtPrice = product.compare_at_price; var productOptions = helpers.getTemplateOptions('product'); // Retrieve the product link using the productPageUrl helper var productLink = productOptions.productPageUrl(product) var variants = product.variants; var tags = product.tags; var badge = ''; var badgeStyles = ''; var isOnlyInStore = false; if (tags.length) { tags.forEach(function(tag) { if (tag === 'in-store') { isOnlyInStore = true; } if (tag.includes('offer:')) { var badgeParts = tag.split(':'); badge = badgeParts[1]; badge = badge.replaceAll("-", " "); if (badgeParts[2]) { var badgeBackgroundColour = badgeParts[2]; badgeStyles = `background-color: ${badgeBackgroundColour};`; } if (badgeParts[3]) { var badgeTextColour = badgeParts[3]; badgeStyles = `${badgeStyles} color: ${badgeTextColour};`; } } }); } if (!badge) { var collections = product.collections; var collectionsMetaObject = window.theme.collectionMetaobjects; var tempbadge = false; for (var i = 0; i < collectionsMetaObject.length; i++) { for (var j = 0; j < collections.length; j++) { if (collections[j].title == collectionsMetaObject[i].collection_name) { badge = collectionsMetaObject[i].badge_text; badgeStyles = `background-color: ${collectionsMetaObject[i].badge_background_color}`; badgeStyles = `${badgeStyles}; color: ${collectionsMetaObject[i].badge_text_color};`; tempbadge = true; break; } } if (tempbadge) { break; } } } return html`
    ${product.images.length > 1 ? html` ` : html` `}

    <${args.templates.addToCartForm} product=${product} /> <${args.templates.productObj} product=${product} />

    ${product.title}

    ${helpers.isStorefrontAPICallPending() ? html` ` : html` ${helpers.isProductOnSale(compareAtPrice, price) ? html` ${helpers.formatCurrency(price)} ` : ''} ${helpers.formatCurrency(compareAtPrice === null ? price : compareAtPrice)} `} ${helpers.isProductOnSale(compareAtPrice, price) ? html` ${ Math.round(((compareAtPrice - price) * 100) / compareAtPrice) }% Off ` : '' } <${args.templates.productReviews} product=${product} />

    `; } }, filters: { options: { collapsible: true, includeSortOptionsInFilters: false, autoCollapse: true, showAppliedFilters: true, showClearAllFilters: true, showClearActionForIndividualFilters: true, showMatchingProductsCount: true, defaultExpandedFilters: [], showFiltersInDrawer: () => { return window.innerWidth <= 768; } }, render: function(html, args) { var props = args.props; var labels = args.labels; var helpers = props.helpers; var filters = helpers.getFilters(); var appliedFilters = helpers.getAppliedFilters(true); var showClearAllFiltersAction = props.showClearAllFilters && appliedFilters.length; var classes = ['filters']; if (props.collapsible) { classes.push('collapsible'); } var className = classes.join(' '); return html`

    ${props.showAppliedFilters ? html` <${args.templates.appliedFilters} /> ` : ''} ${showClearAllFiltersAction ? html`

    { helpers.clearAllFilters(); clearAllFilterDataLayerEvent(props); }}> ${labels.filters.clearAllFilters}

    ` : ''}

    <${args.templates.filtersHeader} /> ${props.includeSortOptionsInFilters === 'top' ? html` <${args.templates.sortOptionInFilters} /> ` : ''} ${filters.map( filter => html` <${args.templates.filter} filter=${filter} /> ` )} ${props.includeSortOptionsInFilters === true || props.includeSortOptionsInFilters === 'bottom' ? html` <${args.templates.sortOptionInFilters} /> ` : ''}

    `; }, callbacks: { afterEveryRender: function(helpers) { const searchInputs = document.querySelectorAll('.search__input'); if (!searchInputs || searchInputs.length === 0) { return; } searchInputs.forEach(inputEL => { inputEL.addEventListener('focus', function() { const filtersDrawer = document.querySelector('.show-filters-in-drawer'); if (filtersDrawer && helpers.isFilterDrawerOpen()) { helpers.closeFilterDrawer(); } }); }); //customTagalysActionEvents(helpers); var product_card_show_variants = document.querySelectorAll(".product-card__variants--show"); product_card_show_variants.forEach((variant) => { variant.classList.remove('product-card__variants--show'); }); setTimeout(function() { var relatedProductCards = document.querySelectorAll('.product-card'); if (relatedProductCards && relatedProductCards.length) { relatedProductCards.forEach(productCardElement => { new window.theme.ProductCard(productCardElement, 'tagalys'); }); } }, 2000); } } }, filtersHeader: { render: function(html, args) { var props = args.props; var labels = args.labels; return html``; } }, appliedFilters: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var appliedFilters = helpers.getAppliedFilters(true); if (!appliedFilters.length) { return html``; } return html`
      ${appliedFilters.map(appliedFilter => { if (appliedFilter.type === 'range') { return html`
    • { helpers.clearFilter(appliedFilter.id); removeFilterDataLayerEvent(props, appliedFilter.id); }} class="applied-filter"> ${helpers.labelFormatter( appliedFilter.display_format, appliedFilter.selected_min, appliedFilter.currency )} - ${helpers.labelFormatter( appliedFilter.display_format, appliedFilter.selected_max, appliedFilter.currency )} <${args.templates.closeIcon} />
    • `; } return appliedFilter.items.map(filterItem => { return html`
    • { helpers.clearFilter(appliedFilter.id, filterItem.id); removeFilterDataLayerEvent(props, appliedFilter.id, filterItem); }} > ${filterItem.name} <${args.templates.closeIcon} />
    • `; }); })}
    `; } }, filter: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var classes = ['collection__filter', 'filter']; var isCollapseOpen = false; if (props.collapsible) { isCollapseOpen = helpers.isCollapsibleFilterExpanded(props.filter.id); if (isCollapseOpen) { classes.push('expanded'); } else { classes.push('collapsed'); } } var className = classes.join(' '); return html`

    <${args.templates.filterHeader} filterHeading=${props.filter.name} filterId=${props.filter.id} /> <${args.templates.filterItems} filter=${props.filter} />

    `; } }, filterHeader: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var filterOptions = helpers.getTemplateOptions('filters'); var showClearActionForIndividualFilters = filterOptions.showClearActionForIndividualFilters && helpers.isFilterApplied(props.filterId); var toggleCollapsibleFilter = () => { helpers.toggleCollapsibleFilter(props.filterId); }; var clearFilter = event => { event.stopPropagation(); helpers.clearFilter(props.filterId); removeFilterDataLayerEvent(props, props.filterId); }; return html`

    ${props.filterHeading}

    ${showClearActionForIndividualFilters ? html`

    ${labels.filters.clearIndividualFilter}

    ` : ''} ${filterOptions.collapsible ? html` <${args.templates.downArrow} /> ` : ''}

    `; } }, filterItems: { render: function(html, args) { var props = args.props; if (props.filter.type === 'checkbox') { return html`

    <${args.templates.filterCheckBoxes} filterId=${props.filter.id} filterItems=${props.filter.items} />

    `; } return html`

    <${args.templates.rangeSliderFilterItem} filter=${props.filter} />

    `; } }, filterCheckBoxes: { render: function(html, args) { var props = args.props; return html`
      ${props.filterItems.map(filterItem => { return html` <${args.templates.checkboxFilterItem} filterId=${props.filterId} filterItem=${filterItem} > ${ filterItem.selected && filterItem.items ? html` <${args.templates.filterCheckBoxes} filterId=${props.filterId} filterItems=${filterItem.items} /> ` : '' } ${args.templates.checkboxFilterItem}> `; })}
    `; } }, checkboxFilterItem: { render: function(html, args) { var props = args.props; var helpers = props.helpers; const onFilterClick = event => { event.stopPropagation(); if (props.filterItem.selected) { helpers.clearFilter(props.filterId, props.filterItem.id); removeFilterDataLayerEvent(props, props.filterId, props.filterItem); } else { helpers.applyFilter(props.filterId, props.filterItem.id); applyFilterDataLayerEvent(props); } }; return html`
  • ${props.filterItem.name} ${props.showMatchingProductsCount ? html` (${props.filterItem.count}) ` : ''} ${props.children}
  • `; } }, rangeSliderFilterItem: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var priceLabel = 'Any'; if (props.sliderInputValues[0] > props.filter.min && props.sliderInputValues[1] < props.filter.max) { priceLabel = 'Between ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[0], props.filter.currency) + ' - ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[1], props.filter.currency); } else if (props.sliderInputValues[0] > props.filter.min) { priceLabel = 'Above ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[0], props.filter.currency); } else if (props.sliderInputValues[1] < props.filter.max) { priceLabel = 'Below ' + helpers.labelFormatter(props.filter.display_format, props.sliderInputValues[1], props.filter.currency); } var minPriceValue = window.Currency.formatMoney( props.sliderInputValues[0] * 100, window.Currency.moneyFormats[window.Shopify.currency.active].money_format ); var maxPriceValue = window.Currency.formatMoney( props.sliderInputValues[1] * 100, window.Currency.moneyFormats[window.Shopify.currency.active].money_format ); var priceValueLeft = '0%'; if (props.sliderInputValues[0] > props.filter.min) { priceValueLeft = ((props.sliderInputValues[0] - props.filter.min) / props.filter.max) * 100; priceValueLeft += '%'; } var priceValueRight = '0%'; if (props.sliderInputValues[1] < props.filter.max) { // eslint-disable-next-line no-mixed-operators priceValueRight = (100 - props.sliderInputValues[1] / props.filter.max) * 100; priceValueRight += '%'; } var priceValueLeftClass = ''; var priceValueRightClass = ''; if (document.querySelector('.noUi-handle-lower.noUi-active')) { priceValueLeftClass = 'drag'; } if (document.querySelector('.noUi-handle-upper.noUi-active')) { priceValueRightClass = 'drag'; } return html`

    ${priceLabel}

    ${minPriceValue} ${maxPriceValue}

    `; } }, sortOptionInFilters: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; var filterOptions = helpers.getTemplateOptions('filters'); var appliedSortOption = helpers.getAppliedSortOption(); var sortOptions = helpers.getSortOptions(); let classes = ['filter']; let isCollapseOpen = false; if (filterOptions.collapsible) { isCollapseOpen = helpers.isCollapsibleFilterExpanded('sort_options'); if (isCollapseOpen) { classes.push('expanded'); } else { classes.push('collapsed'); } } var className = classes.join(' '); return html`

    <${args.templates.filterHeader} filterHeading=${labels.sortOptions.sortBy} filterId=${'sort_options'} />

      ${sortOptions.map(sortOption => { const checked = sortOption.id === appliedSortOption.id; return html`
    • { helpers.applySortOption(sortOption.id); clickSortOptionDataLayerEvent(helpers); }} > ${sortOption.label}
    • `; })}
    `; } }, downArrow: { // eslint-disable-next-line no-unused-vars render: function(html, args) { return html` `; } }, addToCartForm: { render: function(html, args) { var product = args.props.product; var variants = product.variants; var isOnlyInStore = false; var tags = product.tags; if (tags.length) { tags.forEach(function(tag) { if (tag === 'in-store') { isOnlyInStore = true; } }); } return html` `; } }, variantOption: { render: function(html, args) { var product = args.props.product; var variants = product.variants; return html`

    Please select an option below to add to cart.

    ${variants.map(variant => { if (variant.available) { return html`

    `; } else { return html`

    `; } })}

    ${variants.map(variant => { if (variant.available) { return html`

    `; } else { return html`

    `; } })}

    `; } }, variantSelect: { render: function(html, args) { var product = args.props.product; var variants = product.variants; return html` `; } }, productObj: { // Custom template to render variants render: function(html, args) { var product = args.props.product; return html` `; } }, products: { render: function(html, args) { var props = args.props; var helpers = props.helpers; var products = helpers.getProducts(); return html` ${products.map( (product, index) => html` <${args.templates.product} key=${index} product=${product} /> ` )} `; }, callbacks: { // eslint-disable-next-line no-unused-vars afterInitialRender: function(helpers) { setTimeout(function() { var relatedProductCards = document.querySelectorAll('.product-card'); if (relatedProductCards && relatedProductCards.length) { relatedProductCards.forEach(productCardElement => { new window.theme.ProductCard(productCardElement, 'tagalys'); }); } }, 2000); } } }, sortOptions: { render: function(html, args) { var props = args.props; var labels = args.labels; var helpers = props.helpers; var sortOptions = helpers.getSortOptions(); var appliedSortOption = helpers.getAppliedSortOption(); var applySortOption = event => { helpers.applySortOption(event.target.value); clickSortOptionDataLayerEvent(helpers); }; return html` `; } }, productListHeader: { render: function(html, args) { return html` <${args.templates.infoAndActions} /> `; } }, noResults: { options: '', render: function(html, args) { var props = args.props; var helpers = props.helpers; var labels = args.labels; return html`

    ${labels.searchResults.noResultsHeading.heading} "${helpers.getQuery()}" ${labels.searchResults.noResultsHeading.subHeading}

    <${args.templates.noResultsWidgets} />

    `; } }, infoAndActions: { render: function(html, args) { var props = args.props var helpers = props.helpers var labels = args.labels var filterOptions = helpers.getTemplateOptions('filters') return html`

    ${filterOptions.includeSortOptionsInFilters ? '' : html`<${args.templates.sortOptions} />` }

    `; }, }, pagination: { render: function(html, args) { var props = args.props var helpers = props.helpers var labels = args.labels if (helpers.canLoadNextResults(props.showLoadNextAfterEvery)) { return html` `; } return null }, }, callbacks: { onSuccessfulAPICall: function(response, helpers) { var product_card_show_variants = document.querySelectorAll(".product-card__variants--show"); product_card_show_variants.forEach((variant) => { variant.classList.remove('product-card__variants--show'); }); setTimeout(function() { var filterBarElement = document.querySelector('.collection__tabs'); var filterWrapperElement = document.querySelector('.filter-wrapper'); var headerElement = document.querySelector('#shopify-section-header'); var headerElementHeight = (headerElement) ? headerElement.getBoundingClientRect().height : 0; var categorySubnavElement = document.querySelector('#shopify-section-category-subnavigation'); var categorySubnavElementHeight = (categorySubnavElement) ? categorySubnavElement.getBoundingClientRect().height : 0; var headerHeight = ((headerElementHeight) + (categorySubnavElementHeight) - 2); if (filterWrapperElement && window.innerWidth > theme.settings.grid_medium) { this.filterWrapper = stickybits(".filter-wrapper", { stickyBitStickyOffset: headerHeight, useStickyClasses: true, useGetBoundingClientRect: true }); } }, 1000) return response; } } } // helper for initializing the failover widget TagalysCustomisationsCollection.initializeShopifyProductListingPage = function() { return Tagalys.UIWidgets.ShopifyProductListingPage.init(selector, { params: params, templates: shopifyProductListingPageTemplates }); } // helper for initializing the primary widget TagalysCustomisationsCollection.initializeProductListingPage = function() { Tagalys.UIWidgets.ProductListingPage.init(selector, { params: params, failover: TagalysCustomisationsCollection.initializeShopifyProductListingPage, templates: productListingPageTemplates, forceFailover: window.tagalysForceFailover }); } window.addEventListener('DOMContentLoaded', () => { onTagalysReady(function() { TagalysCustomisationsCollection.initializeProductListingPage(); }); }); document.body.addEventListener('click', function(evt) { if (evt.target.closest('.collection-filters-block')) { return; } var filters = document.querySelectorAll('.collection__filter.expanded'); if (filters.length) { filters.forEach(t => t.classList.remove('expanded')); } });
    Engagement Rings - The Perfect Ring For Your Special Moment (2024)
    Top Articles
    Latest Posts
    Article information

    Author: Nathanael Baumbach

    Last Updated:

    Views: 6426

    Rating: 4.4 / 5 (55 voted)

    Reviews: 94% of readers found this page helpful

    Author information

    Name: Nathanael Baumbach

    Birthday: 1998-12-02

    Address: Apt. 829 751 Glover View, West Orlando, IN 22436

    Phone: +901025288581

    Job: Internal IT Coordinator

    Hobby: Gunsmithing, Motor sports, Flying, Skiing, Hooping, Lego building, Ice skating

    Introduction: My name is Nathanael Baumbach, I am a fantastic, nice, victorious, brave, healthy, cute, glorious person who loves writing and wants to share my knowledge and understanding with you.