thredded 0.11.0 → 0.11.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/README.md +68 -19
- data/app/assets/stylesheets/thredded/_base.scss +1 -0
- data/app/assets/stylesheets/thredded/base/_dropdown-menu.scss +83 -0
- data/app/assets/stylesheets/thredded/components/_post.scss +5 -60
- data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +4 -1
- data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +31 -6
- data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +1 -0
- data/app/controllers/thredded/application_controller.rb +6 -0
- data/app/controllers/thredded/posts_controller.rb +6 -0
- data/app/controllers/thredded/private_posts_controller.rb +6 -0
- data/app/controllers/thredded/private_topics_controller.rb +7 -0
- data/app/controllers/thredded/topics_controller.rb +23 -1
- data/app/policies/thredded/post_policy.rb +1 -1
- data/app/view_hooks/thredded/all_view_hooks.rb +3 -0
- data/app/views/thredded/moderation/_users_search_form.html.erb +1 -1
- data/app/views/thredded/moderation/user.html.erb +13 -11
- data/app/views/thredded/moderation/users.html.erb +1 -0
- data/app/views/thredded/shared/nav/_notification_preferences.html.erb +1 -1
- data/app/views/thredded/shared/nav/_standalone.html.erb +1 -1
- data/app/views/thredded/topics/search.html.erb +20 -2
- data/config/locales/en.yml +5 -2
- data/config/locales/es.yml +6 -3
- data/config/locales/pl.yml +5 -2
- data/config/locales/pt-BR.yml +5 -2
- data/config/locales/ru.yml +6 -3
- data/lib/generators/thredded/install/templates/initializer.rb +4 -4
- data/lib/thredded.rb +13 -9
- data/lib/thredded/content_formatter.rb +6 -3
- data/lib/thredded/html_pipeline/kramdown_filter.rb +1 -1
- data/lib/thredded/version.rb +1 -1
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 267a7718fa00308d076699e3970f2e3d74946f28
|
4
|
+
data.tar.gz: 40e40286c2af13e04f3af5b72b376d5a3e3a8209
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b2074d057c58a048c9cb3bba55de02e95099f604a95fc75b843cd0c48fb71a81d04b8c2d18a89e0e0a71e193039cacec83aa27eb0d9ea9f09b75e85efe6fb5d
|
7
|
+
data.tar.gz: 2ebee2bec698ce19036b4845ff4ca1ec04ecf0c5848d71ad5f67593fac08e979997cae369739cfdbc04fcbf6a71295372eee7da8df881f6085ce0eb62bb3e043
|
data/README.md
CHANGED
@@ -33,6 +33,49 @@ application and not an engine like Thredded.
|
|
33
33
|
|
34
34
|
[Discourse]: http://www.discourse.org/
|
35
35
|
|
36
|
+
Table of Contents
|
37
|
+
=================
|
38
|
+
|
39
|
+
* [Installation](#installation)
|
40
|
+
* [Creating a new Rails app with Thredded](#creating-a-new-rails-app-with-thredded)
|
41
|
+
* [Adding Thredded to an existing Rails app](#adding-thredded-to-an-existing-rails-app)
|
42
|
+
* [Upgrading an existing install](#upgrading-an-existing-install)
|
43
|
+
* [Migrating from Forem](#migrating-from-forem)
|
44
|
+
* [Views and other assets](#views-and-other-assets)
|
45
|
+
* [Standalone layout](#standalone-layout)
|
46
|
+
* [Application layout](#application-layout)
|
47
|
+
* [Reference your paths so that Thredded can find them](#reference-your-paths-so-that-thredded-can-find-them)
|
48
|
+
* [Add Thredded styles](#add-thredded-styles)
|
49
|
+
* [Add Thredded JavaScripts](#add-thredded-javascripts)
|
50
|
+
* [jQuery version](#jquery-version)
|
51
|
+
* [User profile page](#user-profile-page)
|
52
|
+
* [Customizing views](#customizing-views)
|
53
|
+
* [View hooks](#view-hooks)
|
54
|
+
* [Theming](#theming)
|
55
|
+
* [Styles](#styles)
|
56
|
+
* [Email and other notifications](#email-and-other-notifications)
|
57
|
+
* [Enabling auto-follow](#enabling-auto-follow)
|
58
|
+
* [I18n](#i18n)
|
59
|
+
* [Permissions](#permissions)
|
60
|
+
* [Permission methods](#permission-methods)
|
61
|
+
* [Reading messageboards](#reading-messageboards)
|
62
|
+
* [Posting to messageboards](#posting-to-messageboards)
|
63
|
+
* [Messaging other users (posting to private topics)](#messaging-other-users-posting-to-private-topics)
|
64
|
+
* [Moderating messageboards](#moderating-messageboards)
|
65
|
+
* [Admin permissions](#admin-permissions)
|
66
|
+
* [Default permissions](#default-permissions)
|
67
|
+
* [Handling "Permission denied" and "Not found" errors](#handling-permission-denied-and-not-found-errors)
|
68
|
+
* [Moderation](#moderation)
|
69
|
+
* [Disabling moderation](#disabling-moderation)
|
70
|
+
* [Plugins](#plugins)
|
71
|
+
* [Development](#development)
|
72
|
+
* [Testing](#testing)
|
73
|
+
* [Ruby](#ruby)
|
74
|
+
* [JavaScript](#javascript)
|
75
|
+
* [Testing with all the databases and Rails versions locally.](#testing-with-all-the-databases-and-rails-versions-locally)
|
76
|
+
* [Developing and Testing with Docker Compose](#developing-and-testing-with-docker-compose)
|
77
|
+
|
78
|
+
|
36
79
|
## Installation
|
37
80
|
|
38
81
|
### Creating a new Rails app with Thredded
|
@@ -56,7 +99,7 @@ Then, see the rest of this Readme for more information about using and customizi
|
|
56
99
|
Add the gem to your Gemfile:
|
57
100
|
|
58
101
|
```ruby
|
59
|
-
gem 'thredded', '~> 0.11.
|
102
|
+
gem 'thredded', '~> 0.11.1'
|
60
103
|
```
|
61
104
|
|
62
105
|
Add the Thredded [initializer] to your parent app by running the install generator.
|
@@ -105,11 +148,11 @@ rails g thredded:install
|
|
105
148
|
|
106
149
|
But then compare this with the previous version to decide what to keep.
|
107
150
|
|
108
|
-
2) To upgrade the database (in this example from v0.
|
151
|
+
2) To upgrade the database (in this example from v0.10 to v0.11):
|
109
152
|
|
110
153
|
```console
|
111
154
|
# Note that for guaranteed best results you will want to run this with the gem checked out with v0.10.0
|
112
|
-
cp `bundle show thredded`/db/upgrade_migrations/
|
155
|
+
cp `bundle show thredded`/db/upgrade_migrations/20170312131417_upgrade_thredded_v0_10_to_v0_11.rb db/migrate
|
113
156
|
rake db:migrate
|
114
157
|
```
|
115
158
|
|
@@ -261,13 +304,13 @@ To see the complete list of view hooks and their arguments, run:
|
|
261
304
|
grep view_hooks -R --include '*.html.erb' "$(bundle show thredded)"
|
262
305
|
```
|
263
306
|
|
264
|
-
|
307
|
+
### Theming
|
265
308
|
|
266
309
|
The engine comes by default with a light and effective implementation of the
|
267
310
|
views, styles, and javascript. Once you mount the engine you will be presented
|
268
311
|
with a "themed" version of thredded.
|
269
312
|
|
270
|
-
|
313
|
+
#### Styles
|
271
314
|
|
272
315
|
Thredded comes with a light Sass theme controlled by a handful of variables that can be found here:
|
273
316
|
https://github.com/thredded/thredded/blob/master/app/assets/stylesheets/thredded/base/_variables.scss.
|
@@ -307,8 +350,18 @@ If you use [Rails Email Preview], you can include Thredded emails into the list
|
|
307
350
|
|
308
351
|
[Rails Email Preview]: https://github.com/glebm/rails_email_preview
|
309
352
|
|
310
|
-
You can also turn off the email notifier totally, or add other notifiers (e.g. Pushover, possibly Slack) by adjusting
|
311
|
-
`Thredded.notifiers` configuration in your initializer. See the default initializer for examples.
|
353
|
+
You can also turn off the email notifier totally, or add other notifiers (e.g. Pushover, possibly Slack) by adjusting
|
354
|
+
the `Thredded.notifiers` configuration in your initializer. See the default initializer for examples.
|
355
|
+
|
356
|
+
### Enabling auto-follow
|
357
|
+
|
358
|
+
In some cases, you'll want all users to auto-follow new messageboard topics by default. This might be useful
|
359
|
+
for a team messageboard or a company announcements board, for example. To enable user auto-follow of new topics,
|
360
|
+
run the following migration(s):
|
361
|
+
|
362
|
+
```ruby
|
363
|
+
change_column_default :thredded_user_preferences, :auto_follow_topics, 1
|
364
|
+
```
|
312
365
|
|
313
366
|
## I18n
|
314
367
|
|
@@ -318,7 +371,7 @@ We welcome PRs adding support for new languages.
|
|
318
371
|
|
319
372
|
Here are the steps to ensure the best support for your language if it isn't English:
|
320
373
|
|
321
|
-
1. Add `rails-i18n` to your Gemfile.
|
374
|
+
1. Add `rails-i18n` and `kaminari-i18n` to your Gemfile.
|
322
375
|
|
323
376
|
2. Require the translations for rails-timeago in your JavaScript before `thredded` but after `jquery.timeago`
|
324
377
|
(included in `thredded/dependencies`). E.g. for Brazilian Portuguese:
|
@@ -504,16 +557,6 @@ To disable moderation, e.g. if you run internal forums that do not need moderati
|
|
504
557
|
change_column_default :thredded_user_details, :moderation_state, 1 # approved
|
505
558
|
```
|
506
559
|
|
507
|
-
### Enabling auto-follow
|
508
|
-
|
509
|
-
In some cases, you'll want all users to auto-follow new messageboard topics by default. This might be useful
|
510
|
-
for a team messageboard or a company announcements board, for example. To enable user auto-follow of new topics,
|
511
|
-
run the following migration(s):
|
512
|
-
|
513
|
-
```ruby
|
514
|
-
change_column_default :thredded_user_preferences, :auto_follow_topics, 1
|
515
|
-
```
|
516
|
-
|
517
560
|
## Plugins
|
518
561
|
|
519
562
|
The following official plugins are available for Thredded:
|
@@ -544,12 +587,18 @@ Then, start the dummy app server:
|
|
544
587
|
rake dev:server
|
545
588
|
```
|
546
589
|
|
590
|
+
### Testing
|
591
|
+
|
547
592
|
To run the tests, just run `rspec`. The test suite will re-create the test database on every run, so there is no need to
|
548
593
|
run tasks that maintain the test database.
|
549
594
|
|
550
595
|
By default, SQLite is used in development and test. On Travis, the tests will run using SQLite, PostgreSQL, MySQL,
|
551
596
|
and all the supported Rails versions.
|
552
597
|
|
598
|
+
The test suite requires [PhantomJS](http://phantomjs.org) to be present in the path.
|
599
|
+
To install it, run `sudo apt-get install phantomjs` on Ubuntu or Debian, or `brew install phantomjs` on Mac.
|
600
|
+
For other operating systems, refer to the [PhantomJS documentation](http://phantomjs.org/download.html).
|
601
|
+
|
553
602
|
### Ruby
|
554
603
|
|
555
604
|
Thredded Ruby code formatting is ensured by [Rubocop](https://github.com/bbatsov/rubocop). Run `rubocop -a` to ensure a
|
@@ -635,7 +684,7 @@ To test all combinations of supported databases and Rails versions, run:
|
|
635
684
|
rake test_all
|
636
685
|
```
|
637
686
|
|
638
|
-
|
687
|
+
### Developing and Testing with [Docker Compose](http://docs.docker.com/compose/)
|
639
688
|
|
640
689
|
To quickly try out _Thredded_ with the included dummy app, clone the source and
|
641
690
|
start the included docker-compose.yml file with:
|
@@ -0,0 +1,83 @@
|
|
1
|
+
%thredded--dropdown-menu--container {
|
2
|
+
position: relative;
|
3
|
+
display: inline-block;
|
4
|
+
cursor: pointer;
|
5
|
+
|
6
|
+
&:hover {
|
7
|
+
%thredded--dropdown-menu--toggle {
|
8
|
+
color: $thredded-action-hover-color;
|
9
|
+
}
|
10
|
+
|
11
|
+
%thredded--dropdown-menu--actions {
|
12
|
+
transform: scale(1);
|
13
|
+
opacity: 1;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
%thredded--dropdown-menu--toggle {
|
19
|
+
color: $thredded-action-color;
|
20
|
+
}
|
21
|
+
|
22
|
+
%thredded--dropdown-menu--actions {
|
23
|
+
position: absolute;
|
24
|
+
background-color: $thredded-overlay-background-color;
|
25
|
+
border-radius: 2px;
|
26
|
+
overflow: hidden;
|
27
|
+
min-width: 8.5rem;
|
28
|
+
z-index: 3;
|
29
|
+
cursor: pointer;
|
30
|
+
box-shadow: $thredded-overlay-box-shadow;
|
31
|
+
transform: scale(0);
|
32
|
+
opacity: 0;
|
33
|
+
transition: transform .3s cubic-bezier(.4, 0, .2, 1), opacity .2s cubic-bezier(.4, 0, .2, 1);
|
34
|
+
will-change: transform;
|
35
|
+
}
|
36
|
+
|
37
|
+
%thredded--dropdown-menu--actions-bottom-left {
|
38
|
+
@extend %thredded--dropdown-menu--actions;
|
39
|
+
right: 0;
|
40
|
+
transform-origin: 100% 0;
|
41
|
+
}
|
42
|
+
|
43
|
+
%thredded--dropdown-menu--actions-bottom-right {
|
44
|
+
@extend %thredded--dropdown-menu--actions;
|
45
|
+
left: 0;
|
46
|
+
transform-origin: 0 0;
|
47
|
+
}
|
48
|
+
|
49
|
+
%thredded--dropdown-menu--actions--item,
|
50
|
+
// This specific selector protects from global button rules
|
51
|
+
form.button_to > %thredded--dropdown-menu--actions--item {
|
52
|
+
// Override potential global rules
|
53
|
+
background: none;
|
54
|
+
border-radius: 0;
|
55
|
+
border: 0;
|
56
|
+
box-sizing: border-box;
|
57
|
+
font: inherit;
|
58
|
+
margin: 0;
|
59
|
+
text-align: left;
|
60
|
+
transition: none;
|
61
|
+
width: 100%;
|
62
|
+
|
63
|
+
font-size: $thredded-font-size-small;
|
64
|
+
color: $thredded-text-color;
|
65
|
+
text-decoration: none;
|
66
|
+
padding: 1rem 0.75rem;
|
67
|
+
display: block;
|
68
|
+
white-space: nowrap;
|
69
|
+
|
70
|
+
&:active,
|
71
|
+
&:focus,
|
72
|
+
&:hover {
|
73
|
+
background-color: $thredded-button-background;
|
74
|
+
color: $thredded-button-color;
|
75
|
+
text-decoration: none;
|
76
|
+
cursor: pointer;
|
77
|
+
}
|
78
|
+
|
79
|
+
&:active,
|
80
|
+
&:focus {
|
81
|
+
outline: none;
|
82
|
+
}
|
83
|
+
}
|
@@ -7,6 +7,7 @@
|
|
7
7
|
}
|
8
8
|
|
9
9
|
.thredded--post--dropdown--toggle {
|
10
|
+
@extend %thredded--dropdown-menu--toggle;
|
10
11
|
fill: currentColor;
|
11
12
|
box-sizing: content-box;
|
12
13
|
color: $thredded-action-color;
|
@@ -22,76 +23,20 @@
|
|
22
23
|
}
|
23
24
|
|
24
25
|
.thredded--post--dropdown {
|
25
|
-
|
26
|
-
display: inline-block;
|
26
|
+
@extend %thredded--dropdown-menu--container;
|
27
27
|
float: right;
|
28
|
-
cursor: pointer;
|
29
28
|
@media print {
|
30
29
|
display: none;
|
31
30
|
}
|
32
31
|
}
|
33
32
|
|
34
33
|
.thredded--post--dropdown--actions {
|
35
|
-
|
34
|
+
@extend %thredded--dropdown-menu--actions-bottom-left;
|
36
35
|
margin-top: -0.875rem;
|
37
|
-
right: 0;
|
38
|
-
background-color: $thredded-overlay-background-color;
|
39
|
-
border-radius: 2px;
|
40
|
-
overflow: hidden;
|
41
|
-
min-width: 10rem;
|
42
|
-
z-index: 1;
|
43
|
-
cursor: pointer;
|
44
|
-
box-shadow: $thredded-overlay-box-shadow;
|
45
|
-
transform: scale(0);
|
46
|
-
opacity: 0;
|
47
|
-
transform-origin: 100% 0;
|
48
|
-
transition: transform .3s cubic-bezier(.4, 0, .2, 1), opacity .2s cubic-bezier(.4, 0, .2, 1);
|
49
|
-
will-change: transform;
|
50
|
-
}
|
51
|
-
|
52
|
-
.thredded--post--dropdown--actions--item,
|
53
|
-
// This specific selector protects from global button rules
|
54
|
-
form.button_to > .thredded--post--dropdown--actions--item {
|
55
|
-
// Override potential global rules
|
56
|
-
background: none;
|
57
|
-
border-radius: 0;
|
58
|
-
border: 0;
|
59
|
-
box-sizing: border-box;
|
60
|
-
font: inherit;
|
61
|
-
margin: 0;
|
62
|
-
text-align: left;
|
63
|
-
transition: none;
|
64
|
-
width: 100%;
|
65
|
-
|
66
|
-
font-size: $thredded-font-size-small;
|
67
|
-
color: $thredded-text-color;
|
68
|
-
text-decoration: none;
|
69
|
-
padding: 1rem 0.75rem;
|
70
|
-
display: block;
|
71
|
-
white-space: nowrap;
|
72
|
-
|
73
|
-
&:active,
|
74
|
-
&:focus,
|
75
|
-
&:hover {
|
76
|
-
background-color: $thredded-button-background;
|
77
|
-
color: $thredded-button-color;
|
78
|
-
text-decoration: none;
|
79
|
-
cursor: pointer;
|
80
|
-
}
|
81
|
-
|
82
|
-
&:active,
|
83
|
-
&:focus {
|
84
|
-
outline: none;
|
85
|
-
}
|
86
|
-
}
|
87
|
-
|
88
|
-
.thredded--post--dropdown:hover .thredded--post--dropdown--actions {
|
89
|
-
transform: scale(1);
|
90
|
-
opacity: 1;
|
91
36
|
}
|
92
37
|
|
93
|
-
.thredded--post--dropdown
|
94
|
-
|
38
|
+
.thredded--post--dropdown--actions--item {
|
39
|
+
@extend %thredded--dropdown-menu--actions--item;
|
95
40
|
}
|
96
41
|
|
97
42
|
.thredded--post--avatar {
|
@@ -1,9 +1,10 @@
|
|
1
1
|
.thredded--navigation--search {
|
2
|
-
|
2
|
+
$input-padding-x: 0.75rem;
|
3
|
+
|
4
|
+
margin: 0;
|
3
5
|
padding: 0;
|
4
6
|
position: absolute;
|
5
7
|
top: 0;
|
6
|
-
right: 0;
|
7
8
|
|
8
9
|
@include thredded-media-tablet-and-down {
|
9
10
|
position: initial;
|
@@ -20,16 +21,15 @@
|
|
20
21
|
|
21
22
|
@include thredded-media-desktop-and-up {
|
22
23
|
$line-height: 1rem;
|
23
|
-
$padding-x: 0.75rem;
|
24
24
|
background: transparent;
|
25
25
|
border-color: transparent;
|
26
26
|
font-size: $thredded-font-size-small;
|
27
27
|
line-height: $line-height;
|
28
28
|
min-width: 13rem;
|
29
|
-
text-align: right;
|
30
29
|
width: auto;
|
31
|
-
padding: 0.9375rem
|
32
|
-
margin: -1px
|
30
|
+
padding: 0.9375rem $input-padding-x 0.875rem $input-padding-x;
|
31
|
+
margin-top: -1px;
|
32
|
+
margin-bottom: 0;
|
33
33
|
|
34
34
|
&, &:focus {
|
35
35
|
transition: background, border-color, box-shadow, min-width 0.15s ease-out 0s;
|
@@ -39,6 +39,7 @@
|
|
39
39
|
background: $thredded-background-color;
|
40
40
|
box-shadow: none;
|
41
41
|
margin-right: 0;
|
42
|
+
margin-left: 0;
|
42
43
|
min-width: 16rem;
|
43
44
|
text-align: left;
|
44
45
|
}
|
@@ -98,4 +99,28 @@
|
|
98
99
|
@media print {
|
99
100
|
display: none;
|
100
101
|
}
|
102
|
+
|
103
|
+
// On the left:
|
104
|
+
right: auto;
|
105
|
+
left: 0;
|
106
|
+
@include thredded-media-desktop-and-up {
|
107
|
+
input[type="search"] {
|
108
|
+
text-align: left;
|
109
|
+
margin-right: 0;
|
110
|
+
margin-left: -$input-padding-x;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
// On the right:
|
115
|
+
&--right {
|
116
|
+
right: 0;
|
117
|
+
left: auto;
|
118
|
+
@include thredded-media-desktop-and-up {
|
119
|
+
input[type="search"] {
|
120
|
+
text-align: right;
|
121
|
+
margin-right: -$input-padding-x;
|
122
|
+
margin-left: 0;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
101
126
|
}
|
@@ -60,6 +60,12 @@ module Thredded
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
# @param given [Hash]
|
64
|
+
# @return [Boolean] whether the given params are a subset of the controller's {#params}.
|
65
|
+
def params_match?(given = {})
|
66
|
+
given.all? { |k, v| v == params[k] }
|
67
|
+
end
|
68
|
+
|
63
69
|
private
|
64
70
|
|
65
71
|
def thredded_layout
|
@@ -19,6 +19,8 @@ module Thredded
|
|
19
19
|
|
20
20
|
def edit
|
21
21
|
authorize post, :update?
|
22
|
+
return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
|
23
|
+
render
|
22
24
|
end
|
23
25
|
|
24
26
|
def update
|
@@ -45,6 +47,10 @@ module Thredded
|
|
45
47
|
|
46
48
|
private
|
47
49
|
|
50
|
+
def canonical_topic_params
|
51
|
+
{ messageboard_id: messageboard.slug, topic_id: topic.slug }
|
52
|
+
end
|
53
|
+
|
48
54
|
def after_mark_as_unread
|
49
55
|
redirect_to messageboard_topics_path(messageboard)
|
50
56
|
end
|
@@ -19,6 +19,8 @@ module Thredded
|
|
19
19
|
|
20
20
|
def edit
|
21
21
|
authorize post, :update?
|
22
|
+
return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
|
23
|
+
render
|
22
24
|
end
|
23
25
|
|
24
26
|
def update
|
@@ -45,6 +47,10 @@ module Thredded
|
|
45
47
|
|
46
48
|
private
|
47
49
|
|
50
|
+
def canonical_topic_params
|
51
|
+
{ private_topic_id: topic.slug }
|
52
|
+
end
|
53
|
+
|
48
54
|
def after_mark_as_unread
|
49
55
|
redirect_to private_topics_path
|
50
56
|
end
|
@@ -22,6 +22,7 @@ module Thredded
|
|
22
22
|
|
23
23
|
def show
|
24
24
|
authorize private_topic, :read?
|
25
|
+
return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
|
25
26
|
|
26
27
|
page_scope = private_topic
|
27
28
|
.posts
|
@@ -55,6 +56,8 @@ module Thredded
|
|
55
56
|
|
56
57
|
def edit
|
57
58
|
authorize private_topic, :update?
|
59
|
+
return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
|
60
|
+
render
|
58
61
|
end
|
59
62
|
|
60
63
|
def update
|
@@ -69,6 +72,10 @@ module Thredded
|
|
69
72
|
|
70
73
|
private
|
71
74
|
|
75
|
+
def canonical_topic_params
|
76
|
+
{ id: private_topic.slug }
|
77
|
+
end
|
78
|
+
|
72
79
|
def current_page
|
73
80
|
(params[:page] || 1).to_i
|
74
81
|
end
|
@@ -12,6 +12,10 @@ module Thredded
|
|
12
12
|
|
13
13
|
def index
|
14
14
|
authorize_reading messageboard
|
15
|
+
unless params_match?(canonical_messageboard_params)
|
16
|
+
skip_policy_scope
|
17
|
+
return redirect_to(canonical_messageboard_params)
|
18
|
+
end
|
15
19
|
|
16
20
|
@topics = Thredded::TopicsPageView.new(
|
17
21
|
thredded_current_user,
|
@@ -26,6 +30,7 @@ module Thredded
|
|
26
30
|
|
27
31
|
def show
|
28
32
|
authorize topic, :read?
|
33
|
+
return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
|
29
34
|
page_scope = policy_scope(topic.posts)
|
30
35
|
.order_oldest_first
|
31
36
|
.includes(:user, :messageboard, :postable)
|
@@ -43,7 +48,13 @@ module Thredded
|
|
43
48
|
|
44
49
|
def search
|
45
50
|
in_messageboard = params.key?(:messageboard_id)
|
46
|
-
|
51
|
+
if in_messageboard
|
52
|
+
authorize_reading messageboard
|
53
|
+
unless params_match?(canonical_messageboard_params)
|
54
|
+
skip_policy_scope
|
55
|
+
return redirect_to(canonical_messageboard_params)
|
56
|
+
end
|
57
|
+
end
|
47
58
|
@query = params[:q].to_s
|
48
59
|
topics_scope = policy_scope(
|
49
60
|
if in_messageboard
|
@@ -65,6 +76,8 @@ module Thredded
|
|
65
76
|
def new
|
66
77
|
@new_topic = Thredded::TopicForm.new(new_topic_params)
|
67
78
|
authorize_creating @new_topic.topic
|
79
|
+
return redirect_to(canonical_messageboard_params) unless params_match?(canonical_messageboard_params)
|
80
|
+
render
|
68
81
|
end
|
69
82
|
|
70
83
|
def category
|
@@ -92,6 +105,7 @@ module Thredded
|
|
92
105
|
|
93
106
|
def edit
|
94
107
|
authorize topic, :update?
|
108
|
+
return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
|
95
109
|
@edit_topic = Thredded::EditTopicForm.new(user: thredded_current_user, topic: topic)
|
96
110
|
end
|
97
111
|
|
@@ -136,6 +150,14 @@ module Thredded
|
|
136
150
|
|
137
151
|
private
|
138
152
|
|
153
|
+
def canonical_messageboard_params
|
154
|
+
{ messageboard_id: messageboard.slug }
|
155
|
+
end
|
156
|
+
|
157
|
+
def canonical_topic_params
|
158
|
+
{ messageboard_id: messageboard.slug, id: topic.slug }
|
159
|
+
end
|
160
|
+
|
139
161
|
def follow_change_response(following:)
|
140
162
|
notice = following ? t('thredded.topics.followed_notice') : t('thredded.topics.unfollowed_notice')
|
141
163
|
respond_to do |format|
|
@@ -94,11 +94,14 @@ module Thredded
|
|
94
94
|
# @return [Thredded::AllViewHooks::ViewHook]
|
95
95
|
attr_reader :user_info
|
96
96
|
# @return [Thredded::AllViewHooks::ViewHook]
|
97
|
+
attr_reader :user_info_list_items
|
98
|
+
# @return [Thredded::AllViewHooks::ViewHook]
|
97
99
|
attr_reader :user_moderation_actions
|
98
100
|
|
99
101
|
def initialize
|
100
102
|
@user_title = ViewHook.new
|
101
103
|
@user_info = ViewHook.new
|
104
|
+
@user_info_list_items = ViewHook.new
|
102
105
|
@user_moderation_actions = ViewHook.new
|
103
106
|
end
|
104
107
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= form_tag users_moderation_path,
|
2
2
|
method: 'get',
|
3
|
-
class: 'thredded--form thredded--navigation--search',
|
3
|
+
class: 'thredded--form thredded--navigation--search thredded--navigation--search--right',
|
4
4
|
'data-thredded-turboform' => true do %>
|
5
5
|
<%= label_tag :q, t('thredded.moderation.search_users.form_label') %>
|
6
6
|
<%= text_field_tag :q, @query,
|
@@ -14,17 +14,19 @@
|
|
14
14
|
<% end %>
|
15
15
|
<%= view_hooks.moderation_user_page.user_info.render self, user: user do %>
|
16
16
|
<ul class="thredded--moderation--user--info">
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
17
|
+
<%= view_hooks.moderation_user_page.user_info_list_items.render self, user: user do %>
|
18
|
+
<li><%= t 'thredded.users.user_since_html', time_ago: time_ago(user.created_at) %></li>
|
19
|
+
<% if user_detail.last_seen_at %>
|
20
|
+
<li><%= t 'thredded.users.last_active_html', time_ago: time_ago(user_detail.last_seen_at) %></li>
|
21
|
+
<% end %>
|
22
|
+
<% if user_detail.topics_count > 0 %>
|
23
|
+
<li><%= t 'thredded.users.started_topics_count', count: user_detail.topics_count %></li>
|
24
|
+
<% end %>
|
25
|
+
<% if user_detail.posts_count > 0 %>
|
26
|
+
<li><%= t 'thredded.users.posts_count', count: user_detail.posts_count %></li>
|
27
|
+
<% end %>
|
28
|
+
<li><%= render 'user_moderation_state', user: @user %></li>
|
29
|
+
<% end %>
|
28
30
|
</ul>
|
29
31
|
<% end %>
|
30
32
|
<%= view_hooks.moderation_user_page.user_moderation_actions.render self, user: user do %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% current = current_page_preferences? %>
|
2
2
|
<li class="thredded--user-navigation--settings thredded--user-navigation--item<%= ' thredded--is-current' if current %>">
|
3
3
|
<%= link_to current ? (messageboard ? messageboard_topics_path(messageboard) : messageboards_path)
|
4
|
-
: edit_preferences_path(messageboard) do %>
|
4
|
+
: edit_preferences_path(messageboard), rel: 'nofollow' do %>
|
5
5
|
<%= inline_svg 'thredded/settings.svg', class: 'thredded--icon', title: t('thredded.nav.settings') %>
|
6
6
|
<span class="thredded--nav-text"><%= t('thredded.nav.settings') %></span>
|
7
7
|
<% end %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<li class="thredded--user-navigation--standalone thredded--user-navigation--item">
|
2
|
-
<% resource_name = Thredded.
|
2
|
+
<% resource_name = Thredded.user_class_name.underscore %>
|
3
3
|
<% if thredded_signed_in? %>
|
4
4
|
<%= link_to main_app.send(:"destroy_#{resource_name}_session_path"), method: :delete do %>
|
5
5
|
<span>Sign Out</span>
|
@@ -5,7 +5,16 @@
|
|
5
5
|
<%= thredded_page do %>
|
6
6
|
<% if @topics.present? %>
|
7
7
|
<p class="thredded--alert thredded--alert-success">
|
8
|
-
|
8
|
+
<% if messageboard_or_nil %>
|
9
|
+
<%= t 'thredded.topics.search.results_in_messageboard_message_html',
|
10
|
+
query: @query, messageboard: messageboard.name %>
|
11
|
+
<br>
|
12
|
+
<a href="<%= messageboards_search_path(q: @query) %>">
|
13
|
+
<%= t('thredded.topics.search.search_in_all_messageboards_btn') -%>
|
14
|
+
</a>
|
15
|
+
<% else %>
|
16
|
+
<%= t 'thredded.topics.search.results_message_html', query: @query %>
|
17
|
+
<% end %>
|
9
18
|
</p>
|
10
19
|
<section class="thredded--main-section thredded--topics">
|
11
20
|
<%= render @topics %>
|
@@ -15,7 +24,16 @@
|
|
15
24
|
</footer>
|
16
25
|
<% else %>
|
17
26
|
<p class="thredded--alert thredded--alert-danger">
|
18
|
-
|
27
|
+
<% if messageboard_or_nil %>
|
28
|
+
<%= t 'thredded.topics.search.no_results_in_messageboard_message_html',
|
29
|
+
query: @query, messageboard: messageboard.name -%>
|
30
|
+
<br>
|
31
|
+
<a href="<%= messageboards_search_path(q: @query) %>">
|
32
|
+
<%= t('thredded.topics.search.search_in_all_messageboards_btn') -%>
|
33
|
+
</a>
|
34
|
+
<% else %>
|
35
|
+
<%= t 'thredded.topics.search.no_results_message_html', query: @query %>
|
36
|
+
<% end %>
|
19
37
|
</p>
|
20
38
|
<% end %>
|
21
39
|
<% end %>
|
data/config/locales/en.yml
CHANGED
@@ -172,9 +172,12 @@ en:
|
|
172
172
|
mark_as_unread: Mark unread from here
|
173
173
|
not_following: You are not following this topic.
|
174
174
|
search:
|
175
|
-
|
175
|
+
no_results_in_messageboard_message_html: There are no results for your search <q>%{query}</q> in %{messageboard}
|
176
|
+
no_results_message_html: There are no results for your search <q>%{query}</q>
|
176
177
|
page_title: Topics Search Results
|
177
|
-
|
178
|
+
results_in_messageboard_message_html: Search results for <q>%{query}</q> in %{messageboard}
|
179
|
+
results_message_html: Search results for <q>%{query}</q>
|
180
|
+
search_in_all_messageboards_btn: Search everywhere
|
178
181
|
started_by_html: Started %{time_ago} by %{user}
|
179
182
|
sticky:
|
180
183
|
label: Sticky
|
data/config/locales/es.yml
CHANGED
@@ -27,7 +27,7 @@ es:
|
|
27
27
|
update_btn_submitting: :thredded.form.update_btn_submitting
|
28
28
|
index:
|
29
29
|
page_title: Foros
|
30
|
-
last_updated_by_html: Actualizado
|
30
|
+
last_updated_by_html: Actualizado %{time_ago} <cite>por %{user}</cite>
|
31
31
|
topics_and_posts_counts: "%{topics_count} temas / %{posts_count} mensajes"
|
32
32
|
update: :thredded.form.update
|
33
33
|
updated_notice: Foro actualizado
|
@@ -174,9 +174,12 @@ es:
|
|
174
174
|
mark_as_unread: Marcar sin leer desde aquí
|
175
175
|
not_following: No estás siguiendo este tema.
|
176
176
|
search:
|
177
|
-
|
177
|
+
no_results_in_messageboard_message_html: No hay resultados para tu búsqueda <q>%{query}</q> en %{messageboard}
|
178
|
+
no_results_message_html: No hay resultados para tu búsqueda - <q>%{query}</q>
|
178
179
|
page_title: Temas encontrados
|
179
|
-
|
180
|
+
results_in_messageboard_message_html: Resultados de la búsqueda para <q>%{query}</q> en %{messageboard}
|
181
|
+
results_message_html: Resultados de búsqueda para <q>%{query}</q>
|
182
|
+
search_in_all_messageboards_btn: Buscar en todas partes
|
180
183
|
started_by_html: Empezado hace %{time_ago} por %{user}
|
181
184
|
sticky:
|
182
185
|
label: Fijado
|
data/config/locales/pl.yml
CHANGED
@@ -172,9 +172,12 @@ pl:
|
|
172
172
|
mark_as_unread: Oznacz jako nieprzeczytane stąd
|
173
173
|
not_following: Nie obserwujesz tego tematu.
|
174
174
|
search:
|
175
|
-
|
175
|
+
no_results_in_messageboard_message_html: Nie odnaleziono żadnych wyników dla frazy <q>%{query}</q> w %{messageboard}
|
176
|
+
no_results_message_html: 'Nie odnaleziono żadnych wyników dla frazy: <q>%{query}</q>'
|
176
177
|
page_title: Wyniki wyszukiwania
|
177
|
-
|
178
|
+
results_in_messageboard_message_html: Wyniki wyszukiwania dla <q>%{query}</q> w %{messageboard}
|
179
|
+
results_message_html: 'Wyniki wyszukiwania dla: <q>%{query}</q>'
|
180
|
+
search_in_all_messageboards_btn: Szukaj wszędzie
|
178
181
|
started_by_html: Rozpoczęty %{time_ago} przez %{user}
|
179
182
|
sticky:
|
180
183
|
label: Przyklejony
|
data/config/locales/pt-BR.yml
CHANGED
@@ -175,9 +175,12 @@ pt-BR:
|
|
175
175
|
mark_as_unread: Marca não lida a partir daqui
|
176
176
|
not_following: Você não está seguindo este tema.
|
177
177
|
search:
|
178
|
-
|
178
|
+
no_results_in_messageboard_message_html: Não há resultados para sua busca <q>%{query}</q> em %{messageboard}
|
179
|
+
no_results_message_html: Nenhum resultado encontrado para sua busca <q>%{query}</q>
|
179
180
|
page_title: Tópicos dos Resultados da Busca
|
180
|
-
|
181
|
+
results_in_messageboard_message_html: Resultados da pesquisa para <q>%{query}</q> em %{messageboard}
|
182
|
+
results_message_html: Resultados de busca para <q>%{query}</q>
|
183
|
+
search_in_all_messageboards_btn: Buscar em todos os lugares
|
181
184
|
started_by_html: Iniciado %{time_ago} por %{user}
|
182
185
|
sticky:
|
183
186
|
label: Pegajoso
|
data/config/locales/ru.yml
CHANGED
@@ -171,9 +171,12 @@ ru:
|
|
171
171
|
mark_as_unread: Пометить как непрочитанное
|
172
172
|
not_following: не отслеживаю
|
173
173
|
search:
|
174
|
-
|
175
|
-
|
176
|
-
|
174
|
+
no_results_in_messageboard_message_html: Не найдо результатов по запросу <q>%{query}</q> в %{messageboard}
|
175
|
+
no_results_message_html: Не найдо результатов по запросу <q>%{query}</q>
|
176
|
+
page_title: Результаты поиска
|
177
|
+
results_in_messageboard_message_html: Результаты поиска для <q>%{query}</q> в %{messageboard}
|
178
|
+
results_message_html: Результаты поиска для <q>%{query}</q>
|
179
|
+
search_in_all_messageboards_btn: Искать везде
|
177
180
|
started_by_html: Начат %{user} %{time_ago}
|
178
181
|
sticky:
|
179
182
|
label: Закрепить
|
@@ -7,7 +7,7 @@
|
|
7
7
|
# for your user class - change it here.
|
8
8
|
Thredded.user_class = 'User'
|
9
9
|
|
10
|
-
# User name column, used in @mention syntax and
|
10
|
+
# User name column, used in @mention syntax and *must* be unique.
|
11
11
|
# This is the column used to search for users' names if/when someone is @ mentioned.
|
12
12
|
Thredded.user_name_column = :name
|
13
13
|
|
@@ -19,12 +19,12 @@ Thredded.user_name_column = :name
|
|
19
19
|
# When linking to a user, Thredded will use this lambda to spit out
|
20
20
|
# the path or url to your user. This lambda is evaluated in the view context.
|
21
21
|
Thredded.user_path = lambda do |user|
|
22
|
-
user_path = :"#{Thredded.
|
22
|
+
user_path = :"#{Thredded.user_class_name.underscore}_path"
|
23
23
|
main_app.respond_to?(user_path) ? main_app.send(user_path, user) : "/users/#{user.to_param}"
|
24
24
|
end
|
25
25
|
|
26
26
|
# This method is used by Thredded controllers and views to fetch the currently signed-in user
|
27
|
-
Thredded.current_user_method = :"current_#{Thredded.
|
27
|
+
Thredded.current_user_method = :"current_#{Thredded.user_class_name.underscore}"
|
28
28
|
|
29
29
|
# User avatar URL. rb-gravatar gem is used by default:
|
30
30
|
Thredded.avatar_url = ->(user) { Gravatar.src(user.email, 128, 'mm') }
|
@@ -83,7 +83,7 @@ Thredded.layout = 'thredded/application'
|
|
83
83
|
# Thredded.slugifier = ->(input) { input.parameterize }
|
84
84
|
|
85
85
|
# If your forum is in a language other than English, you might want to use the babosa gem instead
|
86
|
-
# Thredded.slugifier = ->(input) { Babosa::Identifier.new(input).normalize.to_s }
|
86
|
+
# Thredded.slugifier = ->(input) { Babosa::Identifier.new(input).normalize.transliterate(:russian).to_s }
|
87
87
|
|
88
88
|
# ==> Post Content Formatting
|
89
89
|
# Customize the way Thredded handles post formatting.
|
data/lib/thredded.rb
CHANGED
@@ -52,7 +52,6 @@ module Thredded
|
|
52
52
|
:layout,
|
53
53
|
:messageboards_order,
|
54
54
|
:routes_id_constraint,
|
55
|
-
:user_class,
|
56
55
|
:user_display_name_method,
|
57
56
|
:user_name_column,
|
58
57
|
:user_path
|
@@ -94,6 +93,9 @@ module Thredded
|
|
94
93
|
mattr_accessor :auto_follow_when_posting_in_topic
|
95
94
|
self.auto_follow_when_posting_in_topic = true
|
96
95
|
|
96
|
+
# @return [String] The name of the user class
|
97
|
+
mattr_reader :user_class_name
|
98
|
+
|
97
99
|
self.active_user_threshold = 5.minutes
|
98
100
|
self.admin_column = :admin
|
99
101
|
self.avatar_url = ->(user) { Gravatar.src(user.email, 128, 'mm') }
|
@@ -138,17 +140,19 @@ module Thredded
|
|
138
140
|
end
|
139
141
|
end
|
140
142
|
|
143
|
+
# @param user_class_name [String]
|
144
|
+
def self.user_class=(user_class_name)
|
145
|
+
unless user_class_name.is_a?(String)
|
146
|
+
fail "Thredded.user_class must be set to a String, got #{user_class_name.inspect}"
|
147
|
+
end
|
148
|
+
@@user_class_name = user_class_name # rubocop:disable Style/ClassVars
|
149
|
+
end
|
150
|
+
|
141
151
|
# @return [Class<Thredded::UserExtender>] the user class from the host application.
|
142
152
|
def self.user_class
|
143
153
|
# This is nil before the initializer is installed.
|
144
|
-
return nil if @@
|
145
|
-
|
146
|
-
fail "user_class must be a String, got #{@@user_class.inspect}" unless @@user_class.is_a?(String)
|
147
|
-
begin
|
148
|
-
Object.const_get(@@user_class)
|
149
|
-
rescue NameError
|
150
|
-
@@user_class.constantize
|
151
|
-
end
|
154
|
+
return nil if @@user_class_name.nil?
|
155
|
+
@@user_class_name.constantize
|
152
156
|
end
|
153
157
|
|
154
158
|
# @param view_context [Object] context to execute the lambda in.
|
@@ -6,7 +6,7 @@ module Thredded
|
|
6
6
|
mattr_accessor :whitelist
|
7
7
|
|
8
8
|
self.whitelist = HTML::Pipeline::SanitizationFilter::WHITELIST.deep_merge(
|
9
|
-
elements: HTML::Pipeline::SanitizationFilter::WHITELIST[:elements] + %w(iframe span figure figcaption),
|
9
|
+
elements: HTML::Pipeline::SanitizationFilter::WHITELIST[:elements] + %w(abbr iframe span figure figcaption),
|
10
10
|
transformers: HTML::Pipeline::SanitizationFilter::WHITELIST[:transformers] + [
|
11
11
|
lambda do |env|
|
12
12
|
next unless env[:node_name] == 'a'
|
@@ -20,8 +20,11 @@ module Thredded
|
|
20
20
|
],
|
21
21
|
attributes: {
|
22
22
|
'a' => %w(href rel),
|
23
|
+
'abbr' => %w(title),
|
23
24
|
'span' => %w(class),
|
24
|
-
'div' => %w(class)
|
25
|
+
'div' => %w(class),
|
26
|
+
:all => HTML::Pipeline::SanitizationFilter::WHITELIST[:attributes][:all] +
|
27
|
+
%w(aria-label aria-labelledby aria-hidden),
|
25
28
|
}
|
26
29
|
)
|
27
30
|
|
@@ -89,7 +92,7 @@ module Thredded
|
|
89
92
|
# @param content [String]
|
90
93
|
# @return [String] formatted and sanitized html-safe content.
|
91
94
|
def format_content(content)
|
92
|
-
pipeline = HTML::Pipeline.new(content_pipeline_filters, content_pipeline_options.
|
95
|
+
pipeline = HTML::Pipeline.new(content_pipeline_filters, content_pipeline_options.deep_merge(@pipeline_options))
|
93
96
|
result = pipeline.call(content, view_context: @view_context)
|
94
97
|
# rubocop:disable Rails/OutputSafety
|
95
98
|
result[:output].to_s.html_safe
|
@@ -29,7 +29,7 @@ module Thredded
|
|
29
29
|
# Convert Markdown to HTML using the best available implementation
|
30
30
|
# and convert into a DocumentFragment.
|
31
31
|
def call
|
32
|
-
result = Kramdown::Document.new(@text, self.class.options).to_html
|
32
|
+
result = Kramdown::Document.new(@text, self.class.options.deep_merge(context[:kramdown_options] || {})).to_html
|
33
33
|
result.rstrip!
|
34
34
|
result
|
35
35
|
end
|
data/lib/thredded/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thredded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Oliveira
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-04-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pundit
|
@@ -493,6 +493,20 @@ dependencies:
|
|
493
493
|
- - ">="
|
494
494
|
- !ruby/object:Gem::Version
|
495
495
|
version: '0'
|
496
|
+
- !ruby/object:Gem::Dependency
|
497
|
+
name: kaminari-i18n
|
498
|
+
requirement: !ruby/object:Gem::Requirement
|
499
|
+
requirements:
|
500
|
+
- - ">="
|
501
|
+
- !ruby/object:Gem::Version
|
502
|
+
version: '0'
|
503
|
+
type: :development
|
504
|
+
prerelease: false
|
505
|
+
version_requirements: !ruby/object:Gem::Requirement
|
506
|
+
requirements:
|
507
|
+
- - ">="
|
508
|
+
- !ruby/object:Gem::Version
|
509
|
+
version: '0'
|
496
510
|
- !ruby/object:Gem::Dependency
|
497
511
|
name: http_accept_language
|
498
512
|
requirement: !ruby/object:Gem::Requirement
|
@@ -732,6 +746,7 @@ files:
|
|
732
746
|
- app/assets/stylesheets/thredded/_thredded.scss
|
733
747
|
- app/assets/stylesheets/thredded/base/_alerts.scss
|
734
748
|
- app/assets/stylesheets/thredded/base/_buttons.scss
|
749
|
+
- app/assets/stylesheets/thredded/base/_dropdown-menu.scss
|
735
750
|
- app/assets/stylesheets/thredded/base/_forms.scss
|
736
751
|
- app/assets/stylesheets/thredded/base/_grid.scss
|
737
752
|
- app/assets/stylesheets/thredded/base/_lists.scss
|
@@ -1044,7 +1059,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1044
1059
|
version: '0'
|
1045
1060
|
requirements: []
|
1046
1061
|
rubyforge_project:
|
1047
|
-
rubygems_version: 2.6.
|
1062
|
+
rubygems_version: 2.6.11
|
1048
1063
|
signing_key:
|
1049
1064
|
specification_version: 4
|
1050
1065
|
summary: The best Rails forums engine ever.
|