UNPKG

@mui/x-data-grid

Version:

The community edition of the data grid component (MUI X).

190 lines (153 loc) 8.36 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.GridFilterPanel = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _gridFilterItem = require("../../../models/gridFilterItem"); var _useGridApiContext = require("../../../hooks/utils/useGridApiContext"); var _icons = require("../../icons"); var _GridPanelContent = require("../GridPanelContent"); var _GridPanelFooter = require("../GridPanelFooter"); var _GridPanelWrapper = require("../GridPanelWrapper"); var _GridFilterForm = require("./GridFilterForm"); var _useGridRootProps = require("../../../hooks/utils/useGridRootProps"); var _useGridSelector = require("../../../hooks/utils/useGridSelector"); var _gridFilterSelector = require("../../../hooks/features/filter/gridFilterSelector"); var _gridColumnsSelector = require("../../../hooks/features/columns/gridColumnsSelector"); var _jsxRuntime = require("react/jsx-runtime"); const _excluded = ["linkOperators", "columnsSort", "filterFormProps", "children"]; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const GridFilterPanel = /*#__PURE__*/React.forwardRef(function GridFilterPanel(props, ref) { var _rootProps$components; const apiRef = (0, _useGridApiContext.useGridApiContext)(); const rootProps = (0, _useGridRootProps.useGridRootProps)(); const filterModel = (0, _useGridSelector.useGridSelector)(apiRef, _gridFilterSelector.gridFilterModelSelector); const filterableColumns = (0, _useGridSelector.useGridSelector)(apiRef, _gridColumnsSelector.gridFilterableColumnDefinitionsSelector); const lastFilterRef = React.useRef(null); const { linkOperators = [_gridFilterItem.GridLinkOperator.And, _gridFilterItem.GridLinkOperator.Or], columnsSort, filterFormProps } = props, other = (0, _objectWithoutPropertiesLoose2.default)(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__*/(0, _jsxRuntime.jsxs)(_GridPanelWrapper.GridPanelWrapper, (0, _extends2.default)({ ref: ref }, other, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_GridPanelContent.GridPanelContent, { children: items.map((item, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridFilterForm.GridFilterForm, (0, _extends2.default)({ 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__*/(0, _jsxRuntime.jsx)(_GridPanelFooter.GridPanelFooter, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseButton, (0, _extends2.default)({ onClick: addNewFilter, startIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.GridAddIcon, {}) }, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.baseButton, { children: apiRef.current.getLocaleText('filterPanelAddFilter') })) })] })); }); exports.GridFilterPanel = GridFilterPanel; 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.default.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.default.oneOf(['asc', 'desc']), /** * Props passed to each filter form. */ filterFormProps: _propTypes.default.shape({ columnInputProps: _propTypes.default.any, columnsSort: _propTypes.default.oneOf(['asc', 'desc']), deleteIconProps: _propTypes.default.any, linkOperatorInputProps: _propTypes.default.any, operatorInputProps: _propTypes.default.any, valueInputProps: _propTypes.default.any }), /** * Sets the available logic operators. * @default [GridLinkOperator.And, GridLinkOperator.Or] */ linkOperators: _propTypes.default.arrayOf(_propTypes.default.oneOf(['and', 'or']).isRequired), /** * The system prop that allows defining system overrides as well as additional CSS styles. */ sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]) } : void 0;