]> git.openstreetmap.org Git - rails.git/commitdiff
Add status filter to user's note page
authorEmin Kocan <kocanmn.dev@gmail.com>
Wed, 30 Oct 2024 21:00:59 +0000 (22:00 +0100)
committerEmin Kocan <kocanmn.dev@gmail.com>
Mon, 18 Nov 2024 14:21:55 +0000 (15:21 +0100)
app/controllers/notes_controller.rb
app/views/notes/index.html.erb
config/locales/en.yml
test/controllers/notes_controller_test.rb

index 26d27692e5cd5804386aca35191e68e26bbd7dbe..c47a3abfb9a1e3d605b0fb3e7d92cc072de6fffa 100644 (file)
@@ -18,12 +18,13 @@ class NotesController < ApplicationController
   def index
     param! :page, Integer, :min => 1
 
   def index
     param! :page, Integer, :min => 1
 
-    @params = params.permit(:display_name)
+    @params = params.permit(:display_name, :status)
     @title = t ".title", :user => @user.display_name
     @page = (params[:page] || 1).to_i
     @page_size = 10
     @notes = @user.notes
     @notes = @notes.visible unless current_user&.moderator?
     @title = t ".title", :user => @user.display_name
     @page = (params[:page] || 1).to_i
     @page_size = 10
     @notes = @user.notes
     @notes = @notes.visible unless current_user&.moderator?
+    @notes = @notes.where(:status => params[:status]) unless params[:status] == "all" || params[:status].blank?
     @notes = @notes.order("updated_at DESC, id").distinct.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author)
 
     render :layout => "site"
     @notes = @notes.order("updated_at DESC, id").distinct.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author)
 
     render :layout => "site"
index d5efe0d79c79e3308c0f26252b7a403e6b3b3070..c883126658e7c69b7cb278f4d9724c35f3d12bdd 100644 (file)
@@ -6,6 +6,20 @@
            :commented => tag.span(t(".subheading_commented"), :class => "px-2 py-1 bg-body") %></p>
 <% end %>
 
            :commented => tag.span(t(".subheading_commented"), :class => "px-2 py-1 bg-body") %></p>
 <% end %>
 
+<%= form_with :url => user_notes_path(@user), :method => :get, :data => { :turbo => true } do %>
+  <div class="row gx-2 align-items-end">
+    <div class="col-sm-auto mb-3">
+      <%= label_tag :status, t(".status") %>
+      <%= select_tag :status,
+                     options_for_select([[t(".all"), "all"], [t(".open"), "open"], [t(".closed"), "closed"]], params[:status] || "all"),
+                     :class => "form-select" %>
+    </div>
+    <div class="col-sm-auto mb-3">
+      <%= submit_tag t(".apply"), :name => nil, :class => "btn btn-primary" %>
+    </div>
+  </div>
+<% end %>
+
 <% if @notes.empty? %>
   <h4><%= t ".no_notes" %></h4>
 
 <% if @notes.empty? %>
   <h4><%= t ".no_notes" %></h4>
 
index f68488c09c4cfc416c9f6518188cff27fc86b057..3f2a4cb1408c7337ef826ef5b6451154b717ad29 100644 (file)
@@ -2966,6 +2966,11 @@ en:
       description: "Description"
       created_at: "Created at"
       last_changed: "Last changed"
       description: "Description"
       created_at: "Created at"
       last_changed: "Last changed"
+      apply: "Apply"
+      all: "All"
+      open: "Open"
+      closed: "Closed"
+      status: "Status"
     show:
       title: "Note: %{id}"
       description: "Description"
     show:
       title: "Note: %{id}"
       description: "Description"
index 4092ad7326599cfe964b7adc97d8790a57f7570e..71dfa42baefafa63bbfbe42a5b42555fbc3d832b 100644 (file)
@@ -184,4 +184,38 @@ class NotesControllerTest < ActionDispatch::IntegrationTest
     assert_template "notes/new"
     assert_select "#sidebar_content a[href='#{login_path(:referer => new_note_path)}']", :count => 0
   end
     assert_template "notes/new"
     assert_select "#sidebar_content a[href='#{login_path(:referer => new_note_path)}']", :count => 0
   end
+
+  def test_index_filter_by_status
+    user = create(:user)
+    other_user = create(:user)
+
+    open_note = create(:note, :status => "open")
+    create(:note_comment, :note => open_note, :author => user)
+
+    closed_note = create(:note, :status => "closed")
+    create(:note_comment, :note => closed_note, :author => user)
+
+    hidden_note = create(:note, :status => "hidden")
+    create(:note_comment, :note => hidden_note, :author => user)
+
+    commented_note = create(:note, :status => "open")
+    create(:note_comment, :note => commented_note, :author => other_user)
+    create(:note_comment, :note => commented_note, :author => user)
+
+    get user_notes_path(user, :status => "all")
+    assert_response :success
+    assert_select "table.note_list tbody tr", :count => 3
+
+    get user_notes_path(user, :status => "open")
+    assert_response :success
+    assert_select "table.note_list tbody tr", :count => 2
+
+    get user_notes_path(user, :status => "closed")
+    assert_response :success
+    assert_select "table.note_list tbody tr", :count => 1
+
+    get user_notes_path(user)
+    assert_response :success
+    assert_select "table.note_list tbody tr", :count => 3
+  end
 end
 end