ListItem.tsx 3.2 KB

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