rails_notice 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +165 -0
- data/README.md +76 -0
- data/Rakefile +37 -0
- data/app/assets/config/rails_notice_manifest.js +3 -0
- data/app/assets/javascripts/controllers/notifications/index.js +0 -0
- data/app/assets/javascripts/controllers/rails_notice_admin/notification_settings/index.js +17 -0
- data/app/assets/javascripts/controllers/rails_notice_admin/notifications/index.js +15 -0
- data/app/assets/javascripts/controllers/rails_notice_admin/notify_settings/edit.js +3 -0
- data/app/assets/javascripts/controllers/rails_notice_admin/notify_settings/index.js +17 -0
- data/app/assets/javascripts/controllers/rails_notice_admin/notify_settings/new.js +18 -0
- data/app/assets/javascripts/rails_notice/cable.js +19 -0
- data/app/assets/javascripts/rails_notice/channels/notices.js +39 -0
- data/app/assets/javascripts/rails_notice/messenger-theme-future.js +33 -0
- data/app/assets/javascripts/rails_notice/messenger.min.js +2 -0
- data/app/assets/stylesheets/the_notify/cable.css +9 -0
- data/app/assets/stylesheets/the_notify/messenger-theme-air.css +357 -0
- data/app/assets/stylesheets/the_notify/messenger.css +105 -0
- data/app/channels/notices_channel.rb +7 -0
- data/app/channels/the_notify_connection.rb +30 -0
- data/app/controllers/concerns/rails_notice_controller.rb +18 -0
- data/app/controllers/rails_notice_admin/base_controller.rb +6 -0
- data/app/controllers/rails_notice_admin/notification_settings_controller.rb +55 -0
- data/app/controllers/rails_notice_admin/notifications_controller.rb +71 -0
- data/app/controllers/rails_notice_my/base_controller.rb +5 -0
- data/app/controllers/rails_notice_my/notification_settings_controller.rb +28 -0
- data/app/controllers/rails_notice_my/notifications_controller.rb +78 -0
- data/app/controllers/receivers_controller.rb +12 -0
- data/app/jobs/notification_job.rb +17 -0
- data/app/mailers/rails_notice_mailer.rb +21 -0
- data/app/models/annunciation.rb +4 -0
- data/app/models/concerns/i18n_helper.rb +14 -0
- data/app/models/concerns/the_notifiable.rb +33 -0
- data/app/models/concerns/the_publishable.rb +9 -0
- data/app/models/concerns/the_receivable.rb +17 -0
- data/app/models/notification.rb +156 -0
- data/app/models/notification_setting.rb +8 -0
- data/app/views/rails_notice/_link.html.erb +6 -0
- data/app/views/rails_notice_admin/base/_nav.html.erb +16 -0
- data/app/views/rails_notice_admin/notification_settings/_form.html.erb +7 -0
- data/app/views/rails_notice_admin/notification_settings/_search_form.html.erb +11 -0
- data/app/views/rails_notice_admin/notification_settings/edit.html.erb +14 -0
- data/app/views/rails_notice_admin/notification_settings/index.html.erb +52 -0
- data/app/views/rails_notice_admin/notification_settings/new.html.erb +13 -0
- data/app/views/rails_notice_admin/notification_settings/show.html.erb +0 -0
- data/app/views/rails_notice_admin/notifications/_form.html.erb +6 -0
- data/app/views/rails_notice_admin/notifications/_menu.html.erb +6 -0
- data/app/views/rails_notice_admin/notifications/_search_form.html.erb +11 -0
- data/app/views/rails_notice_admin/notifications/edit.html.erb +14 -0
- data/app/views/rails_notice_admin/notifications/index.html.erb +44 -0
- data/app/views/rails_notice_admin/notifications/new.html.erb +15 -0
- data/app/views/rails_notice_mailer/notify.html.erb +35 -0
- data/app/views/rails_notice_my/base/_nav_my.html.erb +4 -0
- data/app/views/rails_notice_my/notification_settings/_form.html.erb +5 -0
- data/app/views/rails_notice_my/notification_settings/show.html.erb +5 -0
- data/app/views/rails_notice_my/notifications/_navbar.html.erb +13 -0
- data/app/views/rails_notice_my/notifications/_notifications.html.erb +17 -0
- data/app/views/rails_notice_my/notifications/edit.html.erb +2 -0
- data/app/views/rails_notice_my/notifications/index.html.erb +28 -0
- data/app/views/rails_notice_my/notifications/index.js.erb +13 -0
- data/app/views/rails_notice_my/notifications/new.html.erb +1 -0
- data/app/views/rails_notice_my/notifications/read.js.erb +2 -0
- data/app/views/rails_notice_my/notifications/read_all.js.erb +2 -0
- data/app/views/rails_notice_my/notifications/show.html.erb +7 -0
- data/config/locales/en.yml +7 -0
- data/config/locales/zh.yml +7 -0
- data/config/routes.rb +29 -0
- data/db/migrate/20170110025557_create_notification.rb +21 -0
- data/db/migrate/20170209025946_create_notification_settings.rb +23 -0
- data/lib/rails_notice.rb +13 -0
- data/lib/rails_notice/active_record.rb +18 -0
- data/lib/rails_notice/config.rb +13 -0
- data/lib/rails_notice/engine.rb +9 -0
- data/lib/rails_notice/version.rb +3 -0
- data/lib/tasks/the_notify_tasks.rake +4 -0
- metadata +132 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
class Notification < ApplicationRecord
|
2
|
+
serialize :cc_emails, Array
|
3
|
+
|
4
|
+
attribute :code, :string, default: 'default'
|
5
|
+
belongs_to :receiver, polymorphic: true
|
6
|
+
belongs_to :sender, polymorphic: true, optional: true
|
7
|
+
belongs_to :notifiable, polymorphic: true, optional: true
|
8
|
+
has_one :notification_setting, ->(o) { where(receiver_type: o.receiver_type) }, primary_key: :receiver_id, foreign_key: :receiver_id
|
9
|
+
|
10
|
+
default_scope -> { order(id: :desc) }
|
11
|
+
scope :unread, -> { where(read_at: nil) }
|
12
|
+
scope :have_read, -> { where.not(read_at: nil) }
|
13
|
+
|
14
|
+
after_create_commit :process_job,
|
15
|
+
:send_email,
|
16
|
+
:update_unread_count
|
17
|
+
|
18
|
+
def process_job
|
19
|
+
make_as_unread
|
20
|
+
if sending_at
|
21
|
+
NotificationJob.set(wait_until: sending_at).perform_later id
|
22
|
+
else
|
23
|
+
NotificationJob.perform_later(self.id)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def send_email
|
28
|
+
return unless email_enable?
|
29
|
+
|
30
|
+
if notify_setting[:mailer_class]
|
31
|
+
notify_method = notify_setting[:mailer_method] || 'notify'
|
32
|
+
if sending_at
|
33
|
+
notify_setting[:mailer_class].public_send(notify_method, self.notifiable_id).deliver_later(wait_until: sending_at)
|
34
|
+
else
|
35
|
+
notify_setting[:mailer_class].public_send(notify_method, self.notifiable_id).deliver_later
|
36
|
+
end
|
37
|
+
else
|
38
|
+
if sending_at
|
39
|
+
RailsNoticeMailer.notify(self.id).deliver_later(wait_until: sending_at)
|
40
|
+
else
|
41
|
+
RailsNoticeMailer.notify(self.id).deliver_later
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def email_enable?
|
47
|
+
if receiver.notification_setting&.accept_email
|
48
|
+
return true
|
49
|
+
end
|
50
|
+
|
51
|
+
if receiver.notification_setting&.accept_email.is_a?(FalseClass)
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
RailsNotice.config.default_send_email
|
56
|
+
end
|
57
|
+
|
58
|
+
def notifiable_detail
|
59
|
+
r = self.notifiable.as_json(**notify_setting.slice(:only, :except, :include, :methods))
|
60
|
+
Hash(r).with_indifferent_access
|
61
|
+
end
|
62
|
+
|
63
|
+
def notifiable_attributes
|
64
|
+
if verbose
|
65
|
+
r = notifiable_detail
|
66
|
+
r.transform_values! do |i|
|
67
|
+
next i unless i.acts_like?(:time)
|
68
|
+
if self.receiver.respond_to?(:timezone)
|
69
|
+
_zone = self.receiver.timezone
|
70
|
+
else
|
71
|
+
_zone = Time.zone.name
|
72
|
+
end
|
73
|
+
i.in_time_zone(_zone).strftime '%Y-%m-%d %H:%M:%S'
|
74
|
+
end
|
75
|
+
r
|
76
|
+
else
|
77
|
+
{}.with_indifferent_access
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def notify_setting
|
82
|
+
notifiable_type.constantize.notifies[self.code] || {}
|
83
|
+
end
|
84
|
+
|
85
|
+
def tr_key(column)
|
86
|
+
"#{self.class.i18n_scope}.notify.#{notifiable.class.base_class.model_name.i18n_key}.#{self.code}.#{column}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def code
|
90
|
+
super ? super.to_sym : :default
|
91
|
+
end
|
92
|
+
|
93
|
+
def title
|
94
|
+
return super unless notifiable
|
95
|
+
tr_values = notifiable_detail.slice *I18nHelper.interpolate_key(I18n.t(tr_key(:title)))
|
96
|
+
tr_values.merge! notify_setting.fetch(:tr_values, {})
|
97
|
+
|
98
|
+
if super.blank?
|
99
|
+
I18n.t tr_key(:title), tr_values
|
100
|
+
else
|
101
|
+
super
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def body
|
106
|
+
return super unless notifiable
|
107
|
+
tr_values = notifiable_detail.slice *I18nHelper.interpolate_key(I18n.t(tr_key(:body)))
|
108
|
+
tr_values.merge! notify_setting.fetch(:tr_values, {})
|
109
|
+
|
110
|
+
if super.blank?
|
111
|
+
I18n.t tr_key(:body), tr_values
|
112
|
+
else
|
113
|
+
super
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def cc_emails
|
118
|
+
r = notify_setting.fetch(:cc_emails, []).map do |i|
|
119
|
+
next i unless i.respond_to?(:call)
|
120
|
+
i.call(notifiable)
|
121
|
+
end
|
122
|
+
r.flatten.concat super
|
123
|
+
end
|
124
|
+
|
125
|
+
def unread_count
|
126
|
+
Rails.cache.read("#{self.receiver_type}_#{self.receiver_id}_unread") || 0
|
127
|
+
end
|
128
|
+
|
129
|
+
def make_as_unread
|
130
|
+
if read_at.present?
|
131
|
+
self.update(read_at: nil)
|
132
|
+
Rails.cache.increment "#{self.receiver_type}_#{self.receiver_id}_unread"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def make_as_read
|
137
|
+
if read_at.blank?
|
138
|
+
update(read_at: Time.now)
|
139
|
+
Rails.cache.decrement "#{self.receiver_type}_#{self.receiver_id}_unread"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def update_unread_count
|
144
|
+
Rails.cache.write "#{self.receiver_type}_#{self.receiver_id}_unread", Notification.where(receiver_id: self.receiver_id, receiver_type: self.receiver_type, read_at: nil).count, raw: true
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.update_unread_count(receiver)
|
148
|
+
if Rails.cache.write "#{receiver.class.name}_#{receiver.id}_unread", Notification.where(receiver_id: receiver.id, receiver_type: receiver.class.name, read_at: nil).count, raw: true
|
149
|
+
Rails.cache.read "#{receiver.class.name}_#{receiver.id}_unread"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
# notifiable_type:
|
156
|
+
# notifiable_id:
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div class="ui vertical fluid icon menu">
|
2
|
+
<div class="header center link item" id="close_side">
|
3
|
+
<i class="content icon"></i>
|
4
|
+
</div>
|
5
|
+
<div class="item ui dropdown">
|
6
|
+
<a class="<%= active_helper(controllers: ['notifications', 'notification_settings', 'notify_settings'], active_class: 'title active', item_class: 'title') %>">
|
7
|
+
<i class="users icon"></i>
|
8
|
+
<span>Notification</span>
|
9
|
+
</a>
|
10
|
+
<div class="<%= active_helper(controllers: ['notifications', 'notification_settings', 'notify_settings'], active_class: 'menu content active', item_class: 'menu content') %>">
|
11
|
+
<%= link_to 'Notification', admin_notifications_path, class: active_helper(controllers: 'notifications') %>
|
12
|
+
<%= link_to 'Receiver Settings', admin_notification_settings_path, class: active_helper(controllers: ['notification_settings']) %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<%= form_with model: [:admin, @notification_setting], local: true do |f| %>
|
2
|
+
<%= render 'shared/error_messages', target: @notification_setting %>
|
3
|
+
<%= f.number_field :showtime %>
|
4
|
+
<%= f.check_box :accept_email %>
|
5
|
+
<%= f.collection_check_boxes :notifiable_types, RailsNotice.notifiable_types, :to_s, :to_s %>
|
6
|
+
<%= f.submit %>
|
7
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= search_form_with do |f| %>
|
2
|
+
<div class="fields">
|
3
|
+
<div class="ui left action input">
|
4
|
+
<%= f.select :receiver_type, options_for_select(Notification.options_i18n(:receiver_type)), { on: { wrapper_input: false } }, { class: 'ui selection dropdown', id: 'q_receiver_type' } %>
|
5
|
+
<%= f.select :receiver_id, options_for_select([]), { on: { wrapper_input: false } }, { id: 'q_receiver_id', class: 'ui search dropdown' } %>
|
6
|
+
</div>
|
7
|
+
<%= f.submit 'Search' %>
|
8
|
+
</div>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<div>
|
2
|
+
|
3
|
+
<div class="ui segment breadcrumb">
|
4
|
+
<%= link_to 'Back', admin_notification_settings_path, class: 'section' %>
|
5
|
+
<div class="divider"> / </div>
|
6
|
+
<div class="active section">Edit</div>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="ui segment">
|
10
|
+
<%= render 'form' %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
</div>
|
14
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<div class="ui top attached menu borderless">
|
2
|
+
<div class="header item">Notification Settings</div>
|
3
|
+
<div class="right menu">
|
4
|
+
<div class="item"><%= link_to 'New Notification Setting', new_admin_notification_setting_path, class: 'ui teal button' %></div>
|
5
|
+
</div>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="ui attached segment">
|
9
|
+
<%= render 'search_form' %>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<table class="ui bottom attached table">
|
13
|
+
<thead>
|
14
|
+
<tr>
|
15
|
+
<th><%= NotificationSetting.human_attribute_name(:id) %></th>
|
16
|
+
<th><%= NotificationSetting.human_attribute_name(:receiver_type) %></th>
|
17
|
+
<th><%= NotificationSetting.human_attribute_name(:receiver_id) %></th>
|
18
|
+
<th><%= NotificationSetting.human_attribute_name(:showtime) %></th>
|
19
|
+
<th><%= NotificationSetting.human_attribute_name(:accept_email) %></th>
|
20
|
+
<th><%= NotificationSetting.human_attribute_name(:notifiable_types) %></th>
|
21
|
+
<th></th>
|
22
|
+
</tr>
|
23
|
+
</thead>
|
24
|
+
|
25
|
+
<tbody>
|
26
|
+
<% @notification_settings.each do |notification_setting| %>
|
27
|
+
<tr>
|
28
|
+
<td><%= notification_setting.id %></td>
|
29
|
+
<td><%= notification_setting.receiver_type %></td>
|
30
|
+
<td><%= notification_setting.receiver_id %></td>
|
31
|
+
<td><%= notification_setting.showtime %></td>
|
32
|
+
<td>
|
33
|
+
<%= form_with model: notification_setting, url: admin_notification_setting_path(notification_setting.id), method: :patch, remote: true do |f| %>
|
34
|
+
<%= f.check_box :accept_email, onChange: "Rails.fire(this.form, 'submit')", label: false, on: {wrapper_all: false, offset: false} %>
|
35
|
+
<% end %>
|
36
|
+
</td>
|
37
|
+
<td class="ui labels">
|
38
|
+
<% notification_setting.notifiable_types.each do |notifiable_type| %>
|
39
|
+
<span class="ui label"><%= notifiable_type %></span>
|
40
|
+
<% end %>
|
41
|
+
</td>
|
42
|
+
<td class="ui labels">
|
43
|
+
<%= link_to 'Show', admin_notification_setting_path(notification_setting), class: 'ui blue label' %>
|
44
|
+
<%= link_to 'Edit', edit_admin_notification_setting_path(notification_setting), class: 'ui pink label' %>
|
45
|
+
<%= link_to 'Destroy', admin_notification_setting_path(notification_setting), method: :delete, data: { confirm: 'Are you sure?' }, class: 'ui red label' %>
|
46
|
+
</td>
|
47
|
+
</tr>
|
48
|
+
<% end %>
|
49
|
+
</tbody>
|
50
|
+
</table>
|
51
|
+
|
52
|
+
<%= paginate @notification_settings %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div>
|
2
|
+
|
3
|
+
<div class="ui segment breadcrumb">
|
4
|
+
<%= link_to 'Back', admin_notification_settings_path, class: 'section' %>
|
5
|
+
<div class="divider"> / </div>
|
6
|
+
<div class="active section">Add</div>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="ui segment">
|
10
|
+
<%= render 'form' %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
</div>
|
File without changes
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= search_form_with scope: :q do |f| %>
|
2
|
+
<div class="fields">
|
3
|
+
<div class="ui left action input">
|
4
|
+
<%= f.select :receiver_type, options_for_select(Notification.options_i18n(:receiver_type)), { on: { wrapper_input: false } }, { class: 'ui selection dropdown', id: 'q_receiver_type' } %>
|
5
|
+
<%= f.select :receiver_id, options_for_select([]), { on: { wrapper_input: false } }, { id: 'q_receiver_id', class: 'ui search dropdown' } %>
|
6
|
+
</div>
|
7
|
+
<%= f.text_field :'body-like' %>
|
8
|
+
<%= f.submit 'Search' %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<div class="sixteen wide column">
|
2
|
+
|
3
|
+
<div class="ui breadcrumb">
|
4
|
+
<%= link_to '返回', admin_user_notifications_path, class: 'section' %>
|
5
|
+
<div class="divider"> / </div>
|
6
|
+
<div class="active section">编辑</div>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div>
|
10
|
+
<%= render 'form' %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
</div>
|
14
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<%= render 'menu' %>
|
2
|
+
|
3
|
+
<div class="ui attached segment">
|
4
|
+
<%= render 'search_form' %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<table class="ui table">
|
8
|
+
<thead>
|
9
|
+
<tr>
|
10
|
+
<th>ID</th>
|
11
|
+
<th>Receiver Type</th>
|
12
|
+
<th>Receiver ID</th>
|
13
|
+
<th>Title</th>
|
14
|
+
<th>Body</th>
|
15
|
+
<th>Link</th>
|
16
|
+
<th>Read At</th>
|
17
|
+
<th>Sent Result</th>
|
18
|
+
<th>Operation</th>
|
19
|
+
</tr>
|
20
|
+
</thead>
|
21
|
+
|
22
|
+
<tbody>
|
23
|
+
<% @notifications.each do |notification| %>
|
24
|
+
<tr>
|
25
|
+
<td><%= notification.id %></td>
|
26
|
+
<td><%= notification.receiver_type %></td>
|
27
|
+
<td><%= notification.receiver_id %></td>
|
28
|
+
<td><%= notification.title %></td>
|
29
|
+
<td><%= notification.body %></td>
|
30
|
+
<td><%= notification.link %></td>
|
31
|
+
<td><%= notification.read_at %></td>
|
32
|
+
<td>
|
33
|
+
<code><%= notification.sent_result %></code>
|
34
|
+
</td>
|
35
|
+
<td class="ui labels">
|
36
|
+
<%= link_to 'Push', push_admin_notification_path(notification), method: :patch, remote: true, data: { confirm: 'Are you sure?' }, class: 'ui mini green label' %>
|
37
|
+
<%= link_to 'Email', email_admin_notification_path(notification), method: :patch, remote: true, data: { confirm: 'Are you sure?' }, class: 'ui mini green label' %>
|
38
|
+
</td>
|
39
|
+
</tr>
|
40
|
+
<% end %>
|
41
|
+
</tbody>
|
42
|
+
</table>
|
43
|
+
|
44
|
+
<%= paginate @notifications %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div class="three wide column">
|
2
|
+
<%= render 'admin/users/nav' %>
|
3
|
+
</div>
|
4
|
+
|
5
|
+
<div class="thirteen wide column">
|
6
|
+
<div class="ui breadcrumb">
|
7
|
+
<%= link_to 'Back', admin_user_notifications_path(@user), class: 'section' %>
|
8
|
+
<div class="divider"> / </div>
|
9
|
+
<div class="active section">New</div>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div>
|
13
|
+
<%= render 'form' %>
|
14
|
+
</div>
|
15
|
+
</div>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<p>Dear <%= @notification.receiver.endearing_name %>,</p>
|
2
|
+
|
3
|
+
<p><%= @notification.body %></p>
|
4
|
+
|
5
|
+
<% if @notification.notifiable && @notification.verbose %>
|
6
|
+
|
7
|
+
<table class="ui very basic table">
|
8
|
+
<tbody>
|
9
|
+
<% @notification.notifiable_attributes.each do |key, value| %>
|
10
|
+
<tr>
|
11
|
+
<td class="right aligned">
|
12
|
+
<%= @notification.notifiable.class.human_attribute_name(key) %>
|
13
|
+
</td>
|
14
|
+
<td>
|
15
|
+
<% if value.is_a?(Hash) %>
|
16
|
+
<%= simple_format_hash(value) %>
|
17
|
+
<% elsif value.is_a?(String) && @notification.notifiable.column_for_attribute(key).limit.to_i > 255 %>
|
18
|
+
<%= simple_format(value) %>
|
19
|
+
<% else %>
|
20
|
+
<%= value %>
|
21
|
+
<% end %>
|
22
|
+
</td>
|
23
|
+
</tr>
|
24
|
+
<% end %>
|
25
|
+
</tbody>
|
26
|
+
</table>
|
27
|
+
|
28
|
+
<% end %>
|
29
|
+
|
30
|
+
<p><%= t('rails_notice.detail') %>: <%= link_to @notification.link, @notification.link %></p>
|
31
|
+
|
32
|
+
<% if @notification.sender %>
|
33
|
+
<p>Best,<br>
|
34
|
+
<%= @notification.sender.endearing_name %></p>
|
35
|
+
<% end %>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<div class="ui menu vertical fluid">
|
2
|
+
<%= link_to t('rails_notice.unread'), notifications_path(receiver: params[:receiver]), class: active_params(scope: '', active_class: 'item active', item_class: 'item') %>
|
3
|
+
<%= link_to t('rails_notice.readed'), notifications_path(receiver: params[:receiver], scope: 'have_read'), class: active_params(scope: 'have_read', active_class: 'item active', item_class: 'item') %>
|
4
|
+
</div>
|