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 = () => {
)}
-
+ }
+ />