|
| 1 | +async function getData() { |
| 2 | + const url = "/patterns/index.json"; |
| 3 | + try { |
| 4 | + const response = await fetch(url); |
| 5 | + if (!response.ok) { |
| 6 | + throw new Error(`Response status: ${response.status}`); |
| 7 | + } |
| 8 | + const json = await response.json(); |
| 9 | + return json; |
| 10 | + } catch (error) { |
| 11 | + console.error(error.message); |
| 12 | + } |
| 13 | +} |
| 14 | + |
| 15 | +function cleanString(string) { |
| 16 | + return string.replace(/ /g, "-") |
| 17 | +} |
| 18 | + |
| 19 | +function capitalizeFirstLetter(string) { |
| 20 | + return string[0].toUpperCase() + string.slice(1); |
| 21 | +} |
| 22 | + |
| 23 | +function sortAtoZ(a, b){ |
| 24 | + const nameA = a.Name.toUpperCase() |
| 25 | + const nameB = b.Name.toUpperCase() |
| 26 | + if (nameA < nameB) { |
| 27 | + return -1; |
| 28 | + } |
| 29 | + if (nameA > nameB) { |
| 30 | + return 1; |
| 31 | + } |
| 32 | + return 0; |
| 33 | +} |
| 34 | + |
| 35 | +function sortDate(a, b){ |
| 36 | + if (a.Params.date != undefined) { |
| 37 | + var dateA = new Date(a.Params.date) |
| 38 | + } else { |
| 39 | + var dateA = new Date("2000-01-01T00:00:00Z"); |
| 40 | + }; |
| 41 | + if (b.Params.date != undefined) { |
| 42 | + var dateB = new Date(b.Params.date) |
| 43 | + } else { |
| 44 | + var dateB = new Date("2000-01-01T00:00:00Z"); |
| 45 | + }; |
| 46 | + if (dateA < dateB) { |
| 47 | + return -1; |
| 48 | + } |
| 49 | + if (dateA > dateB) { |
| 50 | + return 1; |
| 51 | + } |
| 52 | + return 0; |
| 53 | +} |
| 54 | + |
| 55 | +function renderFilterItem(type, name, linkTitle) { |
| 56 | + var filterItem = '<label class="pf-c-check pf-c-select__menu-item" for="' + type + ':' + cleanString(name) + '">' + |
| 57 | + '<input class="pf-c-check__input" type="checkbox" id="' + type + ':' + cleanString(name) + '"' + 'onclick="filterSelection()" name="' + linkTitle + '"/>' + |
| 58 | + '<span class="pf-c-check__label wrappable">' + linkTitle + '</span>'+ |
| 59 | + '</label>'; |
| 60 | + return filterItem; |
| 61 | +} |
| 62 | + |
| 63 | +function renderFilter(elementId, filterType, filterData) { |
| 64 | + for (item = 0; item < filterData.length; item++) { |
| 65 | + const element = document.getElementById(elementId); |
| 66 | + element.innerHTML += renderFilterItem(filterType, filterData[item].Name, filterData[item].LinkTitle); |
| 67 | + }; |
| 68 | +} |
| 69 | + |
| 70 | +function renderLabel(tier) { |
| 71 | + if (tier != undefined) { |
| 72 | + if (tier == "maintained") { var color = "green" } |
| 73 | + else if (tier == "tested") { var color = "blue" } |
| 74 | + else if (tier == "sandbox") { var color = "orange" }; |
| 75 | + var renderedLabel = '<span class="pf-c-label pf-m-' + color +'">' + |
| 76 | + '<span class="pf-c-label__content">' + |
| 77 | + '<img src="/images/pattern-tier-' + tier + '.png" alt="' + capitalizeFirstLetter(tier) + '" width="16" height="16" class="custom-pattern-icon"/>' + |
| 78 | + capitalizeFirstLetter(tier) + |
| 79 | + '</span>' + |
| 80 | + '</span>'; |
| 81 | + return renderedLabel; |
| 82 | + } else { |
| 83 | + return ""; |
| 84 | + }; |
| 85 | +} |
| 86 | + |
| 87 | +function renderCard(pattern) { |
| 88 | + var renderCard = '<div class="pf-l-gallery__item" style="display: grid;">' + |
| 89 | + '<div class="pf-c-card" style="text-align: left; --pf-c-card__title--FontSize: 1rem; --pf-c-card__body--FontSize: 0.95rem;">' + |
| 90 | + '<div class="pf-c-card__title">' + |
| 91 | + '<a href="' + pattern.Link +'">' + |
| 92 | + pattern.Name + |
| 93 | + '</a>' + |
| 94 | + '</div>' + |
| 95 | + '<div class="pf-c-card__body">' + |
| 96 | + pattern.Params.summary + |
| 97 | + '</div>' + |
| 98 | + '<div class="pf-c-card__footer">' + |
| 99 | + renderLabel(pattern.Params.tier) + |
| 100 | + '</div>' + |
| 101 | + '</div>' + |
| 102 | + '</div>'; |
| 103 | + return renderCard; |
| 104 | +} |
| 105 | + |
| 106 | +function renderFilteredCards(patterns, filter_categories) { |
| 107 | + const element = document.getElementById("PatternCards"); |
| 108 | + element.innerHTML = ""; |
| 109 | + var filter = new Object(); |
| 110 | + var filteredPatterns = []; |
| 111 | + var sortValue = document.getElementById("select-pattern-sort"); |
| 112 | + for (const [category, terms] of Object.entries(filter_categories)) { |
| 113 | + for (item = 0; item < terms.length; item++) { |
| 114 | + var checkboxId = category + ":" + cleanString(terms[item].Name); |
| 115 | + var checkbox = document.getElementById(checkboxId); |
| 116 | + if (checkbox.checked) { |
| 117 | + if (filter[category] == undefined) { filter[category] = [] }; |
| 118 | + filter[category].push(terms[item].LinkTitle); |
| 119 | + }; |
| 120 | + }; |
| 121 | + }; |
| 122 | + for (item = 0; item < patterns.length; item++) { |
| 123 | + var checksPassed = new Object(); |
| 124 | + for (const [category, terms] of Object.entries(filter)) { |
| 125 | + if (typeof(patterns[item].Params[category]) == "string") { |
| 126 | + for (termId = 0; termId < terms.length; termId++) { |
| 127 | + if (terms[termId].toLowerCase() == patterns[item].Params[category].toLowerCase()) { |
| 128 | + checksPassed[category] = true; |
| 129 | + } |
| 130 | + } |
| 131 | + } else if (typeof(patterns[item].Params[category]) == "object" && patterns[item].Params[category] != null) { |
| 132 | + var patternTerms = patterns[item].Params[category].map(v => v.toLowerCase()); |
| 133 | + var filterTerms = terms.map(v => v.toLowerCase()); |
| 134 | + if(filterTerms.every(r => patternTerms.includes(r))) { |
| 135 | + checksPassed[category] = true; |
| 136 | + }; |
| 137 | + }; |
| 138 | + }; |
| 139 | + var patternPassed = true; |
| 140 | + for (const [category, terms] of Object.entries(filter)) { |
| 141 | + if (checksPassed[category] != true) { |
| 142 | + patternPassed = false; |
| 143 | + }; |
| 144 | + }; |
| 145 | + if (patternPassed == true) { filteredPatterns.push(patterns[item]); }; |
| 146 | + }; |
| 147 | + if (sortValue.value == "atoz") { |
| 148 | + filteredPatterns.sort(sortAtoZ); |
| 149 | + } else if (sortValue.value == "ztoa") { |
| 150 | + filteredPatterns.sort(sortAtoZ); |
| 151 | + filteredPatterns.reverse(); |
| 152 | + } else if (sortValue.value == "oldest") { |
| 153 | + filteredPatterns.sort(sortDate); |
| 154 | + } else if (sortValue.value == "newest") { |
| 155 | + filteredPatterns.sort(sortDate); |
| 156 | + filteredPatterns.reverse(); |
| 157 | + }; |
| 158 | + for (item = 0; item < filteredPatterns.length; item++) { |
| 159 | + const element = document.getElementById("PatternCards"); |
| 160 | + element.innerHTML += renderCard(filteredPatterns[item]); |
| 161 | + }; |
| 162 | + var totalPatternsCount = patterns.length |
| 163 | + var filteredPatternsCount = filteredPatterns.length |
| 164 | + const counter = document.getElementById("pattern-counter"); |
| 165 | + counter.innerHTML = filteredPatternsCount + " of " + totalPatternsCount + " patterns displayed"; |
| 166 | +} |
| 167 | + |
| 168 | +function filterSelection(filter) { |
| 169 | + // Declaring variables |
| 170 | + const patternsData = getData() |
| 171 | + patternsData.then(output => { |
| 172 | + renderFilteredCards(output.patterns, output.filter_categories) |
| 173 | + }); |
| 174 | +} |
| 175 | + |
| 176 | +const patternsData = getData() |
| 177 | +patternsData.then(output => { |
| 178 | + renderFilter("TiersItems", "tier", output.filter_categories.tier); |
| 179 | + renderFilter("IndustriesItems", "industries", output.filter_categories.industries); |
| 180 | + renderFilter("RhProductsItems", "rh_products", output.filter_categories.rh_products); |
| 181 | + renderFilter("OtherProductsItems", "other_products", output.filter_categories.other_products); |
| 182 | + renderFilteredCards(output.patterns, output.filter_categories) |
| 183 | +}); |
0 commit comments