Skip to content

Commit db19998

Browse files
Loori-Rvalyala
andauthored
app/vmui: fix groups auto-expand on list update (#499)
Co-authored-by: Aliaksandr Valialkin <[email protected]>
1 parent 4a88688 commit db19998

File tree

10 files changed

+112
-27
lines changed

10 files changed

+112
-27
lines changed

app/vmui/packages/vmui/src/components/Chart/BarHitsChart/BarHitsOptions/BarHitsOptions.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,6 @@ const BarHitsOptions: FC<Props> = ({ onChange }) => {
6161

6262
return (
6363
<div className="vm-bar-hits-options">
64-
<Tooltip title={hideChart ? "Show chart and resume hits updates" : "Hide chart and pause hits updates"}>
65-
<Button
66-
variant="text"
67-
color="primary"
68-
startIcon={hideChart ? <VisibilityOffIcon/> : <VisibilityIcon/>}
69-
onClick={toggleHideChart}
70-
ariaLabel="settings"
71-
/>
72-
</Tooltip>
7364
<div ref={optionsButtonRef}>
7465
<Tooltip title="Graph settings">
7566
<Button
@@ -81,6 +72,15 @@ const BarHitsOptions: FC<Props> = ({ onChange }) => {
8172
/>
8273
</Tooltip>
8374
</div>
75+
<Tooltip title={hideChart ? "Show chart and resume hits updates" : "Hide chart and pause hits updates"}>
76+
<Button
77+
variant="text"
78+
color="primary"
79+
startIcon={hideChart ? <VisibilityOffIcon/> : <VisibilityIcon/>}
80+
onClick={toggleHideChart}
81+
ariaLabel="settings"
82+
/>
83+
</Tooltip>
8484
<Popper
8585
open={openOptions}
8686
placement="bottom-right"

app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,22 @@ import usePrevious from "../../hooks/usePrevious";
2323
const storageLimit = Number(getFromStorage("LOGS_LIMIT"));
2424
const defaultLimit = isNaN(storageLimit) ? LOGS_ENTRIES_LIMIT : storageLimit;
2525

26+
type FetchFlags = { logs: boolean; hits: boolean };
27+
2628
const ExploreLogs: FC = () => {
2729
const { serverUrl } = useAppState();
2830
const { queryHistory } = useQueryState();
2931
const queryDispatch = useQueryDispatch();
3032
const { duration, relativeTime, period: periodState } = useTimeState();
3133
const { setSearchParamsFromKeys } = useSearchParamsFromObject();
3234
const [searchParams] = useSearchParams();
35+
3336
const hideChart = useMemo(() => searchParams.get("hide_chart"), [searchParams]);
3437
const prevHideChart = usePrevious(hideChart);
3538

39+
const hideLogs = useMemo(() => searchParams.get("hide_logs"), [searchParams]);
40+
const prevHideLogs = usePrevious(hideLogs);
41+
3642
const [limit, setLimit] = useStateSearchParams(defaultLimit, "limit");
3743
const [query, setQuery] = useStateSearchParams("*", "query");
3844

@@ -54,10 +60,15 @@ const ExploreLogs: FC = () => {
5460
const { logs, isLoading, error, fetchLogs, abortController } = useFetchLogs(serverUrl, query, limit);
5561
const { fetchLogHits, ...dataLogHits } = useFetchLogHits(serverUrl, query);
5662

57-
const fetchData = (p: TimeParams, hits: boolean) => {
58-
fetchLogs(p).then((isSuccess) => {
59-
if (isSuccess && hits) fetchLogHits(p);
60-
}).catch(() => {/* error handled elsewhere */});
63+
const fetchData = async (p: TimeParams, flags: FetchFlags) => {
64+
if (flags.logs) {
65+
const isSuccess = await fetchLogs(p);
66+
if (!isSuccess) return;
67+
}
68+
69+
if (flags.hits) {
70+
await fetchLogHits(p);
71+
}
6172
};
6273

6374
const debouncedFetchLogs = useDebounceCallback(fetchData, 300);
@@ -78,7 +89,7 @@ const ExploreLogs: FC = () => {
7889

7990
const newPeriod = getPeriod();
8091
setPeriod(newPeriod);
81-
debouncedFetchLogs(newPeriod, !hideChart);
92+
debouncedFetchLogs(newPeriod, { logs: !hideLogs, hits: !hideChart });
8293
setSearchParamsFromKeys({
8394
query,
8495
"g0.range_input": duration,
@@ -125,6 +136,12 @@ const ExploreLogs: FC = () => {
125136
}
126137
}, [hideChart, prevHideChart, period]);
127138

139+
useEffect(() => {
140+
if (!hideLogs && prevHideLogs) {
141+
fetchLogs(period);
142+
}
143+
}, [hideLogs, prevHideLogs, period]);
144+
128145
return (
129146
<div className="vm-explore-logs">
130147
<ExploreLogsHeader

app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBarChart/ExploreLogsBarChart.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ const ExploreLogsBarChart: FC<Props> = ({ logHits, period, error, isLoading, onA
6969
}, [logHits]);
7070

7171
const noDataMessage: string = useMemo(() => {
72+
if (isLoading) return "";
73+
7274
const noData = data.every(d => d.length === 0);
7375
const noTimestamps = data[0].length === 0;
7476
const noValues = data[1].length === 0;
@@ -81,7 +83,7 @@ const ExploreLogsBarChart: FC<Props> = ({ logHits, period, error, isLoading, onA
8183
} else if (noValues) {
8284
return "No value information available for the current queries and time range.";
8385
} return "";
84-
}, [data, hideChart]);
86+
}, [data, hideChart, isLoading]);
8587

8688
const setPeriod = ({ from, to }: {from: Date, to: Date}) => {
8789
timeDispatch({ type: "SET_PERIOD", payload: { from, to } });

app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import { FC, useRef } from "preact/compat";
2-
import { CodeIcon, ListIcon, TableIcon, PlayIcon } from "../../../components/Main/Icons";
2+
import {
3+
CodeIcon,
4+
ListIcon,
5+
TableIcon,
6+
PlayIcon,
7+
VisibilityOffIcon,
8+
VisibilityIcon
9+
} from "../../../components/Main/Icons";
310
import Tabs from "../../../components/Main/Tabs/Tabs";
411
import "./style.scss";
512
import classNames from "classnames";
@@ -12,6 +19,10 @@ import GroupView from "./views/GroupView/GroupView";
1219
import TableView from "./views/TableView/TableView";
1320
import JsonView from "./views/JsonView/JsonView";
1421
import LiveTailingView from "./views/LiveTailingView/LiveTailingView";
22+
import Tooltip from "../../../components/Main/Tooltip/Tooltip";
23+
import Button from "../../../components/Main/Button/Button";
24+
import { useSearchParams } from "react-router-dom";
25+
import Alert from "../../../components/Main/Alert/Alert";
1526

1627
export interface ExploreLogBodyProps {
1728
data: Logs[];
@@ -38,6 +49,18 @@ const ExploreLogsBody: FC<ExploreLogBodyProps> = ({ data, isLoading }) => {
3849
const [activeTab, setActiveTab] = useStateSearchParams(DisplayType.group, "view");
3950
const settingsRef = useRef<HTMLDivElement>(null);
4051

52+
const [searchParams, setSearchParams] = useSearchParams();
53+
const [hideLogs, setHideLogs] = useStateSearchParams(false, "hide_logs");
54+
55+
const toggleHideLogs = () => {
56+
setHideLogs(prev => {
57+
const newVal = !prev;
58+
newVal ? searchParams.set("hide_logs", "true") : searchParams.delete("hide_logs");
59+
setSearchParams(searchParams);
60+
return newVal;
61+
});
62+
};
63+
4164
const handleChangeTab = (view: string) => {
4265
setActiveTab(view as DisplayType);
4366
setSearchParamsFromKeys({ view });
@@ -82,19 +105,33 @@ const ExploreLogsBody: FC<ExploreLogBodyProps> = ({ data, isLoading }) => {
82105
className="vm-explore-logs-body-header__settings"
83106
ref={settingsRef}
84107
/>
108+
<Tooltip title={hideLogs ? "Show Logs" : "Hide Logs"}>
109+
<Button
110+
variant="text"
111+
color="primary"
112+
startIcon={hideLogs ? <VisibilityOffIcon/> : <VisibilityIcon/>}
113+
onClick={toggleHideLogs}
114+
ariaLabel="settings"
115+
/>
116+
</Tooltip>
85117
</div>
86118

87119
<div
88120
className={classNames({
89121
"vm-explore-logs-body__table": true,
122+
"vm-explore-logs-body__table_hide": hideLogs,
90123
"vm-explore-logs-body__table_mobile": isMobile,
91124
})}
92125
>
93-
{ActiveTabComponent &&
94-
<ActiveTabComponent
95-
data={data}
96-
settingsRef={settingsRef}
97-
/>
126+
{hideLogs && (
127+
<Alert variant="info">Logs are hidden. Updates paused.</Alert>
128+
)}
129+
130+
{!hideLogs && ActiveTabComponent &&
131+
<ActiveTabComponent
132+
data={data}
133+
settingsRef={settingsRef}
134+
/>
98135
}
99136
</div>
100137
</div>

app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/style.scss

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
position: relative;
55

66
&-header {
7-
background-color: $color-background-block;
8-
z-index: 3;
9-
margin: -$padding-medium 0-$padding-medium 0;
107
position: sticky;
118
top: 0;
9+
margin: -$padding-medium 0-$padding-medium 0;
10+
grid-template-columns: 1fr auto auto;
11+
background-color: $color-background-block;
12+
z-index: 3;
1213

1314
@media (max-width:1000px) {
1415
top: 51px;

app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/views/TableView/style.scss

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@
55
&__settings-buttons {
66
display: flex;
77
align-items: center;
8-
gap: $padding-small;
98
}
10-
}
9+
}

app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogs.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ const GroupLogs: FC<Props> = ({ logs, settingsRef }) => {
6868
const paginatedGroups = usePaginateGroups(groupData, page, rowsPerPage);
6969

7070
const handleToggleExpandAll = useCallback(() => {
71-
setExpandGroups(new Array(groupData.length).fill(!expandAll));
71+
setExpandGroups(prev => {
72+
const keepClosed = (prev.every(v => !v) && prev.length) || isMobile;
73+
return new Array(groupData.length).fill(!keepClosed);
74+
});
7275
}, [expandAll, groupData.length]);
7376

7477
const handleChangeExpand = useCallback((i: number) => (value: boolean) => {

app/vmui/packages/vmui/src/pages/ExploreLogs/hooks/useFetchLogHits.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ import { getHitsTimeParams } from "../../../utils/logs";
66
import { LOGS_GROUP_BY, LOGS_LIMIT_HITS } from "../../../constants/logs";
77
import { isEmptyObject } from "../../../utils/object";
88
import { useTenant } from "../../../hooks/useTenant";
9+
import { useSearchParams } from "react-router-dom";
910

1011
export const useFetchLogHits = (server: string, query: string) => {
1112
const tenant = useTenant();
13+
const [searchParams] = useSearchParams();
14+
1215
const [logHits, setLogHits] = useState<LogHits[]>([]);
1316
const [isLoading, setIsLoading] = useState<{[key: number]: boolean;}>([]);
1417
const [error, setError] = useState<ErrorTypes | string>();
1518
const abortControllerRef = useRef(new AbortController());
1619

20+
const hideChart = useMemo(() => searchParams.get("hide_chart"), [searchParams]);
21+
1722
const url = useMemo(() => getLogHitsUrl(server), [server]);
1823

1924
const getOptions = (query: string, period: TimeParams, signal: AbortSignal) => {
@@ -81,6 +86,13 @@ export const useFetchLogHits = (server: string, query: string) => {
8186
};
8287
}, []);
8388

89+
useEffect(() => {
90+
if (hideChart) {
91+
setLogHits([]);
92+
setError(undefined);
93+
}
94+
}, [hideChart]);
95+
8496
return {
8597
logHits,
8698
isLoading: Object.values(isLoading).some(s => s),

app/vmui/packages/vmui/src/pages/ExploreLogs/hooks/useFetchLogs.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@ import { ErrorTypes, TimeParams } from "../../../types";
44
import { Logs } from "../../../api/types";
55
import dayjs from "dayjs";
66
import { useTenant } from "../../../hooks/useTenant";
7+
import { useSearchParams } from "react-router-dom";
78

89
export const useFetchLogs = (server: string, query: string, limit: number) => {
910
const tenant = useTenant();
11+
const [searchParams] = useSearchParams();
1012

1113
const [logs, setLogs] = useState<Logs[]>([]);
1214
const [isLoading, setIsLoading] = useState<{ [key: number]: boolean }>({});
1315
const [error, setError] = useState<ErrorTypes | string>();
1416
const abortControllerRef = useRef(new AbortController());
1517

18+
const hideLogs = useMemo(() => searchParams.get("hide_logs"), [searchParams]);
19+
1620
const url = useMemo(() => getLogsUrl(server), [server]);
1721

1822
const getOptions = (query: string, period: TimeParams, limit: number, signal: AbortSignal) => ({
@@ -75,6 +79,13 @@ export const useFetchLogs = (server: string, query: string, limit: number) => {
7579
};
7680
}, []);
7781

82+
useEffect(() => {
83+
if (hideLogs) {
84+
setLogs([]);
85+
setError(undefined);
86+
}
87+
}, [hideLogs]);
88+
7889
return {
7990
logs,
8091
isLoading: Object.values(isLoading).some(s => s),

docs/victorialogs/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ according to [these docs](https://docs.victoriametrics.com/victorialogs/quicksta
1919
## tip
2020

2121
* FEATURE: [vlogscli](https://docs.victoriametrics.com/victorialogs/querying/vlogscli/): add ability to configure auth options and TLS options for connections to the `-datasource.url`. See [auth options docs](https://docs.victoriametrics.com/victorialogs/querying/vlogscli/#auth-options) and [TLS options docs](https://docs.victoriametrics.com/victorialogs/querying/vlogscli/#tls-options). See [this feature request](https://github.com/VictoriaMetrics/VictoriaLogs/issues/54). Thanks to @thom-vend for [the initial pull request](https://github.com/VictoriaMetrics/VictoriaLogs/pull/457).
22+
* FEATURE: [web UI](https://docs.victoriametrics.com/victorialogs/querying/#web-ui): add the ability to hide the logs panel to view only the graph. When the logs panel is hidden, the `/query` request is not executed.
2223
* FEATURE: [web UI](https://docs.victoriametrics.com/victorialogs/querying/#web-ui): improve autocomplete functionality with enhanced quick autocomplete via hotkey support and removed special characters from autocomplete suggestions. See [this comment](https://github.com/VictoriaMetrics/VictoriaLogs/issues/70#issuecomment-3043591443) for details.
24+
*
25+
* BUGFIX: [web UI](https://docs.victoriametrics.com/victorialogs/querying/#web-ui): prevent groups from automatically expanding on list updates if all groups were previously collapsed. See [#92](https://github.com/VictoriaMetrics/VictoriaLogs/issues/92).
2326

2427
## [v1.25.1](https://github.com/VictoriaMetrics/VictoriaLogs/releases/tag/v1.25.1)
2528

0 commit comments

Comments
 (0)