diff --git a/superset-frontend/src/components/TableSelector.jsx b/superset-frontend/src/components/TableSelector.jsx index 0acff80250..d18fea92a1 100644 --- a/superset-frontend/src/components/TableSelector.jsx +++ b/superset-frontend/src/components/TableSelector.jsx @@ -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( this.props.handleError(t('Error while fetching database list')) diff --git a/superset-frontend/src/views/datasetList/DatasetList.tsx b/superset-frontend/src/views/datasetList/DatasetList.tsx index aebd465aaf..a5da58a18f 100644 --- a/superset-frontend/src/views/datasetList/DatasetList.tsx +++ b/superset-frontend/src/views/datasetList/DatasetList.tsx @@ -80,6 +80,7 @@ const DatasetList: FunctionComponent = ({ >(null); const [datasets, setDatasets] = useState([]); const [currentFilters, setCurrentFilters] = useState([]); + const [filterOperators, setFilterOperators] = useState(); const [ lastFetchDataConfig, setLastFetchDataConfig, @@ -95,7 +96,7 @@ const DatasetList: FunctionComponent = ({ ); const [bulkSelectEnabled, setBulkSelectEnabled] = useState(false); - const updateFilters = (filterOperators: FilterOperatorMap) => { + const updateFilters = () => { const convertFilter = ({ name: label, operator, @@ -103,47 +104,49 @@ const DatasetList: FunctionComponent = ({ 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 = ({ 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 = ({ if (e2) { console.error(e2); } - }, - ); - }; + }); useEffect(() => { fetchDataset(); }, []); + useEffect(() => { + updateFilters(); + }, [databases, currentOwners, permissions, filterOperators]); + const hasPerm = (perm: string) => { if (!permissions.length) { return false;