activity_notification 0.0.10 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/Gemfile +6 -3
- data/Gemfile.lock +74 -58
- data/README.md +53 -26
- data/activity_notification.gemspec +2 -0
- data/app/controllers/activity_notification/notifications_controller.rb +4 -4
- data/app/mailers/activity_notification/mailer.rb +9 -3
- data/app/views/activity_notification/mailer/default/default.html.erb +9 -4
- data/app/views/activity_notification/mailer/default/default.text.erb +10 -0
- data/app/views/activity_notification/notifications/default/_default.html.erb +173 -34
- data/app/views/activity_notification/notifications/default/_index.html.erb +119 -11
- data/app/views/activity_notification/notifications/default/destroy.js.erb +2 -2
- data/app/views/activity_notification/notifications/default/index.html.erb +25 -14
- data/app/views/activity_notification/notifications/default/open.js.erb +2 -2
- data/app/views/activity_notification/notifications/default/open_all.js.erb +2 -2
- data/app/views/activity_notification/notifications/default/show.html.erb +1 -1
- data/gemfiles/Gemfile.rails-4.2 +0 -2
- data/gemfiles/Gemfile.rails-4.2.lock +3 -3
- data/gemfiles/Gemfile.rails-5.0 +1 -3
- data/lib/activity_notification.rb +10 -9
- data/lib/activity_notification/apis/notification_api.rb +108 -14
- data/lib/activity_notification/common.rb +11 -2
- data/lib/activity_notification/config.rb +13 -13
- data/lib/activity_notification/helpers/view_helpers.rb +26 -4
- data/lib/activity_notification/mailers/helpers.rb +8 -4
- data/lib/activity_notification/models.rb +4 -0
- data/lib/activity_notification/models/concerns/group.rb +32 -0
- data/lib/activity_notification/models/concerns/notifiable.rb +60 -32
- data/lib/activity_notification/models/concerns/notifier.rb +17 -1
- data/lib/activity_notification/models/concerns/target.rb +114 -55
- data/lib/activity_notification/models/notification.rb +26 -25
- data/lib/activity_notification/rails.rb +1 -0
- data/lib/activity_notification/renderable.rb +8 -3
- data/lib/activity_notification/roles/acts_as_common.rb +28 -0
- data/lib/activity_notification/roles/acts_as_group.rb +38 -0
- data/lib/activity_notification/roles/acts_as_notifiable.rb +56 -22
- data/lib/activity_notification/roles/acts_as_notifier.rb +25 -2
- data/lib/activity_notification/roles/acts_as_target.rb +27 -9
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/templates/activity_notification.rb +1 -1
- data/spec/concerns/apis/notification_api_spec.rb +361 -2
- data/spec/concerns/common_spec.rb +36 -0
- data/spec/concerns/models/group_spec.rb +61 -0
- data/spec/concerns/models/notifiable_spec.rb +37 -0
- data/spec/concerns/models/notifier_spec.rb +48 -0
- data/spec/concerns/models/target_spec.rb +81 -31
- data/spec/factories/dummy/dummy_group.rb +4 -0
- data/spec/helpers/view_helpers_spec.rb +13 -0
- data/spec/mailers/mailer_spec.rb +8 -1
- data/spec/models/dummy/dummy_group_spec.rb +6 -0
- data/spec/rails_app/app/assets/stylesheets/application.css +15 -0
- data/spec/rails_app/app/assets/stylesheets/reset.css +85 -0
- data/spec/rails_app/app/assets/stylesheets/style.css +244 -0
- data/spec/rails_app/app/controllers/articles_controller.rb +1 -1
- data/spec/rails_app/app/models/admin.rb +2 -1
- data/spec/rails_app/app/models/article.rb +9 -2
- data/spec/rails_app/app/models/comment.rb +8 -2
- data/spec/rails_app/app/models/dummy/dummy_group.rb +4 -0
- data/spec/rails_app/app/models/user.rb +8 -3
- data/spec/rails_app/app/views/articles/_form.html.erb +14 -10
- data/spec/rails_app/app/views/articles/edit.html.erb +8 -6
- data/spec/rails_app/app/views/articles/index.html.erb +59 -67
- data/spec/rails_app/app/views/articles/new.html.erb +7 -5
- data/spec/rails_app/app/views/articles/show.html.erb +47 -36
- data/spec/rails_app/app/views/layouts/_header.html.erb +36 -9
- data/spec/rails_app/app/views/layouts/application.html.erb +8 -6
- data/spec/rails_app/config/environments/development.rb +9 -0
- data/spec/rails_app/config/initializers/activity_notification.rb +1 -1
- data/spec/rails_app/db/schema.rb +14 -20
- data/spec/rails_app/db/seeds.rb +5 -5
- data/spec/rails_app/lib/mailer_previews/mailer_preview.rb +13 -0
- data/spec/roles/acts_as_group_spec.rb +32 -0
- data/spec/roles/acts_as_notifiable_spec.rb +1 -1
- data/spec/roles/acts_as_notifier_spec.rb +15 -0
- data/spec/roles/acts_as_target_spec.rb +1 -1
- metadata +52 -2
@@ -5,7 +5,7 @@ module ActivityNotification
|
|
5
5
|
include Common
|
6
6
|
include NotificationApi
|
7
7
|
self.table_name = ActivityNotification.config.table_name
|
8
|
-
|
8
|
+
|
9
9
|
# Belongs to target instance of this notification as polymorphic association.
|
10
10
|
# @scope instance
|
11
11
|
# @return [Object] Target instance of this notification
|
@@ -32,7 +32,7 @@ module ActivityNotification
|
|
32
32
|
# Only group owner instance has :group_members value.
|
33
33
|
# Group member instance has nil as :group_members association.
|
34
34
|
# @scope instance
|
35
|
-
# @return [
|
35
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of the group member notification instances of this notification
|
36
36
|
has_many :group_members, class_name: :Notification, foreign_key: :group_owner_id
|
37
37
|
|
38
38
|
# Belongs to :otifier instance of this notification.
|
@@ -49,17 +49,17 @@ module ActivityNotification
|
|
49
49
|
|
50
50
|
# Selects group owner notifications only.
|
51
51
|
# @scope class
|
52
|
-
# @return [
|
52
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
53
53
|
scope :group_owners_only, -> { where(group_owner_id: nil) }
|
54
54
|
|
55
55
|
# Selects group member notifications only.
|
56
56
|
# @scope class
|
57
|
-
# @return [
|
57
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
58
58
|
scope :group_members_only, -> { where.not(group_owner_id: nil) }
|
59
59
|
|
60
60
|
# Selects unopened notifications only.
|
61
61
|
# @scope class
|
62
|
-
# @return [
|
62
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
63
63
|
scope :unopened_only, -> { where(opened_at: nil) }
|
64
64
|
|
65
65
|
# Selects unopened notification index.
|
@@ -67,37 +67,37 @@ module ActivityNotification
|
|
67
67
|
# @example Get unopened notificaton index of the @user
|
68
68
|
# @notifications = @user.unopened_index
|
69
69
|
# @scope class
|
70
|
-
# @return [
|
70
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
71
71
|
scope :unopened_index, -> { unopened_only.group_owners_only.latest_order }
|
72
72
|
|
73
73
|
# Selects opened notifications only without limit.
|
74
74
|
# Be careful to get too many records with this method.
|
75
75
|
# @scope class
|
76
|
-
# @return [
|
76
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
77
77
|
scope :opened_only!, -> { where.not(opened_at: nil) }
|
78
78
|
|
79
79
|
# Selects opened notifications only with limit.
|
80
80
|
# @scope class
|
81
81
|
# @param [Integer] limit Limit to query for opened notifications
|
82
|
-
# @return [
|
82
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
83
83
|
scope :opened_only, ->(limit) { opened_only!.limit(limit) }
|
84
84
|
|
85
85
|
# Selects unopened notification index.
|
86
86
|
# Defined same as `opened_only(limit).group_owners_only.latest_order`.
|
87
87
|
# @scope class
|
88
88
|
# @param [Integer] limit Limit to query for opened notifications
|
89
|
-
# @return [
|
89
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
90
90
|
scope :opened_index, ->(limit) { opened_only(limit).group_owners_only.latest_order }
|
91
91
|
|
92
92
|
# Selects group member notifications in unopened_index.
|
93
93
|
# @scope class
|
94
|
-
# @return [
|
95
|
-
scope :unopened_index_group_members_only, -> { where(group_owner_id: unopened_index.
|
94
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
95
|
+
scope :unopened_index_group_members_only, -> { where(group_owner_id: unopened_index.map(&:id)) }
|
96
96
|
|
97
97
|
# Selects group member notifications in opened_index.
|
98
98
|
# @scope class
|
99
99
|
# @param [Integer] limit Limit to query for opened notifications
|
100
|
-
# @return [
|
100
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
101
101
|
scope :opened_index_group_members_only, ->(limit) { where(group_owner_id: opened_index(limit).map(&:id)) }
|
102
102
|
|
103
103
|
# Selects filtered notifications by target instance.
|
@@ -106,7 +106,7 @@ module ActivityNotification
|
|
106
106
|
# @user.notifications
|
107
107
|
# @scope class
|
108
108
|
# @param [Object] target Target instance for filter
|
109
|
-
# @return [
|
109
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
110
110
|
scope :filtered_by_target, ->(target) { where(target: target) }
|
111
111
|
|
112
112
|
# Selects filtered notifications by notifiable instance.
|
@@ -114,7 +114,7 @@ module ActivityNotification
|
|
114
114
|
# @notifications = @user.notifications.unopened_only.filtered_by_instance(@comment)
|
115
115
|
# @scope class
|
116
116
|
# @param [Object] notifiable Notifiable instance for filter
|
117
|
-
# @return [
|
117
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
118
118
|
scope :filtered_by_instance, ->(notifiable) { where(notifiable: notifiable) }
|
119
119
|
|
120
120
|
# Selects filtered notifications by notifiable_type.
|
@@ -122,7 +122,7 @@ module ActivityNotification
|
|
122
122
|
# @notifications = @user.notifications.unopened_only.filtered_by_type('Comment')
|
123
123
|
# @scope class
|
124
124
|
# @param [String] notifiable_type Notifiable type for filter
|
125
|
-
# @return [
|
125
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
126
126
|
scope :filtered_by_type, ->(notifiable_type) { where(notifiable_type: notifiable_type) }
|
127
127
|
|
128
128
|
# Selects filtered notifications by group instance.
|
@@ -130,7 +130,7 @@ module ActivityNotification
|
|
130
130
|
# @notifications = @user.notifications.unopened_only.filtered_by_group(@article)
|
131
131
|
# @scope class
|
132
132
|
# @param [Object] group Group instance for filter
|
133
|
-
# @return [
|
133
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
134
134
|
scope :filtered_by_group, ->(group) { where(group: group) }
|
135
135
|
|
136
136
|
# Selects filtered notifications by key.
|
@@ -138,7 +138,7 @@ module ActivityNotification
|
|
138
138
|
# @notifications = @user.notifications.unopened_only.filtered_by_key('comment.reply')
|
139
139
|
# @scope class
|
140
140
|
# @param [String] key Key of the notification for filter
|
141
|
-
# @return [
|
141
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
142
142
|
scope :filtered_by_key, ->(key) { where(key: key) }
|
143
143
|
|
144
144
|
# Selects filtered notifications by notifiable_type, group or key with filter options.
|
@@ -159,9 +159,9 @@ module ActivityNotification
|
|
159
159
|
# @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
160
160
|
# @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
|
161
161
|
# @option options [String] :filtered_by_key (nil) Key of the notification for filter
|
162
|
-
# @return [
|
162
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
163
163
|
scope :filtered_by_options, ->(options = {}) {
|
164
|
-
options = options
|
164
|
+
options = ActivityNotification.cast_to_indifferent_hash(options)
|
165
165
|
filtered_notifications = all
|
166
166
|
if options.has_key?(:filtered_by_type)
|
167
167
|
filtered_notifications = filtered_notifications.filtered_by_type(options[:filtered_by_type])
|
@@ -180,27 +180,27 @@ module ActivityNotification
|
|
180
180
|
}
|
181
181
|
|
182
182
|
# Includes target instance with query for notifications.
|
183
|
-
# @return [ActiveRecord_AssociationRelation] Database query of notifications with target
|
183
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Database query of notifications with target
|
184
184
|
scope :with_target, -> { includes(:target) }
|
185
185
|
|
186
186
|
# Includes notifiable instance with query for notifications.
|
187
|
-
# @return [ActiveRecord_AssociationRelation] Database query of notifications with notifiable
|
187
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Database query of notifications with notifiable
|
188
188
|
scope :with_notifiable, -> { includes(:notifiable) }
|
189
189
|
|
190
190
|
# Includes group instance with query for notifications.
|
191
|
-
# @return [ActiveRecord_AssociationRelation] Database query of notifications with group
|
191
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Database query of notifications with group
|
192
192
|
scope :with_group, -> { includes(:group) }
|
193
193
|
|
194
194
|
# Includes notifier instance with query for notifications.
|
195
|
-
# @return [ActiveRecord_AssociationRelation] Database query of notifications with notifier
|
195
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Database query of notifications with notifier
|
196
196
|
scope :with_notifier, -> { includes(:notifier) }
|
197
197
|
|
198
198
|
# Orders by latest (newest) first as created_at: :desc.
|
199
|
-
# @return [ActiveRecord_AssociationRelation] Database query of notifications ordered by latest first
|
199
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Database query of notifications ordered by latest first
|
200
200
|
scope :latest_order, -> { order(created_at: :desc) }
|
201
201
|
|
202
202
|
# Orders by earliest (older) first as created_at: :asc.
|
203
|
-
# @return [ActiveRecord_AssociationRelation] Database query of notifications ordered by earliest first
|
203
|
+
# @return [ActiveRecord_AssociationRelation<Notificaion>] Database query of notifications ordered by earliest first
|
204
204
|
scope :earliest_order, -> { order(created_at: :asc) }
|
205
205
|
|
206
206
|
# Returns latest notification instance.
|
@@ -210,5 +210,6 @@ module ActivityNotification
|
|
210
210
|
# Returns earliest notification instance.
|
211
211
|
# @return [Notification] Earliest notification instance
|
212
212
|
scope :earliest, -> { earliest_order.first }
|
213
|
+
|
213
214
|
end
|
214
215
|
end
|
@@ -21,7 +21,12 @@ module ActivityNotification
|
|
21
21
|
k.push('text')
|
22
22
|
k = k.join('.')
|
23
23
|
|
24
|
-
I18n.t(k, (parameters.merge(params) || {}).merge(
|
24
|
+
I18n.t(k, (parameters.merge(params) || {}).merge(
|
25
|
+
group_member_count: group_member_count,
|
26
|
+
group_notification_count: group_notification_count,
|
27
|
+
group_member_notifier_count: group_member_notifier_count,
|
28
|
+
group_notifier_count: group_notifier_count
|
29
|
+
))
|
25
30
|
end
|
26
31
|
|
27
32
|
# Renders notification from views.
|
@@ -134,7 +139,7 @@ module ActivityNotification
|
|
134
139
|
# @option params [String] :partial (self.key.gsub('.', '/')) Root path of partial template
|
135
140
|
# @option params [String] :layout (nil) Layout template name
|
136
141
|
# @option params [String] :layout_root ('layouts') Root path of layout template
|
137
|
-
# @option params [String]
|
142
|
+
# @option params [String, Symbol] :fallback (nil) Fallback template to use when MissingTemplate is raised. Set :text to use i18n text as fallback.
|
138
143
|
# @option params [Hash] others Parameters to be set as locals
|
139
144
|
# @return [String] Rendered view or text as string
|
140
145
|
def render(context, params = {})
|
@@ -207,7 +212,7 @@ module ActivityNotification
|
|
207
212
|
# @param [Hash] params Parameters to prepare
|
208
213
|
# @return [Hash] Prepared parameters
|
209
214
|
def prepare_parameters(params)
|
210
|
-
@prepared_params ||=
|
215
|
+
@prepared_params ||= ActivityNotification.cast_to_indifferent_hash(parameters).merge(params)
|
211
216
|
end
|
212
217
|
|
213
218
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ActivityNotification
|
2
|
+
# Common module included in acts_as module.
|
3
|
+
# Provides methods to extract parameters.
|
4
|
+
module ActsAsCommon
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class_methods do
|
8
|
+
protected
|
9
|
+
# Sets acts_as parameters.
|
10
|
+
# @api protected
|
11
|
+
def set_acts_as_parameters(option_list, options, field_prefix = "")
|
12
|
+
option_list.map { |key|
|
13
|
+
options[key] ?
|
14
|
+
[key, self.send("_#{field_prefix}#{key}=".to_sym, options.delete(key))] : [nil, nil]
|
15
|
+
}.to_h.delete_if { |k, _| k.nil? }
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sets acts_as parameters for target.
|
19
|
+
# @api protected
|
20
|
+
def set_acts_as_parameters_for_target(target_type, option_list, options, field_prefix = "")
|
21
|
+
option_list.map { |key|
|
22
|
+
options[key] ?
|
23
|
+
[key, self.send("_#{field_prefix}#{key}".to_sym).store(target_type.to_sym, options.delete(key))] : [nil, nil]
|
24
|
+
}.to_h.delete_if { |k, _| k.nil? }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ActivityNotification
|
2
|
+
# Manages to add all required configurations to group models of notification.
|
3
|
+
module ActsAsGroup
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
class_methods do
|
7
|
+
# Adds required configurations to group models.
|
8
|
+
#
|
9
|
+
# == Parameters:
|
10
|
+
# * :printable_name or :printable_notification_group_name
|
11
|
+
# * Printable notification group name.
|
12
|
+
# This parameter is a optional since `ActivityNotification::Common.printable_name` is used as default value.
|
13
|
+
# :printable_name is the same option as :printable_notification_group_name
|
14
|
+
# @example Define printable name with article title
|
15
|
+
# # app/models/article.rb
|
16
|
+
# class Article < ActiveRecord::Base
|
17
|
+
# acts_as_notification_group printable_name: ->(article) { "article \"#{article.title}\"" }
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# @param [Hash] options Options for notifier model configuration
|
21
|
+
# @option options [Symbol, Proc, String] :printable_name (ActivityNotification::Common.printable_name) Printable notifier target name
|
22
|
+
# @return [Hash] Configured parameters as notifier model
|
23
|
+
def acts_as_group(options = {})
|
24
|
+
include Group
|
25
|
+
|
26
|
+
options[:printable_notification_group_name] ||= options.delete(:printable_name)
|
27
|
+
set_acts_as_parameters([:printable_notification_group_name], options)
|
28
|
+
end
|
29
|
+
alias_method :acts_as_notification_group, :acts_as_group
|
30
|
+
|
31
|
+
# Returns array of available notification group options in acts_as_group.
|
32
|
+
# @return [Array<Symbol>] Array of available notification group options
|
33
|
+
def available_group_options
|
34
|
+
[:printable_notification_group_name, :printable_name].freeze
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -18,6 +18,7 @@ module ActivityNotification
|
|
18
18
|
# acts_as_notifiable :users, targets: User.all
|
19
19
|
# end
|
20
20
|
# @example Notify to author and users commented to the article, except comment owner self
|
21
|
+
# # app/models/comment.rb
|
21
22
|
# class Comment < ActiveRecord::Base
|
22
23
|
# belongs_to :article
|
23
24
|
# belongs_to :user
|
@@ -32,6 +33,7 @@ module ActivityNotification
|
|
32
33
|
# Notifications will be bundled by this group (and target, notifiable_type, key).
|
33
34
|
# This parameter is a optional.
|
34
35
|
# @example All *unopened* notifications to the same target will be grouped by `article`
|
36
|
+
# # app/models/comment.rb
|
35
37
|
# class Comment < ActiveRecord::Base
|
36
38
|
# belongs_to :article
|
37
39
|
# acts_as_notifiable :users, targets: User.all, group: :article
|
@@ -42,6 +44,7 @@ module ActivityNotification
|
|
42
44
|
# This will be stored as notifier with notification record.
|
43
45
|
# This parameter is a optional.
|
44
46
|
# @example Set comment owner self as notifier
|
47
|
+
# # app/models/comment.rb
|
45
48
|
# class Comment < ActiveRecord::Base
|
46
49
|
# belongs_to :article
|
47
50
|
# belongs_to :user
|
@@ -54,10 +57,12 @@ module ActivityNotification
|
|
54
57
|
# You can use these additional parameters in your notification view or i18n text.
|
55
58
|
# This parameter is a optional.
|
56
59
|
# @example Set constant values as additional parameter
|
60
|
+
# # app/models/comment.rb
|
57
61
|
# class Comment < ActiveRecord::Base
|
58
62
|
# acts_as_notifiable :users, targets: User.all, parameters: { default_param: '1' }
|
59
63
|
# end
|
60
64
|
# @example Set comment body as additional parameter
|
65
|
+
# # app/models/comment.rb
|
61
66
|
# class Comment < ActiveRecord::Base
|
62
67
|
# acts_as_notifiable :users, targets: User.all, parameters: ->(comment, key) { body: comment.body }
|
63
68
|
# end
|
@@ -69,6 +74,7 @@ module ActivityNotification
|
|
69
74
|
# To use notification email, email_allowed option must return true (not nil) in both of notifiable and target model.
|
70
75
|
# This can be also configured default option in initializer.
|
71
76
|
# @example Enable email notification for this notifiable model
|
77
|
+
# # app/models/comment.rb
|
72
78
|
# class Comment < ActiveRecord::Base
|
73
79
|
# acts_as_notifiable :users, targets: User.all, email_allowed: true
|
74
80
|
# end
|
@@ -78,6 +84,7 @@ module ActivityNotification
|
|
78
84
|
# You can also use this notifiable_path as notifiable link in notification view.
|
79
85
|
# This parameter is a optional since polymorphic_path is used as default value.
|
80
86
|
# @example Redirect to parent article page from comment notifications
|
87
|
+
# # app/models/comment.rb
|
81
88
|
# class Comment < ActiveRecord::Base
|
82
89
|
# belongs_to :article
|
83
90
|
# acts_as_notifiable :users, targets: User.all, notifiable_path: :article_notifiable_path
|
@@ -87,39 +94,66 @@ module ActivityNotification
|
|
87
94
|
# end
|
88
95
|
# end
|
89
96
|
#
|
97
|
+
# * :printable_name or :printable_notifiable_name
|
98
|
+
# * Printable notifiable name.
|
99
|
+
# This parameter is a optional since `ActivityNotification::Common.printable_name` is used as default value.
|
100
|
+
# :printable_name is the same option as :printable_notifiable_name
|
101
|
+
# @example Define printable name with comment body
|
102
|
+
# # app/models/comment.rb
|
103
|
+
# class Comment < ActiveRecord::Base
|
104
|
+
# acts_as_notifiable :users, targets: User.all, printable_name: ->(comment) { "comment \"#{comment.body}\"" }
|
105
|
+
# end
|
106
|
+
#
|
107
|
+
# * :dependent_notifications
|
108
|
+
# * Dependency for notifications to delete generated notifications with this notifiable.
|
109
|
+
# This option is used to configure generated_notifications_as_notifiable association.
|
110
|
+
# You can use :delete_all, :destroy, or :nullify for this option.
|
111
|
+
# This parameter is a optional since no dependent option is used as default.
|
112
|
+
# @example Define :delete_all dependency to generated notifications
|
113
|
+
# # app/models/comment.rb
|
114
|
+
# class Comment < ActiveRecord::Base
|
115
|
+
# acts_as_notifiable :users, targets: User.all, dependent_notifications: :delete_all
|
116
|
+
# end
|
117
|
+
#
|
90
118
|
# @param [Symbol] target_type Type of notification target as symbol
|
91
119
|
# @param [Hash] options Options for notifiable model configuration
|
92
|
-
# @option options [Symbol, Proc, Array] :targets
|
93
|
-
# @option options [Symbol, Proc, Object] :group
|
94
|
-
# @option options [Symbol, Proc, Object] :notifier
|
95
|
-
# @option options [Symbol, Proc, Hash] :parameters
|
96
|
-
# @option options [Symbol, Proc, Boolean] :email_allowed
|
97
|
-
# @option options [Symbol, Proc, String] :notifiable_path
|
120
|
+
# @option options [Symbol, Proc, Array] :targets (nil) Targets to send notifications
|
121
|
+
# @option options [Symbol, Proc, Object] :group (nil) Group unit of the notifications
|
122
|
+
# @option options [Symbol, Proc, Object] :notifier (nil) Notifier of the notifications
|
123
|
+
# @option options [Symbol, Proc, Hash] :parameters ({}) Additional parameters of the notifications
|
124
|
+
# @option options [Symbol, Proc, Boolean] :email_allowed (ActivityNotification.config.email_enabled) Whether activity_notification sends notification email
|
125
|
+
# @option options [Symbol, Proc, String] :notifiable_path (polymorphic_path(self)) Path to redirect from open or move action of notification controller
|
126
|
+
# @option options [Symbol, Proc, String] :printable_name (ActivityNotification::Common.printable_name) Printable notifiable name
|
127
|
+
# @option options [Symbol, Proc] :dependent_notifications (nil) Dependency for notifications to delete generated notifications with this notifiable
|
98
128
|
# @return [Hash] Configured parameters as notifiable model
|
99
129
|
def acts_as_notifiable(target_type, options = {})
|
100
130
|
include Notifiable
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
131
|
+
|
132
|
+
if [:delete_all, :destroy, :nullify].include? options[:dependent_notifications]
|
133
|
+
has_many :generated_notifications_as_notifiable,
|
134
|
+
class_name: "::ActivityNotification::Notification",
|
135
|
+
as: :notifiable,
|
136
|
+
dependent: options[:dependent_notifications]
|
137
|
+
end
|
138
|
+
|
139
|
+
options[:printable_notifiable_name] ||= options.delete(:printable_name)
|
140
|
+
set_acts_as_parameters_for_target(target_type, [:targets, :group, :parameters, :email_allowed], options, "notification_")
|
141
|
+
.merge set_acts_as_parameters_for_target(target_type, [:notifier, :notifiable_path, :printable_notifiable_name], options)
|
108
142
|
end
|
109
143
|
|
110
144
|
# Returns array of available notifiable options in acts_as_notifiable.
|
111
145
|
# @return [Array<Symbol>] Array of available notifiable options
|
112
146
|
def available_notifiable_options
|
113
|
-
[:targets,
|
147
|
+
[ :targets,
|
148
|
+
:group,
|
149
|
+
:notifier,
|
150
|
+
:parameters,
|
151
|
+
:email_allowed,
|
152
|
+
:notifiable_path,
|
153
|
+
:printable_notifiable_name, :printable_name,
|
154
|
+
:dependent_notifications
|
155
|
+
].freeze
|
114
156
|
end
|
115
|
-
|
116
|
-
private
|
117
|
-
|
118
|
-
def assign_parameter(target_type, key, field_name, options)
|
119
|
-
options[key] ?
|
120
|
-
[key, self.send(field_name.to_sym).store(target_type.to_sym, options.delete(key))] :
|
121
|
-
[nil, nil]
|
122
|
-
end
|
123
157
|
end
|
124
158
|
end
|
125
159
|
end
|
@@ -5,9 +5,32 @@ module ActivityNotification
|
|
5
5
|
|
6
6
|
class_methods do
|
7
7
|
# Adds required configurations to notifier models.
|
8
|
-
#
|
9
|
-
|
8
|
+
#
|
9
|
+
# == Parameters:
|
10
|
+
# * :printable_name or :printable_notifier_name
|
11
|
+
# * Printable notifier name.
|
12
|
+
# This parameter is a optional since `ActivityNotification::Common.printable_name` is used as default value.
|
13
|
+
# :printable_name is the same option as :printable_notifier_name
|
14
|
+
# @example Define printable name with user name of name field
|
15
|
+
# # app/models/user.rb
|
16
|
+
# class User < ActiveRecord::Base
|
17
|
+
# acts_as_notifier printable_name: :name
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# @param [Hash] options Options for notifier model configuration
|
21
|
+
# @option options [Symbol, Proc, String] :printable_name (ActivityNotification::Common.printable_name) Printable notifier target name
|
22
|
+
# @return [Hash] Configured parameters as notifier model
|
23
|
+
def acts_as_notifier(options = {})
|
10
24
|
include Notifier
|
25
|
+
|
26
|
+
options[:printable_notifier_name] ||= options.delete(:printable_name)
|
27
|
+
set_acts_as_parameters([:printable_notifier_name], options)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns array of available notifier options in acts_as_notifier.
|
31
|
+
# @return [Array<Symbol>] Array of available notifier options
|
32
|
+
def available_notifier_options
|
33
|
+
[:printable_notifier_name, :printable_name].freeze
|
11
34
|
end
|
12
35
|
end
|
13
36
|
end
|