1 line
38 KiB
JSON
1 line
38 KiB
JSON
{"ast":null,"code":"import React,{useState,useEffect}from'react';import{FiSearch,FiFilter,FiRefreshCw,FiDownload,FiCalendar,FiServer}from'react-icons/fi';import{Link}from'react-router-dom';// Dummy data for demonstration\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";const dummyLogs=[{id:1,device_id:'device-001',device_name:'SIM7000E-001',level:'info',message:'Device connected to network',source:'connection_manager',timestamp:new Date().toISOString()},{id:2,device_id:'device-001',device_name:'SIM7000E-001',level:'warning',message:'Battery level below 30%',source:'power_monitor',timestamp:new Date(Date.now()-1800000).toISOString()// 30 minutes ago\n},{id:3,device_id:'device-002',device_name:'SIM7000E-002',level:'error',message:'Failed to send telemetry data',source:'data_transmitter',timestamp:new Date(Date.now()-3600000).toISOString()// 1 hour ago\n},{id:4,device_id:'device-003',device_name:'SIM7000E-003',level:'critical',message:'Device shutdown due to critical battery level',source:'power_manager',timestamp:new Date(Date.now()-86400000).toISOString()// 1 day ago\n},{id:5,device_id:'device-004',device_name:'SIM7000E-004',level:'info',message:'GPS location updated',source:'gps_module',timestamp:new Date(Date.now()-7200000).toISOString()// 2 hours ago\n},{id:6,device_id:'device-001',device_name:'SIM7000E-001',level:'debug',message:'Reconnecting to cellular network',source:'connection_manager',timestamp:new Date(Date.now()-900000).toISOString()// 15 minutes ago\n},{id:7,device_id:'device-005',device_name:'SIM7000E-005',level:'warning',message:'Weak signal strength detected',source:'signal_monitor',timestamp:new Date(Date.now()-10800000).toISOString()// 3 hours ago\n},{id:8,device_id:'device-002',device_name:'SIM7000E-002',level:'info',message:'Firmware update available',source:'update_manager',timestamp:new Date(Date.now()-43200000).toISOString()// 12 hours ago\n},{id:9,device_id:'device-004',device_name:'SIM7000E-004',level:'error',message:'Temperature sensor reading out of range',source:'sensor_monitor',timestamp:new Date(Date.now()-14400000).toISOString()// 4 hours ago\n},{id:10,device_id:'device-003',device_name:'SIM7000E-003',level:'debug',message:'Device configuration updated',source:'config_manager',timestamp:new Date(Date.now()-172800000).toISOString()// 2 days ago\n}];const Logs=()=>{const[logs,setLogs]=useState([]);const[loading,setLoading]=useState(true);const[searchTerm,setSearchTerm]=useState('');const[levelFilter,setLevelFilter]=useState('all');const[deviceFilter,setDeviceFilter]=useState('all');const[refreshing,setRefreshing]=useState(false);const[startDate,setStartDate]=useState('');const[endDate,setEndDate]=useState('');useEffect(()=>{// Simulate API call\nconst fetchData=async()=>{try{// In a real app, you would fetch data from your API\n// const response = await fetch('/api/logs');\n// const data = await response.json();\n// Using dummy data for now\nsetTimeout(()=>{setLogs(dummyLogs);setLoading(false);},1000);}catch(error){console.error('Error fetching data:',error);setLoading(false);}};fetchData();},[]);// Helper function to format date\nconst formatDate=dateString=>{const date=new Date(dateString);return date.toLocaleString();};// Helper function to get log level color\nconst getLevelColor=level=>{switch(level){case'debug':return'text-gray-500 bg-gray-100';case'info':return'text-blue-500 bg-blue-100';case'warning':return'text-yellow-500 bg-yellow-100';case'error':return'text-red-500 bg-red-100';case'critical':return'text-white bg-red-500';default:return'text-gray-500 bg-gray-100';}};// Handle refresh\nconst handleRefresh=()=>{setRefreshing(true);// Simulate API call\nsetTimeout(()=>{setLogs(dummyLogs);setRefreshing(false);},1000);};// Handle export logs\nconst handleExportLogs=()=>{// In a real app, you would generate a CSV or JSON file\nalert('Exporting logs functionality would be implemented here');};// Get unique device IDs for filter dropdown\nconst uniqueDevices=[...new Set(logs.map(log=>log.device_id))];// Filter logs based on search term, level filter, device filter, and date range\nconst filteredLogs=logs.filter(log=>{const matchesSearch=log.message.toLowerCase().includes(searchTerm.toLowerCase())||log.source.toLowerCase().includes(searchTerm.toLowerCase())||log.device_id.toLowerCase().includes(searchTerm.toLowerCase());const matchesLevel=levelFilter==='all'||log.level===levelFilter;const matchesDevice=deviceFilter==='all'||log.device_id===deviceFilter;let matchesDateRange=true;if(startDate){const logDate=new Date(log.timestamp);const filterStartDate=new Date(startDate);matchesDateRange=logDate>=filterStartDate;}if(endDate){const logDate=new Date(log.timestamp);const filterEndDate=new Date(endDate);// Set end date to end of day\nfilterEndDate.setHours(23,59,59,999);matchesDateRange=matchesDateRange&&logDate<=filterEndDate;}return matchesSearch&&matchesLevel&&matchesDevice&&matchesDateRange;});if(loading){return/*#__PURE__*/_jsx(\"div\",{className:\"flex items-center justify-center h-full\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"text-center\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"w-16 h-16 border-4 border-primary-500 border-t-transparent rounded-full animate-spin mx-auto\"}),/*#__PURE__*/_jsx(\"p\",{className:\"mt-4 text-gray-600\",children:\"Loading logs...\"})]})});}return/*#__PURE__*/_jsxs(\"div\",{className:\"space-y-6\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"flex justify-between items-center\",children:[/*#__PURE__*/_jsx(\"h1\",{className:\"text-2xl font-semibold text-gray-800\",children:\"System Logs\"}),/*#__PURE__*/_jsxs(\"button\",{className:\"flex items-center gap-2 px-4 py-2 bg-primary-500 text-white rounded-md hover:bg-primary-600 transition-colors\",onClick:handleExportLogs,children:[/*#__PURE__*/_jsx(FiDownload,{}),/*#__PURE__*/_jsx(\"span\",{children:\"Export Logs\"})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"dashboard-card\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"relative\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\",children:/*#__PURE__*/_jsx(FiSearch,{className:\"text-gray-400\"})}),/*#__PURE__*/_jsx(\"input\",{type:\"text\",placeholder:\"Search logs...\",className:\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",value:searchTerm,onChange:e=>setSearchTerm(e.target.value)})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"relative\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\",children:/*#__PURE__*/_jsx(FiFilter,{className:\"text-gray-400\"})}),/*#__PURE__*/_jsxs(\"select\",{className:\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",value:levelFilter,onChange:e=>setLevelFilter(e.target.value),children:[/*#__PURE__*/_jsx(\"option\",{value:\"all\",children:\"All Levels\"}),/*#__PURE__*/_jsx(\"option\",{value:\"debug\",children:\"Debug\"}),/*#__PURE__*/_jsx(\"option\",{value:\"info\",children:\"Info\"}),/*#__PURE__*/_jsx(\"option\",{value:\"warning\",children:\"Warning\"}),/*#__PURE__*/_jsx(\"option\",{value:\"error\",children:\"Error\"}),/*#__PURE__*/_jsx(\"option\",{value:\"critical\",children:\"Critical\"})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"relative\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\",children:/*#__PURE__*/_jsx(FiServer,{className:\"text-gray-400\"})}),/*#__PURE__*/_jsxs(\"select\",{className:\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",value:deviceFilter,onChange:e=>setDeviceFilter(e.target.value),children:[/*#__PURE__*/_jsx(\"option\",{value:\"all\",children:\"All Devices\"}),uniqueDevices.map(deviceId=>{var _logs$find;return/*#__PURE__*/_jsx(\"option\",{value:deviceId,children:((_logs$find=logs.find(log=>log.device_id===deviceId))===null||_logs$find===void 0?void 0:_logs$find.device_name)||deviceId},deviceId);})]})]}),/*#__PURE__*/_jsxs(\"button\",{className:`flex items-center justify-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors ${refreshing?'opacity-50 cursor-not-allowed':''}`,onClick:handleRefresh,disabled:refreshing,children:[/*#__PURE__*/_jsx(FiRefreshCw,{className:refreshing?'animate-spin':''}),/*#__PURE__*/_jsx(\"span\",{children:\"Refresh\"})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"grid grid-cols-1 md:grid-cols-2 gap-4\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"relative\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\",children:/*#__PURE__*/_jsx(FiCalendar,{className:\"text-gray-400\"})}),/*#__PURE__*/_jsx(\"input\",{type:\"date\",placeholder:\"Start Date\",className:\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",value:startDate,onChange:e=>setStartDate(e.target.value)})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"relative\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\",children:/*#__PURE__*/_jsx(FiCalendar,{className:\"text-gray-400\"})}),/*#__PURE__*/_jsx(\"input\",{type:\"date\",placeholder:\"End Date\",className:\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\",value:endDate,onChange:e=>setEndDate(e.target.value)})]})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"dashboard-card\",children:filteredLogs.length===0?/*#__PURE__*/_jsx(\"div\",{className:\"text-center py-8\",children:/*#__PURE__*/_jsx(\"p\",{className:\"text-gray-500\",children:\"No logs found matching your criteria.\"})}):/*#__PURE__*/_jsx(\"div\",{className:\"overflow-x-auto\",children:/*#__PURE__*/_jsxs(\"table\",{className:\"min-w-full divide-y divide-gray-200\",children:[/*#__PURE__*/_jsx(\"thead\",{className:\"bg-gray-50\",children:/*#__PURE__*/_jsxs(\"tr\",{children:[/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Timestamp\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Level\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Device\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Message\"}),/*#__PURE__*/_jsx(\"th\",{className:\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\",children:\"Source\"})]})}),/*#__PURE__*/_jsx(\"tbody\",{className:\"bg-white divide-y divide-gray-200\",children:filteredLogs.map(log=>/*#__PURE__*/_jsxs(\"tr\",{className:\"hover:bg-gray-50\",children:[/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\",children:formatDate(log.timestamp)}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsx(\"span\",{className:`px-2 py-1 text-xs font-medium rounded-full ${getLevelColor(log.level)}`,children:log.level.toUpperCase()})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap\",children:/*#__PURE__*/_jsx(Link,{to:`/devices/${log.device_id}`,className:\"text-primary-600 hover:text-primary-700\",children:log.device_name})}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 text-sm text-gray-900\",children:log.message}),/*#__PURE__*/_jsx(\"td\",{className:\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\",children:log.source})]},log.id))})]})})})]});};export default Logs;","map":{"version":3,"names":["React","useState","useEffect","FiSearch","FiFilter","FiRefreshCw","FiDownload","FiCalendar","FiServer","Link","jsx","_jsx","jsxs","_jsxs","dummyLogs","id","device_id","device_name","level","message","source","timestamp","Date","toISOString","now","Logs","logs","setLogs","loading","setLoading","searchTerm","setSearchTerm","levelFilter","setLevelFilter","deviceFilter","setDeviceFilter","refreshing","setRefreshing","startDate","setStartDate","endDate","setEndDate","fetchData","setTimeout","error","console","formatDate","dateString","date","toLocaleString","getLevelColor","handleRefresh","handleExportLogs","alert","uniqueDevices","Set","map","log","filteredLogs","filter","matchesSearch","toLowerCase","includes","matchesLevel","matchesDevice","matchesDateRange","logDate","filterStartDate","filterEndDate","setHours","className","children","onClick","type","placeholder","value","onChange","e","target","deviceId","_logs$find","find","disabled","length","toUpperCase","to"],"sources":["/home/m3mo/Desktop/temparea/solarbank/frontend/src/pages/Logs.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { FiSearch, FiFilter, FiRefreshCw, FiDownload, FiCalendar, FiServer } from 'react-icons/fi';\nimport { Link } from 'react-router-dom';\n\n// Dummy data for demonstration\nconst dummyLogs = [\n {\n id: 1,\n device_id: 'device-001',\n device_name: 'SIM7000E-001',\n level: 'info',\n message: 'Device connected to network',\n source: 'connection_manager',\n timestamp: new Date().toISOString()\n },\n {\n id: 2,\n device_id: 'device-001',\n device_name: 'SIM7000E-001',\n level: 'warning',\n message: 'Battery level below 30%',\n source: 'power_monitor',\n timestamp: new Date(Date.now() - 1800000).toISOString() // 30 minutes ago\n },\n {\n id: 3,\n device_id: 'device-002',\n device_name: 'SIM7000E-002',\n level: 'error',\n message: 'Failed to send telemetry data',\n source: 'data_transmitter',\n timestamp: new Date(Date.now() - 3600000).toISOString() // 1 hour ago\n },\n {\n id: 4,\n device_id: 'device-003',\n device_name: 'SIM7000E-003',\n level: 'critical',\n message: 'Device shutdown due to critical battery level',\n source: 'power_manager',\n timestamp: new Date(Date.now() - 86400000).toISOString() // 1 day ago\n },\n {\n id: 5,\n device_id: 'device-004',\n device_name: 'SIM7000E-004',\n level: 'info',\n message: 'GPS location updated',\n source: 'gps_module',\n timestamp: new Date(Date.now() - 7200000).toISOString() // 2 hours ago\n },\n {\n id: 6,\n device_id: 'device-001',\n device_name: 'SIM7000E-001',\n level: 'debug',\n message: 'Reconnecting to cellular network',\n source: 'connection_manager',\n timestamp: new Date(Date.now() - 900000).toISOString() // 15 minutes ago\n },\n {\n id: 7,\n device_id: 'device-005',\n device_name: 'SIM7000E-005',\n level: 'warning',\n message: 'Weak signal strength detected',\n source: 'signal_monitor',\n timestamp: new Date(Date.now() - 10800000).toISOString() // 3 hours ago\n },\n {\n id: 8,\n device_id: 'device-002',\n device_name: 'SIM7000E-002',\n level: 'info',\n message: 'Firmware update available',\n source: 'update_manager',\n timestamp: new Date(Date.now() - 43200000).toISOString() // 12 hours ago\n },\n {\n id: 9,\n device_id: 'device-004',\n device_name: 'SIM7000E-004',\n level: 'error',\n message: 'Temperature sensor reading out of range',\n source: 'sensor_monitor',\n timestamp: new Date(Date.now() - 14400000).toISOString() // 4 hours ago\n },\n {\n id: 10,\n device_id: 'device-003',\n device_name: 'SIM7000E-003',\n level: 'debug',\n message: 'Device configuration updated',\n source: 'config_manager',\n timestamp: new Date(Date.now() - 172800000).toISOString() // 2 days ago\n }\n];\n\nconst Logs = () => {\n const [logs, setLogs] = useState([]);\n const [loading, setLoading] = useState(true);\n const [searchTerm, setSearchTerm] = useState('');\n const [levelFilter, setLevelFilter] = useState('all');\n const [deviceFilter, setDeviceFilter] = useState('all');\n const [refreshing, setRefreshing] = useState(false);\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n\n useEffect(() => {\n // Simulate API call\n const fetchData = async () => {\n try {\n // In a real app, you would fetch data from your API\n // const response = await fetch('/api/logs');\n // const data = await response.json();\n \n // Using dummy data for now\n setTimeout(() => {\n setLogs(dummyLogs);\n setLoading(false);\n }, 1000);\n } catch (error) {\n console.error('Error fetching data:', error);\n setLoading(false);\n }\n };\n\n fetchData();\n }, []);\n\n // Helper function to format date\n const formatDate = (dateString) => {\n const date = new Date(dateString);\n return date.toLocaleString();\n };\n\n // Helper function to get log level color\n const getLevelColor = (level) => {\n switch (level) {\n case 'debug':\n return 'text-gray-500 bg-gray-100';\n case 'info':\n return 'text-blue-500 bg-blue-100';\n case 'warning':\n return 'text-yellow-500 bg-yellow-100';\n case 'error':\n return 'text-red-500 bg-red-100';\n case 'critical':\n return 'text-white bg-red-500';\n default:\n return 'text-gray-500 bg-gray-100';\n }\n };\n\n // Handle refresh\n const handleRefresh = () => {\n setRefreshing(true);\n // Simulate API call\n setTimeout(() => {\n setLogs(dummyLogs);\n setRefreshing(false);\n }, 1000);\n };\n\n // Handle export logs\n const handleExportLogs = () => {\n // In a real app, you would generate a CSV or JSON file\n alert('Exporting logs functionality would be implemented here');\n };\n\n // Get unique device IDs for filter dropdown\n const uniqueDevices = [...new Set(logs.map(log => log.device_id))];\n\n // Filter logs based on search term, level filter, device filter, and date range\n const filteredLogs = logs.filter(log => {\n const matchesSearch = log.message.toLowerCase().includes(searchTerm.toLowerCase()) ||\n log.source.toLowerCase().includes(searchTerm.toLowerCase()) ||\n log.device_id.toLowerCase().includes(searchTerm.toLowerCase());\n \n const matchesLevel = levelFilter === 'all' || log.level === levelFilter;\n \n const matchesDevice = deviceFilter === 'all' || log.device_id === deviceFilter;\n \n let matchesDateRange = true;\n if (startDate) {\n const logDate = new Date(log.timestamp);\n const filterStartDate = new Date(startDate);\n matchesDateRange = logDate >= filterStartDate;\n }\n \n if (endDate) {\n const logDate = new Date(log.timestamp);\n const filterEndDate = new Date(endDate);\n // Set end date to end of day\n filterEndDate.setHours(23, 59, 59, 999);\n matchesDateRange = matchesDateRange && logDate <= filterEndDate;\n }\n \n return matchesSearch && matchesLevel && matchesDevice && matchesDateRange;\n });\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 border-4 border-primary-500 border-t-transparent rounded-full animate-spin mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Loading logs...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex justify-between items-center\">\n <h1 className=\"text-2xl font-semibold text-gray-800\">System Logs</h1>\n <button \n className=\"flex items-center gap-2 px-4 py-2 bg-primary-500 text-white rounded-md hover:bg-primary-600 transition-colors\"\n onClick={handleExportLogs}\n >\n <FiDownload />\n <span>Export Logs</span>\n </button>\n </div>\n\n {/* Search and Filter */}\n <div className=\"dashboard-card\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-4\">\n <div className=\"relative\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <FiSearch className=\"text-gray-400\" />\n </div>\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n />\n </div>\n \n <div className=\"relative\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <FiFilter className=\"text-gray-400\" />\n </div>\n <select\n className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n value={levelFilter}\n onChange={(e) => setLevelFilter(e.target.value)}\n >\n <option value=\"all\">All Levels</option>\n <option value=\"debug\">Debug</option>\n <option value=\"info\">Info</option>\n <option value=\"warning\">Warning</option>\n <option value=\"error\">Error</option>\n <option value=\"critical\">Critical</option>\n </select>\n </div>\n \n <div className=\"relative\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <FiServer className=\"text-gray-400\" />\n </div>\n <select\n className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n value={deviceFilter}\n onChange={(e) => setDeviceFilter(e.target.value)}\n >\n <option value=\"all\">All Devices</option>\n {uniqueDevices.map(deviceId => (\n <option key={deviceId} value={deviceId}>\n {logs.find(log => log.device_id === deviceId)?.device_name || deviceId}\n </option>\n ))}\n </select>\n </div>\n \n <button \n className={`flex items-center justify-center gap-2 px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50 transition-colors ${refreshing ? 'opacity-50 cursor-not-allowed' : ''}`}\n onClick={handleRefresh}\n disabled={refreshing}\n >\n <FiRefreshCw className={refreshing ? 'animate-spin' : ''} />\n <span>Refresh</span>\n </button>\n </div>\n \n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"relative\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <FiCalendar className=\"text-gray-400\" />\n </div>\n <input\n type=\"date\"\n placeholder=\"Start Date\"\n className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n value={startDate}\n onChange={(e) => setStartDate(e.target.value)}\n />\n </div>\n \n <div className=\"relative\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <FiCalendar className=\"text-gray-400\" />\n </div>\n <input\n type=\"date\"\n placeholder=\"End Date\"\n className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm\"\n value={endDate}\n onChange={(e) => setEndDate(e.target.value)}\n />\n </div>\n </div>\n </div>\n\n {/* Log List */}\n <div className=\"dashboard-card\">\n {filteredLogs.length === 0 ? (\n <div className=\"text-center py-8\">\n <p className=\"text-gray-500\">No logs found matching your criteria.</p>\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Timestamp</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Level</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Device</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Message</th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">Source</th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {filteredLogs.map((log) => (\n <tr key={log.id} className=\"hover:bg-gray-50\">\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n {formatDate(log.timestamp)}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <span className={`px-2 py-1 text-xs font-medium rounded-full ${getLevelColor(log.level)}`}>\n {log.level.toUpperCase()}\n </span>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <Link to={`/devices/${log.device_id}`} className=\"text-primary-600 hover:text-primary-700\">\n {log.device_name}\n </Link>\n </td>\n <td className=\"px-6 py-4 text-sm text-gray-900\">\n {log.message}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n {log.source}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Logs;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]} |