activity_notification 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +5 -0
- data/.yardopts +3 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +50 -44
- data/README.md +242 -81
- data/Rakefile +13 -13
- data/activity_notification.gemspec +6 -8
- data/app/controllers/activity_notification/notifications_controller.rb +89 -11
- data/app/controllers/activity_notification/notifications_with_devise_controller.rb +12 -3
- data/app/mailers/activity_notification/mailer.rb +3 -0
- data/gemfiles/Gemfile.rails-4.2 +13 -0
- data/gemfiles/Gemfile.rails-4.2.lock +190 -0
- data/gemfiles/Gemfile.rails-5.0 +14 -0
- data/gemfiles/Gemfile.rails-5.0.lock +201 -0
- data/lib/activity_notification.rb +10 -6
- data/lib/activity_notification/apis/notification_api.rb +137 -27
- data/lib/activity_notification/common.rb +48 -24
- data/lib/activity_notification/config.rb +68 -10
- data/lib/activity_notification/controllers/store_controller.rb +13 -5
- data/lib/activity_notification/helpers/polymorphic_helpers.rb +17 -3
- data/lib/activity_notification/helpers/view_helpers.rb +161 -45
- data/lib/activity_notification/mailers/helpers.rb +121 -83
- data/lib/activity_notification/models/concerns/notifiable.rb +162 -69
- data/lib/activity_notification/models/concerns/notifier.rb +2 -0
- data/lib/activity_notification/models/concerns/target.rb +124 -25
- data/lib/activity_notification/models/notification.rb +168 -4
- data/lib/activity_notification/rails/routes.rb +50 -48
- data/lib/activity_notification/renderable.rb +106 -26
- data/lib/activity_notification/roles/acts_as_notifiable.rb +99 -26
- data/lib/activity_notification/roles/acts_as_notifier.rb +3 -0
- data/lib/activity_notification/roles/acts_as_target.rb +70 -0
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/activity_notification/active_record/migration_generator.rb +3 -1
- data/lib/generators/activity_notification/controllers_generator.rb +5 -0
- data/lib/generators/activity_notification/install_generator.rb +7 -3
- data/lib/generators/activity_notification/models/notification_generator.rb +4 -2
- data/lib/generators/activity_notification/views_generator.rb +20 -0
- data/spec/concerns/apis/notification_api_spec.rb +105 -36
- data/spec/concerns/common_spec.rb +1 -1
- data/spec/concerns/models/notifiable_spec.rb +2 -2
- data/spec/concerns/models/notifier_spec.rb +1 -1
- data/spec/concerns/models/target_spec.rb +9 -8
- data/spec/controllers/notifications_controller_shared_examples.rb +101 -28
- data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -4
- data/spec/helpers/view_helpers_spec.rb +3 -3
- data/spec/mailers/mailer_spec.rb +1 -1
- data/spec/models/notification_spec.rb +57 -3
- data/spec/rails_app/app/models/article.rb +1 -2
- data/spec/rails_app/app/models/comment.rb +8 -6
- data/spec/rails_app/app/models/user.rb +1 -1
- data/spec/rails_app/app/views/layouts/_header.html.erb +2 -0
- data/spec/rails_app/config/application.rb +3 -1
- data/spec/rails_app/config/environment.rb +12 -2
- data/spec/rails_app/config/environments/test.rb +11 -2
- data/spec/roles/acts_as_notifiable_spec.rb +2 -2
- data/spec/roles/acts_as_notifier_spec.rb +1 -1
- data/spec/roles/acts_as_target_spec.rb +3 -3
- data/spec/spec_helper.rb +6 -0
- metadata +35 -40
- data/spec/rails_app/app/models/concerns/.keep +0 -0
@@ -4,27 +4,31 @@ module ActivityNotification
|
|
4
4
|
# Accepts Symbols, which it will send against context.
|
5
5
|
# Accepts Procs, which it will execute with controller and context.
|
6
6
|
# Both Symbols and Procs will be passed arguments of this method.
|
7
|
+
# Also accepts Hash of these Symbols or Procs.
|
8
|
+
# If any other value will be passed, returns original value.
|
9
|
+
#
|
10
|
+
# @param [Object] context Context to resolve parameter, which is usually target or notificable model
|
11
|
+
# @param [Symbol, Proc, Hash, Object] thing Symbol or Proc to resolve parameter
|
12
|
+
# @param [Array] args Arguments to pass to thing as method
|
13
|
+
# @return [Object] Resolved parameter value
|
7
14
|
def self.resolve_value(context, thing, *args)
|
8
15
|
case thing
|
9
16
|
when Symbol
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
17
|
+
symbol_method = context.method(thing)
|
18
|
+
if symbol_method.arity > 1
|
19
|
+
symbol_method.call(ActivityNotification.get_controller, *args)
|
20
|
+
elsif symbol_method.arity > 0
|
21
|
+
symbol_method.call(ActivityNotification.get_controller)
|
22
|
+
else
|
23
|
+
symbol_method.call
|
18
24
|
end
|
19
25
|
when Proc
|
20
|
-
|
26
|
+
if thing.arity > 2
|
21
27
|
thing.call(ActivityNotification.get_controller, context, *args)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
thing.call(context)
|
27
|
-
end
|
28
|
+
elsif thing.arity > 1
|
29
|
+
thing.call(ActivityNotification.get_controller, context)
|
30
|
+
else
|
31
|
+
thing.call(context)
|
28
32
|
end
|
29
33
|
when Hash
|
30
34
|
thing.dup.tap do |hash|
|
@@ -37,24 +41,34 @@ module ActivityNotification
|
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
44
|
+
# Common module included in target and notifiable model.
|
45
|
+
# Provides methods to resolve parameters from configured field or defined method.
|
46
|
+
# Also provides methods to convert into resource name or class name as string.
|
40
47
|
module Common
|
41
48
|
|
42
49
|
# Used to transform value from metadata to data which belongs model instance.
|
43
|
-
# Accepts Symbols, which it will send against this instance
|
50
|
+
# Accepts Symbols, which it will send against this instance,
|
44
51
|
# Accepts Procs, which it will execute with this instance.
|
45
52
|
# Both Symbols and Procs will be passed arguments of this method.
|
53
|
+
# Also accepts Hash of these Symbols or Procs.
|
54
|
+
# If any other value will be passed, returns original value.
|
55
|
+
#
|
56
|
+
# @param [Symbol, Proc, Hash, Object] thing Symbol or Proc to resolve parameter
|
57
|
+
# @param [Array] args Arguments to pass to thing as method
|
58
|
+
# @return [Object] Resolved parameter value
|
46
59
|
def resolve_value(thing, *args)
|
47
60
|
case thing
|
48
61
|
when Symbol
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
62
|
+
symbol_method = method(thing)
|
63
|
+
if symbol_method.arity > 0
|
64
|
+
symbol_method.call(*args)
|
65
|
+
else
|
66
|
+
symbol_method.call
|
53
67
|
end
|
54
68
|
when Proc
|
55
|
-
|
69
|
+
if thing.arity > 1
|
56
70
|
thing.call(self, *args)
|
57
|
-
|
71
|
+
else
|
58
72
|
thing.call(self)
|
59
73
|
end
|
60
74
|
when Hash
|
@@ -68,24 +82,34 @@ module ActivityNotification
|
|
68
82
|
end
|
69
83
|
end
|
70
84
|
|
85
|
+
# Convets to class name.
|
86
|
+
# @return [String] Class name
|
71
87
|
def to_class_name
|
72
88
|
self.class.name
|
73
89
|
end
|
74
90
|
|
91
|
+
# Convets to singularized model name (resource name).
|
92
|
+
# @return [String] Singularized model name (resource name)
|
75
93
|
def to_resource_name
|
76
94
|
self.class.name.demodulize.singularize.underscore
|
77
95
|
end
|
78
96
|
|
97
|
+
# Convets to pluralized model name (resources name).
|
98
|
+
# @return [String] Pluralized model name (resources name)
|
79
99
|
def to_resources_name
|
80
100
|
self.class.name.demodulize.pluralize.underscore
|
81
101
|
end
|
82
102
|
|
83
|
-
#
|
103
|
+
# Convets to printable model type name to be humanized.
|
104
|
+
# @return [String] Printable model type name
|
105
|
+
# @todo Is this the best to make readable?
|
84
106
|
def printable_type
|
85
107
|
"#{self.class.name.demodulize.humanize}"
|
86
108
|
end
|
87
109
|
|
88
|
-
#
|
110
|
+
# Convets to printable model name to show in view or email.
|
111
|
+
# @return [String] Printable model name
|
112
|
+
# @todo Is this the best to make readable?
|
89
113
|
def printable_name
|
90
114
|
"#{self.printable_type} (#{id})"
|
91
115
|
end
|
@@ -1,21 +1,79 @@
|
|
1
1
|
module ActivityNotification
|
2
2
|
# Class used to initialize configuration object.
|
3
3
|
class Config
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
:opened_limit
|
4
|
+
# @overload enabled
|
5
|
+
# @return [Boolean] Whether ActivityNotification is enabled.
|
6
|
+
# @overload enabled=(value)
|
7
|
+
# Sets the enabled
|
8
|
+
# @param [Boolean] enabled The new enabled
|
9
|
+
# @return [Boolean] Whether ActivityNotification is enabled.
|
10
|
+
attr_accessor :enabled
|
12
11
|
|
12
|
+
# @overload table_name
|
13
|
+
# @return [String] Table name to store notifications.
|
14
|
+
# @overload table_name=(value)
|
15
|
+
# Sets the table_name
|
16
|
+
# @param [String] table_name The new table_name
|
17
|
+
# @return [String] Table name to store notifications.
|
18
|
+
attr_accessor :table_name
|
19
|
+
|
20
|
+
# @overload email_enabled
|
21
|
+
# @return [Boolean] Whether activity_notification sends notification email.
|
22
|
+
# @overload email_enabled=(value)
|
23
|
+
# Sets the email_enabled
|
24
|
+
# @param [Boolean] email_enabled The new email_enabled
|
25
|
+
# @return [Boolean] Whether activity_notification sends notification email.
|
26
|
+
attr_accessor :email_enabled
|
27
|
+
|
28
|
+
# @overload mailer_sender
|
29
|
+
# @return [String] Email address as sender of notification email.
|
30
|
+
# @overload mailer_sender=(value)
|
31
|
+
# Sets the mailer_sender
|
32
|
+
# @param [String] mailer_sender The new mailer_sender
|
33
|
+
# @return [String] Email address as sender of notification email.
|
34
|
+
attr_accessor :mailer_sender
|
35
|
+
|
36
|
+
# @overload mailer
|
37
|
+
# @return [String] Mailer class for email notification.
|
38
|
+
# @overload mailer=(value)
|
39
|
+
# Sets the mailer
|
40
|
+
# @param [String] mailer The new mailer
|
41
|
+
# @return [String] Mailer class for email notification.
|
42
|
+
attr_accessor :mailer
|
43
|
+
|
44
|
+
# @overload parent_mailer
|
45
|
+
# @return [String] Base mailer class for email notification.
|
46
|
+
# @overload parent_mailer=(value)
|
47
|
+
# Sets the parent_mailer
|
48
|
+
# @param [String] parent_mailer The new parent_mailer
|
49
|
+
# @return [String] Base mailer class for email notification.
|
50
|
+
attr_accessor :parent_mailer
|
51
|
+
|
52
|
+
# @overload parent_controller
|
53
|
+
# @return [String] Base controller class for notifications_controller.
|
54
|
+
# @overload parent_controller=(value)
|
55
|
+
# Sets the parent_controller
|
56
|
+
# @param [String] parent_controller The new parent_controller
|
57
|
+
# @return [String] Base controller class for notifications_controller.
|
58
|
+
attr_accessor :parent_controller
|
59
|
+
|
60
|
+
# @overload opened_limit
|
61
|
+
# @return [Integer] Default limit to query for opened notifications.
|
62
|
+
# @overload opened_limit=(value)
|
63
|
+
# Sets the opened_limit
|
64
|
+
# @param [Integer] opened_limit The new opened_limit
|
65
|
+
# @return [Integer] Default limit to query for opened notifications.
|
66
|
+
attr_accessor :opened_limit
|
67
|
+
|
68
|
+
# Initialize configuration for ActivityNotification.
|
69
|
+
# These configuration can be overriden in initializer.
|
70
|
+
# @return [Config] A new instance of Config
|
13
71
|
def initialize
|
14
72
|
@enabled = true
|
15
|
-
@table_name =
|
73
|
+
@table_name = 'notifications'
|
16
74
|
@email_enabled = false
|
17
75
|
@mailer_sender = nil
|
18
|
-
@mailer =
|
76
|
+
@mailer = 'ActivityNotification::Mailer'
|
19
77
|
@parent_mailer = 'ActionMailer::Base'
|
20
78
|
@parent_controller = 'ApplicationController'
|
21
79
|
@opened_limit = 10
|
@@ -1,17 +1,22 @@
|
|
1
1
|
module ActivityNotification
|
2
2
|
class << self
|
3
3
|
# Setter for remembering controller instance
|
4
|
+
#
|
5
|
+
# @param [NotificationsController, NotificationsWithDeviseController] controller Controller instance to set
|
6
|
+
# @return [NotificationsController, NotificationsWithDeviseController]] Controller instance to be set
|
4
7
|
def set_controller(controller)
|
5
8
|
Thread.current[:activity_notification_controller] = controller
|
6
9
|
end
|
7
10
|
|
8
11
|
# Getter for accessing the controller instance
|
12
|
+
#
|
13
|
+
# @return [NotificationsController, NotificationsWithDeviseController]] Controller instance to be set
|
9
14
|
def get_controller
|
10
15
|
Thread.current[:activity_notification_controller]
|
11
16
|
end
|
12
17
|
end
|
13
18
|
|
14
|
-
# Module included in controllers to allow
|
19
|
+
# Module included in controllers to allow ActivityNotification access to controller instance
|
15
20
|
module StoreController
|
16
21
|
extend ActiveSupport::Concern
|
17
22
|
|
@@ -20,11 +25,14 @@ module ActivityNotification
|
|
20
25
|
around_filter :store_controller_for_activity_notification unless respond_to?(:around_action)
|
21
26
|
end
|
22
27
|
|
28
|
+
# Sets controller as around action to use controller instance in models or helpers
|
23
29
|
def store_controller_for_activity_notification
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
30
|
+
begin
|
31
|
+
ActivityNotification.set_controller(self)
|
32
|
+
yield
|
33
|
+
ensure
|
34
|
+
ActivityNotification.set_controller(nil)
|
35
|
+
end
|
28
36
|
end
|
29
37
|
end
|
30
38
|
end
|
@@ -1,25 +1,39 @@
|
|
1
1
|
module ActivityNotification
|
2
|
+
# Provides extension of String class to help polymorphic implementation.
|
2
3
|
module PolymorphicHelpers
|
3
4
|
extend ActiveSupport::Concern
|
4
5
|
|
5
6
|
included do
|
6
7
|
class ::String
|
8
|
+
# Convets to model instance.
|
9
|
+
# @return [Object] Model instance
|
7
10
|
def to_model_name
|
8
11
|
singularize.camelize
|
9
12
|
end
|
10
|
-
|
13
|
+
|
14
|
+
# Convets to model class.
|
15
|
+
# @return [Class] Model class
|
11
16
|
def to_model_class
|
12
17
|
to_model_name.classify.constantize
|
13
18
|
end
|
14
|
-
|
19
|
+
|
20
|
+
# Convets to singularized model name (resource name).
|
21
|
+
# @return [String] Singularized model name (resource name)
|
15
22
|
def to_resource_name
|
16
23
|
singularize.underscore
|
17
24
|
end
|
18
|
-
|
25
|
+
|
26
|
+
# Convets to pluralized model name (resources name).
|
27
|
+
# @return [String] Pluralized model name (resources name)
|
19
28
|
def to_resources_name
|
20
29
|
pluralize.underscore
|
21
30
|
end
|
22
31
|
|
32
|
+
# Convets to boolean.
|
33
|
+
# Returns true for 'true', '1', 'yes', 'on' and 't'.
|
34
|
+
# Returns false for 'false', '0', 'no', 'off' and 'f'.
|
35
|
+
# @param [Boolean] default Default value to return when the String is not interpretable
|
36
|
+
# @return [Boolean] Convered boolean value
|
23
37
|
def to_boolean(default = nil)
|
24
38
|
return true if ['true', '1', 'yes', 'on', 't'].include? self
|
25
39
|
return false if ['false', '0', 'no', 'off', 'f'].include? self
|
@@ -1,9 +1,20 @@
|
|
1
|
-
# Provides a shortcut from views to the rendering method.
|
2
1
|
module ActivityNotification
|
2
|
+
# Provides a shortcut from views to the rendering method.
|
3
3
|
# Module extending ActionView::Base and adding `render_notification` helper.
|
4
4
|
module ViewHelpers
|
5
|
-
# View helper for rendering an notification, calls {
|
6
|
-
|
5
|
+
# View helper for rendering an notification, calls {Notification#render} internally.
|
6
|
+
# @see Notification#render
|
7
|
+
#
|
8
|
+
# @param [Notification, Array<Notificaion>] Array or single instance of notifications to render
|
9
|
+
# @param [Hash] options Options for rendering notifications
|
10
|
+
# @option options [String, Symbol] :target (nil) Target type name to find template or i18n text
|
11
|
+
# @option options [String] :partial ("activity_notification/notifications/#{target}", controller.target_view_path, 'activity_notification/notifications/default') Partial template name
|
12
|
+
# @option options [String] :partial_root (self.key.gsub('.', '/')) Root path of partial template
|
13
|
+
# @option options [String] :layout (nil) Layout template name
|
14
|
+
# @option options [String] :layout_root ('layouts') Root path of layout template
|
15
|
+
# @option options [String] :fallback (nil) Fallback template to use when MissingTemplate is raised. Set :text to use i18n text as fallback.
|
16
|
+
# @return [String] Rendered view or text as string
|
17
|
+
def render_notification(notifications, options = {})
|
7
18
|
if notifications.is_a? ActivityNotification::Notification
|
8
19
|
notifications.render self, options
|
9
20
|
elsif notifications.respond_to?(:map)
|
@@ -13,92 +24,197 @@ module ActivityNotification
|
|
13
24
|
end
|
14
25
|
alias_method :render_notifications, :render_notification
|
15
26
|
|
16
|
-
# View helper for rendering
|
27
|
+
# View helper for rendering on notifications of the target to embedded partial template.
|
28
|
+
# It calls {Notification#render} to prepare view as `content_for :index_content`
|
29
|
+
# and render partial index calling `yield :index_content` internally.
|
30
|
+
# For example, this method can be used for notification index as dropdown in common header.
|
31
|
+
# @todo Show examples
|
32
|
+
#
|
33
|
+
# @param [Object] target Target instance of the rendering notifications
|
34
|
+
# @param [Hash] options Options for rendering notifications
|
35
|
+
# @option options [String, Symbol] :target (nil) Target type name to find template or i18n text
|
36
|
+
# @option options [String] :partial_root ("activity_notification/notifications/#{target.to_resources_name}", 'activity_notification/notifications/default') Root path of partial template
|
37
|
+
# @option options [String] :notification_partial ("activity_notification/notifications/#{target.to_resources_name}", controller.target_view_path, 'activity_notification/notifications/default') Partial template name of the notification index content
|
38
|
+
# @option options [String] :layout_root ('layouts') Root path of layout template
|
39
|
+
# @option options [String] :notification_layout (nil) Layout template name of the notification index content
|
40
|
+
# @option options [String] :fallback (nil) Fallback template to use when MissingTemplate is raised. Set :text to use i18n text as fallback.
|
41
|
+
# @option options [String] :partial ('index') Partial template name of the partial index
|
42
|
+
# @option options [String] :layout (nil) Layout template name of the partial index
|
43
|
+
# @return [String] Rendered view or text as string
|
17
44
|
def render_notification_of target, options = {}
|
18
45
|
return unless target.is_a? ActivityNotification::Target
|
19
46
|
|
20
|
-
partial_path = options.delete(:partial) || "index"
|
21
|
-
partial_root = options[:partial_root] ||
|
22
|
-
"activity_notification/notifications/#{target.to_resources_name}"
|
23
|
-
partial = select_path(partial_path, partial_root)
|
24
|
-
layout = options[:layout].present? ?
|
25
|
-
select_path(options.delete(:layout), (options[:layout_root] || "layouts")) :
|
26
|
-
nil
|
27
|
-
locals = (options[:locals] || {}).merge(target: target)
|
28
|
-
|
29
47
|
# Prepare content for notifications index
|
30
|
-
notification_options = options.merge
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
when :none
|
38
|
-
else
|
39
|
-
notification_index = target.notification_index_with_attributes
|
40
|
-
end
|
41
|
-
|
42
|
-
if notification_index.present?
|
43
|
-
content_for :notification_index do
|
44
|
-
@target = target
|
45
|
-
begin
|
46
|
-
render_notification notification_index, notification_options
|
47
|
-
rescue ActionView::MissingTemplate
|
48
|
-
notification_options.delete(:target)
|
49
|
-
render_notification notification_index, notification_options
|
50
|
-
end
|
48
|
+
notification_options = options.merge target: target.to_resources_name,
|
49
|
+
partial: options[:notification_partial], layout: options[:notification_layout]
|
50
|
+
notification_index =
|
51
|
+
case options[:index_content]
|
52
|
+
when :simple then target.notification_index
|
53
|
+
when :none then target.notifications.none
|
54
|
+
else target.notification_index_with_attributes
|
51
55
|
end
|
52
|
-
|
56
|
+
prepare_content_for(target, notification_index, notification_options)
|
53
57
|
|
54
58
|
# Render partial index
|
55
|
-
|
56
|
-
render options.merge(partial: partial, layout: layout, locals: locals)
|
57
|
-
rescue ActionView::MissingTemplate
|
58
|
-
partial_root = "activity_notification/notifications/default"
|
59
|
-
partial = select_path(partial_path, partial_root)
|
60
|
-
render options.merge(partial: partial, layout: layout, locals: locals)
|
61
|
-
end
|
59
|
+
render_partial_index(target, options)
|
62
60
|
end
|
63
61
|
alias_method :render_notifications_of, :render_notification_of
|
64
62
|
|
65
|
-
#
|
66
|
-
#
|
67
|
-
#
|
63
|
+
# Returns notification_path for the notification
|
64
|
+
#
|
65
|
+
# @param [Notification] notification Notification instance
|
66
|
+
# @param [Hash] params Request parameters
|
67
|
+
# @return [String] notification_path for the notification
|
68
|
+
# @todo Needs any other better implementation
|
69
|
+
# @todo Must handle devise namespace
|
68
70
|
def notification_path_for(notification, params = {})
|
69
71
|
send("#{notification.target.to_resource_name}_notification_path", notification.target, notification, params)
|
70
72
|
end
|
71
73
|
|
74
|
+
# Returns move_notification_path for the target of specified notification
|
75
|
+
#
|
76
|
+
# @param [Notification] notification Notification instance
|
77
|
+
# @param [Hash] params Request parameters
|
78
|
+
# @return [String] move_notification_path for the target
|
79
|
+
# @todo Needs any other better implementation
|
80
|
+
# @todo Must handle devise namespace
|
72
81
|
def move_notification_path_for(notification, params = {})
|
73
82
|
send("move_#{notification.target.to_resource_name}_notification_path", notification.target, notification, params)
|
74
83
|
end
|
75
84
|
|
85
|
+
# Returns open_notification_path for the target of specified notification
|
86
|
+
#
|
87
|
+
# @param [Notification] notification Notification instance
|
88
|
+
# @param [Hash] params Request parameters
|
89
|
+
# @return [String] open_notification_path for the target
|
90
|
+
# @todo Needs any other better implementation
|
91
|
+
# @todo Must handle devise namespace
|
76
92
|
def open_notification_path_for(notification, params = {})
|
77
93
|
send("open_#{notification.target.to_resource_name}_notification_path", notification.target, notification, params)
|
78
94
|
end
|
79
95
|
|
96
|
+
# Returns open_all_notifications_path for the target of specified notification
|
97
|
+
#
|
98
|
+
# @param [Notification] notification Notification instance
|
99
|
+
# @param [Hash] params Request parameters
|
100
|
+
# @return [String] open_all_notifications_path for the target
|
101
|
+
# @todo Needs any other better implementation
|
102
|
+
# @todo Must handle devise namespace
|
80
103
|
def open_all_notifications_path_for(target, params = {})
|
81
104
|
send("open_all_#{target.to_resource_name}_notifications_path", target, params)
|
82
105
|
end
|
83
106
|
|
107
|
+
# Returns notification_url for the target of specified notification
|
108
|
+
#
|
109
|
+
# @param [Notification] notification Notification instance
|
110
|
+
# @param [Hash] params Request parameters
|
111
|
+
# @return [String] notification_url for the target
|
112
|
+
# @todo Needs any other better implementation
|
113
|
+
# @todo Must handle devise namespace
|
84
114
|
def notification_url_for(notification, params = {})
|
85
115
|
send("#{notification.target.to_resource_name}_notification_url", notification.target, notification, params)
|
86
116
|
end
|
87
117
|
|
118
|
+
# Returns move_notification_url for the target of specified notification
|
119
|
+
#
|
120
|
+
# @param [Notification] notification Notification instance
|
121
|
+
# @param [Hash] params Request parameters
|
122
|
+
# @return [String] move_notification_url for the target
|
123
|
+
# @todo Needs any other better implementation
|
124
|
+
# @todo Must handle devise namespace
|
88
125
|
def move_notification_url_for(notification, params = {})
|
89
126
|
send("move_#{notification.target.to_resource_name}_notification_url", notification.target, notification, params)
|
90
127
|
end
|
91
128
|
|
129
|
+
# Returns open_notification_url for the target of specified notification
|
130
|
+
#
|
131
|
+
# @param [Notification] notification Notification instance
|
132
|
+
# @param [Hash] params Request parameters
|
133
|
+
# @return [String] open_notification_url for the target
|
134
|
+
# @todo Needs any other better implementation
|
135
|
+
# @todo Must handle devise namespace
|
92
136
|
def open_notification_url_for(notification, params = {})
|
93
137
|
send("open_#{notification.target.to_resource_name}_notification_url", notification.target, notification, params)
|
94
138
|
end
|
95
139
|
|
140
|
+
# Returns open_all_notifications_url for the target of specified notification
|
141
|
+
#
|
142
|
+
# @param [Notification] notification Notification instance
|
143
|
+
# @param [Hash] params Request parameters
|
144
|
+
# @return [String] open_all_notifications_url for the target
|
145
|
+
# @todo Needs any other better implementation
|
146
|
+
# @todo Must handle devise namespace
|
96
147
|
def open_all_notifications_url_for(target, params = {})
|
97
148
|
send("open_all_#{target.to_resource_name}_notifications_url", target, params)
|
98
149
|
end
|
99
150
|
|
151
|
+
|
100
152
|
private
|
101
153
|
|
154
|
+
# Prepare content for notification index
|
155
|
+
# @api private
|
156
|
+
#
|
157
|
+
# @param [Object] target Notification target instance
|
158
|
+
# @param [Array<Notificaion>] notification_index Array notification index
|
159
|
+
# @param [Hash] params Option parameter to send render_notification
|
160
|
+
def prepare_content_for(target, notification_index, params)
|
161
|
+
content_for :notification_index do
|
162
|
+
@target = target
|
163
|
+
begin
|
164
|
+
render_notification notification_index, params
|
165
|
+
rescue ActionView::MissingTemplate
|
166
|
+
params.delete(:target)
|
167
|
+
render_notification notification_index, params
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Render partial index of notifications
|
173
|
+
# @api private
|
174
|
+
#
|
175
|
+
# @param [Object] target Notification target instance
|
176
|
+
# @param [Hash] params Option parameter to send render
|
177
|
+
# @return [String] Rendered partial index view as string
|
178
|
+
def render_partial_index(target, params)
|
179
|
+
index_path = params.delete(:partial)
|
180
|
+
partial = partial_index_path(target, index_path, params[:partial_root])
|
181
|
+
layout = layout_path(params.delete(:layout), params[:layout_root])
|
182
|
+
locals = (params[:locals] || {}).merge(target: target)
|
183
|
+
begin
|
184
|
+
render params.merge(partial: partial, layout: layout, locals: locals)
|
185
|
+
rescue ActionView::MissingTemplate
|
186
|
+
partial = partial_index_path(target, index_path, 'activity_notification/notifications/default')
|
187
|
+
render params.merge(partial: partial, layout: layout, locals: locals)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# Returns partial index path from options
|
192
|
+
# @api private
|
193
|
+
#
|
194
|
+
# @param [Object] target Notification target instance
|
195
|
+
# @param [String] path Partial index template name
|
196
|
+
# @param [String] root Root path of partial index template
|
197
|
+
# @return [String] Partial index template path
|
198
|
+
def partial_index_path(target, path = nil, root = nil)
|
199
|
+
path ||= 'index'
|
200
|
+
root ||= "activity_notification/notifications/#{target.to_resources_name}"
|
201
|
+
select_path(path, root)
|
202
|
+
end
|
203
|
+
|
204
|
+
# Returns layout path from options
|
205
|
+
# @api private
|
206
|
+
#
|
207
|
+
# @param [String] path Layout template name
|
208
|
+
# @param [String] root Root path of layout template
|
209
|
+
# @return [String] Layout template path
|
210
|
+
def layout_path(path = nil, root = nil)
|
211
|
+
path.nil? and return
|
212
|
+
root ||= 'layouts'
|
213
|
+
select_path(path, root)
|
214
|
+
end
|
215
|
+
|
216
|
+
# Select template path
|
217
|
+
# @api private
|
102
218
|
def select_path(path, root)
|
103
219
|
[root, path].map(&:to_s).join('/')
|
104
220
|
end
|