ListPage.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 { ActionButton } from 'components/common/ActionComponent';
  9. import { ControlPanelWrapper } from 'components/common/ControlPanel/ControlPanel.styled';
  10. import PageLoader from 'components/common/PageLoader/PageLoader';
  11. import { Action, ConnectorState, ResourceType } 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. <ActionButton
  31. buttonType="primary"
  32. buttonSize="M"
  33. to={clusterConnectorNewRelativePath}
  34. permission={{
  35. resource: ResourceType.CONNECT,
  36. action: Action.CREATE,
  37. }}
  38. >
  39. Create Connector
  40. </ActionButton>
  41. )}
  42. </PageHeading>
  43. <Metrics.Wrapper>
  44. <Metrics.Section>
  45. <Metrics.Indicator
  46. label="Connectors"
  47. title="Total number of connectors"
  48. fetching={isLoading}
  49. >
  50. {connectorsMetrics?.length || '-'}
  51. </Metrics.Indicator>
  52. <Metrics.Indicator
  53. label="Failed Connectors"
  54. title="Number of failed connectors"
  55. fetching={isLoading}
  56. >
  57. {numberOfFailedConnectors ?? '-'}
  58. </Metrics.Indicator>
  59. <Metrics.Indicator
  60. label="Failed Tasks"
  61. title="Number of failed tasks"
  62. fetching={isLoading}
  63. >
  64. {numberOfFailedTasks ?? '-'}
  65. </Metrics.Indicator>
  66. </Metrics.Section>
  67. </Metrics.Wrapper>
  68. <ControlPanelWrapper hasInput>
  69. <Search placeholder="Search by Connect Name, Status or Type" />
  70. </ControlPanelWrapper>
  71. <Suspense fallback={<PageLoader />}>
  72. <List />
  73. </Suspense>
  74. </>
  75. );
  76. };
  77. export default ListPage;