diff --git a/app/controllers/dmsf_context_menus_controller.rb b/app/controllers/dmsf_context_menus_controller.rb index fae07c70..09bdf172 100644 --- a/app/controllers/dmsf_context_menus_controller.rb +++ b/app/controllers/dmsf_context_menus_controller.rb @@ -39,8 +39,8 @@ class DmsfContextMenusController < ApplicationController @locked = @dmsf_folder.locked? @project = @dmsf_folder.project @allowed = User.current.allowed_to?(:folder_manipulation, @project) - @unlockable = @allowed && @dmsf_folder.unlockable? && (!@dmsf_folder.locked_for_user?) && - User.current.allowed_to?(:force_file_unlock, @project) + @unlockable = @allowed && @dmsf_folder.unlockable? && (!@dmsf_folder.locked_for_user? || + User.current.allowed_to?(:force_file_unlock, @project)) @email_allowed = User.current.allowed_to?(:email_documents, @project) elsif @dmsf_link # url link @locked = false diff --git a/lib/redmine_dmsf/lockable.rb b/lib/redmine_dmsf/lockable.rb index 82b00885..9d5b5561 100644 --- a/lib/redmine_dmsf/lockable.rb +++ b/lib/redmine_dmsf/lockable.rb @@ -82,7 +82,7 @@ module RedmineDmsf def unlockable? return false unless self.locked? existing = self.lock(true) - # If its empty its a folder that's locked (not root) + # If it's empty, it's a folder that's locked (not root) (existing.empty? || (self.dmsf_folder&.locked?)) ? false : true end diff --git a/test/functional/dmsf_context_menus_controller_test.rb b/test/functional/dmsf_context_menus_controller_test.rb index 24c7b25c..0670ef2e 100644 --- a/test/functional/dmsf_context_menus_controller_test.rb +++ b/test/functional/dmsf_context_menus_controller_test.rb @@ -216,6 +216,23 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase assert_select 'a.icon-del.disabled', text: l(:button_delete) end + def test_dmsf_folder_locked_force_unlock_permission_off + @request.session[:user_id] = @dlopper.id + get :dmsf, params: { id: @folder2.project.id, ids: ["folder-#{@folder2.id}"] } + assert_response :success + # @folder2 is locked by @jsmith, therefore @dlopper can't unlock it + assert_select 'a.icon-unlock.disabled', text: l(:button_unlock) + end + + def test_dmsf_folder_locked_force_unlock_permission_om + @request.session[:user_id] = @dlopper.id + @role_developer.add_permission! :force_file_unlock + get :dmsf, params: { id: @folder2.project.id, ids: ["folder-#{@folder2.id}"] } + assert_response :success + # @folder2 is locked by @jsmith, but @dlopper can unlock it + assert_select 'a.icon-unlock.disabled', text: l(:button_unlock), count: 0 + end + def test_dmsf_folder_notification_on @folder5.notify_activate get :dmsf, params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }