mirror of
https://github.com/apache/superset.git
synced 2024-09-17 11:09:47 -04:00
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:
parent
535ca736d7
commit
ff2d5888d9
@ -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 && (
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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>
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user