fix order queries
This commit is contained in:
@@ -5,8 +5,9 @@ class TemplateFoldersController < ApplicationController
|
|||||||
|
|
||||||
def show
|
def show
|
||||||
@templates = @template_folder.templates.active.accessible_by(current_ability)
|
@templates = @template_folder.templates.active.accessible_by(current_ability)
|
||||||
.preload(:author, :template_accesses).order(id: :desc)
|
.preload(:author, :template_accesses)
|
||||||
@templates = Templates.search(@templates, params[:q])
|
@templates = Templates.search(@templates, params[:q])
|
||||||
|
@templates = Templates::Order.call(@templates, cookies.permanent[:dashboard_templates_order])
|
||||||
|
|
||||||
@pagy, @templates = pagy(@templates, limit: 12)
|
@pagy, @templates = pagy(@templates, limit: 12)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,18 +7,12 @@ class TemplatesDashboardController < ApplicationController
|
|||||||
SHOW_TEMPLATES_FOLDERS_THRESHOLD = 9
|
SHOW_TEMPLATES_FOLDERS_THRESHOLD = 9
|
||||||
TEMPLATES_PER_PAGE = 12
|
TEMPLATES_PER_PAGE = 12
|
||||||
FOLDERS_PER_PAGE = 18
|
FOLDERS_PER_PAGE = 18
|
||||||
LAST_USED_SQL = <<~SQL.squish
|
|
||||||
GREATEST(
|
|
||||||
COALESCE(MAX(templates.updated_at), '1970-01-01'),
|
|
||||||
COALESCE(MAX(submissions.created_at), '1970-01-01')
|
|
||||||
)
|
|
||||||
SQL
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@template_folders = @template_folders.where(id: @templates.active.select(:folder_id))
|
@template_folders = @template_folders.where(id: @templates.active.select(:folder_id))
|
||||||
|
|
||||||
@template_folders = TemplateFolders.search(@template_folders, params[:q])
|
@template_folders = TemplateFolders.search(@template_folders, params[:q])
|
||||||
@template_folders = sort_template_folders(@template_folders)
|
@template_folders = sort_template_folders(@template_folders, cookies.permanent[:dashboard_templates_order])
|
||||||
|
|
||||||
@pagy, @template_folders = pagy(
|
@pagy, @template_folders = pagy(
|
||||||
@template_folders,
|
@template_folders,
|
||||||
@@ -31,7 +25,7 @@ class TemplatesDashboardController < ApplicationController
|
|||||||
else
|
else
|
||||||
@template_folders = @template_folders.reject { |e| e.name == TemplateFolder::DEFAULT_NAME }
|
@template_folders = @template_folders.reject { |e| e.name == TemplateFolder::DEFAULT_NAME }
|
||||||
@templates = filter_templates(@templates)
|
@templates = filter_templates(@templates)
|
||||||
@templates = sort_templates(@templates)
|
@templates = Templates::Order.call(@templates, cookies.permanent[:dashboard_templates_order])
|
||||||
|
|
||||||
limit =
|
limit =
|
||||||
if @template_folders.size < 4
|
if @template_folders.size < 4
|
||||||
@@ -63,41 +57,36 @@ class TemplatesDashboardController < ApplicationController
|
|||||||
Templates.search(rel, params[:q])
|
Templates.search(rel, params[:q])
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort_template_folders(template_folders)
|
def sort_template_folders(template_folders, order)
|
||||||
return template_folders.order(id: :desc) if params[:q].present?
|
case order
|
||||||
|
when 'used_at'
|
||||||
|
subquery =
|
||||||
|
Template.left_joins(:submissions)
|
||||||
|
.group(:folder_id)
|
||||||
|
.select(
|
||||||
|
:folder_id,
|
||||||
|
Template.arel_table[:updated_at].maximum.as('updated_at_max'),
|
||||||
|
Submission.arel_table[:created_at].maximum.as('submission_created_at_max')
|
||||||
|
)
|
||||||
|
|
||||||
case cookies.permanent[:dashboard_templates_order]
|
template_folders = template_folders.joins(
|
||||||
when 'recently_used'
|
Template.arel_table
|
||||||
sorted_folders =
|
.join(subquery.arel.as('templates'), Arel::Nodes::OuterJoin)
|
||||||
template_folders.left_joins(templates: :submissions)
|
.on(TemplateFolder.arel_table[:id].eq(Template.arel_table[:folder_id]))
|
||||||
.select("template_folders.*, #{LAST_USED_SQL} AS last_used_at")
|
.join_sources
|
||||||
.group('template_folders.id')
|
)
|
||||||
.order(Arel.sql("#{LAST_USED_SQL} DESC NULLS LAST"))
|
|
||||||
|
|
||||||
TemplateFolder.from(sorted_folders, :template_folders)
|
template_folders.order(
|
||||||
|
Arel::Nodes::Case.new
|
||||||
|
.when(Template.arel_table[:submission_created_at_max].gt(Template.arel_table[:updated_at_max]))
|
||||||
|
.then(Template.arel_table[:submission_created_at_max])
|
||||||
|
.else(Template.arel_table[:updated_at_max])
|
||||||
|
.desc
|
||||||
|
)
|
||||||
when 'name'
|
when 'name'
|
||||||
template_folders.order(name: :asc)
|
template_folders.order(name: :asc)
|
||||||
else
|
else
|
||||||
template_folders.order(id: :desc)
|
template_folders.order(id: :desc)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort_templates(templates)
|
|
||||||
return templates.order(id: :desc) if params[:q].present?
|
|
||||||
|
|
||||||
case cookies.permanent[:dashboard_templates_order]
|
|
||||||
when 'recently_used'
|
|
||||||
sorted_templates =
|
|
||||||
templates.left_joins(:submissions)
|
|
||||||
.select("templates.*, #{LAST_USED_SQL} AS last_used_at")
|
|
||||||
.group('templates.id')
|
|
||||||
.order(Arel.sql("#{LAST_USED_SQL} DESC NULLS LAST"))
|
|
||||||
|
|
||||||
Template.from(sorted_templates, :templates)
|
|
||||||
when 'name'
|
|
||||||
templates.order(name: :asc)
|
|
||||||
else
|
|
||||||
templates.order(id: :desc)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<%= @pagy.from %>-<%= local_assigns.fetch(:to, @pagy.to) %> of <%= local_assigns.fetch(:count, @pagy.count) %> <%= local_assigns[:items_name] || 'items' %>
|
<%= @pagy.from %>-<%= local_assigns.fetch(:to, @pagy.to) %> of <%= local_assigns.fetch(:count, @pagy.count) %> <%= local_assigns[:items_name] || 'items' %>
|
||||||
<%= local_assigns[:left_additional_html] %>
|
<%= local_assigns[:left_additional_html] %>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-1">
|
<div class="flex items-center space-x-1.5">
|
||||||
<%= local_assigns[:right_additional_html] %>
|
<%= local_assigns[:right_additional_html] %>
|
||||||
<div class="join">
|
<div class="join">
|
||||||
<% if @pagy.prev %>
|
<% if @pagy.prev %>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
<% else %>
|
<% else %>
|
||||||
<span class="join-item btn btn-disabled !bg-base-200 min-h-full h-10">«</span>
|
<span class="join-item btn btn-disabled !bg-base-200 min-h-full h-10">«</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
<span class="join-item btn uppercase min-h-full h-10">
|
<span class="join-item btn font-medium uppercase min-h-full h-10">
|
||||||
<%= t('page_number', number: @pagy.page) %>
|
<%= t('page_number', number: @pagy.page) %>
|
||||||
</span>
|
</span>
|
||||||
<% if @pagy.next %>
|
<% if @pagy.next %>
|
||||||
|
|||||||
@@ -1,9 +1,25 @@
|
|||||||
<% dashboard_templates_order = cookies.permanent[:dashboard_templates_order] || 'creation_date' %>
|
<% dashboard_templates_order = cookies.permanent[:dashboard_templates_order] || 'created_at' %>
|
||||||
<form action="<%= root_path %>" method="get" class="dropdown dropdown-top">
|
<form action="<%= url_for %>" method="get" class="dropdown dropdown-top">
|
||||||
<label tabindex="0" class="btn btn-sm h-10">
|
<label tabindex="0" class="btn btn-sm h-10">
|
||||||
<%= svg_icon('arrow_sort', class: 'w-5 h-5') %>
|
<%= svg_icon('arrow_sort', class: 'w-5 h-5') %>
|
||||||
</label>
|
</label>
|
||||||
<ul tabindex="0" class="dropdown-content z-[10] menu p-2 shadow bg-base-100 rounded-box mb-1 min-w-48">
|
<ul tabindex="0" class="dropdown-content z-[10] menu p-2 shadow bg-base-100 rounded-box mb-1 min-w-48">
|
||||||
|
<toggle-cookies data-value="created_at" data-key="dashboard_templates_order">
|
||||||
|
<li>
|
||||||
|
<button class="<%= 'bg-base-200' if dashboard_templates_order == 'created_at' %>">
|
||||||
|
<%= svg_icon('sort_descending_numbers', class: 'w-4 h-4') %>
|
||||||
|
<span class="whitespace-nowrap"><%= t('newest_first') %></span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</toggle-cookies>
|
||||||
|
<toggle-cookies data-value="used_at" data-key="dashboard_templates_order">
|
||||||
|
<li>
|
||||||
|
<button class="<%= 'bg-base-200' if dashboard_templates_order == 'used_at' %>">
|
||||||
|
<%= svg_icon('sort_descending_small_big', class: 'w-4 h-4') %>
|
||||||
|
<span class="whitespace-nowrap"><%= t('recently_used') %></span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</toggle-cookies>
|
||||||
<toggle-cookies data-value="name" data-key="dashboard_templates_order">
|
<toggle-cookies data-value="name" data-key="dashboard_templates_order">
|
||||||
<li>
|
<li>
|
||||||
<button class="<%= 'bg-base-200' if dashboard_templates_order == 'name' %>">
|
<button class="<%= 'bg-base-200' if dashboard_templates_order == 'name' %>">
|
||||||
@@ -12,21 +28,5 @@
|
|||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
</toggle-cookies>
|
</toggle-cookies>
|
||||||
<toggle-cookies data-value="recently_used" data-key="dashboard_templates_order">
|
|
||||||
<li>
|
|
||||||
<button class="<%= 'bg-base-200' if dashboard_templates_order == 'recently_used' %>">
|
|
||||||
<%= svg_icon('sort_descending_small_big', class: 'w-4 h-4') %>
|
|
||||||
<span class="whitespace-nowrap"><%= t('recently_used') %></span>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
</toggle-cookies>
|
|
||||||
<toggle-cookies data-value="creation_date" data-key="dashboard_templates_order">
|
|
||||||
<li>
|
|
||||||
<button class="<%= 'bg-base-200' if dashboard_templates_order == 'creation_date' %>">
|
|
||||||
<%= svg_icon('sort_descending_numbers', class: 'w-4 h-4') %>
|
|
||||||
<span class="whitespace-nowrap"><%= t('creation_date') %></span>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
</toggle-cookies>
|
|
||||||
</ul>
|
</ul>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -35,7 +35,12 @@
|
|||||||
<div class="grid gap-4 md:grid-cols-3">
|
<div class="grid gap-4 md:grid-cols-3">
|
||||||
<%= render partial: 'templates/template', collection: @templates %>
|
<%= render partial: 'templates/template', collection: @templates %>
|
||||||
</div>
|
</div>
|
||||||
<%= render 'shared/pagination', pagy: @pagy, items_name: 'templates' %>
|
<% templates_order_select_html = capture do %>
|
||||||
|
<% if params[:q].blank? && @pagy.pages > 1 %>
|
||||||
|
<%= render('shared/templates_order_select') %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<%= render 'shared/pagination', pagy: @pagy, items_name: 'templates', right_additional_html: templates_order_select_html %>
|
||||||
<% elsif params[:q].present? %>
|
<% elsif params[:q].present? %>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<div class="mt-16 text-3xl font-semibold">
|
<div class="mt-16 text-3xl font-semibold">
|
||||||
|
|||||||
@@ -713,8 +713,8 @@ en: &en
|
|||||||
start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Start a quick tour to learn how to create an send your first document
|
start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Start a quick tour to learn how to create an send your first document
|
||||||
start_tour: Start Tour
|
start_tour: Start Tour
|
||||||
name_a_z: Name A-Z
|
name_a_z: Name A-Z
|
||||||
recently_used: Recently Used
|
recently_used: Recently used
|
||||||
creation_date: Creation Date
|
newest_first: Newest first
|
||||||
submission_sources:
|
submission_sources:
|
||||||
api: API
|
api: API
|
||||||
bulk: Bulk Send
|
bulk: Bulk Send
|
||||||
@@ -1495,7 +1495,7 @@ es: &es
|
|||||||
start_tour: Iniciar guía
|
start_tour: Iniciar guía
|
||||||
name_a_z: Nombre A-Z
|
name_a_z: Nombre A-Z
|
||||||
recently_used: Usado recientemente
|
recently_used: Usado recientemente
|
||||||
creation_date: Fecha de creación
|
newest_first: Más reciente primero
|
||||||
submission_sources:
|
submission_sources:
|
||||||
api: API
|
api: API
|
||||||
bulk: Envío masivo
|
bulk: Envío masivo
|
||||||
@@ -2274,8 +2274,8 @@ it: &it
|
|||||||
start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Inizia un tour rapido per imparare a creare e inviare il tuo primo documento.
|
start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Inizia un tour rapido per imparare a creare e inviare il tuo primo documento.
|
||||||
start_tour: Inizia il tour
|
start_tour: Inizia il tour
|
||||||
name_a_z: Nome A-Z
|
name_a_z: Nome A-Z
|
||||||
recently_used: Usato di recente
|
recently_used: Recentemente usato
|
||||||
creation_date: Data di creazione
|
newest_first: Più recenti prima
|
||||||
submission_sources:
|
submission_sources:
|
||||||
api: API
|
api: API
|
||||||
bulk: Invio massivo
|
bulk: Invio massivo
|
||||||
@@ -3057,7 +3057,7 @@ fr: &fr
|
|||||||
start_tour: Démarrer
|
start_tour: Démarrer
|
||||||
name_a_z: Nom A-Z
|
name_a_z: Nom A-Z
|
||||||
recently_used: Récemment utilisé
|
recently_used: Récemment utilisé
|
||||||
creation_date: Date de création
|
newest_first: Le plus récent d'abord
|
||||||
submission_sources:
|
submission_sources:
|
||||||
api: API
|
api: API
|
||||||
bulk: Envoi en masse
|
bulk: Envoi en masse
|
||||||
@@ -3837,8 +3837,8 @@ pt: &pt
|
|||||||
start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Comece um tour rápido para aprender a criar e enviar seu primeiro documento.
|
start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Comece um tour rápido para aprender a criar e enviar seu primeiro documento.
|
||||||
start_tour: Iniciar tour
|
start_tour: Iniciar tour
|
||||||
name_a_z: Nome A-Z
|
name_a_z: Nome A-Z
|
||||||
recently_used: Usado recentemente
|
recently_used: Recentemente usado
|
||||||
creation_date: Data de criação
|
newest_first: Mais recente primeiro
|
||||||
submission_sources:
|
submission_sources:
|
||||||
api: API
|
api: API
|
||||||
bulk: Envio em massa
|
bulk: Envio em massa
|
||||||
@@ -4620,7 +4620,7 @@ de: &de
|
|||||||
start_tour: Starten
|
start_tour: Starten
|
||||||
name_a_z: Name A-Z
|
name_a_z: Name A-Z
|
||||||
recently_used: Kürzlich verwendet
|
recently_used: Kürzlich verwendet
|
||||||
creation_date: Erstellungsdatum
|
newest_first: Neueste zuerst
|
||||||
submission_sources:
|
submission_sources:
|
||||||
api: API
|
api: API
|
||||||
bulk: Massenversand
|
bulk: Massenversand
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Templates
|
||||||
|
module Order
|
||||||
|
module_function
|
||||||
|
|
||||||
|
def call(templates, order)
|
||||||
|
case order
|
||||||
|
when 'used_at'
|
||||||
|
subquery = Submission.select(:template_id, Submission.arel_table[:created_at].maximum.as('created_at'))
|
||||||
|
.group(:template_id)
|
||||||
|
|
||||||
|
templates = templates.joins(
|
||||||
|
Template.arel_table
|
||||||
|
.join(subquery.arel.as('submissions'), Arel::Nodes::OuterJoin)
|
||||||
|
.on(Template.arel_table[:id].eq(Submission.arel_table[:template_id]))
|
||||||
|
.join_sources
|
||||||
|
)
|
||||||
|
|
||||||
|
templates.order(
|
||||||
|
Arel::Nodes::Case.new
|
||||||
|
.when(Submission.arel_table[:created_at].gt(Template.arel_table[:updated_at]))
|
||||||
|
.then(Submission.arel_table[:created_at])
|
||||||
|
.else(Template.arel_table[:updated_at])
|
||||||
|
.desc
|
||||||
|
)
|
||||||
|
when 'name'
|
||||||
|
templates.order(name: :asc)
|
||||||
|
else
|
||||||
|
templates.order(id: :desc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user