mirror of
https://github.com/strapi/strapi.git
synced 2025-07-26 02:20:32 +00:00
commit
efc9934f8f
@ -12,6 +12,21 @@ const Filters = ({ displayedFilters }) => {
|
|||||||
const buttonRef = useRef();
|
const buttonRef = useRef();
|
||||||
const { trackUsage } = useTracking();
|
const { trackUsage } = useTracking();
|
||||||
|
|
||||||
|
const handleBlur = e => {
|
||||||
|
// TO FIX - select's modals prevent blur to work correctly
|
||||||
|
const notNull = e.currentTarget !== null && e.relatedTarget !== null;
|
||||||
|
const ulListBox = document.querySelector('[role="listbox"]');
|
||||||
|
|
||||||
|
if (
|
||||||
|
!e.currentTarget.contains(e.relatedTarget) &&
|
||||||
|
e.relatedTarget !== buttonRef.current &&
|
||||||
|
e.relatedTarget !== ulListBox &&
|
||||||
|
notNull
|
||||||
|
) {
|
||||||
|
setIsVisible(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleToggle = () => {
|
const handleToggle = () => {
|
||||||
if (!isVisible) {
|
if (!isVisible) {
|
||||||
trackUsage('willFilterEntries');
|
trackUsage('willFilterEntries');
|
||||||
@ -35,6 +50,7 @@ const Filters = ({ displayedFilters }) => {
|
|||||||
<FilterPopoverURLQuery
|
<FilterPopoverURLQuery
|
||||||
displayedFilters={displayedFilters}
|
displayedFilters={displayedFilters}
|
||||||
isVisible={isVisible}
|
isVisible={isVisible}
|
||||||
|
onBlur={handleBlur}
|
||||||
onToggle={handleToggle}
|
onToggle={handleToggle}
|
||||||
source={buttonRef}
|
source={buttonRef}
|
||||||
/>
|
/>
|
||||||
|
@ -11,6 +11,21 @@ const Filters = ({ displayedFilters }) => {
|
|||||||
const { formatMessage } = useIntl();
|
const { formatMessage } = useIntl();
|
||||||
const buttonRef = useRef();
|
const buttonRef = useRef();
|
||||||
|
|
||||||
|
const handleBlur = e => {
|
||||||
|
// TO FIX - select's modals prevent blur to work correctly
|
||||||
|
const notNull = e.currentTarget !== null && e.relatedTarget !== null;
|
||||||
|
const ulListBox = document.querySelector('[role="listbox"]');
|
||||||
|
|
||||||
|
if (
|
||||||
|
!e.currentTarget.contains(e.relatedTarget) &&
|
||||||
|
e.relatedTarget !== buttonRef.current &&
|
||||||
|
e.relatedTarget !== ulListBox &&
|
||||||
|
notNull
|
||||||
|
) {
|
||||||
|
setIsVisible(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleToggle = () => {
|
const handleToggle = () => {
|
||||||
setIsVisible(prev => !prev);
|
setIsVisible(prev => !prev);
|
||||||
};
|
};
|
||||||
@ -31,6 +46,7 @@ const Filters = ({ displayedFilters }) => {
|
|||||||
<FilterPopoverURLQuery
|
<FilterPopoverURLQuery
|
||||||
displayedFilters={displayedFilters}
|
displayedFilters={displayedFilters}
|
||||||
isVisible={isVisible}
|
isVisible={isVisible}
|
||||||
|
onBlur={handleBlur}
|
||||||
onToggle={handleToggle}
|
onToggle={handleToggle}
|
||||||
source={buttonRef}
|
source={buttonRef}
|
||||||
/>
|
/>
|
||||||
|
@ -19,7 +19,7 @@ import useTracking from '../../hooks/useTracking';
|
|||||||
import Inputs from './Inputs';
|
import Inputs from './Inputs';
|
||||||
import getFilterList from './utils/getFilterList';
|
import getFilterList from './utils/getFilterList';
|
||||||
|
|
||||||
const FilterPopoverURLQuery = ({ displayedFilters, isVisible, onToggle, source }) => {
|
const FilterPopoverURLQuery = ({ displayedFilters, isVisible, onBlur, onToggle, source }) => {
|
||||||
const [{ query }, setQuery] = useQueryParams();
|
const [{ query }, setQuery] = useQueryParams();
|
||||||
const { formatMessage } = useIntl();
|
const { formatMessage } = useIntl();
|
||||||
const { trackUsage } = useTracking();
|
const { trackUsage } = useTracking();
|
||||||
@ -115,7 +115,7 @@ const FilterPopoverURLQuery = ({ displayedFilters, isVisible, onToggle, source }
|
|||||||
const operator = modifiedData.filter;
|
const operator = modifiedData.filter;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover source={source} padding={3} spacing={4}>
|
<Popover source={source} padding={3} spacing={4} onBlur={onBlur}>
|
||||||
<FocusTrap onEscape={onToggle}>
|
<FocusTrap onEscape={onToggle}>
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<Stack size={1} style={{ minWidth: 184 }}>
|
<Stack size={1} style={{ minWidth: 184 }}>
|
||||||
@ -181,6 +181,10 @@ const FilterPopoverURLQuery = ({ displayedFilters, isVisible, onToggle, source }
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FilterPopoverURLQuery.defaultProps = {
|
||||||
|
onBlur: () => {},
|
||||||
|
};
|
||||||
|
|
||||||
FilterPopoverURLQuery.propTypes = {
|
FilterPopoverURLQuery.propTypes = {
|
||||||
displayedFilters: PropTypes.arrayOf(
|
displayedFilters: PropTypes.arrayOf(
|
||||||
PropTypes.shape({
|
PropTypes.shape({
|
||||||
@ -195,6 +199,7 @@ FilterPopoverURLQuery.propTypes = {
|
|||||||
})
|
})
|
||||||
).isRequired,
|
).isRequired,
|
||||||
isVisible: PropTypes.bool.isRequired,
|
isVisible: PropTypes.bool.isRequired,
|
||||||
|
onBlur: PropTypes.func,
|
||||||
onToggle: PropTypes.func.isRequired,
|
onToggle: PropTypes.func.isRequired,
|
||||||
source: PropTypes.shape({ current: PropTypes.instanceOf(Element) }).isRequired,
|
source: PropTypes.shape({ current: PropTypes.instanceOf(Element) }).isRequired,
|
||||||
};
|
};
|
||||||
|
@ -17,7 +17,7 @@ import Plus from '@strapi/icons/Plus';
|
|||||||
import FilterValueInput from './FilterValueInput';
|
import FilterValueInput from './FilterValueInput';
|
||||||
import getFilterList from './utils/getFilterList';
|
import getFilterList from './utils/getFilterList';
|
||||||
|
|
||||||
const FilterPopover = ({ displayedFilters, filters, onSubmit, onToggle, source }) => {
|
const FilterPopover = ({ displayedFilters, filters, onSubmit, onToggle, source, onBlur }) => {
|
||||||
const { formatMessage } = useIntl();
|
const { formatMessage } = useIntl();
|
||||||
|
|
||||||
const [modifiedData, setModifiedData] = useState({
|
const [modifiedData, setModifiedData] = useState({
|
||||||
@ -192,7 +192,7 @@ const FilterPopover = ({ displayedFilters, filters, onSubmit, onToggle, source }
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Popover source={source} padding={3} spacing={4}>
|
<Popover source={source} padding={3} spacing={4} onBlur={onBlur}>
|
||||||
<FocusTrap onEscape={onToggle}>
|
<FocusTrap onEscape={onToggle}>
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<Stack size={1} style={{ minWidth: 184 }}>
|
<Stack size={1} style={{ minWidth: 184 }}>
|
||||||
@ -266,6 +266,7 @@ FilterPopover.propTypes = {
|
|||||||
})
|
})
|
||||||
).isRequired,
|
).isRequired,
|
||||||
filters: PropTypes.array.isRequired,
|
filters: PropTypes.array.isRequired,
|
||||||
|
onBlur: PropTypes.func.isRequired,
|
||||||
onSubmit: PropTypes.func.isRequired,
|
onSubmit: PropTypes.func.isRequired,
|
||||||
onToggle: PropTypes.func.isRequired,
|
onToggle: PropTypes.func.isRequired,
|
||||||
source: PropTypes.shape({ current: PropTypes.instanceOf(Element) }).isRequired,
|
source: PropTypes.shape({ current: PropTypes.instanceOf(Element) }).isRequired,
|
||||||
|
@ -45,6 +45,21 @@ export const Filters = () => {
|
|||||||
|
|
||||||
const toggleFilter = () => setVisible(prev => !prev);
|
const toggleFilter = () => setVisible(prev => !prev);
|
||||||
|
|
||||||
|
const handleBlur = e => {
|
||||||
|
// TO FIX - select's modals prevent blur to work correctly
|
||||||
|
const notNull = e.currentTarget !== null && e.relatedTarget !== null;
|
||||||
|
const ulListBox = document.querySelector('[role="listbox"]');
|
||||||
|
|
||||||
|
if (
|
||||||
|
!e.currentTarget.contains(e.relatedTarget) &&
|
||||||
|
e.relatedTarget !== buttonRef.current &&
|
||||||
|
e.relatedTarget !== ulListBox &&
|
||||||
|
notNull
|
||||||
|
) {
|
||||||
|
setVisible(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleRemoveFilter = nextFilters => {
|
const handleRemoveFilter = nextFilters => {
|
||||||
setQuery({ filters: { $and: nextFilters }, page: 1 });
|
setQuery({ filters: { $and: nextFilters }, page: 1 });
|
||||||
};
|
};
|
||||||
@ -68,6 +83,7 @@ export const Filters = () => {
|
|||||||
<FilterPopover
|
<FilterPopover
|
||||||
displayedFilters={displayedFilters}
|
displayedFilters={displayedFilters}
|
||||||
filters={filters}
|
filters={filters}
|
||||||
|
onBlur={handleBlur}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
onToggle={toggleFilter}
|
onToggle={toggleFilter}
|
||||||
source={buttonRef}
|
source={buttonRef}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user