diff --git a/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx index f89c9ed942eb..cd1c0156c28c 100644 --- a/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx +++ b/superset/assets/spec/javascripts/dashboard/components/HeaderActionsDropdown_spec.jsx @@ -71,9 +71,9 @@ describe('HeaderActionsDropdown', () => { expect(wrapper.find(MenuItem)).toHaveLength(1); }); - it('should not render the RefreshIntervalModal', () => { + it('should render the RefreshIntervalModal', () => { const wrapper = setup(overrideProps); - expect(wrapper.find(RefreshIntervalModal)).toHaveLength(0); + expect(wrapper.find(RefreshIntervalModal)).toHaveLength(1); }); it('should render the URLShortLinkModal', () => { @@ -105,9 +105,9 @@ describe('HeaderActionsDropdown', () => { expect(wrapper.find(MenuItem)).toHaveLength(2); }); - it('should not render the RefreshIntervalModal', () => { + it('should render the RefreshIntervalModal', () => { const wrapper = setup(overrideProps); - expect(wrapper.find(RefreshIntervalModal)).toHaveLength(0); + expect(wrapper.find(RefreshIntervalModal)).toHaveLength(1); }); it('should render the URLShortLinkModal', () => { diff --git a/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx b/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx index 8dfb4016f07c..9e0c39879d4e 100644 --- a/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx +++ b/superset/assets/spec/javascripts/dashboard/components/RefreshIntervalModal_spec.jsx @@ -25,6 +25,8 @@ describe('RefreshIntervalModal', () => { const mockedProps = { triggerNode: , refreshFrequency: 10, + onChange: jest.fn(), + editMode: true, }; it('is valid', () => { expect( @@ -39,4 +41,10 @@ describe('RefreshIntervalModal', () => { const wrapper = mount(); expect(wrapper.prop('refreshFrequency')).toEqual(10); }); + it('should change refreshFrequency with edit mode', () => { + const wrapper = mount(); + wrapper.instance().handleFrequencyChange({ value: 30 }); + expect(mockedProps.onChange).toHaveBeenCalled(); + expect(mockedProps.onChange).toHaveBeenCalledWith(30, mockedProps.editMode); + }); }); diff --git a/superset/assets/src/dashboard/actions/dashboardState.js b/superset/assets/src/dashboard/actions/dashboardState.js index db4d3695a6c2..02270809abd3 100644 --- a/superset/assets/src/dashboard/actions/dashboardState.js +++ b/superset/assets/src/dashboard/actions/dashboardState.js @@ -151,8 +151,8 @@ export function onSave() { } export const SET_REFRESH_FREQUENCY = 'SET_REFRESH_FREQUENCY'; -export function setRefreshFrequency(refreshFrequency) { - return { type: SET_REFRESH_FREQUENCY, refreshFrequency }; +export function setRefreshFrequency(refreshFrequency, isPersistent = false) { + return { type: SET_REFRESH_FREQUENCY, refreshFrequency, isPersistent }; } export function saveDashboardRequestSuccess() { diff --git a/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx b/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx index b96096517964..af82267f1d22 100644 --- a/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx +++ b/superset/assets/src/dashboard/components/HeaderActionsDropdown.jsx @@ -103,8 +103,8 @@ class HeaderActionsDropdown extends React.PureComponent { this.props.updateCss(css); } - changeRefreshInterval(refreshInterval) { - this.props.setRefreshFrequency(refreshInterval); + changeRefreshInterval(refreshInterval, isPersistent) { + this.props.setRefreshFrequency(refreshInterval, isPersistent); this.props.startPeriodicRender(refreshInterval * 1000); } @@ -177,13 +177,20 @@ class HeaderActionsDropdown extends React.PureComponent { {t('Force refresh dashboard')} - {editMode && ( - {t('Set auto-refresh interval')}} - /> - )} + + + {editMode + ? t('Set auto-refresh interval') + : t('Auto-refresh dashboard')} + + } + /> + {editMode && ( {t('Edit dashboard metadata')} diff --git a/superset/assets/src/dashboard/components/RefreshIntervalModal.jsx b/superset/assets/src/dashboard/components/RefreshIntervalModal.jsx index b314431b3ba9..485f4091743c 100644 --- a/superset/assets/src/dashboard/components/RefreshIntervalModal.jsx +++ b/superset/assets/src/dashboard/components/RefreshIntervalModal.jsx @@ -27,6 +27,7 @@ const propTypes = { triggerNode: PropTypes.node.isRequired, refreshFrequency: PropTypes.number.isRequired, onChange: PropTypes.func.isRequired, + editMode: PropTypes.bool.isRequired, }; const options = [ @@ -48,7 +49,17 @@ class RefreshIntervalModal extends React.PureComponent { this.state = { refreshFrequency: props.refreshFrequency, }; + this.handleFrequencyChange = this.handleFrequencyChange.bind(this); } + + handleFrequencyChange(opt) { + const value = opt ? opt.value : options[0].value; + this.setState({ + refreshFrequency: value, + }); + this.props.onChange(value, this.props.editMode); + } + render() { return ( { - const value = opt ? opt.value : options[0].value; - this.setState({ - refreshFrequency: value, - }); - this.props.onChange(value); - }} + onChange={this.handleFrequencyChange} /> } diff --git a/superset/assets/src/dashboard/reducers/dashboardState.js b/superset/assets/src/dashboard/reducers/dashboardState.js index 4a12ce05fcef..f1c8ee820d64 100644 --- a/superset/assets/src/dashboard/reducers/dashboardState.js +++ b/superset/assets/src/dashboard/reducers/dashboardState.js @@ -169,7 +169,7 @@ export default function dashboardStateReducer(state = {}, action) { return { ...state, refreshFrequency: action.refreshFrequency, - hasUnsavedChanges: true, + hasUnsavedChanges: action.isPersistent, }; }, };