diff --git a/after_init.rb b/after_init.rb
index fb79f6a1..e20ceb59 100644
--- a/after_init.rb
+++ b/after_init.rb
@@ -91,6 +91,13 @@ def dmsf_init
:reorder_steps, :update, :update_step, :delete_step, :edit] }
pmap.permission :display_system_folders,
read: true
+ # Watchers
+ pmap.permission :view_dmsf_folder_watchers, {}, read: true
+ pmap.permission :add_dmsf_folder_watchers, { watchers: [:new, :create, :append, :autocomplete_for_user]}
+ pmap.permission :delete_dmsf_folder_watchers, { watchers: :destroy}
+ pmap.permission :view_project_watchers, {}, read: true
+ pmap.permission :add_project_watchers, { watchers: [:new, :create, :append, :autocomplete_for_user]}
+ pmap.permission :delete_project_watchers, { watchers: :destroy}
end
end
end
diff --git a/app/controllers/dmsf_context_menus_controller.rb b/app/controllers/dmsf_context_menus_controller.rb
index e97c7e7c..72d33bed 100644
--- a/app/controllers/dmsf_context_menus_controller.rb
+++ b/app/controllers/dmsf_context_menus_controller.rb
@@ -22,6 +22,7 @@
class DmsfContextMenusController < ApplicationController
helper :context_menus
+ helper :watchers
before_action :find_folder
before_action :find_dmsf_file
diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb
index eaee48c8..ed90e598 100644
--- a/app/controllers/dmsf_controller.rb
+++ b/app/controllers/dmsf_controller.rb
@@ -45,6 +45,7 @@ class DmsfController < ApplicationController
helper :dmsf_queries
include DmsfQueriesHelper
helper :context_menus
+ helper :watchers
def permissions
if !DmsfFolder.permissions?(@folder, false)
diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb
index 3a65a14d..d877eb5f 100644
--- a/app/models/dmsf_file.rb
+++ b/app/models/dmsf_file.rb
@@ -73,7 +73,7 @@ class DmsfFile < ActiveRecord::Base
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_watchable
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"
@@ -88,6 +88,9 @@ class DmsfFile < ActiveRecord::Base
def initialize(*args)
@project = nil
+ if new_record?
+ self.watcher_user_ids = []
+ end
super
end
diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb
index 49efd769..5a388747 100644
--- a/app/models/dmsf_folder.rb
+++ b/app/models/dmsf_folder.rb
@@ -78,13 +78,12 @@ class DmsfFolder < ActiveRecord::Base
scope :notsystem, -> { where(system: false) }
acts_as_customizable
-
acts_as_searchable columns: ["#{table_name}.title", "#{table_name}.description"],
project_key: 'project_id',
date_column: 'updated_at',
permission: :view_dmsf_files,
scope: Proc.new { DmsfFolder.visible }
-
+ acts_as_watchable
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 } },
@@ -122,6 +121,13 @@ class DmsfFolder < ActiveRecord::Base
DmsfFolder.permissions?(folder.dmsf_folder, allow_system)
end
+ def initialize(*args)
+ if new_record?
+ self.watcher_user_ids = []
+ end
+ super
+ end
+
def default_values
if Setting.plugin_redmine_dmsf['dmsf_default_notifications'].present? && !system
self.notification = true
diff --git a/app/views/dmsf/_main.html.erb b/app/views/dmsf/_main.html.erb
index 35f07259..32e03d4c 100644
--- a/app/views/dmsf/_main.html.erb
+++ b/app/views/dmsf/_main.html.erb
@@ -91,6 +91,24 @@
<% content_for :sidebar do %>
<%= render partial: 'dmsf/sidebar' %>
+
+ <% project_or_folder = @folder? @folder : @project %>
+ <% if project_or_folder.watchers.present? %>
+
+ <% if @folder %>
+ <%= render partial: 'watchers/watchers', locals: { watched: @folder } %>
+ <% else %>
+ <% if User.current.allowed_to?(:add_project_watchers, @project) %>
+
+ <%= link_to l(:button_add), new_watchers_path(object_type: :project, object_id: @project.id), remote: true,
+ method: 'get' %>
+
+ <% end %>
+
<%= l(:label_project_watchers) %> (<%= @project.watcher_users.size %>)
+ <%= watchers_list @project %>
+ <% end %>
+
+ <% end %>
<% end %>
<% if Redmine::Plugin.installed?(:easy_extensions) %>
diff --git a/app/views/dmsf_context_menus/_folder.html.erb b/app/views/dmsf_context_menus/_folder.html.erb
index 29af3882..70789b32 100644
--- a/app/views/dmsf_context_menus/_folder.html.erb
+++ b/app/views/dmsf_context_menus/_folder.html.erb
@@ -72,6 +72,14 @@
disabled: !email_allowed %>
<% end %>
+
+<% watched = Watcher.any_watched?([dmsf_folder], User.current) %>
+<% css = [watcher_css([dmsf_folder]), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ') %>
+<% text = watched ? l(:button_unwatch) : l(:button_watch) %>
+<% url = watch_path(object_type: dmsf_folder.class.to_s.underscore, object_id: dmsf_folder, back_url: back_url) %>
+<% method = watched ? 'delete' : 'post' %>
+<%= context_menu_link text, url, method: method, class: css, disabled: !User.current.logged? %>
+
<%= context_menu_link l(:button_delete),
dmsf_link ? dmsf_link_path(id: dmsf_link, folder_id: folder, back_url: back_url) :
diff --git a/app/views/dmsf_context_menus/_main.html.erb b/app/views/dmsf_context_menus/_main.html.erb
index 89b81000..fc88b4d8 100644
--- a/app/views/dmsf_context_menus/_main.html.erb
+++ b/app/views/dmsf_context_menus/_main.html.erb
@@ -60,10 +60,19 @@
class: 'icon dmsf-icon-link' %>
<% end %>
<% end %>
+
+<% object = folder ? folder : project %>
+<% watched = Watcher.any_watched?([object], User.current) %>
+<% css = [watcher_css([object]), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ') %>
+<% text = watched ? l(:button_unwatch) : l(:button_watch) %>
+<% url = watch_path(object_type: object.class.to_s.underscore, object_id: object.id) %>
+<% method = watched ? 'delete' : 'post' %>
+<%= context_menu_link text, url, method: method, class: css, disabled: !User.current.logged? %>
+
<% if trash_enabled %>
<%= link_to l(:link_trash_bin), trash_dmsf_path(project), title: l(:link_trash_bin), class: 'icon icon-del' %>
<% else %>
- <%= l(:link_trash_bin) %>
-
+ <%= l(:link_trash_bin) %>
+
<% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ae85d74f..4998bb7e 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -425,6 +425,15 @@ en:
title_start_minor: Start not allowed, minor must be zero
title_approval_minor: Approval not allowed, minor must be zero
+ label_project_watchers: Watchers
+ label_dmsf_folder_watchers: Watchers
+ permission_view_dmsf_folder_watchers: View watchers
+ permission_add_dmsf_folder_watchers: Add watchers
+ permission_delete_dmsf_folder_watchers: Delete watchers
+ permission_view_project_watchers: View project's watchers
+ permission_add_project_watchers: Add project's watchers
+ permission_delete_project_watchers: Delete project's watchers
+
easy_pages:
modules:
dmsf_locked_documents: My locked documents
diff --git a/lib/redmine_dmsf/patches/project_patch.rb b/lib/redmine_dmsf/patches/project_patch.rb
index cb1a7101..f757f2aa 100644
--- a/lib/redmine_dmsf/patches/project_patch.rb
+++ b/lib/redmine_dmsf/patches/project_patch.rb
@@ -29,6 +29,11 @@ module RedmineDmsf
##################################################################################################################
# Overridden methods
+ def initialize(attributes=nil, *args)
+ self.watcher_user_ids = []
+ super
+ end
+
def copy(project, options={})
super(project, options)
project = project.is_a?(Project) ? project : Project.find(project)
@@ -62,6 +67,8 @@ module RedmineDmsf
has_many :dmsf_links, -> { where dmsf_folder_id: nil },
class_name: 'DmsfLink', foreign_key: 'project_id', dependent: :destroy
+ acts_as_watchable
+
before_save :set_default_dmsf_notification
validates_length_of :dmsf_description, maximum: 65535