add filter by license

This commit is contained in:
Trent Palmer 2021-08-17 17:23:51 -07:00
parent d40b8c218a
commit 44b725f117
11 changed files with 258 additions and 269 deletions

View File

@ -19,6 +19,7 @@
<button type="button" id="button-for-showing-columns">Show Columns</button> <button type="button" id="button-for-showing-columns">Show Columns</button>
<button type="button" id="button-for-filter-by-tags">Filter By Tags</button> <button type="button" id="button-for-filter-by-tags">Filter By Tags</button>
<button type="button" id="button-for-filter-by-features">Filter By Features</button> <button type="button" id="button-for-filter-by-features">Filter By Features</button>
<button type="button" id="button-for-filter-by-license">Filter By License</button>
<button type="button" id="button-for-filter-by-tags-and-features">Filter By Tags &amp; Features</button> <button type="button" id="button-for-filter-by-tags-and-features">Filter By Tags &amp; Features</button>
</div> </div>
<div id="selection-menu" style="margin-bottom: 1rem;"> <div id="selection-menu" style="margin-bottom: 1rem;">
@ -31,8 +32,8 @@ var themes = {{ themes }};
{% include 'js/buildSelectionInputs.js' %} {% include 'js/buildSelectionInputs.js' %}
{% include 'js/getAvailableTagsAndFeatures.js' %} {% include 'js/getAvailableTagsAndFeatures.js' %}
{% include 'js/buildSortByDiv.js' %} {% include 'js/buildSortByDiv.js' %}
{% include 'js/buildTagAndFeatureSelectionHeadingRows.js' %} {% include 'js/buildSelectionHeadingRows.js' %}
{% include 'js/buildTagAndFeatureSelectionDivs.js' %} {% include 'js/buildSelectionDivs.js' %}
{% include 'js/buildSelectionMenu.js' %} {% include 'js/buildSelectionMenu.js' %}
{% include 'js/buildThemeTableRow.js' %} {% include 'js/buildThemeTableRow.js' %}
{% include 'js/getSortedThemes.js' %} {% include 'js/getSortedThemes.js' %}

View File

@ -10,10 +10,12 @@ function getSortBy() {
} }
} }
function getSelectedTags() { function getSelected(filterCategory) {
let tagSelectionInputs = document.getElementsByClassName("tagSelectionInput"); let selectionInputs = document.getElementsByClassName(
if (tagSelectionInputs.length > 0) { `${filterCategory}SelectionInput`
return [...tagSelectionInputs].filter((x) => x.checked).map((y) => y.value); );
if (selectionInputs.length > 0) {
return [...selectionInputs].filter((x) => x.checked).map((y) => y.value);
} else { } else {
return []; return [];
} }
@ -35,20 +37,7 @@ function getSelectedColumns() {
} }
} }
function getSelectedFeatures() { function getTagAndFeatureFilteredThemes(selectedTags, selectedFeatures) {
let featureSelectionInputs = document.getElementsByClassName(
"featureSelectionInput"
);
if (featureSelectionInputs.length > 0) {
return [...featureSelectionInputs]
.filter((x) => x.checked)
.map((y) => y.value);
} else {
return [];
}
}
function getFilteredThemes(selectedTags, selectedFeatures) {
if (selectedTags.length === 0 && selectedFeatures.length === 0) { if (selectedTags.length === 0 && selectedFeatures.length === 0) {
return themes; return themes;
} else { } else {
@ -58,6 +47,16 @@ function getFilteredThemes(selectedTags, selectedFeatures) {
} }
} }
function getFilteredThemes(tagAndFeatureFilteredThemes, selectedLicenses) {
if (selectedLicenses.length === 0) {
return tagAndFeatureFilteredThemes;
} else {
return tagAndFeatureFilteredThemes.filter((x) =>
selectedLicenses.includes(x.license)
);
}
}
function getDState(x) { function getDState(x) {
let e = document.getElementById(x); let e = document.getElementById(x);
return e !== null ? e.style.display : "none"; return e !== null ? e.style.display : "none";
@ -69,6 +68,8 @@ function getDiplayState() {
"sortByRow", "sortByRow",
"columnSelectionHeadingRow", "columnSelectionHeadingRow",
"columnSelectionRow", "columnSelectionRow",
"licenseSelectionHeadingRow",
"licenseSelectionRow",
"tagSelectionHeadingRow", "tagSelectionHeadingRow",
"tagSelectionRow", "tagSelectionRow",
"featureSelectionHeadingRow", "featureSelectionHeadingRow",
@ -110,22 +111,31 @@ function buildResults() {
resultsTableHeadRow.appendChild(xTH); resultsTableHeadRow.appendChild(xTH);
}); });
let selectedTags = getSelectedTags(); let selectedTags = getSelected("tag");
let selectedFeatures = getSelectedFeatures(); let selectedFeatures = getSelected("feature");
let selectedLicenses = getSelected("license");
let sortedBy = getSortBy(); let sortedBy = getSortBy();
// let filtered_themes = getFilteredThemes(selectedTags, selectedFeatures); let tagAndFeatureFilteredThemes = getTagAndFeatureFilteredThemes(
let sorted_themes = getFilteredThemes(selectedTags, selectedFeatures); selectedTags,
sortThemes(sorted_themes, sortedBy); selectedFeatures
sorted_themes.forEach((theme) => addThemeTableRow(theme, selectedColumns)); );
let filtered_themes = getFilteredThemes(
tagAndFeatureFilteredThemes,
selectedLicenses
);
sortThemes(filtered_themes, sortedBy);
filtered_themes.forEach((theme) => addThemeTableRow(theme, selectedColumns));
// from buildSelectionMenu.js // from buildSelectionMenu.js
buildSelectionMenu( buildSelectionMenu(
(sorted_themes = sorted_themes), tagAndFeatureFilteredThemes,
(sortBy = sortedBy), filtered_themes,
(selectedTags = selectedTags), sortedBy,
(selectedFeatures = selectedFeatures), selectedTags,
(selectedColumns = selectedColumns), selectedFeatures,
(dState = getDiplayState()) selectedLicenses,
selectedColumns,
getDiplayState()
); );
} }

