@@ -167,22 +167,6 @@ <h3 class="card-title">Reports</h3>
167167 < div class ="card " id ="recommendations-card ">
168168 < h3 class ="card-title "> 🌱 Expert Recommendations</ h3 >
169169 < div class ="loading "> ⏳ Loading...</ div >
170-
171- < div class ="card " id ="recommendations-card ">
172- < h3 class ="card-title "> </ h3 >
173- < button id ="refresh-recommendations "> 🔄 Refresh Recommendations</ button >
174- < div id ="recommendations-list "> </ div >
175- </ div >
176- </ div >
177-
178- <!-- Modal -->
179- < div id ="detail-modal " class ="modal ">
180- < div class ="modal-content ">
181- < span class ="close-modal "> ×</ span >
182- < h3 id ="modal-title "> </ h3 >
183- < p id ="modal-details "> </ p >
184- </ div >
185- </ div >
186170 </ div >
187171
188172 < div class ="card " id ="tutorials-card ">
@@ -204,94 +188,123 @@ <h3 class="card-title">🔮 Yield Prediction</h3>
204188 < h3 class ="card-title "> 🚜 Equipment Status</ h3 >
205189 < div class ="equipment-list " id ="equipment-status "> </ div >
206190 </ div >
191+ </ div >
207192
193+ <!-- Modal -->
194+ < div id ="detail-modal " class ="modal ">
195+ < div class ="modal-content ">
196+ < span class ="close-modal "> ×</ span >
197+ < h3 id ="modal-title "> </ h3 >
198+ < p id ="modal-details "> </ p >
199+ </ div >
200+ </ div >
208201
209202< script >
210- // Function to handle dynamic active class for navigation
211- function updateActiveNavLink ( ) {
212- const navLinks = document . querySelectorAll ( '.nav-links .menu-item' ) ;
213- const currentPath = window . location . pathname . split ( '/' ) . pop ( ) ; // Get the last part of the URL
214-
215- navLinks . forEach ( link => {
216- const linkPath = link . getAttribute ( 'href' ) . split ( '/' ) . pop ( ) ;
217- if ( linkPath === currentPath ) {
218- link . classList . add ( 'active' ) ;
219- } else {
220- link . classList . remove ( 'active' ) ;
221- }
222- } ) ;
223- }
224-
225- // Call the function on page load
226203 document . addEventListener ( 'DOMContentLoaded' , ( ) => {
227- updateActiveNavLink ( ) ;
228- fetchReportsData ( ) ;
229- fetchTutorialsData ( ) ;
204+ loadDashboardData ( ) ;
230205 } ) ;
231206
232- // Sync Reports and Tutorials (Assuming these functions are meant to fetch and display data)
233- async function fetchReportsData ( ) {
234- // 'https://eoagritool.z39.web.core.windows.net' API endpoint
235- try {
236- const response = await fetch ( 'reports.html' ) ;
237- if ( ! response . ok ) {
238- console . error ( 'Failed to fetch reports:' , response . status ) ;
239- document . getElementById ( 'reports-card' ) . innerHTML = `
240- <h3 class="card-title">📊 Reports</h3>
241- <p class="error-message">Failed to load reports.</p>
242- ` ;
243- return ;
244- }
245- const data = await response . json ( ) ;
246- document . getElementById ( 'reports-card' ) . innerHTML = `
247- <h3 class="card-title">📊 Reports</h3>
248- <div>
249- ${ data . map ( report => `
250- <p><strong>${ report . title } </strong></p>
251- <p>${ report . summary } </p>
252- <p>Date: ${ new Date ( report . date ) . toLocaleDateString ( ) } </p>
253- ` ) . join ( '' ) }
254- </div>
255- ` ;
256- } catch ( error ) {
257- console . error ( 'Error fetching reports:' , error ) ;
258- document . getElementById ( 'reports-card' ) . innerHTML = `
259- <h3 class="card-title">📊 Reports</h3>
260- <p class="error-message">Error loading reports.</p>
261- ` ;
207+ function loadDashboardData ( ) {
208+ const fieldsData = JSON . parse ( localStorage . getItem ( 'fieldsData' ) ) || { fields : [ ] } ;
209+ const climateData = JSON . parse ( localStorage . getItem ( 'climateData' ) ) || { } ;
210+ const waterData = JSON . parse ( localStorage . getItem ( 'waterData' ) ) || { } ;
211+ const reportsData = JSON . parse ( localStorage . getItem ( 'reportsData' ) ) || { } ;
212+ const recommendationsData = JSON . parse ( localStorage . getItem ( 'recommendationsData' ) ) || { } ;
213+ const tutorialsData = JSON . parse ( localStorage . getItem ( 'tutorialsData' ) ) || { } ;
214+
215+ document . getElementById ( 'fields-card' ) . innerHTML = `<h3 class="card-title">Field Status</h3>${ renderFields ( fieldsData ) } ` ;
216+ document . getElementById ( 'climate-card' ) . innerHTML = `<h3 class="card-title">Climate Overview</h3>${ renderClimate ( climateData ) } ` ;
217+ document . getElementById ( 'water-card' ) . innerHTML = `<h3 class="card-title">Water Resources</h3>${ renderWater ( waterData ) } ` ;
218+ document . getElementById ( 'reports-card' ) . innerHTML = `<h3 class="card-title">Reports</h3>${ renderReports ( reportsData ) } ` ;
219+ document . getElementById ( 'recommendations-card' ) . innerHTML = `<h3 class="card-title">🌱 Expert Recommendations</h3>${ renderRecommendations ( recommendationsData ) } ` ;
220+ document . getElementById ( 'tutorials-card' ) . innerHTML = `<h3 class="card-title">🎓 Tutorials</h3>${ renderTutorials ( tutorialsData ) } ` ;
221+ }
222+
223+ function renderFields ( data ) {
224+ if ( ! data . fields . length ) {
225+ return '<p>No fields registered yet.</p>' ;
226+ }
227+ return data . fields . map ( field => `
228+ <div>
229+ <p><strong>${ field . name } </strong></p>
230+ <p>Crop: ${ field . crop } </p>
231+ <p>Yield: ${ field . yield } </p>
232+ <p>Health: ${ field . health . charAt ( 0 ) . toUpperCase ( ) + field . health . slice ( 1 ) } </p>
233+ <p>Last Updated: ${ timeSince ( field . lastUpdated ) } ago</p>
234+ </div>
235+ ` ) . join ( '' ) ;
236+ }
237+
238+ function renderClimate ( data ) {
239+ return `
240+ <div>
241+ <p>Average Temperature: ${ data . avgTemp } °C</p>
242+ <p>Last Recorded Precipitation: ${ data . lastPrecip } mm</p>
243+ </div>
244+ ` ;
245+ }
246+
247+ function renderWater ( data ) {
248+ return `
249+ <div>
250+ <p>Surface Water: ${ data . surface . length } bodies</p>
251+ <p>Groundwater: ${ data . groundwater . length } regions</p>
252+ <p>Irrigation: ${ data . irrigation . length } schedules</p>
253+ </div>
254+ ` ;
255+ }
256+
257+ function renderReports ( data ) {
258+ return `
259+ <div>
260+ <p>Last Report Generated: ${ new Date ( data . lastGenerated ) . toLocaleDateString ( ) } </p>
261+ </div>
262+ ` ;
263+ }
264+
265+ function renderRecommendations ( data ) {
266+ if ( ! data . recommendations . length ) {
267+ return '<p>No recommendations available.</p>' ;
268+ }
269+ return data . recommendations . map ( rec => `
270+ <div>
271+ <p><strong>${ rec . title } </strong></p>
272+ <p>${ rec . details } </p>
273+ </div>
274+ ` ) . join ( '' ) ;
275+ }
276+
277+ function renderTutorials ( data ) {
278+ if ( ! data . tutorials . length ) {
279+ return '<p>No tutorials available.</p>' ;
262280 }
281+ return data . tutorials . map ( tutorial => `
282+ <div>
283+ <p><strong>${ tutorial . title } </strong></p>
284+ <p>${ tutorial . description } </p>
285+ <p>Duration: ${ tutorial . duration } minutes</p>
286+ </div>
287+ ` ) . join ( '' ) ;
263288 }
264289
265- async function fetchTutorialsData ( ) {
266- // 'https://eoagritool.africa.communication.azure.com' API endpoint
267- try {
268- const response = await fetch ( 'tutorials.html' ) ;
269- if ( ! response . ok ) {
270- console . error ( 'Failed to fetch tutorials:' , response . status ) ;
271- document . getElementById ( 'tutorials-card' ) . innerHTML = `
272- <h3 class="card-title">🎓 Tutorials</h3>
273- <p class="error-message">Failed to load tutorials.</p>
274- ` ;
275- return ;
290+ function timeSince ( dateString ) {
291+ const date = new Date ( dateString ) ;
292+ const seconds = Math . floor ( ( new Date ( ) - date ) / 1000 ) ;
293+ const intervals = {
294+ year : 31536000 ,
295+ month : 2592000 ,
296+ day : 86400 ,
297+ hour : 3600 ,
298+ minute : 60
299+ } ;
300+
301+ for ( const [ unit , secondsInUnit ] of Object . entries ( intervals ) ) {
302+ const interval = Math . floor ( seconds / secondsInUnit ) ;
303+ if ( interval >= 1 ) {
304+ return `${ interval } ${ unit } ${ interval !== 1 ? 's' : '' } ` ;
276305 }
277- const data = await response . json ( ) ;
278- document . getElementById ( 'tutorials-card' ) . innerHTML = `
279- <h3 class="card-title">🎓 Tutorials</h3>
280- <div>
281- ${ data . map ( tutorial => `
282- <p><strong>${ tutorial . title } </strong></p>
283- <p>${ tutorial . description } </p>
284- <p>Duration: ${ tutorial . duration } minutes</p>
285- ` ) . join ( '' ) }
286- </div>
287- ` ;
288- } catch ( error ) {
289- console . error ( 'Error fetching tutorials:' , error ) ;
290- document . getElementById ( 'tutorials-card' ) . innerHTML = `
291- <h3 class="card-title">🎓 Tutorials</h3>
292- <p class="error-message">Error loading tutorials.</p>
293- ` ;
294306 }
307+ return 'just now' ;
295308 }
296309</ script >
297310
0 commit comments