@@ -168,26 +168,6 @@ <h3 class="card-title">Reports</h3>
168168 < h3 class ="card-title "> 🌱 Expert Recommendations</ h3 >
169169 < div class ="loading "> ⏳ Loading...</ div >
170170 </ div >
171-
172- < div class ="card " id ="tutorials-card ">
173- < h3 class ="card-title "> 🎓 Tutorials</ h3 >
174- < div class ="loading "> ⏳ Loading...</ div >
175- </ div >
176-
177- < div class ="card " id ="iot-sensor-card ">
178- < h3 class ="card-title "> 🌡️ Real-Time Field Sensors</ h3 >
179- < div class ="sensor-grid " id ="sensor-readings "> </ div >
180- </ div >
181-
182- < div class ="card " id ="predictive-card ">
183- < h3 class ="card-title "> 🔮 Yield Prediction</ h3 >
184- < div id ="predictive-chart "> </ div >
185- </ div >
186-
187- < div class ="card " id ="equipment-card ">
188- < h3 class ="card-title "> 🚜 Equipment Status</ h3 >
189- < div class ="equipment-list " id ="equipment-status "> </ div >
190- </ div >
191171</ div >
192172
193173<!-- Modal -->
@@ -204,27 +184,12 @@ <h3 id="modal-title"></h3>
204184 loadDashboardData ( ) ;
205185 } ) ;
206186
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 ) {
187+ async function fetchFieldsData ( ) {
188+ const fieldsData = JSON . parse ( localStorage . getItem ( 'fieldData' ) ) || { fields : [ ] } ;
189+ if ( fieldsData . fields . length === 0 ) {
225190 return '<p>No fields registered yet.</p>' ;
226191 }
227- return data . fields . map ( field => `
192+ return fieldsData . fields . map ( field => `
228193 <div>
229194 <p><strong>${ field . name } </strong></p>
230195 <p>Crop: ${ field . crop } </p>
@@ -235,56 +200,112 @@ <h3 id="modal-title"></h3>
235200 ` ) . join ( '' ) ;
236201 }
237202
238- function renderClimate ( data ) {
203+ async function fetchClimateData ( ) {
204+ const climateData = JSON . parse ( localStorage . getItem ( 'climateDashboardData' ) ) || { } ;
239205 return `
240206 <div>
241- <p>Average Temperature: ${ data . avgTemp } °C</p>
242- <p>Last Recorded Precipitation: ${ data . lastPrecip } mm</p>
207+ <p>Average Temperature: ${ climateData . avgTemp } °C</p>
208+ <p>Last Recorded Precipitation: ${ climateData . lastPrecip } mm</p>
243209 </div>
244210 ` ;
245211 }
246212
247- function renderWater ( data ) {
213+ async function fetchWaterData ( ) {
214+ const waterData = JSON . parse ( localStorage . getItem ( 'waterData' ) ) || {
215+ surface : [ ] ,
216+ groundwater : [ ] ,
217+ irrigation : [ ]
218+ } ;
248219 return `
249220 <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>
221+ <p>Surface Water: ${ waterData . surface . length } bodies</p>
222+ <p>Groundwater: ${ waterData . groundwater . length } regions</p>
223+ <p>Irrigation: ${ waterData . irrigation . length } schedules</p>
253224 </div>
254225 ` ;
255226 }
256227
257- function renderReports ( data ) {
228+ async function fetchReportsData ( ) {
229+ const reportData = JSON . parse ( localStorage . getItem ( 'agritoolReport' ) ) || { } ;
258230 return `
259231 <div>
260- <p>Last Report Generated: ${ new Date ( data . lastGenerated ) . toLocaleDateString ( ) } </p>
232+ <p>Last Report Generated: ${ new Date ( reportData . lastGenerated ) . toLocaleDateString ( ) } </p>
261233 </div>
262234 ` ;
263235 }
264236
265- function renderRecommendations ( data ) {
266- if ( ! data . recommendations . length ) {
267- return '<p>No recommendations available.</p>' ;
237+ async function fetchRecommendationsData ( ) {
238+ try {
239+ const response = await fetch ( "/api/recommendations" ) ;
240+ const data = await response . json ( ) ;
241+ renderRecommendationCards ( data ) ;
242+ } catch ( error ) {
243+ showError ( "Failed to load agricultural recommendations" ) ;
244+ document . getElementById ( 'recommendations-card' ) . innerHTML = `
245+ <h3 class="card-title">🌱 Expert Recommendations</h3>
246+ <div class="loading">❌ Failed to load recommendations.</div>
247+ ` ;
268248 }
269- return data . recommendations . map ( rec => `
270- <div>
249+ }
250+
251+ async function getRecommendationDetails ( index ) {
252+ try {
253+ const response = await fetch ( "/api/details" , {
254+ method : 'POST' ,
255+ headers : { 'Content-Type' : 'application/json' } ,
256+ body : JSON . stringify ( { index } )
257+ } ) ;
258+ const details = await response . json ( ) ;
259+ displayDetailsModal ( details ) ;
260+ } catch ( error ) {
261+ showError ( "Could not load recommendation details" ) ;
262+ }
263+ }
264+
265+ async function loadDashboardData ( ) {
266+ try {
267+ const [ fields , climate , water , reports ] = await Promise . all ( [
268+ fetchFieldsData ( ) ,
269+ fetchClimateData ( ) ,
270+ fetchWaterData ( ) ,
271+ fetchReportsData ( ) ,
272+ fetchRecommendationsData ( )
273+ ] ) ;
274+
275+ document . getElementById ( 'fields-card' ) . innerHTML = `<h3 class="card-title">Field Status</h3>${ fields } ` ;
276+ document . getElementById ( 'climate-card' ) . innerHTML = `<h3 class="card-title">Climate Overview</h3>${ climate } ` ;
277+ document . getElementById ( 'water-card' ) . innerHTML = `<h3 class="card-title">Water Resources</h3>${ water } ` ;
278+ document . getElementById ( 'reports-card' ) . innerHTML = `<h3 class="card-title">Reports</h3>${ reports } ` ;
279+ } catch ( error ) {
280+ console . error ( 'Dashboard error:' , error ) ;
281+ document . querySelectorAll ( '.loading' ) . forEach ( el => {
282+ el . textContent = '❌ Failed to load data.' ;
283+ } ) ;
284+ }
285+ }
286+
287+ function renderRecommendationCards ( recommendations ) {
288+ const recommendationsCard = document . getElementById ( 'recommendations-card' ) ;
289+ recommendationsCard . innerHTML = `<h3 class="card-title">🌱 Expert Recommendations</h3>` ;
290+ recommendations . forEach ( ( rec , index ) => {
291+ const recElement = document . createElement ( 'div' ) ;
292+ recElement . innerHTML = `
271293 <p><strong>${ rec . title } </strong></p>
272294 <p>${ rec . details } </p>
273- </div>
274- ` ) . join ( '' ) ;
295+ ` ;
296+ recommendationsCard . appendChild ( recElement ) ;
297+ } ) ;
275298 }
276299
277- function renderTutorials ( data ) {
278- if ( ! data . tutorials . length ) {
279- return '<p>No tutorials available.</p>' ;
280- }
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 ( '' ) ;
300+ function displayDetailsModal ( details ) {
301+ const modal = document . getElementById ( 'detail-modal' ) ;
302+ document . getElementById ( 'modal-title' ) . innerText = details . title ;
303+ document . getElementById ( 'modal-details' ) . innerText = details . content ;
304+ modal . style . display = 'flex' ;
305+ }
306+
307+ function showError ( message ) {
308+ console . error ( message ) ;
288309 }
289310
290311 function timeSince ( dateString ) {
0 commit comments