notification-renderer 1.0.0.beta6 → 1.0.0.beta7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/README.md +201 -26
- data/lib/generators/notification_renderer/install_generator.rb +47 -0
- data/lib/generators/notification_renderer/type_generator.rb +21 -0
- data/lib/generators/templates/install/README.md +1 -0
- data/lib/generators/templates/install/initializer.rb +12 -0
- data/lib/generators/templates/install/notifications_migration.rb.erb +5 -0
- data/lib/generators/templates/type/_template.html +7 -0
- data/lib/notification_renderer/configuration.rb +26 -0
- data/lib/notification_renderer/engine.rb +6 -0
- data/lib/notification_renderer/notification_library.rb +13 -0
- data/lib/notification_renderer/notification_scopes.rb +17 -0
- data/lib/notification_renderer.rb +10 -0
- metadata +16 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b85c93e55a50084e3e1d1f31af5d942a21455285303ef5aae231c9c7deae3a52
|
4
|
+
data.tar.gz: 80e6f088d3631eb327715a5318d46bf62e23d6ed728b5bb6b779e27a5af1c481
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f87e98fba149abd4b3f7b18c1e67ee29d0f4d2c18b9f094c88f905b73f3acaad708d85108aa245ef33ad003ef7b91ecb539fedeeaf807f53e844a794e1c09478
|
7
|
+
data.tar.gz: de08d08a118aef28227ef0cbd01cdea5244b01ce52bdcea4e98098d59769b599e2931c409924f56a83ba7852477a0b48fab43ccd40894d9d0253eb14ed952088
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
### master
|
4
|
+
|
5
|
+
* nothing yet
|
6
|
+
|
7
|
+
### 1.0.0.beta6 - 2017-12-28
|
8
|
+
|
9
|
+
* bugfixes
|
10
|
+
* fix lib loading problems
|
11
|
+
|
12
|
+
### 1.0.0.beta5 - 2017-12-28
|
13
|
+
|
14
|
+
* bugfixes
|
15
|
+
* fix generators
|
16
|
+
* fix lib loading problems
|
17
|
+
* fix syntax errors
|
18
|
+
|
19
|
+
### 1.0.0.beta4 - 2017-12-27
|
20
|
+
|
21
|
+
* features
|
22
|
+
* add helpers
|
23
|
+
* add `default_renderer` and `auto_read` configuration options
|
24
|
+
* add grouping functionality
|
25
|
+
* enhancements
|
26
|
+
* allow defining renderers for `type` generator
|
27
|
+
|
28
|
+
### 1.0.0.beta3 - 2017-12-25
|
29
|
+
|
30
|
+
* features
|
31
|
+
* introduce `type` generator
|
32
|
+
|
33
|
+
### 1.0.0.beta2 - 2017-12-23
|
34
|
+
|
35
|
+
* initial release
|
data/README.md
CHANGED
@@ -1,17 +1,24 @@
|
|
1
|
-
#
|
1
|
+
# NotificationRenderer
|
2
2
|
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/notification-renderer.svg)](https://badge.fury.io/rb/notification-renderer) <img src="https://travis-ci.org/jonhue/notifications-rails.svg?branch=master" />
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
It integrates with the [Native](https://github.com/NativeGap/native-rails) gem to allow you to create a cross platform Rails app.
|
5
|
+
Render your notifications on multiple platforms by specifying notification types.
|
8
6
|
|
9
7
|
---
|
10
8
|
|
11
9
|
## Table of Contents
|
12
10
|
|
13
|
-
* [Philosophy](#philosophy)
|
14
11
|
* [Installation](#installation)
|
12
|
+
* [Usage](#usage)
|
13
|
+
* [Types](#types)
|
14
|
+
* [Generating a new type](#generating-a-new-type)
|
15
|
+
* [Using a type](#using-a-type)
|
16
|
+
* [Renderers](#renderers)
|
17
|
+
* [View helpers](#view-helpers)
|
18
|
+
* [`render_notification`](#render_notification)
|
19
|
+
* [`render_notifications`](#render_notifications)
|
20
|
+
* [Grouping](#grouping)
|
21
|
+
* [Configuration](#configuration)
|
15
22
|
* [To Do](#to-do)
|
16
23
|
* [Contributing](#contributing)
|
17
24
|
* [Contributors](#contributors)
|
@@ -20,49 +27,217 @@ It integrates with the [Native](https://github.com/NativeGap/native-rails) gem t
|
|
20
27
|
|
21
28
|
---
|
22
29
|
|
23
|
-
##
|
30
|
+
## Installation
|
31
|
+
|
32
|
+
NotificationRenderer works with Rails 5 onwards. You can add it to your `Gemfile` with:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
gem 'notification-renderer'
|
36
|
+
```
|
24
37
|
|
25
|
-
|
38
|
+
And then execute:
|
26
39
|
|
27
|
-
|
40
|
+
$ bundle
|
28
41
|
|
29
|
-
|
42
|
+
Or install it yourself as:
|
30
43
|
|
31
|
-
|
44
|
+
$ gem install notification-renderer
|
32
45
|
|
33
|
-
|
46
|
+
If you always want to be up to date fetch the latest from GitHub in your `Gemfile`:
|
34
47
|
|
35
|
-
|
48
|
+
```ruby
|
49
|
+
gem 'notification-renderer', github: 'jonhue/notifications-rails'
|
50
|
+
```
|
51
|
+
|
52
|
+
Now run the generator:
|
53
|
+
|
54
|
+
$ rails g notification_renderer:install
|
55
|
+
|
56
|
+
To wrap things up, migrate the changes to your database:
|
57
|
+
|
58
|
+
$ rails db:migrate
|
36
59
|
|
37
60
|
---
|
38
61
|
|
39
|
-
##
|
62
|
+
## Usage
|
63
|
+
|
64
|
+
### Types
|
65
|
+
|
66
|
+
NotificationRenderer uses templates to render your notifications.
|
67
|
+
|
68
|
+
The `type` of a notification determines which template gets utilized for rendering. Each notification type has multiple templates each of which responsible for rendering a notification in another scenario. The default template for a given type is `index`.
|
69
|
+
|
70
|
+
#### Generating a new type
|
71
|
+
|
72
|
+
This gem comes with a generator to make adding new types a whole lot easier. Run in your terminal:
|
73
|
+
|
74
|
+
$ rails g notification_renderer:type -t notification
|
40
75
|
|
41
|
-
|
76
|
+
This will create the following structure in your application:
|
77
|
+
|
78
|
+
* `views`
|
79
|
+
* `notifications`
|
80
|
+
* `notification`
|
81
|
+
* `_index.html.erb`
|
82
|
+
|
83
|
+
You can also customize the generated templates (renderers):
|
84
|
+
|
85
|
+
$ rails g notification_renderer:type -t notification -r index feed
|
86
|
+
|
87
|
+
This command will also create a custom renderer called `feed` for the notification type `notification`:
|
88
|
+
|
89
|
+
* `views`
|
90
|
+
* `notifications`
|
91
|
+
* `notification`
|
92
|
+
* `_feed.html.erb`
|
93
|
+
* `_index.html.erb`
|
94
|
+
|
95
|
+
#### Using a type
|
96
|
+
|
97
|
+
You are able to specify the `type` of a `Notification` record:
|
42
98
|
|
43
99
|
```ruby
|
44
|
-
|
100
|
+
notification = Notification.create target: User.first, object: Recipe.first, type: 'notification'
|
45
101
|
```
|
46
102
|
|
47
|
-
|
103
|
+
**Note:** The `type` attribute of any new `Notification` record will default to the [`default_type` configuration](#configuration).
|
48
104
|
|
49
|
-
|
105
|
+
You can also scope records by their type:
|
50
106
|
|
51
|
-
|
107
|
+
```ruby
|
108
|
+
# Return records with `'notification'` as type
|
109
|
+
Notification.notification_type
|
52
110
|
|
53
|
-
|
111
|
+
# Return records with `'follow'` as type
|
112
|
+
Notification.follow_type
|
113
|
+
```
|
54
114
|
|
55
|
-
|
115
|
+
### Renderers
|
116
|
+
|
117
|
+
In your renderers you can access the `Notification` record through the `notification` variable. This is how a renderer could look like:
|
118
|
+
|
119
|
+
```erb
|
120
|
+
<%= notification.target.name %> commented on <%= notification.object.article.title %>.
|
121
|
+
```
|
122
|
+
|
123
|
+
### View helpers
|
124
|
+
|
125
|
+
NotificationRenderer introduces some view helpers to assist you in embedding notifications.
|
126
|
+
|
127
|
+
#### `render_notification`
|
128
|
+
|
129
|
+
`render_notification` renders a single `Notification` record:
|
130
|
+
|
131
|
+
```erb
|
132
|
+
<%= render_notification Notification.first %>
|
133
|
+
```
|
134
|
+
|
135
|
+
Rendering a notification will set its `read` attribute to `true`. This behavior can be [configured](#configuration).
|
136
|
+
|
137
|
+
You can also specify a renderer. It defaults to `'index'`.
|
138
|
+
|
139
|
+
```erb
|
140
|
+
<%= render_notification Notification.first, 'feed' %>
|
141
|
+
```
|
142
|
+
|
143
|
+
#### `render_notifications`
|
144
|
+
|
145
|
+
`render_notifications` takes an ActiveRecord array of `Notification` records and renders each of them in order:
|
146
|
+
|
147
|
+
```erb
|
148
|
+
<%= render_notifications Notification.all %>
|
149
|
+
```
|
150
|
+
|
151
|
+
You can also specify a renderer. It defaults to `'index'`.
|
152
|
+
|
153
|
+
```erb
|
154
|
+
<%= render_notifications Notification.all, 'feed' %>
|
155
|
+
```
|
156
|
+
|
157
|
+
It wraps the rendered notifications in a `div`:
|
158
|
+
|
159
|
+
```html
|
160
|
+
<div class="notification-renderer notifications">
|
161
|
+
<!-- ... -->
|
162
|
+
</div>
|
163
|
+
```
|
164
|
+
|
165
|
+
### Grouping
|
166
|
+
|
167
|
+
You can group any ActiveRecord array of `Notification` records by an attribute value:
|
56
168
|
|
57
169
|
```ruby
|
58
|
-
|
170
|
+
Notification.grouping('object.article')
|
171
|
+
Notification.grouping('metadata[:title]')
|
172
|
+
```
|
173
|
+
|
174
|
+
When rendering notifications you often want to group them by the object they belong to. This is how to group notifications by the associated object:
|
175
|
+
|
176
|
+
```erb
|
177
|
+
<%= render_notifications_grouped Notification.all, 'object', 'feed' %>
|
59
178
|
```
|
60
179
|
|
180
|
+
You can also group notifications by nested attributes:
|
181
|
+
|
182
|
+
```erb
|
183
|
+
<%= render_notifications_grouped Notification.all, 'object.article' %>
|
184
|
+
<%= render_notifications_grouped Notification.all, 'metadata[:title]' %>
|
185
|
+
```
|
186
|
+
|
187
|
+
It is also possible to group notifications for just one object:
|
188
|
+
|
189
|
+
```erb
|
190
|
+
<%= render_notifications_grouped Notification.where(object_id: 1, object_type: 'Comment'), 'object' %>
|
191
|
+
```
|
192
|
+
|
193
|
+
This will render the last notification for every group and pass the attributes value grouped by to your renderer:
|
194
|
+
|
195
|
+
```erb
|
196
|
+
<!-- View -->
|
197
|
+
|
198
|
+
<%= render_notifications_grouped Notification.all, 'object.article' %>
|
199
|
+
|
200
|
+
|
201
|
+
<!-- Renderer -->
|
202
|
+
|
203
|
+
<% if notification_grouped? %>
|
204
|
+
<%= notification.target.name %> and <%= (notification_count - 1).to_s %> others commented on <%= attribute.title %>.
|
205
|
+
<% else %>
|
206
|
+
<%= notification.target.name %> commented on <%= notification.object.article.title %>.
|
207
|
+
<% end %>
|
208
|
+
```
|
209
|
+
|
210
|
+
Grouping makes the following two methods available in your renderer:
|
211
|
+
|
212
|
+
**`attribute`** The value of the attribute used for grouping.
|
213
|
+
|
214
|
+
**`notification_count`** The notification count for the group of the current notification.
|
215
|
+
|
216
|
+
You may check whether a template is being used for grouping by using the `notification_grouped?` helper method.
|
217
|
+
|
218
|
+
---
|
219
|
+
|
220
|
+
## Configuration
|
221
|
+
|
222
|
+
You can configure NotificationRenderer by passing a block to `configure`. This can be done in `config/initializers/notification-renderer.rb`:
|
223
|
+
|
224
|
+
```ruby
|
225
|
+
NotificationRenderer.configure do |config|
|
226
|
+
config.default_type = 'notification'
|
227
|
+
end
|
228
|
+
```
|
229
|
+
|
230
|
+
**`default_type`** Choose your default notification type. Takes a string. Defaults to `'notification'`.
|
231
|
+
|
232
|
+
**`default_renderer`** Choose your default renderer. Takes a string. Defaults to `'index'`.
|
233
|
+
|
234
|
+
**`auto_read`** Automatically mark rendered notifications as read. Takes a boolean. Defaults to `true`.
|
235
|
+
|
61
236
|
---
|
62
237
|
|
63
238
|
## To Do
|
64
239
|
|
65
|
-
[Here](https://github.com/jonhue/notifications-rails/projects) is the full list of current projects.
|
240
|
+
[Here](https://github.com/jonhue/notifications-rails/projects/7) is the full list of current projects.
|
66
241
|
|
67
242
|
To propose your ideas, initiate the discussion by adding a [new issue](https://github.com/jonhue/notifications-rails/issues/new).
|
68
243
|
|
@@ -70,9 +245,9 @@ To propose your ideas, initiate the discussion by adding a [new issue](https://g
|
|
70
245
|
|
71
246
|
## Contributing
|
72
247
|
|
73
|
-
We hope that you will consider contributing to
|
248
|
+
We hope that you will consider contributing to NotificationRenderer. Please read this short overview for some information about how to get started:
|
74
249
|
|
75
|
-
[Learn more about contributing to this repository](CONTRIBUTING.md), [Code of Conduct](CODE_OF_CONDUCT.md)
|
250
|
+
[Learn more about contributing to this repository](https://github.com/jonhue/notifications-rails/blob/master/CONTRIBUTING.md), [Code of Conduct](https://github.com/jonhue/notifications-rails/blob/master/CODE_OF_CONDUCT.md)
|
76
251
|
|
77
252
|
### Contributors
|
78
253
|
|
@@ -82,7 +257,7 @@ https://github.com/jonhue/notifications-rails/graphs/contributors
|
|
82
257
|
|
83
258
|
### Semantic Versioning
|
84
259
|
|
85
|
-
|
260
|
+
NotificationRenderer follows Semantic Versioning 2.0 as defined at http://semver.org.
|
86
261
|
|
87
262
|
## License
|
88
263
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module NotificationRenderer
|
5
|
+
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
7
|
+
|
8
|
+
include Rails::Generators::Migration
|
9
|
+
|
10
|
+
source_root File.join File.dirname(__FILE__), '../templates/install'
|
11
|
+
desc 'Install NotificationRenderer'
|
12
|
+
|
13
|
+
def self.next_migration_number dirname
|
14
|
+
if ActiveRecord::Base.timestamped_migrations
|
15
|
+
Time.now.utc.strftime '%Y%m%d%H%M%S'
|
16
|
+
else
|
17
|
+
"%.3d" % ( current_migration_number(dirname) + 1 )
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_initializer
|
22
|
+
template 'initializer.rb', 'config/initializers/notification-renderer.rb'
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_notifications_migration_file
|
26
|
+
migration_template 'notifications_migration.rb.erb', 'db/migrate/notification_renderer_migration.rb', migration_version: migration_version
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_templates
|
30
|
+
system 'rails g notification_renderer:type -t notification'
|
31
|
+
end
|
32
|
+
|
33
|
+
def show_readme
|
34
|
+
readme 'README.md'
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def migration_version
|
40
|
+
if Rails.version >= '5.0.0'
|
41
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module NotificationRenderer
|
5
|
+
|
6
|
+
class TypeGenerator < Rails::Generators::Base
|
7
|
+
|
8
|
+
source_root File.join File.dirname(__FILE__), '../templates/type'
|
9
|
+
desc 'Create a new notification type'
|
10
|
+
class_option :type, desc: 'Specify the notification type', type: :string, default: NotificationRenderer.configuration.default_type, aliases: '-t'
|
11
|
+
class_option :renderers, desc: 'Specify the renderer templates', type: :string, default: NotificationRenderer.configuration.default_renderer, aliases: '-r'
|
12
|
+
|
13
|
+
def create_templates
|
14
|
+
options[:renderers].split(' ')&.each do |template|
|
15
|
+
template '_template.html', "app/views/notifications/#{options[:type]}/_#{template}.html.erb"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Now run `rails db:migrate` to add NotificationRenderer to your database.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
NotificationRenderer.configure do |config|
|
2
|
+
|
3
|
+
# Choose your default notification type. Takes a string.
|
4
|
+
# config.default_type = 'notification'
|
5
|
+
|
6
|
+
# Choose your default renderer. Takes a string.
|
7
|
+
# config.default_renderer = 'index'
|
8
|
+
|
9
|
+
# Automatically mark rendered notifications as read. Takes a boolean.
|
10
|
+
# config.auto_read = true
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<!--
|
2
|
+
In your renderers you can access the `Notification` record through the `notification` variable. This is how a renderer could look like:
|
3
|
+
|
4
|
+
<%#= notification.target.name %> commented on <%#= notification.object.article.title %>
|
5
|
+
|
6
|
+
Learn more: https://github.com/jonhue/notifications-rails/tree/master/notification-renderer#renderers
|
7
|
+
-->
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module NotificationRenderer
|
2
|
+
|
3
|
+
class << self
|
4
|
+
attr_accessor :configuration
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.configure
|
8
|
+
self.configuration ||= Configuration.new
|
9
|
+
yield configuration
|
10
|
+
end
|
11
|
+
|
12
|
+
class Configuration
|
13
|
+
|
14
|
+
attr_accessor :default_type
|
15
|
+
attr_accessor :default_renderer
|
16
|
+
attr_accessor :auto_read
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@default_type = 'notification'
|
20
|
+
@default_renderer = 'index'
|
21
|
+
@auto_read = true
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module NotificationRenderer
|
2
|
+
module NotificationScopes
|
3
|
+
|
4
|
+
def method_missing m, *args
|
5
|
+
if m.to_s[/(.+)_type/]
|
6
|
+
where type: $1.singularize.classify
|
7
|
+
else
|
8
|
+
super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def respond_to? m, include_private = false
|
13
|
+
super || m.to_s[/(.+)_type/]
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module NotificationRenderer
|
2
|
+
|
3
|
+
require 'notification_renderer/configuration'
|
4
|
+
|
5
|
+
require 'notification_renderer/engine'
|
6
|
+
|
7
|
+
autoload :NotificationLibrary, 'notification_renderer/notification_library'
|
8
|
+
autoload :NotificationScopes, 'notification_renderer/notification_scopes'
|
9
|
+
|
10
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: notification-renderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Hübotter
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.0.0.
|
47
|
+
version: 1.0.0.beta7
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.0.0.
|
54
|
+
version: 1.0.0.beta7
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,8 +87,20 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
+
- CHANGELOG.md
|
90
91
|
- LICENSE
|
91
92
|
- README.md
|
93
|
+
- lib/generators/notification_renderer/install_generator.rb
|
94
|
+
- lib/generators/notification_renderer/type_generator.rb
|
95
|
+
- lib/generators/templates/install/README.md
|
96
|
+
- lib/generators/templates/install/initializer.rb
|
97
|
+
- lib/generators/templates/install/notifications_migration.rb.erb
|
98
|
+
- lib/generators/templates/type/_template.html
|
99
|
+
- lib/notification_renderer.rb
|
100
|
+
- lib/notification_renderer/configuration.rb
|
101
|
+
- lib/notification_renderer/engine.rb
|
102
|
+
- lib/notification_renderer/notification_library.rb
|
103
|
+
- lib/notification_renderer/notification_scopes.rb
|
92
104
|
homepage: https://github.com/jonhue/notifications-rails/tree/master/notification-renderer
|
93
105
|
licenses:
|
94
106
|
- MIT
|
@@ -96,7 +108,7 @@ metadata: {}
|
|
96
108
|
post_install_message:
|
97
109
|
rdoc_options: []
|
98
110
|
require_paths:
|
99
|
-
- lib
|
111
|
+
- lib
|
100
112
|
required_ruby_version: !ruby/object:Gem::Requirement
|
101
113
|
requirements:
|
102
114
|
- - ">="
|