123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- import React from 'react';
- import {
- ClusterName,
- TopicName,
- TopicWithDetailedInfo,
- } from 'redux/interfaces';
- import DropdownItem from 'components/common/Dropdown/DropdownItem';
- import Dropdown from 'components/common/Dropdown/Dropdown';
- import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal';
- import ClusterContext from 'components/contexts/ClusterContext';
- import BytesFormatted from 'components/common/BytesFormatted/BytesFormatted';
- import { Tag } from 'components/common/Tag/Tag.styled';
- import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon';
- import { TableKeyLink } from 'components/common/table/Table/TableKeyLink.styled';
- import * as S from './List.styled';
- export interface ListItemProps {
- topic: TopicWithDetailedInfo;
- selected: boolean;
- toggleTopicSelected(topicName: TopicName): void;
- deleteTopic: (clusterName: ClusterName, topicName: TopicName) => void;
- recreateTopic: (clusterName: ClusterName, topicName: TopicName) => void;
- clusterName: ClusterName;
- clearTopicMessages(topicName: TopicName, clusterName: ClusterName): void;
- }
- const ListItem: React.FC<ListItemProps> = ({
- topic: {
- name,
- internal,
- partitions,
- segmentSize,
- replicationFactor,
- cleanUpPolicy,
- },
- selected,
- toggleTopicSelected,
- deleteTopic,
- recreateTopic,
- clusterName,
- clearTopicMessages,
- }) => {
- const { isReadOnly, isTopicDeletionAllowed } =
- React.useContext(ClusterContext);
- const [isDeleteTopicConfirmationVisible, setDeleteTopicConfirmationVisible] =
- React.useState(false);
- const [
- isRecreateTopicConfirmationVisible,
- setRecreateTopicConfirmationVisible,
- ] = React.useState(false);
- const { outOfSyncReplicas, numberOfMessages } = React.useMemo(() => {
- if (partitions === undefined || partitions.length === 0) {
- return {
- outOfSyncReplicas: 0,
- numberOfMessages: 0,
- };
- }
- return partitions.reduce(
- (memo, { replicas, offsetMax, offsetMin }) => {
- const outOfSync = replicas?.filter(({ inSync }) => !inSync);
- return {
- outOfSyncReplicas: memo.outOfSyncReplicas + (outOfSync?.length || 0),
- numberOfMessages: memo.numberOfMessages + (offsetMax - offsetMin),
- };
- },
- {
- outOfSyncReplicas: 0,
- numberOfMessages: 0,
- }
- );
- }, [partitions]);
- const deleteTopicHandler = React.useCallback(() => {
- deleteTopic(clusterName, name);
- }, [clusterName, deleteTopic, name]);
- const recreateTopicHandler = React.useCallback(() => {
- recreateTopic(clusterName, name);
- setRecreateTopicConfirmationVisible(false);
- }, [recreateTopic, clusterName, name]);
- const clearTopicMessagesHandler = React.useCallback(() => {
- clearTopicMessages(clusterName, name);
- }, [clearTopicMessages, clusterName, name]);
- const [vElipsisVisble, setVElipsisVisble] = React.useState(false);
- return (
- <tr
- onMouseEnter={() => setVElipsisVisble(true)}
- onMouseLeave={() => setVElipsisVisble(false)}
- >
- {!isReadOnly && (
- <td>
- {!internal && (
- <input
- type="checkbox"
- checked={selected}
- onChange={() => {
- toggleTopicSelected(name);
- }}
- />
- )}
- </td>
- )}
- <TableKeyLink style={{ width: '44%' }}>
- {internal && <Tag color="gray">IN</Tag>}
- <S.Link exact to={`topics/${name}`} $isInternal={internal}>
- {name}
- </S.Link>
- </TableKeyLink>
- <td>{partitions?.length}</td>
- <td>{outOfSyncReplicas}</td>
- <td>{replicationFactor}</td>
- <td>{numberOfMessages}</td>
- <td>
- <BytesFormatted value={segmentSize} />
- </td>
- <td className="topic-action-block" style={{ width: '4%' }}>
- {!internal && !isReadOnly && vElipsisVisble ? (
- <div className="has-text-right">
- <Dropdown label={<VerticalElipsisIcon />} right>
- {cleanUpPolicy === 'DELETE' && (
- <DropdownItem onClick={clearTopicMessagesHandler} danger>
- Clear Messages
- </DropdownItem>
- )}
- {isTopicDeletionAllowed && (
- <DropdownItem
- onClick={() => setDeleteTopicConfirmationVisible(true)}
- danger
- >
- Remove Topic
- </DropdownItem>
- )}
- <DropdownItem
- onClick={() => setRecreateTopicConfirmationVisible(true)}
- danger
- >
- Recreate Topic
- </DropdownItem>
- </Dropdown>
- </div>
- ) : null}
- <ConfirmationModal
- isOpen={isDeleteTopicConfirmationVisible}
- onCancel={() => setDeleteTopicConfirmationVisible(false)}
- onConfirm={deleteTopicHandler}
- >
- Are you sure want to remove <b>{name}</b> topic?
- </ConfirmationModal>
- <ConfirmationModal
- isOpen={isRecreateTopicConfirmationVisible}
- onCancel={() => setRecreateTopicConfirmationVisible(false)}
- onConfirm={recreateTopicHandler}
- >
- Are you sure to recreate <b>{name}</b> topic?
- </ConfirmationModal>
- </td>
- </tr>
- );
- };
- export default ListItem;
|