Dashboard
โ Live ยท {{ liveClock }}
{{ s.site_naam }}
Agents present
{{ s.agents_present ?? 0 }}
Posts manned
{{ s.posts_manned }}/{{ s.posts_total }}
Logs today
{{ s.logs_today }}
No sites configured
โ Posts without agents
| Post | Site | Status |
|---|---|---|
| {{ prefixById(p.id) }}{{ p.naam }} | {{ p.site_naam || '' }} | Unmanned |
โ Agents not present
| Number | Name | Section | Status |
|---|---|---|---|
| {{ a.nummer }} | {{ a.voornaam }} {{ a.naam }} | {{ a.sectie || '' }} | Not present |
๐ Last activity
| Timestamp | Agent | Post | Site | Action |
|---|---|---|---|---|
| {{ formatDateTime(l.created_at) }} |
{{ l.agent_voornaam }} {{ l.agent_naam }}
{{ l.agent_nummer }}
|
{{ typePrefix(l.post_type) }}{{ l.post_naam || '' }} | {{ l.site_naam || '' }} | {{ l.actie }} |
No activity yet |
||||
Sites
Buildings and locations
| Name{{ sortIcon(siteFilter,'naam') }} | Address{{ sortIcon(siteFilter,'adres') }} | Status | Posts | |
|---|---|---|---|---|
| {{ s.naam }} | {{ s.adres || '' }} | {{ s.actief ? 'Active' : 'Inactive' }} | {{ posts.filter(p=>p.site_id===s.id&&p.actief).length }} |
|
{{ sites.length ? 'No matches' : 'No sites' }} | ||||
{{ postPageType==='shift' ? 'Shift registrations' : 'Security posts' }}
{{ postPageType==='shift' ? 'Shift start/stop registration points' : 'Attendance posts' }}
| Name{{ sortIcon(postFilter,'naam') }} | Site{{ sortIcon(postFilter,'site') }} | Verifications | Actions | Status{{ sortIcon(postFilter,'actief') }} | |
|---|---|---|---|---|---|
| {{ typePrefix(p.post_type) }} {{ p.naam }} โ no device | {{ p.site ? p.site.naam : siteNaam(p.site_id) }} | None ๐ Cert ๐ Location ๐ Passkey | {{ a }} | {{ p.actief ? 'Active' : 'Inactive' }} |
|
None yet | |||||
Devices
SPOTTR hardware
| Device name{{ sortIcon(deviceFilter,'device_name') }} | Post{{ sortIcon(deviceFilter,'post') }} | Site | Status{{ sortIcon(deviceFilter,'actief') }} | Battery{{ sortIcon(deviceFilter,'battery_pct') }} | TOTP fails (7d){{ sortIcon(deviceFilter,'totp_fails') }} | Last seen{{ sortIcon(deviceFilter,'last_seen') }} | Enrolled{{ sortIcon(deviceFilter,'enrolled_at') }} | |
|---|---|---|---|---|---|---|---|---|
| {{ d.device_name }} | {{ prefixById(d.post_id) }}{{ d.post ? d.post.naam : '' }} | {{ d.post?.site ? d.post.site.naam : '' }} | {{ d.actief ? 'Active' : 'Inactive' }} | ๐ {{ d.battery_pct }}% โ | โ {{ d.totp_fails }} 0 | {{ d.last_seen ? formatDateTime(d.last_seen) : 'โ' }} | {{ formatDate(d.enrolled_at) }} |
|
{{ devices.length ? 'No matches' : 'No devices' }} | ||||||||
Agents
Security personnel
| Number{{ sortIcon(agentFilter,'nummer') }} | Name{{ sortIcon(agentFilter,'naam') }} | Site{{ sortIcon(agentFilter,'site') }} | Unit{{ sortIcon(agentFilter,'sectie') }} | Certificate | Cert expiry{{ sortIcon(agentFilter,'cert_expiry') }} | Status{{ sortIcon(agentFilter,'actief') }} | |
|---|---|---|---|---|---|---|---|
| {{ a.nummer }} | {{ a.voornaam }} {{ (a.naam||'').toUpperCase() }} | {{ a.site_id ? siteNaam(a.site_id) : '' }} | {{ a.sectie || '' }} | โ Linked No cert | {{ formatDate(a.cert_expiry) }} Expired {{ certDaysLeft(a.cert_expiry) }}d left โ | {{ a.actief ? 'Active' : 'Inactive' }} | |
{{ agents.length ? 'No matches' : 'No agents' }} | |||||||
Activity Log
{{ logsData.totaal }} records
| Timestamp | Agent | Section | Post | Site | Action | TOTP | Location | Passkey | Ref |
|---|---|---|---|---|---|---|---|---|---|
| {{ formatDateTime(l.created_at) }} |
{{ l.agent_voornaam }} {{ l.agent_naam }}
{{ l.agent_nummer }}
|
{{ l.agent_sectie || '' }} | {{ typePrefix(l.post_type) }}{{ l.post_naam || '' }} | {{ l.site_naam || '' }} | {{ l.actie }} | {{ l.totp_ok ? 'โ' : 'โ' }} | โ {{ l.locatie_afstand }}m โ {{ l.locatie_afstand }}m โ | โ โ โ | {{ l.id.substring(0,8).toUpperCase() }} |
No log entries | |||||||||
{{ logFilter.offset+1 }}โ{{ Math.min(logFilter.offset+100,logsData.totaal) }} of {{ logsData.totaal }}
Security posts
โ Live ยท {{ liveClock }}
| Post | Site | Agents present |
|---|---|---|
| {{ prefixById(g.post_id) }}{{ g.post_naam }} {{ g.agents.length }} | {{ g.site_naam }} |
{{ a.agent_voornaam }} {{ (a.agent_naam||'').toUpperCase() }} {{ a.agent_nummer }}
{{ a.agent_sectie }}
{{ formatDateTime(a.since) }}
|
No agents present | ||
Patrols
Routes built from ordered stops
| Name | Site | Stops | Time limit | Status | |
|---|---|---|---|---|---|
| {{ p.naam }} | {{ p.site_naam || 'โ' }} | {{ p.stop_count }} | {{ p.time_limit_min ? p.time_limit_min + ' min' : 'โ' }} | {{ p.actief ? 'Active' : 'Inactive' }} |
|
No patrols | |||||
Patrol stops
Reusable QR points and their missions โ add these to a patrol above
| Stop | Site | Verifications | Missions | Status | |
|---|---|---|---|---|---|
| {{ typePrefix(p.post_type) }} {{ p.naam }} โ no device | {{ p.site ? p.site.naam : siteNaam(p.site_id) }} | None ๐ Cert ๐ Location ๐ Passkey | {{ p.mission_count ?? 'โ' }} | {{ p.actief ? 'Active' : 'Inactive' }} |
|
No stops yet | |||||
Shift registrations
โ Live ยท {{ liveClock }}
On duty now {{ shiftReport.on_duty.length }}
| Agent | Shift point | Since | Duration |
|---|---|---|---|
| {{ s.agent_naam }} | {{ s.post_naam }} | {{ formatDateTime(s.start) }} | {{ liveDuration(s.start) }} |
Nobody on shift | |||
| Agent | Shift point | Start | Stop | Duration |
|---|---|---|---|---|
| {{ s.agent_naam }} | {{ s.post_naam }} | {{ formatDateTime(s.start) }} | {{ formatDateTime(s.end) }} On shift | {{ fmtDuration(s.duration_min) }}ongoing |
No shift registrations | ||||
Patrols
โ Live ยท {{ liveClock }}
| Patrol | Agent | Progress | Status | Started | Ended | |
|---|---|---|---|---|---|---|
| {{ r.patrol_naam || 'โ' }} | {{ r.agent_naam || 'โ' }} | {{ r.expected_index }}/{{ r.stops_total }} | {{ r.status }} | {{ formatDateTime(r.started_at) }} | {{ r.ended_at ? formatDateTime(r.ended_at) : 'โ' }} | |
No patrol runs | ||||||
Users
Admin panel accounts & roles
| Username | Role | Site scope | Status | |
|---|---|---|---|---|
| {{ u.username }} | {{ u.role }} | All All sites {{ u.sites.map(id=>siteNaam(id)).filter(Boolean).join(', ') }} | {{ u.actief ? 'Active' : 'Inactive' }} |
|
No users | ||||
Settings
Data retention & maintenance
๐๏ธ Data retention
Activity logs (and their scan data) older than this period are automatically deleted every night at 03:00 UTC.
Set the value to 0 to keep logs forever.
โ Saved
Current policy:
keep last {{ settings.log_retention_value }} {{ settings.log_retention_unit }}
keep forever (no automatic deletion)
๐๏ธ Manual cleanup
Immediately delete all activity logs (and their scan data) recorded up to now.
This cannot be undone.
{{ purgeResult }}
