diff --git a/frontend/src/components/ACLPage/List/List.tsx b/frontend/src/components/ACLPage/List/List.tsx index 61a443932..8d04050ff 100644 --- a/frontend/src/components/ACLPage/List/List.tsx +++ b/frontend/src/components/ACLPage/List/List.tsx @@ -26,6 +26,8 @@ import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourceP import BreakableTextCell from 'components/common/NewTable/BreakableTextCell'; import { useQueryPersister } from 'components/common/NewTable/ColumnFilter'; import { ActionPermissionWrapper } from 'components/common/ActionComponent'; +import useFts from 'components/common/Fts/useFts'; +import Fts from 'components/common/Fts/Fts'; import * as S from './List.styled'; @@ -33,7 +35,8 @@ const ACList: React.FC = () => { const { clusterName } = useAppParams<{ clusterName: ClusterName }>(); const [searchParams, setSearchParams] = useSearchParams(); const [search, setSearch] = useState(searchParams.get('q') || ''); - const { data: aclList } = useAcls({ clusterName, search }); + const { isFtsEnabled } = useFts('acl'); + const { data: aclList } = useAcls({ clusterName, search, fts: isFtsEnabled }); const { deleteResource } = useDeleteAcl(clusterName); const modal = useConfirm(true); const theme = useTheme(); @@ -211,6 +214,7 @@ const ACList: React.FC = () => { placeholder="Search by Principal Name" value={search} onChange={setSearch} + extraActions={} /> { - const { data } = useConsumerGroups({ clusterName, search: '' }); + const { isFtsEnabled } = useFts('consumer_groups'); + const { data } = useConsumerGroups({ + clusterName, + search: '', + fts: isFtsEnabled, + }); const consumerGroups = useMemo(() => { return ( data?.consumerGroups?.map((cg) => { diff --git a/frontend/src/components/ClusterPage/ClusterPage.tsx b/frontend/src/components/ClusterPage/ClusterPage.tsx index a0cc13e13..b48dba526 100644 --- a/frontend/src/components/ClusterPage/ClusterPage.tsx +++ b/frontend/src/components/ClusterPage/ClusterPage.tsx @@ -42,7 +42,7 @@ const ClusterPage: React.FC = () => { const { clusterName } = useAppParams(); const appInfo = React.useContext(GlobalSettingsContext); - const { data } = useClusters(); + const { data, isFetched } = useClusters(); const contextValue = React.useMemo(() => { const cluster = data?.find(({ name }) => name === clusterName); const features = cluster?.features || []; @@ -61,9 +61,17 @@ const ClusterPage: React.FC = () => { hasAclViewConfigured: features.includes(ClusterFeaturesEnum.KAFKA_ACL_VIEW) || features.includes(ClusterFeaturesEnum.KAFKA_ACL_EDIT), + ftsEnabled: features.includes(ClusterFeaturesEnum.FTS_ENABLED), + ftsDefaultEnabled: features.includes( + ClusterFeaturesEnum.FTS_DEFAULT_ENABLED + ), }; }, [clusterName, data]); + if (!isFetched) { + return ; + } + return ( }> diff --git a/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx b/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx index 238c13155..1b8b42710 100644 --- a/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx +++ b/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx @@ -52,6 +52,7 @@ describe('ClusterPage', () => { const renderComponent = async (pathname: string, payload: Cluster[] = []) => { (useClusters as jest.Mock).mockImplementation(() => ({ data: payload, + isFetched: true, })); await render( diff --git a/frontend/src/components/Connect/List/List.tsx b/frontend/src/components/Connect/List/List.tsx index c3a595688..08f078ca5 100644 --- a/frontend/src/components/Connect/List/List.tsx +++ b/frontend/src/components/Connect/List/List.tsx @@ -1,11 +1,7 @@ import React from 'react'; -import useAppParams from 'lib/hooks/useAppParams'; -import { ClusterNameRoute } from 'lib/paths'; import Table, { TagCell } from 'components/common/NewTable'; import { FullConnectorInfo } from 'generated-sources'; -import { useConnectors } from 'lib/hooks/api/kafkaConnect'; import { ColumnDef } from '@tanstack/react-table'; -import { useSearchParams } from 'react-router-dom'; import { useQueryPersister } from 'components/common/NewTable/ColumnFilter'; import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib'; import BreakableTextCell from 'components/common/NewTable/BreakableTextCell'; @@ -77,14 +73,9 @@ const kafkaConnectColumns: ColumnDef[] = [ }, ]; -const List: React.FC = () => { - const { clusterName } = useAppParams(); - const [searchParams] = useSearchParams(); - const { data: connectors } = useConnectors( - clusterName, - searchParams.get('q') || '' - ); +type ConnectorsListProps = { connectors: FullConnectorInfo[] | undefined }; +const List: React.FC = ({ connectors }) => { const filterPersister = useQueryPersister(kafkaConnectColumns); const columnSizingPersister = useLocalStoragePersister('KafkaConnect'); diff --git a/frontend/src/components/Connect/List/ListPage.tsx b/frontend/src/components/Connect/List/ListPage.tsx index 3b257dd6d..e68f79a19 100644 --- a/frontend/src/components/Connect/List/ListPage.tsx +++ b/frontend/src/components/Connect/List/ListPage.tsx @@ -4,6 +4,9 @@ import { ClusterNameRoute } from 'lib/paths'; import Search from 'components/common/Search/Search'; import PageLoader from 'components/common/PageLoader/PageLoader'; import { useConnectors } from 'lib/hooks/api/kafkaConnect'; +import Fts from 'components/common/Fts/Fts'; +import useFts from 'components/common/Fts/useFts'; +import { useSearchParams } from 'react-router-dom'; import * as S from './ListPage.styled'; import List from './List'; @@ -11,16 +14,25 @@ import ConnectorsStatistics from './Statistics/Statistics'; const ListPage: React.FC = () => { const { clusterName } = useAppParams(); - const { data, isLoading } = useConnectors(clusterName); + const { isFtsEnabled } = useFts('connects'); + const [searchParams] = useSearchParams(); + const { data, isLoading } = useConnectors( + clusterName, + searchParams.get('q') || '', + isFtsEnabled + ); return ( <> - + } + /> }> - + ); diff --git a/frontend/src/components/Connect/List/__tests__/List.spec.tsx b/frontend/src/components/Connect/List/__tests__/List.spec.tsx index 9e09fc50c..679c4299e 100644 --- a/frontend/src/components/Connect/List/__tests__/List.spec.tsx +++ b/frontend/src/components/Connect/List/__tests__/List.spec.tsx @@ -15,6 +15,7 @@ import { useResetConnectorOffsets, useUpdateConnectorState, } from 'lib/hooks/api/kafkaConnect'; +import { FullConnectorInfo } from 'generated-sources'; const mockedUsedNavigate = jest.fn(); const mockDelete = jest.fn(); @@ -34,11 +35,14 @@ jest.mock('lib/hooks/api/kafkaConnect', () => ({ const clusterName = 'local'; -const renderComponent = (contextValue: ContextProps = initialValue) => +const renderComponent = ( + contextValue: ContextProps = initialValue, + data: FullConnectorInfo[] = connectors +) => render( - + , { initialEntries: [clusterConnectorsPath(clusterName)] } @@ -47,9 +51,6 @@ const renderComponent = (contextValue: ContextProps = initialValue) => describe('Connectors List', () => { describe('when the connectors are loaded', () => { beforeEach(() => { - (useConnectors as jest.Mock).mockImplementation(() => ({ - data: connectors, - })); const restartConnector = jest.fn(); (useUpdateConnectorState as jest.Mock).mockImplementation(() => ({ mutateAsync: restartConnector, @@ -84,7 +85,7 @@ describe('Connectors List', () => { }); it('renders empty table', async () => { - renderComponent(); + renderComponent(undefined, []); expect(screen.getByRole('table')).toBeInTheDocument(); expect( screen.getByRole('row', { name: 'No connectors found' }) diff --git a/frontend/src/components/ConsumerGroups/List.tsx b/frontend/src/components/ConsumerGroups/List.tsx index 2a8fc619e..ad66e718c 100644 --- a/frontend/src/components/ConsumerGroups/List.tsx +++ b/frontend/src/components/ConsumerGroups/List.tsx @@ -17,11 +17,14 @@ import { useConsumerGroups } from 'lib/hooks/api/consumers'; import Tooltip from 'components/common/Tooltip/Tooltip'; import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading'; import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib'; +import useFts from 'components/common/Fts/useFts'; +import Fts from 'components/common/Fts/Fts'; const List = () => { const { clusterName } = useAppParams(); const [searchParams] = useSearchParams(); const navigate = useNavigate(); + const { isFtsEnabled } = useFts('consumer_groups'); const consumerGroups = useConsumerGroups({ clusterName, @@ -32,6 +35,7 @@ const List = () => { page: Number(searchParams.get('page') || 1), perPage: Number(searchParams.get('perPage') || PER_PAGE), search: searchParams.get('q') || '', + fts: isFtsEnabled, }); const columns = React.useMemo[]>( @@ -104,7 +108,10 @@ const List = () => { <> - + } + />
( left: 0; bottom: 0; padding: 16px; + scrollbar-gutter: stable; + scrollbar-width: thin; overflow-y: auto; transition: width 0.25s, diff --git a/frontend/src/components/Schemas/List/List.tsx b/frontend/src/components/Schemas/List/List.tsx index 252d9b1b1..dcc34d6ab 100644 --- a/frontend/src/components/Schemas/List/List.tsx +++ b/frontend/src/components/Schemas/List/List.tsx @@ -24,6 +24,8 @@ import { useNavigate, useSearchParams } from 'react-router-dom'; import { PER_PAGE } from 'lib/constants'; import { useGetSchemas } from 'lib/hooks/api/schemas'; import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading'; +import useFts from 'components/common/Fts/useFts'; +import Fts from 'components/common/Fts/Fts'; import GlobalSchemaSelector from './GlobalSchemaSelector/GlobalSchemaSelector'; @@ -32,6 +34,7 @@ const List: React.FC = () => { const { clusterName } = useAppParams(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); + const { isFtsEnabled } = useFts('schemas'); const { isInitialLoading, isError, @@ -45,6 +48,7 @@ const List: React.FC = () => { sortOrder: (searchParams.get('sortDirection')?.toUpperCase() as SortOrder) || undefined, + fts: isFtsEnabled, }); const columns = React.useMemo[]>( @@ -111,7 +115,10 @@ const List: React.FC = () => { )} - + } + /> {isInitialLoading || isError ? ( diff --git a/frontend/src/components/Topics/List/ListPage.tsx b/frontend/src/components/Topics/List/ListPage.tsx index d8508175c..811bde1a7 100644 --- a/frontend/src/components/Topics/List/ListPage.tsx +++ b/frontend/src/components/Topics/List/ListPage.tsx @@ -12,11 +12,15 @@ import PageLoader from 'components/common/PageLoader/PageLoader'; import TopicTable from 'components/Topics/List/TopicTable'; import { Action, ResourceType } from 'generated-sources'; import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading'; +import Fts from 'components/common/Fts/Fts'; +import useFts from 'components/common/Fts/useFts'; const ListPage: React.FC = () => { const { isReadOnly } = React.useContext(ClusterContext); const [searchParams, setSearchParams] = useSearchParams(); + useFts('topics'); + // Set the search params to the url based on the localStorage value React.useEffect(() => { if (!searchParams.has('perPage')) { @@ -62,7 +66,10 @@ const ListPage: React.FC = () => { )} - + } + />