Skip to content

Commit

Permalink
Merge pull request #1939 from upalatucci/fix-instancetype-preferences…
Browse files Browse the repository at this point in the history
…-search

CNV-40335: fix search preferences and isntancetype by label
  • Loading branch information
openshift-merge-bot[bot] committed May 15, 2024
2 parents bfbd489 + 93e5ef1 commit 8ccc03e
Show file tree
Hide file tree
Showing 13 changed files with 222 additions and 69 deletions.
10 changes: 10 additions & 0 deletions src/utils/hooks/useIsSearchPage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { useMemo } from 'react';
import { useLocation } from 'react-router-dom-v5-compat';

const useIsSearchPage = () => {
const location = useLocation();

return useMemo(() => location?.pathname?.includes('/search'), [location]);
};

export default useIsSearchPage;
6 changes: 4 additions & 2 deletions src/utils/hooks/useUserPreferences.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { VirtualMachinePreferenceModelGroupVersionKind } from '@kubevirt-ui/kubevirt-api/console';
import { V1beta1VirtualMachinePreference } from '@kubevirt-ui/kubevirt-api/kubevirt';
import { useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';
import { Selector, useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';

import { ALL_NAMESPACES_SESSION_KEY } from './constants';

const useUserPreferences = (namespace: string) =>
const useUserPreferences = (namespace: string, fieldSelector?: string, selector?: Selector) =>
useK8sWatchResource<V1beta1VirtualMachinePreference[]>({
groupVersionKind: VirtualMachinePreferenceModelGroupVersionKind,
isList: true,
...(namespace !== ALL_NAMESPACES_SESSION_KEY && { namespace: namespace }),
fieldSelector,
selector,
});

export default useUserPreferences;
12 changes: 12 additions & 0 deletions src/utils/utils/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
import { Selector } from '@openshift-console/dynamic-plugin-sdk';

export type ItemsToFilterProps = {
id: string;
title: string;
};

export type ListPageProps = {
fieldSelector?: string;
hideColumnManagement?: boolean;
hideNameLabelFilters?: boolean;
hideTextFilter?: boolean;
nameFilter?: string;
namespace?: string;
selector?: Selector;
};
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import { VirtualMachineClusterInstancetypeModelGroupVersionKind } from '@kubevirt-ui/kubevirt-api/console';
import { V1beta1VirtualMachineClusterInstancetype } from '@kubevirt-ui/kubevirt-api/kubevirt';
import { useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';
import { Selector, useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';

type UseClusterInstanceTypes = () => [
instanceTypes: V1beta1VirtualMachineClusterInstancetype[],
loaded: boolean,
loadError: Error,
];
type UseClusterInstanceTypes = (
fieldSelector?: string,
selector?: Selector,
) => [instanceTypes: V1beta1VirtualMachineClusterInstancetype[], loaded: boolean, loadError: Error];

const useClusterInstanceTypes: UseClusterInstanceTypes = () => {
const useClusterInstanceTypes: UseClusterInstanceTypes = (fieldSelector, selector) => {
const [instanceTypes, loaded, loadError] = useK8sWatchResource<
V1beta1VirtualMachineClusterInstancetype[]
>({
fieldSelector,
groupVersionKind: VirtualMachineClusterInstancetypeModelGroupVersionKind,
isList: true,
selector,
});

return [instanceTypes || [], loaded || !!loadError, loadError];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import { VirtualMachineClusterPreferenceModelGroupVersionKind } from '@kubevirt-ui/kubevirt-api/console';
import { V1beta1VirtualMachineClusterPreference } from '@kubevirt-ui/kubevirt-api/kubevirt';
import { useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';
import { Selector, useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';

type UseClusterPreferences = () => [
preferences: V1beta1VirtualMachineClusterPreference[],
loaded: boolean,
loadError: Error,
];
type UseClusterPreferences = (
fieldSelector?: string,
selector?: Selector,
) => [preferences: V1beta1VirtualMachineClusterPreference[], loaded: boolean, loadError: Error];

const useClusterPreferences: UseClusterPreferences = () => {
const useClusterPreferences: UseClusterPreferences = (fieldSelector, selector) => {
const [preferences, loaded, loadError] = useK8sWatchResource<
V1beta1VirtualMachineClusterPreference[]
>({
fieldSelector,
groupVersionKind: VirtualMachineClusterPreferenceModelGroupVersionKind,
isList: true,
selector,
});

return [preferences || [], loaded || !!loadError, loadError];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
import useVirtualMachineInstanceTypes from '@catalog/CreateFromInstanceTypes/state/hooks/useVirtualMachineInstanceTypes';
import { Selector } from '@openshift-console/dynamic-plugin-sdk';

import { UseInstanceTypeAndPreferencesValues } from '../utils/types';

import useClusterInstanceTypes from './useClusterInstanceTypes';
import useClusterPreferences from './useClusterPreferences';

type UseInstanceTypeAndPreferences = () => UseInstanceTypeAndPreferencesValues;

const useInstanceTypesAndPreferences: UseInstanceTypeAndPreferences = () => {
const [clusterInstanceTypes, clusterITsLoaded, clusterITsLoadError] = useClusterInstanceTypes();

const [vmInstanceTypes, userITsLoaded, userITsLoadError] = useVirtualMachineInstanceTypes();

const [preferences, preferencesLoaded, preferencesLoadError] = useClusterPreferences();
type UseInstanceTypeAndPreferences = (
fieldSelector?: string,
selector?: Selector,
) => UseInstanceTypeAndPreferencesValues;

const useInstanceTypesAndPreferences: UseInstanceTypeAndPreferences = (fieldSelector, selector) => {
const [clusterInstanceTypes, clusterITsLoaded, clusterITsLoadError] = useClusterInstanceTypes(
fieldSelector,
selector,
);

const [vmInstanceTypes, userITsLoaded, userITsLoadError] = useVirtualMachineInstanceTypes(
fieldSelector,
selector,
);

const [preferences, preferencesLoaded, preferencesLoadError] = useClusterPreferences(
fieldSelector,
selector,
);

const loaded = preferencesLoaded && clusterITsLoaded && userITsLoaded;
const loadError = preferencesLoadError || clusterITsLoadError || userITsLoadError;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
import { VirtualMachineInstancetypeModelGroupVersionKind } from '@kubevirt-ui/kubevirt-api/console';
import { V1beta1VirtualMachineInstancetype } from '@kubevirt-ui/kubevirt-api/kubevirt';
import { ALL_NAMESPACES_SESSION_KEY } from '@kubevirt-utils/hooks/constants';
import { useActiveNamespace, useK8sWatchResource } from '@openshift-console/dynamic-plugin-sdk';
import {
Selector,
useActiveNamespace,
useK8sWatchResource,
} from '@openshift-console/dynamic-plugin-sdk';

type UseVirtualMachineInstanceTypes = () => [
instanceTypes: V1beta1VirtualMachineInstancetype[],
loaded: boolean,
loadError: Error,
];
type UseVirtualMachineInstanceTypes = (
fieldSelector?: string,
selector?: Selector,
) => [instanceTypes: V1beta1VirtualMachineInstancetype[], loaded: boolean, loadError: Error];

const useVirtualMachineInstanceTypes: UseVirtualMachineInstanceTypes = () => {
const useVirtualMachineInstanceTypes: UseVirtualMachineInstanceTypes = (
fieldSelector,
selector,
) => {
const [activeNamespace] = useActiveNamespace();
const [instanceTypes, loaded, loadError] = useK8sWatchResource<
V1beta1VirtualMachineInstancetype[]
Expand All @@ -18,6 +24,8 @@ const useVirtualMachineInstanceTypes: UseVirtualMachineInstanceTypes = () => {
groupVersionKind: VirtualMachineInstancetypeModelGroupVersionKind,
isList: true,
...(activeNamespace !== ALL_NAMESPACES_SESSION_KEY && { namespace: activeNamespace }),
fieldSelector,
selector,
},
);

Expand Down
19 changes: 16 additions & 3 deletions src/views/instancetypes/list/ClusterInstancetypeList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import ListPageFilter from '@kubevirt-utils/components/ListPageFilter/ListPageFi
import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
import usePagination from '@kubevirt-utils/hooks/usePagination/usePagination';
import { paginationDefaultValues } from '@kubevirt-utils/hooks/usePagination/utils/constants';
import { ListPageProps } from '@kubevirt-utils/utils/types';
import {
ListPageBody,
useListPageFilter,
Expand All @@ -19,12 +20,21 @@ import useClusterInstancetypeListColumns from './hooks/useClusterInstancetypeLis

import '@kubevirt-utils/styles/list-managment-group.scss';

const ClusterInstancetypeList: FC = () => {
const ClusterInstancetypeList: FC<ListPageProps> = ({
fieldSelector,
hideColumnManagement,
hideNameLabelFilters,
hideTextFilter,
nameFilter,
selector,
}) => {
const { t } = useKubevirtTranslation();
const [instanceTypes, loaded, loadError] = useClusterInstanceTypes();
const [instanceTypes, loaded, loadError] = useClusterInstanceTypes(fieldSelector, selector);

const { onPaginationChange, pagination } = usePagination();
const [unfilteredData, data, onFilterChange] = useListPageFilter(instanceTypes);
const [unfilteredData, data, onFilterChange] = useListPageFilter(instanceTypes, null, {
name: { selected: [nameFilter] },
});
const [columns, activeColumns, loadedColumns] = useClusterInstancetypeListColumns(
pagination,
data,
Expand Down Expand Up @@ -54,6 +64,9 @@ const ClusterInstancetypeList: FC = () => {
});
}}
data={unfilteredData}
hideColumnManagement={hideColumnManagement}
hideLabelFilter={hideTextFilter}
hideNameLabelFilters={hideNameLabelFilters}
loaded={loaded && loadedColumns}
/>
<Pagination
Expand Down
41 changes: 31 additions & 10 deletions src/views/instancetypes/list/InstanceTypePage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useEffect, useMemo, useState } from 'react';
import React, { FC, useEffect, useMemo, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom-v5-compat';
import classNames from 'classnames';

Expand All @@ -7,10 +7,12 @@ import { VirtualMachineInstancetypeModelRef } from '@kubevirt-ui/kubevirt-api/co
import VirtualMachineClusterInstancetypeModel, {
VirtualMachineClusterInstancetypeModelRef,
} from '@kubevirt-ui/kubevirt-api/console/models/VirtualMachineClusterInstancetypeModel';
import { ALL_NAMESPACES_SESSION_KEY } from '@kubevirt-utils/hooks/constants';
import { ALL_NAMESPACES } from '@kubevirt-utils/hooks/constants';
import useIsSearchPage from '@kubevirt-utils/hooks/useIsSearchPage';
import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
import { ListPageProps } from '@kubevirt-utils/utils/types';
import { isEmpty } from '@kubevirt-utils/utils/utils';
import { ListPageHeader, useActiveNamespace } from '@openshift-console/dynamic-plugin-sdk';
import { ListPageHeader } from '@openshift-console/dynamic-plugin-sdk';
import { Tab, Tabs, TabTitleText } from '@patternfly/react-core';

import InstancetypeCreateButton from './components/InstancetypeCreateButton/InstancetypeCreateButton';
Expand All @@ -19,31 +21,50 @@ import UserInstancetypeList from './UserInstancetypeList';

import '@kubevirt-utils/styles/list-managment-group.scss';

const InstanceTypePage = () => {
const InstanceTypePage: FC<ListPageProps> = (props) => {
const { t } = useKubevirtTranslation();
const navigate = useNavigate();
const location = useLocation();
const [activeNamespace] = useActiveNamespace();
const activeNamespace = props?.namespace ?? ALL_NAMESPACES;

const isSearchPage = useIsSearchPage();

const [activeTabKey, setActiveTabKey] = useState<number | string>(
location?.pathname.includes(VirtualMachineClusterInstancetypeModel.kind) ? 0 : 1,
);
const [instanceTypes, loaded, loadError] = useVirtualMachineInstanceTypes();
const [instanceTypes, loaded, loadError] = useVirtualMachineInstanceTypes(
props?.fieldSelector,
props?.selector,
);

const urlUserPreference = useMemo(
() =>
activeNamespace === ALL_NAMESPACES_SESSION_KEY
activeNamespace === ALL_NAMESPACES
? `/k8s/all-namespaces/${VirtualMachineInstancetypeModelRef}`
: `/k8s/ns/${activeNamespace}/${VirtualMachineInstancetypeModelRef}`,
[activeNamespace],
);

useEffect(() => {
if (isSearchPage) return;

navigate(
activeTabKey === 0
? `/k8s/cluster/${VirtualMachineClusterInstancetypeModelRef}`
: urlUserPreference,
);
}, [activeTabKey, navigate, urlUserPreference]);
}, [activeTabKey, navigate, urlUserPreference, isSearchPage]);

if (isSearchPage) {
const searchParams = new URLSearchParams(location?.search);

const kindSearched = searchParams.get('kind');
return kindSearched === VirtualMachineClusterInstancetypeModelRef ? (
<ClusterInstancetypeList {...props} />
) : (
<UserInstancetypeList {...props} />
);
}

return (
<>
Expand All @@ -68,10 +89,10 @@ const InstanceTypePage = () => {
style={{ flexShrink: 0 }}
>
<Tab eventKey={0} title={<TabTitleText>{t('Cluster provided')}</TabTitleText>}>
<ClusterInstancetypeList />
<ClusterInstancetypeList {...props} />
</Tab>
<Tab eventKey={1} title={<TabTitleText>{t('User provided')}</TabTitleText>}>
<UserInstancetypeList />
<UserInstancetypeList {...props} />
</Tab>
</Tabs>
</>
Expand Down
30 changes: 24 additions & 6 deletions src/views/instancetypes/list/UserInstancetypeList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import ListPageFilter from '@kubevirt-utils/components/ListPageFilter/ListPageFi
import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
import usePagination from '@kubevirt-utils/hooks/usePagination/usePagination';
import { paginationDefaultValues } from '@kubevirt-utils/hooks/usePagination/utils/constants';
import { ListPageProps } from '@kubevirt-utils/utils/types';
import { isEmpty } from '@kubevirt-utils/utils/utils';
import {
ListPageBody,
useActiveNamespace,
useListPageFilter,
VirtualizedTable,
} from '@openshift-console/dynamic-plugin-sdk';
Expand All @@ -22,19 +22,34 @@ import useUserInstancetypeListColumns from './hooks/useUserInstancetypeListColum

import '@kubevirt-utils/styles/list-managment-group.scss';

const UserInstancetypeList: FC = () => {
const UserInstancetypeList: FC<ListPageProps> = ({
fieldSelector,
hideColumnManagement,
hideNameLabelFilters,
hideTextFilter,
nameFilter,
namespace,
selector,
}) => {
const { t } = useKubevirtTranslation();
const [activeNamespace] = useActiveNamespace();
const [instanceTypes, loaded, loadError] = useVirtualMachineInstanceTypes();
const [instanceTypes, loaded, loadError] = useVirtualMachineInstanceTypes(
fieldSelector,
selector,
);

const { onPaginationChange, pagination } = usePagination();

const [unfilteredData, data, onFilterChange] = useListPageFilter<
V1beta1VirtualMachineInstancetype,
V1beta1VirtualMachineInstancetype
>(instanceTypes);
>(instanceTypes, null, {
name: { selected: [nameFilter] },
});

const [columns, activeColumns, loadedColumns] = useUserInstancetypeListColumns(pagination, data);

if (loaded && isEmpty(unfilteredData)) {
return <UserInstancetypeEmptyState namespace={activeNamespace} />;
return <UserInstancetypeEmptyState namespace={namespace} />;
}

return (
Expand All @@ -61,6 +76,9 @@ const UserInstancetypeList: FC = () => {
});
}}
data={unfilteredData}
hideColumnManagement={hideColumnManagement}
hideLabelFilter={hideTextFilter}
hideNameLabelFilters={hideNameLabelFilters}
loaded={loaded && loadedColumns}
/>
{!isEmpty(data) && (
Expand Down

0 comments on commit 8ccc03e

Please sign in to comment.