Skip to content

Commit da36ced

Browse files
Enabling URL parameters for categories and filter types (#556)
This commit provides a way to set a permanent URL string for a filtered view on the patterns browser. It stores both the category (tier, industries, etc) and type (and / or) as URL params. Notes: - Default for the filter type is "and", so *_filter=and won't appear in the URL. Only *_filter=or will appear.
1 parent c4b0f8a commit da36ced

File tree

2 files changed

+84
-15
lines changed

2 files changed

+84
-15
lines changed

layouts/partials/patterns-browser.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="pf-c-page__sidebar-body">
33
<div class="pf-l-flex filter-title-div">
44
<span class="pf-c-title pf-m-md filter-title pf-l-flex__item pf-m-grow">Filter by</span>
5-
<!-- <span class="pf-l-flex__item reset-title">Reset filters</span> -->
5+
<span class="pf-l-flex__item reset-title"><a id="clear_filters" href="#" onclick="clearFilters();return false;">Clear filters</a></span>
66
</div>
77
{{ partial "menu-patterns-browser.html" . }}
88
</div>

static/js/patterns-browser-v2.js

Lines changed: 83 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,23 @@ async function getData() {
109109
}
110110
}
111111

112+
function getParams() {
113+
// Get the params from the current URL
114+
const url = window.location.search;
115+
const urlParams = new URLSearchParams(url);
116+
var enabledParams = {'categories': {}, 'filters': {}};
117+
enabledParams.categories.tier = urlParams.getAll("tier");
118+
// Tier is always "and" since each pattern can only have one tier
119+
enabledParams.filters.tier = "and";
120+
enabledParams.categories.industries = urlParams.getAll("industries");
121+
enabledParams.filters.industries = urlParams.get("industries_filter");
122+
enabledParams.categories.rh_products = urlParams.getAll("rh_products");
123+
enabledParams.filters.rh_products = urlParams.get("rh_products_filter");
124+
enabledParams.categories.other_products = urlParams.getAll("other_products");
125+
enabledParams.filters.other_products = urlParams.get("other_products_filter");
126+
return enabledParams;
127+
}
128+
112129
function cleanString(string) {
113130
// Provide a string that can be used as a HTML id i.e. no spaces.
114131
return string.replace(/ /g, "-")
@@ -190,25 +207,32 @@ function renderSpinner() {
190207
'</div>';
191208
}
192209

193-
function renderFilterItem(type, name, linkTitle) {
210+
function renderFilterItem(type, name, linkTitle, enabledItem) {
194211
// HTML for each checkbox item in the filters
212+
if (enabledItem) {
213+
checkedProp = "checked";
214+
} else {
215+
checkedProp = ""
216+
}
195217
var filterItemHtml = '<label class="pf-c-check pf-c-select__menu-item" for="' + type + ':' + cleanString(name) + '">' +
196-
'<input class="pf-c-check__input" type="checkbox" id="' + type + ':' + cleanString(name) + '"' + 'onclick="filterSelection()" name="' + linkTitle + '"/>' +
218+
'<input class="pf-c-check__input filter_checkbox" type="checkbox" id="' + type + ':' + cleanString(name) + '"' + 'onclick="filterSelection()" name="' + linkTitle + '" ' + checkedProp + ' />' +
197219
'<span class="pf-c-check__label wrappable">' + linkTitle + '</span>'+
198220
'</label>';
199221
return filterItemHtml;
200222
}
201223

202-
function renderFilterButtons(filterButtonTypes, name) {
224+
function renderFilterButtons(filterButtonTypes, name, enabledFilters) {
203225
// HTML for the AND / OR operator buttons
204226
if (filterButtonTypes.length > 1) {
205227
var filterButtonsHtml = '<div class="pf-c-toggle-group pf-m-compact">';
206228
var firstSelected = "";
207229
for (item = 0; item < filterButtonTypes.length; item++) {
208-
firstSelected = "";
209-
if (item == 0) { firstSelected = " pf-m-selected"; }
230+
selected = "";
231+
if (enabledFilters == filterButtonTypes[item].toLowerCase()) {
232+
selected = " pf-m-selected";
233+
};
210234
filterButtonsHtml += '<div class="pf-c-toggle-group__item">' +
211-
'<button class="pf-c-toggle-group__button' + firstSelected + '" type="button" id="' + name + "_button:" + filterButtonTypes[item].toLowerCase() + '" onclick="changeFilterType(this.id)">' +
235+
'<button class="pf-c-toggle-group__button' + selected + '" type="button" id="' + name + "_button:" + filterButtonTypes[item].toLowerCase() + '" onclick="changeFilterType(this.id)">' +
212236
'<span class="pf-c-toggle-group__text">' + filterButtonTypes[item] + '</span>' +
213237
'</button>' +
214238
'</div>'
@@ -219,13 +243,21 @@ function renderFilterButtons(filterButtonTypes, name) {
219243
return "";
220244
}
221245

222-
function renderFilter(elementId, filterType, filterData) {
246+
function renderFilter(elementId, filterType, filterData, enabledParams, enabledFilters) {
223247
// HTML to render all filters
224248
const element = document.getElementById(elementId);
225249
for (item = 0; item < filterData.filter_list.length; item++) {
226-
element.innerHTML += renderFilterItem(filterType, filterData.filter_list[item].Name, filterData.filter_list[item].LinkTitle);
250+
if (enabledParams.includes(filterData.filter_list[item].Name)) {
251+
enabledItem = true;
252+
} else {
253+
enabledItem = false;
254+
}
255+
element.innerHTML += renderFilterItem(filterType, filterData.filter_list[item].Name, filterData.filter_list[item].LinkTitle, enabledItem);
227256
};
228-
element.innerHTML += renderFilterButtons(filterData.filter_types, filterType);
257+
if (!enabledFilters) {
258+
enabledFilters = "and";
259+
}
260+
element.innerHTML += renderFilterButtons(filterData.filter_types, filterType, enabledFilters);
229261
}
230262

231263
function renderLabel(tier, tier_categories) {
@@ -303,6 +335,7 @@ function filterSelection(filter) {
303335
const patternsData = getData()
304336
patternsData.then(output => {
305337
renderFilteredCards(output.patterns, output.filter_categories)
338+
updateURL(output.filter_categories)
306339
});
307340
}
308341

@@ -322,16 +355,52 @@ function changeFilterType(id) {
322355
const selectButton = document.getElementById(id);
323356
selectButton.classList.add("pf-m-selected");
324357
renderFilteredCards(output.patterns, output.filter_categories)
358+
updateURL(output.filter_categories)
325359
});
326360
}
327361

362+
function updateURL(filter_categories){
363+
// Update the URL with the current params based on the checkboxes
364+
var updatedUrl = new URL(window.location.pathname, window.location.origin);
365+
const patternsFilter = new Filter(filter_categories);
366+
var enabledParams = {};
367+
for (var key in patternsFilter.filter_values) {
368+
var values = patternsFilter.filter_values[key];
369+
for (const value of values) {
370+
var category = patternsFilter.filter_categories[key];
371+
var found = category.filter_list.find((element) => element.LinkTitle == value);
372+
updatedUrl.searchParams.append(key, found.Name);
373+
}
374+
}
375+
for (var type_key in patternsFilter.filter_types) {
376+
var type_value = patternsFilter.filter_types[type_key];
377+
if (type_value == "or") {
378+
updatedUrl.searchParams.append(type_key + "_filter", "or");
379+
}
380+
}
381+
history.pushState({}, null, updatedUrl.href);
382+
}
383+
384+
function clearFilters(){
385+
// Clear all the filters
386+
const patternsData = getData()
387+
var filter_checkboxes = document.getElementsByClassName("filter_checkbox");
388+
for (item = 0; item < filter_checkboxes.length; item++) {
389+
filter_checkboxes[item].checked = false;
390+
}
391+
patternsData.then(output => {
392+
renderFilteredCards(output.patterns, output.filter_categories);
393+
updateURL(output.filter_categories);
394+
});
395+
}
328396

329397
// Initialize the filters and pattern cards when the page loads
330-
const patternsData = getData()
398+
const patternsData = getData();
399+
const enabledParams = getParams();
331400
patternsData.then(output => {
332-
renderFilter("TiersItems", "tier", output.filter_categories.tier);
333-
renderFilter("IndustriesItems", "industries", output.filter_categories.industries);
334-
renderFilter("RhProductsItems", "rh_products", output.filter_categories.rh_products);
335-
renderFilter("OtherProductsItems", "other_products", output.filter_categories.other_products);
401+
renderFilter("TiersItems", "tier", output.filter_categories.tier, enabledParams.categories.tier, enabledParams.filters.tier);
402+
renderFilter("IndustriesItems", "industries", output.filter_categories.industries, enabledParams.categories.industries, enabledParams.filters.industries);
403+
renderFilter("RhProductsItems", "rh_products", output.filter_categories.rh_products, enabledParams.categories.rh_products, enabledParams.filters.rh_products);
404+
renderFilter("OtherProductsItems", "other_products", output.filter_categories.other_products, enabledParams.categories.other_products, enabledParams.filters.other_products);
336405
renderFilteredCards(output.patterns, output.filter_categories)
337406
});

0 commit comments

Comments
 (0)