Skip to content

Commit cfad322

Browse files
committed
FE: Add dropdown action to re-produce existing message into topic (#247)
1 parent 40984bf commit cfad322

File tree

12 files changed

+747
-127
lines changed

12 files changed

+747
-127
lines changed

frontend/src/components/Topics/Topic/Messages/Message.tsx

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import React from 'react';
22
import useDataSaver from 'lib/hooks/useDataSaver';
3-
import { TopicMessage } from 'generated-sources';
3+
import { Action, ResourceType, TopicMessage } from 'generated-sources';
44
import MessageToggleIcon from 'components/common/Icons/MessageToggleIcon';
55
import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper';
66
import { Dropdown, DropdownItem } from 'components/common/Dropdown';
7+
import { ActionDropdownItem } from 'components/common/ActionComponent';
78
import { formatTimestamp } from 'lib/dateTimeHelpers';
89
import { JSONPath } from 'jsonpath-plus';
910
import Ellipsis from 'components/common/Ellipsis/Ellipsis';
1011
import WarningRedIcon from 'components/common/Icons/WarningRedIcon';
1112
import Tooltip from 'components/common/Tooltip/Tooltip';
1213
import { useTimezone } from 'lib/hooks/useTimezones';
14+
import useAppParams from 'lib/hooks/useAppParams';
15+
import { RouteParamsClusterTopic } from 'lib/paths';
16+
import { useTopicActions } from 'components/contexts/TopicActionsContext';
1317

1418
import MessageContent from './MessageContent/MessageContent';
1519
import * as S from './MessageContent/MessageContent.styled';
@@ -43,7 +47,24 @@ const Message: React.FC<Props> = ({
4347
contentFilters,
4448
}) => {
4549
const { currentTimezone } = useTimezone();
50+
const { topicName } = useAppParams<RouteParamsClusterTopic>();
51+
const { openSidebarWithMessage } = useTopicActions();
4652
const [isOpen, setIsOpen] = React.useState(false);
53+
54+
const message = {
55+
timestamp,
56+
timestampType,
57+
offset,
58+
key,
59+
keySize,
60+
partition,
61+
value,
62+
valueSize,
63+
headers,
64+
valueSerde,
65+
keySerde,
66+
};
67+
4768
const savedMessageJson = {
4869
Value: value,
4970
Offset: offset,
@@ -142,10 +163,28 @@ const Message: React.FC<Props> = ({
142163
<td style={{ width: '5%' }}>
143164
{vEllipsisOpen && (
144165
<Dropdown>
145-
<DropdownItem onClick={copyToClipboard}>
166+
<DropdownItem
167+
aria-label="Copy to clipboard"
168+
onClick={copyToClipboard}
169+
>
146170
Copy to clipboard
147171
</DropdownItem>
148-
<DropdownItem onClick={saveFile}>Save as a file</DropdownItem>
172+
<DropdownItem aria-label="Save as a file" onClick={saveFile}>
173+
Save as a file
174+
</DropdownItem>
175+
<ActionDropdownItem
176+
aria-label="Reproduce message"
177+
onClick={() => {
178+
openSidebarWithMessage(message);
179+
}}
180+
permission={{
181+
resource: ResourceType.TOPIC,
182+
action: Action.MESSAGES_PRODUCE,
183+
value: topicName,
184+
}}
185+
>
186+
Reproduce message
187+
</ActionDropdownItem>
149188
</Dropdown>
150189
)}
151190
</td>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import {
2+
Action,
3+
ResourceType,
4+
TopicMessage,
5+
TopicMessageTimestampTypeEnum,
6+
} from 'generated-sources';
7+
import { PreviewFilter } from 'components/Topics/Topic/Messages/Message';
8+
import { RolesType } from 'lib/permissions';
9+
10+
export const mockMessageContentText = 'messageContentText';
11+
12+
export const mockRoles: Map<string, Map<ResourceType, RolesType>> = new Map([
13+
[
14+
'test-cluster',
15+
new Map([
16+
[
17+
ResourceType.TOPIC,
18+
[
19+
{
20+
resource: ResourceType.TOPIC,
21+
actions: [Action.MESSAGES_PRODUCE, Action.VIEW],
22+
value: '.*',
23+
clusters: ['test-cluster'],
24+
},
25+
],
26+
],
27+
]),
28+
],
29+
]);
30+
31+
export const mockNoRoles: Map<string, Map<ResourceType, RolesType>> = new Map([
32+
['test-cluster', new Map([])],
33+
]);
34+
35+
export const mockMessageKey = '{"payload":{"subreddit":"learnprogramming"}}';
36+
37+
export const mockMessageValue =
38+
'{"payload":{"author":"DwaywelayTOP","archived":false,"name":"t3_11jshwd","id":"11jshwd"}}';
39+
export const mockMessage: TopicMessage = {
40+
timestamp: new Date(),
41+
timestampType: TopicMessageTimestampTypeEnum.CREATE_TIME,
42+
offset: 0,
43+
key: 'test-key',
44+
partition: 6,
45+
value: '{"data": "test"}',
46+
headers: { header: 'test' },
47+
};
48+
49+
export const mockKeyFilters: PreviewFilter = {
50+
field: 'sub',
51+
path: '$.payload.subreddit',
52+
};
53+
54+
export const mockContentFilters: PreviewFilter = {
55+
field: 'author',
56+
path: '$.payload.author',
57+
};

0 commit comments

Comments
 (0)