Skip to content

Commit

Permalink
fix(dashboard): Fill form with the latest values when undo in native …
Browse files Browse the repository at this point in the history
…filters (apache#16851)

* Set undoFormValues

* Reorganize

* Revert check

* Fix and clean up

* Fix pre-filter and sort values
  • Loading branch information
geido authored and Emmanuel Bavoux committed Nov 14, 2021
1 parent 16ced23 commit 07fea0b
Showing 1 changed file with 89 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -315,12 +315,15 @@ const FiltersConfigForm = (
const [activeFilterPanelKey, setActiveFilterPanelKey] = useState<
string | string[]
>(FilterPanels.basic.key);

const [undoFormValues, setUndoFormValues] = useState<Record<
string,
any
> | null>(null);
const forceUpdate = useForceUpdate();
const [datasetDetails, setDatasetDetails] = useState<Record<string, any>>();
const defaultFormFilter = useMemo(() => ({}), []);
const formFilter =
form.getFieldValue('filters')?.[filterId] || defaultFormFilter;
const formValues = form.getFieldValue('filters')?.[filterId];
const formFilter = formValues || undoFormValues || defaultFormFilter;

const nativeFilterItems = getChartMetadataRegistry().items;
const nativeFilterVizTypes = Object.entries(nativeFilterItems)
Expand All @@ -346,11 +349,11 @@ const FiltersConfigForm = (

const showTimeRangePicker = useMemo(() => {
const currentDataset = Object.values(loadedDatasets).find(
dataset => dataset.id === formFilter.dataset?.value,
dataset => dataset.id === formFilter?.dataset?.value,
);

return currentDataset ? hasTemporalColumns(currentDataset) : true;
}, [formFilter.dataset?.value, loadedDatasets]);
}, [formFilter?.dataset?.value, loadedDatasets]);

// @ts-ignore
const hasDataset = !!nativeFilterItems[formFilter?.filterType]?.value
Expand All @@ -368,7 +371,7 @@ const FiltersConfigForm = (
forceUpdate,
form,
filterId,
filterType: formFilter.filterType,
filterType: formFilter?.filterType,
filterToEdit,
formFilter,
removed,
Expand All @@ -380,31 +383,6 @@ const FiltersConfigForm = (
// @ts-ignore
const enableNoResults = !!nativeFilterItem.value?.enableNoResults;

useEffect(() => {
if (datasetId) {
cachedSupersetGet({
endpoint: `/api/v1/dataset/${datasetId}`,
})
.then((response: JsonResponse) => {
setMetrics(response.json?.result?.metrics);
const dataset = response.json?.result;
// modify the response to fit structure expected by AdhocFilterControl
dataset.type = dataset.datasource_type;
dataset.filter_select = true;
setDatasetDetails(dataset);
})
.catch((response: SupersetApiError) => {
addDangerToast(response.message);
});
}
}, [datasetId]);

useImperativeHandle(ref, () => ({
changeTab(tab: 'configuration' | 'scoping') {
setActiveTabKey(tab);
},
}));

const hasMetrics = hasColumn && !!metrics.length;

const hasFilledDataset =
Expand All @@ -418,8 +396,6 @@ const FiltersConfigForm = (

const isDataDirty = formFilter?.isDataDirty ?? true;

useBackendFormUpdate(form, filterId);

const setNativeFilterFieldValuesWrapper = (values: object) => {
setNativeFilterFieldValues(form, filterId, values);
setError('');
Expand Down Expand Up @@ -513,20 +489,6 @@ const FiltersConfigForm = (
const showDataset =
!datasetId || datasetDetails || formFilter?.dataset?.label;

useEffect(() => {
if (hasDataset && hasFilledDataset && hasDefaultValue && isDataDirty) {
refreshHandler();
}
}, [
hasDataset,
hasFilledDataset,
hasDefaultValue,
formFilter,
isDataDirty,
refreshHandler,
showDataset,
]);

const formChanged = useCallback(() => {
form.setFields([
{
Expand All @@ -550,15 +512,21 @@ const FiltersConfigForm = (
}));

const parentFilter = parentFilterOptions.find(
({ value }) => value === filterToEdit?.cascadeParentIds[0],
({ value }) =>
value === formFilter?.parentFilter?.value ||
value === filterToEdit?.cascadeParentIds?.[0],
);

const hasParentFilter = !!parentFilter;

const hasPreFilter =
!!filterToEdit?.adhoc_filters || !!filterToEdit?.time_range;
!!formFilter?.adhoc_filters ||
!!formFilter?.time_range ||
!!filterToEdit?.adhoc_filters?.length ||
!!filterToEdit?.time_range;

const hasSorting =
typeof formFilter?.controlValues?.sortAscending === 'boolean' ||
typeof filterToEdit?.controlValues?.sortAscending === 'boolean';

let sort = filterToEdit?.controlValues?.sortAscending;
Expand Down Expand Up @@ -604,7 +572,7 @@ const FiltersConfigForm = (
formFilter?.filterType === 'filter_range';

const initialDefaultValue =
formFilter.filterType === filterToEdit?.filterType
formFilter?.filterType === filterToEdit?.filterType
? filterToEdit?.defaultDataMask
: null;

Expand All @@ -622,6 +590,62 @@ const FiltersConfigForm = (
.some(key => controlItems[key].checked);
}

const ParentSelect = ({
value,
...rest
}: {
value?: { value: string | number };
}) => (
<Select
ariaLabel={t('Parent filter')}
placeholder={t('None')}
options={parentFilterOptions}
allowClear
value={value?.value}
{...rest}
/>
);

useEffect(() => {
if (datasetId) {
cachedSupersetGet({
endpoint: `/api/v1/dataset/${datasetId}`,
})
.then((response: JsonResponse) => {
setMetrics(response.json?.result?.metrics);
const dataset = response.json?.result;
// modify the response to fit structure expected by AdhocFilterControl
dataset.type = dataset.datasource_type;
dataset.filter_select = true;
setDatasetDetails(dataset);
})
.catch((response: SupersetApiError) => {
addDangerToast(response.message);
});
}
}, [datasetId]);

useImperativeHandle(ref, () => ({
changeTab(tab: 'configuration' | 'scoping') {
setActiveTabKey(tab);
},
}));

useBackendFormUpdate(form, filterId);

useEffect(() => {
if (hasDataset && hasFilledDataset && hasDefaultValue && isDataDirty) {
refreshHandler();
}
}, [
hasDataset,
hasFilledDataset,
hasDefaultValue,
isDataDirty,
refreshHandler,
showDataset,
]);

useEffect(() => {
const activeFilterPanelKey = [FilterPanels.basic.key];
if (hasCheckedAdvancedControl) {
Expand Down Expand Up @@ -652,21 +676,20 @@ const FiltersConfigForm = (
JSON.stringify(loadedDatasets),
]);

const ParentSelect = ({
value,
...rest
}: {
value?: { value: string | number };
}) => (
<Select
ariaLabel={t('Parent filter')}
placeholder={t('None')}
options={parentFilterOptions}
allowClear
value={value?.value}
{...rest}
/>
);
useEffect(() => {
// just removed, saving current form items for eventual undo
if (removed) {
setUndoFormValues(formValues);
}
}, [removed]);

useEffect(() => {
// the filter was just restored after undo
if (undoFormValues && !removed) {
setNativeFilterFieldValues(form, filterId, undoFormValues);
setUndoFormValues(null);
}
}, [formValues, filterId, form, removed, undoFormValues]);

if (removed) {
return <RemovedFilter onClick={() => restoreFilter(filterId)} />;
Expand Down Expand Up @@ -814,7 +837,7 @@ const FiltersConfigForm = (
formChanged();
}}
>
{formFilter.filterType && (
{!removed && (
<StyledRowSubFormItem
name={['filters', filterId, 'defaultDataMask']}
initialValue={initialDefaultValue}
Expand Down

0 comments on commit 07fea0b

Please sign in to comment.