fix: dataset list filters bug (#10398)

* fix dataset list filters

* update database endpoint query params using rison encode
This commit is contained in:
Lily Kuang 2020-07-22 22:23:44 -07:00 committed by GitHub
parent 3fdc141b82
commit 37f9b513fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 82 additions and 61 deletions

View File

@ -19,6 +19,7 @@
import React from 'react';
import styled from '@superset-ui/style';
import PropTypes from 'prop-types';
import rison from 'rison';
import { Select, AsyncSelect } from 'src/components/Select';
import { ControlLabel, Label } from 'react-bootstrap';
import { t } from '@superset-ui/translation';
@ -274,14 +275,27 @@ export default class TableSelector extends React.PureComponent {
}
renderDatabaseSelect() {
const queryParams = rison.encode({
order_columns: 'database_name',
order_direction: 'asc',
page: 0,
page_size: -1,
...(this.props.formMode
? {}
: {
filters: [
{
col: 'expose_in_sqllab',
opr: 'eq',
value: true,
},
],
}),
});
return this.renderSelectRow(
<SupersetAsyncSelect
dataEndpoint={
'/api/v1/database/?q=' +
'(keys:!(none),' +
'filters:!((col:expose_in_sqllab,opr:eq,value:!t)),' +
'order_columns:database_name,order_direction:asc,page:0,page_size:-1)'
}
dataEndpoint={`/api/v1/database/?q=${queryParams}`}
onChange={this.onDatabaseChange}
onAsyncError={() =>
this.props.handleError(t('Error while fetching database list'))

View File

@ -80,6 +80,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
>(null);
const [datasets, setDatasets] = useState<any[]>([]);
const [currentFilters, setCurrentFilters] = useState<Filters>([]);
const [filterOperators, setFilterOperators] = useState<FilterOperatorMap>();
const [
lastFetchDataConfig,
setLastFetchDataConfig,
@ -95,7 +96,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
);
const [bulkSelectEnabled, setBulkSelectEnabled] = useState<boolean>(false);
const updateFilters = (filterOperators: FilterOperatorMap) => {
const updateFilters = () => {
const convertFilter = ({
name: label,
operator,
@ -103,47 +104,49 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
name: string;
operator: string;
}) => ({ label, value: operator });
setCurrentFilters([
{
Header: 'Database',
id: 'database',
input: 'select',
operators: filterOperators.database.map(convertFilter),
selects: databases.map(({ text: label, value }) => ({
label,
value,
})),
},
{
Header: 'Schema',
id: 'schema',
operators: filterOperators.schema.map(convertFilter),
},
{
Header: 'Table Name',
id: 'table_name',
operators: filterOperators.table_name.map(convertFilter),
},
{
Header: 'Owners',
id: 'owners',
input: 'select',
operators: filterOperators.owners.map(convertFilter),
selects: currentOwners.map(({ text: label, value }) => ({
label,
value,
})),
},
{
Header: 'SQL Lab View',
id: 'is_sqllab_view',
input: 'checkbox',
operators: filterOperators.is_sqllab_view.map(convertFilter),
},
]);
if (filterOperators) {
setCurrentFilters([
{
Header: 'Database',
id: 'database',
input: 'select',
operators: filterOperators.database.map(convertFilter),
selects: databases.map(({ text: label, value }) => ({
label,
value,
})),
},
{
Header: 'Schema',
id: 'schema',
operators: filterOperators.schema.map(convertFilter),
},
{
Header: 'Table Name',
id: 'table_name',
operators: filterOperators.table_name.map(convertFilter),
},
{
Header: 'Owners',
id: 'owners',
input: 'select',
operators: filterOperators.owners.map(convertFilter),
selects: currentOwners.map(({ text: label, value }) => ({
label,
value,
})),
},
{
Header: 'SQL Lab View',
id: 'is_sqllab_view',
input: 'checkbox',
operators: filterOperators.is_sqllab_view.map(convertFilter),
},
]);
}
};
const fetchDataset = () => {
const fetchDataset = () =>
Promise.all([
SupersetClient.get({
endpoint: `/api/v1/dataset/_info`,
@ -154,18 +157,20 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
SupersetClient.get({
endpoint: `/api/v1/dataset/related/database`,
}),
]).then(
([
{ json: infoJson = {} },
{ json: ownersJson = {} },
{ json: databasesJson = {} },
]) => {
setCurrentOwners(ownersJson.result);
setDatabases(databasesJson.result);
setPermissions(infoJson.permissions);
updateFilters(infoJson.filters);
},
([e1, e2]) => {
])
.then(
([
{ json: infoJson = {} },
{ json: ownersJson = {} },
{ json: databasesJson = {} },
]) => {
setCurrentOwners(ownersJson.result);
setDatabases(databasesJson.result);
setPermissions(infoJson.permissions);
setFilterOperators(infoJson.filters);
},
)
.catch(([e1, e2]) => {
addDangerToast(t('An error occurred while fetching datasets'));
if (e1) {
console.error(e1);
@ -173,14 +178,16 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
if (e2) {
console.error(e2);
}
},
);
};
});
useEffect(() => {
fetchDataset();
}, []);
useEffect(() => {
updateFilters();
}, [databases, currentOwners, permissions, filterOperators]);
const hasPerm = (perm: string) => {
if (!permissions.length) {
return false;