Skip to content

Commit f297f08

Browse files
committed
feat: should scroll to selected offset
1 parent 2af2961 commit f297f08

File tree

3 files changed

+51
-30
lines changed

3 files changed

+51
-30
lines changed

src/containers/Tenant/Diagnostics/TopicData/TopicData.tsx

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,18 @@ export function TopicData({parentRef, path, database}: TopicDataProps) {
164164
}, [handleSelectedOffsetChange, handleStartTimestampChange, topicDataFilter]);
165165

166166
const scrollToOffset = React.useCallback(
167-
(newOffset: number) => {
167+
(newOffset: number, reset?: boolean) => {
168168
const scrollTop = (newOffset - (baseOffset ?? 0)) * DEFAULT_TABLE_ROW_HEIGHT;
169169
const normalizedScrollTop = Math.max(0, scrollTop);
170170
parentRef.current?.scrollTo({
171171
top: normalizedScrollTop,
172172
behavior: 'instant',
173173
});
174+
if (reset) {
175+
resetFilters();
176+
}
174177
},
175-
[baseOffset, parentRef],
178+
[baseOffset, parentRef, resetFilters],
176179
);
177180

178181
React.useEffect(() => {
@@ -189,20 +192,6 @@ export function TopicData({parentRef, path, database}: TopicDataProps) {
189192
}
190193
}, [currentData, isFetching, scrollToOffset]);
191194

192-
const scrollToStartOffset = React.useCallback(() => {
193-
if (startOffset) {
194-
resetFilters();
195-
scrollToOffset(startOffset);
196-
}
197-
}, [startOffset, scrollToOffset, resetFilters]);
198-
199-
const scrollToEndOffset = React.useCallback(() => {
200-
if (endOffset) {
201-
resetFilters();
202-
scrollToOffset(endOffset);
203-
}
204-
}, [endOffset, scrollToOffset, resetFilters]);
205-
206195
const renderControls: RenderControls = () => {
207196
return (
208197
<TopicDataControls
@@ -213,10 +202,9 @@ export function TopicData({parentRef, path, database}: TopicDataProps) {
213202
partitions={partitions}
214203
partitionsLoading={partitionsLoading}
215204
partitionsError={partitionsError}
216-
initialOffset={startOffset}
205+
startOffset={startOffset}
217206
endOffset={endOffset}
218-
scrollToStartOffset={scrollToStartOffset}
219-
scrollToEndOffset={scrollToEndOffset}
207+
scrollToOffset={scrollToOffset}
220208
/>
221209
);
222210
};

src/containers/Tenant/Diagnostics/TopicData/TopicDataControls/TopicDataControls.tsx

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react';
33
import type {Value} from '@gravity-ui/date-components';
44
import {RelativeDatePicker} from '@gravity-ui/date-components';
55
import {dateTimeParse} from '@gravity-ui/date-utils';
6-
import {ArrowDownToLine, ArrowUpToLine} from '@gravity-ui/icons';
6+
import {ArrowDownToLine, ArrowUpToLine, CircleChevronDownFill} from '@gravity-ui/icons';
77
import type {TableColumnSetupItem} from '@gravity-ui/uikit';
88
import {
99
ActionTooltip,
@@ -21,6 +21,7 @@ import {EntitiesCount} from '../../../../../components/EntitiesCount';
2121
import type {PreparedPartitionData} from '../../../../../store/reducers/partitions/types';
2222
import {formatNumber} from '../../../../../utils/dataFormatters/dataFormatters';
2323
import {prepareErrorMessage} from '../../../../../utils/prepareErrorMessage';
24+
import {safeParseNumber} from '../../../../../utils/utils';
2425
import i18n from '../i18n';
2526
import {useTopicDataQueryParams} from '../useTopicDataQueryParams';
2627
import {b} from '../utils/constants';
@@ -35,23 +36,21 @@ interface TopicDataControlsProps {
3536
partitionsLoading: boolean;
3637
partitionsError: unknown;
3738

38-
initialOffset?: number;
39+
startOffset?: number;
3940
endOffset?: number;
40-
scrollToStartOffset: VoidFunction;
41-
scrollToEndOffset: VoidFunction;
41+
scrollToOffset: (start: number, reset?: boolean) => void;
4242
}
4343

4444
export function TopicDataControls({
4545
columnsToSelect,
4646
handleSelectedColumnsUpdate,
4747

48-
initialOffset,
48+
startOffset,
4949
endOffset,
5050
partitions,
5151
partitionsLoading,
5252
partitionsError,
53-
scrollToStartOffset,
54-
scrollToEndOffset,
53+
scrollToOffset,
5554
}: TopicDataControlsProps) {
5655
const {
5756
selectedPartition,
@@ -78,6 +77,18 @@ export function TopicDataControls({
7877
],
7978
);
8079

80+
const scrollToStartOffset = React.useCallback(() => {
81+
if (startOffset) {
82+
scrollToOffset(startOffset, true);
83+
}
84+
}, [startOffset, scrollToOffset]);
85+
86+
const scrollToEndOffset = React.useCallback(() => {
87+
if (endOffset) {
88+
scrollToOffset(endOffset, true);
89+
}
90+
}, [endOffset, scrollToOffset]);
91+
8192
return (
8293
<React.Fragment>
8394
<Select
@@ -93,15 +104,15 @@ export function TopicDataControls({
93104
error={Boolean(partitionsError)}
94105
loading={partitionsLoading}
95106
/>
96-
<TopicDataStartControls />
107+
<TopicDataStartControls scrollToOffset={scrollToOffset} />
97108
<TableColumnSetup
98109
popupWidth={242}
99110
items={columnsToSelect}
100111
showStatus
101112
onUpdate={handleSelectedColumnsUpdate}
102113
sortable={false}
103114
/>
104-
{!isNil(initialOffset) && !isNil(endOffset) && (
115+
{!isNil(startOffset) && !isNil(endOffset) && (
105116
<Flex gap={0.5}>
106117
<ActionTooltip title={i18n('action_scroll-up')}>
107118
<Button
@@ -115,7 +126,7 @@ export function TopicDataControls({
115126
</ActionTooltip>
116127
<EntitiesCount
117128
label={i18n('label_offset')}
118-
current={`${formatNumber(initialOffset)}${formatNumber(endOffset - 1)}`}
129+
current={`${formatNumber(startOffset)}${formatNumber(endOffset - 1)}`}
119130
className={b('offsets-count')}
120131
/>
121132
<ActionTooltip title={i18n('action_scroll-down')}>
@@ -134,7 +145,11 @@ export function TopicDataControls({
134145
);
135146
}
136147

137-
function TopicDataStartControls() {
148+
interface TopicDataStartControlsProps {
149+
scrollToOffset: (start: number, reset?: boolean) => void;
150+
}
151+
152+
function TopicDataStartControls({scrollToOffset}: TopicDataStartControlsProps) {
138153
const {
139154
selectedOffset,
140155
startTimestamp,
@@ -199,12 +214,29 @@ function TopicDataStartControls() {
199214
placeholder={i18n('label_offset')}
200215
type="number"
201216
debounce={600}
217+
endContent={
218+
<ActionTooltip title={i18n('action_scroll-selected')}>
219+
<Button
220+
disabled={isNil(selectedOffset) || selectedOffset === ''}
221+
view="flat-action"
222+
size="xs"
223+
onClick={() => {
224+
if (selectedOffset) {
225+
scrollToOffset(safeParseNumber(selectedOffset));
226+
}
227+
}}
228+
>
229+
<Icon size={14} data={CircleChevronDownFill} />
230+
</Button>
231+
</ActionTooltip>
232+
}
202233
autoFocus
203234
/>
204235
)}
205236
{topicDataFilter === 'TIMESTAMP' && (
206237
<RelativeDatePicker
207238
format="YYYY-MM-DD HH:mm:ss"
239+
placeholder="YYYY-MM-DD HH:mm:ss"
208240
hasClear
209241
isDateUnavailable={(value) => value.isAfter(dateTimeParse())}
210242
label={i18n('label_from')}

src/containers/Tenant/Diagnostics/TopicData/i18n/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"label_by-offset": "By offset",
2222
"label_by-timestamp": "By timestamp",
2323
"action_scroll-down": "Scroll to the end",
24+
"action_scroll-selected": "Scroll to selected offset",
2425
"action_scroll-up": "Scroll to the start",
2526
"action_show-message": "Show message content"
2627
}

0 commit comments

Comments
 (0)