diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json
index dc63e0d3c2e8..845fb4279224 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -10815,7 +10815,8 @@
},
"kind-of": {
"version": "6.0.2",
- "resolved": ""
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
@@ -11929,7 +11930,8 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
- "resolved": "",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true,
"optional": true
}
@@ -15982,7 +15984,8 @@
},
"kind-of": {
"version": "6.0.2",
- "resolved": ""
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
@@ -16852,7 +16855,8 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
- "resolved": "",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true,
"optional": true
}
@@ -29809,12 +29813,22 @@
}
},
"prop-types-extra": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz",
- "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz",
+ "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==",
"requires": {
"react-is": "^16.3.2",
- "warning": "^3.0.0"
+ "warning": "^4.0.0"
+ },
+ "dependencies": {
+ "warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ }
}
},
"property-information": {
@@ -30075,19 +30089,21 @@
}
},
"react-bootstrap": {
- "version": "0.31.5",
- "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.5.tgz",
- "integrity": "sha512-xgDihgX4QvYHmHzL87faDBMDnGfYyqcrqV0TEbWY+JizePOG1vfb8M3xJN+6MJ3kUYqDtQSZ7v/Q6Y5YDrkMdA==",
+ "version": "0.33.1",
+ "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz",
+ "integrity": "sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ==",
"requires": {
- "babel-runtime": "^6.11.6",
+ "@babel/runtime-corejs2": "^7.0.0",
"classnames": "^2.2.5",
"dom-helpers": "^3.2.0",
- "invariant": "^2.2.1",
- "keycode": "^2.1.2",
- "prop-types": "^15.5.10",
+ "invariant": "^2.2.4",
+ "keycode": "^2.2.0",
+ "prop-types": "^15.6.1",
"prop-types-extra": "^1.0.1",
- "react-overlays": "^0.7.4",
- "uncontrollable": "^4.1.0",
+ "react-overlays": "^0.9.0",
+ "react-prop-types": "^0.4.0",
+ "react-transition-group": "^2.0.0",
+ "uncontrollable": "^7.0.2",
"warning": "^3.0.0"
}
},
@@ -30466,14 +30482,23 @@
"integrity": "sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg=="
},
"react-overlays": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.4.tgz",
- "integrity": "sha512-7vsooMx3siLAuEfTs8FYeP/lAORWWFXTO8PON3KgX0Htq1Oa+po6ioSjGyO0/GO5CVSMNhpWt6V2opeexHgBuQ==",
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.1.tgz",
+ "integrity": "sha512-b0asy/zHtRd0i2+2/uNxe3YVprF3bRT1guyr791DORjCzE/HSBMog+ul83CdtKQ1kZ+pLnxWCu5W3BMysFhHdQ==",
"requires": {
"classnames": "^2.2.5",
"dom-helpers": "^3.2.1",
"prop-types": "^15.5.10",
"prop-types-extra": "^1.0.1",
+ "react-transition-group": "^2.2.1",
+ "warning": "^3.0.0"
+ }
+ },
+ "react-prop-types": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz",
+ "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=",
+ "requires": {
"warning": "^3.0.0"
}
},
@@ -32115,7 +32140,8 @@
},
"kind-of": {
"version": "6.0.2",
- "resolved": ""
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}
}
},
@@ -33807,11 +33833,29 @@
"integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ=="
},
"uncontrollable": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz",
- "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz",
+ "integrity": "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==",
"requires": {
- "invariant": "^2.1.0"
+ "@babel/runtime": "^7.6.3",
+ "@types/react": "^16.9.11",
+ "invariant": "^2.2.4",
+ "react-lifecycles-compat": "^3.0.4"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ }
}
},
"underscore": {
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index a5a161390ef4..d37d8c4d80e2 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -122,7 +122,7 @@
"re-resizable": "^4.3.1",
"react": "^16.13.0",
"react-ace": "^5.10.0",
- "react-bootstrap": "^0.31.5",
+ "react-bootstrap": "^0.33.1",
"react-bootstrap-dialog": "^0.10.0",
"react-bootstrap-slider": "2.1.5",
"react-checkbox-tree": "^1.5.1",
diff --git a/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx b/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
index 7e4f7478e9f2..ab554caae5fa 100644
--- a/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
+++ b/superset-frontend/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
@@ -57,7 +57,7 @@ describe('ControlPanelSection', () => {
it('renders a label if present', () => {
expect(
wrapper
- .find(Panel)
+ .find(Panel.Title)
.dive()
.text(),
).toContain('my label');
diff --git a/superset-frontend/src/addSlice/AddSliceContainer.jsx b/superset-frontend/src/addSlice/AddSliceContainer.jsx
index 106d33af9ad7..f304d6695b8c 100644
--- a/superset-frontend/src/addSlice/AddSliceContainer.jsx
+++ b/superset-frontend/src/addSlice/AddSliceContainer.jsx
@@ -80,53 +80,58 @@ export default class AddSliceContainer extends React.PureComponent {
render() {
return (
-
{t('Create a new chart')}}>
-
-
{t('Choose a datasource')}
-
-
-
-
-
{t('Choose a visualization type')}
-
-
-
-
-
-
-
+
+
+
+
+
+
);
diff --git a/superset-frontend/src/dashboard/components/filterscope/FilterFieldTree.jsx b/superset-frontend/src/dashboard/components/filterscope/FilterFieldTree.jsx
index 6ac3a1d35c0b..f3d316fc4ee8 100644
--- a/superset-frontend/src/dashboard/components/filterscope/FilterFieldTree.jsx
+++ b/superset-frontend/src/dashboard/components/filterscope/FilterFieldTree.jsx
@@ -25,7 +25,7 @@ import renderFilterFieldTreeNodes from './renderFilterFieldTreeNodes';
import { filterScopeSelectorTreeNodePropShape } from '../../util/propShapes';
const propTypes = {
- activeKey: PropTypes.oneOfType([null, PropTypes.string]),
+ activeKey: PropTypes.string,
nodes: PropTypes.arrayOf(filterScopeSelectorTreeNodePropShape).isRequired,
checked: PropTypes.arrayOf(
PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
diff --git a/superset-frontend/src/dashboard/components/filterscope/FilterScopeTree.jsx b/superset-frontend/src/dashboard/components/filterscope/FilterScopeTree.jsx
index e280335141e5..2d663e0d35fe 100644
--- a/superset-frontend/src/dashboard/components/filterscope/FilterScopeTree.jsx
+++ b/superset-frontend/src/dashboard/components/filterscope/FilterScopeTree.jsx
@@ -34,7 +34,7 @@ const propTypes = {
).isRequired,
onCheck: PropTypes.func.isRequired,
onExpand: PropTypes.func.isRequired,
- selectedChartId: PropTypes.oneOfType([null, PropTypes.number]),
+ selectedChartId: PropTypes.number,
};
const defaultProps = {
diff --git a/superset-frontend/src/explore/components/ControlPanelSection.jsx b/superset-frontend/src/explore/components/ControlPanelSection.jsx
index 47c7fc10654b..772fb6b29388 100644
--- a/superset-frontend/src/explore/components/ControlPanelSection.jsx
+++ b/superset-frontend/src/explore/components/ControlPanelSection.jsx
@@ -40,6 +40,7 @@ export default class ControlPanelSection extends React.Component {
constructor(props) {
super(props);
this.state = { expanded: this.props.startExpanded };
+ this.toggleExpand = this.toggleExpand.bind(this);
}
toggleExpand() {
this.setState({ expanded: !this.state.expanded });
@@ -50,7 +51,7 @@ export default class ControlPanelSection extends React.Component {
label && (
- {label}{' '}
+ {label}{' '}
{description && (
)}
@@ -77,11 +78,15 @@ export default class ControlPanelSection extends React.Component {
return (
- {this.props.children}
+
+ {this.renderHeader()}
+
+
+ {this.props.children}
+
);
}
diff --git a/superset-frontend/src/explore/components/ExploreChartPanel.jsx b/superset-frontend/src/explore/components/ExploreChartPanel.jsx
index f1ec0f2652fa..f7d29c654fa8 100644
--- a/superset-frontend/src/explore/components/ExploreChartPanel.jsx
+++ b/superset-frontend/src/explore/components/ExploreChartPanel.jsx
@@ -111,8 +111,9 @@ class ExploreChartPanel extends React.PureComponent {
);
return (
-
- {this.renderChart()}
+
+ {header}
+ {this.renderChart()}
);
diff --git a/superset-frontend/src/explore/components/controls/FixedOrMetricControl.jsx b/superset-frontend/src/explore/components/controls/FixedOrMetricControl.jsx
index 5ffcb39eff74..3aca4416c0ef 100644
--- a/superset-frontend/src/explore/components/controls/FixedOrMetricControl.jsx
+++ b/superset-frontend/src/explore/components/controls/FixedOrMetricControl.jsx
@@ -120,44 +120,49 @@ export default class FixedOrMetricControl extends React.Component {
className="panel-spreaded"
collapsible
expanded={this.state.expanded}
+ onToggle={this.toggle}
>
-
-
{
- this.setType(controlTypes.fixed);
- }}
- >
- {
- this.setType(controlTypes.fixed);
- }}
- value={this.state.fixedValue}
- />
-
-
{
- this.setType(controlTypes.metric);
- }}
- >
- {
- this.setType(controlTypes.metric);
- }}
- onChange={this.setMetric}
- value={this.state.metricValue}
- />
-
-
+
+
+
+
{
+ this.setType(controlTypes.fixed);
+ }}
+ >
+ {
+ this.setType(controlTypes.fixed);
+ }}
+ value={this.state.fixedValue}
+ />
+
+
{
+ this.setType(controlTypes.metric);
+ }}
+ >
+ {
+ this.setType(controlTypes.metric);
+ }}
+ onChange={this.setMetric}
+ value={this.state.metricValue}
+ />
+
+
+
+
);
diff --git a/superset-frontend/src/explore/components/controls/HiddenControl.jsx b/superset-frontend/src/explore/components/controls/HiddenControl.jsx
index 23fe7410dffb..a6287a056ab6 100644
--- a/superset-frontend/src/explore/components/controls/HiddenControl.jsx
+++ b/superset-frontend/src/explore/components/controls/HiddenControl.jsx
@@ -26,6 +26,9 @@ const propTypes = {
PropTypes.string,
PropTypes.number,
PropTypes.object,
+ PropTypes.bool,
+ PropTypes.array,
+ PropTypes.func,
]),
};
diff --git a/superset-frontend/src/profile/components/App.jsx b/superset-frontend/src/profile/components/App.jsx
index 1d8ea8a6fff7..457a46e3d990 100644
--- a/superset-frontend/src/profile/components/App.jsx
+++ b/superset-frontend/src/profile/components/App.jsx
@@ -49,7 +49,9 @@ export default function App(props) {
}
>
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
diff --git a/superset-frontend/src/profile/components/UserInfo.jsx b/superset-frontend/src/profile/components/UserInfo.jsx
index 2a2146e2295b..1c6adca6d9e9 100644
--- a/superset-frontend/src/profile/components/UserInfo.jsx
+++ b/superset-frontend/src/profile/components/UserInfo.jsx
@@ -41,31 +41,33 @@ const UserInfo = ({ user }) => (
-
-
- {user.firstName} {user.lastName}
-
-
-
- {user.username}
-
-
-
- {t('joined')}{' '}
- {moment(user.createdOn, 'YYYYMMDD').fromNow()}
-
-
- {user.email}
-
-
- {Object.keys(user.roles).join(', ')}
-
-
-
-
- {t('id:')}
- {user.userId}
-
+
+
+
+ {user.firstName} {user.lastName}
+
+
+
+ {user.username}
+
+
+
+ {t('joined')}{' '}
+ {moment(user.createdOn, 'YYYYMMDD').fromNow()}
+
+
+ {user.email}
+
+
+ {Object.keys(user.roles).join(', ')}
+
+
+
+
+ {t('id:')}
+ {user.userId}
+
+
);
diff --git a/superset-frontend/src/views/chartList/ChartList.tsx b/superset-frontend/src/views/chartList/ChartList.tsx
index 351f232c6bfd..942028bda7cf 100644
--- a/superset-frontend/src/views/chartList/ChartList.tsx
+++ b/superset-frontend/src/views/chartList/ChartList.tsx
@@ -393,51 +393,53 @@ class ChartList extends React.PureComponent {
return (
- {sliceCurrentlyEditing && (
-
- )}
-
+ {sliceCurrentlyEditing && (
+
)}
- onConfirm={this.handleBulkChartDelete}
- >
- {confirmDelete => {
- const bulkActions = [];
- if (this.canDelete) {
- bulkActions.push({
- key: 'delete',
- name: (
- <>
- Delete
- >
- ),
- onSelect: confirmDelete,
- });
- }
- return (
-
- );
- }}
-
+
+ {confirmDelete => {
+ const bulkActions = [];
+ if (this.canDelete) {
+ bulkActions.push({
+ key: 'delete',
+ name: (
+ <>
+ Delete
+ >
+ ),
+ onSelect: confirmDelete,
+ });
+ }
+ return (
+
+ );
+ }}
+
+
);
diff --git a/superset-frontend/src/views/dashboardList/DashboardList.tsx b/superset-frontend/src/views/dashboardList/DashboardList.tsx
index 38b7d2b2babb..c36ddd8b420f 100644
--- a/superset-frontend/src/views/dashboardList/DashboardList.tsx
+++ b/superset-frontend/src/views/dashboardList/DashboardList.tsx
@@ -427,64 +427,66 @@ class DashboardList extends React.PureComponent {
return (
-
- {confirmDelete => {
- const bulkActions = [];
- if (this.canDelete) {
- bulkActions.push({
- key: 'delete',
- name: (
- <>
- Delete
- >
- ),
- onSelect: confirmDelete,
- });
- }
- if (this.canExport) {
- bulkActions.push({
- key: 'export',
- name: (
- <>
- Export
- >
- ),
- onSelect: this.handleBulkDashboardExport,
- });
- }
- return (
- <>
- {dashboardToEdit && (
- this.setState({ dashboardToEdit: null })}
- onDashboardSave={this.handleDashboardEdit}
+
+
+ {confirmDelete => {
+ const bulkActions = [];
+ if (this.canDelete) {
+ bulkActions.push({
+ key: 'delete',
+ name: (
+ <>
+ Delete
+ >
+ ),
+ onSelect: confirmDelete,
+ });
+ }
+ if (this.canExport) {
+ bulkActions.push({
+ key: 'export',
+ name: (
+ <>
+ Export
+ >
+ ),
+ onSelect: this.handleBulkDashboardExport,
+ });
+ }
+ return (
+ <>
+ {dashboardToEdit && (
+ this.setState({ dashboardToEdit: null })}
+ onDashboardSave={this.handleDashboardEdit}
+ />
+ )}
+
- )}
-
- >
- );
- }}
-
+ >
+ );
+ }}
+
+
);
diff --git a/superset-frontend/src/views/datasetList/DatasetList.tsx b/superset-frontend/src/views/datasetList/DatasetList.tsx
index 62821e669749..9bbc4f053b72 100644
--- a/superset-frontend/src/views/datasetList/DatasetList.tsx
+++ b/superset-frontend/src/views/datasetList/DatasetList.tsx
@@ -389,56 +389,58 @@ class DatasetList extends React.PureComponent {
return (
-
- {confirmDelete => {
- const bulkActions = [];
- if (this.canDelete) {
- bulkActions.push({
- key: 'delete',
- name: (
- <>
- Delete
- >
- ),
- onSelect: confirmDelete,
- });
- }
- return (
- <>
- {this.canCreate && (
-
-
-
-
-
- )}
-
- >
- );
- }}
-
+
+
+ {confirmDelete => {
+ const bulkActions = [];
+ if (this.canDelete) {
+ bulkActions.push({
+ key: 'delete',
+ name: (
+ <>
+ Delete
+ >
+ ),
+ onSelect: confirmDelete,
+ });
+ }
+ return (
+ <>
+ {this.canCreate && (
+
+
+
+
+
+ )}
+
+ >
+ );
+ }}
+
+
);
diff --git a/superset-frontend/src/welcome/Welcome.jsx b/superset-frontend/src/welcome/Welcome.jsx
index 3b7a2f101db3..97d17f91deb1 100644
--- a/superset-frontend/src/welcome/Welcome.jsx
+++ b/superset-frontend/src/welcome/Welcome.jsx
@@ -63,45 +63,51 @@ export default function Welcome({ user }) {
>
-
-
- {t('Dashboards')}
-
-
- setSearchQuery(e.currentTarget.value)}
- />
-
-
-
-
+
+
+
+ {t('Dashboards')}
+
+
+ setSearchQuery(e.currentTarget.value)}
+ />
+
+
+
+
+
-
-
- {t('Recently Viewed')}
-
-
-
-
+
+
+
+ {t('Recently Viewed')}
+
+
+
+
+
-
-
- {t('Favorites')}
-
-
-
-
+
+
+
+ {t('Favorites')}
+
+
+
+
+