diff --git a/Gemfile b/Gemfile
index 4c25c9e..a1db836 100644
--- a/Gemfile
+++ b/Gemfile
@@ -10,6 +10,7 @@ gem 'puma'
gem 'rackup'
gem 'rails'
gem 'rails_semantic_logger'
+gem 'ransack'
gem 'sprockets-rails'
gem 'stimulus-rails'
gem 'tailwindcss-rails'
diff --git a/Gemfile.lock b/Gemfile.lock
index df4f2ae..b2a62c2 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -206,6 +206,10 @@ GEM
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.2.1)
+ ransack (4.2.1)
+ activerecord (>= 6.1.5)
+ activesupport (>= 6.1.5)
+ i18n
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
@@ -318,6 +322,7 @@ DEPENDENCIES
rails_live_reload
rails_semantic_logger
rainbow
+ ransack
rubocop
rubocop-packaging
rubocop-performance
diff --git a/app/controllers/scores_controller.rb b/app/controllers/scores_controller.rb
index 9fdafd6..749b22e 100644
--- a/app/controllers/scores_controller.rb
+++ b/app/controllers/scores_controller.rb
@@ -5,7 +5,8 @@ class ScoresController < ApplicationController
before_action :set_score, only: %i[show edit update destroy]
def index
- @pagy, @scores = pagy(Score.all)
+ @q = Score.all.ransack
+ @pagy, @scores = pagy(@q.result)
end
def show; end
diff --git a/app/helpers/pagy_helper.rb b/app/helpers/pagy_helper.rb
index f7518c0..2c4f183 100644
--- a/app/helpers/pagy_helper.rb
+++ b/app/helpers/pagy_helper.rb
@@ -1,3 +1,55 @@
module PagyHelper
include Pagy::Frontend
+
+ # preferable to sort_link, prepend page=1 as second args (options like) automatically
+ def pagy_sort_link(search_object, attribute, *args, &)
+ prepend_args_with_common_pagy_options(args)
+ sort_link(search_object, attribute, *args, &)
+ end
+
+ # TODO: needs some refactoring
+ def pagy_toggle_link(search_object, attribute, *args, &)
+ params = preserve_q
+ state = params.dig(:q, attribute).to_s == 'true'
+ params[:q] = params[:q].merge(archived: !state)
+
+ url = url_for(params:)
+
+ # build_toggle_field_tag("q[#{attribute}]", t("actions.#{attribute}"), state, on_change: "Turbo.visit('#{url}')")
+ build_toggle_field_tag("q[#{attribute}]", '', state, on_change: "Turbo.visit('#{url}')")
+ end
+
+ # TODO: needs some refactoring
+ def pagy_search_field(search_object, attribute, *args)
+ params = preserve_q
+ value = params.dig(:q, attribute)
+
+ args << {} unless args.last.is_a?(Hash)
+ url = url_for(params:)
+ url += url.include?('?') ? '&' : '?'
+ url += "q[#{attribute}]="
+ args.last.merge!({ onkeypress: "if (event.key === \"Enter\") {Turbo.visit('#{url}'+event.target.value)}" })
+
+ search_field_tag("q[#{attribute}]", value, *args)
+ end
+
+ # preserve ransack search parameters from default parameter 'q'
+ def preserve_q(search_object = nil)
+ { q: request.params[:q] || {} }
+ end
+
+ # in case q exists and q[:sym] exists, its content is returned else nil
+ def optional_q(sym) = request.params.fetch(:q, nil)&.fetch(sym, nil)
+
+ private
+
+ def prepend_args_with_common_pagy_options(args)
+ args << {} unless args.last.is_a?(Hash)
+ args.last.merge!(
+ { page: 1,
+ data: {
+ 'turbo-action': 'advance'
+ } }
+ )
+ end
end
diff --git a/app/views/scores/_score.html.erb b/app/views/scores/_score.html.erb
index e5d472b..c4cb44d 100644
--- a/app/views/scores/_score.html.erb
+++ b/app/views/scores/_score.html.erb
@@ -1,18 +1,18 @@
-
-
+ |
+
<%= score.name %>
|
-
-
+ |
<%= score.grade %>
|
-
-
- <% if action_name != "show" %>
+ |
+ <%= score.created_at %>
+ |
+
+
<%= link_to score, 'data-tooltip': 'show',class: 'mr-1 border rounded-lg border-purple-800 p-2 bg-white' do %><%=fa_icon :eye %><% end %>
<%= link_to edit_score_path(score), 'data-tooltip': 'edit', class: 'mr-1 border rounded-lg border-purple-800 p-2 bg-white' do %><%=fa_icon :edit %><% end %>
<%= link_to score, 'data-tooltip': 'delete', data:{ turbo_method: :delete}, class: 'border rounded-lg border-purple-800 mr-1 p-2 bg-white' do %><%=fa_icon :trash %><% end %>
-
- <% end %>
+
|
-
+
\ No newline at end of file
diff --git a/app/views/scores/_scores.html.erb b/app/views/scores/_scores.html.erb
new file mode 100644
index 0000000..c46b932
--- /dev/null
+++ b/app/views/scores/_scores.html.erb
@@ -0,0 +1,38 @@
+<%= turbo_frame_tag :scores do %>
+
+
+
+
+ <%= pagy_sort_link(@q, :name, t('modules.etherpad.padname')) %>
+ |
+
+ <%= pagy_sort_link(@q, :grade, t('modules.etherpad.comment')) %>
+ |
+
+ <%= pagy_sort_link(@q, :created_at, t('modules.etherpad.created_at')) %>
+ |
+
+ Actions
+ |
+
+
+
+ <%= pagy_search_field(@q, :name_cont, class: "text-sm w-full h-8 text-gray-800 dark:text-gray-400 bg-gray-200 dark:bg-gray-700") %>
+ |
+
+ |
+
+ |
+
+ |
+
+
+
+ <%= render @scores %>
+
+
+
+ <%== pagy_nav @pagy %>
+ <%== pagy_info @pagy %>
+
+<%end%>
diff --git a/app/views/scores/index.html.erb b/app/views/scores/index.html.erb
index 10bd4c0..ea4caeb 100644
--- a/app/views/scores/index.html.erb
+++ b/app/views/scores/index.html.erb
@@ -1,20 +1,8 @@
-
-
-
-
List of Scores
- <%= link_to "New score", new_score_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %>
-
-
-
-
-
- Name |
- Grade |
- Actions |
-
-
- <%= render @scores %>
-
+
+
List of Scores
+ <%= link_to "New score", new_score_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %>
+
- <%== pagy_nav(@pagy) %>
+
+ <%= render 'scores' %>