radiant-forum-extension 2.0.4 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/app/controllers/posts_controller.rb +13 -7
- data/app/models/post.rb +10 -4
- data/app/views/admin/forums/index.html.haml +3 -11
- data/app/views/forums/_standard_parts.html.haml +2 -5
- data/app/views/forums/index.html.haml +5 -0
- data/app/views/posts/_post.html.haml +1 -1
- data/app/views/posts/_search_form.html.haml +13 -10
- data/app/views/posts/index.html.haml +22 -8
- data/app/views/topics/_latest.html.haml +1 -1
- data/app/views/topics/index.html.haml +1 -0
- data/config/initializers/radiant_config.rb +1 -0
- data/config/locales/en.yml +15 -11
- data/forum_extension.rb +1 -1
- data/lib/forum_tags.rb +1 -1
- data/public/javascripts/gallery.js +7 -4
- data/radiant-forum-extension.gemspec +2 -2
- data/spec/lib/forum_tags_spec.rb +3 -3
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.5
|
@@ -7,11 +7,11 @@ class PostsController < ForumBaseController
|
|
7
7
|
before_filter :require_authority, :only => [:edit, :update, :destroy]
|
8
8
|
|
9
9
|
def index
|
10
|
-
|
11
|
-
posts =
|
10
|
+
@term = params[:q]
|
11
|
+
posts = @forum ? Post.in_forum(@forum) : Post.scoped
|
12
|
+
posts = posts.containing(@term) unless @term.blank?
|
13
|
+
posts = posts.from_reader(@reader) if @reader
|
12
14
|
posts = posts.in_topic(@topic) if @topic
|
13
|
-
posts = posts.in_forum(@forum) if @forum
|
14
|
-
posts = posts.containing(@term) if @term = params[:q]
|
15
15
|
@posts = posts.paginate(pagination_parameters)
|
16
16
|
render_page_or_feed
|
17
17
|
end
|
@@ -29,8 +29,12 @@ class PostsController < ForumBaseController
|
|
29
29
|
@post.topic = @forum.topics.new
|
30
30
|
end
|
31
31
|
respond_to do |format|
|
32
|
-
format.html {
|
33
|
-
|
32
|
+
format.html {
|
33
|
+
expires_now
|
34
|
+
}
|
35
|
+
format.js {
|
36
|
+
render :partial => 'posts/form', :layout => false
|
37
|
+
}
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
@@ -51,7 +55,9 @@ class PostsController < ForumBaseController
|
|
51
55
|
|
52
56
|
def edit
|
53
57
|
respond_to do |format|
|
54
|
-
format.html {
|
58
|
+
format.html {
|
59
|
+
expires_now
|
60
|
+
}
|
55
61
|
format.js { render :partial => 'posts/form' }
|
56
62
|
end
|
57
63
|
end
|
data/app/models/post.rb
CHANGED
@@ -20,9 +20,11 @@ class Post < ActiveRecord::Base
|
|
20
20
|
named_scope :non_comments, :conditions => "page_id IS NULL"
|
21
21
|
named_scope :imported, :conditions => "old_id IS NOT NULL"
|
22
22
|
named_scope :in_topic, lambda { |topic| { :conditions => ["topic_id = ?", topic.id] }}
|
23
|
-
named_scope :in_topics, lambda { |topics|
|
24
|
-
|
25
|
-
|
23
|
+
named_scope :in_topics, lambda { |topics|
|
24
|
+
ids = topics.map(&:id)
|
25
|
+
{ :conditions => ["topic_id IN (#{ids.map{"?"}.join(',')})", *ids] }
|
26
|
+
}
|
27
|
+
named_scope :from_reader, lambda { |reader| { :conditions => ["reader_id = ?", reader.id] }}
|
26
28
|
named_scope :latest, lambda { |count| { :order => 'created_at DESC', :limit => count }}
|
27
29
|
named_scope :except, lambda { |post| { :conditions => ["NOT posts.id = ?", post.id] }}
|
28
30
|
named_scope :distinct_readers, :select => "DISTINCT posts.reader_id" do
|
@@ -32,11 +34,15 @@ class Post < ActiveRecord::Base
|
|
32
34
|
end
|
33
35
|
named_scope :containing, lambda { |term|
|
34
36
|
{
|
35
|
-
:conditions => "posts.body LIKE :term OR topics.name LIKE :term", :term => "%#{term}%",
|
37
|
+
:conditions => ["posts.body LIKE :term OR topics.name LIKE :term", {:term => "%#{term}%"}],
|
36
38
|
:joins => "LEFT OUTER JOIN topics on posts.topic_id = topics.id"
|
37
39
|
}
|
38
40
|
}
|
39
41
|
|
42
|
+
def self.in_forum(forum)
|
43
|
+
in_topics(forum.topics)
|
44
|
+
end
|
45
|
+
|
40
46
|
def holder
|
41
47
|
page || topic
|
42
48
|
end
|
@@ -24,9 +24,6 @@
|
|
24
24
|
- tbody.title_cell do
|
25
25
|
%td.name
|
26
26
|
= link_to forum.name, edit_admin_forum_url(:id => forum)
|
27
|
-
-if forum.for_comments
|
28
|
-
%p.context
|
29
|
-
= t('for_comments')
|
30
27
|
|
31
28
|
- tbody.description_cell do
|
32
29
|
%td.forum_description
|
@@ -57,17 +54,12 @@
|
|
57
54
|
|
58
55
|
- tbody.modify_cell do
|
59
56
|
%td.actions
|
60
|
-
-if
|
57
|
+
- if admin?
|
58
|
+
= link_to image('minus') + ' ' + t('remove'), remove_admin_forum_url(:id => forum) , :class => 'action'
|
59
|
+
- else
|
61
60
|
%span.action.disabled
|
62
61
|
= image('minus_disabled')
|
63
62
|
= " " + t('remove')
|
64
|
-
-else
|
65
|
-
- if admin?
|
66
|
-
= link_to image('minus') + ' ' + t('remove'), remove_admin_forum_url(:id => forum) , :class => 'action'
|
67
|
-
- else
|
68
|
-
%span.action.disabled
|
69
|
-
= image('minus_disabled')
|
70
|
-
= " " + t('remove')
|
71
63
|
|
72
64
|
- render_region :bottom do |bottom|
|
73
65
|
- bottom.buttons do
|
@@ -16,11 +16,8 @@
|
|
16
16
|
= link_to t('navigation.forums'), forums_url
|
17
17
|
= link_to t('navigation.readers'), readers_url
|
18
18
|
= link_to t('navigation.new_topic'), new_post_url
|
19
|
-
|
20
|
-
|
21
|
-
= link_to t('log_out'), reader_logout_url
|
22
|
-
- else
|
23
|
-
= link_to t('log_in'), reader_login_url
|
19
|
+
= link_to t('navigation.your_account'), reader_account_url
|
20
|
+
= link_to t('navigation.search'), posts_url
|
24
21
|
- if Radiant::Config['forum.help_url']
|
25
22
|
= link_to t('navigation.forum_help'), Radiant::Config['forum.help_url']
|
26
23
|
|
@@ -1,8 +1,10 @@
|
|
1
|
-
%form.friendly{:action => posts_url}
|
1
|
+
%form.friendly{:action => posts_url, :method => :get}
|
2
|
+
%h2
|
3
|
+
=t('search_header')
|
2
4
|
%p
|
3
5
|
%label{:for => "q"}
|
4
6
|
= t('search_form.query_label')
|
5
|
-
= text_field_tag "q", params[:q], :class => '
|
7
|
+
= text_field_tag "q", params[:q], :class => 'titular'
|
6
8
|
|
7
9
|
%p
|
8
10
|
%label{:for => "forum_id"}
|
@@ -12,13 +14,14 @@
|
|
12
14
|
%option{:value => ""}= t('anywhere')
|
13
15
|
= options_from_collection_for_select(Forum.find(:all), "id", "name", params[:forum_id].to_i)
|
14
16
|
|
15
|
-
|
16
|
-
%
|
17
|
-
|
18
|
-
|
19
|
-
%
|
20
|
-
|
21
|
-
|
17
|
+
- if Radiant::Config['forum.allow_search_by_reader?']
|
18
|
+
%p
|
19
|
+
%label{:for => "reader_id"}
|
20
|
+
= t('search_form.person_label')
|
21
|
+
%select{:name => "reader_id"}
|
22
|
+
%option{:value => ""}
|
23
|
+
=t('anyone')
|
24
|
+
= options_from_collection_for_select(Reader.find(:all), "id", "name", params[:reader_id].to_i)
|
22
25
|
|
23
26
|
%p.buttons
|
24
|
-
|
27
|
+
%input{:type => 'submit', :value => "Search"}
|
@@ -1,18 +1,27 @@
|
|
1
|
+
- if !@term.blank? || @reader || @forum || @topic
|
2
|
+
- @searching = true
|
3
|
+
- summary = [t('showing_posts')]
|
4
|
+
- summary << t('in') + ' ' + link_to(@forum.name, forum_url(@forum)) if @forum
|
5
|
+
- summary << t('containing') + " <strong>#{@term}</strong>" unless @term.blank?
|
6
|
+
- summary << t('posted_by') + ' ' + link_to(@reader.name, reader_url(@reader)) if @reader
|
7
|
+
- summary << t('in_topic') + ' ' + link_to(@topic.name, forum_topic_url(@topic.forum, @topic)) if @topic
|
8
|
+
|
1
9
|
= render :partial => 'forums/standard_parts'
|
2
10
|
|
3
11
|
- content_for :title do
|
4
12
|
= t('posts_heading')
|
5
13
|
|
6
14
|
- content_for :introduction do
|
7
|
-
|
15
|
+
- if @searching
|
16
|
+
= summary.join(' ') + ":"
|
17
|
+
- else
|
18
|
+
= t('posts_introduction')
|
8
19
|
|
9
20
|
- content_for :sidebar do
|
21
|
+
- unless @searching && @posts.empty?
|
22
|
+
= render :partial => 'posts/search_form'
|
10
23
|
= render :partial => "topics/latest"
|
11
24
|
|
12
|
-
- content_for :newtopic do
|
13
|
-
.newmessage
|
14
|
-
= link_to t('new_topic'), new_post_url
|
15
|
-
|
16
25
|
- content_for :pagination do
|
17
26
|
= pagination_and_summary_for(@posts, t('post'))
|
18
27
|
|
@@ -26,11 +35,16 @@
|
|
26
35
|
|
27
36
|
- content_for :messages do
|
28
37
|
- if @posts.empty?
|
29
|
-
|
30
|
-
|
38
|
+
- if @searching
|
39
|
+
%p.has_error
|
40
|
+
= t('no_search_results')
|
41
|
+
= render :partial => 'posts/search_form'
|
42
|
+
- else
|
43
|
+
%p
|
44
|
+
= t('no_posts')
|
31
45
|
- else
|
32
46
|
= yield :pagination if @posts.previous_page
|
33
|
-
= render :partial => 'posts/post', :collection => @posts, :locals => {:with_context => true}
|
47
|
+
= render :partial => 'posts/post', :collection => @posts, :locals => {:with_context => true, :headless => false}
|
34
48
|
= yield :pagination if @posts.next_page
|
35
49
|
|
36
50
|
#forum
|
@@ -12,5 +12,6 @@ Radiant.config do |config|
|
|
12
12
|
forum.define 'paginate_posts?', :default => true
|
13
13
|
forum.define 'posts_per_page', :type => :integer, :default => 20
|
14
14
|
forum.define 'commentable_period', :type => :integer, :default => 7, :units => "days"
|
15
|
+
forum.define 'allow_search_by_reader?', :default => true
|
15
16
|
end
|
16
17
|
end
|
data/config/locales/en.yml
CHANGED
@@ -32,13 +32,7 @@ en:
|
|
32
32
|
confirm_remove_forum: "Delete forum?"
|
33
33
|
confirm_remove_post: "Delete post?"
|
34
34
|
confirm_remove_topic: "Delete topic?"
|
35
|
-
|
36
|
-
formats:
|
37
|
-
recently: "%A at %l:%M%p"
|
38
|
-
standard: "on %B %e, %Y at %l:%M%p"
|
39
|
-
this_year: "%B %e at %l:%M%p"
|
40
|
-
today: "today at %l:%M%p"
|
41
|
-
yesterday: "yesterday at %l:%M%p"
|
35
|
+
containing: "containing the phrase"
|
42
36
|
definitely_remove_post: "Yes: delete it"
|
43
37
|
edit_forum: "Edit forum"
|
44
38
|
edit_minimal: "e"
|
@@ -85,6 +79,7 @@ en:
|
|
85
79
|
forums: "Categories"
|
86
80
|
readers: "People"
|
87
81
|
new_topic: "New topic"
|
82
|
+
search: "Search"
|
88
83
|
topics: "Latest"
|
89
84
|
your_account: "Your account"
|
90
85
|
new_forum: "New forum"
|
@@ -101,6 +96,7 @@ en:
|
|
101
96
|
no_messages_yet: "No messages yet"
|
102
97
|
no_posts: "The forum is empty."
|
103
98
|
no_posts_found: "No messages found."
|
99
|
+
no_search_results: "Sorry: no messages match your criteria. Please use the form below to broaden your search."
|
104
100
|
no_topics: "No talk here yet."
|
105
101
|
notice:
|
106
102
|
topic_deleted: "Topic '%{name}' was deleted."
|
@@ -126,8 +122,8 @@ en:
|
|
126
122
|
zero: "Nothing found"
|
127
123
|
one: "One message found"
|
128
124
|
other: "%{count} messages found"
|
129
|
-
posts_heading: "
|
130
|
-
posts_introduction: 'This
|
125
|
+
posts_heading: "Search the forum"
|
126
|
+
posts_introduction: 'This begins as a full list of all the posts in the forum. Add criteria below to cut down the list to specific subjects and speakers.'
|
131
127
|
really_remove_post: "Are you sure you want to delete this comment?"
|
132
128
|
recent_topics: "Recent topics"
|
133
129
|
remove_minimal: "x"
|
@@ -147,10 +143,12 @@ en:
|
|
147
143
|
person_label: "From this person"
|
148
144
|
query_label: "Look for this text"
|
149
145
|
search_whole_forum: "search the whole forum"
|
146
|
+
search_header: "Forum Search"
|
150
147
|
search_introduction: "Please choose a search phrase and/or a person or discussion category."
|
151
148
|
search_results: "Search Results"
|
152
149
|
separator: ':'
|
153
150
|
showing: "showing"
|
151
|
+
showing_posts: "Showing topics and messages"
|
154
152
|
sorry_locked: "Sorry: this topic is locked."
|
155
153
|
start_topic: "Start a new conversation"
|
156
154
|
started: "started"
|
@@ -158,6 +156,13 @@ en:
|
|
158
156
|
started_topic_in: "started a new topic under"
|
159
157
|
started_topic_on: "started a new topic on %{date}"
|
160
158
|
sticky: "sticky"
|
159
|
+
time:
|
160
|
+
formats:
|
161
|
+
recently: "%A at %l:%M%p"
|
162
|
+
standard: "on %B %e, %Y at %l:%M%p"
|
163
|
+
this_year: "%B %e at %l:%M%p"
|
164
|
+
today: "today at %l:%M%p"
|
165
|
+
yesterday: "yesterday at %l:%M%p"
|
161
166
|
time_remaining_to_edit: "You have %{time} left to "
|
162
167
|
topic_count:
|
163
168
|
zero: "No discussion."
|
@@ -165,7 +170,6 @@ en:
|
|
165
170
|
other: "%{count} topics, most recently "
|
166
171
|
topic_show_introduction: ""
|
167
172
|
topic_removed: "Topic removed"
|
168
|
-
post_removed: "Post removed"
|
169
173
|
to: "to"
|
170
174
|
to_add_post: "To add a %{message_type}"
|
171
175
|
topic: "topic"
|
@@ -174,6 +178,6 @@ en:
|
|
174
178
|
topic_name: "Topic name"
|
175
179
|
topics: "Topics"
|
176
180
|
topics_heading: "Latest topics"
|
177
|
-
topics_introduction: 'This is a list of all the discussions going on here, with the most recently updated first. You can also see a more organised list of <a href="/forum/forums">discussion categories</a> or
|
181
|
+
topics_introduction: 'This is a list of all the discussions going on here, with the most recently updated first. You can also see a more organised list of <a href="/forum/forums">discussion categories</a> or <a href="/forum/posts">search</a> for particular posts and people.'
|
178
182
|
under: "under"
|
179
183
|
unknown_date: "unknown date"
|
data/forum_extension.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_dependency 'application_controller'
|
2
2
|
|
3
3
|
class ForumExtension < Radiant::Extension
|
4
|
-
version "2.0.
|
4
|
+
version "2.0.5"
|
5
5
|
description "Nice clean forums and page comments for inclusion in your radiant site. Requires the reader extension and share_layouts."
|
6
6
|
url "http://spanner.org/radiant/forum"
|
7
7
|
|
data/lib/forum_tags.rb
CHANGED
@@ -145,7 +145,7 @@ module ForumTags
|
|
145
145
|
desc %{
|
146
146
|
Renders the reply date of the current topic in a colloquial form.
|
147
147
|
}
|
148
|
-
tag 'forum:topic:
|
148
|
+
tag 'forum:topic:replydate' do |tag|
|
149
149
|
I18n.l tag.locals.topic.replied_at, :format => :standard
|
150
150
|
end
|
151
151
|
|
@@ -38,6 +38,7 @@
|
|
38
38
|
mimic: function () {
|
39
39
|
self.zoomer.setImage(self.item.src);
|
40
40
|
self.image.attr('src', self.item.src);
|
41
|
+
self.controls.find('a.download').attr('href', self.item.download_url());
|
41
42
|
if (self.item.caption.html()) self.caption.html(self.item.caption.html()).show();
|
42
43
|
else self.caption.hide();
|
43
44
|
},
|
@@ -96,7 +97,6 @@
|
|
96
97
|
showControls: function (e) {
|
97
98
|
self.controls.fadeIn("fast");
|
98
99
|
self.closer.fadeIn("fast");
|
99
|
-
self.controls.find('a.download').attr('href', self.item.download_url());
|
100
100
|
},
|
101
101
|
hideControls: function (e) {
|
102
102
|
self.controls.fadeOut("fast");
|
@@ -108,11 +108,13 @@
|
|
108
108
|
var w = $(window);
|
109
109
|
var d = item.imageSize();
|
110
110
|
var p = self.container.offset();
|
111
|
-
|
112
|
-
self.container.animate({
|
111
|
+
var r = {
|
113
112
|
left: p.left + (self.image.innerWidth() - d.width)/2,
|
114
113
|
top: p.top + (self.image.innerHeight() - d.height)/2
|
115
|
-
}
|
114
|
+
};
|
115
|
+
if (resized.top <= 10) resized.top = 10;
|
116
|
+
self.image.animate(d, 'fast');
|
117
|
+
self.container.animate(r, 'fast');
|
116
118
|
self.controls.css({left: (d.width - 96)/2});
|
117
119
|
},
|
118
120
|
reposition: function (item) {
|
@@ -123,6 +125,7 @@
|
|
123
125
|
top: w.scrollTop() + (w.height() - d.height)/2,
|
124
126
|
left: w.scrollLeft() + (w.width() - d.width)/2
|
125
127
|
};
|
128
|
+
if (p.top <= 10) p.top = 10;
|
126
129
|
if (self.visible) {
|
127
130
|
self.image.animate(d, 'fast');
|
128
131
|
self.container.animate(p, 'fast');
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{radiant-forum-extension}
|
8
|
-
s.version = "2.0.
|
8
|
+
s.version = "2.0.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["spanner"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-07}
|
13
13
|
s.description = %q{Nice clean forums and page comments for inclusion in your radiant site. Derived long ago from beast. Requires the reader extension and share_layouts.}
|
14
14
|
s.email = %q{will@spanner.org}
|
15
15
|
s.extra_rdoc_files = [
|
data/spec/lib/forum_tags_spec.rb
CHANGED
@@ -17,11 +17,11 @@ describe "Forum Tags" do
|
|
17
17
|
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:author /></r:forum:topic>}).as("Normal") }
|
18
18
|
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:date /></r:forum:topic>}).as(on_date) }
|
19
19
|
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:url /></r:forum:topic>}).as("/forum/forums/#{topic.forum.id}/topics/#{topic.id}") }
|
20
|
-
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:context /></r:forum:topic>}).as(%{
|
20
|
+
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:context /></r:forum:topic>}).as(%{reply from <a href="/readers/#{reader_id(:normal)}">Normal</a>}) }
|
21
21
|
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:body /></r:forum:topic>}).as("<p>original topic message</p>") }
|
22
22
|
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:link /></r:forum:topic>}).as(%{<a href="/forum/forums/#{topic.forum.id}/topics/#{topic.id}">#{topic.name}</a>}) }
|
23
|
-
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:summary /></r:forum:topic>}).as(%{<li><a href="/forum/forums/#{topic.forum.id}/topics/#{topic.id}">#{topic.name}</a><br />
|
24
|
-
it { should render(%{<r:forum:topic id="#{sticky.id}"><r:forum:topic:summary /></r:forum:topic>}).as(%{<li><a href="/forum/forums/#{sticky.forum.id}/topics/#{sticky.id}">#{sticky.name}</a><br />Started by <a href="/readers/#{reader_id(:normal)}">Normal</a
|
23
|
+
it { should render(%{<r:forum:topic id="#{topic.id}"><r:forum:topic:summary /></r:forum:topic>}).as(%{<li><a href="/forum/forums/#{topic.forum.id}/topics/#{topic.id}">#{topic.name}</a><br />reply from <a href="/readers/#{reader_id(:normal)}">Normal</a></li>}) }
|
24
|
+
it { should render(%{<r:forum:topic id="#{sticky.id}"><r:forum:topic:summary /></r:forum:topic>}).as(%{<li><a href="/forum/forums/#{sticky.forum.id}/topics/#{sticky.id}">#{sticky.name}</a><br />Started by <a href="/readers/#{reader_id(:normal)}">Normal</a></li>}) }
|
25
25
|
end
|
26
26
|
|
27
27
|
describe "r:forum:post tags" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-forum-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.
|
9
|
+
- 5
|
10
|
+
version: 2.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- spanner
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-07 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|