Skip to content

Commit f1735ad

Browse files
committed
Enabling URL parameters for categories and filter types
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 f1735ad

File tree

1 file changed

+75
-14
lines changed

1 file changed

+75
-14
lines changed

static/js/patterns-browser-v2.js

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,24 @@ 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+
enabledParams.filters.tier = "and";
119+
enabledParams.categories.industries = urlParams.getAll("industries");
120+
enabledParams.filters.industries = urlParams.get("industries_filter");
121+
enabledParams.categories.rh_products = urlParams.getAll("rh_products");
122+
enabledParams.filters.rh_products = urlParams.get("rh_products_filter");
123+
enabledParams.categories.other_products = urlParams.getAll("other_products");
124+
enabledParams.filters.other_products = urlParams.get("other_products_filter");
125+
// console.log(urlParams.get['tier']);
126+
// var tier = urlParams['tier'].split("|");
127+
return enabledParams;
128+
}
129+
112130
function cleanString(string) {
113131
// Provide a string that can be used as a HTML id i.e. no spaces.
114132
return string.replace(/ /g, "-")
@@ -190,25 +208,32 @@ function renderSpinner() {
190208
'</div>';
191209
}
192210

193-
function renderFilterItem(type, name, linkTitle) {
211+
function renderFilterItem(type, name, linkTitle, enabledItem) {
194212
// HTML for each checkbox item in the filters
213+
if (enabledItem) {
214+
checkedProp = "checked";
215+
} else {
216+
checkedProp = ""
217+
}
195218
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 + '"/>' +
219+
'<input class="pf-c-check__input" type="checkbox" id="' + type + ':' + cleanString(name) + '"' + 'onclick="filterSelection()" name="' + linkTitle + '" ' + checkedProp + ' />' +
197220
'<span class="pf-c-check__label wrappable">' + linkTitle + '</span>'+
198221
'</label>';
199222
return filterItemHtml;
200223
}
201224

202-
function renderFilterButtons(filterButtonTypes, name) {
225+
function renderFilterButtons(filterButtonTypes, name, enabledFilters) {
203226
// HTML for the AND / OR operator buttons
204227
if (filterButtonTypes.length > 1) {
205228
var filterButtonsHtml = '<div class="pf-c-toggle-group pf-m-compact">';
206229
var firstSelected = "";
207230
for (item = 0; item < filterButtonTypes.length; item++) {
208-
firstSelected = "";
209-
if (item == 0) { firstSelected = " pf-m-selected"; }
231+
selected = "";
232+
if (enabledFilters == filterButtonTypes[item].toLowerCase()) {
233+
selected = " pf-m-selected";
234+
};
210235
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)">' +
236+
'<button class="pf-c-toggle-group__button' + selected + '" type="button" id="' + name + "_button:" + filterButtonTypes[item].toLowerCase() + '" onclick="changeFilterType(this.id)">' +
212237
'<span class="pf-c-toggle-group__text">' + filterButtonTypes[item] + '</span>' +
213238
'</button>' +
214239
'</div>'
@@ -219,13 +244,21 @@ function renderFilterButtons(filterButtonTypes, name) {
219244
return "";
220245
}
221246

222-
function renderFilter(elementId, filterType, filterData) {
247+
function renderFilter(elementId, filterType, filterData, enabledParams, enabledFilters) {
223248
// HTML to render all filters
224249
const element = document.getElementById(elementId);
225250
for (item = 0; item < filterData.filter_list.length; item++) {
226-
element.innerHTML += renderFilterItem(filterType, filterData.filter_list[item].Name, filterData.filter_list[item].LinkTitle);
251+
if (enabledParams.includes(filterData.filter_list[item].Name)) {
252+
enabledItem = true;
253+
} else {
254+
enabledItem = false;
255+
}
256+
element.innerHTML += renderFilterItem(filterType, filterData.filter_list[item].Name, filterData.filter_list[item].LinkTitle, enabledItem);
227257
};
228-
element.innerHTML += renderFilterButtons(filterData.filter_types, filterType);
258+
if (!enabledFilters) {
259+
enabledFilters = "and";
260+
}
261+
element.innerHTML += renderFilterButtons(filterData.filter_types, filterType, enabledFilters);
229262
}
230263

231264
function renderLabel(tier, tier_categories) {
@@ -303,6 +336,7 @@ function filterSelection(filter) {
303336
const patternsData = getData()
304337
patternsData.then(output => {
305338
renderFilteredCards(output.patterns, output.filter_categories)
339+
updateURL(output.filter_categories)
306340
});
307341
}
308342

@@ -322,16 +356,43 @@ function changeFilterType(id) {
322356
const selectButton = document.getElementById(id);
323357
selectButton.classList.add("pf-m-selected");
324358
renderFilteredCards(output.patterns, output.filter_categories)
359+
updateURL(output.filter_categories)
325360
});
326361
}
327362

363+
function updateURL(filter_categories){
364+
var updatedUrl = new URL(window.location.pathname, window.location.origin);
365+
const patternsFilter = new Filter(filter_categories);
366+
var enabledParams = {};
367+
console.log(patternsFilter);
368+
for (var key in patternsFilter.filter_values) {
369+
var values = patternsFilter.filter_values[key];
370+
for (const value of values) {
371+
var category = patternsFilter.filter_categories[key];
372+
var found = category.filter_list.find((element) => element.LinkTitle == value);
373+
updatedUrl.searchParams.append(key, found.Name);
374+
}
375+
}
376+
console.log(patternsFilter.filter_types);
377+
for (var type_key in patternsFilter.filter_types) {
378+
var type_value = patternsFilter.filter_types[type_key];
379+
console.log(type_key)
380+
console.log(type_value)
381+
if (type_value == "or") {
382+
updatedUrl.searchParams.append(type_key + "_filter", "or");
383+
}
384+
}
385+
history.pushState({}, null, updatedUrl.href);
386+
}
387+
328388

329389
// Initialize the filters and pattern cards when the page loads
330-
const patternsData = getData()
390+
const patternsData = getData();
391+
const enabledParams = getParams();
331392
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);
393+
renderFilter("TiersItems", "tier", output.filter_categories.tier, enabledParams.categories.tier, enabledParams.filters.tier);
394+
renderFilter("IndustriesItems", "industries", output.filter_categories.industries, enabledParams.categories.industries, enabledParams.filters.industries);
395+
renderFilter("RhProductsItems", "rh_products", output.filter_categories.rh_products, enabledParams.categories.rh_products, enabledParams.filters.rh_products);
396+
renderFilter("OtherProductsItems", "other_products", output.filter_categories.other_products, enabledParams.categories.other_products, enabledParams.filters.other_products);
336397
renderFilteredCards(output.patterns, output.filter_categories)
337398
});

0 commit comments

Comments
 (0)