';
-
- if (algoliaConfig.showSuggestionsOnNoResultsPage && this.suggestions.length > 0) {
- content += '
' + algoliaConfig.translations.popularQueries + '
' + this.suggestions.join(', ');
+ if (algoliaConfig.isCategoryPage) {
+ data.helper.addNumericRefinement('visibility_catalog', '=', 1);
+ } else {
+ data.helper.addNumericRefinement('visibility_search', '=', 1);
+ }
+
+ data.helper.setPage(page);
+ },
+ render : function (data) {
+ if (!algoliaConfig.isSearchPage) {
+ if (data.results.query.length === 0 && data.results.nbHits === 0) {
+ $('.algolia-instant-replaced-content').show();
+ $('.algolia-instant-selector-results').hide();
+ } else {
+ $('.algolia-instant-replaced-content').hide();
+ $('.algolia-instant-selector-results').show();
+ }
+ }
}
+ },
+ /**
+ * Custom widget - Suggestions
+ * This widget renders suggestion queries which might be interesting for your customer
+ * Docs: https://www.algolia.com/doc/guides/building-search-ui/widgets/create-your-own-widgets/js/
+ **/
+ {
+ suggestions: [],
+ init : function () {
+ if (algoliaConfig.showSuggestionsOnNoResultsPage) {
+ var $this = this;
+ $.each(algoliaConfig.popularQueries.slice(0, Math.min(4, algoliaConfig.popularQueries.length)), function (i, query) {
+ query = $('
').html(query).text(); //xss
+ $this.suggestions.push('
' + query + '');
+ });
+ }
+ },
+ render : function (data) {
+ if (data.results.hits.length === 0) {
+ var content = '
';
+ content += '
' + algoliaConfig.translations.noProducts + ' "' + $("").text(data.results.query).html() + '"
';
+ content += '';
- content += '
';
- content += algoliaConfig.translations.or + ' ' + algoliaConfig.translations.seeAll + ''
+ if (algoliaConfig.showSuggestionsOnNoResultsPage && this.suggestions.length > 0) {
+ content += '' + algoliaConfig.translations.popularQueries + '
' + this.suggestions.join(', ');
+ }
- content += ' ';
+ content += '
';
+ content += algoliaConfig.translations.or + '
' + algoliaConfig.translations.seeAll + ''
- $('#instant-empty-results-container').html(content);
- } else {
- $('#instant-empty-results-container').html('');
- }
- }
- }
- ],
- /**
- * stats
- * Docs: https://www.algolia.com/doc/api-reference/widgets/stats/js/
- **/
- stats: {
- container: '#algolia-stats',
- templates: {
- text: function (data) {
- var hoganTemplate = algoliaBundle.Hogan.compile($('#instant-stats-template').html());
-
- data.first = data.page * data.hitsPerPage + 1;
- data.last = Math.min(data.page * data.hitsPerPage + data.hitsPerPage, data.nbHits);
- data.seconds = data.processingTimeMS / 1000;
- data.translations = window.algoliaConfig.translations;
-
- return hoganTemplate.render(data)
- }
- }
- },
- /**
- * sortBy
- * Docs: https://www.algolia.com/doc/api-reference/widgets/sort-by/js/
- **/
- sortBy: {
- container: '#algolia-sorts',
- items: algoliaConfig.sortingIndices.map(function (sortingIndice) {
- return {
- label: sortingIndice.label,
- value: sortingIndice.name,
- }
- })
- },
- /**
- * currentRefinements
- * Widget displays all filters and refinements applied on query. It also let your customer to clear them one by one
- * Docs: https://www.algolia.com/doc/api-reference/widgets/current-refinements/js/
- **/
- currentRefinements: {
- container: '#current-refinements',
- templates: {
- item: $('#current-refinements-template').html()
- },
- includedAttributes: attributes.map(function (attribute) {
- if (!(algoliaConfig.isCategoryPage && attribute.name.indexOf('categories') > -1)) {
- return attribute.name;
- }
- }),
- transformItems: function (items) {
- return items.map(function (item) {
- var attribute = attributes.filter(function (_attribute) {
- return item.attribute === _attribute.name
- })[0];
- if (!attribute) return item;
- item.label = attribute.label;
- item.refinements.forEach(function (refinement) {
- if (refinement.type !== 'hierarchical') return refinement;
- var levels = refinement.label.split('///');
- var lastLevel = levels[levels.length - 1];
- refinement.label = lastLevel;
- });
- return item;
- })
- }
- },
-
- /*
- * clearRefinements
- * Widget displays a button that lets the user clean every refinement applied to the search. You can control which attributes are impacted by the button with the options.
- * Docs: https://www.algolia.com/doc/api-reference/widgets/clear-refinements/js/
- **/
- clearRefinements: {
- container: '#clear-refinements',
- templates: {
- resetLabel: algoliaConfig.translations.clearAll,
- },
- includedAttributes: attributes.map(function (attribute) {
- if (!(algoliaConfig.isCategoryPage && attribute.name.indexOf('categories') > -1)) {
- return attribute.name;
- }
- }),
- cssClasses: {
- button: ['action', 'primary']
- },
- transformItems: function (items) {
- return items.map(function (item) {
- var attribute = attributes.filter(function (_attribute) {
- return item.attribute === _attribute.name
- })[0];
- if (!attribute) return item;
- item.label = attribute.label;
- return item;
- })
- }
- },
- /*
- * queryRuleCustomData
- * The queryRuleCustomData widget displays custom data from Query Rules.
- * Docs: https://www.algolia.com/doc/api-reference/widgets/query-rule-custom-data/js/
- **/
- queryRuleCustomData: {
- container: '#algolia-banner',
- templates: {
- default: '{{#items}} {{#banner}} {{{banner}}} {{/banner}} {{/items}}',
- }
- }
- };
-
- if (algoliaConfig.instant.isSearchBoxEnabled) {
- /**
- * searchBox
- * Docs: https://www.algolia.com/doc/api-reference/widgets/search-box/js/
- **/
- allWidgetConfiguration.searchBox = {
- container: instant_selector,
- placeholder: algoliaConfig.translations.searchFor,
- showSubmit: false,
- queryHook: function (inputValue, search) {
- if (algoliaConfig.isSearchPage && algoliaConfig.request.categoryId.length <= 0 && algoliaConfig.request.landingPageId.length <= 0) {
- $(".page-title-wrapper span.base").html(algoliaConfig.translations.searchTitle + ": '" + inputValue + "'");
- }
- return search(inputValue);
- }
- }
- }
-
- if (algoliaConfig.instant.infiniteScrollEnabled === true) {
- /**
- * infiniteHits
- * This widget renders all products into result page
- * Docs: https://www.algolia.com/doc/api-reference/widgets/infinite-hits/js/
- **/
- allWidgetConfiguration.infiniteHits = {
- container: '#instant-search-results-container',
- templates: {
- empty: '',
- item: $('#instant-hit-template').html(),
- showMoreText: algoliaConfig.translations.showMore
- },
- cssClasses: {
- loadPrevious: ['action', 'primary'],
- loadMore: ['action', 'primary']
- },
- transformItems: function (items) {
- return items.map(function (item) {
- item.__indexName = search.helper.lastResults.index;
- item = transformHit(item, algoliaConfig.priceKey, search.helper);
- // FIXME: transformHit is a global
- item.isAddToCartEnabled = algoliaConfig.instant.isAddToCartEnabled;
- return item;
- });
- },
- showPrevious: true,
- escapeHits: true
- };
-
- delete allWidgetConfiguration.hits;
- } else {
- /**
- * hits
- * This widget renders all products into result page
- * Docs: https://www.algolia.com/doc/api-reference/widgets/hits/js/
- **/
- allWidgetConfiguration.hits = {
- container: '#instant-search-results-container',
- templates: {
- empty: '',
- item: $('#instant-hit-template').html(),
- },
- transformItems: function (items, { results }) {
- if (results.nbPages <= 1 && algoliaConfig.instant.hidePagination === true){
- document.getElementById('instant-search-pagination-container').style.display = "none";
- }else{
- document.getElementById('instant-search-pagination-container').style.display = "block";
- }
- return items.map(function (item) {
-
- item.__indexName = search.helper.lastResults.index;
- item = transformHit(item, algoliaConfig.priceKey, search.helper);
- // FIXME: transformHit is a global
- item.isAddToCartEnabled = algoliaConfig.instant.isAddToCartEnabled;
- item.algoliaConfig = window.algoliaConfig;
- return item;
- })
- }
- };
-
- /**
- * pagination
- * Docs: https://www.algolia.com/doc/api-reference/widgets/pagination/js/
- **/
- allWidgetConfiguration.pagination = {
- container: '#instant-search-pagination-container',
- showFirst: false,
- showLast: false,
- showNext: true,
- showPrevious: true,
- totalPages: 1000,
- templates: {
- previous: algoliaConfig.translations.previousPage,
- next: algoliaConfig.translations.nextPage
- },
- };
-
- delete allWidgetConfiguration.infiniteHits;
- }
-
- /**
- * Here are specified custom attributes widgets which require special code to run properly
- * Custom widgets can be added to this object like [attribute]: function(facet, templates)
- * Function must return an array [
: string, : object]
- **/
- var customAttributeFacet = {
- categories: function (facet, templates) {
- var hierarchical_levels = [];
- for (var l = 0; l < 10; l++) {
- hierarchical_levels.push('categories.level' + l.toString());
- }
+ content += '';
- var hierarchicalMenuParams = {
- container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
- attributes: hierarchical_levels,
- separator: ' /// ',
- templates: templates,
- alwaysGetRootLevel: false,
- showParentLevel: false,
- limit: algoliaConfig.maxValuesPerFacet,
- sortBy: ['name:asc'],
- transformItems(items) {
- if (algoliaConfig.isCategoryPage) {
- var filteredData = [];
- items.forEach(element => {
- if (element.label == algoliaConfig.request.parentCategory) {
- filteredData.push(element);
+ $('#instant-empty-results-container').html(content);
+ } else {
+ $('#instant-empty-results-container').html('');
}
-
- });
- items = filteredData;
+ }
+ }
+ ],
+ /**
+ * stats
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/stats/js/
+ **/
+ stats: {
+ container: '#algolia-stats',
+ templates: {
+ text: function (data) {
+ var hoganTemplate = algoliaBundle.Hogan.compile($('#instant-stats-template').html());
+
+ data.first = data.page * data.hitsPerPage + 1;
+ data.last = Math.min(data.page * data.hitsPerPage + data.hitsPerPage, data.nbHits);
+ data.seconds = data.processingTimeMS / 1000;
+ data.translations = window.algoliaConfig.translations;
+
+ return hoganTemplate.render(data)
+ }
}
- return items.map(item => ({
- ...item,
- label: item.label,
- }));
- },
- };
-
- hierarchicalMenuParams.templates.item = '' +
- '
{{label}}' + ' ' +
- '{{#helpers.formatNumber}}{{count}}{{/helpers.formatNumber}}' +
- '';
- hierarchicalMenuParams.panelOptions = {
- templates: {
- header: '
' + (facet.label ? facet.label : facet.attribute) + '
',
- }
- };
-
- return ['hierarchicalMenu', hierarchicalMenuParams];
- }
- };
-
- /** Add all facet widgets to instantsearch object **/
- window.getFacetWidget = function (facet, templates) {
- var panelOptions = {
- templates: {
- header: '
'
- + (facet.label ? facet.label : facet.attribute)
- + '
',
- },
- hidden: function (options) {
- if (!options.results) return true;
- switch (facet.type) {
- case 'conjunctive':
- var facetsNames = options.results.facets.map(function (f) {
- return f.name
- });
- return facetsNames.indexOf(facet.attribute) === -1;
- case 'disjunctive':
- var disjunctiveFacetsNames = options.results.disjunctiveFacets.map(function (f) {
- return f.name
- });
- return disjunctiveFacetsNames.indexOf(facet.attribute) === -1;
- default:
- return false;
- }
- }
- };
- if (facet.type === 'priceRanges') {
- delete templates.item;
-
- return ['rangeInput', {
- container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
- attribute: facet.attribute,
- templates: $.extend({
- separatorText: algoliaConfig.translations.to,
- submitText: algoliaConfig.translations.go
- }, templates),
- cssClasses: {
- root: 'conjunctive'
},
- panelOptions: panelOptions,
- }];
- }
-
- if (facet.type === 'conjunctive') {
- var refinementListOptions = {
- container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
- attribute: facet.attribute,
- limit: algoliaConfig.maxValuesPerFacet,
- operator: 'and',
- templates: templates,
- sortBy: ['count:desc', 'name:asc'],
- cssClasses: {
- root: 'conjunctive'
+ /**
+ * sortBy
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/sort-by/js/
+ **/
+ sortBy: {
+ container: '#algolia-sorts',
+ items : algoliaConfig.sortingIndices.map(function (sortingIndice) {
+ return {
+ label: sortingIndice.label,
+ value: sortingIndice.name,
+ }
+ })
},
- panelOptions: panelOptions
- };
-
- refinementListOptions = addSearchForFacetValues(facet, refinementListOptions);
-
- return ['refinementList', refinementListOptions];
- }
-
- if (facet.type === 'disjunctive') {
- var refinementListOptions = {
- container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
- attribute: facet.attribute,
- limit: algoliaConfig.maxValuesPerFacet,
- operator: 'or',
- templates: templates,
- sortBy: ['count:desc', 'name:asc'],
- panelOptions: panelOptions,
- cssClasses: {
- root: 'disjunctive'
- }
- };
-
- refinementListOptions = addSearchForFacetValues(facet, refinementListOptions);
-
- return ['refinementList', refinementListOptions];
- }
-
- if (facet.type === 'slider') {
- delete templates.item;
-
- return ['rangeSlider', {
- container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
- attribute: facet.attribute,
- templates: templates,
- pips: false,
- panelOptions: panelOptions,
- tooltips: {
- format: function (formattedValue) {
- return facet.attribute.match(/price/) === null ?
- parseInt(formattedValue) :
- priceUtils.formatPrice(formattedValue, algoliaConfig.priceFormat);
+ /**
+ * currentRefinements
+ * Widget displays all filters and refinements applied on query. It also let your customer to clear them one by one
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/current-refinements/js/
+ **/
+ currentRefinements: {
+ container : '#current-refinements',
+ // TODO: Remove this - it does nothing
+ templates : {
+ item: $('#current-refinements-template').html()
+ },
+ includedAttributes: attributes.map(attribute => {
+ if (attribute.name.indexOf('categories') === -1
+ || !algoliaConfig.isCategoryPage) // For category browse, requires a custom renderer to prevent removal of the root node from hierarchicalMenu widget
+ return attribute.name;
+ }),
+
+ transformItems: items => {
+ return items
+ // This filter is only applicable if categories facet is included as an attribute
+ .filter(item => {
+ return !algoliaConfig.isCategoryPage
+ || item.refinements.filter(refinement => refinement.value !== algoliaConfig.request.path).length; // do not expose the category root
+ })
+ .map(item => {
+ const attribute = attributes.filter(_attribute => {
+ return item.attribute === _attribute.name
+ })[0];
+ if (!attribute) return item;
+ item.label = attribute.label;
+ item.refinements.forEach(function (refinement) {
+ if (refinement.type !== 'hierarchical') return refinement;
+
+ const levels = refinement.label.split(algoliaConfig.instant.categorySeparator);
+ const lastLevel = levels[levels.length - 1];
+ refinement.label = lastLevel;
+ });
+ return item;
+ });
+ },
+
+ /*
+ * clearRefinements
+ * Widget displays a button that lets the user clean every refinement applied to the search. You can control which attributes are impacted by the button with the options.
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/clear-refinements/js/
+ **/
+ clearRefinements: {
+ container : '#clear-refinements',
+ templates : {
+ resetLabel: algoliaConfig.translations.clearAll,
+ },
+ includedAttributes: attributes.map(function (attribute) {
+ if (!(algoliaConfig.isCategoryPage && attribute.name.indexOf('categories') > -1)) {
+ return attribute.name;
+ }
+ }),
+ cssClasses : {
+ button: ['action', 'primary']
+ },
+ transformItems : function (items) {
+ return items.map(function (item) {
+ var attribute = attributes.filter(function (_attribute) {
+ return item.attribute === _attribute.name
+ })[0];
+ if (!attribute) return item;
+ item.label = attribute.label;
+ return item;
+ })
+ }
+ },
+ /*
+ * queryRuleCustomData
+ * The queryRuleCustomData widget displays custom data from Query Rules.
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/query-rule-custom-data/js/
+ **/
+ queryRuleCustomData: {
+ container: '#algolia-banner',
+ templates: {
+ default: '{{#items}} {{#banner}} {{{banner}}} {{/banner}} {{/items}}',
+ }
}
}
- }];
- }
- };
-
- var wrapper = document.getElementById('instant-search-facets-container');
- $.each(algoliaConfig.facets, function (i, facet) {
-
- if (facet.attribute.indexOf("price") !== -1)
- facet.attribute = facet.attribute + algoliaConfig.priceKey;
-
- facet.wrapper = wrapper;
-
- var templates = {
- item: $('#refinements-lists-item-template').html()
- };
-
- var widgetInfo = customAttributeFacet[facet.attribute] !== undefined ?
- customAttributeFacet[facet.attribute](facet, templates) :
- getFacetWidget(facet, templates);
-
- var widgetType = widgetInfo[0],
- widgetConfig = widgetInfo[1];
+ };
- if (typeof allWidgetConfiguration[widgetType] === 'undefined') {
- allWidgetConfiguration[widgetType] = [widgetConfig];
- } else {
- allWidgetConfiguration[widgetType].push(widgetConfig);
- }
- });
+ if (algoliaConfig.instant.isSearchBoxEnabled) {
+ /**
+ * searchBox
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/search-box/js/
+ **/
+ allWidgetConfiguration.searchBox = {
+ container: instant_selector,
+ placeholder: algoliaConfig.translations.searchFor,
+ showSubmit: false,
+ queryHook: function (inputValue, search) {
+ if (algoliaConfig.isSearchPage && algoliaConfig.request.categoryId.length <= 0 && algoliaConfig.request.landingPageId.length <= 0) {
+ $(".page-title-wrapper span.base").html(algoliaConfig.translations.searchTitle + ": '" + inputValue + "'");
+ }
+ return search(inputValue);
+ }
+ }
+ }
+
+ if (algoliaConfig.instant.infiniteScrollEnabled === true) {
+ /**
+ * infiniteHits
+ * This widget renders all products into result page
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/infinite-hits/js/
+ **/
+ allWidgetConfiguration.infiniteHits = {
+ container: '#instant-search-results-container',
+ templates: {
+ empty: '',
+ item: $('#instant-hit-template').html(),
+ showMoreText: algoliaConfig.translations.showMore
+ },
+ cssClasses: {
+ loadPrevious: ['action', 'primary'],
+ loadMore: ['action', 'primary']
+ },
+ transformItems: function (items) {
+ return items.map(function (item) {
+ item.__indexName = search.helper.lastResults.index;
+ item = transformHit(item, algoliaConfig.priceKey, search.helper);
+ // FIXME: transformHit is a global
+ item.isAddToCartEnabled = algoliaConfig.instant.isAddToCartEnabled;
+ return item;
+ });
+ },
+ showPrevious: true,
+ escapeHits: true
+ };
+
+ delete allWidgetConfiguration.hits;
+ } else {
+ /**
+ * hits
+ * This widget renders all products into result page
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/hits/js/
+ **/
+ allWidgetConfiguration.hits = {
+ container: '#instant-search-results-container',
+ templates: {
+ empty: '',
+ item: $('#instant-hit-template').html(),
+ },
+ transformItems: function (items, { results }) {
+ if (results.nbPages <= 1 && algoliaConfig.instant.hidePagination === true){
+ document.getElementById('instant-search-pagination-container').style.display = "none";
+ }else{
+ document.getElementById('instant-search-pagination-container').style.display = "block";
+ }
+ return items.map(function (item) {
+ item.__indexName = search.helper.lastResults.index;
+ item = transformHit(item, algoliaConfig.priceKey, search.helper);
+ // FIXME: transformHit is a global
+ item.isAddToCartEnabled = algoliaConfig.instant.isAddToCartEnabled;
+ item.algoliaConfig = window.algoliaConfig;
+ return item;
+ })
+ }
+ };
+
+ /**
+ * pagination
+ * Docs: https://www.algolia.com/doc/api-reference/widgets/pagination/js/
+ **/
+ allWidgetConfiguration.pagination = {
+ container: '#instant-search-pagination-container',
+ showFirst: false,
+ showLast: false,
+ showNext: true,
+ showPrevious: true,
+ totalPages: 1000,
+ templates: {
+ previous: algoliaConfig.translations.previousPage,
+ next: algoliaConfig.translations.nextPage
+ },
+ };
+
+ delete allWidgetConfiguration.infiniteHits;
+ }
+
+ /**
+ * Here are specified custom attributes widgets which require special code to run properly
+ * Custom widgets can be added to this object like [attribute]: function(facet, templates)
+ * Function must return an array [
: string, : object]
+ **/
+ var customAttributeFacet = {
+ categories: function (facet, templates) {
+ var hierarchical_levels = [];
+ for (var l = 0; l < 10; l++) {
+ hierarchical_levels.push('categories.level' + l.toString());
+ }
+
+
+ //return array of items starting from root based on category
+ const findRoot = (items) => {
+ const root = items.find(element => algoliaConfig.request.path.startsWith(element.value));
+
+ if (!root) {
+ return items;
+ }
+ if (!root.data) {
+ return [];
+ }
+
+ return findRoot(root.data);
+
+ };
+
+ var hierarchicalMenuParams = {
+ container : facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
+ attributes : hierarchical_levels,
+ separator : algoliaConfig.instant.categorySeparator,
+ templates : templates,
+ showParentLevel : true,
+ limit : algoliaConfig.maxValuesPerFacet,
+ sortBy : ['name:asc'],
+ transformItems(items) {
+ return (algoliaConfig.isCategoryPage)
+ ? findRoot(items).map(
+ item => {
+ return {
+ ...item,
+ categoryUrl: algoliaConfig.instant.isCategoryNavigationEnabled ? algoliaConfig.request.childCategories[item.value]['url'] : ''
+ };
+ }
+ )
+ : items;
+ },
+ };
+
+ hierarchicalMenuParams.templates.item = '' +
+ '{{label}}' + ' ' +
+ '{{#helpers.formatNumber}}{{count}}{{/helpers.formatNumber}}' +
+ '';
+ hierarchicalMenuParams.panelOptions = {
+ templates: {
+ header: '' + (facet.label ? facet.label : facet.attribute) + '
',
+ },
+ hidden : function ({items}) {
+ return !items.length;
+ }
+ };
+
+ return ['hierarchicalMenu', hierarchicalMenuParams];
+ }
+ };
+
+ /** Add all facet widgets to instantsearch object **/
+ window.getFacetWidget = function (facet, templates) {
+ var panelOptions = {
+ templates: {
+ header: ''
+ + (facet.label ? facet.label : facet.attribute)
+ + '
',
+ },
+ hidden: function (options) {
+ if (!options.results) return true;
+ switch (facet.type) {
+ case 'conjunctive':
+ var facetsNames = options.results.facets.map(function (f) {
+ return f.name
+ });
+ return facetsNames.indexOf(facet.attribute) === -1;
+ case 'disjunctive':
+ var disjunctiveFacetsNames = options.results.disjunctiveFacets.map(function (f) {
+ return f.name
+ });
+ return disjunctiveFacetsNames.indexOf(facet.attribute) === -1;
+ default:
+ return false;
+ }
+ }
+ };
+ if (facet.type === 'priceRanges') {
+ delete templates.item;
+
+ return ['rangeInput', {
+ container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
+ attribute: facet.attribute,
+ templates: $.extend({
+ separatorText: algoliaConfig.translations.to,
+ submitText: algoliaConfig.translations.go
+ }, templates),
+ cssClasses: {
+ root: 'conjunctive'
+ },
+ panelOptions: panelOptions,
+ }];
+ }
+
+ if (facet.type === 'conjunctive') {
+ var refinementListOptions = {
+ container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
+ attribute: facet.attribute,
+ limit: algoliaConfig.maxValuesPerFacet,
+ operator: 'and',
+ templates: templates,
+ sortBy: ['count:desc', 'name:asc'],
+ cssClasses: {
+ root: 'conjunctive'
+ },
+ panelOptions: panelOptions
+ };
+
+ refinementListOptions = addSearchForFacetValues(facet, refinementListOptions);
+
+ return ['refinementList', refinementListOptions];
+ }
+
+ if (facet.type === 'disjunctive') {
+ var refinementListOptions = {
+ container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
+ attribute: facet.attribute,
+ limit: algoliaConfig.maxValuesPerFacet,
+ operator: 'or',
+ templates: templates,
+ sortBy: ['count:desc', 'name:asc'],
+ panelOptions: panelOptions,
+ cssClasses: {
+ root: 'disjunctive'
+ }
+ };
+
+ refinementListOptions = addSearchForFacetValues(facet, refinementListOptions);
+
+ return ['refinementList', refinementListOptions];
+ }
+
+ if (facet.type === 'slider') {
+ delete templates.item;
+
+ return ['rangeSlider', {
+ container: facet.wrapper.appendChild(createISWidgetContainer(facet.attribute)),
+ attribute: facet.attribute,
+ templates: templates,
+ pips: false,
+ panelOptions: panelOptions,
+ tooltips: {
+ format: function (formattedValue) {
+ return facet.attribute.match(/price/) === null ?
+ parseInt(formattedValue) :
+ priceUtils.formatPrice(formattedValue, algoliaConfig.priceFormat);
+ }
+ }
+ }];
+ }
+ };
+
+ var wrapper = document.getElementById('instant-search-facets-container');
+ $.each(algoliaConfig.facets, function (i, facet) {
+
+ if (facet.attribute.indexOf("price") !== -1)
+ facet.attribute = facet.attribute + algoliaConfig.priceKey;
+
+ facet.wrapper = wrapper;
+
+ var templates = {
+ item: $('#refinements-lists-item-template').html()
+ };
+
+ var widgetInfo = customAttributeFacet[facet.attribute] !== undefined ?
+ customAttributeFacet[facet.attribute](facet, templates) :
+ getFacetWidget(facet, templates);
+
+ var widgetType = widgetInfo[0],
+ widgetConfig = widgetInfo[1];
+
+ if (typeof allWidgetConfiguration[widgetType] === 'undefined') {
+ allWidgetConfiguration[widgetType] = [widgetConfig];
+ } else {
+ allWidgetConfiguration[widgetType].push(widgetConfig);
+ }
+ });
+
+ if (algoliaConfig.analytics.enabled) {
+ if (typeof algoliaAnalyticsPushFunction !== 'function') {
+ var algoliaAnalyticsPushFunction = function (formattedParameters, state, results) {
+ var trackedUrl = '/catalogsearch/result/?q=' + state.query + '&' + formattedParameters + '&numberOfHits=' + results.nbHits;
+
+ // Universal Analytics
+ if (typeof window.ga !== 'undefined') {
+ window.ga('set', 'page', trackedUrl);
+ window.ga('send', 'pageView');
+ }
+ };
+ }
+
+ allWidgetConfiguration['analytics'] = {
+ pushFunction: algoliaAnalyticsPushFunction,
+ delay: algoliaConfig.analytics.delay,
+ triggerOnUIInteraction: algoliaConfig.analytics.triggerOnUiInteraction,
+ pushInitialSearch: algoliaConfig.analytics.pushInitialSearch
+ };
+ }
+
+ allWidgetConfiguration = algolia.triggerHooks('beforeWidgetInitialization', allWidgetConfiguration, algoliaBundle);
+
+ $.each(allWidgetConfiguration, function (widgetType, widgetConfig) {
+ if (Array.isArray(widgetConfig) === true) {
+ $.each(widgetConfig, function (i, widgetConfig) {
+ addWidget(search, widgetType, widgetConfig);
+ });
+ } else {
+ addWidget(search, widgetType, widgetConfig);
+ }
+ });
+
+ var isStarted = false;
+
+ function startInstantSearch() {
+ if (isStarted === true) {
+ return;
+ }
+
+ search = algolia.triggerHooks('beforeInstantsearchStart', search, algoliaBundle);
+ search.start();
+ search = algolia.triggerHooks('afterInstantsearchStart', search, algoliaBundle);
+
+ isStarted = true;
+ }
+
+ /** Initialise searching **/
+ startInstantSearch();
+ });
+
+ function addWidget(search, type, config) {
+ if (type === 'custom') {
+ search.addWidgets([config]);
+ return;
+ }
+ var widget = algoliaBundle.instantsearch.widgets[type];
+ if (config.panelOptions) {
+ widget = algoliaBundle.instantsearch.widgets.panel(config.panelOptions)(widget);
+ delete config.panelOptions;
+ }
+ if(type === "rangeSlider" && config.attribute.indexOf("price.") < 0) {
+ config.panelOptions = {
+ hidden(options) {
+ return options.range.min === 0 && options.range.max === 0;
+ },
+ };
+ widget = algoliaBundle.instantsearch.widgets.panel(config.panelOptions)(widget);
+ delete config.panelOptions;
+ }
+
+ search.addWidgets([widget(config)]);
+ }
- if (algoliaConfig.analytics.enabled) {
- if (typeof algoliaAnalyticsPushFunction !== 'function') {
- var algoliaAnalyticsPushFunction = function (formattedParameters, state, results) {
- var trackedUrl = '/catalogsearch/result/?q=' + state.query + '&' + formattedParameters + '&numberOfHits=' + results.nbHits;
+ function addSearchForFacetValues(facet, options) {
+ if (facet.searchable === '1') {
+ options.searchable = true;
+ options.searchableIsAlwaysActive = false;
+ options.searchablePlaceholder = algoliaConfig.translations.searchForFacetValuesPlaceholder;
+ options.templates = options.templates || {};
+ options.templates.searchableNoResults = '' + algoliaConfig.translations.noResults + '
';
+ }
- // Universal Analytics
- if (typeof window.ga !== 'undefined') {
- window.ga('set', 'page', trackedUrl);
- window.ga('send', 'pageView');
- }
- };
- }
-
- allWidgetConfiguration['analytics'] = {
- pushFunction: algoliaAnalyticsPushFunction,
- delay: algoliaConfig.analytics.delay,
- triggerOnUIInteraction: algoliaConfig.analytics.triggerOnUiInteraction,
- pushInitialSearch: algoliaConfig.analytics.pushInitialSearch
- };
- }
-
- allWidgetConfiguration = algolia.triggerHooks('beforeWidgetInitialization', allWidgetConfiguration, algoliaBundle);
-
- $.each(allWidgetConfiguration, function (widgetType, widgetConfig) {
- if (Array.isArray(widgetConfig) === true) {
- $.each(widgetConfig, function (i, widgetConfig) {
- addWidget(search, widgetType, widgetConfig);
- });
- } else {
- addWidget(search, widgetType, widgetConfig);
- }
- });
-
- var isStarted = false;
-
- function startInstantSearch() {
- if (isStarted === true) {
- return;
- }
-
- search = algolia.triggerHooks('beforeInstantsearchStart', search, algoliaBundle);
- search.start();
- search = algolia.triggerHooks('afterInstantsearchStart', search, algoliaBundle);
-
- isStarted = true;
- }
-
- /** Initialise searching **/
- startInstantSearch();
- });
-
- function addWidget(search, type, config) {
- if (type === 'custom') {
- search.addWidgets([config]);
- return;
- }
- var widget = algoliaBundle.instantsearch.widgets[type];
- if (config.panelOptions) {
- widget = algoliaBundle.instantsearch.widgets.panel(config.panelOptions)(widget);
- delete config.panelOptions;
- }
- if(type === "rangeSlider" && config.attribute.indexOf("price.") < 0) {
- config.panelOptions = {
- hidden(options) {
- return options.range.min === 0 && options.range.max === 0;
- },
- };
- widget = algoliaBundle.instantsearch.widgets.panel(config.panelOptions)(widget);
- delete config.panelOptions;
+ return options;
}
-
- search.addWidgets([widget(config)]);
- }
-
- function addSearchForFacetValues(facet, options) {
- if (facet.searchable === '1') {
- options.searchable = true;
- options.searchableIsAlwaysActive = false;
- options.searchablePlaceholder = algoliaConfig.translations.searchForFacetValuesPlaceholder;
- options.templates = options.templates || {};
- options.templates.searchableNoResults = '' + algoliaConfig.translations.noResults + '
';
- }
-
- return options;
- }
- }
-);
+ }
+);
\ No newline at end of file
diff --git a/view/frontend/web/internals/common.js b/view/frontend/web/internals/common.js
index 58a454f44..b80f02a2d 100755
--- a/view/frontend/web/internals/common.js
+++ b/view/frontend/web/internals/common.js
@@ -198,6 +198,7 @@ define(['jquery', 'algoliaBundle'], function ($, algoliaBundle) {
hit.addToCart = {
'action': action,
+ 'redirectUrlParam': algoliaConfig.instant.addToCartParams.redirectUrlParam,
'uenc': AlgoliaBase64.mageEncode(action),
'formKey': algoliaConfig.instant.addToCartParams.formKey
};
diff --git a/view/frontend/web/internals/search-insights.js b/view/frontend/web/internals/search-insights.js
index b6b28400c..21b7df9b4 100644
--- a/view/frontend/web/internals/search-insights.js
+++ b/view/frontend/web/internals/search-insights.js
@@ -1 +1 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).AlgoliaAnalytics={})}(this,function(e){"use strict";var t=function(){try{return Boolean(navigator.cookieEnabled)}catch(e){return!1}},r=function(){try{return Boolean(navigator.sendBeacon)}catch(e){return!1}},n=function(){try{return Boolean(XMLHttpRequest)}catch(e){return!1}},o=function(e){return void 0===e},i=function(e){return"string"==typeof e},s=function(e){return"number"==typeof e},a=function(e){return"function"==typeof e};var c="insights-js (1.7.1)";var u=["de","us"],p=2592e6;var h,f,l,d,w=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})},b="_ALGOLIA",y=function(e,t,r){var n=new Date;n.setTime(n.getTime()+r);var o="expires="+n.toUTCString();document.cookie=e+"="+t+";"+o+";path=/"},v=function(e){for(var t=e+"=",r=document.cookie.split(";"),n=0;n0;)r[n]=arguments[n+1];e&&a(t[e])?t[e].apply(t,r):console.warn("The method `"+e+"` doesn't exist.")}),o=e[r];o.queue=o.queue||[];var i=o.queue;i.forEach(function(e){var t=[].slice.call(e),r=t[0],o=t.slice(1);n.apply(void 0,[r].concat(o))}),i.push=function(e){var t=[].slice.call(e),r=t[0],o=t.slice(1);n.apply(void 0,[r].concat(o))}}}function D(e){var t=new g({requestFn:e});return"undefined"!=typeof window&&k.call(t,window),t}var E=D(function(){if(r())return I;if(n())return m;throw new Error("Could not find a supported HTTP request client in this environment.")}());e.createInsightsClient=D,e.default=E,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).AlgoliaAnalytics={})}(this,function(e){"use strict";function n(){"function"!=typeof Object.assign&&(Object.assign=function(e,n){var t=arguments;if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var i=Object(e),o=1;o0;)t[i]=arguments[i+1];e&&c(n[e])?n[e].apply(n,t):console.warn("The method `"+e+"` doesn't exist.")}),o=e[t];o.queue=o.queue||[];var r=o.queue;r.forEach(function(e){var n=[].slice.call(e),t=n[0],o=n.slice(1);i.apply(void 0,[t].concat(o))}),r.push=function(e){var n=[].slice.call(e),t=n[0],o=n.slice(1);i.apply(void 0,[t].concat(o))}}}function C(e){var n=new j({requestFn:e});return"object"==typeof window&&P.call(n,window),n.version=h,n}var U=C(function(){if(r())return w;if(s())return A;throw new Error("Could not find a supported HTTP request client in this environment.")}());e.createInsightsClient=C,e.default=U,Object.defineProperty(e,"__esModule",{value:!0})});