### Run documentation locally Source: https://github.com/patternfly/react-log-viewer/blob/main/README.md Commands to install dependencies, build, and start the documentation server locally. ```bash yarn install && yarn build && yarn start ``` -------------------------------- ### With search Source: https://github.com/patternfly/react-log-viewer/blob/main/packages/module/patternfly-docs/content/extensions/react-log-viewer/examples/basic.md Log viewer with search functionality. ```javascript import React, { useState, Fragment, useRef } from 'react'; import { LogViewer, LogViewerSearch, LogViewerContext } from '@patternfly/react-log-viewer'; import { Button, Checkbox, Toolbar, ToolbarContent, ToolbarItem } from '@patternfly/react-core'; import { data } from '@patternfly/react-log-viewer/patternfly-docs/content/extensions/react-log-viewer/examples/realTestData.js'; export const BasicSearchLogViewer = () => { const [isSearchFocused, setIsSearchFocused] = useState(false); const [isCaseSensitive, setIsCaseSensitive] = useState(false); const [isRegex, setIsRegex] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [searchResult, setSearchResult] = useState(''); const [searchIndex, setSearchIndex] = useState(0); const logViewerRef = useRef(); const onSearch = (term, isCaseSensitive, isRegex) => { setSearchTerm(term); setIsCaseSensitive(isCaseSensitive); setIsRegex(isRegex); setSearchResult(''); setSearchIndex(0); }; const onClear = () => { setSearchTerm(''); setSearchResult(''); setSearchIndex(0); }; const onNext = () => { setSearchIndex(searchIndex + 1); }; const onPrevious = () => { setSearchIndex(searchIndex - 1); }; const onSearchFocus = (isFocused) => { setIsSearchFocused(isFocused); }; const onSearchResult = (result) => { setSearchResult(result); }; const onSearchIndex = (index) => { setSearchIndex(index); }; const searchControls = ( ); return ( ); }; ``` -------------------------------- ### Basic Source: https://github.com/patternfly/react-log-viewer/blob/main/packages/module/patternfly-docs/content/extensions/react-log-viewer/examples/basic.md Basic example of the react-log-viewer component. ```javascript import React from 'react'; import { LogViewer } from '@patternfly/react-log-viewer'; import { data } from '@patternfly/react-log-viewer/patternfly-docs/content/extensions/react-log-viewer/examples/realTestData.js'; export const BasicLogViewer = () => ( ); ``` -------------------------------- ### With complex toolbar Source: https://github.com/patternfly/react-log-viewer/blob/main/packages/module/patternfly-docs/content/extensions/react-log-viewer/examples/basic.md Log viewer with a custom toolbar. ```javascript import React, { useState, Fragment, useRef } from 'react'; import { LogViewer, LogViewerSearch, LogViewerContext } from '@patternfly/react-log-viewer'; import { Button, Checkbox, Toolbar, ToolbarContent, ToolbarItem } from '@patternfly/react-core'; import { data } from '@patternfly/react-log-viewer/patternfly-docs/content/extensions/react-log-viewer/examples/realTestData.js'; export const CustomControlLogViewer = () => { const [isSearchFocused, setIsSearchFocused] = useState(false); const [isCaseSensitive, setIsCaseSensitive] = useState(false); const [isRegex, setIsRegex] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [searchResult, setSearchResult] = useState(''); const [searchIndex, setSearchIndex] = useState(0); const logViewerRef = useRef(); const onSearch = (term, isCaseSensitive, isRegex) => { setSearchTerm(term); setIsCaseSensitive(isCaseSensitive); setIsRegex(isRegex); setSearchResult(''); setSearchIndex(0); }; const onClear = () => { setSearchTerm(''); setSearchResult(''); setSearchIndex(0); }; const onNext = () => { setSearchIndex(searchIndex + 1); }; const onPrevious = () => { setSearchIndex(searchIndex - 1); }; const onSearchFocus = (isFocused) => { setIsSearchFocused(isFocused); }; const onSearchResult = (result) => { setSearchResult(result); }; const onSearchIndex = (index) => { setSearchIndex(index); }; const searchControls = ( ); return ( ); }; ``` -------------------------------- ### With header component Source: https://github.com/patternfly/react-log-viewer/blob/main/packages/module/patternfly-docs/content/extensions/react-log-viewer/examples/basic.md Log viewer with a custom header component. ```javascript import React from 'react'; import { LogViewer } from '@patternfly/react-log-viewer'; import { data } from '@patternfly/react-log-viewer/patternfly-docs/content/extensions/react-log-viewer/examples/realTestData.js'; const CustomHeader = () => (
Custom Header
); export const HeaderComponentLogViewer = () => ( } /> ); ``` -------------------------------- ### With footer component Source: https://github.com/patternfly/react-log-viewer/blob/main/packages/module/patternfly-docs/content/extensions/react-log-viewer/examples/basic.md Log viewer with a custom footer component. ```javascript import React from 'react'; import { LogViewer } from '@patternfly/react-log-viewer'; import { data } from '@patternfly/react-log-viewer/patternfly-docs/content/extensions/react-log-viewer/examples/realTestData.js'; const CustomFooter = () => (
Custom Footer
); export const FooterComponentLogViewer = () => ( } /> ); ``` -------------------------------- ### With ANSI color logs Source: https://github.com/patternfly/react-log-viewer/blob/main/packages/module/patternfly-docs/content/extensions/react-log-viewer/examples/basic.md Log viewer with ANSI color support. ```javascript import React from 'react'; import { LogViewer } from '@patternfly/react-log-viewer'; import { data } from '@patternfly/react-log-viewer/patternfly-docs/content/extensions/react-log-viewer/examples/realTestData.js'; // Sample data with ANSI escape codes const ansiData = [ '\u001b[31mThis is a red log message\u001b[0m', '\u001b[32mThis is a green log message\u001b[0m', '\u001b[33mThis is a yellow log message\u001b[0m', 'This is a normal log message' ]; export const ANSIColorLogViewer = () => ( ); ``` -------------------------------- ### Commands Source: https://github.com/patternfly/react-log-viewer/blob/main/CLAUDE.md Build, test, and lint commands for the react-log-viewer library. ```bash yarn build # Build the library yarn test # Run unit tests yarn lint # Lint the codebase ``` ```bash yarn build:docs && yarn serve:docs # Start docs server yarn test:a11y # Run a11y tests (in separate terminal) ``` -------------------------------- ### With complex toolbar Source: https://github.com/patternfly/react-log-viewer/blob/main/packages/module/patternfly-docs/content/extensions/react-log-viewer/demos/LogViewer.md Log viewer with a complex toolbar. ```javascript import { useState, useRef, useEffect, Fragment } from 'react'; import { data } from '@patternfly/react-log-viewer/patternfly-docs/content/extensions/react-log-viewer/examples/realTestData.js'; import { LogViewer, LogViewerSearch } from '@patternfly/react-log-viewer'; import { Badge, Button, MenuToggle, Select, SelectList, SelectOption, Tooltip, Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem, ToolbarToggleGroup } from '@patternfly/react-core'; import OutlinedPlayCircleIcon from '@patternfly/react-icons/dist/esm/icons/outlined-play-circle-icon'; import ExpandIcon from '@patternfly/react-icons/dist/esm/icons/expand-icon'; import PauseIcon from '@patternfly/react-icons/dist/esm/icons/pause-icon'; import PlayIcon from '@patternfly/react-icons/dist/esm/icons/play-icon'; import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; import DownloadIcon from '@patternfly/react-icons/dist/esm/icons/download-icon'; export const ComplexToolbarLogViewer = () => { const [isSelectOpen, setIsSelectOpen] = useState(false); const [selected, setSelected] = useState('All logs'); const [isSearchOpen, setIsSearchOpen] = useState(false); const [isLive, setIsLive] = useState(true); const [logData, setLogData] = useState(data); const logViewerRef = useRef(null); const onSelect = (event, selection) => { setSelected(selection); setIsSelectOpen(false); }; const onToggleSelect = () => { setIsSelectOpen(!isSelectOpen); }; const onToggleSearch = () => { setIsSearchOpen(!isSearchOpen); }; const onToggleLive = () => { setIsLive(!isLive); }; const onDownload = () => { // In a real application, you would trigger a download of the log data here. console.log('Download logs'); }; useEffect(() => { let intervalId; if (isLive) { intervalId = setInterval(() => { setLogData(prevData => [ ...prevData, `New log entry ${Date.now()}` ]); }, 1000); } return () => clearInterval(intervalId); }, [isLive]); const toolbar = ( }> ); return ( {toolbar}