thredded 0.2.2 → 0.3.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/CHANGELOG.mkdn +63 -0
- data/Procfile +1 -0
- data/README.mkdn +42 -20
- data/app/assets/images/thredded/private-messages.svg +4 -0
- data/app/assets/images/thredded/settings.svg +4 -0
- data/app/assets/javascripts/thredded.es6 +2 -10
- data/app/assets/javascripts/thredded/{currently_online.es6 → components/currently_online.es6} +0 -0
- data/app/assets/javascripts/thredded/{post_form.es6 → components/post_form.es6} +0 -0
- data/app/assets/javascripts/thredded/{time_stamps.es6 → components/time_stamps.es6} +0 -0
- data/app/assets/javascripts/thredded/{topic_form.es6 → components/topic_form.es6} +1 -1
- data/app/assets/javascripts/thredded/components/topics.es6 +37 -0
- data/app/assets/javascripts/thredded/components/user_preferences_form.es6 +45 -0
- data/app/assets/javascripts/thredded/components/users_select.es6 +56 -0
- data/app/assets/javascripts/thredded/dependencies.js +9 -0
- data/app/assets/javascripts/thredded/thredded.es6 +1 -0
- data/app/assets/stylesheets/thredded/_base.scss +3 -2
- data/app/assets/stylesheets/thredded/_thredded.scss +4 -1
- data/app/assets/stylesheets/thredded/base/_buttons.scss +2 -1
- data/app/assets/stylesheets/thredded/base/_forms.scss +23 -18
- data/app/assets/stylesheets/thredded/base/_grid.scss +1 -1
- data/app/assets/stylesheets/thredded/base/_nav.scss +21 -0
- data/app/assets/stylesheets/thredded/base/_tables.scss +5 -14
- data/app/assets/stylesheets/thredded/base/_typography.scss +9 -4
- data/app/assets/stylesheets/thredded/base/_variables.scss +28 -9
- data/app/assets/stylesheets/thredded/components/_alerts.scss +19 -0
- data/app/assets/stylesheets/thredded/components/_currently-online.scss +1 -1
- data/app/assets/stylesheets/thredded/components/_form-list.scss +2 -4
- data/app/assets/stylesheets/thredded/components/_icons.scss +3 -0
- data/app/assets/stylesheets/thredded/components/_messageboard.scss +4 -4
- data/app/assets/stylesheets/thredded/components/_pagination.scss +2 -2
- data/app/assets/stylesheets/thredded/components/_post-form.scss +3 -0
- data/app/assets/stylesheets/thredded/components/_post.scss +14 -4
- data/app/assets/stylesheets/thredded/components/_select2.scss +79 -9
- data/app/assets/stylesheets/thredded/components/_topic-header.scss +11 -1
- data/app/assets/stylesheets/thredded/components/_topics.scss +13 -11
- data/app/assets/stylesheets/thredded/layout/_main-container.scss +3 -3
- data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +11 -17
- data/app/assets/stylesheets/thredded/layout/_navigation.scss +72 -0
- data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +66 -0
- data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +35 -61
- data/app/commands/thredded/at_notification_extractor.rb +1 -0
- data/app/commands/thredded/members_marked_notified.rb +1 -0
- data/app/commands/thredded/messageboard_destroyer.rb +7 -2
- data/app/commands/thredded/notify_mentioned_users.rb +8 -21
- data/app/commands/thredded/notify_private_topic_users.rb +3 -5
- data/app/controllers/thredded/application_controller.rb +76 -41
- data/app/controllers/thredded/autocomplete_users_controller.rb +46 -0
- data/app/controllers/thredded/messageboards_controller.rb +8 -5
- data/app/controllers/thredded/posts_controller.rb +20 -22
- data/app/controllers/thredded/preferences_controller.rb +19 -14
- data/app/controllers/thredded/private_topics_controller.rb +58 -23
- data/app/controllers/thredded/setups_controller.rb +1 -0
- data/app/controllers/thredded/theme_previews_controller.rb +24 -53
- data/app/controllers/thredded/topics_controller.rb +48 -77
- data/app/forms/thredded/private_topic_form.rb +1 -21
- data/app/forms/thredded/topic_form.rb +3 -7
- data/app/forms/thredded/user_preferences_form.rb +62 -0
- data/app/helpers/thredded/application_helper.rb +11 -12
- data/app/helpers/thredded/urls_helper.rb +103 -0
- data/app/jobs/thredded/activity_updater_job.rb +4 -3
- data/app/jobs/thredded/at_notifier_job.rb +1 -0
- data/app/jobs/thredded/notify_private_topic_users_job.rb +1 -0
- data/app/mailer_previews/thredded/base_mailer_preview.rb +101 -0
- data/app/mailer_previews/thredded/post_mailer_preview.rb +11 -0
- data/app/mailer_previews/thredded/private_post_mailer_preview.rb +11 -0
- data/app/mailer_previews/thredded/private_topic_mailer_preview.rb +15 -0
- data/app/mailers/thredded/base_mailer.rb +13 -0
- data/app/mailers/thredded/post_mailer.rb +4 -2
- data/app/mailers/thredded/private_post_mailer.rb +4 -2
- data/app/mailers/thredded/private_topic_mailer.rb +4 -2
- data/app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb +16 -0
- data/app/models/concerns/thredded/post_common.rb +68 -63
- data/app/models/concerns/thredded/topic_common.rb +31 -8
- data/app/models/concerns/thredded/user_topic_read_state_common.rb +31 -0
- data/app/models/thredded/category.rb +1 -0
- data/app/models/thredded/messageboard.rb +24 -25
- data/app/models/thredded/messageboard_user.rb +1 -0
- data/app/models/thredded/null_preference.rb +1 -0
- data/app/models/thredded/null_user.rb +1 -6
- data/app/models/thredded/null_user_topic_read_state.rb +12 -0
- data/app/models/thredded/post.rb +6 -9
- data/app/models/thredded/post_notification.rb +1 -0
- data/app/models/thredded/private_post.rb +6 -2
- data/app/models/thredded/private_topic.rb +46 -32
- data/app/models/thredded/private_user.rb +3 -2
- data/app/models/thredded/stats.rb +1 -0
- data/app/models/thredded/topic.rb +40 -64
- data/app/models/thredded/topic_category.rb +1 -0
- data/app/models/thredded/user_detail.rb +2 -15
- data/app/models/thredded/user_extender.rb +29 -14
- data/app/models/thredded/user_messageboard_preference.rb +20 -0
- data/app/models/thredded/user_permissions/admin/if_admin_column_true.rb +1 -0
- data/app/models/thredded/user_permissions/admin/none.rb +1 -0
- data/app/models/thredded/user_permissions/message/readers_of_writeable_boards.rb +1 -0
- data/app/models/thredded/user_permissions/moderate/if_moderator_column_true.rb +1 -0
- data/app/models/thredded/user_permissions/moderate/none.rb +1 -0
- data/app/models/thredded/user_permissions/read/all.rb +1 -0
- data/app/models/thredded/user_permissions/write/all.rb +1 -0
- data/app/models/thredded/user_permissions/write/none.rb +1 -0
- data/app/models/thredded/user_preference.rb +7 -1
- data/app/models/thredded/user_private_topic_read_state.rb +12 -0
- data/app/models/thredded/user_topic_read_state.rb +12 -0
- data/app/policies/thredded/messageboard_policy.rb +27 -0
- data/app/policies/thredded/post_policy.rb +33 -0
- data/app/policies/thredded/private_post_policy.rb +29 -0
- data/app/policies/thredded/private_topic_policy.rb +23 -0
- data/app/policies/thredded/topic_policy.rb +32 -0
- data/app/view_models/thredded/base_topic_view.rb +56 -0
- data/app/view_models/thredded/post_view.rb +44 -0
- data/app/view_models/thredded/posts_page_view.rb +27 -0
- data/app/view_models/thredded/private_topic_view.rb +9 -0
- data/app/{decorators/thredded/topic_email_decorator.rb → view_models/thredded/topic_email_view.rb} +2 -1
- data/app/view_models/thredded/topic_view.rb +23 -0
- data/app/view_models/thredded/topics_page_view.rb +26 -0
- data/app/views/thredded/error_pages/forbidden.html.erb +6 -0
- data/app/views/thredded/error_pages/not_found.html.erb +6 -0
- data/app/views/thredded/messageboards/_messageboard.html.erb +13 -6
- data/app/views/thredded/messageboards/index.html.erb +2 -8
- data/app/views/thredded/messageboards/new.html.erb +8 -2
- data/app/views/thredded/post_mailer/at_notification.html.erb +3 -3
- data/app/views/thredded/post_mailer/at_notification.text.erb +1 -1
- data/app/views/thredded/posts/_content_field.html.erb +1 -1
- data/app/views/thredded/posts/_form.html.erb +5 -1
- data/app/views/thredded/posts/_post.html.erb +3 -1
- data/app/views/thredded/posts/edit.html.erb +7 -3
- data/app/views/thredded/posts_common/_form.html.erb +1 -1
- data/app/views/thredded/posts_common/_post.html.erb +14 -8
- data/app/views/thredded/preferences/_form.html.erb +37 -15
- data/app/views/thredded/preferences/_header.html.erb +1 -1
- data/app/views/thredded/preferences/edit.html.erb +4 -6
- data/app/views/thredded/private_post_mailer/at_notification.html.erb +6 -4
- data/app/views/thredded/private_posts/_form.html.erb +5 -1
- data/app/views/thredded/private_posts/_private_post.html.erb +3 -1
- data/app/views/thredded/private_topic_mailer/message_notification.html.erb +3 -7
- data/app/views/thredded/private_topic_mailer/message_notification.text.erb +1 -3
- data/app/views/thredded/private_topics/_breadcrumbs.html.erb +2 -2
- data/app/views/thredded/private_topics/_form.html.erb +15 -10
- data/app/views/thredded/private_topics/_header.html.erb +12 -0
- data/app/views/thredded/private_topics/_no_private_topics.html.erb +2 -2
- data/app/views/thredded/private_topics/_private_topic.html.erb +4 -6
- data/app/views/thredded/private_topics/edit.html.erb +32 -0
- data/app/views/thredded/private_topics/index.html.erb +5 -5
- data/app/views/thredded/private_topics/new.html.erb +1 -2
- data/app/views/thredded/private_topics/show.html.erb +12 -7
- data/app/views/thredded/search/_form.html.erb +9 -6
- data/app/views/thredded/shared/{_messageboard_topics_breadcrumbs.html.erb → _breadcrumbs.html.erb} +2 -2
- data/app/views/thredded/shared/_header.html.erb +2 -3
- data/app/views/thredded/shared/_nav.html.erb +20 -0
- data/app/views/thredded/shared/nav/_notification_preferences.html.erb +6 -0
- data/app/views/thredded/shared/nav/_private_topics.html.erb +11 -0
- data/app/views/thredded/shared/nav/_standalone.html.erb +12 -0
- data/app/views/thredded/theme_previews/_section_title.html.erb +2 -2
- data/app/views/thredded/theme_previews/show.html.erb +13 -17
- data/app/views/thredded/topics/_form.html.erb +8 -6
- data/app/views/thredded/topics/_header.html.erb +12 -0
- data/app/views/thredded/topics/_topic.html.erb +4 -8
- data/app/views/thredded/topics/_topic_form_admin_options.html.erb +1 -1
- data/app/views/thredded/topics/edit.html.erb +22 -18
- data/app/views/thredded/topics/index.html.erb +3 -3
- data/app/views/thredded/topics/new.html.erb +1 -1
- data/app/views/thredded/topics/search.html.erb +17 -5
- data/app/views/thredded/topics/show.html.erb +14 -11
- data/bin/rails +5 -0
- data/config.ru +3 -0
- data/config/i18n-tasks.yml +16 -0
- data/config/locales/en.yml +90 -0
- data/config/routes.rb +29 -15
- data/db/migrate/20160329231848_create_thredded.rb +29 -33
- data/db/seeds.rb +115 -0
- data/db/upgrade_migrations/20160410111522_upgrade_v0_2_to_v0_3.rb +59 -0
- data/heroku.gemfile +26 -0
- data/heroku.gemfile.lock +282 -0
- data/lib/generators/thredded/install/install_generator.rb +1 -0
- data/lib/generators/thredded/install/templates/initializer.rb +17 -0
- data/lib/html/pipeline/at_mention_filter.rb +2 -1
- data/lib/html/pipeline/bbcode_filter.rb +13 -4
- data/lib/tasks/thredded_tasks.rake +1 -0
- data/lib/thredded.rb +19 -17
- data/lib/thredded/at_users.rb +1 -0
- data/lib/thredded/engine.rb +14 -5
- data/lib/thredded/errors.rb +11 -11
- data/lib/thredded/main_app_route_delegator.rb +1 -0
- data/lib/thredded/search_parser.rb +2 -1
- data/lib/thredded/topics_search.rb +67 -0
- data/lib/thredded/version.rb +2 -1
- data/thredded.gemspec +12 -8
- metadata +146 -82
- data/app/assets/javascripts/thredded/users_select.es6 +0 -5
- data/app/assets/stylesheets/thredded/layout/_topic-navigation.scss +0 -53
- data/app/commands/thredded/user_reads_private_topic.rb +0 -22
- data/app/commands/thredded/user_resets_private_topic_to_unread.rb +0 -23
- data/app/decorators/thredded/base_topic_decorator.rb +0 -14
- data/app/decorators/thredded/base_user_topic_decorator.rb +0 -63
- data/app/decorators/thredded/messageboard_decorator.rb +0 -41
- data/app/decorators/thredded/post_decorator.rb +0 -40
- data/app/decorators/thredded/private_topic_decorator.rb +0 -23
- data/app/decorators/thredded/topic_decorator.rb +0 -25
- data/app/decorators/thredded/user_private_topic_decorator.rb +0 -13
- data/app/decorators/thredded/user_topic_decorator.rb +0 -37
- data/app/models/thredded/ability.rb +0 -60
- data/app/models/thredded/notification_preference.rb +0 -17
- data/app/models/thredded/null_topic.rb +0 -15
- data/app/models/thredded/null_topic_read.rb +0 -19
- data/app/models/thredded/user_topic_read.rb +0 -10
- data/app/views/thredded/shared/_notification_preferences.html.erb +0 -7
- data/app/views/thredded/shared/_top_nav.html.erb +0 -36
- data/app/views/thredded/shared/_topic_nav.html.erb +0 -22
- data/app/views/thredded/topics/_recent_topics_by_user.html.erb +0 -8
- data/app/views/thredded/topics/by_category.html.erb +0 -56
- data/app/views/thredded/topics_common/_header.html.erb +0 -6
- data/lib/thredded/messageboard_user_permissions.rb +0 -22
- data/lib/thredded/post_sql_builder.rb +0 -12
- data/lib/thredded/post_user_permissions.rb +0 -32
- data/lib/thredded/private_topic_user_permissions.rb +0 -26
- data/lib/thredded/search_sql_builder.rb +0 -21
- data/lib/thredded/seed_database.rb +0 -76
- data/lib/thredded/table_sql_builder.rb +0 -41
- data/lib/thredded/topic_sql_builder.rb +0 -11
- data/lib/thredded/topic_user_permissions.rb +0 -32
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2c6816b0184d085f43b52bbccd55cb54423d3533
|
|
4
|
+
data.tar.gz: 8a454d07c634eb9fa25836a8722c4a340b1a078d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b81ea1816ea5cf2d24b45636336bd47565e7dd7197ed89f365ae845502b5050784b8ff02506ad6cc4a678fd2bf3c214cd689387233aa98aa575110a856a026f8
|
|
7
|
+
data.tar.gz: f5ff0cfccb540a68da5670085b0f380b988edc37b05aee2f3fc35099ff123cca1f88ea67dd91db391f77fc62bc938fa08851b9317ac6ce3e176d65b64a5541ce
|
data/CHANGELOG.mkdn
CHANGED
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
# MASTER
|
|
2
2
|
|
|
3
|
+
## Fixed
|
|
4
|
+
|
|
5
|
+
* TBD
|
|
6
|
+
|
|
7
|
+
## Added
|
|
8
|
+
|
|
9
|
+
* TBD
|
|
10
|
+
|
|
11
|
+
## Changed
|
|
12
|
+
|
|
13
|
+
* TBD
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# 0.3.0 - 2016-04-22
|
|
17
|
+
|
|
18
|
+
Thredded now supports Rails 4.2+ only.
|
|
19
|
+
|
|
20
|
+
Thredded now also fully supports the latest Rails 5 beta, but currently this requires using master versions of certain
|
|
21
|
+
gems. See [rails_5_0.gemfile](https://github.com/thredded/thredded/blob/master/spec/gemfiles/rails_5_0.gemfile)
|
|
22
|
+
for more information.
|
|
23
|
+
|
|
24
|
+
## Fixed
|
|
25
|
+
|
|
26
|
+
* (Private)Topic slugs re-generate at appropriate time
|
|
27
|
+
[28c09f4](https://github.com/thredded/thredded/commit/28c09f40804d3a71bbc12c56819a8acab3c94f2d)
|
|
28
|
+
* Editing topics and private message subjects. [#235](https://github.com/thredded/thredded/pull/235)
|
|
29
|
+
* Require login for `PrivateTopicsController`.
|
|
30
|
+
[5739f5](https://github.com/thredded/thredded/commit/5739f50a513377392205a41958b5a2d3ca25dc10)
|
|
31
|
+
* Current user method now configurable via initializer.
|
|
32
|
+
[#234](https://github.com/thredded/thredded/pull/234)
|
|
33
|
+
* Pagination and possible route conflicts throughout. [#202](https://github.com/thredded/thredded/pull/202)
|
|
34
|
+
* Redirects to the correct page after posting a reply. [#205](https://github.com/thredded/thredded/pull/205)
|
|
35
|
+
* Search with special `by:user` and `in:category` qualifiers. [#206](https://github.com/thredded/thredded/pull/206)
|
|
36
|
+
* Private topics now validate presence of at least one user other than the creator. [#207](https://github.com/thredded/thredded/pull/207)
|
|
37
|
+
* "Not found" and "Permission denied" errors now render with the correct response codes. [#208](https://github.com/thredded/thredded/pull/208)
|
|
38
|
+
* Thredded user associations are now correctly nullified / destroyed when a user is destroyed in the parent app.
|
|
39
|
+
|
|
40
|
+
## Added
|
|
41
|
+
|
|
42
|
+
* Dummy App renamed to "Thredded Demo" and demo deployed to Heroku
|
|
43
|
+
* Added vimeo and youtube auto-embed support. [#216](https://github.com/thredded/thredded/pull/216)
|
|
44
|
+
* Ability to delete posts. [#214](https://github.com/thredded/thredded/pull/214)
|
|
45
|
+
* Global search across all messageboards. [#215](https://github.com/thredded/thredded/pull/215)
|
|
46
|
+
* Global notification settings, message notification settings. [#210](https://github.com/thredded/thredded/pull/210)
|
|
47
|
+
* Private topic user select now looks prettier and loads the user via AJAX, instead of generating a huge select with all
|
|
48
|
+
the users. [#199](https://github.com/thredded/thredded/pull/199).
|
|
49
|
+
* The theme is now more customizable thanks to a number of fixes and new variables. [#197](https://github.com/thredded/thredded/pull/197)
|
|
50
|
+
* The topic read state is now visually updated on click. [#198](https://github.com/thredded/thredded/pull/198)
|
|
51
|
+
* Email preview classes are now provided. [#196](https://github.com/thredded/thredded/pull/196).
|
|
52
|
+
* I18n'd a *bunch* of static copy. (Thanks @glebm!)
|
|
53
|
+
|
|
54
|
+
## Changed
|
|
55
|
+
|
|
56
|
+
* Navigation layout/design updated [ec699fd](https://github.com/thredded/thredded/commit/ec699fd)
|
|
57
|
+
* Changed from using Bbcode OR Markdown to *both*, simultaneously.
|
|
58
|
+
[#221](https://github.com/thredded/thredded/pull/221)
|
|
59
|
+
* Removed Timecop in favor of built-in rails `travel_to` helper.
|
|
60
|
+
[#226](https://github.com/thredded/thredded/pull/226)
|
|
61
|
+
* Moved from CanCanCan to Pundit. [#228](https://github.com/thredded/thredded/pull/228)
|
|
62
|
+
* Renamed "Private Topics" to "Private Messages"
|
|
63
|
+
* Renamed `$thredded-base-font-color` to `$thredded-text-color`.
|
|
64
|
+
* Renamed `$thredded-base-background-color` to `$thredded-background-color`.
|
|
65
|
+
|
|
3
66
|
# 0.2.2 - 2016-04-04
|
|
4
67
|
|
|
5
68
|
## Fixed
|
data/Procfile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
web: bundle exec puma -C ./spec/dummy/config/puma.heroku.rb
|
data/README.mkdn
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Thredded [](https://codeclimate.com/github/thredded/thredded) [](https://travis-ci.org/thredded/thredded/) [](https://codeclimate.com/github/thredded/thredded/coverage) [](https://codeclimate.com/github/thredded/thredded) [](https://travis-ci.org/thredded/thredded/) [](https://codeclimate.com/github/thredded/thredded/coverage) [](https://gitter.im/thredded/thredded?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [](http://waffle.io/thredded/thredded)
|
|
2
2
|
|
|
3
|
-
_Thredded_ is a Rails 4.
|
|
3
|
+
_Thredded_ is a Rails 4.2+ forum/messageboard engine. Its goal is to be as simple and feature rich as possible.
|
|
4
4
|
|
|
5
5
|
Some of the features currently in Thredded:
|
|
6
6
|
|
|
@@ -22,8 +22,15 @@ Planned features:
|
|
|
22
22
|
|
|
23
23
|
<img src="http://emoji.fileformat.info/gemoji/point_up.png" width="24"> If you are so inclined, donating to the project will help aid in its development
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
[
|
|
25
|
+
|
|
26
|
+
| ![screenshot-messageboards] | ![screenshot-topics] |
|
|
27
|
+
|----------------------------|----------------------------|
|
|
28
|
+
| ![screenshot-topic] | ![screenshot-new-private-topic-dark] |
|
|
29
|
+
|
|
30
|
+
[screenshot-messageboards]: https://cloud.githubusercontent.com/assets/216339/14379803/d608d782-fd73-11e5-9d8e-1f282ea66fab.png
|
|
31
|
+
[screenshot-topics]: https://cloud.githubusercontent.com/assets/216339/14379804/d77db060-fd73-11e5-9a4a-9376ca409756.png
|
|
32
|
+
[screenshot-topic]: https://cloud.githubusercontent.com/assets/216339/14379805/d8ecf32a-fd73-11e5-8734-b7faa8b264ee.png
|
|
33
|
+
[screenshot-new-private-topic-dark]: https://cloud.githubusercontent.com/assets/216339/14379806/da716a1e-fd73-11e5-90f1-6dbdb708d3d5.png
|
|
27
34
|
|
|
28
35
|
Thredded works with SQLite, MySQL (v5.6.4+), and PostgreSQL. Thredded has no infrastructure
|
|
29
36
|
dependencies other than the database and, if configured in the parent application, the ActiveJob
|
|
@@ -33,6 +40,9 @@ support JRuby and Rubinius as well.
|
|
|
33
40
|
If you're looking for variations on a theme - see [Forem] and [Discourse]. Forem is also an engine,
|
|
34
41
|
while Discourse is a full app.
|
|
35
42
|
|
|
43
|
+
[Discourse]: http://www.discourse.org/
|
|
44
|
+
[Forem]: https://github.com/rubysherpas/forem
|
|
45
|
+
|
|
36
46
|
## Installation
|
|
37
47
|
|
|
38
48
|
Add the gem to your Gemfile:
|
|
@@ -80,8 +90,24 @@ Include thredded JavaScripts in your `application.js`:
|
|
|
80
90
|
//= require thredded
|
|
81
91
|
```
|
|
82
92
|
|
|
93
|
+
You also may want to add an index to the user name column in your users table.
|
|
94
|
+
Thredded uses it to find @-mentions and perform name prefix autocompletion on the private topic form.
|
|
95
|
+
Add the index in a migration like so:
|
|
96
|
+
|
|
97
|
+
```ruby
|
|
98
|
+
DbTextSearch::CaseInsensitive.add_index(
|
|
99
|
+
connection, Thredded.user_class.table_name, Thredded.user_name_column, unique: true)
|
|
100
|
+
```
|
|
101
|
+
|
|
83
102
|
[initializer]: https://github.com/thredded/thredded/blob/master/lib/generators/thredded/install/templates/initializer.rb
|
|
84
103
|
|
|
104
|
+
### Migrating from Forem
|
|
105
|
+
|
|
106
|
+
Using [Forem]? Thredded provides [a migration][forem-to-thredded] to copy all your existing forums from Forem over
|
|
107
|
+
to Thredded.
|
|
108
|
+
|
|
109
|
+
[forem-to-thredded]: https://github.com/thredded/thredded/wiki/Migrate-from-Forem
|
|
110
|
+
|
|
85
111
|
## Theming
|
|
86
112
|
|
|
87
113
|
The engine comes by default with a light and effective implementation of the
|
|
@@ -139,6 +165,14 @@ Whenever possible, use the styles and i18n to customize Thredded to your needs.
|
|
|
139
165
|
Thredded views also provide two content_tags available to yield - `:thredded_page_title` and `:thredded_page_id`.
|
|
140
166
|
The views within Thredded pass those up through to your layout if you would like to use them.
|
|
141
167
|
|
|
168
|
+
### Emails
|
|
169
|
+
|
|
170
|
+
Thredded sends several notification emails to the users. You can override in the same way as the views.
|
|
171
|
+
If you use [Rails Email Preview], you can include Thredded emails into the list of previews by adding
|
|
172
|
+
`Thredded::BaseMailerPreview.preview_classes` to the [Rails Email Preview] `preview_classes` config option.
|
|
173
|
+
|
|
174
|
+
[Rails Email Preview]: https://github.com/glebm/rails_email_preview
|
|
175
|
+
|
|
142
176
|
## Permissions
|
|
143
177
|
|
|
144
178
|
Thredded comes with a flexible permissions system that can be configured per messageboard/user.
|
|
@@ -259,7 +293,7 @@ Below is an overview of the default permissions, with links to the implementatio
|
|
|
259
293
|
<td align="center"><a href="https://github.com/thredded/thredded/blob/master/app/models/thredded/user_permissions/write/none.rb">
|
|
260
294
|
❌ No
|
|
261
295
|
</a></td>
|
|
262
|
-
<td align="center"><a href="https://github.com/thredded/thredded/blob/master/app/models/thredded/user_permissions/message/
|
|
296
|
+
<td align="center"><a href="https://github.com/thredded/thredded/blob/master/app/models/thredded/user_permissions/message/readers_of_writeable_boards.rb">
|
|
263
297
|
❌ No
|
|
264
298
|
</a></td>
|
|
265
299
|
<td align="center"><a href="https://github.com/thredded/thredded/blob/master/app/models/thredded/user_permissions/moderate/none.rb">
|
|
@@ -274,7 +308,7 @@ Below is an overview of the default permissions, with links to the implementatio
|
|
|
274
308
|
|
|
275
309
|
### Handling "Permission denied"
|
|
276
310
|
|
|
277
|
-
Thredded defines a number of Exception classes that you can `[rescue_from]
|
|
311
|
+
Thredded defines a number of Exception classes that you can [`rescue_from`][rescue_from] in your `ApplicationController`
|
|
278
312
|
to handle permission denied errors.
|
|
279
313
|
|
|
280
314
|
These are:
|
|
@@ -290,17 +324,6 @@ Currently, the default behaviour is to redirect to the forums root page with a f
|
|
|
290
324
|
|
|
291
325
|
[rescue_from]: http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html
|
|
292
326
|
|
|
293
|
-
## Rails 4.1 and ActiveJob Support
|
|
294
|
-
|
|
295
|
-
If you're currently using Rails 4.1 make sure to add ...
|
|
296
|
-
|
|
297
|
-
```ruby
|
|
298
|
-
gem 'activejob_backport'
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
... to your Gemfile. ActiveJob is now the main background job abstraction layer in Thredded.
|
|
302
|
-
It was not introduced to rails until 4.2 so you'll need the backport to provide the support for it.
|
|
303
|
-
|
|
304
327
|
## Development
|
|
305
328
|
|
|
306
329
|
To be more clear - this is the for when you are working on *this* gem.
|
|
@@ -310,9 +333,8 @@ First, to get started, migrate and seed the database (SQLite by default):
|
|
|
310
333
|
|
|
311
334
|
```bash
|
|
312
335
|
bundle
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
rake dev:seed
|
|
336
|
+
# Create, migrate, and seed the development database with fake forum users, topics, and posts:
|
|
337
|
+
rake db:create db:migrate db:seed
|
|
316
338
|
```
|
|
317
339
|
|
|
318
340
|
Then, start the dummy app server:
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg height="48" viewBox="0 0 24 24" width="32" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M0 0h24v24H0z" fill="none"/>
|
|
3
|
+
<path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/>
|
|
4
|
+
</svg>
|
|
@@ -1,10 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
//- require babel/polyfill
|
|
4
|
-
|
|
5
|
-
//= require jquery
|
|
6
|
-
//= require jquery_ujs
|
|
7
|
-
//= require jquery.autosize
|
|
8
|
-
//= require rails-timeago
|
|
9
|
-
//= require select2
|
|
10
|
-
//= require_tree ./thredded
|
|
1
|
+
//= require thredded/dependencies
|
|
2
|
+
//= require thredded/thredded
|
data/app/assets/javascripts/thredded/{currently_online.es6 → components/currently_online.es6}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
const COMPONENT_SELECTOR = '[data-thredded-topic-form]';
|
|
3
3
|
class ThreddedTopicForm {
|
|
4
4
|
constructor() {
|
|
5
|
-
this.titleSelector = '[
|
|
5
|
+
this.titleSelector = '[name$="topic[title]"]';
|
|
6
6
|
this.textareaSelector = 'textarea';
|
|
7
7
|
this.compactSelector = 'form.thredded--is-compact';
|
|
8
8
|
this.expandedSelector = 'form.thredded--is-expanded';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
(function($) {
|
|
2
|
+
const COMPONENT_SELECTOR = '[data-thredded-topics]';
|
|
3
|
+
|
|
4
|
+
const TOPIC_SELECTOR = 'article';
|
|
5
|
+
const TOPIC_LINK_SELECTOR = 'h1 a';
|
|
6
|
+
const TOPIC_UNREAD_CLASS = 'thredded--topic-unread';
|
|
7
|
+
const TOPIC_READ_CLASS = 'thredded--topic-read';
|
|
8
|
+
const POSTS_COUNT_SELECTOR = '.thredded--topics--posts-count';
|
|
9
|
+
const POSTS_PER_PAGE = 50;
|
|
10
|
+
|
|
11
|
+
function pageNumber(url) {
|
|
12
|
+
const match = url.match(/\/page-(\d)$/);
|
|
13
|
+
return match ? +match[1] : 1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function totalPages(numPosts) {
|
|
17
|
+
return Math.ceil(numPosts / POSTS_PER_PAGE);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class ThreddedTopics {
|
|
21
|
+
init($nodes) {
|
|
22
|
+
$nodes.on('click', TOPIC_LINK_SELECTOR, (evt) => {
|
|
23
|
+
const $topic = $(evt.target).closest(TOPIC_SELECTOR);
|
|
24
|
+
if (pageNumber($topic.find('a').prop('href')) == totalPages(+$topic.find(POSTS_COUNT_SELECTOR).text())) {
|
|
25
|
+
$topic.addClass(TOPIC_READ_CLASS).removeClass(TOPIC_UNREAD_CLASS);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
$(function() {
|
|
32
|
+
var $nodes = $(COMPONENT_SELECTOR);
|
|
33
|
+
if ($nodes.length) {
|
|
34
|
+
new ThreddedTopics().init($nodes);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
})(jQuery);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
(function($) {
|
|
2
|
+
const COMPONENT_SELECTOR = '[data-thredded-user-preferences-form]';
|
|
3
|
+
const NOTIFY_ON_MENTION_SELECTOR = ':checkbox[name="user_preferences_form[notify_on_mention]"]';
|
|
4
|
+
const MESSAGEBOARD_NOTIFY_ON_MENTION_SELECTOR = '[name="user_preferences_form[messageboard_notify_on_mention]"]';
|
|
5
|
+
|
|
6
|
+
class UserPreferencesForm {
|
|
7
|
+
constructor(form) {
|
|
8
|
+
this.$form = $(form);
|
|
9
|
+
this.$notifyOnMention = this.$form.find(NOTIFY_ON_MENTION_SELECTOR);
|
|
10
|
+
this.$messageboardNotifyOnMention = this.$form.find(MESSAGEBOARD_NOTIFY_ON_MENTION_SELECTOR);
|
|
11
|
+
|
|
12
|
+
this.messageboardNotifyOnMentionCheckedWas = this.$messageboardNotifyOnMention.prop('checked');
|
|
13
|
+
this.$messageboardNotifyOnMention.on('change', () => {
|
|
14
|
+
this.rememberMessageboardNotifyOnMentionChecked();
|
|
15
|
+
});
|
|
16
|
+
this.rememberMessageboardNotifyOnMentionChecked();
|
|
17
|
+
|
|
18
|
+
this.$notifyOnMention.on('change', () => {
|
|
19
|
+
this.updateMessageboardNotifyOnMention();
|
|
20
|
+
});
|
|
21
|
+
this.updateMessageboardNotifyOnMention();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
rememberMessageboardNotifyOnMentionChecked() {
|
|
25
|
+
this.messageboardNotifyOnMentionCheckedWas =
|
|
26
|
+
this.$messageboardNotifyOnMention.filter(':checkbox').prop('checked');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
updateMessageboardNotifyOnMention() {
|
|
30
|
+
const enabled = this.$notifyOnMention.prop('checked');
|
|
31
|
+
this.$messageboardNotifyOnMention
|
|
32
|
+
.prop('disabled', !enabled)
|
|
33
|
+
.filter(':checkbox').prop('checked', enabled ? this.messageboardNotifyOnMentionCheckedWas : false);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
$(function() {
|
|
38
|
+
const $forms = $(COMPONENT_SELECTOR);
|
|
39
|
+
if ($forms.length) {
|
|
40
|
+
$forms.each(function() {
|
|
41
|
+
new UserPreferencesForm(this);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
})(jQuery);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
($ => {
|
|
2
|
+
const COMPONENT_SELECTOR = '[data-thredded-users-select]';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
let formatUser = (user, container, query, escapeHtml) => {
|
|
6
|
+
if (user.loading) return user.text;
|
|
7
|
+
return "<div class='thredded--select2-user-result'>" +
|
|
8
|
+
`<img class='thredded--select2-user-result__avatar' src='${escapeHtml(user.avatar_url)}' >` +
|
|
9
|
+
`<span class='thredded--select2-user-result__name'>${escapeHtml(user.name)}</span>` +
|
|
10
|
+
'</div>';
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
let formatUserSelection = (user, container, escapeHtml) => {
|
|
14
|
+
return `<span class='thredded--select2-user-selection'>` +
|
|
15
|
+
`<img class='thredded--select2-user-selection__avatar' src='${escapeHtml(user.avatar_url)}' >` +
|
|
16
|
+
`<span class='thredded--select2-user-selection__name'>${escapeHtml(user.name)}</span>` +
|
|
17
|
+
'</span>';
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
let initSelection = ($el, callback) => {
|
|
21
|
+
let ids = ($el.val() || '').split(',');
|
|
22
|
+
if (ids.length && ids[0] != '') {
|
|
23
|
+
$.ajax(`${$el.data('autocompleteUrl')}?ids=${ids.join(',')}`, {dataType: 'json'}).done(data => callback(data.results));
|
|
24
|
+
} else {
|
|
25
|
+
callback([]);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
let init = $el => {
|
|
30
|
+
$el.select2({
|
|
31
|
+
ajax: {
|
|
32
|
+
cache: true,
|
|
33
|
+
data: query => ({q: query}),
|
|
34
|
+
results: data => data,
|
|
35
|
+
dataType: 'json',
|
|
36
|
+
url: $el.data('autocompleteUrl')
|
|
37
|
+
},
|
|
38
|
+
containerCssClass: 'thredded--select2-container',
|
|
39
|
+
dropdownCssClass: 'thredded--select2-drop',
|
|
40
|
+
initSelection: initSelection,
|
|
41
|
+
minimumInputLength: 2,
|
|
42
|
+
multiple: true,
|
|
43
|
+
formatResult: formatUser,
|
|
44
|
+
formatSelection: formatUserSelection
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
$(function() {
|
|
49
|
+
var $nodes = $(COMPONENT_SELECTOR);
|
|
50
|
+
if ($nodes.length) {
|
|
51
|
+
$nodes.each(function() {
|
|
52
|
+
init($(this));
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
})(jQuery);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= require_tree ./components
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
@import "base/variables";
|
|
4
4
|
|
|
5
5
|
@import "base/alerts";
|
|
6
|
-
@import "base/grid";
|
|
7
|
-
@import "base/typography";
|
|
8
6
|
@import "base/buttons";
|
|
9
7
|
@import "base/forms";
|
|
8
|
+
@import "base/grid";
|
|
10
9
|
@import "base/lists";
|
|
10
|
+
@import "base/nav";
|
|
11
11
|
@import "base/tables";
|
|
12
|
+
@import "base/typography";
|
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
@import "layout/main-container";
|
|
8
8
|
@import "layout/main-navigation";
|
|
9
|
-
@import "layout/
|
|
9
|
+
@import "layout/search-navigation";
|
|
10
10
|
@import "layout/user-navigation";
|
|
11
|
+
@import "layout/navigation";
|
|
11
12
|
|
|
12
13
|
@import "components/base";
|
|
14
|
+
@import "components/alerts";
|
|
15
|
+
@import "components/icons";
|
|
13
16
|
@import "components/currently-online";
|
|
14
17
|
@import "components/empty";
|
|
15
18
|
@import "components/flash-message";
|
|
@@ -1,6 +1,27 @@
|
|
|
1
|
+
%thredded--form--input {
|
|
2
|
+
background: $thredded-form-background;
|
|
3
|
+
border: $thredded-form-border;
|
|
4
|
+
box-shadow: $thredded-form-box-shadow;
|
|
5
|
+
color: $thredded-form-color;
|
|
6
|
+
font-family: $thredded-base-font-family;
|
|
7
|
+
font-size: $thredded-base-font-size;
|
|
8
|
+
padding: $thredded-small-spacing;
|
|
9
|
+
transition: border-color;
|
|
10
|
+
|
|
11
|
+
&:hover {
|
|
12
|
+
border-color: $thredded-form-border-hover-color;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
&:focus {
|
|
16
|
+
border-color: $thredded-form-border-focus-color;
|
|
17
|
+
box-shadow: $thredded-form-box-shadow, 0 0 3px $thredded-action-color;
|
|
18
|
+
outline: none;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
1
22
|
%thredded--form {
|
|
2
23
|
fieldset {
|
|
3
|
-
background-color:
|
|
24
|
+
background-color: $thredded-background-color;
|
|
4
25
|
border: $thredded-base-border;
|
|
5
26
|
margin: 0 0 $thredded-small-spacing;
|
|
6
27
|
padding: $thredded-base-spacing;
|
|
@@ -30,25 +51,9 @@
|
|
|
30
51
|
[type='color'], [type='date'], [type='datetime'], [type='datetime-local'], [type='email'], [type='month'],
|
|
31
52
|
[type='number'], [type='password'], [type='search'], [type='tel'], [type='text'], [type='time'], [type='url'],
|
|
32
53
|
[type='week'], input:not([type]), textarea, select[multiple=multiple] {
|
|
33
|
-
|
|
34
|
-
border: $thredded-form-border;
|
|
35
|
-
box-shadow: $thredded-form-box-shadow;
|
|
54
|
+
@extend %thredded--form--input;
|
|
36
55
|
box-sizing: border-box;
|
|
37
|
-
font-family: $thredded-base-font-family;
|
|
38
|
-
font-size: $thredded-base-font-size;
|
|
39
|
-
padding: $thredded-small-spacing;
|
|
40
|
-
transition: border-color;
|
|
41
56
|
width: 100%;
|
|
42
|
-
|
|
43
|
-
&:hover {
|
|
44
|
-
border-color: darken($thredded-base-border-color, 10%);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
&:focus {
|
|
48
|
-
border-color: $thredded-action-color;
|
|
49
|
-
box-shadow: $thredded-form-box-shadow, 0 0 3px $thredded-action-color;
|
|
50
|
-
outline: none;
|
|
51
|
-
}
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
textarea {
|