about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatt Jankowski <mjankowski@thoughtbot.com>2017-05-04 12:12:44 -0400
committerEugen Rochko <eugen@zeonfederated.com>2017-05-04 18:12:44 +0200
commit2bd132d4581048a96b4d36b5a94e6749c68b8987 (patch)
treeaf5934149cf052733441f01078addef067707c37
parent91ddd345f2df09089403ca078a4a5987d43ea88b (diff)
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
-rw-r--r--Gemfile1
-rw-r--r--Gemfile.lock4
-rw-r--r--app/controllers/admin/settings_controller.rb37
-rw-r--r--app/javascript/styles/forms.scss6
-rw-r--r--app/views/admin/settings/edit.html.haml58
-rw-r--r--app/views/admin/settings/index.html.haml40
-rw-r--r--config/locales/de.yml1
-rw-r--r--config/locales/en.yml1
-rw-r--r--config/locales/fa.yml3
-rw-r--r--config/locales/fr.yml1
-rw-r--r--config/locales/he.yml1
-rw-r--r--config/locales/id.yml1
-rw-r--r--config/locales/io.yml1
-rw-r--r--config/locales/ja.yml1
-rw-r--r--config/locales/nl.yml1
-rw-r--r--config/locales/oc.yml1
-rw-r--r--config/locales/pl.yml3
-rw-r--r--config/locales/pt-BR.yml1
-rw-r--r--config/locales/pt.yml1
-rw-r--r--config/locales/ru.yml3
-rw-r--r--config/locales/th.yml3
-rw-r--r--config/locales/zh-CN.yml1
-rw-r--r--config/locales/zh-HK.yml1
-rw-r--r--config/locales/zh-TW.yml1
-rw-r--r--config/navigation.rb2
-rw-r--r--config/routes.rb2
-rw-r--r--lib/tasks/mastodon.rake2
-rw-r--r--spec/controllers/admin/settings_controller_spec.rb36
28 files changed, 117 insertions, 97 deletions
diff --git a/Gemfile b/Gemfile
index d84597a78..79e9fb895 100644
--- a/Gemfile
+++ b/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'
diff --git a/Gemfile.lock b/Gemfile.lock
index 7b687c6bd..7db2b61d1 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -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
diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb
index fc9064068..fcd42c79c 100644
--- a/app/controllers/admin/settings_controller.rb
+++ b/app/controllers/admin/settings_controller.rb
@@ -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
diff --git a/app/javascript/styles/forms.scss b/app/javascript/styles/forms.scss
index 18258099b..18e8657cd 100644
--- a/app/javascript/styles/forms.scss
+++ b/app/javascript/styles/forms.scss
@@ -9,6 +9,12 @@ code {
   margin: 0 auto;
 }
 
+.admin {
+  input, textarea {
+    width: 100%;
+  }
+}
+
 .simple_form {
   .input {
     margin-bottom: 15px;
diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml
new file mode 100644
index 000000000..0808f467c
--- /dev/null
+++ b/app/views/admin/settings/edit.html.haml
@@ -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
diff --git a/app/views/admin/settings/index.html.haml b/app/views/admin/settings/index.html.haml
deleted file mode 100644
index b00e75a16..000000000
--- a/app/views/admin/settings/index.html.haml
+++ /dev/null
@@ -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'])
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 7b8d09d10..b98c613f9 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -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
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 936aa38d9..2210bd3c5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -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
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index d118582a0..97792ede7 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -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: بازبوقیده
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index f238d601a..db892619c 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -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
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 0cda09add..282cff21e 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -157,7 +157,6 @@ he:
       unresolved: לא פתור
       view: תצוגה
     settings:
-      click_to_edit: לחיצה כדי לערוך
       contact_information:
         email: 'נא להקליד כתובת דוא"ל פומבית'
         label: פרטי התקשרות
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 55c27ca08..14c8d0b59 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -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
diff --git a/config/locales/io.yml b/config/locales/io.yml
index 4fad8423c..438fc301f 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -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
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index af5e77d14..3f961bc93 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -157,7 +157,6 @@ ja:
       unresolved: 未解決
       view: 表示
     settings:
-      click_to_edit: クリックして編集
       contact_information:
         email: 公開するメールアドレスを入力
         label: 連絡先情報
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 3fb7c0487..f5a1068b8 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -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
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 237b9c452..da1807582 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -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
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 71877aada..8f88db22c 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -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
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 067f908ba..2126a5529 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -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
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 2fc9f900f..cd841be51 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -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
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 918b5a947..04e6d15f3 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -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: Контактная информация
diff --git a/config/locales/th.yml b/config/locales/th.yml
index ae5273dd7..5383b31ab 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -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: ข้อมูลที่ติดต่อ
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index e3c4a41ca..67cd5b1b8 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -154,7 +154,6 @@ zh-CN:
       unresolved: 未处理
       view: 查看
     settings:
-      click_to_edit: 点击编辑
       contact_information:
         email: 输入一个公开的电邮地址
         label: 联系数据
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 26fd0855f..4f7a263b4 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -141,7 +141,6 @@ zh-HK:
       unresolved: 未處理
       view: 檢視
     settings:
-      click_to_edit: 點擊編輯
       contact_information:
         email: 輸入一個公開的電郵地址
         label: 聯絡資料
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index b5918e0ef..8f6f008ee 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -118,7 +118,6 @@ zh-TW:
       unresolved: 未解決
       view: 檢視
     settings:
-      click_to_edit: 點選以編輯
       contact_information:
         email: 請輸入輸入一個公開電子信箱
         label: 聯絡資訊
diff --git a/config/navigation.rb b/config/navigation.rb
index 16bc86696..38dee91b2 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -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' }
diff --git a/config/routes.rb b/config/routes.rb
index 1492f99fb..577a66923 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -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
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index 2ddf3c2f0..2cc1c29eb 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -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.'
diff --git a/spec/controllers/admin/settings_controller_spec.rb b/spec/controllers/admin/settings_controller_spec.rb
index 889f78bc1..533ae2045 100644
--- a/spec/controllers/admin/settings_controller_spec.rb
+++ b/spec/controllers/admin/settings_controller_spec.rb
@@ -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(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(admin_settings_path)
-          expect(Setting.new_setting_key).to eq '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