SmartCane/webapps/sugar_mill_locator/google-sheets-config.js

152 lines
6 KiB
JavaScript

// Google Sheets Configuration
// This file connects to your Google Sheet for live data updates
const GOOGLE_SHEETS_CONFIG = {
// Your Google Sheet ID (from the URL)
SHEET_ID: '1ZHEIyhupNDHVd1EScBn0DnuiAzMFoZcAPZm3U65abkY',
// The sheet name or gid (the sheet tab you want to read from)
// If using gid=220881066, you can reference it this way
SHEET_NAME: 'Sheet1', // Change this to your actual sheet name if different
// Auto-refresh interval in milliseconds (5 minutes = 300000ms)
REFRESH_INTERVAL: 300000,
// Enable auto-refresh (set to false to disable)
AUTO_REFRESH_ENABLED: true
};
/**
* Fetch data from Google Sheet via Netlify Function
* The function keeps credentials secret on the server
*/
async function fetchGoogleSheetData() {
try {
// Call Netlify function instead of Google Sheets directly
// This keeps the Sheet ID and password hidden from browser dev tools
const response = await fetch('/.netlify/functions/get-mills');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const csvText = await response.text();
console.log('✓ Data fetched from Netlify Function (Google Sheet)');
return csvText;
} catch (error) {
console.error('Error fetching data from Netlify Function:', error);
showNotification('Could not fetch data. Check your connection.', 'warning');
return null;
}
}
/**
* Initialize auto-refresh of data from Google Sheet
*/
function initGoogleSheetsAutoRefresh() {
if (!GOOGLE_SHEETS_CONFIG.AUTO_REFRESH_ENABLED) {
console.log('Google Sheets auto-refresh is disabled');
return;
}
console.log(`✓ Auto-refresh enabled (every ${GOOGLE_SHEETS_CONFIG.REFRESH_INTERVAL / 1000 / 60} minutes)`);
// Refresh immediately on load
// (already done in initApp)
// Then refresh periodically
setInterval(async () => {
console.log('🔄 Refreshing data from Google Sheet...');
const csvData = await fetchGoogleSheetData();
if (csvData) {
// Clear old markers
Object.values(millMarkers).forEach(marker => map.removeLayer(marker));
millMarkers = {};
// Parse new data
parseCSV(csvData);
// Render updated mills
renderMills();
updateLegend();
// Reapply filters
applyFilters();
console.log(`✓ Updated ${mills.length} mills from Google Sheet`);
showNotification(`Map updated with latest data (${mills.length} mills)`, 'success');
}
}, GOOGLE_SHEETS_CONFIG.REFRESH_INTERVAL);
}
/**
* Show notification to user
*/
function showNotification(message, type = 'info') {
const colors = {
'success': '#4CAF50',
'warning': '#FF9800',
'error': '#F44336',
'info': '#2196F3'
};
const notification = document.createElement('div');
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: ${colors[type] || colors.info};
color: white;
padding: 15px 20px;
border-radius: 5px;
z-index: 9999;
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
font-weight: 500;
`;
notification.textContent = message;
document.body.appendChild(notification);
setTimeout(() => {
notification.style.transition = 'opacity 0.3s ease';
notification.style.opacity = '0';
setTimeout(() => notification.remove(), 300);
}, 4000);
}
/**
* Provide setup instructions to the user
*/
function showGoogleSheetsSetup() {
console.log(`
╔════════════════════════════════════════════════════════════╗
║ Google Sheets Integration Setup Instructions ║
╠════════════════════════════════════════════════════════════╣
║ ║
║ 1. Your Google Sheet is configured and ready! ║
║ ║
║ 2. Share the sheet with your colleagues: ║
║ - Click "Share" in the top-right ║
║ - Add their email addresses ║
║ - They must have "Editor" access ║
║ ║
║ 3. Column headers required (case-sensitive): ║
║ - Mill/Factory Name (or similar) ║
║ - Country ║
║ - Latitude ║
║ - Longitude ║
║ - Crushing Capacity (optional) ║
║ - Annual Sugar Production (optional) ║
║ - Notes (optional) ║
║ - Data Year (optional) ║
║ ║
║ 4. The map will automatically update every 5 minutes ║
║ with new data from the sheet ║
║ ║
║ 5. To change refresh interval, edit: ║
║ GOOGLE_SHEETS_CONFIG.REFRESH_INTERVAL ║
║ ║
╚════════════════════════════════════════════════════════════╝
`);
}