From 9196ab24587d07d8265615270434ddaf2197c306 Mon Sep 17 00:00:00 2001 From: pvincent Date: Mon, 19 Aug 2024 23:02:53 +0400 Subject: [PATCH] ransack + pagy but no UI yet --- Gemfile | 1 + Gemfile.lock | 5 +++ app/controllers/scores_controller.rb | 3 +- app/helpers/pagy_helper.rb | 52 ++++++++++++++++++++++++++++ app/views/scores/_score.html.erb | 20 +++++------ app/views/scores/_scores.html.erb | 38 ++++++++++++++++++++ app/views/scores/index.html.erb | 24 ++++--------- 7 files changed, 114 insertions(+), 29 deletions(-) create mode 100644 app/views/scores/_scores.html.erb 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 %> + + + + + + + + + + + + + + + + + <%= render @scores %> + +
+ <%= 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") %> + +
+
+ <%== 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" %> -
- - - - - - - - - - <%= render @scores %> -
NameGradeActions
+
+

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' %>