]> git.openstreetmap.org Git - rails.git/commitdiff
Split user preferences into a separate page
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 30 Jun 2021 17:02:42 +0000 (18:02 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 14 Jul 2021 16:40:20 +0000 (17:40 +0100)
Refs #3167

app/abilities/ability.rb
app/controllers/preferences_controller.rb [new file with mode: 0644]
app/controllers/users_controller.rb
app/views/layouts/_header.html.erb
app/views/preferences/edit.html.erb [new file with mode: 0644]
app/views/preferences/show.html.erb [new file with mode: 0644]
app/views/users/account.html.erb
config/locales/en.yml
config/routes.rb
test/controllers/preferences_controller_test.rb [new file with mode: 0644]
test/controllers/users_controller_test.rb

index c03ab288ca36d06c309c90e406a8ad5f18ea5398..b77f68be755ccf216da094f5b87f3edffc19446f 100644 (file)
@@ -46,6 +46,7 @@ class Ability
         can [:make_friend, :remove_friend], Friendship
         can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message
         can [:close, :reopen], Note
+        can [:show, :edit, :update], :preference
         can [:new, :create], Report
         can [:mine, :new, :create, :edit, :update, :destroy], Trace
         can [:account, :go_public], User
diff --git a/app/controllers/preferences_controller.rb b/app/controllers/preferences_controller.rb
new file mode 100644 (file)
index 0000000..6839bf3
--- /dev/null
@@ -0,0 +1,32 @@
+class PreferencesController < ApplicationController
+  layout "site"
+
+  before_action :authorize_web
+  before_action :set_locale
+
+  authorize_resource :class => false
+
+  before_action :check_database_readable
+  before_action :check_database_writable, :only => [:update]
+
+  def show; end
+
+  def edit; end
+
+  def update
+    current_user.languages = params[:user][:languages].split(",")
+
+    current_user.preferred_editor = if params[:user][:preferred_editor] == "default"
+                                      nil
+                                    else
+                                      params[:user][:preferred_editor]
+                                    end
+    if current_user.save
+      flash[:notice] = t ".success"
+      redirect_to preferences_path
+    else
+      flash[:error] = t ".failure"
+      render :edit
+    end
+  end
+end
index 3101e5af2f1660ae42e5da016f623f312b614a93..1f3eb2f7a87e1d170dc60306da91bedc27f5ea49 100644 (file)
@@ -368,8 +368,6 @@ class UsersController < ApplicationController
       user.description_format = "markdown"
     end
 
-    user.languages = params[:user][:languages].split(",")
-
     case params[:avatar_action]
     when "new"
       user.avatar.attach(params[:user][:avatar])
@@ -385,12 +383,6 @@ class UsersController < ApplicationController
     user.home_lat = params[:user][:home_lat]
     user.home_lon = params[:user][:home_lon]
 
-    user.preferred_editor = if params[:user][:preferred_editor] == "default"
-                              nil
-                            else
-                              params[:user][:preferred_editor]
-                            end
-
     if params[:user][:auth_provider].nil? || params[:user][:auth_provider].blank?
       user.auth_provider = nil
       user.auth_uid = nil
@@ -399,8 +391,6 @@ class UsersController < ApplicationController
     if user.save
       session[:fingerprint] = user.fingerprint
 
-      set_locale(:reset => true)
-
       if user.new_email.blank? || user.new_email == user.email
         flash[:notice] = t "users.account.flash update success"
       else
index fe5bf23c5b4eb0327d0ea7b498b6add8940062ec..6b6271c2b8e13a858ae357cedf3b833be0f49179 100644 (file)
@@ -96,6 +96,7 @@
           <% end %>
           <%= link_to t("users.show.my profile"), user_path(current_user), :class => "dropdown-item" %>
           <%= link_to t("users.show.my settings"), { :controller => "users", :action => "account", :display_name => current_user.display_name }, { :class => "dropdown-item" } %>
+          <%= link_to t("users.show.my_preferences"), preferences_path, :class => "dropdown-item" %>
           <div class="dropdown-divider"></div>
           <%= yield :greeting %>
           <%= link_to t("layouts.logout"), logout_path(:referer => request.fullpath), :method => "post", :class => "geolink dropdown-item" %>
diff --git a/app/views/preferences/edit.html.erb b/app/views/preferences/edit.html.erb
new file mode 100644 (file)
index 0000000..07d89fb
--- /dev/null
@@ -0,0 +1,12 @@
+<% content_for :heading do %>
+  <h1><%= t ".title" %></h1>
+<% end %>
+
+<%= bootstrap_form_for current_user, :url => { :action => :update } do |f| %>
+  <%= f.select :preferred_editor, [[t("editor.default", :name => t("editor.#{Settings.default_editor}.name")), "default"]] + Editors::AVAILABLE_EDITORS.collect { |e| [t("editor.#{e}.description"), e] } %>
+
+  <%= f.text_field :languages %>
+
+  <%= f.primary t(".save") %>
+  <%= link_to t(".cancel"), preferences_path, :class => "btn btn-link" %>
+<% end %>
diff --git a/app/views/preferences/show.html.erb b/app/views/preferences/show.html.erb
new file mode 100644 (file)
index 0000000..d17c83b
--- /dev/null
@@ -0,0 +1,28 @@
+<% content_for :heading do %>
+  <h1><%= t ".title" %></h1>
+<% end %>
+
+<dl class="row">
+  <dt class="col-sm-4"><%= t ".preferred_editor" %></dt>
+
+  <% if current_user.preferred_editor? %>
+    <dd class="col-sm-8"><%= t("editor.#{current_user.preferred_editor}.description") %></dd>
+  <% else %>
+    <dd class="col-sm-8"><%= t("editor.default", :name => t("editor.#{Settings.default_editor}.name")) %></dd>
+  <% end %>
+
+  <dt class="col-sm-4"><%= t ".preferred_languages" %></dt>
+
+  <dd class="col-sm-8">
+    <ul>
+      <% current_user.preferred_languages.each do |locale| %>
+        <li><%= locale %></li>
+      <% end %>
+    </ul>
+
+  </dd>
+</dl>
+
+<div>
+  <%= link_to t(".edit_preferences"), edit_preferences_path, :class => "btn btn-outline-primary" %>
+</div>
index dc31de97aea3d6671b55219c8ed8ab96225b54b1..f1c46c710bdaf08226c763605e6f54b384214ff5 100644 (file)
@@ -58,9 +58,7 @@
     </span>
   </div>
 
-  <%= f.select :preferred_editor, [[t("editor.default", :name => t("editor.#{Settings.default_editor}.name")), "default"]] + Editors::AVAILABLE_EDITORS.collect { |e| [t("editor.#{e}.description"), e] } %>
   <%= f.richtext_field :description, :cols => 80, :rows => 20 %>
-  <%= f.text_field :languages %>
 
   <fieldset class="form-group">
     <%= f.label t(".image") %>
index 0119aeae1e4687941a5d4b87e139c0249f088440..74d68263c529155c3582b7d595ef1ff7173dc648 100644 (file)
@@ -1644,6 +1644,19 @@ en:
       reset: "Reset Password"
       flash changed: "Your password has been changed."
       flash token bad: "Did not find that token, check the URL maybe?"
+  preferences:
+    show:
+      title: My Preferences
+      preferred_editor: Preferred Editor
+      preferred_languages: Preferred Languages
+      edit_preferences: Edit Preferences
+    edit:
+      title: Edit Preferences
+      save: Update Preferences
+      cancel: Cancel
+    update:
+      success: Preferences updated.
+      failure: Couldn't update preferences.
   sessions:
     new:
       title: "Login"
@@ -2445,6 +2458,7 @@ en:
       my profile: My Profile
       my settings: My Settings
       my comments: My Comments
+      my_preferences: My Preferences
       blocks on me: Blocks on Me
       blocks by me: Blocks by Me
       send message: Send Message
index 048db8b3365aad3335f2d147ac67754f5e1d15fa..b68882dbf5c08cddeec2eb879132711a7c83b525 100644 (file)
@@ -240,6 +240,8 @@ OpenStreetMap::Application.routes.draw do
   match "/user/:display_name/account" => "users#account", :via => [:get, :post], :as => "user_account"
   post "/user/:display_name/set_status" => "users#set_status", :as => :set_status_user
 
+  resource :preferences, :only => [:show, :edit, :update]
+
   # friendships
   match "/user/:display_name/make_friend" => "friendships#make_friend", :via => [:get, :post], :as => "make_friend"
   match "/user/:display_name/remove_friend" => "friendships#remove_friend", :via => [:get, :post], :as => "remove_friend"
diff --git a/test/controllers/preferences_controller_test.rb b/test/controllers/preferences_controller_test.rb
new file mode 100644 (file)
index 0000000..8c529e6
--- /dev/null
@@ -0,0 +1,56 @@
+require "test_helper"
+
+class PreferencesControllerTest < ActionDispatch::IntegrationTest
+  ##
+  # test all routes which lead to this controller
+  def test_routes
+    assert_routing(
+      { :path => "/preferences", :method => :get },
+      { :controller => "preferences", :action => "show" }
+    )
+
+    assert_routing(
+      { :path => "/preferences/edit", :method => :get },
+      { :controller => "preferences", :action => "edit" }
+    )
+
+    assert_routing(
+      { :path => "/preferences", :method => :put },
+      { :controller => "preferences", :action => "update" }
+    )
+  end
+
+  def test_update_preferred_editor
+    user = create(:user, :languages => [])
+    session_for(user)
+
+    # Changing to a invalid editor should fail
+    user.preferred_editor = "unknown"
+    put preferences_path, :params => { :user => user.attributes }
+    assert_response :success
+    assert_template :edit
+    assert_select ".notice", false
+    assert_select ".error", true
+    assert_select "form > div.form-group > select#user_preferred_editor > option[selected]", false
+
+    # Changing to a valid editor should work
+    user.preferred_editor = "id"
+    put preferences_path, :params => { :user => user.attributes }
+    assert_response :redirect
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".notice", /^Preferences updated/
+    assert_select "dd", "iD (in-browser editor)"
+
+    # Changing to the default editor should work
+    user.preferred_editor = "default"
+    put preferences_path, :params => { :user => user.attributes }
+    assert_response :redirect
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".notice", /^Preferences updated/
+    assert_select "dd", "Default (currently iD)"
+  end
+end
index 62eb79f0c836d30cba746850246a6e798a1ad7e7..6eebd7f1ae8c9775db50ec0c131d4c66e511f4ec 100644 (file)
@@ -475,36 +475,6 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
     assert_select ".notice", /^User information updated successfully/
     assert_select "form#accountForm > div.form-group > div#user_description_container > div#user_description_content > textarea#user_description", user.description
 
-    # Changing to a invalid editor should fail
-    user.preferred_editor = "unknown"
-    post user_account_path(user), :params => { :user => user.attributes }
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", false
-    assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
-
-    # Changing to a valid editor should work
-    user.preferred_editor = "id"
-    post user_account_path(user), :params => { :user => user.attributes }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected][value=?]", "id"
-
-    # Changing to the default editor should work
-    user.preferred_editor = "default"
-    post user_account_path(user), :params => { :user => user.attributes }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
-
     # Changing to an uploaded image should work
     image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
     post user_account_path(user), :params => { :avatar_action => "new", :user => user.attributes.merge(:avatar => image) }