-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Expand file tree
/
Copy pathLoggingScreen.tsx
More file actions
105 lines (95 loc) · 2.62 KB
/
LoggingScreen.tsx
File metadata and controls
105 lines (95 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { useState } from "react";
import { Card, Flex, Stack } from "@mantine/core";
import type { LoggingLevel } from "@modelcontextprotocol/sdk/types.js";
import { LogControls } from "../../groups/LogControls/LogControls";
import { LogStreamPanel } from "../../groups/LogStreamPanel/LogStreamPanel";
import type { LogEntryData } from "../../elements/LogEntry/LogEntry";
export interface LoggingScreenProps {
entries: LogEntryData[];
currentLevel: LoggingLevel;
onSetLevel: (level: LoggingLevel) => void;
onClear: () => void;
onExport: () => void;
autoScroll: boolean;
onToggleAutoScroll: () => void;
}
const ALL_LEVELS_VISIBLE: Record<LoggingLevel, boolean> = {
debug: true,
info: true,
notice: true,
warning: true,
error: true,
critical: true,
alert: true,
emergency: true,
};
const NO_LEVELS_VISIBLE: Record<LoggingLevel, boolean> = {
debug: false,
info: false,
notice: false,
warning: false,
error: false,
critical: false,
alert: false,
emergency: false,
};
const ScreenLayout = Flex.withProps({
variant: "screen",
h: "calc(100vh - var(--app-shell-header-height, 0px))",
gap: "md",
p: "xl",
});
const Sidebar = Stack.withProps({
w: 340,
flex: "0 0 auto",
});
const SidebarCard = Card.withProps({
withBorder: true,
padding: "lg",
});
export function LoggingScreen({
entries,
currentLevel,
onSetLevel,
onClear,
onExport,
autoScroll,
onToggleAutoScroll,
}: LoggingScreenProps) {
const [filterText, setFilterText] = useState("");
const [visibleLevels, setVisibleLevels] =
useState<Record<LoggingLevel, boolean>>(ALL_LEVELS_VISIBLE);
function handleToggleLevel(level: LoggingLevel, visible: boolean) {
setVisibleLevels((prev) => ({ ...prev, [level]: visible }));
}
function handleToggleAllLevels() {
const allSelected = Object.values(visibleLevels).every(Boolean);
setVisibleLevels(allSelected ? NO_LEVELS_VISIBLE : ALL_LEVELS_VISIBLE);
}
return (
<ScreenLayout>
<Sidebar>
<SidebarCard>
<LogControls
currentLevel={currentLevel}
filterText={filterText}
visibleLevels={visibleLevels}
onSetLevel={onSetLevel}
onFilterChange={setFilterText}
onToggleLevel={handleToggleLevel}
onToggleAllLevels={handleToggleAllLevels}
/>
</SidebarCard>
</Sidebar>
<LogStreamPanel
entries={entries}
filterText={filterText}
visibleLevels={visibleLevels}
autoScroll={autoScroll}
onToggleAutoScroll={onToggleAutoScroll}
onClear={onClear}
onExport={onExport}
/>
</ScreenLayout>
);
}