ListItem.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import React from 'react';
  2. import { 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/reducers/connect/connectSlice';
  8. import Dropdown from 'components/common/Dropdown/Dropdown';
  9. import DropdownItem from 'components/common/Dropdown/DropdownItem';
  10. import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal';
  11. import { Tag } from 'components/common/Tag/Tag.styled';
  12. import { TableKeyLink } from 'components/common/table/Table/TableKeyLink.styled';
  13. import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon';
  14. import getTagColor from 'components/common/Tag/getTagColor';
  15. import * as S from './List.styled';
  16. export interface ListItemProps {
  17. clusterName: ClusterName;
  18. connector: FullConnectorInfo;
  19. }
  20. const ListItem: React.FC<ListItemProps> = ({
  21. clusterName,
  22. connector: {
  23. name,
  24. connect,
  25. type,
  26. connectorClass,
  27. topics,
  28. status,
  29. tasksCount,
  30. failedTasksCount,
  31. },
  32. }) => {
  33. const dispatch = useDispatch();
  34. const [
  35. isDeleteConnectorConfirmationVisible,
  36. setDeleteConnectorConfirmationVisible,
  37. ] = React.useState(false);
  38. const handleDelete = () => {
  39. if (clusterName && connect && name) {
  40. dispatch(
  41. deleteConnector({
  42. clusterName,
  43. connectName: connect,
  44. connectorName: name,
  45. })
  46. );
  47. }
  48. setDeleteConnectorConfirmationVisible(false);
  49. };
  50. const runningTasks = React.useMemo(() => {
  51. if (!tasksCount) return null;
  52. return tasksCount - (failedTasksCount || 0);
  53. }, [tasksCount, failedTasksCount]);
  54. return (
  55. <tr>
  56. <TableKeyLink>
  57. <NavLink
  58. exact
  59. to={clusterConnectConnectorPath(clusterName, connect, name)}
  60. >
  61. {name}
  62. </NavLink>
  63. </TableKeyLink>
  64. <td>{connect}</td>
  65. <td>{type}</td>
  66. <td>{connectorClass}</td>
  67. <td>
  68. <S.TagsWrapper>
  69. {topics?.map((t) => (
  70. <Tag key={t} color="gray">
  71. <Link to={clusterTopicPath(clusterName, t)}>{t}</Link>
  72. </Tag>
  73. ))}
  74. </S.TagsWrapper>
  75. </td>
  76. <td>{status && <Tag color={getTagColor(status)}>{status.state}</Tag>}</td>
  77. <td>
  78. {runningTasks && (
  79. <span>
  80. {runningTasks} of {tasksCount}
  81. </span>
  82. )}
  83. </td>
  84. <td>
  85. <div>
  86. <Dropdown label={<VerticalElipsisIcon />} right up>
  87. <DropdownItem
  88. onClick={() => setDeleteConnectorConfirmationVisible(true)}
  89. danger
  90. >
  91. Remove Connector
  92. </DropdownItem>
  93. </Dropdown>
  94. </div>
  95. <ConfirmationModal
  96. isOpen={isDeleteConnectorConfirmationVisible}
  97. onCancel={() => setDeleteConnectorConfirmationVisible(false)}
  98. onConfirm={handleDelete}
  99. >
  100. Are you sure want to remove <b>{name}</b> connector?
  101. </ConfirmationModal>
  102. </td>
  103. </tr>
  104. );
  105. };
  106. export default ListItem;