thredded 0.11.1 → 0.12.0
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.
- checksums.yaml +4 -4
- data/README.md +2 -5
- data/app/assets/javascripts/thredded/components/post_form.es6 +4 -4
- data/app/assets/javascripts/thredded/components/quote_post.es6 +45 -0
- data/app/assets/javascripts/thredded/components/topic_form.es6 +4 -4
- data/app/assets/javascripts/thredded/core/on_page_load.es6 +8 -0
- data/app/assets/javascripts/thredded/dependencies.js +1 -1
- data/app/assets/stylesheets/thredded/_email.scss +2 -3
- data/app/assets/stylesheets/thredded/components/_preferences.scss +17 -4
- data/app/controllers/concerns/thredded/new_post_params.rb +20 -0
- data/app/controllers/concerns/thredded/new_private_post_params.rb +20 -0
- data/app/controllers/thredded/posts_controller.rb +22 -13
- data/app/controllers/thredded/preferences_controller.rb +1 -0
- data/app/controllers/thredded/private_posts_controller.rb +24 -12
- data/app/controllers/thredded/private_topics_controller.rb +4 -1
- data/app/controllers/thredded/theme_previews_controller.rb +4 -2
- data/app/controllers/thredded/topics_controller.rb +13 -2
- data/app/forms/thredded/post_form.rb +52 -0
- data/app/forms/thredded/private_post_form.rb +48 -0
- data/app/forms/thredded/private_topic_form.rb +8 -0
- data/app/forms/thredded/topic_form.rb +8 -0
- data/app/forms/thredded/user_preferences_form.rb +7 -1
- data/app/helpers/thredded/urls_helper.rb +18 -0
- data/app/models/thredded/topic.rb +3 -3
- data/app/policies/thredded/private_topic_policy.rb +1 -1
- data/app/view_models/thredded/messageboard_group_view.rb +1 -1
- data/app/view_models/thredded/post_view.rb +19 -3
- data/app/view_models/thredded/private_topic_view.rb +0 -4
- data/app/view_models/thredded/topic_view.rb +0 -4
- data/app/views/thredded/posts/_form.html.erb +0 -2
- data/app/views/thredded/posts/edit.html.erb +2 -5
- data/app/views/thredded/posts/new.html.erb +15 -0
- data/app/views/thredded/posts_common/_actions.html.erb +3 -0
- data/app/views/thredded/posts_common/_form.html.erb +5 -3
- data/app/views/thredded/posts_common/_header.html.erb +3 -1
- data/app/views/thredded/posts_common/actions/_quote.html.erb +4 -0
- data/app/views/thredded/preferences/_form.html.erb +3 -5
- data/app/views/thredded/preferences/_messageboards_nav.html.erb +8 -0
- data/app/views/thredded/preferences/_messageboards_nav_item.html.erb +2 -0
- data/app/views/thredded/preferences/edit.html.erb +13 -3
- data/app/views/thredded/private_posts/_form.html.erb +0 -2
- data/app/views/thredded/private_posts/edit.html.erb +2 -4
- data/app/views/thredded/private_posts/new.html.erb +11 -0
- data/app/views/thredded/private_topics/_form.html.erb +2 -2
- data/app/views/thredded/private_topics/index.html.erb +1 -2
- data/app/views/thredded/private_topics/new.html.erb +0 -1
- data/app/views/thredded/private_topics/show.html.erb +5 -3
- data/app/views/thredded/shared/_nav.html.erb +1 -7
- data/app/views/thredded/shared/nav/_standalone.html.erb +3 -3
- data/app/views/thredded/shared/nav/_standalone_profile.html.erb +3 -0
- data/app/views/thredded/theme_previews/show.html.erb +3 -17
- data/app/views/thredded/topics/_form.html.erb +3 -2
- data/app/views/thredded/topics/index.html.erb +0 -2
- data/app/views/thredded/topics/new.html.erb +0 -2
- data/app/views/thredded/topics/show.html.erb +1 -3
- data/config/locales/en.yml +4 -3
- data/config/locales/es.yml +4 -3
- data/config/locales/pl.yml +4 -3
- data/config/locales/pt-BR.yml +4 -3
- data/config/locales/ru.yml +12 -7
- data/config/routes.rb +2 -0
- data/db/migrate/20160329231848_create_thredded.rb +1 -1
- data/db/upgrade_migrations/20170420163138_upgrade_thredded_v0_11_to_v0_12.rb +25 -0
- data/lib/thredded.rb +0 -1
- data/lib/thredded/content_formatter.rb +11 -0
- data/lib/thredded/version.rb +1 -1
- data/vendor/assets/javascripts/autosize.js +290 -0
- metadata +15 -17
- data/app/views/thredded/preferences/_header.html.erb +0 -1
@@ -2,9 +2,14 @@
|
|
2
2
|
module Thredded
|
3
3
|
class TopicsController < Thredded::ApplicationController # rubocop:disable Metrics/ClassLength
|
4
4
|
include Thredded::NewTopicParams
|
5
|
+
include Thredded::NewPostParams
|
5
6
|
|
6
7
|
before_action :thredded_require_login!,
|
7
8
|
only: %i(edit new update create destroy follow unfollow)
|
9
|
+
|
10
|
+
before_action :use_topic_messageboard,
|
11
|
+
only: %i(show edit update destroy follow unfollow)
|
12
|
+
|
8
13
|
after_action :update_user_activity
|
9
14
|
|
10
15
|
after_action :verify_authorized, except: %i(search)
|
@@ -43,7 +48,7 @@ module Thredded
|
|
43
48
|
)
|
44
49
|
end
|
45
50
|
|
46
|
-
@new_post =
|
51
|
+
@new_post = Thredded::PostForm.new(user: thredded_current_user, topic: topic, post_params: new_post_params)
|
47
52
|
end
|
48
53
|
|
49
54
|
def search
|
@@ -172,7 +177,13 @@ module Thredded
|
|
172
177
|
# @return [Thredded::Topic]
|
173
178
|
# @raise [Thredded::Errors::TopicNotFound] if the topic with the given slug does not exist.
|
174
179
|
def topic
|
175
|
-
@topic ||=
|
180
|
+
@topic ||= Thredded::Topic.friendly_find!(params[:id])
|
181
|
+
end
|
182
|
+
|
183
|
+
# Use the topic's messageboard instead of the one specified in the URL,
|
184
|
+
# to account for `params[:messageboard_id]` pointing to the wrong messageboard
|
185
|
+
def use_topic_messageboard
|
186
|
+
@messageboard = topic.messageboard
|
176
187
|
end
|
177
188
|
|
178
189
|
def topic_params
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Thredded
|
3
|
+
class PostForm
|
4
|
+
attr_reader :post, :topic
|
5
|
+
delegate :id,
|
6
|
+
:persisted?,
|
7
|
+
:content,
|
8
|
+
:content=,
|
9
|
+
to: :@post
|
10
|
+
|
11
|
+
# @param user [Thredded.user_class]
|
12
|
+
# @param topic [Topic]
|
13
|
+
# @param post [PrivatePost]
|
14
|
+
# @param post_params [Hash]
|
15
|
+
def initialize(user:, topic:, post: nil, post_params: {})
|
16
|
+
@messageboard = topic.messageboard
|
17
|
+
@topic = topic
|
18
|
+
@post = post ? post : topic.posts.build
|
19
|
+
|
20
|
+
if post_params.include?(:quote_post)
|
21
|
+
post_params[:content] =
|
22
|
+
Thredded::ContentFormatter.quote_content(post_params.delete(:quote_post).content)
|
23
|
+
end
|
24
|
+
@post.attributes = post_params.merge(
|
25
|
+
user: (user unless user.thredded_anonymous?),
|
26
|
+
messageboard: topic.messageboard
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.for_persisted(post)
|
31
|
+
new(user: post.user, topic: post.postable, post: post)
|
32
|
+
end
|
33
|
+
|
34
|
+
def submit_path
|
35
|
+
Thredded::UrlsHelper.url_for([@messageboard, @topic, @post, only_path: true])
|
36
|
+
end
|
37
|
+
|
38
|
+
def preview_path
|
39
|
+
if @post.persisted?
|
40
|
+
Thredded::UrlsHelper.messageboard_topic_post_preview_path(@messageboard, @topic, @post)
|
41
|
+
else
|
42
|
+
Thredded::UrlsHelper.preview_new_messageboard_topic_post_path(@messageboard, @topic)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def save
|
47
|
+
return false unless @post.valid?
|
48
|
+
@post.save!
|
49
|
+
true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Thredded
|
3
|
+
class PrivatePostForm
|
4
|
+
attr_reader :post, :topic
|
5
|
+
delegate :id,
|
6
|
+
:persisted?,
|
7
|
+
:content,
|
8
|
+
:content=,
|
9
|
+
to: :@post
|
10
|
+
|
11
|
+
# @param user [Thredded.user_class]
|
12
|
+
# @param topic [PrivateTopic]
|
13
|
+
# @param post [Post]
|
14
|
+
# @param post_params [Hash]
|
15
|
+
def initialize(user:, topic:, post: nil, post_params: {})
|
16
|
+
@topic = topic
|
17
|
+
@post = post ? post : topic.posts.build
|
18
|
+
|
19
|
+
if post_params.include?(:quote_post)
|
20
|
+
post_params[:content] =
|
21
|
+
Thredded::ContentFormatter.quote_content(post_params.delete(:quote_post).content)
|
22
|
+
end
|
23
|
+
@post.attributes = post_params.merge(user: (user unless user.thredded_anonymous?))
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.for_persisted(post)
|
27
|
+
new(user: post.user, topic: post.postable, post: post)
|
28
|
+
end
|
29
|
+
|
30
|
+
def submit_path
|
31
|
+
Thredded::UrlsHelper.url_for([@topic, @post, only_path: true])
|
32
|
+
end
|
33
|
+
|
34
|
+
def preview_path
|
35
|
+
if @post.persisted?
|
36
|
+
Thredded::UrlsHelper.private_topic_private_post_preview_path(@topic, @post)
|
37
|
+
else
|
38
|
+
Thredded::UrlsHelper.preview_new_private_topic_private_post_path(@topic)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def save
|
43
|
+
return false unless @post.valid?
|
44
|
+
@post.save!
|
45
|
+
true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -60,6 +60,14 @@ module Thredded
|
|
60
60
|
)
|
61
61
|
end
|
62
62
|
|
63
|
+
def submit_path
|
64
|
+
Thredded::UrlsHelper.url_for([private_topic, only_path: true])
|
65
|
+
end
|
66
|
+
|
67
|
+
def preview_path
|
68
|
+
Thredded::UrlsHelper.preview_new_private_topic_path
|
69
|
+
end
|
70
|
+
|
63
71
|
private
|
64
72
|
|
65
73
|
def topic_categories
|
@@ -55,6 +55,14 @@ module Thredded
|
|
55
55
|
)
|
56
56
|
end
|
57
57
|
|
58
|
+
def submit_path
|
59
|
+
Thredded::UrlsHelper.url_for([messageboard, topic, only_path: true])
|
60
|
+
end
|
61
|
+
|
62
|
+
def preview_path
|
63
|
+
Thredded::UrlsHelper.preview_new_messageboard_topic_path(messageboard)
|
64
|
+
end
|
65
|
+
|
58
66
|
private
|
59
67
|
|
60
68
|
# @return [Thredded.user_class, nil] return a user or nil if the user is a NullUser
|
@@ -22,9 +22,11 @@ module Thredded
|
|
22
22
|
|
23
23
|
# @param user [Thredded.user_class]
|
24
24
|
# @param messageboard [Thredded::Messageboard, nil]
|
25
|
-
|
25
|
+
# @param messageboards [ActiveRecord::Relation<Thredded::Messageboard>]
|
26
|
+
def initialize(user:, messageboard: nil, messageboards: nil, params: {})
|
26
27
|
@user = user
|
27
28
|
@messageboard = messageboard
|
29
|
+
@messageboards = messageboards
|
28
30
|
super(params)
|
29
31
|
end
|
30
32
|
|
@@ -46,6 +48,10 @@ module Thredded
|
|
46
48
|
true
|
47
49
|
end
|
48
50
|
|
51
|
+
def messageboard_groups
|
52
|
+
@messageboard_groups ||= MessageboardGroupView.grouped(@messageboards)
|
53
|
+
end
|
54
|
+
|
49
55
|
def notifications_for_private_topics
|
50
56
|
for_every_notifier(user_preference.notifications_for_private_topics)
|
51
57
|
end
|
@@ -104,6 +104,14 @@ module Thredded
|
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
|
+
def quote_post_path(post)
|
108
|
+
if post.private_topic_post?
|
109
|
+
quote_private_topic_private_post_path(post.postable, post)
|
110
|
+
else
|
111
|
+
quote_messageboard_topic_post_path(post.messageboard, post.postable, post)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
107
115
|
def mark_unread_path(post, _params = {})
|
108
116
|
if post.private_topic_post?
|
109
117
|
mark_as_unread_private_topic_private_post_path(post.postable, post)
|
@@ -111,5 +119,15 @@ module Thredded
|
|
111
119
|
mark_as_unread_messageboard_topic_post_path(post.messageboard, post.postable, post)
|
112
120
|
end
|
113
121
|
end
|
122
|
+
|
123
|
+
# @param post [Post, PrivatePost]
|
124
|
+
# @return [String] post permalink path
|
125
|
+
def permalink_path(post)
|
126
|
+
if post.private_topic_post?
|
127
|
+
private_post_permalink_path(post)
|
128
|
+
else
|
129
|
+
post_permalink_path(post)
|
130
|
+
end
|
131
|
+
end
|
114
132
|
end
|
115
133
|
end
|
@@ -22,8 +22,7 @@ module Thredded
|
|
22
22
|
|
23
23
|
extend FriendlyId
|
24
24
|
friendly_id :slug_candidates,
|
25
|
-
use:
|
26
|
-
scope: :messageboard,
|
25
|
+
use: %i(history reserved),
|
27
26
|
# Avoid route conflicts
|
28
27
|
reserved_words: ::Thredded::FriendlyIdReservedWordsAndPagination.new(%w(topics))
|
29
28
|
|
@@ -153,7 +152,8 @@ module Thredded
|
|
153
152
|
def slug_candidates
|
154
153
|
[
|
155
154
|
:title,
|
156
|
-
[:title, '-
|
155
|
+
[:title, '-', messageboard.try(:name)],
|
156
|
+
[:title, '-', messageboard.try(:name), '-topic']
|
157
157
|
]
|
158
158
|
end
|
159
159
|
|
@@ -5,7 +5,7 @@ module Thredded
|
|
5
5
|
delegate :name, to: :@group, allow_nil: true
|
6
6
|
attr_reader :group, :messageboards
|
7
7
|
|
8
|
-
# @param messageboard_scope [ActiveRecord::Relation]
|
8
|
+
# @param messageboard_scope [ActiveRecord::Relation<Thredded::Messageboard>]
|
9
9
|
# @return [Array<MessageboardGroupView>]
|
10
10
|
def self.grouped(messageboard_scope)
|
11
11
|
messageboard_scope.preload(last_topic: [:last_user])
|
@@ -14,14 +14,18 @@ module Thredded
|
|
14
14
|
to: :@post
|
15
15
|
|
16
16
|
# @param post [Thredded::PostCommon]
|
17
|
-
# @param policy [#update? #destroy?]
|
18
|
-
# @param
|
17
|
+
# @param policy [#create? #update? #destroy? #moderate?]
|
18
|
+
# @param topic_view [Thredded::TopicView]
|
19
19
|
def initialize(post, policy, topic_view: nil)
|
20
20
|
@post = post
|
21
21
|
@policy = policy
|
22
22
|
@topic_view = topic_view
|
23
23
|
end
|
24
24
|
|
25
|
+
def can_reply?
|
26
|
+
@can_reply ||= @policy.create?
|
27
|
+
end
|
28
|
+
|
25
29
|
def can_update?
|
26
30
|
@can_update ||= @policy.update?
|
27
31
|
end
|
@@ -34,6 +38,18 @@ module Thredded
|
|
34
38
|
@can_moderate ||= @policy.moderate?
|
35
39
|
end
|
36
40
|
|
41
|
+
def quote_url_params
|
42
|
+
if @post.private_topic_post?
|
43
|
+
{ post: { quote_private_post_id: @post.id } }
|
44
|
+
else
|
45
|
+
{ post: { quote_post_id: @post.id } }
|
46
|
+
end.update(anchor: 'post_content')
|
47
|
+
end
|
48
|
+
|
49
|
+
def quote_path
|
50
|
+
Thredded::UrlsHelper.quote_post_path(@post)
|
51
|
+
end
|
52
|
+
|
37
53
|
def edit_path
|
38
54
|
Thredded::UrlsHelper.edit_post_path(@post)
|
39
55
|
end
|
@@ -47,7 +63,7 @@ module Thredded
|
|
47
63
|
end
|
48
64
|
|
49
65
|
def permalink_path
|
50
|
-
Thredded::UrlsHelper.
|
66
|
+
Thredded::UrlsHelper.permalink_path(@post)
|
51
67
|
end
|
52
68
|
|
53
69
|
# This cache key is used only for caching the content.
|
@@ -63,9 +63,5 @@ module Thredded
|
|
63
63
|
def messageboard_path
|
64
64
|
Thredded::UrlsHelper.messageboard_topics_path(@topic.messageboard)
|
65
65
|
end
|
66
|
-
|
67
|
-
def new_post_preview_path
|
68
|
-
Thredded::UrlsHelper.preview_new_messageboard_topic_post_path(@topic.messageboard, @topic)
|
69
|
-
end
|
70
66
|
end
|
71
67
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
<%= render 'thredded/posts_common/form',
|
2
|
-
topic: topic,
|
3
2
|
post: post,
|
4
|
-
preview_url: preview_url,
|
5
3
|
content_label: t('thredded.posts.form.content_label'),
|
6
4
|
button_text: button_text,
|
7
5
|
button_submitting_text: local_assigns.key?(:button_submitting_text) ? button_submitting_text : nil %>
|
@@ -2,17 +2,14 @@
|
|
2
2
|
<% content_for :thredded_page_id, 'thredded--edit-post' %>
|
3
3
|
<% content_for :thredded_breadcrumbs do %>
|
4
4
|
<ul class="thredded--navigation-breadcrumbs">
|
5
|
-
<li><%= link_to t('thredded.nav.edit_post'), edit_post_path(@post) %></li>
|
5
|
+
<li><%= link_to t('thredded.nav.edit_post'), edit_post_path(@post_form.post) %></li>
|
6
6
|
</ul>
|
7
7
|
<% end %>
|
8
8
|
|
9
9
|
<%= thredded_page do %>
|
10
10
|
<section class="thredded--main-section">
|
11
11
|
<%= render 'thredded/posts/form',
|
12
|
-
|
13
|
-
topic: topic,
|
14
|
-
post: @post,
|
15
|
-
preview_url: messageboard_topic_post_preview_path(messageboard, @post.postable, @post),
|
12
|
+
post: @post_form,
|
16
13
|
button_text: t('thredded.posts.form.update_btn'),
|
17
14
|
button_submitting_text: t('thredded.posts.form.update_btn_submitting')%>
|
18
15
|
</section>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<% content_for :thredded_page_title, @post_form.topic.title %>
|
2
|
+
<% content_for :thredded_page_id, 'thredded--topic--new-post' %>
|
3
|
+
<% content_for :thredded_breadcrumbs, render('thredded/shared/breadcrumbs') %>
|
4
|
+
|
5
|
+
<%= thredded_page do %>
|
6
|
+
<section class="thredded--main-section">
|
7
|
+
<div class="thredded--post-form--wrapper">
|
8
|
+
<h3 class="thredded--post-form--title"><%= t('thredded.posts.form.title_label') %></h3>
|
9
|
+
<%= render 'thredded/posts/form',
|
10
|
+
post: @post_form,
|
11
|
+
button_text: t('thredded.posts.form.create_btn'),
|
12
|
+
button_submitting_text: t('thredded.posts.form.create_btn_submitting') %>
|
13
|
+
</div>
|
14
|
+
</section>
|
15
|
+
<% end %>
|
@@ -1,5 +1,8 @@
|
|
1
1
|
<% actions = capture do %>
|
2
2
|
<%= view_hooks.post_common.actions.render self, post: post do %>
|
3
|
+
<% if post.can_reply? %>
|
4
|
+
<%= render 'thredded/posts_common/actions/quote', post: post %>
|
5
|
+
<% end %>
|
3
6
|
<% if post.can_update? %>
|
4
7
|
<%= render 'thredded/posts_common/actions/edit', post: post %>
|
5
8
|
<% end %>
|
@@ -1,5 +1,7 @@
|
|
1
|
-
<%# locals:
|
2
|
-
<%= form_for
|
1
|
+
<%# locals: post, content_label, button_text, button_submitting_text. %>
|
2
|
+
<%= form_for post,
|
3
|
+
url: post.submit_path,
|
4
|
+
as: :post,
|
3
5
|
html: {
|
4
6
|
class: 'thredded--form thredded--post-form',
|
5
7
|
'data-thredded-post-form' => true,
|
@@ -8,7 +10,7 @@
|
|
8
10
|
} do |form| %>
|
9
11
|
<ul class="thredded--form-list">
|
10
12
|
<%= render 'thredded/posts_common/form/content',
|
11
|
-
form: form, content_label: content_label, preview_url:
|
13
|
+
form: form, content_label: content_label, preview_url: post.preview_path %>
|
12
14
|
<li>
|
13
15
|
<% button_submitting_text ||=
|
14
16
|
post.persisted? ? t('thredded.form.update_btn_submitting') : t('thredded.form.create_btn_submitting') %>
|
@@ -2,5 +2,7 @@
|
|
2
2
|
<header>
|
3
3
|
<%= image_tag post.avatar_url, class: 'thredded--post--avatar' if post.user %>
|
4
4
|
<h2 class="thredded--post--user"><%= user_link post.user %></h2>
|
5
|
-
<
|
5
|
+
<a href="<%= post.permalink_path %>" rel="nofollow" class="thredded--link thredded--post--created-at">
|
6
|
+
<%= time_ago post.created_at %>
|
7
|
+
</a>
|
6
8
|
</header>
|
@@ -3,8 +3,6 @@
|
|
3
3
|
class: 'thredded--form thredded--notification-preferences-form',
|
4
4
|
'data-thredded-user-preferences-form' => true
|
5
5
|
}) do |f| %>
|
6
|
-
|
7
|
-
<h3><%= t 'thredded.preferences.form.global_preferences_label' %></h3>
|
8
6
|
<ul class="thredded--form-list">
|
9
7
|
<li>
|
10
8
|
<%= f.label :auto_follow_topics do %>
|
@@ -52,9 +50,9 @@
|
|
52
50
|
<% end %>
|
53
51
|
</ul>
|
54
52
|
<% if preferences.messageboard %>
|
55
|
-
<
|
56
|
-
<%= t 'thredded.preferences.
|
57
|
-
</
|
53
|
+
<h2 class="thredded--preferences--title">
|
54
|
+
<%= t 'thredded.preferences.messageboard_preferences_title_html', messageboard: messageboard.name %>
|
55
|
+
</h2>
|
58
56
|
<ul class="thredded--form-list" data-thredded-user-preferences-form-messageboard-fields>
|
59
57
|
<li>
|
60
58
|
<%= f.label :messageboard_auto_follow_topics do %>
|