This is an automated email from the ASF dual-hosted git repository.
maximebeauchemin 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 9b4f5ad bugfix: improve 'Time Table' (#6959)
9b4f5ad is described below
commit 9b4f5ad8e12c5f1a31929b874e9192143206fbd5
Author: Maxime Beauchemin <[email protected]>
AuthorDate: Thu Apr 11 23:36:48 2019 -0700
bugfix: improve 'Time Table' (#6959)
* [WiP] debugging and improving 'Time Table'
closes https://github.com/apache/incubator-superset/issues/6948
* Lint
* Remove passing down props from CollectionControl
* Declarative passthrough of props
* remove console.error
---
.../components/controls/CollectionControl.jsx | 11 +++-
.../controls/TimeSeriesColumnControl.jsx | 63 +++++++++++-----------
.../assets/src/explore/controlPanels/TimeTable.js | 1 +
superset/assets/src/explore/controls.jsx | 1 +
superset/assets/src/utils/getClientErrorObject.js | 3 ++
5 files changed, 47 insertions(+), 32 deletions(-)
diff --git
a/superset/assets/src/explore/components/controls/CollectionControl.jsx
b/superset/assets/src/explore/components/controls/CollectionControl.jsx
index 35390e9..a9e2d1b 100644
--- a/superset/assets/src/explore/components/controls/CollectionControl.jsx
+++ b/superset/assets/src/explore/components/controls/CollectionControl.jsx
@@ -44,6 +44,7 @@ const propTypes = {
isFloat: PropTypes.bool,
isInt: PropTypes.bool,
controlName: PropTypes.string.isRequired,
+ passthroughProps: PropTypes.arrayOf(PropTypes.string),
};
const defaultProps = {
@@ -55,6 +56,7 @@ const defaultProps = {
keyAccessor: o => o.key,
value: [],
addTooltip: 'Add an item',
+ passthroughProps: [],
};
const SortableListGroupItem = SortableElement(ListGroupItem);
const SortableListGroup = SortableContainer(ListGroup);
@@ -84,6 +86,13 @@ export default class CollectionControl extends
React.Component {
return <div className="text-muted">{this.props.placeholder}</div>;
}
const Control = controlMap[this.props.controlName];
+
+ // Creating an object to pass the selected props to the children
+ const passthroughPropsObj = {};
+ this.props.passthroughProps.forEach((k) => {
+ passthroughPropsObj[k] = this.props[k];
+ });
+
return (
<SortableListGroup
useDragHandle
@@ -101,7 +110,7 @@ export default class CollectionControl extends
React.Component {
</div>
<div className="pull-left">
<Control
- {...this.props}
+ {...passthroughPropsObj}
{...o}
onChange={this.onChange.bind(this, i)}
/>
diff --git
a/superset/assets/src/explore/components/controls/TimeSeriesColumnControl.jsx
b/superset/assets/src/explore/components/controls/TimeSeriesColumnControl.jsx
index 24ec401..dd8b88a 100644
---
a/superset/assets/src/explore/components/controls/TimeSeriesColumnControl.jsx
+++
b/superset/assets/src/explore/components/controls/TimeSeriesColumnControl.jsx
@@ -22,6 +22,7 @@ import {
Row, Col, FormControl, OverlayTrigger, Popover,
} from 'react-bootstrap';
import Select from 'react-select';
+import { t } from '@superset-ui/translation';
import InfoTooltipWithTrigger from
'../../../components/InfoTooltipWithTrigger';
import BoundsControl from './BoundsControl';
@@ -102,9 +103,9 @@ export default class TimeSeriesColumnControl extends
React.Component {
<Popover id="ts-col-popo" title="Column Configuration">
<div style={{ width: 300 }}>
{this.formRow(
- 'Label',
- 'The column header label',
- 'time-lag',
+ t('Label'),
+ t('The column header label'),
+ 'row-label',
<FormControl
value={this.state.label}
onChange={this.onTextInputChange.bind(this, 'label')}
@@ -113,8 +114,8 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.formRow(
- 'Tooltip',
- 'Column header tooltip',
+ t('Tooltip'),
+ t('Column header tooltip'),
'col-tooltip',
<FormControl
value={this.state.tooltip}
@@ -124,8 +125,8 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.formRow(
- 'Type',
- 'Type of comparison, value difference or percentage',
+ t('Type'),
+ t('Type of comparison, value difference or percentage'),
'col-type',
<Select
value={this.state.colType}
@@ -136,8 +137,8 @@ export default class TimeSeriesColumnControl extends
React.Component {
)}
<hr />
{this.state.colType === 'spark' && this.formRow(
- 'Width',
- 'Width of the sparkline',
+ t('Width'),
+ t('Width of the sparkline'),
'spark-width',
<FormControl
value={this.state.width}
@@ -147,8 +148,8 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.state.colType === 'spark' && this.formRow(
- 'Height',
- 'Height of the sparkline',
+ t('Height'),
+ t('Height of the sparkline'),
'spark-width',
<FormControl
value={this.state.height}
@@ -158,8 +159,8 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{['time', 'avg'].indexOf(this.state.colType) >= 0 && this.formRow(
- 'Time Lag',
- 'Number of periods to compare against',
+ t('Time Lag'),
+ t('Number of periods to compare against'),
'time-lag',
<FormControl
value={this.state.timeLag}
@@ -169,19 +170,19 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{['spark'].indexOf(this.state.colType) >= 0 && this.formRow(
- 'Time Ratio',
- 'Number of periods to ratio against',
+ t('Time Ratio'),
+ t('Number of periods to ratio against'),
'time-ratio',
<FormControl
value={this.state.timeRatio}
onChange={this.onTextInputChange.bind(this, 'timeRatio')}
bsSize="small"
- placeholder="Time Lag"
+ placeholder="Time Ratio"
/>,
)}
{this.state.colType === 'time' && this.formRow(
- 'Type',
- 'Type of comparison, value difference or percentage',
+ t('Type'),
+ t('Type of comparison, value difference or percentage'),
'comp-type',
<Select
value={this.state.comparisonType}
@@ -191,9 +192,9 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.state.colType === 'spark' && this.formRow(
- 'Show Y-axis',
- (
- 'Show Y-axis on the sparkline. Will display the manually set
min/max if set or min/max values in the data otherwise.'
+ t('Show Y-axis'),
+ t(
+ 'Show Y-axis on the sparkline. Will display the manually set
min/max if set or min/max values in the data otherwise.',
),
'show-y-axis-bounds',
<CheckboxControl
@@ -202,9 +203,9 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.state.colType === 'spark' && this.formRow(
- 'Y-axis bounds',
- (
- 'Manually set min/max values for the y-axis.'
+ t('Y-axis bounds'),
+ t(
+ 'Manually set min/max values for the y-axis.',
),
'y-axis-bounds',
<BoundsControl
@@ -213,11 +214,11 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.state.colType !== 'spark' && this.formRow(
- 'Color bounds',
- (
+ t('Color bounds'),
+ t(
`Number bounds used for color encoding from red to blue.
Reverse the numbers for blue to red. To get pure red or blue,
- you can enter either only min or max.`
+ you can enter either only min or max.`,
),
'bounds',
<BoundsControl
@@ -226,8 +227,8 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.formRow(
- 'Number format',
- 'Optional d3 number format string',
+ t('Number format'),
+ t('Optional d3 number format string'),
'd3-format',
<FormControl
value={this.state.d3format}
@@ -237,8 +238,8 @@ export default class TimeSeriesColumnControl extends
React.Component {
/>,
)}
{this.state.colType === 'spark' && this.formRow(
- 'Date format',
- 'Optional d3 date format string',
+ t('Date format'),
+ t('Optional d3 date format string'),
'date-format',
<FormControl
value={this.state.dateFormat}
diff --git a/superset/assets/src/explore/controlPanels/TimeTable.js
b/superset/assets/src/explore/controlPanels/TimeTable.js
index e62f57c..ad52d15 100644
--- a/superset/assets/src/explore/controlPanels/TimeTable.js
+++ b/superset/assets/src/explore/controlPanels/TimeTable.js
@@ -41,6 +41,7 @@ export default {
description: t(
"Templated link, it's possible to include {{ metric }} " +
'or other values coming from the controls.'),
+ default: '',
},
},
};
diff --git a/superset/assets/src/explore/controls.jsx
b/superset/assets/src/explore/controls.jsx
index 913d7fd..4a300a3 100644
--- a/superset/assets/src/explore/controls.jsx
+++ b/superset/assets/src/explore/controls.jsx
@@ -2322,6 +2322,7 @@ export const controls = {
description: t('Filter configuration for the filter box'),
validators: [],
controlName: 'FilterBoxItemControl',
+ passthroughProps: ['datasource'],
mapStateToProps: ({ datasource }) => ({ datasource }),
},
diff --git a/superset/assets/src/utils/getClientErrorObject.js
b/superset/assets/src/utils/getClientErrorObject.js
index 8af1e54..ac5d327 100644
--- a/superset/assets/src/utils/getClientErrorObject.js
+++ b/superset/assets/src/utils/getClientErrorObject.js
@@ -50,6 +50,9 @@ export default function getClientErrorObject(response) {
resolve({ ...response, error: errorText });
});
});
+ } else if (typeof (response) === 'object' && Object.keys(response).length
=== 0) {
+ // Weird empty object that can get converted to string
+ resolve({ ...response, error: String(response) });
} else {
// fall back to Response.statusText or generic error of we cannot read
the response
resolve({ ...response, error: response.statusText || t('An error
occurred') });