thredded 0.11.1 → 0.12.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -5
  3. data/app/assets/javascripts/thredded/components/post_form.es6 +4 -4
  4. data/app/assets/javascripts/thredded/components/quote_post.es6 +45 -0
  5. data/app/assets/javascripts/thredded/components/topic_form.es6 +4 -4
  6. data/app/assets/javascripts/thredded/core/on_page_load.es6 +8 -0
  7. data/app/assets/javascripts/thredded/dependencies.js +1 -1
  8. data/app/assets/stylesheets/thredded/_email.scss +2 -3
  9. data/app/assets/stylesheets/thredded/components/_preferences.scss +17 -4
  10. data/app/controllers/concerns/thredded/new_post_params.rb +20 -0
  11. data/app/controllers/concerns/thredded/new_private_post_params.rb +20 -0
  12. data/app/controllers/thredded/posts_controller.rb +22 -13
  13. data/app/controllers/thredded/preferences_controller.rb +1 -0
  14. data/app/controllers/thredded/private_posts_controller.rb +24 -12
  15. data/app/controllers/thredded/private_topics_controller.rb +4 -1
  16. data/app/controllers/thredded/theme_previews_controller.rb +4 -2
  17. data/app/controllers/thredded/topics_controller.rb +13 -2
  18. data/app/forms/thredded/post_form.rb +52 -0
  19. data/app/forms/thredded/private_post_form.rb +48 -0
  20. data/app/forms/thredded/private_topic_form.rb +8 -0
  21. data/app/forms/thredded/topic_form.rb +8 -0
  22. data/app/forms/thredded/user_preferences_form.rb +7 -1
  23. data/app/helpers/thredded/urls_helper.rb +18 -0
  24. data/app/models/thredded/topic.rb +3 -3
  25. data/app/policies/thredded/private_topic_policy.rb +1 -1
  26. data/app/view_models/thredded/messageboard_group_view.rb +1 -1
  27. data/app/view_models/thredded/post_view.rb +19 -3
  28. data/app/view_models/thredded/private_topic_view.rb +0 -4
  29. data/app/view_models/thredded/topic_view.rb +0 -4
  30. data/app/views/thredded/posts/_form.html.erb +0 -2
  31. data/app/views/thredded/posts/edit.html.erb +2 -5
  32. data/app/views/thredded/posts/new.html.erb +15 -0
  33. data/app/views/thredded/posts_common/_actions.html.erb +3 -0
  34. data/app/views/thredded/posts_common/_form.html.erb +5 -3
  35. data/app/views/thredded/posts_common/_header.html.erb +3 -1
  36. data/app/views/thredded/posts_common/actions/_quote.html.erb +4 -0
  37. data/app/views/thredded/preferences/_form.html.erb +3 -5
  38. data/app/views/thredded/preferences/_messageboards_nav.html.erb +8 -0
  39. data/app/views/thredded/preferences/_messageboards_nav_item.html.erb +2 -0
  40. data/app/views/thredded/preferences/edit.html.erb +13 -3
  41. data/app/views/thredded/private_posts/_form.html.erb +0 -2
  42. data/app/views/thredded/private_posts/edit.html.erb +2 -4
  43. data/app/views/thredded/private_posts/new.html.erb +11 -0
  44. data/app/views/thredded/private_topics/_form.html.erb +2 -2
  45. data/app/views/thredded/private_topics/index.html.erb +1 -2
  46. data/app/views/thredded/private_topics/new.html.erb +0 -1
  47. data/app/views/thredded/private_topics/show.html.erb +5 -3
  48. data/app/views/thredded/shared/_nav.html.erb +1 -7
  49. data/app/views/thredded/shared/nav/_standalone.html.erb +3 -3
  50. data/app/views/thredded/shared/nav/_standalone_profile.html.erb +3 -0
  51. data/app/views/thredded/theme_previews/show.html.erb +3 -17
  52. data/app/views/thredded/topics/_form.html.erb +3 -2
  53. data/app/views/thredded/topics/index.html.erb +0 -2
  54. data/app/views/thredded/topics/new.html.erb +0 -2
  55. data/app/views/thredded/topics/show.html.erb +1 -3
  56. data/config/locales/en.yml +4 -3
  57. data/config/locales/es.yml +4 -3
  58. data/config/locales/pl.yml +4 -3
  59. data/config/locales/pt-BR.yml +4 -3
  60. data/config/locales/ru.yml +12 -7
  61. data/config/routes.rb +2 -0
  62. data/db/migrate/20160329231848_create_thredded.rb +1 -1
  63. data/db/upgrade_migrations/20170420163138_upgrade_thredded_v0_11_to_v0_12.rb +25 -0
  64. data/lib/thredded.rb +0 -1
  65. data/lib/thredded/content_formatter.rb +11 -0
  66. data/lib/thredded/version.rb +1 -1
  67. data/vendor/assets/javascripts/autosize.js +290 -0
  68. metadata +15 -17
  69. data/app/views/thredded/preferences/_header.html.erb +0 -1
