From b6df5da1950f2c88a89b9a430d4e8a59006a36d3 Mon Sep 17 00:00:00 2001 From: Phillip Kelley-Dotson Date: Fri, 8 May 2020 10:50:55 -0700 Subject: [PATCH] fix bug where error at import dashboard fails to show toast in "welcome" app (#9714) * fix bug where error at import dashboard fails * fix: make reusable component for messages and bring to app level * fix: add liscence * fix: lint errors and tests * fix * fix: lint * fix: lint error * add suggestions * add suggestions Co-authored-by: Phillip Kelley-Dotson --- .../src/components/FlashProvider.tsx | 53 ++++++++++++++++ .../src/views/dashboardList/DashboardList.tsx | 1 - superset-frontend/src/welcome/App.jsx | 61 ++++++++++--------- 3 files changed, 85 insertions(+), 30 deletions(-) create mode 100644 superset-frontend/src/components/FlashProvider.tsx diff --git a/superset-frontend/src/components/FlashProvider.tsx b/superset-frontend/src/components/FlashProvider.tsx new file mode 100644 index 000000000..d4b1ddbff --- /dev/null +++ b/superset-frontend/src/components/FlashProvider.tsx @@ -0,0 +1,53 @@ +/** + * 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 React from 'react'; +import withToasts from 'src/messageToasts/enhancers/withToasts'; + +type Message = Array; + +interface CommonObject { + flash_messages: Array; +} +interface Props { + children: Node; + common: CommonObject; +} + +const flashObj = { + info: 'addInfoToast', + danger: 'addDangerToast', + warning: 'addWarningToast', + success: 'addSuccessToast', +}; + +class FlashProvider extends React.PureComponent { + componentDidMount() { + const flashMessages = this.props.common.flash_messages; + flashMessages.forEach(message => { + const [type, text] = message; + const flash = flashObj[type]; + this.props[flash](text); + }); + } + render() { + return this.props.children; + } +} + +export default withToasts(FlashProvider); diff --git a/superset-frontend/src/views/dashboardList/DashboardList.tsx b/superset-frontend/src/views/dashboardList/DashboardList.tsx index 25569afa8..912c76d36 100644 --- a/superset-frontend/src/views/dashboardList/DashboardList.tsx +++ b/superset-frontend/src/views/dashboardList/DashboardList.tsx @@ -482,7 +482,6 @@ class DashboardList extends React.PureComponent { filters, dashboardToEdit, } = this.state; - return (
diff --git a/superset-frontend/src/welcome/App.jsx b/superset-frontend/src/welcome/App.jsx index 9cef3206b..f4a65b62c 100644 --- a/superset-frontend/src/welcome/App.jsx +++ b/superset-frontend/src/welcome/App.jsx @@ -29,6 +29,7 @@ import { initFeatureFlags } from 'src/featureFlags'; import { supersetTheme } from '@superset-ui/style'; import ErrorBoundary from 'src/components/ErrorBoundary'; import Menu from 'src/components/Menu/Menu'; +import FlashProvider from 'src/components/FlashProvider'; import DashboardList from 'src/views/dashboardList/DashboardList'; import ChartList from 'src/views/chartList/ChartList'; import DatasetList from 'src/views/datasetList/DatasetList'; @@ -47,7 +48,7 @@ const container = document.getElementById('app'); const bootstrap = JSON.parse(container.getAttribute('data-bootstrap')); const user = { ...bootstrap.user }; const menu = { ...bootstrap.common.menu_data }; - +const common = { ...bootstrap.common }; initFeatureFlags(bootstrap.common.feature_flags); const store = createStore( @@ -61,34 +62,36 @@ const store = createStore( const App = () => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + );