Replace best_in_place editor on admin settings page (#2789)
* Remove best_in_place * Replace best_in_place usage with rails helpers * Move admin/settings#index to #edit action * Remove click_to__edit from i18n
This commit is contained in:
		
							parent
							
								
									91ddd345f2
								
							
						
					
					
						commit
						2bd132d458
					
				
							
								
								
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							| @ -13,7 +13,6 @@ gem 'hamlit-rails' | ||||
| gem 'pg' | ||||
| gem 'pghero' | ||||
| gem 'dotenv-rails' | ||||
| gem 'best_in_place', '~> 3.0.1' | ||||
| 
 | ||||
| gem 'aws-sdk', '>= 2.0' | ||||
| gem 'paperclip', '~> 5.1' | ||||
|  | ||||
| @ -65,9 +65,6 @@ GEM | ||||
|       babel-source (>= 4.0, < 6) | ||||
|       execjs (~> 2.0) | ||||
|     bcrypt (3.1.11) | ||||
|     best_in_place (3.0.3) | ||||
|       actionpack (>= 3.2) | ||||
|       railties (>= 3.2) | ||||
|     better_errors (2.1.1) | ||||
|       coderay (>= 1.0.0) | ||||
|       erubis (>= 2.6.6) | ||||
| @ -478,7 +475,6 @@ DEPENDENCIES | ||||
|   addressable | ||||
|   annotate | ||||
|   aws-sdk (>= 2.0) | ||||
|   best_in_place (~> 3.0.1) | ||||
|   better_errors | ||||
|   binding_of_caller | ||||
|   bullet | ||||
|  | ||||
| @ -2,38 +2,43 @@ | ||||
| 
 | ||||
| module Admin | ||||
|   class SettingsController < BaseController | ||||
|     ADMIN_SETTINGS = %w( | ||||
|       site_contact_username | ||||
|       site_contact_email | ||||
|       site_title | ||||
|       site_description | ||||
|       site_extended_description | ||||
|       open_registrations | ||||
|       closed_registrations_message | ||||
|     ).freeze | ||||
|     BOOLEAN_SETTINGS = %w(open_registrations).freeze | ||||
| 
 | ||||
|     def index | ||||
|     def edit | ||||
|       @settings = Setting.all_as_records | ||||
|     end | ||||
| 
 | ||||
|     def update | ||||
|       @setting = Setting.where(var: params[:id]).first_or_initialize(var: params[:id]) | ||||
|       @setting.update(value: value_for_update) | ||||
| 
 | ||||
|       respond_to do |format| | ||||
|         format.html { redirect_to admin_settings_path } | ||||
|         format.json { respond_with_bip(@setting) } | ||||
|       settings_params.each do |key, value| | ||||
|         setting = Setting.where(var: key).first_or_initialize(var: key) | ||||
|         setting.update(value: value_for_update(key, value)) | ||||
|       end | ||||
| 
 | ||||
|       flash[:notice] = 'Success!' | ||||
|       redirect_to edit_admin_settings_path | ||||
|     end | ||||
| 
 | ||||
|     private | ||||
| 
 | ||||
|     def settings_params | ||||
|       params.require(:setting).permit(:value) | ||||
|       params.permit(ADMIN_SETTINGS) | ||||
|     end | ||||
| 
 | ||||
|     def value_for_update | ||||
|       if updating_boolean_setting? | ||||
|         settings_params[:value] == 'true' | ||||
|     def value_for_update(key, value) | ||||
|       if BOOLEAN_SETTINGS.include?(key) | ||||
|         value == 'true' | ||||
|       else | ||||
|         settings_params[:value] | ||||
|         value | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     def updating_boolean_setting? | ||||
|       BOOLEAN_SETTINGS.include?(params[:id]) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -9,6 +9,12 @@ code { | ||||
|   margin: 0 auto; | ||||
| } | ||||
| 
 | ||||
| .admin { | ||||
|   input, textarea { | ||||
|     width: 100%; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .simple_form { | ||||
|   .input { | ||||
|     margin-bottom: 15px; | ||||
|  | ||||
							
								
								
									
										58
									
								
								app/views/admin/settings/edit.html.haml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								app/views/admin/settings/edit.html.haml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| - content_for :page_title do | ||||
|   = t('admin.settings.title') | ||||
| 
 | ||||
| = form_tag(admin_settings_path, method: :put) do | ||||
|   %table.table | ||||
|     %thead | ||||
|       %tr | ||||
|         %th{width: '40%'} | ||||
|           = t('admin.settings.setting') | ||||
|         %th | ||||
|     %tbody | ||||
|       %tr | ||||
|         %td | ||||
|           %strong= t('admin.settings.contact_information.label') | ||||
|         %td= text_field_tag :site_contact_username, | ||||
|           @settings['site_contact_username'].value, | ||||
|           place_holder: t('admin.settings.contact_information.username') | ||||
|       %tr | ||||
|         %td | ||||
|           %strong= t('admin.accounts.email') | ||||
|         %td= text_field_tag :site_contact_email, | ||||
|           @settings['site_contact_email'].value, | ||||
|           place_holder: t('admin.settings.contact_information.email') | ||||
|       %tr | ||||
|         %td | ||||
|           %strong= t('admin.settings.site_title') | ||||
|         %td= text_field_tag :site_title, | ||||
|           @settings['site_title'].value | ||||
|       %tr | ||||
|         %td | ||||
|           %strong= t('admin.settings.site_description.title') | ||||
|           %p= t('admin.settings.site_description.desc_html') | ||||
|         %td= text_area_tag :site_description, | ||||
|           @settings['site_description'].value, | ||||
|           rows: 8 | ||||
|       %tr | ||||
|         %td | ||||
|           %strong= t('admin.settings.site_description_extended.title') | ||||
|           %p= t('admin.settings.site_description_extended.desc_html') | ||||
|         %td= text_area_tag :site_extended_description, | ||||
|           @settings['site_extended_description'].value, | ||||
|           rows: 8 | ||||
|       %tr | ||||
|         %td | ||||
|           %strong= t('admin.settings.registrations.open.title') | ||||
|         %td | ||||
|           = select_tag :open_registrations, | ||||
|           options_for_select({ t('admin.settings.registrations.open.disabled') => false, t('admin.settings.registrations.open.enabled') => true }, @settings['open_registrations'].value) | ||||
|       %tr | ||||
|         %td | ||||
|           %strong= t('admin.settings.registrations.closed_message.title') | ||||
|           %p= t('admin.settings.registrations.closed_message.desc_html') | ||||
|         %td= text_area_tag :closed_registrations_message, | ||||
|           @settings['closed_registrations_message'].value, | ||||
|           rows: 8 | ||||
| 
 | ||||
|   .simple_form.actions | ||||
|     = button_tag t('generic.save_changes'), type: :submit, class: :btn | ||||
| @ -1,40 +0,0 @@ | ||||
| - content_for :page_title do | ||||
|   = t('admin.settings.title') | ||||
| 
 | ||||
| %table.table | ||||
|   %colgroup | ||||
|     %col{ width: '35%' }/ | ||||
|   %thead | ||||
|     %tr | ||||
|       %th= t('admin.settings.setting') | ||||
|       %th= t('admin.settings.click_to_edit') | ||||
|   %tbody | ||||
|     %tr | ||||
|       %td{ rowspan: 2 } | ||||
|         %strong= t('admin.settings.contact_information.label') | ||||
|       %td= best_in_place @settings['site_contact_username'], :value, url: admin_setting_path(@settings['site_contact_username']), place_holder: t('admin.settings.contact_information.username') | ||||
|     %tr | ||||
|       %td= best_in_place @settings['site_contact_email'], :value, url: admin_setting_path(@settings['site_contact_email']), place_holder: t('admin.settings.contact_information.email') | ||||
|     %tr | ||||
|       %td | ||||
|         %strong= t('admin.settings.site_title') | ||||
|       %td= best_in_place @settings['site_title'], :value, url: admin_setting_path(@settings['site_title']) | ||||
|     %tr | ||||
|       %td | ||||
|         %strong= t('admin.settings.site_description.title') | ||||
|         %p= t('admin.settings.site_description.desc_html') | ||||
|       %td= best_in_place @settings['site_description'], :value, as: :textarea, url: admin_setting_path(@settings['site_description']) | ||||
|     %tr | ||||
|       %td | ||||
|         %strong= t('admin.settings.site_description_extended.title') | ||||
|         %p= t('admin.settings.site_description_extended.desc_html') | ||||
|       %td= best_in_place @settings['site_extended_description'], :value, as: :textarea, url: admin_setting_path(@settings['site_extended_description']) | ||||
|     %tr | ||||
|       %td | ||||
|         %strong= t('admin.settings.registrations.open.title') | ||||
|       %td= best_in_place @settings['open_registrations'], :value, as: :checkbox, collection: { false: t('admin.settings.registrations.open.disabled'), true: t('admin.settings.registrations.open.enabled')}, url: admin_setting_path(@settings['open_registrations']) | ||||
|     %tr | ||||
|       %td | ||||
|         %strong= t('admin.settings.registrations.closed_message.title') | ||||
|         %p= t('admin.settings.registrations.closed_message.desc_html') | ||||
|       %td= best_in_place @settings['closed_registrations_message'], :value, as: :textarea, url: admin_setting_path(@settings['closed_registrations_message']) | ||||
| @ -145,7 +145,6 @@ de: | ||||
|       unresolved: Ungelöst | ||||
|       view: Ansehen | ||||
|     settings: | ||||
|       click_to_edit: Klicken zum Bearbeiten | ||||
|       contact_information: | ||||
|         email: Eine öffentliche E-Mail-Adresse angeben | ||||
|         label: Kontaktinformationen | ||||
|  | ||||
| @ -158,7 +158,6 @@ en: | ||||
|       unresolved: Unresolved | ||||
|       view: View | ||||
|     settings: | ||||
|       click_to_edit: Click to edit | ||||
|       contact_information: | ||||
|         email: Enter a public e-mail address | ||||
|         label: Contact information | ||||
|  | ||||
| @ -156,7 +156,6 @@ fa: | ||||
|       unresolved: حلنشده | ||||
|       view: نمایش | ||||
|     settings: | ||||
|       click_to_edit: برای ویرایش کلیک کنید | ||||
|       contact_information: | ||||
|         email: یک نشانی ایمیل عمومی وارد کنید | ||||
|         label: اطلاعات تماس | ||||
| @ -297,7 +296,7 @@ fa: | ||||
|     visibilities: | ||||
|       private: نمایش تنها به پیگیران | ||||
|       public: عمومی | ||||
|       unlisted: عمومی، ولی در فهرست نوشتهها نمایش نده  | ||||
|       unlisted: عمومی، ولی در فهرست نوشتهها نمایش نده | ||||
|   stream_entries: | ||||
|     click_to_show: برای نمایش کلیک کنید | ||||
|     reblogged: بازبوقیده | ||||
|  | ||||
| @ -136,7 +136,6 @@ fr: | ||||
|       unresolved: Non résolus | ||||
|       view: Voir | ||||
|     settings: | ||||
|       click_to_edit: Cliquez pour éditer | ||||
|       contact_information: | ||||
|         email: Entrez une adresse courriel publique | ||||
|         label: Informations de contact | ||||
|  | ||||
| @ -157,7 +157,6 @@ he: | ||||
|       unresolved: לא פתור | ||||
|       view: תצוגה | ||||
|     settings: | ||||
|       click_to_edit: לחיצה כדי לערוך | ||||
|       contact_information: | ||||
|         email: 'נא להקליד כתובת דוא"ל פומבית' | ||||
|         label: פרטי התקשרות | ||||
|  | ||||
| @ -156,7 +156,6 @@ id: | ||||
|       unresolved: Belum Terseleseikan | ||||
|       view: Tampilan | ||||
|     settings: | ||||
|       click_to_edit: Klik untuk mengubah | ||||
|       contact_information: | ||||
|         email: Masukkan alamat email | ||||
|         label: Informasi kontak | ||||
|  | ||||
| @ -144,7 +144,6 @@ io: | ||||
|       unresolved: Unresolved | ||||
|       view: View | ||||
|     settings: | ||||
|       click_to_edit: Click to edit | ||||
|       contact_information: | ||||
|         email: Enter a public e-mail address | ||||
|         label: Contact information | ||||
|  | ||||
| @ -157,7 +157,6 @@ ja: | ||||
|       unresolved: 未解決 | ||||
|       view: 表示 | ||||
|     settings: | ||||
|       click_to_edit: クリックして編集 | ||||
|       contact_information: | ||||
|         email: 公開するメールアドレスを入力 | ||||
|         label: 連絡先情報 | ||||
|  | ||||
| @ -41,7 +41,6 @@ nl: | ||||
|     unfollow: Ontvolgen | ||||
|   admin: | ||||
|     settings: | ||||
|       click_to_edit: Klik om te bewerken | ||||
|       contact_information: | ||||
|         email: Vul een openbaar gebruikt e-mailadres in | ||||
|         label: Contactgegevens | ||||
|  | ||||
| @ -146,7 +146,6 @@ oc: | ||||
|       unresolved: Pas resolguts | ||||
|       view: Veire | ||||
|     settings: | ||||
|       click_to_edit: Clicatz per modificar | ||||
|       contact_information: | ||||
|         email: Picatz una adreça de corrièl | ||||
|         label: Informacions de contacte | ||||
|  | ||||
| @ -12,7 +12,7 @@ pl: | ||||
|     domain_count_before: Serwer połączony z | ||||
|     features: | ||||
|       api: Otwarte API dla aplikacji i usług | ||||
|       blocks: Rozbudowane narzędzia blokowania i ukrywania  | ||||
|       blocks: Rozbudowane narzędzia blokowania i ukrywania | ||||
|       characters: 500 znaków na wpis | ||||
|       chronology: Chronologiczny porządek wyświetlania | ||||
|       ethics: 'Etyczne założenia: nie śledzimy, bez reklam' | ||||
| @ -158,7 +158,6 @@ pl: | ||||
|       unresolved: Nierozwiązane | ||||
|       view: Wyświetl | ||||
|     settings: | ||||
|       click_to_edit: Naciśnij, aby edytować | ||||
|       contact_information: | ||||
|         email: Wprowadź publiczny adres e-mail | ||||
|         label: Informacje kontaktowe | ||||
|  | ||||
| @ -157,7 +157,6 @@ pt-BR: | ||||
|       unresolved: Unresolved | ||||
|       view: View | ||||
|     settings: | ||||
|       click_to_edit: Clique para editar | ||||
|       contact_information: | ||||
|         email: Entre um endereço de email público | ||||
|         label: Informação de contato | ||||
|  | ||||
| @ -152,7 +152,6 @@ pt: | ||||
|       unresolved: Por resolver | ||||
|       view: Ver | ||||
|     settings: | ||||
|       click_to_edit: Clique para editar | ||||
|       contact_information: | ||||
|         email: Inserir um endereço de email para tornar público | ||||
|         label: Informação de contacto | ||||
|  | ||||
| @ -29,7 +29,7 @@ ru: | ||||
|     terms: Условия | ||||
|     user_count_after: пользователей | ||||
|     user_count_before: Здесь живет | ||||
|     version: Версия     | ||||
|     version: Версия | ||||
|   accounts: | ||||
|     follow: Подписаться | ||||
|     followers: Подписчики | ||||
| @ -139,7 +139,6 @@ ru: | ||||
|       unresolved: Неразрешенные | ||||
|       view: Просмотреть | ||||
|     settings: | ||||
|       click_to_edit: Нажмите для изменения | ||||
|       contact_information: | ||||
|         email: Введите публичный e-mail | ||||
|         label: Контактная информация | ||||
|  | ||||
| @ -35,7 +35,7 @@ th: | ||||
|     followers: ผู้ติดตาม | ||||
|     following: กำลังติดตาม | ||||
|     nothing_here: ไม่พบสิ่งใดที่นี่! | ||||
|     people_followed_by: ถูกติดตามโดย %{name}  | ||||
|     people_followed_by: ถูกติดตามโดย %{name} | ||||
|     people_who_follow: คนที่ติดตาม %{name} | ||||
|     posts: โพสต์ | ||||
|     remote_follow: Remote follow | ||||
| @ -157,7 +157,6 @@ th: | ||||
|       unresolved: Unresolved | ||||
|       view: วิว | ||||
|     settings: | ||||
|       click_to_edit: คลิ๊กเพื่อแก้ไข | ||||
|       contact_information: | ||||
|         email: กรอกที่อยู่อีเมล์สาธารณะ | ||||
|         label: ข้อมูลที่ติดต่อ | ||||
|  | ||||
| @ -154,7 +154,6 @@ zh-CN: | ||||
|       unresolved: 未处理 | ||||
|       view: 查看 | ||||
|     settings: | ||||
|       click_to_edit: 点击编辑 | ||||
|       contact_information: | ||||
|         email: 输入一个公开的电邮地址 | ||||
|         label: 联系数据 | ||||
|  | ||||
| @ -141,7 +141,6 @@ zh-HK: | ||||
|       unresolved: 未處理 | ||||
|       view: 檢視 | ||||
|     settings: | ||||
|       click_to_edit: 點擊編輯 | ||||
|       contact_information: | ||||
|         email: 輸入一個公開的電郵地址 | ||||
|         label: 聯絡資料 | ||||
|  | ||||
| @ -118,7 +118,6 @@ zh-TW: | ||||
|       unresolved: 未解決 | ||||
|       view: 檢視 | ||||
|     settings: | ||||
|       click_to_edit: 點選以編輯 | ||||
|       contact_information: | ||||
|         email: 請輸入輸入一個公開電子信箱 | ||||
|         label: 聯絡資訊 | ||||
|  | ||||
| @ -23,7 +23,7 @@ SimpleNavigation::Configuration.run do |navigation| | ||||
|       admin.item :domain_blocks, safe_join([fa_icon('lock fw'), t('admin.domain_blocks.title')]), admin_domain_blocks_url, highlights_on: %r{/admin/domain_blocks} | ||||
|       admin.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' } | ||||
|       admin.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' } | ||||
|       admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), admin_settings_url | ||||
|       admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url | ||||
|     end | ||||
| 
 | ||||
|     primary.item :logout, safe_join([fa_icon('sign-out fw'), t('auth.logout')]), destroy_user_session_url, link_html: { 'data-method' => 'delete' } | ||||
|  | ||||
| @ -76,7 +76,7 @@ Rails.application.routes.draw do | ||||
|   namespace :admin do | ||||
|     resources :pubsubhubbub, only: [:index] | ||||
|     resources :domain_blocks, only: [:index, :new, :create, :show, :destroy] | ||||
|     resources :settings, only: [:index, :update] | ||||
|     resource :settings, only: [:edit, :update] | ||||
|     resources :instances, only: [:index] | ||||
| 
 | ||||
|     resources :reports, only: [:index, :show, :update] do | ||||
|  | ||||
| @ -22,7 +22,7 @@ namespace :mastodon do | ||||
|     user = Account.find_local(ENV.fetch('USERNAME')).user | ||||
|     user.update(admin: true) | ||||
| 
 | ||||
|     puts "Congrats! #{user.account.username} is now an admin. \\o/\nNavigate to #{admin_settings_url} to get started" | ||||
|     puts "Congrats! #{user.account.username} is now an admin. \\o/\nNavigate to #{edit_admin_settings_url} to get started" | ||||
|   end | ||||
| 
 | ||||
|   desc 'Manually confirms a user with associated user email address stored in USER_EMAIL environment variable.' | ||||
|  | ||||
| @ -1,51 +1,65 @@ | ||||
| # frozen_string_literal: true | ||||
| 
 | ||||
| require 'rails_helper' | ||||
| 
 | ||||
| RSpec.describe Admin::SettingsController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   before do | ||||
|     Rails.cache.clear | ||||
|   end | ||||
| 
 | ||||
|   describe 'When signed in as an admin' do | ||||
|     before do | ||||
|       sign_in Fabricate(:user, admin: true), scope: :user | ||||
|     end | ||||
| 
 | ||||
|     describe 'GET #index' do | ||||
|     describe 'GET #edit' do | ||||
|       it 'returns http success' do | ||||
|         get :index | ||||
|         get :edit | ||||
| 
 | ||||
|         expect(response).to have_http_status(:success) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     describe 'PUT #update' do | ||||
| 
 | ||||
|       describe 'for a record that doesnt exist' do | ||||
|         after do | ||||
|           Setting.new_setting_key = nil | ||||
|         end | ||||
| 
 | ||||
|         it 'creates a settings value that didnt exist before' do | ||||
|         it 'cannot create a setting value for a non-admin key' do | ||||
|           expect(Setting.new_setting_key).to be_nil | ||||
| 
 | ||||
|           patch :update, params: { id: 'new_setting_key', setting: { value: 'New key value' } } | ||||
|           patch :update, params: { new_setting_key: 'New key value' } | ||||
| 
 | ||||
|           expect(response).to redirect_to(admin_settings_path) | ||||
|           expect(Setting.new_setting_key).to eq 'New key value' | ||||
|           expect(response).to redirect_to(edit_admin_settings_path) | ||||
|           expect(Setting.new_setting_key).to be_nil | ||||
|         end | ||||
| 
 | ||||
|         it 'creates a settings value that didnt exist before for eligible key' do | ||||
|           expect(Setting.site_extended_description).to be_blank | ||||
| 
 | ||||
|           patch :update, params: { site_extended_description: 'New key value' } | ||||
| 
 | ||||
|           expect(response).to redirect_to(edit_admin_settings_path) | ||||
|           expect(Setting.site_extended_description).to eq 'New key value' | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       it 'updates a settings value' do | ||||
|         Setting.site_title = 'Original' | ||||
|         patch :update, params: { id: 'site_title', setting: { value: 'New title' } } | ||||
|         patch :update, params: { site_title: 'New title' } | ||||
| 
 | ||||
|         expect(response).to redirect_to(admin_settings_path) | ||||
|         expect(response).to redirect_to(edit_admin_settings_path) | ||||
|         expect(Setting.site_title).to eq 'New title' | ||||
|       end | ||||
| 
 | ||||
|       it 'typecasts open_registrations to boolean' do | ||||
|         Setting.open_registrations = false | ||||
|         patch :update, params: { id: 'open_registrations', setting: { value: 'true' } } | ||||
|         patch :update, params: { open_registrations: 'true' } | ||||
| 
 | ||||
|         expect(response).to redirect_to(admin_settings_path) | ||||
|         expect(response).to redirect_to(edit_admin_settings_path) | ||||
|         expect(Setting.open_registrations).to eq true | ||||
|       end | ||||
|     end | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user