Skip to content

Commit

Permalink
Merge pull request #4492 from benwbrum/4473-works-list-performance
Browse files Browse the repository at this point in the history
4473 - Works list performance
  • Loading branch information
benwbrum authored Jan 30, 2025
2 parents fe5f22c + 9cd048d commit 9793ec2
Show file tree
Hide file tree
Showing 67 changed files with 781 additions and 671 deletions.
3 changes: 0 additions & 3 deletions app/assets/javascripts/ftp_interface.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ $(function() {
.ajaxStart(function() { $('html').addClass('page-busy'); })
.ajaxComplete(function() { $('html').removeClass('page-busy'); });

// Filterable table
$('[data-filterable-table]').filterableTable();

// Category tree expand/collapse
$('.tree-bullet').on('click', function(e) {
e.preventDefault();
Expand Down
69 changes: 0 additions & 69 deletions app/assets/javascripts/plugins/filterable-table.js

This file was deleted.

6 changes: 6 additions & 0 deletions app/assets/stylesheets/sections/work.scss
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,9 @@
font-style: italic;
color: $fgRed;
}

#works-table-wrapper {
.document_set {
max-width: 25px !important;
}
}
46 changes: 41 additions & 5 deletions app/controllers/collection_controller.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# handles administrative tasks for the collection object
class CollectionController < ApplicationController

include ContributorHelper
include AddWorkHelper
include CollectionHelper

DEFAULT_WORKS_PER_PAGE = 15

public :render_to_string

protect_from_forgery except: [
Expand Down Expand Up @@ -611,10 +612,11 @@ def blank_collection
end

def works_list
if params[:only_transcribed].present?
@works = @collection.works.joins(:work_statistic).where("work_statistics.transcribed_percentage < ?", 100).where("work_statistics.needs_review = ?", 0).order(:title)
else
@works = @collection.works.includes(:work_statistic).order(:title)
filtered_works

respond_to do |format|
format.html
format.turbo_stream
end
end

Expand Down Expand Up @@ -783,4 +785,38 @@ def permit_only_transcribed_works_flag
params.permit(:only_transcribed)
end

def filtered_works
@sorting = (params[:sort] || 'title').to_sym
@ordering = (params[:order] || 'ASC').downcase.to_sym
@ordering = [:asc, :desc].include?(@ordering) ? @ordering : :desc

works_scope = @collection.works.includes(:work_statistic, :deeds)
if params[:show] == 'need_transcription'
works_scope = works_scope.joins(:work_statistic)
.where('work_statistics.transcribed_percentage < ?', 100)
.where('work_statistics.transcribed_percentage < ?', 100)
.where('work_statistics.needs_review = ?', 0)
end

if params[:search]
query = "%#{params[:search].to_s.downcase}%"
works_scope = works_scope.where(
'LOWER(works.title) LIKE :search OR LOWER(works.searchable_metadata) like :search',
search: "%#{query}%"
)
end

case @sorting
when :activity
works_scope = works_scope.left_joins(:deeds)
.reorder(Arel.sql("COALESCE((SELECT created_at FROM deeds WHERE deeds.work_id = works.id ORDER BY created_at DESC LIMIT 1), works.created_on) #{@ordering}"))
when :collaboration
works_scope = works_scope.reorder(restrict_scribes: @ordering)
else
works_scope = works_scope.reorder(title: @ordering)
end

works_scope = works_scope.distinct.paginate(page: params[:page], per_page: DEFAULT_WORKS_PER_PAGE)
@works = works_scope
end
end
119 changes: 78 additions & 41 deletions app/controllers/document_sets_controller.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
class DocumentSetsController < ApplicationController

DEFAULT_WORKS_PER_PAGE = 15

before_action :authorized?
before_action :set_document_set, only: [:show, :edit, :update, :destroy]

respond_to :html

def authorized?
unless user_signed_in? && @collection && current_user.like_owner?(@collection)
ajax_redirect_to dashboard_path
end
end

def transfer_form
end

Expand Down Expand Up @@ -42,8 +39,8 @@ def transfer
end

def index
page = params[:page]
page = 1 if page.blank?
page = params[:page].presence || 1

if params[:search]
@works = @collection.search_works(params[:search]).order(:title).paginate(page: page, per_page: 20)
else
Expand Down Expand Up @@ -124,6 +121,16 @@ def assign_to_set
redirect_to collection_works_list_path(@collection.owner, @collection)
end

def update_works
document_set = DocumentSet.friendly.find(update_works_params[:document_set_id])
@result = DocumentSet::UpdateWorks.new(
document_set: document_set,
work_params: update_works_params[:works]
).call

respond_to(&:turbo_stream)
end

def remove_from_set
@collection = DocumentSet.friendly.find(params[:collection_id])
ids = params[:work].keys.map {|id| id.to_i}
Expand All @@ -134,20 +141,23 @@ def remove_from_set
end

def update
@result = DocumentSet::Update.call(document_set: @document_set, document_set_params: document_set_params)

if request.xhr?
render json: {
success: @result.success?,
updated_field: @result.updated_fields_hash,
errors: @result.errors
}
elsif @result.success?
flash[:notice] = t('.document_updated')
redirect_to collection_settings_path(@document_set.owner, @document_set)
else
@document_set = @result.document_set
render :settings, status: :unprocessable_entity
@result = DocumentSet::Update.new(
document_set: @document_set,
document_set_params: document_set_params
).call

@document_set = @result.document_set

respond_to do |format|
template = case params[:scope]
when 'edit_privacy'
@collaborators = @document_set.collaborators
'document_sets/update_privacy'
else
'document_sets/update_general'
end

format.turbo_stream { render template }
end
end

Expand All @@ -161,19 +171,13 @@ def settings_privacy
end

def settings_works
if params[:search]
@works = @collection.search_collection_works(params[:search])
.where.not(id: @collection.work_ids)
.order(:title)
.paginate(page: params[:page], per_page: 20)
else
@works = @collection.collection.works
.where.not(id: @collection.work_ids)
.order(:title)
.paginate(page: params[:page], per_page: 20)
end

filtered_set_works
@document_set ||= @collection

respond_to do |format|
format.html
format.turbo_stream
end
end

def add_set_collaborator
Expand All @@ -197,20 +201,19 @@ def remove_set_collaborator
redirect_to collection_edit_set_collaborators_path(@collection.owner, @collection, @document_set)
end

def toggle_privacy
@result = DocumentSet::TogglePrivacy.call(document_set: @collection)

@collection = @result.document_set
redirect_to collection_settings_privacy_path(@collection.owner, @collection)
end

def destroy
@document_set.destroy
redirect_to action: 'index', collection_id: @document_set.collection_id
end

private

def authorized?
unless user_signed_in? && @collection && current_user.like_owner?(@collection)
ajax_redirect_to dashboard_path
end
end

def set_document_set
unless (defined? @document_set) && @document_set
id = params[:document_set_id] || params[:id]
Expand All @@ -222,4 +225,38 @@ def document_set_params
params.require(:document_set).permit(:is_public, :owner_user_id, :collection_id, :title, :description, :picture, :slug)
end

def filtered_set_works
@ordering = (params[:order] || 'ASC').downcase.to_sym
@ordering = [:asc, :desc].include?(@ordering) ? @ordering : :desc

set_works = @collection.works
collection_works = @collection.collection.works

works_scope = if params[:show] == 'included'
set_works
elsif params[:show] == 'not_included'
collection_works.where.not(id: set_works.select(:id))
else
collection_works
end

works_scope = works_scope.includes(:work_statistic).reorder(title: @ordering)

if params[:search]
query = "%#{params[:search].to_s.downcase}%"
works_scope = works_scope.where(
'LOWER(works.title) LIKE :search OR LOWER(works.searchable_metadata) like :search',
search: "%#{query}%"
)
end

works_scope = works_scope.distinct.paginate(page: params[:page], per_page: DEFAULT_WORKS_PER_PAGE)
@works = works_scope
@set_work_ids = set_works.pluck(:id)
end

def update_works_params
params.permit(:document_set_id, works: {})
end

end
5 changes: 4 additions & 1 deletion app/controllers/export_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ class ExportController < ApplicationController
def index
filtered_data

render partial: 'table' if request.xhr?
respond_to do |format|
format.html
format.turbo_stream
end
end

def show
Expand Down
5 changes: 4 additions & 1 deletion app/controllers/notes_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ class NotesController < ApplicationController
def index
filtered_notes

render partial: 'table' if request.xhr?
respond_to do |format|
format.html
format.turbo_stream
end
end

def create
Expand Down
Loading

0 comments on commit 9793ec2

Please sign in to comment.