diff --git a/app/assets/javascripts/discourse/components/expand-post.js.es6 b/app/assets/javascripts/discourse/components/expand-post.js.es6 new file mode 100644 index 00000000000..957750e92f2 --- /dev/null +++ b/app/assets/javascripts/discourse/components/expand-post.js.es6 @@ -0,0 +1,19 @@ +import { ajax } from 'discourse/lib/ajax'; + +export default Ember.Component.extend({ + tagName: '', + + actions: { + expandItem() { + const item = this.get('item'); + const topicId = item.get('topic_id'); + const postNumber = item.get('post_number'); + + return ajax(`/posts/by_number/${topicId}/${postNumber}.json`).then(result => { + item.set('truncated', false); + item.set('excerpt', result.cooked); + }); + } + } +}); + diff --git a/app/assets/javascripts/discourse/components/stream-item.js.es6 b/app/assets/javascripts/discourse/components/stream-item.js.es6 index e205f50a3f5..26d1e6f8e5a 100644 --- a/app/assets/javascripts/discourse/components/stream-item.js.es6 +++ b/app/assets/javascripts/discourse/components/stream-item.js.es6 @@ -1,22 +1,8 @@ import { propertyEqual } from 'discourse/lib/computed'; import { actionDescription } from "discourse/components/small-action"; -import { ajax } from 'discourse/lib/ajax'; export default Ember.Component.extend({ classNameBindings: [":item", "item.hidden", "item.deleted:deleted", "moderatorAction"], moderatorAction: propertyEqual("item.post_type", "site.post_types.moderator_action"), actionDescription: actionDescription("item.action_code", "item.created_at", "item.username"), - - actions: { - expandItem() { - const item = this.get('item'); - const topicId = item.get('topic_id'); - const postNumber = item.get('post_number'); - - return ajax(`/posts/by_number/${topicId}/${postNumber}.json`).then(result => { - item.set('truncated', false); - item.set('excerpt', result.cooked); - }); - } - } }); diff --git a/app/assets/javascripts/discourse/templates/components/expand-post.hbs b/app/assets/javascripts/discourse/templates/components/expand-post.hbs new file mode 100644 index 00000000000..4d3192668d1 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/expand-post.hbs @@ -0,0 +1,5 @@ +{{#if item.truncated}} + + {{fa-icon "chevron-down"}} + +{{/if}} diff --git a/app/assets/javascripts/discourse/templates/components/group-post.hbs b/app/assets/javascripts/discourse/templates/components/group-post.hbs index 09ac259ce27..bd7f867e86f 100644 --- a/app/assets/javascripts/discourse/templates/components/group-post.hbs +++ b/app/assets/javascripts/discourse/templates/components/group-post.hbs @@ -2,6 +2,7 @@
{{avatar post.user imageSize="large" extraClasses="actor" ignoreTitle="true"}}
{{format-date post.created_at leaveAgo="true"}} + {{expand-post item=post}} {{{post.topic.fancyTitle}}} @@ -13,6 +14,6 @@

- {{{unbound post.excerpt}}} + {{{post.excerpt}}}

diff --git a/app/assets/javascripts/discourse/templates/components/stream-item.hbs b/app/assets/javascripts/discourse/templates/components/stream-item.hbs index 71c2bb9e333..ea3c9dcec98 100644 --- a/app/assets/javascripts/discourse/templates/components/stream-item.hbs +++ b/app/assets/javascripts/discourse/templates/components/stream-item.hbs @@ -1,11 +1,7 @@
{{avatar item imageSize="large" extraClasses="actor" ignoreTitle="true"}}
{{format-date item.created_at}} - {{#if item.truncated}} - - {{fa-icon "chevron-down"}} - - {{/if}} + {{expand-post item=item}} {{topic-status topic=item disableActions=true}} {{{item.title}}} diff --git a/app/serializers/admin_user_action_serializer.rb b/app/serializers/admin_user_action_serializer.rb index 6d776de23dc..0cc58aa27a6 100644 --- a/app/serializers/admin_user_action_serializer.rb +++ b/app/serializers/admin_user_action_serializer.rb @@ -1,4 +1,7 @@ +require_relative 'post_item_excerpt' + class AdminUserActionSerializer < ApplicationSerializer + include PostItemExcerpt attributes( :id, @@ -13,7 +16,6 @@ class AdminUserActionSerializer < ApplicationSerializer :title, :category_id, :truncated, - :excerpt, :hidden, :moderator_action, :deleted, @@ -23,18 +25,10 @@ class AdminUserActionSerializer < ApplicationSerializer :action_type ) - def truncated - true - end - def post_id object.id end - def include_truncated? - object.excerpt != object.cooked - end - def deleted deleted_at.present? end diff --git a/app/serializers/group_post_serializer.rb b/app/serializers/group_post_serializer.rb index 1fb6305e59a..99a06f55340 100644 --- a/app/serializers/group_post_serializer.rb +++ b/app/serializers/group_post_serializer.rb @@ -1,10 +1,15 @@ +require_relative 'post_item_excerpt' + class GroupPostSerializer < ApplicationSerializer + include PostItemExcerpt + attributes :id, - :excerpt, :created_at, :title, :url, - :category + :category, + :post_number, + :topic_id has_one :user, serializer: GroupPostUserSerializer, embed: :object has_one :topic, serializer: BasicTopicSerializer, embed: :object diff --git a/app/serializers/post_item_excerpt.rb b/app/serializers/post_item_excerpt.rb new file mode 100644 index 00000000000..be74db9bdf9 --- /dev/null +++ b/app/serializers/post_item_excerpt.rb @@ -0,0 +1,25 @@ +module PostItemExcerpt + + def self.included(base) + base.attributes(:excerpt, :truncated) + end + + def cooked + @cooked ||= object.cooked || PrettyText.cook(object.raw) + end + + def excerpt + return nil unless cooked + @excerpt ||= PrettyText.excerpt(cooked, 300, keep_emoji_images: true) + end + + def truncated + true + end + + def include_truncated? + cooked.length > 300 + end + +end + diff --git a/app/serializers/user_action_serializer.rb b/app/serializers/user_action_serializer.rb index 2db30ca9077..81b2cb2fe60 100644 --- a/app/serializers/user_action_serializer.rb +++ b/app/serializers/user_action_serializer.rb @@ -1,9 +1,10 @@ +require_relative 'post_item_excerpt' + class UserActionSerializer < ApplicationSerializer + include PostItemExcerpt attributes :action_type, :created_at, - :excerpt, - :truncated, :avatar_template, :acting_avatar_template, :slug, @@ -30,22 +31,6 @@ class UserActionSerializer < ApplicationSerializer :closed, :archived - def cooked - @cooked ||= object.cooked || PrettyText.cook(object.raw) - end - - def excerpt - return nil unless cooked - @excerpt ||= PrettyText.excerpt(cooked, 300, keep_emoji_images: true) - end - - def truncated - true - end - - def include_truncated? - cooked.length > 300 - end def avatar_template User.avatar_template(object.username, object.uploaded_avatar_id)