diff --git a/after_init.rb b/after_init.rb index 2a191f38..fb1e85a5 100644 --- a/after_init.rb +++ b/after_init.rb @@ -62,8 +62,8 @@ def dmsf_init pmap.permission :email_documents, {:dmsf_public_urls => [:create]} pmap.permission :folder_manipulation, - {:dmsf => [:new, :create, :delete, :edit, :save, :edit_root, :save_root, :lock, :unlock, - :notify_activate, :notify_deactivate, :restore], + { dmsf: [:new, :create, :delete, :edit, :save, :edit_root, :save_root, :lock, :unlock, + :notify_activate, :notify_deactivate, :restore, :drop], :dmsf_folder_permissions => [:new, :append, :autocomplete_for_user], :dmsf_folders_copy => [:new, :copy, :move], :dmsf_context_menus => [:dmsf]} diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 92231d52..36d9eeba 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -431,6 +431,46 @@ class DmsfController < ApplicationController end end + # Move the dragged object to the given destination + def drop + result = false + if params[:dmsf_folder].present? && params[:dmsf_folder][:drag_id].present? && params[:dmsf_folder][:drop_id].present? + if params[:dmsf_folder][:drag_id] =~ /(.+)-(\d+)/ + type = $1 + id = $2 + if params[:dmsf_folder][:drop_id] =~ /^folder.*-(\d+)/ + case type + when 'file' + dmsf_file = DmsfFile.find_by(id: id) + dmsf_folder = DmsfFolder.find_by(id: $1) + if dmsf_file && dmsf_folder + result = dmsf_file.move_to(dmsf_file.project, dmsf_folder) + end + when 'folder' + dmsf_folder = DmsfFolder.find_by(id: id) + if dmsf_folder + dmsf_folder.dmsf_folder_id = $1; + result = dmsf_folder.save + end + when 'file-link', 'folder-link', 'url-link' + dmsf_link = DmsfLink.find_by(id: id) + if dmsf_link + dmsf_link.dmsf_folder_id = $1; + result = dmsf_link.save + end + end + end + end + end + respond_to do |format| + if result + format.js { head 200 } + else + format.js { head 422 } + end + end + end + private def users_for_new_users @@ -659,7 +699,7 @@ class DmsfController < ApplicationController @file_delete_allowed = User.current.allowed_to?(:file_delete, @project) @file_view_allowed = User.current.allowed_to?(:view_dmsf_files, @project) @force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @project) - @workflows_available = DmsfWorkflow.where(['project_id = ? OR project_id IS NULL', @project.id]).exists? + @workflows_available = DmsfWorkflow.where(project_id: @project.id).or(DmsfWorkflow.where(project_id: nil)).exists? @file_approval_allowed = User.current.allowed_to?(:file_approval, @project) tag = params[:custom_field_id].present? && params[:custom_value].present? @extra_columns = [l(:label_last_approver), l(:field_project), l(:label_document_url), l(:label_last_revision_id)] diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index f028757f..5445b4e0 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -577,15 +577,23 @@ class DmsfFolder < ActiveRecord::Base end def css_classes - classes = ['dir'] - if title =~ /^\./ + classes = [] + + if type =~ /^\./ classes << 'dmsf_system' else classes << 'hascontextmenu' - if ['folder-link', 'file-link'].include?(type) + if type =~ /^folder/ + classes << 'dmsf-droppable' + classes << 'dmsf-draggable' + else + classes << 'dmsf-draggable' + end + if type =~ /link$/ classes << 'dmsf_gray' end end + classes.join(' ') end diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index 8739b062..7d7df15d 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -292,9 +292,9 @@ class DmsfQuery < Query 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)') if deleted - scope.where(dmsf_files: { project_id: project.id, deleted: deleted }) + scope.where(project_id: project.id, deleted: deleted) else - scope.where(dmsf_files: { project_id: project.id, dmsf_folder_id: dmsf_folder_id, deleted: deleted }) + scope.where(project_id: project.id, dmsf_folder_id: dmsf_folder_id, deleted: deleted) end end diff --git a/app/views/dmsf/_query_list.html.erb b/app/views/dmsf/_query_list.html.erb index 3c856a09..7469b53f 100644 --- a/app/views/dmsf/_query_list.html.erb +++ b/app/views/dmsf/_query_list.html.erb @@ -49,10 +49,15 @@ <%= check_box_tag('ids[]', "#{node.type}-#{node.id}", false, id: nil) unless system %> <% query.inline_columns.each do |column| %> - <%= content_tag('td', column_content(column, node), class: column.css_classes) %> + <%= content_tag 'td', column_content(column, node), class: column.css_classes %> <% end %> - <%= link_to_context_menu unless system %> + <% unless system %> + <% unless query.deleted %> + <%= content_tag 'span', '', class: 'icon-only icon-sort-handle sort-handle', title: l(:button_move) %> + <% end %> + <%= link_to_context_menu %> + <% end %> <% end %> @@ -60,3 +65,38 @@ <% end %> + +<% unless query.deleted %> + <%= late_javascript_tag do %> + $(function() { + $(".dmsf-draggable").draggable({ + axis: "y", + revert: "invalid" + }); + $(".dmsf-droppable" ).droppable({ + drop: function(event, ui) { + var handle = $(this); + var dragObjectId = ui.draggable.find("td").find("input").val() + var dropObjectId = handle.find("td").find("input").val(); + var data = {}; + handle.addClass("ui-state-highlight ajax-loading") + data['dmsf_folder'] = { drag_id: dragObjectId, drop_id: dropObjectId}; + $.ajax({ + url: '<%= dmsf_folder_url(query.project) %>', + type: 'put', + dataType: 'script', + data: data, + error: function(jqXHR, textStatus, errorThrown){ + alert(textStatus + " " + jqXHR.status); + ui.draggable.animate(ui.draggable.data("ui-draggable").originalPosition, "slow"); + }, + complete: function(jqXHR, textStatus, errorThrown){ + handle.removeClass("ui-state-highlight ajax-loading") + ui.draggable.remove(); + } + }); + } + }); + }); + <% end %> +<% end %> diff --git a/config/routes.rb b/config/routes.rb index d18d7b09..d8ef35f5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -54,6 +54,7 @@ if Redmine::Plugin.installed? :redmine_dmsf get '/projects/:id/dmsf/add_email', :controller => 'dmsf', :action => 'add_email', :as => 'add_email_dmsf' post '/projects/:id/dmsf/append_email', :controller => 'dmsf', :action => 'append_email', :as => 'append_email_dmsf' get '/projects/:id/dmsf/autocomplete_for_user', :controller => 'dmsf', :action => 'autocomplete_for_user' + put '/projects/:id/dmsf', controller: 'dmsf', action: 'drop' # dmsf_context_menu_controller match '/projects/:id/dmsf/context_menu', :to => 'dmsf_context_menus#dmsf', :as => 'dmsf_context_menu', :via => [:get, :post] diff --git a/lib/redmine_dmsf/patches/queries_helper_patch.rb b/lib/redmine_dmsf/patches/queries_helper_patch.rb index 07109153..6e7b8aec 100644 --- a/lib/redmine_dmsf/patches/queries_helper_patch.rb +++ b/lib/redmine_dmsf/patches/queries_helper_patch.rb @@ -76,7 +76,7 @@ module RedmineDmsf when :size number_to_human_size(value) when :workflow - if value + if value && item.workflow_id link_to h(DmsfWorkflowStepAction.workflow_str(value)), log_dmsf_workflow_path(project_id: item.project_id, id: item.workflow_id, dmsf_file_revision_id: item.revision_id),