View File

@ -0,0 +1,40 @@
// called from buildSelectionMenu.js
function buildSelectionDiv(
selectedItems,
availableItems,
sortBy,
dStateSelectionRow,
dStateSelectionHeadingRow,
eParent,
menuSection
) {
// from buildSelectionHeadingRows.js
buildSelectionHeadingRow(
eParent,
sortBy,
dStateSelectionHeadingRow,
menuSection
);
let selectionRow = document.createElement("div");
selectionRow.id = `${menuSection}SelectionRow`;
selectionRow.style.display = dStateSelectionRow;
selectionRow.style.flexWrap = "wrap";
selectionRow.style.justifyContent = "space-around";
eParent.appendChild(selectionRow);
availableItems
.filter((x) => selectedItems.includes(x[menuSection]))
.forEach((y) => {
// from buildSelectionInputs.js
buildInput(y, true, selectionRow);
});
availableItems
.filter((x) => !selectedItems.includes(x[menuSection]))
.forEach((y) => {
// from buildSelectionInputs.js
buildInput(y, false, selectionRow);
});
}

View File

@ -0,0 +1,58 @@
// called from buildTagAndFeatureSelectionDivs.js
function buildSelectionHeadingRow(
eParent,
sortBy,
dStateSelectionHeadingRow,
menuSection
) {
let selectionHeadingRow = document.createElement("div");
selectionHeadingRow.id = `${menuSection}SelectionHeadingRow`;
selectionHeadingRow.style.maxWidth = "100%";
selectionHeadingRow.style.display = dStateSelectionHeadingRow;
selectionHeadingRow.style.justifyContent = "space-around";
selectionHeadingRow.style.alignItems = "center";
let selectionHeading = document.createElement("h2");
selectionHeading.innerHTML = `Select ${menuSection}s`;
let sortByNameInputButton = buildRadioButton(
`${menuSection}SortByName`,
`${menuSection}SortBy`,
`${menuSection}SortByName`,
sortBy,
"name",
"Name"
);
let sortByNumThemesInputButton = buildRadioButton(
`${menuSection}SortByNumThemes`,
`${menuSection}SortBy`,
`${menuSection}SortByNumThemes`,
sortBy,
"numThemes",
"nThemes"
);
selectionHeadingRow.appendChild(selectionHeading);
selectionHeadingRow.appendChild(sortByNameInputButton);
selectionHeadingRow.appendChild(sortByNumThemesInputButton);
eParent.appendChild(selectionHeadingRow);
let sortByNameInput = document.getElementById(`${menuSection}SortByName`);
sortByNameInputButton.onclick = function () {
if (!sortByNameInput.checked) {
sortByNameInput.checked = true;
buildResults();
}
};
let sortByNumThemesInput = document.getElementById(
`${menuSection}SortByNumThemes`
);
sortByNumThemesInputButton.onclick = function () {
if (!sortByNumThemesInput.checked) {
sortByNumThemesInput.checked = true;
buildResults();
}
};
}

