feat(native-filters): Defer loading filters data until filter is visible (#15120)

* feat(native-filters): Defer running query until native filter is in view

* Fix default values not displaying
This commit is contained in:
Kamil Gabryjelski 2021-06-11 20:10:16 +02:00 committed by GitHub
parent 535ca736d7
commit ff2d5888d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 27 additions and 3 deletions

View File

@ -32,6 +32,7 @@ interface CascadePopoverProps {
filter: CascadeFilter; filter: CascadeFilter;
visible: boolean; visible: boolean;
directPathToChild?: string[]; directPathToChild?: string[];
inView?: boolean;
onVisibleChange: (visible: boolean) => void; onVisibleChange: (visible: boolean) => void;
onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void; onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void;
} }
@ -80,6 +81,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
onVisibleChange, onVisibleChange,
onFilterSelectionChange, onFilterSelectionChange,
directPathToChild, directPathToChild,
inView,
}) => { }) => {
const [currentPathToChild, setCurrentPathToChild] = useState<string[]>(); const [currentPathToChild, setCurrentPathToChild] = useState<string[]>();
const dataMask = dataMaskSelected[filter.id]; const dataMask = dataMaskSelected[filter.id];
@ -148,6 +150,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
filter={filter} filter={filter}
directPathToChild={directPathToChild} directPathToChild={directPathToChild}
onFilterSelectionChange={onFilterSelectionChange} onFilterSelectionChange={onFilterSelectionChange}
inView={inView}
/> />
); );
} }
@ -192,6 +195,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
filter={activeFilter} filter={activeFilter}
onFilterSelectionChange={onFilterSelectionChange} onFilterSelectionChange={onFilterSelectionChange}
directPathToChild={currentPathToChild} directPathToChild={currentPathToChild}
inView={inView}
icon={ icon={
<> <>
{filter.cascadeChildren.length !== 0 && ( {filter.cascadeChildren.length !== 0 && (

View File

@ -47,6 +47,7 @@ const FilterControl: React.FC<FilterProps> = ({
icon, icon,
onFilterSelectionChange, onFilterSelectionChange,
directPathToChild, directPathToChild,
inView,
}) => { }) => {
const { name = '<undefined>' } = filter; const { name = '<undefined>' } = filter;
return ( return (
@ -62,6 +63,7 @@ const FilterControl: React.FC<FilterProps> = ({
filter={filter} filter={filter}
directPathToChild={directPathToChild} directPathToChild={directPathToChild}
onFilterSelectionChange={onFilterSelectionChange} onFilterSelectionChange={onFilterSelectionChange}
inView={inView}
/> />
</StyledFilterControlContainer> </StyledFilterControlContainer>
); );

View File

@ -89,12 +89,13 @@ const FilterControls: FC<FilterControlsProps> = ({
filter={cascadeFilters[index]} filter={cascadeFilters[index]}
onFilterSelectionChange={onFilterSelectionChange} onFilterSelectionChange={onFilterSelectionChange}
directPathToChild={directPathToChild} directPathToChild={directPathToChild}
inView={false}
/> />
</portals.InPortal> </portals.InPortal>
))} ))}
{filtersInScope.map(filter => { {filtersInScope.map(filter => {
const index = filterValues.findIndex(f => f.id === filter.id); const index = filterValues.findIndex(f => f.id === filter.id);
return <portals.OutPortal node={portalNodes[index]} />; return <portals.OutPortal node={portalNodes[index]} inView />;
})} })}
{showCollapsePanel && ( {showCollapsePanel && (
<Collapse <Collapse
@ -132,7 +133,7 @@ const FilterControls: FC<FilterControlsProps> = ({
> >
{filtersOutOfScope.map(filter => { {filtersOutOfScope.map(filter => {
const index = cascadeFilters.findIndex(f => f.id === filter.id); const index = cascadeFilters.findIndex(f => f.id === filter.id);
return <portals.OutPortal node={portalNodes[index]} />; return <portals.OutPortal node={portalNodes[index]} inView />;
})} })}
</Collapse.Panel> </Collapse.Panel>
</Collapse> </Collapse>

View File

@ -57,6 +57,7 @@ const FilterValue: React.FC<FilterProps> = ({
filter, filter,
directPathToChild, directPathToChild,
onFilterSelectionChange, onFilterSelectionChange,
inView = true,
}) => { }) => {
const { id, targets, filterType, adhoc_filters, time_range } = filter; const { id, targets, filterType, adhoc_filters, time_range } = filter;
const metadata = getChartMetadataRegistry().get(filterType); const metadata = getChartMetadataRegistry().get(filterType);
@ -65,6 +66,7 @@ const FilterValue: React.FC<FilterProps> = ({
const [error, setError] = useState<string>(''); const [error, setError] = useState<string>('');
const [formData, setFormData] = useState<Partial<QueryFormData>>({}); const [formData, setFormData] = useState<Partial<QueryFormData>>({});
const [ownState, setOwnState] = useState<JsonObject>({}); const [ownState, setOwnState] = useState<JsonObject>({});
const [inViewFirstTime, setInViewFirstTime] = useState(inView);
const inputRef = useRef<HTMLInputElement>(null); const inputRef = useRef<HTMLInputElement>(null);
const [target] = targets; const [target] = targets;
const { const {
@ -76,7 +78,17 @@ const FilterValue: React.FC<FilterProps> = ({
const [isLoading, setIsLoading] = useState<boolean>(hasDataSource); const [isLoading, setIsLoading] = useState<boolean>(hasDataSource);
const [isRefreshing, setIsRefreshing] = useState<boolean>(true); const [isRefreshing, setIsRefreshing] = useState<boolean>(true);
const dispatch = useDispatch(); const dispatch = useDispatch();
useEffect(() => { useEffect(() => {
if (!inViewFirstTime && inView) {
setInViewFirstTime(true);
}
}, [inView, inViewFirstTime, setInViewFirstTime]);
useEffect(() => {
if (!inViewFirstTime) {
return;
}
const newFormData = getFormData({ const newFormData = getFormData({
...filter, ...filter,
datasetId, datasetId,
@ -134,6 +146,7 @@ const FilterValue: React.FC<FilterProps> = ({
}); });
} }
}, [ }, [
inViewFirstTime,
cascadingFilters, cascadingFilters,
datasetId, datasetId,
groupby, groupby,

View File

@ -29,4 +29,5 @@ export interface FilterProps {
icon?: React.ReactElement; icon?: React.ReactElement;
directPathToChild?: string[]; directPathToChild?: string[];
onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void; onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void;
inView?: boolean;
} }

View File

@ -178,7 +178,10 @@ const FilterBar: React.FC<FiltersBarProps> = ({
useEffect(() => { useEffect(() => {
setDataMaskSelected(draft => { setDataMaskSelected(draft => {
Object.values(filters).forEach(filter => { Object.values(filters).forEach(filter => {
if (filter.filterType !== previousFilters?.[filter.id]?.filterType) { if (
filter.filterType !== previousFilters?.[filter.id]?.filterType &&
previousFilters?.[filter.id]?.filterType !== undefined
) {
draft[filter.id] = getInitialDataMask(filter.id) as DataMaskWithId; draft[filter.id] = getInitialDataMask(filter.id) as DataMaskWithId;
} }
}); });