) {
setValue('');
};
+ useEffect(() => {
+ setSelectedComparator(selectedColumn?.comparators[0]);
+ }, [selectedColumn]);
+
return (
<>
@@ -78,19 +82,31 @@ export function FilterAdd({ columns, onAddFilter }: Readonly) {
{t('common_criteria_adder_operator_label')}
- {
- setSelectedComparator(event.detail.value as FilterComparator);
- }}
- >
- {selectedColumn?.comparators?.map((comp) => (
-
- ))}
-
+ {selectedColumn &&
+ columns.map((column) => {
+ return (
+
+ {
+ setSelectedComparator(
+ event.detail.value as FilterComparator,
+ );
+ }}
+ >
+ {column?.comparators?.map((comp) => (
+
+ ))}
+
+
+ );
+ })}
diff --git a/packages/manager-react-components/src/components/filters/filter-list.component.tsx b/packages/manager-react-components/src/components/filters/filter-list.component.tsx
index 727c32460179..4f890a6f50ce 100644
--- a/packages/manager-react-components/src/components/filters/filter-list.component.tsx
+++ b/packages/manager-react-components/src/components/filters/filter-list.component.tsx
@@ -22,7 +22,7 @@ export function FilterList({
<>
{filters?.map((filter, key) => (
{
queryKey: string[];
diff --git a/packages/manager-react-components/src/hooks/datagrid/useIcebergV6.tsx b/packages/manager-react-components/src/hooks/datagrid/useIcebergV6.tsx
index ed6425304a82..8d086a6edf4a 100644
--- a/packages/manager-react-components/src/hooks/datagrid/useIcebergV6.tsx
+++ b/packages/manager-react-components/src/hooks/datagrid/useIcebergV6.tsx
@@ -1,8 +1,8 @@
import { useEffect, useState } from 'react';
import { IcebergFetchParamsV6, fetchIcebergV6 } from '@ovh-ux/manager-core-api';
import { useInfiniteQuery } from '@tanstack/react-query';
-import { ColumnSort } from '../../components';
import { defaultPageSize } from './index';
+import { useColumnFilters, ColumnSort } from '../../components';
interface IcebergV6Hook {
queryKey: string[];
@@ -25,6 +25,7 @@ export function useResourcesIcebergV6({
shouldFetchAll = false,
}: IcebergFetchParamsV6 & IcebergV6Hook) {
const [sorting, setSorting] = useState(defaultSorting);
+ const { filters, addFilter, removeFilter } = useColumnFilters();
const {
data: dataSelected,
@@ -33,7 +34,12 @@ export function useResourcesIcebergV6({
...rest
} = useInfiniteQuery({
initialPageParam: 1,
- queryKey: [...queryKey, shouldFetchAll ? 'all' : pageSize, sorting],
+ queryKey: [
+ ...queryKey,
+ shouldFetchAll ? 'all' : pageSize,
+ sorting,
+ filters,
+ ],
staleTime: Infinity,
retry: false,
queryFn: ({ pageParam: pageIndex }) =>
@@ -43,6 +49,7 @@ export function useResourcesIcebergV6({
page: pageIndex,
sortBy: sorting?.id || null,
sortReverse: sorting?.desc,
+ filters,
}),
getNextPageParam: (lastPage, _allPages, lastPageIndex) => {
if (lastPage.totalCount / pageSize > lastPageIndex) {
@@ -76,5 +83,10 @@ export function useResourcesIcebergV6({
...rest,
sorting,
setSorting,
+ filters: {
+ filters,
+ add: addFilter,
+ remove: removeFilter,
+ },
};
}
diff --git a/packages/manager-react-components/src/hooks/datagrid/useResourcesV6.tsx b/packages/manager-react-components/src/hooks/datagrid/useResourcesV6.tsx
index 30364230937b..19b1ba5253ef 100644
--- a/packages/manager-react-components/src/hooks/datagrid/useResourcesV6.tsx
+++ b/packages/manager-react-components/src/hooks/datagrid/useResourcesV6.tsx
@@ -1,6 +1,10 @@
import React, { useState, useEffect } from 'react';
import isDate from 'lodash.isdate';
-import { IcebergFetchParamsV6, fetchIcebergV6 } from '@ovh-ux/manager-core-api';
+import {
+ IcebergFetchParamsV6,
+ fetchIcebergV6,
+ FilterTypeCategories,
+} from '@ovh-ux/manager-core-api';
import { useQuery } from '@tanstack/react-query';
import { ColumnSort } from '../../components';
@@ -17,8 +21,10 @@ export interface ResourcesV6Hook {
}
export function dataType(a: any) {
- if (Number.isInteger(a)) return 'number';
- if (isDate(a)) return 'date';
+ if (Number.isInteger(a)) return FilterTypeCategories.Numeric;
+ if (isDate(a)) return FilterTypeCategories.Date;
+ if (typeof a === 'string') return FilterTypeCategories.String;
+ if (typeof a === 'boolean') return FilterTypeCategories.Boolean;
return typeof a;
}
diff --git a/packages/manager/core/api/src/filters.ts b/packages/manager/core/api/src/filters.ts
index 8e2cae4dd811..f82bd1bfe3c5 100644
--- a/packages/manager/core/api/src/filters.ts
+++ b/packages/manager/core/api/src/filters.ts
@@ -17,6 +17,14 @@ export type Filter = {
comparator: FilterComparator;
};
+export enum FilterTypeCategories {
+ Numeric = 'Numeric',
+ String = 'String',
+ Date = 'Date',
+ Boolean = 'Boolean',
+ Options = 'Options',
+}
+
export const FilterCategories = {
Numeric: [
FilterComparator.IsEqual,
@@ -37,6 +45,8 @@ export const FilterCategories = {
FilterComparator.IsBefore,
FilterComparator.IsAfter,
],
+ Boolean: [FilterComparator.IsEqual, FilterComparator.IsDifferent],
+ Options: [FilterComparator.IsEqual, FilterComparator.IsDifferent],
};
export function applyFilters(items: T[] = [], filters: Filter[] = []) {
diff --git a/packages/manager/core/generator/app/conditional-templates/listing/v2/index.tsx.hbs b/packages/manager/core/generator/app/conditional-templates/listing/v2/index.tsx.hbs
index 1d0c30075408..966777f4d2fc 100644
--- a/packages/manager/core/generator/app/conditional-templates/listing/v2/index.tsx.hbs
+++ b/packages/manager/core/generator/app/conditional-templates/listing/v2/index.tsx.hbs
@@ -4,11 +4,11 @@ import { {{#if isPCI }}useParams, {{/if}} useNavigate, useLocation } from 'react
import { OdsButton, OdsSpinner } from '@ovhcloud/ods-components/react';
import { ODS_BUTTON_VARIANT } from '@ovhcloud/ods-components';
-
import {
BaseLayout,
Breadcrumb,
Datagrid,
+ dataType,
DataGridTextCell,
ErrorBanner,
useResourcesIcebergV2,
@@ -49,6 +49,7 @@ export default function Listing() {
navigate(`${path}${label}`);
};
+ // Code to remove and declare definition columns in const variable
useEffect(() => {
if (status === 'success' && data?.pages[0].data.length === 0) {
navigate(urls.onboarding);
@@ -103,7 +104,15 @@ export default function Listing() {
};
return (
- } header={header}>
+
+ }
+ header={header}
+ >
{columns && flattenData && (
{
- if (columns && status === 'success' && flattenData?.length > 0) {
+ if (columns.length === 0 && status === 'success' && flattenData?.length > 0) {
const newColumns = Object.keys(flattenData[0])
.filter((element) => element !== 'iam')
.map((element) => ({
id: element,
label: element,
+ isFilterable: true,
// @ts-ignore
type: dataType(flattenData[0][element]),
+ // @ts-ignore
+ ...(comparatorType[dataType(flattenData[0][element])] && {
+ // @ts-ignore
+ comparator: comparatorType[dataType(flattenData[0][element])],
+ }),
cell: (props: any) => {
const label = props[element] as string;
if (typeof label === 'string' || typeof label === 'number') {
@@ -108,7 +125,15 @@ export default function Listing() {
};
return (
- } header={header}>} header={header}>
+
+ }
+ header={header}
+ >
{columns && flattenData && (
)}
diff --git a/yarn.lock b/yarn.lock
index 264dbcfd8e94..4d640b5ff0ea 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -17646,7 +17646,7 @@ i18next@^23.11.5:
i18next@^23.16.4:
version "23.16.8"
- resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.16.8.tgz#3ae1373d344c2393f465556f394aba5a9233b93a"
+ resolved "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz#3ae1373d344c2393f465556f394aba5a9233b93a"
integrity sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==
dependencies:
"@babel/runtime" "^7.23.2"