data/config/routes.rb CHANGED
@@ -17,6 +17,7 @@ Thredded::Engine.routes.draw do # rubocop:disable Metrics/BlockLength
17
17
  post :preview, on: :new, controller: 'private_post_previews'
18
18
  resource :preview, only: [:update], controller: 'private_post_previews'
19
19
  member do
20
+ get 'quote'
20
21
  post 'mark_as_unread'
21
22
  end
22
23
  end
@@ -74,6 +75,7 @@ Thredded::Engine.routes.draw do # rubocop:disable Metrics/BlockLength
74
75
  post :preview, on: :new, controller: 'post_previews'
75
76
  resource :preview, only: [:update], controller: 'post_previews'
76
77
  member do
78
+ get 'quote'
77
79
  post 'mark_as_unread'
78
80
  end
79
81
  end
@@ -118,7 +118,7 @@ class CreateThredded < ActiveRecord::Migration
118
118
  order: { sticky: :desc, updated_at: :desc },
119
119
  name: :index_thredded_topics_for_display
120
120
  t.index [:hash_id], name: :index_thredded_topics_on_hash_id
121
- t.index [:messageboard_id, :slug], name: :index_thredded_topics_on_messageboard_id_and_slug, unique: true
121
+ t.index [:slug], name: :index_thredded_topics_on_slug, unique: true
122
122
  t.index [:messageboard_id], name: :index_thredded_topics_on_messageboard_id
123
123
  t.index [:user_id], name: :index_thredded_topics_on_user_id
124
124
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ class UpgradeThreddedV011ToV012 < ActiveRecord::Migration
3
+ def up
4
+ FriendlyId::Slug.transaction do
5
+ FriendlyId::Slug.where(sluggable_type: 'Thredded::Topic').where(
6
+ slug: FriendlyId::Slug.group(:slug).having('count(id) > 1').select(:slug)
7
+ ).group_by(&:slug).each_value do |slugs|
8
+ slugs.from(1).each(&:delete)
9
+ end
10
+ FriendlyId::Slug.where(sluggable_type: 'Thredded::Topic')
11
+ .update_all(scope: nil)
12
+ end
13
+ Thredded::Topic.all.find_each do |topic|
14
+ # re-generate the slug
15
+ topic.title_will_change!
16
+ topic.save!
17
+ end
18
+ remove_index :thredded_topics, name: :index_thredded_topics_on_messageboard_id_and_slug
19
+ add_index :thredded_topics, [:slug], name: :index_thredded_topics_on_slug, unique: true
20
+ end
21
+
22
+ def down
23
+ fail ActiveRecord::MigrationError::IrreversibleMigration
24
+ end
25
+ end
data/lib/thredded.rb CHANGED
@@ -23,7 +23,6 @@ require 'thredded/html_pipeline/wrap_iframes_filter'
23
23
 
24
24
  # Asset compilation
25
25
  require 'autoprefixer-rails'
26
- require 'autosize/rails'
27
26
  require 'jquery/rails'
28
27
  require 'rails-timeago'
29
28
  require 'select2-rails'
@@ -99,6 +99,17 @@ module Thredded
99
99
  # rubocop:enable Rails/OutputSafety
100
100
  end
101
101
 
