This commit is contained in:
Karel Pičman 2020-02-20 15:27:47 +01:00
parent 3f6a722bcb
commit ce8b049ece
7 changed files with 100 additions and 11 deletions

View File

@ -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]}

View File

@ -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)]

View File

@ -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

View File

@ -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

View File

@ -49,10 +49,15 @@
<%= check_box_tag('ids[]', "#{node.type}-#{node.id}", false, id: nil) unless system %>
</td>
<% 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 %>
<td class="buttons">
<%= 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 %>
</td>
</tr>
<% end %>
@ -60,3 +65,38 @@
</table>
</div>
<% 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 %>

View File

@ -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]

View File

@ -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),