blob: b0815b63226e0766af9ea608766615843d2afe0a [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { ExtraFormData, QueryFormData, QueryObject } from '@superset-ui/core';
import { RefObject } from 'react';
import { Filter } from './types';
import { NativeFiltersState } from '../../reducers/types';
export const getFormData = ({
datasetId = 18,
cascadingFilters = {},
groupby,
allowsMultipleValues = false,
defaultValue,
currentValue,
inverseSelection,
inputRef,
}: Partial<Filter> & {
datasetId?: number;
inputRef?: RefObject<HTMLInputElement>;
cascadingFilters?: object;
groupby: string;
}): Partial<QueryFormData> => ({
adhoc_filters: [],
datasource: `${datasetId}__table`,
extra_filters: [],
extra_form_data: cascadingFilters,
granularity_sqla: 'ds',
groupby: [groupby],
inverseSelection,
metrics: ['count'],
multiSelect: allowsMultipleValues,
row_limit: 10000,
showSearch: true,
currentValue,
time_range: 'No filter',
time_range_endpoints: ['inclusive', 'exclusive'],
url_params: {},
viz_type: 'filter_select',
// TODO: need process per filter type after will be decided approach
defaultValue,
inputRef,
});
export function mergeExtraFormData(
originalExtra: ExtraFormData,
newExtra: ExtraFormData,
): ExtraFormData {
const {
override_form_data: originalOverride = {},
append_form_data: originalAppend = {},
} = originalExtra;
const {
override_form_data: newOverride = {},
append_form_data: newAppend = {},
} = newExtra;
const appendKeys = new Set([
...Object.keys(originalAppend),
...Object.keys(newAppend),
]);
const appendFormData: Partial<QueryObject> = {};
appendKeys.forEach(key => {
appendFormData[key] = [
// @ts-ignore
...(originalAppend[key] || []),
// @ts-ignore
...(newAppend[key] || []),
];
});
return {
override_form_data: {
...originalOverride,
...newOverride,
},
append_form_data: appendFormData,
};
}
export function getExtraFormData(
nativeFilters: NativeFiltersState,
): ExtraFormData {
let extraFormData: ExtraFormData = {};
Object.keys(nativeFilters.filters).forEach(key => {
const filterState = nativeFilters.filtersState[key] || {};
const { extraFormData: newExtra = {} } = filterState;
extraFormData = mergeExtraFormData(extraFormData, newExtra);
});
return extraFormData;
}