From e6413454e0cc76383b4cd7db6b4ffb6cb8bb781d Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Mon, 22 Jun 2020 10:07:44 +0200 Subject: [PATCH 01/18] Edit must be enabled if the document is unlockable --- app/views/dmsf_context_menus/_file.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/dmsf_context_menus/_file.html.erb b/app/views/dmsf_context_menus/_file.html.erb index f94169d8..5cf5c158 100644 --- a/app/views/dmsf_context_menus/_file.html.erb +++ b/app/views/dmsf_context_menus/_file.html.erb @@ -22,7 +22,7 @@
  • <%= context_menu_link l(:button_edit), dmsf_file_path(id: dmsf_file), class: 'icon icon-edit', - disabled: !allowed || locked %> + disabled: !allowed || (locked && !unlockable) %>
  • <%= link_to "#{l(:button_copy)}/#{l(:button_move)}", copy_file_path(id: dmsf_file), From 35b048df2653258c38d997509360422e245aa1e9 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Mon, 22 Jun 2020 10:40:24 +0200 Subject: [PATCH 02/18] Title shows up in 'order by' clause multiple times #1138 --- app/models/dmsf_query.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index 963679dd..3db5acd8 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -132,7 +132,7 @@ class DmsfQuery < Query # New def dmsf_nodes(options={}) - order_option = ['sort', group_by_sort_order, (options[:order] || sort_clause[0]), 'title'].flatten.reject(&:blank?) + order_option = ['sort', group_by_sort_order, (options[:order] || sort_clause[0])].flatten.reject(&:blank?) if order_option.size > 2 DmsfFileRevisionCustomField.visible.pluck(:id, :name).each do |id, name| order_option[1].gsub!("COALESCE(cf_#{id}.value, '')", "\"#{name}\"") From 77edf02671bc5a04ca5d6afed46dab4778f44f87 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Mon, 22 Jun 2020 13:54:21 +0200 Subject: [PATCH 03/18] Migration 2.4.2 -> 2020-06-17 commits: Error 500 when attempting to modify a document #1139 --- app/models/dmsf_file_revision_access_query.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/dmsf_file_revision_access_query.rb b/app/models/dmsf_file_revision_access_query.rb index 515ce693..49174b92 100644 --- a/app/models/dmsf_file_revision_access_query.rb +++ b/app/models/dmsf_file_revision_access_query.rb @@ -35,7 +35,7 @@ class DmsfFileRevisionAccessQuery < Query QueryColumn.new(:last_at, frozen: true) ] - def initialize(attributes) + def initialize(attributes=nil, *args) super attributes self.sort_criteria = [] self.filters = {} From dc165f0a28a9efe7c012812ec706165337a9d209 Mon Sep 17 00:00:00 2001 From: pavel Date: Tue, 23 Jun 2020 18:54:19 +0200 Subject: [PATCH 04/18] restore minimum Redmine version to 4.0 --- .travis.yml | 3 +++ README.md | 4 ++-- init.rb | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 012dc77d..47f092e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,6 +49,9 @@ after_script: - bash -x ./test/ci/redmine_install.sh -u env: + - DB=sqlite REDMINE_GIT_TAG=4.0-stable + - DB=mysql REDMINE_GIT_TAG=4.0-stable + - DB=postgres REDMINE_GIT_TAG=4.0-stable - DB=sqlite REDMINE_GIT_TAG=4.1-stable - DB=mysql REDMINE_GIT_TAG=4.1-stable - DB=postgres REDMINE_GIT_TAG=4.1-stable diff --git a/README.md b/README.md index 9f14c2bd..6f411133 100644 --- a/README.md +++ b/README.md @@ -36,12 +36,12 @@ Features * Documents and folders symbolic links * Trash bin * Documents attachable to issues - * Compatible with Redmine 4.1.x + * Compatible with Redmine 4.0.x and 4.1.x Dependencies ------------ - * Redmine 4.1.0 or higher + * Redmine 4.0.0 or higher ### Full-text search (optional) diff --git a/init.rb b/init.rb index c3ae7d8a..c329ec42 100644 --- a/init.rb +++ b/init.rb @@ -35,7 +35,7 @@ Redmine::Plugin.register :redmine_dmsf do description 'Document Management System Features' version '2.4.3' - requires_redmine version_or_higher: '4.1.0' + requires_redmine version_or_higher: '4.0.0' settings partial: 'settings/dmsf_settings', default: { From 52fbc8dea6be6fc1669515b1e5b5651a5e6550ad Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Wed, 24 Jun 2020 10:30:52 +0200 Subject: [PATCH 05/18] #1131 Wrong plugins migration command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f411133..eac0c981 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,7 @@ You can either clone the master branch or download the latest zipped version. Be `RAILS_ENV=production bundle exec rake db:migrate` - `RAILS_ENV=production bundle exec rake plugins:migrate NAME=redmine_dmsf` + `RAILS_ENV=production bundle exec rake redmine:plugins:migrate NAME=redmine_dmsf` 5. The access rights must be set for web server, example: `chown -R www-data:www-data plugins/redmine_dmsf`. 6. Restart the web server, e.g. `systemctl apache2 restart` 7. You should configure the plugin via Redmine interface: Administration -> Plugins -> DMSF -> Configure. From 1c220b7e66a8882fe7f74a1e3ae994b938a2bb84 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Wed, 24 Jun 2020 10:46:28 +0200 Subject: [PATCH 06/18] New Error 500 when attempting to modify a document #1140 --- app/models/dmsf_file_revision_access_query.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/models/dmsf_file_revision_access_query.rb b/app/models/dmsf_file_revision_access_query.rb index 49174b92..5f9fe8a0 100644 --- a/app/models/dmsf_file_revision_access_query.rb +++ b/app/models/dmsf_file_revision_access_query.rb @@ -73,8 +73,6 @@ class DmsfFileRevisionAccessQuery < Query @available_columns end - #alias default_columns_names available_columns - ###################################################################################################################### # New @@ -82,7 +80,7 @@ class DmsfFileRevisionAccessQuery < Query base_scope. access_grouped. joins(:user). - order('`count` DESC'). + order(Arel.sql('COUNT(*) DESC')). limit(options[:limit]). offset(options[:offset]) end From 5cf19e85f6bc829d18813e4f1341cfff7c7fb31a Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Wed, 24 Jun 2020 13:30:51 +0200 Subject: [PATCH 07/18] Wrong pagination of document's revisions --- app/controllers/dmsf_files_controller.rb | 3 ++- app/views/dmsf_files/_revision_access.html.erb | 1 - app/views/dmsf_files/show.html.erb | 10 ++-------- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/app/controllers/dmsf_files_controller.rb b/app/controllers/dmsf_files_controller.rb index a988bc09..b12e138a 100644 --- a/app/controllers/dmsf_files_controller.rb +++ b/app/controllers/dmsf_files_controller.rb @@ -85,7 +85,8 @@ class DmsfFilesController < ApplicationController @revision = @file.last_revision @file_delete_allowed = User.current.allowed_to?(:file_delete, @project) @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'] + @revision_count = @file.dmsf_file_revisions.visible.all.size + @revision_pages = Paginator.new @revision_count, params['per_page'] ? params['per_page'].to_i : 25, params['page'] respond_to do |format| format.html { diff --git a/app/views/dmsf_files/_revision_access.html.erb b/app/views/dmsf_files/_revision_access.html.erb index 937297cf..92bcbe5f 100644 --- a/app/views/dmsf_files/_revision_access.html.erb +++ b/app/views/dmsf_files/_revision_access.html.erb @@ -44,4 +44,3 @@ -<%= pagination_links_full revision_access_pages, revision_access_count %> diff --git a/app/views/dmsf_files/show.html.erb b/app/views/dmsf_files/show.html.erb index e0e7a9d5..4ace6ff5 100644 --- a/app/views/dmsf_files/show.html.erb +++ b/app/views/dmsf_files/show.html.erb @@ -158,20 +158,14 @@ <% if @file_manipulation_allowed %> <% revision_access_query = DmsfFileRevisionAccessQuery.new %> <% revision_access_query.revision_id = revision.id %> - <% revision_access_count = revision_access_query.access_count %> - <% revision_access_pages = Redmine::Pagination::Paginator.new revision_access_count, - Setting.per_page_options_array.first || 25, params['page'] %> - <%= render partial: 'revision_access', locals: { revision: revision, query: revision_access_query, - revision_access_count: revision_access_count, - revision_access_pages: revision_access_pages } %> + <%= render partial: 'revision_access', locals: { revision: revision, query: revision_access_query } %> <% end %>
    <% end %> - -<%= pagination_links_full @revision_pages, @file.dmsf_file_revisions.visible.count %> +<%= pagination_links_full @revision_pages, @revision_count %> <%= late_javascript_tag do %> $('a.delete-revision').click(function(event) { From bee5ab4340dc8e8f8a49de951b10f9be392fb111 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Thu, 25 Jun 2020 10:27:14 +0200 Subject: [PATCH 08/18] #1142 Emails are not sent to the author if no_self_notified --- app/models/dmsf_mailer.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/models/dmsf_mailer.rb b/app/models/dmsf_mailer.rb index 5e4b2657..9e0e4a4c 100644 --- a/app/models/dmsf_mailer.rb +++ b/app/models/dmsf_mailer.rb @@ -91,8 +91,21 @@ class DmsfMailer < Mailer Rails.logger.error "Cannot attach #{email_params[:zipped_content]}, it doesn't exist." end end - mail to: email_params[:to], cc: email_params[:cc], subject: email_params[:subject], 'From' => email_params[:from], - 'Reply-To' => email_params[:reply_to] + skip_no_self_notified = false + begin + # We need to switch off no_self_notified temporarily otherwise the email won't be sent + if (author == User.current) && author.pref.no_self_notified + author.pref.no_self_notified = false + skip_no_self_notified = true + end + res = mail(to: email_params[:to], cc: email_params[:cc], subject: email_params[:subject], 'From' => email_params[:from], + 'Reply-To' => email_params[:reply_to]) + ensure + if skip_no_self_notified + author.pref.no_self_notified = true + end + end + res end def self.deliver_workflow_notification(users, workflow, revision, subject_id, text1_id, text2_id, notice = nil) From a4a00828d12f5d7a2b9000f7d259a654f25021fe Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Thu, 25 Jun 2020 15:26:34 +0200 Subject: [PATCH 09/18] New folder icon --- app/models/dmsf_upload.rb | 4 ++-- test/functional/dmsf_controller_test.rb | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/models/dmsf_upload.rb b/app/models/dmsf_upload.rb index 50237f6e..9b851ffb 100644 --- a/app/models/dmsf_upload.rb +++ b/app/models/dmsf_upload.rb @@ -41,7 +41,7 @@ class DmsfUpload end def self.create_from_uploaded_attachment(project, folder, uploaded_file) - a = Attachment.find_by_token(uploaded_file[:token]) + a = Attachment.find_by_token(uploaded_file[:token]) if uploaded_file[:token].present? if a uploaded = { disk_filename: DmsfHelper.temp_filename(a.filename), @@ -50,7 +50,7 @@ class DmsfUpload comment: uploaded_file[:description], tempfile_path: a.diskfile } - DmsfUpload.new(project, folder, uploaded) + DmsfUpload.new project, folder, uploaded else Rails.logger.error "An attachment not found by its token: #{uploaded_file[:token]}" nil diff --git a/test/functional/dmsf_controller_test.rb b/test/functional/dmsf_controller_test.rb index deb4ae6c..eb4a314e 100644 --- a/test/functional/dmsf_controller_test.rb +++ b/test/functional/dmsf_controller_test.rb @@ -219,10 +219,13 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase @role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_folders @role.add_permission! :file_manipulation + @role.add_permission! :folder_manipulation get :show, params: { id: @project.id } assert_response :success # New file link assert_select 'a[href$=?]', '/dmsf/upload/multi_upload' + # New folder link + assert_select 'a[href$=?]', '/dmsf/new' # Filters assert_select 'fieldset#filters' # Options From f4d35a8a505608f1003713e3f0f2a19c528435e6 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 26 Jun 2020 12:40:13 +0200 Subject: [PATCH 10/18] Document's filtering in sub-folders --- app/models/dmsf_query.rb | 63 +++++++++++++++++------------------- app/views/dmsf/show.html.erb | 1 + 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index 963679dd..66f709aa 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -82,6 +82,7 @@ class DmsfQuery < Query def base_scope unless @scope + statement # We need statement before scope due to the current folder filtering @scope = [dmsf_folders_scope, dmsf_folder_links_scope, dmsf_files_scope, dmsf_file_links_scope, dmsf_url_links_scope]. inject(:union_all) end @@ -110,14 +111,16 @@ class DmsfQuery < Query def statement unless @statement + @filter_dmsf_folder_id = false filters_clauses = [] filters.each_key do |field| v = values_for(field).clone next unless v and !v.empty? operator = operator_for(field) - if field == 'author' + case field + when 'author' if v.delete('me') - v.push User.current.id.to_s + v.push User.current.id.to_s end end filters_clauses << '(' + sql_for_field(field, operator, v, queried_table_name, field) + ')' @@ -183,13 +186,11 @@ class DmsfQuery < Query 0 AS sort #{cf_columns}}). joins('LEFT JOIN users ON dmsf_folders.user_id = users.id'). visible(!deleted) - if deleted - scope.where dmsf_folders: { project_id: project.id, deleted: deleted } + if dmsf_folder_id + scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? + if filters.any? || deleted scope.where dmsf_folders: { project_id: project.id, deleted: deleted } - elsif dmsf_folder_id - scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id, deleted: deleted } else scope.where dmsf_folders: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted } end @@ -224,13 +225,11 @@ class DmsfQuery < Query 0 AS sort #{cf_columns}}). joins('LEFT JOIN dmsf_folders ON dmsf_links.target_id = dmsf_folders.id'). joins('LEFT JOIN users ON users.id = COALESCE(dmsf_folders.user_id, dmsf_links.user_id)') - if deleted - scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, deleted: deleted } + if dmsf_folder_id + scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? + if filters.any? || deleted scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, deleted: deleted } - elsif dmsf_folder_id - scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id, deleted: deleted } else scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, dmsf_folder_id: nil, deleted: deleted } end @@ -266,17 +265,15 @@ class DmsfQuery < Query joins(:dmsf_file_revisions). joins('LEFT JOIN users ON dmsf_file_revisions.user_id = users.id '). where('dmsf_file_revisions.created_at = (SELECT MAX(r.created_at) FROM dmsf_file_revisions r WHERE r.dmsf_file_id = dmsf_file_revisions.dmsf_file_id)') - if deleted - scope.where dmsf_files: { project_id: project.id, deleted: deleted } - else - if filters.any? - scope.where dmsf_files: { project_id: project.id, deleted: deleted } - elsif dmsf_folder_id + if dmsf_folder_id scope.where dmsf_files: { dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - scope.where dmsf_files: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted } + if filters.any? || deleted + scope.where dmsf_files: { project_id: project.id, deleted: deleted } + else + scope.where dmsf_files: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted } + end end - end end def dmsf_file_links_scope @@ -309,17 +306,16 @@ class DmsfQuery < Query joins('JOIN dmsf_file_revisions ON dmsf_file_revisions.dmsf_file_id = dmsf_files.id'). joins('LEFT JOIN users ON dmsf_file_revisions.user_id = users.id '). where('dmsf_file_revisions.created_at = (SELECT MAX(r.created_at) FROM dmsf_file_revisions r WHERE r.dmsf_file_id = dmsf_file_revisions.dmsf_file_id)') - if deleted - scope.where project_id: project.id, deleted: deleted + if dmsf_folder_id + scope.where dmsf_links: { target_type: 'DmsfFile', dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? - scope.where project_id: project.id, deleted: deleted - elsif dmsf_folder_id - scope.where dmsf_folder_id: dmsf_folder_id, deleted: deleted + if filters.any? || deleted + scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id, deleted: deleted } else - scope.where project_id: project.id, dmsf_folder_id: nil, deleted: deleted + scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id, dmsf_folder_id: nil, deleted: deleted } end end + end def dmsf_url_links_scope @@ -349,17 +345,16 @@ class DmsfQuery < Query dmsf_links.deleted AS deleted, 1 AS sort #{cf_columns}}). joins('LEFT JOIN users ON dmsf_links.user_id = users.id ') - if deleted - scope.where target_type: 'DmsfUrl', project_id: project.id, deleted: deleted + if dmsf_folder_id + scope.where dmsf_links: { target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? - scope.where target_type: 'DmsfUrl', project_id: project.id, deleted: deleted - elsif dmsf_folder_id - scope.where target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id, deleted: deleted + if filters.any? || deleted + scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id, deleted: deleted } else - scope.where target_type: 'DmsfUrl', project_id: project.id, dmsf_folder_id: nil, deleted: deleted + scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id, dmsf_folder_id: nil, deleted: deleted } end end + end end diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index bf6ec323..21609a6c 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -72,6 +72,7 @@ <%= form_tag(dmsf_folder_path(id: @project, folder_id: @folder), method: :get, id: 'query_form', class: 'dmsf-query-form') do %> + <%= hidden_field_tag('folder_id', @folder.id) if @folder %> <%= render partial: 'queries/query_form' %> <% end %> <%= render partial: 'query_list', locals: { query: @query, dmsf_pages: @dmsf_pages } %> From d6fd3e1e1ea3c6dd103e6df169e51d7811dbda4a Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 26 Jun 2020 13:37:41 +0200 Subject: [PATCH 11/18] Title as a default filter --- app/models/dmsf_query.rb | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index cbc0a856..709d7cce 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -41,7 +41,7 @@ class DmsfQuery < Query def initialize(attributes=nil, *args) super attributes self.sort_criteria = [] - self.filters = {} + self.filters ||= { 'title' => { operator: '~', values: ['']} } end ###################################################################################################################### @@ -82,7 +82,6 @@ class DmsfQuery < Query def base_scope unless @scope - statement # We need statement before scope due to the current folder filtering @scope = [dmsf_folders_scope, dmsf_folder_links_scope, dmsf_files_scope, dmsf_file_links_scope, dmsf_url_links_scope]. inject(:union_all) end @@ -122,6 +121,8 @@ class DmsfQuery < Query if v.delete('me') v.push User.current.id.to_s end + when 'title' + next if v.include?('') end filters_clauses << '(' + sql_for_field(field, operator, v, queried_table_name, field) + ')' end @@ -160,7 +161,7 @@ class DmsfQuery < Query def dmsf_folders_scope cf_columns = +'' - if filters.any? + if statement.present? DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id| cf_columns << ",(SELECT value from custom_values WHERE custom_field_id = #{id} AND customized_type = 'DmsfFolder' AND customized_id = dmsf_folders.id) AS cf_#{id}" end @@ -189,7 +190,7 @@ class DmsfQuery < Query if dmsf_folder_id scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? || deleted + if statement.present? || deleted scope.where dmsf_folders: { project_id: project.id, deleted: deleted } else scope.where dmsf_folders: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted } @@ -199,7 +200,7 @@ class DmsfQuery < Query def dmsf_folder_links_scope cf_columns = +'' - if filters.any? + if statement.present? DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id| cf_columns << ",(SELECT value from custom_values WHERE custom_field_id = #{id} AND customized_type = 'DmsfFolder' AND customized_id = dmsf_folders.id) AS cf_#{id}" end @@ -228,7 +229,7 @@ class DmsfQuery < Query if dmsf_folder_id scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? || deleted + if statement.present? || deleted scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, deleted: deleted } else scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, dmsf_folder_id: nil, deleted: deleted } @@ -238,7 +239,7 @@ class DmsfQuery < Query def dmsf_files_scope cf_columns = +'' - if filters.any? + if statement.present? DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id| cf_columns << ",(SELECT value from custom_values WHERE custom_field_id = #{id} AND customized_type = 'DmsfFileRevision' AND customized_id = dmsf_file_revisions.id) AS cf_#{id}" end @@ -268,7 +269,7 @@ class DmsfQuery < Query if dmsf_folder_id scope.where dmsf_files: { dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? || deleted + if statement.present? || deleted scope.where dmsf_files: { project_id: project.id, deleted: deleted } else scope.where dmsf_files: { project_id: project.id, dmsf_folder_id: nil, deleted: deleted } @@ -278,7 +279,7 @@ class DmsfQuery < Query def dmsf_file_links_scope cf_columns = +'' - if filters.any? + if statement.present? DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id| cf_columns << ",(SELECT value from custom_values WHERE custom_field_id = #{id} AND customized_type = 'DmsfFileRevision' AND customized_id = dmsf_file_revisions.id) AS cf_#{id}" end @@ -309,7 +310,7 @@ class DmsfQuery < Query if dmsf_folder_id scope.where dmsf_links: { target_type: 'DmsfFile', dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? || deleted + if statement.present? || deleted scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id, deleted: deleted } else scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id, dmsf_folder_id: nil, deleted: deleted } @@ -320,7 +321,7 @@ class DmsfQuery < Query def dmsf_url_links_scope cf_columns = +'' - if filters.any? + if statement.present? DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id| cf_columns << ",NULL AS cf_#{id}" end @@ -348,7 +349,7 @@ class DmsfQuery < Query if dmsf_folder_id scope.where dmsf_links: { target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id, deleted: deleted } else - if filters.any? || deleted + if statement.present? || deleted scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id, deleted: deleted } else scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id, dmsf_folder_id: nil, deleted: deleted } From dce885c8d2d6d6469584144f9e039b79bdf754e6 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 10 Jul 2020 08:58:35 +0200 Subject: [PATCH 12/18] Filters validation added --- app/controllers/dmsf_controller.rb | 36 ++++++++++++++++++++---------- app/models/dmsf_query.rb | 6 +++++ app/views/dmsf/show.html.erb | 10 +++++++-- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 45e70e15..b4a462b9 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -69,18 +69,30 @@ class DmsfController < ApplicationController render_404 return end - respond_to do |format| - format.html { - @dmsf_count = @query.dmsf_count - @dmsf_pages = Paginator.new @dmsf_count, per_page_option, params['page'] - render layout: !request.xhr? - } - format.api { - @offset, @limit = api_offset_and_limit - } - format.csv { - send_data query_to_csv(@query.dmsf_nodes, @query), type: 'text/csv; header=present', filename: 'dmsf.csv' - } + if @query.valid? + respond_to do |format| + format.html { + @dmsf_count = @query.dmsf_count + @dmsf_pages = Paginator.new @dmsf_count, per_page_option, params['page'] + render layout: !request.xhr? + } + format.api { + @offset, @limit = api_offset_and_limit + } + format.csv { + send_data query_to_csv(@query.dmsf_nodes, @query), type: 'text/csv; header=present', filename: 'dmsf.csv' + } + end + else + respond_to do |format| + format.html { + @dmsf_count = 0 + @dmsf_pages = Paginator.new @dmsf_count, per_page_option, params['page'] + render layout: !request.xhr? + } + format.any(:atom, :csv, :pdf) { head 422 } + format.api { render_validation_errors(@query) } + end end end diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index 709d7cce..3e8eff9e 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -132,6 +132,12 @@ class DmsfQuery < Query @statement end + def validate_query_filters + # Skip validation for empty title (default filter) + filters.delete('title') + super + end + ###################################################################################################################### # New diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index 21609a6c..152ff335 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -75,8 +75,14 @@ <%= hidden_field_tag('folder_id', @folder.id) if @folder %> <%= render partial: 'queries/query_form' %> <% end %> -<%= render partial: 'query_list', locals: { query: @query, dmsf_pages: @dmsf_pages } %> -<%= pagination_links_full @dmsf_pages, @dmsf_count %> +<% if @query.valid? %> + <% if @dmsf_count == 0 %> +

    <%= l(:label_no_data) %>

    + <% else %> + <%= render partial: 'query_list', locals: { query: @query, dmsf_pages: @dmsf_pages } %> + <%= pagination_links_full @dmsf_pages, @dmsf_count %> + <% end %> +<% end %> <%= context_menu %> From 4d663cac6f6cc7a0058c59a1654b5d231af69ed6 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 10 Jul 2020 09:28:16 +0200 Subject: [PATCH 13/18] Title as a default filter --- app/models/dmsf_query.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index 3e8eff9e..eddea300 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -41,7 +41,7 @@ class DmsfQuery < Query def initialize(attributes=nil, *args) super attributes self.sort_criteria = [] - self.filters ||= { 'title' => { operator: '~', values: ['']} } + #self.filters ||= { 'title' => { operator: '~', values: ['']} } end ###################################################################################################################### @@ -134,8 +134,10 @@ class DmsfQuery < Query def validate_query_filters # Skip validation for empty title (default filter) - filters.delete('title') + filter = filters.delete('title') super + # Add it back + filters['title'] = filter if filter end ###################################################################################################################### From 45966f9bf3c99394b50270161df9a33b724bbf1c Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 10 Jul 2020 09:29:25 +0200 Subject: [PATCH 14/18] Title as a default filter --- app/models/dmsf_query.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/dmsf_query.rb b/app/models/dmsf_query.rb index eddea300..3c4dd9a4 100644 --- a/app/models/dmsf_query.rb +++ b/app/models/dmsf_query.rb @@ -41,7 +41,7 @@ class DmsfQuery < Query def initialize(attributes=nil, *args) super attributes self.sort_criteria = [] - #self.filters ||= { 'title' => { operator: '~', values: ['']} } + self.filters ||= { 'title' => { operator: '~', values: ['']} } end ###################################################################################################################### From 62182d5c35a7f5641b036a9b300a1a7f465f8f93 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 10 Jul 2020 09:59:27 +0200 Subject: [PATCH 15/18] Title as a default filter --- assets/stylesheets/easy_extensions.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/assets/stylesheets/easy_extensions.css b/assets/stylesheets/easy_extensions.css index 1def596f..2d62f73f 100644 --- a/assets/stylesheets/easy_extensions.css +++ b/assets/stylesheets/easy_extensions.css @@ -65,3 +65,13 @@ table.dmsf a.sort.asc.icon.icon-sorted-desc { #query_form.dmsf-query-form .collapsed#filters { opacity: 1; } + +#query_form.dmsf-query-form .add-filter { + float: right; + text-align: right; + vertical-align: top; +} + +#query_form.dmsf-query-form td.values span:first-child { + display: inline !important; +} From 2384ff7cf73923ebaac875135b2702e2b4205e4c Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 10 Jul 2020 13:55:03 +0200 Subject: [PATCH 16/18] jQuery conflict in Easy --- app/views/dmsf/show.html.erb | 6 +- app/views/dmsf_queries/_query_form.html.erb | 89 +++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 app/views/dmsf_queries/_query_form.html.erb diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index 152ff335..a2c32198 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -73,7 +73,11 @@ <%= form_tag(dmsf_folder_path(id: @project, folder_id: @folder), method: :get, id: 'query_form', class: 'dmsf-query-form') do %> <%= hidden_field_tag('folder_id', @folder.id) if @folder %> - <%= render partial: 'queries/query_form' %> + <% if defined?(EasyExtensions) %> + <%= render partial: 'dmsf_queries/query_form' %> + <% else %> + <%= render partial: 'queries/query_form' %> + <% end %> <% end %> <% if @query.valid? %> <% if @dmsf_count == 0 %> diff --git a/app/views/dmsf_queries/_query_form.html.erb b/app/views/dmsf_queries/_query_form.html.erb new file mode 100644 index 00000000..67fe0abd --- /dev/null +++ b/app/views/dmsf_queries/_query_form.html.erb @@ -0,0 +1,89 @@ +<%= hidden_field_tag 'set_filter', '1' %> +<%= hidden_field_tag 'type', @query.type, :disabled => true, :id => 'query_type' %> +<%= query_hidden_sort_tag(@query) %> + +
    +
    +
    "> + "><%= l(:label_filter_plural) %> +
    "> + <%= render :partial => 'queries/filters', :locals => {:query => @query} %> +
    +
    + + <% if @query.available_columns.any? %> + + <% end %> +
    + +

    + <%= link_to_function l(:button_apply), '$("#query_form").submit()', :class => 'icon icon-checked' %> + <%= link_to l(:button_clear), { :set_filter => 1, :sort => '', :project_id => @project }, :class => 'icon icon-reload' %> + <% if @query.new_record? %> + <% if User.current.allowed_to?(:save_queries, @project, :global => true) %> + <%= link_to_function l(:button_save), + "$('#query_type').prop('disabled',false);$('#query_form').attr('action', '#{ @project ? new_project_query_path(@project) : new_query_path }').submit()", + :class => 'icon icon-save' %> + <% end %> + <% else %> + <% if @query.editable_by?(User.current) %> + <%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> + <%= delete_link query_path(@query) %> + <% end %> + <% end %> +

    +
    + +<%= error_messages_for @query %> +<%# DMS modification do %> +<%#= javascript_tag do %> +<%= late_javascript_tag do %> +<%# end %> +$(function ($) { + $('input[name=display_type]').change(function (e) { + if ($("#display_type_list").is(':checked')) { + $('table#list-definition').show(); + } else { + $('table#list-definition').hide(); + } + + }) +}); + +<% end %> From 58667655648b58006f5b874902ed9e40fb199283 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 10 Jul 2020 14:30:02 +0200 Subject: [PATCH 17/18] #1144 Who has locked the document --- app/models/dmsf_file.rb | 10 ++++++++++ app/views/dmsf_context_menus/_file.html.erb | 1 + config/locales/cs.yml | 1 - config/locales/de.yml | 1 - config/locales/en.yml | 1 - config/locales/es.yml | 1 - config/locales/fr.yml | 1 - config/locales/hu.yml | 1 - config/locales/it.yml | 1 - config/locales/ja.yml | 1 - config/locales/ko.yml | 1 - config/locales/nl.yml | 1 - config/locales/pl.yml | 1 - config/locales/pt-BR.yml | 1 - config/locales/ru.yml | 1 - config/locales/sl.yml | 1 - config/locales/zh-TW.yml | 1 - config/locales/zh.yml | 1 - test/unit/dmsf_file_test.rb | 7 +++++++ 19 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index 424125ed..2dd09089 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -128,6 +128,16 @@ class DmsfFile < ActiveRecord::Base deleted == STATUS_DELETED end + def locked_by + if lock && lock.reverse[0] + user = lock.reverse[0].user + if user + return (user == User.current) ? l(:label_me) : user.name + end + end + '' + end + def delete(commit) if locked_for_user? && (!User.current.allowed_to?(:force_file_unlock, project)) Rails.logger.info l(:error_file_is_locked) diff --git a/app/views/dmsf_context_menus/_file.html.erb b/app/views/dmsf_context_menus/_file.html.erb index 5cf5c158..1f0a738e 100644 --- a/app/views/dmsf_context_menus/_file.html.erb +++ b/app/views/dmsf_context_menus/_file.html.erb @@ -40,6 +40,7 @@
  • <% if locked %> <%= context_menu_link l(:button_unlock), unlock_dmsf_files_path(id: dmsf_file), class: 'icon icon-unlock', + title: l(:title_locked_by_user, user: dmsf_file.locked_by), disabled: !allowed || !unlockable %> <% else %> <%= context_menu_link l(:button_lock), lock_dmsf_files_path(id: dmsf_file), class: 'icon icon-lock', diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 3173acc5..415fe0a5 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -80,7 +80,6 @@ cs: title_notifications_not_active_activate: "Notifikace nejsou aktivní: Aktivovat" title_title_version_version_download: "%{title} verze %{version} stáhnout" title_locked_by_user: "Zamčeno uživatelem %{user}" - title_locked_by_you: Zamčeno Vámi 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 diff --git a/config/locales/de.yml b/config/locales/de.yml index c60dfe0c..e82a2cc9 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -80,7 +80,6 @@ de: title_notifications_not_active_activate: "Benachrichtigungen sind nicht aktiv: Einschalten" title_title_version_version_download: "%{title} Version %{version} Download" title_locked_by_user: "Gesperrt von %{user}" - title_locked_by_you: Gesperrt von dir title_waiting_for_approval: Warte auf Zustimmung title_approved: Zugestimmt title_unlock_file: Hebe Sperre auf um Änderungen anderer Nutzer zu ermöglichen diff --git a/config/locales/en.yml b/config/locales/en.yml index 7fcd9bb5..cfd232b7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -80,7 +80,6 @@ en: title_notifications_not_active_activate: "Notifications not active: Activate" title_title_version_version_download: "%{title} version %{version} download" title_locked_by_user: "Locked by %{user}" - title_locked_by_you: Locked by you title_waiting_for_approval: Waiting for Approval title_approved: Approved title_unlock_file: Unlock to allow changes for other members diff --git a/config/locales/es.yml b/config/locales/es.yml index 28e4f4db..d00777d5 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -80,7 +80,6 @@ es: title_notifications_not_active_activate: "Notificacciones No Activas: Activadas" title_title_version_version_download: "%{title} version %{version} descargar" title_locked_by_user: "bloqueado por %{user}" - title_locked_by_you: Bloqueado por ti title_waiting_for_approval: Esperando Aprobación title_approved: Aprobado title_unlock_file: Desbloquear para que otros miembros puedan editarlo diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 4f0ae963..089e20e9 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -80,7 +80,6 @@ fr: title_notifications_not_active_activate: "Notifications désactivées : cliquer pour activer" title_title_version_version_download: "Télécharger la version %{version} de %{title}" title_locked_by_user: "Verrouillé par %{user}" - title_locked_by_you: Verrouillé par vous-même 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 diff --git a/config/locales/hu.yml b/config/locales/hu.yml index d04b9faa..5c8561f9 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -80,7 +80,6 @@ hu: title_notifications_not_active_activate: "Értesítések nincsnek bekapcsolva: Bekapcsolás" title_title_version_version_download: "%{title} verzió %{version} letöltés" title_locked_by_user: "Zárolva %{user}" - title_locked_by_you: Ön zárolta title_waiting_for_approval: Elfogadásra vár title_approved: Elfogadva title_unlock_file: Zárolás megszüntetése, hogy más felhasználók is változtatni tudjanak diff --git a/config/locales/it.yml b/config/locales/it.yml index 7e2841aa..6d0befa2 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -80,7 +80,6 @@ it: # Italian strings thx 2 Matteo Arceci! 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 diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 87f26c59..29f68af5 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -80,7 +80,6 @@ ja: title_notifications_not_active_activate: "通知は無効です: 有効にする" title_title_version_version_download: "%{title} のバージョン %{version} をダウンロードする" title_locked_by_user: "%{user} によってロックされています" - title_locked_by_you: あなたがロックしています title_waiting_for_approval: 承認待ち title_approved: 承認済み title_unlock_file: ロック解除して他のメンバーの変更を許可する diff --git a/config/locales/ko.yml b/config/locales/ko.yml index e5add1cb..74e69c17 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -80,7 +80,6 @@ ko: title_notifications_not_active_activate: "알림 비활성화: 활성화" title_title_version_version_download: "%{title} 버전 %{version} 다운로드" title_locked_by_user: "%{user} 에 의해 잠겨짐" - title_locked_by_you: 사용자에 의해 잠겨짐 title_waiting_for_approval: 승인을 기다리는 중 title_approved: 승인됨 title_unlock_file: 다른 구성원들의 변경 허가 잠금 해제 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index a063bb10..e24946be 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -80,7 +80,6 @@ nl: title_notifications_not_active_activate: "Notificaties niet actief: Activeren" title_title_version_version_download: "%{title} versie %{version} downloaden" title_locked_by_user: "Vergrendeld door %{user}" - title_locked_by_you: Vergrendeld door u title_waiting_for_approval: Wacht op goedkeuring title_approved: Goedgekeurd title_unlock_file: Ontgrendel om wijzigingen door andere leden toe te staan diff --git a/config/locales/pl.yml b/config/locales/pl.yml index ff02980d..6d3b4155 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -80,7 +80,6 @@ pl: title_notifications_not_active_activate: "Powiadomienia wyłączone: Aktywuj" title_title_version_version_download: "pobierz %{title} wersja %{version}" title_locked_by_user: "Zablokowany przez %{user}" - title_locked_by_you: Zablokowany przez Ciebie title_waiting_for_approval: Oczekiwanie na akceptację title_approved: Zaakceptowany title_unlock_file: Odblokuj aby umożliwić wprowadzanie zmian innym użytkownikom diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index fa147da3..d5e01306 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -80,7 +80,6 @@ pt-BR: title_notifications_not_active_activate: "Notificações não ativas: Ativar" title_title_version_version_download: "%{title} revisão %{version} download" title_locked_by_user: "Bloqueado por %{user}" - title_locked_by_you: Bloqueado por você title_waiting_for_approval: Aguardando aprovação title_approved: Aprovado title_unlock_file: Clique aqui para permitir alterações por outro usuário diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 5aed298c..88cfae8c 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -80,7 +80,6 @@ ru: title_notifications_not_active_activate: "Уведомления не включены: Включить" title_title_version_version_download: "Скачать %{title} редакции %{version}" title_locked_by_user: "Заблокировано пользователем %{user}" - title_locked_by_you: Заблокировано Вами title_waiting_for_approval: Ожидается утверждение title_approved: Утверждено title_unlock_file: Разблокируйте файл, чтобы разрешить его изменение другими участниками diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 8a8a9c5a..93ebde3d 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -80,7 +80,6 @@ sl: title_notifications_not_active_activate: "Obveščanje ni aktivno: Aktiviraj" title_title_version_version_download: "%{title} verzija %{version} prenesi dol" title_locked_by_user: "Zaklenil %{user}" - title_locked_by_you: Zaklenili ste title_waiting_for_approval: V postopku odobritve title_approved: Odobreno title_unlock_file: Odkleni drugim članom za posodabljanje diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 8e06266f..180d727d 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -80,7 +80,6 @@ zh-TW: title_notifications_not_active_activate: "通知關閉中: 點擊啟用通知" title_title_version_version_download: " 版本: %{version} 檔案: %{title} 下載" title_locked_by_user: "被使用者%{user},鎖定了。" - title_locked_by_you: 被您鎖定了。 title_waiting_for_approval: 等待批准 title_approved: 已經被批准 title_unlock_file: 解除鎖定。允許其它使用者修改。 diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 601c24ed..8a475064 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -80,7 +80,6 @@ zh: title_notifications_not_active_activate: "通知无效:点击激活通知" title_title_version_version_download: " 下载‘%{title}’版本‘%{version}’" title_locked_by_user: "%{user}锁定" - title_locked_by_you: 您锁定 title_waiting_for_approval: 待批准 title_approved: 已批准 title_unlock_file: 解除锁定允许其他成员修改 diff --git a/test/unit/dmsf_file_test.rb b/test/unit/dmsf_file_test.rb index caf8afe4..af41b0e1 100644 --- a/test/unit/dmsf_file_test.rb +++ b/test/unit/dmsf_file_test.rb @@ -291,4 +291,11 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest assert @file7.assigned?(@jsmith) end + def test_locked_by + # Locked file + assert_equal @jsmith.name, @file2.locked_by + # Unlocked file + assert_equal '', @file1.locked_by + end + end \ No newline at end of file From d64d77dc44a3a19278212e5ad8399460260c6f3f Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 10 Jul 2020 14:39:01 +0200 Subject: [PATCH 18/18] DMSF v2.4.4 released --- CHANGELOG.md | 7 +++++-- README.md | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2bfe4d8..ceeeb0f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,13 @@ Changelog for Redmine DMSF ========================== -2.4.4 *????-??-??* +2.4.4 *2020-07-10* ------------------ - ? + Maintenance release + +* New: #1144 - Who has locked the document information is missing. +* Bug: #1142 - How to configure "Direct document or document link sending via email"? 2.4.3 *2020-06-12* ------------------ diff --git a/README.md b/README.md index 0fba59eb..da28f89a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Redmine DMSF Plugin =================== -The current version of Redmine DMSF is **2.4.4 devel** [![Build Status](https://api.travis-ci.org/danmunn/redmine_dmsf.png)](https://travis-ci.org/danmunn/redmine_dmsf) +The current version of Redmine DMSF is **2.4.4** [![Build Status](https://api.travis-ci.org/danmunn/redmine_dmsf.png)](https://travis-ci.org/danmunn/redmine_dmsf) Redmine DMSF is Document Management System Features plugin for Redmine issue tracking system; It is aimed to replace current Redmine's Documents module.