Browse Source

pauls advanced search tweaks

master
rdrew 2 weeks ago
parent
commit
23fa691889
  1. 72
      js/preserve-advanced-search.js

72
js/preserve-advanced-search.js

@ -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) {
const facetId = el.dataset.drupalFacetId;
const sliderEl = el.querySelector('.facet-slider');
console.log('[AdvSearch] Found facet:', facetId, 'slider el:', sliderEl); // Replace any a[] params in a URL with the current page's a[] params.
// The current URL is always the source of truth — the server-built
// slider URL may contain stale or partial a[] params.
function rebuildUrl(url) {
if (!url) return url;
const parts = url.split('?');
const basePath = parts[0];
const query = parts[1] || '';
if (!sliderEl || !sliderEl.noUiSlider) { // Keep everything that is NOT an a[] param (i.e. the f[] facet params)
console.warn('[AdvSearch] No noUiSlider instance found on', sliderEl); const keptParams = query
return; .split('&')
} .filter(p => p.length > 0)
.filter(p => !p.startsWith('a%5B') && !p.startsWith('a['))
// Get the facet settings from drupalSettings .join('&');
const facetSettings = settings.facets && settings.facets[facetId];
console.log('[AdvSearch] facetSettings:', facetSettings);
if (!facetSettings) { const finalQuery = [keptParams, aParams].filter(Boolean).join('&');
console.warn('[AdvSearch] No drupalSettings.facets entry for:', facetId); return basePath + '?' + finalQuery;
return;
} }
// 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 (facetSettings.range) { if (sliderSettings.url) {
newUrl = facetSettings.url sliderSettings.url = rebuildUrl(sliderSettings.url);
.replace('__range_slider_min__', Math.round(unencoded[0])) console.log('[AdvSearch] Rebuilt slider URL for', key, ':', sliderSettings.url);
.replace('__range_slider_max__', Math.round(unencoded[1]));
} else {
newUrl = facetSettings.urls['f_' + values[0]];
} }
console.log('[AdvSearch] Navigating to:', newUrl + '&' + aParams); if (sliderSettings.urls) {
Object.keys(sliderSettings.urls).forEach(function (urlKey) {
const separator = newUrl.includes('?') ? '&' : '?'; sliderSettings.urls[urlKey] = rebuildUrl(sliderSettings.urls[urlKey]);
window.location.href = newUrl + separator + aParams;
}); });
}
console.log('[AdvSearch] Slider change handler patched successfully');
}); });
} }
}; };
})(jQuery, Drupal, once); })(Drupal, drupalSettings);

Loading…
Cancel
Save