@@ -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+
112129function 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
231263function 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 ( ) ;
331400patternsData . 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