user_announcements 0.0.2 → 0.0.3
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.
- data/README.md +2 -0
- data/app/controllers/hidden_announcements_controller.rb +23 -0
- data/app/helpers/user_announcements_helper.rb +17 -6
- data/app/models/announcement.rb +17 -4
- data/app/models/announcement_finder.rb +6 -2
- data/app/models/hidden_announcement.rb +28 -0
- data/app/views/admin/announcements/_announcement.html.erb +2 -2
- data/app/views/{user_announcements → hidden_announcements}/_announcement.html.erb +0 -0
- data/app/views/hidden_announcements/create.js.erb +1 -0
- data/app/views/{user_announcements → hidden_announcements}/index.html.erb +1 -1
- data/config/routes.rb +2 -5
- data/lib/generators/user_announcements/templates/css.scss +14 -10
- data/lib/generators/user_announcements/templates/initializer.rb +5 -2
- data/lib/generators/user_announcements/templates/migration.rb +3 -3
- data/lib/user_announcements/engine.rb +11 -1
- data/lib/user_announcements/version.rb +1 -1
- metadata +72 -8
- data/app/controllers/user_announcements_controller.rb +0 -26
- data/app/models/user_announcement.rb +0 -19
- data/app/views/user_announcements/hide.js.erb +0 -1
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# user_announcements
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/user_announcements)
|
4
|
+
[](https://travis-ci.org/stevedowney/user_announcements)
|
5
|
+
[](https://coveralls.io/r/stevedowney/user_announcements?branch=master)
|
4
6
|
[](https://codeclimate.com/github/stevedowney/user_announcements)
|
5
7
|
|
6
8
|
Manage and display site-wide announcements on a per-user basis.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class HiddenAnnouncementsController < ApplicationController
|
2
|
+
before_filter :ensure_current_user
|
3
|
+
|
4
|
+
def index
|
5
|
+
@announcements = AnnouncementFinder.past_or_current
|
6
|
+
@hidden_announcement_ids = HiddenAnnouncement.hidden_announcement_ids_for(current_user.id)
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
@announcement_id = params.fetch(:announcement_id)
|
11
|
+
HiddenAnnouncement.create_for(current_user.id, @announcement_id)
|
12
|
+
respond_to do |format|
|
13
|
+
format.html { redirect_to :back }
|
14
|
+
format.js
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def destroy
|
19
|
+
HiddenAnnouncement.delete_all(user_id: current_user.id, announcement_id: params.fetch(:announcement_id))
|
20
|
+
redirect_to action: 'index'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -2,7 +2,7 @@ module UserAnnouncementsHelper
|
|
2
2
|
|
3
3
|
# Helper method for displaying messages for +current_user+.
|
4
4
|
def user_announcements(options={})
|
5
|
-
return if controller.controller_name == '
|
5
|
+
return if controller.controller_name == 'hidden_announcements'
|
6
6
|
|
7
7
|
announcements_rows = AnnouncementFinder.current_for_user(current_user)
|
8
8
|
divs = announcements_rows.map do |announcement|
|
@@ -22,33 +22,44 @@ module UserAnnouncementsHelper
|
|
22
22
|
|
23
23
|
def announcement_div_bootstrap(announcement)
|
24
24
|
div_for announcement, class: 'alert', style: 'width:40em' do
|
25
|
-
link_to(
|
25
|
+
link_to(*hide_announcement_link_args(announcement)) do
|
26
26
|
content_tag(:button, raw('×'), type: 'button', class: 'close')
|
27
27
|
end +
|
28
28
|
announcement.message.html_safe
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
def hide_announcement_link_args(announcement)
|
33
|
+
url = hidden_announcements_path(announcement_id: announcement)
|
34
|
+
options = {
|
35
|
+
method: :post,
|
36
|
+
remote: true,
|
37
|
+
id: "hide_#{dom_id(announcement)}"
|
38
|
+
}
|
39
|
+
|
40
|
+
[url, options]
|
41
|
+
end
|
42
|
+
|
32
43
|
def announcement_div_non_bootstrap(announcement)
|
33
44
|
div_for(announcement, class: 'non-bootstrap') do
|
34
45
|
announcement.message.html_safe +
|
35
|
-
link_to("hide announcement",
|
46
|
+
link_to("hide announcement", *hide_announcement_link_args(announcement))
|
36
47
|
end
|
37
48
|
end
|
38
49
|
|
39
50
|
def unhide_announcement_link(announcement)
|
40
51
|
if @hidden_announcement_ids.include?(announcement.id)
|
41
52
|
content_tag(:div) do
|
42
|
-
link_to('Unhide',
|
53
|
+
link_to('Unhide', hidden_announcement_path(announcement, announcement_id: announcement), method: :delete)
|
43
54
|
end
|
44
55
|
end
|
45
56
|
end
|
46
57
|
|
47
58
|
def ua_table_attrs
|
48
59
|
if bootstrap?
|
49
|
-
{class: "table table-striped table-bordered table-condensed table-hover"}
|
60
|
+
{class: "ua-table bootstrap table table-striped table-bordered table-condensed table-hover"}
|
50
61
|
else
|
51
|
-
{class: 'ua-table'}
|
62
|
+
{class: 'ua-table non-bootstrap'}
|
52
63
|
end
|
53
64
|
end
|
54
65
|
|
data/app/models/announcement.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Announcement < ActiveRecord::Base
|
2
2
|
attr_accessible :message, :starts_at, :ends_at, :active
|
3
3
|
|
4
|
-
has_many :
|
4
|
+
has_many :hidden_announcements, :dependent => :destroy
|
5
5
|
|
6
6
|
validates_presence_of :message, :starts_at, :ends_at
|
7
7
|
|
@@ -35,9 +35,22 @@ class Announcement < ActiveRecord::Base
|
|
35
35
|
|
36
36
|
def new_with_defaults
|
37
37
|
new do |ann|
|
38
|
-
ann.active =
|
39
|
-
ann.starts_at =
|
40
|
-
ann.ends_at =
|
38
|
+
ann.active = get_default(:active)
|
39
|
+
ann.starts_at = get_default(:starts_at)
|
40
|
+
ann.ends_at = get_default(:ends_at)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def get_default(column)
|
47
|
+
config_key = "default_#{column}"
|
48
|
+
default = UserAnnouncements.config.send(config_key)
|
49
|
+
|
50
|
+
if default.is_a?(Proc)
|
51
|
+
default.call
|
52
|
+
else
|
53
|
+
default
|
41
54
|
end
|
42
55
|
end
|
43
56
|
|
@@ -14,10 +14,14 @@ class AnnouncementFinder
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def past_or_current
|
17
|
-
|
17
|
+
Rails.logger.debug '***** start past_or_current'
|
18
|
+
r = Announcement
|
18
19
|
.active
|
19
20
|
.where("(starts_at is null or starts_at < :now)", :now => DateTime.now)
|
20
21
|
.order('created_at desc')
|
22
|
+
Rails.logger.debug '***** end past_or_current'
|
23
|
+
# sleep 1
|
24
|
+
r
|
21
25
|
end
|
22
26
|
|
23
27
|
def current_for_user(user)
|
@@ -30,7 +34,7 @@ class AnnouncementFinder
|
|
30
34
|
# end
|
31
35
|
|
32
36
|
def for_user(user, type)
|
33
|
-
hidden_announcement_ids =
|
37
|
+
hidden_announcement_ids = HiddenAnnouncement.hidden_announcement_ids_for(user.id)
|
34
38
|
result = type
|
35
39
|
result = result.where("id not in (?)", hidden_announcement_ids) if hidden_announcement_ids.present?
|
36
40
|
result.sort_by(&:status_order)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class HiddenAnnouncement < ActiveRecord::Base
|
2
|
+
attr_accessible :user_id, :announcement_id
|
3
|
+
|
4
|
+
validates_presence_of :user_id, :announcement_id
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
def hidden_announcement_ids_for(user_id)
|
9
|
+
where(user_id: user_id).pluck(:announcement_id)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_for(user_id, announcement_id)
|
13
|
+
return if record_exists_for?(user_id, announcement_id)
|
14
|
+
|
15
|
+
create!(
|
16
|
+
user_id: user_id,
|
17
|
+
announcement_id: announcement_id
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def record_exists_for?(user_id, announcement_id)
|
24
|
+
where(user_id: user_id, announcement_id: announcement_id).count > 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<tr id="<%= dom_id(announcement) %>" class='<%= announcement.status %>'>
|
2
2
|
<td><%=raw announcement.message %></td>
|
3
|
-
<td class='date'><%= announcement.starts_at.
|
4
|
-
<td class='date'><%= announcement.ends_at.
|
3
|
+
<td class='date'><%= announcement.starts_at.to_s(:long) %></td>
|
4
|
+
<td class='date'><%= announcement.ends_at.to_s(:long) %></td>
|
5
5
|
<td><%= announcement.status %></td>
|
6
6
|
<td><%= boolean_display(announcement.active)%></td>
|
7
7
|
<td><%= link_to('edit', edit_admin_announcement_path(announcement), :class => 'btn btn-mini') %></td>
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#announcement_<%= j @announcement_id %>").remove();
|
data/config/routes.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
|
3
|
-
resources :
|
4
|
-
|
5
|
-
post :unhide, on: :member
|
6
|
-
end
|
7
|
-
# match 'announcements/:id/hide', to: 'announcements#hide', as: 'hide_announcement'
|
3
|
+
resources :hidden_announcements, path: '/announcements', only: [:index, :create, :destroy]
|
4
|
+
|
8
5
|
namespace :admin do
|
9
6
|
resources :announcements
|
10
7
|
end
|
@@ -1,17 +1,21 @@
|
|
1
1
|
table.ua-table {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
border: 1px solid black;
|
6
|
-
padding: 0.5em;
|
2
|
+
|
3
|
+
td.date {
|
4
|
+
white-space: nowrap;
|
7
5
|
}
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
&.non-bootstrap {
|
8
|
+
border: 1px solid black;
|
9
|
+
|
10
|
+
th, td {
|
11
|
+
border: 1px solid black;
|
12
|
+
padding: 0.5em;
|
13
|
+
}
|
14
|
+
|
15
|
+
td {
|
16
|
+
vertical-align: top;
|
14
17
|
}
|
18
|
+
|
15
19
|
}
|
16
20
|
}
|
17
21
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
UserAnnouncements.config do |c|
|
2
2
|
|
3
|
-
#
|
4
|
-
|
3
|
+
# config.bootstrap = true
|
4
|
+
|
5
|
+
# config.default_active = true
|
6
|
+
# config.default_starts_at = lambda { Time.now.in_time_zone }
|
7
|
+
# config.default_ends_at = lambda { 1.week.from_now.in_time_zone.end_of_day }
|
5
8
|
|
6
9
|
end
|
@@ -10,13 +10,13 @@ class CreateUserAnnouncementTables < ActiveRecord::Migration
|
|
10
10
|
t.timestamps
|
11
11
|
end
|
12
12
|
|
13
|
-
create_table :
|
13
|
+
create_table :hidden_announcements, :force => true do |t|
|
14
14
|
t.integer :user_id
|
15
15
|
t.integer :announcement_id
|
16
16
|
t.timestamps
|
17
17
|
end
|
18
18
|
|
19
|
-
add_index :
|
20
|
-
add_index :
|
19
|
+
add_index :hidden_announcements, :user_id
|
20
|
+
add_index :hidden_announcements, :announcement_id
|
21
21
|
end
|
22
22
|
end
|
@@ -1,9 +1,19 @@
|
|
1
1
|
module UserAnnouncements
|
2
|
+
|
2
3
|
class Engine < ::Rails::Engine
|
3
4
|
config.generators.integration_tool :rspec
|
4
5
|
config.generators.test_framework :rspec
|
5
6
|
|
6
|
-
config.bootstrap =
|
7
|
+
config.bootstrap = true
|
8
|
+
|
9
|
+
config.default_active = true
|
10
|
+
config.default_starts_at = lambda { Time.now.in_time_zone }
|
11
|
+
config.default_ends_at = lambda { 1.week.from_now.in_time_zone.end_of_day }
|
12
|
+
|
13
|
+
config.roles = []
|
14
|
+
config.types = []
|
15
|
+
config.styles = %w(error succes info)
|
16
|
+
|
7
17
|
end
|
8
18
|
|
9
19
|
def self.config(&block)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: user_announcements
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -107,6 +107,22 @@ dependencies:
|
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: capybara-webkit
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
110
126
|
- !ruby/object:Gem::Dependency
|
111
127
|
name: guard-rspec
|
112
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,6 +155,54 @@ dependencies:
|
|
139
155
|
- - ! '>='
|
140
156
|
- !ruby/object:Gem::Version
|
141
157
|
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: coveralls
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: shoulda-matchers
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: database_cleaner
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - ! '>='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0'
|
198
|
+
type: :development
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ! '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '0'
|
142
206
|
- !ruby/object:Gem::Dependency
|
143
207
|
name: sqlite3
|
144
208
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,7 +220,7 @@ dependencies:
|
|
156
220
|
- !ruby/object:Gem::Version
|
157
221
|
version: '0'
|
158
222
|
- !ruby/object:Gem::Dependency
|
159
|
-
name:
|
223
|
+
name: launchy
|
160
224
|
requirement: !ruby/object:Gem::Requirement
|
161
225
|
none: false
|
162
226
|
requirements:
|
@@ -276,19 +340,19 @@ extra_rdoc_files: []
|
|
276
340
|
files:
|
277
341
|
- app/controllers/admin/announcements_controller.rb
|
278
342
|
- app/controllers/admin/base_controller.rb
|
279
|
-
- app/controllers/
|
343
|
+
- app/controllers/hidden_announcements_controller.rb
|
280
344
|
- app/helpers/user_announcements_helper.rb
|
281
345
|
- app/models/announcement.rb
|
282
346
|
- app/models/announcement_finder.rb
|
283
|
-
- app/models/
|
347
|
+
- app/models/hidden_announcement.rb
|
284
348
|
- app/views/admin/announcements/_announcement.html.erb
|
285
349
|
- app/views/admin/announcements/_form.html.erb
|
286
350
|
- app/views/admin/announcements/edit.html.erb
|
287
351
|
- app/views/admin/announcements/index.html.erb
|
288
352
|
- app/views/admin/announcements/new.html.erb
|
289
|
-
- app/views/
|
290
|
-
- app/views/
|
291
|
-
- app/views/
|
353
|
+
- app/views/hidden_announcements/_announcement.html.erb
|
354
|
+
- app/views/hidden_announcements/create.js.erb
|
355
|
+
- app/views/hidden_announcements/index.html.erb
|
292
356
|
- config/routes.rb
|
293
357
|
- lib/generators/user_announcements/install_generator.rb
|
294
358
|
- lib/generators/user_announcements/templates/css.scss
|
@@ -1,26 +0,0 @@
|
|
1
|
-
class UserAnnouncementsController < ApplicationController
|
2
|
-
before_filter :ensure_current_user
|
3
|
-
|
4
|
-
def index
|
5
|
-
@announcements = AnnouncementFinder.past_or_current
|
6
|
-
@hidden_announcement_ids = UserAnnouncement.hidden_announcement_ids_for(current_user.id)
|
7
|
-
end
|
8
|
-
|
9
|
-
def hide
|
10
|
-
@announcement_id = params.fetch(:id)
|
11
|
-
UserAnnouncement.create_for(current_user, @announcement_id)
|
12
|
-
end
|
13
|
-
|
14
|
-
def unhide
|
15
|
-
UserAnnouncement.delete_all(user_id: current_user.id, announcement_id: params.fetch(:id))
|
16
|
-
redirect_to action: 'index'
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def ensure_current_user
|
22
|
-
rescue NameError
|
23
|
-
raise "You must have a current_user method"
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class UserAnnouncement < ActiveRecord::Base
|
2
|
-
attr_accessible :user_id, :announcement_id
|
3
|
-
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def hidden_announcement_ids_for(user_id)
|
7
|
-
where(user_id: user_id).pluck(:announcement_id)
|
8
|
-
end
|
9
|
-
|
10
|
-
def create_for(current_user, announcement_id)
|
11
|
-
create!(
|
12
|
-
user_id: current_user.id,
|
13
|
-
announcement_id: announcement_id
|
14
|
-
)
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
$("#announcement_<%= j params[:id] %>").remove();
|