Add preference setting for delete toot modal (#3368)
* Set delete_modal preference to true by default * Does not show confirmation modal if delete_modal is false * Add ja translation for preference setting page
This commit is contained in:
		
							parent
							
								
									b5e8994844
								
							
						
					
					
						commit
						402c19a924
					
				
					 12 changed files with 46 additions and 10 deletions
				
			
		| 
						 | 
					@ -35,6 +35,7 @@ class Settings::PreferencesController < ApplicationController
 | 
				
			||||||
    params.require(:user).permit(
 | 
					    params.require(:user).permit(
 | 
				
			||||||
      :setting_default_privacy,
 | 
					      :setting_default_privacy,
 | 
				
			||||||
      :setting_boost_modal,
 | 
					      :setting_boost_modal,
 | 
				
			||||||
 | 
					      :setting_delete_modal,
 | 
				
			||||||
      :setting_auto_play_gif,
 | 
					      :setting_auto_play_gif,
 | 
				
			||||||
      notification_emails: %i(follow follow_request reblog favourite mention digest),
 | 
					      notification_emails: %i(follow follow_request reblog favourite mention digest),
 | 
				
			||||||
      interactions: %i(must_be_follower must_be_following)
 | 
					      interactions: %i(must_be_follower must_be_following)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@ const makeMapStateToProps = () => {
 | 
				
			||||||
    status: getStatus(state, props.id),
 | 
					    status: getStatus(state, props.id),
 | 
				
			||||||
    me: state.getIn(['meta', 'me']),
 | 
					    me: state.getIn(['meta', 'me']),
 | 
				
			||||||
    boostModal: state.getIn(['meta', 'boost_modal']),
 | 
					    boostModal: state.getIn(['meta', 'boost_modal']),
 | 
				
			||||||
 | 
					    deleteModal: state.getIn(['meta', 'delete_modal']),
 | 
				
			||||||
    autoPlayGif: state.getIn(['meta', 'auto_play_gif']),
 | 
					    autoPlayGif: state.getIn(['meta', 'auto_play_gif']),
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,11 +75,15 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onDelete (status) {
 | 
					  onDelete (status) {
 | 
				
			||||||
 | 
					    if (!this.deleteModal) {
 | 
				
			||||||
 | 
					      dispatch(deleteStatus(status.get('id')));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
      dispatch(openModal('CONFIRM', {
 | 
					      dispatch(openModal('CONFIRM', {
 | 
				
			||||||
        message: intl.formatMessage(messages.deleteMessage),
 | 
					        message: intl.formatMessage(messages.deleteMessage),
 | 
				
			||||||
        confirm: intl.formatMessage(messages.deleteConfirm),
 | 
					        confirm: intl.formatMessage(messages.deleteConfirm),
 | 
				
			||||||
        onConfirm: () => dispatch(deleteStatus(status.get('id'))),
 | 
					        onConfirm: () => dispatch(deleteStatus(status.get('id'))),
 | 
				
			||||||
      }));
 | 
					      }));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onMention (account, router) {
 | 
					  onMention (account, router) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,6 +48,7 @@ const makeMapStateToProps = () => {
 | 
				
			||||||
    descendantsIds: state.getIn(['timelines', 'descendants', Number(props.params.statusId)]),
 | 
					    descendantsIds: state.getIn(['timelines', 'descendants', Number(props.params.statusId)]),
 | 
				
			||||||
    me: state.getIn(['meta', 'me']),
 | 
					    me: state.getIn(['meta', 'me']),
 | 
				
			||||||
    boostModal: state.getIn(['meta', 'boost_modal']),
 | 
					    boostModal: state.getIn(['meta', 'boost_modal']),
 | 
				
			||||||
 | 
					    deleteModal: state.getIn(['meta', 'delete_modal']),
 | 
				
			||||||
    autoPlayGif: state.getIn(['meta', 'auto_play_gif']),
 | 
					    autoPlayGif: state.getIn(['meta', 'auto_play_gif']),
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,6 +69,7 @@ class Status extends ImmutablePureComponent {
 | 
				
			||||||
    descendantsIds: ImmutablePropTypes.list,
 | 
					    descendantsIds: ImmutablePropTypes.list,
 | 
				
			||||||
    me: PropTypes.number,
 | 
					    me: PropTypes.number,
 | 
				
			||||||
    boostModal: PropTypes.bool,
 | 
					    boostModal: PropTypes.bool,
 | 
				
			||||||
 | 
					    deleteModal: PropTypes.bool,
 | 
				
			||||||
    autoPlayGif: PropTypes.bool,
 | 
					    autoPlayGif: PropTypes.bool,
 | 
				
			||||||
    intl: PropTypes.object.isRequired,
 | 
					    intl: PropTypes.object.isRequired,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -113,12 +115,16 @@ class Status extends ImmutablePureComponent {
 | 
				
			||||||
  handleDeleteClick = (status) => {
 | 
					  handleDeleteClick = (status) => {
 | 
				
			||||||
    const { dispatch, intl } = this.props;
 | 
					    const { dispatch, intl } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!this.props.deleteModal) {
 | 
				
			||||||
 | 
					      dispatch(deleteStatus(status.get('id')));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
      dispatch(openModal('CONFIRM', {
 | 
					      dispatch(openModal('CONFIRM', {
 | 
				
			||||||
        message: intl.formatMessage(messages.deleteMessage),
 | 
					        message: intl.formatMessage(messages.deleteMessage),
 | 
				
			||||||
        confirm: intl.formatMessage(messages.deleteConfirm),
 | 
					        confirm: intl.formatMessage(messages.deleteConfirm),
 | 
				
			||||||
        onConfirm: () => dispatch(deleteStatus(status.get('id'))),
 | 
					        onConfirm: () => dispatch(deleteStatus(status.get('id'))),
 | 
				
			||||||
      }));
 | 
					      }));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleMentionClick = (account, router) => {
 | 
					  handleMentionClick = (account, router) => {
 | 
				
			||||||
    this.props.dispatch(mentionCompose(account, router));
 | 
					    this.props.dispatch(mentionCompose(account, router));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@ class UserSettingsDecorator
 | 
				
			||||||
    user.settings['interactions'] = merged_interactions
 | 
					    user.settings['interactions'] = merged_interactions
 | 
				
			||||||
    user.settings['default_privacy'] = default_privacy_preference
 | 
					    user.settings['default_privacy'] = default_privacy_preference
 | 
				
			||||||
    user.settings['boost_modal'] = boost_modal_preference
 | 
					    user.settings['boost_modal'] = boost_modal_preference
 | 
				
			||||||
 | 
					    user.settings['delete_modal'] = delete_modal_preference
 | 
				
			||||||
    user.settings['auto_play_gif'] = auto_play_gif_preference
 | 
					    user.settings['auto_play_gif'] = auto_play_gif_preference
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +39,10 @@ class UserSettingsDecorator
 | 
				
			||||||
    boolean_cast_setting 'setting_boost_modal'
 | 
					    boolean_cast_setting 'setting_boost_modal'
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def delete_modal_preference
 | 
				
			||||||
 | 
					    boolean_cast_setting 'setting_delete_modal'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def auto_play_gif_preference
 | 
					  def auto_play_gif_preference
 | 
				
			||||||
    boolean_cast_setting 'setting_auto_play_gif'
 | 
					    boolean_cast_setting 'setting_auto_play_gif'
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,6 +80,10 @@ class User < ApplicationRecord
 | 
				
			||||||
    settings.boost_modal
 | 
					    settings.boost_modal
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def setting_delete_modal
 | 
				
			||||||
 | 
					    settings.delete_modal
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def setting_auto_play_gif
 | 
					  def setting_auto_play_gif
 | 
				
			||||||
    settings.auto_play_gif
 | 
					    settings.auto_play_gif
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@ node(:meta) do
 | 
				
			||||||
    me: current_account.id,
 | 
					    me: current_account.id,
 | 
				
			||||||
    admin: @admin.try(:id),
 | 
					    admin: @admin.try(:id),
 | 
				
			||||||
    boost_modal: current_account.user.setting_boost_modal,
 | 
					    boost_modal: current_account.user.setting_boost_modal,
 | 
				
			||||||
 | 
					    delete_modal: current_account.user.setting_delete_modal,
 | 
				
			||||||
    auto_play_gif: current_account.user.setting_auto_play_gif,
 | 
					    auto_play_gif: current_account.user.setting_auto_play_gif,
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .fields-group
 | 
					  .fields-group
 | 
				
			||||||
    = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label
 | 
					    = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label
 | 
				
			||||||
 | 
					    = f.input :setting_delete_modal, as: :boolean, wrapper: :with_label
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .fields-group
 | 
					  .fields-group
 | 
				
			||||||
    = f.input :setting_auto_play_gif, as: :boolean, wrapper: :with_label
 | 
					    = f.input :setting_auto_play_gif, as: :boolean, wrapper: :with_label
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,7 @@ en:
 | 
				
			||||||
        password: Password
 | 
					        password: Password
 | 
				
			||||||
        setting_auto_play_gif: Auto-play animated GIFs
 | 
					        setting_auto_play_gif: Auto-play animated GIFs
 | 
				
			||||||
        setting_boost_modal: Show confirmation dialog before boosting
 | 
					        setting_boost_modal: Show confirmation dialog before boosting
 | 
				
			||||||
 | 
					        setting_delete_modal: Show confirmation dialog before deleting a toot
 | 
				
			||||||
        setting_default_privacy: Post privacy
 | 
					        setting_default_privacy: Post privacy
 | 
				
			||||||
        severity: Severity
 | 
					        severity: Severity
 | 
				
			||||||
        type: Import type
 | 
					        type: Import type
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,7 @@ ja:
 | 
				
			||||||
        password: パスワード
 | 
					        password: パスワード
 | 
				
			||||||
        setting_auto_play_gif: アニメーションGIFを自動再生する
 | 
					        setting_auto_play_gif: アニメーションGIFを自動再生する
 | 
				
			||||||
        setting_boost_modal: ブーストする前に確認ダイアログを表示する
 | 
					        setting_boost_modal: ブーストする前に確認ダイアログを表示する
 | 
				
			||||||
 | 
					        setting_delete_modal: トゥートを削除する前に確認ダイアログを表示する
 | 
				
			||||||
        setting_default_privacy: 投稿の公開範囲
 | 
					        setting_default_privacy: 投稿の公開範囲
 | 
				
			||||||
        severity: 重大性
 | 
					        severity: 重大性
 | 
				
			||||||
        type: インポートする項目
 | 
					        type: インポートする項目
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ defaults: &defaults
 | 
				
			||||||
  closed_registrations_message: ''
 | 
					  closed_registrations_message: ''
 | 
				
			||||||
  boost_modal: false
 | 
					  boost_modal: false
 | 
				
			||||||
  auto_play_gif: true
 | 
					  auto_play_gif: true
 | 
				
			||||||
 | 
					  delete_modal: true
 | 
				
			||||||
  notification_emails:
 | 
					  notification_emails:
 | 
				
			||||||
    follow: false
 | 
					    follow: false
 | 
				
			||||||
    reblog: false
 | 
					    reblog: false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,12 +28,14 @@ describe Settings::PreferencesController do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'updates user settings' do
 | 
					    it 'updates user settings' do
 | 
				
			||||||
      user.settings['boost_modal'] = false
 | 
					      user.settings['boost_modal'] = false
 | 
				
			||||||
 | 
					      user.settings['delete_modal'] = true
 | 
				
			||||||
      user.settings['notification_emails'] = user.settings['notification_emails'].merge('follow' => false)
 | 
					      user.settings['notification_emails'] = user.settings['notification_emails'].merge('follow' => false)
 | 
				
			||||||
      user.settings['interactions'] = user.settings['interactions'].merge('must_be_follower' => true)
 | 
					      user.settings['interactions'] = user.settings['interactions'].merge('must_be_follower' => true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      put :update, params: {
 | 
					      put :update, params: {
 | 
				
			||||||
        user: {
 | 
					        user: {
 | 
				
			||||||
          setting_boost_modal: '1',
 | 
					          setting_boost_modal: '1',
 | 
				
			||||||
 | 
					          setting_delete_modal: '0',
 | 
				
			||||||
          notification_emails: { follow: '1' },
 | 
					          notification_emails: { follow: '1' },
 | 
				
			||||||
          interactions: { must_be_follower: '0' },
 | 
					          interactions: { must_be_follower: '0' },
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -42,6 +44,7 @@ describe Settings::PreferencesController do
 | 
				
			||||||
      expect(response).to redirect_to(settings_preferences_path)
 | 
					      expect(response).to redirect_to(settings_preferences_path)
 | 
				
			||||||
      user.reload
 | 
					      user.reload
 | 
				
			||||||
      expect(user.settings['boost_modal']).to be true
 | 
					      expect(user.settings['boost_modal']).to be true
 | 
				
			||||||
 | 
					      expect(user.settings['delete_modal']).to be false
 | 
				
			||||||
      expect(user.settings['notification_emails']['follow']).to be true
 | 
					      expect(user.settings['notification_emails']['follow']).to be true
 | 
				
			||||||
      expect(user.settings['interactions']['must_be_follower']).to be false
 | 
					      expect(user.settings['interactions']['must_be_follower']).to be false
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,13 @@ describe UserSettingsDecorator do
 | 
				
			||||||
      expect(user.settings['boost_modal']).to eq true
 | 
					      expect(user.settings['boost_modal']).to eq true
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'updates the user settings value for delete toot modal' do
 | 
				
			||||||
 | 
					      values = { 'setting_delete_modal' => '0' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      settings.update(values)
 | 
				
			||||||
 | 
					      expect(user.settings['delete_modal']).to eq false
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'updates the user settings value for gif auto play' do
 | 
					    it 'updates the user settings value for gif auto play' do
 | 
				
			||||||
      values = { 'setting_auto_play_gif' => '0' }
 | 
					      values = { 'setting_auto_play_gif' => '0' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue