thredded-workgroup 0.2.0 → 0.3.1
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/.rubocop.yml +23 -6
- data/.rubocop_todo.yml +392 -0
- data/.travis.yml +20 -28
- data/CHANGELOG.md +18 -0
- data/Gemfile +1 -0
- data/Guardfile +17 -40
- data/README.md +27 -10
- data/RELEASE_CHECKLIST.md +1 -2
- data/Rakefile +5 -0
- data/app/assets/config/thredded_workgroup_manifest.js +3 -0
- data/app/assets/images/thredded/workgroup/envelope-o.svg +2 -0
- data/app/assets/images/thredded/workgroup/envelope-open-o.svg +2 -0
- data/app/assets/javascripts/thredded/workgroup/components/followers.es6 +24 -0
- data/app/assets/javascripts/thredded/workgroup/components/overflow.es6 +60 -0
- data/app/assets/javascripts/thredded/workgroup/components/topics.es6 +151 -0
- data/app/assets/javascripts/thredded/workgroup/core/thredded_workgroup.js +1 -0
- data/app/assets/javascripts/thredded/workgroup/core/touch.es6 +16 -0
- data/app/assets/javascripts/thredded/workgroup/index.js +3 -0
- data/app/assets/javascripts/thredded-workgroup.js +1 -13
- data/app/assets/stylesheets/thredded/workgroup/_followers.scss +51 -0
- data/app/assets/stylesheets/thredded/workgroup/_navs.scss +29 -7
- data/app/assets/stylesheets/thredded/workgroup/_overflow.scss +71 -0
- data/app/assets/stylesheets/thredded/workgroup/_topics.scss +186 -16
- data/app/assets/stylesheets/thredded-workgroup.scss +2 -0
- data/app/controllers/concerns/thredded/workgroup/all_unread_followed_topics.rb +35 -0
- data/app/controllers/thredded/application_controller.rb +23 -0
- data/app/controllers/thredded/posts_controller.rb +3 -2
- data/app/controllers/thredded/workgroup/application_controller.rb +1 -0
- data/app/controllers/thredded/workgroup/navs_controller.rb +1 -0
- data/app/controllers/thredded/workgroup/read_states_controller.rb +14 -0
- data/app/controllers/thredded/workgroup/topics_controller.rb +18 -0
- data/app/helpers/thredded/application_helper.rb +1 -0
- data/app/helpers/thredded/workgroup/application_helper.rb +1 -0
- data/app/jobs/thredded/workgroup/mark_all_topics_read_job.rb +13 -0
- data/app/view_hooks/thredded/all_view_hooks.rb +9 -0
- data/app/view_hooks/thredded/workgroup/view_hooks.rb +28 -0
- data/app/view_models/thredded/topic_view.rb +17 -0
- data/app/view_models/thredded/topics_page_view.rb +1 -0
- data/app/views/thredded/shared/nav/_unread_topics.html.erb +1 -0
- data/app/views/thredded/topics/_followers.html.erb +23 -0
- data/app/views/thredded/topics/_topic.html.erb +25 -28
- data/app/views/thredded/workgroup/navs/_personal_nav.html.erb +7 -1
- data/app/views/thredded/workgroup/navs/all_topics.html.erb +1 -1
- data/app/views/thredded/workgroup/navs/awaiting.html.erb +1 -1
- data/app/views/thredded/workgroup/navs/following.html.erb +1 -1
- data/app/views/thredded/workgroup/navs/unread.html.erb +1 -1
- data/app/views/thredded/workgroup/topics/_controls.html.erb +21 -0
- data/app/views/thredded/workgroup/topics/_last_post.html.erb +11 -0
- data/app/views/thredded/workgroup/topics/_last_post_with_controls.html.erb +12 -0
- data/app/views/thredded/workgroup/topics/_topics_with_last_post.html.erb +16 -0
- data/bin/rails.rb +1 -0
- data/bin/rspec +1 -0
- data/bin/update_from_thredded +2 -1
- data/config/locales/en.yml +11 -0
- data/config/routes.rb +9 -0
- data/docs/followers-above-post.png +0 -0
- data/docs/navbar.png +0 -0
- data/lib/thredded/workgroup/engine.rb +11 -2
- data/lib/thredded/workgroup/thredded_route_delegator.rb +1 -0
- data/lib/thredded/workgroup/version.rb +2 -1
- data/lib/thredded/workgroup.rb +1 -0
- data/shared.gemfile +23 -16
- data/thredded-workgroup.gemspec +14 -18
- metadata +83 -88
- data/app/assets/javascripts/thredded/workgroup/follow.js +0 -36
- data/app/assets/javascripts/thredded/workgroup/topics.js +0 -18
- data/app/views/thredded/topics/_topics_with_last_post.html.erb +0 -14
@@ -1,6 +1,7 @@
|
|
1
1
|
.thredded--topic-source cite a {
|
2
2
|
color: #a5aab6;
|
3
3
|
text-decoration: none;
|
4
|
+
|
4
5
|
&:hover {
|
5
6
|
color: #4a90e2;
|
6
7
|
|
@@ -17,36 +18,205 @@ cite.thredded--messageboard-name {
|
|
17
18
|
.thredded--topic-post-and-last-user {
|
18
19
|
max-width: 35rem;
|
19
20
|
margin: auto;
|
20
|
-
|
21
|
+
padding-top: 1rem;
|
22
|
+
}
|
23
|
+
|
24
|
+
.thredded--topics--topic {
|
25
|
+
a.thredded-follow-toggle {
|
26
|
+
position: absolute;
|
27
|
+
right: -1.6rem;
|
28
|
+
top: 0;
|
29
|
+
|
30
|
+
svg, svg.thredded--topics--follow-icon {
|
31
|
+
position: static;
|
32
|
+
fill: currentColor;
|
33
|
+
display: inline-block;
|
34
|
+
font-size: 1em;
|
35
|
+
width: 1.4rem;
|
36
|
+
height: 1.4rem;
|
37
|
+
opacity: 0.4;
|
38
|
+
}
|
21
39
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
&.thredded--hovering {
|
27
|
-
opacity: 1;
|
40
|
+
&:hover svg {
|
41
|
+
cursor: pointer;
|
42
|
+
opacity: 0.7;
|
43
|
+
color: #4a90e2;
|
28
44
|
}
|
29
45
|
}
|
30
|
-
|
31
|
-
|
46
|
+
|
47
|
+
&.thredded--topic-following a.thredded-follow-toggle {
|
48
|
+
svg.thredded--topics--unfollow-icon {
|
49
|
+
display: none;
|
50
|
+
}
|
51
|
+
|
52
|
+
&:hover, &.thredded--topic-hovering {
|
53
|
+
svg.thredded--topics--follow-icon {
|
54
|
+
color: darken($thredded-brand, 20%);
|
55
|
+
}
|
56
|
+
}
|
32
57
|
}
|
33
|
-
}
|
34
58
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
59
|
+
&.thredded--topic-notfollowing a.thredded-follow-toggle {
|
60
|
+
svg.thredded--topics--unfollow-icon {
|
61
|
+
opacity: 0.2;
|
62
|
+
}
|
63
|
+
|
64
|
+
svg.thredded--topics--follow-icon {
|
65
|
+
display: none;
|
66
|
+
}
|
67
|
+
|
68
|
+
&:hover, &.thredded--topic-hovering {
|
69
|
+
svg.thredded--topics--unfollow-icon {
|
70
|
+
opacity: 0.5;
|
71
|
+
}
|
72
|
+
}
|
40
73
|
}
|
41
74
|
}
|
42
75
|
|
43
|
-
|
76
|
+
|
77
|
+
.thredded--topics--topic.thredded--topic-hovering {
|
44
78
|
cursor: pointer;
|
45
79
|
|
46
80
|
.thredded--topic-title a {
|
47
81
|
color: #4a90e2;
|
82
|
+
|
48
83
|
&:hover {
|
49
84
|
cursor: pointer;
|
50
85
|
}
|
51
86
|
}
|
87
|
+
|
88
|
+
.thredded--topic-controls {
|
89
|
+
.thredded--topic--view-button {
|
90
|
+
background-color: $thredded-button-hover-background;
|
91
|
+
color: $thredded-button-hover-color;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
.thredded--topic-controls {
|
97
|
+
.thredded--topic--read-state-toggle.thredded--topic-hovering {
|
98
|
+
background-color: $thredded-button-hover-background;
|
99
|
+
color: $thredded-button-hover-color;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
.thredded--topic-last-post-with-controls {
|
104
|
+
position: relative;
|
105
|
+
top: 0;
|
106
|
+
}
|
107
|
+
|
108
|
+
.thredded--topic-controls {
|
109
|
+
display: none;
|
110
|
+
position: absolute;
|
111
|
+
top: 5px;
|
112
|
+
right: 0;
|
113
|
+
z-index: 4;
|
114
|
+
|
115
|
+
.thredded--topic-hovering & {
|
116
|
+
display: block;
|
117
|
+
background: #ffffff88;
|
118
|
+
}
|
119
|
+
|
120
|
+
.thredded--icon {
|
121
|
+
height: 0.85em;
|
122
|
+
margin: 0;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
.thredded--topics--topic > .thredded--topic--read-state-toggle {
|
127
|
+
border-radius: 50%;
|
128
|
+
display: inline-block;
|
129
|
+
font-weight: 900;
|
130
|
+
font-size: 0.8rem;
|
131
|
+
height: 2rem;
|
132
|
+
left: -$thredded-topics-topic-posts-counter-width;
|
133
|
+
line-height: 2rem;
|
134
|
+
margin-right: $thredded-base-spacing;
|
135
|
+
position: absolute;
|
136
|
+
text-align: center;
|
137
|
+
top: 0;
|
138
|
+
width: 2rem;
|
139
|
+
transition: background 0.1s linear, color 0.1s linear;
|
140
|
+
|
141
|
+
.thredded--icon {
|
142
|
+
height: 1.25em;
|
143
|
+
position: relative;
|
144
|
+
top: 10%;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
.thredded--topic-read {
|
149
|
+
> .thredded--topics--title a {
|
150
|
+
font-weight: lighter;
|
151
|
+
}
|
152
|
+
|
153
|
+
> .thredded--topic--read-state-toggle {
|
154
|
+
background: $thredded-badge-inactive-background;
|
155
|
+
color: $thredded-badge-inactive-color;
|
156
|
+
|
157
|
+
&.thredded--topic-hovering {
|
158
|
+
background: darken(opacify($thredded-badge-inactive-background, 0.25), 20%);
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
.thredded--topic--read-state-toggle.thredded--topic--mark-as-read {
|
163
|
+
display: none
|
164
|
+
}
|
165
|
+
|
166
|
+
}
|
167
|
+
|
168
|
+
.thredded--topic-unread {
|
169
|
+
> .thredded--topics--title a {
|
170
|
+
font-weight: bold;
|
171
|
+
}
|
172
|
+
|
173
|
+
> .thredded--topic--read-state-toggle {
|
174
|
+
background: $thredded-badge-active-background;
|
175
|
+
color: $thredded-badge-active-color;
|
176
|
+
|
177
|
+
.thredded--topics--read-icon {
|
178
|
+
display: none;
|
179
|
+
}
|
180
|
+
|
181
|
+
&.thredded--topic-hovering {
|
182
|
+
background: darken($thredded-badge-active-background, 20%);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
.thredded--topic--read-state-toggle.thredded--topic--mark-as-unread {
|
187
|
+
display: none
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
.thredded--button {
|
192
|
+
svg.thredded--icon {
|
193
|
+
max-width: 16px;
|
194
|
+
}
|
195
|
+
|
196
|
+
&.thredded--topic-hovering {
|
197
|
+
background: darken($thredded-badge-active-background, 20%);
|
198
|
+
}
|
199
|
+
}
|
200
|
+
|
201
|
+
.thredded--topic-following {
|
202
|
+
.thredded--button.thredded--topic--follow {
|
203
|
+
display: none;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
.thredded--topic-notfollowing {
|
208
|
+
.thredded--button.thredded--topic--unfollow {
|
209
|
+
display: none;
|
210
|
+
}
|
211
|
+
}
|
212
|
+
|
213
|
+
@include thredded-media-mobile {
|
214
|
+
.thredded--topic-hovering {
|
215
|
+
.thredded--button.thredded--topic--mark-as-unread,
|
216
|
+
.thredded--button.thredded--topic--mark-as-read,
|
217
|
+
.thredded--button.thredded--topic--follow,
|
218
|
+
.thredded--button.thredded--topic--unfollow {
|
219
|
+
display: none;
|
220
|
+
}
|
221
|
+
}
|
52
222
|
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Thredded
|
4
|
+
module Workgroup
|
5
|
+
module AllUnreadFollowedTopics
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
if defined?(Pundit::Authorization)
|
9
|
+
include Pundit::Authorization
|
10
|
+
else
|
11
|
+
include Pundit
|
12
|
+
end
|
13
|
+
helper_method :all_unread_followed_topics_count
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [ActiveRecord::Relation]
|
17
|
+
def all_topics_scope
|
18
|
+
@all_topics_scope ||=
|
19
|
+
policy_scope(Thredded::Topic.all).joins(:messageboard).merge(policy_scope(Thredded::Messageboard.all))
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return Integer
|
23
|
+
def all_unread_followed_topics_count
|
24
|
+
@all_unread_followed_topics_count ||=
|
25
|
+
if thredded_signed_in?
|
26
|
+
all_topics_scope.unread_followed_by(thredded_current_user).count
|
27
|
+
else
|
28
|
+
0
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# need to define `thredded_current_user` and possibly `pundit_user`
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_dependency File.expand_path("../../app/controllers/thredded/application_controller",
|
4
|
+
Thredded::Engine.called_from)
|
5
|
+
|
6
|
+
module Thredded
|
7
|
+
module ApplicationControllerRetaining
|
8
|
+
def topics_scope
|
9
|
+
return super if messageboard_or_nil
|
10
|
+
all_topics_scope
|
11
|
+
end
|
12
|
+
|
13
|
+
def unread_followed_topics_count
|
14
|
+
return super if messageboard_or_nil
|
15
|
+
all_unread_followed_topics_count
|
16
|
+
end
|
17
|
+
end
|
18
|
+
class ApplicationController
|
19
|
+
include Thredded::Workgroup::AllUnreadFollowedTopics
|
20
|
+
|
21
|
+
prepend ::Thredded::ApplicationControllerRetaining
|
22
|
+
end
|
23
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require_dependency File.expand_path("../../app/controllers/thredded/posts_controller", Thredded::Engine.called_from)
|
3
4
|
|
4
5
|
module Thredded
|
@@ -9,11 +10,11 @@ module Thredded
|
|
9
10
|
)
|
10
11
|
authorize_creating @post_form.post
|
11
12
|
|
12
|
-
if @post_form.save
|
13
|
+
if @post_form.save
|
13
14
|
# TODO: extract as a hook on thredded#posts_controller `after_create(post)`
|
14
15
|
redirect_after_create(@post_form.post)
|
15
16
|
else
|
16
|
-
|
17
|
+
render :new
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Thredded
|
4
|
+
module Workgroup
|
5
|
+
class ReadStatesController < ::Thredded::Workgroup::ApplicationController
|
6
|
+
before_action :thredded_require_login!
|
7
|
+
|
8
|
+
def mark_all_topics_read
|
9
|
+
::Thredded::Workgroup::MarkAllTopicsReadJob.perform_later(thredded_current_user) if thredded_signed_in?
|
10
|
+
redirect_to request.referer, flash: { notice: "Marking all topics as read (will take a few seconds)" }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# frozen_string_literal: true # frozen_string_literal: true
|
4
|
+
|
5
|
+
module Thredded
|
6
|
+
module Workgroup
|
7
|
+
class TopicsController < Thredded::Workgroup::ApplicationController
|
8
|
+
before_action :thredded_require_login!
|
9
|
+
|
10
|
+
def kick
|
11
|
+
if (user_topic_follow = UserTopicFollow.where(topic_id: params[:id], user_id: params[:user_id]).first)
|
12
|
+
user_topic_follow.destroy
|
13
|
+
end
|
14
|
+
render plain: "Ok"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Thredded
|
4
|
+
module Workgroup
|
5
|
+
class MarkAllTopicsReadJob < ::ActiveJob::Base
|
6
|
+
def perform(user)
|
7
|
+
::Thredded::Topic.unread(user).each do |topic|
|
8
|
+
::Thredded::UserTopicReadState.touch!(user.id, topic.last_post)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Thredded
|
4
|
+
module Workgroup
|
5
|
+
module ViewHooks
|
6
|
+
attr_reader :topic_with_last_post
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super
|
10
|
+
@topic_with_last_post = TopicWithLastPost.new
|
11
|
+
end
|
12
|
+
|
13
|
+
# View hooks for a Topic when displaying last post.
|
14
|
+
class TopicWithLastPost
|
15
|
+
# @return [Thredded::AllViewHooks::ViewHook]
|
16
|
+
attr_reader :last_post_with_controls
|
17
|
+
|
18
|
+
# @return [Thredded::AllViewHooks::ViewHook]
|
19
|
+
attr_reader :last_post
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
@last_post_with_controls = Thredded::AllViewHooks::ViewHook.new
|
23
|
+
@last_post = Thredded::AllViewHooks::ViewHook.new
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require_dependency File.expand_path("../../app/view_models/thredded/topic_view", Thredded::Engine.called_from)
|
3
4
|
module Thredded
|
4
5
|
class TopicView < Thredded::BaseTopicView
|
@@ -11,5 +12,21 @@ module Thredded
|
|
11
12
|
page = @read_state.first_unread_post_page || @read_state.last_read_post_page
|
12
13
|
Thredded::UrlsHelper.topic_path(@topic, page: page, anchor: anchor)
|
13
14
|
end
|
15
|
+
|
16
|
+
def reply_path
|
17
|
+
Thredded::UrlsHelper.topic_path(@topic, page: last_page, anchor: "new_post")
|
18
|
+
end
|
19
|
+
|
20
|
+
def mark_as_unread_path
|
21
|
+
Thredded::UrlsHelper.mark_as_unread_post_path(id: last_post.id, format: :json)
|
22
|
+
end
|
23
|
+
|
24
|
+
def mark_as_read_path
|
25
|
+
Thredded::UrlsHelper.mark_as_read_post_path(id: last_post.id, format: :json)
|
26
|
+
end
|
27
|
+
|
28
|
+
def last_page
|
29
|
+
(@topic.posts_count / Thredded.posts_per_page.to_f).ceil # TODO: doesn't account for visibility
|
30
|
+
end
|
14
31
|
end
|
15
32
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<% # overriding thredded's view %>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<% if Thredded.show_topic_followers %>
|
2
|
+
<%= define_svg_icons "thredded/follow.svg", "thredded/unfollow.svg" %>
|
3
|
+
<div class="thredded--topic-followers">
|
4
|
+
<% if topic.followers.length > 0 %>
|
5
|
+
<%= t('thredded.topics.followed_by')%>
|
6
|
+
<% topic.followers.each do |user| %>
|
7
|
+
<span class="thredded--follower user-<%= user.id %>">
|
8
|
+
<%= user_mention(user) %>
|
9
|
+
<%- if user == thredded_current_user %>
|
10
|
+
<%= t("thredded.workgroup.following.you")%>
|
11
|
+
<%- else %>
|
12
|
+
<button class="thredded--follower--remove" data-kick-path="<%= thredded_workgroup.kick_topic_path(topic.to_model.id, user_id: user.id) %>" title="Remove follower" aria-label="Remove follower">
|
13
|
+
<%= shared_inline_svg "thredded/follow.svg", class: "thredded--topics--follow-icon", role: "img" %>
|
14
|
+
<%= shared_inline_svg "thredded/unfollow.svg", class: "thredded--topics--unfollow-icon", role: "img" %>
|
15
|
+
</button>
|
16
|
+
<%- end %>
|
17
|
+
</span>
|
18
|
+
<% end %>
|
19
|
+
<% else %>
|
20
|
+
<%= t('thredded.topics.followed_by_noone')%>
|
21
|
+
<% end %>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
@@ -2,22 +2,18 @@
|
|
2
2
|
id: dom_id(topic),
|
3
3
|
class: ['thredded--topics--topic', topic_css_classes(topic)],
|
4
4
|
data: {topic: topic.id, messageboard: topic.messageboard_id} do %>
|
5
|
-
|
5
|
+
|
6
|
+
<div class="thredded--topic--read-state-toggle">
|
7
|
+
<%= shared_inline_svg("thredded/workgroup/envelope-open-o.svg", class: "thredded--topics--read-icon thredded--icon", role: "img", viewBox: "0 0 1792 1792", title: "Mark as read") %>
|
8
|
+
<%= shared_inline_svg("thredded/workgroup/envelope-o.svg", class: "thredded--topics--unread-icon thredded--icon", role: "img", viewBox: "0 0 1792 1792", title: "Mark as unread") %>
|
9
|
+
</div>
|
6
10
|
|
7
11
|
<h1 class="thredded--topics--title">
|
8
12
|
<span class="thredded--topic-title"><%= link_to topic.title, topic.path %></span>
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
<% end %>
|
14
|
-
<svg viewBox="0 0 116 121" class="thredded--topics--follow-icon">
|
15
|
-
<% if topic.followed? %>
|
16
|
-
<use xlink:href="#thredded-follow-icon"/>
|
17
|
-
<% else %>
|
18
|
-
<use xlink:href="#thredded-unfollow-icon"/>
|
19
|
-
<% end %>
|
20
|
-
</svg>
|
13
|
+
<a href="#" class="thredded-follow-toggle js-thredded-follow-toggle">
|
14
|
+
<%= shared_inline_svg "thredded/follow.svg", class: "thredded--topics--follow-icon", role: "img" %>
|
15
|
+
<%= shared_inline_svg "thredded/unfollow.svg", class: "thredded--topics--unfollow-icon", role: "img" %>
|
16
|
+
</a>
|
21
17
|
</h1>
|
22
18
|
|
23
19
|
<% if topic.categories.any? %>
|
@@ -26,26 +22,27 @@
|
|
26
22
|
</ul>
|
27
23
|
<% end %>
|
28
24
|
|
25
|
+
<cite class="thredded--topics--updated-by">
|
26
|
+
<%= time_ago topic.last_post_at %>
|
27
|
+
<%= user_link topic.last_user %>
|
28
|
+
</cite>
|
29
|
+
|
30
|
+
<% if local_assigns[:show_messageboard] %>
|
31
|
+
<span class="thredded--topics--messageboard">
|
32
|
+
<%= t 'thredded.topics.in_messageboard_html',
|
33
|
+
messageboard_link: link_to(topic.messageboard_name, topic.messageboard_path) %>
|
34
|
+
</span>
|
35
|
+
<% end %>
|
29
36
|
|
30
37
|
<% if topic.blocked? && topic.can_moderate? %>
|
31
38
|
<span class="thredded--topics--moderation-state thredded--alert thredded--alert-danger">
|
32
39
|
<%= render 'thredded/shared/content_moderation_blocked_state', moderation_record: topic.last_moderation_record %>
|
33
40
|
</span>
|
34
41
|
<% end %>
|
42
|
+
<%= render 'thredded/workgroup/topics/last_post_with_controls', topic: topic if topic.last_post %>
|
43
|
+
<% end %>
|
35
44
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
<div class="thredded--topic-source">
|
40
|
-
<cite class="thredded--topics--updated-by">
|
41
|
-
<%= topic.last_user.thredded_display_name %>
|
42
|
-
<%= time_ago topic.last_post_at %>
|
43
|
-
</cite>
|
44
|
-
</div>
|
45
|
-
|
46
|
-
<div class="thredded--last-post">
|
47
|
-
<%= render 'thredded/posts_common/content', post: topic.last_post if topic.last_post %>
|
48
|
-
</div>
|
49
|
-
</div>
|
50
|
-
|
45
|
+
<% if local_assigns[:sticky_topics_divider] &&
|
46
|
+
!topic_iteration.last? && topic.sticky? && !topics[topic_counter + 1].sticky? %>
|
47
|
+
<%= render 'thredded/topics/sticky_topics_divider' %>
|
51
48
|
<% end %>
|
@@ -1,6 +1,12 @@
|
|
1
1
|
<ul class="thredded--workgroup">
|
2
2
|
<li class="<%= Thredded::Workgroup.navbar_class(params, :unread) %>">
|
3
|
-
<%= link_to
|
3
|
+
<%= link_to thredded_workgroup.unread_nav_path do%>
|
4
|
+
<%= t('thredded.workgroup.unread.link') %>
|
5
|
+
<% if all_unread_followed_topics_count > 0 -%>
|
6
|
+
<span class="thredded--user-navigation--unread-topics--followed-count"><%=shared_inline_svg "thredded/follow.svg", class: "thredded--unread-topics--followed-icon", role:"img" %>
|
7
|
+
<%= all_unread_followed_topics_count %></span>
|
8
|
+
<% end -%>
|
9
|
+
<% end -%>
|
4
10
|
</li>
|
5
11
|
<li class="<%= Thredded::Workgroup.navbar_class(params, :awaiting) %>">
|
6
12
|
<%= link_to thredded_workgroup.awaiting_nav_path do %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="thredded--topic-controls">
|
2
|
+
<a class="thredded--topic--read-state-toggle thredded--topic--mark-as-read thredded--button" data-post-path="<%= topic.mark_as_read_path %>">
|
3
|
+
<%= shared_inline_svg("thredded/workgroup/envelope-open-o.svg", class: "thredded--topics--read-icon thredded--icon", role: "img", viewBox: "0 0 1792 1792") %>
|
4
|
+
<%= t("thredded.topics.mark_read")%>
|
5
|
+
</a>
|
6
|
+
<a class="thredded--topic--read-state-toggle thredded--topic--mark-as-unread thredded--button" data-post-path="<%= topic.mark_as_unread_path %>">
|
7
|
+
<%= shared_inline_svg("thredded/workgroup/envelope-o.svg", class: "thredded--topics--unread-icon thredded--icon", role: "img", viewBox: "0 0 1792 1792") %>
|
8
|
+
<%= t("thredded.topics.mark_unread")%>
|
9
|
+
</a>
|
10
|
+
<a class="thredded--topic--view-button thredded--button" href="<%= topic.reply_path %>">
|
11
|
+
<%= t("thredded.topics.view_or_reply")%>
|
12
|
+
</a>
|
13
|
+
<a href="#" class="js-thredded-follow-toggle thredded--topic--follow thredded--button">
|
14
|
+
<%= shared_inline_svg "thredded/follow.svg", class: "thredded--icon", role: "img" %>
|
15
|
+
<%= t("thredded.topics.follow")%>
|
16
|
+
</a>
|
17
|
+
<a href="#" class="js-thredded-follow-toggle thredded--topic--unfollow thredded--button">
|
18
|
+
<%= shared_inline_svg "thredded/unfollow.svg", class: "thredded--icon", role: "img" %>
|
19
|
+
<%= t("thredded.topics.unfollow")%>
|
20
|
+
</a>
|
21
|
+
</div>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= view_hooks.topic_with_last_post.last_post.render self, topic: topic do %>
|
2
|
+
<div class="thredded--topic-source">
|
3
|
+
<cite class="thredded--topics--updated-by">
|
4
|
+
<%= topic.last_user.thredded_display_name %>
|
5
|
+
<%= time_ago topic.last_post_at %>
|
6
|
+
</cite>
|
7
|
+
</div>
|
8
|
+
<div class="thredded--last-post">
|
9
|
+
<%= render 'thredded/posts_common/content', post: topic.last_post %>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= view_hooks.topic_with_last_post.last_post_with_controls.render self, topic: topic do %>
|
2
|
+
<div class="thredded--topic-last-post-with-controls">
|
3
|
+
<%= render "thredded/workgroup/topics/controls", topic: topic %>
|
4
|
+
<div class='thredded--topic-post-and-last-user thredded--condensable thredded--condensable--condensed'>
|
5
|
+
<%= render "thredded/workgroup/topics/last_post", topic: topic %>
|
6
|
+
<div class="thredded--condensable--overflow-only">
|
7
|
+
<span class="thredded--condensable--expand"><%= t("thredded.workgroup.condensable.read_all") %></span>
|
8
|
+
<span class="thredded--condensable--condense"><%= t("thredded.workgroup.condensable.read_less") %></span>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<% end %>
|