102
+ # @param content [String]
103
+ # @return [String] a quote containing the formatted content
104
+ def self.quote_content(content)
105
+ result = String.new(content)
106
+ result.gsub!(/^(?!$)/, '> ')
107
+ result.gsub!(/^$/, '>')
108
+ result << "\n" unless result.end_with?("\n")
109
+ result << "\n"
110
+ result
111
+ end
112
+
102
113
  protected
103
114
 
104
115
  # @return [Array<HTML::Pipeline::Filter]>]
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Thredded
3
- VERSION = '0.11.1'
3
+ VERSION = '0.12.0'
4
4
  end
@@ -0,0 +1,290 @@
1
+ /*!
2
+ Autosize 3.0.20
3
+ license: MIT
4
+ http://www.jacklmoore.com/autosize
5
+ */
6
+ (function (global, factory) {
7
+ if (typeof define === 'function' && define.amd) {
8
+ define(['exports', 'module'], factory);
9
+ } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
10
+ factory(exports, module);
11
+ } else {
12
+ var mod = {
13
+ exports: {}
14
+ };
15
+ factory(mod.exports, mod);
16
+ global.autosize = mod.exports;
17
+ }
18
+ })(this, function (exports, module) {
19
+ 'use strict';
20
+
21
+ var map = typeof Map === "function" ? new Map() : (function () {
22
+ var keys = [];
23
+ var values = [];
24
+
25
+ return {
26
+ has: function has(key) {
27
+ return keys.indexOf(key) > -1;
28
+ },
29
+ get: function get(key) {
30
+ return values[keys.indexOf(key)];
31
+ },
32
+ set: function set(key, value) {
33
+ if (keys.indexOf(key) === -1) {
34
+ keys.push(key);
35
+ values.push(value);
36
+ }
37
+ },
38
+ 'delete': function _delete(key) {
39
+ var index = keys.indexOf(key);
40
+ if (index > -1) {
41
+ keys.splice(index, 1);
42
+ values.splice(index, 1);
43
+ }
44
+ }
45
+ };
46
+ })();
47
+
48
+ var createEvent = function createEvent(name) {
49
+ return new Event(name, { bubbles: true });
50
+ };
51
+ try {
52
+ new Event('test');
53
+ } catch (e) {
54
+ // IE does not support `new Event()`
55
+ createEvent = function (name) {
56
+ var evt = document.createEvent('Event');
57
+ evt.initEvent(name, true, false);
58
+ return evt;
59
+ };
60
+ }
61
+
62
+ function assign(ta) {
63
+ if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return;
64
+
65
+ var heightOffset = null;
66
+ var clientWidth = ta.clientWidth;
67
+ var cachedHeight = null;
68
+
69
+ function init() {
70
+ var style = window.getComputedStyle(ta, null);
71
+
72
+ if (style.resize === 'vertical') {
73
+ ta.style.resize = 'none';
74
+ } else if (style.resize === 'both') {
75
+ ta.style.resize = 'horizontal';
76
+ }
77
+
78
+ if (style.boxSizing === 'content-box') {
79
+ heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));
80
+ } else {
81
+ heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);
82
+ }
83
+ // Fix when a textarea is not on document body and heightOffset is Not a Number
84
+ if (isNaN(heightOffset)) {
85
+ heightOffset = 0;
86
+ }
87
+
88
+ update();
89
+ }
90
+
91
+ function changeOverflow(value) {
92
+ {
93
+ // Chrome/Safari-specific fix:
94
+ // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space
95
+ // made available by removing the scrollbar. The following forces the necessary text reflow.
96
+ var width = ta.style.width;
97
+ ta.style.width = '0px';
98
+ // Force reflow:
99
+ /* jshint ignore:start */
100
+ ta.offsetWidth;
101
+ /* jshint ignore:end */
102
+ ta.style.width = width;
103
+ }
104
+
105
+ ta.style.overflowY = value;
106
+ }
107
+
108
+ function getParentOverflows(el) {
109
+ var arr = [];
110
+
111
+ while (el && el.parentNode && el.parentNode instanceof Element) {
112
+ if (el.parentNode.scrollTop) {
113
+ arr.push({
114
+ node: el.parentNode,
115
+ scrollTop: el.parentNode.scrollTop
116
+ });
117
+ }
118
+ el = el.parentNode;
119
+ }
120
+
121
+ return arr;
122
+ }
123
+
124
+ function resize() {
125
+ var originalHeight = ta.style.height;
126
+ var overflows = getParentOverflows(ta);
127
+ var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240)
128
+
129
+ ta.style.height = 'auto';
130
+
131
+ var endHeight = ta.scrollHeight + heightOffset;
132
+
133
+ if (ta.scrollHeight === 0) {
134
+ // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.
135
+ ta.style.height = originalHeight;
136
+ return;
137
+ }
138
+
139
+ ta.style.height = endHeight + 'px';
140
+
141
+ // used to check if an update is actually necessary on window.resize
142
+ clientWidth = ta.clientWidth;
143
+
144
+ // prevents scroll-position jumping
145
+ overflows.forEach(function (el) {
146
+ el.node.scrollTop = el.scrollTop;
147
+ });
148
+
149
+ if (docTop) {
150
+ document.documentElement.scrollTop = docTop;
151
+ }
152
+ }
153
+
154
+ function update() {
155
+ resize();
156
+
157
+ var styleHeight = Math.round(parseFloat(ta.style.height));
158
+ var computed = window.getComputedStyle(ta, null);
159
+ var actualHeight = Math.round(parseFloat(computed.height));
160
+
161
+ // The actual height not matching the style height (set via the resize method) indicates that
162
+ // the max-height has been exceeded, in which case the overflow should be set to visible.
163
+ if (actualHeight !== styleHeight) {
164
+ if (computed.overflowY !== 'visible') {
165
+ changeOverflow('visible');
166
+ resize();
167
+ actualHeight = Math.round(parseFloat(window.getComputedStyle(ta, null).height));
168
+ }
169
+ } else {
170
+ // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands.
171
+ if (computed.overflowY !== 'hidden') {
172
+ changeOverflow('hidden');
173
+ resize();
174
+ actualHeight = Math.round(parseFloat(window.getComputedStyle(ta, null).height));
175
+ }
176
+ }
177
+
178
+ if (cachedHeight !== actualHeight) {
179
+ cachedHeight = actualHeight;
180
+ var evt = createEvent('autosize:resized');
181
+ try {
182
+ ta.dispatchEvent(evt);
183
+ } catch (err) {
184
+ // Firefox will throw an error on dispatchEvent for a detached element
185
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=889376
186
+ }
187
+ }
188
+ }
189
+
190
+ var pageResize = function pageResize() {
191
+ if (ta.clientWidth !== clientWidth) {
192
+ update();
193
+ }
194
+ };
195
+
196
+ var destroy = (function (style) {
197
+ window.removeEventListener('resize', pageResize, false);
198
+ ta.removeEventListener('input', update, false);
199
+ ta.removeEventListener('keyup', update, false);
200
+ ta.removeEventListener('autosize:destroy', destroy, false);
201
+ ta.removeEventListener('autosize:update', update, false);
202
+
203
+ Object.keys(style).forEach(function (key) {
204
+ ta.style[key] = style[key];
205
+ });
206
+
207
+ map['delete'](ta);
208
+ }).bind(ta, {
209
+ height: ta.style.height,
210
+ resize: ta.style.resize,
211
+ overflowY: ta.style.overflowY,
212
+ overflowX: ta.style.overflowX,
213
+ wordWrap: ta.style.wordWrap
214
+ });
215
+
216
+ ta.addEventListener('autosize:destroy', destroy, false);
217
+
218
+ // IE9 does not fire onpropertychange or oninput for deletions,
219
+ // so binding to onkeyup to catch most of those events.
220
+ // There is no way that I know of to detect something like 'cut' in IE9.
221
+ if ('onpropertychange' in ta && 'oninput' in ta) {
222
+ ta.addEventListener('keyup', update, false);
223
+ }
224
+
225
+ window.addEventListener('resize', pageResize, false);
226
+ ta.addEventListener('input', update, false);
227
+ ta.addEventListener('autosize:update', update, false);
228
+ ta.style.overflowX = 'hidden';
229
+ ta.style.wordWrap = 'break-word';
230
+
231
+ map.set(ta, {
232
+ destroy: destroy,
233
+ update: update
234
+ });
235
+
236
+ init();
237
+ }
238
+
239
+ function destroy(ta) {
240
+ var methods = map.get(ta);
241
+ if (methods) {
242
+ methods.destroy();
243
+ }
244
+ }
245
+
246
+ function update(ta) {
247
+ var methods = map.get(ta);
248
+ if (methods) {
249
+ methods.update();
250
+ }
251
+ }
252
+
253
+ var autosize = null;
254
+
255
+ // Do nothing in Node.js environment and IE8 (or lower)
256
+ if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {
257
+ autosize = function (el) {
258
+ return el;
259
+ };
260
+ autosize.destroy = function (el) {
261
+ return el;
262
+ };
263
+ autosize.update = function (el) {
264
+ return el;
265
+ };
266
+ } else {
267
+ autosize = function (el, options) {
268
+ if (el) {
269
+ Array.prototype.forEach.call(el.length ? el : [el], function (x) {
270
+ return assign(x, options);
271
+ });
272
+ }
273
+ return el;
274
+ };
275
+ autosize.destroy = function (el) {
276
+ if (el) {
277
+ Array.prototype.forEach.call(el.length ? el : [el], destroy);
278
+ }
279
+ return el;
280
+ };
281
+ autosize.update = function (el) {
282
+ if (el) {
283
+ Array.prototype.forEach.call(el.length ? el : [el], update);
284
+ }
285
+ return el;
286
+ };
287
+ }
288
+
289
+ module.exports = autosize;
290
+ });
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.1
4
+ version: 0.12.0
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-04-20 00:00:00.000000000 Z
12
+ date: 2017-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pundit
@@ -297,20 +297,6 @@ dependencies:
297
297
  - - "~>"
298
298
  - !ruby/object:Gem::Version
299
299
  version: '3.5'
300
- - !ruby/object:Gem::Dependency
301
- name: autosize-rails
302
- requirement: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - ">="
305
- - !ruby/object:Gem::Version
306
- version: '0'
307
- type: :runtime
308
- prerelease: false
309
- version_requirements: !ruby/object:Gem::Requirement
310
- requirements:
311
- - - ">="
312
- - !ruby/object:Gem::Version
313
- version: '0'
314
300
  - !ruby/object:Gem::Dependency
315
301
  name: sprockets-es6
316
302
  requirement: !ruby/object:Gem::Requirement
@@ -725,6 +711,7 @@ files:
725
711
  - app/assets/javascripts/thredded/components/flash_messages.es6
726
712
  - app/assets/javascripts/thredded/components/post_form.es6
727
713
  - app/assets/javascripts/thredded/components/preview_area.es6
714
+ - app/assets/javascripts/thredded/components/quote_post.es6
728
715
  - app/assets/javascripts/thredded/components/time_stamps.es6
729
716
  - app/assets/javascripts/thredded/components/topic_form.es6
730
717
  - app/assets/javascripts/thredded/components/topics.es6
@@ -791,6 +778,8 @@ files:
791
778
  - app/commands/thredded/moderate_post.rb
