Skip to content

Commit d6794da

Browse files
committed
feat: more code
1 parent 2f72b09 commit d6794da

File tree

5 files changed

+112
-6
lines changed

5 files changed

+112
-6
lines changed

src/app/runs/[id]/_Tabs/LogTab/logs.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Skeleton } from "@zenml-io/react-component-library/components/server";
88
import { useState } from "react";
99
import { useParams } from "react-router-dom";
1010
import { LogCombobox } from "./combobox";
11+
import { LogViewerProvider, useLogViewerContext } from "@/components/logs/logviewer-context";
1112

1213
export function LogTab() {
1314
const { runId } = useParams() as { runId: string };
@@ -48,7 +49,9 @@ function LogTabContent({ sources, runId }: { sources: string[]; runId: string })
4849
/>
4950
</div>
5051
)}
51-
<LogDisplay selectedSource={selectedSource} runId={runId} />
52+
<LogViewerProvider>
53+
<LogDisplay selectedSource={selectedSource} runId={runId} />
54+
</LogViewerProvider>
5255
</section>
5356
);
5457
}
@@ -58,7 +61,11 @@ type LogTabContentProps = {
5861
runId: string;
5962
};
6063
function LogDisplay({ selectedSource, runId }: LogTabContentProps) {
61-
const runLogs = useRunLogs({ runId, queries: { source: selectedSource } });
64+
const { logLevel, searchQuery } = useLogViewerContext();
65+
const runLogs = useRunLogs({
66+
runId,
67+
queries: { source: selectedSource, level: logLevel, search: searchQuery }
68+
});
6269

6370
if (runLogs.isPending) return <LoadingLogs />;
6471

src/components/logs/enhanced-log-viewer.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import Expand from "@/assets/icons/expand-full.svg?react";
33
import { LogEntry as LogEntryType, LogPage } from "@/types/logs"; // Assuming types are in src/types/logs.ts
44
import { Button } from "@zenml-io/react-component-library/components/server";
55
import React, { useState } from "react";
6+
import { EmptyStateLogs } from "./empty-state-logs";
67
import LogLine from "./log-line"; // Import the LogLine component
8+
import { useLogViewerContext } from "./logviewer-context";
79
import { LogToolbar } from "./toolbar";
810
import { useLogSearch } from "./use-log-search";
9-
import { EmptyStateLogs } from "./empty-state-logs";
1011

1112
interface EnhancedLogsViewerProps {
1213
logPage: LogPage;
@@ -21,7 +22,7 @@ export function EnhancedLogsViewer({
2122
}: EnhancedLogsViewerProps) {
2223
const [currentPage, setCurrentPage] = useState(1);
2324
const [textWrapEnabled, setTextWrapEnabled] = useState(true);
24-
const [searchQuery, setSearchQuery] = useState("");
25+
const { searchQuery, setSearchQuery } = useLogViewerContext();
2526
const [caseSensitive] = useState(false);
2627

2728
const logs = logPage.items;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import {
2+
ScrollArea,
3+
Select,
4+
SelectContent,
5+
SelectItem,
6+
SelectTrigger,
7+
SelectValue
8+
} from "@zenml-io/react-component-library/components/client";
9+
import { ComponentPropsWithoutRef, ElementRef, forwardRef } from "react";
10+
11+
const logLevels = [
12+
{
13+
value: 10,
14+
label: "Debug"
15+
},
16+
{
17+
value: 20,
18+
label: "Info"
19+
},
20+
{
21+
value: 30,
22+
label: "Warning"
23+
},
24+
{
25+
value: 40,
26+
label: "Error"
27+
},
28+
{
29+
value: 50,
30+
label: "Critical"
31+
}
32+
] as const;
33+
34+
export const LogLevelSelect = forwardRef<
35+
ElementRef<typeof SelectTrigger>,
36+
ComponentPropsWithoutRef<typeof Select>
37+
>(({ ...props }, ref) => {
38+
return (
39+
<Select {...props}>
40+
<SelectTrigger
41+
ref={ref}
42+
className="h-7 w-full truncate border border-[#D0D5DD] bg-theme-surface-primary p-2 text-left text-text-md"
43+
>
44+
<SelectValue
45+
className="data-[placeholder]:text-theme-text-secondary"
46+
placeholder="Select a role..."
47+
/>
48+
</SelectTrigger>
49+
<SelectContent className="">
50+
<ScrollArea viewportClassName="max-h-[300px]">
51+
{logLevels.map((logLevel, idx) => (
52+
<SelectItem key={idx} className="rounded-sm p-2" value={logLevel.value.toString()}>
53+
{logLevel.label}
54+
</SelectItem>
55+
))}
56+
</ScrollArea>
57+
</SelectContent>
58+
</Select>
59+
);
60+
});
61+
62+
LogLevelSelect.displayName = "LogLevelSelect";
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Dispatch, SetStateAction, createContext, useContext, useState } from "react";
2+
3+
type LogViewerContextType = {
4+
searchQuery: string;
5+
setSearchQuery: Dispatch<SetStateAction<string>>;
6+
logLevel: number;
7+
setLogLevel: Dispatch<SetStateAction<number>>;
8+
};
9+
10+
export const LogViewerContext = createContext<LogViewerContextType | null>(null);
11+
12+
export function LogViewerProvider({ children }: { children: React.ReactNode }) {
13+
const [searchQuery, setSearchQuery] = useState("");
14+
const [logLevel, setLogLevel] = useState(20);
15+
return (
16+
<LogViewerContext.Provider value={{ searchQuery, setSearchQuery, logLevel, setLogLevel }}>
17+
{children}
18+
</LogViewerContext.Provider>
19+
);
20+
}
21+
22+
export function useLogViewerContext() {
23+
const context = useContext(LogViewerContext);
24+
if (context === null) {
25+
throw new Error("useLogViewerContext must be used within a LogViewerProvider");
26+
}
27+
return context;
28+
}

src/components/logs/toolbar.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import ArrowLeft from "@/assets/icons/arrow-left.svg?react";
22
import Download from "@/assets/icons/download-01.svg?react";
33
import { Button } from "@zenml-io/react-component-library/components/server";
44
import { SearchField } from "../SearchField";
5+
import { LogLevelSelect } from "./loglevel-select";
6+
import { useLogViewerContext } from "./logviewer-context";
57

68
interface LogToolbarProps {
79
onSearchChange: (searchTerm: string) => void;
810
onDownload: () => void;
911
// Search-related props from useLogSearch hook
10-
searchQuery?: string;
12+
searchQuery: string;
1113
currentMatchIndex?: number;
1214
totalMatches?: number;
1315
onPreviousMatch?: () => void;
@@ -18,12 +20,13 @@ export function LogToolbar({
1820
onSearchChange,
1921

2022
onDownload,
21-
searchQuery = "",
23+
searchQuery,
2224
currentMatchIndex = 0,
2325
totalMatches = 0,
2426
onPreviousMatch,
2527
onNextMatch
2628
}: LogToolbarProps) {
29+
const { logLevel, setLogLevel } = useLogViewerContext();
2730
return (
2831
<>
2932
{/* Main Toolbar */}
@@ -33,6 +36,7 @@ export function LogToolbar({
3336
<div className="flex items-center gap-2">
3437
<SearchField
3538
searchParams={{}}
39+
value={searchQuery}
3640
inMemoryHandler={onSearchChange}
3741
placeholder="Search logs..."
3842
/>
@@ -63,6 +67,10 @@ export function LogToolbar({
6367
</Button>
6468
</div>
6569
)}
70+
<LogLevelSelect
71+
value={logLevel.toString()}
72+
onValueChange={(value) => setLogLevel(Number(value))}
73+
/>
6674
</div>
6775

6876
{/* Right side - Action Buttons */}

0 commit comments

Comments
 (0)