View File

@ -33,6 +33,11 @@ function buildInput(item, selected, inpParent) {
inputSelectionButton.style.width = "12rem"; inputSelectionButton.style.width = "12rem";
selectionInputLabel.innerHTML = `${item.tag} (${item.num_themes})`; selectionInputLabel.innerHTML = `${item.tag} (${item.num_themes})`;
selectionInput.classList.add("tagSelectionInput"); selectionInput.classList.add("tagSelectionInput");
} else if ("license" in item) {
selectionInput.value = item.license;
inputSelectionButton.style.width = "15rem";
selectionInputLabel.innerHTML = `${item.license} (${item.num_themes})`;
selectionInput.classList.add("licenseSelectionInput");
} else if ("headingName" in item) { } else if ("headingName" in item) {
selectionInput.value = `${item.headingName}-column`; selectionInput.value = `${item.headingName}-column`;
selectionInputLabel.innerHTML = item.headingText; selectionInputLabel.innerHTML = item.headingText;

View File

@ -1,20 +1,11 @@
function getTagSortBy() { function getMenuSortBy(sortBySelector) {
let tagSortByNumThemes = document.getElementById("tagSortByNumThemes"); let sortByNumThemes = document.getElementById(
if (tagSortByNumThemes === null) { `${sortBySelector}SortByNumThemes`
return "numThemes";
} else {
return tagSortByNumThemes.checked ? "numThemes" : "name";
}
}
function getFeatureSortBy() {
let featureSortByNumThemes = document.getElementById(
"featureSortByNumThemes"
); );
if (featureSortByNumThemes === null) { if (sortByNumThemes === null) {
return "numThemes"; return "numThemes";
} else { } else {
return featureSortByNumThemes.checked ? "numThemes" : "name"; return sortByNumThemes.checked ? "numThemes" : "name";
} }
} }
@ -56,46 +47,65 @@ function buildColumnSelectionDiv(selectedColumns, dState, eParent) {
// called from buildPage.js // called from buildPage.js
function buildSelectionMenu( function buildSelectionMenu(
tagAndFeatureFilteredThemes,
sorted_themes, sorted_themes,
sortBy, sortBy,
selectedTags, selectedTags,
selectedFeatures, selectedFeatures,
selectedLicenses,
selectedColumns, selectedColumns,
dState dState
) { ) {
let tagSortBy = getTagSortBy(); let tagSortBy = getMenuSortBy("tag");
let featureSortBy = getFeatureSortBy(); let featureSortBy = getMenuSortBy("feature");
let licenseSortBy = getMenuSortBy("license");
let selectionMenuDiv = document.getElementById("selection-menu"); let selectionMenuDiv = document.getElementById("selection-menu");
// from getAvailableTagsAndFeatures.js // from getAvailableTagsAndFeatures.js
let availableTags = getAvailableTags(sorted_themes, tagSortBy); let availableTags = getAvailableTags(sorted_themes, tagSortBy);
// from getAvailableTagsAndFeatures.js // from getAvailableTagsAndFeatures.js
let availableFeatures = getAvailableFeatures(sorted_themes, featureSortBy); let availableFeatures = getAvailableFeatures(sorted_themes, featureSortBy);
// from getAvailableTagsAndFeatures.js
let availableLicences = getAvailableLicenses(
tagAndFeatureFilteredThemes,
licenseSortBy
);
// from buildSortByDiv.js // from buildSortByDiv.js
buildSortByDiv((sortedBy = sortBy), (sortByRowDisplay = dState.sortByRow)); buildSortByDiv(sortBy, dState.sortByRow);
buildColumnSelectionDiv( buildColumnSelectionDiv(selectedColumns, dState, selectionMenuDiv);
(selectedColumns = selectedColumns),
(dState = dState), // from buildSelectionDivs.js
(eParent = selectionMenuDiv) buildSelectionDiv(
selectedLicenses,
availableLicences,
licenseSortBy,
dState.licenseSelectionRow,
dState.licenseSelectionHeadingRow,
selectionMenuDiv,
"license"
); );
// from buildTagAndFeatureSelectionDivs.js // from buildSelectionDivs.js
buildTagSelectionDiv( buildSelectionDiv(
(selectedTags = selectedTags), selectedTags,
(availableTags = availableTags), availableTags,
(tagSortBy = tagSortBy), tagSortBy,
(dState = dState), dState.tagSelectionRow,
(eParent = selectionMenuDiv) dState.tagSelectionHeadingRow,
selectionMenuDiv,
"tag"
); );
// from buildTagAndFeatureSelectionDivs.js // from buildSelectionDivs.js
buildFeatureSelectionDiv( buildSelectionDiv(
(selectedFeatures = selectedFeatures), selectedFeatures,
(availableFeatures = availableFeatures), availableFeatures,
(featureSortBy = featureSortBy), featureSortBy,
(dState = dState), dState.featureSelectionRow,
(eParent = selectionMenuDiv) dState.featureSelectionHeadingRow,
selectionMenuDiv,
"feature"
); );
} }

View File

@ -21,52 +21,52 @@ function buildSortByDiv(sortBy, sortByRowDisplay) {
// from buildButton.js // from buildButton.js
let sortByStarsButton = buildRadioButton( let sortByStarsButton = buildRadioButton(
(inputID = "sortByStars"), "sortByStars",
(inputName = "sortBy"), "sortBy",
(inputValue = "stars"), "stars",
(sortedBy = sortBy[0]), sortBy[0],
(sortedBySelector = "stars"), "stars",
(labelText = "Stars") "Stars"
); );
// from buildButton.js // from buildButton.js
let sortByLastCommitButton = buildRadioButton( let sortByLastCommitButton = buildRadioButton(
(inputID = "sortByDate"), "sortByDate",
(inputName = "sortBy"), "sortBy",
(inputValue = "date"), "date",
(sortedBy = sortBy[0]), sortBy[0],
(sortedBySelector = "date"), "date",
(labelText = "Latest Commit Date") "Latest Commit Date"
); );
// from buildButton.js // from buildButton.js
let sortByMinVerButton = buildRadioButton( let sortByMinVerButton = buildRadioButton(
(inputID = "sortByMinVer"), "sortByMinVer",
(inputName = "sortBy"), "sortBy",
(inputValue = "minVer"), "minVer",
(sortedBy = sortBy[0]), sortBy[0],
(sortedBySelector = "minVer"), "minVer",
(labelText = "Min Hugo Version") "Min Hugo Version"
); );
// from buildButton.js // from buildButton.js
let sortByLicenseButton = buildRadioButton( let sortByLicenseButton = buildRadioButton(
(inputID = "sortByLicense"), "sortByLicense",
(inputName = "sortBy"), "sortBy",
(inputValue = "license"), "license",
(sortedBy = sortBy[0]), sortBy[0],
(sortedBySelector = "license"), "license",
(labelText = "License") "License"
); );
// from buildButton.js // from buildButton.js
let sortByNameButton = buildRadioButton( let sortByNameButton = buildRadioButton(
(inputID = "sortByName"), "sortByName",
(inputName = "sortBy"), "sortBy",
(inputValue = "name"), "name",
(sortedBy = sortBy[0]), sortBy[0],
(sortedBySelector = "name"), "name",
(labelText = "Name") "Name"
); );
sortBy.forEach((x) => { sortBy.forEach((x) => {

View File

@ -1,67 +0,0 @@
// called from buildSelectionMenu.js
function buildTagSelectionDiv(
selectedTags,
availableTags,
tagSortBy,
dState,
eParent
) {
// from buildTagAndFeatureSelectionHeadingRows.js
buildTagSelectionHeadingRow(eParent, tagSortBy, dState);
let tagSelectionRow = document.createElement("div");
tagSelectionRow.id = "tagSelectionRow";
tagSelectionRow.style.display = dState.tagSelectionRow;
tagSelectionRow.style.flexWrap = "wrap";
tagSelectionRow.style.justifyContent = "space-around";
eParent.appendChild(tagSelectionRow);
availableTags
.filter((x) => selectedTags.includes(x.tag))
.forEach((y) => {
// from buildSelectionInputs.js
buildInput(y, true, tagSelectionRow);
});
availableTags
.filter((x) => !selectedTags.includes(x.tag))
.forEach((y) => {
// from buildSelectionInputs.js
buildInput(y, false, tagSelectionRow);
});
}
// called from buildSelectionMenu.js
function buildFeatureSelectionDiv(
selectedFeatures,
availableFeatures,
featureSortBy,
dState,
eParent
) {
// from buildTagAndFeatureSelectionHeadingRows.js
buildFeatureSelectionHeadingRow(eParent, featureSortBy, dState);
let featureSelectionRow = document.createElement("div");
featureSelectionRow.id = "featureSelectionRow";
featureSelectionRow.style.display = dState.featureSelectionRow;
featureSelectionRow.style.flexWrap = "wrap";
featureSelectionRow.style.justifyContent = "space-around";
eParent.appendChild(featureSelectionRow);
availableFeatures
.filter((x) => selectedFeatures.includes(x.feature))
.forEach((y) => {
// from buildSelectionInputs.js
buildInput(y, true, featureSelectionRow);
});
availableFeatures
.filter((x) => !selectedFeatures.includes(x.feature))
.forEach((y) => {
// from buildSelectionInputs.js
buildInput(y, false, featureSelectionRow);
});
}

View File

@ -1,105 +0,0 @@
// called from buildTagAndFeatureSelectionDivs.js
function buildTagSelectionHeadingRow(eParent, tagSortBy, dState) {
let tagSelectionHeadingRow = document.createElement("div");
tagSelectionHeadingRow.id = "tagSelectionHeadingRow";
tagSelectionHeadingRow.style.maxWidth = "100%";
tagSelectionHeadingRow.style.display = dState.tagSelectionHeadingRow;
tagSelectionHeadingRow.style.justifyContent = "space-around";
tagSelectionHeadingRow.style.alignItems = "center";
let tagSelectionHeading = document.createElement("h2");
tagSelectionHeading.innerHTML = "Select Tags";
let tagSortByNameInputButton = buildRadioButton(
(inputID = "tagSortByName"),
(inputName = "tagSortBy"),
(inputValue = "tagSortByName"),
(sortedBy = tagSortBy),
(sortedBySelector = "name"),
(labelText = "Name")
);
let tagSortByNumThemesInputButton = buildRadioButton(
(inputID = "tagSortByNumThemes"),
(inputName = "tagSortBy"),
(inputValue = "tagSortByNumThemes"),
(sortedBy = tagSortBy),
(sortedBySelector = "numThemes"),
(labelText = "nThemes")
);
tagSelectionHeadingRow.appendChild(tagSelectionHeading);
tagSelectionHeadingRow.appendChild(tagSortByNameInputButton);
tagSelectionHeadingRow.appendChild(tagSortByNumThemesInputButton);
eParent.appendChild(tagSelectionHeadingRow);
let tagSortByNameInput = document.getElementById("tagSortByName");
tagSortByNameInputButton.onclick = function () {
if (!tagSortByNameInput.checked) {
tagSortByNameInput.checked = true;
buildResults();
}
};
let tagSortByNumThemesInput = document.getElementById("tagSortByNumThemes");
tagSortByNumThemesInputButton.onclick = function () {
if (!tagSortByNumThemesInput.checked) {
tagSortByNumThemesInput.checked = true;
buildResults();
}
};
}
// called from buildTagAndFeatureSelectionDivs.js
function buildFeatureSelectionHeadingRow(eParent, featureSortBy, dState) {
let featureSelectionHeadingRow = document.createElement("div");
featureSelectionHeadingRow.id = "featureSelectionHeadingRow";
featureSelectionHeadingRow.style.maxWidth = "100%";
featureSelectionHeadingRow.style.display = dState.featureSelectionHeadingRow;
featureSelectionHeadingRow.style.justifyContent = "space-around";
featureSelectionHeadingRow.style.alignItems = "center";
let featureSelectionHeading = document.createElement("h2");
featureSelectionHeading.innerHTML = "Select Features";
let featureSortByNameInputButton = buildRadioButton(
(inputID = "featureSortByName"),
(inputName = "featureSortBy"),
(inputValue = "featureSortByName"),
(sortedBy = featureSortBy),
(sortedBySelector = "name"),
(labelText = "Name")
);
let featureSortByNumThemesInputButton = buildRadioButton(
(inputID = "featureSortByNumThemes"),
(inputName = "featureSortBy"),
(inputValue = "featureSortByNumThemes"),
(sortedBy = featureSortBy),
(sortedBySelector = "numThemes"),
(labelText = "nThemes")
);
featureSelectionHeadingRow.appendChild(featureSelectionHeading);
featureSelectionHeadingRow.appendChild(featureSortByNameInputButton);
featureSelectionHeadingRow.appendChild(featureSortByNumThemesInputButton);
eParent.appendChild(featureSelectionHeadingRow);
let featureSortByNameInput = document.getElementById("featureSortByName");
featureSortByNameInputButton.onclick = function () {
if (!featureSortByNameInput.checked) {
featureSortByNameInput.checked = true;
buildResults();
}
};
let featureSortByNumThemesInput = document.getElementById(
"featureSortByNumThemes"
);
featureSortByNumThemesInputButton.onclick = function () {
if (!featureSortByNumThemesInput.checked) {
featureSortByNumThemesInput.checked = true;
buildResults();
}
};
}

View File

@ -28,6 +28,32 @@ function getAvailableFeatures(sorted_themes, featureSortBy) {
} }
} }
// called from buildSelectionMenu.js
function getAvailableLicenses(tagAndFeatureFilteredThemes, licenseSortBy) {
let availableLicences = [];
tagAndFeatureFilteredThemes.forEach((x) => {
if (!availableLicences.includes(x.license)) {
availableLicences.push(x.license);
}
});
let availableLicencesMap = availableLicences.map((x) => {
return {
license: x,
num_themes: tagAndFeatureFilteredThemes.filter((y) => y.license === x)
.length,
};
});
if (licenseSortBy === "numThemes") {
return availableLicencesMap
.sort((a, b) => a.license.localeCompare(b.license))
.sort((a, b) => b.num_themes - a.num_themes);
} else {
return availableLicencesMap.sort((a, b) =>
a.license.localeCompare(b.license)
);
}
}
// called from buildSelectionMenu.js // called from buildSelectionMenu.js
function getAvailableTags(sorted_themes, tagSortBy) { function getAvailableTags(sorted_themes, tagSortBy) {
let result = []; let result = [];

View File

@ -4,12 +4,15 @@ function showSelectionOptionsButtons() {
"button-for-showing-columns", "button-for-showing-columns",
"button-for-filter-by-tags", "button-for-filter-by-tags",
"button-for-filter-by-features", "button-for-filter-by-features",
"button-for-filter-by-license",
"button-for-filter-by-tags-and-features", "button-for-filter-by-tags-and-features",
].forEach((x) => (document.getElementById(x).style.display = "inline-block")); ].forEach((x) => (document.getElementById(x).style.display = "inline-block"));
} }
let closeableMenus = [ let closeableMenus = [
"sortByRow", "sortByRow",
"licenseSelectionHeadingRow",
"licenseSelectionRow",
"columnSelectionHeadingRow", "columnSelectionHeadingRow",
"columnSelectionRow", "columnSelectionRow",
"tagSelectionHeadingRow", "tagSelectionHeadingRow",
@ -85,6 +88,14 @@ document.getElementById("button-for-filter-by-features").onclick = function () {
document.getElementById("featureSelectionRow").style.display = "flex"; document.getElementById("featureSelectionRow").style.display = "flex";
}; };
document.getElementById("button-for-filter-by-license").onclick = function () {
closeMenus();
showSelectionOptionsButtons();
this.style.display = "none";
document.getElementById("licenseSelectionHeadingRow").style.display = "flex";
document.getElementById("licenseSelectionRow").style.display = "flex";
};
document.getElementById("button-for-filter-by-tags-and-features").onclick = document.getElementById("button-for-filter-by-tags-and-features").onclick =
function () { function () {
closeMenus(); closeMenus();