List.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import React from 'react';
  2. import PageHeading from 'components/common/PageHeading/PageHeading';
  3. import Search from 'components/common/Search/Search';
  4. import { ControlPanelWrapper } from 'components/common/ControlPanel/ControlPanel.styled';
  5. import {
  6. ConsumerGroupDetails,
  7. ConsumerGroupOrdering,
  8. SortOrder,
  9. } from 'generated-sources';
  10. import { useAppDispatch } from 'lib/hooks/redux';
  11. import useAppParams from 'lib/hooks/useAppParams';
  12. import { clusterConsumerGroupDetailsPath, ClusterNameRoute } from 'lib/paths';
  13. import { fetchConsumerGroupsPaged } from 'redux/reducers/consumerGroups/consumerGroupsSlice';
  14. import { ColumnDef } from '@tanstack/react-table';
  15. import Table, { TagCell, LinkCell } from 'components/common/NewTable';
  16. import { useNavigate, useSearchParams } from 'react-router-dom';
  17. import { PER_PAGE } from 'lib/constants';
  18. export interface Props {
  19. consumerGroups: ConsumerGroupDetails[];
  20. totalPages: number;
  21. }
  22. const List: React.FC<Props> = ({ consumerGroups, totalPages }) => {
  23. const dispatch = useAppDispatch();
  24. const { clusterName } = useAppParams<ClusterNameRoute>();
  25. const [searchParams] = useSearchParams();
  26. const navigate = useNavigate();
  27. React.useEffect(() => {
  28. dispatch(
  29. fetchConsumerGroupsPaged({
  30. clusterName,
  31. orderBy:
  32. (searchParams.get('sortBy') as ConsumerGroupOrdering) || undefined,
  33. sortOrder:
  34. (searchParams.get('sortDirection')?.toUpperCase() as SortOrder) ||
  35. undefined,
  36. page: Number(searchParams.get('page') || 1),
  37. perPage: Number(searchParams.get('perPage') || PER_PAGE),
  38. search: searchParams.get('q') || '',
  39. })
  40. );
  41. }, [clusterName, dispatch, searchParams]);
  42. const columns = React.useMemo<ColumnDef<ConsumerGroupDetails>[]>(
  43. () => [
  44. {
  45. id: ConsumerGroupOrdering.NAME,
  46. header: 'Group ID',
  47. accessorKey: 'groupId',
  48. cell: LinkCell,
  49. },
  50. {
  51. id: ConsumerGroupOrdering.MEMBERS,
  52. header: 'Num Of Members',
  53. accessorKey: 'members',
  54. },
  55. {
  56. header: 'Num Of Topics',
  57. accessorKey: 'topics',
  58. enableSorting: false,
  59. },
  60. {
  61. header: 'Messages Behind',
  62. accessorKey: 'messagesBehind',
  63. enableSorting: false,
  64. },
  65. {
  66. header: 'Coordinator',
  67. accessorKey: 'coordinator.id',
  68. enableSorting: false,
  69. },
  70. {
  71. id: ConsumerGroupOrdering.STATE,
  72. header: 'State',
  73. accessorKey: 'state',
  74. cell: TagCell,
  75. },
  76. ],
  77. []
  78. );
  79. return (
  80. <>
  81. <PageHeading text="Consumers" />
  82. <ControlPanelWrapper hasInput>
  83. <Search placeholder="Search by Consumer Group ID" />
  84. </ControlPanelWrapper>
  85. <Table
  86. columns={columns}
  87. pageCount={totalPages}
  88. data={consumerGroups}
  89. emptyMessage="No active consumer groups found"
  90. serverSideProcessing
  91. enableSorting
  92. onRowClick={({ original }) =>
  93. navigate(
  94. clusterConsumerGroupDetailsPath(clusterName, original.groupId)
  95. )
  96. }
  97. />
  98. </>
  99. );
  100. };
  101. export default List;