/******************************************************************************
* Copyright (c) 2026 Contributors to the Eclipse Foundation.
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*****************************************************************************/
import { MultiSelectFilterInput } from "./data-grid-filter";
import { GridFilterOperator, GridFilterInputValueProps } from '@mui/x-data-grid';
/**
* Creates filter operators for single-value columns with multi-select capability.
* Includes "is any of" and "is none of" operators.
*
* @param options - Array of possible values to select from
* @returns Array of GridFilterOperator for use in column definition
*
*/
export const createMultiSelectFilterOperators = (options: string[]): GridFilterOperator[] => [
{
label: 'is any of',
value: 'isAnyOf',
getApplyFilterFn: (filterItem) => {
if (!filterItem.value || (filterItem.value as string[]).length === 0) {
return null;
}
const filterValues = filterItem.value as string[];
return (value) => filterValues.indexOf(value as string) !== -1;
},
InputComponent: (props: GridFilterInputValueProps) => (
),
},
{
label: 'is none of',
value: 'isNoneOf',
getApplyFilterFn: (filterItem) => {
if (!filterItem.value || (filterItem.value as string[]).length === 0) {
return null;
}
const filterValues = filterItem.value as string[];
return (value) => filterValues.indexOf(value as string) === -1;
},
InputComponent: (props: GridFilterInputValueProps) => (
),
},
];
/**
* Creates filter operators for array-type columns with multi-select capability.
* Includes "contains any of" and "contains none of" operators.
*
* @param options - Array of possible values to select from
* @returns Array of GridFilterOperator for use in column definition
*
*/
export const createArrayContainsFilterOperators = (options: string[]): GridFilterOperator[] => [
{
label: 'contains any of',
value: 'containsAnyOf',
getApplyFilterFn: (filterItem) => {
if (!filterItem.value || (filterItem.value as string[]).length === 0) {
return null;
}
const filterValues = filterItem.value as string[];
return (value) => filterValues.some(fv => (value as string[]).indexOf(fv) !== -1);
},
InputComponent: (props: GridFilterInputValueProps) => (
),
},
{
label: 'contains none of',
value: 'containsNoneOf',
getApplyFilterFn: (filterItem) => {
if (!filterItem.value || (filterItem.value as string[]).length === 0) {
return null;
}
const filterValues = filterItem.value as string[];
return (value) => !filterValues.some(fv => (value as string[]).indexOf(fv) !== -1);
},
InputComponent: (props: GridFilterInputValueProps) => (
),
},
];