ListPage.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import React, { Suspense } from 'react';
  2. import useAppParams from 'lib/hooks/useAppParams';
  3. import { clusterConnectorNewRelativePath, ClusterNameRoute } from 'lib/paths';
  4. import ClusterContext from 'components/contexts/ClusterContext';
  5. import Search from 'components/common/Search/Search';
  6. import * as Metrics from 'components/common/Metrics';
  7. import PageHeading from 'components/common/PageHeading/PageHeading';
  8. import { Button } from 'components/common/Button/Button';
  9. import { ControlPanelWrapper } from 'components/common/ControlPanel/ControlPanel.styled';
  10. import PageLoader from 'components/common/PageLoader/PageLoader';
  11. import { ConnectorState } from 'generated-sources';
  12. import { useConnectors } from 'lib/hooks/api/kafkaConnect';
  13. import List from './List';
  14. const ListPage: React.FC = () => {
  15. const { isReadOnly } = React.useContext(ClusterContext);
  16. const { clusterName } = useAppParams<ClusterNameRoute>();
  17. // Fetches all connectors from the API, without search criteria. Used to display general metrics.
  18. const { data: connectorsMetrics, isLoading } = useConnectors(clusterName);
  19. const numberOfFailedConnectors = connectorsMetrics?.filter(
  20. ({ status: { state } }) => state === ConnectorState.FAILED
  21. ).length;
  22. const numberOfFailedTasks = connectorsMetrics?.reduce(
  23. (acc, metric) => acc + (metric.failedTasksCount ?? 0),
  24. 0
  25. );
  26. return (
  27. <>
  28. <PageHeading text="Connectors">
  29. {!isReadOnly && (
  30. <Button
  31. buttonType="primary"
  32. buttonSize="M"
  33. to={clusterConnectorNewRelativePath}
  34. >
  35. Create Connector
  36. </Button>
  37. )}
  38. </PageHeading>
  39. <Metrics.Wrapper>
  40. <Metrics.Section>
  41. <Metrics.Indicator
  42. label="Connectors"
  43. title="Total number of connectors"
  44. fetching={isLoading}
  45. >
  46. {connectorsMetrics?.length || '-'}
  47. </Metrics.Indicator>
  48. <Metrics.Indicator
  49. label="Failed Connectors"
  50. title="Number of failed connectors"
  51. fetching={isLoading}
  52. >
  53. {numberOfFailedConnectors ?? '-'}
  54. </Metrics.Indicator>
  55. <Metrics.Indicator
  56. label="Failed Tasks"
  57. title="Number of failed tasks"
  58. fetching={isLoading}
  59. >
  60. {numberOfFailedTasks ?? '-'}
  61. </Metrics.Indicator>
  62. </Metrics.Section>
  63. </Metrics.Wrapper>
  64. <ControlPanelWrapper hasInput>
  65. <Search placeholder="Search by Connect Name, Status or Type" />
  66. </ControlPanelWrapper>
  67. <Suspense fallback={<PageLoader />}>
  68. <List />
  69. </Suspense>
  70. </>
  71. );
  72. };
  73. export default ListPage;