mirror of
https://github.com/cupcakearmy/ora.git
synced 2024-11-01 00:34:11 +01:00
69 lines
1.4 KiB
Svelte
69 lines
1.4 KiB
Svelte
<script>
|
|
import { onMount } from 'svelte'
|
|
|
|
import Chart from '../components/Chart.svelte'
|
|
import RangeChooser from '../components/RangeChooser.svelte'
|
|
|
|
import { data, countInGroup } from '../../shared/lib'
|
|
|
|
let top = 15
|
|
let full = 50
|
|
|
|
let loading = true
|
|
let counted = []
|
|
let timeout
|
|
|
|
let start
|
|
let end
|
|
|
|
async function calculate() {
|
|
try {
|
|
loading = true
|
|
const logs = await data({
|
|
start,
|
|
end,
|
|
})
|
|
counted = countInGroup(logs)
|
|
} finally {
|
|
loading = false
|
|
}
|
|
}
|
|
|
|
$: topData = counted.slice(0, top).map(({ total, host, human }) => ({ value: total, name: host, human }))
|
|
|
|
$: {
|
|
start, end
|
|
clearTimeout(timeout)
|
|
timeout = setTimeout(calculate, 5)
|
|
}
|
|
|
|
onMount(calculate)
|
|
</script>
|
|
|
|
<style>
|
|
</style>
|
|
|
|
<div class="flex justify-between items-center mb-4">
|
|
<h2 class="text-2xl">Dashboard</h2>
|
|
<RangeChooser bind:start bind:end />
|
|
</div>
|
|
{#if loading}
|
|
<div class="loading loading-lg" />
|
|
{:else if counted}
|
|
<h2 class="text-lg">Top {top}</h2>
|
|
<Chart data={topData} />
|
|
<h2 class="text-lg mt-4">Top {full}</h2>
|
|
<table class="table">
|
|
<tr>
|
|
<th>Time Spent</th>
|
|
<th>Host</th>
|
|
</tr>
|
|
{#each counted.slice(0, 100) as { host, total, human }}
|
|
<tr>
|
|
<td>{human}</td>
|
|
<td class="link"><a href={'https://' + host}>{host}</a></td>
|
|
</tr>
|
|
{/each}
|
|
</table>
|
|
{/if}
|