devel-1.5.7 merged into the master
@ -1,6 +1,9 @@
|
||||
Changelog for Redmine DMSF
|
||||
==========================
|
||||
|
||||
1.5.7 *2015-??-??*
|
||||
------------------
|
||||
|
||||
1.5.6 *2015-01-25*
|
||||
------------------
|
||||
|
||||
|
||||
10
Gemfile
@ -1,5 +1,5 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
@ -23,11 +23,11 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
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 'uuidtools', '~> 2.1.1'
|
||||
gem 'dav4rack', '~> 0.3.0'
|
||||
gem 'uuidtools'
|
||||
gem 'dav4rack'
|
||||
|
||||
group :xapian do
|
||||
group :xapian do
|
||||
gem 'xapian-full-alaveteli', :require => false
|
||||
end
|
||||
47
README.md
@ -1,7 +1,7 @@
|
||||
Redmine DMSF Plugin
|
||||
===================
|
||||
|
||||
The current version of Redmine DMSF is **1.5.6** [](https://travis-ci.org/danmunn/redmine_dmsf)
|
||||
The current version of Redmine DMSF is **1.5.7** [](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.
|
||||
|
||||
@ -77,18 +77,18 @@ From Omega documentation:
|
||||
|
||||
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 \
|
||||
djview djview3 uuid uuid-dev xz-utils```
|
||||
|
||||
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 \
|
||||
uuid uuid-dev xz-utils```
|
||||
|
||||
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 \
|
||||
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:
|
||||
|
||||
####Link to a file with id 17:
|
||||
####Link to a document with id 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)}}`
|
||||
|
||||
####Link to the description of a file with id 17
|
||||
####Link to the description of a document with id 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)}}`
|
||||
|
||||
####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
|
||||
`{{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
|
||||
`{{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:
|
||||
|
||||
@ -153,7 +169,13 @@ In the file <redmine_root>/public/help/<language>/wiki_syntax_detailed.html, aft
|
||||
<li><strong>{{dmsff(5, Folder)}}</strong> (a link to the folder with id 5 with the link text "Folder")</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=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>
|
||||
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.
|
||||
@ -179,6 +201,7 @@ Before installing ensure that the Redmine instance is stopped.
|
||||
1. In case of upgrade BACKUP YOUR DATABASE first
|
||||
2. Put redmine_dmsf plugin directory into plugins.
|
||||
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"`.
|
||||
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.
|
||||
@ -198,6 +221,10 @@ Before installing ensure that the Redmine instance is stopped.
|
||||
|
||||
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
|
||||
|
||||
Example:
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
#
|
||||
# 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>
|
||||
# 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
|
||||
@ -23,133 +23,133 @@
|
||||
class DmsfController < ApplicationController
|
||||
unloadable
|
||||
|
||||
class ZipMaxFilesError < StandardError; end
|
||||
class EmailMaxFileSize < StandardError; end
|
||||
class FileNotFound < StandardError; end
|
||||
|
||||
before_filter :find_project
|
||||
before_filter :authorize
|
||||
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
|
||||
|
||||
helper :all
|
||||
|
||||
def show
|
||||
def show
|
||||
@folder_manipulation_allowed = User.current.allowed_to?(:folder_manipulation, @project)
|
||||
@file_manipulation_allowed = User.current.allowed_to?(:file_manipulation, @project)
|
||||
@file_delete_allowed = User.current.allowed_to?(:file_delete, @project)
|
||||
@file_view_allowed = User.current.allowed_to?(:view_dmsf_files, @project)
|
||||
@force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @project)
|
||||
@workflows_available = DmsfWorkflow.where(['project_id = ? OR project_id IS NULL', @project.id]).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)
|
||||
|
||||
unless @folder
|
||||
if params[:custom_field_id].present? && params[:custom_value].present?
|
||||
@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
|
||||
tag = params[:custom_field_id].present? && params[:custom_value].present?
|
||||
@folder = nil if tag
|
||||
if @tree_view
|
||||
@locked_for_user = false
|
||||
else
|
||||
|
||||
if @folder.deleted
|
||||
render_404
|
||||
return
|
||||
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?
|
||||
unless @folder
|
||||
if tag
|
||||
@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
|
||||
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
|
||||
|
||||
@ajax_upload_size = Setting.plugin_redmine_dmsf['dmsf_max_ajax_upload_filesize'].present? ? Setting.plugin_redmine_dmsf['dmsf_max_ajax_upload_filesize'] : 100
|
||||
|
||||
# Trash
|
||||
@trash_visible = @folder_manipulation_allowed && @file_manipulation_allowed &&
|
||||
@trash_visible = @folder_manipulation_allowed && @file_manipulation_allowed &&
|
||||
@file_delete_allowed && !@locked_for_user && !@folder
|
||||
@trash_enabled = DmsfFolder.deleted.where(:project_id => @project.id).any? ||
|
||||
DmsfFile.deleted.where(:project_id => @project.id).any? ||
|
||||
DmsfLink.deleted.where(:project_id => @project.id).any?
|
||||
|
||||
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
render :layout => !request.xhr?
|
||||
}
|
||||
format.api
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def trash
|
||||
@folder_manipulation_allowed = User.current.allowed_to? :folder_manipulation, @project
|
||||
@ -188,19 +188,22 @@ class DmsfController < ApplicationController
|
||||
return
|
||||
end
|
||||
|
||||
if selected_dir_links.present?
|
||||
selected_dir_links.each do |id|
|
||||
link = DmsfLink.find_by_id id
|
||||
selected_folders << link.target_id if link && !selected_folders.include?(link.target_id.to_s)
|
||||
if selected_dir_links.present? &&
|
||||
(params[:email_entries].present? || params[:download_entries].present?)
|
||||
selected_dir_links.each do |id|
|
||||
link = DmsfLink.find_by_id id
|
||||
selected_folders << link.target_id if link && !selected_folders.include?(link.target_id.to_s)
|
||||
end
|
||||
end
|
||||
|
||||
if selected_file_links.present?
|
||||
selected_file_links.each do |id|
|
||||
link = DmsfLink.find_by_id id
|
||||
selected_files << link.target_id if link && !selected_files.include?(link.target_id.to_s)
|
||||
if selected_file_links.present? &&
|
||||
(params[:email_entries].present? || params[:download_entries].present?)
|
||||
selected_file_links.each do |id|
|
||||
link = DmsfLink.find_by_id id
|
||||
selected_files << link.target_id if link && !selected_files.include?(link.target_id.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if params[:email_entries].present?
|
||||
email_entries(selected_folders, selected_files)
|
||||
elsif params[:restore_entries].present?
|
||||
@ -215,16 +218,14 @@ class DmsfController < ApplicationController
|
||||
else
|
||||
download_entries(selected_folders, selected_files)
|
||||
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
|
||||
render_404
|
||||
rescue DmsfAccessError
|
||||
render_403
|
||||
render_403
|
||||
rescue Exception => e
|
||||
flash[:error] = e.message
|
||||
Rails.logger.error e.message
|
||||
redirect_to :back
|
||||
end
|
||||
|
||||
def tag_changed
|
||||
@ -239,7 +240,7 @@ class DmsfController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
def entries_email
|
||||
def entries_email
|
||||
if params[:email][:to].strip.blank?
|
||||
flash.now[:error] = l(:error_email_to_must_be_entered)
|
||||
render :action => 'email_entries'
|
||||
@ -258,67 +259,68 @@ class DmsfController < ApplicationController
|
||||
render :action => 'edit'
|
||||
end
|
||||
|
||||
def create
|
||||
def create
|
||||
@folder = DmsfFolder.new
|
||||
@folder.title = params[:dmsf_folder][:title].strip
|
||||
@folder.description = params[:dmsf_folder][:description].strip
|
||||
@folder.dmsf_folder_id = params[:dmsf_folder][:dmsf_folder_id]
|
||||
@folder.project = @project
|
||||
@folder.user = User.current
|
||||
|
||||
|
||||
# Custom fields
|
||||
if params[:dmsf_folder][:custom_field_values].present?
|
||||
params[:dmsf_folder][:custom_field_values].each_with_index do |v, i|
|
||||
@folder.custom_field_values[i].value = v[1]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
saved = @folder.save
|
||||
|
||||
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.api {
|
||||
unless saved
|
||||
render_validation_errors(@folder)
|
||||
end
|
||||
format.api {
|
||||
unless saved
|
||||
render_validation_errors(@folder)
|
||||
end
|
||||
}
|
||||
format.html {
|
||||
format.html {
|
||||
if saved
|
||||
flash[:notice] = l(:notice_folder_created)
|
||||
flash[:notice] = l(:notice_folder_created)
|
||||
redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder)
|
||||
else
|
||||
@pathfolder = @parent
|
||||
render :action => 'edit'
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def edit
|
||||
@parent = @folder.folder
|
||||
@parent = @folder.dmsf_folder
|
||||
@pathfolder = copy_folder(@folder)
|
||||
@force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @project)
|
||||
end
|
||||
|
||||
def save
|
||||
unless params[:dmsf_folder]
|
||||
unless params[:dmsf_folder]
|
||||
redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder)
|
||||
return
|
||||
end
|
||||
@pathfolder = copy_folder(@folder)
|
||||
@pathfolder = copy_folder(@folder)
|
||||
@folder.title = params[:dmsf_folder][:title].strip
|
||||
@folder.description = params[:dmsf_folder][:description].strip
|
||||
@folder.dmsf_folder_id = params[:dmsf_folder][:dmsf_folder_id]
|
||||
|
||||
|
||||
# Custom fields
|
||||
if params[:dmsf_folder][:custom_field_values].present?
|
||||
params[:dmsf_folder][:custom_field_values].each_with_index do |v, i|
|
||||
@folder.custom_field_values[i].value = v[1]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if @folder.save
|
||||
flash[:notice] = l(:notice_folder_details_were_saved)
|
||||
flash[:notice] = l(:notice_folder_details_were_saved)
|
||||
redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder)
|
||||
else
|
||||
render :action => 'edit'
|
||||
@ -332,10 +334,10 @@ class DmsfController < ApplicationController
|
||||
else
|
||||
flash[:error] = @folder.errors.full_messages.to_sentence
|
||||
end
|
||||
if commit
|
||||
if commit || @tree_view
|
||||
redirect_to :back
|
||||
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
|
||||
|
||||
@ -352,10 +354,15 @@ class DmsfController < ApplicationController
|
||||
end
|
||||
|
||||
def save_root
|
||||
@project.dmsf_description = params[:project][:dmsf_description]
|
||||
@project.save!
|
||||
flash[:notice] = l(:notice_folder_details_were_saved)
|
||||
redirect_to :controller => 'dmsf', :action => 'show', :id => @project
|
||||
if params[:project]
|
||||
@project.dmsf_description = params[:project][:dmsf_description]
|
||||
if @project.save
|
||||
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
|
||||
|
||||
def notify_activate
|
||||
@ -442,11 +449,11 @@ class DmsfController < ApplicationController
|
||||
end
|
||||
|
||||
zip.files.each do |f|
|
||||
log_activity(f, 'emailing zip')
|
||||
log_activity(f, 'emailing zip')
|
||||
audit = DmsfFileRevisionAccess.new
|
||||
audit.user = User.current
|
||||
audit.revision = f.last_revision
|
||||
audit.action = DmsfFileRevisionAccess::EmailAction
|
||||
audit.dmsf_file_revision = f.last_revision
|
||||
audit.action = DmsfFileRevisionAccess::EmailAction
|
||||
audit.save!
|
||||
end
|
||||
|
||||
@ -469,11 +476,11 @@ class DmsfController < ApplicationController
|
||||
zip_entries(zip, selected_folders, selected_files)
|
||||
|
||||
zip.files.each do |f|
|
||||
log_activity(f, 'download zip')
|
||||
log_activity(f, 'download zip')
|
||||
audit = DmsfFileRevisionAccess.new
|
||||
audit.user = User.current
|
||||
audit.revision = f.last_revision
|
||||
audit.action = DmsfFileRevisionAccess::DownloadAction
|
||||
audit.dmsf_file_revision = f.last_revision
|
||||
audit.action = DmsfFileRevisionAccess::DownloadAction
|
||||
audit.save!
|
||||
end
|
||||
|
||||
@ -481,7 +488,7 @@ class DmsfController < ApplicationController
|
||||
:filename => filename_for_content_disposition("#{@project.name}-#{DateTime.now.strftime('%y%m%d%H%M%S')}.zip"),
|
||||
:type => 'application/zip',
|
||||
:disposition => 'attachment')
|
||||
rescue Exception
|
||||
rescue Exception
|
||||
raise
|
||||
ensure
|
||||
zip.close if zip
|
||||
@ -494,7 +501,7 @@ class DmsfController < ApplicationController
|
||||
selected_folders.each do |selected_folder_id|
|
||||
folder = DmsfFolder.visible.find_by_id selected_folder_id
|
||||
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
|
||||
raise FileNotFound
|
||||
end
|
||||
@ -503,19 +510,18 @@ class DmsfController < ApplicationController
|
||||
if selected_files && selected_files.is_a?(Array)
|
||||
selected_files.each do |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)
|
||||
raise DmsfAccessError
|
||||
end
|
||||
if file && file.last_revision && File.exists?(file.last_revision.disk_file)
|
||||
zip.add_file(file, member, (file.folder.dmsf_path_str if file.folder)) if file
|
||||
else
|
||||
raise FileNotFound
|
||||
end
|
||||
zip.add_file(file, member, (file.dmsf_folder.dmsf_path_str if file.dmsf_folder)) if file
|
||||
end
|
||||
end
|
||||
max_files = Setting.plugin_redmine_dmsf['dmsf_max_file_download'].to_i
|
||||
if max_files > 0 && zip.files.length > max_files
|
||||
raise ZipMaxFilesError, zip.files.length
|
||||
raise ZipMaxFilesError#, zip.files.length
|
||||
end
|
||||
zip
|
||||
end
|
||||
@ -563,6 +569,7 @@ class DmsfController < ApplicationController
|
||||
if folder
|
||||
unless folder.delete commit
|
||||
flash[:error] = folder.errors.full_messages.to_sentence
|
||||
return
|
||||
end
|
||||
elsif !commit
|
||||
raise FileNotFound
|
||||
@ -589,9 +596,17 @@ class DmsfController < ApplicationController
|
||||
log_activity(f, 'deleted')
|
||||
end
|
||||
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
|
||||
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
|
||||
Rails.logger.error "Could not send email notifications: #{e.message}"
|
||||
end
|
||||
@ -614,7 +629,7 @@ class DmsfController < ApplicationController
|
||||
rescue DmsfAccessError
|
||||
render_403
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
render_404
|
||||
end
|
||||
|
||||
def find_parent
|
||||
@ -625,18 +640,15 @@ class DmsfController < ApplicationController
|
||||
render_404
|
||||
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)
|
||||
copy = folder.clone
|
||||
copy.id = folder.id
|
||||
copy
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def e_params
|
||||
params.fetch(:email, {}).permit(
|
||||
:to, :zipped_content, :email,
|
||||
:cc, :subject, :zipped_content => [], :files => [])
|
||||
end
|
||||
|
||||
end
|
||||
@ -3,7 +3,7 @@
|
||||
# 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>
|
||||
# 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
|
||||
@ -26,7 +26,8 @@ class DmsfFilesController < ApplicationController
|
||||
|
||||
before_filter :find_file, :except => [: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
|
||||
|
||||
@ -39,21 +40,21 @@ class DmsfFilesController < ApplicationController
|
||||
@revision = @file.last_revision
|
||||
else
|
||||
@revision = DmsfFileRevision.find(params[:download].to_i)
|
||||
raise DmsfAccessError if @revision.file != @file
|
||||
raise DmsfAccessError if @revision.dmsf_file != @file
|
||||
end
|
||||
check_project(@revision.file)
|
||||
raise ActionController::MissingFile if @file.deleted
|
||||
log_activity('downloaded')
|
||||
check_project(@revision.dmsf_file)
|
||||
raise ActionController::MissingFile if @file.deleted?
|
||||
log_activity('downloaded')
|
||||
access = DmsfFileRevisionAccess.new
|
||||
access.user = User.current
|
||||
access.revision = @revision
|
||||
access.action = DmsfFileRevisionAccess::DownloadAction
|
||||
access.dmsf_file_revision = @revision
|
||||
access.action = DmsfFileRevisionAccess::DownloadAction
|
||||
access.save!
|
||||
member = Member.where(:user_id => User.current.id, :project_id => @file.project.id).first
|
||||
send_file(@revision.disk_file,
|
||||
send_file(@revision.disk_file,
|
||||
:filename => filename_for_content_disposition(@revision.formatted_name(member ? member.title_format : nil)),
|
||||
:type => @revision.detect_content_type,
|
||||
:disposition => 'inline')
|
||||
:disposition => 'inline')
|
||||
rescue DmsfAccessError => e
|
||||
Rails.logger.error e.message
|
||||
render_403
|
||||
@ -71,18 +72,18 @@ class DmsfFilesController < ApplicationController
|
||||
@revision = @file.last_revision
|
||||
else
|
||||
@revision = DmsfFileRevision.find(params[:download].to_i)
|
||||
raise DmsfAccessError if @revision.file != @file
|
||||
raise DmsfAccessError if @revision.dmsf_file != @file
|
||||
end
|
||||
check_project(@revision.file)
|
||||
raise ActionController::MissingFile if @revision.file.deleted
|
||||
log_activity('downloaded')
|
||||
check_project(@revision.dmsf_file)
|
||||
raise ActionController::MissingFile if @revision.dmsf_file.deleted?
|
||||
log_activity('downloaded')
|
||||
access = DmsfFileRevisionAccess.new
|
||||
access.user = User.current
|
||||
access.revision = @revision
|
||||
access.dmsf_file_revision = @revision
|
||||
access.action = DmsfFileRevisionAccess::DownloadAction
|
||||
access.save!
|
||||
member = Member.where(:user_id => User.current.id, :project_id => @file.project.id).first
|
||||
send_file(@revision.disk_file,
|
||||
send_file(@revision.disk_file,
|
||||
:filename => filename_for_content_disposition(@revision.formatted_name(member ? member.title_format : nil)),
|
||||
:type => @revision.detect_content_type,
|
||||
:disposition => 'attachment')
|
||||
@ -98,7 +99,8 @@ class DmsfFilesController < ApplicationController
|
||||
|
||||
@revision = @file.last_revision
|
||||
@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|
|
||||
format.html {
|
||||
@ -119,7 +121,7 @@ class DmsfFilesController < ApplicationController
|
||||
revision.description = params[:dmsf_file_revision][:description]
|
||||
revision.comment = params[:dmsf_file_revision][:comment]
|
||||
|
||||
revision.file = @file
|
||||
revision.dmsf_file = @file
|
||||
last_revision = @file.last_revision
|
||||
revision.source_revision = last_revision
|
||||
revision.user = User.current
|
||||
@ -127,29 +129,29 @@ class DmsfFilesController < ApplicationController
|
||||
revision.major_version = last_revision.major_version
|
||||
revision.minor_version = last_revision.minor_version
|
||||
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]
|
||||
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
|
||||
else
|
||||
if version == 3
|
||||
revision.major_version = params[:custom_version_major].to_i
|
||||
revision.minor_version = params[:custom_version_minor].to_i
|
||||
revision.disk_filename = last_revision.disk_filename
|
||||
revision.mime_type = last_revision.mime_type
|
||||
if last_revision.digest.blank?
|
||||
revision.digest = DmsfFileRevision.create_digest last_revision.disk_file
|
||||
else
|
||||
revision.increase_version(version, true)
|
||||
revision.digest = last_revision.digest
|
||||
end
|
||||
else
|
||||
revision.size = file_upload.size
|
||||
revision.disk_filename = revision.new_storage_filename
|
||||
revision.mime_type = Redmine::MimeType.of(file_upload.original_filename)
|
||||
revision.digest = DmsfFileRevision.create_digest file_upload.path
|
||||
end
|
||||
|
||||
|
||||
# Custom fields
|
||||
if params[:dmsf_file_revision][:custom_field_values].present?
|
||||
params[:dmsf_file_revision][:custom_field_values].each_with_index do |v, i|
|
||||
@ -195,7 +197,7 @@ class DmsfFilesController < ApplicationController
|
||||
flash[:error] = @file.errors.full_messages.join(', ')
|
||||
end
|
||||
else
|
||||
flash[:error] = revision.errors.full_messages.join(', ')
|
||||
flash[:error] = revision.errors.full_messages.join(', ')
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -210,35 +212,39 @@ class DmsfFilesController < ApplicationController
|
||||
if commit
|
||||
log_activity('deleted')
|
||||
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
|
||||
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
|
||||
Rails.logger.error "Could not send email notifications: #{e.message}"
|
||||
end
|
||||
end
|
||||
else
|
||||
@file.errors.each do |e, msg|
|
||||
flash[:error] = msg
|
||||
end
|
||||
flash[:error] = @file.errors.full_messages.join(', ')
|
||||
end
|
||||
end
|
||||
if commit
|
||||
if commit || @tree_view
|
||||
redirect_to :back
|
||||
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
|
||||
|
||||
def delete_revision
|
||||
if @revision # && !@revision.deleted
|
||||
if @revision
|
||||
if @revision.delete(true)
|
||||
flash[:notice] = l(:notice_revision_deleted)
|
||||
log_activity('deleted')
|
||||
else
|
||||
@revision.errors.each do |e, msg|
|
||||
flash[:error] = msg
|
||||
end
|
||||
flash[:error] = @revision.errors.full_messages.join(', ')
|
||||
end
|
||||
end
|
||||
redirect_to :action => 'show', :id => @file
|
||||
@ -248,8 +254,12 @@ class DmsfFilesController < ApplicationController
|
||||
if @file.locked?
|
||||
flash[:warning] = l(:warning_file_already_locked)
|
||||
else
|
||||
@file.lock!
|
||||
flash[:notice] = l(:notice_file_locked)
|
||||
begin
|
||||
@file.lock!
|
||||
flash[:notice] = l(:notice_file_locked)
|
||||
rescue Exception => e
|
||||
flash[:error] = e.message
|
||||
end
|
||||
end
|
||||
redirect_to :back
|
||||
end
|
||||
@ -259,8 +269,12 @@ class DmsfFilesController < ApplicationController
|
||||
flash[:warning] = l(:warning_file_not_locked)
|
||||
else
|
||||
if @file.locks[0].user == User.current || User.current.allowed_to?(:force_file_unlock, @file.project)
|
||||
@file.unlock!
|
||||
flash[:notice] = l(:notice_file_unlocked)
|
||||
begin
|
||||
@file.unlock!
|
||||
flash[:notice] = l(:notice_file_unlocked)
|
||||
rescue Exception => e
|
||||
flash[:error] = e.message
|
||||
end
|
||||
else
|
||||
flash[:error] = l(:error_only_user_that_locked_file_can_unlock_it)
|
||||
end
|
||||
@ -300,11 +314,6 @@ class DmsfFilesController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def frev_params
|
||||
params.require(:dmsf_file_revision).permit(
|
||||
:title, :name, :description, :comment)
|
||||
end
|
||||
|
||||
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}"
|
||||
end
|
||||
@ -318,16 +327,21 @@ class DmsfFilesController < ApplicationController
|
||||
|
||||
def find_revision
|
||||
@revision = DmsfFileRevision.visible.find params[:id]
|
||||
@file = @revision.file
|
||||
@file = @revision.dmsf_file
|
||||
@project = @file.project
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
|
||||
def check_project(entry)
|
||||
if entry && entry.project != @project
|
||||
raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project)
|
||||
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
|
||||
@ -18,9 +18,9 @@
|
||||
|
||||
class DmsfFilesCopyController < ApplicationController
|
||||
unloadable
|
||||
|
||||
|
||||
menu_item :dmsf
|
||||
|
||||
|
||||
before_filter :find_file
|
||||
before_filter :authorize
|
||||
|
||||
@ -34,10 +34,10 @@ class DmsfFilesCopyController < ApplicationController
|
||||
else
|
||||
@target_project ||= DmsfFile.allowed_target_projects_on_copy[0]
|
||||
end
|
||||
|
||||
|
||||
@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?
|
||||
end
|
||||
|
||||
@ -47,20 +47,20 @@ class DmsfFilesCopyController < ApplicationController
|
||||
render_403
|
||||
return
|
||||
end
|
||||
@target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank?
|
||||
if !@target_folder.nil? && @target_folder.project != @target_project
|
||||
raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project)
|
||||
@target_folder = DmsfFolder.visible.find_by_id(params[:target_folder_id]) unless params[:target_folder_id].blank?
|
||||
if @target_folder && (@target_folder.project != @target_project)
|
||||
raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project)
|
||||
end
|
||||
|
||||
if (@target_folder && @target_folder == @file.folder) ||
|
||||
(@target_folder.nil? && @file.folder.nil? && @target_project == @file.project)
|
||||
if (@target_folder && @target_folder == @file.dmsf_folder) ||
|
||||
(@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project)
|
||||
flash[:error] = l(:error_target_folder_same)
|
||||
redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder
|
||||
return
|
||||
end
|
||||
|
||||
new_file = @file.copy_to(@target_project, @target_folder)
|
||||
|
||||
|
||||
unless new_file.errors.empty?
|
||||
flash[:error] = "#{l(:error_file_cannot_be_copied)}: #{new_file.errors.full_messages.join(', ')}"
|
||||
redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder
|
||||
@ -68,8 +68,8 @@ class DmsfFilesCopyController < ApplicationController
|
||||
end
|
||||
|
||||
flash[:notice] = l(:notice_file_copied)
|
||||
log_activity(new_file, 'was copied (is copy)')
|
||||
|
||||
log_activity(new_file, 'was copied (is copy)')
|
||||
|
||||
redirect_to dmsf_file_path(new_file)
|
||||
end
|
||||
|
||||
@ -81,11 +81,11 @@ class DmsfFilesCopyController < ApplicationController
|
||||
end
|
||||
@target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank?
|
||||
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
|
||||
|
||||
if (@target_folder && @target_folder == @file.folder) ||
|
||||
(@target_folder.nil? && @file.folder.nil? && @target_project == @file.project)
|
||||
if (@target_folder && @target_folder == @file.dmsf_folder) ||
|
||||
(@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project)
|
||||
flash[:error] = l(:error_target_folder_same)
|
||||
redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder
|
||||
return
|
||||
@ -98,14 +98,14 @@ class DmsfFilesCopyController < ApplicationController
|
||||
end
|
||||
|
||||
@file.reload
|
||||
|
||||
|
||||
flash[:notice] = l(:notice_file_moved)
|
||||
log_activity(@file, 'was moved (is copy)')
|
||||
|
||||
log_activity(@file, 'was moved (is copy)')
|
||||
|
||||
redirect_to dmsf_file_path(@file)
|
||||
end
|
||||
|
||||
private
|
||||
private
|
||||
|
||||
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}"
|
||||
@ -115,5 +115,5 @@ class DmsfFilesCopyController < ApplicationController
|
||||
@file = DmsfFile.visible.find(params[:id])
|
||||
@project = @file.project
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
@ -18,9 +18,9 @@
|
||||
|
||||
class DmsfFoldersCopyController < ApplicationController
|
||||
unloadable
|
||||
|
||||
|
||||
menu_item :dmsf
|
||||
|
||||
|
||||
before_filter :find_folder
|
||||
before_filter :authorize
|
||||
|
||||
@ -32,10 +32,10 @@ class DmsfFoldersCopyController < ApplicationController
|
||||
else
|
||||
@target_project ||= DmsfFolder.allowed_target_projects_on_copy[0]
|
||||
end
|
||||
|
||||
|
||||
@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?
|
||||
end
|
||||
|
||||
@ -47,18 +47,18 @@ class DmsfFoldersCopyController < ApplicationController
|
||||
end
|
||||
@target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank?
|
||||
if !@target_folder.nil? && @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
|
||||
|
||||
if (@target_folder && @target_folder == @folder.folder) ||
|
||||
(@target_folder.nil? && @folder.folder.nil? && @target_project == @folder.project)
|
||||
if (@target_folder && @target_folder == @folder.dmsf_folder) ||
|
||||
(@target_folder.nil? && @folder.dmsf_folder.nil? && @target_project == @folder.project)
|
||||
flash[:error] = l(:error_target_folder_same)
|
||||
redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, :target_folder_id => @target_folder
|
||||
return
|
||||
end
|
||||
|
||||
new_folder = @folder.copy_to(@target_project, @target_folder)
|
||||
|
||||
|
||||
unless new_folder.errors.empty?
|
||||
flash[:error] = "#{l(:error_folder_cannot_be_copied)}: #{new_folder.errors.full_messages.join(', ')}"
|
||||
redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, :target_folder_id => @target_folder
|
||||
@ -66,10 +66,10 @@ class DmsfFoldersCopyController < ApplicationController
|
||||
end
|
||||
|
||||
new_folder.reload
|
||||
|
||||
|
||||
flash[:notice] = l(:notice_folder_copied)
|
||||
log_activity(new_folder, 'was copied (is copy)')
|
||||
|
||||
|
||||
redirect_to dmsf_folder_path(:id => @target_project, :folder_id => new_folder)
|
||||
end
|
||||
|
||||
@ -83,5 +83,5 @@ class DmsfFoldersCopyController < ApplicationController
|
||||
@folder = DmsfFolder.visible.find(params[:id])
|
||||
@project = @folder.project
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -26,13 +26,13 @@ class DmsfLinksController < ApplicationController
|
||||
before_filter :find_link_project
|
||||
before_filter :authorize
|
||||
|
||||
def new
|
||||
def new
|
||||
@dmsf_link = DmsfLink.new
|
||||
@dmsf_link.project_id = params[:project_id]
|
||||
|
||||
if params[:dmsf_link].present?
|
||||
# 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]
|
||||
@type = params[:dmsf_link][:type]
|
||||
@link_external = (@type == 'link_from') && (params[:external_link] == 'true')
|
||||
@ -53,7 +53,7 @@ class DmsfLinksController < ApplicationController
|
||||
|
||||
if file
|
||||
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
|
||||
end
|
||||
end
|
||||
@ -111,7 +111,7 @@ class DmsfLinksController < ApplicationController
|
||||
@dmsf_link.target_type = DmsfFolder.model_name.to_s
|
||||
end
|
||||
@dmsf_link.name = params[:dmsf_link][:name]
|
||||
|
||||
|
||||
if @dmsf_link.save
|
||||
flash[:notice] = l(:notice_successful_create)
|
||||
redirect_to dmsf_folder_path(:id => @project.id, :folder_id => @dmsf_link.dmsf_folder_id)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
@ -21,16 +21,16 @@
|
||||
|
||||
class DmsfUploadController < ApplicationController
|
||||
unloadable
|
||||
|
||||
|
||||
menu_item :dmsf
|
||||
|
||||
|
||||
before_filter :find_project
|
||||
before_filter :authorize
|
||||
before_filter :find_folder, :except => [:upload_file, :upload, :commit]
|
||||
|
||||
|
||||
helper :all
|
||||
helper :dmsf_workflows
|
||||
|
||||
|
||||
accept_api_auth :upload, :commit
|
||||
|
||||
def upload_files
|
||||
@ -38,7 +38,7 @@ class DmsfUploadController < ApplicationController
|
||||
@uploads = []
|
||||
if uploaded_files && uploaded_files.is_a?(Hash)
|
||||
# standard file input uploads
|
||||
uploaded_files.each_value do |uploaded_file|
|
||||
uploaded_files.each_value do |uploaded_file|
|
||||
upload = DmsfUpload.create_from_uploaded_attachment(@project, @folder, uploaded_file)
|
||||
@uploads.push(upload) if upload
|
||||
end
|
||||
@ -53,40 +53,42 @@ class DmsfUploadController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# async single file upload handling
|
||||
def upload_file
|
||||
@tempfile = params[:file]
|
||||
# async single file upload handling
|
||||
def upload_file
|
||||
@tempfile = params[:file]
|
||||
unless @tempfile.original_filename
|
||||
render_404
|
||||
return
|
||||
end
|
||||
@disk_filename = DmsfHelper.temp_filename(@tempfile.original_filename)
|
||||
target = "#{DmsfHelper.temp_dir}/#{@disk_filename}"
|
||||
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
|
||||
Rails.logger.error e.message
|
||||
end
|
||||
if File.size("#{DmsfHelper.temp_dir}/#{@disk_filename}") <= 0
|
||||
if File.size(target) <= 0
|
||||
begin
|
||||
File.delete "#{DmsfHelper.temp_dir}/#{@disk_filename}"
|
||||
File.delete target
|
||||
rescue Exception => e
|
||||
Rails.logger.error e.message
|
||||
end
|
||||
render :layout => nil, :json => { :jsonrpc => '2.0',
|
||||
:error => {
|
||||
:code => 103,
|
||||
:message => l(:header_minimum_filesize),
|
||||
:details => l(:error_minimum_filesize,
|
||||
:file => @tempfile.original_filename.to_s)
|
||||
render :layout => nil, :json => { :jsonrpc => '2.0',
|
||||
:error => {
|
||||
:code => 103,
|
||||
:message => l(:header_minimum_filesize),
|
||||
:details => l(:error_minimum_filesize,
|
||||
:file => @tempfile.original_filename.to_s)
|
||||
}
|
||||
}
|
||||
else
|
||||
render :layout => false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# REST API document upload
|
||||
def upload
|
||||
def upload
|
||||
unless request.content_type == 'application/octet-stream'
|
||||
render :nothing => true, :status => 406
|
||||
return
|
||||
@ -109,69 +111,70 @@ class DmsfUploadController < ApplicationController
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def commit_files
|
||||
|
||||
def commit_files
|
||||
commit_files_internal params[:commited_files]
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# REST API file commit
|
||||
def commit
|
||||
attachments = params[:attachments]
|
||||
attachments = params[:attachments]
|
||||
if attachments && attachments.is_a?(Hash)
|
||||
@folder = DmsfFolder.visible.find_by_id attachments[:folder_id].to_i if attachments[:folder_id].present?
|
||||
# standard file input uploads
|
||||
uploaded_files = attachments.select { |key, value| key == 'uploaded_file'}
|
||||
uploaded_files.each_value do |uploaded_file|
|
||||
uploaded_files.each_value do |uploaded_file|
|
||||
upload = DmsfUpload.create_from_uploaded_attachment(@project, @folder, uploaded_file)
|
||||
uploaded_file[:disk_filename] = upload.disk_filename
|
||||
end
|
||||
end
|
||||
commit_files_internal uploaded_files
|
||||
commit_files_internal uploaded_files
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def commit_files_internal(commited_files)
|
||||
if commited_files && commited_files.is_a?(Hash)
|
||||
@files = []
|
||||
failed_uploads = []
|
||||
commited_files.each_value do |commited_file|
|
||||
name = commited_file[:name]
|
||||
|
||||
|
||||
new_revision = DmsfFileRevision.new
|
||||
file = DmsfFile.visible.find_file_by_name(@project, @folder, name)
|
||||
unless file
|
||||
link = DmsfLink.find_link_by_file_name(@project, @folder, name)
|
||||
file = link.target_file if link
|
||||
end
|
||||
|
||||
|
||||
unless file
|
||||
file = DmsfFile.new
|
||||
file.project = @project
|
||||
file.name = name
|
||||
file.folder = @folder
|
||||
file.notification = Setting.plugin_redmine_dmsf[:dmsf_default_notifications].present?
|
||||
file.dmsf_folder = @folder
|
||||
file.notification = Setting.plugin_redmine_dmsf[:dmsf_default_notifications].present?
|
||||
new_revision.minor_version = 0
|
||||
new_revision.major_version = 0
|
||||
else
|
||||
if file.locked_for_user?
|
||||
failed_uploads.push(commited_file)
|
||||
next
|
||||
end
|
||||
if file.last_revision
|
||||
last_revision = file.last_revision
|
||||
new_revision.source_revision = last_revision
|
||||
new_revision.major_version = last_revision.major_version
|
||||
new_revision.minor_version = last_revision.minor_version
|
||||
new_revision.minor_version = last_revision.minor_version
|
||||
else
|
||||
new_revision.minor_version = 0
|
||||
new_revision.major_version = 0
|
||||
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(/[\/\\]/,'')}"
|
||||
|
||||
new_revision.file = file
|
||||
|
||||
new_revision.dmsf_file = file
|
||||
new_revision.user = User.current
|
||||
new_revision.name = name
|
||||
new_revision.title = commited_file[:title]
|
||||
@ -182,53 +185,50 @@ class DmsfUploadController < ApplicationController
|
||||
new_revision.major_version = commited_file[:custom_version_major].to_i
|
||||
new_revision.minor_version = commited_file[:custom_version_minor].to_i
|
||||
else
|
||||
new_revision.increase_version(version, true)
|
||||
new_revision.increase_version(version)
|
||||
end
|
||||
new_revision.mime_type = Redmine::MimeType.of(new_revision.name)
|
||||
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.
|
||||
# File id is needed to properly generate revision disk filename
|
||||
# Need to save file first to generate id for it in case of creation.
|
||||
# File id is needed to properly generate revision disk filename
|
||||
if commited_file[:dmsf_file_revision].present?
|
||||
commited_file[:dmsf_file_revision][:custom_field_values].each_with_index do |v, i|
|
||||
new_revision.custom_field_values[i].value = v[1]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if new_revision.valid? && file.save
|
||||
new_revision.disk_filename = new_revision.new_storage_filename
|
||||
else
|
||||
failed_uploads.push(commited_file)
|
||||
next
|
||||
end
|
||||
|
||||
|
||||
if new_revision.save
|
||||
new_revision.assign_workflow(commited_file[:dmsf_workflow_id])
|
||||
FileUtils.mv(commited_disk_filepath, new_revision.disk_file)
|
||||
file.set_last_revision new_revision
|
||||
@files.push(file)
|
||||
new_revision.assign_workflow(commited_file[:dmsf_workflow_id])
|
||||
begin
|
||||
FileUtils.mv(commited_disk_filepath, new_revision.disk_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
|
||||
failed_uploads.push(commited_file)
|
||||
end
|
||||
end
|
||||
unless @files.empty?
|
||||
@files.each { |file| log_activity(file, 'uploaded') if file }
|
||||
unless @files.empty?
|
||||
@files.each { |file| log_activity(file, 'uploaded') if file }
|
||||
if (@folder && @folder.notification?) || (!@folder && @project.dmsf_notification?)
|
||||
begin
|
||||
recipients = DmsfMailer.get_notify_users(@project, @files)
|
||||
recipients.each do |u|
|
||||
DmsfMailer.files_updated(u, @project, @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(', ')
|
||||
@ -247,22 +247,22 @@ class DmsfUploadController < ApplicationController
|
||||
end
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.api {
|
||||
render_validation_errors(failed_uploads) unless failed_uploads.empty?
|
||||
format.api {
|
||||
render_validation_errors(failed_uploads) unless failed_uploads.empty?
|
||||
}
|
||||
format.html { redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder) }
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
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}"
|
||||
end
|
||||
|
||||
|
||||
def find_folder
|
||||
@folder = DmsfFolder.visible.find(params[:folder_id]) if params.keys.include?('folder_id')
|
||||
@folder = DmsfFolder.visible.find(params[:folder_id]) if params.keys.include?('folder_id')
|
||||
rescue DmsfAccessError
|
||||
render_403
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -19,54 +19,54 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
class DmsfWorkflowsController < ApplicationController
|
||||
unloadable
|
||||
unloadable
|
||||
model_object DmsfWorkflow
|
||||
|
||||
before_filter :find_model_object, :except => [:create, :new, :index, :assign, :assignment]
|
||||
|
||||
before_filter :find_model_object, :except => [:create, :new, :index, :assign, :assignment]
|
||||
before_filter :find_project
|
||||
before_filter :authorize_custom
|
||||
|
||||
|
||||
layout :workflows_layout
|
||||
|
||||
def index
|
||||
@workflow_pages, @workflows = paginate DmsfWorkflow.global.sorted, :per_page => 25
|
||||
|
||||
def index
|
||||
@status = params[:status] || 1
|
||||
@workflow_pages, @workflows = paginate DmsfWorkflow.status(@status).global.sorted, :per_page => 25
|
||||
end
|
||||
|
||||
def action
|
||||
|
||||
def action
|
||||
end
|
||||
|
||||
|
||||
def new_action
|
||||
if params[:commit] == l(:button_submit)
|
||||
action = DmsfWorkflowStepAction.new(
|
||||
:dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id],
|
||||
:action => (params[:step_action].to_i >= 10) ? DmsfWorkflowStepAction::ACTION_DELEGATE : params[:step_action],
|
||||
:note => params[:note])
|
||||
:note => params[:note])
|
||||
if request.post?
|
||||
if action.save
|
||||
revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id]
|
||||
if revision
|
||||
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 file
|
||||
if @dmsf_workflow.try_finish revision, action, (params[:step_action].to_i / 10)
|
||||
if revision.dmsf_file
|
||||
begin
|
||||
file.unlock! true
|
||||
revision.dmsf_file.unlock! true
|
||||
rescue DmsfLockError => e
|
||||
flash[:info] = e.message
|
||||
flash[:info] = e.message
|
||||
end
|
||||
end
|
||||
end
|
||||
if revision.workflow == DmsfWorkflow::STATE_APPROVED
|
||||
# Just approved
|
||||
recipients = DmsfMailer.get_notify_users(@project)
|
||||
# Just approved
|
||||
recipients = DmsfMailer.get_notify_users(@project, [revision.dmsf_file])
|
||||
recipients.each do |user|
|
||||
DmsfMailer.workflow_notification(
|
||||
user,
|
||||
@dmsf_workflow,
|
||||
@dmsf_workflow,
|
||||
revision,
|
||||
:text_email_subject_approved,
|
||||
:text_email_finished_approved,
|
||||
:text_email_to_see_history).deliver if user
|
||||
end
|
||||
if Setting.plugin_redmine_dmsf[:dmsf_display_notified_recipients] == '1'
|
||||
if Setting.plugin_redmine_dmsf[:dmsf_display_notified_recipients] == '1'
|
||||
unless recipients.blank?
|
||||
to = recipients.collect{ |r| r.name }.first(DMSF_MAX_NOTIFICATION_RECEIVERS_INFO).join(', ')
|
||||
to << ((recipients.count > DMSF_MAX_NOTIFICATION_RECEIVERS_INFO) ? ',...' : '.')
|
||||
@ -74,15 +74,15 @@ class DmsfWorkflowsController < ApplicationController
|
||||
end
|
||||
end
|
||||
else
|
||||
# Just rejected
|
||||
# Just rejected
|
||||
recipients = @dmsf_workflow.participiants
|
||||
recipients.push User.find_by_id revision.dmsf_workflow_assigned_by
|
||||
recipients.uniq!
|
||||
recipients = recipients & DmsfMailer.get_notify_users(@project)
|
||||
recipients = recipients & DmsfMailer.get_notify_users(@project, [revision.dmsf_file])
|
||||
recipients.each do |user|
|
||||
DmsfMailer.workflow_notification(
|
||||
user,
|
||||
@dmsf_workflow,
|
||||
user,
|
||||
@dmsf_workflow,
|
||||
revision,
|
||||
:text_email_subject_rejected,
|
||||
:text_email_finished_rejected,
|
||||
@ -99,19 +99,19 @@ class DmsfWorkflowsController < ApplicationController
|
||||
end
|
||||
else
|
||||
if action.action == DmsfWorkflowStepAction::ACTION_DELEGATE
|
||||
# Delegation
|
||||
# Delegation
|
||||
delegate = User.find_by_id params[:step_action].to_i / 10
|
||||
if DmsfMailer.get_notify_users(@project).include?(delegate)
|
||||
DmsfMailer.workflow_notification(
|
||||
delegate,
|
||||
@dmsf_workflow,
|
||||
delegate,
|
||||
@dmsf_workflow,
|
||||
revision,
|
||||
:text_email_subject_delegated,
|
||||
:text_email_finished_delegated,
|
||||
:text_email_to_proceed,
|
||||
action.note).deliver
|
||||
if Setting.plugin_redmine_dmsf[:dmsf_display_notified_recipients] == '1'
|
||||
flash[:warning] = l(:warning_email_notifications, :to => delegate.name)
|
||||
flash[:warning] = l(:warning_email_notifications, :to => delegate.name)
|
||||
end
|
||||
end
|
||||
else
|
||||
@ -123,19 +123,19 @@ class DmsfWorkflowsController < ApplicationController
|
||||
assignments.each do |assignment|
|
||||
if assignment.user && DmsfMailer.get_notify_users(@project).include?(assignment.user)
|
||||
DmsfMailer.workflow_notification(
|
||||
assignment.user,
|
||||
@dmsf_workflow,
|
||||
assignment.user,
|
||||
@dmsf_workflow,
|
||||
revision,
|
||||
:text_email_subject_requires_approval,
|
||||
:text_email_finished_step,
|
||||
:text_email_to_proceed).deliver
|
||||
end
|
||||
end
|
||||
to = User.find_by_id revision.dmsf_workflow_assigned_by
|
||||
to = User.find_by_id revision.dmsf_workflow_assigned_by
|
||||
if to && DmsfMailer.get_notify_users(@project).include?(to)
|
||||
DmsfMailer.workflow_notification(
|
||||
to,
|
||||
@dmsf_workflow,
|
||||
to,
|
||||
@dmsf_workflow,
|
||||
revision,
|
||||
:text_email_subject_updated,
|
||||
:text_email_finished_step_short,
|
||||
@ -152,31 +152,31 @@ class DmsfWorkflowsController < ApplicationController
|
||||
flash[:warning] = l(:warning_email_notifications, :to => to)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
elsif action.action != DmsfWorkflowStepAction::ACTION_APPROVE && action.note.blank?
|
||||
flash[:error] = l(:error_empty_note)
|
||||
flash[:error] = l(:error_empty_note)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
redirect_to :back
|
||||
redirect_to :back
|
||||
end
|
||||
|
||||
def assign
|
||||
|
||||
def assign
|
||||
end
|
||||
|
||||
|
||||
def assignment
|
||||
if (params[:commit] == l(:button_submit)) &&
|
||||
if (params[:commit] == l(:button_submit)) &&
|
||||
params[:dmsf_workflow_id].present? && (params[:dmsf_workflow_id] != '-1')
|
||||
revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id]
|
||||
if revision
|
||||
revision.set_workflow(params[:dmsf_workflow_id], params[:action])
|
||||
revision.set_workflow(params[:dmsf_workflow_id], params[:action])
|
||||
revision.assign_workflow(params[:dmsf_workflow_id])
|
||||
if request.post?
|
||||
if request.post?
|
||||
if revision.save
|
||||
file = DmsfFile.find_by_id revision.dmsf_file_id
|
||||
if file
|
||||
@ -185,43 +185,44 @@ class DmsfWorkflowsController < ApplicationController
|
||||
rescue DmsfLockError => e
|
||||
logger.warn e.message
|
||||
end
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
end
|
||||
else
|
||||
flash[:error] = l(:error_workflow_assign)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
redirect_to :back
|
||||
redirect_to :back
|
||||
end
|
||||
|
||||
def log
|
||||
end
|
||||
|
||||
def new
|
||||
|
||||
def new
|
||||
@dmsf_workflow = DmsfWorkflow.new
|
||||
|
||||
|
||||
# Reload
|
||||
if params[:dmsf_workflow] && params[:dmsf_workflow][:name].present?
|
||||
@dmsf_workflow.name = params[:dmsf_workflow][:name]
|
||||
elsif params[:dmsf_workflow_id].present?
|
||||
wf = DmsfWorkflow.find_by_id params[:dmsf_workflow_id]
|
||||
elsif params[:dmsf_workflow] && params[:dmsf_workflow][:id].present?
|
||||
wf = DmsfWorkflow.find_by_id params[:dmsf_workflow][:id]
|
||||
@dmsf_workflow.name = wf.name if wf
|
||||
end
|
||||
|
||||
|
||||
render :layout => !request.xhr?
|
||||
end
|
||||
|
||||
|
||||
def create
|
||||
if params[:dmsf_workflow]
|
||||
if (params[:dmsf_workflow_id].to_i > 0)
|
||||
wf = DmsfWorkflow.find_by_id params[:dmsf_workflow_id]
|
||||
@dmsf_workflow = wf.copy_to(@project, params[:dmsf_workflow][:name]) if wf
|
||||
if (params[:dmsf_workflow][:id].to_i > 0)
|
||||
wf = DmsfWorkflow.find_by_id params[:dmsf_workflow][:id]
|
||||
@dmsf_workflow = wf.copy_to(@project, params[:dmsf_workflow][:name]) if wf
|
||||
else
|
||||
@dmsf_workflow = DmsfWorkflow.new
|
||||
@dmsf_workflow.name = params[:dmsf_workflow][:name]
|
||||
@dmsf_workflow.project_id = @project.id if @project
|
||||
@dmsf_workflow.author = User.current
|
||||
@dmsf_workflow.save
|
||||
end
|
||||
end
|
||||
@ -232,29 +233,34 @@ class DmsfWorkflowsController < ApplicationController
|
||||
else
|
||||
redirect_to dmsf_workflows_path
|
||||
end
|
||||
else
|
||||
else
|
||||
render :action => 'new'
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
if params[:dmsf_workflow] && @dmsf_workflow.update_attributes(
|
||||
{:name => params[:dmsf_workflow][:name]})
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
if @project
|
||||
redirect_to settings_project_path(@project, :tab => 'dmsf_workflow')
|
||||
|
||||
def update
|
||||
if params[:dmsf_workflow]
|
||||
res = @dmsf_workflow.update_attributes({:name => params[:dmsf_workflow][:name]}) if params[:dmsf_workflow][:name].present?
|
||||
res = @dmsf_workflow.update_attributes({:status => params[:dmsf_workflow][:status]}) if params[:dmsf_workflow][:status].present?
|
||||
if res
|
||||
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
|
||||
redirect_to dmsf_workflows_path
|
||||
end
|
||||
flash[:error] = @dmsf_workflow.errors.full_messages.to_sentence
|
||||
redirect_to dmsf_workflow_path(@dmsf_workflow)
|
||||
end
|
||||
else
|
||||
flash[:error] = @dmsf_workflow.errors.full_messages.to_sentence
|
||||
redirect_to dmsf_workflow_path(@dmsf_workflow)
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
|
||||
def destroy
|
||||
begin
|
||||
@dmsf_workflow.destroy
|
||||
@dmsf_workflow.destroy
|
||||
flash[:notice] = l(:notice_successful_delete)
|
||||
rescue
|
||||
flash[:error] = l(:error_unable_delete_dmsf_workflow)
|
||||
@ -263,33 +269,33 @@ class DmsfWorkflowsController < ApplicationController
|
||||
redirect_to settings_project_path(@project, :tab => 'dmsf_workflow')
|
||||
else
|
||||
redirect_to dmsf_workflows_path
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocomplete_for_user
|
||||
|
||||
def autocomplete_for_user
|
||||
render :layout => false
|
||||
end
|
||||
|
||||
|
||||
def new_step
|
||||
@steps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.html
|
||||
format.js
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def add_step
|
||||
if request.post?
|
||||
|
||||
def add_step
|
||||
if request.post?
|
||||
if params[:step] == '0'
|
||||
step = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq.count + 1
|
||||
step = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq.count + 1
|
||||
else
|
||||
step = params[:step].to_i
|
||||
end
|
||||
operator = (params[:commit] == l(:dmsf_and)) ? DmsfWorkflowStep::OPERATOR_AND : DmsfWorkflowStep::OPERATOR_OR
|
||||
users = User.where(:id => params[:user_ids]).to_a
|
||||
if users.count > 0
|
||||
users.each do |user|
|
||||
users.each do |user|
|
||||
ws = DmsfWorkflowStep.new
|
||||
ws.dmsf_workflow_id = @dmsf_workflow.id
|
||||
ws.step = step
|
||||
@ -303,49 +309,52 @@ class DmsfWorkflowsController < ApplicationController
|
||||
end
|
||||
else
|
||||
flash[:error] = l(:error_workflow_assign)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
respond_to do |format|
|
||||
format.html
|
||||
end
|
||||
format.html
|
||||
end
|
||||
end
|
||||
|
||||
def remove_step
|
||||
if request.delete?
|
||||
|
||||
def remove_step
|
||||
if request.delete?
|
||||
DmsfWorkflowStep.where(:dmsf_workflow_id => @dmsf_workflow.id, :step => params[:step]).each do |ws|
|
||||
@dmsf_workflow.dmsf_workflow_steps.delete(ws)
|
||||
end
|
||||
end
|
||||
@dmsf_workflow.dmsf_workflow_steps.each do |ws|
|
||||
n = ws.step.to_i
|
||||
if n > params[:step].to_i
|
||||
if n > params[:step].to_i
|
||||
ws.step = n - 1
|
||||
unless ws.save
|
||||
flash[:error] = l(:notice_cannot_renumber_steps)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.html
|
||||
end
|
||||
end
|
||||
|
||||
def reorder_steps
|
||||
|
||||
def reorder_steps
|
||||
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)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.html
|
||||
format.js {
|
||||
render inline: "location.replace('#{dmsf_workflow_path(@dmsf_workflow)}');"
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def start
|
||||
revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id])
|
||||
if revision
|
||||
if revision
|
||||
revision.set_workflow(@dmsf_workflow.id, params[:action])
|
||||
if revision.save
|
||||
if revision.save
|
||||
assignments = @dmsf_workflow.next_assignments revision.id
|
||||
recipients = assignments.collect{ |a| a.user }
|
||||
recipients.uniq!
|
||||
@ -353,13 +362,13 @@ class DmsfWorkflowsController < ApplicationController
|
||||
recipients.each do |user|
|
||||
DmsfMailer.workflow_notification(
|
||||
user,
|
||||
@dmsf_workflow,
|
||||
@dmsf_workflow,
|
||||
revision,
|
||||
:text_email_subject_started,
|
||||
:text_email_started,
|
||||
:text_email_to_proceed).deliver
|
||||
end
|
||||
if Setting.plugin_redmine_dmsf[:dmsf_display_notified_recipients] == '1'
|
||||
if Setting.plugin_redmine_dmsf[:dmsf_display_notified_recipients] == '1'
|
||||
unless recipients.blank?
|
||||
to = recipients.collect{ |r| r.name }.first(DMSF_MAX_NOTIFICATION_RECEIVERS_INFO).join(', ')
|
||||
to << ((recipients.count > DMSF_MAX_NOTIFICATION_RECEIVERS_INFO) ? ',...' : '.')
|
||||
@ -369,35 +378,37 @@ class DmsfWorkflowsController < ApplicationController
|
||||
flash[:notice] = l(:notice_workflow_started)
|
||||
else
|
||||
flash[:error] = l(:notice_cannot_start_workflow)
|
||||
end
|
||||
end
|
||||
end
|
||||
redirect_to :back
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_project
|
||||
private
|
||||
|
||||
def find_project
|
||||
if @dmsf_workflow
|
||||
if @dmsf_workflow.project # Project workflow
|
||||
@project = @dmsf_workflow.project
|
||||
else # Global workflow
|
||||
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
|
||||
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]
|
||||
else
|
||||
@project = Project.find_by_identifier params[:id]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def workflows_layout
|
||||
|
||||
def workflows_layout
|
||||
@project ? 'base' : 'admin'
|
||||
end
|
||||
|
||||
def authorize_custom
|
||||
end
|
||||
|
||||
def authorize_custom
|
||||
if @project
|
||||
authorize
|
||||
else
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
# 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) 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
|
||||
@ -33,7 +36,7 @@ module DmsfHelper
|
||||
end
|
||||
"#{timestamp}_#{filename}"
|
||||
end
|
||||
|
||||
|
||||
def self.sanitize_filename(filename)
|
||||
# get only the filename, not the whole path
|
||||
just_filename = File.basename(filename.gsub('\\\\', '/'))
|
||||
@ -46,10 +49,10 @@ module DmsfHelper
|
||||
extension = $1 if just_filename =~ %r{(\.[a-zA-Z0-9]+)$}
|
||||
just_filename = Digest::MD5.hexdigest(just_filename) << extension
|
||||
end
|
||||
|
||||
|
||||
just_filename
|
||||
end
|
||||
|
||||
|
||||
def self.filetype_css(filename)
|
||||
extension = File.extname(filename)
|
||||
extension = extension[1, extension.length-1]
|
||||
@ -60,20 +63,44 @@ module DmsfHelper
|
||||
end
|
||||
end
|
||||
|
||||
def plugin_asset_path(plugin, asset_type, source)
|
||||
return "#{Redmine::Utils.relative_url_root}/plugin_assets/#{plugin}/#{asset_type}/#{source}"
|
||||
def plugin_asset_path(plugin, asset_type, source)
|
||||
return "#{Redmine::Utils.relative_url_root}/plugin_assets/#{plugin}/#{asset_type}/#{source}"
|
||||
end
|
||||
|
||||
def self.to_time(obj)
|
||||
#Right, enough of bugs, let's try a better approach here.
|
||||
return if !obj
|
||||
return obj.to_time(ActiveRecord::Base.default_timezone) if obj.is_a?(String)
|
||||
def self.dmsf_tree(parent, obj, tree = nil)
|
||||
tree ||= []
|
||||
# Folders && files && links
|
||||
nodes = obj.dmsf_folders.visible + obj.dmsf_links.visible + obj.dmsf_files.visible
|
||||
# Alphabetical and type sort
|
||||
nodes.sort! do |x, y|
|
||||
if ((x.is_a?(DmsfFolder) || (x.is_a?(DmsfLink) && x.is_folder?)) &&
|
||||
(y.is_a?(DmsfFile) || (y.is_a?(DmsfLink) && y.is_file?)))
|
||||
-1
|
||||
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
|
||||
|
||||
# Why can't Mysql::Time conform to time object? - without a utc? method it breaks redmine's
|
||||
# rendering method, so we convert it to string, and back into time - not the most efficient
|
||||
# of methods - however seems functional. Not sure if MySQL
|
||||
return obj.to_s.to_time(ActiveRecord::Base.default_timezone) if obj.class.name == 'Mysql::Time'
|
||||
return obj
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -19,31 +19,33 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
module DmsfWorkflowsHelper
|
||||
|
||||
|
||||
def render_principals_for_new_dmsf_workflow_users(workflow, dmsf_workflow_step_assignment_id, dmsf_file_revision_id)
|
||||
scope = workflow.delegates(params[:q], dmsf_workflow_step_assignment_id, dmsf_file_revision_id)
|
||||
principal_count = scope.count
|
||||
principal_pages = Redmine::Pagination::Paginator.new principal_count, 10, params['page']
|
||||
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all
|
||||
|
||||
if dmsf_workflow_step_assignment_id
|
||||
|
||||
# Delegation
|
||||
if dmsf_workflow_step_assignment_id
|
||||
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')
|
||||
else
|
||||
# New step
|
||||
else
|
||||
s = content_tag('div',
|
||||
content_tag('div', principals_check_box_tags('user_ids[]', principals), :id => 'users'),
|
||||
:class => 'objects-selection')
|
||||
end
|
||||
|
||||
links = pagination_links_full(principal_pages, principal_count, :per_page_links => false) {|text, parameters, options|
|
||||
link_to text, autocomplete_for_user_dmsf_workflow_path(workflow, parameters.merge(:q => params[:q], :format => 'js')), :remote => true
|
||||
link_to text, autocomplete_for_user_dmsf_workflow_path(workflow, parameters.merge(:q => params[:q], :format => 'js')), :remote => true
|
||||
}
|
||||
|
||||
s + content_tag('p', links, :class => 'pagination')
|
||||
s.html_safe
|
||||
s.html_safe
|
||||
end
|
||||
|
||||
|
||||
def dmsf_workflow_steps_options_for_select(steps)
|
||||
options = Array.new
|
||||
options << [l(:dmsf_new_step), 0]
|
||||
@ -51,25 +53,25 @@ module DmsfWorkflowsHelper
|
||||
options << [step.to_s, step]
|
||||
end
|
||||
options_for_select(options, 0)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def dmsf_workflows_for_select(project, dmsf_workflow_id)
|
||||
options = Array.new
|
||||
options = Array.new
|
||||
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
|
||||
options << [wf.name, wf.id]
|
||||
else
|
||||
options << ["#{wf.name} (global)", wf.id]
|
||||
end
|
||||
end
|
||||
end
|
||||
options_for_select(options, :selected => dmsf_workflow_id)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def dmsf_all_workflows_for_select(dmsf_workflow_id)
|
||||
options = Array.new
|
||||
options << ['', 0]
|
||||
DmsfWorkflow.sorted.all.each do |wf|
|
||||
options = Array.new
|
||||
options << ['', 0]
|
||||
DmsfWorkflow.active.sorted.all.each do |wf|
|
||||
if wf.project_id
|
||||
prj = Project.find_by_id wf.project_id
|
||||
if User.current.allowed_to?(:manage_workflows, prj)
|
||||
@ -83,16 +85,33 @@ module DmsfWorkflowsHelper
|
||||
else
|
||||
# Global approval workflows
|
||||
options << [wf.name, wf.id]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
options_for_select(options, :selected => dmsf_workflow_id)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def principals_radio_button_tags(name, principals)
|
||||
s = ''
|
||||
principals.each do |principal|
|
||||
s << "<label>#{ radio_button_tag name, principal.id * 10, false, :id => nil } #{h principal}</label>\n"
|
||||
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
|
||||
@ -29,28 +29,25 @@ end
|
||||
|
||||
class DmsfFile < ActiveRecord::Base
|
||||
unloadable
|
||||
|
||||
include RedmineDmsf::Lockable
|
||||
|
||||
include RedmineDmsf::Lockable
|
||||
|
||||
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'
|
||||
|
||||
has_many :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',
|
||||
|
||||
has_many :dmsf_file_revisions, -> { order("#{DmsfFileRevision.table_name}.major_version DESC, #{DmsfFileRevision.table_name}.minor_version DESC, #{DmsfFileRevision.table_name}.updated_at DESC") },
|
||||
:dependent => :destroy
|
||||
has_many :locks, -> { where(entity_type: 0).order("#{DmsfLock.table_name}.updated_at DESC") },
|
||||
:class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy
|
||||
has_many :referenced_links, -> { where target_type: DmsfFile.model_name.to_s},
|
||||
:class_name => 'DmsfLink', :foreign_key => 'target_id', :dependent => :destroy
|
||||
accepts_nested_attributes_for :revisions, :locks, :referenced_links, :project
|
||||
|
||||
scope :visible, lambda { |*args|
|
||||
where(deleted: false)
|
||||
}
|
||||
scope :deleted, lambda { |*args|
|
||||
where(deleted: true)
|
||||
}
|
||||
|
||||
STATUS_DELETED = 1
|
||||
STATUS_ACTIVE = 0
|
||||
|
||||
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
|
||||
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
|
||||
|
||||
validates :name, :presence => true
|
||||
validates_format_of :name, :with => DmsfFolder.invalid_characters,
|
||||
@ -59,30 +56,30 @@ class DmsfFile < ActiveRecord::Base
|
||||
validate :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
|
||||
existing_file.nil? || existing_file.id == self.id
|
||||
end
|
||||
end
|
||||
|
||||
acts_as_event :title => Proc.new { |o| o.name },
|
||||
:description => Proc.new { |o|
|
||||
desc = Redmine::Search.cache_store.fetch("DmsfFile-#{o.id}")
|
||||
:description => Proc.new { |o|
|
||||
desc = Redmine::Search.cache_store.fetch("DmsfFile-#{o.id}")
|
||||
if desc
|
||||
Redmine::Search.cache_store.delete("DmsfFile-#{o.id}")
|
||||
Redmine::Search.cache_store.delete("DmsfFile-#{o.id}")
|
||||
else
|
||||
desc = o.description
|
||||
desc += ' / ' if o.description.present? && o.last_revision.comment.present?
|
||||
desc += o.last_revision.comment if o.last_revision.comment.present?
|
||||
end
|
||||
end
|
||||
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 },
|
||||
:author => Proc.new { |o| o.last_revision.user }
|
||||
|
||||
|
||||
acts_as_searchable :columns => ["#{table_name}.name", "#{DmsfFileRevision.table_name}.title", "#{DmsfFileRevision.table_name}.description", "#{DmsfFileRevision.table_name}.comment"],
|
||||
:project_key => 'project_id',
|
||||
:date_column => "#{table_name}.updated_at"
|
||||
:date_column => "#{table_name}.updated_at"
|
||||
|
||||
before_create :default_values
|
||||
def default_values
|
||||
@ -97,19 +94,23 @@ class DmsfFile < ActiveRecord::Base
|
||||
@@storage_path = nil
|
||||
|
||||
def self.storage_path
|
||||
unless @@storage_path.present?
|
||||
@@storage_path = Setting.plugin_redmine_dmsf['dmsf_storage_directory'].strip if Setting.plugin_redmine_dmsf['dmsf_storage_directory'].present?
|
||||
@@storage_path = Pathname(Redmine::Configuration['attachments_storage_path']).join('dmsf') if @@storage_path.blank? && Redmine::Configuration['attachments_storage_path'].present?
|
||||
@@storage_path = Rails.root.join('files/dmsf').to_s if @@storage_path.blank?
|
||||
Dir.mkdir(@@storage_path) unless File.exists?(@@storage_path)
|
||||
end
|
||||
@@storage_path
|
||||
return @@storage_path if @@storage_path.present?
|
||||
path = Setting.plugin_redmine_dmsf['dmsf_storage_directory']
|
||||
path = Pathname(Redmine::Configuration['attachments_storage_path']).join('dmsf') if path.blank? && Redmine::Configuration['attachments_storage_path'].present?
|
||||
path = Rails.root.join('files/dmsf').to_s if path.blank?
|
||||
path.strip if path
|
||||
path
|
||||
end
|
||||
|
||||
# Lets introduce a write for storage path, that way we can also
|
||||
# better interact from test-cases etc
|
||||
def self.storage_path=(obj)
|
||||
@@storage_path = obj
|
||||
def self.storage_path=(path)
|
||||
begin
|
||||
FileUtils.mkdir_p(path) unless File.exists?(path)
|
||||
rescue Exception => e
|
||||
Rails.logger.error e.message
|
||||
end
|
||||
@@storage_path = path
|
||||
end
|
||||
|
||||
def self.find_file_by_name(project, folder, name)
|
||||
@ -121,7 +122,7 @@ class DmsfFile < ActiveRecord::Base
|
||||
|
||||
def 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
|
||||
@last_revision
|
||||
end
|
||||
@ -130,6 +131,10 @@ class DmsfFile < ActiveRecord::Base
|
||||
@last_revision = new_revision
|
||||
end
|
||||
|
||||
def deleted?
|
||||
self.deleted == STATUS_DELETED
|
||||
end
|
||||
|
||||
def delete(commit)
|
||||
if locked_for_user?
|
||||
Rails.logger.info l(:error_file_is_locked)
|
||||
@ -138,12 +143,11 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
begin
|
||||
# Revisions and links of a deleted file SHOULD be deleted too
|
||||
self.revisions.each { |r| r.delete(commit, true) }
|
||||
self.referenced_links.each { |l| l.delete(commit) }
|
||||
self.dmsf_file_revisions.each { |r| r.delete(commit, true) }
|
||||
if commit
|
||||
self.destroy
|
||||
else
|
||||
self.deleted = true
|
||||
self.deleted = STATUS_DELETED
|
||||
self.deleted_by_user = User.current
|
||||
save
|
||||
end
|
||||
@ -155,13 +159,12 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
|
||||
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)
|
||||
return false
|
||||
end
|
||||
self.revisions.each { |r| r.restore }
|
||||
self.referenced_links.each { |l| l.restore }
|
||||
self.deleted = false
|
||||
self.dmsf_file_revisions.each { |r| r.restore }
|
||||
self.deleted = STATUS_ACTIVE
|
||||
self.deleted_by_user = nil
|
||||
save
|
||||
end
|
||||
@ -171,8 +174,8 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def description
|
||||
self.last_revision ? self.last_revision.description : ''
|
||||
end
|
||||
self.last_revision ? self.last_revision.description : ''
|
||||
end
|
||||
|
||||
def version
|
||||
self.last_revision ? self.last_revision.version : '0'
|
||||
@ -187,7 +190,7 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def dmsf_path
|
||||
path = self.folder.nil? ? [] : self.folder.dmsf_path
|
||||
path = self.dmsf_folder ? self.dmsf_folder.dmsf_path : []
|
||||
path.push(self)
|
||||
path
|
||||
end
|
||||
@ -198,8 +201,8 @@ class DmsfFile < ActiveRecord::Base
|
||||
|
||||
def notify?
|
||||
return true if self.notification
|
||||
return true if folder && folder.notify?
|
||||
return true if !folder && self.project.dmsf_notification
|
||||
return true if self.dmsf_folder && delf.dmsf_folder.notify?
|
||||
return true if !self.dmsf_folder && self.project.dmsf_notification
|
||||
return false
|
||||
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 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)
|
||||
FileUtils.mv rev.disk_file(self.project), rev.disk_file(project)
|
||||
end
|
||||
@ -240,9 +243,9 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
|
||||
self.project = project
|
||||
self.folder = folder
|
||||
self.dmsf_folder = folder
|
||||
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.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 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)
|
||||
FileUtils.cp rev.disk_file(self.project), rev.disk_file(project)
|
||||
end
|
||||
@ -265,14 +268,14 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
|
||||
file = DmsfFile.new
|
||||
file.folder = folder
|
||||
file.dmsf_folder = folder
|
||||
file.project = project
|
||||
file.name = self.name
|
||||
file.notification = Setting.plugin_redmine_dmsf['dmsf_default_notifications'].present?
|
||||
|
||||
if file.save && self.last_revision
|
||||
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.custom_values = []
|
||||
@ -290,33 +293,33 @@ class DmsfFile < ActiveRecord::Base
|
||||
def self.search(tokens, projects = nil, options = {}, user = User.current)
|
||||
tokens = [] << tokens unless tokens.is_a?(Array)
|
||||
projects = [] << projects if projects.is_a?(Project)
|
||||
project_ids = projects.collect(&:id) if projects
|
||||
|
||||
if options[:offset]
|
||||
project_ids = projects.collect(&:id) if projects
|
||||
|
||||
if options[:offset]
|
||||
limit_options = ["dmsf_files.updated_at #{options[:before] ? '<' : '>'} ?", options[:offset]]
|
||||
end
|
||||
|
||||
|
||||
if options[:titles_only]
|
||||
columns = [searchable_options[:columns][1]]
|
||||
else
|
||||
else
|
||||
columns = searchable_options[:columns]
|
||||
end
|
||||
|
||||
|
||||
token_clauses = columns.collect{ |column| "(LOWER(#{column}) LIKE ?)" }
|
||||
|
||||
sql = (['(' + token_clauses.join(' OR ') + ')'] * tokens.size).join(options[:all_words] ? ' AND ' : ' OR ')
|
||||
sql = (['(' + token_clauses.join(' OR ') + ')'] * tokens.size).join(options[:all_words] ? ' AND ' : ' OR ')
|
||||
find_options = [sql, * (tokens.collect {|w| "%#{w.downcase}%"} * token_clauses.size).sort]
|
||||
|
||||
project_conditions = []
|
||||
project_conditions << Project.allowed_to_condition(user, :view_dmsf_files)
|
||||
project_conditions << Project.allowed_to_condition(user, :view_dmsf_files)
|
||||
project_conditions << "#{DmsfFile.table_name}.project_id IN (#{project_ids.join(',')})" if project_ids.present?
|
||||
|
||||
results = []
|
||||
|
||||
scope = self.visible.joins(:project, :revisions)
|
||||
scope = scope.limit(options[:limit]) unless options[:limit].blank?
|
||||
results = []
|
||||
|
||||
scope = self.visible.joins(:project, :dmsf_file_revisions)
|
||||
scope = scope.limit(options[:limit]) unless options[:limit].blank?
|
||||
scope = scope.where(limit_options) unless limit_options.blank?
|
||||
scope = scope.where(project_conditions.join(' AND '))
|
||||
scope = scope.where(project_conditions.join(' AND '))
|
||||
results = scope.where(find_options).uniq.to_a
|
||||
|
||||
if !options[:titles_only] && $xapian_bindings_available
|
||||
@ -327,7 +330,7 @@ class DmsfFile < ActiveRecord::Base
|
||||
Setting.plugin_redmine_dmsf['dmsf_index_database'].strip, lang)
|
||||
database = Xapian::Database.new(databasepath)
|
||||
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
|
||||
end
|
||||
|
||||
@ -360,7 +363,7 @@ class DmsfFile < ActiveRecord::Base
|
||||
enquire.query = query
|
||||
matchset = enquire.mset(0, 1000)
|
||||
|
||||
if matchset
|
||||
if matchset
|
||||
matchset.matches.each { |m|
|
||||
docdata = m.document.data{url}
|
||||
dochash = Hash[*docdata.scan(/(url|sample|modtime|author|type|size)=\/?([^\n\]]+)/).flatten]
|
||||
@ -371,14 +374,14 @@ class DmsfFile < ActiveRecord::Base
|
||||
id_attribute = dmsf_attrs[0][1] if dmsf_attrs.length > 0
|
||||
next if dmsf_attrs.length == 0 || id_attribute == 0
|
||||
next unless results.select{|f| f.id.to_s == id_attribute}.empty?
|
||||
|
||||
|
||||
dmsf_file = DmsfFile.visible.where(limit_options).where(:id => id_attribute).first
|
||||
|
||||
if dmsf_file
|
||||
if user.allowed_to?(:view_dmsf_files, dmsf_file.project) &&
|
||||
(project_ids.blank? || (project_ids.include?(dmsf_file.project.id)))
|
||||
Redmine::Search.cache_store.write("DmsfFile-#{dmsf_file.id}",
|
||||
dochash['sample'].force_encoding('UTF-8')) if dochash['sample']
|
||||
if user.allowed_to?(:view_dmsf_files, dmsf_file.project) &&
|
||||
(project_ids.blank? || (project_ids.include?(dmsf_file.project.id)))
|
||||
Redmine::Search.cache_store.write("DmsfFile-#{dmsf_file.id}",
|
||||
dochash['sample'].force_encoding('UTF-8')) if dochash['sample']
|
||||
break if(!options[:limit].blank? && results.count >= options[:limit])
|
||||
results << dmsf_file
|
||||
end
|
||||
@ -388,14 +391,14 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
[results, results.count]
|
||||
end
|
||||
|
||||
|
||||
def self.search_result_ranks_and_ids(tokens, user = User.current, projects = nil, options = {})
|
||||
r = self.search(tokens, projects, options, user)[0]
|
||||
r.map{ |f| [f.updated_at.to_i, f.id]}
|
||||
end
|
||||
end
|
||||
|
||||
def display_name
|
||||
if self.name.length > 50
|
||||
@ -403,33 +406,33 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
self.name
|
||||
end
|
||||
|
||||
|
||||
def image?
|
||||
self.last_revision && !!(self.last_revision.disk_filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png|svg)$/i)
|
||||
end
|
||||
|
||||
|
||||
def preview(limit)
|
||||
result = 'No preview available'
|
||||
if (self.last_revision.disk_filename =~ /\.(txt|ini|diff|c|cpp|php|csv|rb|h|erb|html|css|py)$/i)
|
||||
begin
|
||||
f = File.new(self.last_revision.disk_file)
|
||||
f.each_line do |line|
|
||||
f.each_line do |line|
|
||||
case f.lineno
|
||||
when 1
|
||||
result = line
|
||||
when limit.to_i + 1
|
||||
break
|
||||
else
|
||||
result << line
|
||||
end
|
||||
result << line
|
||||
end
|
||||
end
|
||||
rescue Exception => e
|
||||
result = e.message
|
||||
end
|
||||
end
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
|
||||
def formatted_name(format)
|
||||
if self.last_revision
|
||||
self.last_revision.formatted_name(format)
|
||||
@ -437,5 +440,16 @@ class DmsfFile < ActiveRecord::Base
|
||||
self.name
|
||||
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
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# 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>
|
||||
# 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
|
||||
@ -19,28 +19,30 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
require 'digest/md5'
|
||||
|
||||
class DmsfFileRevision < ActiveRecord::Base
|
||||
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 :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'
|
||||
has_many :access, :class_name => 'DmsfFileRevisionAccess', :foreign_key => 'dmsf_file_revision_id', :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
|
||||
scope :visible, -> { where(deleted: false) }
|
||||
scope :deleted, -> { where(deleted: true) }
|
||||
has_many :dmsf_file_revision_access, :dependent => :destroy
|
||||
has_many :dmsf_workflow_step_assignment, :dependent => :destroy
|
||||
|
||||
STATUS_DELETED = 1
|
||||
STATUS_ACTIVE = 0
|
||||
|
||||
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
|
||||
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
|
||||
|
||||
acts_as_customizable
|
||||
acts_as_event :title => Proc.new {|o| "#{l(:label_dmsf_updated)}: #{o.file.dmsf_path_str}"},
|
||||
:url => Proc.new {|o| {:controller => 'dmsf_files', :action => 'show', :id => o.file}},
|
||||
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.dmsf_file}},
|
||||
:datetime => Proc.new {|o| o.updated_at },
|
||||
:description => Proc.new {|o| o.comment },
|
||||
:author => Proc.new {|o| o.user }
|
||||
|
||||
|
||||
acts_as_activity_provider :type => 'dmsf_file_revisions',
|
||||
:timestamp => "#{DmsfFileRevision.table_name}.updated_at",
|
||||
:author_key => "#{DmsfFileRevision.table_name}.user_id",
|
||||
@ -49,18 +51,18 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
joins(
|
||||
"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").
|
||||
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,
|
||||
:message => l(:error_contains_invalid_character)
|
||||
|
||||
def project
|
||||
self.file.project if self.file
|
||||
self.dmsf_file.project if self.dmsf_file
|
||||
end
|
||||
|
||||
def folder
|
||||
self.file.folder if self.file
|
||||
self.dmsf_file.dmsf_folder if self.dmsf_file
|
||||
end
|
||||
|
||||
def self.remove_extension(filename)
|
||||
@ -72,11 +74,11 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
end
|
||||
|
||||
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)
|
||||
return false
|
||||
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)
|
||||
return false
|
||||
end
|
||||
@ -88,14 +90,14 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
if commit
|
||||
self.destroy
|
||||
else
|
||||
self.deleted = true
|
||||
self.deleted = DmsfFile::STATUS_DELETED
|
||||
self.deleted_by_user = User.current
|
||||
save
|
||||
end
|
||||
end
|
||||
|
||||
def restore
|
||||
self.deleted = false
|
||||
self.deleted = DmsfFile::STATUS_ACTIVE
|
||||
self.deleted_by_user = nil
|
||||
save
|
||||
end
|
||||
@ -120,7 +122,7 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
# custom SQL into a temporary object
|
||||
#
|
||||
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
|
||||
|
||||
def version
|
||||
@ -128,13 +130,13 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def disk_file(project = nil)
|
||||
project = self.file.project unless project
|
||||
project = self.dmsf_file.project unless project
|
||||
storage_base = DmsfFile.storage_path.dup
|
||||
if self.file && project
|
||||
if self.dmsf_file && project
|
||||
project_base = project.identifier.gsub(/[^\w\.\-]/,'_')
|
||||
storage_base << "/p_#{project_base}"
|
||||
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}"
|
||||
end
|
||||
|
||||
@ -147,7 +149,7 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
|
||||
def clone
|
||||
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.size = self.size
|
||||
new_revision.mime_type = self.mime_type
|
||||
@ -159,6 +161,7 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
new_revision.source_revision = self
|
||||
new_revision.user = User.current
|
||||
new_revision.name = self.name
|
||||
new_revision.digest = self.digest
|
||||
new_revision
|
||||
end
|
||||
|
||||
@ -200,34 +203,31 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
wf.assign(self.id) if wf && self.id
|
||||
end
|
||||
|
||||
def increase_version(version_to_increase, new_content)
|
||||
if new_content
|
||||
self.minor_version = case version_to_increase
|
||||
when 2 then 0
|
||||
else self.minor_version + 1
|
||||
end
|
||||
else
|
||||
self.minor_version = case version_to_increase
|
||||
when 1 then self.minor_version + 1
|
||||
when 2 then 0
|
||||
else self.minor_version
|
||||
end
|
||||
def increase_version(version_to_increase)
|
||||
self.minor_version = case version_to_increase
|
||||
when 1
|
||||
self.minor_version + 1
|
||||
when 2
|
||||
0
|
||||
else
|
||||
self.minor_version
|
||||
end
|
||||
|
||||
self.major_version = case version_to_increase
|
||||
when 2 then self.major_version + 1
|
||||
else self.major_version
|
||||
when 2
|
||||
self.major_version + 1
|
||||
else
|
||||
major_version
|
||||
end
|
||||
end
|
||||
|
||||
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)
|
||||
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!
|
||||
end
|
||||
"#{timestamp}_#{self.file.id}_#{filename}"
|
||||
"#{timestamp}_#{self.dmsf_file.id}_#{filename}"
|
||||
end
|
||||
|
||||
def copy_file_content(open_file)
|
||||
@ -247,7 +247,7 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
parts = self.version.split '.'
|
||||
parts.size == 2 ? parts[0].to_i * 1000 + parts[1].to_i : 0
|
||||
end
|
||||
|
||||
|
||||
def formatted_name(format)
|
||||
return self.name if format.blank?
|
||||
if self.name =~ /(.*)(\..*)$/
|
||||
@ -255,13 +255,43 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
ext = $2
|
||||
else
|
||||
filename = self.name
|
||||
end
|
||||
format.sub!('%t', filename)
|
||||
end
|
||||
format.sub!('%t', self.title)
|
||||
format.sub!('%f', filename)
|
||||
format.sub!('%d', self.updated_at.strftime('%Y%m%d%H%M%S'))
|
||||
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 + 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 += '
' if text.present?
|
||||
text += self.comment
|
||||
end
|
||||
text.html_safe
|
||||
end
|
||||
|
||||
end
|
||||
@ -1,6 +1,9 @@
|
||||
# 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) 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
|
||||
@ -17,22 +20,22 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
class DmsfFileRevisionAccess < ActiveRecord::Base
|
||||
|
||||
unloadable
|
||||
belongs_to :revision, :class_name => 'DmsfFileRevision', :foreign_key => 'dmsf_file_revision_id'
|
||||
belongs_to :dmsf_file_revision
|
||||
belongs_to :user
|
||||
delegate :project, :to => :revision, :allow_nil => false
|
||||
delegate :file, :to => :revision, :allow_nil => false
|
||||
accepts_nested_attributes_for :user, :revision
|
||||
delegate :dmsf_file, :to => :dmsf_file_revision, :allow_nil => false
|
||||
delegate :project, :to => :dmsf_file, :allow_nil => false
|
||||
|
||||
DownloadAction = 0
|
||||
EmailAction = 1
|
||||
|
||||
acts_as_event :title => Proc.new {|o| "#{l(:label_dmsf_downloaded)}: #{o.file.dmsf_path_str}"},
|
||||
:url => Proc.new {|o| {:controller => 'dmsf_files', :action => 'show', :id => o.file}},
|
||||
:datetime => Proc.new {|o| o.updated_at },
|
||||
:description => Proc.new {|o| o.revision.comment },
|
||||
:author => Proc.new {|o| o.user }
|
||||
|
||||
acts_as_event :title => Proc.new {|ra| "#{l(:label_dmsf_downloaded)}: #{ra.dmsf_file.dmsf_path_str}"},
|
||||
:url => Proc.new {|ra| {:controller => 'dmsf_files', :action => 'show', :id => ra.dmsf_file}},
|
||||
:datetime => Proc.new {|ra| ra.updated_at },
|
||||
:description => Proc.new {|ra| ra.dmsf_file_revision.comment },
|
||||
:author => Proc.new {|ra| ra.user }
|
||||
|
||||
acts_as_activity_provider :type => 'dmsf_file_revision_accesses',
|
||||
:timestamp => "#{DmsfFileRevisionAccess.table_name}.updated_at",
|
||||
:author_key => "#{DmsfFileRevisionAccess.table_name}.user_id",
|
||||
@ -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 #{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").
|
||||
where("#{DmsfFile.table_name}.deleted = :false", {:false => false})
|
||||
|
||||
where("#{DmsfFile.table_name}.deleted = ?", DmsfFile::STATUS_ACTIVE)
|
||||
end
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -17,18 +19,18 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
class DmsfFileRevisionCustomField < CustomField
|
||||
|
||||
class DmsfFileRevisionCustomField < CustomField
|
||||
|
||||
def type_name
|
||||
:menu_dmsf
|
||||
end
|
||||
|
||||
|
||||
def compare_values?(x, y)
|
||||
if x.is_a?(Array) && y.is_a?(Array) && !y.empty?
|
||||
x.include? y[0]
|
||||
else
|
||||
x.include? y[0]
|
||||
else
|
||||
x == y
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@ -3,7 +3,7 @@
|
||||
# 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@konton.com>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@konton.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -25,44 +25,41 @@ class DmsfFolder < ActiveRecord::Base
|
||||
include RedmineDmsf::Lockable
|
||||
|
||||
cattr_reader :invalid_characters
|
||||
@@invalid_characters = /\A[^\/\\\?":<>]*\z/
|
||||
@@invalid_characters = /\A[^\/\\\?":<>]*\z/
|
||||
|
||||
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 :user
|
||||
|
||||
has_many :subfolders, :class_name => 'DmsfFolder', :foreign_key => 'dmsf_folder_id',
|
||||
:dependent => :destroy
|
||||
has_many :files, :class_name => 'DmsfFile', :foreign_key => 'dmsf_folder_id',
|
||||
:dependent => :destroy
|
||||
has_many :folder_links, -> { where :target_type => 'DmsfFolder' },
|
||||
has_many :dmsf_folders, -> { order(:title) }, :dependent => :destroy
|
||||
has_many :dmsf_files, :dependent => :destroy
|
||||
has_many :folder_links, -> { where(:target_type => 'DmsfFolder').order(:name) },
|
||||
:class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy
|
||||
has_many :file_links, -> { where :target_type => 'DmsfFile' },
|
||||
:class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy
|
||||
has_many :url_links, -> { where :target_type => 'DmsfUrl' },
|
||||
:class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :dependent => :destroy
|
||||
has_many :dmsf_links, :dependent => :destroy
|
||||
has_many :referenced_links, -> { where :target_type => 'DmsfFolder' },
|
||||
:class_name => 'DmsfLink', :foreign_key => 'target_id', :dependent => :destroy
|
||||
has_many :locks, -> { where(entity_type: 1).order("#{DmsfLock.table_name}.updated_at DESC") },
|
||||
: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|
|
||||
where(deleted: false)
|
||||
}
|
||||
scope :deleted, lambda { |*args|
|
||||
where(deleted: true)
|
||||
}
|
||||
|
||||
STATUS_DELETED = 1
|
||||
STATUS_ACTIVE = 0
|
||||
|
||||
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
|
||||
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
|
||||
|
||||
acts_as_customizable
|
||||
|
||||
|
||||
acts_as_searchable :columns => ["#{self.table_name}.title", "#{self.table_name}.description"],
|
||||
:project_key => 'project_id',
|
||||
:date_column => 'updated_at',
|
||||
:permission => :view_dmsf_files,
|
||||
:scope => self.joins(:project)
|
||||
|
||||
:scope => self.joins(:project)
|
||||
|
||||
acts_as_event :title => Proc.new {|o| o.title},
|
||||
:description => Proc.new {|o| o.description },
|
||||
:url => Proc.new {|o| {:controller => 'dmsf', :action => 'show', :id => o.project, :folder_id => o}},
|
||||
@ -70,8 +67,8 @@ class DmsfFolder < ActiveRecord::Base
|
||||
:author => Proc.new {|o| o.user }
|
||||
|
||||
validates :title, :presence => true
|
||||
validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted],
|
||||
conditions: -> { where.not(deleted: true) }
|
||||
validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted],
|
||||
conditions: -> { where(:deleted => STATUS_ACTIVE) }
|
||||
validates_format_of :title, :with => @@invalid_characters,
|
||||
:message => l(:error_contains_invalid_character)
|
||||
validate :check_cycle
|
||||
@ -88,13 +85,13 @@ class DmsfFolder < ActiveRecord::Base
|
||||
|
||||
def check_cycle
|
||||
folders = []
|
||||
self.subfolders.each {|f| folders.push(f)}
|
||||
folders.each do |folder|
|
||||
if folder == self.folder
|
||||
self.dmsf_folders.each {|f| folders.push(f)}
|
||||
self.dmsf_folders.each do |folder|
|
||||
if folder == self.dmsf_folder
|
||||
errors.add(:folder, l(:error_create_cycle_in_folder_dependency))
|
||||
return false
|
||||
end
|
||||
folder.subfolders.each {|f| folders.push(f)}
|
||||
folder.dmsf_folders.each {|f| folders.push(f)}
|
||||
end
|
||||
return true
|
||||
end
|
||||
@ -111,27 +108,29 @@ class DmsfFolder < ActiveRecord::Base
|
||||
if self.locked?
|
||||
errors[:base] << l(:error_folder_is_locked)
|
||||
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)
|
||||
return false
|
||||
end
|
||||
self.referenced_links.each { |l| l.delete(commit) }
|
||||
if commit
|
||||
self.destroy
|
||||
else
|
||||
self.deleted = true
|
||||
self.deleted = STATUS_DELETED
|
||||
self.deleted_by_user = User.current
|
||||
self.save
|
||||
end
|
||||
end
|
||||
|
||||
def deleted?
|
||||
self.deleted == STATUS_DELETED
|
||||
end
|
||||
|
||||
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)
|
||||
return false
|
||||
end
|
||||
self.referenced_links.each { |l| l.restore }
|
||||
self.deleted = false
|
||||
self.deleted = STATUS_ACTIVE
|
||||
self.deleted_by_user = nil
|
||||
self.save
|
||||
end
|
||||
@ -141,7 +140,7 @@ class DmsfFolder < ActiveRecord::Base
|
||||
path = []
|
||||
while folder
|
||||
path.unshift(folder)
|
||||
folder = folder.folder
|
||||
folder = folder.dmsf_folder
|
||||
end
|
||||
path
|
||||
end
|
||||
@ -154,8 +153,8 @@ class DmsfFolder < ActiveRecord::Base
|
||||
|
||||
def notify?
|
||||
return true if self.notification
|
||||
return true if folder && folder.notify?
|
||||
return true if !folder && self.project.dmsf_notification
|
||||
return true if self.dmsf_folder && self.dmsf_folder.notify?
|
||||
return true if !self.dmsf_folder && self.project.dmsf_notification
|
||||
return false
|
||||
end
|
||||
|
||||
@ -196,21 +195,21 @@ class DmsfFolder < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def deep_file_count
|
||||
file_count = self.files.visible.count
|
||||
self.subfolders.visible.each {|subfolder| file_count += subfolder.deep_file_count}
|
||||
file_count + self.file_links.visible.count
|
||||
file_count = self.dmsf_files.visible.count
|
||||
self.dmsf_folders.visible.each { |subfolder| file_count += subfolder.deep_file_count }
|
||||
file_count + self.file_links.visible.count + self.url_links.visible.count
|
||||
end
|
||||
|
||||
def deep_folder_count
|
||||
folder_count = self.subfolders.visible.count
|
||||
self.subfolders.visible.each {|subfolder| folder_count += subfolder.deep_folder_count}
|
||||
folder_count = self.dmsf_folders.visible.count
|
||||
self.dmsf_folders.visible.each { |subfolder| folder_count += subfolder.deep_folder_count }
|
||||
folder_count + self.folder_links.visible.count
|
||||
end
|
||||
|
||||
def deep_size
|
||||
size = 0
|
||||
self.files.visible.each {|file| size += file.size}
|
||||
self.subfolders.visible.each {|subfolder| size += subfolder.deep_size}
|
||||
self.dmsf_files.visible.each {|file| size += file.size}
|
||||
self.dmsf_folders.visible.each {|subfolder| size += subfolder.deep_size}
|
||||
size
|
||||
end
|
||||
|
||||
@ -227,7 +226,7 @@ class DmsfFolder < ActiveRecord::Base
|
||||
|
||||
def copy_to(project, folder)
|
||||
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.title = self.title
|
||||
new_folder.description = self.description
|
||||
@ -240,11 +239,11 @@ class DmsfFolder < ActiveRecord::Base
|
||||
|
||||
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
|
||||
end
|
||||
|
||||
self.subfolders.visible.each do |s|
|
||||
self.dmsf_folders.visible.each do |s|
|
||||
s.copy_to project, new_folder
|
||||
end
|
||||
|
||||
@ -267,13 +266,13 @@ class DmsfFolder < ActiveRecord::Base
|
||||
def available_custom_fields
|
||||
DmsfFileRevisionCustomField.all
|
||||
end
|
||||
|
||||
|
||||
def modified
|
||||
last_update = updated_at
|
||||
subfolders.each do |subfolder|
|
||||
dmsf_folders.each do |subfolder|
|
||||
last_update = subfolder.updated_at if subfolder.updated_at > last_update
|
||||
end
|
||||
files.each do |file|
|
||||
dmsf_files.each do |file|
|
||||
last_update = file.updated_at if file.updated_at > last_update
|
||||
end
|
||||
folder_links.each do |folder_link|
|
||||
@ -287,20 +286,20 @@ class DmsfFolder < ActiveRecord::Base
|
||||
end
|
||||
last_update
|
||||
end
|
||||
|
||||
|
||||
# Number of items in the folder
|
||||
def items
|
||||
subfolders.visible.count +
|
||||
files.visible.count +
|
||||
dmsf_folders.visible.count +
|
||||
dmsf_files.visible.count +
|
||||
folder_links.visible.count +
|
||||
file_links.visible.count +
|
||||
url_links.visible.count
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
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
|
||||
tree.push(["#{'...' * level}#{subfolder.title}", subfolder.id])
|
||||
directory_subtree(tree, subfolder, level + 1, current_folder)
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -29,21 +29,28 @@ class DmsfLink < ActiveRecord::Base
|
||||
|
||||
validates :name, :presence => true
|
||||
validates_length_of :name, :maximum => 255
|
||||
validates_length_of :external_url, :maximum => 255
|
||||
validates_length_of :external_url, :maximum => 255
|
||||
validate :validate_url
|
||||
|
||||
|
||||
def validate_url
|
||||
if self.target_type == 'DmsfUrl'
|
||||
begin
|
||||
URI.parse self.external_url
|
||||
rescue URI::InvalidURIError
|
||||
begin
|
||||
if self.external_url.present?
|
||||
URI.parse self.external_url
|
||||
else
|
||||
errors.add :external_url, :invalid
|
||||
end
|
||||
rescue URI::InvalidURIError
|
||||
errors.add :external_url, :invalid
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
scope :visible, -> { where(deleted: false) }
|
||||
scope :deleted, -> { where(deleted: true) }
|
||||
|
||||
STATUS_DELETED = 1
|
||||
STATUS_ACTIVE = 0
|
||||
|
||||
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
|
||||
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
|
||||
|
||||
def target_folder_id
|
||||
if self.target_type == DmsfFolder.model_name.to_s
|
||||
@ -90,9 +97,9 @@ class DmsfLink < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def path
|
||||
if self.target_type == DmsfFile.model_name.to_s
|
||||
if self.target_type == DmsfFile.model_name.to_s
|
||||
path = self.target_file.dmsf_path.map { |element| element.is_a?(DmsfFile) ? element.name : element.title }.join('/') if self.target_file
|
||||
else
|
||||
else
|
||||
path = self.target_folder ? self.target_folder.dmsf_path_str : ''
|
||||
end
|
||||
path.insert(0, "#{self.target_project.name}:") if self.project_id != self.target_project_id
|
||||
@ -119,20 +126,28 @@ class DmsfLink < ActiveRecord::Base
|
||||
if commit
|
||||
self.destroy
|
||||
else
|
||||
self.deleted = true
|
||||
self.deleted = STATUS_DELETED
|
||||
self.deleted_by_user = User.current
|
||||
save
|
||||
save(:validate => false)
|
||||
end
|
||||
end
|
||||
|
||||
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)
|
||||
return false
|
||||
end
|
||||
self.deleted = false
|
||||
self.deleted = STATUS_ACTIVE
|
||||
self.deleted_by_user = nil
|
||||
save
|
||||
save(:validate => false)
|
||||
end
|
||||
|
||||
end
|
||||
def is_folder?
|
||||
self.target_type == 'DmsfFolder'
|
||||
end
|
||||
|
||||
def is_file?
|
||||
!is_folder?
|
||||
end
|
||||
|
||||
end
|
||||
@ -29,10 +29,9 @@ class DmsfLock < ActiveRecord::Base
|
||||
belongs_to :user
|
||||
|
||||
# At the moment apparently we're only supporting a write lock?
|
||||
|
||||
as_enum :lock_type, [:type_write, :type_other]
|
||||
as_enum :lock_scope, [:scope_exclusive, :scope_shared]
|
||||
|
||||
|
||||
# We really loosely bind the value in the belongs_to above
|
||||
# here we just ensure the data internal to the model is correct
|
||||
# to ensure everything lists fine - it's the same as a join
|
||||
@ -73,5 +72,5 @@ class DmsfLock < ActiveRecord::Base
|
||||
def self.find_by_param(*args)
|
||||
self.find(*args)
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@ -3,7 +3,7 @@
|
||||
# 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>
|
||||
# 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
|
||||
@ -23,79 +23,73 @@ require 'mailer'
|
||||
|
||||
class DmsfMailer < Mailer
|
||||
layout 'mailer'
|
||||
|
||||
|
||||
def files_updated(user, project, files)
|
||||
if user && project && files.count > 0
|
||||
if user && project && files.count > 0
|
||||
files = files.select { |file| file.notify? }
|
||||
|
||||
redmine_headers 'Project' => project.identifier if project
|
||||
|
||||
@files = files
|
||||
@project = project
|
||||
|
||||
message_id project
|
||||
set_language_if_valid user.language
|
||||
mail :to => user.mail,
|
||||
:subject => l(:text_email_doc_updated_subject, :project => project.name)
|
||||
mail :to => user.mail,
|
||||
:subject => "[#{@project.name} - #{l(:menu_dmsf)}] #{l(:text_email_doc_updated_subject)}"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def files_deleted(user, project, files)
|
||||
if user && files.count > 0
|
||||
if user && files.count > 0
|
||||
files = files.select { |file| file.notify? }
|
||||
|
||||
redmine_headers 'Project' => project.identifier if project
|
||||
|
||||
@files = files
|
||||
@project = project
|
||||
|
||||
message_id project
|
||||
set_language_if_valid user.language
|
||||
mail :to => user.mail,
|
||||
:subject => l(:text_email_doc_deleted_subject, :project => project.name)
|
||||
mail :to => user.mail,
|
||||
:subject => "[#{@project.name} - #{l(:menu_dmsf)}] #{l(:text_email_doc_deleted_subject)}"
|
||||
end
|
||||
end
|
||||
|
||||
def send_documents(project, user, email_params)
|
||||
zipped_content_data = open(email_params[:zipped_content], 'rb') { |io| io.read }
|
||||
|
||||
redmine_headers 'Project' => project.identifier if project
|
||||
|
||||
def send_documents(project, user, email_params)
|
||||
zipped_content_data = open(email_params[:zipped_content], 'rb') { |io| io.read }
|
||||
redmine_headers 'Project' => project.identifier if project
|
||||
@body = email_params[:body]
|
||||
@links_only = email_params[:links_only]
|
||||
@folders = email_params[:folders]
|
||||
@files = email_params[:files]
|
||||
|
||||
unless @links_only == '1'
|
||||
attachments['Documents.zip'] = { :content_type => 'application/zip', :content => zipped_content_data }
|
||||
end
|
||||
|
||||
mail :to => email_params[:to], :cc => email_params[:cc], :subject => email_params[:subject], :from => user.mail
|
||||
mail :to => email_params[:to], :cc => email_params[:cc],
|
||||
:subject => email_params[:subject], :from => user.mail
|
||||
end
|
||||
|
||||
|
||||
def workflow_notification(user, workflow, revision, subject_id, text1_id, text2_id, notice = nil)
|
||||
if user && workflow && revision
|
||||
if revision.file && revision.file.project
|
||||
@project = revision.file.project
|
||||
if revision.dmsf_file && revision.dmsf_file.project
|
||||
@project = revision.dmsf_file.project
|
||||
redmine_headers 'Project' => @project.identifier
|
||||
end
|
||||
set_language_if_valid user.language
|
||||
@user = user
|
||||
message_id workflow
|
||||
@workflow = workflow
|
||||
@revision = revision
|
||||
@text1 = l(text1_id, :name => workflow.name, :filename => revision.file.name, :notice => notice)
|
||||
@revision = revision
|
||||
@text1 = l(text1_id, :name => workflow.name, :filename => revision.dmsf_file.name, :notice => notice)
|
||||
@text2 = l(text2_id)
|
||||
@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
|
||||
|
||||
def self.get_notify_users(project, files = nil)
|
||||
if files
|
||||
end
|
||||
|
||||
def self.get_notify_users(project, files = [])
|
||||
if files.present?
|
||||
notify_files = files.select { |file| file.notify? }
|
||||
return [] if notify_files.empty?
|
||||
end
|
||||
notify_members = project.members
|
||||
notify_members = notify_members.select do |notify_member|
|
||||
notify_user = notify_member.user
|
||||
end
|
||||
notify_members = project.members.select do |notify_member|
|
||||
notify_user = notify_member.user
|
||||
if notify_user == User.current && notify_user.pref.no_self_notified
|
||||
false
|
||||
else
|
||||
@ -105,18 +99,34 @@ class DmsfMailer < Mailer
|
||||
true
|
||||
when 'selected'
|
||||
notify_member.mail_notification?
|
||||
when 'only_my_events', 'only_owner'
|
||||
notify_user.allowed_to?(:file_manipulation, project)
|
||||
when 'only_my_events'
|
||||
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
|
||||
false
|
||||
end
|
||||
else
|
||||
else
|
||||
notify_member.dmsf_mail_notification
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
notify_members.collect { |m| m.user }.uniq
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@ -1,8 +1,10 @@
|
||||
# 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-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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -19,63 +21,67 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
class DmsfUpload
|
||||
attr_accessor :name
|
||||
attr_accessor :name
|
||||
attr_accessor :disk_filename
|
||||
attr_reader :size
|
||||
attr_accessor :mime_type
|
||||
attr_accessor :title
|
||||
attr_accessor :description
|
||||
attr_accessor :description
|
||||
attr_accessor :comment
|
||||
attr_accessor :major_version
|
||||
attr_accessor :minor_version
|
||||
attr_accessor :locked
|
||||
attr_accessor :locked
|
||||
attr_accessor :workflow
|
||||
attr_accessor :custom_values
|
||||
|
||||
attr_accessor :custom_values
|
||||
|
||||
def disk_file
|
||||
"#{DmsfHelper.temp_dir}/#{self.disk_filename}"
|
||||
end
|
||||
|
||||
def self.create_from_uploaded_attachment(project, folder, uploaded_file)
|
||||
a = Attachment.find_by_token(uploaded_file[:token])
|
||||
end
|
||||
|
||||
def self.create_from_uploaded_attachment(project, folder, uploaded_file)
|
||||
a = Attachment.find_by_token(uploaded_file[:token])
|
||||
if a
|
||||
uploaded = {
|
||||
:disk_filename => DmsfHelper.temp_filename(a.filename),
|
||||
:content_type => a.content_type,
|
||||
:original_filename => a.filename,
|
||||
:comment => uploaded_file[:description]
|
||||
}
|
||||
}
|
||||
FileUtils.mv(a.diskfile, "#{DmsfHelper.temp_dir}/#{uploaded[:disk_filename]}")
|
||||
a.destroy
|
||||
a.destroy
|
||||
upload = DmsfUpload.new(project, folder, uploaded)
|
||||
else
|
||||
Rails.logger.error "An attachment not found by its token: #{uploaded_file[:token]}"
|
||||
Rails.logger.error "An attachment not found by its token: #{uploaded_file[:token]}"
|
||||
end
|
||||
upload
|
||||
end
|
||||
|
||||
|
||||
def initialize(project, folder, uploaded)
|
||||
@name = uploaded[:original_filename]
|
||||
|
||||
|
||||
file = DmsfFile.find_file_by_name(project, folder, @name)
|
||||
unless file
|
||||
link = DmsfLink.find_link_by_file_name(project, folder, @name)
|
||||
file = link.target_file if link
|
||||
end
|
||||
|
||||
|
||||
@disk_filename = uploaded[:disk_filename]
|
||||
@mime_type = uploaded[:content_type]
|
||||
@size = File.size(disk_file)
|
||||
|
||||
@size = File.size(disk_file)
|
||||
|
||||
if file.nil? || file.last_revision.nil?
|
||||
@title = DmsfFileRevision.filename_to_title(@name)
|
||||
@description = uploaded[:comment]
|
||||
@major_version = 0
|
||||
@minor_version = 0
|
||||
@workflow = nil
|
||||
@custom_values = DmsfFileRevision.new(:file => DmsfFile.new(:project => @project)).custom_field_values
|
||||
@workflow = nil
|
||||
file = DmsfFile.new
|
||||
file.project = @project
|
||||
revision = DmsfFileRevision.new
|
||||
revision.dmsf_file = file
|
||||
@custom_values = revision.custom_field_values
|
||||
else
|
||||
last_revision = file.last_revision
|
||||
last_revision = file.last_revision
|
||||
@title = last_revision.title
|
||||
if last_revision.description.present?
|
||||
@description = last_revision.description
|
||||
@ -86,7 +92,7 @@ class DmsfUpload
|
||||
@major_version = last_revision.major_version
|
||||
@minor_version = last_revision.minor_version
|
||||
@workflow = last_revision.workflow
|
||||
@custom_values = Array.new(file.last_revision.custom_values)
|
||||
@custom_values = Array.new(file.last_revision.custom_values)
|
||||
|
||||
# Add default value for CFs not existing
|
||||
present_custom_fields = file.last_revision.custom_values.collect(&:custom_field).uniq
|
||||
@ -96,8 +102,8 @@ class DmsfUpload
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@locked = file && file.locked_for_user?
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -18,49 +18,54 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
class DmsfWorkflow < ActiveRecord::Base
|
||||
|
||||
has_many :dmsf_workflow_steps, -> { order 'step ASC, operator DESC' }, :dependent => :destroy
|
||||
|
||||
class DmsfWorkflow < ActiveRecord::Base
|
||||
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 :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
|
||||
validates :name, :presence => true
|
||||
validates_length_of :name, :maximum => 255
|
||||
|
||||
|
||||
def name_validation
|
||||
if self.project_id
|
||||
if self.id
|
||||
if (DmsfWorkflow.where(['(project_id IS NULL OR (project_id = ? AND id != ?)) AND name = ?',
|
||||
self.project_id, self.id, self.name]).count > 0)
|
||||
if (DmsfWorkflow.where(['(project_id IS NULL OR (project_id = ? AND id != ?)) AND name = ?',
|
||||
self.project_id, self.id, self.name]).exists?)
|
||||
errors.add(:name, l('activerecord.errors.messages.taken'))
|
||||
end
|
||||
else
|
||||
if (DmsfWorkflow.where(['(project_id IS NULL OR project_id = ?) AND name = ?',
|
||||
self.project_id, self.name]).count > 0)
|
||||
if (DmsfWorkflow.where(['(project_id IS NULL OR project_id = ?) AND name = ?',
|
||||
self.project_id, self.name]).exists?)
|
||||
errors.add(:name, l('activerecord.errors.messages.taken'))
|
||||
end
|
||||
end
|
||||
else
|
||||
else
|
||||
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'))
|
||||
end
|
||||
else
|
||||
if DmsfWorkflow.where(:name => self.name).count > 0
|
||||
if DmsfWorkflow.where(:name => self.name).exists?
|
||||
errors.add(:name, l('activerecord.errors.messages.taken'))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
STATE_NONE = nil
|
||||
STATE_ASSIGNED = 3
|
||||
STATE_WAITING_FOR_APPROVAL = 1
|
||||
STATE_APPROVED = 2
|
||||
STATE_REJECTED = 4
|
||||
|
||||
|
||||
STATUS_LOCKED = 0
|
||||
STATUS_ACTIVE = 1
|
||||
|
||||
def participiants
|
||||
users = Array.new
|
||||
self.dmsf_workflow_steps.each do |step|
|
||||
@ -70,90 +75,58 @@ class DmsfWorkflow < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def self.workflows(project)
|
||||
project ? where(:project_id => project) : where('project_id IS NULL')
|
||||
project ? where(:project_id => project) : where('project_id IS NULL')
|
||||
end
|
||||
|
||||
def project
|
||||
def project
|
||||
Project.find_by_id(project_id) if project_id
|
||||
end
|
||||
|
||||
def to_s
|
||||
name
|
||||
end
|
||||
end
|
||||
|
||||
def reorder_steps(step, move_to)
|
||||
DmsfWorkflow.transaction do
|
||||
case move_to
|
||||
when 'highest'
|
||||
unless step == 1
|
||||
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', 1)
|
||||
end
|
||||
end
|
||||
dmsf_workflow_steps.each do |ws|
|
||||
if ws.step == step
|
||||
return false unless ws.update_attribute('step', move_to)
|
||||
elsif ws.step >= move_to && ws.step < step
|
||||
# Move up
|
||||
return false unless ws.update_attribute('step', ws.step + 1)
|
||||
elsif ws.step <= move_to && ws.step > step
|
||||
# Move down
|
||||
return false unless ws.update_attribute('step', ws.step - 1)
|
||||
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
|
||||
return reload
|
||||
end
|
||||
end
|
||||
return true
|
||||
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)
|
||||
if dmsf_workflow_step_assignment_id && dmsf_file_revision_id
|
||||
sql = [
|
||||
'id NOT IN (SELECT a.user_id FROM dmsf_workflow_step_assignments a WHERE id = ?) AND id IN (SELECT m.user_id FROM members m JOIN dmsf_files f ON f.project_id = m.project_id JOIN dmsf_file_revisions r ON r.dmsf_file_id = f.id WHERE r.id = ?)',
|
||||
dmsf_workflow_step_assignment_id,
|
||||
'id NOT IN (SELECT a.user_id FROM dmsf_workflow_step_assignments a WHERE id = ?) AND id IN (SELECT m.user_id FROM members m JOIN dmsf_files f ON f.project_id = m.project_id JOIN dmsf_file_revisions r ON r.dmsf_file_id = f.id WHERE r.id = ?)',
|
||||
dmsf_workflow_step_assignment_id,
|
||||
dmsf_file_revision_id]
|
||||
elsif project
|
||||
sql = ['id IN (SELECT user_id FROM members WHERE project_id = ?)', project.id]
|
||||
else
|
||||
sql = '1=1'
|
||||
end
|
||||
|
||||
|
||||
if q.present?
|
||||
User.active.sorted.where(sql).like(q)
|
||||
else
|
||||
User.active.sorted.where(sql)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def next_assignments(dmsf_file_revision_id)
|
||||
results = Array.new
|
||||
|
||||
def next_assignments(dmsf_file_revision_id)
|
||||
results = Array.new
|
||||
nsteps = self.dmsf_workflow_steps.collect{|s| s.step}.uniq
|
||||
nsteps.each do |i|
|
||||
step_is_finished = false
|
||||
step_is_finished = false
|
||||
steps = self.dmsf_workflow_steps.collect{|s| s.step == i ? s : nil}.compact
|
||||
steps.each do |step|
|
||||
step.dmsf_workflow_step_assignments.each do |assignment|
|
||||
@ -162,24 +135,25 @@ class DmsfWorkflow < ActiveRecord::Base
|
||||
case action.action
|
||||
when DmsfWorkflowStepAction::ACTION_APPROVE
|
||||
step_is_finished = true
|
||||
# Try to find another unfinished AND step
|
||||
# Try to find another unfinished AND step
|
||||
exists = false
|
||||
stps = self.dmsf_workflow_steps.collect{|s| (s.step == i && s.operator == DmsfWorkflowStep::OPERATOR_AND) ? s : nil}.compact
|
||||
stps.each do |s|
|
||||
s.dmsf_workflow_step_assignments.each do |a|
|
||||
exists = a.add?(dmsf_file_revision_id)
|
||||
break if exists
|
||||
exists = a.add?(dmsf_file_revision_id)
|
||||
break if exists
|
||||
end
|
||||
end
|
||||
break if exists
|
||||
end
|
||||
step_is_finished = false if exists
|
||||
break
|
||||
when DmsfWorkflowStepAction::ACTION_REJECT
|
||||
return Array.new
|
||||
return Array.new
|
||||
end
|
||||
end
|
||||
end
|
||||
break if step_is_finished
|
||||
end
|
||||
end
|
||||
break if step_is_finished
|
||||
end
|
||||
unless step_is_finished
|
||||
@ -193,29 +167,29 @@ class DmsfWorkflow < ActiveRecord::Base
|
||||
end
|
||||
results
|
||||
end
|
||||
|
||||
|
||||
def self.assignments_to_users_str(assignments)
|
||||
str = ''
|
||||
if assignments
|
||||
assignments.each_with_index do |assignment, index|
|
||||
if assignments
|
||||
assignments.each_with_index do |assignment, index|
|
||||
if index > 0
|
||||
str << ', '
|
||||
end
|
||||
str << assignment.user.name
|
||||
str << assignment.user.name
|
||||
end
|
||||
end
|
||||
str
|
||||
str
|
||||
end
|
||||
|
||||
|
||||
def assign(dmsf_file_revision_id)
|
||||
dmsf_workflow_steps.each do |ws|
|
||||
ws.assign(dmsf_file_revision_id)
|
||||
end
|
||||
end
|
||||
|
||||
def try_finish(revision, action, user_id)
|
||||
|
||||
def try_finish(revision, action, user_id)
|
||||
case action.action
|
||||
when DmsfWorkflowStepAction::ACTION_APPROVE
|
||||
when DmsfWorkflowStepAction::ACTION_APPROVE
|
||||
assignments = self.next_assignments revision.id
|
||||
return false unless assignments.empty?
|
||||
revision.update_attribute(:workflow, DmsfWorkflow::STATE_APPROVED)
|
||||
@ -223,7 +197,7 @@ class DmsfWorkflow < ActiveRecord::Base
|
||||
when DmsfWorkflowStepAction::ACTION_REJECT
|
||||
revision.update_attribute(:workflow, DmsfWorkflow::STATE_REJECTED)
|
||||
return true
|
||||
when DmsfWorkflowStepAction::ACTION_DELEGATE
|
||||
when DmsfWorkflowStepAction::ACTION_DELEGATE
|
||||
self.dmsf_workflow_steps.each do |step|
|
||||
step.dmsf_workflow_step_assignments.each do |assignment|
|
||||
if assignment.id == action.dmsf_workflow_step_assignment_id
|
||||
@ -234,17 +208,27 @@ class DmsfWorkflow < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def copy_to(project, name = nil)
|
||||
new_wf = self.dup
|
||||
new_wf = self.dup
|
||||
new_wf.name = name if name
|
||||
new_wf.project_id = project ? project.id : nil
|
||||
new_wf.author = User.current
|
||||
if new_wf.save
|
||||
self.dmsf_workflow_steps.each do |step|
|
||||
step.copy_to(new_wf)
|
||||
end
|
||||
end
|
||||
end
|
||||
return new_wf
|
||||
end
|
||||
|
||||
def locked?
|
||||
self.status == STATUS_LOCKED
|
||||
end
|
||||
|
||||
def active?
|
||||
self.status == STATUS_ACTIVE
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -25,8 +25,8 @@ class DmsfWorkflowStep < ActiveRecord::Base
|
||||
validates :step, :presence => true
|
||||
validates :user_id, :presence => true
|
||||
validates :operator, :presence => true
|
||||
validates_uniqueness_of :user_id, :scope => [:dmsf_workflow_id, :step]
|
||||
|
||||
validates_uniqueness_of :user_id, :scope => [:dmsf_workflow_id, :step]
|
||||
|
||||
OPERATOR_OR = 0
|
||||
OPERATOR_AND = 1
|
||||
|
||||
@ -37,7 +37,7 @@ class DmsfWorkflowStep < ActiveRecord::Base
|
||||
def user
|
||||
User.find(user_id)
|
||||
end
|
||||
|
||||
|
||||
def assign(dmsf_file_revision_id)
|
||||
step_assignment = DmsfWorkflowStepAssignment.new(
|
||||
:dmsf_workflow_step_id => id,
|
||||
@ -45,20 +45,20 @@ class DmsfWorkflowStep < ActiveRecord::Base
|
||||
:dmsf_file_revision_id => dmsf_file_revision_id)
|
||||
step_assignment.save
|
||||
end
|
||||
|
||||
|
||||
def is_finished?(dmsf_file_revision_id)
|
||||
self.dmsf_workflow_step_assignments.each do |assignment|
|
||||
if assignment.dmsf_file_revision_id == dmsf_file_revision_id
|
||||
if assignment.dmsf_workflow_step_actions.empty?
|
||||
if assignment.dmsf_workflow_step_actions.empty?
|
||||
return false
|
||||
end
|
||||
assignment.dmsf_workflow_step_actions.each do |act|
|
||||
return false unless act.is_finished?
|
||||
end
|
||||
end
|
||||
end
|
||||
assignment.dmsf_workflow_step_actions.each do |act|
|
||||
return false unless act.is_finished?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def copy_to(workflow)
|
||||
new_step = self.dup
|
||||
new_step.dmsf_workflow_id = workflow.id
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -19,37 +19,35 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
class DmsfWorkflowStepAction < ActiveRecord::Base
|
||||
|
||||
belongs_to :dmsf_workflow_step_assignment
|
||||
|
||||
belongs_to :dmsf_workflow_step_assignment
|
||||
|
||||
validates :dmsf_workflow_step_assignment_id, :presence => true
|
||||
validates :action, :presence => true
|
||||
validates :note, :presence => true, :unless => lambda { self.action == DmsfWorkflowStepAction::ACTION_APPROVE }
|
||||
validates :author_id, :presence => true
|
||||
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
|
||||
|
||||
validates_uniqueness_of :dmsf_workflow_step_assignment_id, :scope => [:action], :unless => lambda {self.action == DmsfWorkflowStepAction::ACTION_DELEGATE}
|
||||
|
||||
ACTION_APPROVE = 1
|
||||
ACTION_REJECT = 2
|
||||
ACTION_DELEGATE = 3
|
||||
ACTION_ASSIGN = 4
|
||||
ACTION_START = 5
|
||||
|
||||
|
||||
def initialize(*args)
|
||||
super
|
||||
self.author_id = User.current.id if User.current
|
||||
self.author_id = User.current.id if User.current
|
||||
end
|
||||
|
||||
|
||||
def self.is_finished?(action)
|
||||
action == DmsfWorkflowStepAction::ACTION_APPROVE ||
|
||||
action == DmsfWorkflowStepAction::ACTION_REJECT
|
||||
end
|
||||
|
||||
|
||||
def is_finished?
|
||||
DmsfWorkflowStepAction.is_finished? self.action
|
||||
end
|
||||
|
||||
|
||||
def self.action_str(action)
|
||||
if action
|
||||
case action.to_i
|
||||
@ -66,7 +64,7 @@ class DmsfWorkflowStepAction < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def self.action_type_str(action)
|
||||
if action
|
||||
case action.to_i
|
||||
@ -83,12 +81,12 @@ class DmsfWorkflowStepAction < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def self.workflow_str(action)
|
||||
if action
|
||||
case action.to_i
|
||||
case action.to_i
|
||||
when ACTION_REJECT
|
||||
l(:title_rejected)
|
||||
l(:title_rejected)
|
||||
when ACTION_ASSIGN
|
||||
l(:title_assigned)
|
||||
when ACTION_START, ACTION_DELEGATE, ACTION_APPROVE
|
||||
@ -98,5 +96,5 @@ class DmsfWorkflowStepAction < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -22,17 +22,15 @@ class DmsfWorkflowStepAssignment < ActiveRecord::Base
|
||||
belongs_to :dmsf_workflow_step
|
||||
belongs_to :user
|
||||
belongs_to :dmsf_file_revision
|
||||
has_many :dmsf_workflow_step_actions, :dependent => :destroy
|
||||
validates :dmsf_workflow_step_id, :dmsf_file_revision_id, :presence => true
|
||||
has_many :dmsf_workflow_step_actions, :dependent => :destroy
|
||||
validates :dmsf_workflow_step_id, :dmsf_file_revision_id, :presence => true
|
||||
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)
|
||||
if self.dmsf_file_revision_id == dmsf_file_revision_id
|
||||
add = true
|
||||
self.dmsf_workflow_step_actions.each do |action|
|
||||
if action.is_finished?
|
||||
if action.is_finished?
|
||||
add = false
|
||||
break
|
||||
end
|
||||
|
||||
@ -1,7 +1,11 @@
|
||||
<%# Redmine plugin for Document Management System "Features"
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# 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-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
|
||||
@ -18,11 +22,12 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%>
|
||||
|
||||
<% if object %>
|
||||
<div class="dmsf-customfields">
|
||||
<div>
|
||||
<% object.show_custom_field_values.each do |custom_value| %>
|
||||
<div class="dmsf-customfield-<%= custom_value.custom_field.id %> dmsf-customfield customfield">
|
||||
<%= label_tag('', "#{h(custom_value.custom_field.name)}:") %> <%= show_value(custom_value) %>
|
||||
</div>
|
||||
<p>
|
||||
<%= label_tag('', h(custom_value.custom_field.name)) %>
|
||||
<%= show_value custom_value %>
|
||||
</p>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
@ -1,9 +1,9 @@
|
||||
<%#=
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -21,84 +21,96 @@
|
||||
%>
|
||||
|
||||
<% 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>
|
||||
<td class="title">
|
||||
<%= link_to(h(title),
|
||||
dmsf_folder_path(:id => project, :folder_id => subfolder),
|
||||
:class => 'icon icon-folder') %>
|
||||
<% if link %>
|
||||
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.path %></div>
|
||||
<% else %>
|
||||
<div class="filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div>
|
||||
<td class="dmsf_title">
|
||||
<% if @tree_view %>
|
||||
<span class='dmsf_expander' <%= onclick.html_safe %>></span>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="size"></td>
|
||||
<td class="modified"><%= format_time(subfolder.modified) if subfolder %>
|
||||
<%= link_to(h(title),
|
||||
dmsf_folder_path(:id => project, :folder_id => subfolder),
|
||||
:class => 'icon icon-folder',
|
||||
:title => h(subfolder.description)) %>
|
||||
<% if link %>
|
||||
<div class="dmsf_filename" title="<%= l(:label_target_folder)%>"><%= link.path %></div>
|
||||
<% else %>
|
||||
<div class="dmsf_filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="dmsf_size"></td>
|
||||
<td class="dmsf_modified"><%= format_time(subfolder.modified) if subfolder %>
|
||||
<% 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'),
|
||||
user_path(subfolder.lock.reverse[0].user),
|
||||
:title => l(:title_locked_by_user, :user => subfolder.lock.reverse[0].user)) %>
|
||||
<% else %>
|
||||
<%= content_tag(:span, image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
|
||||
<% else %>
|
||||
<%= content_tag(:span, image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
|
||||
:title => l(:notice_account_unknown_email)) %>
|
||||
<% end %>
|
||||
<% elsif locked %>
|
||||
<%= content_tag(:span, image_tag(link ? 'lockedbycurrent_gray.png' : 'lockedbycurrent.png', :plugin => 'redmine_dmsf'),
|
||||
<% elsif locked %>
|
||||
<%= content_tag(:span, image_tag(link ? 'lockedbycurrent_gray.png' : 'lockedbycurrent.png', :plugin => 'redmine_dmsf'),
|
||||
:title => l(:title_locked_by_you)) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="version"></td>
|
||||
<td class="workflow"></td>
|
||||
<td class="author"><%= h(subfolder.user) if subfolder %></td>
|
||||
<td class="buttons">
|
||||
<td class="dmsf_version"></td>
|
||||
<td class="dmsf_workflow"></td>
|
||||
<td class="dmsf_author"><%= h(subfolder.user) if subfolder %></td>
|
||||
<td class="dmsf_buttons">
|
||||
<% if @folder_manipulation_allowed %>
|
||||
<% unless locked %>
|
||||
<% unless locked_for_user %>
|
||||
<%= link_to(image_tag('edit.png'),
|
||||
edit_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:link_edit, :title => subfolder ? h(subfolder.title) : project.name)) %>
|
||||
<% if subfolder %>
|
||||
<%= link_to(image_tag('lock.png', :plugin => 'redmine_dmsf'),
|
||||
lock_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_lock_file)) %>
|
||||
<% if locked %>
|
||||
<% if subfolder.unlockable? %>
|
||||
<%= 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 %>
|
||||
<span class="icon"></span>
|
||||
<% end %>
|
||||
<% if (subfolder && subfolder.notification) || (!subfolder && project.dmsf_notification) %>
|
||||
<% if (subfolder && subfolder.notification) || (!subfolder && project.dmsf_notification) %>
|
||||
<%= link_to(image_tag('notify.png', :plugin => 'redmine_dmsf'),
|
||||
notify_deactivate_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_notifications_active_deactivate)) %>
|
||||
<% else %>
|
||||
<% else %>
|
||||
<%= link_to(image_tag('notifynot.png', :plugin => 'redmine_dmsf'),
|
||||
notify_activate_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_notifications_not_active_activate)) %>
|
||||
<% end %>
|
||||
<% if link %>
|
||||
<%= link_to(image_tag('delete.png'),
|
||||
dmsf_link_path(link),
|
||||
<%= link_to(image_tag('delete.png'), dmsf_link_path(link),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:method => :delete,
|
||||
:title => l(:title_delete)) %>
|
||||
:method => :delete, :title => l(:title_delete)) %>
|
||||
<% else %>
|
||||
<%= link_to(image_tag('delete.png'),
|
||||
delete_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete)) %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete)) %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<% if (!locked_for_user || @force_file_unlock_allowed) && subfolder.unlockable? %>
|
||||
<%= link_to(image_tag('unlock.png', :plugin => 'redmine_dmsf'),
|
||||
unlock_dmsf_path(:id => project, :folder_id => subfolder),
|
||||
:title => l(:title_unlock_file)) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
:title => l(:title_unlock_file)) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="invisible">0</td>
|
||||
<td class="invisible">0</td>
|
||||
<td class="invisible"><%= subfolder.modified.to_i if subfolder %></td>
|
||||
<td class="invisible">0</td>
|
||||
<td class="dmsf_invisible"><%= position %></td>
|
||||
<td class="dmsf_invisible">0</td>
|
||||
<td class="dmsf_invisible"><%= subfolder.modified.to_i if subfolder %></td>
|
||||
<td class="dmsf_invisible">0</td>
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
<%#=
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# 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.
|
||||
%>
|
||||
|
||||
<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>
|
||||
<td class="title">
|
||||
<td class="dmsf_title">
|
||||
<%= content_tag(:span, h(title),
|
||||
:title => h(title),
|
||||
:title => h(subfolder.description),
|
||||
:class => 'icon icon-folder') %>
|
||||
<% 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 %>
|
||||
<div class="filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div>
|
||||
<div class="dmsf_filename" title="<%= l(:title_items)%>">[<%= subfolder.items %>]</div>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="size"></td>
|
||||
<td class="modified">
|
||||
<td class="dmsf_size"></td>
|
||||
<td class="dmsf_modified">
|
||||
<%= format_time(subfolder.modified) if subfolder %>
|
||||
</td>
|
||||
<td class="version"></td>
|
||||
<td class="workflow"></td>
|
||||
<td class="author"><%= h(subfolder.user) %></td>
|
||||
<td class="buttons">
|
||||
<% if @folder_manipulation_allowed %>
|
||||
<%= 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)) %>
|
||||
<td class="dmsf_version"></td>
|
||||
<td class="dmsf_workflow"></td>
|
||||
<td class="dmsf_author"><%= h(subfolder.user) %></td>
|
||||
<td class="dmsf_buttons">
|
||||
<% if @folder_manipulation_allowed %>
|
||||
<% if link %>
|
||||
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
|
||||
restore_dmsf_link_path(:id => link),
|
||||
:title => l(:title_restore)) %>
|
||||
<%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
|
||||
dmsf_link_path(:id => link, :commit => 'yes'),
|
||||
: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 %>
|
||||
</td>
|
||||
<td class="invisible">0</td>
|
||||
<td class="invisible">0</td>
|
||||
<td class="invisible"><%= subfolder.modified.to_i if subfolder %></td>
|
||||
<td class="invisible">0</td>
|
||||
<td class="dmsf_invisible">0</td>
|
||||
<td class="dmsf_invisible">0</td>
|
||||
<td class="dmsf_invisible"><%= subfolder.modified.to_i if subfolder %></td>
|
||||
<td class="dmsf_invisible">0</td>
|
||||
@ -1,9 +1,9 @@
|
||||
<%#=
|
||||
<%
|
||||
# encode: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -20,47 +20,49 @@
|
||||
# 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) %>
|
||||
|
||||
<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>
|
||||
<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}) %>
|
||||
<%= link_to(h(title),
|
||||
file_view_url,
|
||||
:target => "_blank",
|
||||
:target => '_blank',
|
||||
: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}") %>
|
||||
<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 class="size"><%= number_to_human_size(file.last_revision.size) %></td>
|
||||
<td class="modified">
|
||||
<td class="dmsf_size"><%= number_to_human_size(file.last_revision.size) %></td>
|
||||
<td class="dmsf_modified">
|
||||
<%= format_time(file.last_revision.updated_at) %>
|
||||
<% if locked_for_user %>
|
||||
<% if file.lock.reverse[0].user %>
|
||||
<% if file.locked_for_user? %>
|
||||
<% if file.lock.reverse[0].user %>
|
||||
<%= link_to(image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
|
||||
user_path(file.lock.reverse[0].user),
|
||||
:title => l(:title_locked_by_user, :user => file.lock.reverse[0].user)) %>
|
||||
<% else %>
|
||||
<%= content_tag(:span, image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
|
||||
<% else %>
|
||||
<%= content_tag(:span, image_tag(link ? 'locked_gray.png' : 'locked.png', :plugin => 'redmine_dmsf'),
|
||||
:title => l(:notice_account_unknown_email)) %>
|
||||
<% end %>
|
||||
<% elsif locked %>
|
||||
<%= content_tag(:span, image_tag(link ? 'lockedbycurrent_gray.png' : 'lockedbycurrent.png', :plugin => 'redmine_dmsf'),
|
||||
<% elsif file.locked? %>
|
||||
<%= content_tag(:span, image_tag(link ? 'lockedbycurrent_gray.png' : 'lockedbycurrent.png', :plugin => 'redmine_dmsf'),
|
||||
:title => l(:title_locked_by_you)) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td>
|
||||
<td class="workflow">
|
||||
<td class="dmsf_version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td>
|
||||
<td class="dmsf_workflow">
|
||||
<% if wf && @file_approval_allowed %>
|
||||
<%= link_to(
|
||||
file.last_revision.workflow_str(false),
|
||||
log_dmsf_workflow_path(
|
||||
:project_id => project.id,
|
||||
:id => wf.id,
|
||||
:project_id => project.id,
|
||||
:id => wf.id,
|
||||
:dmsf_file_revision_id => file.last_revision.id),
|
||||
:title => DmsfWorkflow.assignments_to_users_str(wf.next_assignments(file.last_revision.id)),
|
||||
:remote => true) %>
|
||||
@ -68,110 +70,115 @@
|
||||
<%= file.last_revision.workflow_str(false) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="author"><%= h(file.last_revision.user) %></td>
|
||||
<td class="buttons">
|
||||
<% if @file_manipulation_allowed || @file_approval_allowed %>
|
||||
<% if @file_manipulation_allowed %>
|
||||
<% unless locked %>
|
||||
<%= link_to(image_tag('filedetails.png', :plugin => 'redmine_dmsf'),
|
||||
dmsf_file_path(:id => file),
|
||||
:title => l(:link_details, :title => h(file.last_revision.title))) %>
|
||||
<td class="dmsf_author"><%= h(file.last_revision.user) %></td>
|
||||
<td class="dmsf_buttons">
|
||||
<% if @file_manipulation_allowed %>
|
||||
<%= link_to(image_tag('filedetails.png', :plugin => 'redmine_dmsf'),
|
||||
dmsf_file_path(:id => file),
|
||||
:title => l(:link_details, :title => h(file.last_revision.title))) %>
|
||||
<% unless file.locked_for_user? %>
|
||||
<% if !file.locked? %>
|
||||
<%= link_to(image_tag('lock.png', :plugin => 'redmine_dmsf'),
|
||||
lock_dmsf_files_path(:id => file),
|
||||
:title => l(:title_lock_file)) %>
|
||||
<% if file.notification %>
|
||||
<%= link_to(image_tag('notify.png', :plugin => 'redmine_dmsf'),
|
||||
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 locked_for_user %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
:title => l(:title_lock_file)) %>
|
||||
<% elsif 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>
|
||||
<% if (!locked_for_user || @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))%>
|
||||
<% end %>
|
||||
<% if file.notification %>
|
||||
<%= link_to(image_tag('notify.png', :plugin => 'redmine_dmsf'),
|
||||
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 %>
|
||||
<span class="icon"></span>
|
||||
<% 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 %>
|
||||
<% if @file_approval_allowed %>
|
||||
<% case file.last_revision.workflow %>
|
||||
<% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %>
|
||||
<% if wf %>
|
||||
<% assignments = wf.next_assignments(file.last_revision.id) %>
|
||||
<% index = assignments.find_index{|assignment| assignment.user_id == User.current.id} if assignments %>
|
||||
<% if index %>
|
||||
<%= link_to(image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'),
|
||||
action_dmsf_workflow_path(
|
||||
:project_id => project.id,
|
||||
:id => wf.id,
|
||||
:dmsf_workflow_step_assignment_id => assignments[index].id,
|
||||
:dmsf_file_revision_id => file.last_revision.id),
|
||||
:title => l(:title_waiting_for_approval),
|
||||
:remote => true) %>
|
||||
<% else %>
|
||||
<%= 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 %>
|
||||
<% end %>
|
||||
<% if @file_approval_allowed %>
|
||||
<% case file.last_revision.workflow %>
|
||||
<% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %>
|
||||
<% if wf %>
|
||||
<% assignments = wf.next_assignments(file.last_revision.id) %>
|
||||
<% index = assignments.find_index{|assignment| assignment.user_id == User.current.id} if assignments %>
|
||||
<% if index %>
|
||||
<%= link_to(image_tag('waiting_for_approval.png', :plugin => 'redmine_dmsf'),
|
||||
action_dmsf_workflow_path(
|
||||
:project_id => project.id,
|
||||
:id => wf.id,
|
||||
:dmsf_workflow_step_assignment_id => assignments[index].id,
|
||||
:dmsf_file_revision_id => file.last_revision.id),
|
||||
:title => l(:title_waiting_for_approval),
|
||||
:remote => true) %>
|
||||
<% else %>
|
||||
<%= 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 %>
|
||||
<% 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 %>
|
||||
<% if @workflows_available %>
|
||||
<%= 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 %>
|
||||
<%= 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 %>
|
||||
<% 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('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 %>
|
||||
</td>
|
||||
<td class="invisible">1</td>
|
||||
<td class="invisible"><%= file.last_revision.size %></td>
|
||||
<td class="invisible"><%= file.last_revision.updated_at.to_i %></td>
|
||||
<td class="invisible"><%= file.last_revision.iversion %></td>
|
||||
<td class="dmsf_invisible"><%= position %></td>
|
||||
<td class="dmsf_invisible"><%= file.last_revision.size %></td>
|
||||
<td class="dmsf_invisible"><%= file.last_revision.updated_at.to_i %></td>
|
||||
<td class="dmsf_invisible"><%= file.last_revision.iversion %></td>
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
<%#=
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# 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.
|
||||
%>
|
||||
|
||||
<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>
|
||||
<td class="title">
|
||||
<td class="dmsf_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)}") %>
|
||||
<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 class="size"><%= number_to_human_size(file.last_revision.size) %></td>
|
||||
<td class="modified">
|
||||
<td class="dmsf_size"><%= number_to_human_size(file.last_revision.size) %></td>
|
||||
<td class="dmsf_modified">
|
||||
<%= format_time(file.last_revision.updated_at) %>
|
||||
</td>
|
||||
<td class="version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td>
|
||||
<td class="workflow">
|
||||
<td class="dmsf_version" title="<%= file.last_revision.comment %>"><%= file.last_revision.version %></td>
|
||||
<td class="dmsf_workflow">
|
||||
<%= file.last_revision.workflow_str(false) %>
|
||||
</td>
|
||||
<td class="author"><%= h(file.last_revision.user) %></td>
|
||||
<td class="buttons">
|
||||
<% if @file_manipulation_allowed %>
|
||||
<%= 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)) %>
|
||||
<td class="dmsf_author"><%= h(file.last_revision.user) %></td>
|
||||
<td class="dmsf_buttons">
|
||||
<% if @file_manipulation_allowed %>
|
||||
<% if link %>
|
||||
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
|
||||
restore_dmsf_link_path(:id => link),
|
||||
:title => l(:title_restore)) %>
|
||||
<%= link_to(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
|
||||
dmsf_link_path(:id => link, :commit => 'yes'),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
: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 %>
|
||||
</td>
|
||||
<td class="invisible">1</td>
|
||||
<td class="invisible"><%= file.last_revision.size %></td>
|
||||
<td class="invisible"><%= file.last_revision.updated_at.to_i %></td>
|
||||
<td class="invisible"><%= file.last_revision.iversion %></td>
|
||||
<td class="dmsf_invisible">1</td>
|
||||
<td class="dmsf_invisible"><%= file.last_revision.size %></td>
|
||||
<td class="dmsf_invisible"><%= file.last_revision.updated_at.to_i %></td>
|
||||
<td class="dmsf_invisible"><%= file.last_revision.iversion %></td>
|
||||
118
app/views/dmsf/_list_view.erb
Normal 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>
|
||||
@ -17,14 +17,15 @@
|
||||
#
|
||||
# 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.%>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<h2>
|
||||
<% if folder %>
|
||||
<%= link_to l(:link_documents), dmsf_folder_path(:id => @project) %>
|
||||
<% 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) %>
|
||||
<% else %>
|
||||
<%= link_to h(path_element.title), dmsf_folder_path(:id => @project, :folder_id => path_element) %>
|
||||
@ -37,4 +38,7 @@
|
||||
/
|
||||
<%= h(filename) %>
|
||||
<% end %>
|
||||
</h2>
|
||||
<% if title %>
|
||||
» <%= title %>
|
||||
<% end %>
|
||||
</h2>
|
||||
143
app/views/dmsf/_tree_view.erb
Normal 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>
|
||||
@ -1,9 +1,9 @@
|
||||
<%#=
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# 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.
|
||||
%>
|
||||
|
||||
<td class="check"></td>
|
||||
<td class="title">
|
||||
<%= link_to(h(title),
|
||||
link.external_url,
|
||||
:target => "_blank",
|
||||
:class => 'icon icon-link') %>
|
||||
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div>
|
||||
<td class="dmsf_checkbox"></td>
|
||||
<td class="dmsf_title">
|
||||
<% if @tree_view %>
|
||||
<span class='dmsf_expander' <%= onclick.html_safe %>></span>
|
||||
<% end %>
|
||||
<%= link_to(h(title),
|
||||
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 class="size"></td>
|
||||
<td class="modified"><%= format_time(link.updated_at) %></td>
|
||||
<td class="version"></td>
|
||||
<td class="workflow"></td>
|
||||
<td class="author"><%= h(link.user) %></td>
|
||||
<td class="buttons">
|
||||
<% if @file_manipulation_allowed %>
|
||||
<% if @file_manipulation_allowed %>
|
||||
<span class="icon"></span>
|
||||
<span class="icon"></span>
|
||||
<span class="icon"></span>
|
||||
<%= link_to(image_tag('delete.png'),
|
||||
dmsf_link_path(link),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
: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 %>
|
||||
<td class="dmsf_size"></td>
|
||||
<td class="dmsf_modified"><%= format_time(link.updated_at) %></td>
|
||||
<td class="dmsf_version"></td>
|
||||
<td class="dmsf_workflow"></td>
|
||||
<td class="dmsf_author"><%= h(link.user) %></td>
|
||||
<td class="dmsf_buttons">
|
||||
<span class="icon"></span>
|
||||
<span class="icon"></span>
|
||||
<span class="icon"></span>
|
||||
<% if @file_manipulation_allowed %>
|
||||
<%= link_to(image_tag('delete.png'),
|
||||
dmsf_link_path(link),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:method => :delete,
|
||||
:title => l(:title_delete)) %>
|
||||
<% else %>
|
||||
<span class="icon"></span>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="invisible">1</td>
|
||||
<td class="invisible"></td>
|
||||
<td class="invisible">link.updated_at.to_i</td>
|
||||
<td class="invisible"></td>
|
||||
<td class="dmsf_invisible"><%= position %> </td>
|
||||
<td class="dmsf_invisible"></td>
|
||||
<td class="dmsf_invisible">link.updated_at.to_i</td>
|
||||
<td class="dmsf_invisible"></td>
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
<%#=
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# 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.
|
||||
%>
|
||||
|
||||
<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>
|
||||
<td class="title">
|
||||
<td class="dmsf_title">
|
||||
<%= link_to(h(title),
|
||||
link.external_url,
|
||||
:target => "_blank",
|
||||
:class => 'icon icon-link') %>
|
||||
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div>
|
||||
:target => '_blank',
|
||||
:class => 'icon dmsf_icon-link') %>
|
||||
<div class="dmsf_filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div>
|
||||
</td>
|
||||
<td class="size"></td>
|
||||
<td class="modified"><%= format_time(link.updated_at) %></td>
|
||||
<td class="version"></td>
|
||||
<td class="workflow"></td>
|
||||
<td class="author"><%= h(link.user) %></td>
|
||||
<td class="buttons">
|
||||
<td class="dmsf_size"></td>
|
||||
<td class="dmsf_modified"><%= format_time(link.updated_at) %></td>
|
||||
<td class="dmsf_version"></td>
|
||||
<td class="dmsf_workflow"></td>
|
||||
<td class="dmsf_author"><%= h(link.user) %></td>
|
||||
<td class="dmsf_buttons">
|
||||
<% if @file_manipulation_allowed %>
|
||||
<%= link_to(image_tag('restore.png', :plugin => 'redmine_dmsf'),
|
||||
restore_dmsf_link_path(:id => link),
|
||||
@ -46,7 +46,7 @@
|
||||
:title => l(:title_delete)) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="invisible">1</td>
|
||||
<td class="invisible"></td>
|
||||
<td class="invisible">link.updated_at.to_i</td>
|
||||
<td class="invisible"></td>
|
||||
<td class="dmsf_invisible">1</td>
|
||||
<td class="dmsf_invisible"></td>
|
||||
<td class="dmsf_invisible">link.updated_at.to_i</td>
|
||||
<td class="dmsf_invisible"></td>
|
||||
@ -1,7 +1,11 @@
|
||||
<%# Redmine plugin for Document Management System "Features"
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# 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-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
|
||||
@ -15,86 +19,82 @@
|
||||
#
|
||||
# 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.%>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<% html_title(l(:dmsf)) %>
|
||||
|
||||
<div class="contextual">
|
||||
<% if User.current.allowed_to?(:folder_manipulation, @project) && params[:action] == 'edit' %>
|
||||
<% unless @folder.locked? %>
|
||||
<%= link_to(l(:button_lock),
|
||||
<% if !@folder.new_record? && User.current.allowed_to?(:folder_manipulation, @project) %>
|
||||
<% if !@folder.locked_for_user? %>
|
||||
<% unless @folder.locked? %>
|
||||
<%= link_to(l(:button_lock),
|
||||
lock_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:title => l(:title_lock_file),
|
||||
:class => 'icon icon-dmsf-lock') %>
|
||||
:title => l(:title_lock_file), :class => 'icon dmsf_icon-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 %>
|
||||
<%= link_to(l(:label_notifications_off),
|
||||
notify_deactivate_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
:class => 'icon icon-notification-on') %>
|
||||
:class => 'icon dmsf_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') %>
|
||||
:class => 'icon dmsf_icon-notification-off') %>
|
||||
<% end %>
|
||||
<%= link_to(l(:label_link_to),
|
||||
new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @folder.id, :type => 'link_to'),
|
||||
:title => l(:title_create_link),
|
||||
:class => 'icon icon-link') %>
|
||||
:title => l(:title_create_link), :class => 'icon dmsf_icon-link') %>
|
||||
<%= link_to(l(:button_copy), copy_folder_path(:id => @folder),
|
||||
:title => l(:title_copy), :class => 'icon icon-copy') %>
|
||||
<%= link_to(l(:button_delete),
|
||||
delete_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete),
|
||||
:class => 'icon icon-del') %>
|
||||
<% else %>
|
||||
<% if (!@folder.locked_for_user? || User.current.allowed_to?(:force_file_unlock, @project)) && @folder.unlockable? %>
|
||||
<%= link_to(l(:button_unlock),
|
||||
unlock_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:title => l(:title_unlock_file),
|
||||
:class => 'icon icon-dmsf-unlock')%>
|
||||
<% end %>
|
||||
:title => l(:title_delete), :class => 'icon icon-del') %>
|
||||
<% elsif @force_file_unlock_allowed %>
|
||||
<%= 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 %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<% 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| %>
|
||||
<%= error_messages_for(@folder) %>
|
||||
<div class="box dmsf_detail">
|
||||
<div class="clear">
|
||||
<div class="splitcontentleft">
|
||||
<p>
|
||||
<%= label_tag('dmsf_folder_title', "#{l(:label_title)}:") %>
|
||||
<%= f.text_field(:title, :size => '32', :required => true) %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="splitcontentright">
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:field_folder)}:") %>
|
||||
<%= f.select(:dmsf_folder_id,
|
||||
options_for_select(DmsfFolder.directory_tree(@project, @folder),
|
||||
:selected => @parent? @parent.id : (@pathfolder.id if @pathfolder)))
|
||||
%>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="no-ident">
|
||||
<%= label_tag('dmsf_folder_description', "#{l(:label_description)}:") %>
|
||||
<div class="box tabular">
|
||||
<p>
|
||||
<%= f.text_field(:title, :required => true) %>
|
||||
</p>
|
||||
<p>
|
||||
<%= f.select(:dmsf_folder_id,
|
||||
options_for_select(DmsfFolder.directory_tree(@project, @folder),
|
||||
:selected => @parent? @parent.id : (@pathfolder.id if @pathfolder)),
|
||||
:label => l(:field_folder))
|
||||
%>
|
||||
</p>
|
||||
<p>
|
||||
<%= f.text_area :description, :rows => 8, :class => 'wiki-edit' %>
|
||||
</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.each do |value| %>
|
||||
<p><%= custom_field_tag_with_label(:dmsf_folder, value) %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
<%= submit_tag(create ? l(:submit_create) : l(:submit_save)) %>
|
||||
<% end %>
|
||||
</div>
|
||||
<p><%= submit_tag(create ? l(:submit_create) : l(:submit_save)) %></p>
|
||||
<% end %>
|
||||
|
||||
<%= wikitoolbar_for 'dmsf_folder_description' %>
|
||||
|
||||
<script type="text/javascript">
|
||||
$('#dmsf_folder_dmsf_folder_id').select2();
|
||||
</script>
|
||||
@ -1,7 +1,11 @@
|
||||
<%# Redmine plugin for Document Management System "Features"
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# 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-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
|
||||
@ -15,7 +19,8 @@
|
||||
#
|
||||
# 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.%>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<% html_title(l(:dmsf)) %>
|
||||
|
||||
@ -25,29 +30,28 @@
|
||||
<%= link_to(l(:label_notifications_off),
|
||||
notify_deactivate_dmsf_path(:id => @project),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
:class => 'icon icon-notification-on') %>
|
||||
:class => 'icon dmsf_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') %>
|
||||
:class => 'icon dmsf_icon-notification-off') %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</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},
|
||||
:html => {:method=>:post}) do |f| %>
|
||||
<div class="box dmsf_detail">
|
||||
<p class="no-ident">
|
||||
<%= label_tag('project_dmsf_description', "#{l(:label_description)}:") %>
|
||||
<%= labelled_form_for(@project, :url => {:action => 'save_root', :id => @project},
|
||||
:html => {:method => :post}) do |f| %>
|
||||
<div class="box tabular">
|
||||
<p>
|
||||
<%= f.text_area(:dmsf_description, :rows => 8, :class => 'wiki-edit',
|
||||
:label => l(:field_description)) %>
|
||||
</p>
|
||||
<div class="wiki data clear">
|
||||
<%= f.text_area(:dmsf_description, :rows => 15, :class => 'wiki-edit') %>
|
||||
</div>
|
||||
</div>
|
||||
<%= submit_tag(l(:submit_save)) %>
|
||||
<%= f.submit l(:submit_save) %>
|
||||
<% end %>
|
||||
|
||||
<%= wikitoolbar_for 'project_dmsf_description' %>
|
||||
@ -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) 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
|
||||
# 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
|
||||
# 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)) %>
|
||||
|
||||
<div class="contextual">
|
||||
</div>
|
||||
<%= render(:partial => 'path',
|
||||
:locals => {:folder => @folder, :filename => nil, :title => l(:heading_send_documents_by_email)}) %>
|
||||
|
||||
<%= render(:partial => 'path', :locals => {:folder => @folder, :filename => nil}) %>
|
||||
|
||||
<h3><%= l(:heading_send_documents_by_email) %></h3>
|
||||
|
||||
<%= form_tag({:action => 'entries_email', :id => @project, :folder_id => @folder},
|
||||
{ :method=>:post, :class => 'tabular'}) do %>
|
||||
<%= form_tag({ :action => 'entries_email', :id => @project, :folder_id => @folder },
|
||||
{ :method => :post }) do %>
|
||||
<%= hidden_field_tag('email[zipped_content]', @email_params[:zipped_content]) %>
|
||||
<%= hidden_field_tag('email[folders]', @email_params[:folders].to_json) %>
|
||||
<%= hidden_field_tag('email[files]', @email_params[:files].to_json) %>
|
||||
<div class="box">
|
||||
<div class="box tabular">
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_email_from)}:") %>
|
||||
<i><%= h(Setting.mail_from) %></i>
|
||||
<%= label_tag('', l(:label_email_from)) %>
|
||||
<%= text_field_tag('email[from]', h(Setting.mail_from), :style => 'width: 90%;', :disabled => true) %>
|
||||
</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%;') %>
|
||||
</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%;') %>
|
||||
</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%;') %>
|
||||
</p>
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_email_documents)}:") %>
|
||||
<%= 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) %>
|
||||
<%= label_tag('', l(:label_email_documents)) %>
|
||||
<span>
|
||||
<%= 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>
|
||||
<%= label_tag('email[body]', "#{l(:label_email_body)}:") %>
|
||||
<%= text_area_tag('email[body]', @email_params['body'], :rows=> '20', :style => 'width: 90%;') %>
|
||||
</p>
|
||||
<p><%= submit_tag(l(:label_email_send)) %></p>
|
||||
<%= label_tag('email[body]', l(:label_email_body)) %>
|
||||
<%= text_area_tag('email[body]', @email_params['body'], :rows => '20', :style => 'width: 90%;') %>
|
||||
</p>
|
||||
</div>
|
||||
<p><%= submit_tag(l(:label_email_send)) %></p>
|
||||
<% end %>
|
||||
|
||||
<%= wikitoolbar_for 'email_body' %>
|
||||
<%= wikitoolbar_for 'email_body' %>
|
||||
@ -1,11 +1,11 @@
|
||||
<%#=
|
||||
<%
|
||||
# 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>
|
||||
# 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
|
||||
@ -22,93 +22,70 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<% html_title(l(:dmsf)) %>
|
||||
<% html_title l(:dmsf) %>
|
||||
<div class="contextual">
|
||||
<% if @folder_manipulation_allowed %>
|
||||
<% if @folder.nil? %>
|
||||
<%= link_to(l(:button_edit),
|
||||
edit_root_dmsf_path(:id => @project),
|
||||
:title => l(:link_edit, :title => l(:link_documents)),
|
||||
<% if @folder_manipulation_allowed %>
|
||||
<% if @folder.nil? %>
|
||||
<%= link_to(l(:button_edit), edit_root_dmsf_path(:id => @project),
|
||||
:title => l(:link_edit, :title => l(:link_documents)),
|
||||
:class => 'icon icon-edit') %>
|
||||
<% elsif !@locked_for_user %>
|
||||
<%= link_to(l(:button_edit),
|
||||
<% elsif !@locked_for_user %>
|
||||
<%= link_to(l(:button_edit),
|
||||
edit_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:title => l(:link_edit, :title => h(@folder.title)),
|
||||
:title => l(:link_edit, :title => h(@folder.title)),
|
||||
:class => 'icon icon-edit') %>
|
||||
<% end %>
|
||||
<% if @folder && (!@locked_for_user || User.current.allowed_to?(:force_file_unlock, @project)) %>
|
||||
<% if @folder.locked? %>
|
||||
<% unless @folder.unlockable? %>
|
||||
<%= link_to(l(:button_unlock),
|
||||
:title => l(:title_folder_parent_locked, :name => @folder.folder.lock.reverse[0].folder.title),
|
||||
: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 %>
|
||||
<%= link_to_if(@folder.unlockable?, l(:button_unlock),
|
||||
unlock_dmsf_path(:id => @project, :folder_id => @folder, :current => request.url),
|
||||
:title => l(:title_unlock_folder), :class => 'icon dmsf_icon-unlock') %>
|
||||
<% else %>
|
||||
<%= link_to(l(:button_lock),
|
||||
lock_dmsf_path(:id => @project, :folder_id => @folder, :current => request.url),
|
||||
:title => l(:title_lock_folder),
|
||||
:class => 'icon icon-dmsf-lock') if @folder %>
|
||||
:title => l(:title_lock_folder), :class => 'icon dmsf_icon-lock') %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% unless @folder %>
|
||||
<% if @project.dmsf_notification %>
|
||||
<%= link_to(l(:label_notifications_off),
|
||||
notify_deactivate_dmsf_path(:id => @project),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
: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 %>
|
||||
<% if !@locked_for_user && ((@folder && @folder.notification) || (!@folder && @project.dmsf_notification)) %>
|
||||
<%= link_to(l(:label_notifications_off),
|
||||
notify_deactivate_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
:class => 'icon dmsf_icon-notification-on') %>
|
||||
<% else %>
|
||||
<% if @folder.notification %>
|
||||
<%= link_to(l(:label_notifications_off),
|
||||
notify_deactivate_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
: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 %>
|
||||
<% if @file_manipulation_allowed %>
|
||||
<%= link_to(l(:label_link_from),
|
||||
<%= link_to(l(:label_notifications_on),
|
||||
notify_activate_dmsf_path(:id => @project, :folder_id => @folder),
|
||||
:title => l(:title_notifications_not_active_activate),
|
||||
:class => 'icon dmsf_icon-notification-off') %>
|
||||
<% end %>
|
||||
<% if @file_manipulation_allowed && !@locked_for_user %>
|
||||
<%= link_to(l(:label_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),
|
||||
:class => 'icon icon-link') unless @locked_for_user %>
|
||||
<% end %>
|
||||
<%= link_to(l(:link_create_folder),
|
||||
:title => l(:title_create_link), :class => 'icon dmsf_icon-link') %>
|
||||
<% end %>
|
||||
<%= link_to(l(:link_create_folder),
|
||||
new_dmsf_path(:id => @project, :parent_id => @folder),
|
||||
:title => l(:link_create_folder),
|
||||
:title => l(:link_create_folder),
|
||||
:class => 'icon icon-add') unless @locked_for_user %>
|
||||
<% end %>
|
||||
<%= link_to_if(@trash_enabled, l(:link_trash_bin), trash_dmsf_path(@project),
|
||||
:title => l(:link_trash_bin), :class => 'icon icon-del') if @trash_visible %>
|
||||
</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="wiki">
|
||||
<%= textilizable(@folder ? @folder.description : @project.dmsf_description) %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= error_messages_for('dmsf_workflow') %>
|
||||
|
||||
<%= 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') %>
|
||||
<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(: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%>
|
||||
@ -117,156 +94,80 @@
|
||||
</div>
|
||||
<% values = @folder ? @folder.custom_field_values : @parent ? @parent.custom_field_values : DmsfFolder.new(:project => @project).custom_field_values %>
|
||||
<% unless values.empty? %>
|
||||
<div class="controls" style="float: right">
|
||||
<div class="dmsf_controls" style="float: right">
|
||||
<%= 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])) %>
|
||||
</div>
|
||||
<% end %>
|
||||
<table class="display entries" id="browser">
|
||||
<thead>
|
||||
<tr id="root">
|
||||
<th class="check">
|
||||
<input id="check_all_entries" title="<%= l(:title_check_uncheck_all_for_zip_download_or_email) %>" type="checkbox" />
|
||||
</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 %>
|
||||
<tr class="gray">
|
||||
<%= 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>
|
||||
</div>
|
||||
<% 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>
|
||||
<div class="autoscroll">
|
||||
<% if @tree_view %>
|
||||
<%= render(:partial => 'tree_view') %>
|
||||
<% else %>
|
||||
<%= render(:partial => 'list_view') %>
|
||||
<% 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 %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
$('#entries_delete_button').click(function() {
|
||||
if(window.confirm("<%= l(:text_are_you_sure) %>")) {
|
||||
$('#entries_form').attr('action', "<%= delete_entries_path(:id => @project, :folder_id => @folder) %>");
|
||||
$('#entries_form').attr('action', "<%= delete_entries_path(:id => @project, :folder_id => @folder) %>");
|
||||
$('#entries_form').submit();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('.list_cf').change(function() {
|
||||
$('#entries_form').attr('action', "<%= tag_changed_path(:id => @project, :folder_id => @folder) %>");
|
||||
$('#entries_form').submit();
|
||||
$('#entries_form').submit();
|
||||
});
|
||||
|
||||
$('#check_all_entries').click(function() {
|
||||
$('input[type=checkbox]', $('#browser > tbody')).prop('checked', this.checked);
|
||||
});
|
||||
$('#check_all_entries').click(function() {
|
||||
$('input[type=checkbox]', $('#browser > tbody')).prop('checked', this.checked);
|
||||
});
|
||||
</script>
|
||||
|
||||
<%
|
||||
sUrl = "jquery.dataTables/#{I18n.locale.to_s.downcase}.json"
|
||||
sUrl = 'jquery.dataTables/en.json' unless File.exist?(sUrl)
|
||||
<%
|
||||
sUrl = 'jquery.dataTables/en.json'
|
||||
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 %>
|
||||
<%= javascript_include_tag 'bowser.min.js', :plugin => 'redmine_dmsf' %>
|
||||
<%= stylesheet_link_tag 'jquery.dataTables/jquery-ui.dataTables.css', :plugin => 'redmine_dmsf' %>
|
||||
<%= stylesheet_link_tag 'jquery.dataTables/jquery-ui.dataTables.css', :plugin => 'redmine_dmsf' %>
|
||||
<%= javascript_include_tag 'jquery.dataTables/jquery.dataTables.min.js', :plugin => 'redmine_dmsf' %>
|
||||
|
||||
<script type="text/javascript">
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#browser').dataTable({
|
||||
'bJQueryUI': true,
|
||||
'oLanguage': {
|
||||
'sUrl': "<%= plugin_asset_path(:redmine_dmsf, 'javascripts', sUrl) %>"
|
||||
'sUrl': "<%= plugin_asset_path(:redmine_dmsf, 'javascripts', sUrl) %>"
|
||||
},
|
||||
'bAutoWidth': false,
|
||||
'bAutoWidth': false,
|
||||
'bPaginate': false,
|
||||
'aaSorting': [[1,'asc']],
|
||||
'aaSortingFixed': [[8,'asc']],
|
||||
'aaSorting': [[1, 'asc']],
|
||||
'aaSortingFixed': [[ 8, 'asc']],
|
||||
'aoColumnDefs': [
|
||||
{ 'bSearchable': false, 'aTargets': [0, 7, 8, 9] },
|
||||
{ 'bSortable': false, 'aTargets': [0, 7, 8] },
|
||||
{ 'bSearchable': false, 'aTargets': [0, 7, 8, 9, 10, 11] },
|
||||
{ 'bSortable': false, 'aTargets': [0, 7] },
|
||||
{ 'iDataSort': 9, 'aTargets': [ 2 ] },
|
||||
{ 'iDataSort': 10, 'aTargets': [ 3 ] },
|
||||
{ 'iDataSort': 11, 'aTargets': [ 4 ] }
|
||||
],
|
||||
'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 ) {
|
||||
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 %>
|
||||
}
|
||||
});
|
||||
|
||||
@ -284,8 +185,10 @@
|
||||
$('#entries_form').submit(function () {
|
||||
$(this).removeAttr('data-submitted');
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<% 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 %>
|
||||
@ -1,9 +1,9 @@
|
||||
<%#=
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -21,83 +21,82 @@
|
||||
%>
|
||||
|
||||
<% 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="wiki">
|
||||
<%= textilizable(@folder ? @folder.description : @project.dmsf_description) %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= error_messages_for('dmsf_workflow') %>
|
||||
|
||||
<%= 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') %>
|
||||
<div class="controls" style="float: left">
|
||||
<div class="dmsf_controls" style="float: left">
|
||||
<% if @file_manipulation_allowed && @folder_manipulation_allowed %>
|
||||
<%= submit_tag(l(:title_restore), :title => l(:title_restore_checked), :name => 'restore_entries') %>
|
||||
<% if @file_delete_allowed%>
|
||||
<%= submit_tag(l(:button_delete), :title => l(:title_delete_checked), :name => 'destroy_entries') %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<table class="display entries" id="browser">
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="autoscroll">
|
||||
<table class="display list dmsf_list" id="browser">
|
||||
<thead>
|
||||
<tr id="root">
|
||||
<th class="check">
|
||||
<tr>
|
||||
<th class="dmsf_checkbox dmsf_th">
|
||||
<input id="check_all_entries" title="<%= l(:title_check_uncheck_all_for_restore_or_delete) %>" type="checkbox" />
|
||||
</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>
|
||||
<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| %>
|
||||
<tbody>
|
||||
<% @subfolders.each do |subfolder| %>
|
||||
<tr class="dir">
|
||||
<%= render(:partial => 'dir_trash',
|
||||
:locals => {
|
||||
:project => @project,
|
||||
:subfolder => subfolder,
|
||||
<%= render(:partial => 'dir_trash',
|
||||
:locals => {
|
||||
:project => @project,
|
||||
:subfolder => subfolder,
|
||||
:link => nil,
|
||||
:id => subfolder.id,
|
||||
:name => 'subfolders[]',
|
||||
:id => subfolder.id,
|
||||
:name => 'subfolders[]',
|
||||
:title => subfolder.title }) %>
|
||||
</tr>
|
||||
<% end %>
|
||||
<% @dir_links.each do |link| %>
|
||||
<tr class="gray">
|
||||
<%= render(:partial => 'dir_trash',
|
||||
:locals => {
|
||||
:project => link.target_project,
|
||||
:subfolder => link.target_folder,
|
||||
<% end %>
|
||||
<% @dir_links.each do |link| %>
|
||||
<tr class="dmsf_gray">
|
||||
<%= render(:partial => 'dir_trash',
|
||||
:locals => {
|
||||
:project => link.target_project,
|
||||
:subfolder => link.target_folder,
|
||||
:link => link,
|
||||
:id => link.id,
|
||||
:name => 'dir_links[]',
|
||||
:id => link.id,
|
||||
:name => 'dir_links[]',
|
||||
:title => link.name }) %>
|
||||
</tr>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% @files.each do |file| %>
|
||||
<% unless file.last_revision %>
|
||||
<% unless file.last_revision %>
|
||||
<% Rails.logger.error "Error: dmsf_file id #{file.id} has no revision!" %>
|
||||
<% next %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<tr class="file">
|
||||
<%= render(:partial => 'file_trash', :locals => {
|
||||
:project => @project,
|
||||
:file => file,
|
||||
<%= render(:partial => 'file_trash', :locals => {
|
||||
:project => @project,
|
||||
:file => file,
|
||||
:link => nil,
|
||||
:id => file.id,
|
||||
:name => 'files[]',
|
||||
@ -105,14 +104,14 @@
|
||||
</tr>
|
||||
<% end %>
|
||||
<% @file_links.each do |link| %>
|
||||
<% unless link.target_file.last_revision %>
|
||||
<% 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_trash', :locals => {
|
||||
:project => link.target_project,
|
||||
:file => link.target_file,
|
||||
<% end %>
|
||||
<tr class="dmsf_gray">
|
||||
<%= render(:partial => 'file_trash', :locals => {
|
||||
:project => link.target_project,
|
||||
:file => link.target_file,
|
||||
:link => link,
|
||||
:id => link.id,
|
||||
:name => 'file_links[]',
|
||||
@ -120,7 +119,7 @@
|
||||
</tr>
|
||||
<% end %>
|
||||
<% @url_links.each do |link| %>
|
||||
<tr class="gray">
|
||||
<tr class="dmsf_gray">
|
||||
<%= render(:partial => 'url_trash', :locals => {
|
||||
:project => link.target_project,
|
||||
:file => link.target_file,
|
||||
@ -131,25 +130,26 @@
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end %>
|
||||
</table>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
$('#entries_delete_button').click(function() {
|
||||
if(window.confirm("<%= l(:text_are_you_sure) %>")) {
|
||||
$('#entries_form').attr('action', "<%= delete_entries_path(:id => @project, :folder_id => @folder) %>");
|
||||
$('#entries_form').attr('action', "<%= delete_entries_path(:id => @project, :folder_id => @folder) %>");
|
||||
$('#entries_form').submit();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('.list_cf').change(function() {
|
||||
$('#entries_form').attr('action', "<%= tag_changed_path(:id => @project, :folder_id => @folder) %>");
|
||||
$('#entries_form').submit();
|
||||
$('#entries_form').submit();
|
||||
});
|
||||
|
||||
$('#check_all_entries').click(function() {
|
||||
$('input[type=checkbox]', $('#browser > tbody')).prop('checked', this.checked);
|
||||
});
|
||||
$('#check_all_entries').click(function() {
|
||||
$('input[type=checkbox]', $('#browser > tbody')).prop('checked', this.checked);
|
||||
});
|
||||
</script>
|
||||
|
||||
<%
|
||||
@ -157,11 +157,11 @@
|
||||
sUrl = 'jquery.dataTables/en.json' unless File.exist?(sUrl)
|
||||
%>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= stylesheet_link_tag 'jquery.dataTables/jquery-ui.dataTables.css', :plugin => 'redmine_dmsf' %>
|
||||
<% content_for :header_tags do %>
|
||||
<%= stylesheet_link_tag 'jquery.dataTables/jquery-ui.dataTables.css', :plugin => 'redmine_dmsf' %>
|
||||
<%= javascript_include_tag 'jquery.dataTables/jquery.dataTables.min.js', :plugin => 'redmine_dmsf' %>
|
||||
|
||||
<script type="text/javascript">
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#browser').dataTable({
|
||||
'bJQueryUI': true,
|
||||
@ -180,7 +180,7 @@
|
||||
{ 'iDataSort': 11, 'aTargets': [ 4 ] }
|
||||
],
|
||||
'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 ) {
|
||||
return "<%= l(:label_number_of_folders)%>: <%= @subfolders.count + @dir_links.count %>, <%= l(:label_number_of_documents)%>: <%= @files.count + @file_links.count + @url_links.count %>";
|
||||
@ -190,6 +190,6 @@
|
||||
$('#entries_form').submit(function () {
|
||||
$(this).removeAttr('data-submitted');
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<% end %>
|
||||
@ -1,11 +1,11 @@
|
||||
<%#=
|
||||
<%
|
||||
# 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>
|
||||
# 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
|
||||
@ -22,96 +22,81 @@
|
||||
# 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>
|
||||
<div id="newRevisionFormContent">
|
||||
<% if @file.locked_for_user? %>
|
||||
<p class="warning"><%= l(:info_file_locked) %></p>
|
||||
<% 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| %>
|
||||
<div class="clear">
|
||||
<div class="clear">
|
||||
<div class="splitcontentleft">
|
||||
<p>
|
||||
<%= label_tag('dmsf_file_revision_title', "#{l(:label_title)}:") %>
|
||||
<%= f.text_field(:title, :size => 32) %>
|
||||
<p>
|
||||
<%= f.text_field(:title) %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="splitcontentright">
|
||||
<p style="white-space: nowrap;">
|
||||
<%= label_tag('', "#{l(:label_file)}:") %>
|
||||
<%= f.text_field(:name, :size => 22) %>
|
||||
</p>
|
||||
</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>
|
||||
<%= label_tag('version_0', "#{l(:label_version)}:") %>
|
||||
</p>
|
||||
<div class="data clear">
|
||||
<%= radio_button_tag('version', 0,
|
||||
@revision.version == @file.last_revision.version) %>
|
||||
<%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version %>
|
||||
<%= l(:option_version_same) %><br/>
|
||||
<%= 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 %>
|
||||
<%= l(:option_version_minor) %><br/>
|
||||
<%= radio_button_tag('version', 2,
|
||||
@revision.major_version != @file.last_revision.major_version) %>
|
||||
<%= @file.last_revision.major_version + 1 %>.0
|
||||
<%= l(:option_version_major) %><br/>
|
||||
<%= radio_button_tag('version', 3) %>
|
||||
<%= 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) %>
|
||||
<%= l(:option_version_custom) %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="splitcontentright clear">
|
||||
<p>
|
||||
<%= label_tag('file_upload', "#{l(:label_new_content)}:") %>
|
||||
</p>
|
||||
<span class="add_attachment">
|
||||
<%= file_field_tag 'file_upload',
|
||||
:id => 'file_upload',
|
||||
:class => 'file_selector',
|
||||
:multiple => false,
|
||||
:onchange => "$('#dmsf_file_revision_name').val(this.files[0].name)",
|
||||
:data => {
|
||||
: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_concurrent_uploads => 1,
|
||||
:upload_path => uploads_path(:format => 'js')
|
||||
}
|
||||
%>
|
||||
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
|
||||
</span>
|
||||
</div>
|
||||
<br style="clear: both"/>
|
||||
<div class="splitcontentright">
|
||||
<p>
|
||||
<%= f.text_field(:name, :label => l(:label_file)) %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p>
|
||||
<%= f.text_area(:description, :rows => 6, :class => 'wiki-edit') %>
|
||||
</p>
|
||||
<div class="clear">
|
||||
<div class="splitcontentleft">
|
||||
<p>
|
||||
<%= label_tag('version_0', l(:label_dmsf_version)) %>
|
||||
<%= radio_button_tag('version', 0, @revision.version == @file.last_revision.version) %>
|
||||
<%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version %>
|
||||
<%= l(:option_version_same) %><br/>
|
||||
<%= 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 %>
|
||||
<%= l(:option_version_minor) %><br/>
|
||||
<%= radio_button_tag('version', 2, @revision.major_version != @file.last_revision.major_version) %>
|
||||
<%= @file.last_revision.major_version + 1 %>.0
|
||||
<%= l(:option_version_major) %><br/>
|
||||
<%= 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_minor', options_for_select(0..99, @file.last_revision.minor_version + 1), :onchange => '$("#version_3").prop("checked", true)' %>
|
||||
<%= l(:option_version_custom) %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="splitcontentright">
|
||||
<p>
|
||||
<%= label_tag('file_upload', l(:label_new_content)) %>
|
||||
<span class="add_attachment">
|
||||
<%= file_field_tag 'file_upload',
|
||||
:id => 'file_upload',
|
||||
:class => 'file_selector',
|
||||
:multiple => false,
|
||||
:onchange => "$('#dmsf_file_revision_name').val(this.files[0].name)",
|
||||
:data => {
|
||||
: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_concurrent_uploads => 1,
|
||||
:upload_path => uploads_path(:format => 'js')
|
||||
}
|
||||
%>
|
||||
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="custom_fields">
|
||||
<% @revision.custom_field_values.each do |value| %>
|
||||
<p><%= custom_field_tag_with_label(:dmsf_file_revision, value) %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="comment">
|
||||
<p>
|
||||
<%= label_tag('dmsf_file_revision_comment', "#{l(:label_comment)}:") %>
|
||||
</p>
|
||||
<div class="data">
|
||||
<%= f.text_area(:comment, :rows=> 2, :style => 'width: 99%;') %>
|
||||
</div>
|
||||
</div>
|
||||
<br/>
|
||||
<%= submit_tag(l(:submit_create)) %>
|
||||
</div>
|
||||
<p>
|
||||
<%= f.text_area(:comment, :rows => 2, :label => l(:label_comment)) %>
|
||||
</p>
|
||||
<%= f.submit l(:submit_create) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= wikitoolbar_for 'dmsf_file_revision_description' %>
|
||||
@ -1,9 +1,11 @@
|
||||
<%#=
|
||||
<%
|
||||
# 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) 2013 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -19,24 +21,24 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# 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>
|
||||
<tr>
|
||||
<th><%= l(:field_user) %></th>
|
||||
<th><%= l(:heading_access_downloads_emails) %></th>
|
||||
<th><%= l(:heading_access_first) %></th>
|
||||
<th><%= l(:heading_access_last) %></th>
|
||||
<th class="dmsf_th"><%= l(:field_user) %></th>
|
||||
<th class="dmsf_th"><%= l(:heading_access_downloads_emails) %></th>
|
||||
<th class="dmsf_th"><%= l(:heading_access_first) %></th>
|
||||
<th class="dmsf_th"><%= l(:heading_access_last) %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% revision.access_grouped.each do |access| %>
|
||||
<tr>
|
||||
<td><%= link_to_user(access.user) %></td>
|
||||
<td><%= access['count'] %></td>
|
||||
<td><%= format_time(DmsfHelper::to_time(access.first_at)) %></td>
|
||||
<td><%= format_time(DmsfHelper::to_time(access.last_at)) %></td>
|
||||
<td class="dmsf_author"><%= link_to_user(access.user) %></td>
|
||||
<td class="dmsf_version"><%= access.count %></td>
|
||||
<td class="dmsf_modified"><%= format_time(access.first_at) %></td>
|
||||
<td class="dmsf_modified"><%= format_time(access.last_at) %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</table>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<%#=
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
@ -26,54 +26,63 @@
|
||||
|
||||
<div class="contextual">
|
||||
<% if User.current.allowed_to?(:file_manipulation, @project) %>
|
||||
<% unless @file.locked? %>
|
||||
<%= link_to(l(:button_lock),
|
||||
lock_dmsf_files_path(:id => @file),
|
||||
:title => l(:title_lock_file),
|
||||
:class => 'icon icon-dmsf-lock') %>
|
||||
<% if @file.notification %>
|
||||
<% unless @file.locked_for_user? %>
|
||||
<% unless @file.locked? %>
|
||||
<%= link_to(l(:button_lock), lock_dmsf_files_path(:id => @file),
|
||||
:title => l(:title_lock_file), :class => 'icon dmsf_icon-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 %>
|
||||
<%= link_to(l(:label_notifications_off),
|
||||
notify_deactivate_dmsf_files_path(:id => @file),
|
||||
:title => l(:title_notifications_active_deactivate),
|
||||
:class => 'icon icon-notification-on') %>
|
||||
<% else %>
|
||||
:class => 'icon dmsf_icon-notification-on') %>
|
||||
<% else %>
|
||||
<%= link_to(l(:label_notifications_on),
|
||||
notify_activate_dmsf_files_path(:id => @file),
|
||||
:title => l(:title_notifications_not_active_activate),
|
||||
:class => 'icon icon-notification-off') %>
|
||||
:class => 'icon dmsf_icon-notification-off') %>
|
||||
<% end %>
|
||||
<%= 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'),
|
||||
:title => l(:title_create_link),
|
||||
:class => 'icon icon-link') %>
|
||||
<%= link_to(l(:label_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),
|
||||
:class => 'icon dmsf_icon-link') %>
|
||||
<%= link_to("#{l(:button_copy)}/#{l(:button_move)}", copy_file_path(:id => @file),
|
||||
:title => l(:title_copy), :class => 'icon icon-copy') %>
|
||||
<%= delete_link @file if @file_delete_allowed %>
|
||||
<% else %>
|
||||
<% if (!@file.locked_for_user? || User.current.allowed_to?(:force_file_unlock, @project)) && @file.unlockable? %>
|
||||
<%= link_to(l(:button_unlock),
|
||||
unlock_dmsf_files_path(:id => @file),
|
||||
:title => l(:title_unlock_file),
|
||||
:class => 'icon icon-dmsf-unlock')%>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if User.current.allowed_to?(:force_file_unlock, @project) %>
|
||||
<%= 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 %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</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') %>
|
||||
<%= error_messages_for('revision') %>
|
||||
<%= render(:partial => 'file_new_revision') if User.current.allowed_to?(:file_manipulation, @file.project) %>
|
||||
<% if User.current.allowed_to?(:file_manipulation, @file.project) && !@file.locked_for_user? %>
|
||||
<%= error_messages_for('file') %>
|
||||
<%= 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>
|
||||
<% @file.revisions.visible[@revision_pages.offset,@revision_pages.per_page].each do |revision| %>
|
||||
<div class="revision_box dmsf_detail dataTables_wrapper">
|
||||
<div class="fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix">
|
||||
<% @file.dmsf_file_revisions.visible[@revision_pages.offset, @revision_pages.per_page].each do |revision| %>
|
||||
<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="dataTables_lenght">
|
||||
<div class="controls" style="float: right">
|
||||
<%= link_to_function image_tag('rev_downloads.png', :plugin => 'redmine_dmsf'),
|
||||
"$('#revision_access-#{revision.id}').toggle()",
|
||||
<div class="dmsf_controls" style="float: right">
|
||||
<%= link_to_function image_tag('rev_downloads.png', :plugin => 'redmine_dmsf'),
|
||||
"$('#revision_access-#{revision.id}').toggle()",
|
||||
:title => l(:title_download_entries) %>
|
||||
<%= link_to image_tag('rev_download.png', :plugin => 'redmine_dmsf'),
|
||||
dmsf_file_path(@file, :download => revision),
|
||||
@ -81,76 +90,85 @@
|
||||
<%= link_to image_tag('rev_delete.png', :plugin => 'redmine_dmsf'),
|
||||
delete_revision_path(revision),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:title => l(:title_delete_revision) if @file_delete_allowed && (@file.revisions.visible.count > 1) %>
|
||||
</div>
|
||||
:title => l(:title_delete_revision) if @file_delete_allowed && (@file.dmsf_file_revisions.visible.count > 1) %>
|
||||
</div>
|
||||
<i><%= l(:info_revision, :rev => revision.id) %></i>
|
||||
<%= (revision.source_revision.nil? ? l(:label_created) : l(:label_changed)).downcase %>
|
||||
<%= l(:info_changed_by_user, :changed => format_time(revision.updated_at)) %>
|
||||
<%= link_to(revision.user.name, user_path(revision.user)) if revision.user %>
|
||||
</div>
|
||||
</div>
|
||||
<div style="border: 1px solid #e4e4e4;">
|
||||
<div class="clear">
|
||||
<div class="splitcontentleft">
|
||||
<%= label_tag('', "#{l(:label_title)}:") %>
|
||||
<%= h(revision.title) %>
|
||||
<div class="attributes dmsf_revision_inner_box">
|
||||
<div class="splitcontent">
|
||||
<div class="splitcontentleft">
|
||||
<p>
|
||||
<%= 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 class="splitcontentright">
|
||||
<%= label_tag('', "#{l(:label_file)}:") %>
|
||||
<%= ("#{h(revision.file.folder.dmsf_path_str)}/") if revision.file.folder %><%= h(revision.name) %>
|
||||
<div class="splitcontentright">
|
||||
<p>
|
||||
<%= 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>
|
||||
<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 id="<%= "revision_access-#{revision.id}" %>" style="display:none">
|
||||
<%= render(:partial => 'revision_access', :locals => {:revision => revision}) if User.current.allowed_to?(:file_manipulation, @file.project) %>
|
||||
</div>
|
||||
<div class="splitcontentright clear">
|
||||
<%= label_tag('', "#{l(:label_mime)}:") %>
|
||||
<%= h(revision.mime_type) %>
|
||||
<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">
|
||||
<%= render(:partial => 'revision_access', :locals => {:revision => revision}) if User.current.allowed_to?(:file_manipulation, @file.project) %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br/>
|
||||
</div>
|
||||
<br/>
|
||||
<% 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'
|
||||
@ -166,16 +184,16 @@
|
||||
|
||||
$('a.delete-entry').click(function(event) {
|
||||
if(!window.confirm('<%= l(:text_are_you_sure) %>')) {
|
||||
event.preventDefault();
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
$('#file_upload').change(function() {
|
||||
if($("input[name='version']:checked").val() == '0') {
|
||||
$('#fileMinorVersionRadio').prop('checked', true);
|
||||
$('#fileMinorVersionRadio').prop('checked', true);
|
||||
}
|
||||
$('#fileSameVersionRadio').prop('disabled', true);
|
||||
});
|
||||
$('#fileSameVersionRadio').prop('disabled', true);
|
||||
});
|
||||
|
||||
$('#newRevisionFormContentToggle').click(function() {
|
||||
if($('#newRevisionFormContent').is(':visible')) {
|
||||
@ -185,24 +203,24 @@
|
||||
else {
|
||||
$(this).text('[-]');
|
||||
$('#newRevisionFormContent').show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('.access-table').dataTable({
|
||||
$('.dmsf_list').dataTable({
|
||||
'bJQueryUI': true,
|
||||
'oLanguage': {
|
||||
'sUrl': '/plugin_assets/<%= :redmine_dmsf %>/javascripts/<%= url %>'
|
||||
'sUrl': '/plugin_assets/<%= :redmine_dmsf %>/javascripts/<%= url %>'
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<% if @revision.valid? && @file.valid? %>
|
||||
<script type="text/javascript">
|
||||
$('#newRevisionFormContentToggle').text('[+]');
|
||||
$('#newRevisionFormContent').hide();
|
||||
$('#newRevisionFormContentToggle').text('[+]');
|
||||
$('#newRevisionFormContent').hide();
|
||||
</script>
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= stylesheet_link_tag 'jquery.dataTables/jquery-ui.dataTables.css', :plugin => 'redmine_dmsf' %>
|
||||
<%= javascript_include_tag 'jquery.dataTables/jquery.dataTables.min.js', :plugin => 'redmine_dmsf' %>
|
||||
<% content_for :header_tags do %>
|
||||
<%= stylesheet_link_tag 'jquery.dataTables/jquery-ui.dataTables.css', :plugin => 'redmine_dmsf' %>
|
||||
<%= javascript_include_tag 'jquery.dataTables/jquery.dataTables.min.js', :plugin => 'redmine_dmsf' %>
|
||||
<% end %>
|
||||
@ -1,7 +1,11 @@
|
||||
<%# Redmine plugin for Document Management System "Features"
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# 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-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
|
||||
@ -15,53 +19,50 @@
|
||||
#
|
||||
# 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.%>
|
||||
|
||||
|
||||
<!--Select2 Files-->
|
||||
<%= stylesheet_link_tag 'select2.min.css', :plugin => 'redmine_dmsf' %>
|
||||
<%= javascript_include_tag 'select2.min.js', :plugin => 'redmine_dmsf' %>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<% html_title(l(:dmsf)) %>
|
||||
|
||||
<div class="contextual">
|
||||
</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 => "#{l(:button_copy)}/#{l(:button_move)}"}) %>
|
||||
|
||||
<% if DmsfFile.allowed_target_projects_on_copy.present? %>
|
||||
<%= form_tag({:action => 'create', :id => @file}, :id => 'copyForm') do |f| %>
|
||||
<div class="box dmsf_detail">
|
||||
<div class="box tabular">
|
||||
<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',
|
||||
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>
|
||||
<%= label_tag('target_folder_id', "#{l(:field_target_folder)}:") %>
|
||||
<%= label_tag('target_folder_id', l(:field_target_folder)) %>
|
||||
<%= select_tag('target_folder_id',
|
||||
options_for_select(DmsfFolder.directory_tree(@target_project),
|
||||
:selected => (@target_folder.id if @target_folder))) %>
|
||||
</p>
|
||||
</div>
|
||||
<%= submit_tag(l(:button_copy)) %>
|
||||
<% if User.current.allowed_to?(:file_manipulation, @project) %>
|
||||
<button type="button" id="move_button" title="<%= l(:button_move) %>"><%= l(:button_move) %></button>
|
||||
<% end %>
|
||||
<p>
|
||||
<%= submit_tag(l(:button_copy)) %>
|
||||
<% if User.current.allowed_to?(:file_manipulation, @project) %>
|
||||
<%= submit_tag(l(:button_move), :id => 'move_button') %>
|
||||
<% end %>
|
||||
</p>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
jQuery('#move_button').click(function(event) {
|
||||
jQuery('#copyForm').attr('action', "<%= url_for(:action => 'move', :id => @file) %>");
|
||||
jQuery('#copyForm').submit();
|
||||
$('#move_button').click(function(event) {
|
||||
$('#copyForm').attr('action', "<%= url_for(:action => 'move', :id => @file) %>");
|
||||
$('#copyForm').submit();
|
||||
});
|
||||
|
||||
jQuery('#target_project_id').change(function () {
|
||||
jQuery('#content').load("<%= url_for(:action => 'new') %>", jQuery('#copyForm').serialize());
|
||||
jQuery('#target_folder_id' ).select2({ width: "600px" });
|
||||
$('#target_project_id').change(function () {
|
||||
$('#content').load("<%= url_for(:action => 'new') %>", $('#copyForm').serialize());
|
||||
});
|
||||
|
||||
jQuery('#target_project_id' ).select2({ width: "600px" });
|
||||
jQuery('#target_folder_id' ).select2({ width: "600px" });
|
||||
$('#target_project_id').select2();
|
||||
$('#target_folder_id').select2();
|
||||
</script>
|
||||
@ -1,7 +1,11 @@
|
||||
<%# Redmine plugin for Document Management System "Features"
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# 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-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
|
||||
@ -15,29 +19,24 @@
|
||||
#
|
||||
# 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.%>
|
||||
|
||||
|
||||
<!--Select2 Files-->
|
||||
<%= stylesheet_link_tag 'select2.min.css', :plugin => 'redmine_dmsf' %>
|
||||
<%= javascript_include_tag 'select2.min.js', :plugin => 'redmine_dmsf' %>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<% html_title(l(:dmsf)) %>
|
||||
|
||||
<div class="contextual"></div>
|
||||
|
||||
<%= render(:partial => '/dmsf/path', :locals => {:folder => @folder, :filename => nil}) %>
|
||||
<%= render(:partial => '/dmsf/path',
|
||||
:locals => {:folder => @folder, :filename => nil, :title => l(:button_copy)}) %>
|
||||
|
||||
<% unless DmsfFolder.allowed_target_projects_on_copy.blank? %>
|
||||
<%= form_tag({:action => 'copy_to', :id => @folder}, :id => 'copyForm') do |f| %>
|
||||
<div class="box dmsf_detail">
|
||||
<div class="box tabular">
|
||||
<p>
|
||||
<label for="target_project_id"><%= l(:field_target_project) %>:</label>
|
||||
<%= select_tag('target_project_id',
|
||||
project_tree_options_for_select(DmsfFolder.allowed_target_projects_on_copy, :selected => @target_project)) %>
|
||||
</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',
|
||||
options_for_select(DmsfFolder.directory_tree(@target_project, @folder),
|
||||
:selected => (@target_folder.id if @target_folder))) %>
|
||||
@ -48,11 +47,10 @@
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
jQuery('#target_project_id').change(function () {
|
||||
jQuery('#content').load("<%= url_for(:action => 'new') %>", jQuery('#copyForm').serialize());
|
||||
jQuery('#target_folder_id' ).select2({ width: "600px" });
|
||||
$('#target_project_id').change(function () {
|
||||
$('#content').load("<%= url_for(:action => 'new') %>", $('#copyForm').serialize());
|
||||
});
|
||||
|
||||
jQuery('#target_project_id' ).select2({ width: "600px" });
|
||||
jQuery('#target_folder_id' ).select2({ width: "600px" });
|
||||
$('#target_project_id').select2();
|
||||
$('#target_folder_id').select2();
|
||||
</script>
|
||||
@ -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
|
||||
# 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
|
||||
# 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) %>
|
||||
|
||||
<div class="contextual">
|
||||
</div>
|
||||
|
||||
<% if @dmsf_file_id %>
|
||||
<% file = DmsfFile.find_by_id @dmsf_file_id%>
|
||||
<% title = file.title if file %>
|
||||
<% title = file.title if file %>
|
||||
<% 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| %>
|
||||
<%= error_messages_for @dmsf_link %>
|
||||
@ -34,19 +37,19 @@
|
||||
<%= 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 :dmsf_file_id, :value => @dmsf_file_id %>
|
||||
<div class="box dmsf_detail">
|
||||
<div class="box tabular">
|
||||
<% if @type == 'link_from' %>
|
||||
<p>
|
||||
<%= radio_button_tag(:external_link, 'false', @link_external == false) %> <%= l(:label_internal) %><br/>
|
||||
<%= radio_button_tag(:external_link, 'true', @link_external) %> <%= l(:label_external) %>
|
||||
</p>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div id="link_internal" style="<%= @link_external ? 'display:none' : '' %>">
|
||||
<p>
|
||||
<% 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 %>
|
||||
<%= 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 %>
|
||||
<%= select_tag('dmsf_link[target_project_id]',
|
||||
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),
|
||||
:selected => @target_folder_id)) %>
|
||||
</p>
|
||||
<% 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 %>
|
||||
<% if @type == 'link_from' %>
|
||||
<p>
|
||||
</div>
|
||||
<div id="link_external" style="<%= @link_external ? '' : 'display:none' %>">
|
||||
<%= label_tag('dmsf_link[external_url]', l(:label_link_external_url), :class => 'required') %>
|
||||
<%= text_field_tag 'dmsf_link[external_url]', @dmsf_link.external_url, :size => 40, :maxlength => 255 %>
|
||||
</div>
|
||||
<%= label_tag('dmsf_link[name]', l(:label_link_name), :class => 'required') %>
|
||||
<%= text_field_tag 'dmsf_link[name]', @dmsf_link.name, :size => 40, :maxlength => 255 %>
|
||||
<!--</p>-->
|
||||
<% if @target_folder_id %>
|
||||
<% folder = DmsfFolder.find_by_id @target_folder_id %>
|
||||
<% files = folder.dmsf_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 %>
|
||||
</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>
|
||||
<%= f.submit l(:button_create) %>
|
||||
<p><%= f.submit l(:button_create) %></p>
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
<script type="text/javascript">
|
||||
$('#dmsf_link_target_project_id').change(function () {
|
||||
$('#content').load("<%= url_for(:action => 'new', :project_id => @project.id, :reload => true) %>", $('#new_dmsf_link').serialize());
|
||||
});
|
||||
|
||||
$('#dmsf_link_target_folder_id').change(function () {
|
||||
$('#content').load("<%= url_for(:action => 'new', :project_id => @project.id) %>", $('#new_dmsf_link').serialize());
|
||||
});
|
||||
|
||||
$('#dmsf_link_target_file_id').change(function () {
|
||||
$('#content').load("<%= url_for(:action => 'new', :project_id => @project.id) %>", $('#new_dmsf_link').serialize());
|
||||
});
|
||||
|
||||
$("input[name=external_link]:radio").change(function(){
|
||||
$("#link_internal").toggle();
|
||||
$("#link_external").toggle();
|
||||
});
|
||||
</script>
|
||||
|
||||
$('#dmsf_link_target_project_id').select2();
|
||||
$('#dmsf_link_target_folder_id').select2();
|
||||
$('#dmsf_link_target_file_id').select2();
|
||||
</script>
|
||||
@ -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
|
||||
# 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
|
||||
# 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' %>
|
||||
@ -24,7 +24,7 @@
|
||||
<p>
|
||||
<%= h(file.dmsf_path_str) %> (<%= file.name %>)
|
||||
<% 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 %>
|
||||
</p>
|
||||
<% end %>
|
||||
@ -22,6 +22,6 @@
|
||||
<% @files.each do |file| %>
|
||||
<%= h(file.dmsf_path_str) %> (<%= file.name %>)
|
||||
<% 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 %>
|
||||
@ -26,7 +26,7 @@
|
||||
dmsf_file_url(file, :download => '')) %>
|
||||
(<%= file.name %>),
|
||||
<%= 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) %>
|
||||
<%= link_to(l(:link_details, :title => h(file.title)),
|
||||
dmsf_file_url(file)) %>
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
<% @files.each do |file| %>
|
||||
<%= h(file.dmsf_path_str) %> (<%= file.name %>),
|
||||
<%= 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) %>
|
||||
<%= dmsf_file_url(file) %>
|
||||
<% if file.last_revision.comment.present? %>
|
||||
|
||||
@ -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) 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -20,24 +23,30 @@
|
||||
|
||||
<%= textilizable(@body) %>
|
||||
|
||||
<% if @links_only == '1' %>
|
||||
<% if @links_only == '1' %>
|
||||
<% folders = [] %>
|
||||
<% files = [] %>
|
||||
<% if @folders.present? %>
|
||||
<% JSON.parse(@folders).each do |id| %>
|
||||
<% folder = DmsfFolder.find_by_id id %>
|
||||
<% if folder %>
|
||||
<% folder.folder_tree.each do |name, i| %>
|
||||
<% if folder %>
|
||||
<% folder.folder_tree.each do |name, i| %>
|
||||
<% dir = DmsfFolder.find_by_id i %>
|
||||
<% if dir %>
|
||||
<% if dir && !folders.include?(dir) %>
|
||||
<br/>
|
||||
<%= link_to(h(dir.dmsf_path_str), dmsf_folder_path(:id => dir.project_id, :folder_id => dir.id, :only_path => false)) %>
|
||||
<br/><br/>
|
||||
<% dir.files.each do |file| %>
|
||||
<%= link_to(h(file.title), dmsf_file_url(file)) %>
|
||||
(<%= link_to(h(file.name), dmsf_file_url(file, :download => '')) %>)
|
||||
<br/>
|
||||
<% dir.dmsf_files.each do |file| %>
|
||||
<% unless files.include?(file) %>
|
||||
<%= link_to(h(file.title), dmsf_file_url(file)) %>
|
||||
(<%= link_to(h(file.name), dmsf_file_url(file, :download => '')) %>)
|
||||
<br/>
|
||||
<% files << file %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% folders << dir %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
@ -45,11 +54,13 @@
|
||||
<br/>
|
||||
<% JSON.parse(@files).each do |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.name), dmsf_file_url(file, :download => '')) %>)
|
||||
<br/>
|
||||
<% files << file %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@ -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) 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -20,29 +23,35 @@
|
||||
|
||||
<%= @body %>
|
||||
|
||||
<% if @links_only == '1' %>
|
||||
<% if @links_only == '1' %>
|
||||
<% folders = [] %>
|
||||
<% files = [] %>
|
||||
<% if @folders.present? %>
|
||||
<% JSON.parse(@folders).each do |id| %>
|
||||
<% folder = DmsfFolder.find_by_id id %>
|
||||
<% if folder %>
|
||||
<% folder.folder_tree.each do |name, i| %>
|
||||
<% if folder && !folders.include?(folder) %>
|
||||
<% folder.folder_tree.each do |name, i| %>
|
||||
<% dir = DmsfFolder.find_by_id i %>
|
||||
<% if dir %>
|
||||
<%= dir.dmsf_path_str %>
|
||||
<% dir.files.each do |file| %>
|
||||
<%= dmsf_file_url(file, :download => '') %>
|
||||
<% dir.dmsf_files.each do |file| %>
|
||||
<% unless files.include?(file) %>
|
||||
<%= dmsf_file_url(file, :download => '') %>
|
||||
<% files << file %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @files.present? %>
|
||||
<% JSON.parse(@files).each do |id| %>
|
||||
<% file = DmsfFile.find_by_id id %>
|
||||
<% if file %>
|
||||
<% if file && !files.include?(file) %>
|
||||
<%= dmsf_file_url(file, :download => '') %>
|
||||
<% files << file %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@ -17,16 +17,16 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.%>
|
||||
|
||||
<p><%= @user.name %>,</p>
|
||||
<p>
|
||||
<p>
|
||||
<%= @text1 %>
|
||||
</p>
|
||||
<p>
|
||||
<%= @text2 %>
|
||||
<% unless @revision.file.folder %>
|
||||
<%= link_to l(:link_documents),
|
||||
dmsf_folder_url(:id => @revision.file.project) %>
|
||||
<%= @text2 %>
|
||||
<% unless @revision.dmsf_file.dmsf_folder %>
|
||||
<%= link_to l(:link_documents),
|
||||
dmsf_folder_url(:id => @revision.dmsf_file.project) %>
|
||||
<% else %>
|
||||
<%= link_to @revision.file.folder.title,
|
||||
dmsf_folder_url(:id => @revision.file.project, :folder_id => @revision.file.folder) %>
|
||||
<%= link_to @revision.dmsf_file.dmsf_folder.title,
|
||||
dmsf_folder_url(:id => @revision.dmsf_file.project, :folder_id => @revision.dmsf_file.dmsf_folder) %>
|
||||
<% end %>.
|
||||
</p>
|
||||
@ -18,8 +18,8 @@
|
||||
|
||||
<%= @user.name %>,
|
||||
<%= @text1 %>
|
||||
<% unless @revision.file.folder %>
|
||||
<%= @text2 %> <%= dmsf_folder_url(:id => @revision.file.project) %>.
|
||||
<% unless @revision.dmsf_file.dmsf_folder %>
|
||||
<%= @text2 %> <%= dmsf_folder_url(:id => @revision.dmsf_file.project) %>.
|
||||
<% 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 %>
|
||||
@ -1,10 +1,11 @@
|
||||
<%
|
||||
# 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>
|
||||
# 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
|
||||
@ -23,46 +24,36 @@
|
||||
|
||||
<div class="box">
|
||||
<%= form_tag({:controller => 'dmsf_upload', :action => 'upload_files', :id => @project, :folder_id => @folder},
|
||||
:id => 'uploadform', :method=>:post, :multipart => true) do %>
|
||||
<% if Setting.attachment_max_size.to_i >= 102400 %>
|
||||
<div class="upload_select">
|
||||
<%= l(:label_file_size) %>:
|
||||
<select id="uploader_select">
|
||||
<option value="1">
|
||||
< <%= "#{@ajax_upload_size}" %> MB
|
||||
</option>
|
||||
<option value="2">
|
||||
> <%= "#{@ajax_upload_size}" %> MB
|
||||
</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>
|
||||
:id => 'uploadform', :method => :post, :multipart => true) do %>
|
||||
<div class="dmsf_upload_select">
|
||||
<select id="uploader_select">
|
||||
<option value="1">
|
||||
<%= l(:label_drag_drop) %>
|
||||
</option>
|
||||
<option value="2">
|
||||
<%= l(:label_classic) %>
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<h3><%= l(:label_upload) %></h3>
|
||||
<div id="uploader">
|
||||
<p>
|
||||
<label><%=l(:label_attachment_plural)%></label>
|
||||
<label><%= l(:label_attachment_plural) %></label>
|
||||
<%= render :partial => 'attachments/form' %>
|
||||
</p>
|
||||
<%= submit_tag(l(:submit_upload_files)) %>
|
||||
<%= submit_tag l(:label_upload) %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var originalUploaderContent;
|
||||
var uploader = jQuery('#uploader');
|
||||
var uploader = $('#uploader');
|
||||
|
||||
originalUploaderContent = uploader.html();
|
||||
|
||||
jQuery('#uploader_select').change(function() {
|
||||
if(jQuery(this).val() == 2) {
|
||||
$('#uploader_select').change(function() {
|
||||
if($(this).val() === '2') {
|
||||
uploader.html(originalUploaderContent);
|
||||
} else {
|
||||
initPlUploader(uploader);
|
||||
@ -83,7 +74,7 @@
|
||||
<script type="text/javascript">
|
||||
function initPlUploader(uploader) {
|
||||
uploader.html('<div></div>');
|
||||
uploader = jQuery('div', uploader);
|
||||
uploader = $('div', uploader);
|
||||
uploader.plupload({
|
||||
runtimes : 'html5,flash,silverlight,html4',
|
||||
url : '<%= url_for({:controller => 'dmsf_upload', :action => 'upload_file', :id => @project}) %>',
|
||||
@ -110,28 +101,28 @@
|
||||
// Silverlight settings
|
||||
silverlight_xap_url : '<%= plugin_asset_path(:redmine_dmsf, 'javascripts', 'plupload/js/Moxie.xap') %>'
|
||||
});
|
||||
jQuery('.plupload_scroll',uploader).resizable({
|
||||
$('.plupload_scroll',uploader).resizable({
|
||||
handles: 's'
|
||||
});
|
||||
var pluploader = uploader.plupload('getUploader');
|
||||
|
||||
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.
|
||||
file.status = plupload.FAILED;
|
||||
pluploader.trigger('UploadProgress', file);
|
||||
pluploader.trigger('QueueChanged');
|
||||
} else {
|
||||
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]')
|
||||
.val(responseObject.disk_filename);
|
||||
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]')
|
||||
.val(responseObject.content_type);
|
||||
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]')
|
||||
.val(responseObject.original_filename);
|
||||
uploader.append(original_filename_input);
|
||||
@ -142,7 +133,7 @@
|
||||
}
|
||||
}
|
||||
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++;
|
||||
return true;
|
||||
});
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
<%#=
|
||||
<%
|
||||
# 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>
|
||||
# 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
|
||||
@ -21,65 +21,62 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# 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) %>
|
||||
<div class="clear">
|
||||
<div class="splitcontentleft">
|
||||
<p>
|
||||
<%= label_tag("commited_files[#{i}][title]", "#{l(:label_title)}:") %>
|
||||
<%= text_field_tag("commited_files[#{i}][title]", upload.title, :size => 32) %>
|
||||
<%= label_tag("commited_files[#{i}][title]", l(:label_title)) %>
|
||||
<%= text_field_tag("commited_files[#{i}][title]", upload.title, :size => 32, :required => true) %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="splitcontentright">
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_filename)}:") %>
|
||||
<%= label_tag('', l(:label_filename)) %>
|
||||
<%= h(upload.name) %>
|
||||
<%= hidden_field_tag("commited_files[#{i}][name]", upload.name) %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="no-ident">
|
||||
<%= label_tag("commited_files[#{i}][description]", "#{l(:label_description)}:") %>
|
||||
<p>
|
||||
<%= label_tag("commited_files[#{i}][description]", l(:label_description)) %>
|
||||
<%= text_area_tag("commited_files[#{i}][description]", upload.description, :rows => 6, :class => 'wiki-edit') %>
|
||||
</p>
|
||||
<div class="wiki data clear">
|
||||
<%= text_area_tag("commited_files[#{i}][description]", upload.description, :rows=> 6, :class => 'wiki-edit') %>
|
||||
<div class="clear">
|
||||
<div class="splitcontentleft">
|
||||
<p>
|
||||
<%= label_tag("commited_files[#{i}][version]_minor", l(:label_dmsf_version)) %>
|
||||
<%= radio_button_tag("commited_files[#{i}][version]", 1, true) %>
|
||||
<%= upload.major_version %>.<%= upload.minor_version + 1 %>
|
||||
<%= l(:option_version_minor) %><br/>
|
||||
<%= radio_button_tag("commited_files[#{i}][version]", 2) %>
|
||||
<%= upload.major_version + 1 %>.0
|
||||
<%= 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), :onchange => "$('#commited_files_#{i}_version_3').prop('checked', true)" %>.
|
||||
<%= 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_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 class="splitcontentleft">
|
||||
<p>
|
||||
<%= label_tag("commited_files[#{i}][version]_minor", "#{l(:label_version)}:") %>
|
||||
</p>
|
||||
<div class="data clear">
|
||||
<%= radio_button_tag("commited_files[#{i}][version]", 1, true) %>
|
||||
<%= upload.major_version %>.<%= upload.minor_version + 1 %>
|
||||
<%= l(:option_version_minor) %><br/>
|
||||
<%= radio_button_tag("commited_files[#{i}][version]", 2) %>
|
||||
<%= upload.major_version + 1 %>.0
|
||||
<%= 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) %>
|
||||
</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| %>
|
||||
<p><%= custom_field_tag_with_label("commited_files[#{i}][dmsf_file_revision]", value) %></p>
|
||||
<% end %>
|
||||
<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>
|
||||
<div class="data">
|
||||
<%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows => 2, :style => 'width: 99%;') %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= wikitoolbar_for "commited_files_#{i}_description" %>
|
||||
<%= wikitoolbar_for "commited_files_#{i}_description" %>
|
||||
@ -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) 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
|
||||
# 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
|
||||
# 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}][name]", upload.name) %>
|
||||
<p class="warning"><%= l(:info_file_locked) %></p>
|
||||
|
||||
<div class="clear">
|
||||
<div class="splitcontentleft">
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_title)}:") %>
|
||||
<%= label_tag('', l(:label_title)) %>
|
||||
<%= h(upload.title) %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="splitcontentright">
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_filename)}:") %>
|
||||
<%= label_tag('', l(:label_filename)) %>
|
||||
<%= h(upload.name) %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="no-ident">
|
||||
<%= label_tag('', "#{l(:label_description)}:") %>
|
||||
</p>
|
||||
<div class="wiki data clear">
|
||||
<%= textilizable(upload.description) %>
|
||||
</div>
|
||||
<div class="splitcontentleft">
|
||||
<% if upload.description.present? %>
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_version)}:") %>
|
||||
<%= upload.major_version %>.<%= upload.minor_version %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="splitcontentright clear">
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_mime)}:") %>
|
||||
<%= h(upload.mime_type) %>
|
||||
<%= label_tag('', l(:label_description)) %>
|
||||
<div class="wiki">
|
||||
<%= textilizable(upload.description) %>
|
||||
</div>
|
||||
</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>
|
||||
<% if upload.comment.present? %>
|
||||
<p>
|
||||
<%= label_tag('', "#{l(:label_size)}:") %>
|
||||
<%= number_to_human_size(upload.size) %>
|
||||
<%= label_tag('', l(:label_comment)) %>
|
||||
<div class="wiki"><%= textilizable(upload.comment) %></div>
|
||||
</p>
|
||||
</div>
|
||||
<br style="clear: both"/>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
@ -1,8 +1,11 @@
|
||||
<%# Redmine plugin for Document Management System "Features"
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# Copyright (C) 2014 Karel Pičman <karel.picman@kontron.com>
|
||||
# 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-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
|
||||
|
||||
@ -1,7 +1,11 @@
|
||||
<%# Redmine plugin for Document Management System "Features"
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# 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-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
|
||||
@ -15,24 +19,23 @@
|
||||
#
|
||||
# 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.%>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<% html_title(l(:dmsf)) %>
|
||||
<% html_title l(:dmsf) %>
|
||||
|
||||
<div class="contextual">
|
||||
</div>
|
||||
<%= render(:partial => '/dmsf/path',
|
||||
: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},
|
||||
:method=>:post) do %>
|
||||
<% @uploads.each do |upload| %>
|
||||
:method => :post) do %>
|
||||
<% @uploads.each_with_index do |upload, i| %>
|
||||
<% if upload.locked %>
|
||||
<%= render(:partial => 'upload_file_locked', :locals => {:upload => upload, :i => i}) %>
|
||||
<% else %>
|
||||
@ -40,5 +43,5 @@
|
||||
<% end %>
|
||||
<% i += 1 %>
|
||||
<% end %>
|
||||
<%= submit_tag(l(:submit_commit)) %>
|
||||
<%= submit_tag l(:submit_commit) %>
|
||||
<% end %>
|
||||
@ -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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -14,32 +17,39 @@
|
||||
#
|
||||
# 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.%>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<h3 class="title"><%= l(:field_label_dmsf_workflow) %></h3>
|
||||
|
||||
<%= form_tag({:controller => 'dmsf_workflows', :action => 'new_action'},
|
||||
:method => :post,
|
||||
:id => 'new-action-form') do %>
|
||||
|
||||
:method => :post, :id => 'new-action-form') do %>
|
||||
<%= 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] %>
|
||||
<p><label><%= radio_button_tag 'step_action', DmsfWorkflowStepAction::ACTION_APPROVE, true %> <%= l(:label_dmsf_wokflow_action_approve) %></label><br/></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), :size => '38x2' %>
|
||||
<label>
|
||||
<%= 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>
|
||||
<%= label_tag 'delegate', l(:label_dmsf_wokflow_action_delegate) %><br/>
|
||||
<%= 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]) }')" %>
|
||||
<%= 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') %>
|
||||
<%= 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 => 'dmsf_users_for_delegate') %>
|
||||
</p>
|
||||
|
||||
<p class="buttons">
|
||||
<%= submit_tag l(:button_submit), :name => 'commit', :onclick => 'hideModal(this);' %>
|
||||
<%= submit_tag l(:button_cancel), :name => 'commit', :onclick => 'hideModal(this);' %>
|
||||
</p>
|
||||
<% end %>
|
||||
<% end %>
|
||||
@ -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
|
||||
# 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
|
||||
# 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>
|
||||
<p>
|
||||
<% if params[:dmsf_file_revision_id].present? %>
|
||||
<% revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id]) %>
|
||||
<% if revision %>
|
||||
<div class="log_header_box">
|
||||
<div class="log_header_left">
|
||||
<%= label_tag 'workflow_name', "#{l(:link_workflow)} #{l(:field_name).downcase}: " %>
|
||||
<div class="dmsf_log_header_box">
|
||||
<div class="dmsf_log_header_left">
|
||||
<%= label_tag 'workflow_name', "#{l(:link_workflow)} #{l(:field_name).downcase} " %>
|
||||
<% if User.current.allowed_to?(:manage_workflows, @dmsf_workflow.project) %>
|
||||
<%= link_to @dmsf_workflow.name, dmsf_workflow_path(@dmsf_workflow) %>
|
||||
<% else %>
|
||||
@ -31,7 +35,7 @@
|
||||
<% end %>
|
||||
</div>
|
||||
<div>
|
||||
<%= label_tag 'workflow_status', "#{l(:field_status)}: " %>
|
||||
<%= label_tag 'workflow_status', l(:field_status) %>
|
||||
<%= revision.workflow_str false %>
|
||||
</div>
|
||||
</div>
|
||||
@ -47,34 +51,34 @@
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr id="step-0" class="even">
|
||||
<td class="step"/>
|
||||
<td class="id"/>
|
||||
<td/>
|
||||
<td/>
|
||||
<td><%= DmsfWorkflowStepAction.workflow_str(0) %></td>
|
||||
<td class="note"></td>
|
||||
<td class="dmsf_note"></td>
|
||||
<td/>
|
||||
</tr>
|
||||
<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><%= DmsfWorkflowStepAction.action_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>
|
||||
</tr>
|
||||
<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><%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_START) %></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>
|
||||
</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" %>
|
||||
<% result = DmsfWorkflowStep.connection.exec_query sql %>
|
||||
<% result.each_with_index do |row, i| %>
|
||||
<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><%= DmsfWorkflowStepAction.action_str(row['action']) %></td>
|
||||
<td>
|
||||
@ -84,7 +88,7 @@
|
||||
<%= DmsfWorkflowStepAction.workflow_str(row['action']) %>
|
||||
<% end %>
|
||||
</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>
|
||||
</tr>
|
||||
<% end %>
|
||||
@ -93,5 +97,4 @@
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</p>
|
||||
|
||||
</p>
|
||||
@ -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>
|
||||
#
|
||||
@ -14,9 +17,10 @@
|
||||
#
|
||||
# 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.%>
|
||||
# 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 %>
|
||||
<div class="contextual">
|
||||
@ -24,9 +28,18 @@
|
||||
</div>
|
||||
|
||||
<h2><%=l(:label_dmsf_workflow_plural)%></h2>
|
||||
<% end %>
|
||||
|
||||
<%= 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 %>
|
||||
|
||||
<% end %>
|
||||
|
||||
<% if @workflows.any? %>
|
||||
<% if @workflows.any? %>
|
||||
<table class="list">
|
||||
<thead><tr>
|
||||
<th><%=l(:field_name)%></th>
|
||||
@ -34,9 +47,12 @@
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<% for workflow in @workflows %>
|
||||
<tr id="workflow-<%= workflow.id %>" class="<%= cycle('odd', 'even') %>">
|
||||
<td class="name"><%= link_to(h(workflow.name), dmsf_workflow_path(workflow)) %></td>
|
||||
<td class="buttons"><%= delete_link dmsf_workflow_path(workflow) %></td>
|
||||
<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="buttons">
|
||||
<%= change_status_link(workflow) unless @project %>
|
||||
<%= delete_link dmsf_workflow_path(workflow) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -20,7 +21,7 @@
|
||||
%>
|
||||
|
||||
<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>
|
||||
<%= 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) }')" %>
|
||||
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -21,11 +22,11 @@
|
||||
|
||||
<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' %>
|
||||
<p class="buttons">
|
||||
<%= submit_tag l(:dmsf_and), :id => 'add-step-and' %>
|
||||
<%= submit_tag l(:dmsf_or), :id => 'add-step-or' %>
|
||||
<%= submit_tag l(:button_cancel), :name => nil, :onclick => 'hideModal(this);', :type => 'button' %>
|
||||
<%= f.submit l(:dmsf_and), :id => 'add-step-and' %>
|
||||
<%= f.submit l(:dmsf_or), :id => 'add-step-or' %>
|
||||
<%= f.submit l(:button_cancel), :name => nil, :onclick => 'hideModal(this);', :type => 'button' %>
|
||||
</p>
|
||||
<% end %>
|
||||
@ -1,8 +1,9 @@
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -28,41 +29,42 @@
|
||||
<%= labelled_form_for @dmsf_workflow do |f| %>
|
||||
<%= error_messages_for 'workflow' %>
|
||||
<div class="box tabular">
|
||||
<p><%= f.text_field :name, :value => @dmsf_workflow.name, :required => true %><%= submit_tag l(:button_save) %></p>
|
||||
</div>
|
||||
<% end %>
|
||||
<p>
|
||||
<%= f.text_field :name, :required => true %>
|
||||
<%= f.submit l(:button_save) %>
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<div class="tab-content" id="tab-content-members">
|
||||
<p>
|
||||
<div class="tab-content" id="tab-content-members">
|
||||
<p>
|
||||
<%= link_to l(:dmsf_new_step), new_step_dmsf_workflow_path(@dmsf_workflow), :remote => true, :class => 'icon icon-add' %>
|
||||
</p>
|
||||
</p>
|
||||
<% steps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq %>
|
||||
<% if steps.any? %>
|
||||
<table class="list">
|
||||
<table class="list steps">
|
||||
<thead><tr>
|
||||
<th><%= l(:label_dmsf_workflow_step) %></th>
|
||||
<th><%= l(:label_dmsf_workflow_approval_plural) %></th>
|
||||
<th><%= l(:button_sort)%></th>
|
||||
<th></th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<% steps.each do |i|%>
|
||||
<tr id="step-<%= i %>" class="<%= cycle 'odd', 'even' %> step">
|
||||
<td class="step"><%= i %></td>
|
||||
<td class="approval">
|
||||
<% @dmsf_workflow.dmsf_workflow_steps.collect{|s| (s.step == i) ? s : nil}.compact.each_with_index do |step, j| %>
|
||||
<% if j != 0 %>
|
||||
<b><%= step.soperator %></b> 
|
||||
<tbody>
|
||||
<% steps.each do |i|%>
|
||||
<tr id="step-<%= i %>" class="<%= cycle 'odd', 'even' %> step">
|
||||
<td class="id"><%= i %></td>
|
||||
<td class="approval">
|
||||
<% stps = @dmsf_workflow.dmsf_workflow_steps.collect{|s| (s.step == i) ? s : nil}.compact %>
|
||||
<% stps.each_with_index do |step, j| %>
|
||||
<% if (j != 0) || (stps.count > 1) %>
|
||||
<b><%= step.soperator %></b>
|
||||
<% end %>
|
||||
<%= link_to_user step.user %>
|
||||
<% end %>
|
||||
</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) %>
|
||||
</td>
|
||||
</td>
|
||||
</tr>
|
||||
<% end; reset_cycle %>
|
||||
</tbody>
|
||||
@ -70,4 +72,8 @@
|
||||
<% else %>
|
||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= javascript_tag do %>
|
||||
$(function() { $("table.steps tbody").positionedItems(); });
|
||||
<% end %>
|
||||
|
||||
@ -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
|
||||
# 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
|
||||
# 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}) %>');
|
||||
showModal('ajax-modal', '35%');
|
||||
|
||||
@ -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
|
||||
# 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
|
||||
# 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' %>
|
||||
@ -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
|
||||
# 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
|
||||
# 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] %>
|
||||
<% if project %>
|
||||
<h2><%= link_to l(:label_dmsf_workflow_plural), settings_project_path(project, :tab => 'dmsf_workflow') %> » <%=l(:label_dmsf_workflow_new)%></h2>
|
||||
<h2><%= link_to l(:label_dmsf_workflow_plural), settings_project_path(project, :tab => 'dmsf_workflow') %> » <%= l(:label_dmsf_workflow_new) %></h2>
|
||||
<% else %>
|
||||
<h2><%= link_to l(:label_dmsf_workflow_plural), dmsf_workflows_path %> » <%=l(:label_dmsf_workflow_new)%></h2>
|
||||
<h2><%= link_to l(:label_dmsf_workflow_plural), dmsf_workflows_path %> » <%= l(:label_dmsf_workflow_new) %></h2>
|
||||
<% end %>
|
||||
|
||||
<%= labelled_form_for @dmsf_workflow do |f| %>
|
||||
<%= f.hidden_field(:project_id, :value => project.id) if project %>
|
||||
<%= error_messages_for 'dmsf_workflow' %>
|
||||
<div class="box tabular">
|
||||
<p>
|
||||
<%= f.text_field :name, :value => @dmsf_workflow.name, :size => 25, :maxlength => 255, :required => true %>
|
||||
<p>
|
||||
<%= f.text_field :name, :required => true %>
|
||||
</p>
|
||||
<p>
|
||||
<%= label_tag :label_copy_workflow_from, l(:label_copy_workflow_from) %>
|
||||
<%= select_tag('dmsf_workflow_id', dmsf_all_workflows_for_select(params[:dmsf_workflow_id])) %>
|
||||
<p>
|
||||
<%= f.select(:id,
|
||||
dmsf_all_workflows_for_select(params[:dmsf_workflow] ? params[:dmsf_workflow][:id] : nil),
|
||||
:label => l(:label_copy_workflow_from)) %>
|
||||
</p>
|
||||
<% if project %>
|
||||
<p><%= hidden_field_tag :project_id, project.id %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
<%= submit_tag l(:button_create) %>
|
||||
<%= f.submit l(:button_create) %>
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
<script type="text/javascript">
|
||||
$('#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());
|
||||
});
|
||||
</script>
|
||||
$('#dmsf_workflow_id').select2();
|
||||
</script>
|
||||
|
||||
@ -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 %>
|
||||
@ -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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
<%#
|
||||
# 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-14 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
|
||||
# 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
|
||||
# along with this program; if not, write to the Free Software
|
||||
# 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'
|
||||
require 'redmine_dmsf/patches/project_patch'
|
||||
require 'redmine_dmsf/patches/project_tabs_extended'
|
||||
%>
|
||||
|
||||
<%= labelled_fields_for :pref, @user.pref do |pref_fields| %>
|
||||
<p><%= pref_fields.check_box :dmsf_tree_view %></p>
|
||||
<% end %>
|
||||
@ -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) 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -16,11 +19,12 @@
|
||||
#
|
||||
# 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.%>
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<% if @project.new_record? && @source_project %>
|
||||
<p>
|
||||
<label class="block"><%= check_box_tag 'only[]', 'dmsf', true %> <%= l(:label_dmsf_plural, @source_project.dmsf_count) %></label>
|
||||
<label class="block"><%= check_box_tag 'only[]', 'approval_workflows', true %> <%= l(:label_dmsf_workflow_plural_num, @source_project.dmsf_workflows.count) %></label>
|
||||
<label class="block"><%= check_box_tag 'only[]', 'approval_workflows', true %> <%= l(:label_dmsf_workflow_plural_num, @source_project.dmsf_workflows.count) %></label>
|
||||
</p>
|
||||
<% end %>
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
<%#
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -24,15 +26,15 @@
|
||||
<% files = DmsfFile.joins(
|
||||
'JOIN dmsf_locks ON dmsf_files.id = dmsf_locks.entity_id').where(
|
||||
'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?%>
|
||||
<%= form_tag({}) do %>
|
||||
<table class="list">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%=l(:field_project)%></th>
|
||||
<th><%=l(:label_document)%>/<%=l(:field_folder)%></th>
|
||||
<th><%=l(:field_folder)%></th>
|
||||
<tr>
|
||||
<th><%= l(:field_project) %></th>
|
||||
<th><%= l(:label_document) %>/<%= l(:field_folder) %></th>
|
||||
<th><%= l(:field_folder) %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -40,19 +42,19 @@
|
||||
<tr id="folder-<%= folder.id %>" class="<%= cycle('odd', 'even') %>">
|
||||
<td class="project">
|
||||
<%= link_to_project(folder.project) %>
|
||||
</td>
|
||||
</td>
|
||||
<td class="title">
|
||||
<%= link_to(h(folder.title),
|
||||
{:controller => 'dmsf', :action => 'show', :id => folder.project, :folder_id => folder},
|
||||
:class => 'icon icon-folder') %>
|
||||
</td>
|
||||
:class => 'icon icon-folder') %>
|
||||
</td>
|
||||
<td class="title">
|
||||
<% if folder.folder %>
|
||||
<%= link_to(h(folder.folder.title),
|
||||
{:controller => 'dmsf', :action => 'show', :id => folder.project, :folder_id => folder.folder}) %>
|
||||
<% if folder.dmsf_folder %>
|
||||
<%= link_to(h(folder.dmsf_folder.title),
|
||||
{:controller => 'dmsf', :action => 'show', :id => folder.project, :folder_id => folder.dmsf_folder}) %>
|
||||
<% else %>
|
||||
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> folder.project }) %>
|
||||
<% end %>
|
||||
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> folder.project }) %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
@ -60,19 +62,19 @@
|
||||
<tr id="file-<%= file.id %>" class="<%= cycle('odd', 'even') %>">
|
||||
<td class="project">
|
||||
<%= link_to_project(file.project) %>
|
||||
</td>
|
||||
<td class="title">
|
||||
<%= link_to(h(file.title),
|
||||
</td>
|
||||
<td class="title">
|
||||
<%= link_to(h(file.title),
|
||||
{:controller => 'dmsf_files', :action => :show, :id => file },
|
||||
:class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}") %>
|
||||
</td>
|
||||
</td>
|
||||
<td class="title">
|
||||
<% if file.folder %>
|
||||
<%= link_to(h(file.folder.title),
|
||||
{:controller => 'dmsf', :action => 'show', :id => file.project, :folder_id => file.folder}) %>
|
||||
<% if file.dmsf_folder %>
|
||||
<%= link_to(h(file.dmsf_folder.title),
|
||||
{:controller => 'dmsf', :action => 'show', :id => file.project, :folder_id => file.dmsf_folder}) %>
|
||||
<% else %>
|
||||
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> file.project }) %>
|
||||
<% end %>
|
||||
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id=> file.project }) %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
<%#
|
||||
<%
|
||||
# encoding: utf-8
|
||||
#
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -22,20 +24,20 @@
|
||||
'LEFT JOIN dmsf_workflow_step_actions ON dmsf_workflow_step_assignments.id = dmsf_workflow_step_actions.dmsf_workflow_step_assignment_id').where(
|
||||
'dmsf_workflow_step_assignments.user_id = ? AND dmsf_workflow_step_actions.id IS NULL', @user.id).all %>
|
||||
<% assignments = Array.new %>
|
||||
<% all_assignments.each do |assignment| %>
|
||||
<% if assignment.dmsf_file_revision.file.last_revision &&
|
||||
!assignment.dmsf_file_revision.file.last_revision.deleted &&
|
||||
(assignment.dmsf_file_revision.workflow == DmsfWorkflow::STATE_WAITING_FOR_APPROVAL) &&
|
||||
(assignment.dmsf_file_revision == assignment.dmsf_file_revision.file.last_revision) %>
|
||||
<% all_assignments.each do |assignment| %>
|
||||
<% if assignment.dmsf_file_revision.dmsf_file.last_revision &&
|
||||
!assignment.dmsf_file_revision.dmsf_file.last_revision.deleted? &&
|
||||
(assignment.dmsf_file_revision.workflow == DmsfWorkflow::STATE_WAITING_FOR_APPROVAL) &&
|
||||
(assignment.dmsf_file_revision == assignment.dmsf_file_revision.dmsf_file.last_revision) %>
|
||||
<% assignments << assignment %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<h3><%= l(:label_my_open_approvals)%> (<%= assignments.count %>)</h3>
|
||||
<h3><%= l(:open_approvals)%> (<%= assignments.count %>)</h3>
|
||||
<% if assignments.any? %>
|
||||
<%= form_tag({}) do %>
|
||||
<table class="list">
|
||||
<thead>
|
||||
<tr>
|
||||
<tr>
|
||||
<th><%=l(:field_project)%></th>
|
||||
<th><%=l(:field_label_dmsf_workflow)%></th>
|
||||
<th><%=l(:label_document)%></th>
|
||||
@ -46,29 +48,29 @@
|
||||
<% assignments.each do |assignment| %>
|
||||
<tr id="assignment-<%= assignment.id %>" class="<%= cycle('odd', 'even') %>">
|
||||
<td class="project">
|
||||
<% if assignment.dmsf_file_revision.file.project %>
|
||||
<%= link_to_project(assignment.dmsf_file_revision.file.project) %>
|
||||
<% if assignment.dmsf_file_revision.dmsf_file.project %>
|
||||
<%= link_to_project(assignment.dmsf_file_revision.dmsf_file.project) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<% if assignment.dmsf_workflow_step && assignment.dmsf_workflow_step.dmsf_workflow %>
|
||||
<%= link_to(h(assignment.dmsf_workflow_step.dmsf_workflow.name),
|
||||
edit_dmsf_workflow_path(assignment.dmsf_workflow_step.dmsf_workflow)) %>
|
||||
<% if assignment.dmsf_workflow_step && assignment.dmsf_workflow_step.dmsf_workflow %>
|
||||
<%= link_to(h(assignment.dmsf_workflow_step.dmsf_workflow.name),
|
||||
edit_dmsf_workflow_path(assignment.dmsf_workflow_step.dmsf_workflow)) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="title">
|
||||
<% if assignment.dmsf_file_revision && assignment.dmsf_file_revision.file %>
|
||||
<%= link_to(h(assignment.dmsf_file_revision.title),
|
||||
{:controller => 'dmsf_files', :action => :show, :id => assignment.dmsf_file_revision.file }) %>
|
||||
<% if assignment.dmsf_file_revision && assignment.dmsf_file_revision.dmsf_file %>
|
||||
<%= link_to(h(assignment.dmsf_file_revision.title),
|
||||
{:controller => 'dmsf_files', :action => :show, :id => assignment.dmsf_file_revision.dmsf_file }) %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="title">
|
||||
<% if assignment.dmsf_file_revision %>
|
||||
<% if assignment.dmsf_file_revision.file.folder %>
|
||||
<%= link_to(h(assignment.dmsf_file_revision.file.folder.title),
|
||||
{:controller => 'dmsf', :action => 'show', :id => assignment.dmsf_file_revision.file.project, :folder_id => assignment.dmsf_file_revision.file.folder}) %>
|
||||
<% elsif assignment.dmsf_file_revision.file.project %>
|
||||
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id => assignment.dmsf_file_revision.file.project }) %>
|
||||
<% if assignment.dmsf_file_revision.dmsf_file.dmsf_folder %>
|
||||
<%= link_to(h(assignment.dmsf_file_revision.dmsf_file.dmsf_folder.title),
|
||||
{: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.dmsf_file.project %>
|
||||
<%= link_to(l(:link_documents), {:controller => 'dmsf', :action => 'show', :id => assignment.dmsf_file_revision.dmsf_file.project }) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
|
||||
BIN
assets/images/bullet_arrow_down.png
Normal file
|
After Width: | Height: | Size: 220 B |
|
Before Width: | Height: | Size: 803 B After Width: | Height: | Size: 739 B |
|
Before Width: | Height: | Size: 459 B |
|
Before Width: | Height: | Size: 608 B |
17
assets/javascripts/jquery.dataTables/it.json
Normal 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"
|
||||
}
|
||||
}
|
||||
117
assets/javascripts/redmine_dmsf.js
Normal 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;
|
||||
}
|
||||
}
|
||||
4
assets/javascripts/select2.min.js
vendored
@ -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;}
|
||||
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
@ -43,7 +43,7 @@
|
||||
.plupload_logo {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background: url('../img/plupload.png') no-repeat 0 0;
|
||||
background: url('../images/plupload.png') no-repeat 0 0;
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
left: 8px;
|
||||
@ -119,7 +119,7 @@
|
||||
}
|
||||
|
||||
.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,
|
||||
|
||||
248
assets/stylesheets/redmine_dmsf.css
Normal 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;}
|
||||
2
assets/stylesheets/select2.min.css
vendored
@ -1,9 +1,9 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# 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>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
@ -26,22 +26,22 @@ cs:
|
||||
label_dmsf_file_revision_plural: Revize dokumentů
|
||||
label_dmsf_file_revision_access_plural: Přístupy k dokumentům
|
||||
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
|
||||
notice_file_locked: Soubor byl zamčen
|
||||
warning_file_not_locked: Soubor není zamčen
|
||||
notice_file_unlocked: Soubor byl odemčen
|
||||
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_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_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_title_must_be_entered: Musí být zadán název
|
||||
notice_folder_deleted: Adresář byl smazán
|
||||
error_folder_is_not_empty: Adresář není prázdný
|
||||
notice_folder_deleted: Složka byla smazána
|
||||
error_folder_is_not_empty: Složka není prázdná
|
||||
error_folder_title_is_already_used: Název již existuje
|
||||
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
|
||||
notice_file_deleted: Soubor byl smazán
|
||||
error_at_least_one_revision_must_be_present: Musí existovat alespoň jedna revize
|
||||
@ -81,8 +81,8 @@ cs:
|
||||
title_waiting_for_approval: Čeká na schválení
|
||||
title_approved: Schváleno
|
||||
title_unlock_file: Odemknout a umožnit změny ostatním uživatelům
|
||||
title_lock_file: Zamknout a zabránit změnám ostatních uživatelů
|
||||
title_download_checked: Stáhnout vybrané jako Zip
|
||||
title_lock_file: Zamknout a zabránit změnám ostatních uživatelů
|
||||
title_download_checked: Stáhnout vybrané jako Zip
|
||||
title_send_checked_by_email: Zaslat vybrané emailem
|
||||
link_user_preferences: Vaše nastavení
|
||||
heading_send_documents_by_email: Odeslat dokumenty emailem
|
||||
@ -94,11 +94,7 @@ cs:
|
||||
label_email_body: Obsah
|
||||
label_email_send: Odesláno
|
||||
title_notifications_active: Notifikace jsou aktivní
|
||||
label_file_size: Velikost souboru
|
||||
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í
|
||||
label_upload_upload: Nahrát
|
||||
heading_new_folder: Nová složka
|
||||
label_title: Název
|
||||
label_description: Popis
|
||||
@ -109,7 +105,7 @@ cs:
|
||||
select_option_deactivated: Deaktivováno
|
||||
select_option_activated: Aktivováno
|
||||
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í
|
||||
heading_revisions: Revize
|
||||
title_download: Stáhnout
|
||||
@ -117,9 +113,9 @@ cs:
|
||||
label_created: Vytvořeno
|
||||
label_changed: Změněno
|
||||
info_changed_by_user: "%{changed} uživatelem"
|
||||
label_filename: Jméno souboru
|
||||
label_filename: Jméno souboru
|
||||
label_mime: Typ
|
||||
label_size: Velikost
|
||||
label_size: Velikost
|
||||
heading_new_revision: Nová revize
|
||||
option_version_same: Stejná
|
||||
option_version_minor: Podružná
|
||||
@ -139,7 +135,7 @@ cs:
|
||||
option_stem_none: Stem nic (výchozí)
|
||||
option_stem_some: Stem něco
|
||||
option_stem_all: Stem vše
|
||||
label_stemming_description: Tímto je určeno, jak analyzátor dotazu aplikuje algoritmus Stemmingu. Výchozí hodnota je STEM_NONE. Dostupné hodnoty jsou
|
||||
label_stemming_description: Tímto je určeno, jak analyzátor dotazu aplikuje algoritmus Stemmingu. Výchozí hodnota je STEM_NONE. Dostupné hodnoty jsou
|
||||
note_do_not_stem: Žádný stemming.
|
||||
note_stem_some: "Hledej stemmed formy výrazů kromě těch, které začínají velkým písmenem nebo jsou následovány určitými znaky nebo jsou použity s operátory, které vyžadují informaci o pozici. Stemmed výrazy začínají písmenem 'Z'."
|
||||
note_stem_all: "Hledej stemmed formy všech slov (poznámka: 'Z' prefix není přidán)."
|
||||
@ -154,7 +150,7 @@ cs:
|
||||
permission_user_preferences: Nastavení uživatele
|
||||
permission_view_dmsf_files: Zobrazit dokumenty
|
||||
permission_folder_manipulation: Manipulace se složkami
|
||||
permission_file_manipulation: Manipulace se soubory
|
||||
permission_file_manipulation: Manipulace se soubory
|
||||
permission_force_file_unlock: Vynucené odemknutí souboru
|
||||
permission_manage_workflows: Spravovat schvalovací procesy
|
||||
permission_file_delete: Mazat dokumenty
|
||||
@ -167,12 +163,12 @@ cs:
|
||||
error_user_has_not_right_delete_folder: Uživatel nemá právo mazat složky
|
||||
error_user_has_not_right_delete_file: Uživatel nemá právo mazat soubor
|
||||
notice_entries_deleted: Položky smazány
|
||||
warning_some_entries_were_not_deleted: "Některé položky nebyly smazány: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Některé položky nebyly smazány: %{entries}"
|
||||
title_delete_checked: Smaž vybrané
|
||||
title_items: položek
|
||||
title_filename_for_download: Název Zip archivu ke stažení
|
||||
label_number_of_folders: Složky
|
||||
label_number_of_documents: Dokumenty
|
||||
label_number_of_documents: Dokumenty
|
||||
error_file_storage_directory_does_not_exist: Cílová složka neexistuje a nemůže být vytvořena
|
||||
error_file_can_not_be_created: Nelze vytvořit soubor v cílové složce
|
||||
error_wrong_zip_encoding: Chybné kódování Zipu
|
||||
@ -185,31 +181,31 @@ cs:
|
||||
heading_access_last: Poslední
|
||||
label_dmsf_updated: Změněno
|
||||
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
|
||||
warning_no_project_to_copy_file_to: Neexistuje projekt, do kterého můžete kopírovat
|
||||
comment_copied_from: "Zkopírováno z %{source}"
|
||||
notice_file_copied: Soubor zkopírován
|
||||
notice_file_moved: Soubor přesunut
|
||||
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
|
||||
label_dmsf_folder_plural: Složky
|
||||
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_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
|
||||
title_copy: Kopírovat
|
||||
error_folder_cannot_be_copied: Složka nemůže být zkopírována
|
||||
notice_folder_copied: Složka zkopírována
|
||||
|
||||
error_max_email_filesize_exceeded: "Přesáhli jste maximální velikost souboru, který lze poslat emailem. (%{number} MB)"
|
||||
|
||||
error_max_email_filesize_exceeded: "Přesáhli jste maximální velikost souboru, který lze poslat emailem. (%{number} MB)"
|
||||
note_maximum_email_filesize: Omezí se maximální velikost souboru, který může být poslán emailem. 0 znamená neomezený. Číslo je v MB.
|
||||
label_maximum_email_filesize: Maximální velikost souboru emailu
|
||||
header_minimum_filesize: Chyba souboru.
|
||||
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]"
|
||||
label_webdav: Webdav functionalita
|
||||
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
|
||||
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
|
||||
title_folder_parent_locked: "Nadřazená složka %{name} je zamčená"
|
||||
title_unlock_folder: Odemknout
|
||||
title_lock_folder: Zamknout
|
||||
|
||||
@ -227,7 +222,7 @@ cs:
|
||||
select_option_webdav_readwrite: Čtení/Zápis
|
||||
label_webdav_strategy: Webdav strategie
|
||||
note_webdav_strategy: Umožní administrátorovi rozhodnout, zdali je webdav pouze pro čtení nebo i pro zápis.
|
||||
|
||||
|
||||
error_unable_delete_dmsf_workflow: Nelze smazat schvalovací proces
|
||||
error_empty_note: Musí být vyplněn komentář
|
||||
error_workflow_assign: Chyba při přiřazování
|
||||
@ -268,25 +263,25 @@ cs:
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Schvalovací proces
|
||||
notice_workflow_started: Schvalovací proces byl úspěšně zahájen
|
||||
text_email_subject_approved: "Schvalovací proces %{name} schválen"
|
||||
text_email_subject_rejected: "Schvalovací proces %{name} zamítnut"
|
||||
text_email_subject_delegated: "Schvalovací proces %{name} delegován"
|
||||
text_email_subject_requires_approval: "Schvalovací proces %{name} očekává Vaše schválení"
|
||||
text_email_subject_updated: "Schvalovací proces %{name} aktualizován"
|
||||
text_email_subject_started: "Schvalovací proces %{name} spuštěn"
|
||||
text_email_subject_approved: schválen
|
||||
text_email_subject_rejected: zamítnut
|
||||
text_email_subject_delegated: delegován
|
||||
text_email_subject_requires_approval: očekává Vaše schválení
|
||||
text_email_subject_updated: aktualizová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_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_step: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' právě ukončil jeden ze schvalovacích kroků a od Vás se očekává schválení v dalším schvalovacím kroku."
|
||||
text_email_finished_step_short: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' právě ukončil jeden ze schvalovacích kroků."
|
||||
text_email_started: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl zahájen a od Vás se očekává schválení v aktuálním schvalovacím kroku."
|
||||
text_email_started: "Schvalovací proces '%{name}' přiřazený k dokumentu '%{filename}' byl zahájen a od Vás se očekává schválení v aktuálním schvalovacím kroku."
|
||||
text_email_to_proceed: Pro schválení klikněte na zaškrtávací ikonku vedle dokumentu v
|
||||
text_email_to_see_history: Pro zobrazení historie schvalovacího procesu klikněte na status dokumentu v
|
||||
text_email_to_see_status: Pro zobrazení aktuálního stavu schvalovacího procesu klikněte na status dokumentu v
|
||||
label_my_open_approvals: My open approvals
|
||||
label_my_locked_documents: My locked documents
|
||||
|
||||
title_create_link: Vytvořit symbolický odkaz
|
||||
|
||||
title_create_link: Vytvořit symbolický odkaz
|
||||
label_link_from: Odkaz z
|
||||
label_link_to: Odkaz do
|
||||
label_notifications_on: Zapnout notifikace
|
||||
@ -294,43 +289,46 @@ cs:
|
||||
field_target_file: Zdrojový soubor
|
||||
title_download_entries: Historie stahování
|
||||
label_external: Externí
|
||||
|
||||
|
||||
label_link_name: Název odkazu
|
||||
label_link_external_url: URL
|
||||
label_target_folder: Cílový adresář
|
||||
label_source_folder: Zdrojový adresář
|
||||
label_target_folder: Cílová složka
|
||||
label_source_folder: Zdrojová složka
|
||||
label_target_project: Cílový projekt
|
||||
label_source_project: Zdrojový projekt
|
||||
|
||||
text_email_doc_updated_subject: "Dokumenty projektu %{project} aktualizovány"
|
||||
label_source_project: Zdrojový projekt
|
||||
|
||||
text_email_doc_updated_subject: Dokumenty aktualizovány
|
||||
text_email_doc_updated: právě aktualizoval dokumenty projektu
|
||||
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
|
||||
label_links_only: pouze odkazy
|
||||
|
||||
label_links_only: pouze odkazy
|
||||
|
||||
label_display_notified_recipients: Zobrazit příjemce notifikací
|
||||
note_display_notified_recipients: Uživatel bude informován o příjemcích právě odeslané emailové notifikace.
|
||||
warning_email_notifications: "Notifikační email poslán na uživatele %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Koš
|
||||
title_restore: Obnovit
|
||||
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
|
||||
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_parent_locked: Nelze zamknout - nadřazený objekt je zamčený
|
||||
error_resource_locked: Nelze zamknout - zdrojový objekt je zamčený
|
||||
error_lock_exclusively: Nelze zamknout již zamčený objekt
|
||||
error_unlock_parent_locked: Nelze odemknout - nadřazený objekt je zamčený
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Zamčené dokumenty
|
||||
open_approvals: Procesy ke schválení
|
||||
|
||||
error_lock_exclusively: Nelze zamknout již zamčený objekt
|
||||
error_unlock_parent_locked: Nelze odemknout - nadřazený objekt je zamčený
|
||||
|
||||
field_dmsf_tree_view: Zobrazit složky jako stromovou strukturu
|
||||
label_dmsf_version: Verze
|
||||
|
||||
locked_documents: Zamčené dokumenty
|
||||
open_approvals: Procesy ke schválení
|
||||
|
||||
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"
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011 Terrence Miller
|
||||
# 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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -26,13 +26,13 @@ de:
|
||||
label_dmsf_file_revision_plural: Dokumenteversion
|
||||
label_dmsf_file_revision_access_plural: Dokumentezugriffe
|
||||
warning_no_entries_selected: Keine Einträge ausgewählt
|
||||
error_email_to_must_be_entered: Es muss ein Email-Empfänger angegeben werden.
|
||||
error_email_to_must_be_entered: Es muss ein Email-Empfänger angegeben werden.
|
||||
warning_file_already_locked: Datei schon gesperrt
|
||||
notice_file_locked: Datei gesperrt
|
||||
warning_file_not_locked: Datei nicht gesperrt
|
||||
notice_file_unlocked: Datei freigegeben
|
||||
error_only_user_that_locked_file_can_unlock_it: Nur der Benutzer, der die Datei gesperrt hat, kann sie auch wieder freigeben
|
||||
error_max_files_exceeded: "Grenze für %{number} gleichzeitig heruntergeladene Dateien überschritten"
|
||||
error_only_user_that_locked_file_can_unlock_it: Nur der Benutzer, der die Datei gesperrt hat, kann sie auch wieder freigeben
|
||||
error_max_files_exceeded: "Grenze für %{number} gleichzeitig heruntergeladene Dateien überschritten"
|
||||
error_entry_project_does_not_match_current_project: Eingangsprojekt entspricht nicht aktuellem Projekt
|
||||
notice_folder_created: Ordner erstellt
|
||||
error_folder_creation_failed: Ordnererstellung fehlgeschlagen
|
||||
@ -40,7 +40,7 @@ de:
|
||||
notice_folder_deleted: Ordner gelöscht
|
||||
error_folder_is_not_empty: Ordner ist nicht leer
|
||||
error_folder_title_is_already_used: Titel wird schon benutzt. Denk dir was Neues aus.
|
||||
notice_folder_details_were_saved: Ordnerdetails wurden gespeichert
|
||||
notice_folder_details_were_saved: Ordnerdetails wurden gespeichert
|
||||
error_folder_is_locked: Ordner ist gesperrt
|
||||
error_file_is_locked: Datei ist gesperrt
|
||||
notice_file_deleted: Datei gelöscht
|
||||
@ -81,8 +81,8 @@ de:
|
||||
title_waiting_for_approval: Warte auf Zustimmung
|
||||
title_approved: Zugestimmt
|
||||
title_unlock_file: Hebe Sperre auf um Änderungen anderer Nutzer zu ermöglichen
|
||||
title_lock_file: Sperre um Änderungen anderer Nutzer zu verhindern
|
||||
title_download_checked: Download der ausgewählten Dateien in einem ZIP-Archiv
|
||||
title_lock_file: Sperre um Änderungen anderer Nutzer zu verhindern
|
||||
title_download_checked: Download der ausgewählten Dateien in einem ZIP-Archiv
|
||||
title_send_checked_by_email: Sende gewählte Dateien per Email
|
||||
link_user_preferences: Deine DMS Projekt Einstellungen
|
||||
heading_send_documents_by_email: Sende Dateien per Email
|
||||
@ -94,11 +94,7 @@ de:
|
||||
label_email_body: Text
|
||||
label_email_send: Senden
|
||||
title_notifications_active: Benachrichtigungen sind aktiv
|
||||
label_file_size: Dateigröße
|
||||
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
|
||||
label_upload: Upload
|
||||
heading_new_folder: Neuer Ordner
|
||||
label_title: Titel
|
||||
label_description: Beschreibung
|
||||
@ -109,7 +105,7 @@ de:
|
||||
select_option_deactivated: Aus
|
||||
select_option_activated: Ein
|
||||
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
|
||||
heading_revisions: Versionen
|
||||
title_download: Download
|
||||
@ -117,9 +113,9 @@ de:
|
||||
label_created: Erstellt
|
||||
label_changed: Geändert
|
||||
info_changed_by_user: "%{changed} von"
|
||||
label_filename: Dateiname
|
||||
label_filename: Dateiname
|
||||
label_mime: Mime
|
||||
label_size: Größe
|
||||
label_size: Größe
|
||||
heading_new_revision: Neue Version
|
||||
option_version_same: gleiche Version
|
||||
option_version_minor: Unterversion
|
||||
@ -154,8 +150,8 @@ de:
|
||||
permission_user_preferences: Benutzereinstellungen
|
||||
permission_view_dmsf_files: Betrachte Dateien
|
||||
permission_folder_manipulation: Ordner bearbeiten
|
||||
permission_file_manipulation: Dateien bearbeiten
|
||||
permission_force_file_unlock: Erzwinge Aufhebung der Dateisperre
|
||||
permission_file_manipulation: Dateien bearbeiten
|
||||
permission_force_file_unlock: Erzwinge Aufhebung der Dateisperre
|
||||
permission_manage_workflows: Workflows verwalten
|
||||
permission_file_delete: Datei löschen
|
||||
label_file: Datei
|
||||
@ -167,12 +163,12 @@ de:
|
||||
error_user_has_not_right_delete_folder: Der Nutzer hat kein Recht die Ordner zu löschen.
|
||||
error_user_has_not_right_delete_file: Der Nutzer hat kein Recht die Datei zu löschen.
|
||||
notice_entries_deleted: Einträge löschen
|
||||
warning_some_entries_were_not_deleted: "Enige Einträge wurden nicht gelöscht: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Enige Einträge wurden nicht gelöscht: %{entries}"
|
||||
title_delete_checked: Löschen ausgewählt
|
||||
title_items: items
|
||||
title_filename_for_download: Dateiname beim Herunterladen oder in ZIP-Archiv verwenden
|
||||
label_number_of_folders: Ordner
|
||||
label_number_of_documents: Dokumente
|
||||
label_number_of_documents: Dokumente
|
||||
error_file_storage_directory_does_not_exist: Der Dateiablageordner existiert nicht auf dem Server und kann nicht erstellt werden.
|
||||
error_file_can_not_be_created: Datei kann nicht in dem gewählten Ordner erstellt werden.
|
||||
error_wrong_zip_encoding: Falsche ZIP-Kodierung
|
||||
@ -203,7 +199,7 @@ de:
|
||||
title_copy: Kopieren
|
||||
error_folder_cannot_be_copied: Der Ordner kann nicht kopiert werden.
|
||||
notice_folder_copied: Ordner kopiert
|
||||
|
||||
|
||||
error_max_email_filesize_exceeded: "Maximale Dateigröße der Anlage wurde überschritten. (%{number} MB)"
|
||||
note_maximum_email_filesize: Maximale Dateigröße der Anlage. 0 bedeutet keinen Limit. Angabe in MB.
|
||||
label_maximum_email_filesize: Maximale Dateigröße der Anlage
|
||||
@ -213,21 +209,20 @@ de:
|
||||
note_webdav: "Nach der Aktivierung von WebDav kann der Dienst über die URL %{protocol}://%{domain}/dmsf/webdav/[project identifier] erreicht werden."
|
||||
label_webdav: Webdav Funktionalität
|
||||
label_dmsf_plural: "Kopieren von Dateien und Ordnern (%{files} Dateien in %{folders} Ordnern)"
|
||||
|
||||
|
||||
warning_folder_already_locked: Dieser Ordner ist bereits gesperrt
|
||||
notice_folder_locked: Der Ordner wurde erfolgreich gesperrt
|
||||
warning_folder_not_locked: Der Ordner konnte nicht gesperrt werden
|
||||
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
|
||||
title_folder_parent_locked: "Übergeordnetes Verzeichnis %{name} ist gesperrt"
|
||||
title_unlock_folder: Ordner zur Bearbeitung durch andere Benutzer entsperren
|
||||
title_lock_folder: Ordner zum Schutz vor Bearbeitung durch andere Benutzer sperren
|
||||
|
||||
|
||||
select_option_webdav_readonly: nur Lesen
|
||||
select_option_webdav_readwrite: Lesen/Schreiben
|
||||
label_webdav_strategy: Webdav Strategie
|
||||
note_webdav_strategy: Erlaubt dem Administrator den Wechsel der WebDav Nutzung zwischen nur lesend und auch schreibenden Zugriffen.
|
||||
|
||||
note_webdav_strategy: Erlaubt dem Administrator den Wechsel der WebDav Nutzung zwischen nur lesend und auch schreibenden Zugriffen.
|
||||
|
||||
error_unable_delete_dmsf_workflow: Konnte den Workflow nicht löschen
|
||||
error_empty_note: Die Notiz darf nicht leer sein.
|
||||
error_workflow_assign: Es trat ein Fehler beim Zuweisen des Workflows auf
|
||||
@ -251,12 +246,12 @@ de:
|
||||
label_dmsf_workflow_add_approver: "Füge einen neuen Genehmiger mit einer logischen Funktion hinzu:"
|
||||
label_or: oder
|
||||
label_action: Aktion
|
||||
label_note: Notiz
|
||||
label_note: Notiz
|
||||
title_none: Niemand
|
||||
title_rejection: Ablehnung
|
||||
title_delegation: Deligierung
|
||||
title_assignment: Zuweisung
|
||||
title_start: Start
|
||||
title_start: Start
|
||||
title_dmsf_workflow_log: Genehmigungs-Workflow Verlauf
|
||||
title_assigned: Zugewiesen
|
||||
title_approval: Genehmigt
|
||||
@ -266,27 +261,27 @@ de:
|
||||
dmsf_new_step: Neuer Schritt
|
||||
message_dmsf_wokflow_note: Deine Notiz...
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Workflow
|
||||
link_workflow: Workflow
|
||||
notice_workflow_started: Genehmigungs-Workflow gestartet
|
||||
text_email_subject_approved: "Genehmigungs-Workflow %{name} genehmigt"
|
||||
text_email_subject_rejected: "Genehmigungs-Workflow %{name} abgelehnt"
|
||||
text_email_subject_delegated: "Genehmigungs-Workflow %{name} deligiert"
|
||||
text_email_subject_requires_approval: "Genehmigungs-Workflow %{name} benötigt deine Genehmigung"
|
||||
text_email_subject_updated: "Genehmigungs-Workflow %{name} bearbeitet"
|
||||
text_email_subject_started: "Genehmigungs-Workflow %{name} gestartet"
|
||||
text_email_subject_approved: genehmigt
|
||||
text_email_subject_rejected: abgelehnt
|
||||
text_email_subject_delegated: deligiert
|
||||
text_email_subject_requires_approval: benötigt deine Genehmigung
|
||||
text_email_subject_updated: bearbeitet
|
||||
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_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_step: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' hat grade einen Zustimmungsschritt abgeschlossen und im nächsten Genehmigungsschritt wird deine Zustimmung benötigt."
|
||||
text_email_finished_step_short: "Der Genehmigungs-Workflow '%{name}' zugewiesen an die Datei '%{filename}' hat grade einen Genehmigungsschritt abgeschlossen."
|
||||
text_email_started: "Der Genehmigungs-Workflow '%{name}' zugewiesen an '%{filename}' wurde gestartet und im aktuellen Genehmigungsschritt wird deine Zustimmung benötigt."
|
||||
text_email_started: "Der Genehmigungs-Workflow '%{name}' zugewiesen an '%{filename}' wurde gestartet und im aktuellen Genehmigungsschritt wird deine Zustimmung benötigt."
|
||||
text_email_to_proceed: Um fortzufahren klicke auf das Häckchen neben der Datei in
|
||||
text_email_to_see_history: Um den Verlauf des Genehmigungs-Workflows zu sehen klicke auf den Workflowstatus zur Datei in
|
||||
text_email_to_see_status: Um den aktuellen Status des Genehmigungs-Workflows zu sehen klicke auf den Workflowstatus zur Datei in
|
||||
label_my_open_approvals: Meine offenen Genehmigungen
|
||||
label_my_locked_documents: Meine geschlossenen Genehmigungen
|
||||
|
||||
title_create_link: Verknüpfung anlegen
|
||||
|
||||
title_create_link: Verknüpfung anlegen
|
||||
label_link_from: Verlinke von
|
||||
label_link_to: Verlinke zu
|
||||
label_notifications_on: Benachrichtigungen ein
|
||||
@ -294,25 +289,25 @@ de:
|
||||
field_target_file: Quelldatei
|
||||
title_download_entries: Download entries
|
||||
label_external: Außen
|
||||
|
||||
|
||||
label_link_name: Name der Verknüpfung
|
||||
label_link_external_url: URL
|
||||
label_target_folder: Zielordner
|
||||
label_source_folder: Quellordner
|
||||
label_target_project: Zielprojekt
|
||||
label_source_project: Quellprojekt
|
||||
|
||||
text_email_doc_updated_subject: "Dokumente im Projekt %{project} wurden aktualisiert"
|
||||
label_source_project: Quellprojekt
|
||||
|
||||
text_email_doc_updated_subject: Dokumente wurden aktualisiert
|
||||
text_email_doc_updated: hat folgende Dokumente bearbeitet
|
||||
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
|
||||
label_links_only: nur Verknüpfungen
|
||||
|
||||
label_links_only: nur Verknüpfungen
|
||||
|
||||
label_display_notified_recipients: Zeige benachrichtigte Empfänger
|
||||
note_display_notified_recipients: Der User wird über alle Empfänger der Emailbenachrichtigung informiert.
|
||||
warning_email_notifications: "Emailbenachrichtigung wurde gesendet an %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Trash bin
|
||||
title_restore: Restore
|
||||
notice_dmsf_file_restored: The document has been successfully restored
|
||||
@ -320,17 +315,20 @@ de:
|
||||
notice_dmsf_link_restored: The link has been successfully restored
|
||||
title_restore_checked: Restore checked
|
||||
error_parent_folder: "The parent folder doesn't exist"
|
||||
|
||||
|
||||
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_resource_locked: Unable to complete lock - resource is locked
|
||||
error_lock_exclusively: unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Gesperrte Dateien
|
||||
open_approvals: Offene Genehmigungs-Workflows
|
||||
|
||||
error_lock_exclusively: Unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Version
|
||||
|
||||
locked_documents: Gesperrte Dateien
|
||||
open_approvals: Offene Genehmigungs-Workflows
|
||||
|
||||
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"
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# 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>
|
||||
# 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
|
||||
@ -26,13 +26,13 @@ en:
|
||||
label_dmsf_file_revision_plural: Document revisions
|
||||
label_dmsf_file_revision_access_plural: Document accesses
|
||||
warning_no_entries_selected: No entries selected
|
||||
error_email_to_must_be_entered: Email To must be entered
|
||||
error_email_to_must_be_entered: Email To must be entered
|
||||
warning_file_already_locked: File already locked
|
||||
notice_file_locked: File locked
|
||||
warning_file_not_locked: File not locked
|
||||
notice_file_unlocked: File unlocked
|
||||
error_only_user_that_locked_file_can_unlock_it: Only user that locked the file can unlock it
|
||||
error_max_files_exceeded: "Limit for %{number} simultaneously downloaded files exceeded"
|
||||
error_only_user_that_locked_file_can_unlock_it: Only user that locked the file can unlock it
|
||||
error_max_files_exceeded: "Limit for %{number} simultaneously downloaded files exceeded"
|
||||
error_entry_project_does_not_match_current_project: "Entry project doesn't match current project"
|
||||
notice_folder_created: Folder created
|
||||
error_folder_creation_failed: Folder creation failed
|
||||
@ -40,7 +40,7 @@ en:
|
||||
notice_folder_deleted: Folder deleted
|
||||
error_folder_is_not_empty: Folder is not empty
|
||||
error_folder_title_is_already_used: Title is already used
|
||||
notice_folder_details_were_saved: Folder details were saved
|
||||
notice_folder_details_were_saved: Folder details were saved
|
||||
error_folder_is_locked: Folder is locked
|
||||
error_file_is_locked: File is locked
|
||||
notice_file_deleted: File deleted
|
||||
@ -81,8 +81,8 @@ en:
|
||||
title_waiting_for_approval: Waiting for Approval
|
||||
title_approved: Approved
|
||||
title_unlock_file: Unlock to allow changes for other members
|
||||
title_lock_file: Lock to prevent changes for other members
|
||||
title_download_checked: Download checked in Zip archive
|
||||
title_lock_file: Lock to prevent changes for other members
|
||||
title_download_checked: Download checked in Zip archive
|
||||
title_send_checked_by_email: Send checked by email
|
||||
link_user_preferences: Your DMSF project preferences
|
||||
heading_send_documents_by_email: Send documents by email
|
||||
@ -94,11 +94,7 @@ en:
|
||||
label_email_body: Body
|
||||
label_email_send: Send
|
||||
title_notifications_active: Notifications active
|
||||
label_file_size: File size
|
||||
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
|
||||
label_upload: Upload
|
||||
heading_new_folder: New Folder
|
||||
label_title: Title
|
||||
label_description: Description
|
||||
@ -109,7 +105,7 @@ en:
|
||||
select_option_deactivated: Deactivated
|
||||
select_option_activated: Activated
|
||||
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
|
||||
heading_revisions: Revisions
|
||||
title_download: Download
|
||||
@ -117,9 +113,9 @@ en:
|
||||
label_created: Created
|
||||
label_changed: Changed
|
||||
info_changed_by_user: "%{changed} by"
|
||||
label_filename: Filename
|
||||
label_filename: Filename
|
||||
label_mime: Mime
|
||||
label_size: Size
|
||||
label_size: Size
|
||||
heading_new_revision: New Revision
|
||||
option_version_same: Same
|
||||
option_version_minor: Minor
|
||||
@ -154,7 +150,7 @@ en:
|
||||
permission_user_preferences: User preferences
|
||||
permission_view_dmsf_files: View documents
|
||||
permission_folder_manipulation: Folder manipulation
|
||||
permission_file_manipulation: File manipulation
|
||||
permission_file_manipulation: File manipulation
|
||||
permission_force_file_unlock: Force file unlock
|
||||
permission_manage_workflows: Manage workflows
|
||||
permission_file_delete: Delete documents
|
||||
@ -167,12 +163,12 @@ en:
|
||||
error_user_has_not_right_delete_folder: "User hasn't right to delete forders"
|
||||
error_user_has_not_right_delete_file: "User hasn't right to delete file"
|
||||
notice_entries_deleted: Entries deleted
|
||||
warning_some_entries_were_not_deleted: "Some entries weren't deleted: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Some entries weren't deleted: %{entries}"
|
||||
title_delete_checked: Delete checked
|
||||
title_items: items
|
||||
title_filename_for_download: Filename used for download or in Zip archive
|
||||
label_number_of_folders: Folders
|
||||
label_number_of_documents: Documents
|
||||
label_number_of_documents: Documents
|
||||
error_file_storage_directory_does_not_exist: "File storage directory doesn't exist and can't be created"
|
||||
error_file_can_not_be_created: "File can't be created in storage directory"
|
||||
error_wrong_zip_encoding: Wrong Zip encoding
|
||||
@ -203,7 +199,7 @@ en:
|
||||
title_copy: Copy
|
||||
error_folder_cannot_be_copied: "Folder can't be copied"
|
||||
notice_folder_copied: Folder copied
|
||||
|
||||
|
||||
error_max_email_filesize_exceeded: "You've exceeded the maximum filesize for sending via email. (%{number} MB)"
|
||||
note_maximum_email_filesize: Limits maximum filesize that can be sent via email. 0 means unlimited. Number is in MB.
|
||||
label_maximum_email_filesize: Maximum email attachment size
|
||||
@ -219,21 +215,20 @@ en:
|
||||
warning_folder_not_locked: Unfortunately, the folder could not be locked
|
||||
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
|
||||
title_folder_parent_locked: "Parent folder %{name} is locked"
|
||||
title_unlock_folder: Unlock to allow changes for other members
|
||||
title_lock_folder: Lock to prevent changes for other members
|
||||
|
||||
select_option_webdav_readonly: Read-only
|
||||
select_option_webdav_readwrite: Read/Write
|
||||
label_webdav_strategy: Webdav strategy
|
||||
note_webdav_strategy: Enables the administrator to decide if webdav is a read-only or read-write platform for end users.
|
||||
|
||||
note_webdav_strategy: Enables the administrator to decide if webdav is a read-only or read-write platform for end users.
|
||||
|
||||
error_unable_delete_dmsf_workflow: Unable to delete the workflow
|
||||
error_empty_note: "The note can't be empty"
|
||||
error_workflow_assign: An error occured while assigning
|
||||
error_cannot_start_workflow: "Workflow can't be started"
|
||||
error_cannot_renumber_steps: "Steps can't be renumbered"
|
||||
label_dmsf_workflow_new: New approval workflow
|
||||
label_dmsf_workflow_new: New approval workflow
|
||||
field_label_dmsf_workflow: Approval Workflow
|
||||
field_label_dmsf_workflow_name: Approval workflow name
|
||||
label_dmsf_workflow_plural: Approval workflows
|
||||
@ -251,42 +246,42 @@ en:
|
||||
label_dmsf_workflow_add_approver: "Add a new approver with a logical function:"
|
||||
label_or: or
|
||||
label_action: Action
|
||||
label_note: Note
|
||||
label_note: Note
|
||||
title_none: None
|
||||
title_rejection: Rejection
|
||||
title_delegation: Delegation
|
||||
title_assignment: Assignment
|
||||
title_start: Start
|
||||
title_start: Start
|
||||
title_dmsf_workflow_log: Approval Workflow Log
|
||||
title_assigned: Assigned
|
||||
title_approval: Approval
|
||||
title_rejected: Rejected
|
||||
dmsf_and: AND
|
||||
dmsf_or: OR
|
||||
dmsf_new_step: New step
|
||||
dmsf_new_step: New step
|
||||
message_dmsf_wokflow_note: Your note...
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Workflow
|
||||
notice_workflow_started: Approval workflow successfully started
|
||||
text_email_subject_approved: "Approval workflow %{name} approved"
|
||||
text_email_subject_rejected: "Approval workflow %{name} rejected"
|
||||
text_email_subject_delegated: "Approval workflow %{name} delegated"
|
||||
text_email_subject_requires_approval: "Approval workflow %{name} requires your approval"
|
||||
text_email_subject_updated: "Approval workflow %{name} updated"
|
||||
text_email_subject_started: "Approval workflow %{name} started"
|
||||
notice_workflow_started: Approval workflow successfully started
|
||||
text_email_subject_approved: approved
|
||||
text_email_subject_rejected: rejected
|
||||
text_email_subject_delegated: delegated
|
||||
text_email_subject_requires_approval: requires your approval
|
||||
text_email_subject_updated: updated
|
||||
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_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_step: "The approval workflow '%{name}' assigned to '%{filename}' document has just finished one of the approval steps and you are expected to do an approval in the next approval step."
|
||||
text_email_finished_step_short: "The approval workflow '%{name}' assigned to '%{filename}' document has just finished one of the approval steps."
|
||||
text_email_started: "The approval workflow '%{name}' assigned to '%{filename}' document has just been started and you are expected to do an approval in the current approval step."
|
||||
text_email_started: "The approval workflow '%{name}' assigned to '%{filename}' document has just been started and you are expected to do an approval in the current approval step."
|
||||
text_email_to_proceed: To proceed click on the check box icon next to the document in
|
||||
text_email_to_see_history: To see the approval history click on the workflow status of the document in
|
||||
text_email_to_see_status: To see the current status of the approval workflow click on the workflow status the document in
|
||||
label_my_open_approvals: My open approvals
|
||||
label_my_locked_documents: My locked documents
|
||||
|
||||
title_create_link: Create a symbolic link
|
||||
|
||||
title_create_link: Create a symbolic link
|
||||
label_link_from: Link from
|
||||
label_link_to: Link to
|
||||
label_notifications_on: Notifications on
|
||||
@ -301,18 +296,18 @@ en:
|
||||
label_source_folder: Source folder
|
||||
label_target_project: Target 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_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
|
||||
label_links_only: links only
|
||||
|
||||
label_links_only: links only
|
||||
|
||||
label_display_notified_recipients: Display notified recipients
|
||||
note_display_notified_recipients: The user will be informed about all recipients of just sent the email notification.
|
||||
warning_email_notifications: "Email notifications sent to %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Trash bin
|
||||
title_restore: Restore
|
||||
notice_dmsf_file_restored: The document has been successfully restored
|
||||
@ -320,17 +315,20 @@ en:
|
||||
notice_dmsf_link_restored: The link has been successfully restored
|
||||
title_restore_checked: Restore checked
|
||||
error_parent_folder: "The parent folder doesn't exist"
|
||||
|
||||
|
||||
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_resource_locked: Unable to complete lock - resource is locked
|
||||
error_lock_exclusively: unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Locked documents
|
||||
openap_provals: Open approvals
|
||||
|
||||
error_lock_exclusively: Unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Version
|
||||
|
||||
locked_documents: Locked documents
|
||||
open_approvals: Open approvals
|
||||
|
||||
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"
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@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
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -26,13 +26,13 @@ es:
|
||||
label_dmsf_file_revision_plural: Document revisions
|
||||
label_dmsf_file_revision_access_plural: Document accesses
|
||||
warning_no_entries_selected: No ha seleccionado ningún ítem
|
||||
error_email_to_must_be_entered: Ingrese un email
|
||||
error_email_to_must_be_entered: Ingrese un email
|
||||
warning_file_already_locked: El archivo ya está bloqueado
|
||||
notice_file_locked: Archivo bloqueado
|
||||
warning_file_not_locked: Archivo no bloqueado
|
||||
notice_file_unlocked: Archivo desbloqueado
|
||||
error_only_user_that_locked_file_can_unlock_it: Solo los usuarios que bloquearon previamente al archivo lo pueden desbloquear
|
||||
error_max_files_exceeded: "Se excedio el numero permitido de archivos bajados de manera simultánea:"
|
||||
error_only_user_that_locked_file_can_unlock_it: Solo los usuarios que bloquearon previamente al archivo lo pueden desbloquear
|
||||
error_max_files_exceeded: "Se excedio el numero permitido de archivos bajados de manera simultánea:"
|
||||
error_entry_project_does_not_match_current_project: Las entradas del proyecto no concuerdan con el proyecto seleccionado
|
||||
notice_folder_created: Carpeta creada satisfactoriamente
|
||||
error_folder_creation_failed: La creacion de la carpeta ha fallado
|
||||
@ -40,7 +40,7 @@ es:
|
||||
notice_folder_deleted: Carpeta borrada
|
||||
error_folder_is_not_empty: La carpeta no está vacía
|
||||
error_folder_title_is_already_used: El título ingresado ya está siendo usado por otro documento
|
||||
notice_folder_details_were_saved: Los detalles de la carpeta fueron grabados correctamente
|
||||
notice_folder_details_were_saved: Los detalles de la carpeta fueron grabados correctamente
|
||||
error_folder_is_locked: Carpeta bloqueado
|
||||
error_file_is_locked: Archivo bloqueado
|
||||
notice_file_deleted: Archivo borrado
|
||||
@ -58,7 +58,7 @@ es:
|
||||
warning_file_notifications_already_activated: Las notificaciones del archivo seleccionado ya estaban activadas previamente
|
||||
notice_file_notifications_activated: Notificación de archivo activado
|
||||
warning_file_notifications_already_deactivated: Las notificaciones del archivo seleccionado ya estaban desactivadas previamente
|
||||
notice_file_notifications_deactivated: Notificación de archivo desactivada
|
||||
notice_file_notifications_deactivated: Notificación de archivo desactivada
|
||||
link_details: "%{title} detalles"
|
||||
link_edit: "Editar %{title}"
|
||||
submit_create: Crear
|
||||
@ -81,8 +81,8 @@ es:
|
||||
title_waiting_for_approval: Esperando Aprobación
|
||||
title_approved: Aprobado
|
||||
title_unlock_file: Desbloquear para que otros miembros puedan editarlo
|
||||
title_lock_file: Bloquear para que otros miembros no puedan editarlo
|
||||
title_download_checked: Descargar archivos seleccionados en Zip
|
||||
title_lock_file: Bloquear para que otros miembros no puedan editarlo
|
||||
title_download_checked: Descargar archivos seleccionados en Zip
|
||||
title_send_checked_by_email: Enviar los seleccionados por email
|
||||
link_user_preferences: Preferencias de su proyecto DMSF
|
||||
heading_send_documents_by_email: Enviar documentos por email
|
||||
@ -94,11 +94,7 @@ es:
|
||||
label_email_body: Cuerpo de Mensaje
|
||||
label_email_send: Enviar
|
||||
title_notifications_active: Activar Notificaciones
|
||||
label_file_size: Tamaño de Archivo
|
||||
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
|
||||
label_upload: Subir
|
||||
heading_new_folder: Nuevo directorio
|
||||
label_title: Título
|
||||
label_description: Descripción
|
||||
@ -109,7 +105,7 @@ es:
|
||||
select_option_deactivated: Desactivado
|
||||
select_option_activated: Activado
|
||||
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
|
||||
heading_revisions: Revisiones
|
||||
title_download: Descargar
|
||||
@ -117,9 +113,9 @@ es:
|
||||
label_created: Creado
|
||||
label_changed: Modificado
|
||||
info_changed_by_user: "%{changed} por"
|
||||
label_filename: Nombre
|
||||
label_filename: Nombre
|
||||
label_mime: Mime
|
||||
label_size: Tamaño
|
||||
label_size: Tamaño
|
||||
heading_new_revision: Nueva Revisión
|
||||
option_version_same: Misma
|
||||
option_version_minor: Menor
|
||||
@ -154,7 +150,7 @@ es:
|
||||
permission_user_preferences: Preferencias de usuario
|
||||
permission_view_dmsf_files: Ver documentos
|
||||
permission_folder_manipulation: Manipulación de directorio
|
||||
permission_file_manipulation: Manipulación de Archivos
|
||||
permission_file_manipulation: Manipulación de Archivos
|
||||
permission_force_file_unlock: Forzar desbloqueo de archivo
|
||||
permission_manage_workflows: Gesti{on de flujo de trabajo
|
||||
permission_file_delete: Eliminar documentos
|
||||
@ -167,7 +163,7 @@ es:
|
||||
error_user_has_not_right_delete_folder: "No tiene permisos para eliminar el directorio"
|
||||
error_user_has_not_right_delete_file: "No tiene permisos para eliminar el archivo"
|
||||
notice_entries_deleted: Entradas eliminadas
|
||||
warning_some_entries_were_not_deleted: "Algunas entradas no fueron eliminadas: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Algunas entradas no fueron eliminadas: %{entries}"
|
||||
title_delete_checked: Eliminación chequeada
|
||||
title_items: items
|
||||
title_filename_for_download: Nombre de archivo utilizado para descargar o crear zip
|
||||
@ -219,15 +215,14 @@ es:
|
||||
warning_folder_not_locked: Desafortunadamente, el directorio no se pudo bloquear
|
||||
notice_folder_unlocked: El directorio se desbloqueó exitosamente
|
||||
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_lock_folder: Bloquear para evitar que sea editado por otros miembros
|
||||
|
||||
select_option_webdav_readonly: Solo Lectura
|
||||
select_option_webdav_readwrite: Lectura/Escritura
|
||||
label_webdav_strategy: Estrategia Webdav
|
||||
note_webdav_strategy: Habilitar el administrador para configurar si la plataforma webdav es solo lectura o lectura-escritura para los usuarios finales.
|
||||
|
||||
note_webdav_strategy: Habilitar el administrador para configurar si la plataforma webdav es solo lectura o lectura-escritura para los usuarios finales.
|
||||
|
||||
error_unable_delete_dmsf_workflow: Incapaz de eliminar el flujo de trabajo
|
||||
error_empty_note: "La nota no puede estar vacía"
|
||||
error_workflow_assign: "Ocurió un errpr mientras se asignaba"
|
||||
@ -251,7 +246,7 @@ es:
|
||||
label_dmsf_workflow_add_approver: "Añadir un nuevo aprobador con una función lógica:"
|
||||
label_or: o
|
||||
label_action: "Acción"
|
||||
label_note: Nota
|
||||
label_note: Nota
|
||||
title_none: Ninguno
|
||||
title_rejection: Rechazo
|
||||
title_delegation: "Delegación"
|
||||
@ -266,26 +261,26 @@ es:
|
||||
dmsf_new_step: Nuevo Paso
|
||||
message_dmsf_wokflow_note: Tu nota...
|
||||
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"
|
||||
text_email_subject_approved: "Flujo de trabajo de aprobación %{name} aprobado"
|
||||
text_email_subject_rejected: "Flujo de trabajo de aprobación %{name} rechazado"
|
||||
text_email_subject_delegated: "Flujo de trabajo de aprobación %{name} delegado"
|
||||
text_email_subject_requires_approval: "Flujo de trabajo de aprobación %{name} requiere su aprobación"
|
||||
text_email_subject_updated: "Flujo de trabajo de aprobación %{name} actualizado"
|
||||
text_email_subject_started: "Flujo de trabajo de aprobación %{name} comenzado"
|
||||
text_email_subject_approved: aprobado
|
||||
text_email_subject_rejected: rechazado
|
||||
text_email_subject_delegated: delegado
|
||||
text_email_subject_requires_approval: requiere su aprobación
|
||||
text_email_subject_updated: actualizado
|
||||
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_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_step: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de terminar uno de los pasos de aprobación y se espera que haga una aprobación en el siguiente paso."
|
||||
text_email_finished_step_short: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de finalizar uno de los pasos de aprobación."
|
||||
text_email_started: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de iniciarse y se espera que haga una aprobación en la etapa de aprobación actual."
|
||||
text_email_started: "El flujo de trabajo de aprobación '%{name}' asignado al documento '%{filename}' acaba de iniciarse y se espera que haga una aprobación en la etapa de aprobación actual."
|
||||
text_email_to_proceed: "Para continuar, haga clic en el icono de la casilla de verificación al lado del documento"
|
||||
text_email_to_see_history: "Para ver el historial de aprobación haga clic en el estado del flujo de trabajo del documento"
|
||||
text_email_to_see_status: "Para ver el estado actual del flujo de trabajo de aprobación, haga clic en el estado del flujo de trabajo del documento"
|
||||
label_my_open_approvals: Mis aprobaciones abiertas
|
||||
label_my_locked_documents: Mis documentos bloqueados
|
||||
|
||||
|
||||
title_create_link: "Crear un enlace simbólico"
|
||||
label_link_from: Enlace desde
|
||||
label_link_to: Enlace hacia
|
||||
@ -294,25 +289,25 @@ es:
|
||||
field_target_file: Archivo fuente
|
||||
title_download_entries: Entradas de descarga
|
||||
label_external: External
|
||||
|
||||
|
||||
label_link_name: Nombre de enlace
|
||||
label_link_external_url: URL
|
||||
label_target_folder: Directorio destino
|
||||
label_source_folder: Directorio fuente
|
||||
label_target_project: Proyecto destino
|
||||
label_source_project: Proyecto fuente
|
||||
|
||||
text_email_doc_updated_subject: "Documentos de %{project} actualizados"
|
||||
label_source_project: Proyecto fuente
|
||||
|
||||
text_email_doc_updated_subject: Documentos actualizados
|
||||
text_email_doc_updated: acaba de actualizar los ducumentos de
|
||||
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
|
||||
label_links_only: Solo enlaces
|
||||
|
||||
|
||||
label_display_notified_recipients: Mostrar destinatarios notificados
|
||||
note_display_notified_recipients: "El usuario será informado de todos los destinatarios a los que acaba de enviar la notificación por correo electrónico"
|
||||
warning_email_notifications: "Notificaciones de email enviadas a %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Tacho
|
||||
title_restore: Recuperar
|
||||
notice_dmsf_file_restored: El documento ha sido restaurado satisfactoriamente
|
||||
@ -320,17 +315,20 @@ es:
|
||||
notice_dmsf_link_restored: El enlace ha sido restaurado satisfactoriamente
|
||||
title_restore_checked: Restaurar Seleccionados
|
||||
error_parent_folder: "El directorio padre no existe"
|
||||
|
||||
|
||||
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_resource_locked: Unable to complete lock - resource is locked
|
||||
error_lock_exclusively: unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Documentos bloqueados
|
||||
open_approvals: Aprobaciones abiertas
|
||||
|
||||
error_lock_exclusively: Unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Versión
|
||||
|
||||
locked_documents: Documentos bloqueados
|
||||
open_approvals: Aprobaciones abiertas
|
||||
|
||||
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"
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
# 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) 2014 Atmis
|
||||
# Copyright (C) 2011-15 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) 2014 Atmis
|
||||
# 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
|
||||
@ -31,8 +31,8 @@ fr:
|
||||
notice_file_locked: Fichier verrouillé
|
||||
warning_file_not_locked: Fichier déverrouillé
|
||||
notice_file_unlocked: Fichier déverrouillé
|
||||
error_only_user_that_locked_file_can_unlock_it: "Le fichier ne peut être déverrouillé que par celui qui l'a verrouillé"
|
||||
error_max_files_exceeded: Le nombre de fichiers pouvant être téléchargés simultanément est dépassé
|
||||
error_only_user_that_locked_file_can_unlock_it: "Le fichier ne peut être déverrouillé que par celui qui l'a verrouillé"
|
||||
error_max_files_exceeded: Le nombre de fichiers pouvant être téléchargés simultanément est dépassé
|
||||
error_entry_project_does_not_match_current_project: "Le projet saisi ne correspond pas au projet courant"
|
||||
notice_folder_created: Dossier créé
|
||||
error_folder_creation_failed: Erreur de création du dossier
|
||||
@ -40,7 +40,7 @@ fr:
|
||||
notice_folder_deleted: Dossier supprimé
|
||||
error_folder_is_not_empty: "Le dossier n'est pas vide"
|
||||
error_folder_title_is_already_used: Le titre du fichier est déjà utilisé
|
||||
notice_folder_details_were_saved: Les détails du dossier ont été enregistrés
|
||||
notice_folder_details_were_saved: Les détails du dossier ont été enregistrés
|
||||
error_folder_is_locked: Le dossier est verrouillé
|
||||
error_file_is_locked: Le fichier est verrouillé
|
||||
notice_file_deleted: Le fichier a été supprimé
|
||||
@ -81,8 +81,8 @@ fr:
|
||||
title_waiting_for_approval: Attente de validation
|
||||
title_approved: Validé
|
||||
title_unlock_file: Déverrouiller afin de permettre la modification par les membres du projet
|
||||
title_lock_file: "Verrouiller afin d'empêcher les modifications du document"
|
||||
title_download_checked: Télécharger les fichiers sélectionnés au format zip
|
||||
title_lock_file: "Verrouiller afin d'empêcher les modifications du document"
|
||||
title_download_checked: Télécharger les fichiers sélectionnés au format zip
|
||||
title_send_checked_by_email: Transmettre les fichiers sélectionnés par mail
|
||||
link_user_preferences: Préférences personnelles du module DMSF
|
||||
heading_send_documents_by_email: Transmettre les documents par mail
|
||||
@ -94,11 +94,7 @@ fr:
|
||||
label_email_body: Message
|
||||
label_email_send: Envoyer
|
||||
title_notifications_active: Notifications actives
|
||||
label_file_size: Taille du fichier
|
||||
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
|
||||
label_upload: Transmission
|
||||
heading_new_folder: Nouveau Dossier
|
||||
label_title: Titre
|
||||
label_description: Description
|
||||
@ -109,7 +105,7 @@ fr:
|
||||
select_option_deactivated: Désactivé
|
||||
select_option_activated: Activé
|
||||
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
|
||||
heading_revisions: Révisions
|
||||
title_download: Télécharger
|
||||
@ -117,9 +113,9 @@ fr:
|
||||
label_created: Créé
|
||||
label_changed: Modifié
|
||||
info_changed_by_user: "%{changed} par"
|
||||
label_filename: Fichier
|
||||
label_filename: Fichier
|
||||
label_mime: Type
|
||||
label_size: Taille
|
||||
label_size: Taille
|
||||
heading_new_revision: Nouvelle révision
|
||||
option_version_same: (identique)
|
||||
option_version_minor: (modification mineure)
|
||||
@ -154,7 +150,7 @@ fr:
|
||||
permission_user_preferences: Préférences utilisateur
|
||||
permission_view_dmsf_files: Afficher documents
|
||||
permission_folder_manipulation: Gestion des dossiers
|
||||
permission_file_manipulation: Gestion des documents
|
||||
permission_file_manipulation: Gestion des documents
|
||||
permission_force_file_unlock: Forcer le déverrouillage du document
|
||||
permission_manage_workflows: Gérer les flux de validation
|
||||
permission_file_delete: Supprimer les documents
|
||||
@ -167,12 +163,12 @@ fr:
|
||||
error_user_has_not_right_delete_folder: "L'utilisateur ne dispose pas des droits nécessaires permettant la suppression du dossier"
|
||||
error_user_has_not_right_delete_file: "L'utilisateur ne dispose pas des droits nécessaires permettant la suppression du dossier"
|
||||
notice_entries_deleted: Elément(s) supprimé(s)
|
||||
warning_some_entries_were_not_deleted: "Certains éléments n'ont pas été supprimés : %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Certains éléments n'ont pas été supprimés : %{entries}"
|
||||
title_delete_checked: Supprimer les éléments sélectionnés
|
||||
title_items: items
|
||||
title_filename_for_download: "Nom du fichier à utiliser lors du téléchargement ou de l'archive ZIP"
|
||||
label_number_of_folders: Dossiers
|
||||
label_number_of_documents: Fichiers
|
||||
label_number_of_documents: Fichiers
|
||||
error_file_storage_directory_does_not_exist: Le répertoire de stockage des fichiers n'existe pas ou n'a pas pu être créé
|
||||
error_file_can_not_be_created: "Le fichier n'a pas pu être enregistré dans le répertoire de stockage"
|
||||
error_wrong_zip_encoding: Mauvais jeu de caractères pour la transformation du nom du ZIP
|
||||
@ -203,7 +199,7 @@ fr:
|
||||
title_copy: Copie
|
||||
error_folder_cannot_be_copied: Le dossier ne peut pas être copié
|
||||
notice_folder_copied: Dossier copié
|
||||
|
||||
|
||||
error_max_email_filesize_exceeded: "Vous avez dépassé la taille maximale des fichiers pouvant être transmis par mail (%{number} MB)"
|
||||
note_maximum_email_filesize: Taille maximale, en méga octets, des fichiers pouvant être transmis par mail. 0 indique aucune restriction
|
||||
label_maximum_email_filesize: Taille maximale du fichier attaché
|
||||
@ -219,15 +215,14 @@ fr:
|
||||
warning_folder_not_locked: Echec du verrouillage du dossier
|
||||
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"
|
||||
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_lock_folder: "Verrouiller afin d'empêcher les modifications du dossier"
|
||||
|
||||
|
||||
select_option_webdav_readonly: Lecture
|
||||
select_option_webdav_readwrite: Lecture/Ecriture
|
||||
label_webdav_strategy: Accès Webdav
|
||||
note_webdav_strategy: "Permet à l'administrateur d'autoriser les utilisateurs au module Webdav en letcure seule ou en lecture et écriture."
|
||||
|
||||
|
||||
error_unable_delete_dmsf_workflow: Impossible de supprimer le flux de validation
|
||||
error_empty_note: La note ne peut pas être vide
|
||||
error_workflow_assign: "Une erreur s'est produite lors de l'attribution"
|
||||
@ -251,29 +246,29 @@ fr:
|
||||
label_dmsf_workflow_add_approver: "Ajouter un nouvel approbateur avec une fonction logique :"
|
||||
label_or: ou
|
||||
label_action: Action
|
||||
label_note: Note
|
||||
label_note: Note
|
||||
title_none: Aucun
|
||||
title_rejection: Rejet
|
||||
title_delegation: Délégation
|
||||
title_assignment: Attribution
|
||||
title_start: Démarrer
|
||||
title_start: Démarrer
|
||||
title_dmsf_workflow_log: Journal du flux de validation
|
||||
title_assigned: Assigné
|
||||
title_approval: Approbation
|
||||
title_rejected: Rejeté
|
||||
dmsf_and: ET
|
||||
dmsf_or: OU
|
||||
dmsf_new_step: Nouvelle étape
|
||||
dmsf_new_step: Nouvelle étape
|
||||
message_dmsf_wokflow_note: Votre note...
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Flux
|
||||
link_workflow: Flux
|
||||
notice_workflow_started: Flux de validation démarré avec succès
|
||||
text_email_subject_approved: "Flux de validation %{name} approuvé"
|
||||
text_email_subject_rejected: "Flux de validation %{name} rejeté"
|
||||
text_email_subject_delegated: "Flux de validation %{name} délégué"
|
||||
text_email_subject_requires_approval: "Flux de validation %{name} requiert votre approbation"
|
||||
text_email_subject_updated: "Flux de validation %{name} mis à jour"
|
||||
text_email_subject_started: "Flux de validation %{name} démarré"
|
||||
text_email_subject_approved: approuvé
|
||||
text_email_subject_rejected: rejeté
|
||||
text_email_subject_delegated: délégué
|
||||
text_email_subject_requires_approval: requiert votre approbation
|
||||
text_email_subject_updated: mis à jour
|
||||
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_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."
|
||||
@ -285,8 +280,8 @@ fr:
|
||||
text_email_to_see_status: Pour consulter le statut actuel du flux de validation, cliquez sur le statut du flux du document dans
|
||||
label_my_open_approvals: Mes approbations en attente
|
||||
label_my_locked_documents: Mes documents verrouillés
|
||||
|
||||
title_create_link: Créer un lien symbolique
|
||||
|
||||
title_create_link: Créer un lien symbolique
|
||||
label_link_from: Lien depuis
|
||||
label_link_to: Lien vers
|
||||
label_notifications_on: Activer les notifications
|
||||
@ -294,25 +289,25 @@ fr:
|
||||
field_target_file: Fichier source
|
||||
title_download_entries: Historique des téléchargements
|
||||
label_external: Externe
|
||||
|
||||
|
||||
label_link_name: Nom du lien
|
||||
label_link_external_url: Adresse Internet
|
||||
label_target_folder: Dossier cible
|
||||
label_source_folder: Dossier source
|
||||
label_target_project: Projet cible
|
||||
label_source_project: Projet source
|
||||
|
||||
text_email_doc_updated_subject: "Documents de %{project} mis à jour"
|
||||
label_source_project: Projet source
|
||||
|
||||
text_email_doc_updated_subject: Documents mis à jour
|
||||
text_email_doc_updated: a mis à jour des documents de
|
||||
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
|
||||
label_links_only: liens seulement
|
||||
|
||||
label_links_only: liens seulement
|
||||
|
||||
label_display_notified_recipients: Afficher les destinataires notifiés
|
||||
note_display_notified_recipients: "L'utilisateur sera informé de tous les destinataires à qui un email de notifcation a été envoyé"
|
||||
warning_email_notifications: "Email de notification envoyé à %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Corbeille
|
||||
title_restore: Récupérer
|
||||
notice_dmsf_file_restored: Le document a été récupéré avec succès
|
||||
@ -320,17 +315,20 @@ fr:
|
||||
notice_dmsf_link_restored: Le lien a été récupéré avec succès
|
||||
title_restore_checked: Restauration vérifiée
|
||||
error_parent_folder: "Le dossier parent n'existe pas"
|
||||
|
||||
|
||||
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_resource_locked: Unable to complete lock - resource is locked
|
||||
error_lock_exclusively: unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
error_lock_exclusively: Unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Documents verrouillés
|
||||
open_approvals: Approbations en attente
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Version
|
||||
|
||||
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
|
||||
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
@ -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"
|
||||
@ -1,9 +1,9 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# 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>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
@ -26,13 +26,13 @@ ja:
|
||||
label_dmsf_file_revision_plural: 文書管理ファイルリビジョン
|
||||
label_dmsf_file_revision_access_plural: 文書管理ファイルアクセス
|
||||
warning_no_entries_selected: エントリーが選ばれていません
|
||||
error_email_to_must_be_entered: 電子メールの To は省略できません
|
||||
error_email_to_must_be_entered: 電子メールの To は省略できません
|
||||
warning_file_already_locked: ファイルは既にロックされています
|
||||
notice_file_locked: ファイルをロックしました
|
||||
warning_file_not_locked: ファイルはロックされていません
|
||||
notice_file_unlocked: ファイルをロック解除しました
|
||||
error_only_user_that_locked_file_can_unlock_it: ファイルをロックしたユーザだけがロック解除できます
|
||||
error_max_files_exceeded: "同時にダウンロードできるファイル数の上限 %{number} を超えています"
|
||||
error_only_user_that_locked_file_can_unlock_it: ファイルをロックしたユーザだけがロック解除できます
|
||||
error_max_files_exceeded: "同時にダウンロードできるファイル数の上限 %{number} を超えています"
|
||||
error_entry_project_does_not_match_current_project: 指定したプロジェクトは現在のプロジェクトと一致しません
|
||||
notice_folder_created: フォルダを作成しました
|
||||
error_folder_creation_failed: フォルダを作成できません
|
||||
@ -40,7 +40,7 @@ ja:
|
||||
notice_folder_deleted: フォルダを削除しました
|
||||
error_folder_is_not_empty: フォルダが空ではありません
|
||||
error_folder_title_is_already_used: タイトルは既に使われています
|
||||
notice_folder_details_were_saved: フォルダの詳細を保存しました
|
||||
notice_folder_details_were_saved: フォルダの詳細を保存しました
|
||||
error_folder_is_locked: Folder is locked
|
||||
error_file_is_locked: ファイルはロックされています
|
||||
notice_file_deleted: ファイルを削除しました
|
||||
@ -81,8 +81,8 @@ ja:
|
||||
title_waiting_for_approval: 承認待ち
|
||||
title_approved: 承認済み
|
||||
title_unlock_file: ロック解除して他のメンバーの変更を許可します
|
||||
title_lock_file: ロックして他のメンバーの変更を禁止します
|
||||
title_download_checked: チェックしたものを Zip アーカイブでダウンロードします
|
||||
title_lock_file: ロックして他のメンバーの変更を禁止します
|
||||
title_download_checked: チェックしたものを Zip アーカイブでダウンロードします
|
||||
title_send_checked_by_email: チェックしたものを電子メールで送信します
|
||||
link_user_preferences: プロジェクトの文書管理設定
|
||||
heading_send_documents_by_email: 電子メールによる文書の送信
|
||||
@ -94,11 +94,7 @@ ja:
|
||||
label_email_body: 本文
|
||||
label_email_send: 送信
|
||||
title_notifications_active: 通知は有効です
|
||||
label_file_size: ファイルサイズ
|
||||
heading_file_upload: アップロード
|
||||
note_uploaded_maximum_files_at_once: "最大 %{number} ファイルを一度にアップロードすることができます。"
|
||||
note_upload_files_greater_than_two_gb: 2GB より大きいファイルをアップロードするには 64bit 対応ブラウザが必要です。
|
||||
submit_upload_files: アップロード
|
||||
label_upload: アップロード
|
||||
heading_new_folder: 新規フォルダ
|
||||
label_title: タイトル
|
||||
label_description: 説明
|
||||
@ -109,7 +105,7 @@ ja:
|
||||
select_option_deactivated: 無効
|
||||
select_option_activated: 有効
|
||||
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: 設定を保存します
|
||||
heading_revisions: リビジョン
|
||||
title_download: ダウンロードします
|
||||
@ -117,9 +113,9 @@ ja:
|
||||
label_created: 作成者/日時
|
||||
label_changed: 更新者/日時
|
||||
info_changed_by_user: "/ %{changed}"
|
||||
label_filename: ファイル名
|
||||
label_filename: ファイル名
|
||||
label_mime: Mime
|
||||
label_size: サイズ
|
||||
label_size: サイズ
|
||||
heading_new_revision: 新しいリビジョン
|
||||
option_version_same: 変更なし
|
||||
option_version_minor: マイナー
|
||||
@ -144,7 +140,7 @@ ja:
|
||||
note_stem_some: "大文字から始まる、特定の文字の後に続く、あるいは位置情報を必要とするオペレーターと共に使われる語を除くそれ以外の語の語幹を検索します。語幹抽出された語は、先頭に 'Z' が付きます。"
|
||||
note_stem_all: "すべての語の語幹を検索します。(注: 先頭に 'Z' は付きません。)"
|
||||
note_stemming_applied: 語幹抽出アルゴリズムは、確率を測る対象の位置にある語にしか適用できない (論理演算子の用語自体は語幹抽出されない) ことにご注意ください。
|
||||
label_default_notifications: ファイル通知の既定値
|
||||
label_default_notifications: ファイル通知の既定値
|
||||
heading_uploaded_files: アップロードされたファイル
|
||||
submit_commit: コミット
|
||||
link_documents: 文書
|
||||
@ -154,11 +150,10 @@ ja:
|
||||
permission_user_preferences: ユーザ設定
|
||||
permission_view_dmsf_files: ファイルの表示
|
||||
permission_folder_manipulation: フォルダの操作
|
||||
permission_file_manipulation: ファイルの操作
|
||||
permission_file_manipulation: ファイルの操作
|
||||
permission_force_file_unlock: ファイルの強制ロック解除
|
||||
permission_manage_workflows: ワークフロー管理
|
||||
permission_file_delete: ファイルの削除
|
||||
permission_file_approval: ファイルの承認
|
||||
label_file: ファイル
|
||||
field_folder: フォルダ
|
||||
error_create_cycle_in_folder_dependency: フォルダの依存関係が循環しています
|
||||
@ -168,12 +163,12 @@ ja:
|
||||
error_user_has_not_right_delete_folder: ユーザにフォルダを削除する権限がありません
|
||||
error_user_has_not_right_delete_file: ユーザにファイルを削除する権限がありません
|
||||
notice_entries_deleted: エントリーを削除しました
|
||||
warning_some_entries_were_not_deleted: "いくつかのエントリーは削除されませんでした: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "いくつかのエントリーは削除されませんでした: %{entries}"
|
||||
title_delete_checked: チェックしたものを削除します
|
||||
title_items: items
|
||||
title_filename_for_download: ファイル名はダウンロードまたは Zip アーカイブに使われます
|
||||
label_number_of_folders: フォルダ
|
||||
label_number_of_documents: 文書
|
||||
label_number_of_documents: 文書
|
||||
error_file_storage_directory_does_not_exist: ファイル保存フォルダが存在せず作ることもできません
|
||||
error_file_can_not_be_created: ファイルを保存フォルダに作ることができません
|
||||
error_wrong_zip_encoding: Zip エンコーディングが正しくありません
|
||||
@ -197,14 +192,14 @@ ja:
|
||||
title_copy_or_move: コピー/移動
|
||||
label_dmsf_folder_plural: Dmsf フォルダ
|
||||
comment_moved_from: "%{source} から移動しました"
|
||||
error_target_folder_same: コピー/移動先のフォルダとプロジェクトが現在と同じです
|
||||
error_target_folder_same: コピー/移動先のフォルダとプロジェクトが現在と同じです
|
||||
error_file_cannot_be_moved: ファイルを移動できません
|
||||
error_file_cannot_be_copied: ファイルをコピーできません
|
||||
warning_no_project_to_copy_folder_to: フォルダをコピーするプロジェクトがありません
|
||||
title_copy: コピー
|
||||
error_folder_cannot_be_copied: フォルダをコピーできません
|
||||
notice_folder_copied: フォルダをコピーしました
|
||||
|
||||
notice_folder_copied: フォルダをコピーしました
|
||||
|
||||
error_max_email_filesize_exceeded: "電子メールで送信可能なファイルサイズの上限を越えています (%{number} MB)"
|
||||
note_maximum_email_filesize: "電子メールで送信可能なファイルサイズの上限。0は無制限。単位はMB。"
|
||||
label_maximum_email_filesize: "電子メール添付ファイルサイズ上限"
|
||||
@ -220,7 +215,6 @@ ja:
|
||||
warning_folder_not_locked: "フォルダをロックすることができませんでした"
|
||||
notice_folder_unlocked: "フォルダのロックを解除しました"
|
||||
error_only_user_that_locked_folder_can_unlock_it: "このフォルダのロックを解除する権限がありません"
|
||||
title_folder_parent_locked: "親フォルダ %{name} はロックされています"
|
||||
title_unlock_folder: "ロックを解除し他メンバが更新できるようにします"
|
||||
title_lock_folder: "ロックし他メンバとの競合を回避します"
|
||||
|
||||
@ -252,67 +246,68 @@ ja:
|
||||
label_dmsf_workflow_add_approver: "新規承認者の追加:"
|
||||
label_or: または
|
||||
label_action: アクション
|
||||
label_note: コメント
|
||||
label_note: コメント
|
||||
title_none: 無し
|
||||
title_rejection: 否認
|
||||
title_delegation: 代理承認
|
||||
title_assignment: アサイン
|
||||
title_start: 開始
|
||||
title_start: 開始
|
||||
title_dmsf_workflow_log: 承認ワークフローの履歴
|
||||
title_assigned: アサイン
|
||||
title_approval: 承認
|
||||
title_rejected: 否認
|
||||
dmsf_and: AND
|
||||
dmsf_or: OR
|
||||
dmsf_new_step: 新規ステップ
|
||||
dmsf_new_step: 新規ステップ
|
||||
message_dmsf_wokflow_note: コメント
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: ワークフロー
|
||||
link_workflow: ワークフロー
|
||||
notice_workflow_started: 承認ワークフローが開始されました
|
||||
text_email_subject_approved: "承認ワークフロー '%{name}' は承認されました"
|
||||
text_email_subject_rejected: "承認ワークフロー '%{name}' は否認されました"
|
||||
text_email_subject_delegated: "承認ワークフロー '%{name}' は代理承認が設定されました"
|
||||
text_email_subject_requires_approval: "承認ワークフロー '%{name}' はあなたの承認待ちです"
|
||||
text_email_subject_updated: "承認ワークフロー '%{name}' が更新されました"
|
||||
text_email_subject_started: "承認ワークフロー '%{name}' が開始されました"
|
||||
text_email_subject_approved: は承認されました
|
||||
text_email_subject_rejected: は否認されました
|
||||
text_email_subject_delegated: は代理承認が設定されました
|
||||
text_email_subject_requires_approval: はあなたの承認待ちです
|
||||
text_email_subject_updated: が更新されました
|
||||
text_email_subject_started: が開始されました"
|
||||
text_email_finished_approved: "承認ワークフロー '%{name}' において '%{filename}' が承認されました。"
|
||||
text_email_finished_rejected: "承認ワークフロー '%{name}' において '%{filename}' が否認されました。理由:'%{notice}'。"
|
||||
text_email_finished_delegated: "承認ワークフロー '%{name}' において代理承認が依頼されました。承認対象 '%{filename}' の内容をご確認の上、承認・否認のご判断をお願い致します(依頼主コメント:'%{notice}')。"
|
||||
text_email_finished_step: "承認ワークフロー '%{name}' からの承認依頼です。承認対象 '%{filename}' の内容をご確認の上、承認・否認のご判断をお願い致します。"
|
||||
text_email_finished_step_short: "承認ワークフロー '%{name}' において '%{filename}' の承認ステップが一つ終了しました。"
|
||||
text_email_started: "承認ワークフロー '%{name}' からの承認依頼です。承認対象 '%{filename}' の内容をご確認の上、承認・否認のご判断をお願い致します。"
|
||||
text_email_started: "承認ワークフロー '%{name}' からの承認依頼です。承認対象 '%{filename}' の内容をご確認の上、承認・否認のご判断をお願い致します。"
|
||||
text_email_to_proceed: 次のURLを開き内容を確認の上、右端のチェックマークをクリックし承認・否認の選択をしてください。
|
||||
text_email_to_see_history: 次のURLで承認ワークフローの履歴を確認することができます。
|
||||
text_email_to_see_status: 次のURLで承認ワークフローのステータスを確認することができます。
|
||||
label_my_open_approvals: 自分の承認待ち
|
||||
label_my_locked_documents: 自分のロック中ファイル
|
||||
|
||||
title_create_link: シンボリックリンクを作成します
|
||||
|
||||
title_create_link: シンボリックリンクを作成します
|
||||
label_link_from: リンク生成(from)
|
||||
label_link_to: リンク生成(to)
|
||||
label_notifications_on: 通知オン
|
||||
label_notifications_off: 通知オフ
|
||||
field_target_file: リンク元ファイル
|
||||
title_download_entries: ダウンロード記録
|
||||
label_external: 外部
|
||||
|
||||
label_link_name: リンク名
|
||||
label_link_external_url: URL
|
||||
label_target_folder: リンク先フォルダ
|
||||
label_source_folder: リンク元フォルダ
|
||||
label_target_project: リンク先プロジェクト
|
||||
label_source_project: リンク元プロジェクト
|
||||
label_external: 外部
|
||||
|
||||
text_email_doc_updated_subject: "プロジェクト'%{project}'のファイルが更新されました"
|
||||
|
||||
text_email_doc_updated_subject: プロジェクトのファイルが更新されました
|
||||
text_email_doc_updated: が次のファイルを更新しました。
|
||||
text_email_doc_follows: 対象ファイル:
|
||||
text_email_doc_deleted_subject: "プロジェクト'%{project}'のファイルが削除されました"
|
||||
text_email_doc_deleted_subject: プロジェクトのファイルが削除されました
|
||||
text_email_doc_deleted: が次のプロジェクトのファイルを削除しました。
|
||||
label_links_only: リンクのみ
|
||||
|
||||
|
||||
label_display_notified_recipients: 通知受信者の表示
|
||||
note_display_notified_recipients: 電子メールで通知したすべてのユーザの情報を表示します。
|
||||
warning_email_notifications: "%{to} へ電子メールで通知しました"
|
||||
|
||||
|
||||
link_trash_bin: ゴミ箱
|
||||
title_restore: 復元
|
||||
notice_dmsf_file_restored: ファイルを復元しました
|
||||
@ -320,18 +315,20 @@ ja:
|
||||
notice_dmsf_link_restored: リンクを復元しました
|
||||
title_restore_checked: チェックしたものを復元します
|
||||
error_parent_folder: "親フォルダが存在しません"
|
||||
|
||||
|
||||
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_resource_locked: Unable to complete lock - resource is locked
|
||||
error_lock_exclusively: unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: ロック中
|
||||
open_approvals: 未承認
|
||||
|
||||
error_lock_exclusively: Unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: バージョン
|
||||
|
||||
locked_documents: ロック中
|
||||
open_approvals: 未承認
|
||||
|
||||
label_maximum_ajax_upload_filesize: アップロードファイルサイズ上限
|
||||
note_maximum_ajax_upload_filesize: アップロード可能なファイルサイズの上限。AjaxおよびRedmineの仕様に制限される(2ギガバイト程度までは確認済み)単位はMB。
|
||||
|
||||
label_classic: Classic
|
||||
label_drag_drop: "Drag&Drop"
|
||||
|
||||
@ -1,12 +1,11 @@
|
||||
# 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>
|
||||
# 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
|
||||
#
|
||||
# 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
|
||||
@ -27,20 +26,20 @@ pl:
|
||||
label_dmsf_file_revision_plural: Document revisions
|
||||
label_dmsf_file_revision_access_plural: Document accesses
|
||||
warning_no_entries_selected: Nie zaznaczono żadnych wierszy
|
||||
error_email_to_must_be_entered: Musisz podać adres email
|
||||
error_email_to_must_be_entered: Musisz podać adres email
|
||||
warning_file_already_locked: Plik jest już zablokowany
|
||||
notice_file_locked: Plik zablokowany
|
||||
warning_file_not_locked: Plik nie zablokowany
|
||||
notice_file_unlocked: Plik odblokowany
|
||||
error_only_user_that_locked_file_can_unlock_it: Plik może zostać odblokowany jedynie przez użytkownika, który go zablokował
|
||||
error_max_files_exceeded: "Limit %{number} jedocześnie pobieranych plików został przekroczony"
|
||||
error_only_user_that_locked_file_can_unlock_it: Plik może zostać odblokowany jedynie przez użytkownika, który go zablokował
|
||||
error_max_files_exceeded: "Limit %{number} jedocześnie pobieranych plików został przekroczony"
|
||||
error_entry_project_does_not_match_current_project: "Podany projekt nie odpowiada obecnemu projektowy"
|
||||
notice_folder_created: Folder został utworzony
|
||||
error_folder_creation_failed: Błąd podczas tworzenia folderu
|
||||
error_folder_title_must_be_entered: Musisz podać tytuł
|
||||
notice_folder_deleted: Folder został usunięty
|
||||
error_folder_is_not_empty: Folder zawiera pliki
|
||||
error_folder_title_is_already_used: Podany tytuł jest już w użyciu
|
||||
error_folder_title_is_already_used: Podany tytuł jest już w użyciu
|
||||
notice_folder_details_were_saved: Szczegóły folderu zostały zapisane
|
||||
error_folder_is_locked: Folder jest zablokowany
|
||||
error_file_is_locked: Plik jest zablokowany
|
||||
@ -82,7 +81,7 @@ pl:
|
||||
title_waiting_for_approval: Oczekiwanie na akceptację
|
||||
title_approved: Zaakceptowany
|
||||
title_unlock_file: Odblokuj aby umożliwić wprowadzanie zmian innym użytkownikom
|
||||
title_lock_file: Zablokuj aby zabezpieczyć przed wprowadzaniem zmian przez innych użytkowników
|
||||
title_lock_file: Zablokuj aby zabezpieczyć przed wprowadzaniem zmian przez innych użytkowników
|
||||
title_download_checked: Pobierz zaznaczone jako archiwum Zip
|
||||
title_send_checked_by_email: Wyślij zaznaczone przez email
|
||||
link_user_preferences: Preferencje DMSF dla projektu
|
||||
@ -95,11 +94,7 @@ pl:
|
||||
label_email_body: Treść
|
||||
label_email_send: Wyślij
|
||||
title_notifications_active: Powiadomienia aktywne
|
||||
label_file_size: Rozmiar pliku
|
||||
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
|
||||
label_upload: Prześlij
|
||||
heading_new_folder: Nowy Folder
|
||||
label_title: Tytuł
|
||||
label_description: Opis
|
||||
@ -109,7 +104,7 @@ pl:
|
||||
select_option_default: Domyślny
|
||||
select_option_deactivated: Wyłączono
|
||||
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
|
||||
title_save_preferences: Zapisz ustawienia
|
||||
heading_revisions: Wersje
|
||||
@ -118,7 +113,7 @@ pl:
|
||||
label_created: Utworzono
|
||||
label_changed: Zmieniono
|
||||
info_changed_by_user: "%{changed} przez"
|
||||
label_filename: Nazwa pliku
|
||||
label_filename: Nazwa pliku
|
||||
label_mime: Mime
|
||||
label_size: Rozmiar
|
||||
heading_new_revision: Nowa wersja
|
||||
@ -168,15 +163,15 @@ pl:
|
||||
error_user_has_not_right_delete_folder: "Użytkownik nie posiada uprawnień do usuwania folderów"
|
||||
error_user_has_not_right_delete_file: "Użytkownik nie posiada uprawnień do usuwania plików"
|
||||
notice_entries_deleted: Wpisy usunięte
|
||||
warning_some_entries_were_not_deleted: "Niektóre wpisy nie zostały usunięte: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Niektóre wpisy nie zostały usunięte: %{entries}"
|
||||
title_delete_checked: Usuń zaznaczone
|
||||
title_items: items
|
||||
title_filename_for_download: Nazwa pliku używana do pobierania lub tworzenai archiwum Zip
|
||||
label_number_of_folders: Foldery
|
||||
label_number_of_documents: Dokumenty
|
||||
label_number_of_documents: Dokumenty
|
||||
error_file_storage_directory_does_not_exist: "Folder przechowywania plików nie istnieje i nie może zostać utworzony"
|
||||
error_file_can_not_be_created: "Plik nie może zostać utworzony w folderze przechowywania"
|
||||
error_wrong_zip_encoding: Złe kodowanie Zip
|
||||
error_wrong_zip_encoding: Złe kodowanie Zip
|
||||
warning_xapian_not_available: Xapian niedostępny
|
||||
menu_dmsf: DMSF
|
||||
label_physical_file_delete: Fizyczne usuwanie plików
|
||||
@ -204,7 +199,7 @@ pl:
|
||||
title_copy: Kopiuj
|
||||
error_folder_cannot_be_copied: "Folder nie może zostać skopiowany"
|
||||
notice_folder_copied: Folder został skopiowany
|
||||
|
||||
|
||||
error_max_email_filesize_exceeded: "Maksymalny rozmiar pliku załącznika email został przekroczony. (%{number} MB)"
|
||||
note_maximum_email_filesize: Maksymalny rozmiar pliku, który może zostać wysłany przez email. 0 oznacza brak ograniczeń. Rozmiar w MB.
|
||||
label_maximum_email_filesize: Maksymalny rozmiar załącznika email
|
||||
@ -220,24 +215,24 @@ pl:
|
||||
warning_folder_not_locked: Niestety folder nie może zostać zablokowany
|
||||
notice_folder_unlocked: Folder został odblokowany
|
||||
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_lock_folder: Zablokuj aby zabezpieczyć przed wprowadzaniem zmian przez innych użytkowników
|
||||
|
||||
select_option_webdav_readonly: Tylko do odczytu
|
||||
select_option_webdav_readwrite: Odczyt/Zapis
|
||||
label_webdav_strategy: Webdav strategy
|
||||
note_webdav_strategy: Enables the administrator to decide if webdav is a read-only or read-write platform for end users.
|
||||
|
||||
note_webdav_strategy: Enables the administrator to decide if webdav is a read-only or read-write platform for end users.
|
||||
|
||||
error_unable_delete_dmsf_workflow: Nie można usunąć procesu workflow
|
||||
error_empty_note: "Notatka nie może być pusta"
|
||||
error_workflow_assign: Wystąpił błąd podczas przydzielania
|
||||
error_cannot_start_workflow: "Workflow nie może zostać uruchomiony"
|
||||
error_cannot_renumber_steps: "Kroki nie mogą zostać przenumerowane"
|
||||
label_dmsf_workflow_new: Nowy proces akceptacji
|
||||
label_dmsf_workflow_new: Nowy proces akceptacji
|
||||
field_label_dmsf_workflow: Proces akceptacji
|
||||
field_label_dmsf_workflow_name: Nazwa procesu akceptacji
|
||||
label_dmsf_workflow_plural: Procesy akceptacji
|
||||
label_dmsf_workflow_plural_num: Procesy akceptacji (%{count})
|
||||
label_dmsf_workflow_step: Krok
|
||||
label_dmsf_workflow_step_plural: Kroki
|
||||
label_dmsf_workflow_approval: Akceptacja
|
||||
@ -251,42 +246,42 @@ pl:
|
||||
label_dmsf_workflow_add_approver: "Dodaj nowego akceptującego z warunkiem logicznym:"
|
||||
label_or: lub
|
||||
label_action: Akcja
|
||||
label_note: Notatka
|
||||
label_note: Notatka
|
||||
title_none: Brak
|
||||
title_rejection: Odrzucenie
|
||||
title_delegation: Delegacja
|
||||
title_assignment: Przydział
|
||||
title_start: Start
|
||||
title_start: Start
|
||||
title_dmsf_workflow_log: Historia procesu akceptacji
|
||||
title_assigned: Przydzielony
|
||||
title_approval: Akceptacja
|
||||
title_rejected: Odrzucony
|
||||
dmsf_and: AND
|
||||
dmsf_or: OR
|
||||
dmsf_new_step: Nowy krok
|
||||
dmsf_new_step: Nowy krok
|
||||
message_dmsf_wokflow_note: Twoja notatka...
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Proces akceptacji
|
||||
notice_workflow_started: Proces akceptacji został uruchomiony
|
||||
text_email_subject_approved: "Proces akceptacji %{name} został zakończony akceptacją"
|
||||
text_email_subject_rejected: "Proces akceptacji %{name} został odrzucony"
|
||||
text_email_subject_delegated: "Proces akceptacji %{name} został delegowany"
|
||||
text_email_subject_requires_approval: "Proces akceptacji %{name} wymaga Twojej akceptacji"
|
||||
text_email_subject_updated: "Proces akceptacji %{name} został zaktualizowany"
|
||||
text_email_subject_started: "Proces akceptacji %{name} został uruchomiony"
|
||||
notice_workflow_started: Proces akceptacji został uruchomiony
|
||||
text_email_subject_approved: został zakończony akceptacją
|
||||
text_email_subject_rejected: został odrzucony
|
||||
text_email_subject_delegated: został delegowany
|
||||
text_email_subject_requires_approval: wymaga Twojej akceptacji
|
||||
text_email_subject_updated: został zaktualizowany
|
||||
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_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_step: "Zakończono krok w procesie akceptacji '%{name}' dokumentu '%{filename}'. Jesteś kolejną osobą decyzyjną w procesie akceptacji."
|
||||
text_email_finished_step_short: "Zakończono krok w procesie akceptacji '%{name}' dokumentu '%{filename}'."
|
||||
text_email_started: "Proces akceptacji '%{name}' dokuentu '%{filename}' został uruchomiony. Jesteś osobą akceptującą w bieżącym kroku zatwierdzania."
|
||||
text_email_started: "Proces akceptacji '%{name}' dokuentu '%{filename}' został uruchomiony. Jesteś osobą akceptującą w bieżącym kroku zatwierdzania."
|
||||
text_email_to_proceed: Aby procedować zaznacz check box przy dokumencie
|
||||
text_email_to_see_history: Aby zobaczyć historię akceptacji kliknij w proces akceptacji dokumentu
|
||||
text_email_to_see_status: Aby zobaczyć aktualny stan procesu akceptacji kliknij w proces akceptacji dokumentu
|
||||
label_my_open_approvals: Otwarte akceptacje
|
||||
label_my_locked_documents: Zablokowane dokumenty
|
||||
|
||||
title_create_link: Utwórz symbolic link
|
||||
|
||||
title_create_link: Utwórz symbolic link
|
||||
label_link_from: Odnośnik z
|
||||
label_link_to: Odnośnik do
|
||||
label_notifications_on: Powiadomienia włączone
|
||||
@ -294,25 +289,25 @@ pl:
|
||||
field_target_file: Plik źródłowy
|
||||
title_download_entries: Pobrane
|
||||
label_external: External
|
||||
|
||||
|
||||
label_link_name: Nazwa odnośnika
|
||||
label_link_external_url: URL
|
||||
label_target_folder: Folder docelowy
|
||||
label_source_folder: Folder źródłowy
|
||||
label_target_project: Projekt docelowy
|
||||
label_source_project: Projekt źródłowy
|
||||
|
||||
text_email_doc_updated_subject: "Dokumenty projektu %{project} zostały zaktualizowane"
|
||||
label_source_project: Projekt źródłowy
|
||||
|
||||
text_email_doc_updated_subject: Dokumenty zostały zaktualizowane
|
||||
text_email_doc_updated: dokumenty zostały zaktualizowane
|
||||
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
|
||||
label_links_only: odnośniki
|
||||
|
||||
|
||||
label_display_notified_recipients: Wyświetl odbiorców powiadomienia
|
||||
note_display_notified_recipients: Użytkownik zostanie poinformowany o wszystkich odbiorcach wysłanego powiadomienia email.
|
||||
warning_email_notifications: "Powiadomienie email zostało wysłane do %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Kosz
|
||||
title_restore: Przywróć
|
||||
notice_dmsf_file_restored: Dokument został przywrócony
|
||||
@ -320,17 +315,20 @@ pl:
|
||||
notice_dmsf_link_restored: Link został przywrócony
|
||||
title_restore_checked: Restore checked
|
||||
error_parent_folder: "Folder nadrzędny nie istnieje"
|
||||
|
||||
|
||||
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_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
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Dokumenty zablokowane
|
||||
openap_provals: Otwarte procesy akceptacji
|
||||
|
||||
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Wersja
|
||||
|
||||
locked_documents: Dokumenty zablokowane
|
||||
open_approvals: Otwarte procesy akceptacji
|
||||
|
||||
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"
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
#
|
||||
# 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>
|
||||
# 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
|
||||
@ -40,7 +40,7 @@ pt-BR:
|
||||
notice_folder_deleted: Pasta deletada
|
||||
error_folder_is_not_empty: Pasta não está vazia
|
||||
error_folder_title_is_already_used: Título já utilizado
|
||||
notice_folder_details_were_saved: Pasta atualizada
|
||||
notice_folder_details_were_saved: Pasta atualizada
|
||||
error_folder_is_locked: Pasta está bloqueada
|
||||
error_file_is_locked: Arquivo está bloqueado
|
||||
notice_file_deleted: Arquivo excluído
|
||||
@ -94,11 +94,7 @@ pt-BR:
|
||||
label_email_body: Descrição
|
||||
label_email_send: Enviar
|
||||
title_notifications_active: Notificações Ativas
|
||||
label_file_size: Tamanho do Arquivo
|
||||
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
|
||||
label_upload: Envio
|
||||
heading_new_folder: Nova Pasta
|
||||
label_title: Taxonomia
|
||||
label_description: Descrição
|
||||
@ -109,7 +105,7 @@ pt-BR:
|
||||
select_option_deactivated: Desativado
|
||||
select_option_activated: Ativado
|
||||
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
|
||||
heading_revisions: Revisões
|
||||
title_download: Download
|
||||
@ -219,7 +215,6 @@ pt-BR:
|
||||
warning_folder_not_locked: A pasta não pode ser bloqueada
|
||||
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
|
||||
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_lock_folder: Clique aqui para impedir alterações por outros usuários
|
||||
|
||||
@ -268,12 +263,12 @@ pt-BR:
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Workflow
|
||||
notice_workflow_started: Workflow de aprovação foi iniciado com êxito
|
||||
text_email_subject_approved: "Workflow de aprovação %{name}: aprovado"
|
||||
text_email_subject_rejected: "Workflow de aprovação %{name} reprovado"
|
||||
text_email_subject_delegated: "Workflow de aprovação %{name} atribuído para"
|
||||
text_email_subject_requires_approval: "Workflow de aprovação %{name} requer sua aprovação"
|
||||
text_email_subject_updated: "Workflow de aprovação %{name}: atualizado"
|
||||
text_email_subject_started: "Workflow de aprovação %{name}: iniciado"
|
||||
text_email_subject_approved: aprovado
|
||||
text_email_subject_rejected: reprovado
|
||||
text_email_subject_delegated: atribuído para
|
||||
text_email_subject_requires_approval: requer sua aprovação
|
||||
text_email_subject_updated: atualizado
|
||||
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_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."
|
||||
@ -302,10 +297,10 @@ pt-BR:
|
||||
label_target_project: Target 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_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
|
||||
label_links_only: links only
|
||||
|
||||
@ -320,17 +315,20 @@ pt-BR:
|
||||
notice_dmsf_link_restored: O link foi restaurado com sucesso
|
||||
title_restore_checked: Restaurar pasta ou arquivo
|
||||
error_parent_folder: "A pasta de pai não existe"
|
||||
|
||||
|
||||
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_resource_locked: Unable to complete lock - resource is locked
|
||||
error_lock_exclusively: unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
error_lock_exclusively: Unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Documentos bloqueados
|
||||
open_approvals: Aprovações abertas
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Versão
|
||||
|
||||
locked_documents: Documentos bloqueados
|
||||
open_approvals: Aprovações abertas
|
||||
|
||||
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"
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# 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>
|
||||
# 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
|
||||
@ -26,13 +26,13 @@ ru:
|
||||
label_dmsf_file_revision_plural: Изменения документов
|
||||
label_dmsf_file_revision_access_plural: Доступы к документам
|
||||
warning_no_entries_selected: Файлы не выбраны
|
||||
error_email_to_must_be_entered: Нужно указать, на какую почту отправить письмо
|
||||
error_email_to_must_be_entered: Нужно указать, на какую почту отправить письмо
|
||||
warning_file_already_locked: Файл уже заблокирован
|
||||
notice_file_locked: Файл заблокирован
|
||||
warning_file_not_locked: Файл не заблокирован
|
||||
notice_file_unlocked: Файл разблокирован
|
||||
error_only_user_that_locked_file_can_unlock_it: Только пользователь, который заблокировал файл, может его разблокировать
|
||||
error_max_files_exceeded: "Ограничение для %{number} одновременно загружаемых файлов превышено"
|
||||
error_only_user_that_locked_file_can_unlock_it: Только пользователь, который заблокировал файл, может его разблокировать
|
||||
error_max_files_exceeded: "Ограничение для %{number} одновременно загружаемых файлов превышено"
|
||||
error_entry_project_does_not_match_current_project: Проект, которому принадлежит файл, не соответсвует текущему проекту
|
||||
notice_folder_created: Папка создана
|
||||
error_folder_creation_failed: Папку не удалось создать
|
||||
@ -40,7 +40,7 @@ ru:
|
||||
notice_folder_deleted: Папка удалена
|
||||
error_folder_is_not_empty: Папка не пустая
|
||||
error_folder_title_is_already_used: Название папки уже используется
|
||||
notice_folder_details_were_saved: Описание папки было сохранено
|
||||
notice_folder_details_were_saved: Описание папки было сохранено
|
||||
error_folder_is_locked: Папка заблокированa
|
||||
error_file_is_locked: Файл заблокирован
|
||||
notice_file_deleted: Файл удален
|
||||
@ -81,8 +81,8 @@ ru:
|
||||
title_waiting_for_approval: Ожидается на утверждение
|
||||
title_approved: Утверждено
|
||||
title_unlock_file: Разблокируйте файл, чтобы разрешить изменение его другими участниками
|
||||
title_lock_file: Заблокируйте файл, чтобы запретить его изменение другими участниками
|
||||
title_download_checked: Скачать выбранные файлы
|
||||
title_lock_file: Заблокируйте файл, чтобы запретить его изменение другими участниками
|
||||
title_download_checked: Скачать выбранные файлы
|
||||
title_send_checked_by_email: Отправить выбранные файлы по электронной почте
|
||||
link_user_preferences: Ваши настройки DMSF проекта
|
||||
heading_send_documents_by_email: Отправить документы по электронной почте
|
||||
@ -94,11 +94,7 @@ ru:
|
||||
label_email_body: Содержание
|
||||
label_email_send: Отправить
|
||||
title_notifications_active: Уведомления активны
|
||||
label_file_size: Размер файла
|
||||
heading_file_upload: Закачать
|
||||
note_uploaded_maximum_files_at_once: "За один раз можно загрузить только %{number} файлов."
|
||||
note_upload_files_greater_than_two_gb: Чтобы загружать файлы размером больше чем 2 Гб у вас должен быть 64-битный браузер.
|
||||
submit_upload_files: Загрузить
|
||||
label_upload: Закачать
|
||||
heading_new_folder: Новая папка
|
||||
label_title: Заголовок
|
||||
label_description: Описание
|
||||
@ -109,7 +105,7 @@ ru:
|
||||
select_option_deactivated: Отключено
|
||||
select_option_activated: Включено
|
||||
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: Сохранить настройки
|
||||
heading_revisions: Редакции
|
||||
title_download: Скачать
|
||||
@ -117,9 +113,9 @@ ru:
|
||||
label_created: Создан
|
||||
label_changed: Изменен
|
||||
info_changed_by_user: "%{changed} пользователем"
|
||||
label_filename: Имя файла
|
||||
label_filename: Имя файла
|
||||
label_mime: MIME-тип
|
||||
label_size: Размер
|
||||
label_size: Размер
|
||||
heading_new_revision: Новая редакция
|
||||
option_version_same: Та же версия
|
||||
option_version_minor: Незначительные изменения
|
||||
@ -154,7 +150,7 @@ ru:
|
||||
permission_user_preferences: Настройки пользователя
|
||||
permission_view_dmsf_files: Просматривать документы
|
||||
permission_folder_manipulation: Управление папками
|
||||
permission_file_manipulation: Управление файлами
|
||||
permission_file_manipulation: Управление файлами
|
||||
permission_force_file_unlock: Разблокировка любых файлов
|
||||
permission_manage_workflows: Управление согласованиями
|
||||
permission_file_delete: Удаление документов
|
||||
@ -167,7 +163,7 @@ ru:
|
||||
error_user_has_not_right_delete_folder: Пользователь не имеет нужных прав для удаления папки
|
||||
error_user_has_not_right_delete_file: Пользователь не имеет нужных прав для удаления файла
|
||||
notice_entries_deleted: Файлы удалены
|
||||
warning_some_entries_were_not_deleted: "Некоторые файлы не были удалены: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Некоторые файлы не были удалены: %{entries}"
|
||||
title_delete_checked: Удалить выбранные документы
|
||||
title_items: элементы
|
||||
title_filename_for_download: Имя файла для скачиваемого архива
|
||||
@ -219,7 +215,6 @@ ru:
|
||||
warning_folder_not_locked: "К сожалению, папка не может быть заблокирована"
|
||||
notice_folder_unlocked: "Папка была успешно разблокирована"
|
||||
error_only_user_that_locked_folder_can_unlock_it: "Только пользователь, который заблокировал папку, может её разблокировать"
|
||||
title_folder_parent_locked: "Родительская папка %{name} заблокирована"
|
||||
title_unlock_folder: "Разблокируйте папку, чтобы разрешить изменение её другими участниками"
|
||||
title_lock_folder: "Заблокируйте папку, чтобы запретить ёё изменение другими участниками"
|
||||
|
||||
@ -227,7 +222,7 @@ ru:
|
||||
select_option_webdav_readwrite: "Чтение/Запись"
|
||||
label_webdav_strategy: "Стратегия WebDAV"
|
||||
note_webdav_strategy: "Позволяет администратору решить в каком режиме предоставить доступ к WebDAV для конечных пользователей (Только для чтения или Чтение+Запись)."
|
||||
|
||||
|
||||
error_unable_delete_dmsf_workflow: Невозможно удалить процесс согласование
|
||||
error_empty_note: Примечание не может быть пустым
|
||||
error_workflow_assign: Возникла ошибка при назначении
|
||||
@ -263,30 +258,30 @@ ru:
|
||||
title_rejected: Отклонен
|
||||
dmsf_and: AND
|
||||
dmsf_or: OR
|
||||
dmsf_new_step: Новый шаг
|
||||
dmsf_new_step: Новый шаг
|
||||
message_dmsf_wokflow_note: Ваше примечание...
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Согласование
|
||||
link_workflow: Согласование
|
||||
notice_workflow_started: Процесс согласования успешно запущен
|
||||
text_email_subject_approved: "Процесс согласования %{name} успешно завершен"
|
||||
text_email_subject_rejected: "Процесс согласования %{name} отклонен"
|
||||
text_email_subject_delegated: "Процесс согласования %{name} делегирован"
|
||||
text_email_subject_requires_approval: "Процесс согласования %{name} требует вашего участия"
|
||||
text_email_subject_updated: "Процесс согласования %{name} обновлен"
|
||||
text_email_subject_started: "Процесс согласования %{name} запущен"
|
||||
text_email_subject_approved: успешно завершен
|
||||
text_email_subject_rejected: отклонен
|
||||
text_email_subject_delegated: делегирован
|
||||
text_email_subject_requires_approval: ребует вашего участия
|
||||
text_email_subject_updated: обновлен
|
||||
text_email_subject_started: запущен
|
||||
text_email_finished_approved: "Процесс согласования '%{name}' документа '%{filename}' только что завершился и документ был согласован."
|
||||
text_email_finished_rejected: "Процесс согласования '%{name}' документа '%{filename}' только что завершился и документ был отклонен по причине '%{notice}'."
|
||||
text_email_finished_delegated: "Процесс согласования '%{name}' документа '%{filename}' только что был делегирован по причине '%{notice}' и от Вас ожидается согласование."
|
||||
text_email_finished_step: "Процесс согласования '%{name}' документа '%{filename}' только что завершил один из шагов согласования и ожидает Вашего соглсования."
|
||||
text_email_finished_step_short: "Процесс согласования '%{name}' документа '%{filename}' только что завершил один из шагов согласования."
|
||||
text_email_started: "Процесс согласования '%{name}' документа '%{filename}' только что начался и ожидает Вашего соглсования."
|
||||
text_email_to_proceed: Для продолжения поставьте отметку рядом с документом в
|
||||
text_email_to_see_history: Для просмотра истории согласования нажмите статус согласования документа в
|
||||
text_email_to_see_status: Для просмотра текущего статуса согласования нажмите статус согласования документа в
|
||||
text_email_started: "Процесс согласования '%{name}' документа '%{filename}' только что начался и ожидает Вашего соглсования."
|
||||
text_email_to_proceed: Для продолжения поставьте отметку рядом с документом в
|
||||
text_email_to_see_history: Для просмотра истории согласования нажмите статус согласования документа в
|
||||
text_email_to_see_status: Для просмотра текущего статуса согласования нажмите статус согласования документа в
|
||||
label_my_open_approvals: Мои согласования
|
||||
label_my_locked_documents: Мои заблокированные документы
|
||||
|
||||
title_create_link: Создать символическую ссылку
|
||||
|
||||
title_create_link: Создать символическую ссылку
|
||||
label_link_from: Ссылка из
|
||||
label_link_to: Ссылка на
|
||||
label_notifications_on: Включить уведомления
|
||||
@ -294,25 +289,25 @@ ru:
|
||||
field_target_file: Исходный файл
|
||||
title_download_entries: Скачать записи
|
||||
label_external: Внешний
|
||||
|
||||
|
||||
label_link_name: Наименование ссылки
|
||||
label_link_external_url: URL
|
||||
label_target_folder: Целевая папка
|
||||
label_source_folder: Исходная папка
|
||||
label_target_project: Целевой проект
|
||||
label_source_project: Исходный проект
|
||||
|
||||
text_email_doc_updated_subject: "Документы проекта %{project} обновлены"
|
||||
label_source_project: Исходный проект
|
||||
|
||||
text_email_doc_updated_subject: Документы обновлены
|
||||
text_email_doc_updated: только что обновил документы
|
||||
text_email_doc_follows: следующим образом
|
||||
text_email_doc_deleted_subject: "Документы проекта %{project} удалены"
|
||||
text_email_doc_deleted_subject: Документы удалены
|
||||
text_email_doc_deleted: только что удалил документы
|
||||
label_links_only: только ссылки
|
||||
|
||||
|
||||
label_display_notified_recipients: Показывать получателей, получивших уведомление
|
||||
note_display_notified_recipients: Пользователь будет проинфмораирован о всех получателях, кому было направлено уведомление.
|
||||
warning_email_notifications: "Уведомление отправлено %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Корзина
|
||||
title_restore: Восстановить
|
||||
notice_dmsf_file_restored: Документ был успешно восстановлен
|
||||
@ -320,17 +315,20 @@ ru:
|
||||
notice_dmsf_link_restored: Папка была успешно восстановлена
|
||||
title_restore_checked: Восстановить отмеченные
|
||||
error_parent_folder: "Родительская папка не существует"
|
||||
|
||||
|
||||
error_resource_or_parent_locked: Невозможно выполнить блокировку - ресурс (или родительская запись) заблокированы
|
||||
error_parent_locked: Невозможно выполнить блокировку - родительская запись заблокирована
|
||||
error_resource_locked: Невозможно выполнить блокировку - ресурс заблокирован
|
||||
error_lock_exclusively: невозможно эксклюзивно заблокировать уже забловированный ресурс
|
||||
error_lock_exclusively: Невозможно эксклюзивно заблокировать уже забловированный ресурс
|
||||
error_unlock_parent_locked: Разблокировка не удалась - родительская запись заблокирована
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Заблокированные документы
|
||||
open_approvals: Открытые согласования
|
||||
|
||||
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Версия
|
||||
|
||||
locked_documents: Заблокированные документы
|
||||
open_approvals: Открытые согласования
|
||||
|
||||
label_maximum_ajax_upload_filesize: Максимальный размер файла, загружаемого посредством AJAX
|
||||
note_maximum_ajax_upload_filesize: Превышает максимальный размер файла, загружаемого посредством интерфейса AJAX, для загрузки можно использовать стандартную форму Redmine. Размер указан в MB.
|
||||
label_classic: Classic
|
||||
label_drag_drop: "Drag&Drop"
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011 <zdravko.balorda@mks.si>
|
||||
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011 Zdravko Balorda <zdravko.balorda@mks.si>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
@ -26,13 +26,13 @@ sl:
|
||||
label_dmsf_file_revision_plural: Document revisions
|
||||
label_dmsf_file_revision_access_plural: Document accesses
|
||||
warning_no_entries_selected: Ničesar niste izbrali
|
||||
error_email_to_must_be_entered: Email Naslovnik mora bit izbran
|
||||
error_email_to_must_be_entered: Email Naslovnik mora bit izbran
|
||||
warning_file_already_locked: Datoteka že zaklenjena
|
||||
notice_file_locked: Datoteka zaklenjena
|
||||
warning_file_not_locked: Datoteka ni zaklenjena
|
||||
notice_file_unlocked: Datoteka odklenjena
|
||||
error_only_user_that_locked_file_can_unlock_it: Samo oseba, ki je zaklenila datoteko, jo lahko odklene.
|
||||
error_max_files_exceeded: "Max %{number} datotek za istočasno nalaganje je preseženo."
|
||||
error_only_user_that_locked_file_can_unlock_it: Samo oseba, ki je zaklenila datoteko, jo lahko odklene.
|
||||
error_max_files_exceeded: "Max %{number} datotek za istočasno nalaganje je preseženo."
|
||||
error_entry_project_does_not_match_current_project: Projekt se ujema s trenutno nastavljenim projektom
|
||||
notice_folder_created: Mapa kreirana
|
||||
error_folder_creation_failed: Mape ne morem kreirati
|
||||
@ -40,7 +40,7 @@ sl:
|
||||
notice_folder_deleted: Mapa izbrisana
|
||||
error_folder_is_not_empty: Mapa ni prazna
|
||||
error_folder_title_is_already_used: Naslov je že uporabljen
|
||||
notice_folder_details_were_saved: Podatki o mapi so shranjeni
|
||||
notice_folder_details_were_saved: Podatki o mapi so shranjeni
|
||||
error_folder_is_locked: Папка заблокированa
|
||||
error_file_is_locked: Mapa je zaklenjena
|
||||
notice_file_deleted: Datoteka izbrisana
|
||||
@ -81,8 +81,8 @@ sl:
|
||||
title_waiting_for_approval: V postopku odobritve
|
||||
title_approved: Odobreno
|
||||
title_unlock_file: Odkleni drugim članom za posodabljanje
|
||||
title_lock_file: Zakleni za posodabljanje
|
||||
title_download_checked: Prenesi izbrano v Zip formatu
|
||||
title_lock_file: Zakleni za posodabljanje
|
||||
title_download_checked: Prenesi izbrano v Zip formatu
|
||||
title_send_checked_by_email: Pošlji izbrano po elektronski pošti
|
||||
link_user_preferences: Vaše Arhivske nastavitve za projekt
|
||||
heading_send_documents_by_email: Pošlji dokumente po elektronski pošti
|
||||
@ -94,11 +94,7 @@ sl:
|
||||
label_email_body: Vsebina
|
||||
label_email_send: Pošlji
|
||||
title_notifications_active: Obveščanje aktivno
|
||||
label_file_size: Velikost datoteke
|
||||
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
|
||||
label_upload: Naloži
|
||||
heading_new_folder: Nova mapa
|
||||
label_title: Naziv mape
|
||||
label_description: Opis
|
||||
@ -109,7 +105,7 @@ sl:
|
||||
select_option_deactivated: Deaktivirano
|
||||
select_option_activated: Aktivirano
|
||||
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
|
||||
heading_revisions: Verzije
|
||||
title_download: Prenesi dol
|
||||
@ -117,9 +113,9 @@ sl:
|
||||
label_created: Narejeno
|
||||
label_changed: Spremenjeno
|
||||
info_changed_by_user: "%{changed} po"
|
||||
label_filename: Datoteka
|
||||
label_filename: Datoteka
|
||||
label_mime: Mime
|
||||
label_size: Velikost
|
||||
label_size: Velikost
|
||||
heading_new_revision: Nova verzija
|
||||
option_version_same: Enako
|
||||
option_version_minor: Minor
|
||||
@ -154,7 +150,7 @@ sl:
|
||||
permission_user_preferences: Uporabniške nastavitve
|
||||
permission_view_dmsf_files: Preglej dokumente
|
||||
permission_folder_manipulation: Upravljanje z mapami
|
||||
permission_file_manipulation: Upravljanje z datotekami
|
||||
permission_file_manipulation: Upravljanje z datotekami
|
||||
permission_force_file_unlock: Prisilno odkleni datoteko
|
||||
permission_manage_workflows: Manage workflows
|
||||
permission_file_delete: Delete documents
|
||||
@ -167,7 +163,7 @@ sl:
|
||||
error_user_has_not_right_delete_folder: Uporabnik nima privilegija brisati mapo
|
||||
error_user_has_not_right_delete_file: Uporabnik nima privilegija brisati datoteke
|
||||
notice_entries_deleted: Izbrane enote izbrisane
|
||||
warning_some_entries_were_not_deleted: "Nekatere enote niso izbrisane: %{entries}"
|
||||
warning_some_entries_were_not_deleted: "Nekatere enote niso izbrisane: %{entries}"
|
||||
title_delete_checked: Izbriši izbrano
|
||||
title_items: items
|
||||
title_filename_for_download: Naziv datoteke za prenos dol ali Zip arhiva
|
||||
@ -186,7 +182,7 @@ sl:
|
||||
label_dmsf_updated: Arhiv posodobljen
|
||||
label_dmsf_downloaded: Arhiv downloaded
|
||||
title_total_size_of_all_files: Skupna velikost vseh datotek v tej mapi
|
||||
project_module_dmsf: Arhiv
|
||||
project_module_dmsf: Arhiv
|
||||
warning_no_project_to_copy_file_to: Ni projekta kamor bi kopiral datoteko
|
||||
comment_copied_from: "Skopirano iz %{source}"
|
||||
notice_file_copied: Datoteka skopirana
|
||||
@ -203,7 +199,7 @@ sl:
|
||||
title_copy: Kopiraj
|
||||
error_folder_cannot_be_copied: Mapo se ne da skopirati
|
||||
notice_folder_copied: Mapa skopirana
|
||||
|
||||
|
||||
error_max_email_filesize_exceeded: "Presegli ste največjo velikost datoteke za pošiljanje po email-u. (%{number} MB)"
|
||||
note_maximum_email_filesize: Omejitev največje velikosti datoteke, ki se lahko pošlje po email-u. 0 pomeni neomejeno. Količina je v MB.
|
||||
label_maximum_email_filesize: Največja velikost email priponke
|
||||
@ -219,7 +215,6 @@ sl:
|
||||
warning_folder_not_locked: Ne, ta mapa ne more biti zaklenjena
|
||||
notice_folder_unlocked: Mapa je uspešno odklenjena
|
||||
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_lock_folder: Zakleni, da bi drugim članom preprečil spreminjanje
|
||||
|
||||
@ -227,7 +222,7 @@ sl:
|
||||
select_option_webdav_readwrite: "Beri/Piši"
|
||||
label_webdav_strategy: Webdav strategija
|
||||
note_webdav_strategy: "Omogoči administratorju da odloči ali je webdav platforma na voljo izključno za branje ali beri/piši za končne uporabnike."
|
||||
|
||||
|
||||
error_unable_delete_dmsf_workflow: Unable to delete the workflow
|
||||
error_empty_note: "The note can't be empty"
|
||||
error_workflow_assign: An error occured while assigning
|
||||
@ -251,42 +246,42 @@ sl:
|
||||
label_dmsf_workflow_add_approver: "Add a new approver with a logical function:"
|
||||
label_or: or
|
||||
label_action: Action
|
||||
label_note: Note
|
||||
label_note: Note
|
||||
title_none: None
|
||||
title_rejection: Rejection
|
||||
title_delegation: Delegation
|
||||
title_assignment: Assignment
|
||||
title_start: Start
|
||||
title_start: Start
|
||||
title_dmsf_workflow_log: Approval Workflow Log
|
||||
title_assigned: Assigned
|
||||
title_approval: Approval
|
||||
title_rejected: Rejected
|
||||
dmsf_and: AND
|
||||
dmsf_or: OR
|
||||
dmsf_new_step: New step
|
||||
dmsf_new_step: New step
|
||||
message_dmsf_wokflow_note: Your note...
|
||||
info_revision: "r%{rev}"
|
||||
link_workflow: Workflow
|
||||
link_workflow: Workflow
|
||||
notice_workflow_started: Approval workflow successfully started
|
||||
text_email_subject_approved: "Approval workflow %{name} approved"
|
||||
text_email_subject_rejected: "Approval workflow %{name} rejected"
|
||||
text_email_subject_delegated: "Approval workflow %{name} delegated"
|
||||
text_email_subject_requires_approval: "Approval workflow %{name} requires your approval"
|
||||
text_email_subject_updated: "Approval workflow %{name} updated"
|
||||
text_email_subject_started: "Approval workflow %{name} started"
|
||||
text_email_subject_approved: approved
|
||||
text_email_subject_rejected: rejected
|
||||
text_email_subject_delegated: delegated
|
||||
text_email_subject_requires_approval: requires your approval
|
||||
text_email_subject_updated: updated
|
||||
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_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_step: "The approval workflow '%{name}' assigned to '%{filename}' document has just finished one of the approval steps and you are expected to do an approval in the next approval step."
|
||||
text_email_finished_step_short: "The approval workflow '%{name}' assigned to '%{filename}' document has just finished one of the approval steps."
|
||||
text_email_started: "The approval workflow '%{name}' assigned to '%{filename}' document has just been started and you are expected to do an approval in the current approval step."
|
||||
text_email_started: "The approval workflow '%{name}' assigned to '%{filename}' document has just been started and you are expected to do an approval in the current approval step."
|
||||
text_email_to_proceed: To proceed click on the check box icon next to the document in
|
||||
text_email_to_see_history: To see the approval history click on the workflow status of the document in
|
||||
text_email_to_see_status: To see the current status of the approval workflow click on the workflow status the document in
|
||||
label_my_open_approvals: My open approvals
|
||||
label_my_locked_documents: My locked documents
|
||||
|
||||
title_create_link: Create a symbolic link
|
||||
|
||||
title_create_link: Create a symbolic link
|
||||
label_link_from: Link from
|
||||
label_link_to: Link to
|
||||
label_notifications_on: Notifications on
|
||||
@ -294,25 +289,25 @@ sl:
|
||||
field_target_file: Source file
|
||||
title_download_entries: Download entries
|
||||
label_external: External
|
||||
|
||||
|
||||
label_link_name: Link name
|
||||
label_link_external_url: URL
|
||||
label_target_folder: Target folder
|
||||
label_source_folder: Source folder
|
||||
label_target_project: Target project
|
||||
label_source_project: Source project
|
||||
|
||||
text_email_doc_updated_subject: "Documents of %{project} updated"
|
||||
label_source_project: Source project
|
||||
|
||||
text_email_doc_updated_subject: Documents updated
|
||||
text_email_doc_updated: has just actualized documents of
|
||||
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
|
||||
label_links_only: links only
|
||||
|
||||
|
||||
label_display_notified_recipients: Display notified recipients
|
||||
note_display_notified_recipients: The user will be informed about all recipients of just sent the email notification.
|
||||
warning_email_notifications: "Email notifications sent to %{to}"
|
||||
|
||||
|
||||
link_trash_bin: Trash bin
|
||||
title_restore: Restore
|
||||
notice_dmsf_file_restored: The document has been successfully restored
|
||||
@ -320,17 +315,20 @@ sl:
|
||||
notice_dmsf_link_restored: The link has been successfully restored
|
||||
title_restore_checked: Restore checked
|
||||
error_parent_folder: "The parent folder doesn't exist"
|
||||
|
||||
|
||||
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_resource_locked: Unable to complete lock - resource is locked
|
||||
error_lock_exclusively: unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
my:
|
||||
blocks:
|
||||
locked_documents: Locked documents
|
||||
open_approvals: Open approvals
|
||||
|
||||
error_lock_exclusively: Unable to lock exclusively an already-locked resource
|
||||
error_unlock_parent_locked: Unlock failed - resource parent is locked
|
||||
|
||||
field_dmsf_tree_view: Navigate folders in a tree
|
||||
label_dmsf_version: Verzija
|
||||
|
||||
locked_documents: Locked documents
|
||||
open_approvals: Open approvals
|
||||
|
||||
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"
|
||||
|
||||