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:
Atsushi Yamamoto 2017-05-29 11:56:13 -04:00 committed by Eugen Rochko
parent b5e8994844
commit 402c19a924
12 changed files with 46 additions and 10 deletions

View file

@ -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)

View file

@ -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) {

View file

@ -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));

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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: インポートする項目

View file

@ -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

View file

@ -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

View file

@ -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' }