mirror of
https://github.com/MeshTender/MeshTender.git
synced 2026-09-17 00:44:20 +00:00
164 lines
7.5 KiB
HTML
164 lines
7.5 KiB
HTML
{{define "title"}}{{.Repeater.Name}} · MeshTender{{end}}
|
|
{{define "header"}}
|
|
<div class="row g-2 align-items-center">
|
|
<div class="col">
|
|
<div class="page-pretitle">Repeater{{if not .IsOwner}} · shared by {{.Repeater.OwnerName}}{{end}}</div>
|
|
<h2 class="page-title">{{.Repeater.Name}}</h2>
|
|
</div>
|
|
<div class="col-auto ms-auto d-print-none">
|
|
<div class="btn-list">
|
|
<a class="btn btn-primary" href="/repeaters/{{.Repeater.PublicID}}/console">{{template "icon-terminal" "me-1"}}Console</a>
|
|
{{if .IsOwner}}
|
|
<div class="dropdown">
|
|
<button class="btn dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">Manage</button>
|
|
<div class="dropdown-menu dropdown-menu-end">
|
|
<a class="dropdown-item" href="/repeaters/{{.Repeater.PublicID}}/edit">{{template "icon-pencil" "dropdown-item-icon"}}Edit details</a>
|
|
<a class="dropdown-item" href="/repeaters/{{.Repeater.PublicID}}/confirm">{{template "icon-antenna" "dropdown-item-icon"}}Confirm access</a>
|
|
<a class="dropdown-item" href="/repeaters/{{.Repeater.PublicID}}/log">{{template "icon-list" "dropdown-item-icon"}}Command log</a>
|
|
<a class="dropdown-item" href="/repeaters/{{.Repeater.PublicID}}/share">{{template "icon-share" "dropdown-item-icon"}}Sharing</a>
|
|
<div class="dropdown-divider"></div>
|
|
<a class="dropdown-item text-danger" href="/repeaters/{{.Repeater.PublicID}}/delete">{{template "icon-trash" "dropdown-item-icon"}}Delete repeater</a>
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<a class="btn" href="/repeaters/{{.Repeater.PublicID}}/confirm">Confirm</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{define "content"}}
|
|
{{if .Error}}<div class="alert alert-danger">{{.Error}}</div>{{end}}
|
|
|
|
<div class="row row-cards">
|
|
<!-- Left column -->
|
|
<div class="col-lg-8">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h3 class="card-title">Details</h3>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="mb-3">
|
|
<div class="form-label">Public key</div>
|
|
<code class="pk">{{.Repeater.PublicKeyHex}}</code>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<div class="form-label">Radio settings</div>
|
|
<div class="font-monospace">{{.Radio}}</div>
|
|
</div>
|
|
|
|
<div class="datagrid">
|
|
<div class="datagrid-item">
|
|
<div class="datagrid-title">Status</div>
|
|
<div class="datagrid-content">
|
|
{{if .Repeater.Confirmed}}
|
|
{{if .Repeater.Corroborated}}<span class="badge bg-success-lt" title="Independently reached by {{range $i, $n := .Repeater.Corroborators}}{{if $i}}, {{end}}{{$n}}{{end}}">Corroborated</span>
|
|
{{else if .Repeater.SelfConfirmed}}<span class="badge bg-azure-lt" title="You reached it from your own modem; no one else has corroborated yet">Self-confirmed</span>
|
|
{{else}}<span class="badge bg-success-lt">Confirmed</span>{{end}}
|
|
{{else}}<span class="badge bg-yellow-lt" title="No one has reached this repeater through MeshTender yet">Unconfirmed</span>{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="datagrid-item">
|
|
<div class="datagrid-title">Access level</div>
|
|
<div class="datagrid-content">
|
|
{{if .Repeater.AccessKnown}}{{if .Repeater.IsAdmin}}<span class="badge bg-success-lt">admin</span>{{else}}<span class="badge bg-warning-lt">guest only</span>{{end}}{{else}}<span class="text-secondary">unknown</span>{{end}}
|
|
</div>
|
|
</div>
|
|
{{if not .IsOwner}}
|
|
<div class="datagrid-item">
|
|
<div class="datagrid-title">Owner</div>
|
|
<div class="datagrid-content">{{.Repeater.OwnerName}}</div>
|
|
</div>
|
|
{{end}}
|
|
<div class="datagrid-item">
|
|
<div class="datagrid-title">Added</div>
|
|
<div class="datagrid-content">{{.Repeater.CreatedAt.Format "Jan 2, 2006"}}</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{if and .IsOwner .Repeater.Confirmed .Repeater.AccessKnown (not .Repeater.IsAdmin)}}
|
|
<div class="alert alert-warning mt-3 mb-0">
|
|
MeshTender only has <strong>guest</strong> access here. Guest is available to anyone with a blank password, so there's no point operating at this level — re-run <code>setperm <your key> 3</code> on the repeater to grant admin, then re-test.
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
{{if .IsOwner}}
|
|
<div class="card mt-3">
|
|
<div class="card-header">
|
|
<h3 class="card-title">Recent activity</h3>
|
|
<div class="card-actions"><a href="/repeaters/{{.Repeater.PublicID}}/log" class="btn btn-sm">Full log</a></div>
|
|
</div>
|
|
{{if .Recent}}
|
|
<div class="table-responsive">
|
|
<table class="table table-vcenter card-table">
|
|
<thead><tr><th>When</th><th>Command</th><th>By</th><th></th></tr></thead>
|
|
<tbody>
|
|
{{range .Recent}}
|
|
<tr>
|
|
<td class="text-secondary text-nowrap">{{.SentAt.Format "Jan 2, 15:04"}}</td>
|
|
<td><code>{{.CommandText}}</code></td>
|
|
<td class="text-secondary">{{.SenderName}}</td>
|
|
<td>{{if .AckReceived}}<span class="badge bg-success-lt">reply</span>{{else}}<span class="badge bg-yellow-lt">no reply</span>{{end}}</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{{else}}
|
|
<div class="card-body"><p class="text-secondary mb-0">No commands have been run on this repeater yet. Open the console to send one.</p></div>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
|
|
<!-- Right column -->
|
|
<div class="col-lg-4">
|
|
{{if .Repeater.Latitude}}
|
|
<div class="card">
|
|
<div class="card-header"><h3 class="card-title">Location</h3></div>
|
|
<div class="card-body p-2">
|
|
<link rel="stylesheet" href="/static/leaflet.css">
|
|
<div id="map" style="height:240px" role="region" aria-label="Map of this repeater's location"></div>
|
|
<script src="/static/leaflet.js"></script>
|
|
<script src="/static/meshmap.js"></script>
|
|
<script>
|
|
meshMap('map', [{name: {{.Repeater.Name}}, lat: {{.Repeater.Latitude}}, lon: {{.Repeater.Longitude}}}]);
|
|
</script>
|
|
<div class="text-secondary small mt-2 text-center">{{template "icon-map-pin" "me-1"}}<span class="font-monospace">{{.Repeater.Latitude}}, {{.Repeater.Longitude}}</span></div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
|
|
{{if .IsOwner}}
|
|
<div class="card {{if .Repeater.Latitude}}mt-3{{end}}">
|
|
<div class="card-header">
|
|
<h3 class="card-title">Organizations</h3>
|
|
<div class="card-actions"><a href="/repeaters/{{.Repeater.PublicID}}/share" class="btn btn-sm">Manage</a></div>
|
|
</div>
|
|
{{if .Orgs}}
|
|
<div class="list-group list-group-flush">
|
|
{{range .Orgs}}
|
|
<div class="list-group-item d-flex align-items-center gap-2">
|
|
<span class="text-secondary">{{template "icon-world" ""}}</span>
|
|
<div class="flex-fill text-truncate">
|
|
<span class="fw-bold">{{.OrgName}}</span>
|
|
<div class="text-secondary small">consented to v{{.ConsentedVersion}}</div>
|
|
</div>
|
|
{{if gt .CurrentVersion .ConsentedVersion}}<span class="badge bg-warning-lt">re-consent</span>{{end}}
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
{{else}}
|
|
<div class="card-body"><p class="text-secondary mb-0">Not contributed to any organization.</p></div>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
<a class="back-link mt-3" href="/repeaters">{{template "icon-arrow-left" "me-1"}}All repeaters</a>
|
|
{{end}}
|