From 6cf6acc4d09ca4aed7f0ae99dcf681754783d214 Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" Date: Mon, 28 Dec 2020 09:56:36 -0300 Subject: [PATCH] Fix tests errors and warnings - iteration 1 (#12212) --- .../src/SqlLab/components/ResultSet.tsx | 18 +-- .../src/components/Menu/Menu.tsx | 1 + .../src/components/Menu/MenuObject.tsx | 1 + .../src/components/Menu/NewMenu.tsx | 1 + .../src/components/Menu/SubMenu.tsx | 55 ++++---- .../src/components/Select/styles.tsx | 4 +- ...AdhocFilterEditPopoverSimpleTabContent.jsx | 2 +- .../controls/AdhocFilterControl.jsx | 124 +++++++++--------- .../CRUD/data/database/DatabaseModal.tsx | 15 ++- .../src/views/CRUD/welcome/EmptyState.tsx | 12 +- 10 files changed, 128 insertions(+), 105 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index a5a1d5f842054..e6b68ac632d00 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -171,15 +171,17 @@ export default class ResultSet extends React.PureComponent< appContainer?.getAttribute('data-bootstrap') || '{}', ); - const datasets = await getByUser(bootstrapData.user.userId); - const userDatasetsOwned = datasets.map( - (r: { table_name: string; id: number }) => ({ - datasetName: r.table_name, - datasetId: r.id, - }), - ); + if (bootstrapData.user && bootstrapData.user.id) { + const datasets = await getByUser(bootstrapData.user.userId); + const userDatasetsOwned = datasets.map( + (r: { table_name: string; id: number }) => ({ + datasetName: r.table_name, + datasetId: r.id, + }), + ); - this.setState({ userDatasetsOwned }); + this.setState({ userDatasetsOwned }); + } } UNSAFE_componentWillReceiveProps(nextProps: ResultSetProps) { diff --git a/superset-frontend/src/components/Menu/Menu.tsx b/superset-frontend/src/components/Menu/Menu.tsx index 9216e11ebed7e..18ead3c164ab6 100644 --- a/superset-frontend/src/components/Menu/Menu.tsx +++ b/superset-frontend/src/components/Menu/Menu.tsx @@ -180,6 +180,7 @@ export function Menu({ title={t('Settings')} onMouseEnter={() => setDropdownOpen(true)} onMouseLeave={() => setDropdownOpen(false)} + onToggle={value => setDropdownOpen(value)} open={dropdownOpen} > diff --git a/superset-frontend/src/components/Menu/MenuObject.tsx b/superset-frontend/src/components/Menu/MenuObject.tsx index d5b2edeae8ace..130f4e3593872 100644 --- a/superset-frontend/src/components/Menu/MenuObject.tsx +++ b/superset-frontend/src/components/Menu/MenuObject.tsx @@ -60,6 +60,7 @@ export default function MenuObject({ title={label} onMouseEnter={() => setDropdownOpen(true)} onMouseLeave={() => setDropdownOpen(false)} + onToggle={value => setDropdownOpen(value)} open={dropdownOpen} > diff --git a/superset-frontend/src/components/Menu/NewMenu.tsx b/superset-frontend/src/components/Menu/NewMenu.tsx index 3ce34fbce506e..a9e2a904eadfb 100644 --- a/superset-frontend/src/components/Menu/NewMenu.tsx +++ b/superset-frontend/src/components/Menu/NewMenu.tsx @@ -51,6 +51,7 @@ export default function NewMenu() { title={} onMouseEnter={() => setDropdownOpen(true)} onMouseLeave={() => setDropdownOpen(false)} + onToggle={value => setDropdownOpen(value)} open={dropdownOpen} > diff --git a/superset-frontend/src/components/Menu/SubMenu.tsx b/superset-frontend/src/components/Menu/SubMenu.tsx index bd3d1503e0c06..2e1ff5c6cc179 100644 --- a/superset-frontend/src/components/Menu/SubMenu.tsx +++ b/superset-frontend/src/components/Menu/SubMenu.tsx @@ -138,41 +138,44 @@ const SubMenu: React.FunctionComponent = props => { props.tabs.map(tab => { if ((props.usesRouter || hasHistory) && !!tab.usesRouter) { return ( -
  • -
    - {tab.label} -
    -
  • + +
  • +
    + {tab.label} +
    +
  • +
    ); } return ( -
  • - - {tab.label} - -
  • + +
  • + + {tab.label} + +
  • +
    ); })} diff --git a/superset-frontend/src/components/Select/styles.tsx b/superset-frontend/src/components/Select/styles.tsx index 1f7ad315be958..5e4737d295533 100644 --- a/superset-frontend/src/components/Select/styles.tsx +++ b/superset-frontend/src/components/Select/styles.tsx @@ -300,7 +300,7 @@ export type SelectComponentsType = Omit< export type InputProps = ReactSelectInputProps & { placeholder?: ReactNode; selectProps: SelectProps; - autocomplete?: string; + autoComplete?: string; onPaste?: SupersetStyledSelectProps['onPaste']; inputStyle?: object; }; @@ -352,7 +352,7 @@ export const DEFAULT_COMPONENTS: SelectComponentsType = { {...props} placeholder={isMultiWithValue ? placeholder : undefined} css={getStyles('input', props)} - autocomplete="chrome-off" + autoComplete="chrome-off" inputStyle={ isMultiWithValue ? { ...INPUT_TAG_BASE_STYLES, width: '100%' } diff --git a/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx b/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx index 10b8c7ab67e44..819e60525d34f 100644 --- a/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx +++ b/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx @@ -343,7 +343,7 @@ export default class AdhocFilterEditPopoverSimpleTabContent extends React.Compon filterBy={ column.saved_metric_name || column.column_name || column.label } - key={column.id} + key={column.id || column.optionName} > {this.renderSubjectOptionLabel(column)} diff --git a/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx b/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx index 91f5725ba427f..f5c9f5d881029 100644 --- a/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx +++ b/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx @@ -77,6 +77,7 @@ class AdhocFilterControl extends React.Component { this.onFilterEdit = this.onFilterEdit.bind(this); this.moveLabel = this.moveLabel.bind(this); this.onChange = this.onChange.bind(this); + this.mapOption = this.mapOption.bind(this); this.getMetricExpression = this.getMetricExpression.bind(this); const filters = (this.props.value || []).map(filter => @@ -176,15 +177,18 @@ class AdhocFilterControl extends React.Component { } onNewFilter(newFilter) { - this.setState( - prevState => ({ - ...prevState, - values: [...prevState.values, newFilter], - }), - () => { - this.onChange(this.state.values); - }, - ); + const mappedOption = this.mapOption(newFilter); + if (mappedOption) { + this.setState( + prevState => ({ + ...prevState, + values: [...prevState.values, mappedOption], + }), + () => { + this.props.onChange(this.state.values); + }, + ); + } } onFilterEdit(changedFilter) { @@ -200,56 +204,7 @@ class AdhocFilterControl extends React.Component { onChange(opts) { const options = (opts || []) - .map(option => { - // already a AdhocFilter, skip - if (option instanceof AdhocFilter) { - return option; - } - // via datasource saved metric - if (option.saved_metric_name) { - return new AdhocFilter({ - expressionType: - this.props.datasource.type === 'druid' - ? EXPRESSION_TYPES.SIMPLE - : EXPRESSION_TYPES.SQL, - subject: - this.props.datasource.type === 'druid' - ? option.saved_metric_name - : this.getMetricExpression(option.saved_metric_name), - operator: OPERATORS['>'], - comparator: 0, - clause: CLAUSES.HAVING, - }); - } - // has a custom label, meaning it's custom column - if (option.label) { - return new AdhocFilter({ - expressionType: - this.props.datasource.type === 'druid' - ? EXPRESSION_TYPES.SIMPLE - : EXPRESSION_TYPES.SQL, - subject: - this.props.datasource.type === 'druid' - ? option.label - : new AdhocMetric(option).translateToSql(), - operator: OPERATORS['>'], - comparator: 0, - clause: CLAUSES.HAVING, - }); - } - // add a new filter item - if (option.column_name) { - return new AdhocFilter({ - expressionType: EXPRESSION_TYPES.SIMPLE, - subject: option.column_name, - operator: OPERATORS['=='], - comparator: '', - clause: CLAUSES.WHERE, - isNew: true, - }); - } - return null; - }) + .map(option => this.mapOption(option)) .filter(option => option); this.props.onChange(options); } @@ -271,6 +226,57 @@ class AdhocFilterControl extends React.Component { this.setState({ values: newValues }); } + mapOption(option) { + // already a AdhocFilter, skip + if (option instanceof AdhocFilter) { + return option; + } + // via datasource saved metric + if (option.saved_metric_name) { + return new AdhocFilter({ + expressionType: + this.props.datasource.type === 'druid' + ? EXPRESSION_TYPES.SIMPLE + : EXPRESSION_TYPES.SQL, + subject: + this.props.datasource.type === 'druid' + ? option.saved_metric_name + : this.getMetricExpression(option.saved_metric_name), + operator: OPERATORS['>'], + comparator: 0, + clause: CLAUSES.HAVING, + }); + } + // has a custom label, meaning it's custom column + if (option.label) { + return new AdhocFilter({ + expressionType: + this.props.datasource.type === 'druid' + ? EXPRESSION_TYPES.SIMPLE + : EXPRESSION_TYPES.SQL, + subject: + this.props.datasource.type === 'druid' + ? option.label + : new AdhocMetric(option).translateToSql(), + operator: OPERATORS['>'], + comparator: 0, + clause: CLAUSES.HAVING, + }); + } + // add a new filter item + if (option.column_name) { + return new AdhocFilter({ + expressionType: EXPRESSION_TYPES.SIMPLE, + subject: option.column_name, + operator: OPERATORS['=='], + comparator: '', + clause: CLAUSES.WHERE, + isNew: true, + }); + } + return null; + } + optionsForSelect(props) { const options = [ ...props.columns, diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx index 9f14afe7bbd8e..e9f994246845a 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx @@ -296,9 +296,18 @@ const DatabaseModal: FunctionComponent = ({ const id = database.id || 0; setTabKey(DEFAULT_TAB_KEY); - fetchResource(id).then(() => { - setDB(dbFetched); - }); + fetchResource(id) + .then(() => { + setDB(dbFetched); + }) + .catch(e => + addDangerToast( + t( + 'Sorry there was an error fetching database information: %s', + e.message, + ), + ), + ); } } else if (!isEditMode && (!db || db.id || (isHidden && show))) { setTabKey(DEFAULT_TAB_KEY); diff --git a/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx b/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx index f6dea83cf0e8d..f1331fc4c4631 100644 --- a/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx +++ b/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx @@ -59,14 +59,14 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) { SAVED_QUERIES: 'empty-queries.svg', }; const mine = ( -
    {`No ${ + {`No ${ tableName === 'SAVED_QUERIES' ? t('saved queries') : t(`${tableName.toLowerCase()}`) - } yet`}
    + } yet`} ); const recent = ( -
    + {(() => { if (tab === 'Viewed') { return t( @@ -90,7 +90,7 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) { } return null; })()} -
    + ); // Mine and Recent Activity(all tabs) tab empty state if (tab === 'Mine' || tableName === 'RECENTS') { @@ -131,9 +131,9 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) { + {t("You don't have any favorites yet!")} - + } >