pocketbase/ui/src/components/logs/LogViewPanel.svelte

144 lines
4.3 KiB
Svelte
Raw Normal View History

2022-07-07 05:19:05 +08:00
<script>
import CommonHelper from "@/utils/CommonHelper";
import CodeBlock from "@/components/base/CodeBlock.svelte";
import OverlayPanel from "@/components/base/OverlayPanel.svelte";
2023-11-26 19:33:17 +08:00
import CopyIcon from "@/components/base/CopyIcon.svelte";
import LogLevel from "@/components/logs/LogLevel.svelte";
import LogDate from "@/components/logs/LogDate.svelte";
2022-07-07 05:19:05 +08:00
let logPanel;
2023-11-26 19:33:17 +08:00
let log = {};
$: hasData = !CommonHelper.isEmpty(log.data);
2022-07-07 05:19:05 +08:00
export function show(model) {
2023-11-26 19:33:17 +08:00
if (CommonHelper.isEmpty(model)) {
return;
}
log = model;
2022-07-07 05:19:05 +08:00
return logPanel?.show();
}
export function hide() {
return logPanel?.hide();
}
2023-11-26 19:33:17 +08:00
const priotizedKeys = [
"execTime",
"type",
"auth",
"status",
"method",
"url",
"referer",
"remoteIp",
"userIp",
"error",
"details",
//
];
function extractKeys(data) {
if (!data) {
return [];
}
let keys = [];
for (let key of priotizedKeys) {
if (typeof data[key] !== "undefined") {
keys.push(key);
}
}
// append the rest
const original = Object.keys(data);
for (let key of original) {
if (!keys.includes(key)) {
keys.push(key);
}
}
return keys;
}
function downloadJson() {
CommonHelper.downloadJson(log, "log_" + log.created.replaceAll(/[-:\. ]/gi, "") + ".json");
}
2022-07-07 05:19:05 +08:00
</script>
2023-11-26 19:33:17 +08:00
<!-- svelte-ignore a11y-no-noninteractive-tabindex -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
2022-07-07 05:19:05 +08:00
<OverlayPanel bind:this={logPanel} class="overlay-panel-lg log-panel" on:hide on:show>
<svelte:fragment slot="header">
<h4>Request log</h4>
</svelte:fragment>
2023-02-19 01:33:42 +08:00
<table class="table-border">
2022-07-07 05:19:05 +08:00
<tbody>
<tr>
2023-11-26 19:33:17 +08:00
<td class="min-width txt-hint txt-bold">id</td>
2022-07-07 05:19:05 +08:00
<td>
2023-11-26 19:33:17 +08:00
<div class="label">
<CopyIcon value={log.id} />
<div class="txt">{log.id}</div>
</div>
2022-07-07 05:19:05 +08:00
</td>
</tr>
<tr>
2023-11-26 19:33:17 +08:00
<td class="min-width txt-hint txt-bold">level</td>
<td><LogLevel level={log.level} /></td>
2022-07-07 05:19:05 +08:00
</tr>
<tr>
2023-11-26 19:33:17 +08:00
<td class="min-width txt-hint txt-bold">created</td>
<td><LogDate date={log.created} /></td>
2022-07-07 05:19:05 +08:00
</tr>
2023-11-26 19:33:17 +08:00
{#if log.data?.type != "request"}
<tr>
<td class="min-width txt-hint txt-bold">message</td>
<td>
{#if log.message}
<span class="txt">{log.message}</span>
{:else}
<span class="txt txt-hint">N/A</span>
{/if}
</td>
</tr>
{/if}
{#each extractKeys(log.data) as key}
{@const value = log.data[key]}
<tr>
<td class="min-width txt-hint txt-bold" class:v-align-top={hasData}>
data.{key}
</td>
<td>
{#if value !== null && typeof value == "object"}
<CodeBlock content={JSON.stringify(value, null, 2)} />
{:else if CommonHelper.isEmpty(value)}
<span class="txt txt-hint">N/A</span>
{:else}
<span class="txt">
{value}{key == "execTime" ? "ms" : ""}
</span>
{/if}
</td>
</tr>
{/each}
2022-07-07 05:19:05 +08:00
</tbody>
</table>
<svelte:fragment slot="footer">
<button type="button" class="btn btn-transparent" on:click={() => hide()}>
2022-07-07 05:19:05 +08:00
<span class="txt">Close</span>
</button>
2023-11-26 19:33:17 +08:00
<button type="button" class="btn btn-primary" on:click={() => downloadJson()}>
<i class="ri-download-line" />
<span class="txt">Download as JSON</span>
</button>
2022-07-07 05:19:05 +08:00
</svelte:fragment>
</OverlayPanel>