|
|
|
@ -1,12 +1,10 @@ |
|
|
|
(function ($, Drupal, once) { |
|
|
|
(function (Drupal, drupalSettings) { |
|
|
|
'use strict'; |
|
|
|
'use strict'; |
|
|
|
|
|
|
|
|
|
|
|
Drupal.behaviors.preserveAdvancedSearchParams = { |
|
|
|
Drupal.behaviors.preserveAdvancedSearchParams = { |
|
|
|
attach: function (context, settings) { |
|
|
|
attach: function (context, settings) { |
|
|
|
|
|
|
|
|
|
|
|
console.log('preserve-advanced-search.js loaded'); |
|
|
|
// Capture the a[] advanced search params from the current URL
|
|
|
|
|
|
|
|
|
|
|
|
// Extract a[] params from the current page URL
|
|
|
|
|
|
|
|
const rawSearch = window.location.search; |
|
|
|
const rawSearch = window.location.search; |
|
|
|
const aParams = rawSearch |
|
|
|
const aParams = rawSearch |
|
|
|
.substring(1) |
|
|
|
.substring(1) |
|
|
|
@ -14,56 +12,46 @@ |
|
|
|
.filter(part => part.startsWith('a%5B') || part.startsWith('a[')) |
|
|
|
.filter(part => part.startsWith('a%5B') || part.startsWith('a[')) |
|
|
|
.join('&'); |
|
|
|
.join('&'); |
|
|
|
|
|
|
|
|
|
|
|
console.log('[AdvSearch] aParams found:', aParams); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Nothing to preserve — bail out
|
|
|
|
|
|
|
|
if (!aParams) return; |
|
|
|
if (!aParams) return; |
|
|
|
|
|
|
|
|
|
|
|
// Target the <ul> that has data-drupal-facet-id
|
|
|
|
const sliders = settings.facets && settings.facets.sliders; |
|
|
|
// then find the .facet-slider inside it which is the noUiSlider element
|
|
|
|
if (!sliders) return; |
|
|
|
once('preserve-advsearch-slider', '[data-drupal-facet-id]', context) |
|
|
|
|
|
|
|
.forEach(function (el) { |
|
|
|
// Replace any a[] params in a URL with the current page's a[] params.
|
|
|
|
const facetId = el.dataset.drupalFacetId; |
|
|
|
// The current URL is always the source of truth — the server-built
|
|
|
|
const sliderEl = el.querySelector('.facet-slider'); |
|
|
|
// slider URL may contain stale or partial a[] params.
|
|
|
|
|
|
|
|
function rebuildUrl(url) { |
|
|
|
console.log('[AdvSearch] Found facet:', facetId, 'slider el:', sliderEl); |
|
|
|
if (!url) return url; |
|
|
|
|
|
|
|
const parts = url.split('?'); |
|
|
|
if (!sliderEl || !sliderEl.noUiSlider) { |
|
|
|
const basePath = parts[0]; |
|
|
|
console.warn('[AdvSearch] No noUiSlider instance found on', sliderEl); |
|
|
|
const query = parts[1] || ''; |
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
// Keep everything that is NOT an a[] param (i.e. the f[] facet params)
|
|
|
|
|
|
|
|
const keptParams = query |
|
|
|
// Get the facet settings from drupalSettings
|
|
|
|
.split('&') |
|
|
|
const facetSettings = settings.facets && settings.facets[facetId]; |
|
|
|
.filter(p => p.length > 0) |
|
|
|
console.log('[AdvSearch] facetSettings:', facetSettings); |
|
|
|
.filter(p => !p.startsWith('a%5B') && !p.startsWith('a[')) |
|
|
|
|
|
|
|
.join('&'); |
|
|
|
if (!facetSettings) { |
|
|
|
|
|
|
|
console.warn('[AdvSearch] No drupalSettings.facets entry for:', facetId); |
|
|
|
const finalQuery = [keptParams, aParams].filter(Boolean).join('&'); |
|
|
|
return; |
|
|
|
return basePath + '?' + finalQuery; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Remove original change listener and replace with patched version
|
|
|
|
Object.keys(sliders).forEach(function (key) { |
|
|
|
sliderEl.noUiSlider.off('change'); |
|
|
|
const sliderSettings = sliders[key]; |
|
|
|
sliderEl.noUiSlider.on('change', function (values, handle, unencoded) { |
|
|
|
|
|
|
|
let newUrl; |
|
|
|
if (sliderSettings.url) { |
|
|
|
|
|
|
|
sliderSettings.url = rebuildUrl(sliderSettings.url); |
|
|
|
if (facetSettings.range) { |
|
|
|
console.log('[AdvSearch] Rebuilt slider URL for', key, ':', sliderSettings.url); |
|
|
|
newUrl = facetSettings.url |
|
|
|
} |
|
|
|
.replace('__range_slider_min__', Math.round(unencoded[0])) |
|
|
|
|
|
|
|
.replace('__range_slider_max__', Math.round(unencoded[1])); |
|
|
|
if (sliderSettings.urls) { |
|
|
|
} else { |
|
|
|
Object.keys(sliderSettings.urls).forEach(function (urlKey) { |
|
|
|
newUrl = facetSettings.urls['f_' + values[0]]; |
|
|
|
sliderSettings.urls[urlKey] = rebuildUrl(sliderSettings.urls[urlKey]); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log('[AdvSearch] Navigating to:', newUrl + '&' + aParams); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const separator = newUrl.includes('?') ? '&' : '?'; |
|
|
|
|
|
|
|
window.location.href = newUrl + separator + aParams; |
|
|
|
|
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
console.log('[AdvSearch] Slider change handler patched successfully'); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
})(jQuery, Drupal, once); |
|
|
|
})(Drupal, drupalSettings); |
|
|
|
|