List.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import React from 'react';
  2. import { useParams } from 'react-router-dom';
  3. import { Connect, FullConnectorInfo } from 'generated-sources';
  4. import { ClusterName, ConnectorSearch } from 'redux/interfaces';
  5. import { clusterConnectorNewPath } from 'lib/paths';
  6. import ClusterContext from 'components/contexts/ClusterContext';
  7. import PageLoader from 'components/common/PageLoader/PageLoader';
  8. import Search from 'components/common/Search/Search';
  9. import * as Metrics from 'components/common/Metrics';
  10. import PageHeading from 'components/common/PageHeading/PageHeading';
  11. import { Button } from 'components/common/Button/Button';
  12. import { ControlPanelWrapper } from 'components/common/ControlPanel/ControlPanel.styled';
  13. import { Table } from 'components/common/table/Table/Table.styled';
  14. import TableHeaderCell from 'components/common/table/TableHeaderCell/TableHeaderCell';
  15. import ListItem from './ListItem';
  16. export interface ListProps {
  17. areConnectsFetching: boolean;
  18. areConnectorsFetching: boolean;
  19. connectors: FullConnectorInfo[];
  20. connects: Connect[];
  21. fetchConnects(clusterName: ClusterName): void;
  22. fetchConnectors({ clusterName }: { clusterName: ClusterName }): void;
  23. search: string;
  24. setConnectorSearch(value: ConnectorSearch): void;
  25. }
  26. const List: React.FC<ListProps> = ({
  27. connectors,
  28. areConnectsFetching,
  29. areConnectorsFetching,
  30. fetchConnects,
  31. fetchConnectors,
  32. search,
  33. setConnectorSearch,
  34. }) => {
  35. const { isReadOnly } = React.useContext(ClusterContext);
  36. const { clusterName } = useParams<{ clusterName: string }>();
  37. React.useEffect(() => {
  38. fetchConnects(clusterName);
  39. fetchConnectors({ clusterName });
  40. }, [fetchConnects, fetchConnectors, clusterName]);
  41. const handleSearch = (value: string) =>
  42. setConnectorSearch({
  43. clusterName,
  44. search: value,
  45. });
  46. return (
  47. <>
  48. <PageHeading text="Connectors">
  49. {!isReadOnly && (
  50. <Button
  51. isLink
  52. buttonType="primary"
  53. buttonSize="M"
  54. to={clusterConnectorNewPath(clusterName)}
  55. >
  56. Create Connector
  57. </Button>
  58. )}
  59. </PageHeading>
  60. <Metrics.Wrapper>
  61. <Metrics.Section>
  62. <Metrics.Indicator
  63. label="Connects"
  64. title="Connects"
  65. fetching={areConnectsFetching}
  66. >
  67. {connectors.length}
  68. </Metrics.Indicator>
  69. </Metrics.Section>
  70. </Metrics.Wrapper>
  71. <ControlPanelWrapper hasInput>
  72. <Search
  73. handleSearch={handleSearch}
  74. placeholder="Search by Connect Name, Status or Type"
  75. value={search}
  76. />
  77. </ControlPanelWrapper>
  78. {areConnectorsFetching ? (
  79. <PageLoader />
  80. ) : (
  81. <div>
  82. <Table isFullwidth>
  83. <thead>
  84. <tr>
  85. <TableHeaderCell title="Name" />
  86. <TableHeaderCell title="Connect" />
  87. <TableHeaderCell title="Type" />
  88. <TableHeaderCell title="Plugin" />
  89. <TableHeaderCell title="Topics" />
  90. <TableHeaderCell title="Status" />
  91. <TableHeaderCell title="Running Tasks" />
  92. <TableHeaderCell> </TableHeaderCell>
  93. </tr>
  94. </thead>
  95. <tbody>
  96. {connectors.length === 0 && (
  97. <tr>
  98. <td colSpan={10}>No connectors found</td>
  99. </tr>
  100. )}
  101. {connectors.map((connector) => (
  102. <ListItem
  103. key={[connector.name, connector.connect, clusterName].join(
  104. '-'
  105. )}
  106. connector={connector}
  107. clusterName={clusterName}
  108. />
  109. ))}
  110. </tbody>
  111. </Table>
  112. </div>
  113. )}
  114. </>
  115. );
  116. };
  117. export default List;