thredded 0.15.3 → 0.15.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/javascripts/thredded/components/submit_hotkey.es6 +18 -0
- data/app/assets/stylesheets/thredded/components/_pagination.scss +1 -1
- data/app/assets/stylesheets/thredded/components/_post-form.scss +0 -1
- data/app/assets/stylesheets/thredded/components/_topics.scss +2 -28
- data/app/controllers/thredded/application_controller.rb +2 -0
- data/app/controllers/thredded/post_permalinks_controller.rb +1 -1
- data/app/controllers/thredded/post_previews_controller.rb +1 -1
- data/app/controllers/thredded/posts_controller.rb +2 -3
- data/app/controllers/thredded/private_post_permalinks_controller.rb +1 -1
- data/app/controllers/thredded/private_post_previews_controller.rb +1 -1
- data/app/controllers/thredded/private_posts_controller.rb +2 -3
- data/app/helpers/thredded/urls_helper.rb +28 -1
- data/app/models/concerns/thredded/content_moderation_state.rb +2 -2
- data/app/models/concerns/thredded/post_common.rb +1 -1
- data/app/models/concerns/thredded/topic_common.rb +1 -1
- data/app/models/thredded/messageboard.rb +0 -3
- data/app/models/thredded/post.rb +8 -0
- data/app/models/thredded/post_moderation_record.rb +2 -0
- data/app/models/thredded/private_post.rb +8 -0
- data/app/models/thredded/private_topic.rb +14 -0
- data/app/models/thredded/topic.rb +2 -2
- data/app/models/thredded/user_extender.rb +2 -2
- data/app/views/thredded/posts_common/_form.html.erb +1 -0
- data/app/views/thredded/posts_common/form/_content_field.html.erb +1 -1
- data/app/views/thredded/private_topics/_form.html.erb +2 -0
- data/app/views/thredded/private_topics/_private_topic.html.erb +0 -5
- data/app/views/thredded/topics/_form.html.erb +1 -0
- data/app/views/thredded/topics/_topic.html.erb +6 -4
- data/app/views/thredded/topics/unread.html.erb +4 -1
- data/config/i18n-tasks.yml +1 -0
- data/config/locales/de.yml +5 -0
- data/config/locales/en.yml +5 -0
- data/config/locales/es.yml +5 -0
- data/config/locales/fr.yml +5 -0
- data/config/locales/it.yml +5 -0
- data/config/locales/pl.yml +5 -0
- data/config/locales/pt-BR.yml +5 -0
- data/config/locales/ru.yml +6 -1
- data/config/locales/zh-CN.yml +5 -0
- data/lib/generators/thredded/install/templates/initializer.rb +17 -11
- data/lib/thredded.rb +111 -48
- data/lib/thredded/content_formatter.rb +2 -2
- data/lib/thredded/database_seeder.rb +6 -6
- data/lib/thredded/db_tools.rb +2 -2
- data/lib/thredded/errors.rb +13 -1
- data/lib/thredded/html_pipeline/onebox_filter.rb +2 -2
- data/lib/thredded/version.rb +1 -1
- data/vendor/assets/javascripts/autosize.min.js +2 -6
- data/vendor/assets/javascripts/textcomplete.min.js +2 -2
- metadata +4 -3
@@ -29,10 +29,12 @@
|
|
29
29
|
<%= user_link topic.last_user %>
|
30
30
|
</cite>
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
<% if local_assigns[:show_messageboard] %>
|
33
|
+
<span class="thredded--topics--messageboard">
|
34
|
+
<%= t 'thredded.topics.in_messageboard_html',
|
35
|
+
messageboard_link: link_to(topic.messageboard_name, topic.messageboard_path) %>
|
36
|
+
</span>
|
37
|
+
<% end %>
|
36
38
|
|
37
39
|
<% if topic.blocked? && topic.can_moderate? %>
|
38
40
|
<span class="thredded--topics--moderation-state thredded--alert thredded--alert-danger">
|
@@ -18,7 +18,10 @@
|
|
18
18
|
placeholder: t('thredded.topics.form.title_placeholder_start') if @new_topic %>
|
19
19
|
<%= render partial: 'thredded/topics/topic',
|
20
20
|
collection: @topics,
|
21
|
-
locals: {
|
21
|
+
locals: {
|
22
|
+
topics: @topics,
|
23
|
+
show_messageboard: !messageboard_or_nil
|
24
|
+
} %>
|
22
25
|
<% end %>
|
23
26
|
<footer class="thredded--pagination-bottom">
|
24
27
|
<%= paginate @topics %>
|
data/config/i18n-tasks.yml
CHANGED
data/config/locales/de.yml
CHANGED
@@ -44,8 +44,11 @@ de:
|
|
44
44
|
errors:
|
45
45
|
login_required: Bitte zuerst anmelden
|
46
46
|
not_authorized: Du hast keinen Zugriff auf diese Seite
|
47
|
+
post_not_found: Dieser Beitrag existiert nicht.
|
48
|
+
private_post_not_found: Diese private Nachricht existiert nicht.
|
47
49
|
private_topic_create_denied: Du bist nicht autorisiert, private Unterhaltungen zu erstellen
|
48
50
|
private_topic_not_found: Diese private Unterhaltung existiert nicht
|
51
|
+
topic_not_found: Dieses Thema existiert nicht.
|
49
52
|
form:
|
50
53
|
create_btn_submitting: Erstellen...
|
51
54
|
preview: Vorschau
|
@@ -224,6 +227,7 @@ de:
|
|
224
227
|
title_placeholder: :thredded.topics.form.title_label
|
225
228
|
title_placeholder_start: Starte eine neue Diskussion
|
226
229
|
update_btn: Beitrag bearbeiten
|
230
|
+
in_messageboard_html: in %{messageboard_link}
|
227
231
|
locked:
|
228
232
|
label: Gesperrt
|
229
233
|
message: Der Beitrag wurde von einem Moderator gesperrt
|
@@ -257,6 +261,7 @@ de:
|
|
257
261
|
one: Einmalig hochgeladen
|
258
262
|
other: "%{count} -mal hochgeladen"
|
259
263
|
recent_activity: :thredded.recent_activity
|
264
|
+
send_private_message: Private Nachricht senden
|
260
265
|
started_topic_html: "%{topic_link} gestartet"
|
261
266
|
started_topics_count:
|
262
267
|
one: Eine Diskussion gestartet
|
data/config/locales/en.yml
CHANGED
@@ -43,8 +43,11 @@ en:
|
|
43
43
|
errors:
|
44
44
|
login_required: Please sign in first.
|
45
45
|
not_authorized: You are not authorized to access this page.
|
46
|
+
post_not_found: This post does not exist.
|
47
|
+
private_post_not_found: This private message does not exist.
|
46
48
|
private_topic_create_denied: You are not authorized to create private topics.
|
47
49
|
private_topic_not_found: This private topic does not exist.
|
50
|
+
topic_not_found: This topic does not exist.
|
48
51
|
form:
|
49
52
|
create_btn_submitting: Creating...
|
50
53
|
preview: Preview
|
@@ -221,6 +224,7 @@ en:
|
|
221
224
|
title_placeholder: :thredded.topics.form.title_label
|
222
225
|
title_placeholder_start: Start a New Topic
|
223
226
|
update_btn: Update Topic
|
227
|
+
in_messageboard_html: in %{messageboard_link}
|
224
228
|
locked:
|
225
229
|
label: Locked
|
226
230
|
message: This topic has been locked by a moderator.
|
@@ -253,6 +257,7 @@ en:
|
|
253
257
|
one: Posted once
|
254
258
|
other: Posted %{count} times
|
255
259
|
recent_activity: :thredded.recent_activity
|
260
|
+
send_private_message: Send private message
|
256
261
|
started_topic_html: Started %{topic_link}
|
257
262
|
started_topics_count:
|
258
263
|
one: Started one topic
|
data/config/locales/es.yml
CHANGED
@@ -45,8 +45,11 @@ es:
|
|
45
45
|
errors:
|
46
46
|
login_required: Por favor, inicia sesión.
|
47
47
|
not_authorized: No estás autorizado para ver esta página.
|
48
|
+
post_not_found: Esta publicación no existe.
|
49
|
+
private_post_not_found: Este mensaje privado no existe.
|
48
50
|
private_topic_create_denied: No estás autorizado para crear temas privados.
|
49
51
|
private_topic_not_found: Este tema privado no existe.
|
52
|
+
topic_not_found: Este tema no existe.
|
50
53
|
form:
|
51
54
|
create_btn_submitting: Creando...
|
52
55
|
preview: Vista previa
|
@@ -225,6 +228,7 @@ es:
|
|
225
228
|
title_placeholder: :thredded.topics.form.title_label
|
226
229
|
title_placeholder_start: Crear un Nuevo Tema
|
227
230
|
update_btn: Actualizar Tema
|
231
|
+
in_messageboard_html: en %{messageboard_link}
|
228
232
|
locked:
|
229
233
|
label: Bloqueado
|
230
234
|
message: Este tema ha sido bloqueado por un moderador.
|
@@ -257,6 +261,7 @@ es:
|
|
257
261
|
one: Ha escrito una vez
|
258
262
|
other: Ha escrito %{count} veces
|
259
263
|
recent_activity: :thredded.recent_activity
|
264
|
+
send_private_message: Enviar mensaje privado
|
260
265
|
started_topic_html: Empezó %{topic_link}
|
261
266
|
started_topics_count:
|
262
267
|
one: Ha empezado un tema
|
data/config/locales/fr.yml
CHANGED
@@ -43,8 +43,11 @@ fr:
|
|
43
43
|
errors:
|
44
44
|
login_required: Veuillez vous connecter
|
45
45
|
not_authorized: Vous n'êtes pas autorisé à accéder à cette page.
|
46
|
+
post_not_found: Ce post n'existe pas.
|
47
|
+
private_post_not_found: Ce message privé n'existe pas.
|
46
48
|
private_topic_create_denied: Vous n'êtes pas autorisé à créer des sujets.
|
47
49
|
private_topic_not_found: Ce sujet privé n'existe pas.
|
50
|
+
topic_not_found: Ce sujet n'existe pas.
|
48
51
|
form:
|
49
52
|
create_btn_submitting: Création en cours...
|
50
53
|
preview: Aperçu
|
@@ -222,6 +225,7 @@ fr:
|
|
222
225
|
title_placeholder: :thredded.topics.form.title_label
|
223
226
|
title_placeholder_start: Commencer un nouveau sujet
|
224
227
|
update_btn: Mettre à jour le sujet
|
228
|
+
in_messageboard_html: dans %{messageboard_link}
|
225
229
|
locked:
|
226
230
|
label: Verrouillé
|
227
231
|
message: Ce sujet a été verrouillé par un modérateur.
|
@@ -255,6 +259,7 @@ fr:
|
|
255
259
|
one: Commenté une seule fois
|
256
260
|
other: Commenté %{count} fois
|
257
261
|
recent_activity: :thredded.recent_activity
|
262
|
+
send_private_message: Envoyer un message privé
|
258
263
|
started_topic_html: Démarré %{topic_link}
|
259
264
|
started_topics_count:
|
260
265
|
one: Démarré un sujet
|
data/config/locales/it.yml
CHANGED
@@ -43,8 +43,11 @@ it:
|
|
43
43
|
errors:
|
44
44
|
login_required: Per visualizzare questa pagina bisogna accedere tramite login.
|
45
45
|
not_authorized: Non sei autorizzato a vedere questa pagina.
|
46
|
+
post_not_found: Questo post non esiste.
|
47
|
+
private_post_not_found: Questo messaggio privato non esiste.
|
46
48
|
private_topic_create_denied: Non sei autorizzato a creare discussioni private.
|
47
49
|
private_topic_not_found: Questa discussione privata non esiste.
|
50
|
+
topic_not_found: Questo argomento non esiste.
|
48
51
|
form:
|
49
52
|
create_btn_submitting: Creazione in corso...
|
50
53
|
preview: Anteprima
|
@@ -225,6 +228,7 @@ it:
|
|
225
228
|
title_placeholder: :thredded.topics.form.title_label
|
226
229
|
title_placeholder_start: Inizia una Nuova Discussione
|
227
230
|
update_btn: Aggiorna Discussione
|
231
|
+
in_messageboard_html: in %{messageboard_link}
|
228
232
|
locked:
|
229
233
|
label: Bloccata
|
230
234
|
message: Questa discussione è stata bloccata da un moderatore.
|
@@ -257,6 +261,7 @@ it:
|
|
257
261
|
one: Ha commentato una volta
|
258
262
|
other: Ha commentato %{count} volte
|
259
263
|
recent_activity: :thredded.recent_activity
|
264
|
+
send_private_message: Invia un messaggio privato
|
260
265
|
started_topic_html: Ha iniziato %{topic_link}
|
261
266
|
started_topics_count:
|
262
267
|
one: Ha iniziato una discussione
|
data/config/locales/pl.yml
CHANGED
@@ -43,8 +43,11 @@ pl:
|
|
43
43
|
errors:
|
44
44
|
login_required: Proszę się najpierw zalogować.
|
45
45
|
not_authorized: Nie masz uprawnień aby zobaczyć tę stronę.
|
46
|
+
post_not_found: Ten wpis nie istnieje.
|
47
|
+
private_post_not_found: Ta prywatna wiadomość nie istnieje.
|
46
48
|
private_topic_create_denied: Nie masz uprawnień do tworzenia prywatnych tematów.
|
47
49
|
private_topic_not_found: Ten prywatny temat nie istnieje.
|
50
|
+
topic_not_found: Ten temat nie istnieje.
|
48
51
|
form:
|
49
52
|
create_btn_submitting: Tworzenie...
|
50
53
|
preview: Zapowiedź
|
@@ -221,6 +224,7 @@ pl:
|
|
221
224
|
title_placeholder: :thredded.topics.form.title_label
|
222
225
|
title_placeholder_start: Rozpocznij nowy temat
|
223
226
|
update_btn: Zaktualizuj temat
|
227
|
+
in_messageboard_html: w %{messageboard_link}
|
224
228
|
locked:
|
225
229
|
label: Zablokowany
|
226
230
|
message: Ten temat został zablokowany przez moderatora.
|
@@ -255,6 +259,7 @@ pl:
|
|
255
259
|
one: Napisał 1 post
|
256
260
|
other: Napisał %{count} postów
|
257
261
|
recent_activity: :thredded.recent_activity
|
262
|
+
send_private_message: Wyślij Wiadomość Prywatną
|
258
263
|
started_topic_html: Rozpoczął %{topic_link}
|
259
264
|
started_topics_count:
|
260
265
|
few: Rozpoczął %{count} tematy
|
data/config/locales/pt-BR.yml
CHANGED
@@ -44,8 +44,11 @@ pt-BR:
|
|
44
44
|
errors:
|
45
45
|
login_required: Por favor, autentique-se primeiro.
|
46
46
|
not_authorized: Você não está autorizado a acessar esta página.
|
47
|
+
post_not_found: Este post não existe.
|
48
|
+
private_post_not_found: Esta mensagem privada não existe.
|
47
49
|
private_topic_create_denied: Você não está autorizado a criar tópicos privados.
|
48
50
|
private_topic_not_found: Este tópico privado não existe.
|
51
|
+
topic_not_found: Este tópico não existe.
|
49
52
|
form:
|
50
53
|
create_btn_submitting: Criando...
|
51
54
|
preview: Pré-visualização
|
@@ -226,6 +229,7 @@ pt-BR:
|
|
226
229
|
title_placeholder: :thredded.topics.form.title_label
|
227
230
|
title_placeholder_start: Iniciar um novo tópico
|
228
231
|
update_btn: Atualizar Tópico
|
232
|
+
in_messageboard_html: em %{messageboard_link}
|
229
233
|
locked:
|
230
234
|
label: Trancado
|
231
235
|
message: Este tópico foi bloqueado por um moderador.
|
@@ -258,6 +262,7 @@ pt-BR:
|
|
258
262
|
one: Postado uma vez
|
259
263
|
other: vezes %{count} Publicado
|
260
264
|
recent_activity: :thredded.recent_activity
|
265
|
+
send_private_message: Enviar mensagem privada
|
261
266
|
started_topic_html: Começou %{topic_link}
|
262
267
|
started_topics_count:
|
263
268
|
one: Começou um tópico
|
data/config/locales/ru.yml
CHANGED
@@ -42,8 +42,11 @@ ru:
|
|
42
42
|
errors:
|
43
43
|
login_required: Необходимо зайти на форум.
|
44
44
|
not_authorized: Вы не авторизованы.
|
45
|
+
post_not_found: Это сообщение не существует.
|
46
|
+
private_post_not_found: Это личное сообщение не существует.
|
45
47
|
private_topic_create_denied: Вы не авторизованы для создания личных сообщений.
|
46
48
|
private_topic_not_found: Личное сообщение не найдено.
|
49
|
+
topic_not_found: Эта тема не существует.
|
47
50
|
form:
|
48
51
|
create_btn_submitting: Создаю...
|
49
52
|
preview: Обзор
|
@@ -219,6 +222,7 @@ ru:
|
|
219
222
|
title_placeholder: :thredded.topics.form.title_label
|
220
223
|
title_placeholder_start: Начать новую тему
|
221
224
|
update_btn: Обновление темы
|
225
|
+
in_messageboard_html: в %{messageboard_link}
|
222
226
|
locked:
|
223
227
|
label: Заблокировать тему
|
224
228
|
message: Эта тема закрыта модератором.
|
@@ -253,12 +257,13 @@ ru:
|
|
253
257
|
one: Сделан %{count} пост
|
254
258
|
other: Сделано %{count} постов
|
255
259
|
recent_activity: :thredded.recent_activity
|
260
|
+
send_private_message: Отправить личное сообщение
|
256
261
|
started_topic_html: Начато %{topic_link}
|
257
262
|
started_topics_count:
|
258
263
|
few: Начато %{count} темы
|
259
264
|
many: Начато %{count} тем
|
260
265
|
one: Начата %{count} тема
|
261
266
|
other: Начато %{count} тем
|
262
|
-
user_posted_in_topic_html: "%{user_link}
|
267
|
+
user_posted_in_topic_html: "%{user_link} написал в %{topic_link}"
|
263
268
|
user_since_html: Пользователь был %{time_ago}
|
264
269
|
user_started_topic_html: "%{user_link} начал %{topic_link}"
|
data/config/locales/zh-CN.yml
CHANGED
@@ -40,8 +40,11 @@ zh-CN:
|
|
40
40
|
errors:
|
41
41
|
login_required: 请先登录
|
42
42
|
not_authorized: 你没有权限访问该页面
|
43
|
+
post_not_found: 这篇文章不存在。
|
44
|
+
private_post_not_found: 此私人消息不存在。
|
43
45
|
private_topic_create_denied: 你没有权限创建私人对话
|
44
46
|
private_topic_not_found: 该私人对话不存在
|
47
|
+
topic_not_found: 此主题不存在。
|
45
48
|
form:
|
46
49
|
create_btn_submitting: 创建中...
|
47
50
|
preview: 预览
|
@@ -214,6 +217,7 @@ zh-CN:
|
|
214
217
|
title_placeholder: :thredded.topics.form.title_label
|
215
218
|
title_placeholder_start: 发布新帖子
|
216
219
|
update_btn: 更新帖子
|
220
|
+
in_messageboard_html: 在%{messageboard_link}
|
217
221
|
locked:
|
218
222
|
label: 锁定
|
219
223
|
message: 该帖子被某个审核者锁定
|
@@ -246,6 +250,7 @@ zh-CN:
|
|
246
250
|
one: 一个回复
|
247
251
|
other: "%{count} 个回复"
|
248
252
|
recent_activity: :thredded.recent_activity
|
253
|
+
send_private_message: 发送私人讯息
|
249
254
|
started_topic_html: 发布帖子 %{topic_link}
|
250
255
|
started_topics_count:
|
251
256
|
one: 发布一个帖子
|
@@ -21,10 +21,10 @@ Thredded.user_name_column = :name
|
|
21
21
|
# the path or url to your user. This lambda is evaluated in the view context.
|
22
22
|
# If the lambda returns nil, a span element is returned instead of a link; so
|
23
23
|
# setting this to always return nil effectively disables all user links.
|
24
|
-
Thredded.user_path =
|
24
|
+
Thredded.user_path = ->(user) {
|
25
25
|
user_path = :"#{Thredded.user_class_name.demodulize.underscore}_path"
|
26
26
|
main_app.respond_to?(user_path) ? main_app.send(user_path, user) : "/users/#{user.to_param}"
|
27
|
-
|
27
|
+
}
|
28
28
|
|
29
29
|
# This method is used by Thredded controllers and views to fetch the currently signed-in user
|
30
30
|
Thredded.current_user_method = :"current_#{Thredded.user_class_name.demodulize.underscore}"
|
@@ -32,13 +32,6 @@ Thredded.current_user_method = :"current_#{Thredded.user_class_name.demodulize.u
|
|
32
32
|
# User avatar URL. rb-gravatar gem is used by default:
|
33
33
|
Thredded.avatar_url = ->(user) { Gravatar.src(user.email, 156, 'mm') }
|
34
34
|
|
35
|
-
# ==> Database Configuration
|
36
|
-
# By default, thredded uses integers for record ID route constraints.
|
37
|
-
# For integer based IDs (default):
|
38
|
-
# Thredded.routes_id_constraint = /[1-9]\d*/
|
39
|
-
# For UUID based IDs (example):
|
40
|
-
# Thredded.routes_id_constraint = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
|
41
|
-
|
42
35
|
# ==> Permissions Configuration
|
43
36
|
# By default, thredded uses a simple permission model, where all the users can post to all message boards,
|
44
37
|
# and admins and moderators are determined by a flag on the users table.
|
@@ -71,6 +64,12 @@ Thredded.currently_online_enabled = true
|
|
71
64
|
# Whether private messaging functionality is enabled.
|
72
65
|
Thredded.private_messaging_enabled = true
|
73
66
|
|
67
|
+
# The number of topics to display per page.
|
68
|
+
# Thredded.topics_per_page = 50
|
69
|
+
|
70
|
+
# The number of posts to display per page in a topic.
|
71
|
+
# Thredded.posts_per_page = 25
|
72
|
+
|
74
73
|
# The layout for rendering Thredded views.
|
75
74
|
Thredded.layout = 'thredded/application'
|
76
75
|
|
@@ -88,8 +87,8 @@ Thredded.layout = 'thredded/application'
|
|
88
87
|
# The range of valid topic title lengths. Default:
|
89
88
|
# Thredded.topic_title_length_range = (1..200)
|
90
89
|
|
91
|
-
# ==> URLs
|
92
|
-
# How Thredded generates URL slugs from text
|
90
|
+
# ==> Routes and URLs
|
91
|
+
# How Thredded generates URL slugs from text:
|
93
92
|
|
94
93
|
# Default:
|
95
94
|
# Thredded.slugifier = ->(input) { input.parameterize }
|
@@ -97,6 +96,13 @@ Thredded.layout = 'thredded/application'
|
|
97
96
|
# If your forum is in a language other than English, you might want to use the babosa gem instead
|
98
97
|
# Thredded.slugifier = ->(input) { Babosa::Identifier.new(input).normalize.transliterate(:russian).to_s }
|
99
98
|
|
99
|
+
# By default, thredded uses integers for record ID route constraints.
|
100
|
+
# For integer based IDs (default):
|
101
|
+
# Thredded.routes_id_constraint = /[1-9]\d*/
|
102
|
+
#
|
103
|
+
# For UUID based IDs (example):
|
104
|
+
# Thredded.routes_id_constraint = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
|
105
|
+
|
100
106
|
# ==> Post Content Formatting
|
101
107
|
# Customize the way Thredded handles post formatting.
|
102
108
|
|
data/lib/thredded.rb
CHANGED
@@ -46,43 +46,85 @@ require 'thredded/collection_to_strings_with_cache_renderer'
|
|
46
46
|
|
47
47
|
module Thredded
|
48
48
|
class << self
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
:email_from,
|
54
|
-
:email_outgoing_prefix,
|
55
|
-
:layout,
|
56
|
-
:messageboards_order,
|
57
|
-
:routes_id_constraint,
|
58
|
-
:user_name_column
|
59
|
-
|
60
|
-
# A lambda that generates a URL path to the user page for the given user.
|
61
|
-
attr_writer :user_path
|
49
|
+
#== User
|
50
|
+
|
51
|
+
# @return [String] The name of the user class
|
52
|
+
attr_reader :user_class_name
|
62
53
|
|
63
54
|
# @return [Symbol] The name of the method used by Thredded controllers and views to get the currently signed-in user
|
64
55
|
attr_accessor :current_user_method
|
65
56
|
|
66
|
-
# @return [Symbol] The
|
67
|
-
attr_accessor :
|
57
|
+
# @return [Symbol] The user table column that contains the username. Must be unique.
|
58
|
+
attr_accessor :user_name_column
|
59
|
+
|
60
|
+
# @return [Symbol] The name of the method used by Thredded to display users
|
61
|
+
attr_writer :user_display_name_method
|
62
|
+
|
63
|
+
# @return [Proc] A lambda that returns the avatar URL for the given user.
|
64
|
+
attr_accessor :avatar_url
|
65
|
+
|
66
|
+
# @return [Proc] A lambda that generates a URL path to the user page for the given user.
|
67
|
+
attr_writer :user_path
|
68
68
|
|
69
69
|
# @return [Symbol] The name of the admin flag column on the users table for the default permissions model
|
70
70
|
attr_accessor :admin_column
|
71
71
|
|
72
|
+
#== Moderation
|
73
|
+
|
72
74
|
# @return [Boolean] Whether posts that are pending moderation are visible to regular users.
|
73
75
|
attr_accessor :content_visible_while_pending_moderation
|
74
76
|
|
77
|
+
# @return [Symbol] The name of the moderator flag column on the users table for the default permissions model
|
78
|
+
attr_accessor :moderator_column
|
79
|
+
|
80
|
+
#== UI
|
81
|
+
|
82
|
+
# @return [String] The layout to use for rendering Thredded views.
|
83
|
+
attr_accessor :layout
|
84
|
+
|
85
|
+
#=== Topic page
|
86
|
+
|
87
|
+
# @return [Number] The number of posts to display per page in a topic.
|
88
|
+
attr_accessor :posts_per_page
|
89
|
+
|
75
90
|
# @return [Boolean] Whether users that are following a topic are listed on the topic page.
|
76
91
|
attr_accessor :show_topic_followers
|
77
92
|
|
78
|
-
|
79
|
-
attr_writer :user_display_name_method
|
93
|
+
#=== Private messages
|
80
94
|
|
81
|
-
# @return [
|
82
|
-
attr_accessor :
|
95
|
+
# @return [Boolean] Whether the private messaging functionality is enabled.
|
96
|
+
attr_accessor :private_messaging_enabled
|
83
97
|
|
84
|
-
|
85
|
-
|
98
|
+
#=== Currently online
|
99
|
+
|
100
|
+
# @return [Boolean] Whether the list of users who are currently online is displayed.
|
101
|
+
attr_accessor :currently_online_enabled
|
102
|
+
|
103
|
+
# @return [ActiveSupport::Duration] How long the users are considered online after their last action.
|
104
|
+
attr_accessor :active_user_threshold
|
105
|
+
|
106
|
+
#=== Other
|
107
|
+
|
108
|
+
# How to calculate the position of messageboards in a list:
|
109
|
+
# :position set the position manually (new messageboards go to the bottom, by creation timestamp)
|
110
|
+
# :last_post_at_desc most recent post first
|
111
|
+
# :topics_count_desc most topics first
|
112
|
+
# @return [:position, :last_post_at_desc, :topics_count_desc]
|
113
|
+
attr_accessor :messageboards_order
|
114
|
+
|
115
|
+
# @return [Number] The number of topics to display per page.
|
116
|
+
attr_accessor :topics_per_page
|
117
|
+
|
118
|
+
# @return [Number] Minimum length to trigger username auto-completion for @-mentions and private message recipients.
|
119
|
+
attr_accessor :autocomplete_min_length
|
120
|
+
|
121
|
+
# @return [Thredded::AllViewHooks] View hooks configuration.
|
122
|
+
def view_hooks
|
123
|
+
Thredded::AllViewHooks.instance ||
|
124
|
+
fail('`Thredded.view_hooks` must be configured in a `Rails.application.config.to_prepare` block!')
|
125
|
+
end
|
126
|
+
|
127
|
+
#== Topic following and notifications
|
86
128
|
|
87
129
|
# @return [Boolean] Whether the user should get subscribed to a new topic they've created.
|
88
130
|
attr_accessor :auto_follow_when_creating_topic
|
@@ -90,26 +132,33 @@ module Thredded
|
|
90
132
|
# @return [Boolean] Whether the user should get subscribed to a topic after posting in it.
|
91
133
|
attr_accessor :auto_follow_when_posting_in_topic
|
92
134
|
|
93
|
-
|
94
|
-
attr_reader :user_class_name
|
135
|
+
#== Emails
|
95
136
|
|
96
|
-
# @return [
|
97
|
-
attr_accessor :
|
137
|
+
# @return [String] The name of the parent mailer class for Thredded mailers.
|
138
|
+
attr_accessor :parent_mailer
|
98
139
|
|
99
|
-
# @return [
|
100
|
-
attr_accessor :
|
140
|
+
# @return [String] Sender email for Thredded notification emails.
|
141
|
+
attr_accessor :email_from
|
101
142
|
|
102
|
-
# @return [
|
103
|
-
attr_accessor :
|
143
|
+
# @return [String] Email subject prefix.
|
144
|
+
attr_accessor :email_outgoing_prefix
|
104
145
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
146
|
+
#== Routes
|
147
|
+
|
148
|
+
# @return [Proc] The proc that Thredded uses to generate URL slugs from text.
|
149
|
+
attr_accessor :slugifier
|
150
|
+
|
151
|
+
# By default, thredded uses integers for record ID route constraints.
|
152
|
+
# For integer based IDs (default):
|
153
|
+
# Thredded.routes_id_constraint = /[1-9]\d*/
|
154
|
+
# For UUID based IDs (example):
|
155
|
+
# Thredded.routes_id_constraint = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
|
156
|
+
attr_accessor :routes_id_constraint
|
157
|
+
|
158
|
+
#== Misc
|
159
|
+
|
160
|
+
# @return [Range<Integer>] The range of valid topic title lengths.
|
161
|
+
attr_accessor :topic_title_length_range
|
113
162
|
|
114
163
|
# @return [Array] The notifiers, by default just the EmailNotifier
|
115
164
|
def notifiers
|
@@ -164,6 +213,8 @@ module Thredded
|
|
164
213
|
layout.is_a?(String) && layout.start_with?('thredded/')
|
165
214
|
end
|
166
215
|
|
216
|
+
#== Helper methods for use by main app.
|
217
|
+
|
167
218
|
# Returns a view for the given posts' scope, applying read permission filters to the scope.
|
168
219
|
# Can be used in main_app, e.g. for showing the recent user posts on the profile page.
|
169
220
|
#
|
@@ -187,22 +238,34 @@ module Thredded
|
|
187
238
|
end
|
188
239
|
end
|
189
240
|
|
190
|
-
self.
|
191
|
-
self.admin_column = :admin
|
192
|
-
self.auto_follow_when_creating_topic = true
|
193
|
-
self.auto_follow_when_posting_in_topic = true
|
194
|
-
self.autocomplete_min_length = 2
|
241
|
+
self.user_name_column = :name
|
195
242
|
self.avatar_url = ->(user) { Gravatar.src(user.email, 156, 'mm') }
|
243
|
+
self.admin_column = :admin
|
244
|
+
|
196
245
|
self.content_visible_while_pending_moderation = true
|
246
|
+
self.moderator_column = :admin
|
247
|
+
|
197
248
|
self.layout = 'thredded/application'
|
249
|
+
|
250
|
+
self.posts_per_page = 25
|
251
|
+
self.show_topic_followers = false
|
252
|
+
|
253
|
+
self.private_messaging_enabled = true
|
254
|
+
|
255
|
+
self.currently_online_enabled = true
|
256
|
+
self.active_user_threshold = 5.minutes
|
257
|
+
|
198
258
|
self.messageboards_order = :position
|
199
|
-
self.
|
259
|
+
self.topics_per_page = 50
|
260
|
+
self.autocomplete_min_length = 2
|
261
|
+
|
262
|
+
self.auto_follow_when_creating_topic = true
|
263
|
+
self.auto_follow_when_posting_in_topic = true
|
264
|
+
|
200
265
|
self.parent_mailer = 'ActionMailer::Base'
|
201
|
-
|
202
|
-
self.show_topic_followers = false
|
266
|
+
|
203
267
|
self.slugifier = ->(input) { input.parameterize }
|
268
|
+
self.routes_id_constraint = /[1-9]\d*/
|
269
|
+
|
204
270
|
self.topic_title_length_range = (1..200)
|
205
|
-
self.user_name_column = :name
|
206
|
-
self.private_messaging_enabled = true
|
207
|
-
self.currently_online_enabled = true
|
208
271
|
end
|