Skip to content

Commit f1bdefb

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

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,14 +1,18 @@
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';
13+
import useAppParams from 'lib/hooks/useAppParams';
14+
import { RouteParamsClusterTopic } from 'lib/paths';
15+
import { useTopicActions } from 'components/contexts/TopicActionsContext';
1216

1317
import MessageContent from './MessageContent/MessageContent';
1418
import * as S from './MessageContent/MessageContent.styled';
@@ -41,7 +45,24 @@ const Message: React.FC<Props> = ({
4145
keyFilters,
4246
contentFilters,
4347
}) => {
48+
const { topicName } = useAppParams<RouteParamsClusterTopic>();
49+
const { openSidebarWithMessage } = useTopicActions();
4450
const [isOpen, setIsOpen] = React.useState(false);
51+
52+
const message = {
53+
timestamp,
54+
timestampType,
55+
offset,
56+
key,
57+
keySize,
58+
partition,
59+
value,
60+
valueSize,
61+
headers,
62+
valueSerde,
63+
keySerde,
64+
};
65+
4566
const savedMessageJson = {
4667
Value: value,
4768
Offset: offset,
@@ -138,10 +159,28 @@ const Message: React.FC<Props> = ({
138159
<td style={{ width: '5%' }}>
139160
{vEllipsisOpen && (
140161
<Dropdown>
141-
<DropdownItem onClick={copyToClipboard}>
162+
<DropdownItem
163+
aria-label="Copy to clipboard"
164+
onClick={copyToClipboard}
165+
>
142166
Copy to clipboard
143167
</DropdownItem>
144-
<DropdownItem onClick={saveFile}>Save as a file</DropdownItem>
168+
<DropdownItem aria-label="Save as a file" onClick={saveFile}>
169+
Save as a file
170+
</DropdownItem>
171+
<ActionDropdownItem
172+
aria-label="Produce message"
173+
onClick={() => {
174+
openSidebarWithMessage(message);
175+
}}
176+
permission={{
177+
resource: ResourceType.TOPIC,
178+
action: Action.MESSAGES_PRODUCE,
179+
value: topicName,
180+
}}
181+
>
182+
Produce message
183+
</ActionDropdownItem>
145184
</Dropdown>
146185
)}
147186
</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)