List.tsx 3.2 KB

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