mirror of https://github.com/apache/superset.git
fix: dataset list filters bug (#10398)
* fix dataset list filters * update database endpoint query params using rison encode
This commit is contained in:
parent
3fdc141b82
commit
37f9b513fe
|
@ -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'))
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue