mirror of
https://github.com/airlabspl/uptimemonitor.git
synced 2025-08-14 12:19:19 +02:00
249 lines
12 KiB
HTML
249 lines
12 KiB
HTML
{{ define "title" }}
|
|
{{ .Monitor.Domain }}
|
|
{{end}}
|
|
|
|
{{ define "monitor_list" }}
|
|
<div class="grid gap-4">
|
|
{{ range .Monitors }}
|
|
<a href="{{ .URI }}" hx-boost preload>
|
|
<div class="card card-border p-4 flex flex-col gap-4">
|
|
<h2 class="card-title text-sm">
|
|
<div class="font-semibold flex gap-1.5 items-center flex-1 ">
|
|
{{ if .Secure }}
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-4!">
|
|
<path fill-rule="evenodd"
|
|
d="M12 1.5a5.25 5.25 0 0 0-5.25 5.25v3a3 3 0 0 0-3 3v6.75a3 3 0 0 0 3 3h10.5a3 3 0 0 0 3-3v-6.75a3 3 0 0 0-3-3v-3c0-2.9-2.35-5.25-5.25-5.25Zm3.75 8.25v-3a3.75 3.75 0 1 0-7.5 0v3h7.5Z"
|
|
clip-rule="evenodd" />
|
|
</svg>
|
|
{{ else }}
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"
|
|
class="size-4! opacity-50">
|
|
<path
|
|
d="M18 1.5c2.9 0 5.25 2.35 5.25 5.25v3.75a.75.75 0 0 1-1.5 0V6.75a3.75 3.75 0 1 0-7.5 0v3a3 3 0 0 1 3 3v6.75a3 3 0 0 1-3 3H3.75a3 3 0 0 1-3-3v-6.75a3 3 0 0 1 3-3h9v-3c0-2.9 2.35-5.25 5.25-5.25Z" />
|
|
</svg>
|
|
{{ end }}
|
|
<span class="truncate">{{ .Domain }}</span>
|
|
</div>
|
|
</h2>
|
|
<div hx-get="/monitors/{{ .ID }}/checks" hx-swap="outerHTML" hx-trigger="intersect"
|
|
class="flex flex-col gap-1">
|
|
<div class="flex justify-between items-center w-full gap-1.5">
|
|
{{ range $i, $e := $.Skeletons }}
|
|
<div class="h-[64px] rounded-full w-[6px] bg-neutral-100 animate-pulse stagger {{ if gt $i 30 }} {{ else if gt $i 25 }} hidden md:block{{ else }} hidden lg:block{{ end }}"
|
|
style="--index: {{ $i }};">
|
|
</div>
|
|
{{ end }}
|
|
</div>
|
|
|
|
|
|
<div class="w-full hidden lg:flex justify-between text-xs opacity-60">
|
|
<div>--:--</div>
|
|
<div>--:--</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</a>
|
|
{{ end }}
|
|
</div>
|
|
{{ end }}
|
|
|
|
{{ define "content" }}
|
|
<div class="max-w-[1600px] mx-auto px-4">
|
|
<div class="flex flex-col gap-4 lg:flex-row">
|
|
<div class="flex-1 flex flex-col gap-4">
|
|
<div class="card card-border p-4 flex flex-col gap-4">
|
|
<div class="flex items-center justify-between gap-2">
|
|
<div class="font-semibold flex gap-1.5 items-center flex-1 ">
|
|
<div class="flex-1 truncate text-sm">
|
|
{{ .Monitor.Url }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div hx-get="/monitors/{{ .Monitor.ID }}/checks" hx-swap="outerHTML" hx-trigger="intersect"
|
|
class="flex flex-col gap-1">
|
|
<div class="flex justify-between items-center w-full gap-1.5">
|
|
{{ range $i, $e := .Skeletons }}
|
|
<div class="h-[64px] rounded-full w-[6px] bg-neutral-100 animate-pulse stagger {{ if gt $i 30 }} {{ else if gt $i 25 }} hidden md:block{{ else }} hidden lg:block{{ end }}"
|
|
style="--index: {{ $i }};">
|
|
</div>
|
|
{{ end }}
|
|
</div>
|
|
|
|
<div class="w-full idden lg:flex justify-between text-xs opacity-60">
|
|
<div>--:--</div>
|
|
<div>--:--</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="stats w-full flex flex-col md:flex-row gap-1.5 px-4" hx-get="/monitors/{{ .Monitor.ID }}/stats"
|
|
hx-trigger="intersect" hx-swap="outerHTML">
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Avg. response time</div>
|
|
<div class="stat-value text-lg md:text-3xl ">-</div>
|
|
</div>
|
|
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Checks</div>
|
|
<div class="stat-value text-lg md:text-3xl ">-</div>
|
|
</div>
|
|
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Fails</div>
|
|
<div class="stat-value text-lg md:text-3xl ">-</div>
|
|
</div>
|
|
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Uptime</div>
|
|
<div class="stat-value text-lg md:text-3xl ">-</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div hx-get="/monitors/{{ .Monitor.ID }}/incidents" hx-trigger="intersect" hx-swap="outerHTML"></div>
|
|
</div>
|
|
</div>
|
|
<div class="lg:w-[237px] flex flex-col gap-4">
|
|
<ul class="list bg-base-100 rounded-box border border-base-200 p-2 text-left">
|
|
<a href="/m/{{ .Monitor.Uuid }}/edit" hx-boost preload>
|
|
<div class="list-row justify-stretch px-0 py-0">
|
|
<div class="list-col-grow">
|
|
<button class="btn btn-ghost w-full text-left align-start justify-start">
|
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
|
stroke-width="1.5" stroke="currentColor" class="size-5!">
|
|
<path stroke-linecap="round" stroke-linejoin="round"
|
|
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10" />
|
|
</svg>
|
|
|
|
Edit monitor
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</a>
|
|
<div class="list-row justify-stretch px-0 py-0">
|
|
<a href="/m/{{ .Monitor.Uuid }}/delete" hx-boost preload>
|
|
<div class="list-col-grow">
|
|
<button class="btn btn-ghost w-full text-left align-start justify-start text-error">
|
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
|
stroke-width="1.5" stroke="currentColor" class="size-5!">
|
|
<path stroke-linecap="round" stroke-linejoin="round"
|
|
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0" />
|
|
</svg>
|
|
|
|
Remove monitor
|
|
</button>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</ul>
|
|
|
|
<div>
|
|
{{ template "sponsors" . }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{ end }}
|
|
|
|
{{ define "monitor_stats" }}
|
|
<div class="stats w-full flex flex-col md:flex-row gap-1.5 px-4" hx-get="/monitors/{{ .ID }}/stats"
|
|
hx-trigger="every 60s" hx-swap="outerHTML">
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Avg. response time</div>
|
|
<div class="stat-value text-lg md:text-3xl ">{{ .AvgResponseTime }}ms</div>
|
|
</div>
|
|
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Checks</div>
|
|
<div class="stat-value text-lg md:text-3xl ">{{ .ChecksCount }}</div>
|
|
</div>
|
|
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Fails</div>
|
|
<div class="stat-value text-lg md:text-3xl ">{{ .FailureCount }}</div>
|
|
</div>
|
|
|
|
<div class="stat md:place-items-center p-0">
|
|
<div class="stat-title">Uptime</div>
|
|
<div class="stat-value text-lg md:text-3xl ">{{ .Uptime }}%</div>
|
|
</div>
|
|
</div>
|
|
{{ end }}
|
|
|
|
{{ define "monitor_incident_list" }}
|
|
<div class="card card-border bg-base-100 {{ if .Incidents }} bg-neutral text-neutral-content {{ end }} w-full w-full rounded-box"
|
|
hx-get="/monitors/{{ .ID }}/incidents" hx-trigger="every 60s" hx-swap="outerHTML">
|
|
{{ if .Incidents }}
|
|
<div class="p-4 pb-2 tracking-wide font-semibold">
|
|
Incidents
|
|
</div>
|
|
|
|
<div class="overflow-x-auto flex flex-col gap-4 md:gap-0 pb-2">
|
|
{{ range .Incidents }}
|
|
<a href="/m/{{ .Monitor.Uuid }}/i/{{ .Uuid }}" hx-boost preload>
|
|
<div class="p-0" id="incidents-{{ .ID }}">
|
|
<div class="px-4 py-2">
|
|
<div class="">
|
|
<div class="flex flex-col md:flex-row gap-1.5 md:gap-4 md:items-start justify-between text-sm">
|
|
<div>
|
|
<div
|
|
class="badge badge-soft truncate max-w-full inline-block text-xs py-1 w-[100px] text-center {{ .StatusBadgeClass }}">
|
|
{{ .StatusBadgeText }}
|
|
</div>
|
|
</div>
|
|
<div class="flex-1 flex flex-col gap-1">
|
|
<div>
|
|
{{ .StatusCode }} {{ .StatusCodeText }}
|
|
</div>
|
|
<div class="w-auto max-w-[350px] text-xs leading-[1.2rem] opacity-80">
|
|
{{ .CreatedAt.Format "2006-01-02 15:04" }}
|
|
{{ if .ResolvedAt }}
|
|
(resolved at {{ .ResolvedAt.Format "2006-01-02 15:04" }})
|
|
{{ end }}
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<label for="incident-details-{{ .ID }}" class="btn btn-sm btn-warning">
|
|
Details
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</a>
|
|
|
|
{{ end }}
|
|
</div>
|
|
{{ else }}
|
|
<div class="p-4 pb-0 tracking-wide font-semibold">
|
|
Incidents
|
|
</div>
|
|
<div class="p-4 tracking-wide opacity-60 text-xs">
|
|
No incidents to report.
|
|
</div>
|
|
{{ end }}
|
|
</div>
|
|
{{ end }}
|
|
|
|
{{ define "breadcrumbs" }}
|
|
<li class="">
|
|
<a href="/" hx-boost preload>
|
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-4! stroke-current shrink-0">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"></path>
|
|
</svg>
|
|
Monitors
|
|
</a>
|
|
</li>
|
|
<li class="">
|
|
<div class="flex items-center gap-2 ">
|
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
|
|
class="size-4! stroke-current shrink-0">
|
|
<path stroke-linecap="round" stroke-linejoin="round"
|
|
d="M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25" />
|
|
</svg>
|
|
<span class="truncate">{{ .Monitor.Host }}</span>
|
|
</div>
|
|
</li>
|
|
{{ end }} |