792
779
  - app/commands/thredded/notify_following_users.rb
793
780
  - app/commands/thredded/notify_private_topic_users.rb
781
+ - app/controllers/concerns/thredded/new_post_params.rb
782
+ - app/controllers/concerns/thredded/new_private_post_params.rb
794
783
  - app/controllers/concerns/thredded/new_private_topic_params.rb
795
784
  - app/controllers/concerns/thredded/new_topic_params.rb
796
785
  - app/controllers/concerns/thredded/render_preview.rb
@@ -813,6 +802,8 @@ files:
813
802
  - app/controllers/thredded/topic_previews_controller.rb
814
803
  - app/controllers/thredded/topics_controller.rb
815
804
  - app/forms/thredded/edit_topic_form.rb
805
+ - app/forms/thredded/post_form.rb
806
+ - app/forms/thredded/private_post_form.rb
816
807
  - app/forms/thredded/private_topic_form.rb
817
808
  - app/forms/thredded/topic_form.rb
818
809
  - app/forms/thredded/user_preferences_form.rb
@@ -928,6 +919,7 @@ files:
928
919
  - app/views/thredded/posts/_post.html.erb
929
920
  - app/views/thredded/posts/_user.html.erb
930
921
  - app/views/thredded/posts/edit.html.erb
922
+ - app/views/thredded/posts/new.html.erb
931
923
  - app/views/thredded/posts_common/_actions.html.erb
