mirror of
https://github.com/Alvin-Zilverstand/pokedex.git
synced 2026-03-06 21:29:57 +01:00
Implement sorting functionality for Pokémon by number and name in ascending and descending order
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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();
|
const pokemonName = pokemon.name.toLowerCase();
|
||||||
return pokemonID.startsWith(searchTerm);
|
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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user