/**
We want to change the grid repeat() depending on the items in a grid
where repeat(4, 1fr) are dynamic values we can change in JS using setProperty()
note: setProperty(property-name, value)
*/
// our html = we add a data-grid attribure to show the grid number
<div class="qld-compare_page__courses" data-grid></div>
// our css
.courses{
//repeat(4, 1fr); replace with 2 new css variables, and a fallback
// in this case var(--compare-col-count) has a fallback of 4
repeat(var(--compare-col-count, 4), var(--compare-col-width, 205px));
}
// JS function
// create the changeGrid function outside the main function below
function changeGrid(value){
parentGrid.style.setProperty("--compare-col-width", value);
}
function adjustGrid(number) { // number will the dynamic value that changes
// get the parent to which the grid willl be appplied
const parentGrid = document.querySelector(".qld-compare_page__courses");
// if element exists
if (parentGrid) {
// set the grid attribute in the html to the number value in the param
parentGrid.dataset.grid = `courses-${number}`;
// now we are using the set Property to get the var give it the number value
parentGrid.style.setProperty("--compare-col-count", number);
/**
switch (number) { // if numbers 1, 2, 3 or 4 is reached then do your thing!
case 1:
// here we are using setProperty() to target that css var, and apply value
parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 230px)");
break;
case 2:
// here we are using setProperty() to target that css var, and apply value
parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 249px)");
break;
case 3:
// here we are using setProperty() to target that css var, and apply value
parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 1fr)");
break;
case 4:
// here we are using setProperty() to target that css var, and apply value
parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 1fr)");
break;
default:
parentGrid.style.setProperty("--compare-col-width", "205px");
break;
}
}
*/
/**
1. create object with all options
2. create a function to call inside the object
3. The function returns the code want to repeat with params
4. Call that function using the object[dynamic] number
*/
// Note we are still using number from the main function as this is the value
// that will output 1, 2, 3, 4
const options = {
// use cases here for key value pairs
1: () => changeGrid("minmax(205px, 230px)"),
2: () => changeGrid("minmax(205px, 249px)"),
3: () => changeGrid("minmax(205px, 1fr)"),
4: () => changeGrid("minmax(205px, 1fr)"),
}
// call it
// param should be the dynamic value of the oject and the matching number param
changeGrid(options[number])
}
//use local storage for the number we want
adjustGrid(JSON.parse(localStorage.getItem("courses") || "[]").length);
// here is the full JS code with CSS variables
function cssColWidthVariable(value) {
const parentGrid = document.querySelector(".qld-compare_page__courses");
parentGrid.style.setProperty("--compare-col-width", value);
}
function adjustGrid(number) {
const parentGrid = document.querySelector(".qld-compare_page__courses");
if (parentGrid) {
parentGrid.dataset.grid = `courses-${number}`;
parentGrid.style.setProperty("--compare-col-count", number);
const gridOptions = {
1: () => cssColWidthVariable("minmax(205px, 230px)"),
2: () => cssColWidthVariable("minmax(205px, 249px)"),
3: () => cssColWidthVariable("minmax(205px, 1fr)"),
4: () => cssColWidthVariable("minmax(205px, 1fr)"),
};
cssColWidthVariable(gridOptions[number] || "205px");
}
}
// call the function based on a changing number
adjustGrid(JSON.parse(localStorage.getItem("courses") || "[]").length);