932
924
  - app/views/thredded/posts_common/_content.html.erb
933
925
  - app/views/thredded/posts_common/_form.html.erb
@@ -937,13 +929,15 @@ files:
937
929
  - app/views/thredded/posts_common/actions/_delete.html.erb
938
930
  - app/views/thredded/posts_common/actions/_edit.html.erb
939
931
  - app/views/thredded/posts_common/actions/_mark_as_unread.html.erb
932
+ - app/views/thredded/posts_common/actions/_quote.html.erb
940
933
  - app/views/thredded/posts_common/form/_after_content.html.erb
941
934
  - app/views/thredded/posts_common/form/_before_content.html.erb
942
935
  - app/views/thredded/posts_common/form/_content.html.erb
943
936
  - app/views/thredded/posts_common/form/_content_field.html.erb
944
937
  - app/views/thredded/posts_common/form/_preview_area.html.erb
945
938
  - app/views/thredded/preferences/_form.html.erb
946
- - app/views/thredded/preferences/_header.html.erb
939
+ - app/views/thredded/preferences/_messageboards_nav.html.erb
940
+ - app/views/thredded/preferences/_messageboards_nav_item.html.erb
947
941
  - app/views/thredded/preferences/edit.html.erb
948
942
  - app/views/thredded/private_post_previews/preview.html.erb
949
943
  - app/views/thredded/private_post_previews/update.html.erb
@@ -951,6 +945,7 @@ files:
951
945
  - app/views/thredded/private_posts/_form.html.erb
952
946
  - app/views/thredded/private_posts/_private_post.html.erb
953
947
  - app/views/thredded/private_posts/edit.html.erb
948
+ - app/views/thredded/private_posts/new.html.erb
954
949
  - app/views/thredded/private_topic_mailer/message_notification.html.erb
955
950
  - app/views/thredded/private_topic_mailer/message_notification.text.erb
956
951
  - app/views/thredded/private_topic_previews/preview.html.erb
@@ -977,6 +972,7 @@ files:
977
972
  - app/views/thredded/shared/nav/_notification_preferences.html.erb
978
973
  - app/views/thredded/shared/nav/_private_topics.html.erb
979
974
  - app/views/thredded/shared/nav/_standalone.html.erb
975
+ - app/views/thredded/shared/nav/_standalone_profile.html.erb
980
976
  - app/views/thredded/shared/preview.html.erb
981
977
  - app/views/thredded/theme_previews/_section_title.html.erb
982
978
  - app/views/thredded/theme_previews/show.html.erb
@@ -1015,6 +1011,7 @@ files:
1015
1011
  - db/upgrade_migrations/20161113161801_upgrade_v0_8_to_v0_9.rb
1016
1012
  - db/upgrade_migrations/20170125033319_upgrade_v0_9_to_v0_10.rb
1017
1013
  - db/upgrade_migrations/20170312131417_upgrade_thredded_v0_10_to_v0_11.rb
1014
+ - db/upgrade_migrations/20170420163138_upgrade_thredded_v0_11_to_v0_12.rb
1018
1015
  - lib/generators/thredded/install/USAGE
1019
1016
  - lib/generators/thredded/install/install_generator.rb
1020
1017
  - lib/generators/thredded/install/templates/initializer.rb
@@ -1038,6 +1035,7 @@ files:
1038
1035
  - lib/thredded/version.rb
1039
1036
  - lib/thredded/view_hooks/config.rb
1040
1037
  - lib/thredded/view_hooks/renderer.rb
1038
+ - vendor/assets/javascripts/autosize.js
1041
1039
  - vendor/assets/javascripts/jquery.textcomplete.js
1042
1040
  homepage: https://thredded.org
1043
1041
  licenses: