Gatelogic
{{ loginError }}
Gatelogic
{{ currentUser.username ? currentUser.username[0].toUpperCase() : 'U' }}
{{ currentUser.username }}
{{ currentUser.is_super_admin ? 'Super Admin' : currentUser.role }}

Dashboard Devices Allowlist Management Event Log User Management Tenant Management System Settings

v{{ serverStatus.version || '1.0.0' }} Online Offline

Devices

{{ stats.deviceCount }}

{{ stats.onlineDevices }} online

License Plates

{{ stats.plateCount }}

Users

{{ stats.userCount }}

System Status

{{ systemStatusText }}

Device Status

No devices registered yet.
Device Status Last Heartbeat Actions
{{ device.device_name }}
{{ device.device_location || 'Unknown location' }}
Online Offline {{ formatDate(device.last_heartbeat) || 'Never' }}

Recent Events

No events recorded yet.
  • {{ eventDescription(event) }}

    {{ formatDate(event.timestamp) }}

All Devices

No devices registered yet.
{{ device.device_name }}
{{ device.device_location || 'Unknown location' }}
Online Offline DISABLED PAYMENT SUSPENDED {{ gateChipLabel(device) }}
Type
{{ device.device_type }}
Tenant
{{ getTenantName(device.tenant_id) }}
Last heartbeat
{{ formatDate(device.last_heartbeat) || 'Never' }}

Device Allowlist Management

View All Tenants

Select Tenant

{{ tenant.name }}

{{ tenant.domain }}

{{ tenant.device_count || 0 }} devices
{{ tenant.total_plates || 0 }} plates
{{ tenant.user_count || 0 }} users
No tenants available for allowlist management.

Select Device

{{ selectedAllowlistTenant.name }}

{{ device.device_name }}

{{ device.device_location || 'No location' }}

{{ device.tenant_name }}

{{ device.plate_count || 0 }} plates
{{ device.status || 'offline' }}
No devices available for allowlist management.

{{ selectedAllowlistDevice.device_name }} Allowlist

{{ selectedAllowlistDevice.device_location }}

{{ deviceAllowlist.length }} plates
Personal: {{ deviceQuotas.personal_used || 0 }}/{{ deviceQuotas.personal_limit || 0 }} | Guest: {{ deviceQuotas.guest_used || 0 }}/{{ deviceQuotas.guest_limit || 0 }}
No license plates in this device's allowlist yet.
{{ plate.plate }} {{ plate.plate_category }}
Make
{{ plate.make || 'Any' }}
Color
{{ plate.color || 'Any' }}
Added by
{{ plate.added_by_name || plate.added_by_username || 'Unknown' }}
Expires
{{ plate.expires_at ? formatDate(plate.expires_at) : 'Never' }}
Expires soon

Event Log

{{ eventStats.total_events ?? eventStats.total ?? '–' }}
Total events
{{ eventStats.events_last_24h ?? eventStats.last_24h ?? '–' }}
Last 24h
{{ eventStats.events_last_7d ?? eventStats.last_7d ?? '–' }}
Last 7d
{{ Object.keys(eventStats.events_by_type ?? eventStats.by_type ?? {}).length }}
Distinct types
No events found.
Event Type Description User Tenant Device Timestamp Actions
{{ formatEventType(event.event_type) }}
{{ eventDescription(event) }}
{{ event.details.user_info.username || 'System' }}
{{ event.details.user_info.full_name }}
{{ event.details?.user_info?.username || 'System' }}
{{ event.details.tenant_info.tenant_name || 'Unknown' }}
N/A
{{ getDeviceName(event.device_id) || 'N/A' }} {{ formatDate(event.timestamp) }}

User Management

No users found.
{{ user.username ? user.username[0].toUpperCase() : 'U' }}
{{ user.username }}
{{ user.full_name || 'No display name' }}
Admin User Super Admin Active Disabled
Email
{{ user.email || 'N/A' }}
Tenant
{{ user.tenant_name || 'Unknown' }}

Tenant Management

No tenants found.
{{ tenant.name }} {{ tenant.disabled ? 'Disabled' : 'Active' }}
{{ tenant.domain }}
Users limit
{{ tenant.user_limit }}
Devices limit
{{ tenant.device_limit }}
Allowlist limit
{{ tenant.allowlist_limit }}
Created
{{ new Date(tenant.created_at).toLocaleDateString() }}

System Settings

System Information

Server Version

{{ serverStatus.version || 'Unknown' }}

Status

{{ systemStatusText }}

Last Updated

{{ formatDate(serverStatus.last_updated) || 'Unknown' }}

Uptime

{{ serverStatus.uptime || 'Unknown' }}

{{ viewingCommand.command_type }} {{ formatDate(viewingCommand.completed_at || viewingCommand.created_at) }}

Success Failed {{ viewingCommand.status }} {{ viewingCommand.result?.message || viewingCommand.error_message }}
{{ Array.isArray(viewingCommand.result.data.logs) ? viewingCommand.result.data.logs.length : '?' }} lines · {{ viewingCommand.result.data.log_type }} · requested {{ viewingCommand.parameters.log_type }}/{{ viewingCommand.parameters.lines }}
{{ Array.isArray(viewingCommand.result.data.logs) ? viewingCommand.result.data.logs.join('\n') : viewingCommand.result.data.logs }}
{{ viewingCommand.result.data.width }}×{{ viewingCommand.result.data.height }} · {{ viewingCommand.result.data.format || 'jpeg' }} · Cam {{ (viewingCommand.result.data.camera_id ?? 0) + 1 }}
Camera snapshot
{{ viewingCommand.result.data.count || viewingCommand.result.data.events.length }} events (truncated)
Time Type Plate Granted
{{ ev.ts ? new Date(ev.ts * 1000).toLocaleString() : '-' }} {{ ev.type || '-' }} {{ ev.plate || '-' }} -
{{ name }} {{ leg.passed ? '✓ pass' : '✗ fail' }}
{{ JSON.stringify(leg, null, 2) }}
schema {{ viewingCommand.result.data.schema_version || '?' }} (secrets stripped server-side)
{{ JSON.stringify(viewingCommand.result.data.config, null, 2) }}
{{ viewingCommand.result.data.backups.length }} backup(s)
Filename Size Modified
{{ b.name }} {{ formatBytes(b.size_bytes) }} {{ b.mtime ? new Date(b.mtime * 1000).toLocaleString() : '-' }}

Result data

{{ JSON.stringify(viewingCommand.result?.data || viewingCommand.result || {}, null, 2) }}
Raw command record
{{ JSON.stringify(viewingCommand, null, 2) }}

{{ notification.title }}

{{ notification.message }}