From d96fadd66c99766bf8fb6141443042c459c59f5b Mon Sep 17 00:00:00 2001 From: LeeBenShimon Date: Sun, 22 Dec 2024 16:09:14 +0200 Subject: [PATCH] functional completed --- css/main.css | 4 ++++ details.html | 1 + index.html | 23 ++++++++++++------ js/common.js | 11 +++++++++ js/details.js | 35 +++++++++++++++++++++++++++ js/script.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 js/common.js create mode 100644 js/details.js create mode 100644 js/script.js diff --git a/css/main.css b/css/main.css index f51ac8b..210e456 100644 --- a/css/main.css +++ b/css/main.css @@ -135,6 +135,10 @@ background-color: #f2f2f2; } +.filters .dropdown-body.show { + display: block ; +} + .filters .dropdown-body li:last-child { margin-bottom: 0; } diff --git a/details.html b/details.html index b584581..e893558 100644 --- a/details.html +++ b/details.html @@ -69,6 +69,7 @@

Where in the world?

+
diff --git a/index.html b/index.html index f4afbf5..74047ff 100644 --- a/index.html +++ b/index.html @@ -88,7 +88,21 @@

Where in the world?

- +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/js/common.js b/js/common.js new file mode 100644 index 0000000..a2538f5 --- /dev/null +++ b/js/common.js @@ -0,0 +1,11 @@ +document.addEventListener('DOMContentLoaded', function() { + const themeToggleButton = document.querySelector('.theme-toggle'); + themeToggleButton.addEventListener('click', () => { + document.body.classList.toggle('dark-mode'); + }); + + const scrollTopButton = document.querySelector('.scroll-top'); + scrollTopButton.addEventListener('click', () => { + window.scrollTo({top: 0, behavior: 'smooth'}); + }); +}); diff --git a/js/details.js b/js/details.js new file mode 100644 index 0000000..917aef1 --- /dev/null +++ b/js/details.js @@ -0,0 +1,35 @@ +document.addEventListener('DOMContentLoaded', function() { + const params = new URLSearchParams(window.location.search); + const countryName = decodeURIComponent(params.get('country')); + const loader = document.querySelector('.loader'); + + fetch('CountriesData.json') + .then(response => response.json()) + .then(countries => { + const country = countries.find(c => c.name === countryName); + if (!country) { + document.querySelector('.country-details').innerHTML = `

Country not found.

`; + loader.classList.add('close'); + return; + } + + document.querySelector('.country-details').innerHTML = ` +
+ Flag of ${country.name} +
+
+

${country.name}

+
    +
  • Population: ${country.population.toLocaleString()}
  • +
  • Region: ${country.region}
  • +
  • Capital: ${country.capital || 'N/A'}
  • +
+
+ `; + loader.classList.add('close'); + }) + .catch(error => { + console.error('Error loading the country details:', error); + loader.classList.add('close'); + }); +}); diff --git a/js/script.js b/js/script.js new file mode 100644 index 0000000..ae77442 --- /dev/null +++ b/js/script.js @@ -0,0 +1,66 @@ +document.addEventListener('DOMContentLoaded', function() { + const url = 'CountriesData.json'; + let countriesData = []; + + fetch(url) + .then(response => response.json()) + .then(countries => { + countriesData = countries; + displayCountries(countriesData); + }) + .catch(error => console.error('Error loading the countries data:', error)); + + function displayCountries(data) { + const countriesGrid = document.querySelector('.countries-grid'); + countriesGrid.innerHTML = ''; + + data.forEach(country => { + const countryElement = document.createElement('a'); + countryElement.href = `details.html?country=${encodeURIComponent(country.name)}`; + countryElement.className = 'country scale-effect'; + countryElement.innerHTML = ` +
+ Flag of ${country.name} +
+
+

${country.name}

+
    +
  • Population: ${country.population.toLocaleString()}
  • +
  • Region: ${country.region}
  • +
  • Capital: ${country.capital || 'N/A'}
  • +
+
+ `; + countriesGrid.appendChild(countryElement); + }); + } + + const searchInput = document.querySelector('.search-input'); + searchInput.addEventListener('input', function() { + const searchText = this.value.toLowerCase(); + const filteredCountries = countriesData.filter(country => country.name.toLowerCase().includes(searchText)); + displayCountries(filteredCountries); + }); + + const dropdownHeader = document.querySelector('.dropdown-header'); + dropdownHeader.addEventListener('click', function() { + const wrapper = document.querySelector('.dropdown-wrapper'); + wrapper.classList.toggle('open'); + }); + + document.querySelector('.dropdown-body').addEventListener('click', function(event) { + if (event.target.tagName.toLowerCase() === 'li') { + const region = event.target.getAttribute('data-region'); + const regionText = event.target.textContent; + dropdownHeader.querySelector('span').textContent = regionText; + document.querySelector('.dropdown-wrapper').classList.remove('open'); + + if (region === 'all') { + displayCountries(countriesData); + } else { + const filteredCountries = countriesData.filter(country => country.region.toLowerCase() === region); + displayCountries(filteredCountries); + } + } + }); +});