diff --git a/src/features/DebugConsole/DebugConsole.tsx b/src/features/DebugConsole/DebugConsole.tsx index 9324274..02f1332 100644 --- a/src/features/DebugConsole/DebugConsole.tsx +++ b/src/features/DebugConsole/DebugConsole.tsx @@ -1,23 +1,23 @@ import { skipToken } from '@reduxjs/toolkit/query'; -import { useState } from "react"; -import { Alert, Button, Form } from "react-bootstrap"; -import ListFiltersHeader from "../../shared/ListFiltersHeader"; +import { useState } from 'react'; +import { Alert, Button, Form } from 'react-bootstrap'; +import ListFiltersHeader from '../../shared/ListFiltersHeader'; import useAppParams from '../../shared/hooks/useAppParams'; import { useGetDoNotLoadConfigOnNextBootQuery, useSetDoNotLoadConfigOnNextBootMutation, useSetLoadConfigMutation, useSetRestartMutation -} from "../../store/apiSlice"; +} from '../../store/apiSlice'; import { selectSearchText } from '../../store/debugConsole/debugConsoleSelectors'; import { debugConsoleActions } from '../../store/debugConsole/debugConsoleSlice'; import { useAppDispatch, useAppSelector } from '../../store/hooks'; import type { RootState } from '../../store/store'; -import ConsoleWindow from "./ConsoleWindow"; -import { DebugFilters } from "./DebugFilters"; +import ConsoleWindow from './ConsoleWindow'; +import { DebugFilters } from './DebugFilters'; import MinimumLogLevelDropdown from './MinimumLogLevelDropdown'; -import RestartConfirmModal from "./RestartConfirmModal"; -import { useFilteredMessages } from "./hooks/useFilteredMessages"; +import RestartConfirmModal from './RestartConfirmModal'; +import { useFilteredMessages } from './hooks/useFilteredMessages'; const DebugConsole = ({isConnected, join, stop, clear}: DebugConsoleProps) => { //* HOOKS ***********************************************************/ @@ -41,6 +41,23 @@ const DebugConsole = ({isConnected, join, stop, clear}: DebugConsoleProps) => { //* EFFECTS *********************************************************/ const filteredItems = useFilteredMessages(messages); + const exportFilteredItems = () => { + const content = filteredItems + .map((item) => `${item.Timestamp} [${item.Level}]${item.Properties?.Key ? ` [${item.Properties.Key}]` : ''} ${item.RenderedMessage}`) + .join('\n'); + const blob = new Blob([content], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `debug-log-${new Date().toISOString().replace(/[:.]/g, '-')}.log`; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, 0); + }; + const clickRestart = () => { setShowModal(true); }; @@ -104,6 +121,15 @@ const DebugConsole = ({isConnected, join, stop, clear}: DebugConsoleProps) => { > Clear Console Trace +