diff --git a/studio/components/ui/Logs/LogPanel.tsx b/studio/components/ui/Logs/LogPanel.tsx index f9491482e47..32f1284316b 100644 --- a/studio/components/ui/Logs/LogPanel.tsx +++ b/studio/components/ui/Logs/LogPanel.tsx @@ -5,23 +5,33 @@ import Panel from 'components/to-be-cleaned/Panel' interface Props { onRefresh?: () => void onSearch?: (query: string) => void + onCustomClick?: () => void isLoading: boolean children?: JSX.Element - heading?: JSX.Element + searchValue?: string + presets?: { + label: string + onClick: () => void + }[] } /** * Logs control panel header + wrapper */ -const LogPanel = ({ onRefresh, isLoading, heading, children, onSearch }: Props) => ( +const LogPanel = ({ onRefresh, isLoading, searchValue, children, onSearch, onCustomClick, presets = [] }: Props) => ( - +
+ {presets.map(p => + + )} + +
{ - if(onSearch) onSearch(e.target.value) - }} /> + if (onSearch) onSearch(e.target.value) + }} value={searchValue} /> +
} diff --git a/studio/pages/project/[ref]/settings/logs/[type].tsx b/studio/pages/project/[ref]/settings/logs/[type].tsx index d9c06a4d7cc..68fc1fdc141 100644 --- a/studio/pages/project/[ref]/settings/logs/[type].tsx +++ b/studio/pages/project/[ref]/settings/logs/[type].tsx @@ -26,6 +26,7 @@ export const LogPage = () => { const [search, setSearch] = useState('') const [queryParams, setQueryParams] = useState('') const [where, setWhere] = useState('') + const [mode, setMode] = useState<'simple' | 'custom'>('simple') const [latestRefresh, setLatestRefresh] = useState(new Date().toISOString()) const title = LOG_TYPE_LABEL_MAPPING[type as string] @@ -53,7 +54,7 @@ export const LogPage = () => { } const qs = new URLSearchParams(params).toString() setQueryParams(qs) - }, [search, where]) + }, [search, where, type]) const countKey = `${API_URL}/projects/${ref}/logs?${queryParams}&count=true&period_start=${latestRefresh}` const { data: countData } = useSWR<{ data: [CountData] | []; error?: any }>(countKey, get, { @@ -66,24 +67,39 @@ export const LogPage = () => { setLatestRefresh(new Date().toISOString()) mutate() } + const handleModeToggle = () => { + if (mode === 'simple') { + setMode('custom') + setSearch('') + } else { + setMode('simple') + } + } return ( - -
- debouncedWhere(v || '')} - onInputRun={handleRefresh} - /> -
+ setSearch('') }, + { label: "Recent - Errors", onClick: () => setSearch('[Ee]rror|\\s[45][0-9][0-9]\\s') }, + ]} + searchValue={search} + onCustomClick={handleModeToggle} isLoading={isLoading} onRefresh={handleRefresh} onSearch={debouncedSearch} /> + {mode === 'custom' && +
+ debouncedWhere(v || '')} + onInputRun={handleRefresh} + /> +
} {error && ( Could not fetch data )} - {newCount && newCount > 0 && } + {newCount ? : null}
) diff --git a/studio/tests/pages/projects/logs.test.js b/studio/tests/pages/projects/logs.test.js index a76a9226c2b..1d72247bc89 100644 --- a/studio/tests/pages/projects/logs.test.js +++ b/studio/tests/pages/projects/logs.test.js @@ -154,7 +154,10 @@ test("where clause will trigger a log refresh", async () => { return { data: [] } }) const { container } = render() - const editor = container.querySelector('.monaco-editor'); + let editor = container.querySelector('.monaco-editor'); + expect(editor).toBeFalsy() + userEvent.click(screen.getAllByText("Custom Query")) + editor = container.querySelector('.monaco-editor'); userEvent.type(editor, "metadata.field = something") await waitFor(() => { expect(get).toHaveBeenCalledWith(expect.stringContaining("where"))