Make logs view prettier
This commit is contained in:
parent
b3dec9f7cc
commit
0e45b5da61
2 changed files with 124 additions and 48 deletions
|
|
@ -1,21 +1,25 @@
|
||||||
|
@mixin number-card {
|
||||||
|
padding: var(--size-2-1) var(--size-4-1);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
background-color: var(--color-base-30);
|
||||||
|
font-size: var(--font-ui-small);
|
||||||
|
|
||||||
|
&.good {
|
||||||
|
background-color: rgba(var(--color-green-rgb), 0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.bad {
|
||||||
|
background-color: rgba(var(--color-red-rgb), 0.35);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.status-description {
|
.status-description {
|
||||||
margin: var(--p-spacing) 0;
|
margin: var(--p-spacing) 0;
|
||||||
|
|
||||||
.number {
|
.number {
|
||||||
padding: var(--size-2-1) var(--size-4-1);
|
@include number-card;
|
||||||
border-radius: var(--radius-s);
|
|
||||||
background-color: var(--color-base-30);
|
|
||||||
font-family: var(--font-monospace);
|
font-family: var(--font-monospace);
|
||||||
font-weight: var(--bold-weight);
|
font-weight: var(--bold-weight);
|
||||||
font-size: var(--font-ui-small);
|
|
||||||
|
|
||||||
&.good {
|
|
||||||
background-color: rgba(var(--color-green-rgb), 0.35);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.bad {
|
|
||||||
background-color: rgba(var(--color-red-rgb), 0.35);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.error {
|
.error {
|
||||||
|
|
@ -34,14 +38,11 @@
|
||||||
font-size: var(--h2-size);
|
font-size: var(--h2-size);
|
||||||
|
|
||||||
.version {
|
.version {
|
||||||
display: block;
|
@include number-card;
|
||||||
font-size: var(--font-ui-smaller);
|
margin: var(--size-2-2) 0 0 var(--size-4-2);
|
||||||
margin-top: var(--size-2-2);
|
|
||||||
margin-left: var(--size-4-2);
|
|
||||||
padding: var(--size-2-1) var(--size-4-1);
|
|
||||||
background-color: var(--color-base-30);
|
background-color: var(--color-base-30);
|
||||||
color: var(--color-base-70);
|
color: var(--color-base-70);
|
||||||
border-radius: var(--radius-s);
|
font-size: var(--font-ui-smaller);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,23 +85,41 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.log-message {
|
.logs-view {
|
||||||
font: var(--font-monospace);
|
.logs-container {
|
||||||
|
max-height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
&.DEBUG {
|
.log-message {
|
||||||
color: var(--color-base-50);
|
font: var(--font-monospace);
|
||||||
}
|
margin-bottom: var(--size-2-1);
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
|
||||||
&.INFO {
|
.timestamp {
|
||||||
color: var(--color-green-rgb);
|
@include number-card;
|
||||||
}
|
font-family: var(--font-monospace);
|
||||||
|
font-weight: var(--bold-weight);
|
||||||
|
margin-right: var(--size-4-1);
|
||||||
|
}
|
||||||
|
|
||||||
&.WARNING {
|
&.DEBUG {
|
||||||
color: var(--color-yellow-rgb);
|
color: var(--color-base-50);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.ERROR {
|
&.INFO {
|
||||||
color: var(--color-red-rgb);
|
color: var(--color-green-rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.WARNING {
|
||||||
|
color: var(--color-yellow-rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.ERROR {
|
||||||
|
color: var(--color-red-rgb);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,29 @@
|
||||||
import type { WorkspaceLeaf } from "obsidian";
|
import type { WorkspaceLeaf } from "obsidian";
|
||||||
import { ItemView } from "obsidian";
|
import { ItemView } from "obsidian";
|
||||||
|
import type VaultLinkPlugin from "src/vault-link-plugin";
|
||||||
import { LogLevel, Logger } from "src/tracing/logger";
|
import { LogLevel, Logger } from "src/tracing/logger";
|
||||||
|
import { Database } from "src/database/database";
|
||||||
|
|
||||||
export class LogsView extends ItemView {
|
export class LogsView extends ItemView {
|
||||||
public static readonly TYPE = "logs-view";
|
public static readonly TYPE = "logs-view";
|
||||||
public static readonly ICON = "logs";
|
public static readonly ICON = "logs";
|
||||||
|
|
||||||
public constructor(leaf: WorkspaceLeaf) {
|
public constructor(
|
||||||
|
private readonly plugin: VaultLinkPlugin,
|
||||||
|
private readonly database: Database,
|
||||||
|
leaf: WorkspaceLeaf
|
||||||
|
) {
|
||||||
super(leaf);
|
super(leaf);
|
||||||
this.icon = LogsView.ICON;
|
this.icon = LogsView.ICON;
|
||||||
Logger.getInstance().addOnMessageListener(() => {
|
Logger.getInstance().addOnMessageListener(() => {
|
||||||
this.updateView();
|
this.updateView();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
database.addOnSettingsChangeHandlers((newSettings, oldSettings) => {
|
||||||
|
if (newSettings.minimumLogLevel !== oldSettings.minimumLogLevel) {
|
||||||
|
this.updateView();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static formatTimestamp(timestamp: Date): string {
|
private static formatTimestamp(timestamp: Date): string {
|
||||||
|
|
@ -28,6 +40,16 @@ export class LogsView extends ItemView {
|
||||||
|
|
||||||
public async onOpen(): Promise<void> {
|
public async onOpen(): Promise<void> {
|
||||||
this.updateView();
|
this.updateView();
|
||||||
|
|
||||||
|
const container = this.containerEl.children[1];
|
||||||
|
container.addClass("logs-view");
|
||||||
|
|
||||||
|
const logsContainer = container
|
||||||
|
.getElementsByClassName("logs-container")
|
||||||
|
.item(0);
|
||||||
|
if (logsContainer) {
|
||||||
|
logsContainer.scrollTop = logsContainer.scrollHeight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateView(): void {
|
private updateView(): void {
|
||||||
|
|
@ -35,19 +57,54 @@ export class LogsView extends ItemView {
|
||||||
container.empty();
|
container.empty();
|
||||||
|
|
||||||
container.createEl("h4", { text: "VaultLink logs" });
|
container.createEl("h4", { text: "VaultLink logs" });
|
||||||
|
container.createEl(
|
||||||
|
"p",
|
||||||
|
{
|
||||||
|
text: "This view displays logs generated by VaultLink. You can set the log level in the ",
|
||||||
|
},
|
||||||
|
(p) => {
|
||||||
|
p.createEl(
|
||||||
|
"a",
|
||||||
|
{
|
||||||
|
text: "settings",
|
||||||
|
},
|
||||||
|
(button) => {
|
||||||
|
button.addEventListener("click", () => {
|
||||||
|
this.plugin.openSettings();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
Logger.getInstance()
|
p.createSpan({ text: "." });
|
||||||
.getMessages(LogLevel.DEBUG)
|
}
|
||||||
.forEach((message) => {
|
);
|
||||||
const messageContainer = container.createDiv({
|
|
||||||
cls: ["log-message", message.level],
|
const logs = Logger.getInstance().getMessages(
|
||||||
});
|
this.database.getSettings().minimumLogLevel
|
||||||
messageContainer.createEl("span", {
|
);
|
||||||
text: ` | ${LogsView.formatTimestamp(
|
|
||||||
message.timestamp
|
if (logs.length === 0) {
|
||||||
)} | `,
|
container.createEl("p", { text: "No logs available yet." });
|
||||||
});
|
return;
|
||||||
messageContainer.createEl("span", { text: message.message });
|
}
|
||||||
});
|
|
||||||
|
container.createDiv({ cls: "logs-container" }, (logsContainer) => {
|
||||||
|
logs.forEach((message) =>
|
||||||
|
logsContainer.createDiv(
|
||||||
|
{
|
||||||
|
cls: ["log-message", message.level],
|
||||||
|
},
|
||||||
|
(messageContainer) => {
|
||||||
|
messageContainer.createEl("span", {
|
||||||
|
text: LogsView.formatTimestamp(message.timestamp),
|
||||||
|
cls: "timestamp",
|
||||||
|
});
|
||||||
|
messageContainer.createEl("span", {
|
||||||
|
text: message.message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue