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( + 'If the datasource you are looking for is not ' + + 'available in the list, ' + + 'follow the instructions on the how to add it on the ', + )} + + {t('Superset tutorial')} + +

+
+
+
+

{t('Choose a visualization type')}

+
-

- {t( - 'If the datasource you are looking for is not ' + - 'available in the list, ' + - 'follow the instructions on the how to add it on the ', - )} - - {t('Superset tutorial')} - -

-
-
-
-

{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')}

+ +
+
+ +