6 changed files with 133 additions and 17 deletions
@ -0,0 +1,98 @@ |
|||
<!-- This is useful in an environment where the download doesn't work. --> |
|||
<template> |
|||
<QuickNav selected="" /> |
|||
<TopMessage /> |
|||
|
|||
<!-- CONTENT --> |
|||
<section id="Content" class="p-6 pb-24 max-w-3xl mx-auto"> |
|||
<!-- Back Button --> |
|||
<div class="relative px-7"> |
|||
<h1 |
|||
class="text-lg text-center font-light px-2 py-1 absolute -left-2 -top-1" |
|||
@click="$router.back()" |
|||
> |
|||
<font-awesome icon="chevron-left" class="mr-2" /> |
|||
</h1> |
|||
</div> |
|||
|
|||
<!-- Heading --> |
|||
<h1 id="ViewHeading" class="text-4xl text-center font-light mb-6">Logs</h1> |
|||
|
|||
<!-- Error Message --> |
|||
<div |
|||
v-if="error" |
|||
class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-4" |
|||
> |
|||
<span>{{ error }}</span> |
|||
</div> |
|||
|
|||
<!-- Log Content --> |
|||
<div v-if="loading" class="text-center"> |
|||
<font-awesome icon="spinner" class="fa-spin text-slate-400" /> |
|||
Loading logs... |
|||
</div> |
|||
<div v-else-if="!logs.length" class="text-center text-slate-500"> |
|||
No logs found. |
|||
</div> |
|||
<div v-else> |
|||
<div v-for="(log, index) in logs" :key="index" class="mb-8"> |
|||
<h2 class="text-lg font-semibold mb-2">{{ log.date }}</h2> |
|||
<pre |
|||
class="bg-slate-100 p-4 rounded-md overflow-x-auto whitespace-pre-wrap" |
|||
>{{ log.message }}</pre |
|||
> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
</template> |
|||
|
|||
<script lang="ts"> |
|||
import { Component, Vue } from "vue-facing-decorator"; |
|||
import { Router } from "vue-router"; |
|||
|
|||
import QuickNav from "../components/QuickNav.vue"; |
|||
import TopMessage from "../components/TopMessage.vue"; |
|||
import { db } from "../db/index"; |
|||
import { Log } from "../db/tables/logs"; |
|||
import { logger } from "../utils/logger"; |
|||
|
|||
@Component({ |
|||
components: { |
|||
QuickNav, |
|||
TopMessage, |
|||
}, |
|||
}) |
|||
export default class LogView extends Vue { |
|||
$router!: Router; |
|||
|
|||
loading = true; |
|||
logs: Log[] = []; |
|||
error: string | null = null; |
|||
|
|||
async mounted() { |
|||
await this.loadLogs(); |
|||
} |
|||
|
|||
async loadLogs() { |
|||
try { |
|||
this.error = null; // Clear any previous errors |
|||
await db.open(); |
|||
// Get all logs and sort by date in reverse chronological order |
|||
const allLogs = await db.logs.toArray(); |
|||
this.logs = allLogs.sort((a, b) => { |
|||
const dateA = new Date(a.date); |
|||
const dateB = new Date(b.date); |
|||
return dateB.getTime() - dateA.getTime(); |
|||
}); |
|||
} catch (error) { |
|||
logger.error("Error loading logs:", error); |
|||
this.error = |
|||
error instanceof Error |
|||
? error.message |
|||
: `An unknown error occurred while loading logs: ${String(error)}`; |
|||
} finally { |
|||
this.loading = false; |
|||
} |
|||
} |
|||
} |
|||
</script> |
Loading…
Reference in new issue