fix filtering and resetting issue

This commit is contained in:
chark1es 2025-02-13 03:53:56 -08:00
parent d6df93d0f6
commit 1d4803a0f6

View file

@ -217,7 +217,7 @@ declare global {
<div class="dropdown"> <div class="dropdown">
<label <label
tabindex="0" tabindex="0"
class="btn btn-sm m-1 w-[140px] justify-between" class="btn btn-sm m-1 w-[180px] justify-between"
> >
<span id="yearFilterLabel">All Years</span> <span id="yearFilterLabel">All Years</span>
<svg <svg
@ -255,6 +255,91 @@ declare global {
</div> </div>
</div> </div>
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Quarter</span>
</label>
<div class="dropdown">
<label
tabindex="0"
class="btn btn-sm m-1 w-[180px] justify-between"
>
<span id="quarterFilterLabel">All Quarters</span
>
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-4 w-4"
viewBox="0 0 20 20"
fill="currentColor"
>
<path
fill-rule="evenodd"
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
clip-rule="evenodd"></path>
</svg>
</label>
<div
tabindex="0"
id="quarterDropdownContent"
class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52"
>
<div class="form-control">
<label class="label cursor-pointer">
<span class="label-text"
>All Quarters</span
>
<input
type="checkbox"
class="checkbox"
value="all"
checked
/>
</label>
</div>
<div class="form-control">
<label class="label cursor-pointer">
<span class="label-text">Fall</span>
<input
type="checkbox"
class="checkbox"
value="fall"
/>
</label>
</div>
<div class="form-control">
<label class="label cursor-pointer">
<span class="label-text">Winter</span>
<input
type="checkbox"
class="checkbox"
value="winter"
/>
</label>
</div>
<div class="form-control">
<label class="label cursor-pointer">
<span class="label-text">Spring</span>
<input
type="checkbox"
class="checkbox"
value="spring"
/>
</label>
</div>
<div class="form-control">
<label class="label cursor-pointer">
<span class="label-text">Summer</span>
<input
type="checkbox"
class="checkbox"
value="summer"
/>
</label>
</div>
</div>
</div>
</div>
<div class="form-control"> <div class="form-control">
<label class="label"> <label class="label">
<span class="label-text font-medium">Published</span <span class="label-text font-medium">Published</span
@ -861,6 +946,7 @@ declare global {
let filterState = { let filterState = {
time: "all", time: "all",
year: ["all"], year: ["all"],
quarter: ["all"],
published: "all", published: "all",
hasFiles: "all", hasFiles: "all",
hasFood: "all", hasFood: "all",
@ -1064,6 +1150,36 @@ declare global {
if (!filterState.year.includes(eventYear)) return false; if (!filterState.year.includes(eventYear)) return false;
} }
// Quarter filter
if (!filterState.quarter.includes("all")) {
const eventDate = new Date(event.start_date);
const month = eventDate.getMonth();
let isInSelectedQuarter = false;
for (const quarter of filterState.quarter) {
let isInQuarter = false;
switch (quarter) {
case "fall":
isInQuarter = month >= 8 && month <= 11; // Sept-Dec
break;
case "winter":
isInQuarter = month >= 0 && month <= 2; // Jan-Mar
break;
case "spring":
isInQuarter = month >= 2 && month <= 5; // Mar-Jun
break;
case "summer":
isInQuarter = month >= 5 && month <= 8; // Jun-Sept
break;
}
if (isInQuarter) {
isInSelectedQuarter = true;
break;
}
}
if (!isInSelectedQuarter) return false;
}
// Published filter // Published filter
if (filterState.published !== "all") { if (filterState.published !== "all") {
if ((filterState.published === "yes") !== event.published) if ((filterState.published === "yes") !== event.published)
@ -1391,7 +1507,7 @@ declare global {
document.querySelectorAll('input[type="checkbox"]:checked') document.querySelectorAll('input[type="checkbox"]:checked')
).map((inp) => (inp as HTMLInputElement).value); ).map((inp) => (inp as HTMLInputElement).value);
if (checkedYears.length === 0) { if (checkedYears.length === 0 || checkedYears.includes("all")) {
document.getElementById("yearFilterLabel")!.textContent = document.getElementById("yearFilterLabel")!.textContent =
"All Years"; "All Years";
filterState.year = ["all"]; filterState.year = ["all"];
@ -1406,6 +1522,58 @@ declare global {
fetchEvents(); fetchEvents();
}); });
// Quarter filter
document
.getElementById("quarterDropdownContent")
?.addEventListener("change", (e) => {
const target = e.target as HTMLInputElement;
if (!target.matches('input[type="checkbox"]')) return;
const allQuartersCheckbox = target
.closest("#quarterDropdownContent")
?.querySelector(
'input[type="checkbox"][value="all"]'
) as HTMLInputElement;
const quarterInputs = Array.from(
target
.closest("#quarterDropdownContent")
?.querySelectorAll('input[type="checkbox"]') || []
).filter(
(inp) => (inp as HTMLInputElement).value !== "all"
) as HTMLInputElement[];
if (target.value === "all" && target.checked) {
quarterInputs.forEach((input) => {
input.checked = false;
});
filterState.quarter = ["all"];
document.getElementById("quarterFilterLabel")!.textContent =
"All Quarters";
} else {
const checkedQuarters = quarterInputs
.filter((inp) => inp.checked)
.map((inp) => inp.value);
if (checkedQuarters.length === 0) {
allQuartersCheckbox.checked = true;
filterState.quarter = ["all"];
document.getElementById("quarterFilterLabel")!.textContent =
"All Quarters";
} else {
allQuartersCheckbox.checked = false;
filterState.quarter = checkedQuarters;
document.getElementById("quarterFilterLabel")!.textContent =
checkedQuarters.length === 1
? checkedQuarters[0].charAt(0).toUpperCase() +
checkedQuarters[0].slice(1)
: `${checkedQuarters.length} Quarters Selected`;
}
}
currentPage = 1;
fetchEvents();
});
// Published filter // Published filter
document document
.querySelectorAll('input[name="publishedFilter"]') .querySelectorAll('input[name="publishedFilter"]')
@ -1496,21 +1664,40 @@ declare global {
filterState.time = "all"; filterState.time = "all";
} }
const yearFilter = document.getElementById( // Reset year filter
"yearCheckboxes" const yearAllCheckbox = document.querySelector(
) as HTMLDivElement; 'input[type="checkbox"][value="all"]'
if (yearFilter) { ) as HTMLInputElement;
const yearInputs = yearFilter.querySelectorAll( const yearCheckboxes = document.querySelectorAll(
'input[type="checkbox"]' '#yearCheckboxes input[type="checkbox"]'
); );
yearInputs.forEach((input: HTMLInputElement) => { if (yearAllCheckbox && yearCheckboxes) {
input.checked = true; yearAllCheckbox.checked = true;
yearCheckboxes.forEach((checkbox: Element) => {
(checkbox as HTMLInputElement).checked = false;
}); });
filterState.year = ["all"]; filterState.year = ["all"];
document.getElementById("yearFilterLabel")!.textContent = document.getElementById("yearFilterLabel")!.textContent =
"All Years"; "All Years";
} }
// Reset quarter filter
const quarterAllCheckbox = document.querySelector(
'#quarterDropdownContent input[type="checkbox"][value="all"]'
) as HTMLInputElement;
const quarterCheckboxes = document.querySelectorAll(
'#quarterDropdownContent input[type="checkbox"]:not([value="all"])'
);
if (quarterAllCheckbox && quarterCheckboxes) {
quarterAllCheckbox.checked = true;
quarterCheckboxes.forEach((checkbox: Element) => {
(checkbox as HTMLInputElement).checked = false;
});
filterState.quarter = ["all"];
document.getElementById("quarterFilterLabel")!.textContent =
"All Quarters";
}
const publishedFilter = document.getElementById( const publishedFilter = document.getElementById(
"publishedFilter" "publishedFilter"
) as HTMLSelectElement; ) as HTMLSelectElement;
@ -1545,6 +1732,7 @@ declare global {
filterState = { filterState = {
time: "all", time: "all",
year: ["all"], year: ["all"],
quarter: ["all"],
published: "all", published: "all",
hasFiles: "all", hasFiles: "all",
hasFood: "all", hasFood: "all",