Fix jwt-token
This commit is contained in:
@@ -426,7 +426,7 @@ const Devices = () => {
|
|||||||
<div className="mt-3">
|
<div className="mt-3">
|
||||||
<div className="flex items-center justify-between mb-4">
|
<div className="flex items-center justify-between mb-4">
|
||||||
<h3 className="text-lg font-medium text-gray-900">
|
<h3 className="text-lg font-medium text-gray-900">
|
||||||
Device Details
|
{t('devices.deviceDetails')}
|
||||||
</h3>
|
</h3>
|
||||||
<button
|
<button
|
||||||
onClick={() => setShowDetailsModal(false)}
|
onClick={() => setShowDetailsModal(false)}
|
||||||
@@ -438,64 +438,64 @@ const Devices = () => {
|
|||||||
|
|
||||||
<div className="space-y-3 text-sm">
|
<div className="space-y-3 text-sm">
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Device ID:</span>
|
<span className="font-medium text-gray-700">{t('devices.deviceId')}:</span>
|
||||||
<span className="text-gray-900">{selectedDevice.id}</span>
|
<span className="text-gray-900">{selectedDevice.id}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Name:</span>
|
<span className="font-medium text-gray-700">{t('devices.name')}:</span>
|
||||||
<span className="text-gray-900">{selectedDevice.name || 'Unnamed'}</span>
|
<span className="text-gray-900">{selectedDevice.name || t('devices.unnamed')}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Status:</span>
|
<span className="font-medium text-gray-700">{t('devices.status')}:</span>
|
||||||
<span className={`px-2 py-1 rounded-full text-xs font-medium ${
|
<span className={`px-2 py-1 rounded-full text-xs font-medium ${
|
||||||
getStatusColor(selectedDevice.stats?.status)
|
getStatusColor(selectedDevice.stats?.status)
|
||||||
}`}>
|
}`}>
|
||||||
{selectedDevice.stats?.status || 'Unknown'}
|
{selectedDevice.stats?.status ? t(`devices.${selectedDevice.stats.status}`) : t('devices.unknown')}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Approved:</span>
|
<span className="font-medium text-gray-700">{t('devices.approved')}:</span>
|
||||||
<span className={`px-2 py-1 rounded-full text-xs font-medium ${
|
<span className={`px-2 py-1 rounded-full text-xs font-medium ${
|
||||||
selectedDevice.is_approved ? 'bg-green-100 text-green-800' : 'bg-yellow-100 text-yellow-800'
|
selectedDevice.is_approved ? 'bg-green-100 text-green-800' : 'bg-yellow-100 text-yellow-800'
|
||||||
}`}>
|
}`}>
|
||||||
{selectedDevice.is_approved ? 'Yes' : 'Pending'}
|
{selectedDevice.is_approved ? t('devices.yes') : t('devices.pending')}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{selectedDevice.location_description && (
|
{selectedDevice.location_description && (
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Location:</span>
|
<span className="font-medium text-gray-700">{t('devices.location')}:</span>
|
||||||
<span className="text-gray-900 text-right">{selectedDevice.location_description}</span>
|
<span className="text-gray-900 text-right">{selectedDevice.location_description}</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{(selectedDevice.geo_lat && selectedDevice.geo_lon) && (
|
{(selectedDevice.geo_lat && selectedDevice.geo_lon) && (
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Coordinates:</span>
|
<span className="font-medium text-gray-700">{t('devices.coordinates')}:</span>
|
||||||
<span className="text-gray-900">{selectedDevice.geo_lat}, {selectedDevice.geo_lon}</span>
|
<span className="text-gray-900">{selectedDevice.geo_lat}, {selectedDevice.geo_lon}</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{selectedDevice.last_heartbeat && (
|
{selectedDevice.last_heartbeat && (
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Last Heartbeat:</span>
|
<span className="font-medium text-gray-700">{t('devices.lastHeartbeat')}:</span>
|
||||||
<span className="text-gray-900">{format(new Date(selectedDevice.last_heartbeat), 'MMM dd, yyyy HH:mm')}</span>
|
<span className="text-gray-900">{format(new Date(selectedDevice.last_heartbeat), 'MMM dd, yyyy HH:mm')}</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{selectedDevice.firmware_version && (
|
{selectedDevice.firmware_version && (
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Firmware:</span>
|
<span className="font-medium text-gray-700">{t('devices.firmware')}:</span>
|
||||||
<span className="text-gray-900">{selectedDevice.firmware_version}</span>
|
<span className="text-gray-900">{selectedDevice.firmware_version}</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{selectedDevice.stats && (
|
{selectedDevice.stats && (
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Detections (24h):</span>
|
<span className="font-medium text-gray-700">{t('devices.detections24h')}:</span>
|
||||||
<span className={`font-medium ${
|
<span className={`font-medium ${
|
||||||
selectedDevice.stats.detections_24h > 0 ? 'text-red-600' : 'text-green-600'
|
selectedDevice.stats.detections_24h > 0 ? 'text-red-600' : 'text-green-600'
|
||||||
}`}>
|
}`}>
|
||||||
@@ -506,7 +506,7 @@ const Devices = () => {
|
|||||||
|
|
||||||
{selectedDevice.created_at && (
|
{selectedDevice.created_at && (
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="font-medium text-gray-700">Created:</span>
|
<span className="font-medium text-gray-700">{t('alerts.created')}:</span>
|
||||||
<span className="text-gray-900">{format(new Date(selectedDevice.created_at), 'MMM dd, yyyy HH:mm')}</span>
|
<span className="text-gray-900">{format(new Date(selectedDevice.created_at), 'MMM dd, yyyy HH:mm')}</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -521,7 +521,7 @@ const Devices = () => {
|
|||||||
}}
|
}}
|
||||||
className="flex-1 bg-green-100 text-green-700 py-2 px-3 rounded hover:bg-green-200 transition-colors text-sm font-medium"
|
className="flex-1 bg-green-100 text-green-700 py-2 px-3 rounded hover:bg-green-200 transition-colors text-sm font-medium"
|
||||||
>
|
>
|
||||||
✓ Approve
|
✓ {t('devices.approve')}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,13 @@ const translations = {
|
|||||||
signalStrong: 'Strong',
|
signalStrong: 'Strong',
|
||||||
signalGood: 'Good',
|
signalGood: 'Good',
|
||||||
signalWeak: 'Weak',
|
signalWeak: 'Weak',
|
||||||
signalLost: 'Lost'
|
signalLost: 'Lost',
|
||||||
|
deviceDetails: 'Device Details',
|
||||||
|
unnamed: 'Unnamed',
|
||||||
|
yes: 'Yes',
|
||||||
|
lastHeartbeat: 'Last Heartbeat',
|
||||||
|
approve: 'Approve',
|
||||||
|
close: 'Close'
|
||||||
},
|
},
|
||||||
alerts: {
|
alerts: {
|
||||||
title: 'Alert Management',
|
title: 'Alert Management',
|
||||||
@@ -283,7 +289,31 @@ const translations = {
|
|||||||
showAllDevices: 'Show All Devices',
|
showAllDevices: 'Show All Devices',
|
||||||
showDetections: 'Show Detections',
|
showDetections: 'Show Detections',
|
||||||
filterByTime: 'Filter by Time',
|
filterByTime: 'Filter by Time',
|
||||||
realTimeUpdates: 'Real-time Updates'
|
realTimeUpdates: 'Real-time Updates',
|
||||||
|
deviceStatus: 'Device Status',
|
||||||
|
connectionStatus: 'Connection Status',
|
||||||
|
lastHeartbeat: 'Last Heartbeat',
|
||||||
|
recentDetections: 'Recent Detections',
|
||||||
|
systemStatus: 'System Status',
|
||||||
|
emergencyAlert: 'Emergency Alert',
|
||||||
|
criticalThreat: 'Critical Threat',
|
||||||
|
immediateAction: 'Immediate Action Required',
|
||||||
|
multipleContacts: 'Multiple Contacts',
|
||||||
|
noDevicesFound: 'No devices found',
|
||||||
|
mapLegend: 'Map Legend',
|
||||||
|
deviceDetecting: 'Device Detecting',
|
||||||
|
droneDetectionRings: 'Drone Detection Rings',
|
||||||
|
ringsDescription: 'Rings show estimated detection range based on RSSI',
|
||||||
|
orlanMilitary: 'Orlan/Military (Always Critical)',
|
||||||
|
closeRange: 'Close Range (>-60dBm)',
|
||||||
|
mediumRange: 'Medium Range (-60 to -70dBm)',
|
||||||
|
farRange: 'Far Range (<-70dBm)',
|
||||||
|
multipleDrones: 'Multiple Drones at Same Detector',
|
||||||
|
differentColors: 'Different colors to distinguish drones',
|
||||||
|
differentPatterns: 'Different dash patterns',
|
||||||
|
droneLabels: 'Drone ID labels shown',
|
||||||
|
positionOffsets: 'Slight position offsets for visibility',
|
||||||
|
ringSize: 'Ring size = estimated distance from detector'
|
||||||
},
|
},
|
||||||
app: {
|
app: {
|
||||||
title: 'UAM-ILS Drone Detection System',
|
title: 'UAM-ILS Drone Detection System',
|
||||||
@@ -482,7 +512,13 @@ const translations = {
|
|||||||
signalStrong: 'Stark',
|
signalStrong: 'Stark',
|
||||||
signalGood: 'Bra',
|
signalGood: 'Bra',
|
||||||
signalWeak: 'Svag',
|
signalWeak: 'Svag',
|
||||||
signalLost: 'Förlorad'
|
signalLost: 'Förlorad',
|
||||||
|
deviceDetails: 'Enhetsdetaljer',
|
||||||
|
unnamed: 'Namnlös',
|
||||||
|
yes: 'Ja',
|
||||||
|
lastHeartbeat: 'Senaste pulsslag',
|
||||||
|
approve: 'Godkänn',
|
||||||
|
close: 'Stäng'
|
||||||
},
|
},
|
||||||
alerts: {
|
alerts: {
|
||||||
title: 'Larmhantering',
|
title: 'Larmhantering',
|
||||||
@@ -624,7 +660,31 @@ const translations = {
|
|||||||
showAllDevices: 'Visa alla enheter',
|
showAllDevices: 'Visa alla enheter',
|
||||||
showDetections: 'Visa detekteringar',
|
showDetections: 'Visa detekteringar',
|
||||||
filterByTime: 'Filtrera efter tid',
|
filterByTime: 'Filtrera efter tid',
|
||||||
realTimeUpdates: 'Realtidsuppdateringar'
|
realTimeUpdates: 'Realtidsuppdateringar',
|
||||||
|
deviceStatus: 'Enhetsstatus',
|
||||||
|
connectionStatus: 'Anslutningsstatus',
|
||||||
|
lastHeartbeat: 'Senaste pulsslag',
|
||||||
|
recentDetections: 'Senaste detekteringar',
|
||||||
|
systemStatus: 'Systemstatus',
|
||||||
|
emergencyAlert: 'Nödlarm',
|
||||||
|
criticalThreat: 'Kritiskt hot',
|
||||||
|
immediateAction: 'Omedelbar åtgärd krävs',
|
||||||
|
multipleContacts: 'Flera kontakter',
|
||||||
|
noDevicesFound: 'Inga enheter hittades',
|
||||||
|
mapLegend: 'Kartteckenförklaring',
|
||||||
|
deviceDetecting: 'Enhet detekterar',
|
||||||
|
droneDetectionRings: 'Drönardetekteringsringar',
|
||||||
|
ringsDescription: 'Ringar visar uppskattad detekteringsräckvidd baserat på RSSI',
|
||||||
|
orlanMilitary: 'Orlan/Militär (Alltid kritisk)',
|
||||||
|
closeRange: 'Närområde (>-60dBm)',
|
||||||
|
mediumRange: 'Medelområde (-60 till -70dBm)',
|
||||||
|
farRange: 'Långdistans (<-70dBm)',
|
||||||
|
multipleDrones: 'Flera drönare vid samma detektor',
|
||||||
|
differentColors: 'Olika färger för att skilja drönare åt',
|
||||||
|
differentPatterns: 'Olika streckmönster',
|
||||||
|
droneLabels: 'Drönar-ID-etiketter visas',
|
||||||
|
positionOffsets: 'Lätta positionsförskjutningar för synlighet',
|
||||||
|
ringSize: 'Ringstorlek = uppskattad distans från detektor'
|
||||||
},
|
},
|
||||||
app: {
|
app: {
|
||||||
title: 'UAM-ILS Drönardetekteringssystem',
|
title: 'UAM-ILS Drönardetekteringssystem',
|
||||||
|
|||||||
Reference in New Issue
Block a user