diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 09e348a0..575de19e 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -51,7 +51,10 @@ class DmsfController < ApplicationController def expand_folder @idnt = params[:idnt].present? ? params[:idnt].to_i + 1 : 0 - @query.dmsf_folder_id = @folder.id + if params[:project_id].present? + @query.project = Project.find_by(id: params[:project_id]) + end + @query.dmsf_folder_id = @folder&.id @query.deleted = false respond_to do |format| format.js { render action: 'query_rows' } diff --git a/app/helpers/dmsf_queries_helper.rb b/app/helpers/dmsf_queries_helper.rb index 944a5ede..888842de 100644 --- a/app/helpers/dmsf_queries_helper.rb +++ b/app/helpers/dmsf_queries_helper.rb @@ -85,13 +85,19 @@ module DmsfQueriesHelper end when :title case item.type + when 'project' + tag = link_to(h("[#{value}]"), dmsf_folder_path(id: item.project), class: 'icon icon-folder') + unless filter_any? + tag = "".html_safe + tag + end + tag + content_tag('div', item.filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) when 'folder' if item&.deleted > 0 tag = content_tag('span', value, class: 'icon icon-folder') else tag = link_to(h(value), dmsf_folder_path(id: item.project, folder_id: item.id), class: 'icon icon-folder') unless filter_any? - tag = "".html_safe + tag + tag = "".html_safe + tag end end tag + content_tag('div', item.filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index 5d943e6d..6d691ab8 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -565,7 +565,7 @@ class DmsfFolder < ActiveRecord::Base end else classes << 'dmsf-tree' - if type == 'folder' + if %(folder project).include?(type) classes << 'dmsf-collapsed' classes << 'dmsf-not-loaded' else @@ -574,8 +574,10 @@ class DmsfFolder < ActiveRecord::Base if title =~ /^\./ classes << 'dmsf-system' else - classes << 'hascontextmenu' - classes << 'dmsf-draggable' + if (type != 'project') + classes << 'hascontextmenu' + classes << 'dmsf-draggable' + end if type =~ /^folder/ classes << 'dmsf-droppable' end diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index 3af146e3..dc55e722 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -82,7 +82,7 @@ class DmsfQuery < Query def base_scope unless @scope - @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_projects_scope, dmsf_files_scope, dmsf_file_links_scope, dmsf_url_links_scope]. inject(:union_all) end @scope @@ -171,11 +171,15 @@ class DmsfQuery < Query limit(options[:limit]). offset(options[:offset]).to_a items.each do |item| - if item.type == 'folder' + case item.type + when 'folder' dmsf_folder = DmsfFolder.find_by(id: item.id) if dmsf_folder && (!DmsfFolder.permissions?(dmsf_folder, false)) items.delete item end + when 'project' + p = Project.find_by(id: item.id) + items.delete(item) unless p&.dmsf_available? end end items @@ -187,6 +191,40 @@ class DmsfQuery < Query private + def dmsf_projects_scope + cf_columns = +'' + if statement.present? + DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id| + cf_columns << ",NULL AS cf_#{id}" + end + end + scope = Project. + select(%{ + projects.id AS id, + projects.id AS project_id, + CAST(NULL AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS revision_id, + projects.name AS title, + projects.identifier AS filename, + CAST(NULL AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS size, + projects.updated_on AS updated, + CAST(NULL AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS major_version, + CAST(NULL AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS minor_version, + CAST(NULL AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS workflow, + CAST(NULL AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS workflow_id, + '' AS firstname, + '' AS lastname, + CAST(NULL AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS author, + 'project' AS type, + CAST(0 AS #{ActiveRecord::Base.connection.type_to_sql(:decimal)}) AS deleted, + 0 AS sort #{cf_columns}}).visible + if dmsf_folder_id || deleted + scope.where '1=0' + else + scope = scope.non_templates if scope.respond_to?(:non_templates) + scope.where projects: { parent_id: project.id } + end + end + def dmsf_folders_scope cf_columns = +'' if statement.present? @@ -212,7 +250,7 @@ class DmsfQuery < Query users.id AS author, 'folder' AS type, dmsf_folders.deleted AS deleted, - 0 AS sort #{cf_columns}}). + 1 AS sort #{cf_columns}}). joins('LEFT JOIN users ON dmsf_folders.user_id = users.id') if deleted scope = scope.deleted @@ -255,7 +293,7 @@ class DmsfQuery < Query users.id AS author, 'folder-link' AS type, dmsf_links.deleted AS deleted, - 0 AS sort #{cf_columns}}). + 1 AS sort #{cf_columns}}). 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)') if dmsf_folder_id @@ -294,7 +332,7 @@ class DmsfQuery < Query users.id AS author, 'file' AS type, dmsf_files.deleted AS deleted, - 1 AS sort #{cf_columns}}). + 2 AS sort #{cf_columns}}). joins(:dmsf_file_revisions). joins('LEFT JOIN users ON dmsf_file_revisions.user_id = users.id '). where(sub_query) @@ -334,7 +372,7 @@ class DmsfQuery < Query users.id AS author, 'file-link' AS type, dmsf_links.deleted AS deleted, - 1 AS sort #{cf_columns}}). + 2 AS sort #{cf_columns}}). joins('JOIN dmsf_files ON dmsf_files.id = dmsf_links.target_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 '). @@ -376,7 +414,7 @@ class DmsfQuery < Query users.id AS author, 'url-link' AS type, dmsf_links.deleted AS deleted, - 1 AS sort #{cf_columns}}). + 2 AS sort #{cf_columns}}). joins('LEFT JOIN users ON dmsf_links.user_id = users.id ') if dmsf_folder_id scope.where dmsf_links: { target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id, deleted: deleted } diff --git a/app/views/dmsf/_query_rows.erb b/app/views/dmsf/_query_rows.erb index 11914b8b..8622df65 100644 --- a/app/views/dmsf/_query_rows.erb +++ b/app/views/dmsf/_query_rows.erb @@ -27,11 +27,18 @@ <% end %> <% query.dmsf_nodes(options).each do |node| %> <% system = node.title =~ /^\./ %> - <% id = (node.type == 'folder') ? "#{node.id}span" : "#{node.id}item" %> + <% case node.type %> + <% when 'project'%> + <% id = "#{node.id}pspan" %> + <% when 'folder' %> + <% id = "#{node.id}fspan" %> + <% else %> + <% id = "#{node.id}item" %> + <% end %> <% @idnt ||= 0 %>