notifly 0.0.7 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +77 -14
- data/app/assets/javascripts/notifly.js +9 -1
- data/app/assets/javascripts/notifly/get_notifications.js.erb +17 -16
- data/app/assets/javascripts/notifly/more_notifications.js.erb +23 -0
- data/app/assets/javascripts/notifly/read_notifications.js.erb +22 -0
- data/app/assets/javascripts/notifly/seen_notifications.js.erb +22 -0
- data/app/controllers/notifly/notifications_controller.rb +32 -13
- data/app/mailers/notifly/notification_mailer.rb +21 -0
- data/app/models/notifly/notification.rb +24 -3
- data/app/views/notifly/layouts/_notification.html.erb +1 -1
- data/app/views/notifly/layouts/_notifly.html.erb +6 -3
- data/app/views/notifly/notification_mailer/notifly.html.erb +2 -0
- data/app/views/notifly/notifications/index.js.erb +28 -15
- data/app/views/notifly/notifications/{read_specific.js.erb → read.js.erb} +1 -1
- data/app/views/notifly/notifications/seen.js.erb +2 -0
- data/app/views/notifly/notifications/toggle_read.js.erb +1 -1
- data/app/views/notifly/templates/mails/_default.html.erb +1 -0
- data/app/views/notifly/templates/{_default.html.erb → notifications/_default.html.erb} +0 -0
- data/config/locales/en.yml +4 -0
- data/config/routes.rb +2 -3
- data/db/migrate/20141125165636_add_mail_to_notifly_notifications.rb +5 -0
- data/lib/generators/notifly/install/install_generator.rb +2 -1
- data/lib/generators/notifly/install/templates/config/initializers/notifly.rb +12 -0
- data/lib/generators/notifly/views/views_generator.rb +17 -2
- data/lib/notifly.rb +6 -0
- data/lib/notifly/engine.rb +0 -1
- data/lib/notifly/models/flyable.rb +13 -4
- data/lib/notifly/models/options/fly.rb +15 -3
- metadata +13 -22
- data/app/assets/javascripts/notifly/counter.js.erb +0 -23
- data/app/views/notifly/layouts/_footer.html.erb +0 -3
- data/app/views/notifly/notifications/counter.js.erb +0 -2
- data/lib/generators/notifly/views/USAGE +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7dcf76340dfa95ff24b649a6bdf908dbbbfaafa2
|
4
|
+
data.tar.gz: ee70a15bd945e508b4bbe4c81701bb2f3df0a1e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62ad12ece6bc6fcdd874c83e26e7092ca7c4b65693f45c5bcaf8f8aa5d0762b0541b60acc23b6cbd27509bd881b0318256017171fb07a1711720b0b20810a7e1
|
7
|
+
data.tar.gz: c6943c8fdc1c939ff618c8d37307ebe0436d705a74ba0c4d82517a7e263fad52d72c36f8d1645eaa06596c26789cec2ec12c27382a4f39a95b34a70c370acdc5
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# Notifly
|
1
|
+
# Notifly
|
2
|
+
[![Build Status](https://travis-ci.org/algorich/notifly.svg?branch=master)](https://travis-ci.org/algorich/notifly) [![Gem Version](https://badge.fury.io/rb/notifly.svg)](http://badge.fury.io/rb/notifly) [![Dependency Status](https://gemnasium.com/algorich/notifly.svg)](https://gemnasium.com/algorich/notifly)
|
2
3
|
|
3
4
|
This project is still under development and it intend to offer a full notification
|
4
5
|
system, back and front-end. Questions and suggestions are welcome and you can
|
@@ -48,7 +49,7 @@ Notifly **need** to storage the notifications and to do it you need to run the m
|
|
48
49
|
|
49
50
|
We have two ways to create notifications:
|
50
51
|
|
51
|
-
|
52
|
+
### Using `#notifly` method in your classes (as callback)
|
52
53
|
|
53
54
|
If you want to create notifications after (or before) **any** method call.
|
54
55
|
|
@@ -90,7 +91,7 @@ notiflies and set the values to all notiflies. If you need to overwrite some
|
|
90
91
|
default value, just declare it again like the `:accept_gift` notifly above.
|
91
92
|
|
92
93
|
|
93
|
-
|
94
|
+
### Using `#notifly!` method on your receiver object
|
94
95
|
|
95
96
|
If you need to create notifications without callbacks, even in the
|
96
97
|
controller scope.
|
@@ -123,12 +124,61 @@ end
|
|
123
124
|
|
124
125
|
The receiver will be always the object which you call `#notifly!`
|
125
126
|
|
127
|
+
### Mail
|
128
|
+
|
129
|
+
Notifly can send mails too. To do it, just add the option `mail` to your notifly
|
130
|
+
statement
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
class TicketOrder < ActiveRecord::Base
|
134
|
+
belongs_to :ticket
|
135
|
+
belongs_to :buyer
|
136
|
+
belongs_to :owner
|
137
|
+
|
138
|
+
notifly default_values: { receiver: :owner }
|
139
|
+
|
140
|
+
notifly before: :destroy, template: :destroy_order_notification, sender: :buyer,
|
141
|
+
data: :attributes, email: { template: :destroy_order_mail }
|
142
|
+
notifly after: :send_gift!, template: :ticket_gift, sender: :buyer,
|
143
|
+
target: :ticket, email: true, if: -> { completed? }
|
144
|
+
notifly after: :accept_gift, sender: :owner, receiver: :buyer, target: :ticket,
|
145
|
+
template: :accept_gift, email: { only: true }
|
146
|
+
|
147
|
+
def send_gift!
|
148
|
+
# code here
|
149
|
+
end
|
150
|
+
|
151
|
+
def accept_gift
|
152
|
+
# code here
|
153
|
+
end
|
154
|
+
end
|
155
|
+
```
|
156
|
+
|
157
|
+
| Email | Description |
|
158
|
+
| ---------------------------- | ----------- |
|
159
|
+
| `true` | send email and notification using notifly template |
|
160
|
+
| `only: true` | send only an email using notifly template |
|
161
|
+
| `template: :foo` | send email using `foo` mail template and a notification using notifly template |
|
162
|
+
|
163
|
+
Notiflies with `mail: { only: true }` will persist notifications, but them won't
|
164
|
+
be in receivers notifications views. If you use [delayed_job](https://github.com/collectiveidea/delayed_job)
|
165
|
+
or [sidekiq](https://github.com/mperham/sidekiq) mails will be sent async.
|
166
|
+
|
167
|
+
### Notifications access
|
168
|
+
|
126
169
|
You can access the notifications using the following methods:
|
127
170
|
|
128
|
-
- `receiver_object.
|
171
|
+
- `receiver_object.notifly_notifications`
|
129
172
|
- Querying `Notifly::Notifications`
|
130
173
|
- Using our front-end helpers
|
131
174
|
|
175
|
+
#### Useful scopes
|
176
|
+
|
177
|
+
- all_from: used on `Notifly::Notifications` to show notifications from a specific receiver
|
178
|
+
- unseen: used on `Notifly::Notifications` and `#notifly_notifications` to show **only** unseen notifications
|
179
|
+
- not_only-mail: used on `Notifly::Notifications` and `#notifly_notifications` to remove notification that are **mail only**
|
180
|
+
|
181
|
+
|
132
182
|
## Front-end
|
133
183
|
|
134
184
|
First, you need to have a `current_user` in `ApplicationController`, if you use
|
@@ -156,17 +206,29 @@ This will inject our views and it will be like that
|
|
156
206
|
|
157
207
|
![image](http://upl.io/i/4i26o3.png)
|
158
208
|
|
159
|
-
|
160
|
-
|
161
|
-
or create them in `app/views/notifly/templates
|
209
|
+
Notifications and Mails are rendered with their templates. They use a simple default
|
210
|
+
template but if you want to change or create new ones run the generate below
|
211
|
+
with the option that you want or create them in `app/views/notifly/templates/`.
|
212
|
+
Remember that notifications templates should be in `notifications` folder and
|
213
|
+
mails templates in `mails` folder.
|
162
214
|
|
163
215
|
```shell
|
164
216
|
$ rails generate notifly:views
|
165
217
|
```
|
166
218
|
|
167
|
-
|
168
|
-
|
169
|
-
|
219
|
+
| Option | Description |
|
220
|
+
| ---------------- | ----------- |
|
221
|
+
| `--notification` | generates notifications templates files |
|
222
|
+
| `--layout` | generates layout files |
|
223
|
+
| `--mail` | generates mail templates files |
|
224
|
+
|
225
|
+
If you already have a layout and just want add our features to it, take a look
|
226
|
+
at [Adapting your layout](#adapting).
|
227
|
+
|
228
|
+
### I18n
|
229
|
+
|
230
|
+
Notifly uses I18n to render the mail's subject and if you run the install generator
|
231
|
+
you can change it in `config/locales/notifly.en.yaml` or create your own.
|
170
232
|
|
171
233
|
### <a name='adapting'></a> Adapting your layout
|
172
234
|
|
@@ -188,13 +250,14 @@ Above are the elements that will loading the Notifly in your layout
|
|
188
250
|
this element will contain all notifications (`_notification.html.erb`) rendered
|
189
251
|
by `_index.html.erb`
|
190
252
|
- **Next page link**: this link will append the next notifications page to the
|
191
|
-
`#notifly-notifications-container`,
|
192
|
-
|
253
|
+
`#notifly-notifications-container`, it should be in the page and should have
|
254
|
+
the id `#notifly-more-notifications-link`. This link should not have a href.
|
255
|
+
- **Mark as read**: this link will mark all notifications in the page as read,
|
256
|
+
it should be in the page and should have the id `#notifly-mark-as-read-link`.
|
257
|
+
This link should not have a href.
|
193
258
|
- **Loading**: html element that will be showing while the notifications request
|
194
259
|
isn't completed. It should be in `#notifly-notifications-container` and should
|
195
260
|
have the class `loading`
|
196
|
-
- **Mark as read**: this link will mark all notifications in the page as read,
|
197
|
-
it will be rendered in `#notifly-header-actions`
|
198
261
|
- **Toggle read**: this link will be rendered by `_actions.html.erb' in
|
199
262
|
`_notification.html.erb`
|
200
263
|
|
@@ -1,5 +1,13 @@
|
|
1
1
|
//= require 'jquery'
|
2
2
|
//= require 'jquery_ujs'
|
3
|
-
//= require 'notifly/counter'
|
4
3
|
//= require 'notifly/get_notifications'
|
4
|
+
//= require 'notifly/seen_notifications'
|
5
|
+
//= require 'notifly/read_notifications'
|
6
|
+
//= require 'notifly/more_notifications'
|
5
7
|
//= require 'twitter/bootstrap'
|
8
|
+
|
9
|
+
$(document).ready(function() {
|
10
|
+
$(document).on('click', '#notifly-notifications-panel.dropdown-menu', function (e) {
|
11
|
+
$('#notifly').hasClass('keep_open') && e.stopPropagation();
|
12
|
+
});
|
13
|
+
});
|
@@ -1,26 +1,27 @@
|
|
1
1
|
<% notifly = Notifly::Engine.routes.url_helpers %>
|
2
|
-
var
|
2
|
+
var notiflyLastNotification, notiflyFirstNotification;
|
3
3
|
|
4
4
|
var _notiflyGetNotifications = function () {
|
5
|
-
var $notifly = $('#notifly
|
5
|
+
var $notifly = $('#notifly');
|
6
6
|
|
7
|
-
$notifly
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
7
|
+
if($notifly !== undefined) {
|
8
|
+
$.ajax({
|
9
|
+
url: '<%= notifly.notifications_path %>',
|
10
|
+
data: {
|
11
|
+
scope: 'newer',
|
12
|
+
reference_notification_id: notiflyFirstNotification || null,
|
13
|
+
mark_as_seen: $notifly.hasClass('open')
|
14
|
+
},
|
15
|
+
type: 'GET',
|
16
|
+
complete: _notiflyRepeatRequest
|
17
|
+
});
|
18
|
+
}
|
18
19
|
};
|
19
20
|
|
20
|
-
var
|
21
|
-
|
21
|
+
var _notiflyRepeatRequest = function () {
|
22
|
+
setTimeout(_notiflyGetNotifications, <%= Notifly.timeout %>);
|
22
23
|
};
|
23
24
|
|
24
25
|
$(document).ready(function() {
|
25
26
|
_notiflyGetNotifications();
|
26
|
-
});
|
27
|
+
});
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<% notifly = Notifly::Engine.routes.url_helpers %>
|
2
|
+
|
3
|
+
var _notiflyMoreNotifications = function () {
|
4
|
+
var $notifly = $('#notifly');
|
5
|
+
|
6
|
+
if($notifly != undefined) {
|
7
|
+
$notifly.find('#notifly-more-notifications-link').click(function () {
|
8
|
+
$.ajax({
|
9
|
+
url: '<%= notifly.notifications_path %>',
|
10
|
+
data: {
|
11
|
+
scope: 'older',
|
12
|
+
reference_notification_id: notiflyLastNotification,
|
13
|
+
mark_as_seen: $notifly.hasClass('open')
|
14
|
+
},
|
15
|
+
type: 'GET'
|
16
|
+
});
|
17
|
+
});
|
18
|
+
}
|
19
|
+
};
|
20
|
+
|
21
|
+
$(document).ready(function() {
|
22
|
+
_notiflyMoreNotifications();
|
23
|
+
});
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<% notifly = Notifly::Engine.routes.url_helpers %>
|
2
|
+
|
3
|
+
var _notiflyReadNotifications = function () {
|
4
|
+
var $notifly = $('#notifly-mark-as-read-link');
|
5
|
+
|
6
|
+
if($notifly != undefined) {
|
7
|
+
$notifly.click(function () {
|
8
|
+
$.ajax({
|
9
|
+
url: '<%= notifly.read_notifications_path %>',
|
10
|
+
data: {
|
11
|
+
first_notification_id: notiflyFirstNotification,
|
12
|
+
last_notification_id: notiflyLastNotification
|
13
|
+
},
|
14
|
+
type: 'PUT'
|
15
|
+
});
|
16
|
+
});
|
17
|
+
}
|
18
|
+
};
|
19
|
+
|
20
|
+
$(document).ready(function() {
|
21
|
+
_notiflyReadNotifications();
|
22
|
+
});
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<% notifly = Notifly::Engine.routes.url_helpers %>
|
2
|
+
|
3
|
+
var _notiflySeenNotifications = function () {
|
4
|
+
var $trigger = $('#notifly-trigger');
|
5
|
+
|
6
|
+
if($trigger !== undefined) {
|
7
|
+
$trigger.click(function () {
|
8
|
+
$.ajax({
|
9
|
+
url: '<%= notifly.seen_notifications_path %>',
|
10
|
+
data: {
|
11
|
+
first_notification_id: notiflyFirstNotification,
|
12
|
+
last_notification_id: notiflyLastNotification
|
13
|
+
},
|
14
|
+
type: 'PUT'
|
15
|
+
});
|
16
|
+
});
|
17
|
+
}
|
18
|
+
};
|
19
|
+
|
20
|
+
$(document).ready(function() {
|
21
|
+
_notiflySeenNotifications();
|
22
|
+
});
|
@@ -2,21 +2,19 @@ require_dependency "notifly/application_controller"
|
|
2
2
|
|
3
3
|
module Notifly
|
4
4
|
class NotificationsController < ApplicationController
|
5
|
-
def counter
|
6
|
-
@counter = count_unseen
|
7
|
-
end
|
8
|
-
|
9
5
|
def index
|
10
|
-
@notifications =
|
11
|
-
|
6
|
+
@notifications = scoped_notifications
|
7
|
+
@notifications.update_all(seen: true) if params[:mark_as_seen] == 'true'
|
8
|
+
|
12
9
|
@counter = count_unseen
|
10
|
+
@scope_param = scope_param
|
13
11
|
end
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
def read
|
14
|
+
if params[:first_notification_id].present? and params[:last_notification_id].present?
|
15
|
+
@notifications = notifications_between
|
16
|
+
@notifications.update_all(read: true)
|
17
|
+
end
|
20
18
|
end
|
21
19
|
|
22
20
|
def toggle_read
|
@@ -24,13 +22,34 @@ module Notifly
|
|
24
22
|
@notification.update(read: !@notification.read)
|
25
23
|
end
|
26
24
|
|
25
|
+
def seen
|
26
|
+
if params[:first_notification_id].present? and params[:last_notification_id].present?
|
27
|
+
@notifications = notifications_between
|
28
|
+
@notifications.update_all(seen: true)
|
29
|
+
end
|
30
|
+
@counter = count_unseen
|
31
|
+
end
|
32
|
+
|
27
33
|
private
|
34
|
+
def scoped_notifications
|
35
|
+
current_user_notifications.send(scope_param, than: params[:reference_notification_id])
|
36
|
+
end
|
37
|
+
|
38
|
+
def scope_param
|
39
|
+
return params[:scope] if ['older', 'newer'].include?(params[:scope])
|
40
|
+
end
|
41
|
+
|
28
42
|
def current_user_notifications
|
29
|
-
|
43
|
+
current_user.notifly_notifications.not_only_mail
|
30
44
|
end
|
31
45
|
|
32
46
|
def count_unseen
|
33
|
-
|
47
|
+
current_user_notifications.unseen.count
|
48
|
+
end
|
49
|
+
|
50
|
+
def notifications_between
|
51
|
+
current_user_notifications.between(params[:first_notification_id],
|
52
|
+
params[:last_notification_id])
|
34
53
|
end
|
35
54
|
end
|
36
55
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Notifly
|
2
|
+
class NotificationMailer < ActionMailer::Base
|
3
|
+
default from: Notifly.mailer_sender
|
4
|
+
|
5
|
+
def notifly(to: nil, notification_id: nil, template: nil)
|
6
|
+
if defined? Delayed::Job or defined? Sidekiq::Worker
|
7
|
+
delay.send_notification(to, notification_id, template)
|
8
|
+
else
|
9
|
+
send_notification(to, notification_id, template).deliver
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def send_notification(to, notification_id, template)
|
15
|
+
@notification = Notifly::Notification.find(notification_id)
|
16
|
+
@template = template
|
17
|
+
|
18
|
+
mail to: to, subject: t("notifly.mail_subject.#{@template}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -6,10 +6,31 @@ module Notifly
|
|
6
6
|
|
7
7
|
before_validation :convert_data, :set_template
|
8
8
|
|
9
|
-
scope :all_from,
|
10
|
-
scope :
|
9
|
+
scope :all_from, -> (receiver) { where(receiver: receiver) }
|
10
|
+
scope :unseen, -> { where(seen: false) }
|
11
|
+
scope :not_only_mail, -> { where.not(mail: 'only') }
|
12
|
+
scope :limited, -> { limit(Notifly.per_page) }
|
13
|
+
scope :ordered, -> { order('created_at DESC') }
|
14
|
+
scope :newer, ->(than: nil) do
|
15
|
+
return ordered.limited if than.blank?
|
11
16
|
|
12
|
-
|
17
|
+
reference = find(than)
|
18
|
+
ordered.where('created_at > ?', reference.created_at).where.not(id: reference)
|
19
|
+
end
|
20
|
+
scope :older, ->(than: nil) do
|
21
|
+
reference = find(than)
|
22
|
+
|
23
|
+
ordered.
|
24
|
+
where('created_at < ?', reference.created_at).
|
25
|
+
where.not(id: reference).
|
26
|
+
limited
|
27
|
+
end
|
28
|
+
scope :between, ->(first, last) do
|
29
|
+
notifications = where(id: [first, last])
|
30
|
+
where(created_at: (notifications.first.created_at..notifications.last.created_at))
|
31
|
+
end
|
32
|
+
|
33
|
+
validates :receiver, :template, :mail, presence: true
|
13
34
|
|
14
35
|
def data
|
15
36
|
YAML.load(read_attribute(:data))
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<% read = notification.read ? '' : 'notifly-notification-not-read' %>
|
4
4
|
|
5
5
|
<div id='<%= "notifly-notification-#{notification.id}" %>' class="notifly-notification <%= read %>">
|
6
|
-
<%= render partial: "notifly/templates/#{notification.template}",
|
6
|
+
<%= render partial: "notifly/templates/notifications/#{notification.template}",
|
7
7
|
locals: { notification: notification } %>
|
8
8
|
|
9
9
|
<span class="notifly-notification-actions">
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<!-- This partial requires the locals: receiver -->
|
2
2
|
|
3
|
-
<div id="notifly" class="dropdown">
|
3
|
+
<div id="notifly" class="dropdown keep_open">
|
4
4
|
|
5
|
-
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
5
|
+
<a id="notifly-trigger" href="#" class="dropdown-toggle" data-toggle="dropdown">
|
6
6
|
<span id="notifly-counter"></span>
|
7
7
|
<span id="notifly-icon"><%= notifly_icon %></span>
|
8
8
|
</a>
|
@@ -13,6 +13,7 @@
|
|
13
13
|
Notifications
|
14
14
|
|
15
15
|
<span id="notifly-header-actions" class="pull-right">
|
16
|
+
<%= link_to 'Mark as read', '#', id: 'notifly-mark-as-read-link' %>
|
16
17
|
</span>
|
17
18
|
</div>
|
18
19
|
|
@@ -20,6 +21,8 @@
|
|
20
21
|
<div class="loading">Loading notifications...</div>
|
21
22
|
</div>
|
22
23
|
|
23
|
-
<div id="notifly-notifications-footer"
|
24
|
+
<div id="notifly-notifications-footer">
|
25
|
+
<%= link_to 'More', '#', id: 'notifly-more-notifications-link' %>
|
26
|
+
</div>
|
24
27
|
</div>
|
25
28
|
</div>
|
@@ -1,20 +1,33 @@
|
|
1
|
-
<%
|
2
|
-
|
3
|
-
|
1
|
+
<% rendered_notifications = render partial: 'notifly/layouts/index',
|
2
|
+
locals: { notifications: @notifications } %>
|
3
|
+
<% last_notification = @notifications.last.try(:id) %>
|
4
|
+
<% first_notification = @notifications.first.try(:id) %>
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
remote: true, method: :put
|
6
|
+
<% if @notifications.any? %>
|
7
|
+
$('#notifly-notifications-content .loading').remove();
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
<% if @scope_param == 'older' %>
|
10
|
+
$('#notifly-notifications-content').append("<%= j rendered_notifications %>");
|
11
|
+
notiflyLastNotification = <%= last_notification %>;
|
12
12
|
|
13
|
-
|
13
|
+
<% else %>
|
14
|
+
$('#notifly-notifications-content').prepend("<%= j rendered_notifications %>");
|
15
|
+
notiflyFirstNotification = <%= first_notification %>;
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
$('#notifly-notifications-footer').html("<%= escape_javascript rendered_footer %>");
|
17
|
+
if (notiflyLastNotification == undefined)
|
18
|
+
notiflyLastNotification = <%= last_notification %>;
|
18
19
|
|
19
|
-
|
20
|
-
|
20
|
+
<% end %>
|
21
|
+
|
22
|
+
<% else %>
|
23
|
+
if (notiflyLastNotification == undefined)
|
24
|
+
$('#notifly-more-notifications-link').remove();
|
25
|
+
|
26
|
+
<% end %>
|
27
|
+
|
28
|
+
<% if @scope_param == 'older' and Notifly::Notification.older(than: last_notification).blank? %>
|
29
|
+
$('#notifly-more-notifications-link').remove();
|
30
|
+
<% end %>
|
31
|
+
|
32
|
+
$('#notifly-counter').html("<%= j(render 'notifly/layouts/counter', counter: @counter)%>");
|
33
|
+
$('#notifly-icon').html("<%= j notifly_icon(@counter > 0) %>")
|
@@ -0,0 +1 @@
|
|
1
|
+
Default notification mail
|
File without changes
|
data/config/routes.rb
CHANGED
@@ -15,7 +15,8 @@ module Notifly
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def copy_config
|
18
|
-
template
|
18
|
+
template 'config/initializers/notifly.rb'
|
19
|
+
copy_file '../../../../../config/locales/en.yml', 'config/locales/notifly.en.yml'
|
19
20
|
end
|
20
21
|
|
21
22
|
def remember_to_install_migrations
|
@@ -1,4 +1,16 @@
|
|
1
1
|
Notifly.setup do |config|
|
2
2
|
# Define how many notifications per page.
|
3
3
|
config.per_page = 10
|
4
|
+
|
5
|
+
# Define the time interval in miliseconfs between requests to check notifications.
|
6
|
+
config.timeout = 10000
|
7
|
+
|
8
|
+
# Define the notifly icon from font-awesome-rails
|
9
|
+
config.icon = 'bell'
|
10
|
+
|
11
|
+
# Define the notifly icon size
|
12
|
+
config.icon_size = '2x'
|
13
|
+
|
14
|
+
# Define your mailer sender
|
15
|
+
config.mailer_sender = 'change-me-at-config-initializers-notifly@exemple.com'
|
4
16
|
end
|
@@ -2,10 +2,17 @@ module Notifly
|
|
2
2
|
module Generators
|
3
3
|
class ViewsGenerator < Rails::Generators::Base
|
4
4
|
source_root File.expand_path('../../../../../app/views/notifly', __FILE__)
|
5
|
-
|
5
|
+
|
6
|
+
class_option :layout, type: :boolean, default: false,
|
7
|
+
desc: 'Include/Remove layout files.'
|
8
|
+
class_option :mail, type: :boolean, default: false,
|
9
|
+
desc: 'Include/Remove mails templates files.'
|
10
|
+
class_option :notification, type: :boolean, default: false,
|
11
|
+
desc: 'Include/Remove notifications templates files.'
|
6
12
|
|
7
13
|
def copy_views
|
8
|
-
|
14
|
+
notifications_templates if options.notification?
|
15
|
+
notifications_mails_templates if options.mail?
|
9
16
|
layout_files if options.layout?
|
10
17
|
end
|
11
18
|
|
@@ -14,6 +21,14 @@ module Notifly
|
|
14
21
|
'app/views/notifly'
|
15
22
|
end
|
16
23
|
|
24
|
+
def notifications_templates
|
25
|
+
directory 'templates/notifications', "#{main_app_path}/templates/notifications"
|
26
|
+
end
|
27
|
+
|
28
|
+
def notifications_mails_templates
|
29
|
+
directory 'templates/mails', "#{main_app_path}/templates/mails"
|
30
|
+
end
|
31
|
+
|
17
32
|
def layout_files
|
18
33
|
directory 'layouts', "#{main_app_path}/layouts"
|
19
34
|
end
|
data/lib/notifly.rb
CHANGED
@@ -16,6 +16,12 @@ module Notifly
|
|
16
16
|
mattr_accessor :icon_empty
|
17
17
|
@@icon_empty = 'bell-o'
|
18
18
|
|
19
|
+
mattr_accessor :mailer_sender
|
20
|
+
@@mailer_sender = 'change-me-at-config-initializers-notifly@exemple.com'
|
21
|
+
|
22
|
+
mattr_accessor :timeout
|
23
|
+
@@timeout = 10000
|
24
|
+
|
19
25
|
# Default way to setup Notifly. Run rails generate notifly:install to create
|
20
26
|
# a fresh initializer with all configuration values.
|
21
27
|
def self.setup
|
data/lib/notifly/engine.rb
CHANGED
@@ -91,11 +91,20 @@ module Notifly
|
|
91
91
|
|
92
92
|
def _create_notification_for(fly)
|
93
93
|
new_fly = _default_fly.merge(fly)
|
94
|
-
Notifly::Notification.create
|
94
|
+
notification = Notifly::Notification.create _get_attributes_from(new_fly)
|
95
|
+
|
96
|
+
if new_fly.mail.present?
|
97
|
+
template = new_fly.mail.try(:fetch, :template) || notification.template
|
98
|
+
|
99
|
+
Notifly::NotificationMailer.notifly to: self.email, template: template,
|
100
|
+
notification_id: notification.id
|
101
|
+
end
|
102
|
+
rescue => e
|
103
|
+
logger.error "Something goes wrong with Notifly, will ignore: #{e}"
|
95
104
|
end
|
96
105
|
|
97
|
-
def notifly_notifications
|
98
|
-
Notifly::Notification.
|
106
|
+
def notifly_notifications
|
107
|
+
Notifly::Notification.all_from(self)
|
99
108
|
end
|
100
109
|
|
101
110
|
private
|
@@ -114,7 +123,7 @@ module Notifly
|
|
114
123
|
end
|
115
124
|
|
116
125
|
def _eval_for(key, value)
|
117
|
-
if key.to_sym
|
126
|
+
if [:template, :mail].include? key.to_sym
|
118
127
|
value
|
119
128
|
elsif value == :self
|
120
129
|
self
|
@@ -3,7 +3,7 @@ module Notifly
|
|
3
3
|
module Options
|
4
4
|
class Fly
|
5
5
|
attr_accessor :before, :after, :template, :sender, :receiver, :target,
|
6
|
-
:if, :unless, :data
|
6
|
+
:if, :unless, :data, :mail
|
7
7
|
|
8
8
|
def initialize(options={})
|
9
9
|
options = options.fetch(:default_values, options)
|
@@ -23,13 +23,25 @@ module Notifly
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def attributes
|
26
|
-
|
26
|
+
no_attrs = [hook, :if, :unless, :mail]
|
27
|
+
attrs = instance_values.reject { |key| no_attrs.include? key.to_sym }
|
28
|
+
attrs.merge({mail: get_mail_type})
|
27
29
|
end
|
28
30
|
|
29
31
|
def merge(fly)
|
30
32
|
raise TypeError, "#{fly} is not a Fly" unless fly.is_a? self.class
|
31
33
|
|
32
|
-
Notifly::Models::Options::Fly.new
|
34
|
+
Notifly::Models::Options::Fly.new instance_values.merge(fly.instance_values)
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_mail_type
|
38
|
+
if mail == true
|
39
|
+
:always
|
40
|
+
elsif mail.present? and mail[:only]
|
41
|
+
:only
|
42
|
+
else
|
43
|
+
:never
|
44
|
+
end
|
33
45
|
end
|
34
46
|
end
|
35
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: notifly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Passalini
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -45,20 +45,6 @@ dependencies:
|
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '3.0'
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: kaminari
|
50
|
-
requirement: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.16.1
|
55
|
-
type: :runtime
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.16.1
|
62
48
|
- !ruby/object:Gem::Dependency
|
63
49
|
name: font-awesome-rails
|
64
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -255,34 +241,39 @@ files:
|
|
255
241
|
- README.md
|
256
242
|
- Rakefile
|
257
243
|
- app/assets/javascripts/notifly.js
|
258
|
-
- app/assets/javascripts/notifly/counter.js.erb
|
259
244
|
- app/assets/javascripts/notifly/get_notifications.js.erb
|
245
|
+
- app/assets/javascripts/notifly/more_notifications.js.erb
|
246
|
+
- app/assets/javascripts/notifly/read_notifications.js.erb
|
247
|
+
- app/assets/javascripts/notifly/seen_notifications.js.erb
|
260
248
|
- app/assets/stylesheets/notifly.css
|
261
249
|
- app/assets/stylesheets/notifly/layout.css
|
262
250
|
- app/controllers/notifly/application_controller.rb
|
263
251
|
- app/controllers/notifly/notifications_controller.rb
|
264
252
|
- app/helpers/notifly/view_helper.rb
|
253
|
+
- app/mailers/notifly/notification_mailer.rb
|
265
254
|
- app/models/notifly/notification.rb
|
266
255
|
- app/views/notifly/layouts/_actions.html.erb
|
267
256
|
- app/views/notifly/layouts/_counter.html.erb
|
268
|
-
- app/views/notifly/layouts/_footer.html.erb
|
269
257
|
- app/views/notifly/layouts/_index.html.erb
|
270
258
|
- app/views/notifly/layouts/_notification.html.erb
|
271
259
|
- app/views/notifly/layouts/_notifly.html.erb
|
272
|
-
- app/views/notifly/
|
260
|
+
- app/views/notifly/notification_mailer/notifly.html.erb
|
273
261
|
- app/views/notifly/notifications/index.js.erb
|
274
|
-
- app/views/notifly/notifications/
|
262
|
+
- app/views/notifly/notifications/read.js.erb
|
263
|
+
- app/views/notifly/notifications/seen.js.erb
|
275
264
|
- app/views/notifly/notifications/toggle_read.js.erb
|
276
|
-
- app/views/notifly/templates/_default.html.erb
|
265
|
+
- app/views/notifly/templates/mails/_default.html.erb
|
266
|
+
- app/views/notifly/templates/notifications/_default.html.erb
|
277
267
|
- bin/rails
|
268
|
+
- config/locales/en.yml
|
278
269
|
- config/routes.rb
|
279
270
|
- db/migrate/20141103170528_create_notifly_notifications.rb
|
280
271
|
- db/migrate/20141104150224_add_data_to_notification.rb
|
281
272
|
- db/migrate/20141117193436_add_seen_to_notifly_notification.rb
|
273
|
+
- db/migrate/20141125165636_add_mail_to_notifly_notifications.rb
|
282
274
|
- lib/generators/notifly/install/install_generator.rb
|
283
275
|
- lib/generators/notifly/install/templates/config/initializers/notifly.rb
|
284
276
|
- lib/generators/notifly/install/utils.rb
|
285
|
-
- lib/generators/notifly/views/USAGE
|
286
277
|
- lib/generators/notifly/views/views_generator.rb
|
287
278
|
- lib/notifly.rb
|
288
279
|
- lib/notifly/engine.rb
|
@@ -1,23 +0,0 @@
|
|
1
|
-
<% notifly = Notifly::Engine.routes.url_helpers %>
|
2
|
-
var notiflyCounterRequested;
|
3
|
-
|
4
|
-
var _notiflyGetCounter = function (notiflyPath) {
|
5
|
-
var $counter = $('#notifly-counter');
|
6
|
-
|
7
|
-
if (!notiflyCounterRequested) {
|
8
|
-
$.ajax({
|
9
|
-
url: '<%= notifly.counter_notifications_path %>',
|
10
|
-
type: 'GET',
|
11
|
-
error: _notiflyHandleCounterError
|
12
|
-
});
|
13
|
-
}
|
14
|
-
};
|
15
|
-
|
16
|
-
|
17
|
-
var _notiflyHandleCounterError = function () {
|
18
|
-
notiflyCounterRequested = false;
|
19
|
-
};
|
20
|
-
|
21
|
-
$(document).ready(function() {
|
22
|
-
_notiflyGetCounter();
|
23
|
-
});
|