Fix jwt-token

This commit is contained in:
2025-09-19 14:39:00 +02:00
parent 348b489b0e
commit 9145a9f4d9
2 changed files with 79 additions and 19 deletions

View File

@@ -426,7 +426,7 @@ const Devices = () => {
<div className="mt-3">
<div className="flex items-center justify-between mb-4">
<h3 className="text-lg font-medium text-gray-900">
Device Details
{t('devices.deviceDetails')}
</h3>
<button
onClick={() => setShowDetailsModal(false)}
@@ -438,64 +438,64 @@ const Devices = () => {
<div className="space-y-3 text-sm">
<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>
</div>
<div className="flex justify-between">
<span className="font-medium text-gray-700">Name:</span>
<span className="text-gray-900">{selectedDevice.name || 'Unnamed'}</span>
<span className="font-medium text-gray-700">{t('devices.name')}:</span>
<span className="text-gray-900">{selectedDevice.name || t('devices.unnamed')}</span>
</div>
<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 ${
getStatusColor(selectedDevice.stats?.status)
}`}>
{selectedDevice.stats?.status || 'Unknown'}
{selectedDevice.stats?.status ? t(`devices.${selectedDevice.stats.status}`) : t('devices.unknown')}
</span>
</div>
<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 ${
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>
</div>
{selectedDevice.location_description && (
<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>
</div>
)}
{(selectedDevice.geo_lat && selectedDevice.geo_lon) && (
<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>
</div>
)}
{selectedDevice.last_heartbeat && (
<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>
</div>
)}
{selectedDevice.firmware_version && (
<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>
</div>
)}
{selectedDevice.stats && (
<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 ${
selectedDevice.stats.detections_24h > 0 ? 'text-red-600' : 'text-green-600'
}`}>
@@ -506,7 +506,7 @@ const Devices = () => {
{selectedDevice.created_at && (
<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>
</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"
>
Approve
{t('devices.approve')}
</button>
)}

View File

@@ -141,7 +141,13 @@ const translations = {
signalStrong: 'Strong',
signalGood: 'Good',
signalWeak: 'Weak',
signalLost: 'Lost'
signalLost: 'Lost',
deviceDetails: 'Device Details',
unnamed: 'Unnamed',
yes: 'Yes',
lastHeartbeat: 'Last Heartbeat',
approve: 'Approve',
close: 'Close'
},
alerts: {
title: 'Alert Management',
@@ -283,7 +289,31 @@ const translations = {
showAllDevices: 'Show All Devices',
showDetections: 'Show Detections',
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: {
title: 'UAM-ILS Drone Detection System',
@@ -482,7 +512,13 @@ const translations = {
signalStrong: 'Stark',
signalGood: 'Bra',
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: {
title: 'Larmhantering',
@@ -624,7 +660,31 @@ const translations = {
showAllDevices: 'Visa alla enheter',
showDetections: 'Visa detekteringar',
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: {
title: 'UAM-ILS Drönardetekteringssystem',