mirror of
https://github.com/smartyellow/status.git
synced 2025-02-21 12:49:26 +00:00
More dashboard fixes
Signed-off-by: Romein van Buren <romein@vburen.nl>
This commit is contained in:
parent
cb19696831
commit
f57f9137c7
@ -35,7 +35,7 @@ async function createDashboardSocket(server) {
|
|||||||
const lastBeat = heartbeats.find(h => h.webservice === s.id);
|
const lastBeat = heartbeats.find(h => h.webservice === s.id);
|
||||||
mappedServices[s.id] = {
|
mappedServices[s.id] = {
|
||||||
name: s.name,
|
name: s.name,
|
||||||
lastBeat: lastBeat,
|
lastBeat: lastBeat || {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
html, body {
|
html, body {
|
||||||
--body-bg: #000;
|
--body-bg: #000;
|
||||||
--tile-bg: #181818;
|
--tile-bg: #181818;
|
||||||
|
--grey: grey;
|
||||||
--red: red;
|
--red: red;
|
||||||
--green: green;
|
--green: green;
|
||||||
--radius: 10px;
|
--radius: 10px;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<script>
|
<script>
|
||||||
import './app.css';
|
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import TileRawValue from './tile-rawvalue.svelte';
|
import TileRawValue from './tile-rawvalue.svelte';
|
||||||
import Tiles from './tiles.svelte';
|
import Tiles from './tiles.svelte';
|
||||||
@ -10,6 +9,7 @@
|
|||||||
let services = {};
|
let services = {};
|
||||||
let servicesUp = {};
|
let servicesUp = {};
|
||||||
let servicesDown = {};
|
let servicesDown = {};
|
||||||
|
let servicesUnknown = {};
|
||||||
let loading = true;
|
let loading = true;
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
@ -32,7 +32,13 @@
|
|||||||
|
|
||||||
for (const id of ids) {
|
for (const id of ids) {
|
||||||
const service = services[id];
|
const service = services[id];
|
||||||
if (service.lastBeat && service.lastBeat.down) {
|
if (!service.lastBeat || !service.lastBeat.date) {
|
||||||
|
servicesUnknown = {
|
||||||
|
...servicesUnknown,
|
||||||
|
[id]: service,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if (service.lastBeat.down) {
|
||||||
servicesDown = {
|
servicesDown = {
|
||||||
...servicesDown,
|
...servicesDown,
|
||||||
[id]: service,
|
[id]: service,
|
||||||
@ -64,8 +70,9 @@
|
|||||||
<TileRawValue title="Last updated" value={lastUpdatedFormatted} />
|
<TileRawValue title="Last updated" value={lastUpdatedFormatted} />
|
||||||
|
|
||||||
{#if !loading}
|
{#if !loading}
|
||||||
<Tiles services={servicesDown} />
|
<Tiles services={servicesDown} color="red" value="down" />
|
||||||
<Tiles services={servicesUp} />
|
<Tiles services={servicesUp} color="green" value="up" />
|
||||||
|
<Tiles services={servicesUnknown} color="grey" value="no data" />
|
||||||
{:else}
|
{:else}
|
||||||
loading
|
loading
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -5,9 +5,10 @@
|
|||||||
export let subtitle;
|
export let subtitle;
|
||||||
export let color;
|
export let color;
|
||||||
export let value;
|
export let value;
|
||||||
|
export let date;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Tile {title} {subtitle} {color}>
|
<Tile {title} {subtitle} {color} {date}>
|
||||||
<div class="value {color}">
|
<div class="value {color}">
|
||||||
{value}
|
{value}
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,22 +2,31 @@
|
|||||||
export let title;
|
export let title;
|
||||||
export let subtitle;
|
export let subtitle;
|
||||||
export let color;
|
export let color;
|
||||||
|
export let date;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="tile {color}">
|
<div class="tile {color}">
|
||||||
{#if title || subtitle}
|
{#if title || subtitle || date}
|
||||||
<div class="desc">
|
<div class="desc">
|
||||||
{#if title}
|
<div>
|
||||||
<div class="title">{title}</div>
|
{#if title}
|
||||||
{/if}
|
<div class="title">{title}</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
{#if subtitle}
|
{#if subtitle}
|
||||||
<div class="subtitle">{subtitle}</div>
|
<div class="subtitle">{subtitle}</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{#if date}
|
||||||
|
<div class="time">{date.toLocaleTimeString('en-GB', {
|
||||||
|
timeStyle: 'short',
|
||||||
|
})}</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<slot />
|
<div class="content"><slot /></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@ -38,9 +47,14 @@
|
|||||||
border-color: var(--green);
|
border-color: var(--green);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tile.grey .content {
|
||||||
|
color: var(--grey);
|
||||||
|
}
|
||||||
|
|
||||||
.desc {
|
.desc {
|
||||||
font-size: 1.3rem;
|
font-size: 1.3rem;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.desc .title {
|
.desc .title {
|
||||||
@ -50,4 +64,9 @@
|
|||||||
.desc .subtitle {
|
.desc .subtitle {
|
||||||
font-weight: 100;
|
font-weight: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.desc .time {
|
||||||
|
opacity: 0.6;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -2,13 +2,15 @@
|
|||||||
import TileRawValue from './tile-rawvalue.svelte';
|
import TileRawValue from './tile-rawvalue.svelte';
|
||||||
|
|
||||||
export let services;
|
export let services;
|
||||||
|
export let color;
|
||||||
|
export let value;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#each Object.entries(services) as [ id, service ] (id)}
|
{#each Object.entries(services) as [ id, service ] (id)}
|
||||||
{@const isDown = service.lastBeat.down}
|
|
||||||
<TileRawValue
|
<TileRawValue
|
||||||
title={service.name.en}
|
title={service.name.en}
|
||||||
value={isDown ? 'down' : 'up'}
|
date={service.lastBeat.date ? new Date(service.lastBeat.date) : false}
|
||||||
color={isDown ? 'red' : 'green'}
|
{value}
|
||||||
|
{color}
|
||||||
/>
|
/>
|
||||||
{/each}
|
{/each}
|
||||||
|
5
index.js
5
index.js
@ -5,6 +5,7 @@ const { processOutage } = require('./lib/processoutage');
|
|||||||
const buildDashboard = require('./dashboard/build');
|
const buildDashboard = require('./dashboard/build');
|
||||||
const createDashboardSocket = require('./dashboard/socket');
|
const createDashboardSocket = require('./dashboard/socket');
|
||||||
const { minifyHtml } = require('core/strings');
|
const { minifyHtml } = require('core/strings');
|
||||||
|
const { readFile } = require('fs/promises');
|
||||||
|
|
||||||
const guiCluster = 'web service status';
|
const guiCluster = 'web service status';
|
||||||
const icons = {
|
const icons = {
|
||||||
@ -533,6 +534,9 @@ module.exports = {
|
|||||||
try {
|
try {
|
||||||
if (!renderedDashboard) {
|
if (!renderedDashboard) {
|
||||||
renderedDashboard = await buildDashboard(server);
|
renderedDashboard = await buildDashboard(server);
|
||||||
|
renderedDashboard.globalCss = await readFile(
|
||||||
|
__dirname + '/gui/dashboard/app.css'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
const dashboardHtml = minifyHtml(`
|
const dashboardHtml = minifyHtml(`
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
@ -542,6 +546,7 @@ module.exports = {
|
|||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Web service status dashboard</title>
|
<title>Web service status dashboard</title>
|
||||||
|
<style>${renderedDashboard.globalCss || ''}</style>
|
||||||
<style>${renderedDashboard.css || ''}</style>
|
<style>${renderedDashboard.css || ''}</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user