mirror of
https://github.com/apache/superset.git
synced 2026-04-09 11:25:23 +00:00
254 lines
7.2 KiB
JavaScript
254 lines
7.2 KiB
JavaScript
/* eslint camelcase: 0 */
|
|
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { connect } from 'react-redux';
|
|
|
|
import { Modal, Alert, Button, Radio } from 'react-bootstrap';
|
|
import Select from 'react-select';
|
|
import { getExploreUrl } from '../exploreUtils';
|
|
import { t } from '../../locales';
|
|
|
|
const propTypes = {
|
|
can_overwrite: PropTypes.bool,
|
|
onHide: PropTypes.func.isRequired,
|
|
actions: PropTypes.object.isRequired,
|
|
form_data: PropTypes.object,
|
|
user_id: PropTypes.string.isRequired,
|
|
dashboards: PropTypes.array.isRequired,
|
|
alert: PropTypes.string,
|
|
slice: PropTypes.object,
|
|
datasource: PropTypes.object,
|
|
};
|
|
|
|
class SaveModal extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
saveToDashboardId: null,
|
|
newDashboardName: '',
|
|
newSliceName: '',
|
|
dashboards: [],
|
|
alert: null,
|
|
action: props.can_overwrite ? 'overwrite' : 'saveas',
|
|
addToDash: 'noSave',
|
|
};
|
|
}
|
|
componentDidMount() {
|
|
this.props.actions.fetchDashboards(this.props.user_id);
|
|
}
|
|
onChange(name, event) {
|
|
switch (name) {
|
|
case 'newSliceName':
|
|
this.setState({ newSliceName: event.target.value });
|
|
break;
|
|
case 'saveToDashboardId':
|
|
this.setState({ saveToDashboardId: event.value });
|
|
this.changeDash('existing');
|
|
break;
|
|
case 'newDashboardName':
|
|
this.setState({ newDashboardName: event.target.value });
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
changeAction(action) {
|
|
this.setState({ action });
|
|
}
|
|
changeDash(dash) {
|
|
this.setState({ addToDash: dash });
|
|
}
|
|
saveOrOverwrite(gotodash) {
|
|
this.setState({ alert: null });
|
|
this.props.actions.removeSaveModalAlert();
|
|
const sliceParams = {};
|
|
|
|
let sliceName = null;
|
|
sliceParams.action = this.state.action;
|
|
if (this.props.slice && this.props.slice.slice_id) {
|
|
sliceParams.slice_id = this.props.slice.slice_id;
|
|
}
|
|
if (sliceParams.action === 'saveas') {
|
|
sliceName = this.state.newSliceName;
|
|
if (sliceName === '') {
|
|
this.setState({ alert: t('Please enter a slice name') });
|
|
return;
|
|
}
|
|
sliceParams.slice_name = sliceName;
|
|
} else {
|
|
sliceParams.slice_name = this.props.slice.slice_name;
|
|
}
|
|
|
|
const addToDash = this.state.addToDash;
|
|
sliceParams.add_to_dash = addToDash;
|
|
let dashboard = null;
|
|
switch (addToDash) {
|
|
case ('existing'):
|
|
dashboard = this.state.saveToDashboardId;
|
|
if (!dashboard) {
|
|
this.setState({ alert: t('Please select a dashboard') });
|
|
return;
|
|
}
|
|
sliceParams.save_to_dashboard_id = dashboard;
|
|
break;
|
|
case ('new'):
|
|
dashboard = this.state.newDashboardName;
|
|
if (dashboard === '') {
|
|
this.setState({ alert: t('Please enter a dashboard name') });
|
|
return;
|
|
}
|
|
sliceParams.new_dashboard_name = dashboard;
|
|
break;
|
|
default:
|
|
dashboard = null;
|
|
}
|
|
sliceParams.goto_dash = gotodash;
|
|
|
|
const saveUrl = getExploreUrl(this.props.form_data, 'base', false, null, sliceParams);
|
|
this.props.actions.saveSlice(saveUrl)
|
|
.then((data) => {
|
|
// Go to new slice url or dashboard url
|
|
if (gotodash) {
|
|
window.location = data.dashboard;
|
|
} else {
|
|
window.location = data.slice.slice_url;
|
|
}
|
|
});
|
|
this.props.onHide();
|
|
}
|
|
removeAlert() {
|
|
if (this.props.alert) {
|
|
this.props.actions.removeSaveModalAlert();
|
|
}
|
|
this.setState({ alert: null });
|
|
}
|
|
render() {
|
|
return (
|
|
<Modal
|
|
show
|
|
onHide={this.props.onHide}
|
|
bsStyle="large"
|
|
>
|
|
<Modal.Header closeButton>
|
|
<Modal.Title>
|
|
{t('Save A Slice')}
|
|
</Modal.Title>
|
|
</Modal.Header>
|
|
<Modal.Body>
|
|
{(this.state.alert || this.props.alert) &&
|
|
<Alert>
|
|
{this.state.alert ? this.state.alert : this.props.alert}
|
|
<i
|
|
className="fa fa-close pull-right"
|
|
onClick={this.removeAlert.bind(this)}
|
|
style={{ cursor: 'pointer' }}
|
|
/>
|
|
</Alert>
|
|
}
|
|
{this.props.slice &&
|
|
<Radio
|
|
id="overwrite-radio"
|
|
disabled={!this.props.can_overwrite}
|
|
checked={this.state.action === 'overwrite'}
|
|
onChange={this.changeAction.bind(this, 'overwrite')}
|
|
>
|
|
{t('Overwrite slice %s', this.props.slice.slice_name)}
|
|
</Radio>
|
|
}
|
|
|
|
<Radio
|
|
id="saveas-radio"
|
|
inline
|
|
checked={this.state.action === 'saveas'}
|
|
onChange={this.changeAction.bind(this, 'saveas')}
|
|
> {t('Save as')}
|
|
</Radio>
|
|
<input
|
|
name="new_slice_name"
|
|
placeholder={t('[slice name]')}
|
|
onChange={this.onChange.bind(this, 'newSliceName')}
|
|
onFocus={this.changeAction.bind(this, 'saveas')}
|
|
/>
|
|
|
|
|
|
<br />
|
|
<hr />
|
|
|
|
<Radio
|
|
checked={this.state.addToDash === 'noSave'}
|
|
onChange={this.changeDash.bind(this, 'noSave')}
|
|
>
|
|
{t('Do not add to a dashboard')}
|
|
</Radio>
|
|
|
|
<Radio
|
|
inline
|
|
checked={this.state.addToDash === 'existing'}
|
|
onChange={this.changeDash.bind(this, 'existing')}
|
|
>
|
|
{t('Add slice to existing dashboard')}
|
|
</Radio>
|
|
<Select
|
|
className="save-modal-selector"
|
|
options={this.props.dashboards}
|
|
onChange={this.onChange.bind(this, 'saveToDashboardId')}
|
|
autoSize={false}
|
|
value={this.state.saveToDashboardId}
|
|
placeholder="Select Dashboard"
|
|
/>
|
|
|
|
<Radio
|
|
inline
|
|
checked={this.state.addToDash === 'new'}
|
|
onChange={this.changeDash.bind(this, 'new')}
|
|
>
|
|
{t('Add to new dashboard')}
|
|
</Radio>
|
|
<input
|
|
onChange={this.onChange.bind(this, 'newDashboardName')}
|
|
onFocus={this.changeDash.bind(this, 'new')}
|
|
placeholder={t('[dashboard name]')}
|
|
/>
|
|
|
|
</Modal.Body>
|
|
|
|
<Modal.Footer>
|
|
<Button
|
|
type="button"
|
|
id="btn_modal_save"
|
|
className="btn pull-left"
|
|
onClick={this.saveOrOverwrite.bind(this, false)}
|
|
>
|
|
{t('Save')}
|
|
</Button>
|
|
<Button
|
|
type="button"
|
|
id="btn_modal_save_goto_dash"
|
|
className="btn btn-primary pull-left gotodash"
|
|
disabled={this.state.addToDash === 'noSave'}
|
|
onClick={this.saveOrOverwrite.bind(this, true)}
|
|
>
|
|
{t('Save & go to dashboard')}
|
|
</Button>
|
|
</Modal.Footer>
|
|
</Modal>
|
|
);
|
|
}
|
|
}
|
|
|
|
SaveModal.propTypes = propTypes;
|
|
|
|
function mapStateToProps({ explore, saveModal }) {
|
|
return {
|
|
datasource: explore.datasource,
|
|
slice: explore.slice,
|
|
can_overwrite: explore.can_overwrite,
|
|
user_id: explore.user_id,
|
|
dashboards: saveModal.dashboards,
|
|
alert: saveModal.saveModalAlert,
|
|
};
|
|
}
|
|
|
|
export { SaveModal };
|
|
export default connect(mapStateToProps, () => ({}))(SaveModal);
|