@mui/x-data-grid
Version:
The community edition of the data grid component (MUI X).
163 lines (146 loc) • 6.43 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
const _excluded = ["linkOperators", "columnsSort", "filterFormProps", "children"];
import * as React from 'react';
import PropTypes from 'prop-types';
import { GridLinkOperator } from '../../../models/gridFilterItem';
import { useGridApiContext } from '../../../hooks/utils/useGridApiContext';
import { GridAddIcon } from '../../icons';
import { GridPanelContent } from '../GridPanelContent';
import { GridPanelFooter } from '../GridPanelFooter';
import { GridPanelWrapper } from '../GridPanelWrapper';
import { GridFilterForm } from './GridFilterForm';
import { useGridRootProps } from '../../../hooks/utils/useGridRootProps';
import { useGridSelector } from '../../../hooks/utils/useGridSelector';
import { gridFilterModelSelector } from '../../../hooks/features/filter/gridFilterSelector';
import { gridFilterableColumnDefinitionsSelector } from '../../../hooks/features/columns/gridColumnsSelector';
import { jsx as _jsx } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
const GridFilterPanel = /*#__PURE__*/React.forwardRef(function GridFilterPanel(props, ref) {
var _rootProps$components;
const apiRef = useGridApiContext();
const rootProps = useGridRootProps();
const filterModel = useGridSelector(apiRef, gridFilterModelSelector);
const filterableColumns = useGridSelector(apiRef, gridFilterableColumnDefinitionsSelector);
const lastFilterRef = React.useRef(null);
const {
linkOperators = [GridLinkOperator.And, GridLinkOperator.Or],
columnsSort,
filterFormProps
} = props,
other = _objectWithoutPropertiesLoose(props, _excluded);
const applyFilter = React.useCallback(item => {
apiRef.current.upsertFilterItem(item);
}, [apiRef]);
const applyFilterLinkOperator = React.useCallback(operator => {
apiRef.current.setFilterLinkOperator(operator);
}, [apiRef]);
const getDefaultItem = React.useCallback(() => {
const firstColumnWithOperator = filterableColumns.find(colDef => {
var _colDef$filterOperato;
return (_colDef$filterOperato = colDef.filterOperators) == null ? void 0 : _colDef$filterOperato.length;
});
if (!firstColumnWithOperator) {
return null;
}
return {
columnField: firstColumnWithOperator.field,
operatorValue: firstColumnWithOperator.filterOperators[0].value,
id: Math.round(Math.random() * 1e5)
};
}, [filterableColumns]);
const items = React.useMemo(() => {
if (filterModel.items.length) {
return filterModel.items;
}
const defaultItem = getDefaultItem();
return defaultItem ? [defaultItem] : [];
}, [filterModel.items, getDefaultItem]);
const hasMultipleFilters = items.length > 1;
const addNewFilter = () => {
const defaultItem = getDefaultItem();
if (!defaultItem) {
return;
}
apiRef.current.upsertFilterItems([...items, defaultItem]);
};
const deleteFilter = React.useCallback(item => {
const shouldCloseFilterPanel = items.length === 1;
apiRef.current.deleteFilterItem(item);
if (shouldCloseFilterPanel) {
apiRef.current.hideFilterPanel();
}
}, [apiRef, items.length]);
React.useEffect(() => {
if (linkOperators.length > 0 && filterModel.linkOperator && !linkOperators.includes(filterModel.linkOperator)) {
applyFilterLinkOperator(linkOperators[0]);
}
}, [linkOperators, applyFilterLinkOperator, filterModel.linkOperator]);
React.useEffect(() => {
if (items.length > 0) {
lastFilterRef.current.focus();
}
}, [items.length]);
return /*#__PURE__*/_jsxs(GridPanelWrapper, _extends({
ref: ref
}, other, {
children: [/*#__PURE__*/_jsx(GridPanelContent, {
children: items.map((item, index) => /*#__PURE__*/_jsx(GridFilterForm, _extends({
item: item,
applyFilterChanges: applyFilter,
deleteFilter: deleteFilter,
hasMultipleFilters: hasMultipleFilters,
showMultiFilterOperators: index > 0,
multiFilterOperator: filterModel.linkOperator,
disableMultiFilterOperator: index !== 1,
applyMultiFilterOperatorChanges: applyFilterLinkOperator,
focusElementRef: index === items.length - 1 ? lastFilterRef : null,
linkOperators: linkOperators,
columnsSort: columnsSort
}, filterFormProps), item.id == null ? index : item.id))
}), !rootProps.disableMultipleColumnsFiltering && /*#__PURE__*/_jsx(GridPanelFooter, {
children: /*#__PURE__*/_jsx(rootProps.components.BaseButton, _extends({
onClick: addNewFilter,
startIcon: /*#__PURE__*/_jsx(GridAddIcon, {})
}, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.baseButton, {
children: apiRef.current.getLocaleText('filterPanelAddFilter')
}))
})]
}));
});
process.env.NODE_ENV !== "production" ? GridFilterPanel.propTypes = {
// ----------------------------- Warning --------------------------------
// | These PropTypes are generated from the TypeScript type definitions |
// | To update them edit the TypeScript types and run "yarn proptypes" |
// ----------------------------------------------------------------------
/**
* @ignore - do not document.
*/
children: PropTypes.node,
/**
* Changes how the options in the columns selector should be ordered.
* If not specified, the order is derived from the `columns` prop.
*/
columnsSort: PropTypes.oneOf(['asc', 'desc']),
/**
* Props passed to each filter form.
*/
filterFormProps: PropTypes.shape({
columnInputProps: PropTypes.any,
columnsSort: PropTypes.oneOf(['asc', 'desc']),
deleteIconProps: PropTypes.any,
linkOperatorInputProps: PropTypes.any,
operatorInputProps: PropTypes.any,
valueInputProps: PropTypes.any
}),
/**
* Sets the available logic operators.
* @default [GridLinkOperator.And, GridLinkOperator.Or]
*/
linkOperators: PropTypes.arrayOf(PropTypes.oneOf(['and', 'or']).isRequired),
/**
* The system prop that allows defining system overrides as well as additional CSS styles.
*/
sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])
} : void 0;
export { GridFilterPanel };