thredded 0.14.4 → 0.15.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/app/assets/javascripts/thredded/components/preview_area.es6 +3 -0
- data/app/assets/javascripts/thredded/components/spoilers.es6 +37 -0
- data/app/assets/stylesheets/thredded/_email.scss +25 -0
- data/app/assets/stylesheets/thredded/_thredded.scss +1 -0
- data/app/assets/stylesheets/thredded/base/_typography.scss +1 -1
- data/app/assets/stylesheets/thredded/base/_variables.scss +2 -3
- data/app/assets/stylesheets/thredded/components/_post.scss +0 -11
- data/app/assets/stylesheets/thredded/components/_spoiler.scss +41 -0
- data/app/commands/thredded/mark_all_read.rb +1 -7
- data/app/controllers/concerns/thredded/new_post_params.rb +1 -1
- data/app/controllers/concerns/thredded/new_private_post_params.rb +1 -1
- data/app/controllers/concerns/thredded/new_private_topic_params.rb +1 -2
- data/app/controllers/concerns/thredded/new_topic_params.rb +0 -1
- data/app/controllers/thredded/application_controller.rb +10 -0
- data/app/controllers/thredded/posts_controller.rb +1 -2
- data/app/controllers/thredded/private_posts_controller.rb +1 -2
- data/app/controllers/thredded/private_topics_controller.rb +10 -12
- data/app/controllers/thredded/topics_controller.rb +14 -17
- data/app/forms/thredded/edit_topic_form.rb +2 -1
- data/app/forms/thredded/post_form.rb +3 -1
- data/app/forms/thredded/private_post_form.rb +3 -1
- data/app/forms/thredded/private_topic_form.rb +1 -0
- data/app/jobs/thredded/activity_updater_job.rb +18 -8
- data/app/jobs/thredded/auto_follow_and_notify_job.rb +2 -1
- data/app/models/concerns/thredded/post_common.rb +3 -4
- data/app/models/concerns/thredded/topic_common.rb +7 -0
- data/app/models/concerns/thredded/user_topic_read_state_common.rb +62 -5
- data/app/models/thredded/null_user_topic_read_state.rb +8 -0
- data/app/policies/thredded/private_post_policy.rb +16 -0
- data/app/view_hooks/thredded/all_view_hooks.rb +3 -0
- data/app/view_models/thredded/base_topic_view.rb +5 -1
- data/app/view_models/thredded/post_view.rb +13 -1
- data/app/view_models/thredded/posts_page_view.rb +1 -1
- data/app/view_models/thredded/topic_posts_page_view.rb +13 -1
- data/app/views/thredded/posts/_post.html.erb +1 -0
- data/app/views/thredded/posts/edit.html.erb +1 -0
- data/app/views/thredded/posts_common/_before_first_unread_post.html.erb +7 -0
- data/app/views/thredded/posts_common/form/_after_content.html.erb +8 -0
- data/app/views/thredded/posts_common/form/_before_content.html.erb +8 -0
- data/app/views/thredded/private_posts/_private_post.html.erb +2 -1
- data/app/views/thredded/private_posts/edit.html.erb +1 -0
- data/app/views/thredded/private_topics/_form.html.erb +1 -0
- data/app/views/thredded/private_topics/edit.html.erb +2 -1
- data/app/views/thredded/shared/_field_errors.html.erb +3 -0
- data/app/views/thredded/shared/_nav.html.erb +1 -1
- data/app/views/thredded/shared/_page.html.erb +1 -1
- data/app/views/thredded/topics/_form.html.erb +1 -0
- data/app/views/thredded/topics/edit.html.erb +2 -1
- data/config/locales/de.yml +2 -0
- data/config/locales/en.yml +2 -0
- data/config/locales/es.yml +2 -0
- data/config/locales/fr.yml +2 -0
- data/config/locales/it.yml +2 -0
- data/config/locales/pl.yml +2 -0
- data/config/locales/pt-BR.yml +2 -0
- data/config/locales/ru.yml +2 -0
- data/config/locales/zh-CN.yml +2 -0
- data/db/migrate/20160329231848_create_thredded.rb +37 -23
- data/db/upgrade_migrations/{20170811090735_upgrade_thredded_v0_13_to_v_014.rb → 20170811090735_upgrade_thredded_v0_13_to_v0_14.rb} +0 -0
- data/db/upgrade_migrations/20180110200009_upgrade_thredded_v0_14_to_v0_15.rb +91 -0
- data/lib/generators/thredded/install/templates/initializer.rb +16 -7
- data/lib/thredded.rb +143 -125
- data/lib/thredded/arel_compat.rb +57 -0
- data/lib/thredded/base_migration.rb +10 -0
- data/lib/thredded/collection_to_strings_with_cache_renderer.rb +35 -9
- data/lib/thredded/content_formatter.rb +27 -18
- data/lib/thredded/database_seeder.rb +218 -64
- data/lib/thredded/email_transformer.rb +5 -2
- data/lib/thredded/email_transformer/spoiler.rb +25 -0
- data/lib/thredded/formatting_demo_content.rb +12 -0
- data/lib/thredded/html_pipeline/onebox_filter.rb +3 -38
- data/lib/thredded/html_pipeline/spoiler_tag_filter.rb +128 -0
- data/lib/thredded/html_pipeline/utils.rb +47 -0
- data/lib/thredded/rails_lt_5_2_arel_case_node.rb +119 -0
- data/lib/thredded/version.rb +1 -1
- metadata +17 -21
@@ -11,7 +11,7 @@ module Thredded
|
|
11
11
|
|
12
12
|
# @param user [Thredded.user_class]
|
13
13
|
# @param topic [PrivateTopic]
|
14
|
-
# @param post [
|
14
|
+
# @param post [PrivatePost]
|
15
15
|
# @param post_params [Hash]
|
16
16
|
def initialize(user:, topic:, post: nil, post_params: {})
|
17
17
|
@topic = topic
|
@@ -43,7 +43,9 @@ module Thredded
|
|
43
43
|
|
44
44
|
def save
|
45
45
|
return false unless @post.valid?
|
46
|
+
was_persisted = @post.persisted?
|
46
47
|
@post.save!
|
48
|
+
Thredded::UserPrivateTopicReadState.touch!(@post.user.id, @topic.id, @post) unless was_persisted
|
47
49
|
true
|
48
50
|
end
|
49
51
|
end
|
@@ -7,15 +7,25 @@ module Thredded
|
|
7
7
|
def perform(user_id, messageboard_id)
|
8
8
|
now = Time.current
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
begin
|
11
|
+
user_detail = Thredded::UserDetail.find_or_initialize_by(user_id: user_id)
|
12
|
+
user_detail.update!(last_seen_at: now)
|
13
|
+
rescue ActiveRecord::RecordNotUnique
|
14
|
+
# The record has been created from another connection, retry to find it.
|
15
|
+
retry
|
16
|
+
end
|
12
17
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
begin
|
19
|
+
Thredded::MessageboardUser
|
20
|
+
.find_or_initialize_by(
|
21
|
+
thredded_messageboard_id: messageboard_id,
|
22
|
+
thredded_user_detail_id: user_detail.id
|
23
|
+
)
|
24
|
+
.update!(last_seen_at: now)
|
25
|
+
rescue ActiveRecord::RecordNotUnique
|
26
|
+
# The record has been created from another connection, retry to find it.
|
27
|
+
retry
|
28
|
+
end
|
19
29
|
end
|
20
30
|
end
|
21
31
|
end
|
@@ -5,7 +5,8 @@ module Thredded
|
|
5
5
|
queue_as :default
|
6
6
|
|
7
7
|
def perform(post_id)
|
8
|
-
post = Thredded::Post.
|
8
|
+
post = Thredded::Post.find_by(id: post_id)
|
9
|
+
return if post.nil? || post.postable.nil?
|
9
10
|
|
10
11
|
Thredded::AutofollowUsers.new(post).run
|
11
12
|
Thredded::NotifyFollowingUsers.new(post).run
|
@@ -50,16 +50,15 @@ module Thredded
|
|
50
50
|
# Marks all the posts from the given one as unread for the given user
|
51
51
|
# @param user [Thredded.user_class]
|
52
52
|
# @param page [Integer]
|
53
|
-
def mark_as_unread(user
|
53
|
+
def mark_as_unread(user)
|
54
54
|
if previous_post.nil?
|
55
55
|
read_state = postable.user_read_states.find_by(user_id: user.id)
|
56
56
|
read_state.destroy if read_state
|
57
57
|
else
|
58
58
|
read_state = postable.user_read_states.create_with(
|
59
|
-
read_at: previous_post.created_at
|
60
|
-
page: page
|
59
|
+
read_at: previous_post.created_at
|
61
60
|
).find_or_create_by(user_id: user.id)
|
62
|
-
read_state.update_columns(read_at: previous_post.created_at
|
61
|
+
read_state.update_columns(read_at: previous_post.created_at)
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
@@ -17,6 +17,8 @@ module Thredded
|
|
17
17
|
validates :hash_id, presence: true, uniqueness: true
|
18
18
|
validates :posts_count, numericality: true
|
19
19
|
|
20
|
+
validates :title, presence: true, length: { within: Thredded.topic_title_length_range }
|
21
|
+
|
20
22
|
before_validation do
|
21
23
|
self.hash_id = SecureRandom.hex(10) if hash_id.nil?
|
22
24
|
end
|
@@ -56,6 +58,10 @@ module Thredded
|
|
56
58
|
.merge(reads_class.where(reads[:id].eq(nil).or(reads[:read_at].lt(topics[:last_post_at]))))
|
57
59
|
end
|
58
60
|
|
61
|
+
def post_class
|
62
|
+
reflect_on_association(:posts).klass
|
63
|
+
end
|
64
|
+
|
59
65
|
private
|
60
66
|
|
61
67
|
# @param user [Thredded.user_class]
|
@@ -63,6 +69,7 @@ module Thredded
|
|
63
69
|
def read_states_by_postable_hash(user)
|
64
70
|
read_states = reflect_on_association(:user_read_states).klass
|
65
71
|
.where(user_id: user.id, postable_id: current_scope.map(&:id))
|
72
|
+
.with_page_info(posts_scope: Pundit.policy_scope(user, post_class.all))
|
66
73
|
Thredded::TopicCommon::CachingHash.from_relation(read_states)
|
67
74
|
end
|
68
75
|
|
@@ -6,6 +6,8 @@ module Thredded
|
|
6
6
|
included do
|
7
7
|
extend ClassMethods
|
8
8
|
validates :user_id, uniqueness: { scope: :postable_id }
|
9
|
+
attribute :first_unread_post_page, ActiveRecord::Type::Integer.new
|
10
|
+
attribute :last_read_post_page, ActiveRecord::Type::Integer.new
|
9
11
|
end
|
10
12
|
|
11
13
|
# @return [Boolean]
|
@@ -23,20 +25,75 @@ module Thredded
|
|
23
25
|
# @param user_id [Integer]
|
24
26
|
# @param topic_id [Integer]
|
25
27
|
# @param post [Thredded::PostCommon]
|
26
|
-
|
27
|
-
def touch!(user_id, topic_id, post, post_page)
|
28
|
+
def touch!(user_id, topic_id, post)
|
28
29
|
# TODO: Switch to upsert once Travis supports PostgreSQL 9.5.
|
29
30
|
# Travis issue: https://github.com/travis-ci/travis-ci/issues/4264
|
30
31
|
# Upsert gem: https://github.com/seamusabshere/upsert
|
31
32
|
state = find_or_initialize_by(user_id: user_id, postable_id: topic_id)
|
32
|
-
fail ArgumentError, "expected post_page >= 1, given #{post_page.inspect}" if post_page < 1
|
33
33
|
return unless !state.read_at? || state.read_at < post.created_at
|
34
|
-
state.update!(read_at: post.created_at
|
34
|
+
state.update!(read_at: post.created_at)
|
35
35
|
end
|
36
36
|
|
37
37
|
def read_on_first_post!(user, topic)
|
38
|
-
create!(user: user, postable: topic, read_at: Time.zone.now
|
38
|
+
create!(user: user, postable: topic, read_at: Time.zone.now)
|
39
39
|
end
|
40
|
+
|
41
|
+
# Adds `first_unread_post_page` and `last_read_post_page` columns onto the scope.
|
42
|
+
# Skips the records that have no read posts.
|
43
|
+
def with_page_info( # rubocop:disable Metrics/MethodLength
|
44
|
+
posts_per_page: topic_class.default_per_page, posts_scope: post_class.all
|
45
|
+
)
|
46
|
+
states = arel_table
|
47
|
+
self_relation = is_a?(ActiveRecord::Relation) ? self : all
|
48
|
+
if self_relation == unscoped
|
49
|
+
states_select_manager = states
|
50
|
+
else
|
51
|
+
# Using the relation here is redundant but massively improves performance.
|
52
|
+
states_select_manager = Thredded::ArelCompat.new_arel_select_manager(
|
53
|
+
Arel::Nodes::TableAlias.new(Thredded::ArelCompat.relation_to_arel(self_relation), table_name)
|
54
|
+
)
|
55
|
+
end
|
56
|
+
read = if posts_scope == post_class.unscoped
|
57
|
+
post_class.arel_table
|
58
|
+
else
|
59
|
+
posts_subquery = Thredded::ArelCompat.relation_to_arel(posts_scope)
|
60
|
+
Arel::Nodes::TableAlias.new(posts_subquery, 'read_posts')
|
61
|
+
end
|
62
|
+
unread_topics = topic_class.arel_table
|
63
|
+
page_info =
|
64
|
+
states_select_manager
|
65
|
+
.project(
|
66
|
+
states[:id],
|
67
|
+
Arel::Nodes::Case.new(unread_topics[:id].not_eq(nil))
|
68
|
+
.when(Thredded::ArelCompat.true_value(self)).then(
|
69
|
+
Arel::Nodes::Addition.new(
|
70
|
+
Thredded::ArelCompat.integer_division(self, read[:id].count, posts_per_page), 1
|
71
|
+
)
|
72
|
+
).else(nil)
|
73
|
+
.as('first_unread_post_page'),
|
74
|
+
Arel::Nodes::Addition.new(
|
75
|
+
Thredded::ArelCompat.integer_division(self, read[:id].count, posts_per_page),
|
76
|
+
Arel::Nodes::Case.new(Arel::Nodes::InfixOperation.new(:%, read[:id].count, posts_per_page))
|
77
|
+
.when(0).then(0).else(1)
|
78
|
+
).as('last_read_post_page')
|
79
|
+
)
|
80
|
+
.join(read)
|
81
|
+
.on(read[:postable_id].eq(states[:postable_id]).and(read[:created_at].lteq(states[:read_at])))
|
82
|
+
.outer_join(unread_topics)
|
83
|
+
.on(states[:postable_id].eq(unread_topics[:id]).and(unread_topics[:last_post_at].gt(states[:read_at])))
|
84
|
+
.group(states[:id], unread_topics[:id])
|
85
|
+
.as('id_and_page_info')
|
86
|
+
|
87
|
+
# We use a subquery because selected fields must appear in the GROUP BY or be used in an aggregate function.
|
88
|
+
select(states[Arel.star], page_info[:first_unread_post_page], page_info[:last_read_post_page])
|
89
|
+
.joins(states.join(page_info).on(states[:id].eq(page_info[:id])).join_sources)
|
90
|
+
end
|
91
|
+
|
92
|
+
def topic_class
|
93
|
+
reflect_on_association(:postable).klass
|
94
|
+
end
|
95
|
+
|
96
|
+
delegate :post_class, to: :topic_class
|
40
97
|
end
|
41
98
|
end
|
42
99
|
end
|
@@ -2,6 +2,22 @@
|
|
2
2
|
|
3
3
|
module Thredded
|
4
4
|
class PrivatePostPolicy
|
5
|
+
# The scope of readable private posts.
|
6
|
+
# {PrivateTopicPolicy} must be applied separately.
|
7
|
+
class Scope
|
8
|
+
# @param user [Thredded.user_class]
|
9
|
+
# @param scope [ActiveRecord::Relation<Thredded::Post>]
|
10
|
+
def initialize(user, scope)
|
11
|
+
@user = user
|
12
|
+
@scope = scope
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [ActiveRecord::Relation<Thredded::Post>]
|
16
|
+
def resolve
|
17
|
+
@scope
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
5
21
|
# @param user [Thredded.user_class]
|
6
22
|
# @param post [Thredded::PrivatePost]
|
7
23
|
def initialize(user, post)
|
@@ -35,12 +35,15 @@ module Thredded
|
|
35
35
|
|
36
36
|
# View hooks for collections of public or private posts.
|
37
37
|
class PostsCommon
|
38
|
+
# @return [Thredded::AllViewHooks::ViewHook]
|
39
|
+
attr_reader :before_first_unread_post
|
38
40
|
# @return [Thredded::AllViewHooks::ViewHook]
|
39
41
|
attr_reader :pagination_top
|
40
42
|
# @return [Thredded::AllViewHooks::ViewHook]
|
41
43
|
attr_reader :pagination_bottom
|
42
44
|
|
43
45
|
def initialize
|
46
|
+
@before_first_unread_post = ViewHook.new
|
44
47
|
@pagination_top = ViewHook.new
|
45
48
|
@pagination_bottom = ViewHook.new
|
46
49
|
end
|
@@ -37,7 +37,11 @@ module Thredded
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def path
|
40
|
-
Thredded::UrlsHelper.topic_path(
|
40
|
+
Thredded::UrlsHelper.topic_path(
|
41
|
+
@topic,
|
42
|
+
page: @read_state.first_unread_post_page || @read_state.last_read_post_page,
|
43
|
+
anchor: ('unread' if @read_state.first_unread_post_page)
|
44
|
+
)
|
41
45
|
end
|
42
46
|
end
|
43
47
|
end
|
@@ -17,10 +17,14 @@ module Thredded
|
|
17
17
|
# @param post [Thredded::PostCommon]
|
18
18
|
# @param policy [#create? #update? #destroy? #moderate?]
|
19
19
|
# @param topic_view [Thredded::TopicView]
|
20
|
-
|
20
|
+
# @param first_in_page [Boolean]
|
21
|
+
# @param first_unread_in_page [Boolean]
|
22
|
+
def initialize(post, policy, topic_view: nil, first_in_page: false, first_unread_in_page: false)
|
21
23
|
@post = post
|
22
24
|
@policy = policy
|
23
25
|
@topic_view = topic_view
|
26
|
+
@first_unread_in_page = first_unread_in_page
|
27
|
+
@first_in_page = first_in_page
|
24
28
|
end
|
25
29
|
|
26
30
|
def can_reply?
|
@@ -85,5 +89,13 @@ module Thredded
|
|
85
89
|
POST_IS_UNREAD
|
86
90
|
end
|
87
91
|
end
|
92
|
+
|
93
|
+
def first_unread_in_page?
|
94
|
+
@first_unread_in_page
|
95
|
+
end
|
96
|
+
|
97
|
+
def first_in_page?
|
98
|
+
@first_in_page
|
99
|
+
end
|
88
100
|
end
|
89
101
|
end
|
@@ -19,7 +19,7 @@ module Thredded
|
|
19
19
|
# @param paginated_scope [ActiveRecord::Relation<Thredded::PostCommon>]
|
20
20
|
def initialize(user, paginated_scope, topic_view: nil)
|
21
21
|
@paginated_scope = paginated_scope
|
22
|
-
@post_views
|
22
|
+
@post_views = paginated_scope.map do |post|
|
23
23
|
Thredded::PostView.new(post, Pundit.policy!(user, post), topic_view: topic_view)
|
24
24
|
end
|
25
25
|
end
|
@@ -10,8 +10,20 @@ module Thredded
|
|
10
10
|
# @param topic [Thredded::TopicCommon]
|
11
11
|
# @param paginated_scope [ActiveRecord::Relation<Thredded::PostCommon>]
|
12
12
|
def initialize(user, topic, paginated_scope)
|
13
|
+
@paginated_scope = paginated_scope
|
13
14
|
@topic = "#{paginated_scope.reflect_on_association(:postable).klass}View".constantize.from_user(topic, user)
|
14
|
-
|
15
|
+
prev_read = false
|
16
|
+
@post_views = paginated_scope.map.with_index do |post, i|
|
17
|
+
post_read = @topic.post_read?(post)
|
18
|
+
post_view = Thredded::PostView.new(
|
19
|
+
post, Pundit.policy!(user, post),
|
20
|
+
topic_view: @topic,
|
21
|
+
first_in_page: i.zero?,
|
22
|
+
first_unread_in_page: !post_read && prev_read
|
23
|
+
)
|
24
|
+
prev_read = post_read
|
25
|
+
post_view
|
26
|
+
end
|
15
27
|
end
|
16
28
|
end
|
17
29
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
<% post, content = post_and_content if local_assigns.key?(:post_and_content) %>
|
2
|
+
<%= render 'thredded/posts_common/before_first_unread_post', post: post if post.first_unread_in_page? %>
|
2
3
|
<%= content_tag :article, id: dom_id(post), class: "thredded--post thredded--#{post.read_state}--post" do %>
|
3
4
|
<%= render 'thredded/posts_common/actions', post: post, actions: local_assigns[:actions] %>
|
4
5
|
<%= render 'thredded/posts_common/header', post: post %>
|
@@ -2,6 +2,7 @@
|
|
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 @post_form.topic.title, post_path(@post_form.post, user: thredded_current_user) %></li>
|
5
6
|
<li><%= link_to t('thredded.nav.edit_post'), edit_post_path(@post_form.post) %></li>
|
6
7
|
</ul>
|
7
8
|
<% end %>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<div class="thredded--before-first-unread-post<%= ' unread--before-first-unread-post--first-in-page' if post.first_in_page? %>">
|
2
|
+
<%= view_hooks.posts_common.before_first_unread_post.render(self, post: post) do %>
|
3
|
+
<% unless post.first_in_page? %>
|
4
|
+
<span id="unread"></span>
|
5
|
+
<% end %>
|
6
|
+
<% end %>
|
7
|
+
</div>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%#
|
2
|
+
# This partial is deprecated. Add a view hook to the initializer instead, for example:
|
3
|
+
|
4
|
+
Thredded.view_hooks.post_form.content_text_area.config.after do
|
5
|
+
# This is rendered in the Thredded view context, so all Thredded helpers and URLs are accessible here directly.
|
6
|
+
render partial: 'my_partial'
|
7
|
+
end
|
8
|
+
%>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%#
|
2
|
+
# This partial is deprecated. Add a view hook to the initializer instead, for example:
|
3
|
+
|
4
|
+
Thredded.view_hooks.post_form.content_text_area.config.before do
|
5
|
+
# This is rendered in the Thredded view context, so all Thredded helpers and URLs are accessible here directly.
|
6
|
+
render partial: 'my_partial'
|
7
|
+
end
|
8
|
+
%>
|
@@ -1,5 +1,6 @@
|
|
1
1
|
<% private_post, content = post_and_content if local_assigns.key?(:post_and_content) %>
|
2
|
-
<%=
|
2
|
+
<%= render 'thredded/posts_common/before_first_unread_post', post: private_post if private_post.first_unread_in_page? %>
|
3
|
+
<%= content_tag :article, id: dom_id(private_post), class: "thredded--post thredded--#{private_post.read_state}--post" do %>
|
3
4
|
<%= render 'thredded/posts_common/actions', post: private_post, actions: local_assigns[:actions] %>
|
4
5
|
<%= render 'thredded/posts_common/header', post: private_post %>
|
5
6
|
<%= content || render('thredded/private_posts/content', post: post) %>
|
@@ -2,6 +2,7 @@
|
|
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 @post_form.topic.title, post_path(@post_form.post, user: thredded_current_user) %></li>
|
5
6
|
<li><%= link_to t('thredded.nav.edit_post'), edit_post_path(@post_form.post) %></li>
|
6
7
|
</ul>
|
7
8
|
<% end %>
|
@@ -12,6 +12,7 @@
|
|
12
12
|
<li class="title">
|
13
13
|
<%= form.label :title, t('thredded.private_topics.form.title_label') %>
|
14
14
|
<%= form.text_field :title, placeholder: placeholder, required: true %>
|
15
|
+
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title] if form.object.errors.include?(:title) %>
|
15
16
|
</li>
|
16
17
|
<li>
|
17
18
|
<%= form.label :user_names, t('thredded.private_topics.form.users_label') %>
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<ul class="thredded--navigation-breadcrumbs">
|
5
5
|
<li><%= link_to t('thredded.nav.all_messageboards'), messageboards_path %></li>
|
6
6
|
<li><%= link_to t('thredded.nav.private_topics'), private_topics_path %></li>
|
7
|
-
<li><%= link_to @private_topic.title, topic_path(@private_topic) %></li>
|
7
|
+
<li><%= link_to @private_topic.title_was || @private_topic.title, topic_path(@private_topic) %></li>
|
8
8
|
<li><%= link_to t('thredded.nav.edit_private_topic'), edit_private_topic_path(@private_topic) %></li>
|
9
9
|
</ul>
|
10
10
|
<% end %>
|
@@ -22,6 +22,7 @@
|
|
22
22
|
placeholder: t('thredded.private_topics.form.title_placeholder_new'),
|
23
23
|
autofocus: true,
|
24
24
|
required: true %>
|
25
|
+
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title] if form.object.errors.include?(:title) %>
|
25
26
|
</li>
|
26
27
|
<li>
|
27
28
|
<button type="submit" class="thredded--form--submit"
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<ul class="thredded--user-navigation<%= ' thredded--user-navigation-standalone' if Thredded.standalone_layout? %>">
|
3
3
|
<%= render 'thredded/shared/nav/moderation' %>
|
4
4
|
<%= render 'thredded/shared/nav/notification_preferences', messageboard: messageboard_or_nil %>
|
5
|
-
<%= render 'thredded/shared/nav/private_topics' %>
|
5
|
+
<%= render 'thredded/shared/nav/private_topics' if Thredded.private_messaging_enabled %>
|
6
6
|
<% if Thredded.standalone_layout? %>
|
7
7
|
<%= render 'thredded/shared/nav/standalone_profile' if thredded_signed_in? %>
|
8
8
|
<%= render 'thredded/shared/nav/standalone' %>
|