Merge branch 'devel-1.6.0' into devel-1.6.0
This commit is contained in:
commit
091d4c5e9e
@ -616,7 +616,8 @@ class DmsfController < ApplicationController
|
||||
|
||||
def find_folder_by_title
|
||||
# find by title has to be scoped to project
|
||||
@folder = DmsfFolder.find_by(title: params[:folder_title], project_id: params[:id]) if params[:folder_title].present?
|
||||
project = Project.find(params[:id])
|
||||
@folder = DmsfFolder.find_by(title: params[:folder_title], project_id: project.id) if params[:folder_title].present?
|
||||
rescue DmsfAccessError
|
||||
render_403
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
|
||||
@ -87,7 +87,7 @@ class DmsfLinksController < ApplicationController
|
||||
@dmsf_link.project_id = params[:dmsf_link][:project_id]
|
||||
@dmsf_link.dmsf_folder_id = params[:dmsf_link][:dmsf_folder_id]
|
||||
else
|
||||
# An issue link
|
||||
# A container link
|
||||
@dmsf_link.project_id = -1
|
||||
@dmsf_link.dmsf_folder_id = nil
|
||||
end
|
||||
|
||||
@ -24,11 +24,11 @@ class DmsfUploadController < ApplicationController
|
||||
|
||||
menu_item :dmsf
|
||||
|
||||
before_action :find_project, :except => [:upload, :delete_dmsf_attachment]
|
||||
before_action :authorize, :except => [:upload, :delete_dmsf_attachment]
|
||||
before_action :authorize_global, :only => [:upload, :delete_dmsf_attachment]
|
||||
before_action :find_folder, :except => [:upload_file, :upload, :commit, :delete_dmsf_attachment]
|
||||
before_action :permissions, :except => [:upload_file, :upload, :commit, :delete_dmsf_attachment]
|
||||
before_action :find_project, :except => [:upload, :delete_dmsf_attachment, :delete_dmsf_link_attachment]
|
||||
before_action :authorize, :except => [:upload, :delete_dmsf_attachment, :delete_dmsf_link_attachment]
|
||||
before_action :authorize_global, :only => [:upload, :delete_dmsf_attachment, :delete_dmsf_link_attachment]
|
||||
before_action :find_folder, :except => [:upload_file, :upload, :commit, :delete_dmsf_attachment, :delete_dmsf_link_attachment]
|
||||
before_action :permissions, :except => [:upload_file, :upload, :commit, :delete_dmsf_attachment, :delete_dmsf_link_attachment]
|
||||
|
||||
helper :all
|
||||
helper :dmsf_workflows
|
||||
@ -75,7 +75,7 @@ class DmsfUploadController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# REST API document upload
|
||||
# REST API and Redmine attachment form
|
||||
def upload
|
||||
unless request.content_type == 'application/octet-stream'
|
||||
render :nothing => true, :status => 406
|
||||
@ -130,6 +130,13 @@ class DmsfUploadController < ApplicationController
|
||||
render_404
|
||||
end
|
||||
|
||||
def delete_dmsf_link_attachment
|
||||
link = DmsfLink.find(params[:id])
|
||||
link.destroy
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def commit_files_internal(commited_files)
|
||||
|
||||
@ -321,7 +321,7 @@ class DmsfWorkflowsController < ApplicationController
|
||||
end
|
||||
|
||||
def new_step
|
||||
@steps = @dmsf_workflow.dmsf_workflow_steps.select('step, MAX(name) AS name').group(:step)
|
||||
@steps = @dmsf_workflow.dmsf_workflow_steps.select('step, MAX(name) AS name').group(:step, :operator)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
@ -332,7 +332,7 @@ class DmsfWorkflowsController < ApplicationController
|
||||
def add_step
|
||||
if request.post?
|
||||
if params[:step] == '0'
|
||||
step = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.distinct.count + 1
|
||||
step = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq.count + 1
|
||||
else
|
||||
step = params[:step].to_i
|
||||
end
|
||||
|
||||
@ -59,10 +59,12 @@ module DmsfHelper
|
||||
extension = File.extname(filename)
|
||||
extension = extension[1, extension.length-1]
|
||||
if File.exist?("#{File.dirname(__FILE__)}/../../assets/images/filetypes/#{extension}.png")
|
||||
"filetype-#{extension}";
|
||||
cls = "filetype-#{extension}";
|
||||
else
|
||||
Redmine::MimeType.css_class_of(filename)
|
||||
cls = Redmine::MimeType.css_class_of(filename)
|
||||
end
|
||||
cls << ' dmsf-icon-file' if cls
|
||||
cls
|
||||
end
|
||||
|
||||
def plugin_asset_path(plugin, asset_type, source)
|
||||
|
||||
@ -507,7 +507,7 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def extension
|
||||
$1 if self.last_revision && self.last_revision.disk_filename =~ /\.(.+)$/
|
||||
File.extname(self.last_revision.disk_filename).strip.downcase[1..-1] if self.last_revision
|
||||
end
|
||||
|
||||
include ActionView::Helpers::NumberHelper
|
||||
|
||||
@ -83,45 +83,45 @@
|
||||
<td class="dmsf_buttons">
|
||||
<% if @folder_manipulation_allowed && !(subfolder && subfolder.system) %>
|
||||
<% if subfolder && subfolder.locked? %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% if subfolder.unlockable? && (!subfolder.locked_for_user? || @force_file_unlock_allowed) %>
|
||||
<%= link_to('', unlock_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => subfolder.get_locked_title,
|
||||
:class => 'icon icon-unlock') %>
|
||||
:class => 'icon-only icon-unlock') %>
|
||||
<% else %>
|
||||
<span class="icon icon-unlock" title="<%= subfolder.get_locked_title %>"></span>
|
||||
<span class="icon-only icon-unlock" title="<%= subfolder.get_locked_title %>"></span>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<% if subfolder %>
|
||||
<%= link_to('', edit_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:link_edit, :title => h(subfolder.title)),
|
||||
:class => 'icon icon-edit') %>
|
||||
:class => 'icon-only icon-edit') %>
|
||||
<% else %>
|
||||
<%= link_to('', edit_root_dmsf_path(:id => @project),
|
||||
:title => l(:link_edit, :title => l(:link_documents)),
|
||||
:class => 'icon icon-edit') %>
|
||||
:class => 'icon-only icon-edit') %>
|
||||
<% end %>
|
||||
<% if subfolder %>
|
||||
<%= link_to('', lock_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_lock_file),
|
||||
:class => 'icon icon-lock') %>
|
||||
:class => 'icon-only icon-lock') %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% if (subfolder && subfolder.notification) || (!subfolder && project.dmsf_notification) %>
|
||||
<%= link_to('', notify_deactivate_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
:class => 'icon icon-email') %>
|
||||
:class => 'icon-only icon-email') %>
|
||||
<% else %>
|
||||
<%= link_to('', notify_activate_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_notifications_not_active_activate),
|
||||
:class => 'icon icon-email-add') %>
|
||||
:class => 'icon-only icon-email-add') %>
|
||||
<% end %>
|
||||
<%= link_to('', link ? dmsf_link_path(link) : delete_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete),
|
||||
:method => :delete,
|
||||
:class => 'icon icon-del') %>
|
||||
:class => 'icon-only icon-del') %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
|
||||
@ -69,19 +69,19 @@
|
||||
<% if @folder_manipulation_allowed %>
|
||||
<%= link_to('', link ? restore_dmsf_link_path(:id => link) : restore_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_restore),
|
||||
:class => 'icon icon-cancel') %>
|
||||
:class => 'icon-only icon-cancel') %>
|
||||
<% if link %>
|
||||
<%= link_to('', dmsf_link_path(:id => link, :commit => 'yes'),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:method => :delete,
|
||||
:title => l(:title_delete),
|
||||
:class => 'icon icon-delete') %>
|
||||
:class => 'icon-only icon-delete') %>
|
||||
<% else %>
|
||||
<%= link_to('', delete_dmsf_path(:id => project, :folder_id => subfolder, :commit => 'yes'),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete),
|
||||
:method => :delete,
|
||||
:class => 'icon icon-delete') %>
|
||||
:class => 'icon-only icon-del') %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
|
||||
@ -89,48 +89,48 @@
|
||||
<% if @file_manipulation_allowed %>
|
||||
<%= link_to('', dmsf_file_path(:id => file),
|
||||
:title => l(:link_details, :title => h(file.last_revision.title)),
|
||||
:class => 'icon icon-edit') %>
|
||||
:class => 'icon-only icon-edit') %>
|
||||
<% if !file.locked? %>
|
||||
<%= link_to('', lock_dmsf_files_path(:id => file),
|
||||
:title => l(:title_lock_file),
|
||||
:class => 'icon icon-lock') %>
|
||||
:class => 'icon-only icon-lock') %>
|
||||
<% elsif file.unlockable? && (!file.locked_for_user? || @force_file_unlock_allowed) %>
|
||||
<%= link_to('', unlock_dmsf_files_path(:id => file),
|
||||
:title => file.get_locked_title,
|
||||
:class => 'icon icon-unlock') %>
|
||||
:class => 'icon-only icon-unlock') %>
|
||||
<% else %>
|
||||
<span class="icon icon-unlock" title="<%= file.get_locked_title %>"></span>
|
||||
<span class="icon-only icon-unlock" title="<%= file.get_locked_title %>"></span>
|
||||
<% end %>
|
||||
<% unless file.locked? %>
|
||||
<% if file.notification %>
|
||||
<%= link_to('', notify_deactivate_dmsf_files_path(:id => file),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
:class => 'icon icon-email') %>
|
||||
:class => 'icon-only icon-email') %>
|
||||
<% else %>
|
||||
<%= link_to('', notify_activate_dmsf_files_path(:id => file),
|
||||
:title => l(:title_notifications_not_active_activate),
|
||||
:class => 'icon icon-email-add') %>
|
||||
:class => 'icon-only icon-email-add') %>
|
||||
<% end %>
|
||||
<% if link %>
|
||||
<%= link_to('', dmsf_link_path(link),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete),
|
||||
:method => :delete,
|
||||
:class => 'icon icon-del') %>
|
||||
:class => 'icon-only icon-del') %>
|
||||
<% else %>
|
||||
<% if @file_delete_allowed %>
|
||||
<%= link_to('', dmsf_file_path(:id => file),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete),
|
||||
:method => :delete,
|
||||
:class => 'icon icon-del') %>
|
||||
:class => 'icon-only icon-del') %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<%= render(:partial => 'dmsf_files/approval_workflow_button',
|
||||
|
||||
@ -69,14 +69,14 @@
|
||||
<% if @file_manipulation_allowed %>
|
||||
<%= link_to('', link ? restore_dmsf_link_path(:id => link) : restore_dmsf_file_path(:id => file),
|
||||
:title => l(:title_restore),
|
||||
:class => 'icon icon-cancel') %>
|
||||
:class => 'icon-only icon-cancel') %>
|
||||
<% end %>
|
||||
<% if @file_delete_allowed %>
|
||||
<%= link_to('', link ? dmsf_link_path(:id => link, :commit => 'yes') : dmsf_file_path(:id => file, :commit => 'yes'),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:method => :delete,
|
||||
:title => l(:title_delete),
|
||||
:class => 'icon icon-delete') %>
|
||||
:class => 'icon-only icon-del') %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="hol">1</td>
|
||||
|
||||
@ -215,7 +215,7 @@
|
||||
<% end %>
|
||||
|
||||
<% if (@file_manipulation_allowed && !@locked_for_user && !@system_folder) %>
|
||||
<%= render(:partial => 'dmsf_upload/multi_upload') %>
|
||||
<%= render(:partial => 'dmsf_upload/multi_upload', :local => { :lbl => true }) %>
|
||||
<% end %>
|
||||
|
||||
<% unless @system_folder %>
|
||||
|
||||
@ -35,12 +35,12 @@
|
||||
:dmsf_file_revision_id => file.last_revision.id),
|
||||
:title => l(:title_waiting_for_approval),
|
||||
:remote => true,
|
||||
:class => 'icon icon-wf-waiting') %>
|
||||
:class => "icon-only icon-wf-waiting") %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% when DmsfWorkflow::STATE_ASSIGNED %>
|
||||
<% if User.current && (file.last_revision.dmsf_workflow_assigned_by == User.current.id) && wf %>
|
||||
@ -49,12 +49,12 @@
|
||||
:id => file.last_revision.dmsf_workflow_id,
|
||||
:dmsf_file_revision_id => file.last_revision.id),
|
||||
:title => l(:label_dmsf_wokflow_action_start),
|
||||
:class => 'icon icon-wf-assigned') %>
|
||||
:class => 'icon-only icon-wf-assigned') %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<% end %>
|
||||
<% when DmsfWorkflow::STATE_APPROVED, DmsfWorkflow::STATE_REJECTED %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% else %>
|
||||
<% if workflows_available %>
|
||||
<%= link_to('',
|
||||
@ -69,9 +69,9 @@
|
||||
:dmsf_file_revision_id => file.last_revision.id),
|
||||
:title => l(:label_dmsf_wokflow_action_assign),
|
||||
:remote => true,
|
||||
:class => 'icon icon-wf-none') %>
|
||||
:class => 'icon-only icon-wf-none') %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@ -78,7 +78,8 @@
|
||||
<div class="box">
|
||||
<p>
|
||||
<%= label_tag('file_upload', l(:label_new_content)) %>
|
||||
<%= render :partial => 'dmsf_upload/form', :locals => { :multiple => false, :container => nil } %>
|
||||
<%= render :partial => 'dmsf_upload/form',
|
||||
:locals => { :multiple => false, :container => nil, :description => false, :awf => false } %>
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
|
||||
@ -46,36 +46,36 @@
|
||||
<% if User.current.allowed_to? :file_manipulation, dmsf_file.project %>
|
||||
<%= link_to('', dmsf_file_path(:id => dmsf_file),
|
||||
:title => l(:link_details, :title => h(dmsf_file.last_revision.title)),
|
||||
:class => 'icon icon-edit') %>
|
||||
:class => 'icon-only icon-edit') %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% # Email %>
|
||||
<%= link_to('', entries_operations_dmsf_path(:id => dmsf_file.project, :email_entries => 'email', :files => [dmsf_file.id]), :method => :post,
|
||||
:title => l(:heading_send_documents_by_email),
|
||||
:class => 'icon icon-email-disabled') %>
|
||||
:class => 'icon-only icon-email-disabled') %>
|
||||
<% # Lock %>
|
||||
<% if !dmsf_file.locked? %>
|
||||
<%= link_to('', lock_dmsf_files_path(:id => dmsf_file),
|
||||
:title => l(:title_lock_file),
|
||||
:class => 'icon icon-lock') %>
|
||||
:class => 'icon-only icon-lock') %>
|
||||
<% elsif dmsf_file.unlockable? && (!dmsf_file.locked_for_user? || User.current.allowed_to?(:force_file_unlock, dmsf_file.project)) %>
|
||||
<%= link_to('', unlock_dmsf_files_path(:id => dmsf_file),
|
||||
:title => dmsf_file.get_locked_title,
|
||||
:class => 'icon icon-unlock') %>
|
||||
:class => 'icon-only icon-unlock') %>
|
||||
<% else %>
|
||||
<span class="icon icon-unlock" title="<%= dmsf_file.get_locked_title %>"></span>
|
||||
<span class="icon-only icon-unlock" title="<%= dmsf_file.get_locked_title %>"></span>
|
||||
<% end %>
|
||||
<% unless dmsf_file.locked? %>
|
||||
<% # Notifications %>
|
||||
<% if dmsf_file.notification %>
|
||||
<%= link_to('', notify_deactivate_dmsf_files_path(:id => dmsf_file),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
:class => 'icon icon-email') %>
|
||||
:class => 'icon-only icon-email') %>
|
||||
<% else %>
|
||||
<%= link_to('', notify_activate_dmsf_files_path(:id => dmsf_file),
|
||||
:title => l(:title_notifications_not_active_activate),
|
||||
:class => 'icon icon-email-add') %>
|
||||
:class => 'icon-only icon-email-add') %>
|
||||
<% end %>
|
||||
<% # Delete %>
|
||||
<% if @issue.attributes_editable? && User.current.allowed_to?(:file_delete, dmsf_file.project) %>
|
||||
@ -84,11 +84,11 @@
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:method => :delete,
|
||||
:title => l(:title_delete),
|
||||
:class => 'icon icon-del') %>
|
||||
:class => 'icon-only icon-del') %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon"></span>
|
||||
<span class="icon-only"></span>
|
||||
<span class="icon-only"></span>
|
||||
<% end %>
|
||||
<% # Approval workflow %>
|
||||
<% wf = DmsfWorkflow.find_by_id(dmsf_file.last_revision.dmsf_workflow_id) if dmsf_file.last_revision.dmsf_workflow_id %>
|
||||
|
||||
@ -24,17 +24,21 @@
|
||||
<% if defined?(thumbnails) && thumbnails %>
|
||||
<% images = links.map{ |x| x[0] }.select(&:image?) %>
|
||||
<% if images.any? %>
|
||||
<div class="thumbnails">
|
||||
<% if link_to # Redmine classic %>
|
||||
<div class="thumbnails">
|
||||
<% end %>
|
||||
<% images.each do |file| %>
|
||||
<div>
|
||||
<% if link_to # Redmine classic %>
|
||||
<%= link_to image_tag(dmsf_thumbnail_path(file)), view_dmsf_file_path(file), :alt => file.title %>
|
||||
<% else # jQuery gallery %>
|
||||
<%= image_tag(dmsf_thumbnail_path(file),
|
||||
{ :'data-fullsrc' => view_dmsf_file_path(file), :alt => file.title }) %>
|
||||
<%= image_tag(dmsf_thumbnail_path(file),
|
||||
{ :'data-fullsrc' => view_dmsf_file_path(file), :alt => file.title }) %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% if link_to # Redmine classic %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@ -81,13 +81,13 @@
|
||||
<div class="fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix">
|
||||
<div class="dataTables_lenght">
|
||||
<div class="dmsf_controls" style="float: right">
|
||||
<%= link_to_function image_tag('rev_downloads.png', :plugin => 'redmine_dmsf'),
|
||||
<%= link_to_function image_tag('group.png'),
|
||||
"$('#revision_access-#{revision.id}').toggle()",
|
||||
:title => l(:title_download_entries) %>
|
||||
<%= link_to image_tag('rev_download.png', :plugin => 'redmine_dmsf'),
|
||||
<%= link_to image_tag('download.png'),
|
||||
view_dmsf_file_path(@file, :download => revision),
|
||||
:title => l(:title_title_version_version_download, :title => h(revision.title), :version => revision.version) %>
|
||||
<%= link_to image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
|
||||
<%= link_to image_tag('delete.png'),
|
||||
delete_revision_path(revision),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete_revision) if @file_delete_allowed && (@file.dmsf_file_revisions.visible.count > 1) %>
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
var linksSpan = $("#dmsf_links_fields");
|
||||
var linksSpan = $("#dmsf_links_attachments_fields");
|
||||
var linkId = "<%= @dmsf_link.id %>";
|
||||
var linkName = "<%= @dmsf_link.name %>";
|
||||
var title = "<%= l(:label_dmsf_wokflow_action_assign) %>";
|
||||
@ -35,4 +35,4 @@ var awf = false;
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
dmsfAddLink(linksSpan, linkId, linkName, title, project, awf);
|
||||
dmsfAddLink(linksSpan, linkId, linkName, title, project, awf, <%= !defined?(EasyExtensions) %>);
|
||||
|
||||
@ -21,30 +21,56 @@
|
||||
%>
|
||||
|
||||
<span id="dmsf_attachments_fields">
|
||||
<% if defined?(container) && container && container.saved_dmsf_attachments.present? %>
|
||||
<% container.saved_dmsf_attachments.each_with_index do |attachment, i| %>
|
||||
<span id="dmsf_attachments_p<%= i %>">
|
||||
<%= text_field_tag("dmsf_attachments[p#{i}][filename]", attachment.filename, :class => 'filename') +
|
||||
text_field_tag("dmsf_attachments[p#{i}][description]", attachment.description, :maxlength => 255,
|
||||
:placeholder => l(:label_optional_description), :class => 'description') +
|
||||
link_to(' '.html_safe, dmsf_attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'),
|
||||
:method => 'delete', :remote => true, :class => 'remove-upload icon icon-del') %>
|
||||
<%= hidden_field_tag "dmsf_attachments[p#{i}][token]", "#{attachment.token}" %>
|
||||
<% wf = container.saved_dmsf_attachments_wfs[attachment.id] %>
|
||||
<% if wf %>
|
||||
<a href="javascript:void(0);" title="<%= l(:title_assigned) %>" class="icon icon-wf-assigned"></a>
|
||||
<%= hidden_field_tag("dmsf_attachments_wfs[p#{i}]", wf.id) if wf %>
|
||||
<% else %>
|
||||
<%= link_to('', assign_dmsf_workflow_path(:id => container.project.id, :project_id => container.project.id,
|
||||
:attachment_id => i + 1), :title => l(:label_dmsf_wokflow_action_assign),
|
||||
:remote => true, :class => 'icon icon-wf-none') %>
|
||||
<% end %>
|
||||
</span>
|
||||
<% if defined?(container) && container && container.saved_dmsf_attachments.present? %>
|
||||
<% container.saved_dmsf_attachments.each_with_index do |attachment, i| %>
|
||||
<span id="dmsf_attachments_p<%= i %>", class="attachment">
|
||||
<%= hidden_field_tag "dmsf_attachments[p#{i}][token]", "#{attachment.token}" %>
|
||||
<%= text_field_tag("dmsf_attachments[p#{i}][filename]", attachment.filename, :class => 'filename') %>
|
||||
<%= text_field_tag("dmsf_attachments[p#{i}][description]", attachment.description, :maxlength => 255,
|
||||
:placeholder => l(:label_optional_description), :class => 'description') if description %>
|
||||
<%= link_to('', dmsf_attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'),
|
||||
:method => 'delete', :remote => true, :class => 'remove-upload icon-only icon-del') %>
|
||||
<% wf = container.saved_dmsf_attachments_wfs[attachment.id] %>
|
||||
<% if wf %>
|
||||
<a href="javascript:void(0);" title="<%= l(:title_assigned) %>" class="icon-only icon-wf-assigned"></a>
|
||||
<%= hidden_field_tag("dmsf_attachments_wfs[p#{i}]", wf.id) if wf %>
|
||||
<% else %>
|
||||
<%= link_to('', assign_dmsf_workflow_path(:id => container.project.id, :project_id => container.project.id,
|
||||
:attachment_id => i + 1), :title => l(:label_dmsf_wokflow_action_assign),
|
||||
:remote => true, :class => 'modify-upload icon-only icon-wf-none') %>
|
||||
<% end %>
|
||||
</span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</span>
|
||||
|
||||
<span id="dmsf_links_attachments_fields">
|
||||
<% if defined?(container) && container && container.saved_dmsf_links.present? %>
|
||||
<% container.saved_dmsf_links.each_with_index do |dmsf_link, index| %>
|
||||
<span id="dmsf_links_attachments_<%= index %>", class="attachment">
|
||||
<input name="dmsf_links[<%= index %>]" value="<%= dmsf_link.id %>" type="hidden">
|
||||
<input type="text" class='filename readonly' value="<%= dmsf_link.name %>">
|
||||
<%= link_to('', dmsf_link_attachment_path(dmsf_link, :link_id => "#{index}", :format => 'js'),
|
||||
:method => 'delete', :remote => true, :class => 'remove-upload icon-only icon-del') %>
|
||||
<% wf = container.saved_dmsf_links_wfs[dmsf_link.id] %>
|
||||
<% if wf %>
|
||||
<a href="javascript:void(0);" title="<%= l(:title_assigned) %>" class="modify-upload icon-only icon-wf-assigned"></a>
|
||||
<%= hidden_field_tag("dmsf_links_wfs[#{dmsf_link.id}]", wf.id) if wf %>
|
||||
<% else %>
|
||||
<%= render(:partial => 'dmsf_files/approval_workflow_button',
|
||||
:locals => {:file => dmsf_link.target_file,
|
||||
:file_approval_allowed => User.current.allowed_to?(:file_approval, dmsf_link.target_file.project),
|
||||
:workflows_available => DmsfWorkflow.where(
|
||||
['project_id = ? OR project_id IS NULL', dmsf_link.target_file.project_id]).exists?,
|
||||
:project => dmsf_link.target_file.project, :wf => wf, :dmsf_link_id => dmsf_link.id }) %>
|
||||
<% end %>
|
||||
</span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</span>
|
||||
<span class="dmsf_add_attachment">
|
||||
<%= file_field_tag 'dmsf_attachments[dummy][file]',
|
||||
|
||||
<span class="dmsf_add_attachment add_attachment">
|
||||
<%= file_field_tag 'dmsf_attachments[dummy][file]',
|
||||
:id => nil,
|
||||
:class => 'file_selector',
|
||||
:multiple => multiple,
|
||||
@ -56,40 +82,18 @@
|
||||
:max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i,
|
||||
:upload_path => dmsf_uploads_path(:format => 'js'),
|
||||
:description_placeholder => l(:label_optional_description),
|
||||
:project => "#{@project.identifier}"
|
||||
:project => "#{@project.identifier}",
|
||||
:description => description,
|
||||
:awf => awf
|
||||
} %>
|
||||
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
|
||||
</span>
|
||||
<% if container %>
|
||||
<br/>
|
||||
<span id="dmsf_links_fields">
|
||||
<% if container.saved_dmsf_links.present? %>
|
||||
<% container.saved_dmsf_links.each_with_index do |dmsf_link, index| %>
|
||||
<span id="dmsf_links_<%= index %>">
|
||||
<input name="dmsf_links[<%= index %>]" value="<%= dmsf_link.id %>" type="hidden">
|
||||
<input type="text" class='filename readonly' value="<%= dmsf_link.name %>">
|
||||
<a href="#" class="remove-upload icon icon-del" onclick="$(this).parent('span').remove();return false;"> </a>
|
||||
<% wf = container.saved_dmsf_links_wfs[dmsf_link.id] %>
|
||||
<% if wf %>
|
||||
<a href="javascript:void(0);" title="<%= l(:title_assigned) %>" class="icon icon-wf-assigned"></a>
|
||||
<%= hidden_field_tag("dmsf_links_wfs[#{dmsf_link.id}]", wf.id) if wf %>
|
||||
<% else %>
|
||||
<%= render(:partial => 'dmsf_files/approval_workflow_button',
|
||||
:locals => {:file => dmsf_link.target_file,
|
||||
:file_approval_allowed => User.current.allowed_to?(:file_approval, dmsf_link.target_file.project),
|
||||
:workflows_available => DmsfWorkflow.where(
|
||||
['project_id = ? OR project_id IS NULL', dmsf_link.target_file.project]).exists?,
|
||||
:project => dmsf_link.target_file.project, :wf => wf, :dmsf_link_id => dmsf_link.id }) %>
|
||||
<% end %>
|
||||
<br/>
|
||||
</span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</span>
|
||||
<span class="dmsf_add_link">
|
||||
<%= link_to l(:label_link_from),
|
||||
new_dmsf_link_path(:project_id => container.project.id, :type => 'link_from', :container => 'issue'),
|
||||
:title => l(:title_create_link), :class => 'icon icon-add', :remote => true %>
|
||||
</span>
|
||||
<% if defined?(container) && container %>
|
||||
<span class="dmsf_add_link">
|
||||
<%= link_to l(:label_link_from),
|
||||
new_dmsf_link_path(:project_id => container.project.id, :type => 'link_from', :container => container.class.name),
|
||||
:title => l(:title_create_link), :class => 'icon icon-add file_selector', :remote => true %>
|
||||
</span>
|
||||
<% end %>
|
||||
|
||||
<span class="info">
|
||||
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
|
||||
</span>
|
||||
|
||||
@ -38,7 +38,8 @@
|
||||
:id => 'uploadform', :method => :post, :multipart => true) do %>
|
||||
<div id="dmsf_uploader">
|
||||
<span class="dmsf_uploader">
|
||||
<%= render :partial => 'dmsf_upload/form', :locals => { :multiple => true, :container => nil } %>
|
||||
<%= render :partial => 'dmsf_upload/form',
|
||||
:locals => { :multiple => true, :container => nil, :description => true, :awf => false } %>
|
||||
</span>
|
||||
<%= submit_tag l(:label_upload) %>
|
||||
</div>
|
||||
|
||||
1
app/views/dmsf_upload/delete_dmsf_link_attachment.js.erb
Normal file
1
app/views/dmsf_upload/delete_dmsf_link_attachment.js.erb
Normal file
@ -0,0 +1 @@
|
||||
$('#dmsf_links_attachments_<%= j params[:link_id] %>').remove();
|
||||
@ -26,7 +26,7 @@ var fileSpan = $('#dmsf_attachments_<%= j params[:attachment_id] %>');
|
||||
alert("<%= escape_javascript @attachment.errors.full_messages.join(', ') %>");
|
||||
<% else %>
|
||||
$('<input>', { type: 'hidden', name: 'dmsf_attachments[<%= j params[:attachment_id] %>][token]' } ).val('<%= j @attachment.token %>').appendTo(fileSpan);
|
||||
fileSpan.find('a.remove-upload')
|
||||
fileSpan.find('a.dmsf-remove-upload')
|
||||
.attr({
|
||||
"data-remote": true,
|
||||
"data-method": 'delete',
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 647 B |
Binary file not shown.
|
Before Width: | Height: | Size: 656 B |
Binary file not shown.
|
Before Width: | Height: | Size: 642 B |
@ -24,24 +24,24 @@ function dmsfAddLink(linksSpan, linkId, linkName, title, project, awf) {
|
||||
if (linksSpan.children().length < 10) {
|
||||
|
||||
var nextLinkId = dmsfAddLink.nextLinkId++;
|
||||
var linkSpan = $('<span>', { id: 'dmsf_links_' + nextLinkId });
|
||||
var linkSpan = $('<span>', { id: 'dmsf_links_attachments_' + nextLinkId, 'class': 'attachment' });
|
||||
var iconDel = $('<a>').attr({href: '#', 'class': 'remove-upload icon-only icon-del'});
|
||||
var inputId = $('<input>', {type: 'hidden', name: 'dmsf_links[' + nextLinkId + ']'}).val(linkId);
|
||||
var inputName = $('<input>', {type: 'text', class: 'filename readonly'}).val(linkName);
|
||||
|
||||
linkSpan.append(
|
||||
"<input name='dmsf_links[" + nextLinkId + "]' value='" + linkId + "' type='hidden'>",
|
||||
"<input type='text' class='filename readonly' value='" + linkName + "'>",
|
||||
$('<a> </a>').attr({href: "#", 'class': 'remove-upload icon icon-del'}).click(dmsfRemoveFile)
|
||||
);
|
||||
linkSpan.append(inputId);
|
||||
linkSpan.append(inputName);
|
||||
linkSpan.append(iconDel.click(dmsfRemoveFileLbl));
|
||||
|
||||
if(awf) {
|
||||
|
||||
linkSpan.append($('<a> </a>').attr({
|
||||
href: "/dmsf_workflows/" + project + "/assign?dmsf_link_id=" + linkId,
|
||||
'class': 'icon icon-wf-none', 'data-remote': 'true', 'title': title
|
||||
}));
|
||||
var iconWf = $('<a>').attr({href: "/dmsf_workflows/" + project + "/assign?dmsf_link_id=" + linkId,
|
||||
'class': 'modify-upload icon-only icon-wf-none', 'data-remote': 'true', 'title': title});
|
||||
|
||||
linkSpan.append(iconWf);
|
||||
}
|
||||
|
||||
linkSpan.append("<br/>");
|
||||
linkSpan.appendTo(linksSpan);
|
||||
linksSpan.append(linkSpan);
|
||||
}
|
||||
}
|
||||
|
||||
@ -52,37 +52,41 @@ function dmsfAddFile(inputEl, file, eagerUpload) {
|
||||
if ($('#dmsf_attachments_fields').children().length < 10) {
|
||||
|
||||
var attachmentId = dmsfAddFile.nextAttachmentId++;
|
||||
var fileSpan = $('<span>', { id: 'dmsf_attachments_' + attachmentId });
|
||||
var fileSpan = $('<span>', { id: 'dmsf_attachments_' + attachmentId, 'class': 'attachment' });
|
||||
var iconDel = $('<a>').attr({href: '#', 'class': 'remove-upload icon-only icon-del'}).toggle(!eagerUpload);
|
||||
var fileName = $('<input>', {type: 'text', 'class': 'filename readonly',
|
||||
name: 'dmsf_attachments[' + attachmentId + '][filename]', readonly: 'readonly'}).val(file.name);
|
||||
|
||||
if($(inputEl).attr('multiple') == 'multiple') {
|
||||
fileSpan.append(
|
||||
$('<input>', {
|
||||
type: 'text',
|
||||
'class': 'filename readonly',
|
||||
name: 'dmsf_attachments[' + attachmentId + '][filename]',
|
||||
readonly: 'readonly'
|
||||
}).val(file.name),
|
||||
$('<input>', {
|
||||
type: 'text',
|
||||
'class': 'description',
|
||||
name: 'dmsf_attachments[' + attachmentId + '][description]',
|
||||
maxlength: 255,
|
||||
|
||||
fileSpan.append(fileName);
|
||||
|
||||
if($(inputEl).data('description')) {
|
||||
|
||||
var description = $('<input>', {type: 'text', 'class': 'description',
|
||||
name: 'dmsf_attachments[' + attachmentId + '][description]', maxlength: 255,
|
||||
placeholder: $(inputEl).data('description-placeholder')
|
||||
}).toggle(!eagerUpload),
|
||||
$('<a> </a>').attr({href: "#", 'class': 'remove-upload icon icon-del'}).click(dmsfRemoveFile).toggle(!eagerUpload),
|
||||
$('<a> </a>').attr({href: "/dmsf_workflows/" + $(inputEl).attr('data-project') + "/assign?attachment_id=" + attachmentId,
|
||||
'class': 'icon icon-wf-none', 'data-remote': 'true'})
|
||||
).appendTo('#dmsf_attachments_fields');
|
||||
}).toggle(!eagerUpload);
|
||||
|
||||
fileSpan.append(description);
|
||||
}
|
||||
|
||||
fileSpan.append(iconDel.click(dmsfRemoveFileLbl));
|
||||
|
||||
if($(inputEl).data('awf')) {
|
||||
|
||||
var iconWf = $('<a>').attr({href: '/dmsf_workflows/' + $(inputEl).attr(
|
||||
'data-project') + "/assign?attachment_id=" + attachmentId, 'class': 'modify-upload icon-only icon-wf-none',
|
||||
'data-remote': 'true'});
|
||||
|
||||
fileSpan.append(iconWf);
|
||||
}
|
||||
|
||||
$('#dmsf_attachments_fields').append(fileSpan);
|
||||
}
|
||||
else{
|
||||
fileSpan.append(
|
||||
$('<input>', {
|
||||
type: 'text',
|
||||
'class': 'filename readonly',
|
||||
name: 'dmsf_attachments[' + attachmentId + '][filename]',
|
||||
readonly: 'readonly'
|
||||
}).val(file.name)
|
||||
).appendTo('#dmsf_attachments_fields');
|
||||
fileSpan.append(fileName);
|
||||
$('#dmsf_attachments_fields').append(fileSpan);
|
||||
$('#dmsf_file_revision_name').val(file.name);
|
||||
}
|
||||
|
||||
@ -150,8 +154,17 @@ function dmsfAjaxUpload(file, attachmentId, fileSpan, inputEl) {
|
||||
|
||||
dmsfAjaxUpload.uploading = 0;
|
||||
|
||||
function dmsfRemoveFile() {
|
||||
function dmsfRemoveFileLbl() {
|
||||
|
||||
$(this).parent('span').remove();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function dmsfRemoveFile() {
|
||||
|
||||
$(this).parent('span').parent('span').remove();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -189,7 +202,9 @@ function dmsfUploadBlob(blob, uploadUrl, attachmentId, options) {
|
||||
}
|
||||
|
||||
function dmsfAddInputFiles(inputEl) {
|
||||
|
||||
var clearedFileInput = $(inputEl).clone().val('');
|
||||
var addFileSpan = $('.dmsf_add_attachment');
|
||||
|
||||
if ($.ajaxSettings.xhr().upload && inputEl.files) {
|
||||
// upload files using ajax
|
||||
@ -199,16 +214,22 @@ function dmsfAddInputFiles(inputEl) {
|
||||
// browser not supporting the file API, upload on form submission
|
||||
var attachmentId;
|
||||
var aFilename = inputEl.value.split(/\/|\\/);
|
||||
attachmentId = dmsfAddFile(inputEl, { name: aFilename[ aFilename.length - 1 ] }, false);
|
||||
attachmentId = dmsfAddFile(inputEl, {name: aFilename[aFilename.length - 1]}, false);
|
||||
if (attachmentId) {
|
||||
$(inputEl).attr({ name: 'dmsf_attachments[' + attachmentId + '][file]', style: 'display:none;' }).appendTo('#dmsf_attachments_' + attachmentId);
|
||||
$(inputEl).attr({name: 'dmsf_attachments[' + attachmentId + '][file]', style: 'display:none;'}).appendTo(
|
||||
'#dmsf_attachments_' + attachmentId);
|
||||
}
|
||||
}
|
||||
|
||||
if($(inputEl).attr('multiple') == 'multiple')
|
||||
clearedFileInput.insertAfter('#dmsf_attachments_fields');
|
||||
else
|
||||
$('.dmsf_add_attachment').toggle();
|
||||
if ($(inputEl).attr('multiple') == 'multiple') {
|
||||
|
||||
clearedFileInput.val('');
|
||||
addFileSpan.prepend(clearedFileInput);
|
||||
}
|
||||
else {
|
||||
|
||||
addFileSpan.hide();
|
||||
}
|
||||
}
|
||||
|
||||
function dmsfUploadAndAttachFiles(files, inputEl) {
|
||||
@ -223,7 +244,9 @@ function dmsfUploadAndAttachFiles(files, inputEl) {
|
||||
if (sizeExceeded) {
|
||||
window.alert(maxFileSizeExceeded);
|
||||
} else {
|
||||
$.each(files, function() {dmsfAddFile(inputEl, this, true);});
|
||||
$.each(files, function() {
|
||||
dmsfAddFile(inputEl, this, true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -199,13 +199,15 @@ div.dmsf_revision_inner_box .attribute .label {
|
||||
.icon-wf-none { background-image: url(../images/none.png); }
|
||||
.icon-wf-waiting { background-image: url(../images/waiting_for_approval.png); }
|
||||
.icon-wf-assigned { background-image: url(../images/assigned.png); }
|
||||
.icon-delete { background-image: url(../images/rev_delete.png); }
|
||||
.icon-download { background-image: url(../images/rev_download.png); }
|
||||
.icon-downloads { background-image: url(../images/rev_downloads.png); }
|
||||
.icon-link { background-image: url(../../../images/link.png); }
|
||||
.icon-approvalworkflows { background-image: url(../../../images/ticket_go.png); }
|
||||
|
||||
/* File types */
|
||||
.dmsf-icon-file{
|
||||
display: inline-block;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.dmsf_gray .icon-folder { background-image: url(../images/folder_gray.png); }
|
||||
.dmsf_system .icon-folder { background-image: url(../images/folder_system.png); }
|
||||
.dmsf_system_closed .icon-folder { background-image: url(../images/folder_system_closed.png); }
|
||||
@ -302,8 +304,8 @@ div.dmsf_revision_inner_box .attribute .label {
|
||||
|
||||
/* DMSF file upload */
|
||||
.dmsf_uploader{
|
||||
padding:6px;
|
||||
margin-bottom: 10px;
|
||||
padding:10px;
|
||||
margin-bottom: 20px;
|
||||
background-color:#f6f6f6;
|
||||
color:#505050;
|
||||
line-height:1.5em;
|
||||
@ -312,6 +314,21 @@ div.dmsf_revision_inner_box .attribute .label {
|
||||
border-radius: 3px;
|
||||
min-height: 50px;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.dmsf_add_link{
|
||||
display: block;
|
||||
float: right;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.dmsf_add_file{
|
||||
display: block;
|
||||
float: left;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#dmsf_attachments_fields input.description {margin-left:4px; width:340px;}
|
||||
@ -321,5 +338,5 @@ div.dmsf_revision_inner_box .attribute .label {
|
||||
#dmsf_attachments_fields .ajax-loading input.filename {background:url(../../../images/loading.gif) no-repeat 0px 50%;}
|
||||
#dmsf_attachments_fields div.ui-progressbar { width: 100px; height:14px; margin: 2px 0 -5px 8px; display: inline-block; }
|
||||
|
||||
#dmsf_links_fields span {display:block; white-space:nowrap;}
|
||||
#dmsf_links_fields input.filename {border:0; height:1.8em; width:250px; color:#555; background-color:inherit; background:url(../../../images/link.png) no-repeat 1px 50%; padding-left:18px;}
|
||||
#dmsf_links_attachments_fields span {display:block; white-space:nowrap;}
|
||||
#dmsf_links_attachments_fields input.filename {border:0; height:1.8em; width:250px; color:#555; background-color:inherit; background:url(../../../images/link.png) no-repeat 1px 50%; padding-left:18px;}
|
||||
|
||||
@ -365,4 +365,7 @@ cs:
|
||||
label_act_as_attachable: Jako příloha
|
||||
note_dmsf_act_as_attachable: Umožní přikládat dokumenty k objektům např. úkolům.
|
||||
|
||||
label_user_search_add: Vyhledej uživatele pro přidání
|
||||
label_user_search_add: Vyhledej uživatele pro přidání
|
||||
|
||||
label_dmsf_attachments: DMS přílohy
|
||||
label_basic_attachments: Souborové přílohy
|
||||
@ -362,4 +362,7 @@ de:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Anhänge
|
||||
label_basic_attachments: Dateianhängen
|
||||
@ -366,3 +366,6 @@ en:
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ es:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -366,3 +366,6 @@ fr:
|
||||
note_dmsf_act_as_attachable: "Permet de joindre des documents aux objets tels que les demandes."
|
||||
|
||||
label_user_search_add: Rechercher des utilisateurs à ajouter
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
|
||||
@ -364,4 +364,7 @@ hu:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ it: # Italian strings thx 2 Matteo Arceci!
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ ja:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ pl:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ pt-BR:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ ru:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ sl:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ zh-TW:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -365,4 +365,7 @@ zh:
|
||||
label_act_as_attachable: Act as attachable
|
||||
note_dmsf_act_as_attachable: Allows to attach documents to objects e.g. issues.
|
||||
|
||||
label_user_search_add: Search for user to add
|
||||
label_user_search_add: Search for user to add
|
||||
|
||||
label_dmsf_attachments: DMS Attachments
|
||||
label_basic_attachments: Basic Attachments
|
||||
@ -68,6 +68,7 @@ if Redmine::Plugin.installed? :redmine_dmsf
|
||||
post '/projects/:id/dmsf/commit', :controller => 'dmsf_upload', :action => 'commit'
|
||||
match 'dmsf_uploads', :to => 'dmsf_upload#upload', :via => :post
|
||||
delete '/dmsf/attachments/:id/delete', :to => 'dmsf_upload#delete_dmsf_attachment', :as => 'dmsf_attachment'
|
||||
delete '/dmsf/link_attachments/:id/delete', :to => 'dmsf_upload#delete_dmsf_link_attachment', :as => 'dmsf_link_attachment'
|
||||
|
||||
#
|
||||
# dmsf_files controller
|
||||
|
||||
@ -20,6 +20,8 @@
|
||||
|
||||
class DmsfFileContainerRollback < ActiveRecord::Migration
|
||||
def up
|
||||
# Add system folder_flag to dmsf_folders
|
||||
add_column :dmsf_folders, :system, :boolean, :null => false, :default => false
|
||||
# Create necessary folders
|
||||
new_folder_ids = []
|
||||
description = 'Documents assigned to issues'
|
||||
@ -50,15 +52,18 @@ class DmsfFileContainerRollback < ActiveRecord::Migration
|
||||
new_folder_ids << folder.id
|
||||
# Move the file into the new folder
|
||||
file.dmsf_folder_id = folder.id
|
||||
file.save
|
||||
# The save methos requires project_id
|
||||
class << file
|
||||
attr_accessor :project_id
|
||||
end
|
||||
file.save(validate: false)
|
||||
end
|
||||
# Make DB changes in dmsf_files
|
||||
remove_index :dmsf_files, [:container_id, :container_type]
|
||||
remove_column :dmsf_files, :container_type
|
||||
rename_column :dmsf_files, :container_id, :project_id
|
||||
add_index :dmsf_files, :project_id
|
||||
# Add system folder_flag to dmsf_folders
|
||||
add_column :dmsf_folders, :system, :boolean, :null => false, :default => false
|
||||
# Initialize system folder_flag to dmsf_folders
|
||||
DmsfFolder.where(:id => new_folder_ids).update_all(:system => true)
|
||||
end
|
||||
|
||||
@ -67,6 +72,7 @@ class DmsfFileContainerRollback < ActiveRecord::Migration
|
||||
file_folder_ids = DmsfFile.joins(:dmsf_folder).where(:dmsf_folders => { :system => true }).pluck('dmsf_files.id, cast(dmsf_folders.title as unsigned)')
|
||||
remove_index :dmsf_files, :project_id
|
||||
rename_column :dmsf_files, :project_id, :container_id
|
||||
add_column :dmsf_files, :project_id, :int, :null => true # temporarily added for the save method
|
||||
add_column :dmsf_files, :container_type, :string, :limit => 30, :null => false, :default => 'Project'
|
||||
DmsfFile.update_all(:container_type => 'Project')
|
||||
file_folder_ids.each do |id, container_id|
|
||||
@ -77,6 +83,7 @@ class DmsfFileContainerRollback < ActiveRecord::Migration
|
||||
file.save
|
||||
end
|
||||
end
|
||||
remove_column :dmsf_files, :project_id # temporarily added for the save method
|
||||
add_index :dmsf_files, [:container_id, :container_type]
|
||||
# dmsf_folders
|
||||
DmsfFolder.where(:system => true).delete_all
|
||||
|
||||
3
init.rb
3
init.rb
@ -87,7 +87,8 @@ Redmine::Plugin.register :redmine_dmsf do
|
||||
:dmsf_folder_permissions => [:new, :append, :autocomplete_for_user] }
|
||||
permission :file_manipulation,
|
||||
{ :dmsf_files => [:create_revision, :lock, :unlock, :delete_revision, :notify_activate, :notify_deactivate, :restore],
|
||||
:dmsf_upload => [:upload_files, :upload_file, :upload, :commit_files, :commit, :delete_dmsf_attachment],
|
||||
:dmsf_upload => [:upload_files, :upload_file, :upload, :commit_files, :commit, :delete_dmsf_attachment,
|
||||
:delete_dmsf_link_attachment],
|
||||
:dmsf_links => [:new, :create, :destroy, :restore, :autocomplete_for_project, :autocomplete_for_folder] }
|
||||
permission :file_delete,
|
||||
{ :dmsf => [:trash, :delete_entries],
|
||||
|
||||
@ -58,6 +58,7 @@ module RedmineDmsf
|
||||
if context.is_a?(Hash)
|
||||
issue = context[:issue]
|
||||
params = context[:params]
|
||||
User.current.pref.update_attribute :dmsf_attachments_upload_choice, params[:dmsf_attachments_upload_choice]
|
||||
issue.save_dmsf_attachments(params[:dmsf_attachments])
|
||||
issue.save_dmsf_links(params[:dmsf_links])
|
||||
issue.save_dmsf_attachments_wfs(params[:dmsf_attachments_wfs], params[:dmsf_attachments])
|
||||
|
||||
@ -26,11 +26,32 @@ module RedmineDmsf
|
||||
|
||||
def view_issues_form_details_bottom(context={})
|
||||
return if defined?(EasyExtensions)
|
||||
context[:container] = context[:issue]
|
||||
attach_documents_form(context)
|
||||
end
|
||||
|
||||
def view_issues_edit_notes_bottom(context={})
|
||||
attach_documents_form(context)
|
||||
html = ''
|
||||
# Radio buttons
|
||||
if allowed_to_attach_documents(context[:container])
|
||||
html << '<p>'
|
||||
html << '<label class="inline">'
|
||||
html << radio_button_tag('dmsf_attachments_upload_choice', 'Attachments',
|
||||
User.current.pref.dmsf_attachments_upload_choice == 'Attachments',
|
||||
onchange: "$('.attachments-container').parent().show(); $('.dmsf_uploader').parent().hide(); return false;")
|
||||
html << l(:label_basic_attachments)
|
||||
html << '</label>'
|
||||
html << '<label class="inline">'
|
||||
html << radio_button_tag('dmsf_attachments_upload_choice', 'DMSF',
|
||||
User.current.pref.dmsf_attachments_upload_choice == 'DMSF',
|
||||
onchange: "$('.attachments-container').parent().hide(); $('.dmsf_uploader').parent().show(); return false;")
|
||||
html << l(:label_dmsf_attachments)
|
||||
html << '</label>'
|
||||
html << '</p>'
|
||||
end
|
||||
# Upload form
|
||||
html.html_safe + attach_documents_form(context, false,
|
||||
defined?(EasyExtensions) && EasySetting.value('attachment_description'))
|
||||
end
|
||||
|
||||
def view_issues_show_description_bottom(context={})
|
||||
@ -40,23 +61,51 @@ module RedmineDmsf
|
||||
|
||||
def view_issues_show_attachments_bottom(context={})
|
||||
unless context[:options][:only_mails].present?
|
||||
show_attached_documents(context[:container], context[:controller])
|
||||
show_attached_documents(context[:container], context[:controller], context[:attachments])
|
||||
end
|
||||
end
|
||||
|
||||
def view_issues_dms_attachments(context={})
|
||||
'yes' if get_links(context[:container]).any?
|
||||
end
|
||||
|
||||
def view_issues_show_thumbnails(context={})
|
||||
show_thumbnails(context[:container], context[:controller])
|
||||
end
|
||||
|
||||
def view_issues_dms_thumbnails(context={})
|
||||
unless context[:options][:only_mails].present?
|
||||
show_thumbnails(context[:container], context[:controller])
|
||||
links = get_links(context[:container])
|
||||
if links.present? && Setting.thumbnails_enabled?
|
||||
images = links.map{ |x| x[0] }.select(&:image?)
|
||||
return 'yes' if images.any?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def view_issues_edit_notes_bottom_style(context={})
|
||||
if (User.current.pref[:dmsf_attachments_upload_choice] == 'Attachments') ||
|
||||
!allowed_to_attach_documents(context[:container])
|
||||
''
|
||||
else
|
||||
'display: none'
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def allowed_to_attach_documents(container)
|
||||
container &&
|
||||
User.current.allowed_to?(:file_manipulation, container.project) &&
|
||||
Setting.plugin_redmine_dmsf['dmsf_act_as_attachable'] &&
|
||||
(container.project.dmsf_act_as_attachable == Project::ATTACHABLE_DMS_AND_ATTACHMENTS)
|
||||
end
|
||||
|
||||
def get_links(container)
|
||||
links = []
|
||||
if defined?(container.dmsf_files) && User.current.allowed_to?(:view_dmsf_files, container.project) &&
|
||||
Setting.plugin_redmine_dmsf['dmsf_act_as_attachable'] &&
|
||||
(container.project.dmsf_act_as_attachable == Project::ATTACHABLE_DMS_AND_ATTACHMENTS)
|
||||
links = []
|
||||
for dmsf_file in container.dmsf_files
|
||||
if dmsf_file.last_revision
|
||||
links << [dmsf_file, nil, dmsf_file.created_at]
|
||||
@ -69,8 +118,9 @@ module RedmineDmsf
|
||||
end
|
||||
end
|
||||
# Sort by 'create_at'
|
||||
links.sort{ |x, y| x[2] <=> y[2] }
|
||||
links.sort!{ |x, y| x[2] <=> y[2] }
|
||||
end
|
||||
links
|
||||
end
|
||||
|
||||
def show_thumbnails(container, controller)
|
||||
@ -83,18 +133,21 @@ module RedmineDmsf
|
||||
end
|
||||
end
|
||||
|
||||
def attach_documents_form(context)
|
||||
if context.is_a?(Hash) && context[:issue]
|
||||
def attach_documents_form(context, label=true, description=true)
|
||||
if context.is_a?(Hash) && context[:container]
|
||||
# Add Dmsf upload form
|
||||
issue = context[:issue]
|
||||
if User.current.allowed_to?(:file_manipulation, issue.project) &&
|
||||
Setting.plugin_redmine_dmsf['dmsf_act_as_attachable'] &&
|
||||
(issue.project.dmsf_act_as_attachable == Project::ATTACHABLE_DMS_AND_ATTACHMENTS)
|
||||
html = '<p>'
|
||||
container = context[:container]
|
||||
if allowed_to_attach_documents(container)
|
||||
html = "<p class=\"#{(User.current.pref[:dmsf_attachments_upload_choice] == 'Attachments') ? 'hol' : ''}\">"
|
||||
if label
|
||||
html << "<label>#{l(:label_document_plural)}</label>"
|
||||
html << "<span class=\"dmsf_uploader\">"
|
||||
html << "<span class=\"attachments-container dmsf_uploader\">"
|
||||
else
|
||||
html << "<span class=\"attachments-container dmsf_uploader\" style=\"border: 2px dashed #dfccaf; background: none;\">"
|
||||
end
|
||||
html << context[:controller].send(:render_to_string,
|
||||
{ :partial => 'dmsf_upload/form', :locals => { :container => issue, :multiple => true }})
|
||||
{ :partial => 'dmsf_upload/form',
|
||||
:locals => { :container => container, :multiple => true, :description => description, :awf => true }})
|
||||
html << '</span>'
|
||||
html << '</p>'
|
||||
html.html_safe
|
||||
@ -102,7 +155,7 @@ module RedmineDmsf
|
||||
end
|
||||
end
|
||||
|
||||
def show_attached_documents(container, controller)
|
||||
def show_attached_documents(container, controller, attachments=nil)
|
||||
# Add list of attached documents
|
||||
links = get_links(container)
|
||||
if links.present?
|
||||
@ -110,18 +163,23 @@ module RedmineDmsf
|
||||
controller.send(:render_to_string, {:partial => 'dmsf_files/links',
|
||||
:locals => { :links => links, :thumbnails => Setting.thumbnails_enabled? }})
|
||||
else
|
||||
attachment_rows(links, container, controller)
|
||||
attachment_rows(links, container, controller, attachments)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def attachment_rows(links, issue, controller)
|
||||
html = '<tbody>'
|
||||
links.each do |dmsf_file, link, create_at|
|
||||
html << attachment_row(dmsf_file, link, issue, controller)
|
||||
def attachment_rows(links, issue, controller, attachments)
|
||||
if links.any?
|
||||
html = '<tbody>'
|
||||
if attachments.any?
|
||||
html << "<tr><th colspan=\"4\">#{l(:label_dmsf_attachments)} (#{links.count})</th></tr>"
|
||||
end
|
||||
links.each do |dmsf_file, link, create_at|
|
||||
html << attachment_row(dmsf_file, link, issue, controller)
|
||||
end
|
||||
html << '</tbody>'
|
||||
html.html_safe
|
||||
end
|
||||
html << '</tbody>'
|
||||
html.html_safe
|
||||
end
|
||||
|
||||
def attachment_row(dmsf_file, link, issue, controller)
|
||||
|
||||
@ -162,9 +162,7 @@ Redmine::WikiFormatting::Macros.register do
|
||||
raise 'Not supported image format' unless file.image?
|
||||
url = url_for(:controller => :dmsf_files, :action => 'view', :id => file)
|
||||
file_view_url = url_for(:controller => :dmsf_files, :action => 'view', :id => file, :download => args[2])
|
||||
if size && size.include?("%")
|
||||
img = image_tag(url, :alt => file.title, :width => size, :height => size)
|
||||
elsif size && size.include?("x")
|
||||
if size
|
||||
img = image_tag(url, :alt => file.title, :size => size)
|
||||
elsif height
|
||||
img = image_tag(url, :alt => file.title, :width => 'auto', :height => height)
|
||||
|
||||
@ -18,22 +18,41 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
module DmsfUserPreference
|
||||
def self.included(base)
|
||||
base.send(:include, InstanceMethods)
|
||||
end
|
||||
module RedmineDmsf
|
||||
module Patches
|
||||
module UserPreference
|
||||
|
||||
module InstanceMethods
|
||||
def self.included(base)
|
||||
base.send(:include, InstanceMethods)
|
||||
end
|
||||
|
||||
def dmsf_tree_view
|
||||
self[:dmsf_tree_view] || '1'
|
||||
end
|
||||
module InstanceMethods
|
||||
|
||||
def dmsf_tree_view
|
||||
self[:dmsf_tree_view] || '1'
|
||||
end
|
||||
|
||||
def dmsf_tree_view=(value)
|
||||
self[:dmsf_tree_view] = value
|
||||
end
|
||||
|
||||
def dmsf_attachments_upload_choice
|
||||
self[:dmsf_attachments_upload_choice] || 'DMSF'
|
||||
end
|
||||
|
||||
def dmsf_attachments_upload_choice=(value)
|
||||
self[:dmsf_attachments_upload_choice] = value
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def dmsf_tree_view=(value)
|
||||
self[:dmsf_tree_view] = value
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
UserPreference.send(:include, DmsfUserPreference)
|
||||
# Apply patch
|
||||
Rails.configuration.to_prepare do
|
||||
unless UserPreference.included_modules.include?(RedmineDmsf::Patches::UserPreference)
|
||||
UserPreference.send(:include, RedmineDmsf::Patches::UserPreference)
|
||||
end
|
||||
end
|
||||
|
||||
@ -72,7 +72,7 @@ class DmsfConvertDocuments
|
||||
if attachment
|
||||
folder.user = attachment.author
|
||||
else
|
||||
folder.user = Users.active.where(:admin => true).first
|
||||
folder.user = User.active.where(:admin => true).first
|
||||
end
|
||||
|
||||
folder.title = document.title
|
||||
|
||||
@ -21,7 +21,8 @@
|
||||
require File.expand_path('../../test_helper', __FILE__)
|
||||
|
||||
class DmsfFolderPermissionsControllerTest < RedmineDmsf::Test::TestCase
|
||||
fixtures :users, :dmsf_folders, :projects, :roles, :members, :member_roles, :dmsf_folder_permissions
|
||||
fixtures :users, :dmsf_folders, :projects, :roles, :members, :member_roles, :dmsf_folder_permissions,
|
||||
:email_addresses
|
||||
|
||||
def setup
|
||||
@project1 = Project.find_by_id 1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user