This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new cfa7868 upgrade to react-bootstrap v0.33.1 (#9372)
cfa7868 is described below
commit cfa786850f337353578e45470c473cea3ca35c89
Author: David Aaron Suddjian <[email protected]>
AuthorDate: Thu Mar 26 11:16:49 2020 -0700
upgrade to react-bootstrap v0.33.1 (#9372)
* upgrade to react-bootstrap v0.33.1
* fix test
* simplify proptypes
Co-Authored-By: Evan Rusackas <[email protected]>
* simplify more proptypes
Co-Authored-By: Evan Rusackas <[email protected]>
Co-authored-by: Evan Rusackas <[email protected]>
---
superset-frontend/package-lock.json | 94 ++++++++++++-----
superset-frontend/package.json | 2 +-
.../components/ControlPanelSection_spec.jsx | 2 +-
.../src/addSlice/AddSliceContainer.jsx | 95 +++++++++--------
.../components/filterscope/FilterFieldTree.jsx | 2 +-
.../components/filterscope/FilterScopeTree.jsx | 2 +-
.../src/explore/components/ControlPanelSection.jsx | 13 ++-
.../src/explore/components/ExploreChartPanel.jsx | 5 +-
.../components/controls/FixedOrMetricControl.jsx | 79 +++++++-------
.../explore/components/controls/HiddenControl.jsx | 3 +
superset-frontend/src/profile/components/App.jsx | 16 ++-
.../src/profile/components/UserInfo.jsx | 52 ++++-----
.../src/views/chartList/ChartList.tsx | 90 ++++++++--------
.../src/views/dashboardList/DashboardList.tsx | 116 +++++++++++----------
.../src/views/datasetList/DatasetList.tsx | 102 +++++++++---------
superset-frontend/src/welcome/Welcome.jsx | 68 ++++++------
16 files changed, 413 insertions(+), 328 deletions(-)
diff --git a/superset-frontend/package-lock.json
b/superset-frontend/package-lock.json
index dc63e0d..845fb42 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 a5a1613..d37d8c4 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 7e4f747..ab554ca 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 106d33a..f304d66 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 (
<div className="container">
- <Panel header={<h3>{t('Create a new chart')}</h3>}>
- <div>
- <p>{t('Choose a datasource')}</p>
- <div style={styleSelectWidth}>
- <Select
- clearable={false}
- ignoreAccents={false}
- name="select-datasource"
- onChange={this.changeDatasource}
- options={this.props.datasources}
- placeholder={t('Choose a datasource')}
- style={styleSelectWidth}
- value={this.state.datasourceValue}
- width={600}
+ <Panel>
+ <Panel.Heading>
+ <h3>{t('Create a new chart')}</h3>
+ </Panel.Heading>
+ <Panel.Body>
+ <div>
+ <p>{t('Choose a datasource')}</p>
+ <div style={styleSelectWidth}>
+ <Select
+ clearable={false}
+ ignoreAccents={false}
+ name="select-datasource"
+ onChange={this.changeDatasource}
+ options={this.props.datasources}
+ placeholder={t('Choose a datasource')}
+ style={styleSelectWidth}
+ value={this.state.datasourceValue}
+ width={600}
+ />
+ </div>
+ <p className="text-muted">
+ {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 ',
+ )}
+ <a href="https://superset.apache.org/tutorial.html">
+ {t('Superset tutorial')}
+ </a>
+ </p>
+ </div>
+ <br />
+ <div>
+ <p>{t('Choose a visualization type')}</p>
+ <VizTypeControl
+ name="select-vis-type"
+ onChange={this.changeVisType}
+ value={this.state.visType}
/>
</div>
- <p className="text-muted">
- {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 ',
- )}
- <a href="https://superset.apache.org/tutorial.html">
- {t('Superset tutorial')}
- </a>
- </p>
- </div>
- <br />
- <div>
- <p>{t('Choose a visualization type')}</p>
- <VizTypeControl
- name="select-vis-type"
- onChange={this.changeVisType}
- value={this.state.visType}
- />
- </div>
- <br />
- <hr />
- <Button
- bsStyle="primary"
- disabled={this.isBtnDisabled()}
- onClick={this.gotoSlice}
- >
- {t('Create new chart')}
- </Button>
- <br />
- <br />
+ <br />
+ <hr />
+ <Button
+ bsStyle="primary"
+ disabled={this.isBtnDisabled()}
+ onClick={this.gotoSlice}
+ >
+ {t('Create new chart')}
+ </Button>
+ <br />
+ <br />
+ </Panel.Body>
</Panel>
</div>
);
diff --git
a/superset-frontend/src/dashboard/components/filterscope/FilterFieldTree.jsx
b/superset-frontend/src/dashboard/components/filterscope/FilterFieldTree.jsx
index 6ac3a1d..f3d316f 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 e280335..2d663e0 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 47c7fc1..772fb6b 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 && (
<div>
<span>
- <span onClick={this.toggleExpand.bind(this)}>{label}</span>{' '}
+ <span onClick={this.toggleExpand}>{label}</span>{' '}
{description && (
<InfoTooltipWithTrigger label={label} tooltip={description} />
)}
@@ -77,11 +78,15 @@ export default class ControlPanelSection extends
React.Component {
return (
<Panel
className="control-panel-section"
- collapsible
expanded={this.state.expanded}
- header={this.renderHeader()}
+ onToggle={this.toggleExpand}
>
- {this.props.children}
+ <Panel.Heading>
+ <Panel.Title>{this.renderHeader()}</Panel.Title>
+ </Panel.Heading>
+ <Panel.Collapse>
+ <Panel.Body>{this.props.children}</Panel.Body>
+ </Panel.Collapse>
</Panel>
);
}
diff --git a/superset-frontend/src/explore/components/ExploreChartPanel.jsx
b/superset-frontend/src/explore/components/ExploreChartPanel.jsx
index f1ec0f2..f7d29c6 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 (
<div className="chart-container">
- <Panel style={{ height: this.props.height }} header={header}>
- {this.renderChart()}
+ <Panel style={{ height: this.props.height }}>
+ <Panel.Heading>{header}</Panel.Heading>
+ <Panel.Body>{this.renderChart()}</Panel.Body>
</Panel>
</div>
);
diff --git
a/superset-frontend/src/explore/components/controls/FixedOrMetricControl.jsx
b/superset-frontend/src/explore/components/controls/FixedOrMetricControl.jsx
index 5ffcb39..3aca441 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}
>
- <div className="well">
- <PopoverSection
- title="Fixed"
- isSelected={type === controlTypes.fixed}
- onSelect={() => {
- this.setType(controlTypes.fixed);
- }}
- >
- <TextControl
- isFloat
- onChange={this.setFixedValue}
- onFocus={() => {
- this.setType(controlTypes.fixed);
- }}
- value={this.state.fixedValue}
- />
- </PopoverSection>
- <PopoverSection
- title="Based on a metric"
- isSelected={type === controlTypes.metric}
- onSelect={() => {
- this.setType(controlTypes.metric);
- }}
- >
- <MetricsControl
- name="metric"
- columns={columns}
- savedMetrics={metrics}
- multi={false}
- onFocus={() => {
- this.setType(controlTypes.metric);
- }}
- onChange={this.setMetric}
- value={this.state.metricValue}
- />
- </PopoverSection>
- </div>
+ <Panel.Collapse>
+ <Panel.Body>
+ <div className="well">
+ <PopoverSection
+ title="Fixed"
+ isSelected={type === controlTypes.fixed}
+ onSelect={() => {
+ this.setType(controlTypes.fixed);
+ }}
+ >
+ <TextControl
+ isFloat
+ onChange={this.setFixedValue}
+ onFocus={() => {
+ this.setType(controlTypes.fixed);
+ }}
+ value={this.state.fixedValue}
+ />
+ </PopoverSection>
+ <PopoverSection
+ title="Based on a metric"
+ isSelected={type === controlTypes.metric}
+ onSelect={() => {
+ this.setType(controlTypes.metric);
+ }}
+ >
+ <MetricsControl
+ name="metric"
+ columns={columns}
+ savedMetrics={metrics}
+ multi={false}
+ onFocus={() => {
+ this.setType(controlTypes.metric);
+ }}
+ onChange={this.setMetric}
+ value={this.state.metricValue}
+ />
+ </PopoverSection>
+ </div>
+ </Panel.Body>
+ </Panel.Collapse>
</Panel>
</div>
);
diff --git
a/superset-frontend/src/explore/components/controls/HiddenControl.jsx
b/superset-frontend/src/explore/components/controls/HiddenControl.jsx
index 23fe741..a6287a0 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 1d8ea8a..457a46e 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) {
}
>
<Panel>
- <Favorites user={props.user} />
+ <Panel.Body>
+ <Favorites user={props.user} />
+ </Panel.Body>
</Panel>
</Tab>
<Tab
@@ -61,7 +63,9 @@ export default function App(props) {
}
>
<Panel>
- <CreatedContent user={props.user} />
+ <Panel.Body>
+ <CreatedContent user={props.user} />
+ </Panel.Body>
</Panel>
</Tab>
<Tab
@@ -73,7 +77,9 @@ export default function App(props) {
}
>
<Panel>
- <RecentActivity user={props.user} />
+ <Panel.Body>
+ <RecentActivity user={props.user} />
+ </Panel.Body>
</Panel>
</Tab>
<Tab
@@ -85,7 +91,9 @@ export default function App(props) {
}
>
<Panel>
- <Security user={props.user} />
+ <Panel.Body>
+ <Security user={props.user} />
+ </Panel.Body>
</Panel>
</Tab>
</Tabs>
diff --git a/superset-frontend/src/profile/components/UserInfo.jsx
b/superset-frontend/src/profile/components/UserInfo.jsx
index 2a2146e..1c6adca 100644
--- a/superset-frontend/src/profile/components/UserInfo.jsx
+++ b/superset-frontend/src/profile/components/UserInfo.jsx
@@ -41,31 +41,33 @@ const UserInfo = ({ user }) => (
</a>
<hr />
<Panel>
- <h3>
- <strong>
- {user.firstName} {user.lastName}
- </strong>
- </h3>
- <h4 className="username">
- <i className="fa fa-user-o" /> {user.username}
- </h4>
- <hr />
- <p>
- <i className="fa fa-clock-o" /> {t('joined')}{' '}
- {moment(user.createdOn, 'YYYYMMDD').fromNow()}
- </p>
- <p className="email">
- <i className="fa fa-envelope-o" /> {user.email}
- </p>
- <p className="roles">
- <i className="fa fa-lock" /> {Object.keys(user.roles).join(', ')}
- </p>
- <p>
- <i className="fa fa-key" />
-
- <span className="text-muted">{t('id:')}</span>
- <span className="user-id">{user.userId}</span>
- </p>
+ <Panel.Body>
+ <h3>
+ <strong>
+ {user.firstName} {user.lastName}
+ </strong>
+ </h3>
+ <h4 className="username">
+ <i className="fa fa-user-o" /> {user.username}
+ </h4>
+ <hr />
+ <p>
+ <i className="fa fa-clock-o" /> {t('joined')}{' '}
+ {moment(user.createdOn, 'YYYYMMDD').fromNow()}
+ </p>
+ <p className="email">
+ <i className="fa fa-envelope-o" /> {user.email}
+ </p>
+ <p className="roles">
+ <i className="fa fa-lock" /> {Object.keys(user.roles).join(', ')}
+ </p>
+ <p>
+ <i className="fa fa-key" />
+
+ <span className="text-muted">{t('id:')}</span>
+ <span className="user-id">{user.userId}</span>
+ </p>
+ </Panel.Body>
</Panel>
</div>
);
diff --git a/superset-frontend/src/views/chartList/ChartList.tsx
b/superset-frontend/src/views/chartList/ChartList.tsx
index 351f232..942028b 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<Props, State>
{
return (
<div className="container welcome">
<Panel>
- {sliceCurrentlyEditing && (
- <PropertiesModal
- show
- onHide={this.closeChartEditModal}
- onSave={this.handleChartUpdated}
- slice={sliceCurrentlyEditing}
- />
- )}
- <ConfirmStatusChange
- title={t('Please confirm')}
- description={t(
- 'Are you sure you want to delete the selected charts?',
+ <Panel.Body>
+ {sliceCurrentlyEditing && (
+ <PropertiesModal
+ show
+ onHide={this.closeChartEditModal}
+ onSave={this.handleChartUpdated}
+ slice={sliceCurrentlyEditing}
+ />
)}
- onConfirm={this.handleBulkChartDelete}
- >
- {confirmDelete => {
- const bulkActions = [];
- if (this.canDelete) {
- bulkActions.push({
- key: 'delete',
- name: (
- <>
- <i className="fa fa-trash" /> Delete
- </>
- ),
- onSelect: confirmDelete,
- });
- }
- return (
- <ListView
- className="chart-list-view"
- title={'Charts'}
- columns={this.columns}
- data={charts}
- count={chartCount}
- pageSize={PAGE_SIZE}
- fetchData={this.fetchData}
- loading={loading}
- initialSort={this.initialSort}
- filters={filters}
- bulkActions={bulkActions}
- />
- );
- }}
- </ConfirmStatusChange>
+ <ConfirmStatusChange
+ title={t('Please confirm')}
+ description={t(
+ 'Are you sure you want to delete the selected charts?',
+ )}
+ onConfirm={this.handleBulkChartDelete}
+ >
+ {confirmDelete => {
+ const bulkActions = [];
+ if (this.canDelete) {
+ bulkActions.push({
+ key: 'delete',
+ name: (
+ <>
+ <i className="fa fa-trash" /> Delete
+ </>
+ ),
+ onSelect: confirmDelete,
+ });
+ }
+ return (
+ <ListView
+ className="chart-list-view"
+ title={'Charts'}
+ columns={this.columns}
+ data={charts}
+ count={chartCount}
+ pageSize={PAGE_SIZE}
+ fetchData={this.fetchData}
+ loading={loading}
+ initialSort={this.initialSort}
+ filters={filters}
+ bulkActions={bulkActions}
+ />
+ );
+ }}
+ </ConfirmStatusChange>
+ </Panel.Body>
</Panel>
</div>
);
diff --git a/superset-frontend/src/views/dashboardList/DashboardList.tsx
b/superset-frontend/src/views/dashboardList/DashboardList.tsx
index 38b7d2b..c36ddd8 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<Props,
State> {
return (
<div className="container welcome">
<Panel>
- <ConfirmStatusChange
- title={t('Please confirm')}
- description={t(
- 'Are you sure you want to delete the selected dashboards?',
- )}
- onConfirm={this.handleBulkDashboardDelete}
- >
- {confirmDelete => {
- const bulkActions = [];
- if (this.canDelete) {
- bulkActions.push({
- key: 'delete',
- name: (
- <>
- <i className="fa fa-trash" /> Delete
- </>
- ),
- onSelect: confirmDelete,
- });
- }
- if (this.canExport) {
- bulkActions.push({
- key: 'export',
- name: (
- <>
- <i className="fa fa-database" /> Export
- </>
- ),
- onSelect: this.handleBulkDashboardExport,
- });
- }
- return (
- <>
- {dashboardToEdit && (
- <PropertiesModal
- show
- dashboardId={dashboardToEdit.id}
- onHide={() => this.setState({ dashboardToEdit: null })}
- onDashboardSave={this.handleDashboardEdit}
+ <Panel.Body>
+ <ConfirmStatusChange
+ title={t('Please confirm')}
+ description={t(
+ 'Are you sure you want to delete the selected dashboards?',
+ )}
+ onConfirm={this.handleBulkDashboardDelete}
+ >
+ {confirmDelete => {
+ const bulkActions = [];
+ if (this.canDelete) {
+ bulkActions.push({
+ key: 'delete',
+ name: (
+ <>
+ <i className="fa fa-trash" /> Delete
+ </>
+ ),
+ onSelect: confirmDelete,
+ });
+ }
+ if (this.canExport) {
+ bulkActions.push({
+ key: 'export',
+ name: (
+ <>
+ <i className="fa fa-database" /> Export
+ </>
+ ),
+ onSelect: this.handleBulkDashboardExport,
+ });
+ }
+ return (
+ <>
+ {dashboardToEdit && (
+ <PropertiesModal
+ show
+ dashboardId={dashboardToEdit.id}
+ onHide={() => this.setState({ dashboardToEdit: null })}
+ onDashboardSave={this.handleDashboardEdit}
+ />
+ )}
+ <ListView
+ className="dashboard-list-view"
+ title={'Dashboards'}
+ columns={this.columns}
+ data={dashboards}
+ count={dashboardCount}
+ pageSize={PAGE_SIZE}
+ fetchData={this.fetchData}
+ loading={loading}
+ initialSort={this.initialSort}
+ filters={filters}
+ bulkActions={bulkActions}
/>
- )}
- <ListView
- className="dashboard-list-view"
- title={'Dashboards'}
- columns={this.columns}
- data={dashboards}
- count={dashboardCount}
- pageSize={PAGE_SIZE}
- fetchData={this.fetchData}
- loading={loading}
- initialSort={this.initialSort}
- filters={filters}
- bulkActions={bulkActions}
- />
- </>
- );
- }}
- </ConfirmStatusChange>
+ </>
+ );
+ }}
+ </ConfirmStatusChange>
+ </Panel.Body>
</Panel>
</div>
);
diff --git a/superset-frontend/src/views/datasetList/DatasetList.tsx
b/superset-frontend/src/views/datasetList/DatasetList.tsx
index 62821e6..9bbc4f0 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<Props,
State> {
return (
<div className="container welcome">
<Panel>
- <ConfirmStatusChange
- title={t('Please confirm')}
- description={t(
- 'Are you sure you want to delete the selected datasets?',
- )}
- onConfirm={this.handleBulkDatasetDelete}
- >
- {confirmDelete => {
- const bulkActions = [];
- if (this.canDelete) {
- bulkActions.push({
- key: 'delete',
- name: (
- <>
- <i className="fa fa-trash" /> Delete
- </>
- ),
- onSelect: confirmDelete,
- });
- }
- return (
- <>
- {this.canCreate && (
- <span className="list-add-action">
- <Link
- className="btn btn-sm btn-primary pull-right"
- href="/tablemodelview/add"
- tooltip="Add a new record"
- >
- <i className="fa fa-plus" />
- </Link>
- </span>
- )}
- <ListView
- className="dataset-list-view"
- title={'Datasets'}
- columns={this.columns}
- data={datasets}
- count={datasetCount}
- pageSize={PAGE_SIZE}
- fetchData={this.fetchData}
- loading={loading}
- initialSort={this.initialSort}
- filters={filters}
- bulkActions={bulkActions}
- />
- </>
- );
- }}
- </ConfirmStatusChange>
+ <Panel.Body>
+ <ConfirmStatusChange
+ title={t('Please confirm')}
+ description={t(
+ 'Are you sure you want to delete the selected datasets?',
+ )}
+ onConfirm={this.handleBulkDatasetDelete}
+ >
+ {confirmDelete => {
+ const bulkActions = [];
+ if (this.canDelete) {
+ bulkActions.push({
+ key: 'delete',
+ name: (
+ <>
+ <i className="fa fa-trash" /> Delete
+ </>
+ ),
+ onSelect: confirmDelete,
+ });
+ }
+ return (
+ <>
+ {this.canCreate && (
+ <span className="list-add-action">
+ <Link
+ className="btn btn-sm btn-primary pull-right"
+ href="/tablemodelview/add"
+ tooltip="Add a new record"
+ >
+ <i className="fa fa-plus" />
+ </Link>
+ </span>
+ )}
+ <ListView
+ className="dataset-list-view"
+ title={'Datasets'}
+ columns={this.columns}
+ data={datasets}
+ count={datasetCount}
+ pageSize={PAGE_SIZE}
+ fetchData={this.fetchData}
+ loading={loading}
+ initialSort={this.initialSort}
+ filters={filters}
+ bulkActions={bulkActions}
+ />
+ </>
+ );
+ }}
+ </ConfirmStatusChange>
+ </Panel.Body>
</Panel>
</div>
);
diff --git a/superset-frontend/src/welcome/Welcome.jsx
b/superset-frontend/src/welcome/Welcome.jsx
index 3b7a2f1..97d17f9 100644
--- a/superset-frontend/src/welcome/Welcome.jsx
+++ b/superset-frontend/src/welcome/Welcome.jsx
@@ -63,45 +63,51 @@ export default function Welcome({ user }) {
>
<Tab eventKey="all" title={t('Dashboards')}>
<Panel>
- <Row>
- <Col md={8}>
- <h2>{t('Dashboards')}</h2>
- </Col>
- <Col md={4}>
- <FormControl
- type="text"
- bsSize="sm"
- style={{ marginTop: '25px' }}
- placeholder="Search"
- value={searchQuery}
- onChange={e => setSearchQuery(e.currentTarget.value)}
- />
- </Col>
- </Row>
- <hr />
- <DashboardTable search={searchQuery} />
+ <Panel.Body>
+ <Row>
+ <Col md={8}>
+ <h2>{t('Dashboards')}</h2>
+ </Col>
+ <Col md={4}>
+ <FormControl
+ type="text"
+ bsSize="sm"
+ style={{ marginTop: '25px' }}
+ placeholder="Search"
+ value={searchQuery}
+ onChange={e => setSearchQuery(e.currentTarget.value)}
+ />
+ </Col>
+ </Row>
+ <hr />
+ <DashboardTable search={searchQuery} />
+ </Panel.Body>
</Panel>
</Tab>
<Tab eventKey="recent" title={t('Recently Viewed')}>
<Panel>
- <Row>
- <Col md={8}>
- <h2>{t('Recently Viewed')}</h2>
- </Col>
- </Row>
- <hr />
- <RecentActivity user={user} />
+ <Panel.Body>
+ <Row>
+ <Col md={8}>
+ <h2>{t('Recently Viewed')}</h2>
+ </Col>
+ </Row>
+ <hr />
+ <RecentActivity user={user} />
+ </Panel.Body>
</Panel>
</Tab>
<Tab eventKey="favorites" title={t('Favorites')}>
<Panel>
- <Row>
- <Col md={8}>
- <h2>{t('Favorites')}</h2>
- </Col>
- </Row>
- <hr />
- <Favorites user={user} />
+ <Panel.Body>
+ <Row>
+ <Col md={8}>
+ <h2>{t('Favorites')}</h2>
+ </Col>
+ </Row>
+ <hr />
+ <Favorites user={user} />
+ </Panel.Body>
</Panel>
</Tab>
</Tabs>