Document's filtering in sub-folders

This commit is contained in:
karel.picman@lbcfree.net 2020-06-26 12:40:13 +02:00
parent a4a00828d1
commit f4d35a8a50
2 changed files with 30 additions and 34 deletions

View File

@ -82,6 +82,7 @@ class DmsfQuery < Query
def base_scope def base_scope
unless @scope unless @scope
statement # We need statement before scope due to the current folder filtering
@scope = [dmsf_folders_scope, dmsf_folder_links_scope, dmsf_files_scope, dmsf_file_links_scope, dmsf_url_links_scope]. @scope = [dmsf_folders_scope, dmsf_folder_links_scope, dmsf_files_scope, dmsf_file_links_scope, dmsf_url_links_scope].
inject(:union_all) inject(:union_all)
end end
@ -110,14 +111,16 @@ class DmsfQuery < Query
def statement def statement
unless @statement unless @statement
@filter_dmsf_folder_id = false
filters_clauses = [] filters_clauses = []
filters.each_key do |field| filters.each_key do |field|
v = values_for(field).clone v = values_for(field).clone
next unless v and !v.empty? next unless v and !v.empty?
operator = operator_for(field) operator = operator_for(field)
if field == 'author' case field
when 'author'
if v.delete('me') if v.delete('me')
v.push User.current.id.to_s v.push User.current.id.to_s
end end
end end
filters_clauses << '(' + sql_for_field(field, operator, v, queried_table_name, field) + ')' filters_clauses << '(' + sql_for_field(field, operator, v, queried_table_name, field) + ')'
@ -183,13 +186,11 @@ class DmsfQuery < Query
0 AS sort #{cf_columns}}). 0 AS sort #{cf_columns}}).
joins('LEFT JOIN users ON dmsf_folders.user_id = users.id'). joins('LEFT JOIN users ON dmsf_folders.user_id = users.id').
visible(!deleted) visible(!deleted)
if deleted if dmsf_folder_id
scope.where dmsf_folders: { project_id: project.id, deleted: deleted } scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id, deleted: deleted }
else else
if filters.any? if filters.any? || deleted
scope.where dmsf_folders: { project_id: project.id, deleted: deleted } scope.where dmsf_folders: { project_id: project.id, deleted: deleted }
elsif dmsf_folder_id
scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id, deleted: deleted }
else else
scope.where dmsf_folders: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted } scope.where dmsf_folders: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted }
end end
@ -224,13 +225,11 @@ class DmsfQuery < Query
0 AS sort #{cf_columns}}). 0 AS sort #{cf_columns}}).
joins('LEFT JOIN dmsf_folders ON dmsf_links.target_id = dmsf_folders.id'). joins('LEFT JOIN dmsf_folders ON dmsf_links.target_id = dmsf_folders.id').
joins('LEFT JOIN users ON users.id = COALESCE(dmsf_folders.user_id, dmsf_links.user_id)') joins('LEFT JOIN users ON users.id = COALESCE(dmsf_folders.user_id, dmsf_links.user_id)')
if deleted if dmsf_folder_id
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, deleted: deleted } scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id, deleted: deleted }
else else
if filters.any? if filters.any? || deleted
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, deleted: deleted } scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, deleted: deleted }
elsif dmsf_folder_id
scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id, deleted: deleted }
else else
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, dmsf_folder_id: nil, deleted: deleted } scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, dmsf_folder_id: nil, deleted: deleted }
end end
@ -266,17 +265,15 @@ class DmsfQuery < Query
joins(:dmsf_file_revisions). joins(:dmsf_file_revisions).
joins('LEFT JOIN users ON dmsf_file_revisions.user_id = users.id '). joins('LEFT JOIN users ON dmsf_file_revisions.user_id = users.id ').
where('dmsf_file_revisions.created_at = (SELECT MAX(r.created_at) FROM dmsf_file_revisions r WHERE r.dmsf_file_id = dmsf_file_revisions.dmsf_file_id)') where('dmsf_file_revisions.created_at = (SELECT MAX(r.created_at) FROM dmsf_file_revisions r WHERE r.dmsf_file_id = dmsf_file_revisions.dmsf_file_id)')
if deleted if dmsf_folder_id
scope.where dmsf_files: { project_id: project.id, deleted: deleted }
else
if filters.any?
scope.where dmsf_files: { project_id: project.id, deleted: deleted }
elsif dmsf_folder_id
scope.where dmsf_files: { dmsf_folder_id: dmsf_folder_id, deleted: deleted } scope.where dmsf_files: { dmsf_folder_id: dmsf_folder_id, deleted: deleted }
else else
scope.where dmsf_files: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted } if filters.any? || deleted
scope.where dmsf_files: { project_id: project.id, deleted: deleted }
else
scope.where dmsf_files: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted }
end
end end
end
end end
def dmsf_file_links_scope def dmsf_file_links_scope
@ -309,17 +306,16 @@ class DmsfQuery < Query
joins('JOIN dmsf_file_revisions ON dmsf_file_revisions.dmsf_file_id = dmsf_files.id'). joins('JOIN dmsf_file_revisions ON dmsf_file_revisions.dmsf_file_id = dmsf_files.id').
joins('LEFT JOIN users ON dmsf_file_revisions.user_id = users.id '). joins('LEFT JOIN users ON dmsf_file_revisions.user_id = users.id ').
where('dmsf_file_revisions.created_at = (SELECT MAX(r.created_at) FROM dmsf_file_revisions r WHERE r.dmsf_file_id = dmsf_file_revisions.dmsf_file_id)') where('dmsf_file_revisions.created_at = (SELECT MAX(r.created_at) FROM dmsf_file_revisions r WHERE r.dmsf_file_id = dmsf_file_revisions.dmsf_file_id)')
if deleted if dmsf_folder_id
scope.where project_id: project.id, deleted: deleted scope.where dmsf_links: { target_type: 'DmsfFile', dmsf_folder_id: dmsf_folder_id, deleted: deleted }
else else
if filters.any? if filters.any? || deleted
scope.where project_id: project.id, deleted: deleted scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id, deleted: deleted }
elsif dmsf_folder_id
scope.where dmsf_folder_id: dmsf_folder_id, deleted: deleted
else else
scope.where project_id: project.id, dmsf_folder_id: nil, deleted: deleted scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id, dmsf_folder_id: nil, deleted: deleted }
end end
end end
end end
def dmsf_url_links_scope def dmsf_url_links_scope
@ -349,17 +345,16 @@ class DmsfQuery < Query
dmsf_links.deleted AS deleted, dmsf_links.deleted AS deleted,
1 AS sort #{cf_columns}}). 1 AS sort #{cf_columns}}).
joins('LEFT JOIN users ON dmsf_links.user_id = users.id ') joins('LEFT JOIN users ON dmsf_links.user_id = users.id ')
if deleted if dmsf_folder_id
scope.where target_type: 'DmsfUrl', project_id: project.id, deleted: deleted scope.where dmsf_links: { target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id, deleted: deleted }
else else
if filters.any? if filters.any? || deleted
scope.where target_type: 'DmsfUrl', project_id: project.id, deleted: deleted scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id, deleted: deleted }
elsif dmsf_folder_id
scope.where target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id, deleted: deleted
else else
scope.where target_type: 'DmsfUrl', project_id: project.id, dmsf_folder_id: nil, deleted: deleted scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id, dmsf_folder_id: nil, deleted: deleted }
end end
end end
end end
end end

View File

@ -72,6 +72,7 @@
</div> </div>
<%= form_tag(dmsf_folder_path(id: @project, folder_id: @folder), method: :get, id: 'query_form', class: 'dmsf-query-form') do %> <%= form_tag(dmsf_folder_path(id: @project, folder_id: @folder), method: :get, id: 'query_form', class: 'dmsf-query-form') do %>
<%= hidden_field_tag('folder_id', @folder.id) if @folder %>
<%= render partial: 'queries/query_form' %> <%= render partial: 'queries/query_form' %>
<% end %> <% end %>
<%= render partial: 'query_list', locals: { query: @query, dmsf_pages: @dmsf_pages } %> <%= render partial: 'query_list', locals: { query: @query, dmsf_pages: @dmsf_pages } %>