Tag: Undo |
m (rewrite dropdowns to be able to be created via parameters in Template:DropdownFilter) |
||
Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
/ | /* For filtering items with Template:DropdownFilter */ | ||
var | var elementsToFilter = {}; | ||
} | |||
$(document).ready(function() { | |||
createDropdownSelects(); | createDropdownSelects(); | ||
}); | }); | ||
function createDropdownSelects() { | function createDropdownSelects() { | ||
var selectionParameters = document.getElementById("selectionOptions"); | |||
var selectRowElement = document.getElementById("selectRow"); | var selectRowElement = document.getElementById("selectRow"); | ||
if (!selectRowElement) { | if (!selectRowElement || !selectionParameters) { | ||
return; | return; | ||
} | } | ||
selectRowElement.setAttribute("style", "padding: 6px;"); | selectRowElement.setAttribute("style", "padding: 6px;"); | ||
function createDropdownSelect( | var dropdownSelectionOptions = selectionParameters.innerHTML; | ||
createDropdownSelect(dropdownSelectionOptions); | |||
} | |||
function createDropdownSelect(optionList) { | |||
var i = 0; | var i = 0; | ||
var dropdown = JSON.parse(optionList); | var dropdown = JSON.parse(optionList); | ||
/* read options from the JSON */ | |||
var dropdownDiv = document.getElementById(dropdown.divID); | |||
elementsToFilter = document.getElementsByClassName(dropdown.applyToElementsWithThisClass); | |||
/* create the options to populate the dropdown with */ | |||
var html = "<select id=\"" + dropdown.name + "\" name=\"" + dropdown.name + "\" class=\"form-control\" onchange=\"filter('" + dropdown.name + "','" + dropdown.attribute + "'" + ")\">"; | var html = "<select id=\"" + dropdown.name + "\" name=\"" + dropdown.name + "\" class=\"form-control\" onchange=\"filter('" + dropdown.name + "','" + dropdown.attribute + "'" + ")\">"; | ||
Line 54: | Line 44: | ||
} | } | ||
/* populate the dropdown */ | |||
dropdownDiv.innerHTML += html; | dropdownDiv.innerHTML += html; | ||
} | } | ||
/ | /* | ||
* Called from the onChange() event of a select element. | |||
function filter(filterDiv, attribute) { | * Checks each row or element to see if its attribute contains at least one match with the selected value of the dropdown | ||
* Filters only one dropdown | |||
*/ | |||
function filter(filterDiv, attribute) { | |||
resetFiltersApplied(); | |||
// Go through all the | |||
var filterValue = document.getElementById(filterDiv).value; | |||
if (!filterValue) /* selected option is undefined, so do nothing (rather than hiding everything) */ return; | |||
// Go through all of the items to filter through | |||
for (var i = 0; i < elementsToFilter.length; i++) { | for (var i = 0; i < elementsToFilter.length; i++) { | ||
var data = elementsToFilter[i].getAttribute(attribute); | var data = elementsToFilter[i].getAttribute(attribute); | ||
Line 71: | Line 67: | ||
var showRow = false; | var showRow = false; | ||
for (var w in words) { | for (var w in words) { | ||
showRow = showRow || (words[w] == filterValue); | |||
// console.log(filterValue + " " + words[w] + " " + showRow); | // console.log(filterValue + " " + words[w] + " " + showRow); | ||
} | } | ||
Line 78: | Line 74: | ||
applyFilterAction(elementsToFilter[i], showRow); | applyFilterAction(elementsToFilter[i], showRow); | ||
} | } | ||
} | } | ||
// This method handlecs the CSS changes if | // This method handlecs the CSS changes if a div matches the filter | ||
function applyFilterAction(element, applyFilter) { | function applyFilterAction(element, applyFilter) { | ||
if (element.nodeName == "DIV") { | if (element.nodeName == "DIV") { | ||
if (!applyFilter) { | if (!applyFilter) { | ||
element.style.display = "none"; | |||
} else { | } else { | ||
element.style.display = "inline-block"; | element.style.display = "inline-block"; | ||
} | } | ||
} | } | ||
} | } | ||
// Reset any filters applied to elements. | // Reset any filters applied to elements. | ||
function resetFiltersApplied() { | function resetFiltersApplied() { | ||
for (var i = 0; i < elementsToFilter.length; i++) { | for (var i = 0; i < elementsToFilter.length; i++) { | ||
if (elementsToFilter[i].nodeName == "DIV") { | |||
elementsToFilter[i].style.display = "inline-block"; | |||
} | |||
} | } | ||
} | } |
Revision as of 22:55, 17 October 2018
/* Any JavaScript here will be loaded for all users on every page load. */
/* For filtering items with Template:DropdownFilter */
var elementsToFilter = {};
$(document).ready(function() {
createDropdownSelects();
});
function createDropdownSelects() {
var selectionParameters = document.getElementById("selectionOptions");
var selectRowElement = document.getElementById("selectRow");
if (!selectRowElement || !selectionParameters) {
return;
}
selectRowElement.setAttribute("style", "padding: 6px;");
var dropdownSelectionOptions = selectionParameters.innerHTML;
createDropdownSelect(dropdownSelectionOptions);
}
function createDropdownSelect(optionList) {
var i = 0;
var dropdown = JSON.parse(optionList);
/* read options from the JSON */
var dropdownDiv = document.getElementById(dropdown.divID);
elementsToFilter = document.getElementsByClassName(dropdown.applyToElementsWithThisClass);
/* create the options to populate the dropdown with */
var html = "<select id=\"" + dropdown.name + "\" name=\"" + dropdown.name + "\" class=\"form-control\" onchange=\"filter('" + dropdown.name + "','" + dropdown.attribute + "'" + ")\">";
for (i; i < dropdown.options.length; i++) {
html += "<option ";
if (i === 0) {
html += "selected=\"selected\"";
}
if (dropdown.options[i][1] !== "") {
html += "disabled=\"" + dropdown.options[i][1] + "\"";
}
html += "value=\"" + dropdown.options[i][0] + "\">"
+ dropdown.options[i][0] + "</option>";
}
/* populate the dropdown */
dropdownDiv.innerHTML += html;
}
/*
* Called from the onChange() event of a select element.
* Checks each row or element to see if its attribute contains at least one match with the selected value of the dropdown
* Filters only one dropdown
*/
function filter(filterDiv, attribute) {
resetFiltersApplied();
var filterValue = document.getElementById(filterDiv).value;
if (!filterValue) /* selected option is undefined, so do nothing (rather than hiding everything) */ return;
// Go through all of the items to filter through
for (var i = 0; i < elementsToFilter.length; i++) {
var data = elementsToFilter[i].getAttribute(attribute);
var words = data.split(' ');
var showRow = false;
for (var w in words) {
showRow = showRow || (words[w] == filterValue);
// console.log(filterValue + " " + words[w] + " " + showRow);
}
// Apply the filter
applyFilterAction(elementsToFilter[i], showRow);
}
}
// This method handlecs the CSS changes if a div matches the filter
function applyFilterAction(element, applyFilter) {
if (element.nodeName == "DIV") {
if (!applyFilter) {
element.style.display = "none";
} else {
element.style.display = "inline-block";
}
}
}
// Reset any filters applied to elements.
function resetFiltersApplied() {
for (var i = 0; i < elementsToFilter.length; i++) {
if (elementsToFilter[i].nodeName == "DIV") {
elementsToFilter[i].style.display = "inline-block";
}
}
}