devel-1.5.7 merged into the master

This commit is contained in:
Karel Picman 2016-08-12 12:02:28 +02:00
commit 6e87001d70
150 changed files with 5172 additions and 3762 deletions

View File

@ -1,6 +1,9 @@
Changelog for Redmine DMSF Changelog for Redmine DMSF
========================== ==========================
1.5.7 *2015-??-??*
------------------
1.5.6 *2015-01-25* 1.5.6 *2015-01-25*
------------------ ------------------

View File

@ -23,10 +23,10 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'rubyzip', '>= 1.0.0' gem 'rubyzip', '>= 1.0.0'
gem 'zip-zip' # Just to avoid 'cannot load such file -- zip/zip' error gem 'zip-zip'
gem 'simple_enum' gem 'simple_enum'
gem 'uuidtools', '~> 2.1.1' gem 'uuidtools'
gem 'dav4rack', '~> 0.3.0' gem 'dav4rack'
group :xapian do group :xapian do
gem 'xapian-full-alaveteli', :require => false gem 'xapian-full-alaveteli', :require => false

View File

@ -1,7 +1,7 @@
Redmine DMSF Plugin Redmine DMSF Plugin
=================== ===================
The current version of Redmine DMSF is **1.5.6** [![Build Status](https://api.travis-ci.org/danmunn/redmine_dmsf.png)](https://travis-ci.org/danmunn/redmine_dmsf) The current version of Redmine DMSF is **1.5.7** [![Build Status](https://api.travis-ci.org/danmunn/redmine_dmsf.png)](https://travis-ci.org/danmunn/redmine_dmsf)
Redmine DMSF is Document Management System Features plugin for Redmine issue tracking system; It is aimed to replace current Redmine's Documents module. Redmine DMSF is Document Management System Features plugin for Redmine issue tracking system; It is aimed to replace current Redmine's Documents module.
@ -77,18 +77,18 @@ From Omega documentation:
On Debian use: On Debian use:
```sudo apt-get install xapian-omega libxapian-dev xpdf xpdf-utils \ ```sudo apt-get install xapian-omega libxapian-dev xpdf poppler-utils \
antiword unzip catdoc libwpd-tools libwps-tools gzip unrtf catdvi \ antiword unzip catdoc libwpd-tools libwps-tools gzip unrtf catdvi \
djview djview3 uuid uuid-dev xz-utils``` djview djview3 uuid uuid-dev xz-utils```
On Ubuntu use: On Ubuntu use:
```sudo apt-get install xapian-omega libxapian-dev xpdf xpdf-utils antiword \ ```sudo apt-get install xapian-omega libxapian-dev xpdf poppler-utils antiword \
unzip catdoc libwpd-tools libwps-tools gzip unrtf catdvi djview djview3 \ unzip catdoc libwpd-tools libwps-tools gzip unrtf catdvi djview djview3 \
uuid uuid-dev xz-utils``` uuid uuid-dev xz-utils```
On CentOS user: On CentOS user:
```sudo yum install xapian-omega libxapian-dev xpdf xpdf-utils antiword \ ```sudo yum install xapian-omega libxapian-dev xpdf poppler-utils antiword \
unzip catdoc libwpd-tools libwps-tools gzip unrtf catdvi djview djview3 \ unzip catdoc libwpd-tools libwps-tools gzip unrtf catdvi djview djview3 \
uuid uuid-dev xz``` uuid uuid-dev xz```
@ -101,16 +101,16 @@ Search will now automatically search DMSF content when a Redmine search is perfo
###Linking DMSF files from Wiki entries: ###Linking DMSF files from Wiki entries:
####Link to a file with id 17: ####Link to a document with id 17:
`{{dmsf(17)}}` `{{dmsf(17)}}`
####Link to a file with id 17 with link text "File" ####Link to a document with id 17 with link text "File"
`{{dmsf(17, File)}}` `{{dmsf(17, File)}}`
####Link to the description of a file with id 17 ####Link to the description of a document with id 17
`{{dmsfd(17)}}` `{{dmsfd(17)}}`
####Link to the preview of the first 5 lines from a file with id 17 ####Link to the preview of 5 lines from a document with id 17
`{{dmsft(17, 5)}}` `{{dmsft(17, 5)}}`
####An inline picture of the file with id 8; it must be an image file such as JPEG, PNG,... ####An inline picture of the file with id 8; it must be an image file such as JPEG, PNG,...
@ -122,10 +122,26 @@ Search will now automatically search DMSF content when a Redmine search is perfo
####An inline picture with custom size ####An inline picture with custom size
`{{dmsf_image(8, size=50%)}}` `{{dmsf_image(8, size=50%)}}`
####An inline picture with custom height
`{{dmsf_image(8, height=300)}}`
####An inline picture with custom width
`{{dmsf_image(8, width=300)}}`
####An inline picture with custom size ####An inline picture with custom size
`{{dmsf_image(8, size=640x480)}}` `{{dmsf_image(8, size=640x480)}}`
The DMSF file/revision id can be found in link for file/revision download from within Redmine. ####A thumbnail with height of 200px
`{{dmsftn(8)}}`
####A thumbnail with custom size
`{{dmsftn(8, size=300)}}`
####Approval workflow status of a document with id 8
`{{dmsfw(8)}}`
The DMSF document/revision id can be found in document details.
###Linking DMSF folders from Wiki entries: ###Linking DMSF folders from Wiki entries:
@ -154,6 +170,12 @@ In the file <redmine_root>/public/help/<language>/wiki_syntax_detailed.html, aft
<li><strong>{{dmsf_image(8)}}</strong> (an inline picture of the file with id 8; it must be an image file such as JPEG, PNG,...)</li> <li><strong>{{dmsf_image(8)}}</strong> (an inline picture of the file with id 8; it must be an image file such as JPEG, PNG,...)</li>
<li><strong>{{dmsf_image(8, size=300)}}</strong> (an inline picture with custom size)</li> <li><strong>{{dmsf_image(8, size=300)}}</strong> (an inline picture with custom size)</li>
<li><strong>{{dmsf_image(8, size=640x480)}}</strong> (an inline picture with custom size)</li> <li><strong>{{dmsf_image(8, size=640x480)}}</strong> (an inline picture with custom size)</li>
<li><strong>{{dmsf_image(8, size=50%)}}</strong> (an inline picture with custom size)</li>
<li><strong>{{dmsf_image(8, height=300)}}</strong> (an inline picture with custom size)</li>
<li><strong>{{dmsf_image(8, width=300)}}</strong> (an inline picture with custom size)</li>
<li><strong>{{dmsftn(8)}}</strong> (a thumbnail with height of 200px)</li>
<li><strong>{{dmsftn(8, size=300)}}</strong> (a thumbnail with custom size)</li>
<li><strong>{{dmsfw(8)}}</strong> (approval workflow status of a document with id 8)</li>
</ul> </ul>
The DMSF file/revision id can be found in the link for file/revision download from within Redmine.<br /> The DMSF file/revision id can be found in the link for file/revision download from within Redmine.<br />
The DMSF folder id can be found in the link when opening folders within Redmine. The DMSF folder id can be found in the link when opening folders within Redmine.
@ -179,6 +201,7 @@ Before installing ensure that the Redmine instance is stopped.
1. In case of upgrade BACKUP YOUR DATABASE first 1. In case of upgrade BACKUP YOUR DATABASE first
2. Put redmine_dmsf plugin directory into plugins. 2. Put redmine_dmsf plugin directory into plugins.
3. Install dependencies: `bundle install`. 3. Install dependencies: `bundle install`.
3.1 To install dependencies without Xapian (full-text searching): `bundle install --without xapian`. This option might be useful especially in Windows.
4. Initialize/Update database: `bundle exec rake redmine:plugins:migrate RAILS_ENV="production"`. 4. Initialize/Update database: `bundle exec rake redmine:plugins:migrate RAILS_ENV="production"`.
5. The access rights must be set for web server, example: `chown -R www-data:www-data plugins/redmine_dmsf`. 5. The access rights must be set for web server, example: `chown -R www-data:www-data plugins/redmine_dmsf`.
6. Restart the web server. 6. Restart the web server.
@ -198,6 +221,10 @@ Before installing ensure that the Redmine instance is stopped.
rake redmine:dmsf_convert_documents project=test RAILS_ENV="production" rake redmine:dmsf_convert_documents project=test RAILS_ENV="production"
(If you don't run the rake task as the web server user, don't forget to change the ownership of the imported files, e.g.
chown -R www-data:www-data /redmine/files/dmsf
afterwards)
b) To alert all users who are expected to do an approval in the current approval steps b) To alert all users who are expected to do an approval in the current approval steps
Example: Example:

View File

@ -4,7 +4,7 @@
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -23,14 +23,11 @@
class DmsfController < ApplicationController class DmsfController < ApplicationController
unloadable unloadable
class ZipMaxFilesError < StandardError; end
class EmailMaxFileSize < StandardError; end
class FileNotFound < StandardError; end
before_filter :find_project before_filter :find_project
before_filter :authorize before_filter :authorize
before_filter :find_folder, :except => [:new, :create, :edit_root, :save_root] before_filter :find_folder, :except => [:new, :create, :edit_root, :save_root]
before_filter :find_parent, :only => [:new, :create] before_filter :find_parent, :only => [:new, :create]
before_filter :tree_view, :only => [:delete, :show]
accept_api_auth :show, :create accept_api_auth :show, :create
@ -42,96 +39,99 @@ class DmsfController < ApplicationController
@file_delete_allowed = User.current.allowed_to?(:file_delete, @project) @file_delete_allowed = User.current.allowed_to?(:file_delete, @project)
@file_view_allowed = User.current.allowed_to?(:view_dmsf_files, @project) @file_view_allowed = User.current.allowed_to?(:view_dmsf_files, @project)
@force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @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]).count > 0 @workflows_available = DmsfWorkflow.where(['project_id = ? OR project_id IS NULL', @project.id]).exists?
@file_approval_allowed = User.current.allowed_to?(:file_approval, @project) @file_approval_allowed = User.current.allowed_to?(:file_approval, @project)
tag = params[:custom_field_id].present? && params[:custom_value].present?
unless @folder @folder = nil if tag
if params[:custom_field_id].present? && params[:custom_value].present? if @tree_view
@subfolders = []
DmsfFolder.where(:project_id => @project.id).visible.each do |f|
f.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@subfolders << f
break
end
end
end
end
@files = []
DmsfFile.where(:project_id => @project.id).visible.each do |f|
r = f.last_revision
if r
r.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@files << f
break
end
end
end
end
end
@dir_links = []
DmsfLink.where(:project_id => @project.id, :target_type => DmsfFolder.model_name.to_s).visible.each do |l|
l.target_folder.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@dir_links << l
break
end
end
end
end
@file_links = []
DmsfLink.where(:project_id => @project.id, :target_type => DmsfFile.model_name.to_s).visible.each do |l|
r = l.target_file.last_revision if l.target_file
if r
r.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@file_links << l
break
end
end
end
end
end
@url_links = []
DmsfLink.where(:project_id => @project.id, :target_type => 'DmsfUrl').visible.each do |l|
r = l.target_file.last_revision if l.target_file
if r
r.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@file_links << l
break
end
end
end
end
end
else
@subfolders = @project.dmsf_folders.visible
@files = @project.dmsf_files.visible
@dir_links = @project.folder_links.visible
@file_links = @project.file_links.visible
@url_links = @project.url_links.visible
end
@locked_for_user = false @locked_for_user = false
else else
unless @folder
if @folder.deleted if tag
render_404 @subfolders = []
return DmsfFolder.where(:project_id => @project.id).visible.each do |f|
f.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@subfolders << f
break
end
end
end
end
@files = []
DmsfFile.where(:project_id => @project.id).visible.each do |f|
r = f.last_revision
if r
r.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@files << f
break
end
end
end
end
end
@dir_links = []
DmsfLink.where(:project_id => @project.id, :target_type => DmsfFolder.model_name.to_s).visible.each do |l|
l.target_folder.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@dir_links << l
break
end
end
end
end
@file_links = []
DmsfLink.where(:project_id => @project.id, :target_type => DmsfFile.model_name.to_s).visible.each do |l|
r = l.target_file.last_revision if l.target_file
if r
r.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@file_links << l
break
end
end
end
end
end
@url_links = []
DmsfLink.where(:project_id => @project.id, :target_type => 'DmsfUrl').visible.each do |l|
r = l.target_file.last_revision if l.target_file
if r
r.custom_field_values.each do |v|
if v.custom_field_id == params[:custom_field_id].to_i
if v.custom_field.compare_values?(v.value, params[:custom_value])
@file_links << l
break
end
end
end
end
end
else
@subfolders = @project.dmsf_folders.visible
@files = @project.dmsf_files.visible
@dir_links = @project.folder_links.visible
@file_links = @project.file_links.visible
@url_links = @project.url_links.visible
end
@locked_for_user = false
else
if @folder.deleted?
render_404
return
end
@subfolders = @folder.dmsf_folders.visible
@files = @folder.dmsf_files.visible
@dir_links = @folder.folder_links.visible
@file_links = @folder.file_links.visible
@url_links = @folder.url_links.visible
@locked_for_user = @folder.locked_for_user?
end end
@subfolders = @folder.subfolders.visible
@files = @folder.files.visible
@dir_links = @folder.folder_links.visible
@file_links = @folder.file_links.visible
@url_links = @folder.url_links.visible
@locked_for_user = @folder.locked_for_user?
end end
@ajax_upload_size = Setting.plugin_redmine_dmsf['dmsf_max_ajax_upload_filesize'].present? ? Setting.plugin_redmine_dmsf['dmsf_max_ajax_upload_filesize'] : 100 @ajax_upload_size = Setting.plugin_redmine_dmsf['dmsf_max_ajax_upload_filesize'].present? ? Setting.plugin_redmine_dmsf['dmsf_max_ajax_upload_filesize'] : 100
@ -188,19 +188,22 @@ class DmsfController < ApplicationController
return return
end end
if selected_dir_links.present? if selected_dir_links.present? &&
selected_dir_links.each do |id| (params[:email_entries].present? || params[:download_entries].present?)
link = DmsfLink.find_by_id id selected_dir_links.each do |id|
selected_folders << link.target_id if link && !selected_folders.include?(link.target_id.to_s) link = DmsfLink.find_by_id id
selected_folders << link.target_id if link && !selected_folders.include?(link.target_id.to_s)
end end
end end
if selected_file_links.present? if selected_file_links.present? &&
selected_file_links.each do |id| (params[:email_entries].present? || params[:download_entries].present?)
link = DmsfLink.find_by_id id selected_file_links.each do |id|
selected_files << link.target_id if link && !selected_files.include?(link.target_id.to_s) link = DmsfLink.find_by_id id
selected_files << link.target_id if link && !selected_files.include?(link.target_id.to_s)
end end
end end
if params[:email_entries].present? if params[:email_entries].present?
email_entries(selected_folders, selected_files) email_entries(selected_folders, selected_files)
elsif params[:restore_entries].present? elsif params[:restore_entries].present?
@ -215,16 +218,14 @@ class DmsfController < ApplicationController
else else
download_entries(selected_folders, selected_files) download_entries(selected_folders, selected_files)
end end
rescue ZipMaxFilesError
flash[:error] = l(:error_max_files_exceeded, :number => Setting.plugin_redmine_dmsf['dmsf_max_file_download'])
redirect_to :back
rescue EmailMaxFileSize
flash[:error] = l(:error_max_email_filesize_exceeded, :number => Setting.plugin_redmine_dmsf['dmsf_max_email_filesize'])
redirect_to :back
rescue FileNotFound rescue FileNotFound
render_404 render_404
rescue DmsfAccessError rescue DmsfAccessError
render_403 render_403
rescue Exception => e
flash[:error] = e.message
Rails.logger.error e.message
redirect_to :back
end end
def tag_changed def tag_changed
@ -296,8 +297,9 @@ class DmsfController < ApplicationController
end end
def edit def edit
@parent = @folder.folder @parent = @folder.dmsf_folder
@pathfolder = copy_folder(@folder) @pathfolder = copy_folder(@folder)
@force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @project)
end end
def save def save
@ -332,10 +334,10 @@ class DmsfController < ApplicationController
else else
flash[:error] = @folder.errors.full_messages.to_sentence flash[:error] = @folder.errors.full_messages.to_sentence
end end
if commit if commit || @tree_view
redirect_to :back redirect_to :back
else else
redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder.folder) redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder.dmsf_folder)
end end
end end
@ -352,10 +354,15 @@ class DmsfController < ApplicationController
end end
def save_root def save_root
@project.dmsf_description = params[:project][:dmsf_description] if params[:project]
@project.save! @project.dmsf_description = params[:project][:dmsf_description]
flash[:notice] = l(:notice_folder_details_were_saved) if @project.save
redirect_to :controller => 'dmsf', :action => 'show', :id => @project flash[:notice] = l(:notice_folder_details_were_saved)
else
flash[:error] = @project.errors.full_messages.to_sentence
end
end
redirect_to dmsf_folder_path(:id => @project)
end end
def notify_activate def notify_activate
@ -445,7 +452,7 @@ class DmsfController < ApplicationController
log_activity(f, 'emailing zip') log_activity(f, 'emailing zip')
audit = DmsfFileRevisionAccess.new audit = DmsfFileRevisionAccess.new
audit.user = User.current audit.user = User.current
audit.revision = f.last_revision audit.dmsf_file_revision = f.last_revision
audit.action = DmsfFileRevisionAccess::EmailAction audit.action = DmsfFileRevisionAccess::EmailAction
audit.save! audit.save!
end end
@ -472,7 +479,7 @@ class DmsfController < ApplicationController
log_activity(f, 'download zip') log_activity(f, 'download zip')
audit = DmsfFileRevisionAccess.new audit = DmsfFileRevisionAccess.new
audit.user = User.current audit.user = User.current
audit.revision = f.last_revision audit.dmsf_file_revision = f.last_revision
audit.action = DmsfFileRevisionAccess::DownloadAction audit.action = DmsfFileRevisionAccess::DownloadAction
audit.save! audit.save!
end end
@ -494,7 +501,7 @@ class DmsfController < ApplicationController
selected_folders.each do |selected_folder_id| selected_folders.each do |selected_folder_id|
folder = DmsfFolder.visible.find_by_id selected_folder_id folder = DmsfFolder.visible.find_by_id selected_folder_id
if folder if folder
zip.add_folder(folder, member, (folder.folder.dmsf_path_str if folder.folder)) zip.add_folder(folder, member, (folder.dmsf_folder.dmsf_path_str if folder.dmsf_folder))
else else
raise FileNotFound raise FileNotFound
end end
@ -503,19 +510,18 @@ class DmsfController < ApplicationController
if selected_files && selected_files.is_a?(Array) if selected_files && selected_files.is_a?(Array)
selected_files.each do |selected_file_id| selected_files.each do |selected_file_id|
file = DmsfFile.visible.find_by_id selected_file_id file = DmsfFile.visible.find_by_id selected_file_id
unless file && file.last_revision && File.exists?(file.last_revision.disk_file)
raise FileNotFound
end
unless (file.project == @project) || User.current.allowed_to?(:view_dmsf_files, file.project) unless (file.project == @project) || User.current.allowed_to?(:view_dmsf_files, file.project)
raise DmsfAccessError raise DmsfAccessError
end end
if file && file.last_revision && File.exists?(file.last_revision.disk_file) zip.add_file(file, member, (file.dmsf_folder.dmsf_path_str if file.dmsf_folder)) if file
zip.add_file(file, member, (file.folder.dmsf_path_str if file.folder)) if file
else
raise FileNotFound
end
end end
end end
max_files = Setting.plugin_redmine_dmsf['dmsf_max_file_download'].to_i max_files = Setting.plugin_redmine_dmsf['dmsf_max_file_download'].to_i
if max_files > 0 && zip.files.length > max_files if max_files > 0 && zip.files.length > max_files
raise ZipMaxFilesError, zip.files.length raise ZipMaxFilesError#, zip.files.length
end end
zip zip
end end
@ -563,6 +569,7 @@ class DmsfController < ApplicationController
if folder if folder
unless folder.delete commit unless folder.delete commit
flash[:error] = folder.errors.full_messages.to_sentence flash[:error] = folder.errors.full_messages.to_sentence
return
end end
elsif !commit elsif !commit
raise FileNotFound raise FileNotFound
@ -589,9 +596,17 @@ class DmsfController < ApplicationController
log_activity(f, 'deleted') log_activity(f, 'deleted')
end end
begin begin
DmsfMailer.get_notify_users(@project, deleted_files).each do |u| recipients = DmsfMailer.get_notify_users(@project, deleted_files)
recipients.each do |u|
DmsfMailer.files_deleted(u, @project, deleted_files).deliver DmsfMailer.files_deleted(u, @project, deleted_files).deliver
end end
if Setting.plugin_redmine_dmsf[:dmsf_display_notified_recipients] == '1'
unless recipients.empty?
to = recipients.collect{ |r| r.name }.first(DMSF_MAX_NOTIFICATION_RECEIVERS_INFO).join(', ')
to << ((recipients.count > DMSF_MAX_NOTIFICATION_RECEIVERS_INFO) ? ',...' : '.')
flash[:warning] = l(:warning_email_notifications, :to => to)
end
end
rescue Exception => e rescue Exception => e
Rails.logger.error "Could not send email notifications: #{e.message}" Rails.logger.error "Could not send email notifications: #{e.message}"
end end
@ -625,18 +640,15 @@ class DmsfController < ApplicationController
render_404 render_404
end end
def tree_view
tag = params[:custom_field_id].present? && params[:custom_value].present?
@tree_view = (User.current.pref[:dmsf_tree_view] == '1') && (!%w(atom xml json).include?(params[:format])) && !tag
end
def copy_folder(folder) def copy_folder(folder)
copy = folder.clone copy = folder.clone
copy.id = folder.id copy.id = folder.id
copy copy
end end
private
def e_params
params.fetch(:email, {}).permit(
:to, :zipped_content, :email,
:cc, :subject, :zipped_content => [], :files => [])
end
end end

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -27,6 +27,7 @@ class DmsfFilesController < ApplicationController
before_filter :find_file, :except => [:delete_revision] before_filter :find_file, :except => [:delete_revision]
before_filter :find_revision, :only => [:delete_revision] before_filter :find_revision, :only => [:delete_revision]
before_filter :authorize before_filter :authorize
before_filter :tree_view, :only => [:delete]
accept_api_auth :show accept_api_auth :show
@ -39,14 +40,14 @@ class DmsfFilesController < ApplicationController
@revision = @file.last_revision @revision = @file.last_revision
else else
@revision = DmsfFileRevision.find(params[:download].to_i) @revision = DmsfFileRevision.find(params[:download].to_i)
raise DmsfAccessError if @revision.file != @file raise DmsfAccessError if @revision.dmsf_file != @file
end end
check_project(@revision.file) check_project(@revision.dmsf_file)
raise ActionController::MissingFile if @file.deleted raise ActionController::MissingFile if @file.deleted?
log_activity('downloaded') log_activity('downloaded')
access = DmsfFileRevisionAccess.new access = DmsfFileRevisionAccess.new
access.user = User.current access.user = User.current
access.revision = @revision access.dmsf_file_revision = @revision
access.action = DmsfFileRevisionAccess::DownloadAction access.action = DmsfFileRevisionAccess::DownloadAction
access.save! access.save!
member = Member.where(:user_id => User.current.id, :project_id => @file.project.id).first member = Member.where(:user_id => User.current.id, :project_id => @file.project.id).first
@ -71,14 +72,14 @@ class DmsfFilesController < ApplicationController
@revision = @file.last_revision @revision = @file.last_revision
else else
@revision = DmsfFileRevision.find(params[:download].to_i) @revision = DmsfFileRevision.find(params[:download].to_i)
raise DmsfAccessError if @revision.file != @file raise DmsfAccessError if @revision.dmsf_file != @file
end end
check_project(@revision.file) check_project(@revision.dmsf_file)
raise ActionController::MissingFile if @revision.file.deleted raise ActionController::MissingFile if @revision.dmsf_file.deleted?
log_activity('downloaded') log_activity('downloaded')
access = DmsfFileRevisionAccess.new access = DmsfFileRevisionAccess.new
access.user = User.current access.user = User.current
access.revision = @revision access.dmsf_file_revision = @revision
access.action = DmsfFileRevisionAccess::DownloadAction access.action = DmsfFileRevisionAccess::DownloadAction
access.save! access.save!
member = Member.where(:user_id => User.current.id, :project_id => @file.project.id).first member = Member.where(:user_id => User.current.id, :project_id => @file.project.id).first
@ -98,7 +99,8 @@ class DmsfFilesController < ApplicationController
@revision = @file.last_revision @revision = @file.last_revision
@file_delete_allowed = User.current.allowed_to?(:file_delete, @project) @file_delete_allowed = User.current.allowed_to?(:file_delete, @project)
@revision_pages = Paginator.new @file.revisions.visible.count, params['per_page'] ? params['per_page'].to_i : 25, params['page'] @file_manipulation_allowed = User.current.allowed_to?(:file_manipulation, @project)
@revision_pages = Paginator.new @file.dmsf_file_revisions.visible.count, params['per_page'] ? params['per_page'].to_i : 25, params['page']
respond_to do |format| respond_to do |format|
format.html { format.html {
@ -119,7 +121,7 @@ class DmsfFilesController < ApplicationController
revision.description = params[:dmsf_file_revision][:description] revision.description = params[:dmsf_file_revision][:description]
revision.comment = params[:dmsf_file_revision][:comment] revision.comment = params[:dmsf_file_revision][:comment]
revision.file = @file revision.dmsf_file = @file
last_revision = @file.last_revision last_revision = @file.last_revision
revision.source_revision = last_revision revision.source_revision = last_revision
revision.user = User.current revision.user = User.current
@ -127,27 +129,27 @@ class DmsfFilesController < ApplicationController
revision.major_version = last_revision.major_version revision.major_version = last_revision.major_version
revision.minor_version = last_revision.minor_version revision.minor_version = last_revision.minor_version
version = params[:version].to_i version = params[:version].to_i
if version == 3
revision.major_version = params[:custom_version_major].to_i
revision.minor_version = params[:custom_version_minor].to_i
else
revision.increase_version(version)
end
file_upload = params[:file_upload] file_upload = params[:file_upload]
unless file_upload unless file_upload
revision.disk_filename = last_revision.disk_filename
if version == 3
revision.major_version = params[:custom_version_major].to_i
revision.minor_version = params[:custom_version_minor].to_i
else
revision.increase_version(version, false)
end
revision.mime_type = last_revision.mime_type
revision.size = last_revision.size revision.size = last_revision.size
else revision.disk_filename = last_revision.disk_filename
if version == 3 revision.mime_type = last_revision.mime_type
revision.major_version = params[:custom_version_major].to_i if last_revision.digest.blank?
revision.minor_version = params[:custom_version_minor].to_i revision.digest = DmsfFileRevision.create_digest last_revision.disk_file
else else
revision.increase_version(version, true) revision.digest = last_revision.digest
end end
else
revision.size = file_upload.size revision.size = file_upload.size
revision.disk_filename = revision.new_storage_filename revision.disk_filename = revision.new_storage_filename
revision.mime_type = Redmine::MimeType.of(file_upload.original_filename) revision.mime_type = Redmine::MimeType.of(file_upload.original_filename)
revision.digest = DmsfFileRevision.create_digest file_upload.path
end end
# Custom fields # Custom fields
@ -210,35 +212,39 @@ class DmsfFilesController < ApplicationController
if commit if commit
log_activity('deleted') log_activity('deleted')
begin begin
DmsfMailer.get_notify_users(@project, [@file]).each do |u| recipients = DmsfMailer.get_notify_users(@project, [@file])
recipients.each do |u|
DmsfMailer.files_deleted(u, @project, [@file]).deliver DmsfMailer.files_deleted(u, @project, [@file]).deliver
end end
if Setting.plugin_redmine_dmsf[:dmsf_display_notified_recipients] == '1'
unless recipients.empty?
to = recipients.collect{ |r| r.name }.first(DMSF_MAX_NOTIFICATION_RECEIVERS_INFO).join(', ')
to << ((recipients.count > DMSF_MAX_NOTIFICATION_RECEIVERS_INFO) ? ',...' : '.')
flash[:warning] = l(:warning_email_notifications, :to => to)
end
end
rescue Exception => e rescue Exception => e
Rails.logger.error "Could not send email notifications: #{e.message}" Rails.logger.error "Could not send email notifications: #{e.message}"
end end
end end
else else
@file.errors.each do |e, msg| flash[:error] = @file.errors.full_messages.join(', ')
flash[:error] = msg
end
end end
end end
if commit if commit || @tree_view
redirect_to :back redirect_to :back
else else
redirect_to dmsf_folder_path(:id => @project, :folder_id => @file.folder) redirect_to dmsf_folder_path(:id => @project, :folder_id => @file.dmsf_folder)
end end
end end
def delete_revision def delete_revision
if @revision # && !@revision.deleted if @revision
if @revision.delete(true) if @revision.delete(true)
flash[:notice] = l(:notice_revision_deleted) flash[:notice] = l(:notice_revision_deleted)
log_activity('deleted') log_activity('deleted')
else else
@revision.errors.each do |e, msg| flash[:error] = @revision.errors.full_messages.join(', ')
flash[:error] = msg
end
end end
end end
redirect_to :action => 'show', :id => @file redirect_to :action => 'show', :id => @file
@ -248,8 +254,12 @@ class DmsfFilesController < ApplicationController
if @file.locked? if @file.locked?
flash[:warning] = l(:warning_file_already_locked) flash[:warning] = l(:warning_file_already_locked)
else else
@file.lock! begin
flash[:notice] = l(:notice_file_locked) @file.lock!
flash[:notice] = l(:notice_file_locked)
rescue Exception => e
flash[:error] = e.message
end
end end
redirect_to :back redirect_to :back
end end
@ -259,8 +269,12 @@ class DmsfFilesController < ApplicationController
flash[:warning] = l(:warning_file_not_locked) flash[:warning] = l(:warning_file_not_locked)
else else
if @file.locks[0].user == User.current || User.current.allowed_to?(:force_file_unlock, @file.project) if @file.locks[0].user == User.current || User.current.allowed_to?(:force_file_unlock, @file.project)
@file.unlock! begin
flash[:notice] = l(:notice_file_unlocked) @file.unlock!
flash[:notice] = l(:notice_file_unlocked)
rescue Exception => e
flash[:error] = e.message
end
else else
flash[:error] = l(:error_only_user_that_locked_file_can_unlock_it) flash[:error] = l(:error_only_user_that_locked_file_can_unlock_it)
end end
@ -300,11 +314,6 @@ class DmsfFilesController < ApplicationController
private private
def frev_params
params.require(:dmsf_file_revision).permit(
:title, :name, :description, :comment)
end
def log_activity(action) def log_activity(action)
Rails.logger.info "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} #{User.current.login}@#{request.remote_ip}/#{request.env['HTTP_X_FORWARDED_FOR']}: #{action} dmsf://#{@file.project.identifier}/#{@file.id}/#{@revision.id if @revision}" Rails.logger.info "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} #{User.current.login}@#{request.remote_ip}/#{request.env['HTTP_X_FORWARDED_FOR']}: #{action} dmsf://#{@file.project.identifier}/#{@file.id}/#{@revision.id if @revision}"
end end
@ -318,7 +327,7 @@ class DmsfFilesController < ApplicationController
def find_revision def find_revision
@revision = DmsfFileRevision.visible.find params[:id] @revision = DmsfFileRevision.visible.find params[:id]
@file = @revision.file @file = @revision.dmsf_file
@project = @file.project @project = @file.project
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
render_404 render_404
@ -330,4 +339,9 @@ class DmsfFilesController < ApplicationController
end end
end end
def tree_view
tag = params[:custom_field_id].present? && params[:custom_value].present?
@tree_view = (User.current.pref[:dmsf_tree_view] == '1') && (!%w(atom xml json).include?(params[:format])) && !tag
end
end end

View File

@ -36,7 +36,7 @@ class DmsfFilesCopyController < ApplicationController
end end
@target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank? @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank?
@target_folder ||= @file.folder if @target_project == @project @target_folder ||= @file.dmsf_folder if @target_project == @project
render :layout => !request.xhr? render :layout => !request.xhr?
end end
@ -47,13 +47,13 @@ class DmsfFilesCopyController < ApplicationController
render_403 render_403
return return
end end
@target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank? @target_folder = DmsfFolder.visible.find_by_id(params[:target_folder_id]) unless params[:target_folder_id].blank?
if !@target_folder.nil? && @target_folder.project != @target_project if @target_folder && (@target_folder.project != @target_project)
raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project)
end end
if (@target_folder && @target_folder == @file.folder) || if (@target_folder && @target_folder == @file.dmsf_folder) ||
(@target_folder.nil? && @file.folder.nil? && @target_project == @file.project) (@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project)
flash[:error] = l(:error_target_folder_same) flash[:error] = l(:error_target_folder_same)
redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder
return return
@ -84,8 +84,8 @@ class DmsfFilesCopyController < ApplicationController
raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project)
end end
if (@target_folder && @target_folder == @file.folder) || if (@target_folder && @target_folder == @file.dmsf_folder) ||
(@target_folder.nil? && @file.folder.nil? && @target_project == @file.project) (@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project)
flash[:error] = l(:error_target_folder_same) flash[:error] = l(:error_target_folder_same)
redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder
return return
@ -105,7 +105,7 @@ class DmsfFilesCopyController < ApplicationController
redirect_to dmsf_file_path(@file) redirect_to dmsf_file_path(@file)
end end
private private
def log_activity(file, action) def log_activity(file, action)
Rails.logger.info "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} #{User.current.login}@#{request.remote_ip}/#{request.env['HTTP_X_FORWARDED_FOR']}: #{action} dmsf://#{file.project.identifier}/#{file.id}/#{file.last_revision.id}" Rails.logger.info "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} #{User.current.login}@#{request.remote_ip}/#{request.env['HTTP_X_FORWARDED_FOR']}: #{action} dmsf://#{file.project.identifier}/#{file.id}/#{file.last_revision.id}"

View File

@ -34,7 +34,7 @@ class DmsfFoldersCopyController < ApplicationController
end end
@target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank? @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank?
@target_folder ||= @folder.folder if @target_project == @project @target_folder ||= @folder.dmsf_folder if @target_project == @project
render :layout => !request.xhr? render :layout => !request.xhr?
end end
@ -50,8 +50,8 @@ class DmsfFoldersCopyController < ApplicationController
raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project)
end end
if (@target_folder && @target_folder == @folder.folder) || if (@target_folder && @target_folder == @folder.dmsf_folder) ||
(@target_folder.nil? && @folder.folder.nil? && @target_project == @folder.project) (@target_folder.nil? && @folder.dmsf_folder.nil? && @target_project == @folder.project)
flash[:error] = l(:error_target_folder_same) flash[:error] = l(:error_target_folder_same)
redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, :target_folder_id => @target_folder redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, :target_folder_id => @target_folder
return return

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -32,7 +32,7 @@ class DmsfLinksController < ApplicationController
if params[:dmsf_link].present? if params[:dmsf_link].present?
# Reload # Reload
@dmsf_link.dmsf_folder_id = params[:dmsf_link][:dmsf_folder_id] # TODO: Add stuff in here for external links so that if error occurs, repopulate the same @dmsf_link.dmsf_folder_id = params[:dmsf_link][:dmsf_folder_id]
@dmsf_file_id = params[:dmsf_link][:dmsf_file_id] @dmsf_file_id = params[:dmsf_link][:dmsf_file_id]
@type = params[:dmsf_link][:type] @type = params[:dmsf_link][:type]
@link_external = (@type == 'link_from') && (params[:external_link] == 'true') @link_external = (@type == 'link_from') && (params[:external_link] == 'true')
@ -53,7 +53,7 @@ class DmsfLinksController < ApplicationController
if file if file
folder = DmsfFolder.find_by_id params[:dmsf_link][:target_folder_id] folder = DmsfFolder.find_by_id params[:dmsf_link][:target_folder_id]
if (folder && (folder.project_id == @dmsf_link.target_project_id) && folder.files.include?(file)) || folder.nil? if (folder && (folder.project_id == @dmsf_link.target_project_id) && folder.dmsf_files.include?(file)) || folder.nil?
@dmsf_link.name = file.title @dmsf_link.name = file.title
end end
end end

View File

@ -61,14 +61,16 @@ class DmsfUploadController < ApplicationController
return return
end end
@disk_filename = DmsfHelper.temp_filename(@tempfile.original_filename) @disk_filename = DmsfHelper.temp_filename(@tempfile.original_filename)
target = "#{DmsfHelper.temp_dir}/#{@disk_filename}"
begin begin
FileUtils.cp @tempfile.path, "#{DmsfHelper.temp_dir}/#{@disk_filename}" FileUtils.cp @tempfile.path, target
FileUtils.chmod 'u=wr,g=r', target
rescue Exception => e rescue Exception => e
Rails.logger.error e.message Rails.logger.error e.message
end end
if File.size("#{DmsfHelper.temp_dir}/#{@disk_filename}") <= 0 if File.size(target) <= 0
begin begin
File.delete "#{DmsfHelper.temp_dir}/#{@disk_filename}" File.delete target
rescue Exception => e rescue Exception => e
Rails.logger.error e.message Rails.logger.error e.message
end end
@ -149,15 +151,11 @@ class DmsfUploadController < ApplicationController
file = DmsfFile.new file = DmsfFile.new
file.project = @project file.project = @project
file.name = name file.name = name
file.folder = @folder file.dmsf_folder = @folder
file.notification = Setting.plugin_redmine_dmsf[:dmsf_default_notifications].present? file.notification = Setting.plugin_redmine_dmsf[:dmsf_default_notifications].present?
new_revision.minor_version = 0 new_revision.minor_version = 0
new_revision.major_version = 0 new_revision.major_version = 0
else else
if file.locked_for_user?
failed_uploads.push(commited_file)
next
end
if file.last_revision if file.last_revision
last_revision = file.last_revision last_revision = file.last_revision
new_revision.source_revision = last_revision new_revision.source_revision = last_revision
@ -169,9 +167,14 @@ class DmsfUploadController < ApplicationController
end end
end end
if file.locked_for_user?
failed_uploads.push(commited_file)
next
end
commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_file[:disk_filename].gsub(/[\/\\]/,'')}" commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_file[:disk_filename].gsub(/[\/\\]/,'')}"
new_revision.file = file new_revision.dmsf_file = file
new_revision.user = User.current new_revision.user = User.current
new_revision.name = name new_revision.name = name
new_revision.title = commited_file[:title] new_revision.title = commited_file[:title]
@ -182,20 +185,11 @@ class DmsfUploadController < ApplicationController
new_revision.major_version = commited_file[:custom_version_major].to_i new_revision.major_version = commited_file[:custom_version_major].to_i
new_revision.minor_version = commited_file[:custom_version_minor].to_i new_revision.minor_version = commited_file[:custom_version_minor].to_i
else else
new_revision.increase_version(version, true) new_revision.increase_version(version)
end end
new_revision.mime_type = Redmine::MimeType.of(new_revision.name) new_revision.mime_type = Redmine::MimeType.of(new_revision.name)
new_revision.size = File.size(commited_disk_filepath) new_revision.size = File.size(commited_disk_filepath)
new_revision.digest = DmsfFileRevision.create_digest commited_disk_filepath
if file.locked?
begin
file.unlock!
flash[:notice] = l(:notice_file_unlocked)
rescue DmsfLockError => e
flash[:error] = e.message
next
end
end
# Need to save file first to generate id for it in case of creation. # Need to save file first to generate id for it in case of creation.
# File id is needed to properly generate revision disk filename # File id is needed to properly generate revision disk filename
@ -214,9 +208,15 @@ class DmsfUploadController < ApplicationController
if new_revision.save if new_revision.save
new_revision.assign_workflow(commited_file[:dmsf_workflow_id]) new_revision.assign_workflow(commited_file[:dmsf_workflow_id])
FileUtils.mv(commited_disk_filepath, new_revision.disk_file) begin
file.set_last_revision new_revision FileUtils.mv(commited_disk_filepath, new_revision.disk_file)
@files.push(file) file.set_last_revision new_revision
@files.push(file)
rescue Exception => e
Rails.logger.error e.message
flash[:error] = e.message
failed_uploads.push(file)
end
else else
failed_uploads.push(commited_file) failed_uploads.push(commited_file)
end end

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -29,7 +29,8 @@ class DmsfWorkflowsController < ApplicationController
layout :workflows_layout layout :workflows_layout
def index def index
@workflow_pages, @workflows = paginate DmsfWorkflow.global.sorted, :per_page => 25 @status = params[:status] || 1
@workflow_pages, @workflows = paginate DmsfWorkflow.status(@status).global.sorted, :per_page => 25
end end
def action def action
@ -46,17 +47,16 @@ class DmsfWorkflowsController < ApplicationController
revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id] revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id]
if revision if revision
if @dmsf_workflow.try_finish revision, action, (params[:step_action].to_i / 10) if @dmsf_workflow.try_finish revision, action, (params[:step_action].to_i / 10)
file = DmsfFile.joins(:revisions).where(:dmsf_file_revisions => {:id => revision.id}).first if revision.dmsf_file
if file
begin begin
file.unlock! true revision.dmsf_file.unlock! true
rescue DmsfLockError => e rescue DmsfLockError => e
flash[:info] = e.message flash[:info] = e.message
end end
end end
if revision.workflow == DmsfWorkflow::STATE_APPROVED if revision.workflow == DmsfWorkflow::STATE_APPROVED
# Just approved # Just approved
recipients = DmsfMailer.get_notify_users(@project) recipients = DmsfMailer.get_notify_users(@project, [revision.dmsf_file])
recipients.each do |user| recipients.each do |user|
DmsfMailer.workflow_notification( DmsfMailer.workflow_notification(
user, user,
@ -78,7 +78,7 @@ class DmsfWorkflowsController < ApplicationController
recipients = @dmsf_workflow.participiants recipients = @dmsf_workflow.participiants
recipients.push User.find_by_id revision.dmsf_workflow_assigned_by recipients.push User.find_by_id revision.dmsf_workflow_assigned_by
recipients.uniq! recipients.uniq!
recipients = recipients & DmsfMailer.get_notify_users(@project) recipients = recipients & DmsfMailer.get_notify_users(@project, [revision.dmsf_file])
recipients.each do |user| recipients.each do |user|
DmsfMailer.workflow_notification( DmsfMailer.workflow_notification(
user, user,
@ -205,8 +205,8 @@ class DmsfWorkflowsController < ApplicationController
# Reload # Reload
if params[:dmsf_workflow] && params[:dmsf_workflow][:name].present? if params[:dmsf_workflow] && params[:dmsf_workflow][:name].present?
@dmsf_workflow.name = params[:dmsf_workflow][:name] @dmsf_workflow.name = params[:dmsf_workflow][:name]
elsif params[:dmsf_workflow_id].present? elsif params[:dmsf_workflow] && params[:dmsf_workflow][:id].present?
wf = DmsfWorkflow.find_by_id params[:dmsf_workflow_id] wf = DmsfWorkflow.find_by_id params[:dmsf_workflow][:id]
@dmsf_workflow.name = wf.name if wf @dmsf_workflow.name = wf.name if wf
end end
@ -215,13 +215,14 @@ class DmsfWorkflowsController < ApplicationController
def create def create
if params[:dmsf_workflow] if params[:dmsf_workflow]
if (params[:dmsf_workflow_id].to_i > 0) if (params[:dmsf_workflow][:id].to_i > 0)
wf = DmsfWorkflow.find_by_id params[:dmsf_workflow_id] wf = DmsfWorkflow.find_by_id params[:dmsf_workflow][:id]
@dmsf_workflow = wf.copy_to(@project, params[:dmsf_workflow][:name]) if wf @dmsf_workflow = wf.copy_to(@project, params[:dmsf_workflow][:name]) if wf
else else
@dmsf_workflow = DmsfWorkflow.new @dmsf_workflow = DmsfWorkflow.new
@dmsf_workflow.name = params[:dmsf_workflow][:name] @dmsf_workflow.name = params[:dmsf_workflow][:name]
@dmsf_workflow.project_id = @project.id if @project @dmsf_workflow.project_id = @project.id if @project
@dmsf_workflow.author = User.current
@dmsf_workflow.save @dmsf_workflow.save
end end
end end
@ -238,16 +239,21 @@ class DmsfWorkflowsController < ApplicationController
end end
def update def update
if params[:dmsf_workflow] && @dmsf_workflow.update_attributes( if params[:dmsf_workflow]
{:name => params[:dmsf_workflow][:name]}) res = @dmsf_workflow.update_attributes({:name => params[:dmsf_workflow][:name]}) if params[:dmsf_workflow][:name].present?
flash[:notice] = l(:notice_successful_update) res = @dmsf_workflow.update_attributes({:status => params[:dmsf_workflow][:status]}) if params[:dmsf_workflow][:status].present?
if @project if res
redirect_to settings_project_path(@project, :tab => 'dmsf_workflow') flash[:notice] = l(:notice_successful_update)
if @project
redirect_to settings_project_path(@project, :tab => 'dmsf_workflow')
else
redirect_to dmsf_workflows_path
end
else else
redirect_to dmsf_workflows_path flash[:error] = @dmsf_workflow.errors.full_messages.to_sentence
redirect_to dmsf_workflow_path(@dmsf_workflow)
end end
else else
flash[:error] = @dmsf_workflow.errors.full_messages.to_sentence
redirect_to dmsf_workflow_path(@dmsf_workflow) redirect_to dmsf_workflow_path(@dmsf_workflow)
end end
end end
@ -332,12 +338,15 @@ class DmsfWorkflowsController < ApplicationController
def reorder_steps def reorder_steps
if request.put? if request.put?
unless @dmsf_workflow.reorder_steps(params[:step].to_i, params[:workflow_step][:move_to]) unless @dmsf_workflow.reorder_steps(params[:step].to_i, params[:dmsf_workflow][:position].to_i)
flash[:error] = l(:notice_cannot_renumber_steps) flash[:error] = l(:notice_cannot_renumber_steps)
end end
end end
respond_to do |format| respond_to do |format|
format.html format.html
format.js {
render inline: "location.replace('#{dmsf_workflow_path(@dmsf_workflow)}');"
}
end end
end end
@ -382,10 +391,12 @@ private
@project = @dmsf_workflow.project @project = @dmsf_workflow.project
else # Global workflow else # Global workflow
revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id] revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id]
@project = revision.file.project if revision && revision.file @project = revision.dmsf_file.project if revision && revision.dmsf_file
end end
else else
if params[:project_id].present? if params[:dmsf_workflow]
@project = Project.find_by_id params[:dmsf_workflow][:project_id]
elsif params[:project_id]
@project = Project.find_by_id params[:project_id] @project = Project.find_by_id params[:project_id]
else else
@project = Project.find_by_identifier params[:id] @project = Project.find_by_identifier params[:id]

View File

@ -1,6 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -64,16 +67,40 @@ module DmsfHelper
return "#{Redmine::Utils.relative_url_root}/plugin_assets/#{plugin}/#{asset_type}/#{source}" return "#{Redmine::Utils.relative_url_root}/plugin_assets/#{plugin}/#{asset_type}/#{source}"
end end
def self.to_time(obj) def self.dmsf_tree(parent, obj, tree = nil)
#Right, enough of bugs, let's try a better approach here. tree ||= []
return if !obj # Folders && files && links
return obj.to_time(ActiveRecord::Base.default_timezone) if obj.is_a?(String) nodes = obj.dmsf_folders.visible + obj.dmsf_links.visible + obj.dmsf_files.visible
# Alphabetical and type sort
# Why can't Mysql::Time conform to time object? - without a utc? method it breaks redmine's nodes.sort! do |x, y|
# rendering method, so we convert it to string, and back into time - not the most efficient if ((x.is_a?(DmsfFolder) || (x.is_a?(DmsfLink) && x.is_folder?)) &&
# of methods - however seems functional. Not sure if MySQL (y.is_a?(DmsfFile) || (y.is_a?(DmsfLink) && y.is_file?)))
return obj.to_s.to_time(ActiveRecord::Base.default_timezone) if obj.class.name == 'Mysql::Time' -1
return obj elsif ((x.is_a?(DmsfFile) || (x.is_a?(DmsfLink) && x.is_file?)) &&
(y.is_a?(DmsfFolder) || (y.is_a?(DmsfLink) && y.is_folder?)))
1
else
x.title.downcase <=> y.title.downcase
end
end
# Create the tree
nodes.each do |node|
local_parent = node.dmsf_folder
level = 0
while local_parent && (local_parent != parent)
level += 1
local_parent = local_parent.dmsf_folder
end
position = tree.size
# Files of the same parent and on the same level have the same position
if position > 0 && tree[-1][1] == level &&
(tree[-1][0].is_a?(DmsfFile) || (tree[-1][0].is_a?(DmsfLink) && tree[-1][0].is_file?))
position = tree[-1][2]
end
tree << [node, level, position]
self.dmsf_tree(parent, node, tree) if node.is_a?(DmsfFolder)
end
tree
end end
end end

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2014 Karel Pičman <karel.picman@lbcfree.net> # Copyright (C) 2011-16 Karel Pičman <karel.picman@lbcfree.net>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -26,10 +26,12 @@ module DmsfWorkflowsHelper
principal_pages = Redmine::Pagination::Paginator.new principal_count, 10, params['page'] principal_pages = Redmine::Pagination::Paginator.new principal_count, 10, params['page']
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all
# Delegation
if dmsf_workflow_step_assignment_id if dmsf_workflow_step_assignment_id
s = content_tag('div', s = content_tag('div',
content_tag('div', principals_radio_button_tags('user_ids[]', principals), :id => 'users_for_delegate'), content_tag('div', principals_radio_button_tags('step_action', principals), :id => 'users_for_delegate'),
:class => 'objects-selection') :class => 'objects-selection')
# New step
else else
s = content_tag('div', s = content_tag('div',
content_tag('div', principals_check_box_tags('user_ids[]', principals), :id => 'users'), content_tag('div', principals_check_box_tags('user_ids[]', principals), :id => 'users'),
@ -56,7 +58,7 @@ module DmsfWorkflowsHelper
def dmsf_workflows_for_select(project, dmsf_workflow_id) def dmsf_workflows_for_select(project, dmsf_workflow_id)
options = Array.new options = Array.new
options << ['', -1] options << ['', -1]
DmsfWorkflow.sorted.where(['project_id = ? OR project_id IS NULL', project.id]).each do |wf| DmsfWorkflow.active.sorted.where(['project_id = ? OR project_id IS NULL', project.id]).each do |wf|
if wf.project_id if wf.project_id
options << [wf.name, wf.id] options << [wf.name, wf.id]
else else
@ -69,7 +71,7 @@ module DmsfWorkflowsHelper
def dmsf_all_workflows_for_select(dmsf_workflow_id) def dmsf_all_workflows_for_select(dmsf_workflow_id)
options = Array.new options = Array.new
options << ['', 0] options << ['', 0]
DmsfWorkflow.sorted.all.each do |wf| DmsfWorkflow.active.sorted.all.each do |wf|
if wf.project_id if wf.project_id
prj = Project.find_by_id wf.project_id prj = Project.find_by_id wf.project_id
if User.current.allowed_to?(:manage_workflows, prj) if User.current.allowed_to?(:manage_workflows, prj)
@ -95,4 +97,21 @@ module DmsfWorkflowsHelper
end end
s.html_safe s.html_safe
end end
def change_status_link(workflow)
url = { :controller => 'dmsf_workflows', :action => 'update', :id => workflow.id }
if workflow.locked?
link_to l(:button_unlock), url.merge(:dmsf_workflow => {:status => DmsfWorkflow::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock'
else
link_to l(:button_lock), url.merge(:dmsf_workflow => {:status => DmsfWorkflow::STATUS_LOCKED}), :method => :put, :class => 'icon icon-lock'
end
end
def workflows_status_options_for_select(selected)
worflows_count_by_status = DmsfWorkflow.global.group('status').count.to_hash
options_for_select([[l(:label_all), ''],
["#{l(:status_active)} (#{worflows_count_by_status[DmsfWorkflow::STATUS_ACTIVE].to_i})", DmsfWorkflow::STATUS_ACTIVE.to_s],
["#{l(:status_locked)} (#{worflows_count_by_status[DmsfWorkflow::STATUS_LOCKED].to_i})", DmsfWorkflow::STATUS_LOCKED.to_s]], selected.to_s)
end
end end

View File

@ -33,24 +33,21 @@ class DmsfFile < ActiveRecord::Base
include RedmineDmsf::Lockable include RedmineDmsf::Lockable
belongs_to :project belongs_to :project
belongs_to :folder, :class_name => 'DmsfFolder', :foreign_key => 'dmsf_folder_id' belongs_to :dmsf_folder
belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id' belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id'
has_many :revisions, -> { order("#{DmsfFileRevision.table_name}.major_version DESC, #{DmsfFileRevision.table_name}.minor_version DESC, #{DmsfFileRevision.table_name}.updated_at DESC") }, has_many :dmsf_file_revisions, -> { order("#{DmsfFileRevision.table_name}.major_version DESC, #{DmsfFileRevision.table_name}.minor_version DESC, #{DmsfFileRevision.table_name}.updated_at DESC") },
:class_name => 'DmsfFileRevision', :foreign_key => 'dmsf_file_id',
:dependent => :destroy :dependent => :destroy
has_many :locks, -> { where(entity_type: 0).order("#{DmsfLock.table_name}.updated_at DESC") }, has_many :locks, -> { where(entity_type: 0).order("#{DmsfLock.table_name}.updated_at DESC") },
:class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy :class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy
has_many :referenced_links, -> { where target_type: DmsfFile.model_name.to_s}, has_many :referenced_links, -> { where target_type: DmsfFile.model_name.to_s},
:class_name => 'DmsfLink', :foreign_key => 'target_id', :dependent => :destroy :class_name => 'DmsfLink', :foreign_key => 'target_id', :dependent => :destroy
accepts_nested_attributes_for :revisions, :locks, :referenced_links, :project
scope :visible, lambda { |*args| STATUS_DELETED = 1
where(deleted: false) STATUS_ACTIVE = 0
}
scope :deleted, lambda { |*args| scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
where(deleted: true) scope :deleted, -> { where(:deleted => STATUS_DELETED) }
}
validates :name, :presence => true validates :name, :presence => true
validates_format_of :name, :with => DmsfFolder.invalid_characters, validates_format_of :name, :with => DmsfFolder.invalid_characters,
@ -59,7 +56,7 @@ class DmsfFile < ActiveRecord::Base
validate :validates_name_uniqueness validate :validates_name_uniqueness
def validates_name_uniqueness def validates_name_uniqueness
existing_file = DmsfFile.visible.find_file_by_name(self.project, self.folder, self.name) existing_file = DmsfFile.visible.find_file_by_name(self.project, self.dmsf_folder, self.name)
errors.add(:name, l('activerecord.errors.messages.taken')) unless errors.add(:name, l('activerecord.errors.messages.taken')) unless
existing_file.nil? || existing_file.id == self.id existing_file.nil? || existing_file.id == self.id
end end
@ -76,7 +73,7 @@ class DmsfFile < ActiveRecord::Base
end end
desc desc
}, },
:url => Proc.new { |o| {:controller => 'dmsf_files', :action => 'show', :id => o} }, :url => Proc.new { |o| {:controller => 'dmsf_files', :action => 'view', :id => o} },
:datetime => Proc.new { |o| o.updated_at }, :datetime => Proc.new { |o| o.updated_at },
:author => Proc.new { |o| o.last_revision.user } :author => Proc.new { |o| o.last_revision.user }
@ -97,19 +94,23 @@ class DmsfFile < ActiveRecord::Base
@@storage_path = nil @@storage_path = nil
def self.storage_path def self.storage_path
unless @@storage_path.present? return @@storage_path if @@storage_path.present?
@@storage_path = Setting.plugin_redmine_dmsf['dmsf_storage_directory'].strip if Setting.plugin_redmine_dmsf['dmsf_storage_directory'].present? path = Setting.plugin_redmine_dmsf['dmsf_storage_directory']
@@storage_path = Pathname(Redmine::Configuration['attachments_storage_path']).join('dmsf') if @@storage_path.blank? && Redmine::Configuration['attachments_storage_path'].present? path = Pathname(Redmine::Configuration['attachments_storage_path']).join('dmsf') if path.blank? && Redmine::Configuration['attachments_storage_path'].present?
@@storage_path = Rails.root.join('files/dmsf').to_s if @@storage_path.blank? path = Rails.root.join('files/dmsf').to_s if path.blank?
Dir.mkdir(@@storage_path) unless File.exists?(@@storage_path) path.strip if path
end path
@@storage_path
end end
# Lets introduce a write for storage path, that way we can also # Lets introduce a write for storage path, that way we can also
# better interact from test-cases etc # better interact from test-cases etc
def self.storage_path=(obj) def self.storage_path=(path)
@@storage_path = obj begin
FileUtils.mkdir_p(path) unless File.exists?(path)
rescue Exception => e
Rails.logger.error e.message
end
@@storage_path = path
end end
def self.find_file_by_name(project, folder, name) def self.find_file_by_name(project, folder, name)
@ -121,7 +122,7 @@ class DmsfFile < ActiveRecord::Base
def last_revision def last_revision
unless @last_revision unless @last_revision
@last_revision = deleted ? self.revisions.first : self.revisions.visible.first @last_revision = self.deleted? ? self.dmsf_file_revisions.first : self.dmsf_file_revisions.visible.first
end end
@last_revision @last_revision
end end
@ -130,6 +131,10 @@ class DmsfFile < ActiveRecord::Base
@last_revision = new_revision @last_revision = new_revision
end end
def deleted?
self.deleted == STATUS_DELETED
end
def delete(commit) def delete(commit)
if locked_for_user? if locked_for_user?
Rails.logger.info l(:error_file_is_locked) Rails.logger.info l(:error_file_is_locked)
@ -138,12 +143,11 @@ class DmsfFile < ActiveRecord::Base
end end
begin begin
# Revisions and links of a deleted file SHOULD be deleted too # Revisions and links of a deleted file SHOULD be deleted too
self.revisions.each { |r| r.delete(commit, true) } self.dmsf_file_revisions.each { |r| r.delete(commit, true) }
self.referenced_links.each { |l| l.delete(commit) }
if commit if commit
self.destroy self.destroy
else else
self.deleted = true self.deleted = STATUS_DELETED
self.deleted_by_user = User.current self.deleted_by_user = User.current
save save
end end
@ -155,13 +159,12 @@ class DmsfFile < ActiveRecord::Base
end end
def restore def restore
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted) if self.dmsf_folder_id && (self.dmsf_folder.nil? || self.dmsf_folder.deleted?)
errors[:base] << l(:error_parent_folder) errors[:base] << l(:error_parent_folder)
return false return false
end end
self.revisions.each { |r| r.restore } self.dmsf_file_revisions.each { |r| r.restore }
self.referenced_links.each { |l| l.restore } self.deleted = STATUS_ACTIVE
self.deleted = false
self.deleted_by_user = nil self.deleted_by_user = nil
save save
end end
@ -187,7 +190,7 @@ class DmsfFile < ActiveRecord::Base
end end
def dmsf_path def dmsf_path
path = self.folder.nil? ? [] : self.folder.dmsf_path path = self.dmsf_folder ? self.dmsf_folder.dmsf_path : []
path.push(self) path.push(self)
path path
end end
@ -198,8 +201,8 @@ class DmsfFile < ActiveRecord::Base
def notify? def notify?
return true if self.notification return true if self.notification
return true if folder && folder.notify? return true if self.dmsf_folder && delf.dmsf_folder.notify?
return true if !folder && self.project.dmsf_notification return true if !self.dmsf_folder && self.project.dmsf_notification
return false return false
end end
@ -232,7 +235,7 @@ class DmsfFile < ActiveRecord::Base
# If the target project differs from the source project we must physically move the disk files # If the target project differs from the source project we must physically move the disk files
if self.project != project if self.project != project
self.revisions.all.each do |rev| self.dmsf_file_revisions.all.each do |rev|
if File.exist? rev.disk_file(self.project) if File.exist? rev.disk_file(self.project)
FileUtils.mv rev.disk_file(self.project), rev.disk_file(project) FileUtils.mv rev.disk_file(self.project), rev.disk_file(project)
end end
@ -240,9 +243,9 @@ class DmsfFile < ActiveRecord::Base
end end
self.project = project self.project = project
self.folder = folder self.dmsf_folder = folder
new_revision = self.last_revision.clone new_revision = self.last_revision.clone
new_revision.file = self new_revision.dmsf_file = self
new_revision.comment = l(:comment_moved_from, :source => "#{self.project.identifier}:#{self.dmsf_path_str}") new_revision.comment = l(:comment_moved_from, :source => "#{self.project.identifier}:#{self.dmsf_path_str}")
new_revision.custom_values = [] new_revision.custom_values = []
@ -257,7 +260,7 @@ class DmsfFile < ActiveRecord::Base
# If the target project differs from the source project we must physically move the disk files # If the target project differs from the source project we must physically move the disk files
if self.project != project if self.project != project
self.revisions.all.each do |rev| self.dmsf_file_revisions.all.each do |rev|
if File.exist? rev.disk_file(self.project) if File.exist? rev.disk_file(self.project)
FileUtils.cp rev.disk_file(self.project), rev.disk_file(project) FileUtils.cp rev.disk_file(self.project), rev.disk_file(project)
end end
@ -265,14 +268,14 @@ class DmsfFile < ActiveRecord::Base
end end
file = DmsfFile.new file = DmsfFile.new
file.folder = folder file.dmsf_folder = folder
file.project = project file.project = project
file.name = self.name file.name = self.name
file.notification = Setting.plugin_redmine_dmsf['dmsf_default_notifications'].present? file.notification = Setting.plugin_redmine_dmsf['dmsf_default_notifications'].present?
if file.save && self.last_revision if file.save && self.last_revision
new_revision = self.last_revision.clone new_revision = self.last_revision.clone
new_revision.file = file new_revision.dmsf_file = file
new_revision.comment = l(:comment_copied_from, :source => "#{self.project.identifier}: #{self.dmsf_path_str}") new_revision.comment = l(:comment_copied_from, :source => "#{self.project.identifier}: #{self.dmsf_path_str}")
new_revision.custom_values = [] new_revision.custom_values = []
@ -313,7 +316,7 @@ class DmsfFile < ActiveRecord::Base
results = [] results = []
scope = self.visible.joins(:project, :revisions) scope = self.visible.joins(:project, :dmsf_file_revisions)
scope = scope.limit(options[:limit]) unless options[:limit].blank? scope = scope.limit(options[:limit]) unless options[:limit].blank?
scope = scope.where(limit_options) unless limit_options.blank? scope = scope.where(limit_options) unless limit_options.blank?
scope = scope.where(project_conditions.join(' AND ')) scope = scope.where(project_conditions.join(' AND '))
@ -327,7 +330,7 @@ class DmsfFile < ActiveRecord::Base
Setting.plugin_redmine_dmsf['dmsf_index_database'].strip, lang) Setting.plugin_redmine_dmsf['dmsf_index_database'].strip, lang)
database = Xapian::Database.new(databasepath) database = Xapian::Database.new(databasepath)
rescue Exception => e rescue Exception => e
Rails.logger.warn 'REDMAIN_XAPIAN ERROR: Xapian database is not properly set or initiated or is corrupted.' Rails.logger.warn "REDMAIN_XAPIAN ERROR: Xapian database is not properly set, initiated or it's corrupted."
Rails.logger.warn e.message Rails.logger.warn e.message
end end
@ -438,4 +441,15 @@ class DmsfFile < ActiveRecord::Base
end end
end end
def owner?(user)
self.last_revision && (self.last_revision.user == user)
end
def involved?(user)
self.dmsf_file_revisions.each do |file_revision|
return true if file_revision.user == user
end
false
end
end end

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -19,24 +19,26 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'digest/md5'
class DmsfFileRevision < ActiveRecord::Base class DmsfFileRevision < ActiveRecord::Base
unloadable unloadable
belongs_to :file, :class_name => 'DmsfFile', :foreign_key => 'dmsf_file_id' belongs_to :dmsf_file
belongs_to :source_revision, :class_name => 'DmsfFileRevision', :foreign_key => 'source_dmsf_file_revision_id' belongs_to :source_revision, :class_name => 'DmsfFileRevision', :foreign_key => 'source_dmsf_file_revision_id'
belongs_to :user belongs_to :user
belongs_to :folder, :class_name => 'DmsfFolder', :foreign_key => 'dmsf_folder_id'
belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id' belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id'
has_many :access, :class_name => 'DmsfFileRevisionAccess', :foreign_key => 'dmsf_file_revision_id', :dependent => :destroy has_many :dmsf_file_revision_access, :dependent => :destroy
has_many :dmsf_workflow_step_assignment, :dependent => :destroy has_many :dmsf_workflow_step_assignment, :dependent => :destroy
accepts_nested_attributes_for :access, :dmsf_workflow_step_assignment, :file, :user
# Returns a list of revisions that are not deleted here, or deleted at parent level either STATUS_DELETED = 1
scope :visible, -> { where(deleted: false) } STATUS_ACTIVE = 0
scope :deleted, -> { where(deleted: true) }
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
acts_as_customizable acts_as_customizable
acts_as_event :title => Proc.new {|o| "#{l(:label_dmsf_updated)}: #{o.file.dmsf_path_str}"}, acts_as_event :title => Proc.new {|o| "#{l(:label_dmsf_updated)}: #{o.dmsf_file.dmsf_path_str}"},
:url => Proc.new {|o| {:controller => 'dmsf_files', :action => 'show', :id => o.file}}, :url => Proc.new {|o| {:controller => 'dmsf_files', :action => 'show', :id => o.dmsf_file}},
:datetime => Proc.new {|o| o.updated_at }, :datetime => Proc.new {|o| o.updated_at },
:description => Proc.new {|o| o.comment }, :description => Proc.new {|o| o.comment },
:author => Proc.new {|o| o.user } :author => Proc.new {|o| o.user }
@ -49,18 +51,18 @@ class DmsfFileRevision < ActiveRecord::Base
joins( joins(
"INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " + "INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " +
"INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.project_id = #{Project.table_name}.id"). "INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.project_id = #{Project.table_name}.id").
where("#{DmsfFile.table_name}.deleted = :false", {:false => false}) where("#{DmsfFile.table_name}.deleted = ?", STATUS_ACTIVE)
validates :title, :presence => true validates :title, :presence => true
validates_format_of :name, :with => DmsfFolder.invalid_characters, validates_format_of :name, :with => DmsfFolder.invalid_characters,
:message => l(:error_contains_invalid_character) :message => l(:error_contains_invalid_character)
def project def project
self.file.project if self.file self.dmsf_file.project if self.dmsf_file
end end
def folder def folder
self.file.folder if self.file self.dmsf_file.dmsf_folder if self.dmsf_file
end end
def self.remove_extension(filename) def self.remove_extension(filename)
@ -72,11 +74,11 @@ class DmsfFileRevision < ActiveRecord::Base
end end
def delete(commit = false, force = true) def delete(commit = false, force = true)
if self.file.locked_for_user? if self.dmsf_file.locked_for_user?
errors[:base] << l(:error_file_is_locked) errors[:base] << l(:error_file_is_locked)
return false return false
end end
if !commit && (!force && (self.file.revisions.length <= 1)) if !commit && (!force && (self.dmsf_file.dmsf_file_revisions.length <= 1))
errors[:base] << l(:error_at_least_one_revision_must_be_present) errors[:base] << l(:error_at_least_one_revision_must_be_present)
return false return false
end end
@ -88,14 +90,14 @@ class DmsfFileRevision < ActiveRecord::Base
if commit if commit
self.destroy self.destroy
else else
self.deleted = true self.deleted = DmsfFile::STATUS_DELETED
self.deleted_by_user = User.current self.deleted_by_user = User.current
save save
end end
end end
def restore def restore
self.deleted = false self.deleted = DmsfFile::STATUS_ACTIVE
self.deleted_by_user = nil self.deleted_by_user = nil
save save
end end
@ -120,7 +122,7 @@ class DmsfFileRevision < ActiveRecord::Base
# custom SQL into a temporary object # custom SQL into a temporary object
# #
def access_grouped def access_grouped
access.select('user_id, COUNT(*) AS count, MIN(created_at) AS first_at, MAX(created_at) AS last_at').group('user_id') self.dmsf_file_revision_access.select('user_id, COUNT(*) AS count, MIN(created_at) AS first_at, MAX(created_at) AS last_at').group('user_id')
end end
def version def version
@ -128,13 +130,13 @@ class DmsfFileRevision < ActiveRecord::Base
end end
def disk_file(project = nil) def disk_file(project = nil)
project = self.file.project unless project project = self.dmsf_file.project unless project
storage_base = DmsfFile.storage_path.dup storage_base = DmsfFile.storage_path.dup
if self.file && project if self.dmsf_file && project
project_base = project.identifier.gsub(/[^\w\.\-]/,'_') project_base = project.identifier.gsub(/[^\w\.\-]/,'_')
storage_base << "/p_#{project_base}" storage_base << "/p_#{project_base}"
end end
Dir.mkdir(storage_base) unless File.exists?(storage_base) FileUtils.mkdir_p(storage_base) unless File.exists?(storage_base)
"#{storage_base}/#{self.disk_filename}" "#{storage_base}/#{self.disk_filename}"
end end
@ -147,7 +149,7 @@ class DmsfFileRevision < ActiveRecord::Base
def clone def clone
new_revision = DmsfFileRevision.new new_revision = DmsfFileRevision.new
new_revision.file = self.file new_revision.dmsf_file = self.dmsf_file
new_revision.disk_filename = self.disk_filename new_revision.disk_filename = self.disk_filename
new_revision.size = self.size new_revision.size = self.size
new_revision.mime_type = self.mime_type new_revision.mime_type = self.mime_type
@ -159,6 +161,7 @@ class DmsfFileRevision < ActiveRecord::Base
new_revision.source_revision = self new_revision.source_revision = self
new_revision.user = User.current new_revision.user = User.current
new_revision.name = self.name new_revision.name = self.name
new_revision.digest = self.digest
new_revision new_revision
end end
@ -200,34 +203,31 @@ class DmsfFileRevision < ActiveRecord::Base
wf.assign(self.id) if wf && self.id wf.assign(self.id) if wf && self.id
end end
def increase_version(version_to_increase, new_content) def increase_version(version_to_increase)
if new_content self.minor_version = case version_to_increase
self.minor_version = case version_to_increase when 1
when 2 then 0 self.minor_version + 1
else self.minor_version + 1 when 2
end 0
else else
self.minor_version = case version_to_increase self.minor_version
when 1 then self.minor_version + 1
when 2 then 0
else self.minor_version
end
end end
self.major_version = case version_to_increase self.major_version = case version_to_increase
when 2 then self.major_version + 1 when 2
else self.major_version self.major_version + 1
else
major_version
end end
end end
def new_storage_filename def new_storage_filename
raise DmsfAccessError, 'File id is not set' unless self.file.id raise DmsfAccessError, 'File id is not set' unless self.dmsf_file.id
filename = DmsfHelper.sanitize_filename(self.name) filename = DmsfHelper.sanitize_filename(self.name)
timestamp = DateTime.now.strftime("%y%m%d%H%M%S") timestamp = DateTime.now.strftime("%y%m%d%H%M%S")
while File.exist?(File.join(DmsfFile.storage_path, "#{timestamp}_#{self.file.id}_#{filename}")) while File.exist?(File.join(DmsfFile.storage_path, "#{timestamp}_#{self.dmsf_file.id}_#{filename}"))
timestamp.succ! timestamp.succ!
end end
"#{timestamp}_#{self.file.id}_#{filename}" "#{timestamp}_#{self.dmsf_file.id}_#{filename}"
end end
def copy_file_content(open_file) def copy_file_content(open_file)
@ -256,12 +256,42 @@ class DmsfFileRevision < ActiveRecord::Base
else else
filename = self.name filename = self.name
end end
format.sub!('%t', filename) format.sub!('%t', self.title)
format.sub!('%f', filename)
format.sub!('%d', self.updated_at.strftime('%Y%m%d%H%M%S')) format.sub!('%d', self.updated_at.strftime('%Y%m%d%H%M%S'))
format.sub!('%v', self.version) format.sub!('%v', self.version)
format.sub!('%i', self.file.id.to_s) format.sub!('%i', self.dmsf_file.id.to_s)
format.sub!('%r', self.id.to_s) format.sub!('%r', self.id.to_s)
format + ext format + ext
end end
def self.create_digest(path)
begin
Digest::MD5.file(path).hexdigest
rescue Exception => e
Rails.logger.error e.message
nil
end
end
def create_digest
begin
self.digest = Digest::MD5.file(self.disk_file).hexdigest
true
rescue Exception => e
Rails.logger.error e.message
false
end
end
def tooltip
text = ''
text = self.description if self.description.present?
if self.comment.present?
text += '&#xA;' if text.present?
text += self.comment
end
text.html_safe
end
end end

View File

@ -1,6 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -17,21 +20,21 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class DmsfFileRevisionAccess < ActiveRecord::Base class DmsfFileRevisionAccess < ActiveRecord::Base
unloadable unloadable
belongs_to :revision, :class_name => 'DmsfFileRevision', :foreign_key => 'dmsf_file_revision_id' belongs_to :dmsf_file_revision
belongs_to :user belongs_to :user
delegate :project, :to => :revision, :allow_nil => false delegate :dmsf_file, :to => :dmsf_file_revision, :allow_nil => false
delegate :file, :to => :revision, :allow_nil => false delegate :project, :to => :dmsf_file, :allow_nil => false
accepts_nested_attributes_for :user, :revision
DownloadAction = 0 DownloadAction = 0
EmailAction = 1 EmailAction = 1
acts_as_event :title => Proc.new {|o| "#{l(:label_dmsf_downloaded)}: #{o.file.dmsf_path_str}"}, acts_as_event :title => Proc.new {|ra| "#{l(:label_dmsf_downloaded)}: #{ra.dmsf_file.dmsf_path_str}"},
:url => Proc.new {|o| {:controller => 'dmsf_files', :action => 'show', :id => o.file}}, :url => Proc.new {|ra| {:controller => 'dmsf_files', :action => 'show', :id => ra.dmsf_file}},
:datetime => Proc.new {|o| o.updated_at }, :datetime => Proc.new {|ra| ra.updated_at },
:description => Proc.new {|o| o.revision.comment }, :description => Proc.new {|ra| ra.dmsf_file_revision.comment },
:author => Proc.new {|o| o.user } :author => Proc.new {|ra| ra.user }
acts_as_activity_provider :type => 'dmsf_file_revision_accesses', acts_as_activity_provider :type => 'dmsf_file_revision_accesses',
:timestamp => "#{DmsfFileRevisionAccess.table_name}.updated_at", :timestamp => "#{DmsfFileRevisionAccess.table_name}.updated_at",
@ -42,6 +45,5 @@ class DmsfFileRevisionAccess < ActiveRecord::Base
"INNER JOIN #{DmsfFileRevision.table_name} ON #{DmsfFileRevisionAccess.table_name}.dmsf_file_revision_id = #{DmsfFileRevision.table_name}.id " + "INNER JOIN #{DmsfFileRevision.table_name} ON #{DmsfFileRevisionAccess.table_name}.dmsf_file_revision_id = #{DmsfFileRevision.table_name}.id " +
"INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " + "INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " +
"INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.project_id = #{Project.table_name}.id"). "INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.project_id = #{Project.table_name}.id").
where("#{DmsfFile.table_name}.deleted = :false", {:false => false}) where("#{DmsfFile.table_name}.deleted = ?", DmsfFile::STATUS_ACTIVE)
end end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@konton.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@konton.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -28,32 +28,29 @@ class DmsfFolder < ActiveRecord::Base
@@invalid_characters = /\A[^\/\\\?":<>]*\z/ @@invalid_characters = /\A[^\/\\\?":<>]*\z/
belongs_to :project belongs_to :project
belongs_to :folder, :class_name => 'DmsfFolder', :foreign_key => 'dmsf_folder_id' belongs_to :dmsf_folder
belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id' belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id'
belongs_to :user belongs_to :user
has_many :subfolders, :class_name => 'DmsfFolder', :foreign_key => 'dmsf_folder_id', has_many :dmsf_folders, -> { order(:title) }, :dependent => :destroy
:dependent => :destroy has_many :dmsf_files, :dependent => :destroy
has_many :files, :class_name => 'DmsfFile', :foreign_key => 'dmsf_folder_id', has_many :folder_links, -> { where(:target_type => 'DmsfFolder').order(:name) },
:dependent => :destroy
has_many :folder_links, -> { where :target_type => 'DmsfFolder' },
:class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy :class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy
has_many :file_links, -> { where :target_type => 'DmsfFile' }, has_many :file_links, -> { where :target_type => 'DmsfFile' },
:class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy :class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy
has_many :url_links, -> { where :target_type => 'DmsfUrl' }, has_many :url_links, -> { where :target_type => 'DmsfUrl' },
:class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy :class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy
has_many :dmsf_links, :dependent => :destroy
has_many :referenced_links, -> { where :target_type => 'DmsfFolder' }, has_many :referenced_links, -> { where :target_type => 'DmsfFolder' },
:class_name => 'DmsfLink', :foreign_key => 'target_id', :dependent => :destroy :class_name => 'DmsfLink', :foreign_key => 'target_id', :dependent => :destroy
has_many :locks, -> { where(entity_type: 1).order("#{DmsfLock.table_name}.updated_at DESC") }, has_many :locks, -> { where(entity_type: 1).order("#{DmsfLock.table_name}.updated_at DESC") },
:class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy :class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy
accepts_nested_attributes_for :user, :project, :folder, :subfolders, :files, :folder_links, :file_links, :url_links, :referenced_links, :locks
scope :visible, lambda { |*args| STATUS_DELETED = 1
where(deleted: false) STATUS_ACTIVE = 0
}
scope :deleted, lambda { |*args| scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
where(deleted: true) scope :deleted, -> { where(:deleted => STATUS_DELETED) }
}
acts_as_customizable acts_as_customizable
@ -71,7 +68,7 @@ class DmsfFolder < ActiveRecord::Base
validates :title, :presence => true validates :title, :presence => true
validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted], validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted],
conditions: -> { where.not(deleted: true) } conditions: -> { where(:deleted => STATUS_ACTIVE) }
validates_format_of :title, :with => @@invalid_characters, validates_format_of :title, :with => @@invalid_characters,
:message => l(:error_contains_invalid_character) :message => l(:error_contains_invalid_character)
validate :check_cycle validate :check_cycle
@ -88,13 +85,13 @@ class DmsfFolder < ActiveRecord::Base
def check_cycle def check_cycle
folders = [] folders = []
self.subfolders.each {|f| folders.push(f)} self.dmsf_folders.each {|f| folders.push(f)}
folders.each do |folder| self.dmsf_folders.each do |folder|
if folder == self.folder if folder == self.dmsf_folder
errors.add(:folder, l(:error_create_cycle_in_folder_dependency)) errors.add(:folder, l(:error_create_cycle_in_folder_dependency))
return false return false
end end
folder.subfolders.each {|f| folders.push(f)} folder.dmsf_folders.each {|f| folders.push(f)}
end end
return true return true
end end
@ -111,27 +108,29 @@ class DmsfFolder < ActiveRecord::Base
if self.locked? if self.locked?
errors[:base] << l(:error_folder_is_locked) errors[:base] << l(:error_folder_is_locked)
return false return false
elsif !self.subfolders.visible.empty? || !self.files.visible.empty? elsif !self.dmsf_folders.visible.empty? || !self.dmsf_files.visible.empty?
errors[:base] << l(:error_folder_is_not_empty) errors[:base] << l(:error_folder_is_not_empty)
return false return false
end end
self.referenced_links.each { |l| l.delete(commit) }
if commit if commit
self.destroy self.destroy
else else
self.deleted = true self.deleted = STATUS_DELETED
self.deleted_by_user = User.current self.deleted_by_user = User.current
self.save self.save
end end
end end
def deleted?
self.deleted == STATUS_DELETED
end
def restore def restore
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted) if self.dmsf_folder_id && (self.dmsf_folder.nil? || self.dmsf_folder.deleted?)
errors[:base] << l(:error_parent_folder) errors[:base] << l(:error_parent_folder)
return false return false
end end
self.referenced_links.each { |l| l.restore } self.deleted = STATUS_ACTIVE
self.deleted = false
self.deleted_by_user = nil self.deleted_by_user = nil
self.save self.save
end end
@ -141,7 +140,7 @@ class DmsfFolder < ActiveRecord::Base
path = [] path = []
while folder while folder
path.unshift(folder) path.unshift(folder)
folder = folder.folder folder = folder.dmsf_folder
end end
path path
end end
@ -154,8 +153,8 @@ class DmsfFolder < ActiveRecord::Base
def notify? def notify?
return true if self.notification return true if self.notification
return true if folder && folder.notify? return true if self.dmsf_folder && self.dmsf_folder.notify?
return true if !folder && self.project.dmsf_notification return true if !self.dmsf_folder && self.project.dmsf_notification
return false return false
end end
@ -196,21 +195,21 @@ class DmsfFolder < ActiveRecord::Base
end end
def deep_file_count def deep_file_count
file_count = self.files.visible.count file_count = self.dmsf_files.visible.count
self.subfolders.visible.each {|subfolder| file_count += subfolder.deep_file_count} self.dmsf_folders.visible.each { |subfolder| file_count += subfolder.deep_file_count }
file_count + self.file_links.visible.count file_count + self.file_links.visible.count + self.url_links.visible.count
end end
def deep_folder_count def deep_folder_count
folder_count = self.subfolders.visible.count folder_count = self.dmsf_folders.visible.count
self.subfolders.visible.each {|subfolder| folder_count += subfolder.deep_folder_count} self.dmsf_folders.visible.each { |subfolder| folder_count += subfolder.deep_folder_count }
folder_count + self.folder_links.visible.count folder_count + self.folder_links.visible.count
end end
def deep_size def deep_size
size = 0 size = 0
self.files.visible.each {|file| size += file.size} self.dmsf_files.visible.each {|file| size += file.size}
self.subfolders.visible.each {|subfolder| size += subfolder.deep_size} self.dmsf_folders.visible.each {|subfolder| size += subfolder.deep_size}
size size
end end
@ -227,7 +226,7 @@ class DmsfFolder < ActiveRecord::Base
def copy_to(project, folder) def copy_to(project, folder)
new_folder = DmsfFolder.new new_folder = DmsfFolder.new
new_folder.folder = folder ? folder : nil new_folder.dmsf_folder = folder ? folder : nil
new_folder.project = folder ? folder.project : project new_folder.project = folder ? folder.project : project
new_folder.title = self.title new_folder.title = self.title
new_folder.description = self.description new_folder.description = self.description
@ -240,11 +239,11 @@ class DmsfFolder < ActiveRecord::Base
return new_folder unless new_folder.save return new_folder unless new_folder.save
self.files.visible.each do |f| self.dmsf_files.visible.each do |f|
f.copy_to project, new_folder f.copy_to project, new_folder
end end
self.subfolders.visible.each do |s| self.dmsf_folders.visible.each do |s|
s.copy_to project, new_folder s.copy_to project, new_folder
end end
@ -270,10 +269,10 @@ class DmsfFolder < ActiveRecord::Base
def modified def modified
last_update = updated_at last_update = updated_at
subfolders.each do |subfolder| dmsf_folders.each do |subfolder|
last_update = subfolder.updated_at if subfolder.updated_at > last_update last_update = subfolder.updated_at if subfolder.updated_at > last_update
end end
files.each do |file| dmsf_files.each do |file|
last_update = file.updated_at if file.updated_at > last_update last_update = file.updated_at if file.updated_at > last_update
end end
folder_links.each do |folder_link| folder_links.each do |folder_link|
@ -290,8 +289,8 @@ class DmsfFolder < ActiveRecord::Base
# Number of items in the folder # Number of items in the folder
def items def items
subfolders.visible.count + dmsf_folders.visible.count +
files.visible.count + dmsf_files.visible.count +
folder_links.visible.count + folder_links.visible.count +
file_links.visible.count + file_links.visible.count +
url_links.visible.count url_links.visible.count
@ -300,7 +299,7 @@ class DmsfFolder < ActiveRecord::Base
private private
def self.directory_subtree(tree, folder, level, current_folder) def self.directory_subtree(tree, folder, level, current_folder)
folder.subfolders.visible.each do |subfolder| folder.dmsf_folders.visible.each do |subfolder|
unless subfolder == current_folder unless subfolder == current_folder
tree.push(["#{'...' * level}#{subfolder.title}", subfolder.id]) tree.push(["#{'...' * level}#{subfolder.title}", subfolder.id])
directory_subtree(tree, subfolder, level + 1, current_folder) directory_subtree(tree, subfolder, level + 1, current_folder)

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -35,15 +35,22 @@ class DmsfLink < ActiveRecord::Base
def validate_url def validate_url
if self.target_type == 'DmsfUrl' if self.target_type == 'DmsfUrl'
begin begin
URI.parse self.external_url if self.external_url.present?
URI.parse self.external_url
else
errors.add :external_url, :invalid
end
rescue URI::InvalidURIError rescue URI::InvalidURIError
errors.add :external_url, :invalid errors.add :external_url, :invalid
end end
end end
end end
scope :visible, -> { where(deleted: false) } STATUS_DELETED = 1
scope :deleted, -> { where(deleted: true) } STATUS_ACTIVE = 0
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
def target_folder_id def target_folder_id
if self.target_type == DmsfFolder.model_name.to_s if self.target_type == DmsfFolder.model_name.to_s
@ -119,20 +126,28 @@ class DmsfLink < ActiveRecord::Base
if commit if commit
self.destroy self.destroy
else else
self.deleted = true self.deleted = STATUS_DELETED
self.deleted_by_user = User.current self.deleted_by_user = User.current
save save(:validate => false)
end end
end end
def restore def restore
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted) if self.dmsf_folder_id && (self.dmsf_folder.nil? || self.dmsf_folder.deleted?)
errors[:base] << l(:error_parent_folder) errors[:base] << l(:error_parent_folder)
return false return false
end end
self.deleted = false self.deleted = STATUS_ACTIVE
self.deleted_by_user = nil self.deleted_by_user = nil
save save(:validate => false)
end
def is_folder?
self.target_type == 'DmsfFolder'
end
def is_file?
!is_folder?
end end
end end

View File

@ -29,7 +29,6 @@ class DmsfLock < ActiveRecord::Base
belongs_to :user belongs_to :user
# At the moment apparently we're only supporting a write lock? # At the moment apparently we're only supporting a write lock?
as_enum :lock_type, [:type_write, :type_other] as_enum :lock_type, [:type_write, :type_other]
as_enum :lock_scope, [:scope_exclusive, :scope_shared] as_enum :lock_scope, [:scope_exclusive, :scope_shared]

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -27,74 +27,68 @@ class DmsfMailer < Mailer
def files_updated(user, project, files) def files_updated(user, project, files)
if user && project && files.count > 0 if user && project && files.count > 0
files = files.select { |file| file.notify? } files = files.select { |file| file.notify? }
redmine_headers 'Project' => project.identifier if project redmine_headers 'Project' => project.identifier if project
@files = files @files = files
@project = project @project = project
message_id project
set_language_if_valid user.language set_language_if_valid user.language
mail :to => user.mail, mail :to => user.mail,
:subject => l(:text_email_doc_updated_subject, :project => project.name) :subject => "[#{@project.name} - #{l(:menu_dmsf)}] #{l(:text_email_doc_updated_subject)}"
end end
end end
def files_deleted(user, project, files) def files_deleted(user, project, files)
if user && files.count > 0 if user && files.count > 0
files = files.select { |file| file.notify? } files = files.select { |file| file.notify? }
redmine_headers 'Project' => project.identifier if project redmine_headers 'Project' => project.identifier if project
@files = files @files = files
@project = project @project = project
message_id project
set_language_if_valid user.language set_language_if_valid user.language
mail :to => user.mail, mail :to => user.mail,
:subject => l(:text_email_doc_deleted_subject, :project => project.name) :subject => "[#{@project.name} - #{l(:menu_dmsf)}] #{l(:text_email_doc_deleted_subject)}"
end end
end end
def send_documents(project, user, email_params) def send_documents(project, user, email_params)
zipped_content_data = open(email_params[:zipped_content], 'rb') { |io| io.read } zipped_content_data = open(email_params[:zipped_content], 'rb') { |io| io.read }
redmine_headers 'Project' => project.identifier if project redmine_headers 'Project' => project.identifier if project
@body = email_params[:body] @body = email_params[:body]
@links_only = email_params[:links_only] @links_only = email_params[:links_only]
@folders = email_params[:folders] @folders = email_params[:folders]
@files = email_params[:files] @files = email_params[:files]
unless @links_only == '1' unless @links_only == '1'
attachments['Documents.zip'] = { :content_type => 'application/zip', :content => zipped_content_data } attachments['Documents.zip'] = { :content_type => 'application/zip', :content => zipped_content_data }
end end
mail :to => email_params[:to], :cc => email_params[:cc],
mail :to => email_params[:to], :cc => email_params[:cc], :subject => email_params[:subject], :from => user.mail :subject => email_params[:subject], :from => user.mail
end end
def workflow_notification(user, workflow, revision, subject_id, text1_id, text2_id, notice = nil) def workflow_notification(user, workflow, revision, subject_id, text1_id, text2_id, notice = nil)
if user && workflow && revision if user && workflow && revision
if revision.file && revision.file.project if revision.dmsf_file && revision.dmsf_file.project
@project = revision.file.project @project = revision.dmsf_file.project
redmine_headers 'Project' => @project.identifier redmine_headers 'Project' => @project.identifier
end end
set_language_if_valid user.language set_language_if_valid user.language
@user = user @user = user
message_id workflow
@workflow = workflow @workflow = workflow
@revision = revision @revision = revision
@text1 = l(text1_id, :name => workflow.name, :filename => revision.file.name, :notice => notice) @text1 = l(text1_id, :name => workflow.name, :filename => revision.dmsf_file.name, :notice => notice)
@text2 = l(text2_id) @text2 = l(text2_id)
@notice = notice @notice = notice
mail :to => user.mail, :subject => l(subject_id, :name => workflow.name) mail :to => user.mail,
:subject => "[#{@project.name} - #{l(:field_label_dmsf_workflow)}] #{@workflow.name} #{l(subject_id)}"
end end
end end
def self.get_notify_users(project, files = nil) def self.get_notify_users(project, files = [])
if files if files.present?
notify_files = files.select { |file| file.notify? } notify_files = files.select { |file| file.notify? }
return [] if notify_files.empty? return [] if notify_files.empty?
end end
notify_members = project.members notify_members = project.members.select do |notify_member|
notify_members = notify_members.select do |notify_member|
notify_user = notify_member.user notify_user = notify_member.user
if notify_user == User.current && notify_user.pref.no_self_notified if notify_user == User.current && notify_user.pref.no_self_notified
false false
@ -105,8 +99,24 @@ class DmsfMailer < Mailer
true true
when 'selected' when 'selected'
notify_member.mail_notification? notify_member.mail_notification?
when 'only_my_events', 'only_owner' when 'only_my_events'
notify_user.allowed_to?(:file_manipulation, project) author = false
files.each do |file|
if file.involved?(notify_user)
author = true
break
end
end
author
when 'only_owner', 'only_assigned'
author = false
files.each do |file|
if file.owner?(notify_user)
author = true
break
end
end
author
else else
false false
end end

View File

@ -1,8 +1,10 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -73,7 +75,11 @@ class DmsfUpload
@major_version = 0 @major_version = 0
@minor_version = 0 @minor_version = 0
@workflow = nil @workflow = nil
@custom_values = DmsfFileRevision.new(:file => DmsfFile.new(:project => @project)).custom_field_values file = DmsfFile.new
file.project = @project
revision = DmsfFileRevision.new
revision.dmsf_file = file
@custom_values = revision.custom_field_values
else else
last_revision = file.last_revision last_revision = file.last_revision
@title = last_revision.title @title = last_revision.title

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Picman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -19,11 +19,13 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class DmsfWorkflow < ActiveRecord::Base class DmsfWorkflow < ActiveRecord::Base
has_many :dmsf_workflow_steps, -> { order 'step ASC, operator DESC' }, :dependent => :destroy has_many :dmsf_workflow_steps, -> { order 'step ASC, operator DESC' }, :dependent => :destroy
belongs_to :author, :class_name => 'User'
scope :sorted, lambda { order('name ASC') } scope :sorted, lambda { order('name ASC') }
scope :global, lambda { where('project_id IS NULL') } scope :global, lambda { where('project_id IS NULL') }
scope :active, lambda { where(:status => STATUS_ACTIVE) }
scope :status, lambda { |arg| where(arg.blank? ? nil : {:status => arg.to_i}) }
validate :name_validation validate :name_validation
validates :name, :presence => true validates :name, :presence => true
@ -33,22 +35,22 @@ class DmsfWorkflow < ActiveRecord::Base
if self.project_id if self.project_id
if self.id if self.id
if (DmsfWorkflow.where(['(project_id IS NULL OR (project_id = ? AND id != ?)) AND name = ?', if (DmsfWorkflow.where(['(project_id IS NULL OR (project_id = ? AND id != ?)) AND name = ?',
self.project_id, self.id, self.name]).count > 0) self.project_id, self.id, self.name]).exists?)
errors.add(:name, l('activerecord.errors.messages.taken')) errors.add(:name, l('activerecord.errors.messages.taken'))
end end
else else
if (DmsfWorkflow.where(['(project_id IS NULL OR project_id = ?) AND name = ?', if (DmsfWorkflow.where(['(project_id IS NULL OR project_id = ?) AND name = ?',
self.project_id, self.name]).count > 0) self.project_id, self.name]).exists?)
errors.add(:name, l('activerecord.errors.messages.taken')) errors.add(:name, l('activerecord.errors.messages.taken'))
end end
end end
else else
if self.id if self.id
if DmsfWorkflow.where(['name = ? AND id != ?', self.name, self.id]).count > 0 if DmsfWorkflow.where(['name = ? AND id != ?', self.name, self.id]).exists?
errors.add(:name, l('activerecord.errors.messages.taken')) errors.add(:name, l('activerecord.errors.messages.taken'))
end end
else else
if DmsfWorkflow.where(:name => self.name).count > 0 if DmsfWorkflow.where(:name => self.name).exists?
errors.add(:name, l('activerecord.errors.messages.taken')) errors.add(:name, l('activerecord.errors.messages.taken'))
end end
end end
@ -61,6 +63,9 @@ class DmsfWorkflow < ActiveRecord::Base
STATE_APPROVED = 2 STATE_APPROVED = 2
STATE_REJECTED = 4 STATE_REJECTED = 4
STATUS_LOCKED = 0
STATUS_ACTIVE = 1
def participiants def participiants
users = Array.new users = Array.new
self.dmsf_workflow_steps.each do |step| self.dmsf_workflow_steps.each do |step|
@ -83,51 +88,19 @@ class DmsfWorkflow < ActiveRecord::Base
def reorder_steps(step, move_to) def reorder_steps(step, move_to)
DmsfWorkflow.transaction do DmsfWorkflow.transaction do
case move_to dmsf_workflow_steps.each do |ws|
when 'highest' if ws.step == step
unless step == 1 return false unless ws.update_attribute('step', move_to)
dmsf_workflow_steps.each do |ws| elsif ws.step >= move_to && ws.step < step
if ws.step < step # Move up
return false unless ws.update_attribute('step', ws.step + 1) return false unless ws.update_attribute('step', ws.step + 1)
elsif ws.step == step elsif ws.step <= move_to && ws.step > step
return false unless ws.update_attribute('step', 1) # Move down
end return false unless ws.update_attribute('step', ws.step - 1)
end
end
when 'higher'
unless step == 1
dmsf_workflow_steps.each do |ws|
if ws.step == step - 1
return false unless ws.update_attribute('step', step)
elsif ws.step == step
return false unless ws.update_attribute('step', step - 1)
end
end
end
when 'lower'
unless step == dmsf_workflow_steps.collect{|s| s.step}.uniq.count
dmsf_workflow_steps.each do |ws|
if ws.step == step + 1
return false unless ws.update_attribute('step', step)
elsif ws.step == step
return false unless ws.update_attribute('step', step + 1)
end
end
end
when 'lowest'
size = dmsf_workflow_steps.collect{|s| s.step}.uniq.count
unless step == size
dmsf_workflow_steps.each do |ws|
if ws.step > step
return false unless ws.update_attribute('step', ws.step - 1)
elsif ws.step == step
return false unless ws.update_attribute('step', size)
end
end
end end
end
end end
end return true
return reload
end end
def delegates(q, dmsf_workflow_step_assignment_id, dmsf_file_revision_id) def delegates(q, dmsf_workflow_step_assignment_id, dmsf_file_revision_id)
@ -170,6 +143,7 @@ class DmsfWorkflow < ActiveRecord::Base
exists = a.add?(dmsf_file_revision_id) exists = a.add?(dmsf_file_revision_id)
break if exists break if exists
end end
break if exists
end end
step_is_finished = false if exists step_is_finished = false if exists
break break
@ -240,6 +214,7 @@ class DmsfWorkflow < ActiveRecord::Base
new_wf = self.dup new_wf = self.dup
new_wf.name = name if name new_wf.name = name if name
new_wf.project_id = project ? project.id : nil new_wf.project_id = project ? project.id : nil
new_wf.author = User.current
if new_wf.save if new_wf.save
self.dmsf_workflow_steps.each do |step| self.dmsf_workflow_steps.each do |step|
step.copy_to(new_wf) step.copy_to(new_wf)
@ -247,4 +222,13 @@ class DmsfWorkflow < ActiveRecord::Base
end end
return new_wf return new_wf
end end
def locked?
self.status == STATUS_LOCKED
end
def active?
self.status == STATUS_ACTIVE
end
end end

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -28,8 +28,6 @@ class DmsfWorkflowStepAction < ActiveRecord::Base
validates :author_id, :presence => true validates :author_id, :presence => true
validates_uniqueness_of :dmsf_workflow_step_assignment_id, :scope => [:action], :unless => lambda {self.action == DmsfWorkflowStepAction::ACTION_DELEGATE} validates_uniqueness_of :dmsf_workflow_step_assignment_id, :scope => [:action], :unless => lambda {self.action == DmsfWorkflowStepAction::ACTION_DELEGATE}
attr_accessible :dmsf_workflow_step_assignment_id, :action, :note
ACTION_APPROVE = 1 ACTION_APPROVE = 1
ACTION_REJECT = 2 ACTION_REJECT = 2
ACTION_DELEGATE = 3 ACTION_DELEGATE = 3

View File

@ -2,7 +2,7 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -26,8 +26,6 @@ class DmsfWorkflowStepAssignment < ActiveRecord::Base
validates :dmsf_workflow_step_id, :dmsf_file_revision_id, :presence => true validates :dmsf_workflow_step_id, :dmsf_file_revision_id, :presence => true
validates_uniqueness_of :dmsf_workflow_step_id, :scope => [:dmsf_file_revision_id] validates_uniqueness_of :dmsf_workflow_step_id, :scope => [:dmsf_file_revision_id]
attr_accessible :dmsf_workflow_step_id, :user_id, :dmsf_file_revision_id
def add?(dmsf_file_revision_id) def add?(dmsf_file_revision_id)
if self.dmsf_file_revision_id == dmsf_file_revision_id if self.dmsf_file_revision_id == dmsf_file_revision_id
add = true add = true

View File

@ -1,7 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Redmine plugin for Document Management System "Features"
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -18,11 +22,12 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%>
<% if object %> <% if object %>
<div class="dmsf-customfields"> <div>
<% object.show_custom_field_values.each do |custom_value| %> <% object.show_custom_field_values.each do |custom_value| %>
<div class="dmsf-customfield-<%= custom_value.custom_field.id %> dmsf-customfield customfield"> <p>
<%= label_tag('', "#{h(custom_value.custom_field.name)}:") %> <%= show_value(custom_value) %> <%= label_tag('', h(custom_value.custom_field.name)) %>
</div> <%= show_value custom_value %>
</p>
<% end %> <% end %>
</div> </div>
<% end %> <% end %>

View File

@ -1,9 +1,9 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -23,20 +23,24 @@
<% locked_for_user = subfolder && subfolder.locked_for_user? %> <% locked_for_user = subfolder && subfolder.locked_for_user? %>
<% locked = subfolder && subfolder.locked? %> <% locked = subfolder && subfolder.locked? %>
<td class="check"><%= check_box_tag(name, id, false, <td class="dmsf_checkbox"><%= check_box_tag(name, id, false,
:title => l(:title_check_for_zip_download_or_email), :id => "subfolder_#{id}") %></td> :title => l(:title_check_for_zip_download_or_email), :id => "subfolder_#{id}") %></td>
<td class="title"> <td class="dmsf_title">
<% if @tree_view %>
<span class='dmsf_expander' <%= onclick.html_safe %>></span>
<% end %>
<%= link_to(h(title), <%= link_to(h(title),
dmsf_folder_path(:id => project, :folder_id => subfolder), dmsf_folder_path(:id => project, :folder_id => subfolder),
:class => 'icon icon-folder') %> :class => 'icon icon-folder',
:title => h(subfolder.description)) %>
<% if link %> <% if link %>
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.path %></div> <div class="dmsf_filename" title="<%= l(:label_target_folder)%>"><%= link.path %></div>
<% else %> <% else %>
<div class="filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div> <div class="dmsf_filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div>
<% end %> <% end %>
</td> </td>
<td class="size"></td> <td class="dmsf_size"></td>
<td class="modified"><%= format_time(subfolder.modified) if subfolder %> <td class="dmsf_modified"><%= format_time(subfolder.modified) if subfolder %>
<% if locked_for_user %> <% if locked_for_user %>
<% if subfolder.lock.reverse[0].user %> <% if subfolder.lock.reverse[0].user %>
<%= link_to(image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'), <%= link_to(image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
@ -51,19 +55,29 @@
:title => l(:title_locked_by_you)) %> :title => l(:title_locked_by_you)) %>
<% end %> <% end %>
</td> </td>
<td class="version"></td> <td class="dmsf_version"></td>
<td class="workflow"></td> <td class="dmsf_workflow"></td>
<td class="author"><%= h(subfolder.user) if subfolder %></td> <td class="dmsf_author"><%= h(subfolder.user) if subfolder %></td>
<td class="buttons"> <td class="dmsf_buttons">
<% if @folder_manipulation_allowed %> <% if @folder_manipulation_allowed %>
<% unless locked %> <% unless locked_for_user %>
<%= link_to(image_tag('edit.png'), <%= link_to(image_tag('edit.png'),
edit_dmsf_path(:id => project, :folder_id => subfolder), edit_dmsf_path(:id => project, :folder_id => subfolder),
:title => l(:link_edit, :title => subfolder ? h(subfolder.title) : project.name)) %> :title => l(:link_edit, :title => subfolder ? h(subfolder.title) : project.name)) %>
<% if subfolder %> <% if subfolder %>
<%= link_to(image_tag('lock.png', :plugin => 'redmine_dmsf'), <% if locked %>
lock_dmsf_path(:id => project, :folder_id => subfolder), <% if subfolder.unlockable? %>
:title => l(:title_lock_file)) %> <%= link_to(image_tag('unlock.png', :plugin => 'redmine_dmsf'),
unlock_dmsf_path(:id => project, :folder_id => subfolder),
:title => l(:title_unlock_file)) %>
<% else %>
<span class="icon"></span>
<% end %>
<% else %>
<%= link_to(image_tag('lock.png', :plugin => 'redmine_dmsf'),
lock_dmsf_path(:id => project, :folder_id => subfolder),
:title => l(:title_lock_file)) %>
<% end %>
<% else %> <% else %>
<span class="icon"></span> <span class="icon"></span>
<% end %> <% end %>
@ -77,11 +91,9 @@
:title => l(:title_notifications_not_active_activate)) %> :title => l(:title_notifications_not_active_activate)) %>
<% end %> <% end %>
<% if link %> <% if link %>
<%= link_to(image_tag('delete.png'), <%= link_to(image_tag('delete.png'), dmsf_link_path(link),
dmsf_link_path(link),
:data => {:confirm => l(:text_are_you_sure)}, :data => {:confirm => l(:text_are_you_sure)},
:method => :delete, :method => :delete, :title => l(:title_delete)) %>
:title => l(:title_delete)) %>
<% else %> <% else %>
<%= link_to(image_tag('delete.png'), <%= link_to(image_tag('delete.png'),
delete_dmsf_path(:id => project, :folder_id => subfolder), delete_dmsf_path(:id => project, :folder_id => subfolder),
@ -98,7 +110,7 @@
<% end %> <% end %>
<% end %> <% end %>
</td> </td>
<td class="invisible">0</td> <td class="dmsf_invisible"><%= position %></td>
<td class="invisible">0</td> <td class="dmsf_invisible">0</td>
<td class="invisible"><%= subfolder.modified.to_i if subfolder %></td> <td class="dmsf_invisible"><%= subfolder.modified.to_i if subfolder %></td>
<td class="invisible">0</td> <td class="dmsf_invisible">0</td>

View File

@ -1,9 +1,9 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -20,37 +20,48 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<td class="check"><%= check_box_tag(name, id, false, <td class="dmsf_checkbox"><%= check_box_tag(name, id, false,
:title => l(:title_check_for_restore_or_delete), :id => "subfolder_#{id}") %></td> :title => l(:title_check_for_restore_or_delete), :id => "subfolder_#{id}") %></td>
<td class="title"> <td class="dmsf_title">
<%= content_tag(:span, h(title), <%= content_tag(:span, h(title),
:title => h(title), :title => h(subfolder.description),
:class => 'icon icon-folder') %> :class => 'icon icon-folder') %>
<% if link %> <% if link %>
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.path %></div> <div class="dmsf_filename" title="<%= l(:label_target_folder)%>"><%= link.path %></div>
<% else %> <% else %>
<div class="filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div> <div class="dmsf_filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div>
<% end %> <% end %>
</td> </td>
<td class="size"></td> <td class="dmsf_size"></td>
<td class="modified"> <td class="dmsf_modified">
<%= format_time(subfolder.modified) if subfolder %> <%= format_time(subfolder.modified) if subfolder %>
</td> </td>
<td class="version"></td> <td class="dmsf_version"></td>
<td class="workflow"></td> <td class="dmsf_workflow"></td>
<td class="author"><%= h(subfolder.user) %></td> <td class="dmsf_author"><%= h(subfolder.user) %></td>
<td class="buttons"> <td class="dmsf_buttons">
<% if @folder_manipulation_allowed %> <% if @folder_manipulation_allowed %>
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'), <% if link %>
restore_dmsf_path(:id => project, :folder_id => subfolder), <%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
:title => l(:title_restore)) %> restore_dmsf_link_path(:id => link),
<%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'), :title => l(:title_restore)) %>
delete_dmsf_path(:id => project, :folder_id => subfolder, :commit => 'yes'), <%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
:data => {:confirm => l(:text_are_you_sure)}, dmsf_link_path(:id => link, :commit => 'yes'),
:title => l(:title_delete)) %> :data => {:confirm => l(:text_are_you_sure)},
:method => :delete,
:title => l(:title_delete)) %>
<% else # folder %>
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
restore_dmsf_path(:id => project, :folder_id => subfolder),
:title => l(:title_restore)) %>
<%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
delete_dmsf_path(:id => project, :folder_id => subfolder, :commit => 'yes'),
:data => {:confirm => l(:text_are_you_sure)},
:title => l(:title_delete)) %>
<% end %>
<% end %> <% end %>
</td> </td>
<td class="invisible">0</td> <td class="dmsf_invisible">0</td>
<td class="invisible">0</td> <td class="dmsf_invisible">0</td>
<td class="invisible"><%= subfolder.modified.to_i if subfolder %></td> <td class="dmsf_invisible"><%= subfolder.modified.to_i if subfolder %></td>
<td class="invisible">0</td> <td class="dmsf_invisible">0</td>

View File

@ -1,9 +1,9 @@
<%#= <%
# encode: utf-8 # encode: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -20,26 +20,28 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<% locked_for_user = file.locked_for_user? %>
<% locked = file.locked? %>
<% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %> <% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %>
<td class="check"><%= check_box_tag(name, id, false, <td class="dmsf_checkbox"><%= check_box_tag(name, id, false,
:title => l(:title_check_for_zip_download_or_email), :id => "file_#{id}") %></td> :title => l(:title_check_for_zip_download_or_email), :id => "file_#{id}") %></td>
<td class="title"> <td class="dmsf_title">
<% if @tree_view %>
<span class='dmsf_expander' <%= onclick.html_safe %>></span>
<% end %>
<% file_view_url = url_for({:controller => :dmsf_files, :action => 'view', :id => file}) %> <% file_view_url = url_for({:controller => :dmsf_files, :action => 'view', :id => file}) %>
<%= link_to(h(title), <%= link_to(h(title),
file_view_url, file_view_url,
:target => "_blank", :target => '_blank',
:class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}", :class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}",
:title => l(:title_title_version_version_download, :title => h(file.title), :version => file.version), :title => file.last_revision.try(:tooltip),
'data-downloadurl' => "#{file.last_revision.detect_content_type}:#{h(file.name)}:#{file_view_url}") %> 'data-downloadurl' => "#{file.last_revision.detect_content_type}:#{h(file.name)}:#{file_view_url}") %>
<div class="filename" title="<%= l(:title_filename_for_download)%>"><%= h(link ? link.path : file.display_name) %></div> <div class="dmsf_filename" title="<%= l(:title_filename_for_download)%>"><%= h(link ? link.path : file.display_name) %></div>
<%= '</span>'.html_safe if @tree_view %>
</td> </td>
<td class="size"><%= number_to_human_size(file.last_revision.size) %></td> <td class="dmsf_size"><%= number_to_human_size(file.last_revision.size) %></td>
<td class="modified"> <td class="dmsf_modified">
<%= format_time(file.last_revision.updated_at) %> <%= format_time(file.last_revision.updated_at) %>
<% if locked_for_user %> <% if file.locked_for_user? %>
<% if file.lock.reverse[0].user %> <% if file.lock.reverse[0].user %>
<%= link_to(image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'), <%= link_to(image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
user_path(file.lock.reverse[0].user), user_path(file.lock.reverse[0].user),
@ -48,13 +50,13 @@
<%= content_tag(:span, image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'), <%= content_tag(:span, image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
:title => l(:notice_account_unknown_email)) %> :title => l(:notice_account_unknown_email)) %>
<% end %> <% end %>
<% elsif locked %> <% elsif file.locked? %>
<%= content_tag(:span, image_tag(link ? 'lockedbycurrent_gray.png' : 'lockedbycurrent.png', :plugin => 'redmine_dmsf'), <%= content_tag(:span, image_tag(link ? 'lockedbycurrent_gray.png' : 'lockedbycurrent.png', :plugin => 'redmine_dmsf'),
:title => l(:title_locked_by_you)) %> :title => l(:title_locked_by_you)) %>
<% end %> <% end %>
</td> </td>
<td class="version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td> <td class="dmsf_version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td>
<td class="workflow"> <td class="dmsf_workflow">
<% if wf && @file_approval_allowed %> <% if wf && @file_approval_allowed %>
<%= link_to( <%= link_to(
file.last_revision.workflow_str(false), file.last_revision.workflow_str(false),
@ -68,110 +70,115 @@
<%= file.last_revision.workflow_str(false) %> <%= file.last_revision.workflow_str(false) %>
<% end %> <% end %>
</td> </td>
<td class="author"><%= h(file.last_revision.user) %></td> <td class="dmsf_author"><%= h(file.last_revision.user) %></td>
<td class="buttons"> <td class="dmsf_buttons">
<% if @file_manipulation_allowed || @file_approval_allowed %> <% if @file_manipulation_allowed %>
<% if @file_manipulation_allowed %> <%= link_to(image_tag('filedetails.png', :plugin => 'redmine_dmsf'),
<% unless locked %> dmsf_file_path(:id => file),
<%= link_to(image_tag('filedetails.png', :plugin => 'redmine_dmsf'), :title => l(:link_details, :title => h(file.last_revision.title))) %>
dmsf_file_path(:id => file), <% unless file.locked_for_user? %>
:title => l(:link_details, :title => h(file.last_revision.title))) %> <% if !file.locked? %>
<%= link_to(image_tag('lock.png', :plugin => 'redmine_dmsf'), <%= link_to(image_tag('lock.png', :plugin => 'redmine_dmsf'),
lock_dmsf_files_path(:id => file), lock_dmsf_files_path(:id => file),
:title => l(:title_lock_file)) %> :title => l(:title_lock_file)) %>
<% if file.notification %> <% elsif file.unlockable? %>
<%= link_to(image_tag('notify.png', :plugin => 'redmine_dmsf'), <%= link_to(image_tag('unlock.png', :plugin => 'redmine_dmsf'),
notify_deactivate_dmsf_files_path(:id => file), unlock_dmsf_files_path(:id => file),
:title => l(:title_notifications_active_deactivate)) %> :title => l(:title_unlock_file))%>
<% else %>
<%= link_to(image_tag('notifynot.png', :plugin => 'redmine_dmsf'),
notify_activate_dmsf_files_path(:id => file),
:title => l(:title_notifications_not_active_activate)) %>
<% end %>
<% if link %>
<%= link_to(image_tag('delete.png'),
dmsf_link_path(link),
:data => {:confirm => l(:text_are_you_sure)},
:method => :delete,
:title => l(:title_delete)) %>
<% else %>
<% if @file_delete_allowed %>
<%= link_to(image_tag('delete.png'),
dmsf_file_path(:id => file),
:data => {:confirm => l(:text_are_you_sure)},
:method => :delete,
:title => l(:title_delete)) unless locked_for_user %>
<% else %>
<span class="icon"></span>
<% end %>
<% end %>
<% else %> <% else %>
<span class="icon"></span> <span class="icon"></span>
<% if (!locked_for_user || @force_file_unlock_allowed) && file.unlockable? %> <% end %>
<%= link_to(image_tag('unlock.png', :plugin => 'redmine_dmsf'), <% if file.notification %>
unlock_dmsf_files_path(:id => file), <%= link_to(image_tag('notify.png', :plugin => 'redmine_dmsf'),
:title => l(:title_unlock_file))%> notify_deactivate_dmsf_files_path(:id => file),
:title => l(:title_notifications_active_deactivate)) %>
<% else %>
<%= link_to(image_tag('notifynot.png', :plugin => 'redmine_dmsf'),
notify_activate_dmsf_files_path(:id => file),
:title => l(:title_notifications_not_active_activate)) %>
<% end %>
<% if link %>
<%= link_to(image_tag('delete.png'),
dmsf_link_path(link),
:data => {:confirm => l(:text_are_you_sure)},
:method => :delete,
:title => l(:title_delete)) %>
<% else %>
<% if @file_delete_allowed %>
<%= link_to(image_tag('delete.png'),
dmsf_file_path(:id => file),
:data => {:confirm => l(:text_are_you_sure)},
:method => :delete,
:title => l(:title_delete)) unless file.locked_for_user? %>
<% else %> <% else %>
<span class="icon"></span> <span class="icon"></span>
<% end %> <% end %>
<span class="icon"></span>
<span class="icon dmsf_icon-narrow"></span>
<% end %> <% end %>
<% else %>
<% if @force_file_unlock_allowed && file.unlockable? %>
<%= link_to(image_tag('unlock.png', :plugin => 'redmine_dmsf'),
unlock_dmsf_files_path(:id => file),
:title => l(:title_unlock_file))%>
<% else %>
<span class="icon"></span>
<% end %>
<span class="icon"></span>
<span class="icon"></span>
<% end %> <% end %>
<% if @file_approval_allowed %> <% end %>
<% case file.last_revision.workflow %> <% if @file_approval_allowed %>
<% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %> <% case file.last_revision.workflow %>
<% if wf %> <% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %>
<% assignments = wf.next_assignments(file.last_revision.id) %> <% if wf %>
<% index = assignments.find_index{|assignment| assignment.user_id == User.current.id} if assignments %> <% assignments = wf.next_assignments(file.last_revision.id) %>
<% if index %> <% index = assignments.find_index{|assignment| assignment.user_id == User.current.id} if assignments %>
<%= link_to(image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'), <% if index %>
action_dmsf_workflow_path( <%= link_to(image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'),
:project_id => project.id, action_dmsf_workflow_path(
:id => wf.id, :project_id => project.id,
:dmsf_workflow_step_assignment_id => assignments[index].id, :id => wf.id,
:dmsf_file_revision_id => file.last_revision.id), :dmsf_workflow_step_assignment_id => assignments[index].id,
:title => l(:title_waiting_for_approval), :dmsf_file_revision_id => file.last_revision.id),
:remote => true) %> :title => l(:title_waiting_for_approval),
<% else %> :remote => true) %>
<%= content_tag(:span, image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'),
:title => "#{l(:label_dmsf_wokflow_action_approve)} #{l(:label_dmsf_wokflow_action_reject)} #{l(:label_dmsf_wokflow_action_delegate)}") %>
<% end %>
<% else %> <% else %>
<%= content_tag(:span, image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'), <%= content_tag(:span, image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'),
:title => "#{l(:label_dmsf_wokflow_action_approve)} #{l(:label_dmsf_wokflow_action_reject)} #{l(:label_dmsf_wokflow_action_delegate)}") %> :title => "#{l(:label_dmsf_wokflow_action_approve)} #{l(:label_dmsf_wokflow_action_reject)} #{l(:label_dmsf_wokflow_action_delegate)}") %>
<% end %> <% end %>
<% when DmsfWorkflow::STATE_APPROVED %>
<%= content_tag(:span, image_tag('approved.png', :plugin => 'redmine_dmsf'),
:title => l(:title_approved)) %>
<% when DmsfWorkflow::STATE_ASSIGNED %>
<% if User.current && (file.last_revision.dmsf_workflow_assigned_by == User.current.id) && wf %>
<%= link_to(image_tag('assigned.png', :plugin => 'redmine_dmsf'),
start_dmsf_workflow_path(
:id => file.last_revision.dmsf_workflow_id,
:dmsf_file_revision_id => file.last_revision.id),
:title => l(:label_dmsf_wokflow_action_start)) %>
<% else %>
<%= content_tag(:span, image_tag('assigned.png', :plugin => 'redmine_dmsf'),
title => l(:label_dmsf_wokflow_action_start)) %>
<% end %>
<% when DmsfWorkflow::STATE_REJECTED %>
<%= content_tag(:span, image_tag('assigned.png', :plugin => 'redmine_dmsf'),
:title => l(:title_rejected)) %>
<% else %> <% else %>
<% if @workflows_available %> <%= content_tag(:span, image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'),
<%= link_to(image_tag('none.png', :plugin => 'redmine_dmsf'), :title => "#{l(:label_dmsf_wokflow_action_approve)} #{l(:label_dmsf_wokflow_action_reject)} #{l(:label_dmsf_wokflow_action_delegate)}") %>
assign_dmsf_workflow_path( <% end %>
:project_id => project.id, <% when DmsfWorkflow::STATE_APPROVED %>
:dmsf_file_revision_id => file.last_revision.id), <%= content_tag(:span, image_tag('approved.png', :plugin => 'redmine_dmsf'),
:title => l(:label_dmsf_wokflow_action_assign), :title => l(:title_approved)) %>
:remote => true) %> <% when DmsfWorkflow::STATE_ASSIGNED %>
<% end %> <% if User.current && (file.last_revision.dmsf_workflow_assigned_by == User.current.id) && wf %>
<% end %> <%= link_to(image_tag('assigned.png', :plugin => 'redmine_dmsf'),
start_dmsf_workflow_path(
:id => file.last_revision.dmsf_workflow_id,
:dmsf_file_revision_id => file.last_revision.id),
:title => l(:label_dmsf_wokflow_action_start)) %>
<% else %>
<%= content_tag(:span, image_tag('assigned.png', :plugin => 'redmine_dmsf'),
title => l(:label_dmsf_wokflow_action_start)) %>
<% end %>
<% when DmsfWorkflow::STATE_REJECTED %>
<%= content_tag(:span, image_tag('rejected.png', :plugin => 'redmine_dmsf'),
:title => l(:title_rejected)) %>
<% else %>
<% if @workflows_available && !file.locked_for_user? %>
<%= link_to(image_tag('none.png', :plugin => 'redmine_dmsf'),
assign_dmsf_workflow_path(
:project_id => project.id,
:dmsf_file_revision_id => file.last_revision.id),
:title => l(:label_dmsf_wokflow_action_assign),
:remote => true) %>
<% end %>
<% end %> <% end %>
<% end %> <% end %>
</td> </td>
<td class="invisible">1</td> <td class="dmsf_invisible"><%= position %></td>
<td class="invisible"><%= file.last_revision.size %></td> <td class="dmsf_invisible"><%= file.last_revision.size %></td>
<td class="invisible"><%= file.last_revision.updated_at.to_i %></td> <td class="dmsf_invisible"><%= file.last_revision.updated_at.to_i %></td>
<td class="invisible"><%= file.last_revision.iversion %></td> <td class="dmsf_invisible"><%= file.last_revision.iversion %></td>

View File

@ -1,9 +1,9 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -20,36 +20,47 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<td class="check"><%= check_box_tag(name, id, false, <td class="dmsf_checkbox"><%= check_box_tag(name, id, false,
:title => l(:title_check_for_restore_or_delete), :id => "file_#{id}") %></td> :title => l(:title_check_for_restore_or_delete), :id => "file_#{id}") %></td>
<td class="title"> <td class="dmsf_title">
<%= content_tag(:span, h(title), <%= content_tag(:span, h(title),
:title => h(title), :title => h(file.last_revision.try(:tooltip)),
:class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}") %> :class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}") %>
<div class="filename" title="<%= l(:title_filename_for_download)%>"><%= h(link ? link.path : file.display_name) %></div> <div class="dmsf_filename" title="<%= l(:title_filename_for_download)%>"><%= h(link ? link.path : file.display_name) %></div>
</td> </td>
<td class="size"><%= number_to_human_size(file.last_revision.size) %></td> <td class="dmsf_size"><%= number_to_human_size(file.last_revision.size) %></td>
<td class="modified"> <td class="dmsf_modified">
<%= format_time(file.last_revision.updated_at) %> <%= format_time(file.last_revision.updated_at) %>
</td> </td>
<td class="version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td> <td class="dmsf_version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td>
<td class="workflow"> <td class="dmsf_workflow">
<%= file.last_revision.workflow_str(false) %> <%= file.last_revision.workflow_str(false) %>
</td> </td>
<td class="author"><%= h(file.last_revision.user) %></td> <td class="dmsf_author"><%= h(file.last_revision.user) %></td>
<td class="buttons"> <td class="dmsf_buttons">
<% if @file_manipulation_allowed %> <% if @file_manipulation_allowed %>
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'), <% if link %>
restore_dmsf_file_path(:id => file), <%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
:title => l(:title_restore)) %> restore_dmsf_link_path(:id => link),
<%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'), :title => l(:title_restore)) %>
dmsf_file_path(:id => file, :commit => 'yes'), <%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
:data => {:confirm => l(:text_are_you_sure)}, dmsf_link_path(:id => link, :commit => 'yes'),
:method => :delete, :data => {:confirm => l(:text_are_you_sure)},
:title => l(:title_delete)) %> :method => :delete,
:title => l(:title_delete)) %>
<% else # file %>
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
restore_dmsf_file_path(:id => file),
:title => l(:title_restore)) %>
<%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
dmsf_file_path(:id => file, :commit => 'yes'),
:data => {:confirm => l(:text_are_you_sure)},
:method => :delete,
:title => l(:title_delete)) %>
<% end %>
<% end %> <% end %>
</td> </td>
<td class="invisible">1</td> <td class="dmsf_invisible">1</td>
<td class="invisible"><%= file.last_revision.size %></td> <td class="dmsf_invisible"><%= file.last_revision.size %></td>
<td class="invisible"><%= file.last_revision.updated_at.to_i %></td> <td class="dmsf_invisible"><%= file.last_revision.updated_at.to_i %></td>
<td class="invisible"><%= file.last_revision.iversion %></td> <td class="dmsf_invisible"><%= file.last_revision.iversion %></td>

View File

@ -0,0 +1,118 @@
<%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<table class="display list dmsf_list" id="browser">
<thead>
<tr>
<th class="dmsf_checkbox dmsf_th">
<input id="check_all_entries" title="<%= l(:title_check_uncheck_all_for_zip_download_or_email) %>" type="checkbox" />
</th>
<th class ="dmsf_th"><%= l(:link_title) %></th>
<th class ="dmsf_th"><%= l(:link_size) %></th>
<th class ="dmsf_th"><%= l(:link_modified) %></th>
<th title="<%= l(:label_dmsf_version) %>" class ="dmsf_th"><%= l(:link_ver) %></th>
<th class ="dmsf_th"><%= l(:link_workflow) %></th>
<th class ="dmsf_th"><%= l(:link_author) %></th>
<th class ="dmsf_th"></th>
<th class="dmsf_invisible"></th>
<th class="dmsf_invisible"></th>
<th class="dmsf_invisible"></th>
<th class="dmsf_invisible"></th>
</tr>
</thead>
<tbody>
<% @subfolders.each do |subfolder| %>
<tr class="dir">
<%= render(:partial => 'dir',
:locals => {
:project => @project,
:subfolder => subfolder,
:link => nil,
:id => subfolder.id,
:name => 'subfolders[]',
:title => subfolder.title,
:position => 0 }) %>
</tr>
<% end %>
<% @dir_links.each do |link| %>
<% unless link.target_project %>
<% Rails.logger.error "Error: dmsf_link id #{link.id} has no target!" %>
<% next %>
<% end %>
<tr class="dmsf_gray">
<%= render(:partial => 'dir',
:locals => {
:project => link.target_project,
:subfolder => link.target_folder,
:link => link,
:id => link.id,
:name => 'dir_links[]',
:title => link.name,
:position => 0}) %>
</tr>
<% end %>
<% @files.each do |file| %>
<% unless file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{file.id} has no revision!" %>
<% next %>
<% end %>
<tr class="file">
<%= render(:partial => 'file', :locals => {
:project => @project,
:file => file,
:link => nil,
:id => file.id,
:name => 'files[]',
:title => file.title,
:position => 1 }) %>
</tr>
<% end %>
<% @file_links.each do |link| %>
<% unless link.target_file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{link.target_id} has no revision!" %>
<% next %>
<% end %>
<tr class="dmsf_gray">
<%= render(:partial => 'file', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'file_links[]',
:title => link.name,
:position => 1}) %>
</tr>
<% end %>
<% @url_links.each do |link| %>
<tr class="dmsf_gray">
<%= render(:partial => 'url', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'file_links[]',
:title => link.name,
:position => 1}) %>
</tr>
<% end %>
</tbody>
</table>

View File

@ -17,14 +17,15 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<h2> <h2>
<% if folder %> <% if folder %>
<%= link_to l(:link_documents), dmsf_folder_path(:id => @project) %> <%= link_to l(:link_documents), dmsf_folder_path(:id => @project) %>
<% folder.dmsf_path.each do |path_element| %> <% folder.dmsf_path.each do |path_element| %>
/ /
<% if !filename && path_element == folder.dmsf_path.last %> <% if filename.blank? && (path_element == folder.dmsf_path.last) %>
<%= h(path_element.title) %> <%= h(path_element.title) %>
<% else %> <% else %>
<%= link_to h(path_element.title), dmsf_folder_path(:id => @project, :folder_id => path_element) %> <%= link_to h(path_element.title), dmsf_folder_path(:id => @project, :folder_id => path_element) %>
@ -37,4 +38,7 @@
/ /
<%= h(filename) %> <%= h(filename) %>
<% end %> <% end %>
<% if title %>
&#187; <%= title %>
<% end %>
</h2> </h2>

View File

@ -0,0 +1,143 @@
<%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<table class="display list dmsf_list" id="browser">
<thead>
<tr>
<th class="dmsf_checkbox dmsf_th">
<input id="check_all_entries" title="<%= l(:title_check_uncheck_all_for_zip_download_or_email) %>" type="checkbox" />
</th>
<th class ="dmsf_th"><%= l(:link_title) %></th>
<th class ="dmsf_th"><%= l(:link_size) %></th>
<th class ="dmsf_th"><%= l(:link_modified) %></th>
<th title="<%= l(:label_dmsf_version) %>" class ="dmsf_th"><%= l(:link_ver) %></th>
<th class ="dmsf_th"><%= l(:link_workflow) %></th>
<th class ="dmsf_th"><%= l(:link_author) %></th>
<th class ="dmsf_th"></th>
<th class="dmsf_invisible"></th>
<th class="dmsf_invisible"></th>
<th class="dmsf_invisible"></th>
<th class="dmsf_invisible"></th>
</tr>
</thead>
<tbody>
<% parent = @folder ? @folder : @project %>
<% DmsfHelper.dmsf_tree(parent, parent).each do |obj, level, position| %>
<% classes = "dmsf_tree idnt-#{level}" %>
<% if obj.is_a?(DmsfFolder) && ((obj.dmsf_folders.visible.count > 0) || (obj.dmsf_files.visible.count > 0) || (obj.dmsf_links.visible.count > 0)) %>
<% classes += ' idnt dmsf_collapsed' %>
<% id = "id='#{obj.id}span'".html_safe %>
<% onclick = "onclick=\"dmsf_toggle('#{obj.id}','#{obj.id}span')\"" %>
<% else %>
<% classes += ' dmsf_child' %>
<% onclick = '' %>
<% end %>
<%if obj.dmsf_folder && obj.dmsf_folder != @folder %>
<% classes += ' dmsf_hidden' %>
<% else %>
<%# Force odd/even backgroung style for visible items %>
<% classes += " dmsf_#{cycle('odd', 'even')}" %>
<% end %>
<% parent = obj.dmsf_folder %>
<% while parent %>
<% classes += " #{parent.id}" %>
<% parent = parent.dmsf_folder %>
<% end %>
<% if obj.is_a? DmsfFolder %>
<tr <%= id %> class="dir <%= classes %>">
<%= render(:partial => 'dir',
:locals => {
:project => @project,
:subfolder => obj,
:link => nil,
:id => obj.id,
:name => 'subfolders[]',
:title => obj.title,
:onclick => onclick,
:position => position}) %>
</tr>
<% elsif obj.is_a?(DmsfLink) && (obj.target_type == 'DmsfFolder') %>
<% unless obj.target_project %>
<% Rails.logger.error "Error: dmsf_link id #{obj.id} has no target!" %>
<% next %>
<% end %>
<tr <%= id %> class="dmsf_gray <%= classes %>">
<%= render(:partial => 'dir',
:locals => {
:project => obj.target_project,
:subfolder => obj.target_folder,
:link => obj,
:id => obj.id,
:name => 'dir_links[]',
:title => obj.name,
:onclick => onclick,
:position => position}) %>
</tr>
<% elsif obj.is_a?(DmsfFile) %>
<% unless obj.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{obj.id} has no revision!" %>
<% next %>
<% end %>
<tr <%= id %> class="file <%= classes %>">
<%= render(:partial => 'file', :locals => {
:project => @project,
:file => obj,
:link => nil,
:id => obj.id,
:name => 'files[]',
:title => obj.title,
:onclick => onclick,
:position => position}) %>
</tr>
<% elsif obj.is_a?(DmsfLink) && (obj.target_type == 'DmsfFile') %>
<% unless obj.target_file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{obj.target_id} has no revision!" %>
<% next %>
<% end %>
<tr <%= id %> class="dmsf_gray <%= classes %>">
<%= render(:partial => 'file', :locals => {
:project => obj.target_project,
:file => obj.target_file,
:link => obj,
:id => obj.id,
:name => 'file_links[]',
:title => obj.name,
:onclick => onclick,
:position => position}) %>
</tr>
<% elsif obj.is_a?(DmsfLink) && (obj.target_type == 'DmsfUrl') %>
<tr <%= id %> class="dmsf_gray <%= classes %>">
<%= render(:partial => 'url', :locals => {
:project => obj.target_project,
:file => obj.target_file,
:link => obj,
:id => obj.id,
:name => 'file_links[]',
:title => obj.name,
:onclick => onclick,
:position => position}) %>
</tr>
<% end %>
<% end %>
</tbody>
</table>

View File

@ -1,9 +1,9 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -20,39 +20,40 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<td class="check"></td> <td class="dmsf_checkbox"></td>
<td class="title"> <td class="dmsf_title">
<%= link_to(h(title), <% if @tree_view %>
link.external_url, <span class='dmsf_expander' <%= onclick.html_safe %>></span>
:target => "_blank", <% end %>
:class => 'icon icon-link') %> <%= link_to(h(title),
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div> link.external_url,
:target => '_blank',
:class => 'icon dmsf_icon-link') %>
<div class="dmsf_filename" title="<%= l(:label_target_folder) %>">
<%= link.external_url %>
</div>
<%= '</span>'.html_safe if @tree_view %>
</td> </td>
<td class="size"></td> <td class="dmsf_size"></td>
<td class="modified"><%= format_time(link.updated_at) %></td> <td class="dmsf_modified"><%= format_time(link.updated_at) %></td>
<td class="version"></td> <td class="dmsf_version"></td>
<td class="workflow"></td> <td class="dmsf_workflow"></td>
<td class="author"><%= h(link.user) %></td> <td class="dmsf_author"><%= h(link.user) %></td>
<td class="buttons"> <td class="dmsf_buttons">
<span class="icon"></span>
<span class="icon"></span>
<span class="icon"></span>
<% if @file_manipulation_allowed %> <% if @file_manipulation_allowed %>
<% if @file_manipulation_allowed %> <%= link_to(image_tag('delete.png'),
<span class="icon"></span> dmsf_link_path(link),
<span class="icon"></span> :data => {:confirm => l(:text_are_you_sure)},
<span class="icon"></span> :method => :delete,
<%= link_to(image_tag('delete.png'), :title => l(:title_delete)) %>
dmsf_link_path(link), <% else %>
:data => {:confirm => l(:text_are_you_sure)}, <span class="icon"></span>
:method => :delete,
:title => l(:title_delete)) %>
<% else %>
<span class="icon"></span>
<span class="icon"></span>
<span class="icon"></span>
<span class="icon dmsf_icon-narrow"></span>
<% end %>
<% end %> <% end %>
</td> </td>
<td class="invisible">1</td> <td class="dmsf_invisible"><%= position %> </td>
<td class="invisible"></td> <td class="dmsf_invisible"></td>
<td class="invisible">link.updated_at.to_i</td> <td class="dmsf_invisible">link.updated_at.to_i</td>
<td class="invisible"></td> <td class="dmsf_invisible"></td>

View File

@ -1,9 +1,9 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -20,21 +20,21 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<td class="check"><%= check_box_tag(name, id, false, <td class="dmsf_checkbox"><%= check_box_tag(name, id, false,
:title => l(:title_check_for_restore_or_delete)) %></td> :title => l(:title_check_for_restore_or_delete)) %></td>
<td class="title"> <td class="dmsf_title">
<%= link_to(h(title), <%= link_to(h(title),
link.external_url, link.external_url,
:target => "_blank", :target => '_blank',
:class => 'icon icon-link') %> :class => 'icon dmsf_icon-link') %>
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div> <div class="dmsf_filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div>
</td> </td>
<td class="size"></td> <td class="dmsf_size"></td>
<td class="modified"><%= format_time(link.updated_at) %></td> <td class="dmsf_modified"><%= format_time(link.updated_at) %></td>
<td class="version"></td> <td class="dmsf_version"></td>
<td class="workflow"></td> <td class="dmsf_workflow"></td>
<td class="author"><%= h(link.user) %></td> <td class="dmsf_author"><%= h(link.user) %></td>
<td class="buttons"> <td class="dmsf_buttons">
<% if @file_manipulation_allowed %> <% if @file_manipulation_allowed %>
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'), <%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
restore_dmsf_link_path(:id => link), restore_dmsf_link_path(:id => link),
@ -46,7 +46,7 @@
:title => l(:title_delete)) %> :title => l(:title_delete)) %>
<% end %> <% end %>
</td> </td>
<td class="invisible">1</td> <td class="dmsf_invisible">1</td>
<td class="invisible"></td> <td class="dmsf_invisible"></td>
<td class="invisible">link.updated_at.to_i</td> <td class="dmsf_invisible">link.updated_at.to_i</td>
<td class="invisible"></td> <td class="dmsf_invisible"></td>

View File

@ -1,7 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Redmine plugin for Document Management System "Features"
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -15,86 +19,82 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% html_title(l(:dmsf)) %> <% html_title(l(:dmsf)) %>
<div class="contextual"> <div class="contextual">
<% if User.current.allowed_to?(:folder_manipulation, @project) && params[:action] == 'edit' %> <% if !@folder.new_record? && User.current.allowed_to?(:folder_manipulation, @project) %>
<% unless @folder.locked? %> <% if !@folder.locked_for_user? %>
<%= link_to(l(:button_lock), <% unless @folder.locked? %>
<%= link_to(l(:button_lock),
lock_dmsf_path(:id => @project, :folder_id => @folder), lock_dmsf_path(:id => @project, :folder_id => @folder),
:title => l(:title_lock_file), :title => l(:title_lock_file), :class => 'icon dmsf_icon-lock') %>
:class => 'icon icon-dmsf-lock') %> <% else %>
<%= link_to_if(@folder.unlockable?, l(:button_unlock),
unlock_dmsf_path(:id => @project, :folder_id => @folder),
:title => l(:title_unlock_file), :class => 'icon dmsf_icon-unlock')%>
<% end %>
<% if @folder.notification %> <% if @folder.notification %>
<%= link_to(l(:label_notifications_off), <%= link_to(l(:label_notifications_off),
notify_deactivate_dmsf_path(:id => @project, :folder_id => @folder), notify_deactivate_dmsf_path(:id => @project, :folder_id => @folder),
:title => l(:title_notifications_active_deactivate), :title => l(:title_notifications_active_deactivate),
:class => 'icon icon-notification-on') %> :class => 'icon dmsf_icon-notification-on') %>
<% else %> <% else %>
<%= link_to(l(:label_notifications_on), <%= link_to(l(:label_notifications_on),
notify_activate_dmsf_path(:id => @project, :folder_id => @folder), notify_activate_dmsf_path(:id => @project, :folder_id => @folder),
:title => l(:title_notifications_not_active_activate), :title => l(:title_notifications_not_active_activate),
:class => 'icon icon-notification-off') %> :class => 'icon dmsf_icon-notification-off') %>
<% end %> <% end %>
<%= link_to(l(:label_link_to), <%= link_to(l(:label_link_to),
new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @folder.id, :type => 'link_to'), new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @folder.id, :type => 'link_to'),
:title => l(:title_create_link), :title => l(:title_create_link), :class => 'icon dmsf_icon-link') %>
:class => 'icon icon-link') %>
<%= link_to(l(:button_copy), copy_folder_path(:id => @folder), <%= link_to(l(:button_copy), copy_folder_path(:id => @folder),
:title => l(:title_copy), :class => 'icon icon-copy') %> :title => l(:title_copy), :class => 'icon icon-copy') %>
<%= link_to(l(:button_delete), <%= link_to(l(:button_delete),
delete_dmsf_path(:id => @project, :folder_id => @folder), delete_dmsf_path(:id => @project, :folder_id => @folder),
:data => {:confirm => l(:text_are_you_sure)}, :data => {:confirm => l(:text_are_you_sure)},
:title => l(:title_delete), :title => l(:title_delete), :class => 'icon icon-del') %>
:class => 'icon icon-del') %> <% elsif @force_file_unlock_allowed %>
<% else %> <%= link_to_if(@folder.unlockable?, l(:button_unlock),
<% if (!@folder.locked_for_user? || User.current.allowed_to?(:force_file_unlock, @project)) && @folder.unlockable? %> unlock_dmsf_path(:id => @project, :folder_id => @folder),
<%= link_to(l(:button_unlock), :title => l(:title_unlock_file), :class => 'icon dmsf_icon-unlock')%>
unlock_dmsf_path(:id => @project, :folder_id => @folder),
:title => l(:title_unlock_file),
:class => 'icon icon-dmsf-unlock')%>
<% end %>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
<% create = @pathfolder == @parent %> <% create = @pathfolder == @parent %>
<%= render(:partial => 'path', :locals => {:folder => @pathfolder, :filename => create ? l(:heading_new_folder) : nil}) %> <%= render(:partial => 'path',
:locals => {:folder => @pathfolder, :filename => create ? l(:heading_new_folder) : nil, :title => nil}) %>
<%= form_for(@folder, :url => {:action => create ? 'create' : 'save', :id => @project, :folder_id => @folder, :parent_id => @parent}, <%= labelled_form_for(@folder, :url => {:action => create ? 'create' : 'save', :id => @project, :folder_id => @folder, :parent_id => @parent},
:html => {:method=>:post}) do |f| %> :html => {:method=>:post}) do |f| %>
<%= error_messages_for(@folder) %> <%= error_messages_for(@folder) %>
<div class="box dmsf_detail"> <div class="box tabular">
<div class="clear"> <p>
<div class="splitcontentleft"> <%= f.text_field(:title, :required => true) %>
<p> </p>
<%= label_tag('dmsf_folder_title', "#{l(:label_title)}:") %> <p>
<%= f.text_field(:title, :size => '32', :required => true) %> <%= f.select(:dmsf_folder_id,
</p> options_for_select(DmsfFolder.directory_tree(@project, @folder),
</div> :selected => @parent? @parent.id : (@pathfolder.id if @pathfolder)),
<div class="splitcontentright"> :label => l(:field_folder))
<p> %>
<%= label_tag('', "#{l(:field_folder)}:") %> </p>
<%= f.select(:dmsf_folder_id, <p>
options_for_select(DmsfFolder.directory_tree(@project, @folder), <%= f.text_area :description, :rows => 8, :class => 'wiki-edit' %>
:selected => @parent? @parent.id : (@pathfolder.id if @pathfolder)))
%>
</p>
</div>
</div>
<p class="no-ident">
<%= label_tag('dmsf_folder_description', "#{l(:label_description)}:") %>
</p> </p>
<div class="wiki data clear">
<%= f.text_area(:description, :rows => 15, :class => 'wiki-edit') %>
</div>
<% values = @folder ? @folder.custom_field_values : @parent ? @parent.custom_field_values : DmsfFolder.new(:project => @project).custom_field_values %> <% values = @folder ? @folder.custom_field_values : @parent ? @parent.custom_field_values : DmsfFolder.new(:project => @project).custom_field_values %>
<% values.each do |value| %> <% values.each do |value| %>
<p><%= custom_field_tag_with_label(:dmsf_folder, value) %></p> <p><%= custom_field_tag_with_label(:dmsf_folder, value) %></p>
<% end %> <% end %>
</div> </div>
<%= submit_tag(create ? l(:submit_create) : l(:submit_save)) %> <p><%= submit_tag(create ? l(:submit_create) : l(:submit_save)) %></p>
<% end %> <% end %>
<%= wikitoolbar_for 'dmsf_folder_description' %> <%= wikitoolbar_for 'dmsf_folder_description' %>
<script type="text/javascript">
$('#dmsf_folder_dmsf_folder_id').select2();
</script>

View File

@ -1,7 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Redmine plugin for Document Management System "Features"
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -15,7 +19,8 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% html_title(l(:dmsf)) %> <% html_title(l(:dmsf)) %>
@ -25,29 +30,28 @@
<%= link_to(l(:label_notifications_off), <%= link_to(l(:label_notifications_off),
notify_deactivate_dmsf_path(:id => @project), notify_deactivate_dmsf_path(:id => @project),
:title => l(:title_notifications_active_deactivate), :title => l(:title_notifications_active_deactivate),
:class => 'icon icon-notification-on') %> :class => 'icon dmsf_icon-notification-on') %>
<% else %> <% else %>
<%= link_to(l(:label_notifications_on), <%= link_to(l(:label_notifications_on),
notify_activate_dmsf_path(:id => @project), notify_activate_dmsf_path(:id => @project),
:title => l(:title_notifications_active_deactivate), :title => l(:title_notifications_active_deactivate),
:class => 'icon icon-notification-off') %> :class => 'icon dmsf_icon-notification-off') %>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
<%= render(:partial => 'path', :locals => {:folder => nil, :filename => nil}) %> <%= render(:partial => 'path',
:locals => {:folder => nil, :filename => nil, :title => nil}) %>
<%= form_for(@project, :url => {:action => 'save_root', :id => @project}, <%= labelled_form_for(@project, :url => {:action => 'save_root', :id => @project},
:html => {:method=>:post}) do |f| %> :html => {:method => :post}) do |f| %>
<div class="box dmsf_detail"> <div class="box tabular">
<p class="no-ident"> <p>
<%= label_tag('project_dmsf_description', "#{l(:label_description)}:") %> <%= f.text_area(:dmsf_description, :rows => 8, :class => 'wiki-edit',
:label => l(:field_description)) %>
</p> </p>
<div class="wiki data clear">
<%= f.text_area(:dmsf_description, :rows => 15, :class => 'wiki-edit') %>
</div>
</div> </div>
<%= submit_tag(l(:submit_save)) %> <%= f.submit l(:submit_save) %>
<% end %> <% end %>
<%= wikitoolbar_for 'project_dmsf_description' %> <%= wikitoolbar_for 'project_dmsf_description' %>

View File

@ -1,8 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -16,50 +19,50 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% html_title(l(:dmsf)) %> <% html_title(l(:dmsf)) %>
<div class="contextual"> <%= render(:partial => 'path',
</div> :locals => {:folder => @folder, :filename => nil, :title => l(:heading_send_documents_by_email)}) %>
<%= render(:partial => 'path', :locals => {:folder => @folder, :filename => nil}) %> <%= form_tag({ :action => 'entries_email', :id => @project, :folder_id => @folder },
{ :method => :post }) do %>
<h3><%= l(:heading_send_documents_by_email) %></h3>
<%= form_tag({:action => 'entries_email', :id => @project, :folder_id => @folder},
{ :method=>:post, :class => 'tabular'}) do %>
<%= hidden_field_tag('email[zipped_content]', @email_params[:zipped_content]) %> <%= hidden_field_tag('email[zipped_content]', @email_params[:zipped_content]) %>
<%= hidden_field_tag('email[folders]', @email_params[:folders].to_json) %> <%= hidden_field_tag('email[folders]', @email_params[:folders].to_json) %>
<%= hidden_field_tag('email[files]', @email_params[:files].to_json) %> <%= hidden_field_tag('email[files]', @email_params[:files].to_json) %>
<div class="box"> <div class="box tabular">
<p> <p>
<%= label_tag('', "#{l(:label_email_from)}:") %> <%= label_tag('', l(:label_email_from)) %>
<i><%= h(Setting.mail_from) %></i> <%= text_field_tag('email[from]', h(Setting.mail_from), :style => 'width: 90%;', :disabled => true) %>
</p> </p>
<p> <p>
<%= label_tag('email[to]', "#{l(:label_email_to)}:") %> <%= label_tag('email[to]', l(:label_email_to)) %>
<%= text_field_tag('email[to]', @email_params['to'], :style => 'width: 90%;') %> <%= text_field_tag('email[to]', @email_params['to'], :style => 'width: 90%;') %>
</p> </p>
<p> <p>
<%= label_tag('email[cc]', "#{l(:label_email_cc)}:") %> <%= label_tag('email[cc]', l(:label_email_cc)) %>
<%= text_field_tag('email[cc]', @email_params['cc'], :style => 'width: 90%;') %> <%= text_field_tag('email[cc]', @email_params['cc'], :style => 'width: 90%;') %>
</p> </p>
<p> <p>
<%= label_tag('email[subject]', "#{l(:label_email_subject)}:") %> <%= label_tag('email[subject]', l(:label_email_subject)) %>
<%= text_field_tag('email[subject]', @email_params['subject'], :style => 'width: 90%;') %> <%= text_field_tag('email[subject]', @email_params['subject'], :style => 'width: 90%;') %>
</p> </p>
<p> <p>
<%= label_tag('', "#{l(:label_email_documents)}:") %> <%= label_tag('', l(:label_email_documents)) %>
<%= link_to 'Documents.zip', download_email_entries_path(:id => @project, :folder_id => @folder, :path => @email_params[:zipped_content]) %> <span>
<%= l(:label_or) %> <%= check_box_tag('email[links_only]') %> <%= l(:label_links_only) %> <%= link_to 'Documents.zip', download_email_entries_path(:id => @project, :folder_id => @folder, :path => @email_params[:zipped_content]) %>
<%= l(:label_or) %>
<%= check_box_tag('email[links_only]') %> <%= l(:label_links_only) %>
</span>
</p> </p>
<p> <p>
<%= label_tag('email[body]', "#{l(:label_email_body)}:") %> <%= label_tag('email[body]', l(:label_email_body)) %>
<%= text_area_tag('email[body]', @email_params['body'], :rows=> '20', :style => 'width: 90%;') %> <%= text_area_tag('email[body]', @email_params['body'], :rows => '20', :style => 'width: 90%;') %>
</p> </p>
<p><%= submit_tag(l(:label_email_send)) %></p>
</div> </div>
<p><%= submit_tag(l(:label_email_send)) %></p>
<% end %> <% end %>
<%= wikitoolbar_for 'email_body' %> <%= wikitoolbar_for 'email_body' %>

View File

@ -1,11 +1,11 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -22,12 +22,11 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<% html_title(l(:dmsf)) %> <% html_title l(:dmsf) %>
<div class="contextual"> <div class="contextual">
<% if @folder_manipulation_allowed %> <% if @folder_manipulation_allowed %>
<% if @folder.nil? %> <% if @folder.nil? %>
<%= link_to(l(:button_edit), <%= link_to(l(:button_edit), edit_root_dmsf_path(:id => @project),
edit_root_dmsf_path(:id => @project),
:title => l(:link_edit, :title => l(:link_documents)), :title => l(:link_edit, :title => l(:link_documents)),
:class => 'icon icon-edit') %> :class => 'icon icon-edit') %>
<% elsif !@locked_for_user %> <% elsif !@locked_for_user %>
@ -38,53 +37,30 @@
<% end %> <% end %>
<% if @folder && (!@locked_for_user || User.current.allowed_to?(:force_file_unlock, @project)) %> <% if @folder && (!@locked_for_user || User.current.allowed_to?(:force_file_unlock, @project)) %>
<% if @folder.locked? %> <% if @folder.locked? %>
<% unless @folder.unlockable? %> <%= link_to_if(@folder.unlockable?, l(:button_unlock),
<%= link_to(l(:button_unlock), unlock_dmsf_path(:id => @project, :folder_id => @folder, :current => request.url),
:title => l(:title_folder_parent_locked, :name => @folder.folder.lock.reverse[0].folder.title), :title => l(:title_unlock_folder), :class => 'icon dmsf_icon-unlock') %>
:class => 'icon icon-dmsf-unlock') if @folder %>
<% else %>
<%= link_to(l(:button_unlock),
unlock_dmsf_path(:id => @project, :folder_id => @folder, :current => request.url),
:title => l(:title_unlock_folder),
:class => 'icon icon-dmsf-unlock') if @folder %>
<% end %>
<% else %> <% else %>
<%= link_to(l(:button_lock), <%= link_to(l(:button_lock),
lock_dmsf_path(:id => @project, :folder_id => @folder, :current => request.url), lock_dmsf_path(:id => @project, :folder_id => @folder, :current => request.url),
:title => l(:title_lock_folder), :title => l(:title_lock_folder), :class => 'icon dmsf_icon-lock') %>
:class => 'icon icon-dmsf-lock') if @folder %>
<% end %> <% end %>
<% end %> <% end %>
<% unless @folder %> <% if !@locked_for_user && ((@folder && @folder.notification) || (!@folder && @project.dmsf_notification)) %>
<% if @project.dmsf_notification %> <%= link_to(l(:label_notifications_off),
<%= link_to(l(:label_notifications_off), notify_deactivate_dmsf_path(:id => @project, :folder_id => @folder),
notify_deactivate_dmsf_path(:id => @project), :title => l(:title_notifications_active_deactivate),
:title => l(:title_notifications_active_deactivate), :class => 'icon dmsf_icon-notification-on') %>
:class => 'icon icon-notification-on') %>
<% else %>
<%= link_to(l(:label_notifications_on),
notify_activate_dmsf_path(:id => @project),
:title => l(:title_notifications_active_deactivate),
:class => 'icon icon-notification-off') %>
<% end %>
<% else %> <% else %>
<% if @folder.notification %> <%= link_to(l(:label_notifications_on),
<%= link_to(l(:label_notifications_off), notify_activate_dmsf_path(:id => @project, :folder_id => @folder),
notify_deactivate_dmsf_path(:id => @project, :folder_id => @folder), :title => l(:title_notifications_not_active_activate),
:title => l(:title_notifications_active_deactivate), :class => 'icon dmsf_icon-notification-off') %>
:class => 'icon icon-notification-on') %>
<% else %>
<%= link_to(l(:label_notifications_on),
notify_activate_dmsf_path(:id => @project, :folder_id => @folder),
:title => l(:title_notifications_not_active_activate),
:class => 'icon icon-notification-off') %>
<% end %>
<% end %> <% end %>
<% if @file_manipulation_allowed %> <% if @file_manipulation_allowed && !@locked_for_user %>
<%= link_to(l(:label_link_from), <%= link_to(l(:label_link_from),
new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @folder ? @folder.id : @folder, :type => 'link_from'), new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @folder ? @folder.id : @folder, :type => 'link_from'),
:title => l(:title_create_link), :title => l(:title_create_link), :class => 'icon dmsf_icon-link') %>
:class => 'icon icon-link') unless @locked_for_user %>
<% end %> <% end %>
<%= link_to(l(:link_create_folder), <%= link_to(l(:link_create_folder),
new_dmsf_path(:id => @project, :parent_id => @folder), new_dmsf_path(:id => @project, :parent_id => @folder),
@ -95,7 +71,8 @@
:title => l(:link_trash_bin), :class => 'icon icon-del') if @trash_visible %> :title => l(:link_trash_bin), :class => 'icon icon-del') if @trash_visible %>
</div> </div>
<%= render(:partial => 'path', :locals => {:folder => @folder, :filename => nil}) %> <%= render(:partial => 'path',
:locals => {:folder => @folder, :filename => nil, :title => nil}) %>
<div class="dmsf-header"> <div class="dmsf-header">
<div class="wiki"> <div class="wiki">
@ -106,9 +83,9 @@
<%= error_messages_for('dmsf_workflow') %> <%= error_messages_for('dmsf_workflow') %>
<%= form_tag({:action => :entries_operation, :id => @project, :folder_id => @folder}, :method => :post, <%= form_tag({:action => :entries_operation, :id => @project, :folder_id => @folder}, :method => :post,
:class => 'dmfs_entries', :id => 'entries_form') do %> :class => 'dmsf_entries', :id => 'entries_form') do %>
<%= hidden_field_tag('action') %> <%= hidden_field_tag('action') %>
<div class="controls" style="float: left"> <div class="dmsf_controls" style="float: left">
<%= submit_tag(l(:button_download), :title => l(:title_download_checked), :name => 'download_entries') if @file_view_allowed %> <%= submit_tag(l(:button_download), :title => l(:title_download_checked), :name => 'download_entries') if @file_view_allowed %>
<%= submit_tag(l(:field_mail), :title => l(:title_send_checked_by_email), :name => 'email_entries') if (@file_view_allowed && User.current.allowed_to?(:email_documents, @project)) %> <%= submit_tag(l(:field_mail), :title => l(:title_send_checked_by_email), :name => 'email_entries') if (@file_view_allowed && User.current.allowed_to?(:email_documents, @project)) %>
<% if @file_delete_allowed%> <% if @file_delete_allowed%>
@ -117,103 +94,19 @@
</div> </div>
<% values = @folder ? @folder.custom_field_values : @parent ? @parent.custom_field_values : DmsfFolder.new(:project => @project).custom_field_values %> <% values = @folder ? @folder.custom_field_values : @parent ? @parent.custom_field_values : DmsfFolder.new(:project => @project).custom_field_values %>
<% unless values.empty? %> <% unless values.empty? %>
<div class="controls" style="float: right"> <div class="dmsf_controls" style="float: right">
<%= custom_field_tag_with_label( <%= custom_field_tag_with_label(
:dmsf_folder, :dmsf_folder,
CustomValue.new(:custom_field_id => params[:custom_field_id].present? ? params[:custom_field_id] : values.first.custom_field_id, :value => params[:custom_value])) %> CustomValue.new(:custom_field_id => params[:custom_field_id].present? ? params[:custom_field_id] : values.first.custom_field_id, :value => params[:custom_value])) %>
</div> </div>
<% end %> <% end %>
<table class="display entries" id="browser"> <div class="autoscroll">
<thead> <% if @tree_view %>
<tr id="root"> <%= render(:partial => 'tree_view') %>
<th class="check"> <% else %>
<input id="check_all_entries" title="<%= l(:title_check_uncheck_all_for_zip_download_or_email) %>" type="checkbox" /> <%= render(:partial => 'list_view') %>
</th>
<th><%= l(:link_title) %></th>
<th><%= l(:link_size) %></th>
<th><%= l(:link_modified) %></th>
<th title="<%= l(:label_version) %>"><%= l(:link_ver) %></th>
<th><%= l(:link_workflow) %></th>
<th><%= l(:link_author) %></th>
<th></th>
<th class="invisible"></th>
<th class="invisible"></th>
<th class="invisible"></th>
<th class="invisible"></th>
</tr>
</thead>
<tbody>
<% @subfolders.each do |subfolder| %>
<tr class="dir">
<%= render(:partial => 'dir',
:locals => {
:project => @project,
:subfolder => subfolder,
:link => nil,
:id => subfolder.id,
:name => 'subfolders[]',
:title => subfolder.title }) %>
</tr>
<% end %>
<% @dir_links.each do |link| %>
<% unless link.target_project %>
<% Rails.logger.error "Error: dmsf_link id #{link.id} has no target!" %>
<% next %>
<% end %> <% end %>
<tr class="gray"> </div>
<%= render(:partial => 'dir',
:locals => {
:project => link.target_project,
:subfolder => link.target_folder,
:link => link,
:id => link.id,
:name => 'dir_links[]',
:title => link.name }) %>
</tr>
<% end %>
<% @files.each do |file| %>
<% unless file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{file.id} has no revision!" %>
<% next %>
<% end %>
<tr class="file">
<%= render(:partial => 'file', :locals => {
:project => @project,
:file => file,
:link => nil,
:id => file.id,
:name => 'files[]',
:title => file.title }) %>
</tr>
<% end %>
<% @file_links.each do |link| %>
<% unless link.target_file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{link.target_id} has no revision!" %>
<% next %>
<% end %>
<tr class="gray">
<%= render(:partial => 'file', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'file_links[]',
:title => link.name }) %>
</tr>
<% end %>
<% @url_links.each do |link| %>
<tr class="gray">
<%= render(:partial => 'url', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'file_links[]',
:title => link.name }) %>
</tr>
<% end %>
</tbody>
</table>
<% end %> <% end %>
<script type="text/javascript"> <script type="text/javascript">
@ -235,8 +128,8 @@
</script> </script>
<% <%
sUrl = "jquery.dataTables/#{I18n.locale.to_s.downcase}.json" sUrl = 'jquery.dataTables/en.json'
sUrl = 'jquery.dataTables/en.json' unless File.exist?(sUrl) sUrl = "jquery.dataTables/#{I18n.locale.to_s.downcase}.json" if I18n.locale && !I18n.locale.to_s.match(/^en.*/)
%> %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
@ -249,24 +142,32 @@
$('#browser').dataTable({ $('#browser').dataTable({
'bJQueryUI': true, 'bJQueryUI': true,
'oLanguage': { 'oLanguage': {
'sUrl': "<%= plugin_asset_path(:redmine_dmsf, 'javascripts', sUrl) %>" 'sUrl': "<%= plugin_asset_path(:redmine_dmsf, 'javascripts', sUrl) %>"
}, },
'bAutoWidth': false, 'bAutoWidth': false,
'bPaginate': false, 'bPaginate': false,
'aaSorting': [[1,'asc']], 'aaSorting': [[1, 'asc']],
'aaSortingFixed': [[8,'asc']], 'aaSortingFixed': [[ 8, 'asc']],
'aoColumnDefs': [ 'aoColumnDefs': [
{ 'bSearchable': false, 'aTargets': [0, 7, 8, 9] }, { 'bSearchable': false, 'aTargets': [0, 7, 8, 9, 10, 11] },
{ 'bSortable': false, 'aTargets': [0, 7, 8] }, { 'bSortable': false, 'aTargets': [0, 7] },
{ 'iDataSort': 9, 'aTargets': [ 2 ] }, { 'iDataSort': 9, 'aTargets': [ 2 ] },
{ 'iDataSort': 10, 'aTargets': [ 3 ] }, { 'iDataSort': 10, 'aTargets': [ 3 ] },
{ 'iDataSort': 11, 'aTargets': [ 4 ] } { 'iDataSort': 11, 'aTargets': [ 4 ] }
], ],
'fnInitComplete': function() { 'fnInitComplete': function() {
jQuery('div.controls').prependTo(jQuery('#browser_wrapper div.fg-toolbar')[0]); jQuery('div.dmsf_controls').prependTo(jQuery('#browser_wrapper div.fg-toolbar')[0]);
}, },
'fnInfoCallback': function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) { 'fnInfoCallback': function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {
return "<%= l(:label_number_of_folders)%>: <%= @subfolders.count + @dir_links.count %>, <%= l(:label_number_of_documents)%>: <%= @files.count + @file_links.count + @url_links.count %>"; <% if @tree_view %>
<% if @folder %>
return "<%= "#{l(:label_number_of_folders)}: #{@folder.deep_folder_count} #{l(:label_number_of_documents)}: #{@folder.deep_file_count}" %>";
<% else %>
return "<%= "#{l(:label_number_of_folders)}: #{DmsfFolder.visible.where(:project_id => @project.id).count + DmsfLink.visible.where(:project_id => @project.id, :target_type => 'DmsfFolder').count}, #{l(:label_number_of_documents)}: #{DmsfFile.visible.where(:project_id => @project.id).count + DmsfLink.visible.where(:project_id => @project.id, :target_type => 'DmsfFile').count + DmsfLink.visible.where(:project_id => @project.id, :target_type => 'DmsfUrl').count}" %>";
<% end %>
<% else %>
return "<%= "#{l(:label_number_of_folders)}: #{@subfolders.count + @dir_links.count}, #{l(:label_number_of_documents)}: #{@files.count + @file_links.count + @url_links.count}" %>";
<% end %>
} }
}); });
@ -288,4 +189,6 @@
</script> </script>
<% end %> <% end %>
<%= render(:partial => 'dmsf_upload/multi_upload') if (@file_manipulation_allowed && !@locked_for_user) %> <% if (@file_manipulation_allowed && !@locked_for_user) %>
<%= render(:partial => 'dmsf_upload/multi_upload') %>
<% end %>

View File

@ -1,9 +1,9 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -21,10 +21,8 @@
%> %>
<% html_title(l(:dmsf)) %> <% html_title(l(:dmsf)) %>
<div class="contextual">
</div>
<h2><%= l(:link_trash_bin) %></h2> <h2><%= l(:link_trash_bin) %></h2>
<div class="dmsf-header"> <div class="dmsf-header">
<div class="wiki"> <div class="wiki">
@ -35,9 +33,9 @@
<%= error_messages_for('dmsf_workflow') %> <%= error_messages_for('dmsf_workflow') %>
<%= form_tag({:action => :entries_operation, :id => @project, :folder_id => @folder}, :method => :post, <%= form_tag({:action => :entries_operation, :id => @project, :folder_id => @folder}, :method => :post,
:class => 'dmfs_entries', :id => 'entries_form') do %> :class => 'dmsf_entries', :id => 'entries_form') do %>
<%= hidden_field_tag('action') %> <%= hidden_field_tag('action') %>
<div class="controls" style="float: left"> <div class="dmsf_controls" style="float: left">
<% if @file_manipulation_allowed && @folder_manipulation_allowed %> <% if @file_manipulation_allowed && @folder_manipulation_allowed %>
<%= submit_tag(l(:title_restore), :title => l(:title_restore_checked), :name => 'restore_entries') %> <%= submit_tag(l(:title_restore), :title => l(:title_restore_checked), :name => 'restore_entries') %>
<% if @file_delete_allowed%> <% if @file_delete_allowed%>
@ -45,23 +43,24 @@
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
<table class="display entries" id="browser"> <div class="autoscroll">
<table class="display list dmsf_list" id="browser">
<thead> <thead>
<tr id="root"> <tr>
<th class="check"> <th class="dmsf_checkbox dmsf_th">
<input id="check_all_entries" title="<%= l(:title_check_uncheck_all_for_restore_or_delete) %>" type="checkbox" /> <input id="check_all_entries" title="<%= l(:title_check_uncheck_all_for_restore_or_delete) %>" type="checkbox" />
</th> </th>
<th><%= l(:link_title) %></th> <th class="dmsf_th"><%= l(:link_title) %></th>
<th><%= l(:link_size) %></th> <th class="dmsf_th"><%= l(:link_size) %></th>
<th><%= l(:link_modified) %></th> <th class="dmsf_th"><%= l(:link_modified) %></th>
<th title="<%= l(:label_version) %>"><%= l(:link_ver) %></th> <th title="<%= l(:label_dmsf_version) %>" class="dmsf_th"><%= l(:link_ver) %></th>
<th><%= l(:link_workflow) %></th> <th class="dmsf_th"><%= l(:link_workflow) %></th>
<th><%= l(:link_author) %></th> <th class="dmsf_th"><%= l(:link_author) %></th>
<th></th> <th class="dmsf_th"></th>
<th class="invisible"></th> <th class="dmsf_invisible"></th>
<th class="invisible"></th> <th class="dmsf_invisible"></th>
<th class="invisible"></th> <th class="dmsf_invisible"></th>
<th class="invisible"></th> <th class="dmsf_invisible"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -78,7 +77,7 @@
</tr> </tr>
<% end %> <% end %>
<% @dir_links.each do |link| %> <% @dir_links.each do |link| %>
<tr class="gray"> <tr class="dmsf_gray">
<%= render(:partial => 'dir_trash', <%= render(:partial => 'dir_trash',
:locals => { :locals => {
:project => link.target_project, :project => link.target_project,
@ -109,7 +108,7 @@
<% Rails.logger.error "Error: dmsf_file id #{link.target_id} has no revision!" %> <% Rails.logger.error "Error: dmsf_file id #{link.target_id} has no revision!" %>
<% next %> <% next %>
<% end %> <% end %>
<tr class="gray"> <tr class="dmsf_gray">
<%= render(:partial => 'file_trash', :locals => { <%= render(:partial => 'file_trash', :locals => {
:project => link.target_project, :project => link.target_project,
:file => link.target_file, :file => link.target_file,
@ -120,7 +119,7 @@
</tr> </tr>
<% end %> <% end %>
<% @url_links.each do |link| %> <% @url_links.each do |link| %>
<tr class="gray"> <tr class="dmsf_gray">
<%= render(:partial => 'url_trash', :locals => { <%= render(:partial => 'url_trash', :locals => {
:project => link.target_project, :project => link.target_project,
:file => link.target_file, :file => link.target_file,
@ -132,6 +131,7 @@
<% end %> <% end %>
</tbody> </tbody>
</table> </table>
</div>
<% end %> <% end %>
<script type="text/javascript"> <script type="text/javascript">
@ -180,7 +180,7 @@
{ 'iDataSort': 11, 'aTargets': [ 4 ] } { 'iDataSort': 11, 'aTargets': [ 4 ] }
], ],
'fnInitComplete': function() { 'fnInitComplete': function() {
jQuery('div.controls').prependTo(jQuery('#browser_wrapper div.fg-toolbar')[0]); jQuery('div.dmsf_controls').prependTo(jQuery('#browser_wrapper div.fg-toolbar')[0]);
}, },
'fnInfoCallback': function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) { 'fnInfoCallback': function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {
return "<%= l(:label_number_of_folders)%>: <%= @subfolders.count + @dir_links.count %>, <%= l(:label_number_of_documents)%>: <%= @files.count + @file_links.count + @url_links.count %>"; return "<%= l(:label_number_of_folders)%>: <%= @subfolders.count + @dir_links.count %>, <%= l(:label_number_of_documents)%>: <%= @files.count + @file_links.count + @url_links.count %>";

View File

@ -1,11 +1,11 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -22,93 +22,78 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<div class="box dmsf_detail"> <div class="box tabular">
<strong><%= l(:heading_new_revision) %> <a href="#" id="newRevisionFormContentToggle">[-]</a></strong> <strong><%= l(:heading_new_revision) %> <a href="#" id="newRevisionFormContentToggle">[-]</a></strong>
<div id="newRevisionFormContent"> <div id="newRevisionFormContent">
<% if @file.locked_for_user? %> <% if @file.locked_for_user? %>
<p class="warning"><%= l(:info_file_locked) %></p> <p class="warning"><%= l(:info_file_locked) %></p>
<% else %> <% else %>
<%= form_for(@revision, :url => { :action => 'create_revision', :id => @file }, <%= labelled_form_for(@revision, :url => { :action => 'create_revision', :id => @file },
:html => { :method => :post, :multipart => true, :id => 'new_revision_form' }) do |f| %> :html => { :method => :post, :multipart => true, :id => 'new_revision_form' }) do |f| %>
<div class="clear"> <div class="clear">
<div class="splitcontentleft"> <div class="splitcontentleft">
<p> <p>
<%= label_tag('dmsf_file_revision_title', "#{l(:label_title)}:") %> <%= f.text_field(:title) %>
<%= f.text_field(:title, :size => 32) %>
</p> </p>
</div> </div>
<div class="splitcontentright"> <div class="splitcontentright">
<p style="white-space: nowrap;"> <p>
<%= label_tag('', "#{l(:label_file)}:") %> <%= f.text_field(:name, :label => l(:label_file)) %>
<%= f.text_field(:name, :size => 22) %> </p>
</p> </div>
</div> </div>
</div>
<p class="no-ident">
<%= label_tag('dmsf_file_revision_description', "#{l(:label_description)}:") %>
</p>
<div class="wiki data clear">
<%= f.text_area(:description, :rows => 6, :class => 'wiki-edit') %>
</div>
<div class="splitcontentleft">
<p> <p>
<%= label_tag('version_0', "#{l(:label_version)}:") %> <%= f.text_area(:description, :rows => 6, :class => 'wiki-edit') %>
</p> </p>
<div class="data clear"> <div class="clear">
<%= radio_button_tag('version', 0, <div class="splitcontentleft">
@revision.version == @file.last_revision.version) %> <p>
<%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version %> <%= label_tag('version_0', l(:label_dmsf_version)) %>
<%= l(:option_version_same) %><br/> <%= radio_button_tag('version', 0, @revision.version == @file.last_revision.version) %>
<%= radio_button_tag('version', 1, <%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version %>
@revision.major_version == @file.last_revision.major_version && <%= l(:option_version_same) %><br/>
@revision.minor_version != @file.last_revision.minor_version) %> <%= radio_button_tag('version', 1, @revision.major_version == @file.last_revision.major_version && @revision.minor_version != @file.last_revision.minor_version) %>
<%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version + 1 %> <%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version + 1 %>
<%= l(:option_version_minor) %><br/> <%= l(:option_version_minor) %><br/>
<%= radio_button_tag('version', 2, <%= radio_button_tag('version', 2, @revision.major_version != @file.last_revision.major_version) %>
@revision.major_version != @file.last_revision.major_version) %> <%= @file.last_revision.major_version + 1 %>.0
<%= @file.last_revision.major_version + 1 %>.0 <%= l(:option_version_major) %><br/>
<%= l(:option_version_major) %><br/> <%= radio_button_tag('version', 3) %>
<%= radio_button_tag('version', 3) %> <%= select_tag 'custom_version_major', options_for_select(0..99, @file.last_revision.major_version + 2), :onchange => '$("#version_3").prop("checked", true)' %>.
<%= select_tag 'custom_version_major', options_for_select(0..99, @file.last_revision.major_version + 2) %>.<%= select_tag 'custom_version_minor', options_for_select(0..99, @file.last_revision.minor_version + 1) %> <%= select_tag 'custom_version_minor', options_for_select(0..99, @file.last_revision.minor_version + 1), :onchange => '$("#version_3").prop("checked", true)' %>
<%= l(:option_version_custom) %> <%= l(:option_version_custom) %>
</div> </p>
</div> </div>
<div class="splitcontentright clear"> <div class="splitcontentright">
<p> <p>
<%= label_tag('file_upload', "#{l(:label_new_content)}:") %> <%= label_tag('file_upload', l(:label_new_content)) %>
</p> <span class="add_attachment">
<span class="add_attachment"> <%= file_field_tag 'file_upload',
<%= file_field_tag 'file_upload', :id => 'file_upload',
:id => 'file_upload', :class => 'file_selector',
:class => 'file_selector', :multiple => false,
:multiple => false, :onchange => "$('#dmsf_file_revision_name').val(this.files[0].name)",
:onchange => "$('#dmsf_file_revision_name').val(this.files[0].name)", :data => {
:data => { :max_file_size => Setting.attachment_max_size.to_i.kilobytes,
:max_file_size => Setting.attachment_max_size.to_i.kilobytes, :max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)),
:max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)), :max_concurrent_uploads => 1,
:max_concurrent_uploads => 1, :upload_path => uploads_path(:format => 'js')
:upload_path => uploads_path(:format => 'js') }
} %>
%> (<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>) </span>
</span> </p>
</div> </div>
<br style="clear: both"/> </div>
<div class="custom_fields"> <div class="custom_fields">
<% @revision.custom_field_values.each do |value| %> <% @revision.custom_field_values.each do |value| %>
<p><%= custom_field_tag_with_label(:dmsf_file_revision, value) %></p> <p><%= custom_field_tag_with_label(:dmsf_file_revision, value) %></p>
<% end %> <% end %>
</div> </div>
<div class="comment"> <p>
<p> <%= f.text_area(:comment, :rows => 2, :label => l(:label_comment)) %>
<%= label_tag('dmsf_file_revision_comment', "#{l(:label_comment)}:") %> </p>
</p> <%= f.submit l(:submit_create) %>
<div class="data">
<%= f.text_area(:comment, :rows=> 2, :style => 'width: 99%;') %>
</div>
</div>
<br/>
<%= submit_tag(l(:submit_create)) %>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>

View File

@ -1,9 +1,11 @@
<%#= <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2013 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -19,23 +21,23 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<br/>
<table class="display access-table list"> <table class="display list dmsf_list">
<thead> <thead>
<tr> <tr>
<th><%= l(:field_user) %></th> <th class="dmsf_th"><%= l(:field_user) %></th>
<th><%= l(:heading_access_downloads_emails) %></th> <th class="dmsf_th"><%= l(:heading_access_downloads_emails) %></th>
<th><%= l(:heading_access_first) %></th> <th class="dmsf_th"><%= l(:heading_access_first) %></th>
<th><%= l(:heading_access_last) %></th> <th class="dmsf_th"><%= l(:heading_access_last) %></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% revision.access_grouped.each do |access| %> <% revision.access_grouped.each do |access| %>
<tr> <tr>
<td><%= link_to_user(access.user) %></td> <td class="dmsf_author"><%= link_to_user(access.user) %></td>
<td><%= access['count'] %></td> <td class="dmsf_version"><%= access.count %></td>
<td><%= format_time(DmsfHelper::to_time(access.first_at)) %></td> <td class="dmsf_modified"><%= format_time(access.first_at) %></td>
<td><%= format_time(DmsfHelper::to_time(access.last_at)) %></td> <td class="dmsf_modified"><%= format_time(access.last_at) %></td>
</tr> </tr>
<% end %> <% end %>
</tbody> </tbody>

View File

@ -1,4 +1,4 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
@ -26,52 +26,61 @@
<div class="contextual"> <div class="contextual">
<% if User.current.allowed_to?(:file_manipulation, @project) %> <% if User.current.allowed_to?(:file_manipulation, @project) %>
<% unless @file.locked? %> <% unless @file.locked_for_user? %>
<%= link_to(l(:button_lock), <% unless @file.locked? %>
lock_dmsf_files_path(:id => @file), <%= link_to(l(:button_lock), lock_dmsf_files_path(:id => @file),
:title => l(:title_lock_file), :title => l(:title_lock_file), :class => 'icon dmsf_icon-lock') %>
:class => 'icon icon-dmsf-lock') %> <% else %>
<%= link_to_if(@file.unlockable?, l(:button_unlock), unlock_dmsf_files_path(:id => @file),
:title => l(:title_unlock_file), :class => 'icon dmsf_icon-unlock') %>
<% end %>
<% if @file.notification %> <% if @file.notification %>
<%= link_to(l(:label_notifications_off), <%= link_to(l(:label_notifications_off),
notify_deactivate_dmsf_files_path(:id => @file), notify_deactivate_dmsf_files_path(:id => @file),
:title => l(:title_notifications_active_deactivate), :title => l(:title_notifications_active_deactivate),
:class => 'icon icon-notification-on') %> :class => 'icon dmsf_icon-notification-on') %>
<% else %> <% else %>
<%= link_to(l(:label_notifications_on), <%= link_to(l(:label_notifications_on),
notify_activate_dmsf_files_path(:id => @file), notify_activate_dmsf_files_path(:id => @file),
:title => l(:title_notifications_not_active_activate), :title => l(:title_notifications_not_active_activate),
:class => 'icon icon-notification-off') %> :class => 'icon dmsf_icon-notification-off') %>
<% end %> <% end %>
<%= link_to(l(:label_link_to), <%= link_to(l(:label_link_to),
new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @file.folder ? @file.folder.id : nil, :dmsf_file_id => @file.id, :type => 'link_to'), new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @file.dmsf_folder ? @file.dmsf_folder.id : nil, :dmsf_file_id => @file.id, :type => 'link_to'),
:title => l(:title_create_link), :title => l(:title_create_link),
:class => 'icon icon-link') %> :class => 'icon dmsf_icon-link') %>
<%= link_to("#{l(:button_copy)}/#{l(:button_move)}", copy_file_path(:id => @file), <%= link_to("#{l(:button_copy)}/#{l(:button_move)}", copy_file_path(:id => @file),
:title => l(:title_copy), :class => 'icon icon-copy') %> :title => l(:title_copy), :class => 'icon icon-copy') %>
<%= delete_link @file if @file_delete_allowed %> <%= delete_link @file if @file_delete_allowed %>
<% else %> <% else %>
<% if (!@file.locked_for_user? || User.current.allowed_to?(:force_file_unlock, @project)) && @file.unlockable? %> <% if User.current.allowed_to?(:force_file_unlock, @project) %>
<%= link_to(l(:button_unlock), <%= link_to_if(@file.unlockable?, l(:button_unlock), unlock_dmsf_files_path(:id => @file),
unlock_dmsf_files_path(:id => @file), :title => l(:title_unlock_file), :class => 'icon dmsf_icon-unlock')%>
:title => l(:title_unlock_file),
:class => 'icon icon-dmsf-unlock')%>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
<%= render(:partial => '/dmsf/path', :locals => {:folder => @file.folder, :filename => @file.title}) %> <%= render(:partial => '/dmsf/path',
:locals => {:folder => @file.dmsf_folder, :filename => @file.title, :title => nil}) %>
<%= error_messages_for('file') %> <% if User.current.allowed_to?(:file_manipulation, @file.project) && !@file.locked_for_user? %>
<%= error_messages_for('revision') %> <%= error_messages_for('file') %>
<%= render(:partial => 'file_new_revision') if User.current.allowed_to?(:file_manipulation, @file.project) %> <%= error_messages_for('revision') %>
<%= render(:partial => 'file_new_revision') %>
<% end %>
<div class="dmsf_id_box tabular">
<%= label_tag('', l(:label_document)) %>
<%= "##{@file.id}" %>
</div>
<h3><%= l(:heading_revisions) %></h3> <h3><%= l(:heading_revisions) %></h3>
<% @file.revisions.visible[@revision_pages.offset,@revision_pages.per_page].each do |revision| %> <% @file.dmsf_file_revisions.visible[@revision_pages.offset, @revision_pages.per_page].each do |revision| %>
<div class="revision_box dmsf_detail dataTables_wrapper"> <div class="dmsf_revision_box tabular dataTables_wrapper">
<div class="fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix"> <div class="fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix">
<div class="dataTables_lenght"> <div class="dataTables_lenght">
<div class="controls" style="float: right"> <div class="dmsf_controls" style="float: right">
<%= link_to_function image_tag('rev_downloads.png', :plugin => 'redmine_dmsf'), <%= link_to_function image_tag('rev_downloads.png', :plugin => 'redmine_dmsf'),
"$('#revision_access-#{revision.id}').toggle()", "$('#revision_access-#{revision.id}').toggle()",
:title => l(:title_download_entries) %> :title => l(:title_download_entries) %>
@ -81,7 +90,7 @@
<%= link_to image_tag('rev_delete.png', :plugin => 'redmine_dmsf'), <%= link_to image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
delete_revision_path(revision), delete_revision_path(revision),
:data => {:confirm => l(:text_are_you_sure)}, :data => {:confirm => l(:text_are_you_sure)},
:title => l(:title_delete_revision) if @file_delete_allowed && (@file.revisions.visible.count > 1) %> :title => l(:title_delete_revision) if @file_delete_allowed && (@file.dmsf_file_revisions.visible.count > 1) %>
</div> </div>
<i><%= l(:info_revision, :rev => revision.id) %></i> <i><%= l(:info_revision, :rev => revision.id) %></i>
<%= (revision.source_revision.nil? ? l(:label_created) : l(:label_changed)).downcase %> <%= (revision.source_revision.nil? ? l(:label_created) : l(:label_changed)).downcase %>
@ -89,59 +98,68 @@
<%= link_to(revision.user.name, user_path(revision.user)) if revision.user %> <%= link_to(revision.user.name, user_path(revision.user)) if revision.user %>
</div> </div>
</div> </div>
<div style="border: 1px solid #e4e4e4;"> <div class="attributes dmsf_revision_inner_box">
<div class="clear"> <div class="splitcontent">
<div class="splitcontentleft"> <div class="splitcontentleft">
<%= label_tag('', "#{l(:label_title)}:") %> <p>
<%= h(revision.title) %> <%= label_tag('', l(:label_title)) %>
<%= h(revision.title) %>
</p>
<% if revision.description.present? %>
<p>
<%= label_tag('', l(:label_description)) %>
<div class="wiki">
<%= textilizable(revision.description) %>
</div>
</p>
<% end %>
<p>
<%= label_tag('', l(:label_dmsf_version)) %>
<%= revision.major_version %>.<%= revision.minor_version %>
</p>
<p>
<%= label_tag('', l(:label_size)) %>
<%= number_to_human_size(revision.size) %>
</p>
<% wf = DmsfWorkflow.find_by_id(revision.dmsf_workflow_id) %>
<% if wf %>
<p>
<%= label_tag('', l(:link_workflow)) %>
<%= "#{wf.name} - " %>
<%= link_to(revision.workflow_str(false),
log_dmsf_workflow_path(:project_id => @project.id,
:id => wf.id, :dmsf_file_revision_id => revision.id),
:title => DmsfWorkflow.assignments_to_users_str(wf.next_assignments(revision.id)),
:remote => true) %>
</p>
<% end %>
<% if revision.comment.present? %>
<p>
<%= label_tag('', l(:label_comment)) %>
<div class="wiki">
<%= textilizable(revision.comment) %>
</div>
</p>
<% end %>
</div> </div>
<div class="splitcontentright"> <div class="splitcontentright">
<%= label_tag('', "#{l(:label_file)}:") %> <p>
<%= ("#{h(revision.file.folder.dmsf_path_str)}/") if revision.file.folder %><%= h(revision.name) %> <%= label_tag('', l(:label_file)) %>
<%= ("#{h(revision.dmsf_file.dmsf_folder.dmsf_path_str)}/") if revision.dmsf_file.dmsf_folder %><%= h(revision.name) %>
</p>
<p>
<%= label_tag('', l(:label_mime)) %>
<%= h(revision.mime_type) %>
</p>
<% if revision.digest.present? %>
<p>
<%= label_tag('', 'MD5') %>
<%= revision.digest %>
</p>
<% end %>
<%= render 'dmsf/custom_fields', :object => revision %>
</div> </div>
</div> </div>
<p class="no-ident">
<%= label_tag('', "#{l(:label_description)}:") %>
</p>
<div class="wiki clear" style="margin-left: 110px">
<%= textilizable(revision.description) %>
</div>
<div class="splitcontentleft">
<%= label_tag('', "#{l(:label_version)}:") %>
<%= revision.major_version %>.<%= revision.minor_version %>
<br/>
<%= label_tag('', "#{l(:link_workflow)}:") %>
<% wf = DmsfWorkflow.find_by_id(revision.dmsf_workflow_id) %>
<% if wf %>
<%= "#{wf.name} - " %>
<%= link_to(
revision.workflow_str(false),
log_dmsf_workflow_path(
:project_id => @project.id,
:id => wf.id,
:dmsf_file_revision_id => revision.id),
:title => DmsfWorkflow.assignments_to_users_str(wf.next_assignments(revision.id)),
:remote => true) %>
<% else %>
<%= revision.workflow_str(true) %>
<% end %>
</div>
<div class="splitcontentright clear">
<%= label_tag('', "#{l(:label_mime)}:") %>
<%= h(revision.mime_type) %>&nbsp;
<br/>
<%= label_tag('', "#{l(:label_size)}:") %>
<%= number_to_human_size(revision.size) %>
</div>
<div class="no-ident clear">
<%= render 'dmsf/custom_fields', :object => revision %>
</div>
<p class="no-ident">
<%= label_tag('', "#{l(:label_comment)}:") %>
</p>
<div class="wiki clear" style="margin-left: 110px">
<%= textilizable(revision.comment) %>
</div>
<div id="<%= "revision_access-#{revision.id}" %>" style="display:none"> <div id="<%= "revision_access-#{revision.id}" %>" style="display:none">
<%= render(:partial => 'revision_access', :locals => {:revision => revision}) if User.current.allowed_to?(:file_manipulation, @file.project) %> <%= render(:partial => 'revision_access', :locals => {:revision => revision}) if User.current.allowed_to?(:file_manipulation, @file.project) %>
</div> </div>
@ -150,7 +168,7 @@
<br/> <br/>
<% end %> <% end %>
<span class="pagination"><%= pagination_links_full @revision_pages, @file.revisions.visible.count %></span> <span class="pagination"><%= pagination_links_full @revision_pages, @file.dmsf_file_revisions.visible.count %></span>
<% <%
url = 'jquery.dataTables/en.json' url = 'jquery.dataTables/en.json'
@ -188,7 +206,7 @@
} }
}); });
$('.access-table').dataTable({ $('.dmsf_list').dataTable({
'bJQueryUI': true, 'bJQueryUI': true,
'oLanguage': { 'oLanguage': {
'sUrl': '/plugin_assets/<%= :redmine_dmsf %>/javascripts/<%= url %>' 'sUrl': '/plugin_assets/<%= :redmine_dmsf %>/javascripts/<%= url %>'

View File

@ -1,7 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Redmine plugin for Document Management System "Features"
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -15,53 +19,50 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<!--Select2 Files-->
<%= stylesheet_link_tag 'select2.min.css', :plugin => 'redmine_dmsf' %>
<%= javascript_include_tag 'select2.min.js', :plugin => 'redmine_dmsf' %>
<% html_title(l(:dmsf)) %> <% html_title(l(:dmsf)) %>
<div class="contextual"> <%= render(:partial => '/dmsf/path',
</div> :locals => {:folder => @file.dmsf_folder, :filename => @file.title,
:title => "#{l(:button_copy)}/#{l(:button_move)}"}) %>
<%= render(:partial => '/dmsf/path', :locals => {:folder => @file.folder, :filename => @file.title}) %>
<% if DmsfFile.allowed_target_projects_on_copy.present? %> <% if DmsfFile.allowed_target_projects_on_copy.present? %>
<%= form_tag({:action => 'create', :id => @file}, :id => 'copyForm') do |f| %> <%= form_tag({:action => 'create', :id => @file}, :id => 'copyForm') do |f| %>
<div class="box dmsf_detail"> <div class="box tabular">
<p> <p>
<label for="target_project_id"><%=l(:field_target_project)%>:</label> <%= label_tag('target_project_id', l(:field_target_project)) %>
<%= select_tag('target_project_id', <%= select_tag('target_project_id',
project_tree_options_for_select(DmsfFile.allowed_target_projects_on_copy, :selected => @target_project)) %> project_tree_options_for_select(DmsfFile.allowed_target_projects_on_copy,
:selected => @target_project)) %>
</p> </p>
<p> <p>
<%= label_tag('target_folder_id', "#{l(:field_target_folder)}:") %> <%= label_tag('target_folder_id', l(:field_target_folder)) %>
<%= select_tag('target_folder_id', <%= select_tag('target_folder_id',
options_for_select(DmsfFolder.directory_tree(@target_project), options_for_select(DmsfFolder.directory_tree(@target_project),
:selected => (@target_folder.id if @target_folder))) %> :selected => (@target_folder.id if @target_folder))) %>
</p> </p>
</div> </div>
<%= submit_tag(l(:button_copy)) %> <p>
<% if User.current.allowed_to?(:file_manipulation, @project) %> <%= submit_tag(l(:button_copy)) %>
<button type="button" id="move_button" title="<%= l(:button_move) %>"><%= l(:button_move) %></button> <% if User.current.allowed_to?(:file_manipulation, @project) %>
<% end %> <%= submit_tag(l(:button_move), :id => 'move_button') %>
<% end %>
</p>
<% end %> <% end %>
<% end %> <% end %>
<script type="text/javascript"> <script type="text/javascript">
jQuery('#move_button').click(function(event) { $('#move_button').click(function(event) {
jQuery('#copyForm').attr('action', "<%= url_for(:action => 'move', :id => @file) %>"); $('#copyForm').attr('action', "<%= url_for(:action => 'move', :id => @file) %>");
jQuery('#copyForm').submit(); $('#copyForm').submit();
}); });
jQuery('#target_project_id').change(function () { $('#target_project_id').change(function () {
jQuery('#content').load("<%= url_for(:action => 'new') %>", jQuery('#copyForm').serialize()); $('#content').load("<%= url_for(:action => 'new') %>", $('#copyForm').serialize());
jQuery('#target_folder_id' ).select2({ width: "600px" });
}); });
jQuery('#target_project_id' ).select2({ width: "600px" }); $('#target_project_id').select2();
jQuery('#target_folder_id' ).select2({ width: "600px" }); $('#target_folder_id').select2();
</script> </script>

View File

@ -1,7 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Redmine plugin for Document Management System "Features"
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -15,29 +19,24 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<!--Select2 Files-->
<%= stylesheet_link_tag 'select2.min.css', :plugin => 'redmine_dmsf' %>
<%= javascript_include_tag 'select2.min.js', :plugin => 'redmine_dmsf' %>
<% html_title(l(:dmsf)) %> <% html_title(l(:dmsf)) %>
<div class="contextual"></div> <%= render(:partial => '/dmsf/path',
:locals => {:folder => @folder, :filename => nil, :title => l(:button_copy)}) %>
<%= render(:partial => '/dmsf/path', :locals => {:folder => @folder, :filename => nil}) %>
<% unless DmsfFolder.allowed_target_projects_on_copy.blank? %> <% unless DmsfFolder.allowed_target_projects_on_copy.blank? %>
<%= form_tag({:action => 'copy_to', :id => @folder}, :id => 'copyForm') do |f| %> <%= form_tag({:action => 'copy_to', :id => @folder}, :id => 'copyForm') do |f| %>
<div class="box dmsf_detail"> <div class="box tabular">
<p> <p>
<label for="target_project_id"><%= l(:field_target_project) %>:</label> <label for="target_project_id"><%= l(:field_target_project) %>:</label>
<%= select_tag('target_project_id', <%= select_tag('target_project_id',
project_tree_options_for_select(DmsfFolder.allowed_target_projects_on_copy, :selected => @target_project)) %> project_tree_options_for_select(DmsfFolder.allowed_target_projects_on_copy, :selected => @target_project)) %>
</p> </p>
<p> <p>
<%= label_tag('target_folder_id', "#{l(:field_target_folder)}:") %> <%= label_tag('target_folder_id', l(:field_target_folder)) %>
<%= select_tag('target_folder_id', <%= select_tag('target_folder_id',
options_for_select(DmsfFolder.directory_tree(@target_project, @folder), options_for_select(DmsfFolder.directory_tree(@target_project, @folder),
:selected => (@target_folder.id if @target_folder))) %> :selected => (@target_folder.id if @target_folder))) %>
@ -48,11 +47,10 @@
<% end %> <% end %>
<script type="text/javascript"> <script type="text/javascript">
jQuery('#target_project_id').change(function () { $('#target_project_id').change(function () {
jQuery('#content').load("<%= url_for(:action => 'new') %>", jQuery('#copyForm').serialize()); $('#content').load("<%= url_for(:action => 'new') %>", $('#copyForm').serialize());
jQuery('#target_folder_id' ).select2({ width: "600px" });
}); });
jQuery('#target_project_id' ).select2({ width: "600px" }); $('#target_project_id').select2();
jQuery('#target_folder_id' ).select2({ width: "600px" }); $('#target_folder_id').select2();
</script> </script>

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@lbcfree.net> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -14,19 +17,19 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% html_title l(:dmsf) %> <% html_title l(:dmsf) %>
<div class="contextual">
</div>
<% if @dmsf_file_id %> <% if @dmsf_file_id %>
<% file = DmsfFile.find_by_id @dmsf_file_id%> <% file = DmsfFile.find_by_id @dmsf_file_id%>
<% title = file.title if file %> <% title = file.title if file %>
<% end %> <% end %>
<%= render(:partial => '/dmsf/path', :locals => {:folder => @dmsf_link.folder, :filename => title}) %> <%= render(:partial => '/dmsf/path',
:locals => {:folder => @dmsf_link.folder, :filename => nil,
:title => (@type == 'link_from') ? l(:label_link_from) : l(:label_link_to) }) %>
<%= labelled_form_for @dmsf_link do |f| %> <%= labelled_form_for @dmsf_link do |f| %>
<%= error_messages_for @dmsf_link %> <%= error_messages_for @dmsf_link %>
@ -34,7 +37,7 @@
<%= f.hidden_field :dmsf_folder_id, :value => @dmsf_link.dmsf_folder_id if @dmsf_link.dmsf_folder_id %> <%= f.hidden_field :dmsf_folder_id, :value => @dmsf_link.dmsf_folder_id if @dmsf_link.dmsf_folder_id %>
<%= f.hidden_field :type, :value => @type %> <%= f.hidden_field :type, :value => @type %>
<%= f.hidden_field :dmsf_file_id, :value => @dmsf_file_id %> <%= f.hidden_field :dmsf_file_id, :value => @dmsf_file_id %>
<div class="box dmsf_detail"> <div class="box tabular">
<% if @type == 'link_from' %> <% if @type == 'link_from' %>
<p> <p>
<%= radio_button_tag(:external_link, 'false', @link_external == false) %> <%= l(:label_internal) %><br/> <%= radio_button_tag(:external_link, 'false', @link_external == false) %> <%= l(:label_internal) %><br/>
@ -44,9 +47,9 @@
<div id="link_internal" style="<%= @link_external ? 'display:none' : '' %>"> <div id="link_internal" style="<%= @link_external ? 'display:none' : '' %>">
<p> <p>
<% if @type == 'link_from' %> <% if @type == 'link_from' %>
<%= label_tag('dmsf_link[target_project_id]', l(:label_source_project), :class => 'required') %> <label for="dmsf_link[target_project_id]"><%= l(:label_source_project) %><span class="required">*</span></label>
<% else %> <% else %>
<%= label_tag('dmsf_link[target_project_id]', l(:label_target_project), :class => 'required') %> <label for="dmsf_link[target_project_id]"><%= l(:label_target_project) %><span class="required">*</span></label>
<% end %> <% end %>
<%= select_tag('dmsf_link[target_project_id]', <%= select_tag('dmsf_link[target_project_id]',
project_tree_options_for_select(DmsfFile.allowed_target_projects_on_copy, project_tree_options_for_select(DmsfFile.allowed_target_projects_on_copy,
@ -62,43 +65,51 @@
folder_tree_options_for_select(DmsfFolder.directory_tree(@dmsf_link.target_project), folder_tree_options_for_select(DmsfFolder.directory_tree(@dmsf_link.target_project),
:selected => @target_folder_id)) %> :selected => @target_folder_id)) %>
</p> </p>
<% if @type == 'link_from' %> <% if @type == 'link_from' %>
<p>
<% if @target_folder_id %>
<% folder = DmsfFolder.find_by_id @target_folder_id %>
<% files = folder.files.visible if folder %>
<% else %>
<% files = @dmsf_link.target_project.dmsf_files.visible if @dmsf_link.target_project %>
<% end %>
<%= f.select(:target_file_id,
options_for_select(DmsfFolder.file_list(files), @target_file_id)) %>
</p>
<% end %>
<p> <p>
</div> <% if @target_folder_id %>
<div id="link_external" style="<%= @link_external ? '' : 'display:none' %>"> <% folder = DmsfFolder.find_by_id @target_folder_id %>
<%= label_tag('dmsf_link[external_url]', l(:label_link_external_url), :class => 'required') %> <% files = folder.dmsf_files.visible if folder %>
<%= text_field_tag 'dmsf_link[external_url]', @dmsf_link.external_url, :size => 40, :maxlength => 255 %> <% else %>
</div> <% files = @dmsf_link.target_project.dmsf_files.visible if @dmsf_link.target_project %>
<%= label_tag('dmsf_link[name]', l(:label_link_name), :class => 'required') %> <% end %>
<%= text_field_tag 'dmsf_link[name]', @dmsf_link.name, :size => 40, :maxlength => 255 %> <%= f.select(:target_file_id,
<!--</p>--> options_for_select(DmsfFolder.file_list(files), @target_file_id)) %>
</p>
<% end %>
</div>
<div id="link_external" style="<%= @link_external ? '' : 'display:none' %>">
<p>
<%= f.text_field :external_url, :required => true,
:label => l(:label_link_external_url) %>
</p>
</div>
<p>
<%= f.text_field :name, :required => true, :label => l(:label_link_name) %>
</p>
</div> </div>
<%= f.submit l(:button_create) %> <p><%= f.submit l(:button_create) %></p>
<% end %> <% end %>
<script type="text/javascript"> <script type="text/javascript">
$('#dmsf_link_target_project_id').change(function () { $('#dmsf_link_target_project_id').change(function () {
$('#content').load("<%= url_for(:action => 'new', :project_id => @project.id, :reload => true) %>", $('#new_dmsf_link').serialize()); $('#content').load("<%= url_for(:action => 'new', :project_id => @project.id, :reload => true) %>", $('#new_dmsf_link').serialize());
}); });
$('#dmsf_link_target_folder_id').change(function () { $('#dmsf_link_target_folder_id').change(function () {
$('#content').load("<%= url_for(:action => 'new', :project_id => @project.id) %>", $('#new_dmsf_link').serialize()); $('#content').load("<%= url_for(:action => 'new', :project_id => @project.id) %>", $('#new_dmsf_link').serialize());
}); });
$('#dmsf_link_target_file_id').change(function () { $('#dmsf_link_target_file_id').change(function () {
$('#content').load("<%= url_for(:action => 'new', :project_id => @project.id) %>", $('#new_dmsf_link').serialize()); $('#content').load("<%= url_for(:action => 'new', :project_id => @project.id) %>", $('#new_dmsf_link').serialize());
}); });
$("input[name=external_link]:radio").change(function(){ $("input[name=external_link]:radio").change(function(){
$("#link_internal").toggle(); $("#link_internal").toggle();
$("#link_external").toggle(); $("#link_external").toggle();
}); });
$('#dmsf_link_target_project_id').select2();
$('#dmsf_link_target_folder_id').select2();
$('#dmsf_link_target_file_id').select2();
</script> </script>

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2014 Karel Pičman <karel.picman@lbcfree.net> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -14,6 +17,7 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<%= render 'form' %> <%= render 'form' %>

View File

@ -24,7 +24,7 @@
<p> <p>
<%= h(file.dmsf_path_str) %> (<%= file.name %>) <%= h(file.dmsf_path_str) %> (<%= file.name %>)
<% if file.last_revision %> <% if file.last_revision %>
, <%= number_to_human_size(file.last_revision.size) %>, <%= l(:label_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %> , <%= number_to_human_size(file.last_revision.size) %>, <%= l(:label_dmsf_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>
<% end %> <% end %>
</p> </p>
<% end %> <% end %>

View File

@ -22,6 +22,6 @@
<% @files.each do |file| %> <% @files.each do |file| %>
<%= h(file.dmsf_path_str) %> (<%= file.name %>) <%= h(file.dmsf_path_str) %> (<%= file.name %>)
<% if file.last_revision %> <% if file.last_revision %>
, <%= number_to_human_size(file.last_revision.size) %>, <%= l(:label_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %> , <%= number_to_human_size(file.last_revision.size) %>, <%= l(:label_dmsf_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>
<% end %> <% end %>
<% end %> <% end %>

View File

@ -26,7 +26,7 @@
dmsf_file_url(file, :download => '')) %> dmsf_file_url(file, :download => '')) %>
(<%= file.name %>), (<%= file.name %>),
<%= number_to_human_size(file.last_revision.size) %>, <%= number_to_human_size(file.last_revision.size) %>,
<%= l(:label_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>, <%= l(:label_dmsf_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>,
<%= "#{file.last_revision.workflow_str(true)}," if file.last_revision.workflow_str(true) != l(:title_none) %> <%= "#{file.last_revision.workflow_str(true)}," if file.last_revision.workflow_str(true) != l(:title_none) %>
<%= link_to(l(:link_details, :title => h(file.title)), <%= link_to(l(:link_details, :title => h(file.title)),
dmsf_file_url(file)) %> dmsf_file_url(file)) %>

View File

@ -23,7 +23,7 @@
<% @files.each do |file| %> <% @files.each do |file| %>
<%= h(file.dmsf_path_str) %> (<%= file.name %>), <%= h(file.dmsf_path_str) %> (<%= file.name %>),
<%= number_to_human_size(file.last_revision.size) %>, <%= number_to_human_size(file.last_revision.size) %>,
<%= l(:label_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>, <%= l(:label_dmsf_version) %> <%= file.last_revision.major_version %>.<%= file.last_revision.minor_version %>,
<%= "#{file.last_revision.workflow_str(true)}," if file.last_revision.workflow_str(true) != l(:title_none) %> <%= "#{file.last_revision.workflow_str(true)}," if file.last_revision.workflow_str(true) != l(:title_none) %>
<%= dmsf_file_url(file) %> <%= dmsf_file_url(file) %>
<% if file.last_revision.comment.present? %> <% if file.last_revision.comment.present? %>

View File

@ -1,8 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -21,21 +24,27 @@
<%= textilizable(@body) %> <%= textilizable(@body) %>
<% if @links_only == '1' %> <% if @links_only == '1' %>
<% folders = [] %>
<% files = [] %>
<% if @folders.present? %> <% if @folders.present? %>
<% JSON.parse(@folders).each do |id| %> <% JSON.parse(@folders).each do |id| %>
<% folder = DmsfFolder.find_by_id id %> <% folder = DmsfFolder.find_by_id id %>
<% if folder %> <% if folder %>
<% folder.folder_tree.each do |name, i| %> <% folder.folder_tree.each do |name, i| %>
<% dir = DmsfFolder.find_by_id i %> <% dir = DmsfFolder.find_by_id i %>
<% if dir %> <% if dir && !folders.include?(dir) %>
<br/> <br/>
<%= link_to(h(dir.dmsf_path_str), dmsf_folder_path(:id => dir.project_id, :folder_id => dir.id, :only_path => false)) %> <%= link_to(h(dir.dmsf_path_str), dmsf_folder_path(:id => dir.project_id, :folder_id => dir.id, :only_path => false)) %>
<br/><br/> <br/><br/>
<% dir.files.each do |file| %> <% dir.dmsf_files.each do |file| %>
<%= link_to(h(file.title), dmsf_file_url(file)) %> <% unless files.include?(file) %>
&nbsp;(<%= link_to(h(file.name), dmsf_file_url(file, :download => '')) %>) <%= link_to(h(file.title), dmsf_file_url(file)) %>
<br/> &nbsp;(<%= link_to(h(file.name), dmsf_file_url(file, :download => '')) %>)
<br/>
<% files << file %>
<% end %>
<% end %> <% end %>
<% folders << dir %>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
@ -45,11 +54,13 @@
<br/> <br/>
<% JSON.parse(@files).each do |id| %> <% JSON.parse(@files).each do |id| %>
<% file = DmsfFile.find_by_id id %> <% file = DmsfFile.find_by_id id %>
<% if file %> <% if file && !files.include?(file) %>
<%= link_to(h(file.title), dmsf_file_url(file)) %> <%= link_to(h(file.title), dmsf_file_url(file)) %>
&nbsp;(<%= link_to(h(file.name), dmsf_file_url(file, :download => '')) %>) &nbsp;(<%= link_to(h(file.name), dmsf_file_url(file, :download => '')) %>)
<br/> <br/>
<% files << file %>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>

View File

@ -1,8 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -21,16 +24,21 @@
<%= @body %> <%= @body %>
<% if @links_only == '1' %> <% if @links_only == '1' %>
<% folders = [] %>
<% files = [] %>
<% if @folders.present? %> <% if @folders.present? %>
<% JSON.parse(@folders).each do |id| %> <% JSON.parse(@folders).each do |id| %>
<% folder = DmsfFolder.find_by_id id %> <% folder = DmsfFolder.find_by_id id %>
<% if folder %> <% if folder && !folders.include?(folder) %>
<% folder.folder_tree.each do |name, i| %> <% folder.folder_tree.each do |name, i| %>
<% dir = DmsfFolder.find_by_id i %> <% dir = DmsfFolder.find_by_id i %>
<% if dir %> <% if dir %>
<%= dir.dmsf_path_str %> <%= dir.dmsf_path_str %>
<% dir.files.each do |file| %> <% dir.dmsf_files.each do |file| %>
<%= dmsf_file_url(file, :download => '') %> <% unless files.include?(file) %>
<%= dmsf_file_url(file, :download => '') %>
<% files << file %>
<% end %>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
@ -40,8 +48,9 @@
<% if @files.present? %> <% if @files.present? %>
<% JSON.parse(@files).each do |id| %> <% JSON.parse(@files).each do |id| %>
<% file = DmsfFile.find_by_id id %> <% file = DmsfFile.find_by_id id %>
<% if file %> <% if file && !files.include?(file) %>
<%= dmsf_file_url(file, :download => '') %> <%= dmsf_file_url(file, :download => '') %>
<% files << file %>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>

View File

@ -22,11 +22,11 @@
</p> </p>
<p> <p>
<%= @text2 %> <%= @text2 %>
<% unless @revision.file.folder %> <% unless @revision.dmsf_file.dmsf_folder %>
<%= link_to l(:link_documents), <%= link_to l(:link_documents),
dmsf_folder_url(:id => @revision.file.project) %> dmsf_folder_url(:id => @revision.dmsf_file.project) %>
<% else %> <% else %>
<%= link_to @revision.file.folder.title, <%= link_to @revision.dmsf_file.dmsf_folder.title,
dmsf_folder_url(:id => @revision.file.project, :folder_id => @revision.file.folder) %> dmsf_folder_url(:id => @revision.dmsf_file.project, :folder_id => @revision.dmsf_file.dmsf_folder) %>
<% end %>. <% end %>.
</p> </p>

View File

@ -18,8 +18,8 @@
<%= @user.name %>, <%= @user.name %>,
<%= @text1 %> <%= @text1 %>
<% unless @revision.file.folder %> <% unless @revision.dmsf_file.dmsf_folder %>
<%= @text2 %> <%= dmsf_folder_url(:id => @revision.file.project) %>. <%= @text2 %> <%= dmsf_folder_url(:id => @revision.dmsf_file.project) %>.
<% else %> <% else %>
<%= @text2 %> <%= dmsf_folder_url(:id => @revision.file.project, :folder_id => @revision.file.folder) %>. <%= @text2 %> <%= dmsf_folder_url(:id => @revision.dmsf_file.project, :folder_id => @revision.dmsf_file.dmsf_folder) %>.
<% end %> <% end %>

View File

@ -1,10 +1,11 @@
<% <%
# encoding: utf-8 # encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -23,46 +24,36 @@
<div class="box"> <div class="box">
<%= form_tag({:controller => 'dmsf_upload', :action => 'upload_files', :id => @project, :folder_id => @folder}, <%= form_tag({:controller => 'dmsf_upload', :action => 'upload_files', :id => @project, :folder_id => @folder},
:id => 'uploadform', :method=>:post, :multipart => true) do %> :id => 'uploadform', :method => :post, :multipart => true) do %>
<% if Setting.attachment_max_size.to_i >= 102400 %> <div class="dmsf_upload_select">
<div class="upload_select"> <select id="uploader_select">
<%= l(:label_file_size) %>: <option value="1">
<select id="uploader_select"> <%= l(:label_drag_drop) %>
<option value="1"> </option>
&lt; <%= "#{@ajax_upload_size}" %> MB <option value="2">
</option> <%= l(:label_classic) %>
<option value="2"> </option>
> <%= "#{@ajax_upload_size}" %> MB </select>
</option>
</select>
</div>
<% end %>
<h3><%= l(:heading_file_upload) %></h3>
<div style="padding-bottom: 6px; line-height: 1.4em; font-size: 0.9em;">
<span>
<% max_file_upload = Setting.plugin_redmine_dmsf['dmsf_max_file_upload'].to_i %>
<%= l(:note_uploaded_maximum_files_at_once, :number => max_file_upload) if max_file_upload > 0 %>
<%= l(:note_upload_files_greater_than_two_gb) if Setting.attachment_max_size.to_i >= 2097151 %>
</span>
</div> </div>
<h3><%= l(:label_upload) %></h3>
<div id="uploader"> <div id="uploader">
<p> <p>
<label><%=l(:label_attachment_plural)%></label> <label><%= l(:label_attachment_plural) %></label>
<%= render :partial => 'attachments/form' %> <%= render :partial => 'attachments/form' %>
</p> </p>
<%= submit_tag(l(:submit_upload_files)) %> <%= submit_tag l(:label_upload) %>
</div> </div>
<% end %> <% end %>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var originalUploaderContent; var originalUploaderContent;
var uploader = jQuery('#uploader'); var uploader = $('#uploader');
originalUploaderContent = uploader.html(); originalUploaderContent = uploader.html();
jQuery('#uploader_select').change(function() { $('#uploader_select').change(function() {
if(jQuery(this).val() == 2) { if($(this).val() === '2') {
uploader.html(originalUploaderContent); uploader.html(originalUploaderContent);
} else { } else {
initPlUploader(uploader); initPlUploader(uploader);
@ -83,7 +74,7 @@
<script type="text/javascript"> <script type="text/javascript">
function initPlUploader(uploader) { function initPlUploader(uploader) {
uploader.html('<div></div>'); uploader.html('<div></div>');
uploader = jQuery('div', uploader); uploader = $('div', uploader);
uploader.plupload({ uploader.plupload({
runtimes : 'html5,flash,silverlight,html4', runtimes : 'html5,flash,silverlight,html4',
url : '<%= url_for({:controller => 'dmsf_upload', :action => 'upload_file', :id => @project}) %>', url : '<%= url_for({:controller => 'dmsf_upload', :action => 'upload_file', :id => @project}) %>',
@ -110,28 +101,28 @@
// Silverlight settings // Silverlight settings
silverlight_xap_url : '<%= plugin_asset_path(:redmine_dmsf, 'javascripts', 'plupload/js/Moxie.xap') %>' silverlight_xap_url : '<%= plugin_asset_path(:redmine_dmsf, 'javascripts', 'plupload/js/Moxie.xap') %>'
}); });
jQuery('.plupload_scroll',uploader).resizable({ $('.plupload_scroll',uploader).resizable({
handles: 's' handles: 's'
}); });
var pluploader = uploader.plupload('getUploader'); var pluploader = uploader.plupload('getUploader');
pluploader.bind('FileUploaded', function(pluploader, file, response) { pluploader.bind('FileUploaded', function(pluploader, file, response) {
var responseObject = jQuery.parseJSON(response.response); var responseObject = $.parseJSON(response.response);
if (responseObject == null) { //Bug: on Firefox folders entries act unexpectedly. if (responseObject == null) { //Bug: on Firefox folders entries act unexpectedly.
file.status = plupload.FAILED; file.status = plupload.FAILED;
pluploader.trigger('UploadProgress', file); pluploader.trigger('UploadProgress', file);
pluploader.trigger('QueueChanged'); pluploader.trigger('QueueChanged');
} else { } else {
if (responseObject.error == null) { if (responseObject.error == null) {
var disk_filename_input = jQuery('<input/>').attr('type', 'hidden') var disk_filename_input = $('<input/>').attr('type', 'hidden')
.attr('name', 'uploaded[' + dmsfFileFieldCount + '][disk_filename]') .attr('name', 'uploaded[' + dmsfFileFieldCount + '][disk_filename]')
.val(responseObject.disk_filename); .val(responseObject.disk_filename);
uploader.append(disk_filename_input); uploader.append(disk_filename_input);
var content_type_input = jQuery('<input/>').attr('type', 'hidden') var content_type_input = $('<input/>').attr('type', 'hidden')
.attr('name', 'uploaded[' + dmsfFileFieldCount + '][content_type]') .attr('name', 'uploaded[' + dmsfFileFieldCount + '][content_type]')
.val(responseObject.content_type); .val(responseObject.content_type);
uploader.append(content_type_input); uploader.append(content_type_input);
var original_filename_input = jQuery('<input/>').attr('type', 'hidden') var original_filename_input = $('<input/>').attr('type', 'hidden')
.attr('name', 'uploaded[' + dmsfFileFieldCount + '][original_filename]') .attr('name', 'uploaded[' + dmsfFileFieldCount + '][original_filename]')
.val(responseObject.original_filename); .val(responseObject.original_filename);
uploader.append(original_filename_input); uploader.append(original_filename_input);
@ -142,7 +133,7 @@
} }
} }
if(pluploader.total.uploaded == pluploader.files.length) jQuery('#uploadform').submit(); if(pluploader.total.uploaded == pluploader.files.length) jQuery('#uploadform').submit();
else if((pluploader.total.uploaded + pluploader.total.failed) == pluploader.files.length) setTimeout(function() {jQuery('#uploadform').submit();}, 2000); else if((pluploader.total.uploaded + pluploader.total.failed) == pluploader.files.length) setTimeout(function() {$('#uploadform').submit();}, 2000);
else dmsfFileFieldCount++; else dmsfFileFieldCount++;
return true; return true;
}); });

View File

@ -1,11 +1,11 @@
<%#= <%
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -21,65 +21,62 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
<div class="box dmsf_detail">
<div class="box tabular">
<%= hidden_field_tag("commited_files[#{i}][disk_filename]", upload.disk_filename) %> <%= hidden_field_tag("commited_files[#{i}][disk_filename]", upload.disk_filename) %>
<div class="clear"> <div class="clear">
<div class="splitcontentleft"> <div class="splitcontentleft">
<p> <p>
<%= label_tag("commited_files[#{i}][title]", "#{l(:label_title)}:") %> <%= label_tag("commited_files[#{i}][title]", l(:label_title)) %>
<%= text_field_tag("commited_files[#{i}][title]", upload.title, :size => 32) %> <%= text_field_tag("commited_files[#{i}][title]", upload.title, :size => 32, :required => true) %>
</p> </p>
</div> </div>
<div class="splitcontentright"> <div class="splitcontentright">
<p> <p>
<%= label_tag('', "#{l(:label_filename)}:") %> <%= label_tag('', l(:label_filename)) %>
<%= h(upload.name) %> <%= h(upload.name) %>
<%= hidden_field_tag("commited_files[#{i}][name]", upload.name) %> <%= hidden_field_tag("commited_files[#{i}][name]", upload.name) %>
</p> </p>
</div> </div>
</div> </div>
<p class="no-ident"> <p>
<%= label_tag("commited_files[#{i}][description]", "#{l(:label_description)}:") %> <%= label_tag("commited_files[#{i}][description]", l(:label_description)) %>
<%= text_area_tag("commited_files[#{i}][description]", upload.description, :rows => 6, :class => 'wiki-edit') %>
</p> </p>
<div class="wiki data clear"> <div class="clear">
<%= text_area_tag("commited_files[#{i}][description]", upload.description, :rows=> 6, :class => 'wiki-edit') %> <div class="splitcontentleft">
</div> <p>
<div class="splitcontentleft"> <%= label_tag("commited_files[#{i}][version]_minor", l(:label_dmsf_version)) %>
<p> <%= radio_button_tag("commited_files[#{i}][version]", 1, true) %>
<%= label_tag("commited_files[#{i}][version]_minor", "#{l(:label_version)}:") %> <%= upload.major_version %>.<%= upload.minor_version + 1 %>
</p> <%= l(:option_version_minor) %><br/>
<div class="data clear"> <%= radio_button_tag("commited_files[#{i}][version]", 2) %>
<%= radio_button_tag("commited_files[#{i}][version]", 1, true) %> <%= upload.major_version + 1 %>.0
<%= upload.major_version %>.<%= upload.minor_version + 1 %> <%= l(:option_version_major) %><br/>
<%= l(:option_version_minor) %><br/> <%= radio_button_tag("commited_files[#{i}][version]", 3) %>
<%= radio_button_tag("commited_files[#{i}][version]", 2) %> <%= select_tag "commited_files[#{i}][custom_version_major]", options_for_select(0..99, upload.major_version + 2), :onchange => "$('#commited_files_#{i}_version_3').prop('checked', true)" %>.
<%= upload.major_version + 1 %>.0 <%= select_tag "commited_files[#{i}][custom_version_minor]", options_for_select(0..99, upload.minor_version + 1), :onchange => "$('#commited_files_#{i}_version_3').prop('checked', true)" %>
<%= l(:option_version_major) %><br/>
<%= radio_button_tag("commited_files[#{i}][version]", 3) %>
<%= select_tag "commited_files[#{i}][custom_version_major]", options_for_select(0..99, upload.major_version + 2) %>.<%= select_tag "commited_files[#{i}][custom_version_minor]", options_for_select(0..99, upload.minor_version + 1) %>
<%= l(:option_version_custom) %> <%= l(:option_version_custom) %>
</p>
</div>
<div class="splitcontentright">
<p>
<%= label_tag('', l(:label_mime)) %>
<%= h(upload.mime_type) %>
</p>
<p>
<%= label_tag('', l(:label_size)) %>
<%= number_to_human_size(upload.size) %>
</p>
</div> </div>
</div> </div>
<div class="splitcontentright clear">
<p>
<%= label_tag('', "#{l(:label_mime)}:") %>
<%= h(upload.mime_type) %>
</p>
<p>
<%= label_tag('', "#{l(:label_size)}:") %>
<%= number_to_human_size(upload.size) %>
</p>
</div>
<br style="clear: both"/>
<% upload.custom_values.each do |value| %> <% upload.custom_values.each do |value| %>
<p><%= custom_field_tag_with_label("commited_files[#{i}][dmsf_file_revision]", value) %></p> <p><%= custom_field_tag_with_label("commited_files[#{i}][dmsf_file_revision]", value) %></p>
<% end %> <% end %>
<p> <p>
<%= label_tag("commited_files[#{i}][comment]", "#{l(:label_comment)}:") %> <%= label_tag("commited_files[#{i}][comment]", l(:label_comment)) %>
<%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows => 2) %>
</p> </p>
<div class="data">
<%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows => 2, :style => 'width: 99%;') %>
</div>
</div> </div>
<%= wikitoolbar_for "commited_files_#{i}_description" %> <%= wikitoolbar_for "commited_files_#{i}_description" %>

View File

@ -1,7 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -15,48 +19,57 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<div class="box dmsf_detail"> <div class="box tabular">
<%= hidden_field_tag("commited_files[#{i}][disk_filename]", upload.disk_filename) %> <%= hidden_field_tag("commited_files[#{i}][disk_filename]", upload.disk_filename) %>
<%= hidden_field_tag("commited_files[#{i}][name]", upload.name) %> <%= hidden_field_tag("commited_files[#{i}][name]", upload.name) %>
<p class="warning"><%= l(:info_file_locked) %></p> <p class="warning"><%= l(:info_file_locked) %></p>
<div class="clear"> <div class="clear">
<div class="splitcontentleft"> <div class="splitcontentleft">
<p> <p>
<%= label_tag('', "#{l(:label_title)}:") %> <%= label_tag('', l(:label_title)) %>
<%= h(upload.title) %> <%= h(upload.title) %>
</p> </p>
</div> </div>
<div class="splitcontentright"> <div class="splitcontentright">
<p> <p>
<%= label_tag('', "#{l(:label_filename)}:") %> <%= label_tag('', l(:label_filename)) %>
<%= h(upload.name) %> <%= h(upload.name) %>
</p> </p>
</div> </div>
</div> </div>
<p class="no-ident"> <% if upload.description.present? %>
<%= label_tag('', "#{l(:label_description)}:") %>
</p>
<div class="wiki data clear">
<%= textilizable(upload.description) %>
</div>
<div class="splitcontentleft">
<p> <p>
<%= label_tag('', "#{l(:label_version)}:") %> <%= label_tag('', l(:label_description)) %>
<%= upload.major_version %>.<%= upload.minor_version %> <div class="wiki">
<%= textilizable(upload.description) %>
</div>
</p> </p>
<% end %>
<div class="clear">
<div class="splitcontentleft">
<p>
<%= label_tag('', l(:label_dmsf_version)) %>
<%= upload.major_version %>.<%= upload.minor_version %>
</p>
</div>
<div class="splitcontentright">
<p>
<%= label_tag('', l(:label_mime)) %>
<%= h(upload.mime_type) %>
</p>
<p>
<%= label_tag('', l(:label_size)) %>
<%= number_to_human_size(upload.size) %>
</p>
</div>
</div> </div>
<div class="splitcontentright clear"> <% if upload.comment.present? %>
<p> <p>
<%= label_tag('', "#{l(:label_mime)}:") %> <%= label_tag('', l(:label_comment)) %>
<%= h(upload.mime_type) %> <div class="wiki"><%= textilizable(upload.comment) %></div>
</p> </p>
<p> <% end %>
<%= label_tag('', "#{l(:label_size)}:") %>
<%= number_to_human_size(upload.size) %>
</p>
</div>
<br style="clear: both"/>
</div> </div>

View File

@ -1,8 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Redmine plugin for Document Management System "Features"
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> #
# Copyright (C) 2014 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License

View File

@ -1,7 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Redmine plugin for Document Management System "Features"
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -15,24 +19,23 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% html_title(l(:dmsf)) %> <% html_title l(:dmsf) %>
<div class="contextual"> <%= render(:partial => '/dmsf/path',
</div> :locals => {:folder => @folder, :filename => nil, :title => l(:heading_uploaded_files)}) %>
<%= render(:partial => '/dmsf/path', :locals => {:folder => @folder, :filename => nil}) %> <% if (@folder && @folder.description.present?) || @project.description.present? %>
<div class="wiki">
<%= textilizable(@folder ? @folder.description : @project.description) %>
</div>
<% end %>
<div class="wiki">
<%= textilizable(@folder.description) if @folder %>
</div>
<h3><%=l(:heading_uploaded_files)%></h3>
<% i = 1 %>
<%= form_tag({:action => 'commit_files', :id => @project, :folder_id => @folder}, <%= form_tag({:action => 'commit_files', :id => @project, :folder_id => @folder},
:method=>:post) do %> :method => :post) do %>
<% @uploads.each do |upload| %> <% @uploads.each_with_index do |upload, i| %>
<% if upload.locked %> <% if upload.locked %>
<%= render(:partial => 'upload_file_locked', :locals => {:upload => upload, :i => i}) %> <%= render(:partial => 'upload_file_locked', :locals => {:upload => upload, :i => i}) %>
<% else %> <% else %>
@ -40,5 +43,5 @@
<% end %> <% end %>
<% i += 1 %> <% i += 1 %>
<% end %> <% end %>
<%= submit_tag(l(:submit_commit)) %> <%= submit_tag l(:submit_commit) %>
<% end %> <% end %>

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2013 Karel Pičman <karel.picman@kontron.com> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -14,28 +17,35 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<h3 class="title"><%= l(:field_label_dmsf_workflow) %></h3> <h3 class="title"><%= l(:field_label_dmsf_workflow) %></h3>
<%= form_tag({:controller => 'dmsf_workflows', :action => 'new_action'}, <%= form_tag({:controller => 'dmsf_workflows', :action => 'new_action'},
:method => :post, :method => :post, :id => 'new-action-form') do %>
:id => 'new-action-form') do %>
<%= hidden_field_tag :dmsf_workflow_step_assignment_id, params[:dmsf_workflow_step_assignment_id] %> <%= hidden_field_tag :dmsf_workflow_step_assignment_id, params[:dmsf_workflow_step_assignment_id] %>
<%= hidden_field_tag :dmsf_file_revision_id, params[:dmsf_file_revision_id] %> <%= hidden_field_tag :dmsf_file_revision_id, params[:dmsf_file_revision_id] %>
<p><label><%= radio_button_tag 'step_action', DmsfWorkflowStepAction::ACTION_APPROVE, true %> <%= l(:label_dmsf_wokflow_action_approve) %></label><br/></p>
<p> <p>
<label><%= radio_button_tag 'step_action', DmsfWorkflowStepAction::ACTION_REJECT %> <%= l(:label_dmsf_wokflow_action_reject) %></label><br/> <label>
<%= text_area_tag :note, '', :placeholder => l(:message_dmsf_wokflow_note), :size => '38x2' %> <%= radio_button_tag 'step_action', DmsfWorkflowStepAction::ACTION_APPROVE, true %>
<%= l(:label_dmsf_wokflow_action_approve) %>
</label>
</p>
<p>
<label>
<%= radio_button_tag 'step_action', DmsfWorkflowStepAction::ACTION_REJECT %>
<%= l(:label_dmsf_wokflow_action_reject) %>
</label>
<br/>
<%= text_area_tag :note, '', :placeholder => l(:message_dmsf_wokflow_note), :style => 'width: 90%' %>
</p> </p>
<p> <p>
<%= label_tag 'delegate', l(:label_dmsf_wokflow_action_delegate) %><br/> <%= label_tag 'delegate', l(:label_dmsf_wokflow_action_delegate) %><br/>
<%= text_field_tag 'user_search', nil %> <%= text_field_tag 'user_search', nil %>
<%= javascript_tag "observeSearchfield('user_search', 'users_for_delegate', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@dmsf_workflow, :dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id], :dmsf_file_revision_id => params[:dmsf_file_revision_id]) }')" %> <%= javascript_tag "observeSearchfield('user_search', 'dmsf_users_for_delegate', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@dmsf_workflow, :dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id], :dmsf_file_revision_id => params[:dmsf_file_revision_id]) }')" %>
<%= content_tag('div', principals_radio_button_tags('step_action', @dmsf_workflow.delegates(nil, params[:dmsf_workflow_step_assignment_id], params[:dmsf_file_revision_id])), :id => 'users_for_delegate') %> <%= content_tag('div', principals_radio_button_tags('step_action', @dmsf_workflow.delegates(nil, params[:dmsf_workflow_step_assignment_id], params[:dmsf_file_revision_id])), :id => 'dmsf_users_for_delegate') %>
</p> </p>
<p class="buttons"> <p class="buttons">

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -14,16 +17,17 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<h3 class="title"><%= l(:title_dmsf_workflow_log) %></h3> <h3 class="title"><%= l(:title_dmsf_workflow_log) %></h3>
<p> <p>
<% if params[:dmsf_file_revision_id].present? %> <% if params[:dmsf_file_revision_id].present? %>
<% revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id]) %> <% revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id]) %>
<% if revision %> <% if revision %>
<div class="log_header_box"> <div class="dmsf_log_header_box">
<div class="log_header_left"> <div class="dmsf_log_header_left">
<%= label_tag 'workflow_name', "#{l(:link_workflow)} #{l(:field_name).downcase}: " %> <%= label_tag 'workflow_name', "#{l(:link_workflow)} #{l(:field_name).downcase} " %>
<% if User.current.allowed_to?(:manage_workflows, @dmsf_workflow.project) %> <% if User.current.allowed_to?(:manage_workflows, @dmsf_workflow.project) %>
<%= link_to @dmsf_workflow.name, dmsf_workflow_path(@dmsf_workflow) %> <%= link_to @dmsf_workflow.name, dmsf_workflow_path(@dmsf_workflow) %>
<% else %> <% else %>
@ -31,7 +35,7 @@
<% end %> <% end %>
</div> </div>
<div> <div>
<%= label_tag 'workflow_status', "#{l(:field_status)}: " %> <%= label_tag 'workflow_status', l(:field_status) %>
<%= revision.workflow_str false %> <%= revision.workflow_str false %>
</div> </div>
</div> </div>
@ -47,34 +51,34 @@
</tr></thead> </tr></thead>
<tbody> <tbody>
<tr id="step-0" class="even"> <tr id="step-0" class="even">
<td class="step"/> <td class="id"/>
<td/> <td/>
<td/> <td/>
<td><%= DmsfWorkflowStepAction.workflow_str(0) %></td> <td><%= DmsfWorkflowStepAction.workflow_str(0) %></td>
<td class="note"></td> <td class="dmsf_note"></td>
<td/> <td/>
</tr> </tr>
<tr id="step-1" class="odd"> <tr id="step-1" class="odd">
<td class="step"></td> <td class="id"></td>
<td><%= link_to_user User.find_by_id(revision.dmsf_workflow_assigned_by) if revision.dmsf_workflow_assigned_by %></td> <td><%= link_to_user User.find_by_id(revision.dmsf_workflow_assigned_by) if revision.dmsf_workflow_assigned_by %></td>
<td><%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_ASSIGN) %></td> <td><%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_ASSIGN) %></td>
<td><%= DmsfWorkflowStepAction.workflow_str(DmsfWorkflowStepAction::ACTION_ASSIGN) %></td> <td><%= DmsfWorkflowStepAction.workflow_str(DmsfWorkflowStepAction::ACTION_ASSIGN) %></td>
<td class="note"></td> <td class="dmsf_note"></td>
<td><%= format_time(revision.dmsf_workflow_assigned_at) if revision.dmsf_workflow_assigned_at %></td> <td><%= format_time(revision.dmsf_workflow_assigned_at) if revision.dmsf_workflow_assigned_at %></td>
</tr> </tr>
<tr id="step-2" class="even"> <tr id="step-2" class="even">
<td class="step"></td> <td class="id"></td>
<td><%= link_to_user User.find_by_id(revision.dmsf_workflow_started_by) if revision.dmsf_workflow_started_by %></td> <td><%= link_to_user User.find_by_id(revision.dmsf_workflow_started_by) if revision.dmsf_workflow_started_by %></td>
<td><%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_START) %></td> <td><%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_START) %></td>
<td><%= DmsfWorkflowStepAction.workflow_str(DmsfWorkflowStepAction::ACTION_START) if revision.dmsf_workflow_started_by %></td> <td><%= DmsfWorkflowStepAction.workflow_str(DmsfWorkflowStepAction::ACTION_START) if revision.dmsf_workflow_started_by %></td>
<td class="note"></td> <td class="dmsf_note"></td>
<td><%= format_time(revision.dmsf_workflow_started_at) if revision.dmsf_workflow_started_at %></td> <td><%= format_time(revision.dmsf_workflow_started_at) if revision.dmsf_workflow_started_at %></td>
</tr> </tr>
<% sql = "SELECT c.action, c.note, c.created_at, c.author_id, a.user_id, s.step FROM dmsf_workflow_step_actions c RIGHT JOIN dmsf_workflow_step_assignments a ON a.id = c.dmsf_workflow_step_assignment_id RIGHT JOIN dmsf_workflow_steps s ON s.id = a.dmsf_workflow_step_id WHERE a.dmsf_file_revision_id = #{revision.id} ORDER BY s.step, c.action DESC, c.created_at" %> <% sql = "SELECT c.action, c.note, c.created_at, c.author_id, a.user_id, s.step FROM dmsf_workflow_step_actions c RIGHT JOIN dmsf_workflow_step_assignments a ON a.id = c.dmsf_workflow_step_assignment_id RIGHT JOIN dmsf_workflow_steps s ON s.id = a.dmsf_workflow_step_id WHERE a.dmsf_file_revision_id = #{revision.id} ORDER BY s.step, c.action DESC, c.created_at" %>
<% result = DmsfWorkflowStep.connection.exec_query sql %> <% result = DmsfWorkflowStep.connection.exec_query sql %>
<% result.each_with_index do |row, i| %> <% result.each_with_index do |row, i| %>
<tr id="step-<%= i + 3 %> " class="<%= cycle 'odd', 'even' %>"> <tr id="step-<%= i + 3 %> " class="<%= cycle 'odd', 'even' %>">
<td class="step"><%= row['step'] %></td> <td class="id"><%= row['step'] %></td>
<td><%= link_to_user User.find_by_id(row['author_id'].present? ? row['author_id'] : row['user_id']) %></td> <td><%= link_to_user User.find_by_id(row['author_id'].present? ? row['author_id'] : row['user_id']) %></td>
<td><%= DmsfWorkflowStepAction.action_str(row['action']) %></td> <td><%= DmsfWorkflowStepAction.action_str(row['action']) %></td>
<td> <td>
@ -84,7 +88,7 @@
<%= DmsfWorkflowStepAction.workflow_str(row['action']) %> <%= DmsfWorkflowStepAction.workflow_str(row['action']) %>
<% end %> <% end %>
</td> </td>
<td class="note"><%= row['note'] %></td> <td class="dmsf_note"><%= row['note'] %></td>
<td><%= format_time(row['created_at']) if row['created_at'].present? %></td> <td><%= format_time(row['created_at']) if row['created_at'].present? %></td>
</tr> </tr>
<% end %> <% end %>
@ -94,4 +98,3 @@
<% end %> <% end %>
<% end %> <% end %>
</p> </p>

View File

@ -1,4 +1,7 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
@ -14,9 +17,10 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% @workflows = DmsfWorkflow.sorted.where(:project_id => @project.id) if @project && @workflows.nil? %> <% @workflows = DmsfWorkflow.active.sorted.where(:project_id => @project.id) if @project && @workflows.nil? %>
<% unless @project %> <% unless @project %>
<div class="contextual"> <div class="contextual">
@ -24,6 +28,15 @@
</div> </div>
<h2><%=l(:label_dmsf_workflow_plural)%></h2> <h2><%=l(:label_dmsf_workflow_plural)%></h2>
<%= form_tag(dmsf_workflows_path, :method => :get) do %>
<fieldset>
<legend><%= l(:label_filter_plural) %></legend>
<label for='status'><%= l(:field_status) %>:</label>
<%= select_tag 'status', workflows_status_options_for_select(@status), :class => 'small', :onchange => 'this.form.submit(); return false;' %>
</fieldset>
<% end %>
&nbsp;
<% end %> <% end %>
<% if @workflows.any? %> <% if @workflows.any? %>
@ -34,9 +47,12 @@
</tr></thead> </tr></thead>
<tbody> <tbody>
<% for workflow in @workflows %> <% for workflow in @workflows %>
<tr id="workflow-<%= workflow.id %>" class="<%= cycle('odd', 'even') %>"> <tr id="workflow-<%= workflow.id %>" class="dmsf_workflow <%= workflow.active? ? 'active' : 'locked' %> <%= cycle('odd', 'even') %>">
<td class="name"><%= link_to(h(workflow.name), dmsf_workflow_path(workflow)) %></td> <td class="name"><%= link_to(h(workflow.name), dmsf_workflow_path(workflow)) %></td>
<td class="buttons"><%= delete_link dmsf_workflow_path(workflow) %></td> <td class="buttons">
<%= change_status_link(workflow) unless @project %>
<%= delete_link dmsf_workflow_path(workflow) %>
</td>
</tr> </tr>
<% end %> <% end %>
</tbody> </tbody>

View File

@ -1,8 +1,9 @@
<% <%
# encoding: utf-8 # encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -20,7 +21,7 @@
%> %>
<fieldset class="box"> <fieldset class="box">
<legend><%=l(:label_dmsf_workflow_add_approver)%></legend> <legend><%= l(:label_dmsf_workflow_add_approver) %></legend>
<p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p> <p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p>
<%= javascript_tag "observeSearchfield('user_search', 'users', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@dmsf_workflow, :dmsf_workflow_step_assignment_id => nil, :dmsf_file_revision_id => nil, :project_id => @project ? @project.id : nil) }')" %> <%= javascript_tag "observeSearchfield('user_search', 'users', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@dmsf_workflow, :dmsf_workflow_step_assignment_id => nil, :dmsf_file_revision_id => nil, :project_id => @project ? @project.id : nil) }')" %>

View File

@ -1,8 +1,9 @@
<% <%
# encoding: utf-8 # encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -21,11 +22,11 @@
<h3 class="title"><%= l(:dmsf_new_step) %></h3> <h3 class="title"><%= l(:dmsf_new_step) %></h3>
<%= form_for(:dmsf_workflow, {:url => edit_dmsf_workflow_path(@dmsf_workflow), :method => :post}) do |f| %> <%= labelled_form_for(@dmsf_workflow, {:url => edit_dmsf_workflow_path(@dmsf_workflow), :method => :post}) do |f| %>
<%= render :partial => 'new_step_form' %> <%= render :partial => 'new_step_form' %>
<p class="buttons"> <p class="buttons">
<%= submit_tag l(:dmsf_and), :id => 'add-step-and' %> <%= f.submit l(:dmsf_and), :id => 'add-step-and' %>
<%= submit_tag l(:dmsf_or), :id => 'add-step-or' %> <%= f.submit l(:dmsf_or), :id => 'add-step-or' %>
<%= submit_tag l(:button_cancel), :name => nil, :onclick => 'hideModal(this);', :type => 'button' %> <%= f.submit l(:button_cancel), :name => nil, :onclick => 'hideModal(this);', :type => 'button' %>
</p> </p>
<% end %> <% end %>

View File

@ -1,8 +1,9 @@
<% <%
# encoding: utf-8 # encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -28,7 +29,10 @@
<%= labelled_form_for @dmsf_workflow do |f| %> <%= labelled_form_for @dmsf_workflow do |f| %>
<%= error_messages_for 'workflow' %> <%= error_messages_for 'workflow' %>
<div class="box tabular"> <div class="box tabular">
<p><%= f.text_field :name, :value => @dmsf_workflow.name, :required => true %><%= submit_tag l(:button_save) %></p> <p>
<%= f.text_field :name, :required => true %>
<%= f.submit l(:button_save) %>
</p>
</div> </div>
<% end %> <% end %>
@ -38,29 +42,27 @@
</p> </p>
<% steps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq %> <% steps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq %>
<% if steps.any? %> <% if steps.any? %>
<table class="list"> <table class="list steps">
<thead><tr> <thead><tr>
<th><%= l(:label_dmsf_workflow_step) %></th> <th><%= l(:label_dmsf_workflow_step) %></th>
<th><%= l(:label_dmsf_workflow_approval_plural) %></th> <th><%= l(:label_dmsf_workflow_approval_plural) %></th>
<th><%= l(:button_sort)%></th>
<th></th> <th></th>
</tr></thead> </tr></thead>
<tbody> <tbody>
<% steps.each do |i|%> <% steps.each do |i|%>
<tr id="step-<%= i %>" class="<%= cycle 'odd', 'even' %> step"> <tr id="step-<%= i %>" class="<%= cycle 'odd', 'even' %> step">
<td class="step"><%= i %></td> <td class="id"><%= i %></td>
<td class="approval"> <td class="approval">
<% @dmsf_workflow.dmsf_workflow_steps.collect{|s| (s.step == i) ? s : nil}.compact.each_with_index do |step, j| %> <% stps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| (s.step == i) ? s : nil}.compact %>
<% if j != 0 %> <% stps.each_with_index do |step, j| %>
<b><%= step.soperator %></b>&nbsp <% if (j != 0) || (stps.count > 1) %>
<b><%= step.soperator %></b>
<% end %> <% end %>
<%= link_to_user step.user %> <%= link_to_user step.user %>
<% end %> <% end %>
</td> </td>
<td class="reorder">
<%= reorder_links('workflow_step', {:action => 'edit', :id => @dmsf_workflow, :step => i}, :put) %>
</td>
<td class="buttons"> <td class="buttons">
<%= reorder_handle(@dmsf_workflow, :url => url_for(:action => 'edit', :id => @dmsf_workflow, :step => i) ) %>
<%= delete_link edit_dmsf_workflow_path(@dmsf_workflow, :step => i) %> <%= delete_link edit_dmsf_workflow_path(@dmsf_workflow, :step => i) %>
</td> </td>
</tr> </tr>
@ -71,3 +73,7 @@
<p class="nodata"><%= l(:label_no_data) %></p> <p class="nodata"><%= l(:label_no_data) %></p>
<% end %> <% end %>
</div> </div>
<%= javascript_tag do %>
$(function() { $("table.steps tbody").positionedItems(); });
<% end %>

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -14,7 +17,8 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
$('#ajax-modal').html('<%= escape_javascript(render :partial => 'action', :locals => {:workflow => @dmsf_workflow}) %>'); $('#ajax-modal').html('<%= escape_javascript(render :partial => 'action', :locals => {:workflow => @dmsf_workflow}) %>');
showModal('ajax-modal', '35%'); showModal('ajax-modal', '35%');

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2013 Karel Pičman <karel.picman@kontron.com> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -14,6 +17,7 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<%= render 'main' %> <%= render 'main' %>

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -14,34 +17,35 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% project = Project.find_by_id params[:project_id] if params[:project_id] %> <% project = Project.find_by_id params[:project_id] if params[:project_id] %>
<% if project %> <% if project %>
<h2><%= link_to l(:label_dmsf_workflow_plural), settings_project_path(project, :tab => 'dmsf_workflow') %> &#187; <%=l(:label_dmsf_workflow_new)%></h2> <h2><%= link_to l(:label_dmsf_workflow_plural), settings_project_path(project, :tab => 'dmsf_workflow') %> &#187; <%= l(:label_dmsf_workflow_new) %></h2>
<% else %> <% else %>
<h2><%= link_to l(:label_dmsf_workflow_plural), dmsf_workflows_path %> &#187; <%=l(:label_dmsf_workflow_new)%></h2> <h2><%= link_to l(:label_dmsf_workflow_plural), dmsf_workflows_path %> &#187; <%= l(:label_dmsf_workflow_new) %></h2>
<% end %> <% end %>
<%= labelled_form_for @dmsf_workflow do |f| %> <%= labelled_form_for @dmsf_workflow do |f| %>
<%= f.hidden_field(:project_id, :value => project.id) if project %>
<%= error_messages_for 'dmsf_workflow' %> <%= error_messages_for 'dmsf_workflow' %>
<div class="box tabular"> <div class="box tabular">
<p> <p>
<%= f.text_field :name, :value => @dmsf_workflow.name, :size => 25, :maxlength => 255, :required => true %> <%= f.text_field :name, :required => true %>
</p> </p>
<p> <p>
<%= label_tag :label_copy_workflow_from, l(:label_copy_workflow_from) %> <%= f.select(:id,
<%= select_tag('dmsf_workflow_id', dmsf_all_workflows_for_select(params[:dmsf_workflow_id])) %> dmsf_all_workflows_for_select(params[:dmsf_workflow] ? params[:dmsf_workflow][:id] : nil),
:label => l(:label_copy_workflow_from)) %>
</p> </p>
<% if project %>
<p><%= hidden_field_tag :project_id, project.id %></p>
<% end %>
</div> </div>
<%= submit_tag l(:button_create) %> <%= f.submit l(:button_create) %>
<% end %> <% end %>
<script type="text/javascript"> <script type="text/javascript">
$('#dmsf_workflow_id').change(function () { $('#dmsf_workflow_id').change(function () {
$('#content').load("<%= url_for(:action => 'new', :project_id => @project) %>", $('#new_dmsf_workflow').serialize()); $('#content').load("<%= @project ? url_for(:action => 'new', :project_id => @project.id) : url_for(:action => 'new') %>", $('#new_dmsf_workflow').serialize());
}); });
$('#dmsf_workflow_id').select2();
</script> </script>

View File

@ -1,19 +0,0 @@
<%
# encoding: utf-8
#
# Redmine plugin for Kontron customisation
# Copyright (c) 2011-15 Kontron
# Karel Pičman <karel.picman@kontron.com>
#
# Repository folders
%>
<h2><%= l(:label_repository_folders) %></h2>
<%= form_for(:repository_folder, {:url => edit_dmsf_workflow_path(@dmsf_workflow), :method => :post}) do |f| %>
<%= render :partial => 'new_step_form' %>
<p>
<%= submit_tag l(:dmsf_and), :id => 'add-step-and' %>
<%= submit_tag l(:dmsf_or), :id => 'add-step-or' %>
</p>
<% end %>

View File

@ -1,6 +1,9 @@
<%# Redmine plugin for Document Management System "Features" <%
# encoding: utf-8
# #
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License

View File

@ -1,8 +1,9 @@
<%#
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -17,8 +18,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# %>
require 'redmine_dmsf/patches/custom_fields_helper_patch'
require 'redmine_dmsf/patches/acts_as_customizable' <%= labelled_fields_for :pref, @user.pref do |pref_fields| %>
require 'redmine_dmsf/patches/project_patch' <p><%= pref_fields.check_box :dmsf_tree_view %></p>
require 'redmine_dmsf/patches/project_tabs_extended' <% end %>

View File

@ -1,8 +1,11 @@
<%# Redmine plugin for Document Management System "Features" <%#
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -16,7 +19,8 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%>
<% if @project.new_record? && @source_project %> <% if @project.new_record? && @source_project %>
<p> <p>

View File

@ -1,7 +1,9 @@
<%# <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -24,15 +26,15 @@
<% files = DmsfFile.joins( <% files = DmsfFile.joins(
'JOIN dmsf_locks ON dmsf_files.id = dmsf_locks.entity_id').where( 'JOIN dmsf_locks ON dmsf_files.id = dmsf_locks.entity_id').where(
'dmsf_locks.entity_type' => 0, 'dmsf_locks.user_id' => @user.id).all %> 'dmsf_locks.entity_type' => 0, 'dmsf_locks.user_id' => @user.id).all %>
<h3><%= l(:label_my_locked_documents)%> (<%= folders.count %>/<%= files.count %>)</h3> <h3><%= l(:locked_documents)%> (<%= folders.count %>/<%= files.count %>)</h3>
<% if folders.any? || files.any?%> <% if folders.any? || files.any?%>
<%= form_tag({}) do %> <%= form_tag({}) do %>
<table class="list"> <table class="list">
<thead> <thead>
<tr> <tr>
<th><%=l(:field_project)%></th> <th><%= l(:field_project) %></th>
<th><%=l(:label_document)%>/<%=l(:field_folder)%></th> <th><%= l(:label_document) %>/<%= l(:field_folder) %></th>
<th><%=l(:field_folder)%></th> <th><%= l(:field_folder) %></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -47,9 +49,9 @@
:class => 'icon icon-folder') %> :class => 'icon icon-folder') %>
</td> </td>
<td class="title"> <td class="title">
<% if folder.folder %> <% if folder.dmsf_folder %>
<%= link_to(h(folder.folder.title), <%= link_to(h(folder.dmsf_folder.title),
{:controller => 'dmsf', :action => 'show', :id => folder.project, :folder_id => folder.folder}) %> {:controller => 'dmsf', :action => 'show', :id => folder.project, :folder_id => folder.dmsf_folder}) %>
<% else %> <% else %>
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> folder.project }) %> <%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> folder.project }) %>
<% end %> <% end %>
@ -67,9 +69,9 @@
:class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}") %> :class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}") %>
</td> </td>
<td class="title"> <td class="title">
<% if file.folder %> <% if file.dmsf_folder %>
<%= link_to(h(file.folder.title), <%= link_to(h(file.dmsf_folder.title),
{:controller => 'dmsf', :action => 'show', :id => file.project, :folder_id => file.folder}) %> {:controller => 'dmsf', :action => 'show', :id => file.project, :folder_id => file.dmsf_folder}) %>
<% else %> <% else %>
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> file.project }) %> <%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> file.project }) %>
<% end %> <% end %>

View File

@ -1,7 +1,9 @@
<%# <%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011-15 Karel Picman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -23,14 +25,14 @@
'dmsf_workflow_step_assignments.user_id = ? AND dmsf_workflow_step_actions.id IS NULL', @user.id).all %> 'dmsf_workflow_step_assignments.user_id = ? AND dmsf_workflow_step_actions.id IS NULL', @user.id).all %>
<% assignments = Array.new %> <% assignments = Array.new %>
<% all_assignments.each do |assignment| %> <% all_assignments.each do |assignment| %>
<% if assignment.dmsf_file_revision.file.last_revision && <% if assignment.dmsf_file_revision.dmsf_file.last_revision &&
!assignment.dmsf_file_revision.file.last_revision.deleted && !assignment.dmsf_file_revision.dmsf_file.last_revision.deleted? &&
(assignment.dmsf_file_revision.workflow == DmsfWorkflow::STATE_WAITING_FOR_APPROVAL) && (assignment.dmsf_file_revision.workflow == DmsfWorkflow::STATE_WAITING_FOR_APPROVAL) &&
(assignment.dmsf_file_revision == assignment.dmsf_file_revision.file.last_revision) %> (assignment.dmsf_file_revision == assignment.dmsf_file_revision.dmsf_file.last_revision) %>
<% assignments << assignment %> <% assignments << assignment %>
<% end %> <% end %>
<% end %> <% end %>
<h3><%= l(:label_my_open_approvals)%> (<%= assignments.count %>)</h3> <h3><%= l(:open_approvals)%> (<%= assignments.count %>)</h3>
<% if assignments.any? %> <% if assignments.any? %>
<%= form_tag({}) do %> <%= form_tag({}) do %>
<table class="list"> <table class="list">
@ -46,8 +48,8 @@
<% assignments.each do |assignment| %> <% assignments.each do |assignment| %>
<tr id="assignment-<%= assignment.id %>" class="<%= cycle('odd', 'even') %>"> <tr id="assignment-<%= assignment.id %>" class="<%= cycle('odd', 'even') %>">
<td class="project"> <td class="project">
<% if assignment.dmsf_file_revision.file.project %> <% if assignment.dmsf_file_revision.dmsf_file.project %>
<%= link_to_project(assignment.dmsf_file_revision.file.project) %> <%= link_to_project(assignment.dmsf_file_revision.dmsf_file.project) %>
<% end %> <% end %>
</td> </td>
<td> <td>
@ -57,18 +59,18 @@
<% end %> <% end %>
</td> </td>
<td class="title"> <td class="title">
<% if assignment.dmsf_file_revision && assignment.dmsf_file_revision.file %> <% if assignment.dmsf_file_revision && assignment.dmsf_file_revision.dmsf_file %>
<%= link_to(h(assignment.dmsf_file_revision.title), <%= link_to(h(assignment.dmsf_file_revision.title),
{:controller => 'dmsf_files', :action => :show, :id => assignment.dmsf_file_revision.file }) %> {:controller => 'dmsf_files', :action => :show, :id => assignment.dmsf_file_revision.dmsf_file }) %>
<% end %> <% end %>
</td> </td>
<td class="title"> <td class="title">
<% if assignment.dmsf_file_revision %> <% if assignment.dmsf_file_revision %>
<% if assignment.dmsf_file_revision.file.folder %> <% if assignment.dmsf_file_revision.dmsf_file.dmsf_folder %>
<%= link_to(h(assignment.dmsf_file_revision.file.folder.title), <%= link_to(h(assignment.dmsf_file_revision.dmsf_file.dmsf_folder.title),
{:controller => 'dmsf', :action => 'show', :id => assignment.dmsf_file_revision.file.project, :folder_id => assignment.dmsf_file_revision.file.folder}) %> {:controller => 'dmsf', :action => 'show', :id => assignment.dmsf_file_revision.dmsf_file.project, :folder_id => assignment.dmsf_file_revision.dmsf_file.dmsf_folder}) %>
<% elsif assignment.dmsf_file_revision.file.project %> <% elsif assignment.dmsf_file_revision.dmsf_file.project %>
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id => assignment.dmsf_file_revision.file.project }) %> <%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id => assignment.dmsf_file_revision.dmsf_file.project }) %>
<% end %> <% end %>
<% end %> <% end %>
</td> </td>

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 803 B

After

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 608 B

View File

@ -0,0 +1,17 @@
{
"sProcessing": "Elaborazione...",
"sLengthMenu": "Visualizza _MENU_ elementi",
"sZeroRecords": "La ricerca non ha portato alcun risultato o nessun elemento è presente",
"sInfo": "Vista da _START_ a _END_ di _TOTAL_ elementi",
"sInfoEmpty": "Vista da 0 a 0 di 0 elementi",
"sInfoFiltered": "(filtrati da _MAX_ elementi totali)",
"sInfoPostFix": "",
"sSearch": "Cerca:",
"sUrl": "",
"oPaginate": {
"sFirst": "Inizio",
"sPrevious": "Precedente",
"sNext": "Successivo",
"sLast": "Fine"
}
}

View File

@ -0,0 +1,117 @@
/* encoding: utf-8
*
* Redmine plugin for Document Management System "Features"
*
* Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* Function to allow the projects to show up as a tree */
function dmsf_toggle(EL, PM)
{
var els = document.getElementsByTagName('tr');
var elsLen = els.length;
var pattern = new RegExp("(^|\\s)" + EL + "(\\s|$)");
var cpattern = new RegExp('span');
var expand = new RegExp('dmsf_expanded');
var collapse = new RegExp('dmsf_collapsed');
var hide = new RegExp('dmsf_hidden');
var spanid = PM;
var classid = new RegExp('junk');
var oddeventoggle = 0;
for(i = 0; i < elsLen; i++)
{
if(cpattern.test(els[i].id))
{
var tmpspanid = spanid;
var tmpclassid = classid;
spanid = els[i].id;
classid = spanid;
classid = classid.match(/(\w+)span/)[1];
classid = new RegExp(classid);
if(tmpclassid.test(els[i].className) && (tmpspanid.toString() !== PM.toString()))
{
if(collapse.test(document.getElementById(tmpspanid).className))
{
spanid = tmpspanid;
classid = tmpclassid;
}
}
}
if(pattern.test(els[i].className))
{
var cnames = els[i].className;
cnames = cnames.replace(/dmsf_hidden/g,'');
if(expand.test(document.getElementById(PM).className))
{
cnames += ' dmsf_hidden';
}
else
{
if((spanid.toString() !== PM.toString()) && (classid.test(els[i].className)))
{
if(collapse.test(document.getElementById(spanid).className))
{
cnames += ' dmsf_hidden';
}
}
}
els[i].className = cnames;
}
if(!(hide.test(els[i].className)))
{
var cnames = els[i].className;
cnames = cnames.replace(/odd/g,'');
cnames = cnames.replace(/even/g,'');
if(oddeventoggle === 0)
{
cnames += ' odd';
}
else
{
cnames += ' even';
}
oddeventoggle ^= 1;
els[i].className = cnames;
}
}
if (collapse.test(document.getElementById(PM).className))
{
var cnames = document.getElementById(PM).className;
cnames = cnames.replace(/dmsf_collapsed/,'dmsf_expanded');
document.getElementById(PM).className = cnames;
}
else
{
var cnames = document.getElementById(PM).className;
cnames = cnames.replace(/dmsf_expanded/,'dmsf_collapsed');
document.getElementById(PM).className = cnames;
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,332 +0,0 @@
/*
* Redmine plugin for Document Management System "Features"
*
* Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
* Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
button {
vertical-align: middle;
margin-top: 1px;
margin-bottom: 1px;
}
/* DMSF entries list */
table.entries tbody td, table.entries tbody tr:hover td {
border-left: solid 1px #D7D7D7;
border-right: solid 1px #D7D7D7;
}
table.entries td.modified {
min-width: 127px;
width: 127px;
}
table.entries td.actions {
min-width: 96px;
width: 96px;
}
table.entries td.title {
width: 40%;
}
table.entries th.check, table.entries td.check {
width: 17px;
padding: 2px;
text-align: left;
}
table.entries th.check div.DataTables_sort_wrapper {
padding: 0;
}
table.display th {
font-weight: bold;
}
table.display tbody tr.even {
background-color: #F8F8F8;
}
table.display tbody tr.odd {
background-color: #FFFFFF;
}
table.display tbody tr:hover {
background-color:#ffffdd;
}
form.dmfs_entries {
margin-bottom: 10px;
display: block;
}
div.dataTables_wrapper div.fg-toolbar {
font-size: 0.9em;
}
div.dataTables_wrapper div.fg-toolbar input, div.dataTables_wrapper div.fg-toolbar button,
div.dataTables_wrapper div.fg-toolbar select {
font-size: 0.9em;
}
input[type="checkbox"] {
margin: 1px;
}
div.filename {
padding: 0 10px 0 10px; float: right; font-size: 0.8em;
white-space: nowrap;
}
td.size {
font-size: 0.8em;
white-space: nowrap;
}
td.modified {
font-size: 0.8em;
}
td.modified img {
vertical-align:text-top;
}
td.author {
font-size: 0.8em;
}
td.version {
font-size: 0.8em;
white-space: nowrap;
}
td.version img {
vertical-align:text-top;
}
td.workflow {
font-size: 0.8em;
white-space: nowrap;
}
/* DMSF entries upload control */
.dmsf_upload textarea {
width: 90%;
}
.dmsf_upload legend {
font-weight: bold;
}
.dmsf_upload .warning {
padding: 4px 4px 4px 30px;
}
#uploader div.flash {
border: none;
}
.invisible {
display: none;
}
div.upload_select {
float: right;
white-space: nowrap;
line-height: 1.4em;
padding-left: 10px;
font-size: 0.9em;
}
div.upload_select input, div.upload_select select {
font-size: 0.9em;
}
.plupload_scroll {
max-height: 1000px;
min-height: 175px;
}
.ui-resizable-s {
bottom: 0px;
}
/* DMSF detail/commit page */
.dmsf_detail .warning {
padding: 4px 4px 4px 30px;
}
.dmsf_detail div.data {
margin-left: 110px;
}
.dmsf_detail label {
font-weight: bold;
width: 100px;
float: left;
text-align: right;
padding-right: 10px;
}
p.no-ident {
margin-bottom: 0;
margin-top: 0;
}
table.access-table tbody td, table.access-table tbody tr:hover td {
border: solid 1px #D7D7D7;
}
/* Custom field */
.dmsf-customfields {
margin: 5px 0px 5px 0px;
}
.dmsf-customfields .customfield label {
font-weight: bold;
width: 100px;
display: block;
float: left;
}
/* Approval workflow */
#admin-menu a.approvalworkflows { background-image: url(../images/ticket_go.png); }
#users_for_delegate {height: 200px; overflow:auto;}
#users_for_delegate label {display: block;}
.revision_box{
padding: 0px 0px 0px 0px;
margin-bottom: 10px;
background-color:#f6f6f6;
color:#505050;
line-height:1.5em;
}
div.revision_box .ui-widget-header {
font-weight: normal;
}
table.list th {
text-align: left;
}
table.list td.note {
width: 20%;
}
table.list td.reorder {
width: 15%;
}
table.list td.step {
text-align: center;
width: 16px;
}
.log_header_box{
padding:6px;
margin-bottom: 10px;
}
.log_header_left {
width: 50%;
float: left;
}
.log_header_box label{
font-weight: bold;
margin-left: 0px;
margin-right: 3px;
padding: 3px 0 3px 0;
}
.modal a, .modal a:link, .modal a:visited{ color: #169; text-decoration: none; }
.modal a:hover, .modal a:active{ color: #c61a1a; text-decoration: underline;}
.modal{ font-size: 12px}
/* Command icons */
.dmsf_icon-narrow { padding-left: 16px }
.icon-link { background-image: url(../images/link.png); }
.icon-notification-on { background-image: url(../images/notify.png); margin-left: 3px; }
.icon-notification-off { background-image: url(../images/notifynot.png); margin-left: 3px; }
.icon-dmsf-lock { background-image: url(../images/lock.png); }
.icon-dmsf-unlock { background-image: url(../images/unlock.png); }
.icon-dmsf-locked { background-image: url(../images/locked.png); margin-left: 2px }
/* File types */
tr.gray .icon-folder { background-image: url(../images/folder_gray.png); }
.icon-file.filetype-doc, .icon-file.filetype-docx { background-image: url(../images/filetypes/doc.png); }
.icon-file.filetype-xls, .icon-file.filetype-xlsx { background-image: url(../images/filetypes/xls.png); }
.icon-file.filetype-ppt, .icon-file.filetype-pptx { background-image: url(../images/filetypes/ppt.png); }
.icon-file.filetype-vsd, .icon-file.filetype-vsdx { background-image: url(../images/filetypes/vsd.png); }
.icon-file.filetype-mpp { background-image: url(../images/filetypes/mpp.png); }
.icon-file.filetype-odt { background-image: url(../images/filetypes/odt.png); }
.icon-file.filetype-ods { background-image: url(../images/filetypes/ods.png); }
.icon-file.filetype-odp { background-image: url(../images/filetypes/odp.png); }
.icon-file.filetype-odg { background-image: url(../images/filetypes/odg.png); }
tr.gray .icon-file.filetype-doc { background-image: url(../images/filetypes/doc_gray.png); }
tr.gray .icon-file.filetype-docx { background-image: url(../images/filetypes/doc_gray.png); }
tr.gray .icon-file.filetype-xls { background-image: url(../images/filetypes/xls_gray.png); }
tr.gray .icon-file.filetype-xlsx { background-image: url(../images/filetypes/xls_gray.png); }
tr.gray .icon-file.filetype-ppt { background-image: url(../images/filetypes/ppt_gray.png); }
tr.gray .icon-file.filetype-pptx { background-image: url(../images/filetypes/ppt_gray.png); }
tr.gray .icon-file.filetype-vsd { background-image: url(../images/filetypes/vsd_gray.png); }
tr.gray .icon-file.filetype-vsdx { background-image: url(../images/filetypes/vsd_gray.png); }
tr.gray .icon-file.filetype-mpp { background-image: url(../images/filetypes/mpp_gray.png); }
tr.gray .icon-file.filetype-odt { background-image: url(../images/filetypes/odt_gray.png); }
tr.gray .icon-file.filetype-ods { background-image: url(../images/filetypes/ods_gray.png); }
tr.gray .icon-file.filetype-odp { background-image: url(../images/filetypes/odp_gray.png); }
tr.gray .icon-file.filetype-odg { background-image: url(../images/filetypes/odg_gray.png); }
tr.gray .icon-file.text-x-c { background-image: url(../images/filetypes/c_gray.png); }
tr.gray .icon-file.text-x-csharp { background-image: url(../images/filetypes/csharp_gray.png); }
tr.gray .icon-file.text-x-java { background-image: url(../images/files/filetypes/java_gray.png); }
tr.gray .icon-file.text-x-javascript { background-image: url(../images/filetypes/js_gray.png); }
tr.gray .icon-file.text-x-php { background-image: url(../images/filetypes/php_gray.png); }
tr.gray .icon-file.text-x-ruby { background-image: url(../images/filetypes/ruby_gray.png); }
tr.gray .icon-file.text-xml { background-image: url(../images/filetypes/xml_gray.png); }
tr.gray .icon-file.text-css { background-image: url(../images/filetypes/css_gray.png); }
tr.gray .icon-file.text-html { background-image: url(../images/filetypes/html_gray.png); }
tr.gray .icon-file.image-gif { background-image: url(../images/filetypes/image_gray.png); }
tr.gray .icon-file.image-jpeg { background-image: url(../images/filetypes/image_gray.png); }
tr.gray .icon-file.image-png { background-image: url(../images/filetypes/image_gray.png); }
tr.gray .icon-file.image-tiff { background-image: url(../images/filetypes/image_gray.png); }
tr.gray .icon-file.application-pdf { background-image: url(../images/filetypes/pdf_gray.png); }
tr.gray .icon-file.application-zip { background-image: url(../images/filetypes/zip_gray.png); }
tr.gray .icon-file.application-x-gzip { background-image: url(../images/filetypes/zip_gray.png); }
/* Links */
.gray { color: #AAA }
.gray a, .gray a:link, .gray a:visited{ color: #484848; text-decoration: none; }
label.required:after {
content: " *";
color: #bb0000;
}
/* Search results */
dt.dmsf-file { background-image: url(../../../images/document.png); }
dt.dmsf-folder { background-image: url(../../../images/folder.png); }
.select2-selection{height: 100% !important; min-height: 30px;}
.select2-selection__rendered{overflow: visible !important; min-height: 30px;}
.select2-results__options {max-height: 600px !important;}

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -43,7 +43,7 @@
.plupload_logo { .plupload_logo {
width: 40px; width: 40px;
height: 40px; height: 40px;
background: url('../img/plupload.png') no-repeat 0 0; background: url('../images/plupload.png') no-repeat 0 0;
position: absolute; position: absolute;
top: 8px; top: 8px;
left: 8px; left: 8px;
@ -119,7 +119,7 @@
} }
.plupload_thumb_loading { .plupload_thumb_loading {
background: #eee url(../img/loading.gif) center no-repeat; background: #eee url(../images/loading.gif) center no-repeat;
} }
.plupload_thumb_loading .plupload_file_dummy, .plupload_thumb_loading .plupload_file_dummy,

View File

@ -0,0 +1,248 @@
/*
* Redmine plugin for Document Management System "Features"
*
* Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
* Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* DMSF table.list modifications */
table.dmsf_list th.dmsf_th {
border: none;
}
table.list td.dmsf_modified {
min-width: 127px;
width: 127px;
font-size: 0.8em;
text-align: left;
}
td.dmsf_modified img {
vertical-align:text-top;
}
table.list td.dmsf_title {
width: 40%;
text-align: left;
}
table.list td.dmsf_buttons {
min-width: 96px;
width: 96px;
text-align: left;
}
table.list th.dmsf_checkbox,
table.list td.dmsf_checkbox {
width: 15px;
padding: 2px 0 0 0;
}
table.list th.dmsf_checkbox input {
padding:0px;
}
table.list th.dmsf_checkbox div.DataTables_sort_wrapper {
padding: 0;
}
form.dmsf_entries {
margin-bottom: 10px;
display: block;
}
div.dmsf_controls,
div.dmsf_controls input,
div.dmsf_controls select,
form.dmsf_entries #browser_filter.dataTables_filter,
form.dmsf_entries #browser_filter.dataTables_filter input{
font-size: 0.9em;
}
div.dmsf_filename {
padding: 0 10px 0 10px;
float: right;
font-size: 0.8em;
white-space: nowrap;
}
td.dmsf_size {
font-size: 0.8em;
white-space: nowrap;
}
td.dmsf_author {
font-size: 0.8em;
white-space: nowrap;
}
td.dmsf_version {
font-size: 0.8em;
white-space: nowrap;
}
td.dmsf_version img {
vertical-align:text-top;
}
td.dmsf_workflow {
font-size: 0.8em;
white-space: nowrap;
}
.dmsf_invisible {
display: none;
}
div.dmsf_upload_select {
float: right;
font-size: 0.9em;
}
div.dmsf_upload_select input, div.dmsf_upload_select select {
font-size: 0.9em;
}
/* Approval workflow */
#admin-menu a.dmsf-approvalworkflows { background-image: url(../../../images/ticket_go.png); }
#dmsf_users_for_delegate { height: 200px; overflow:auto; }
#dmsf_users_for_delegate label { display: block; }
tr.dmsf_workflow.locked a { color: #aaa; }
.dmsf_revision_box {
padding: 0px 0px 0px 0px;
margin-bottom: 10px;
background-color:#f6f6f6;
color:#505050;
line-height:1.5em;
}
.dmsf_revision_inner_box {
border: 1px solid #e4e4e4;
}
.dmsf_id_box {
float: right;
white-space: nowrap;
line-height: 1.5em;
color: #505050;
margin-top: 5px;
padding-left: 10px;
}
div.dmsf_revision_box .ui-widget-header {
font-weight: normal;
}
.dmsf_log_header_box{
padding:6px;
margin-bottom: 10px;
}
.dmsf_log_header_left {
width: 50%;
float: left;
}
.dmsf_log_header_box label{
font-weight: bold;
margin-left: 0px;
margin-right: 3px;
padding: 3px 0 3px 0;
}
/* Command icons */
.dmsf_icon-link { background-image: url(../images/link.png); }
.dmsf_icon-notification-on { background-image: url(../images/notify.png); margin-left: 3px; }
.dmsf_icon-notification-off { background-image: url(../images/notifynot.png); margin-left: 3px; }
.dmsf_icon-lock { background-image: url(../images/lock.png); }
.dmsf_icon-unlock { background-image: url(../images/unlock.png); }
/* File types */
tr.dmsf_gray .icon-folder { background-image: url(../images/folder_gray.png); }
.icon-file.filetype-doc, .icon-file.filetype-docx { background-image: url(../images/filetypes/doc.png); }
.icon-file.filetype-xls, .icon-file.filetype-xlsx { background-image: url(../images/filetypes/xls.png); }
.icon-file.filetype-ppt, .icon-file.filetype-pptx { background-image: url(../images/filetypes/ppt.png); }
.icon-file.filetype-vsd, .icon-file.filetype-vsdx { background-image: url(../images/filetypes/vsd.png); }
.icon-file.filetype-mpp { background-image: url(../images/filetypes/mpp.png); }
.icon-file.filetype-odt { background-image: url(../images/filetypes/odt.png); }
.icon-file.filetype-ods { background-image: url(../images/filetypes/ods.png); }
.icon-file.filetype-odp { background-image: url(../images/filetypes/odp.png); }
.icon-file.filetype-odg { background-image: url(../images/filetypes/odg.png); }
tr.dmsf_gray .icon-file.filetype-doc { background-image: url(../images/filetypes/doc_gray.png); }
tr.dmsf_gray .icon-file.filetype-docx { background-image: url(../images/filetypes/doc_gray.png); }
tr.dmsf_gray .icon-file.filetype-xls { background-image: url(../images/filetypes/xls_gray.png); }
tr.dmsf_gray .icon-file.filetype-xlsx { background-image: url(../images/filetypes/xls_gray.png); }
tr.dmsf_gray .icon-file.filetype-ppt { background-image: url(../images/filetypes/ppt_gray.png); }
tr.dmsf_gray .icon-file.filetype-pptx { background-image: url(../images/filetypes/ppt_gray.png); }
tr.dmsf_gray .icon-file.filetype-vsd { background-image: url(../images/filetypes/vsd_gray.png); }
tr.dmsf_gray .icon-file.filetype-vsdx { background-image: url(../images/filetypes/vsd_gray.png); }
tr.dmsf_gray .icon-file.filetype-mpp { background-image: url(../images/filetypes/mpp_gray.png); }
tr.dmsf_gray .icon-file.filetype-odt { background-image: url(../images/filetypes/odt_gray.png); }
tr.dmsf_gray .icon-file.filetype-ods { background-image: url(../images/filetypes/ods_gray.png); }
tr.dmsf_gray .icon-file.filetype-odp { background-image: url(../images/filetypes/odp_gray.png); }
tr.dmsf_gray .icon-file.filetype-odg { background-image: url(../images/filetypes/odg_gray.png); }
tr.dmsf_gray .icon-file.text-x-c { background-image: url(../images/filetypes/c_gray.png); }
tr.dmsf_gray .icon-file.text-x-csharp { background-image: url(../images/filetypes/csharp_gray.png); }
tr.dmsf_gray .icon-file.text-x-java { background-image: url(../images/files/filetypes/java_gray.png); }
tr.dmsf_gray .icon-file.text-x-javascript { background-image: url(../images/filetypes/js_gray.png); }
tr.dmsf_gray .icon-file.text-x-php { background-image: url(../images/filetypes/php_gray.png); }
tr.dmsf_gray .icon-file.text-x-ruby { background-image: url(../images/filetypes/ruby_gray.png); }
tr.dmsf_gray .icon-file.text-xml { background-image: url(../images/filetypes/xml_gray.png); }
tr.dmsf_gray .icon-file.text-css { background-image: url(../images/filetypes/css_gray.png); }
tr.dmsf_gray .icon-file.text-html { background-image: url(../images/filetypes/html_gray.png); }
tr.dmsf_gray .icon-file.image-gif { background-image: url(../images/filetypes/image_gray.png); }
tr.dmsf_gray .icon-file.image-jpeg { background-image: url(../images/filetypes/image_gray.png); }
tr.dmsf_gray .icon-file.image-png { background-image: url(../images/filetypes/image_gray.png); }
tr.dmsf_gray .icon-file.image-tiff { background-image: url(../images/filetypes/image_gray.png); }
tr.dmsf_gray .icon-file.application-pdf { background-image: url(../images/filetypes/pdf_gray.png); }
tr.dmsf_gray .icon-file.application-zip { background-image: url(../images/filetypes/zip_gray.png); }
tr.dmsf_gray .icon-file.application-x-gzip { background-image: url(../images/filetypes/zip_gray.png); }
/* Links */
.dmsf_gray { color: #AAA }
.dmsf_gray a, .dmsf_gray a:link, .dmsf_gray a:visited{ color: #484848; text-decoration: none; }
/* Search results */
dt.dmsf-file { background-image: url(../../../images/document.png); }
dt.dmsf-folder { background-image: url(../../../images/folder.png); }
/* DMSF tree view */
tr.dmsf_hidden { display:none; }
tr.dmsf_tree span.dmsf_expander { cursor: pointer; }
tr.dmsf_tree.dmsf_expanded td.dmsf_title span {
background: url(../images/bullet_arrow_down.png) no-repeat 0 50%;
padding-left: 16px;
}
tr.dmsf_tree.dmsf_child td.dmsf_title span { padding-left: 16px; }
tr.dmsf_tree.dmsf_collapsed td.dmsf_title span {
background: url(../../../images/bullet_arrow_right.png) no-repeat 0 50%;
padding-left: 16px;
}
tr.dmsf_tree.idnt-1 td.dmsf_title {padding-left: 1.5em;}
tr.dmsf_tree.idnt-2 td.dmsf_title {padding-left: 2em;}
tr.dmsf_tree.idnt-3 td.dmsf_title {padding-left: 2.5em;}
tr.dmsf_tree.idnt-4 td.dmsf_title {padding-left: 3em;}
tr.dmsf_tree.idnt-5 td.dmsf_title {padding-left: 3.5em;}
tr.dmsf_tree.idnt-6 td.dmsf_title {padding-left: 4em;}
tr.dmsf_tree.idnt-7 td.dmsf_title {padding-left: 4.5em;}
tr.dmsf_tree.idnt-8 td.dmsf_title {padding-left: 5em;}
tr.dmsf_tree.idnt-9 td.dmsf_title {padding-left: 5.5em;}
.dmsf_odd {background-color:#f6f7f8;}
.dmsf_even {background-color: #fff;}

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
@ -26,7 +26,7 @@ cs:
label_dmsf_file_revision_plural: Revize dokumentů label_dmsf_file_revision_plural: Revize dokumentů
label_dmsf_file_revision_access_plural: Přístupy k dokumentům label_dmsf_file_revision_access_plural: Přístupy k dokumentům
warning_no_entries_selected: Není nic vybráno warning_no_entries_selected: Není nic vybráno
error_email_to_must_be_entered: Musí být zadán adresát error_email_to_must_be_entered: Musí být zadán příjemce
warning_file_already_locked: Soubor je již zamčen warning_file_already_locked: Soubor je již zamčen
notice_file_locked: Soubor byl zamčen notice_file_locked: Soubor byl zamčen
warning_file_not_locked: Soubor není zamčen warning_file_not_locked: Soubor není zamčen
@ -34,14 +34,14 @@ cs:
error_only_user_that_locked_file_can_unlock_it: Soubor může být odemčen pouze uživatelem, který ho zamkl error_only_user_that_locked_file_can_unlock_it: Soubor může být odemčen pouze uživatelem, který ho zamkl
error_max_files_exceeded: "Limit pro %{number} najednou stažených souborů je překročen" error_max_files_exceeded: "Limit pro %{number} najednou stažených souborů je překročen"
error_entry_project_does_not_match_current_project: Zadaný projekt neodpovídá aktuálnímu projektu error_entry_project_does_not_match_current_project: Zadaný projekt neodpovídá aktuálnímu projektu
notice_folder_created: Adresář byl vytvořen notice_folder_created: Složka byla vytvořena
error_folder_creation_failed: Vytváření složky selhalo error_folder_creation_failed: Vytváření složky selhalo
error_folder_title_must_be_entered: Musí být zadán název error_folder_title_must_be_entered: Musí být zadán název
notice_folder_deleted: Adresář byl smazán notice_folder_deleted: Složka byla smazána
error_folder_is_not_empty: Adresář není prázdný error_folder_is_not_empty: Složka není prázdná
error_folder_title_is_already_used: Název již existuje error_folder_title_is_already_used: Název již existuje
notice_folder_details_were_saved: Detaily složky byly uloženy notice_folder_details_were_saved: Detaily složky byly uloženy
error_folder_is_locked: Adresář je zamčen error_folder_is_locked: Složka je zamčena
error_file_is_locked: Soubor je zamčen error_file_is_locked: Soubor je zamčen
notice_file_deleted: Soubor byl smazán notice_file_deleted: Soubor byl smazán
error_at_least_one_revision_must_be_present: Musí existovat alespoň jedna revize error_at_least_one_revision_must_be_present: Musí existovat alespoň jedna revize
@ -94,11 +94,7 @@ cs:
label_email_body: Obsah label_email_body: Obsah
label_email_send: Odesláno label_email_send: Odesláno
title_notifications_active: Notifikace jsou aktivní title_notifications_active: Notifikace jsou aktivní
label_file_size: Velikost souboru label_upload_upload: Nahrát
heading_file_upload: Nahrát
note_uploaded_maximum_files_at_once: "Maximálně může být nahráno %{number} souborů najednou."
note_upload_files_greater_than_two_gb: Nahrání souborů větších než 2GB vyžaduje 64b prohlížeč.
submit_upload_files: Nahrání
heading_new_folder: Nová složka heading_new_folder: Nová složka
label_title: Název label_title: Název
label_description: Popis label_description: Popis
@ -109,7 +105,7 @@ cs:
select_option_deactivated: Deaktivováno select_option_deactivated: Deaktivováno
select_option_activated: Aktivováno select_option_activated: Aktivováno
label_title_format: Formát názvu label_title_format: Formát názvu
text_title_format: "Formát názvu souboru pro stažení (%t - název, %d - datum, %v - verze, %i - ID, %r - revize). Např.: %t_%v" text_title_format: "Formát názvu souboru pro stažení (%t - název, %f - soubor, %d - datum, %v - verze, %i - ID, %r - revize). Např.: %t_%v"
title_save_preferences: Uložit nastavení title_save_preferences: Uložit nastavení
heading_revisions: Revize heading_revisions: Revize
title_download: Stáhnout title_download: Stáhnout
@ -185,18 +181,18 @@ cs:
heading_access_last: Poslední heading_access_last: Poslední
label_dmsf_updated: Změněno label_dmsf_updated: Změněno
label_dmsf_downloaded: Staženo label_dmsf_downloaded: Staženo
title_total_size_of_all_files: Celková velikost všech souborů v adresáři title_total_size_of_all_files: Celková velikost všech souborů ve složce
project_module_dmsf: DMSF project_module_dmsf: DMSF
warning_no_project_to_copy_file_to: Neexistuje projekt, do kterého můžete kopírovat warning_no_project_to_copy_file_to: Neexistuje projekt, do kterého můžete kopírovat
comment_copied_from: "Zkopírováno z %{source}" comment_copied_from: "Zkopírováno z %{source}"
notice_file_copied: Soubor zkopírován notice_file_copied: Soubor zkopírován
notice_file_moved: Soubor přesunut notice_file_moved: Soubor přesunut
field_target_project: Cílový projekt field_target_project: Cílový projekt
field_target_folder: Cílový adresář field_target_folder: Cílová složka
title_copy_or_move: Kopírovat/Přesunout title_copy_or_move: Kopírovat/Přesunout
label_dmsf_folder_plural: Složky label_dmsf_folder_plural: Složky
comment_moved_from: "Přesunuto z %{source}" comment_moved_from: "Přesunuto z %{source}"
error_target_folder_same: Cílový adresář a projekt jsou stejné jako aktuální error_target_folder_same: Cílový složka a projekt jsou stejné jako aktuální
error_file_cannot_be_moved: Soubor nemůže být přesunut error_file_cannot_be_moved: Soubor nemůže být přesunut
error_file_cannot_be_copied: Soubor nemůže být zkopírován error_file_cannot_be_copied: Soubor nemůže být zkopírován
warning_no_project_to_copy_folder_to: Neexistuje projekt, do kterého můžete kopírovat warning_no_project_to_copy_folder_to: Neexistuje projekt, do kterého můžete kopírovat
@ -209,7 +205,7 @@ cs:
label_maximum_email_filesize: Maximální velikost souboru emailu label_maximum_email_filesize: Maximální velikost souboru emailu
header_minimum_filesize: Chyba souboru. header_minimum_filesize: Chyba souboru.
error_minimum_filesize: "Soubor %{file} má nulovou velikost a nebude přiložen." error_minimum_filesize: "Soubor %{file} má nulovou velikost a nebude přiložen."
parent_directory: Nadřazený adresář parent_directory: Nadřazená složka
note_webdav: "Webdav je po aktivaci k dispozici na %{protocol}://%{domain}/dmsf/webdav/[identifikátor projektu]" note_webdav: "Webdav je po aktivaci k dispozici na %{protocol}://%{domain}/dmsf/webdav/[identifikátor projektu]"
label_webdav: Webdav functionalita label_webdav: Webdav functionalita
label_dmsf_plural: "Kopíruj dokumenty a složky (%{files} souborů v %{folders} složkách)" label_dmsf_plural: "Kopíruj dokumenty a složky (%{files} souborů v %{folders} složkách)"
@ -219,7 +215,6 @@ cs:
warning_folder_not_locked: Složku nelze zamknout warning_folder_not_locked: Složku nelze zamknout
notice_folder_unlocked: Složka byla odemčena notice_folder_unlocked: Složka byla odemčena
error_only_user_that_locked_folder_can_unlock_it: Nemáte oprávnění k odemknutí této složky error_only_user_that_locked_folder_can_unlock_it: Nemáte oprávnění k odemknutí této složky
title_folder_parent_locked: "Nadřazená složka %{name} je zamčená"
title_unlock_folder: Odemknout title_unlock_folder: Odemknout
title_lock_folder: Zamknout title_lock_folder: Zamknout
@ -268,12 +263,12 @@ cs:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Schvalovací proces link_workflow: Schvalovací proces
notice_workflow_started: Schvalovací proces byl úspěšně zahájen notice_workflow_started: Schvalovací proces byl úspěšně zahájen
text_email_subject_approved: "Schvalovací proces %{name} schválen" text_email_subject_approved: schválen
text_email_subject_rejected: "Schvalovací proces %{name} zamítnut" text_email_subject_rejected: zamítnut
text_email_subject_delegated: "Schvalovací proces %{name} delegován" text_email_subject_delegated: delegován
text_email_subject_requires_approval: "Schvalovací proces %{name} očekává Vaše schválení" text_email_subject_requires_approval: očekává Vaše schválení
text_email_subject_updated: "Schvalovací proces %{name} aktualizován" text_email_subject_updated: aktualizován
text_email_subject_started: "Schvalovací proces %{name} spuštěn" text_email_subject_started: spuštěn
text_email_finished_approved: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl právě ukončen a dokument je schválen." text_email_finished_approved: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl právě ukončen a dokument je schválen."
text_email_finished_rejected: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl dokončen a dokument byl zamítnut, protože '%{notice}'." text_email_finished_rejected: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl dokončen a dokument byl zamítnut, protože '%{notice}'."
text_email_finished_delegated: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl delegován, protože '%{notice}' a od Vás se očekává schválení v aktuálním schvalovacím kroku." text_email_finished_delegated: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl delegován, protože '%{notice}' a od Vás se očekává schválení v aktuálním schvalovacím kroku."
@ -297,15 +292,15 @@ cs:
label_link_name: Název odkazu label_link_name: Název odkazu
label_link_external_url: URL label_link_external_url: URL
label_target_folder: Cílový adresář label_target_folder: Cílová složka
label_source_folder: Zdrojový adresář label_source_folder: Zdrojová složka
label_target_project: Cílový projekt label_target_project: Cílový projekt
label_source_project: Zdrojový projekt label_source_project: Zdrojový projekt
text_email_doc_updated_subject: "Dokumenty projektu %{project} aktualizovány" text_email_doc_updated_subject: Dokumenty aktualizovány
text_email_doc_updated: právě aktualizoval dokumenty projektu text_email_doc_updated: právě aktualizoval dokumenty projektu
text_email_doc_follows: takto text_email_doc_follows: takto
text_email_doc_deleted_subject: "Dokumenty projektu %{project} smazány" text_email_doc_deleted_subject: Dokumenty smazány
text_email_doc_deleted: právě smazal dokumety projektu text_email_doc_deleted: právě smazal dokumety projektu
label_links_only: pouze odkazy label_links_only: pouze odkazy
@ -316,10 +311,10 @@ cs:
link_trash_bin: Koš link_trash_bin: Koš
title_restore: Obnovit title_restore: Obnovit
notice_dmsf_file_restored: Document byl úspěšně obnoven notice_dmsf_file_restored: Document byl úspěšně obnoven
notice_dmsf_folder_restored: Adresář byl úspěšně obnoven notice_dmsf_folder_restored: Složka byla úspěšně obnovena
notice_dmsf_link_restored: Odkaz byl úspěšně obnoven notice_dmsf_link_restored: Odkaz byl úspěšně obnoven
title_restore_checked: Obnov vybrané title_restore_checked: Obnov vybrané
error_parent_folder: Nadřazený adresář neexistuje error_parent_folder: Nadřazená složka neexistuje
error_resource_or_parent_locked: Nelze zamknout - zdrojový nebo nadřazený objekt je zamčený error_resource_or_parent_locked: Nelze zamknout - zdrojový nebo nadřazený objekt je zamčený
error_parent_locked: Nelze zamknout - nadřazený objekt je zamčený error_parent_locked: Nelze zamknout - nadřazený objekt je zamčený
@ -327,10 +322,13 @@ cs:
error_lock_exclusively: Nelze zamknout již zamčený objekt error_lock_exclusively: Nelze zamknout již zamčený objekt
error_unlock_parent_locked: Nelze odemknout - nadřazený objekt je zamčený error_unlock_parent_locked: Nelze odemknout - nadřazený objekt je zamčený
my: field_dmsf_tree_view: Zobrazit složky jako stromovou strukturu
blocks: label_dmsf_version: Verze
locked_documents: Zamčené dokumenty
open_approvals: Procesy ke schválení locked_documents: Zamčené dokumenty
open_approvals: Procesy ke schválení
label_maximum_ajax_upload_filesize: Maximální velikost souboru nahratelná přes AJAX label_maximum_ajax_upload_filesize: Maximální velikost souboru nahratelná přes AJAX
note_maximum_ajax_upload_filesize: Omezuje velikost souboru, který může být nahrán přes standardní rozhraní AJAX, jinak se použije standarní rozhraní Redminu. Číslo je MB. note_maximum_ajax_upload_filesize: Omezuje velikost souboru, který může být nahrán přes standardní rozhraní AJAX, jinak se použije standardní rozhraní Redminu. Číslo je v MB.
label_classic: Klasický
label_drag_drop: "Drag&Drop"

View File

@ -4,7 +4,7 @@
# #
# Copyright (C) 2011 Terrence Miller # Copyright (C) 2011 Terrence Miller
# Copyright (C) 2013 Christian Wetting <christian.wetting@kontron.com> # Copyright (C) 2013 Christian Wetting <christian.wetting@kontron.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -94,11 +94,7 @@ de:
label_email_body: Text label_email_body: Text
label_email_send: Senden label_email_send: Senden
title_notifications_active: Benachrichtigungen sind aktiv title_notifications_active: Benachrichtigungen sind aktiv
label_file_size: Dateigröße label_upload: Upload
heading_file_upload: Upload
note_uploaded_maximum_files_at_once: "Es können maximal %{number} Dateien auf einmal hochgeladen werden."
note_upload_files_greater_than_two_gb: Um Dateien größer 2GB hochzuladen, brauchst du einen 64bit-Browser.
submit_upload_files: Upload
heading_new_folder: Neuer Ordner heading_new_folder: Neuer Ordner
label_title: Titel label_title: Titel
label_description: Beschreibung label_description: Beschreibung
@ -109,7 +105,7 @@ de:
select_option_deactivated: Aus select_option_deactivated: Aus
select_option_activated: Ein select_option_activated: Ein
label_title_format: Title format label_title_format: Title format
text_title_format: "Format des Dokumente-Titels für Speichern (%t - Titel, %d - Datum, %v - Version, %i - ID, %r - Revision). z.B.: %t_%v" text_title_format: "Format des Dokumente-Titels für Speichern (%t - Titel, %f - Datei, %d - Datum, %v - Version, %i - ID, %r - Revision). z.B.: %t_%v"
title_save_preferences: Einstellungen speichern title_save_preferences: Einstellungen speichern
heading_revisions: Versionen heading_revisions: Versionen
title_download: Download title_download: Download
@ -219,7 +215,6 @@ de:
warning_folder_not_locked: Der Ordner konnte nicht gesperrt werden warning_folder_not_locked: Der Ordner konnte nicht gesperrt werden
notice_folder_unlocked: Der Ordner wurde erfolgreich entsperrt notice_folder_unlocked: Der Ordner wurde erfolgreich entsperrt
error_only_user_that_locked_folder_can_unlock_it: Sie haben keine Berechtigung zur Entsperrung des Ordners error_only_user_that_locked_folder_can_unlock_it: Sie haben keine Berechtigung zur Entsperrung des Ordners
title_folder_parent_locked: "Übergeordnetes Verzeichnis %{name} ist gesperrt"
title_unlock_folder: Ordner zur Bearbeitung durch andere Benutzer entsperren title_unlock_folder: Ordner zur Bearbeitung durch andere Benutzer entsperren
title_lock_folder: Ordner zum Schutz vor Bearbeitung durch andere Benutzer sperren title_lock_folder: Ordner zum Schutz vor Bearbeitung durch andere Benutzer sperren
@ -268,12 +263,12 @@ de:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Workflow link_workflow: Workflow
notice_workflow_started: Genehmigungs-Workflow gestartet notice_workflow_started: Genehmigungs-Workflow gestartet
text_email_subject_approved: "Genehmigungs-Workflow %{name} genehmigt" text_email_subject_approved: genehmigt
text_email_subject_rejected: "Genehmigungs-Workflow %{name} abgelehnt" text_email_subject_rejected: abgelehnt
text_email_subject_delegated: "Genehmigungs-Workflow %{name} deligiert" text_email_subject_delegated: deligiert
text_email_subject_requires_approval: "Genehmigungs-Workflow %{name} benötigt deine Genehmigung" text_email_subject_requires_approval: benötigt deine Genehmigung
text_email_subject_updated: "Genehmigungs-Workflow %{name} bearbeitet" text_email_subject_updated: bearbeitet
text_email_subject_started: "Genehmigungs-Workflow %{name} gestartet" text_email_subject_started: gestartet
text_email_finished_approved: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' ist abgeschlossen und die Datei wurde genehmigt." text_email_finished_approved: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' ist abgeschlossen und die Datei wurde genehmigt."
text_email_finished_rejected: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' ist abgeschlossen, aber die Datei wurde abgelehnt, weil: '%{notice}'." text_email_finished_rejected: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' ist abgeschlossen, aber die Datei wurde abgelehnt, weil: '%{notice}'."
text_email_finished_delegated: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' wurde an dich deligiert, weil: '%{notice}' und weil deine Zustimmung im aktuellen Genehmigungsschritt benötigt wird." text_email_finished_delegated: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' wurde an dich deligiert, weil: '%{notice}' und weil deine Zustimmung im aktuellen Genehmigungsschritt benötigt wird."
@ -302,10 +297,10 @@ de:
label_target_project: Zielprojekt label_target_project: Zielprojekt
label_source_project: Quellprojekt label_source_project: Quellprojekt
text_email_doc_updated_subject: "Dokumente im Projekt %{project} wurden aktualisiert" text_email_doc_updated_subject: Dokumente wurden aktualisiert
text_email_doc_updated: hat folgende Dokumente bearbeitet text_email_doc_updated: hat folgende Dokumente bearbeitet
text_email_doc_follows: wie folgt text_email_doc_follows: wie folgt
text_email_doc_deleted_subject: "Dokumente im Projekt %{project} wurden gelöscht" text_email_doc_deleted_subject: Dokumente wurden gelöscht
text_email_doc_deleted: hat folgende Dokumente gelöscht text_email_doc_deleted: hat folgende Dokumente gelöscht
label_links_only: nur Verknüpfungen label_links_only: nur Verknüpfungen
@ -324,13 +319,16 @@ de:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Version
locked_documents: Gesperrte Dateien
open_approvals: Offene Genehmigungs-Workflows locked_documents: Gesperrte Dateien
open_approvals: Offene Genehmigungs-Workflows
label_maximum_ajax_upload_filesize: Maximale Dateigröße für den Upload via AJAX label_maximum_ajax_upload_filesize: Maximale Dateigröße für den Upload via AJAX
note_maximum_ajax_upload_filesize: Maximale Dateigröße für den Upload über die AJAX-Schnittstelle. Für größere Dateien muss der Standard-Uploader von Redmine verwendet werden. Angabe in MB. note_maximum_ajax_upload_filesize: Maximale Dateigröße für den Upload über die AJAX-Schnittstelle. Für größere Dateien muss der Standard-Uploader von Redmine verwendet werden. Angabe in MB.
label_classic: Klassisch
label_drag_drop: "Drag&Drop"

View File

@ -4,7 +4,7 @@
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -94,11 +94,7 @@ en:
label_email_body: Body label_email_body: Body
label_email_send: Send label_email_send: Send
title_notifications_active: Notifications active title_notifications_active: Notifications active
label_file_size: File size label_upload: Upload
heading_file_upload: Upload
note_uploaded_maximum_files_at_once: "There can be uploaded maximum of %{number} files at once."
note_upload_files_greater_than_two_gb: To upload files greater than 2GB you must have 64b browser.
submit_upload_files: Upload
heading_new_folder: New Folder heading_new_folder: New Folder
label_title: Title label_title: Title
label_description: Description label_description: Description
@ -109,7 +105,7 @@ en:
select_option_deactivated: Deactivated select_option_deactivated: Deactivated
select_option_activated: Activated select_option_activated: Activated
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
title_save_preferences: Save preferences title_save_preferences: Save preferences
heading_revisions: Revisions heading_revisions: Revisions
title_download: Download title_download: Download
@ -219,7 +215,6 @@ en:
warning_folder_not_locked: Unfortunately, the folder could not be locked warning_folder_not_locked: Unfortunately, the folder could not be locked
notice_folder_unlocked: The folder was successfully unlocked notice_folder_unlocked: The folder was successfully unlocked
error_only_user_that_locked_folder_can_unlock_it: You are not authorised to unlock this folder error_only_user_that_locked_folder_can_unlock_it: You are not authorised to unlock this folder
title_folder_parent_locked: "Parent folder %{name} is locked"
title_unlock_folder: Unlock to allow changes for other members title_unlock_folder: Unlock to allow changes for other members
title_lock_folder: Lock to prevent changes for other members title_lock_folder: Lock to prevent changes for other members
@ -268,12 +263,12 @@ en:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Workflow link_workflow: Workflow
notice_workflow_started: Approval workflow successfully started notice_workflow_started: Approval workflow successfully started
text_email_subject_approved: "Approval workflow %{name} approved" text_email_subject_approved: approved
text_email_subject_rejected: "Approval workflow %{name} rejected" text_email_subject_rejected: rejected
text_email_subject_delegated: "Approval workflow %{name} delegated" text_email_subject_delegated: delegated
text_email_subject_requires_approval: "Approval workflow %{name} requires your approval" text_email_subject_requires_approval: requires your approval
text_email_subject_updated: "Approval workflow %{name} updated" text_email_subject_updated: updated
text_email_subject_started: "Approval workflow %{name} started" text_email_subject_started: started
text_email_finished_approved: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been approved." text_email_finished_approved: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been approved."
text_email_finished_rejected: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been rejected because of '%{notice}'." text_email_finished_rejected: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been rejected because of '%{notice}'."
text_email_finished_delegated: "The approval workflow '%{name}' assigned to '%{filename}' document has just been delegated because of '%{notice}' and you are expected to do an approval in the current approval step." text_email_finished_delegated: "The approval workflow '%{name}' assigned to '%{filename}' document has just been delegated because of '%{notice}' and you are expected to do an approval in the current approval step."
@ -302,10 +297,10 @@ en:
label_target_project: Target project label_target_project: Target project
label_source_project: Source project label_source_project: Source project
text_email_doc_updated_subject: "Documents of %{project} updated" text_email_doc_updated_subject: Documents updated
text_email_doc_updated: has just actualized documents of text_email_doc_updated: has just actualized documents of
text_email_doc_follows: as follows text_email_doc_follows: as follows
text_email_doc_deleted_subject: "Documents of %{project} deleted" text_email_doc_deleted_subject: Documents deleted
text_email_doc_deleted: has just deleted documents of text_email_doc_deleted: has just deleted documents of
label_links_only: links only label_links_only: links only
@ -324,13 +319,16 @@ en:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Version
locked_documents: Locked documents
openap_provals: Open approvals locked_documents: Locked documents
open_approvals: Open approvals
label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX
note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB. note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB.
label_classic: Classic
label_drag_drop: "Drag&Drop"

View File

@ -4,7 +4,7 @@
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2015 Agustin Ivorra <agustinivorra@gmail.com> # Copyright (C) 2015 Agustin Ivorra <agustinivorra@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -94,11 +94,7 @@ es:
label_email_body: Cuerpo de Mensaje label_email_body: Cuerpo de Mensaje
label_email_send: Enviar label_email_send: Enviar
title_notifications_active: Activar Notificaciones title_notifications_active: Activar Notificaciones
label_file_size: Tamaño de Archivo label_upload: Subir
heading_file_upload: Subir
note_uploaded_maximum_files_at_once: "El número máximo de una subida de archivos es %{number}."
note_upload_files_greater_than_two_gb: Para subir archivos mayores a 2GB debe tener un navegador web de 64bits.
submit_upload_files: Subir
heading_new_folder: Nuevo directorio heading_new_folder: Nuevo directorio
label_title: Título label_title: Título
label_description: Descripción label_description: Descripción
@ -109,7 +105,7 @@ es:
select_option_deactivated: Desactivado select_option_deactivated: Desactivado
select_option_activated: Activado select_option_activated: Activado
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
title_save_preferences: Guardar Preferencias title_save_preferences: Guardar Preferencias
heading_revisions: Revisiones heading_revisions: Revisiones
title_download: Descargar title_download: Descargar
@ -219,7 +215,6 @@ es:
warning_folder_not_locked: Desafortunadamente, el directorio no se pudo bloquear warning_folder_not_locked: Desafortunadamente, el directorio no se pudo bloquear
notice_folder_unlocked: El directorio se desbloqueó exitosamente notice_folder_unlocked: El directorio se desbloqueó exitosamente
error_only_user_that_locked_folder_can_unlock_it: No está autorizado para desbloquearel directorio error_only_user_that_locked_folder_can_unlock_it: No está autorizado para desbloquearel directorio
title_folder_parent_locked: "Directorio padre %{name} está bloqueado"
title_unlock_folder: Desbloquear para que sea editado por otros miembros title_unlock_folder: Desbloquear para que sea editado por otros miembros
title_lock_folder: Bloquear para evitar que sea editado por otros miembros title_lock_folder: Bloquear para evitar que sea editado por otros miembros
@ -268,12 +263,12 @@ es:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Flujo de Trabajo link_workflow: Flujo de Trabajo
notice_workflow_started: "Flujo de trabajo de aprobación iniciado satisfactoriamente" notice_workflow_started: "Flujo de trabajo de aprobación iniciado satisfactoriamente"
text_email_subject_approved: "Flujo de trabajo de aprobación %{name} aprobado" text_email_subject_approved: aprobado
text_email_subject_rejected: "Flujo de trabajo de aprobación %{name} rechazado" text_email_subject_rejected: rechazado
text_email_subject_delegated: "Flujo de trabajo de aprobación %{name} delegado" text_email_subject_delegated: delegado
text_email_subject_requires_approval: "Flujo de trabajo de aprobación %{name} requiere su aprobación" text_email_subject_requires_approval: requiere su aprobación
text_email_subject_updated: "Flujo de trabajo de aprobación %{name} actualizado" text_email_subject_updated: actualizado
text_email_subject_started: "Flujo de trabajo de aprobación %{name} comenzado" text_email_subject_started: comenzado
text_email_finished_approved: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de ser terminado y él ha sido aprobado." text_email_finished_approved: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de ser terminado y él ha sido aprobado."
text_email_finished_rejected: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de ser terminado y él ha sido rechazado por el siguiente motivo '%{notice}'." text_email_finished_rejected: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de ser terminado y él ha sido rechazado por el siguiente motivo '%{notice}'."
text_email_finished_delegated: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de ser delegado por '%{notice}' y se espera que haga una aprobación en la etapa de aprobación actual." text_email_finished_delegated: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de ser delegado por '%{notice}' y se espera que haga una aprobación en la etapa de aprobación actual."
@ -302,10 +297,10 @@ es:
label_target_project: Proyecto destino label_target_project: Proyecto destino
label_source_project: Proyecto fuente label_source_project: Proyecto fuente
text_email_doc_updated_subject: "Documentos de %{project} actualizados" text_email_doc_updated_subject: Documentos actualizados
text_email_doc_updated: acaba de actualizar los ducumentos de text_email_doc_updated: acaba de actualizar los ducumentos de
text_email_doc_follows: lo siguiente text_email_doc_follows: lo siguiente
text_email_doc_deleted_subject: "Documentos de %{project} eliminados" text_email_doc_deleted_subject: Documentos eliminados
text_email_doc_deleted: acaba de eliminar documentos de text_email_doc_deleted: acaba de eliminar documentos de
label_links_only: Solo enlaces label_links_only: Solo enlaces
@ -324,13 +319,16 @@ es:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Versión
locked_documents: Documentos bloqueados
open_approvals: Aprobaciones abiertas locked_documents: Documentos bloqueados
open_approvals: Aprobaciones abiertas
label_maximum_ajax_upload_filesize: "El máximo tamaño de archivo para subir por AJAX" label_maximum_ajax_upload_filesize: "El máximo tamaño de archivo para subir por AJAX"
note_maximum_ajax_upload_filesize: "El límite máximo de tamaño de archivo que puede ser subido por la interfaz AJAX estandar, de lo contrario se debe utilizar el formulario estandar de Redmine. El número es en MB." note_maximum_ajax_upload_filesize: "El límite máximo de tamaño de archivo que puede ser subido por la interfaz AJAX estandar, de lo contrario se debe utilizar el formulario estandar de Redmine. El número es en MB."
label_classic: Classic
label_drag_drop: "Drag&Drop"

View File

@ -2,10 +2,10 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2014 Atmis # Copyright (C) 2014 Atmis
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 # as published by the Free Software Foundation; either version 2
@ -94,11 +94,7 @@ fr:
label_email_body: Message label_email_body: Message
label_email_send: Envoyer label_email_send: Envoyer
title_notifications_active: Notifications actives title_notifications_active: Notifications actives
label_file_size: Taille du fichier label_upload: Transmission
heading_file_upload: Déposer des fichiers
note_uploaded_maximum_files_at_once: "Seulement %{number} fichiers peuvent être déposés à la fois."
note_upload_files_greater_than_two_gb: "Afin de transmettre des fichiers de plus de 2Go, l'utilisation d'un navigateur de 64Bits est nécessaire."
submit_upload_files: Transmission
heading_new_folder: Nouveau Dossier heading_new_folder: Nouveau Dossier
label_title: Titre label_title: Titre
label_description: Description label_description: Description
@ -109,7 +105,7 @@ fr:
select_option_deactivated: Désactivé select_option_deactivated: Désactivé
select_option_activated: Activé select_option_activated: Activé
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
title_save_preferences: Enregistrer les préférences title_save_preferences: Enregistrer les préférences
heading_revisions: Révisions heading_revisions: Révisions
title_download: Télécharger title_download: Télécharger
@ -219,7 +215,6 @@ fr:
warning_folder_not_locked: Echec du verrouillage du dossier warning_folder_not_locked: Echec du verrouillage du dossier
notice_folder_unlocked: Le dossier a été déverrouillé notice_folder_unlocked: Le dossier a été déverrouillé
error_only_user_that_locked_folder_can_unlock_it: "Vous n'êtes autorisé à déverrouiller ce dossier" error_only_user_that_locked_folder_can_unlock_it: "Vous n'êtes autorisé à déverrouiller ce dossier"
title_folder_parent_locked: "Le dossier parent %{name} verrouillé"
title_unlock_folder: Déverrouiller afin de permettre la modification par les membres du projet title_unlock_folder: Déverrouiller afin de permettre la modification par les membres du projet
title_lock_folder: "Verrouiller afin d'empêcher les modifications du dossier" title_lock_folder: "Verrouiller afin d'empêcher les modifications du dossier"
@ -268,12 +263,12 @@ fr:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Flux link_workflow: Flux
notice_workflow_started: Flux de validation démarré avec succès notice_workflow_started: Flux de validation démarré avec succès
text_email_subject_approved: "Flux de validation %{name} approuvé" text_email_subject_approved: approuvé
text_email_subject_rejected: "Flux de validation %{name} rejeté" text_email_subject_rejected: rejeté
text_email_subject_delegated: "Flux de validation %{name} délégué" text_email_subject_delegated: délégué
text_email_subject_requires_approval: "Flux de validation %{name} requiert votre approbation" text_email_subject_requires_approval: requiert votre approbation
text_email_subject_updated: "Flux de validation %{name} mis à jour" text_email_subject_updated: mis à jour
text_email_subject_started: "Flux de validation %{name} démarré" text_email_subject_started: démarré
text_email_finished_approved: "Le flux de validation '%{name}' assigné au document '%{filename}' vient de se terminer et le document a été approuvé." text_email_finished_approved: "Le flux de validation '%{name}' assigné au document '%{filename}' vient de se terminer et le document a été approuvé."
text_email_finished_rejected: "Le flux de validation '%{name}' assigné au document '%{filename}' vient de se terminer et le document a été rejeté pour la raison '%{notice}'." text_email_finished_rejected: "Le flux de validation '%{name}' assigné au document '%{filename}' vient de se terminer et le document a été rejeté pour la raison '%{notice}'."
text_email_finished_delegated: "Le flux de validation '%{name}' assigné au document '%{filename}' a été délégué pour la raison '%{notice}' et vous êtes tenu d'approuver l'étape actuelle." text_email_finished_delegated: "Le flux de validation '%{name}' assigné au document '%{filename}' a été délégué pour la raison '%{notice}' et vous êtes tenu d'approuver l'étape actuelle."
@ -302,10 +297,10 @@ fr:
label_target_project: Projet cible label_target_project: Projet cible
label_source_project: Projet source label_source_project: Projet source
text_email_doc_updated_subject: "Documents de %{project} mis à jour" text_email_doc_updated_subject: Documents mis à jour
text_email_doc_updated: a mis à jour des documents de text_email_doc_updated: a mis à jour des documents de
text_email_doc_follows: comme suit text_email_doc_follows: comme suit
text_email_doc_deleted_subject: "Documents de %{project} supprimés" text_email_doc_deleted_subject: Documents supprimés
text_email_doc_deleted: a supprimé des documents de text_email_doc_deleted: a supprimé des documents de
label_links_only: liens seulement label_links_only: liens seulement
@ -324,13 +319,16 @@ fr:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Version
locked_documents: Documents verrouillés
open_approvals: Approbations en attente locked_documents: Documents verrouillés
open_approvals: Approbations en attente
label_maximum_ajax_upload_filesize: Taille maximale de fichier pour téléversement via AJAX label_maximum_ajax_upload_filesize: Taille maximale de fichier pour téléversement via AJAX
note_maximum_ajax_upload_filesize: "Taille maximale, en méga octets, de fichier pour téléversement via l'interface standard AJAX. Sinon l'interface standard de Redmine doit être utilisée." note_maximum_ajax_upload_filesize: "Taille maximale, en méga octets, de fichier pour téléversement via l'interface standard AJAX. Sinon l'interface standard de Redmine doit être utilisée."
label_classic: Classic
label_drag_drop: "Drag&Drop"

334
config/locales/it.yml Normal file
View File

@ -0,0 +1,334 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
it: # Italian strings thx 2 Matteo Arceci!
dmsf: DMSF
label_dmsf_file_plural: Documenti
label_dmsf_file_revision_plural: Revisioni al documento
label_dmsf_file_revision_access_plural: Accessi al documento
warning_no_entries_selected: Nessun documento selezionato
error_email_to_must_be_entered: Deve essere inserito l'indirizzo email
warning_file_already_locked: Documento già bloccato
notice_file_locked: Documento bloccato
warning_file_not_locked: Documento non bloccato
notice_file_unlocked: Documento sbloccato
error_only_user_that_locked_file_can_unlock_it: Solo chi ha bloccato il documento può sbloccarlo
error_max_files_exceeded: "Superato il limite di %{number} documenti per il download simultaneo"
error_entry_project_does_not_match_current_project: "Il progetto non corrisponde al progetto corrente"
notice_folder_created: Cartella creata
error_folder_creation_failed: Creazione cartella fallita
error_folder_title_must_be_entered: Deve essere inserito il titolo
notice_folder_deleted: Cartella cancellata
error_folder_is_not_empty: La cartella non è vuota
error_folder_title_is_already_used: Il titolo è già in uso
notice_folder_details_were_saved: I dettagli della cartella sono stati salvati
error_folder_is_locked: La cartella è bloccata
error_file_is_locked: Il documento è bloccato
notice_file_deleted: Il documento è stato cancellato
error_at_least_one_revision_must_be_present: Deve essere presente almeno una revisione
notice_revision_deleted: Revisione cancellata
warning_one_of_files_locked: Uno dei documenti è bloccato
notice_file_unlocked: Documento sbloccato
notice_file_revision_created: Revisione del documento creata
notice_your_preferences_were_saved: Le tue preferenze sono state salvate
notice_your_preferences_were_not_saved: Le tue preferenze non sono state salvate
warning_folder_notifications_already_activated: La notifica su cartella è già attiva
notice_folder_notifications_activated: La notifica su cartella è stata attivata
warning_folder_notifications_already_deactivated: La notifica su cartella è già disattiva
notice_folder_notifications_deactivated: La notifica su cartella è stat disattivata
warning_file_notifications_already_activated: La notifica su documento è già attiva
notice_file_notifications_activated: La notifica su documento è stata attivata
warning_file_notifications_already_deactivated: La notifica su documento è già disattiva
notice_file_notifications_deactivated: La notifica su documento è disattiva
link_details: "%{title} dettagli"
link_edit: "Modifica %{title}"
submit_create: Creato
link_create_folder: Creata cartella
title_check_uncheck_all_for_zip_download_or_email: Seleziona/Deseleziona tutto per lo zip, download o email
title_check_uncheck_all_for_restore_or_delete: Seleziona/Deseleziona tutto per ripristinare o cancellare
link_title: Nome documento
link_size: Dimensioni
link_modified: Modificato
link_ver: Ver.
link_author: Autore
title_check_for_zip_download_or_email: Seleziona per zip, download o email
title_check_for_restore_or_delete: Seleziona per ripristinare o cancellare
title_delete: Cancella
title_notifications_active_deactivate: "Notifiche attive: Disattiva"
title_notifications_not_active_activate: "Notifiche disattivate: Attiva"
title_title_version_version_download: "%{title} versione %{version} download"
title_locked_by_user: "Bloccato da %{user}"
title_locked_by_you: Bloccato da te
title_waiting_for_approval: In attesa di Approvazione
title_approved: Approvato
title_unlock_file: Sblocca per consentire modifiche degli altri membri
title_lock_file: Blocca per evitare modifiche degli altri membri
title_download_checked: Download selezionati in archivio Zip
title_send_checked_by_email: Selezionati spediti per email
link_user_preferences: Le tue preferenze DMSF di progetto
heading_send_documents_by_email: Documenti spediti per email
label_email_from: Da
label_email_to: A
label_email_cc: CC
label_email_subject: Oggetto
label_email_documents: Documenti
label_email_body: Corpo
label_email_send: Spedisci
title_notifications_active: Notifiche attive
label_upload: Carica
heading_new_folder: Nuova cartella
label_title: Titolo
label_description: Descrizione
submit_save: Salva
info_file_locked: Documento bloccato!
label_notifications: Notifiche
select_option_default: Default
select_option_deactivated: Disattivato
select_option_activated: Attivato
label_title_format: Titolo formattato
text_title_format: "Titolo del documento formattato per il download (%t - titolo, %d - data, %v - versione, %i - ID, %r - revisione). Esempio: %t_%v"
title_save_preferences: Salva preferenze
heading_revisions: Revisioni
title_download: Download
title_delete_revision: Cancella revisione
label_created: Creato
label_changed: Modificato
info_changed_by_user: "%{changed} da"
label_filename: Nome file
label_mime: Mime
label_size: Dimensioni
heading_new_revision: Nuova revisione
option_version_same: Stessa
option_version_minor: Miniore
option_version_major: Maggiore
option_version_custom: Personalizzata
label_new_content: Nuovo contenuto
label_maximum_files_upload: Limite di caricamento
note_maximum_number_of_files_uploaded: Limita il numero massimo di documenti caricati alla volta. 0 significa senza limiti.
label_maximum_files_download: Numero massimo di documenti scaricabili
note_maximum_number_of_files_downloaded: Limita il numero massimo di documenti scaricabili in archivio zip o spediti via email. 0 significa senza limiti.
label_file_storage_directory: Cartella dei documenti
label_index_database: Indice database
label_stemming_language: Linguaggio di Stemming
note_possible_values: Valori possibili
note_pass_none_to_disable_stemming: "passa 'nulla' per disabilitare lo stemming"
label_stem_strategy: Strategia dello Stem
option_stem_none: Stem nulla (default)
option_stem_some: Stem qualcosa
option_stem_all: Stem tutto
label_stemming_description: Questo controlla come il parser delle query applica l'algoritmo di Stemming. Il valore di default è STEM_NONE. I valori possibili sono
note_do_not_stem: "Non fare alcun stemming."
note_stem_some: Cerca per termini 'Stemmed' ad eccezione di quelli che iniziano con la lettera maiuscola, o sono seguiti da alcuni caratteri, o vengono utilizzati con gli operatori che hanno bisogno di informazioni di posizione. I termini 'Stemmed' hanno il prefisso 'Z'.
note_stem_all: "Cerca per termini 'Stemmed' di tutte le parole (nota: non viene aggiunto alcun prefisso 'Z')."
note_stemming_applied: Si noti che l'algoritmo di 'Stemming' viene applicato solo alle parole nei campi probabilistici - termini con filtro booleano non sono compresi.
label_default_notifications: Notifica di default dei documenti
heading_uploaded_files: Documenti caricati
submit_commit: Invia/Salva
link_documents: Documenti
permission_view_dmsf_file_revision_accesses: Visualizza i download nel flusso di attività
permission_view_dmsf_file_revisions: Visualizza le revisioni nel flusso di attività
permission_view_dmsf_folders: Sfoglia i documenti
permission_user_preferences: Preferenze
permission_view_dmsf_files: Visualizza i documenti
permission_folder_manipulation: Modifica la cartella
permission_file_manipulation: Modifica il documento
permission_force_file_unlock: Forza lo sblocco del documento
permission_manage_workflows: Gestisci i flussi di lavoro
permission_file_delete: Elimina i documenti
label_file: Documento
field_folder: Cartella
error_create_cycle_in_folder_dependency: crea un ciclo nella dipendenza della cartella
error_contains_invalid_character: contiene carattere(i) non validi
error_file_commit_require_uploaded_file: L'aggiornamento del documento richiede un documento già caricato in precedenza
warning_some_files_were_not_commited: "Alcuni documenti non sono stati aggiornati a causa di errori di validazione: %{files}"
error_user_has_not_right_delete_folder: "L'utente non ha i diritti per eliminare le cartelle"
error_user_has_not_right_delete_file: "L'utente non ha i diritti per eliminare il documento"
notice_entries_deleted: Voci eliminate
warning_some_entries_were_not_deleted: "Alcune voci non sono state eliminate: %{entries}"
title_delete_checked: Elimina i selezionati
title_items: elementi
title_filename_for_download: Nome file utilizzato per il download o nell'archivio Zip
label_number_of_folders: Cartelle
label_number_of_documents: Documenti
error_file_storage_directory_does_not_exist: "La cartella di archiviazione non esiste e non può essere creata"
error_file_can_not_be_created: "Il documento non può essere creato nella cartella di archiviazione"
error_wrong_zip_encoding: Errato encoding dello Zip
warning_xapian_not_available: Xapian non disponibile
menu_dmsf: Documenti
label_physical_file_delete: File fisico eliminato
user_is_not_project_member: Non sei un membro del progetto
heading_access_downloads_emails: Downloads/Emails
heading_access_first: Primo
heading_access_last: Ultimo
label_dmsf_updated: Aggiornato
label_dmsf_downloaded: Scaricato
title_total_size_of_all_files: Dimensione totale di tutti i files in questa cartella
project_module_dmsf: DMSF
warning_no_project_to_copy_file_to: Nessun progetto nel quale copiare il documento
comment_copied_from: "Copiato da %{source}"
notice_file_copied: Documento copiato
notice_file_moved: Documento spostato
field_target_project: Progetto di destinazione
field_target_folder: Cartella di destinazione
title_copy_or_move: Copia/Sposta
label_dmsf_folder_plural: Cartelle
comment_moved_from: "Spostato da %{source}"
error_target_folder_same: La cartella di destinazione ed il progetto sono gli stessi di adesso
error_file_cannot_be_moved: "Il documento non può essere spostato"
error_file_cannot_be_copied: "Il documento non può essere copiato"
warning_no_project_to_copy_folder_to: Nessun progetto dove copiare la cartella
title_copy: Copia
error_folder_cannot_be_copied: "La cartella non può essere copiata"
notice_folder_copied: Cartella copiata
error_max_email_filesize_exceeded: "Hai superato la dimensione massima del file per l'invio tramite e-mail. (%{number} MB)"
note_maximum_email_filesize: Limiti di dimensione massima dei file che possono essere inviati via e-mail. 0 significa illimitato. Il numero è in MB.
label_maximum_email_filesize: Dimensione massima degli allegati delle e-mail
header_minimum_filesize: Errore file.
error_minimum_filesize: "Il file %{file} è 0 bytes e non sarà allegato."
parent_directory: Cartella superiore
note_webdav: "Una volta abilitato il Webdav può essere contattato sul percorso %{protocol}://%{domain}/dmsf/webdav/[project identifier]"
label_webdav: Funzionalità Webdav
label_dmsf_plural: "Copia documenti e cartelle (%{files} documenti in %{folders} cartelle)"
warning_folder_already_locked: Questa cartella è già bloccata
notice_folder_locked: La cartella è stata bloccata
warning_folder_not_locked: Purtroppo la cartella non può essere bloccata
notice_folder_unlocked: La cartella è stata sbloccata
error_only_user_that_locked_folder_can_unlock_it: Non sei autorizzato a sbloccare questa cartella
title_unlock_folder: Sblocca per consentire modifiche agli altri membri
title_lock_folder: Blocca per evitare modifiche da parte di altri membri
select_option_webdav_readonly: Sola lettura
select_option_webdav_readwrite: Lettura/Scrittura
label_webdav_strategy: Strategia Webdav
note_webdav_strategy: Abilita l'amministratore a decidere se Webdav è di sola lettura oppure lettura-scrittura per gli utenti finali.
error_unable_delete_dmsf_workflow: Impossibile eliminare il flusso di lavoro
error_empty_note: "La nota non può essere vuota"
error_workflow_assign: C'è stato un errore durante l'assegnazione
error_cannot_start_workflow: "Il flusso di lavoro non può partire"
error_cannot_renumber_steps: "I passi non possono essere numerati"
label_dmsf_workflow_new: Nuova 'approvazione di flusso di lavoro'
field_label_dmsf_workflow: Approvazione di flusso di lavoro
field_label_dmsf_workflow_name: Nome per l'approvazione di flusso di lavoro
label_dmsf_workflow_plural: Approvazioni flusso di lavoro
label_dmsf_workflow_plural_num: Approvazioni flusso di lavoro (%{count})
label_dmsf_workflow_step: Passo
label_dmsf_workflow_step_plural: Passi
label_dmsf_workflow_approval: Approvazione
label_dmsf_workflow_approval_plural: Approvazioni
label_dmsf: DMSF
label_dmsf_wokflow_action_approve: Approva
label_dmsf_wokflow_action_reject: Rifiuta
label_dmsf_wokflow_action_delegate: Delega a
label_dmsf_wokflow_action_assign: Assegna un 'approvazione di flusso di lavoro'
label_dmsf_wokflow_action_start: Inizia un flusso di lavoro
label_dmsf_workflow_add_approver: "Aggiungi un nuovo approvatore con funzioni logiche:"
label_or: oppure
label_action: Azione
label_note: Note
title_none: Nessuno
title_rejection: Rifiuto
title_delegation: Delega
title_assignment: Assegnazione
title_start: Inizio
title_dmsf_workflow_log: Log di approvazione di flusso di lavoro
title_assigned: Assegnato
title_approval: Approvazione
title_rejected: Rifiutato
dmsf_and: AND
dmsf_or: OR
dmsf_new_step: Nuovo passo
message_dmsf_wokflow_note: La tua nota...
info_revision: "r%{rev}"
link_workflow: Flusso di lavoro
notice_workflow_started: Approvazione di flusso di lavoro inizializzato
text_email_subject_approved: "Approvazione di flusso di lavoro %{name} approvato"
text_email_subject_rejected: "Approvazione di flusso di lavoro %{name} rifiutato"
text_email_subject_delegated: "Approvazione di flusso di lavoro %{name} delegato"
text_email_subject_requires_approval: "Approvazione di flusso di lavoro %{name} richiede la tua approvazione"
text_email_subject_updated: "Approvazione di flusso di lavoro %{name} aggiornato"
text_email_subject_started: "Approvazione di flusso di lavoro %{name} inizializzato"
text_email_finished_approved: "L'approvazione di flusso di lavoro '%{name}' assegnato a '%{filename}' è stata completata ed il documento è stato approvato."
text_email_finished_rejected: "L'approvazione di flusso di lavoro '%{name}' assegnato a '%{filename}' è stata completata ma il documento è stato rifiutato a causa di '%{notice}'."
text_email_finished_delegated: "L'approvazione di flusso di lavoro '%{name}' assegnato a '%{filename}' è stata delegata a causa di '%{notice}' e sei tenuto ad approvare nel passo corrente."
text_email_finished_step: "L'approvazione di flusso di lavoro '%{name}' assegnato a '%{filename}' ha completato uno dei passi di approvazione e sei tenuto ad approvare il prossimo passo."
text_email_finished_step_short: "L'approvazione di flusso di lavoro '%{name}' assegnato a '%{filename}' ha completato uno dei passi di approvazione."
text_email_started: "L'approvazione di flusso di lavoro '%{name}' assegnato a '%{filename}' è stato inizializzato e sei tenuto ad approvare il passo corrente."
text_email_to_proceed: Per proseguire clicca sull'icona checkbox a fianco del documento
text_email_to_see_history: Per vedere la storia di approvazione clicca sullo stato del flusso di lavoro del documento
text_email_to_see_status: Per vedere lo stato attuale del flusso di lavoro di approvazione clicca sullo stato del flusso di lavoro del documento
label_my_open_approvals: Le mie approvazioni aperte
label_my_locked_documents: I miei documenti bloccati
title_create_link: Crea un collegamento
label_link_from: Collegamento da
label_link_to: Collegamento a
label_notifications_on: Attiva notifiche
label_notifications_off: Disattiva notifiche
field_target_file: Scarica sorgente
title_download_entries: Scarica documenti
label_external: Esterno
label_link_name: Nome del collegamento
label_link_external_url: URL
label_target_folder: Cartella di destinazione
label_source_folder: Cartella sorgente
label_target_project: Progetto di destinazione
label_source_project: Progetto sorgente
text_email_doc_updated_subject: "Documenti del progetto %{project} caricati"
text_email_doc_updated: ha documenti appena attualizzati
text_email_doc_follows: come segue
text_email_doc_deleted_subject: "Documenti del progetto %{project} cancellati"
text_email_doc_deleted: ha documenti appena eliminati
label_links_only: solo colegamenti
label_display_notified_recipients: Visualizza i destinatari notificati
note_display_notified_recipients: L'utente sarà informato di tutti i destinatari appena inviato la notifica e-mail.
warning_email_notifications: "Notifica email inviata a %{to}"
link_trash_bin: Cestino
title_restore: Ripristina
notice_dmsf_file_restored: Il documento è stato ripristinato correttamente
notice_dmsf_folder_restored: La cartella è stata ripristinata correttamente
notice_dmsf_link_restored: Il collegamento è stato ripristinato correttamente
title_restore_checked: Ripristina selezionati
error_parent_folder: "La cartella padre non esiste"
error_resource_or_parent_locked: Impossibile completare il blocco - la risorsa (o superiore) è bloccata
error_parent_locked: Impossibile completare il blocco - la risorsa superiore è bloccata
error_resource_locked: Impossibile completare il blocco - la risorsa è bloccata
error_lock_exclusively: impossibile bloccare in modo esclusivo una risorsa già bloccata
error_unlock_parent_locked: Sblocco fallito - la risorsa superiore è bloccata
field_dmsf_tree_view: Navigate folders in a tree
label_dmsf_version: Version
locked_documents: Documenti bloccati
open_approvals: Approvazioni aperte
label_maximum_ajax_upload_filesize: Dimensione massima dei documenti caricabili tramite AJAX
note_maximum_ajax_upload_filesize: Limita la dimensione massima dei documenti che possono essere caricati tramite interfaccia standard AJAX altrimenti sarà necessario utilizzare il modulo standard di Redmine. Il numero è espresso in MB.
label_classic: Classic
label_drag_drop: "Drag&Drop"

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
@ -94,11 +94,7 @@ ja:
label_email_body: 本文 label_email_body: 本文
label_email_send: 送信 label_email_send: 送信
title_notifications_active: 通知は有効です title_notifications_active: 通知は有効です
label_file_size: ファイルサイズ label_upload: アップロード
heading_file_upload: アップロード
note_uploaded_maximum_files_at_once: "最大 %{number} ファイルを一度にアップロードすることができます。"
note_upload_files_greater_than_two_gb: 2GB より大きいファイルをアップロードするには 64bit 対応ブラウザが必要です。
submit_upload_files: アップロード
heading_new_folder: 新規フォルダ heading_new_folder: 新規フォルダ
label_title: タイトル label_title: タイトル
label_description: 説明 label_description: 説明
@ -109,7 +105,7 @@ ja:
select_option_deactivated: 無効 select_option_deactivated: 無効
select_option_activated: 有効 select_option_activated: 有効
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
title_save_preferences: 設定を保存します title_save_preferences: 設定を保存します
heading_revisions: リビジョン heading_revisions: リビジョン
title_download: ダウンロードします title_download: ダウンロードします
@ -158,7 +154,6 @@ ja:
permission_force_file_unlock: ファイルの強制ロック解除 permission_force_file_unlock: ファイルの強制ロック解除
permission_manage_workflows: ワークフロー管理 permission_manage_workflows: ワークフロー管理
permission_file_delete: ファイルの削除 permission_file_delete: ファイルの削除
permission_file_approval: ファイルの承認
label_file: ファイル label_file: ファイル
field_folder: フォルダ field_folder: フォルダ
error_create_cycle_in_folder_dependency: フォルダの依存関係が循環しています error_create_cycle_in_folder_dependency: フォルダの依存関係が循環しています
@ -220,7 +215,6 @@ ja:
warning_folder_not_locked: "フォルダをロックすることができませんでした" warning_folder_not_locked: "フォルダをロックすることができませんでした"
notice_folder_unlocked: "フォルダのロックを解除しました" notice_folder_unlocked: "フォルダのロックを解除しました"
error_only_user_that_locked_folder_can_unlock_it: "このフォルダのロックを解除する権限がありません" error_only_user_that_locked_folder_can_unlock_it: "このフォルダのロックを解除する権限がありません"
title_folder_parent_locked: "親フォルダ %{name} はロックされています"
title_unlock_folder: "ロックを解除し他メンバが更新できるようにします" title_unlock_folder: "ロックを解除し他メンバが更新できるようにします"
title_lock_folder: "ロックし他メンバとの競合を回避します" title_lock_folder: "ロックし他メンバとの競合を回避します"
@ -269,12 +263,12 @@ ja:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: ワークフロー link_workflow: ワークフロー
notice_workflow_started: 承認ワークフローが開始されました notice_workflow_started: 承認ワークフローが開始されました
text_email_subject_approved: "承認ワークフロー '%{name}' は承認されました" text_email_subject_approved: は承認されました
text_email_subject_rejected: "承認ワークフロー '%{name}' は否認されました" text_email_subject_rejected: は否認されました
text_email_subject_delegated: "承認ワークフロー '%{name}' は代理承認が設定されました" text_email_subject_delegated: は代理承認が設定されました
text_email_subject_requires_approval: "承認ワークフロー '%{name}' はあなたの承認待ちです" text_email_subject_requires_approval: はあなたの承認待ちです
text_email_subject_updated: "承認ワークフロー '%{name}' が更新されました" text_email_subject_updated: が更新されました
text_email_subject_started: "承認ワークフロー '%{name}' が開始されました" text_email_subject_started: が開始されました"
text_email_finished_approved: "承認ワークフロー '%{name}' において '%{filename}' が承認されました。" text_email_finished_approved: "承認ワークフロー '%{name}' において '%{filename}' が承認されました。"
text_email_finished_rejected: "承認ワークフロー '%{name}' において '%{filename}' が否認されました。理由:'%{notice}'。" text_email_finished_rejected: "承認ワークフロー '%{name}' において '%{filename}' が否認されました。理由:'%{notice}'。"
text_email_finished_delegated: "承認ワークフロー '%{name}' において代理承認が依頼されました。承認対象 '%{filename}' の内容をご確認の上、承認・否認のご判断をお願い致します(依頼主コメント:'%{notice}')。" text_email_finished_delegated: "承認ワークフロー '%{name}' において代理承認が依頼されました。承認対象 '%{filename}' の内容をご確認の上、承認・否認のご判断をお願い致します(依頼主コメント:'%{notice}')。"
@ -294,18 +288,19 @@ ja:
label_notifications_off: 通知オフ label_notifications_off: 通知オフ
field_target_file: リンク元ファイル field_target_file: リンク元ファイル
title_download_entries: ダウンロード記録 title_download_entries: ダウンロード記録
label_external: 外部
label_link_name: リンク名 label_link_name: リンク名
label_link_external_url: URL label_link_external_url: URL
label_target_folder: リンク先フォルダ label_target_folder: リンク先フォルダ
label_source_folder: リンク元フォルダ label_source_folder: リンク元フォルダ
label_target_project: リンク先プロジェクト label_target_project: リンク先プロジェクト
label_source_project: リンク元プロジェクト label_source_project: リンク元プロジェクト
label_external: 外部
text_email_doc_updated_subject: "プロジェクト'%{project}'のファイルが更新されました" text_email_doc_updated_subject: プロジェクトのファイルが更新されました
text_email_doc_updated: が次のファイルを更新しました。 text_email_doc_updated: が次のファイルを更新しました。
text_email_doc_follows: 対象ファイル: text_email_doc_follows: 対象ファイル:
text_email_doc_deleted_subject: "プロジェクト'%{project}'のファイルが削除されました" text_email_doc_deleted_subject: プロジェクトのファイルが削除されました
text_email_doc_deleted: が次のプロジェクトのファイルを削除しました。 text_email_doc_deleted: が次のプロジェクトのファイルを削除しました。
label_links_only: リンクのみ label_links_only: リンクのみ
@ -324,14 +319,16 @@ ja:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: バージョン
locked_documents: ロック中
open_approvals: 未承認 locked_documents: ロック中
open_approvals: 未承認
label_maximum_ajax_upload_filesize: アップロードファイルサイズ上限 label_maximum_ajax_upload_filesize: アップロードファイルサイズ上限
note_maximum_ajax_upload_filesize: アップロード可能なファイルサイズの上限。AjaxおよびRedmineの仕様に制限される2ギガバイト程度までは確認済み単位はMB。 note_maximum_ajax_upload_filesize: アップロード可能なファイルサイズの上限。AjaxおよびRedmineの仕様に制限される2ギガバイト程度までは確認済み単位はMB。
label_classic: Classic
label_drag_drop: "Drag&Drop"

View File

@ -4,9 +4,8 @@
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# Polish translation created by Sebastian Białas <sbialas@bs-it.pl> www.bs-it.pl # Polish translation created by Sebastian Białas <sbialas@bs-it.pl> www.bs-it.pl
#
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 # as published by the Free Software Foundation; either version 2
@ -95,11 +94,7 @@ pl:
label_email_body: Treść label_email_body: Treść
label_email_send: Wyślij label_email_send: Wyślij
title_notifications_active: Powiadomienia aktywne title_notifications_active: Powiadomienia aktywne
label_file_size: Rozmiar pliku label_upload: Prześlij
heading_file_upload: Prześlij
note_uploaded_maximum_files_at_once: "Można przesłać maksymalnie %{number} plików jednocześnie."
note_upload_files_greater_than_two_gb: Aby przesyłać pliki większe niż 2GB musisz posiadać 64bitową przeglądarkę.
submit_upload_files: Prześlij
heading_new_folder: Nowy Folder heading_new_folder: Nowy Folder
label_title: Tytuł label_title: Tytuł
label_description: Opis label_description: Opis
@ -109,7 +104,7 @@ pl:
select_option_default: Domyślny select_option_default: Domyślny
select_option_deactivated: Wyłączono select_option_deactivated: Wyłączono
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
select_option_activated: Aktywowano select_option_activated: Aktywowano
title_save_preferences: Zapisz ustawienia title_save_preferences: Zapisz ustawienia
heading_revisions: Wersje heading_revisions: Wersje
@ -220,7 +215,6 @@ pl:
warning_folder_not_locked: Niestety folder nie może zostać zablokowany warning_folder_not_locked: Niestety folder nie może zostać zablokowany
notice_folder_unlocked: Folder został odblokowany notice_folder_unlocked: Folder został odblokowany
error_only_user_that_locked_folder_can_unlock_it: Nie posiadasz uprawnień do odblokowania tego folderu error_only_user_that_locked_folder_can_unlock_it: Nie posiadasz uprawnień do odblokowania tego folderu
title_folder_parent_locked: "Folder nadrzędny %{name} jest zablokowany"
title_unlock_folder: Odblokuj w celu umożliwienia wprowadzania zmian innym użytkownikom title_unlock_folder: Odblokuj w celu umożliwienia wprowadzania zmian innym użytkownikom
title_lock_folder: Zablokuj aby zabezpieczyć przed wprowadzaniem zmian przez innych użytkowników title_lock_folder: Zablokuj aby zabezpieczyć przed wprowadzaniem zmian przez innych użytkowników
@ -238,6 +232,7 @@ pl:
field_label_dmsf_workflow: Proces akceptacji field_label_dmsf_workflow: Proces akceptacji
field_label_dmsf_workflow_name: Nazwa procesu akceptacji field_label_dmsf_workflow_name: Nazwa procesu akceptacji
label_dmsf_workflow_plural: Procesy akceptacji label_dmsf_workflow_plural: Procesy akceptacji
label_dmsf_workflow_plural_num: Procesy akceptacji (%{count})
label_dmsf_workflow_step: Krok label_dmsf_workflow_step: Krok
label_dmsf_workflow_step_plural: Kroki label_dmsf_workflow_step_plural: Kroki
label_dmsf_workflow_approval: Akceptacja label_dmsf_workflow_approval: Akceptacja
@ -268,12 +263,12 @@ pl:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Proces akceptacji link_workflow: Proces akceptacji
notice_workflow_started: Proces akceptacji został uruchomiony notice_workflow_started: Proces akceptacji został uruchomiony
text_email_subject_approved: "Proces akceptacji %{name} został zakończony akceptacją" text_email_subject_approved: został zakończony akceptacją
text_email_subject_rejected: "Proces akceptacji %{name} został odrzucony" text_email_subject_rejected: został odrzucony
text_email_subject_delegated: "Proces akceptacji %{name} został delegowany" text_email_subject_delegated: został delegowany
text_email_subject_requires_approval: "Proces akceptacji %{name} wymaga Twojej akceptacji" text_email_subject_requires_approval: wymaga Twojej akceptacji
text_email_subject_updated: "Proces akceptacji %{name} został zaktualizowany" text_email_subject_updated: został zaktualizowany
text_email_subject_started: "Proces akceptacji %{name} został uruchomiony" text_email_subject_started: został uruchomiony
text_email_finished_approved: "Proces akceptacji '%{name}' dokumentu '%{filename}' został właśnie zakończony. Dokument został zaakceptowany." text_email_finished_approved: "Proces akceptacji '%{name}' dokumentu '%{filename}' został właśnie zakończony. Dokument został zaakceptowany."
text_email_finished_rejected: "Proces akceptacji '%{name}' dokumentu '%{filename}' został właśnie zakończony. Dokument został odrzucony z powodu '%{notice}'." text_email_finished_rejected: "Proces akceptacji '%{name}' dokumentu '%{filename}' został właśnie zakończony. Dokument został odrzucony z powodu '%{notice}'."
text_email_finished_delegated: "Proces akceptacji '%{name}' dokumentu '%{filename}' został właśnie delegowany z powodu '%{notice}'. Zostałeś wskazany jako akceptujący w bieżącym kroku zatwierdzania." text_email_finished_delegated: "Proces akceptacji '%{name}' dokumentu '%{filename}' został właśnie delegowany z powodu '%{notice}'. Zostałeś wskazany jako akceptujący w bieżącym kroku zatwierdzania."
@ -302,10 +297,10 @@ pl:
label_target_project: Projekt docelowy label_target_project: Projekt docelowy
label_source_project: Projekt źródłowy label_source_project: Projekt źródłowy
text_email_doc_updated_subject: "Dokumenty projektu %{project} zostały zaktualizowane" text_email_doc_updated_subject: Dokumenty zostały zaktualizowane
text_email_doc_updated: dokumenty zostały zaktualizowane text_email_doc_updated: dokumenty zostały zaktualizowane
text_email_doc_follows: następujące text_email_doc_follows: następujące
text_email_doc_deleted_subject: "Dokumenty projektu %{project} zostały usunięte" text_email_doc_deleted_subject: Dokumenty zostały usunięte
text_email_doc_deleted: dokumenty zostały usunięte text_email_doc_deleted: dokumenty zostały usunięte
label_links_only: odnośniki label_links_only: odnośniki
@ -324,13 +319,16 @@ pl:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Wersja
locked_documents: Dokumenty zablokowane
openap_provals: Otwarte procesy akceptacji locked_documents: Dokumenty zablokowane
open_approvals: Otwarte procesy akceptacji
label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX
note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB. note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB.
label_classic: Classic
label_drag_drop: "Drag&Drop"

View File

@ -4,7 +4,7 @@
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk> # Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -94,11 +94,7 @@ pt-BR:
label_email_body: Descrição label_email_body: Descrição
label_email_send: Enviar label_email_send: Enviar
title_notifications_active: Notificações Ativas title_notifications_active: Notificações Ativas
label_file_size: Tamanho do Arquivo label_upload: Envio
heading_file_upload: Envio
note_uploaded_maximum_files_at_once: "Não pode ser carregado o máximo de %{number} arquivo de apenas uma vez."
note_upload_files_greater_than_two_gb: Para fazer o upload maiores que 2GB você deve possuir sistema 64b.
submit_upload_files: Envio
heading_new_folder: Nova Pasta heading_new_folder: Nova Pasta
label_title: Taxonomia label_title: Taxonomia
label_description: Descrição label_description: Descrição
@ -109,7 +105,7 @@ pt-BR:
select_option_deactivated: Desativado select_option_deactivated: Desativado
select_option_activated: Ativado select_option_activated: Ativado
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
title_save_preferences: Salvar preferências title_save_preferences: Salvar preferências
heading_revisions: Revisões heading_revisions: Revisões
title_download: Download title_download: Download
@ -219,7 +215,6 @@ pt-BR:
warning_folder_not_locked: A pasta não pode ser bloqueada warning_folder_not_locked: A pasta não pode ser bloqueada
notice_folder_unlocked: A pasta foi desbloqueada com sucesso notice_folder_unlocked: A pasta foi desbloqueada com sucesso
error_only_user_that_locked_folder_can_unlock_it: Você não está autorizado a desbloquear esta pasta error_only_user_that_locked_folder_can_unlock_it: Você não está autorizado a desbloquear esta pasta
title_folder_parent_locked: "A pasta %{name} está bloqueada"
title_unlock_folder: Clique aqui para desbloquear e permitir alterações por outros usuários title_unlock_folder: Clique aqui para desbloquear e permitir alterações por outros usuários
title_lock_folder: Clique aqui para impedir alterações por outros usuários title_lock_folder: Clique aqui para impedir alterações por outros usuários
@ -268,12 +263,12 @@ pt-BR:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Workflow link_workflow: Workflow
notice_workflow_started: Workflow de aprovação foi iniciado com êxito notice_workflow_started: Workflow de aprovação foi iniciado com êxito
text_email_subject_approved: "Workflow de aprovação %{name}: aprovado" text_email_subject_approved: aprovado
text_email_subject_rejected: "Workflow de aprovação %{name} reprovado" text_email_subject_rejected: reprovado
text_email_subject_delegated: "Workflow de aprovação %{name} atribuído para" text_email_subject_delegated: atribuído para
text_email_subject_requires_approval: "Workflow de aprovação %{name} requer sua aprovação" text_email_subject_requires_approval: requer sua aprovação
text_email_subject_updated: "Workflow de aprovação %{name}: atualizado" text_email_subject_updated: atualizado
text_email_subject_started: "Workflow de aprovação %{name}: iniciado" text_email_subject_started: iniciado
text_email_finished_approved: "O workflow de aprovação'%{name}' definido para o documento '%{filename}' foi finalizado e o documento foi aprovado." text_email_finished_approved: "O workflow de aprovação'%{name}' definido para o documento '%{filename}' foi finalizado e o documento foi aprovado."
text_email_finished_rejected: "O workflow de aprovação '%{name}' definido para o documento '%{filename}' foi finalizado e o documento foi reprovado devido a '%{notice}'." text_email_finished_rejected: "O workflow de aprovação '%{name}' definido para o documento '%{filename}' foi finalizado e o documento foi reprovado devido a '%{notice}'."
text_email_finished_delegated: "O workflow de aprovação '%{name}' definido para o documento '%{filename}' foi atribuido pois '%{notice}' e está aguardando a sua aprovação na etapa atual." text_email_finished_delegated: "O workflow de aprovação '%{name}' definido para o documento '%{filename}' foi atribuido pois '%{notice}' e está aguardando a sua aprovação na etapa atual."
@ -302,10 +297,10 @@ pt-BR:
label_target_project: Target project label_target_project: Target project
label_source_project: Source project label_source_project: Source project
text_email_doc_updated_subject: "%{project} : Documentos atualizados" text_email_doc_updated_subject: Documentos atualizados
text_email_doc_updated: atualizou os documentos da área text_email_doc_updated: atualizou os documentos da área
text_email_doc_follows: as follows text_email_doc_follows: as follows
text_email_doc_deleted_subject: "%{project} : Exclusão de documentos" text_email_doc_deleted_subject: Exclusão de documentos
text_email_doc_deleted: deletou os documentos da área text_email_doc_deleted: deletou os documentos da área
label_links_only: links only label_links_only: links only
@ -324,13 +319,16 @@ pt-BR:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Versão
locked_documents: Documentos bloqueados
open_approvals: Aprovações abertas locked_documents: Documentos bloqueados
open_approvals: Aprovações abertas
label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX
note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB. note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB.
label_classic: Classic
label_drag_drop: "Drag&Drop"

View File

@ -2,8 +2,8 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
@ -94,11 +94,7 @@ ru:
label_email_body: Содержание label_email_body: Содержание
label_email_send: Отправить label_email_send: Отправить
title_notifications_active: Уведомления активны title_notifications_active: Уведомления активны
label_file_size: Размер файла label_upload: Закачать
heading_file_upload: Закачать
note_uploaded_maximum_files_at_once: "За один раз можно загрузить только %{number} файлов."
note_upload_files_greater_than_two_gb: Чтобы загружать файлы размером больше чем 2 Гб у вас должен быть 64-битный браузер.
submit_upload_files: Загрузить
heading_new_folder: Новая папка heading_new_folder: Новая папка
label_title: Заголовок label_title: Заголовок
label_description: Описание label_description: Описание
@ -109,7 +105,7 @@ ru:
select_option_deactivated: Отключено select_option_deactivated: Отключено
select_option_activated: Включено select_option_activated: Включено
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
title_save_preferences: Сохранить настройки title_save_preferences: Сохранить настройки
heading_revisions: Редакции heading_revisions: Редакции
title_download: Скачать title_download: Скачать
@ -219,7 +215,6 @@ ru:
warning_folder_not_locked: "К сожалению, папка не может быть заблокирована" warning_folder_not_locked: "К сожалению, папка не может быть заблокирована"
notice_folder_unlocked: "Папка была успешно разблокирована" notice_folder_unlocked: "Папка была успешно разблокирована"
error_only_user_that_locked_folder_can_unlock_it: "Только пользователь, который заблокировал папку, может её разблокировать" error_only_user_that_locked_folder_can_unlock_it: "Только пользователь, который заблокировал папку, может её разблокировать"
title_folder_parent_locked: "Родительская папка %{name} заблокирована"
title_unlock_folder: "Разблокируйте папку, чтобы разрешить изменение её другими участниками" title_unlock_folder: "Разблокируйте папку, чтобы разрешить изменение её другими участниками"
title_lock_folder: "Заблокируйте папку, чтобы запретить ёё изменение другими участниками" title_lock_folder: "Заблокируйте папку, чтобы запретить ёё изменение другими участниками"
@ -268,12 +263,12 @@ ru:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Согласование link_workflow: Согласование
notice_workflow_started: Процесс согласования успешно запущен notice_workflow_started: Процесс согласования успешно запущен
text_email_subject_approved: "Процесс согласования %{name} успешно завершен" text_email_subject_approved: успешно завершен
text_email_subject_rejected: "Процесс согласования %{name} отклонен" text_email_subject_rejected: отклонен
text_email_subject_delegated: "Процесс согласования %{name} делегирован" text_email_subject_delegated: делегирован
text_email_subject_requires_approval: "Процесс согласования %{name} требует вашего участия" text_email_subject_requires_approval: ребует вашего участия
text_email_subject_updated: "Процесс согласования %{name} обновлен" text_email_subject_updated: обновлен
text_email_subject_started: "Процесс согласования %{name} запущен" text_email_subject_started: запущен
text_email_finished_approved: "Процесс согласования '%{name}' документа '%{filename}' только что завершился и документ был согласован." text_email_finished_approved: "Процесс согласования '%{name}' документа '%{filename}' только что завершился и документ был согласован."
text_email_finished_rejected: "Процесс согласования '%{name}' документа '%{filename}' только что завершился и документ был отклонен по причине '%{notice}'." text_email_finished_rejected: "Процесс согласования '%{name}' документа '%{filename}' только что завершился и документ был отклонен по причине '%{notice}'."
text_email_finished_delegated: "Процесс согласования '%{name}' документа '%{filename}' только что был делегирован по причине '%{notice}' и от Вас ожидается согласование." text_email_finished_delegated: "Процесс согласования '%{name}' документа '%{filename}' только что был делегирован по причине '%{notice}' и от Вас ожидается согласование."
@ -302,10 +297,10 @@ ru:
label_target_project: Целевой проект label_target_project: Целевой проект
label_source_project: Исходный проект label_source_project: Исходный проект
text_email_doc_updated_subject: "Документы проекта %{project} обновлены" text_email_doc_updated_subject: Документы обновлены
text_email_doc_updated: только что обновил документы text_email_doc_updated: только что обновил документы
text_email_doc_follows: следующим образом text_email_doc_follows: следующим образом
text_email_doc_deleted_subject: "Документы проекта %{project} удалены" text_email_doc_deleted_subject: Документы удалены
text_email_doc_deleted: только что удалил документы text_email_doc_deleted: только что удалил документы
label_links_only: только ссылки label_links_only: только ссылки
@ -324,13 +319,16 @@ ru:
error_resource_or_parent_locked: Невозможно выполнить блокировку - ресурс (или родительская запись) заблокированы error_resource_or_parent_locked: Невозможно выполнить блокировку - ресурс (или родительская запись) заблокированы
error_parent_locked: Невозможно выполнить блокировку - родительская запись заблокирована error_parent_locked: Невозможно выполнить блокировку - родительская запись заблокирована
error_resource_locked: Невозможно выполнить блокировку - ресурс заблокирован error_resource_locked: Невозможно выполнить блокировку - ресурс заблокирован
error_lock_exclusively: невозможно эксклюзивно заблокировать уже забловированный ресурс error_lock_exclusively: Невозможно эксклюзивно заблокировать уже забловированный ресурс
error_unlock_parent_locked: Разблокировка не удалась - родительская запись заблокирована error_unlock_parent_locked: Разблокировка не удалась - родительская запись заблокирована
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Версия
locked_documents: Заблокированные документы
open_approvals: Открытые согласования locked_documents: Заблокированные документы
open_approvals: Открытые согласования
label_maximum_ajax_upload_filesize: Максимальный размер файла, загружаемого посредством AJAX label_maximum_ajax_upload_filesize: Максимальный размер файла, загружаемого посредством AJAX
note_maximum_ajax_upload_filesize: Превышает максимальный размер файла, загружаемого посредством интерфейса AJAX, для загрузки можно использовать стандартную форму Redmine. Размер указан в MB. note_maximum_ajax_upload_filesize: Превышает максимальный размер файла, загружаемого посредством интерфейса AJAX, для загрузки можно использовать стандартную форму Redmine. Размер указан в MB.
label_classic: Classic
label_drag_drop: "Drag&Drop"

View File

@ -2,8 +2,8 @@
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 <zdravko.balorda@mks.si> # Copyright (C) 2011 Zdravko Balorda <zdravko.balorda@mks.si>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com> # Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
# #
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
@ -94,11 +94,7 @@ sl:
label_email_body: Vsebina label_email_body: Vsebina
label_email_send: Pošlji label_email_send: Pošlji
title_notifications_active: Obveščanje aktivno title_notifications_active: Obveščanje aktivno
label_file_size: Velikost datoteke label_upload: Naloži
heading_file_upload: Naloži
note_uploaded_maximum_files_at_once: "Naenkrat lahko prenesete največ %{number} datotek."
note_upload_files_greater_than_two_gb: Za datoteke večje od 2GB rabite 64bitni brskalnik.
submit_upload_files: Naloži
heading_new_folder: Nova mapa heading_new_folder: Nova mapa
label_title: Naziv mape label_title: Naziv mape
label_description: Opis label_description: Opis
@ -109,7 +105,7 @@ sl:
select_option_deactivated: Deaktivirano select_option_deactivated: Deaktivirano
select_option_activated: Aktivirano select_option_activated: Aktivirano
label_title_format: Title format label_title_format: Title format
text_title_format: "Document title format for download (%t - title, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v" text_title_format: "Document title format for download (%t - title, %f - file, %d - date, %v - version, %i - ID, %r - revision). Example: %t_%v"
title_save_preferences: Save preferences title_save_preferences: Save preferences
heading_revisions: Verzije heading_revisions: Verzije
title_download: Prenesi dol title_download: Prenesi dol
@ -219,7 +215,6 @@ sl:
warning_folder_not_locked: Ne, ta mapa ne more biti zaklenjena warning_folder_not_locked: Ne, ta mapa ne more biti zaklenjena
notice_folder_unlocked: Mapa je uspešno odklenjena notice_folder_unlocked: Mapa je uspešno odklenjena
error_only_user_that_locked_folder_can_unlock_it: Nimate privilegijev, da bi odklenili to mapo error_only_user_that_locked_folder_can_unlock_it: Nimate privilegijev, da bi odklenili to mapo
title_folder_parent_locked: "Nadrejena mapa %{name} je zaklenjena"
title_unlock_folder: Odkleni, da bi drugim članom omogočil spreminjanje title_unlock_folder: Odkleni, da bi drugim članom omogočil spreminjanje
title_lock_folder: Zakleni, da bi drugim članom preprečil spreminjanje title_lock_folder: Zakleni, da bi drugim članom preprečil spreminjanje
@ -268,12 +263,12 @@ sl:
info_revision: "r%{rev}" info_revision: "r%{rev}"
link_workflow: Workflow link_workflow: Workflow
notice_workflow_started: Approval workflow successfully started notice_workflow_started: Approval workflow successfully started
text_email_subject_approved: "Approval workflow %{name} approved" text_email_subject_approved: approved
text_email_subject_rejected: "Approval workflow %{name} rejected" text_email_subject_rejected: rejected
text_email_subject_delegated: "Approval workflow %{name} delegated" text_email_subject_delegated: delegated
text_email_subject_requires_approval: "Approval workflow %{name} requires your approval" text_email_subject_requires_approval: requires your approval
text_email_subject_updated: "Approval workflow %{name} updated" text_email_subject_updated: updated
text_email_subject_started: "Approval workflow %{name} started" text_email_subject_started: started
text_email_finished_approved: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been approved." text_email_finished_approved: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been approved."
text_email_finished_rejected: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been rejected because of '%{notice}'." text_email_finished_rejected: "The approval workflow '%{name}' assigned to '%{filename}' document has just been finished and the document has been rejected because of '%{notice}'."
text_email_finished_delegated: "The approval workflow '%{name}' assigned to '%{filename}' document has just been delegated because of '%{notice}' and you are expected to do an approval in the current approval step." text_email_finished_delegated: "The approval workflow '%{name}' assigned to '%{filename}' document has just been delegated because of '%{notice}' and you are expected to do an approval in the current approval step."
@ -302,10 +297,10 @@ sl:
label_target_project: Target project label_target_project: Target project
label_source_project: Source project label_source_project: Source project
text_email_doc_updated_subject: "Documents of %{project} updated" text_email_doc_updated_subject: Documents updated
text_email_doc_updated: has just actualized documents of text_email_doc_updated: has just actualized documents of
text_email_doc_follows: as follows text_email_doc_follows: as follows
text_email_doc_deleted_subject: "Documents of %{project} deleted" text_email_doc_deleted_subject: Documents deleted
text_email_doc_deleted: has just deleted documents of text_email_doc_deleted: has just deleted documents of
label_links_only: links only label_links_only: links only
@ -324,13 +319,16 @@ sl:
error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked error_resource_or_parent_locked: Unable to complete lock - resource (or parent) is locked
error_parent_locked: Unable to complete lock - resource parent is locked error_parent_locked: Unable to complete lock - resource parent is locked
error_resource_locked: Unable to complete lock - resource is locked error_resource_locked: Unable to complete lock - resource is locked
error_lock_exclusively: unable to lock exclusively an already-locked resource error_lock_exclusively: Unable to lock exclusively an already-locked resource
error_unlock_parent_locked: Unlock failed - resource parent is locked error_unlock_parent_locked: Unlock failed - resource parent is locked
my: field_dmsf_tree_view: Navigate folders in a tree
blocks: label_dmsf_version: Verzija
locked_documents: Locked documents
open_approvals: Open approvals locked_documents: Locked documents
open_approvals: Open approvals
label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX label_maximum_ajax_upload_filesize: Maximum file size uploadable via AJAX
note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB. note_maximum_ajax_upload_filesize: Limits maximum file size that can uploaded via standard AJAX interface otherwise Redmine standard upload form must be used. Number is in MB.
label_classic: Classic
label_drag_drop: "Drag&Drop"

Some files were not shown because too many files have changed in this diff Show More