From 305d9b44ece3bac4e8b171d075cad61206230079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 6 Sep 2016 11:52:26 +0200 Subject: [PATCH] re-indented algolia_search.js so that it uses 4-space indents. --- src/scripts/algolia_search.js | 696 ++++++++++++++++++---------------- 1 file changed, 365 insertions(+), 331 deletions(-) diff --git a/src/scripts/algolia_search.js b/src/scripts/algolia_search.js index f79e77e9..35a3cddd 100644 --- a/src/scripts/algolia_search.js +++ b/src/scripts/algolia_search.js @@ -1,359 +1,393 @@ $(document).ready(function() { - /******************** - * INITIALIZATION - * *******************/ + /******************** + * INITIALIZATION + * *******************/ - var HITS_PER_PAGE = 25; - var MAX_VALUES_PER_FACET = 30; + var HITS_PER_PAGE = 25; + var MAX_VALUES_PER_FACET = 30; - // DOM binding - var $inputField = $('#q'); - var $hits = $('#hits'); - var $stats = $('#stats'); - var $facets = $('#facets'); - var $pagination = $('#pagination'); + // DOM binding + var $inputField = $('#q'); + var $hits = $('#hits'); + var $stats = $('#stats'); + var $facets = $('#facets'); + var $pagination = $('#pagination'); - // Templates binding - var hitTemplate = Hogan.compile($('#hit-template').text()); - var statsTemplate = Hogan.compile($('#stats-template').text()); - var facetTemplate = Hogan.compile($('#facet-template').text()); - var sliderTemplate = Hogan.compile($('#slider-template').text()); - var paginationTemplate = Hogan.compile($('#pagination-template').text()); + // Templates binding + var hitTemplate = Hogan.compile($('#hit-template').text()); + var statsTemplate = Hogan.compile($('#stats-template').text()); + var facetTemplate = Hogan.compile($('#facet-template').text()); + var sliderTemplate = Hogan.compile($('#slider-template').text()); + var paginationTemplate = Hogan.compile($('#pagination-template').text()); - // Client initialization - var algolia = algoliasearch(APPLICATION_ID, SEARCH_ONLY_API_KEY); + // Client initialization + var algolia = algoliasearch(APPLICATION_ID, SEARCH_ONLY_API_KEY); - // Helper initialization - var params = { - hitsPerPage: HITS_PER_PAGE, - maxValuesPerFacet: MAX_VALUES_PER_FACET, - facets: $.map(FACET_CONFIG, function(facet) { return !facet.disjunctive ? facet.name : null; }), - disjunctiveFacets: $.map(FACET_CONFIG, function(facet) { return facet.disjunctive ? facet.name : null; }) - }; - - // Setup the search helper - var helper = algoliasearchHelper(algolia, INDEX_NAME, params); - - // Check if we passed hidden facets in the FACET_CONFIG - var result = $.grep(FACET_CONFIG, function(e){ return e.hidden && e.hidden == true; }); - for (var i = 0; i < result.length; i++) { - var f = result[i]; - helper.addFacetRefinement(f.name, f.value); - } - - - // Input binding - $inputField.on('keyup change', function() { - var query = $inputField.val(); - toggleIconEmptyInput(!query.trim()); - helper.setQuery(query).search(); - }).focus(); - - // AlgoliaHelper events - helper.on('change', function(state) { - setURLParams(state); - }); - helper.on('error', function(error) { - console.log(error); - }); - helper.on('result', function(content, state) { - renderStats(content); - renderHits(content); - renderFacets(content, state); - renderPagination(content); - bindSearchObjects(); - - renderFirstHit($(hits).children('.search-hit:first')); - }); - - /************ - * SEARCH - * ***********/ - - function renderFirstHit(firstHit) { - - firstHit.addClass('active'); - firstHit.find('#search-loading').addClass('active'); - - var getNode = setTimeout(function(){ - $.get('/nodes/' + firstHit.attr('data-hit-id') + '/view', function(dataHtml){ - $('#search-hit-container').html(dataHtml); - }) - .done(function(){ - $('.search-loading').removeClass('active'); - $('#search-error').hide(); - $('#search-hit-container').show(); - - clearTimeout(getNode); - }) - .fail(function(data){ - $('.search-loading').removeClass('active'); - $('#search-hit-container').hide(); - $('#search-error').show().html('Houston!\n\n' + data.status + ' ' + data.statusText); - }); - }, 1000); - }; - - // Initial search - initWithUrlParams(); - helper.search(); - - function convertTimestamp(timestamp) { - var d = new Date(timestamp * 1000), // Convert the passed timestamp to milliseconds - yyyy = d.getFullYear(), - mm = ('0' + (d.getMonth() + 1)).slice(-2), // Months are zero based. Add leading 0. - dd = ('0' + d.getDate()).slice(-2), // Add leading 0. - time; - - time = dd + '/' + mm + '/' + yyyy; - - return time; - } - - - function renderStats(content) { - var stats = { - nbHits: numberWithDelimiter(content.nbHits), - processingTimeMS: content.processingTimeMS, - nbHits_plural: content.nbHits !== 1 + // Helper initialization + var params = { + hitsPerPage: HITS_PER_PAGE, + maxValuesPerFacet: MAX_VALUES_PER_FACET, + facets: $.map(FACET_CONFIG, function(facet) { + return !facet.disjunctive ? facet.name : null; + }), + disjunctiveFacets: $.map(FACET_CONFIG, function(facet) { + return facet.disjunctive ? facet.name : null; + }) }; - $stats.html(statsTemplate.render(stats)); - } - function renderHits(content) { - var hitsHtml = ''; - for (var i = 0; i < content.hits.length; ++i) { - // console.log(content.hits[i]); - var created = content.hits[i]['created']; - if (created) { - content.hits[i]['created'] = convertTimestamp(created); - } - var updated = content.hits[i]['updated']; - if (updated) { - content.hits[i]['updated'] = convertTimestamp(updated); - } - hitsHtml += hitTemplate.render(content.hits[i]); - } - if (content.hits.length === 0) hitsHtml = '

We didn\'t find any items. Try searching something else.

'; - $hits.html(hitsHtml); - } + // Setup the search helper + var helper = algoliasearchHelper(algolia, INDEX_NAME, params); - function renderFacets(content, state) { - // If no results - if (content.hits.length === 0) { - $facets.empty(); - return; + // Check if we passed hidden facets in the FACET_CONFIG + var result = $.grep(FACET_CONFIG, function(e) { + return e.hidden && e.hidden == true; + }); + for (var i = 0; i < result.length; i++) { + var f = result[i]; + helper.addFacetRefinement(f.name, f.value); } - // Process facets - var facets = []; - for (var facetIndex = 0; facetIndex < FACET_CONFIG.length; ++facetIndex) { - var facetParams = FACET_CONFIG[facetIndex]; - if (facetParams.hidden) { - continue - } - var facetResult = content.getFacetByName(facetParams.name); - if (facetResult) { - var facetContent = {}; - facetContent.facet = facetParams.name; - facetContent.title = facetParams.title; - facetContent.type = facetParams.type; - if (facetParams.type === 'slider') { - // if the facet is a slider - facetContent.min = facetResult.stats.min; - facetContent.max = facetResult.stats.max; - var valueMin = state.getNumericRefinement(facetParams.name, '>=') || facetResult.stats.min; - var valueMax = state.getNumericRefinement(facetParams.name, '<=') || facetResult.stats.max; - valueMin = Math.min(facetContent.max, Math.max(facetContent.min, valueMin)); - valueMax = Math.min(facetContent.max, Math.max(facetContent.min, valueMax)); - facetContent.values = [valueMin, valueMax]; - } else { - // format and sort the facet values - var values = []; - for (var v in facetResult.data) { - var label = ''; - if (v === 'true') { label = 'Yes'; } - else if (v === 'false') { label = 'No'; } - // Remove any underscore from the value - else { label = v.replace(/_/g," "); } - values.push({ label: label, value: v, count: facetResult.data[v], refined: helper.isRefined(facetParams.name, v) }); - } - var sortFunction = facetParams.sortFunction || sortByCountDesc; - if (facetParams.topListIfRefined) sortFunction = sortByRefined(sortFunction); - values.sort(sortFunction); + // Input binding + $inputField.on('keyup change', function() { + var query = $inputField.val(); + toggleIconEmptyInput(!query.trim()); + helper.setQuery(query).search(); + }).focus(); - facetContent.values = values.slice(0, 10); - facetContent.has_other_values = values.length > 10; - facetContent.other_values = values.slice(10); - facetContent.disjunctive = facetParams.disjunctive; + // AlgoliaHelper events + helper.on('change', function(state) { + setURLParams(state); + }); + helper.on('error', function(error) { + console.log(error); + }); + helper.on('result', function(content, state) { + renderStats(content); + renderHits(content); + renderFacets(content, state); + renderPagination(content); + bindSearchObjects(); + + renderFirstHit($(hits).children('.search-hit:first')); + }); + + /************ + * SEARCH + * ***********/ + + function renderFirstHit(firstHit) { + + firstHit.addClass('active'); + firstHit.find('#search-loading').addClass('active'); + + var getNode = setTimeout(function() { + $.get('/nodes/' + firstHit.attr('data-hit-id') + '/view', function(dataHtml) { + $('#search-hit-container').html(dataHtml); + }) + .done(function() { + $('.search-loading').removeClass('active'); + $('#search-error').hide(); + $('#search-hit-container').show(); + + clearTimeout(getNode); + }) + .fail(function(data) { + $('.search-loading').removeClass('active'); + $('#search-hit-container').hide(); + $('#search-error').show().html('Houston!\n\n' + data.status + ' ' + data.statusText); + }); + }, 1000); + }; + + // Initial search + initWithUrlParams(); + helper.search(); + + function convertTimestamp(timestamp) { + var d = new Date(timestamp * 1000), // Convert the passed timestamp to milliseconds + yyyy = d.getFullYear(), + mm = ('0' + (d.getMonth() + 1)).slice(-2), // Months are zero based. Add leading 0. + dd = ('0' + d.getDate()).slice(-2), // Add leading 0. + time; + + time = dd + '/' + mm + '/' + yyyy; + + return time; + } + + + function renderStats(content) { + var stats = { + nbHits: numberWithDelimiter(content.nbHits), + processingTimeMS: content.processingTimeMS, + nbHits_plural: content.nbHits !== 1 + }; + $stats.html(statsTemplate.render(stats)); + } + + function renderHits(content) { + var hitsHtml = ''; + for (var i = 0; i < content.hits.length; ++i) { + // console.log(content.hits[i]); + var created = content.hits[i]['created']; + if (created) { + content.hits[i]['created'] = convertTimestamp(created); + } + var updated = content.hits[i]['updated']; + if (updated) { + content.hits[i]['updated'] = convertTimestamp(updated); + } + hitsHtml += hitTemplate.render(content.hits[i]); } - facets.push(facetContent); - } - } - // Display facets - var facetsHtml = ''; - for (var indexFacet = 0; indexFacet < facets.length; ++indexFacet) { - var facet = facets[indexFacet]; - if (facet.type && facet.type === 'slider') facetsHtml += sliderTemplate.render(facet); - else facetsHtml += facetTemplate.render(facet); - } - $facets.html(facetsHtml); - } - - function renderPagination(content) { - // If no results - if (content.hits.length === 0) { - $pagination.empty(); - return; + if (content.hits.length === 0) hitsHtml = '

We didn\'t find any items. Try searching something else.

'; + $hits.html(hitsHtml); } - var maxPages = 2; + function renderFacets(content, state) { + // If no results + if (content.hits.length === 0) { + $facets.empty(); + return; + } - // Process pagination - var pages = []; - if (content.page > maxPages) { - pages.push({ current: false, number: 1 }); - // They don't really add much... - // pages.push({ current: false, number: '...', disabled: true }); + // Process facets + var facets = []; + for (var facetIndex = 0; facetIndex < FACET_CONFIG.length; ++facetIndex) { + var facetParams = FACET_CONFIG[facetIndex]; + if (facetParams.hidden) { + continue + } + var facetResult = content.getFacetByName(facetParams.name); + if (facetResult) { + var facetContent = {}; + facetContent.facet = facetParams.name; + facetContent.title = facetParams.title; + facetContent.type = facetParams.type; + + if (facetParams.type === 'slider') { + // if the facet is a slider + facetContent.min = facetResult.stats.min; + facetContent.max = facetResult.stats.max; + var valueMin = state.getNumericRefinement(facetParams.name, '>=') || facetResult.stats.min; + var valueMax = state.getNumericRefinement(facetParams.name, '<=') || facetResult.stats.max; + valueMin = Math.min(facetContent.max, Math.max(facetContent.min, valueMin)); + valueMax = Math.min(facetContent.max, Math.max(facetContent.min, valueMax)); + facetContent.values = [valueMin, valueMax]; + } else { + // format and sort the facet values + var values = []; + for (var v in facetResult.data) { + var label = ''; + if (v === 'true') { + label = 'Yes'; + } else if (v === 'false') { + label = 'No'; + } + // Remove any underscore from the value + else { + label = v.replace(/_/g, " "); + } + values.push({ + label: label, + value: v, + count: facetResult.data[v], + refined: helper.isRefined(facetParams.name, v) + }); + } + var sortFunction = facetParams.sortFunction || sortByCountDesc; + if (facetParams.topListIfRefined) sortFunction = sortByRefined(sortFunction); + values.sort(sortFunction); + + facetContent.values = values.slice(0, 10); + facetContent.has_other_values = values.length > 10; + facetContent.other_values = values.slice(10); + facetContent.disjunctive = facetParams.disjunctive; + } + facets.push(facetContent); + } + } + // Display facets + var facetsHtml = ''; + for (var indexFacet = 0; indexFacet < facets.length; ++indexFacet) { + var facet = facets[indexFacet]; + if (facet.type && facet.type === 'slider') facetsHtml += sliderTemplate.render(facet); + else facetsHtml += facetTemplate.render(facet); + } + $facets.html(facetsHtml); } - for (var p = content.page - maxPages; p < content.page + maxPages; ++p) { - if (p < 0 || p >= content.nbPages) { - continue; - } - pages.push({ current: content.page === p, number: (p + 1) }); + + function renderPagination(content) { + // If no results + if (content.hits.length === 0) { + $pagination.empty(); + return; + } + + var maxPages = 2; + + // Process pagination + var pages = []; + if (content.page > maxPages) { + pages.push({ + current: false, + number: 1 + }); + // They don't really add much... + // pages.push({ current: false, number: '...', disabled: true }); + } + for (var p = content.page - maxPages; p < content.page + maxPages; ++p) { + if (p < 0 || p >= content.nbPages) { + continue; + } + pages.push({ + current: content.page === p, + number: (p + 1) + }); + } + if (content.page + maxPages < content.nbPages) { + // They don't really add much... + // pages.push({ current: false, number: '...', disabled: true }); + pages.push({ + current: false, + number: content.nbPages + }); + } + var pagination = { + pages: pages, + prev_page: (content.page > 0 ? content.page : false), + next_page: (content.page + 1 < content.nbPages ? content.page + 2 : false) + }; + // Display pagination + $pagination.html(paginationTemplate.render(pagination)); } - if (content.page + maxPages < content.nbPages) { - // They don't really add much... - // pages.push({ current: false, number: '...', disabled: true }); - pages.push({ current: false, number: content.nbPages }); + + + // Event bindings + function bindSearchObjects() { + // Slider binding + // $('#customerReviewCount-slider').slider().on('slideStop', function(ev) { + // helper.addNumericRefinement('customerReviewCount', '>=', ev.value[0]).search(); + // helper.addNumericRefinement('customerReviewCount', '<=', ev.value[1]).search(); + // }); + + // Pimp checkboxes + // $('input[type="checkbox"]').checkbox(); } - var pagination = { - pages: pages, - prev_page: (content.page > 0 ? content.page : false), - next_page: (content.page + 1 < content.nbPages ? content.page + 2 : false) + + // Click binding + $(document).on('click', '.show-more, .show-less', function(e) { + e.preventDefault(); + $(this).closest('ul').find('.show-more').toggle(); + $(this).closest('ul').find('.show-less').toggle(); + return false; + }); + $(document).on('click', '.toggleRefine', function() { + helper.toggleRefine($(this).data('facet'), $(this).data('value')).search(); + return false; + }); + $(document).on('click', '.gotoPage', function() { + helper.setCurrentPage(+$(this).data('page') - 1).search(); + $("html, body").animate({ + scrollTop: 0 + }, '500', 'swing'); + return false; + }); + $(document).on('click', '.sortBy', function() { + $(this).closest('.btn-group').find('.sort-by').text($(this).text()); + helper.setIndex(INDEX_NAME + $(this).data('index-suffix')).search(); + return false; + }); + $(document).on('click', '#input-loop', function() { + $inputField.val('').change(); + }); + + // Dynamic styles + $('#facets').on("mouseenter mouseleave", ".button-checkbox", function(e) { + $(this).parent().find('.facet_link').toggleClass("hover"); + }); + $('#facets').on("mouseenter mouseleave", ".facet_link", function(e) { + $(this).parent().find('.button-checkbox button.btn').toggleClass("hover"); + }); + + + /************ + * HELPERS + * ***********/ + + function toggleIconEmptyInput(isEmpty) { + if (isEmpty) { + $('#input-loop').addClass('glyphicon-loop'); + $('#input-loop').removeClass('glyphicon-remove'); + } else { + $('#input-loop').removeClass('glyphicon-loop'); + $('#input-loop').addClass('glyphicon-remove'); + } + } + + function numberWithDelimiter(number, delimiter) { + number = number + ''; + delimiter = delimiter || ','; + var split = number.split('.'); + split[0] = split[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1' + delimiter); + return split.join('.'); + } + var sortByCountDesc = function sortByCountDesc(a, b) { + return b.count - a.count; }; - // Display pagination - $pagination.html(paginationTemplate.render(pagination)); - } - - - // Event bindings - function bindSearchObjects() { - // Slider binding - // $('#customerReviewCount-slider').slider().on('slideStop', function(ev) { - // helper.addNumericRefinement('customerReviewCount', '>=', ev.value[0]).search(); - // helper.addNumericRefinement('customerReviewCount', '<=', ev.value[1]).search(); - // }); - - // Pimp checkboxes - // $('input[type="checkbox"]').checkbox(); - } - - // Click binding - $(document).on('click','.show-more, .show-less',function(e) { - e.preventDefault(); - $(this).closest('ul').find('.show-more').toggle(); - $(this).closest('ul').find('.show-less').toggle(); - return false; - }); - $(document).on('click','.toggleRefine',function() { - helper.toggleRefine($(this).data('facet'), $(this).data('value')).search(); - return false; - }); - $(document).on('click','.gotoPage',function() { - helper.setCurrentPage(+$(this).data('page') - 1).search(); - $("html, body").animate({scrollTop:0}, '500', 'swing'); - return false; - }); - $(document).on('click','.sortBy',function() { - $(this).closest('.btn-group').find('.sort-by').text($(this).text()); - helper.setIndex(INDEX_NAME + $(this).data('index-suffix')).search(); - return false; - }); - $(document).on('click','#input-loop',function() { - $inputField.val('').change(); - }); - - // Dynamic styles - $('#facets').on("mouseenter mouseleave", ".button-checkbox", function(e){ - $(this).parent().find('.facet_link').toggleClass("hover"); - }); - $('#facets').on("mouseenter mouseleave", ".facet_link", function(e){ - $(this).parent().find('.button-checkbox button.btn').toggleClass("hover"); - }); - - - /************ - * HELPERS - * ***********/ - - function toggleIconEmptyInput(isEmpty) { - if(isEmpty) { - $('#input-loop').addClass('glyphicon-loop'); - $('#input-loop').removeClass('glyphicon-remove'); - } - else { - $('#input-loop').removeClass('glyphicon-loop'); - $('#input-loop').addClass('glyphicon-remove'); - } - } - function numberWithDelimiter(number, delimiter) { - number = number + ''; - delimiter = delimiter || ','; - var split = number.split('.'); - split[0] = split[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1' + delimiter); - return split.join('.'); - } - var sortByCountDesc = function sortByCountDesc (a, b) { return b.count - a.count; }; - var sortByName = function sortByName (a, b) { - return a.value.localeCompare(b.value); - }; - var sortByRefined = function sortByRefined (sortFunction) { - return function (a, b) { - if (a.refined !== b.refined) { - if (a.refined) return -1; - if (b.refined) return 1; - } - return sortFunction(a, b); + var sortByName = function sortByName(a, b) { + return a.value.localeCompare(b.value); + }; + var sortByRefined = function sortByRefined(sortFunction) { + return function(a, b) { + if (a.refined !== b.refined) { + if (a.refined) return -1; + if (b.refined) return 1; + } + return sortFunction(a, b); + }; }; - }; - function initWithUrlParams() { - var sPageURL = location.hash; - if (!sPageURL || sPageURL.length === 0) { return true; } - var sURLVariables = sPageURL.split('&'); - if (!sURLVariables || sURLVariables.length === 0) { return true; } - var query = decodeURIComponent(sURLVariables[0].split('=')[1]); - $inputField.val(query); - helper.setQuery(query); - for (var i = 2; i < sURLVariables.length; i++) { - var sParameterName = sURLVariables[i].split('='); - var facet = decodeURIComponent(sParameterName[0]); - var value = decodeURIComponent(sParameterName[1]); - helper.toggleRefine(facet, value, false); - } - // Page has to be set in the end to avoid being overwritten - var page = decodeURIComponent(sURLVariables[1].split('=')[1])-1; - helper.setCurrentPage(page); - } - function setURLParams(state) { - var urlParams = '#'; - var currentQuery = state.query; - urlParams += 'q=' + encodeURIComponent(currentQuery); - var currentPage = state.page+1; - urlParams += '&page=' + currentPage; - for (var facetRefine in state.facetsRefinements) { - urlParams += '&' + encodeURIComponent(facetRefine) + '=' + encodeURIComponent(state.facetsRefinements[facetRefine]); + function initWithUrlParams() { + var sPageURL = location.hash; + if (!sPageURL || sPageURL.length === 0) { + return true; + } + var sURLVariables = sPageURL.split('&'); + if (!sURLVariables || sURLVariables.length === 0) { + return true; + } + var query = decodeURIComponent(sURLVariables[0].split('=')[1]); + $inputField.val(query); + helper.setQuery(query); + for (var i = 2; i < sURLVariables.length; i++) { + var sParameterName = sURLVariables[i].split('='); + var facet = decodeURIComponent(sParameterName[0]); + var value = decodeURIComponent(sParameterName[1]); + helper.toggleRefine(facet, value, false); + } + // Page has to be set in the end to avoid being overwritten + var page = decodeURIComponent(sURLVariables[1].split('=')[1]) - 1; + helper.setCurrentPage(page); + } - for (var disjunctiveFacetrefine in state.disjunctiveFacetsRefinements) { - for (var value in state.disjunctiveFacetsRefinements[disjunctiveFacetrefine]) { - urlParams += '&' + encodeURIComponent(disjunctiveFacetrefine) + '=' + encodeURIComponent(state.disjunctiveFacetsRefinements[disjunctiveFacetrefine][value]); - } + + function setURLParams(state) { + var urlParams = '#'; + var currentQuery = state.query; + urlParams += 'q=' + encodeURIComponent(currentQuery); + var currentPage = state.page + 1; + urlParams += '&page=' + currentPage; + for (var facetRefine in state.facetsRefinements) { + urlParams += '&' + encodeURIComponent(facetRefine) + '=' + encodeURIComponent(state.facetsRefinements[facetRefine]); + } + for (var disjunctiveFacetrefine in state.disjunctiveFacetsRefinements) { + for (var value in state.disjunctiveFacetsRefinements[disjunctiveFacetrefine]) { + urlParams += '&' + encodeURIComponent(disjunctiveFacetrefine) + '=' + encodeURIComponent(state.disjunctiveFacetsRefinements[disjunctiveFacetrefine][value]); + } + } + location.replace(urlParams); } - location.replace(urlParams); - } }); -