diff --git a/frontend/src/modules/agent/store/logFilter.store.ts b/frontend/src/modules/agent/store/logFilter.store.ts index c736e60..320bc86 100644 --- a/frontend/src/modules/agent/store/logFilter.store.ts +++ b/frontend/src/modules/agent/store/logFilter.store.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; -export type LogLevel = "INFO" | "WARNING" | "ERROR" | "FATAL"; +export type LogLevel = "info" | "warning" | "error" | "fatal"; interface LogFilterState { searchQuery: string; @@ -22,7 +22,7 @@ interface LogFilterState { setOffset: (offset: number) => void; resetFilters: () => void; getFilters: () => { - level?: string; + level?: string | string[]; service?: string; agent?: string; date_from?: string; @@ -36,7 +36,7 @@ export const useLogFilterStore = create((set, get) => ({ searchQuery: "", startDate: null, endDate: null, - selectedLogLevels: ["INFO", "WARNING", "ERROR", "FATAL"], + selectedLogLevels: ["info", "warning", "error", "fatal"], selectedService: "", selectedAgent: "", limit: 100, @@ -63,7 +63,7 @@ export const useLogFilterStore = create((set, get) => ({ searchQuery: "", startDate: null, endDate: null, - selectedLogLevels: ["INFO", "WARNING", "ERROR", "FATAL"], + selectedLogLevels: ["info", "warning", "error", "fatal"], selectedService: "", selectedAgent: "", limit: 100, @@ -72,9 +72,17 @@ export const useLogFilterStore = create((set, get) => ({ }, getFilters: () => { - const { selectedLogLevels, selectedService, selectedAgent, startDate, endDate, limit, offset } = get(); + const { + selectedLogLevels, + selectedService, + selectedAgent, + startDate, + endDate, + limit, + offset, + } = get(); return { - level: selectedLogLevels.length > 0 ? selectedLogLevels.join(",") : undefined, + level: selectedLogLevels.length > 0 ? selectedLogLevels : undefined, service: selectedService || undefined, agent: selectedAgent || undefined, date_from: startDate ? startDate.toISOString() : undefined, diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts index adec31b..da132ab 100644 --- a/frontend/src/modules/agent/types/agent.types.ts +++ b/frontend/src/modules/agent/types/agent.types.ts @@ -62,7 +62,7 @@ export interface InsertLogsRequest { } export interface LogFilters { - level?: string; + level?: string | string[]; service?: string; agent?: string; date_from?: string; diff --git a/frontend/src/modules/agent/ui/LogFilters.tsx b/frontend/src/modules/agent/ui/LogFilters.tsx index 36ba5fb..03e47fc 100644 --- a/frontend/src/modules/agent/ui/LogFilters.tsx +++ b/frontend/src/modules/agent/ui/LogFilters.tsx @@ -13,22 +13,22 @@ const logLevelColors: Record< LogLevel, { bg: string; text: string; border: string } > = { - INFO: { + info: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)", }, - WARNING: { + warning: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)", }, - ERROR: { + error: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)", }, - FATAL: { + fatal: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)", @@ -272,7 +272,7 @@ export const LogFilters: React.FC = ({
- {(["INFO", "WARNING", "ERROR", "FATAL"] as LogLevel[]).map( + {(["info", "warning", "error", "fatal"] as LogLevel[]).map( (level) => { const isSelected = selectedLogLevels.includes(level); const colors = logLevelColors[level]; @@ -291,7 +291,7 @@ export const LogFilters: React.FC = ({ {isSelected && ( )} - {level} + {level.toUpperCase()} ); }, diff --git a/frontend/src/pages/logs.page.tsx b/frontend/src/pages/logs.page.tsx index 0ec9256..bd26c3e 100644 --- a/frontend/src/pages/logs.page.tsx +++ b/frontend/src/pages/logs.page.tsx @@ -15,32 +15,32 @@ import { } from "react-icons/fi"; const logLevelIcons: Record = { - INFO: , - WARNING: , - ERROR: , - FATAL: , + info: , + warning: , + error: , + fatal: , }; const logLevelColors: Record< string, { bg: string; text: string; border: string } > = { - INFO: { + info: { bg: "var(--info-bg)", text: "var(--info-text)", border: "var(--info-border)", }, - WARNING: { + warning: { bg: "var(--warning-bg)", text: "var(--warning-text)", border: "var(--warning-border)", }, - ERROR: { + error: { bg: "var(--error-bg)", text: "var(--error-text)", border: "var(--error-border)", }, - FATAL: { + fatal: { bg: "var(--fatal-bg)", text: "var(--fatal-text)", border: "var(--fatal-border)", @@ -306,9 +306,9 @@ export const LogsPage: React.FC = () => { {logs.map((log, index) => { - const level = log.level || "INFO"; + const level = log.level?.toLowerCase() || "info"; const colors = - logLevelColors[level] || logLevelColors.INFO; + logLevelColors[level] || logLevelColors.info; return ( { return status >= 200 && status < 400; }, + // Добавляем кастомный сериализатор параметров + paramsSerializer: { + serialize: (params) => { + const parts: string[] = []; + + Object.entries(params).forEach(([key, value]) => { + if (value === undefined || value === null) return; + + if (Array.isArray(value)) { + // Преобразуем массив в множественные параметры: level=info&level=warning + value.forEach((item) => { + if (item !== undefined && item !== null) { + parts.push( + `${encodeURIComponent(key)}=${encodeURIComponent(item)}`, + ); + } + }); + } else { + parts.push( + `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`, + ); + } + }); + + return parts.join("&"); + }, + }, }); this.setupInterceptors();