ListItem.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import React from 'react';
  2. import { ConnectorState, FullConnectorInfo } from 'generated-sources';
  3. import { clusterConnectConnectorPath, clusterTopicPath } from 'lib/paths';
  4. import { ClusterName } from 'redux/interfaces';
  5. import { Link, NavLink } from 'react-router-dom';
  6. import { useDispatch } from 'react-redux';
  7. import { deleteConnector } from 'redux/actions';
  8. import Dropdown from 'components/common/Dropdown/Dropdown';
  9. import DropdownDivider from 'components/common/Dropdown/DropdownDivider';
  10. import DropdownItem from 'components/common/Dropdown/DropdownItem';
  11. import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal';
  12. import TagStyled from 'components/common/Tag/Tag.styled';
  13. import { TableKeyLink } from 'components/common/table/Table/TableKeyLink.styled';
  14. import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon';
  15. import { Colors } from 'theme/theme';
  16. import styled from 'styled-components';
  17. export interface ListItemProps {
  18. clusterName: ClusterName;
  19. connector: FullConnectorInfo;
  20. }
  21. const TopicTagsWrapper = styled.div`
  22. display: flex;
  23. flex-wrap: wrap;
  24. `;
  25. const ListItem: React.FC<ListItemProps> = ({
  26. clusterName,
  27. connector: {
  28. name,
  29. connect,
  30. type,
  31. connectorClass,
  32. topics,
  33. status,
  34. tasksCount,
  35. failedTasksCount,
  36. },
  37. }) => {
  38. const dispatch = useDispatch();
  39. const [
  40. isDeleteConnectorConfirmationVisible,
  41. setDeleteConnectorConfirmationVisible,
  42. ] = React.useState(false);
  43. const handleDelete = React.useCallback(() => {
  44. if (clusterName && connect && name) {
  45. dispatch(deleteConnector(clusterName, connect, name));
  46. }
  47. setDeleteConnectorConfirmationVisible(false);
  48. }, [clusterName, connect, name]);
  49. const runningTasks = React.useMemo(() => {
  50. if (!tasksCount) return null;
  51. return tasksCount - (failedTasksCount || 0);
  52. }, [tasksCount, failedTasksCount]);
  53. const stateColor = React.useMemo(() => {
  54. const { state = '' } = status;
  55. switch (state) {
  56. case ConnectorState.RUNNING:
  57. return 'green';
  58. case ConnectorState.FAILED:
  59. case ConnectorState.TASK_FAILED:
  60. return 'red';
  61. default:
  62. return 'yellow';
  63. }
  64. }, [status]);
  65. return (
  66. <tr>
  67. <TableKeyLink>
  68. <NavLink
  69. exact
  70. to={clusterConnectConnectorPath(clusterName, connect, name)}
  71. >
  72. {name}
  73. </NavLink>
  74. </TableKeyLink>
  75. <td>{connect}</td>
  76. <td>{type}</td>
  77. <td>{connectorClass}</td>
  78. <td>
  79. <TopicTagsWrapper>
  80. {topics?.map((t) => (
  81. <TagStyled key={t} color="gray">
  82. <Link to={clusterTopicPath(clusterName, t)}>{t}</Link>
  83. </TagStyled>
  84. ))}
  85. </TopicTagsWrapper>
  86. </td>
  87. <td>
  88. {status && <TagStyled color={stateColor}>{status.state}</TagStyled>}
  89. </td>
  90. <td>
  91. {runningTasks && (
  92. <span>
  93. {runningTasks} of {tasksCount}
  94. </span>
  95. )}
  96. </td>
  97. <td>
  98. <div>
  99. <Dropdown label={<VerticalElipsisIcon />} right>
  100. <DropdownDivider />
  101. <DropdownItem
  102. onClick={() => setDeleteConnectorConfirmationVisible(true)}
  103. >
  104. <span style={{ color: Colors.red[50] }}>Remove Connector</span>
  105. </DropdownItem>
  106. </Dropdown>
  107. </div>
  108. <ConfirmationModal
  109. isOpen={isDeleteConnectorConfirmationVisible}
  110. onCancel={() => setDeleteConnectorConfirmationVisible(false)}
  111. onConfirm={handleDelete}
  112. >
  113. Are you sure want to remove <b>{name}</b> connector?
  114. </ConfirmationModal>
  115. </td>
  116. </tr>
  117. );
  118. };
  119. export default ListItem;