diff --git a/.env b/.env deleted file mode 100644 index e38ef75..0000000 --- a/.env +++ /dev/null @@ -1,5 +0,0 @@ -DB_NAME=metalytics -DB_USER=postgres -DB_PASSWORD=postgres -DB_HOST=localhost -DB_PORT=5432 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 55d3b6c..3715487 100644 --- a/.gitignore +++ b/.gitignore @@ -129,7 +129,7 @@ celerybeat.pid *.sage.py # Environments - +.env .venv env/ venv/ diff --git a/README.md b/README.md index c46fbc5..730c1b7 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ Follow the steps below to run the project locally using Docker or manually. ### ⚙️ Prerequisites - [Docker](https://www.docker.com/products/docker-desktop) installed and running +- [PostgreSQL](https://www.postgresql.org/) installed. - Python 3.10+ - (Optional) Live server if running without Docker @@ -71,6 +72,8 @@ In your terminal: ```bash git clone https://github.com/IU-Capstone-Project-2025/Metalytics.git cd Metalytics +echo "DB_USER=postgres" > .env +echo "DB_PASSWORD=postgres" >> .env ``` ### 💻 Step 2 — Run with Docker (Recommended) diff --git a/frontend/css/style.css b/frontend/css/style.css index 802adee..6711f08 100644 --- a/frontend/css/style.css +++ b/frontend/css/style.css @@ -286,11 +286,17 @@ span { .news__info { width: 94%; + height: 70%; text-align: center; font-size: 24px; line-height: 120%; letter-spacing: 1px; color: var(--white); + overflow-y: scroll; +} + +.news__info::-webkit-scrollbar { + display: none; } .news__date { @@ -305,6 +311,10 @@ span { right: -21px; } +.swiper-slide>div { + height: inherit; +} + /* Graph */ .graph { diff --git a/frontend/js/script.js b/frontend/js/script.js index 921cf7b..18ed471 100644 --- a/frontend/js/script.js +++ b/frontend/js/script.js @@ -82,16 +82,6 @@ document.addEventListener("DOMContentLoaded", () => { } } - function shortNumberFormat(num) { - if (selectedMetal === 'zinc') { - return num.toFixed(4); - } - - if (Math.abs(num) >= 1e6) return (num / 1e6).toFixed(1) + 'M'; - if (Math.abs(num) >= 1e3) return (num / 1e3).toFixed(1) + 'K'; - return num.toFixed(1); - } - function getYAxisOptions() { if (window.innerWidth <= 768) { return { @@ -104,9 +94,7 @@ document.addEventListener("DOMContentLoaded", () => { else { return { ticks: { - callback: function(value) { - return shortNumberFormat(value); - } + display: true } }; } @@ -327,11 +315,14 @@ document.addEventListener("DOMContentLoaded", () => { } } + // Initialize prediction button availability for gold (default metal) + setPredictedButtonAvailability(true); + document.querySelectorAll('[data-metal]').forEach(button => { button.addEventListener('click', async () => { selectedMetal = button.dataset.metal; activeMetal(); - if (selectedMetal === 'silver' || selectedMetal === 'zinc') { + if (selectedMetal === 'zinc') { selectedDate = 'day'; setPredictedButtonAvailability(false); document.querySelectorAll('.graph__button[data-interval]').forEach(btn => { @@ -343,7 +334,7 @@ document.addEventListener("DOMContentLoaded", () => { fetchData('day'); } - else if (selectedMetal === 'gold') { + else if (selectedMetal === 'gold' || selectedMetal === 'silver') { selectedDate = 'day'; setPredictedButtonAvailability(true); document.querySelectorAll('.graph__button[data-interval]').forEach(btn => { @@ -543,27 +534,21 @@ function getFallbackNews(metal) { async function updateNewsContent() { const swiperWrapper = document.querySelector('.swiper-wrapper'); - // Show loading state swiperWrapper.innerHTML = '

Loading news...

'; try { - // Fetch news from backend const newsData = await fetchNewsFromBackend(selectedMetal); swiperWrapper.innerHTML = ''; - - // Helper to render news with ellipsis and link function renderNewsText(newsItem) { let text = newsItem.preview || newsItem.title; - if (text && text.trim().endsWith('...') && newsItem.url) { - // Remove the last ... and add link on a new line - text = text.replace(/\.\.\.$/, '...
More details here'); + if (selectedMetal !== 'silver' && newsItem.url) { + text = text + '
More details'; } return text; } if (newsData.length === 0) { - // Try fallback news for metals without backend data const fallbackData = getFallbackNews(selectedMetal); if (fallbackData.length > 0) { fallbackData.slice(0, 4).forEach(newsItem => { @@ -586,7 +571,6 @@ async function updateNewsContent() { swiperWrapper.appendChild(slide); }); } else { - // Show no news message const slide = document.createElement('div'); slide.className = 'swiper-slide'; slide.innerHTML = ` @@ -602,7 +586,6 @@ async function updateNewsContent() { swiperWrapper.appendChild(slide); } } else { - // Display real news from backend, limit to 4 newsData.slice(0, 4).forEach(newsItem => { const slide = document.createElement('div'); slide.className = 'swiper-slide'; @@ -622,7 +605,7 @@ async function updateNewsContent() { if (swiper) { swiper.update(); - swiper.slideTo(0, 0); // Go to the first slide instantly + swiper.slideTo(0, 0); } } catch (error) { console.error("Error updating news content:", error);