Implement sorting functionality for Pokémon by number and name in ascending and descending order

This commit is contained in:
vista-man
2025-03-26 09:50:39 +01:00
parent 4ad8093682
commit 0f15c3b74c
3 changed files with 63 additions and 23 deletions

View File

@@ -52,16 +52,39 @@
<div> <div>
<input <input
type="radio" type="radio"
id="number" id="number-asc"
name="filters" name="filters"
value="number" value="number-asc"
checked checked
/> />
<label for="number" class="body3-fonts">Number</label> <label for="number-asc" class="body3-fonts">Number (Lowest to Highest)</label>
</div> </div>
<div> <div>
<input type="radio" id="name" name="filters" value="name" /> <input
<label for="name" class="body3-fonts">Name</label> type="radio"
id="number-desc"
name="filters"
value="number-desc"
/>
<label for="number-desc" class="body3-fonts">Number (Highest to Lowest)</label>
</div>
<div>
<input
type="radio"
id="name-asc"
name="filters"
value="name-asc"
/>
<label for="name-asc" class="body3-fonts">Name (A-Z)</label>
</div>
<div>
<input
type="radio"
id="name-desc"
name="filters"
value="name-desc"
/>
<label for="name-desc" class="body3-fonts">Name (Z-A)</label>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -2,11 +2,14 @@ const MAX_POKEMON = 151;
const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours in milliseconds const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
const listWrapper = document.querySelector(".list-wrapper"); const listWrapper = document.querySelector(".list-wrapper");
const searchInput = document.querySelector("#search-input"); const searchInput = document.querySelector("#search-input");
const numberFilter = document.querySelector("#number"); const numberAscFilter = document.querySelector("#number-asc");
const nameFilter = document.querySelector("#name"); const numberDescFilter = document.querySelector("#number-desc");
const nameAscFilter = document.querySelector("#name-asc");
const nameDescFilter = document.querySelector("#name-desc");
const notFoundMessage = document.querySelector("#not-found-message"); const notFoundMessage = document.querySelector("#not-found-message");
let allPokemons = []; let allPokemons = [];
let filteredPokemons = [];
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const cachedData = localStorage.getItem("pokemons"); const cachedData = localStorage.getItem("pokemons");
@@ -15,7 +18,8 @@ document.addEventListener("DOMContentLoaded", () => {
if (cachedData && cacheTimestamp && (Date.now() - cacheTimestamp) < CACHE_DURATION) { if (cachedData && cacheTimestamp && (Date.now() - cacheTimestamp) < CACHE_DURATION) {
allPokemons = JSON.parse(cachedData); allPokemons = JSON.parse(cachedData);
console.log("Loaded Pokémon data from cache:", allPokemons); console.log("Loaded Pokémon data from cache:", allPokemons);
displayPokemons(allPokemons); filteredPokemons = allPokemons;
displayPokemons(filteredPokemons);
} else { } else {
fetchPokemons(); fetchPokemons();
} }
@@ -31,7 +35,8 @@ function fetchPokemons() {
localStorage.setItem("pokemons", JSON.stringify(allPokemons)); localStorage.setItem("pokemons", JSON.stringify(allPokemons));
localStorage.setItem("pokemons_timestamp", Date.now().toString()); localStorage.setItem("pokemons_timestamp", Date.now().toString());
console.log("Fetched and cached Pokémon data:", allPokemons); console.log("Fetched and cached Pokémon data:", allPokemons);
displayPokemons(allPokemons); filteredPokemons = allPokemons;
displayPokemons(filteredPokemons);
} else { } else {
console.error("Unexpected response format:", data); console.error("Unexpected response format:", data);
} }
@@ -146,24 +151,20 @@ function preloadHighResImage(img) {
} }
searchInput.addEventListener("keyup", handleSearch); searchInput.addEventListener("keyup", handleSearch);
numberAscFilter.addEventListener("change", handleSort);
numberDescFilter.addEventListener("change", handleSort);
nameAscFilter.addEventListener("change", handleSort);
nameDescFilter.addEventListener("change", handleSort);
function handleSearch() { function handleSearch() {
const searchTerm = searchInput.value.toLowerCase(); const searchTerm = searchInput.value.toLowerCase();
console.log("Handling search with term:", searchTerm); console.log("Handling search with term:", searchTerm);
let filteredPokemons;
if (numberFilter.checked) {
filteredPokemons = allPokemons.filter((pokemon) => { filteredPokemons = allPokemons.filter((pokemon) => {
const pokemonID = pokemon.id.toString(); const pokemonID = pokemon.id.toString();
return pokemonID.startsWith(searchTerm); const pokemonName = pokemon.name.toLowerCase();
return pokemonID.startsWith(searchTerm) || pokemonName.startsWith(searchTerm);
}); });
} else if (nameFilter.checked) {
filteredPokemons = allPokemons.filter((pokemon) =>
pokemon.name.toLowerCase().startsWith(searchTerm)
);
} else {
filteredPokemons = allPokemons;
}
displayPokemons(filteredPokemons); displayPokemons(filteredPokemons);
@@ -174,12 +175,27 @@ function handleSearch() {
} }
} }
function handleSort() {
if (numberAscFilter.checked) {
filteredPokemons.sort((a, b) => a.id - b.id);
} else if (numberDescFilter.checked) {
filteredPokemons.sort((a, b) => b.id - a.id);
} else if (nameAscFilter.checked) {
filteredPokemons.sort((a, b) => a.name.localeCompare(b.name));
} else if (nameDescFilter.checked) {
filteredPokemons.sort((a, b) => b.name.localeCompare(a.name));
}
displayPokemons(filteredPokemons);
}
const closeButton = document.querySelector(".search-close-icon"); const closeButton = document.querySelector(".search-close-icon");
closeButton.addEventListener("click", clearSearch); closeButton.addEventListener("click", clearSearch);
function clearSearch() { function clearSearch() {
console.log("Clearing search input and displaying all Pokémon..."); console.log("Clearing search input and displaying all Pokémon...");
searchInput.value = ""; searchInput.value = "";
displayPokemons(allPokemons); filteredPokemons = allPokemons;
displayPokemons(filteredPokemons);
notFoundMessage.style.display = "none"; notFoundMessage.style.display = "none";
} }

View File

@@ -27,6 +27,7 @@ function handleSearchCloseOnClick() {
document document
.querySelector("#search-close-icon") .querySelector("#search-close-icon")
.classList.remove("search-close-icon-visible"); .classList.remove("search-close-icon-visible");
clearSearch();
} }
function handleSortIconOnClick() { function handleSortIconOnClick() {