REFACTOR: Merge different templates from rendering user stream items
This commit is contained in:
parent
9f8388c2eb
commit
ae7734707e
|
@ -2,13 +2,7 @@ import { propertyEqual } from 'discourse/lib/computed';
|
|||
import { actionDescription } from "discourse/components/small-action";
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNameBindings: [":item", "item.hidden", "item.deleted", "moderatorAction"],
|
||||
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: {
|
||||
removeBookmark(userAction) {
|
||||
this.sendAction("removeBookmark", userAction);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import LoadMore from "discourse/mixins/load-more";
|
||||
import ClickTrack from 'discourse/lib/click-track';
|
||||
import { selectedText } from 'discourse/lib/utilities';
|
||||
import Post from 'discourse/models/post';
|
||||
|
||||
export default Ember.Component.extend(LoadMore, {
|
||||
loading: false,
|
||||
|
@ -44,6 +45,13 @@ export default Ember.Component.extend(LoadMore, {
|
|||
}.on('willDestroyElement'),
|
||||
|
||||
actions: {
|
||||
removeBookmark(userAction) {
|
||||
const stream = this.get('stream');
|
||||
Post.updateBookmark(userAction.get("post_id"), false).then(() => {
|
||||
stream.remove(userAction);
|
||||
});
|
||||
},
|
||||
|
||||
loadMore() {
|
||||
if (this.get('loading')) { return; }
|
||||
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
import Post from 'discourse/models/post';
|
||||
|
||||
export default Post.extend({
|
||||
|
||||
_attachCategory: function () {
|
||||
const categoryId = this.get("category_id");
|
||||
if (categoryId) {
|
||||
this.set("category", Discourse.Category.findById(categoryId));
|
||||
}
|
||||
}.on("init"),
|
||||
|
||||
presentName: Ember.computed.or('name', 'username'),
|
||||
|
||||
sameUser: function() {
|
||||
return this.get("username") === Discourse.User.currentProp("username");
|
||||
}.property("username"),
|
||||
|
||||
descriptionKey: function () {
|
||||
if (this.get("reply_to_post_number")) {
|
||||
return this.get("sameUser") ? "you_replied_to_post" : "user_replied_to_post";
|
||||
} else {
|
||||
return this.get("sameUser") ? "you_replied_to_topic" : "user_replied_to_topic";
|
||||
}
|
||||
}.property("reply_to_post_number", "sameUser")
|
||||
|
||||
});
|
|
@ -1,6 +1,6 @@
|
|||
import { ajax } from 'discourse/lib/ajax';
|
||||
import { url } from 'discourse/lib/computed';
|
||||
import AdminPost from 'discourse/models/admin-post';
|
||||
import UserAction from 'discourse/models/user-action';
|
||||
|
||||
export default Discourse.Model.extend({
|
||||
loaded: false,
|
||||
|
@ -36,7 +36,7 @@ export default Discourse.Model.extend({
|
|||
|
||||
return ajax(this.get("url"), { cache: false }).then(function (result) {
|
||||
if (result) {
|
||||
const posts = result.map(function (post) { return AdminPost.create(post); });
|
||||
const posts = result.map(function (post) { return UserAction.create(post); });
|
||||
self.get("content").pushObjects(posts);
|
||||
self.setProperties({
|
||||
loaded: true,
|
||||
|
|
|
@ -19,26 +19,9 @@ export default Discourse.Route.extend(ViewingActionType, {
|
|||
},
|
||||
|
||||
actions: {
|
||||
|
||||
didTransition() {
|
||||
this.controllerFor("user-activity")._showFooter();
|
||||
return true;
|
||||
},
|
||||
|
||||
removeBookmark(userAction) {
|
||||
var user = this.modelFor("user");
|
||||
Discourse.Post.updateBookmark(userAction.get("post_id"), false)
|
||||
.then(function() {
|
||||
// remove the user action from the stream
|
||||
user.get("stream").remove(userAction);
|
||||
// update the counts
|
||||
user.get("stats").forEach(function (stat) {
|
||||
if (stat.get("action_type") === userAction.action_type) {
|
||||
stat.decrementProperty("count");
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -6,6 +6,14 @@
|
|||
<a href={{item.postUrl}}>{{{item.title}}}</a>
|
||||
</span>
|
||||
<div class="category">{{category-link item.category}}</div>
|
||||
{{#if item.deleted_by}}
|
||||
<span class="delete-info">
|
||||
{{fa-icon "trash-o"}}
|
||||
{{avatar item.deleted_by imageSize="tiny" extraClasses="actor" ignoreTitle="true"}}
|
||||
{{format-date item.deleted_at leaveAgo="true"}}
|
||||
</span>
|
||||
{{/if}}
|
||||
|
||||
{{plugin-outlet name="user-stream-item-header" args=(hash item=item)}}
|
||||
</div>
|
||||
|
||||
|
@ -20,7 +28,7 @@
|
|||
<i class="icon {{child.icon}}"></i>
|
||||
{{#each child.items as |grandChild|}}
|
||||
{{#if grandChild.removableBookmark}}
|
||||
<button class="btn btn-default remove-bookmark" {{action "removeBookmark" grandChild}}>
|
||||
<button class="btn btn-default remove-bookmark" {{action removeBookmark grandChild}}>
|
||||
{{fa-icon 'times'}} {{i18n "bookmarks.remove"}}
|
||||
</button>
|
||||
{{else}}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
{{#each stream.content as |item|}}
|
||||
{{stream-item item=item removeBookmark=(action "removeBookmark")}}
|
||||
{{/each}}
|
|
@ -1,30 +1 @@
|
|||
{{#user-stream stream=model}}
|
||||
{{#each model.content as |p|}}
|
||||
<div class="item {{if p.hidden 'hidden'}} {{if p.deleted 'deleted'}} {{if p.moderator_action 'moderator-action'}}">
|
||||
<div class="clearfix info">
|
||||
<a href="{{unbound p.usernameUrl}}" class="avatar-link">
|
||||
<div class="avatar-wrapper">
|
||||
{{avatar p imageSize="large" extraClasses="actor" ignoreTitle="true"}}
|
||||
</div>
|
||||
</a>
|
||||
<span class="time">
|
||||
{{format-date p.created_at leaveAgo="true"}}
|
||||
</span>
|
||||
<span class="title">
|
||||
<a href="{{unbound p.url}}">{{unbound p.topic_title}}</a>
|
||||
</span>
|
||||
<span class="category">
|
||||
{{category-link p.category}}
|
||||
</span>
|
||||
{{#if p.deleted}}
|
||||
<span class="delete-info">
|
||||
<i class="fa fa-trash-o"></i> {{avatar p.deleted_by imageSize="tiny" extraClasses="actor" ignoreTitle="true"}} {{format-date p.deleted_at leaveAgo="true"}}
|
||||
</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<p class="excerpt">
|
||||
{{{p.excerpt}}}
|
||||
</p>
|
||||
</div>
|
||||
{{/each}}
|
||||
{{/user-stream}}
|
||||
{{user-stream stream=model}}
|
||||
|
|
|
@ -3,8 +3,4 @@
|
|||
{{{model.noContentHelp}}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#user-stream stream=model}}
|
||||
{{#each model.content as |item|}}
|
||||
{{stream-item item=item removeBookmark="removeBookmark"}}
|
||||
{{/each}}
|
||||
{{/user-stream}}
|
||||
{{user-stream stream=model}}
|
||||
|
|
|
@ -445,7 +445,7 @@ class PostsController < ApplicationController
|
|||
.where(disagreed_at: nil)
|
||||
.select(:post_id))
|
||||
|
||||
render_serialized(posts, AdminPostSerializer)
|
||||
render_serialized(posts, AdminUserActionSerializer)
|
||||
end
|
||||
|
||||
def deleted_posts
|
||||
|
@ -458,7 +458,7 @@ class PostsController < ApplicationController
|
|||
|
||||
posts = user_posts(guardian, user.id, offset: offset, limit: limit).where.not(deleted_at: nil)
|
||||
|
||||
render_serialized(posts, AdminPostSerializer)
|
||||
render_serialized(posts, AdminUserActionSerializer)
|
||||
end
|
||||
|
||||
protected
|
||||
|
|
|
@ -1,17 +1,29 @@
|
|||
class AdminPostSerializer < ApplicationSerializer
|
||||
class AdminUserActionSerializer < ApplicationSerializer
|
||||
|
||||
attributes :id,
|
||||
:created_at,
|
||||
:post_number,
|
||||
:name, :username, :avatar_template,
|
||||
:topic_id, :topic_slug, :topic_title,
|
||||
:category_id,
|
||||
:excerpt,
|
||||
:hidden,
|
||||
:moderator_action,
|
||||
:deleted_at, :deleted_by,
|
||||
:reply_to_post_number,
|
||||
:action_type
|
||||
attributes(
|
||||
:id,
|
||||
:created_at,
|
||||
:post_number,
|
||||
:name,
|
||||
:username,
|
||||
:avatar_template,
|
||||
:topic_id,
|
||||
:slug,
|
||||
:title,
|
||||
:category_id,
|
||||
:excerpt,
|
||||
:hidden,
|
||||
:moderator_action,
|
||||
:deleted,
|
||||
:deleted_at,
|
||||
:deleted_by,
|
||||
:reply_to_post_number,
|
||||
:action_type
|
||||
)
|
||||
|
||||
def deleted
|
||||
deleted_at.present?
|
||||
end
|
||||
|
||||
def name
|
||||
object.user.name
|
||||
|
@ -29,11 +41,11 @@ class AdminPostSerializer < ApplicationSerializer
|
|||
object.user.avatar_template
|
||||
end
|
||||
|
||||
def topic_slug
|
||||
def slug
|
||||
topic.slug
|
||||
end
|
||||
|
||||
def topic_title
|
||||
def title
|
||||
topic.title
|
||||
end
|
||||
|
|
@ -3,6 +3,7 @@ class UserActionSerializer < ApplicationSerializer
|
|||
attributes :action_type,
|
||||
:created_at,
|
||||
:excerpt,
|
||||
:truncated,
|
||||
:avatar_template,
|
||||
:acting_avatar_template,
|
||||
:slug,
|
||||
|
@ -29,9 +30,21 @@ class UserActionSerializer < ApplicationSerializer
|
|||
:closed,
|
||||
:archived
|
||||
|
||||
def cooked
|
||||
@cooked ||= object.cooked || PrettyText.cook(object.raw)
|
||||
end
|
||||
|
||||
def excerpt
|
||||
cooked = object.cooked || PrettyText.cook(object.raw)
|
||||
PrettyText.excerpt(cooked, 300, keep_emoji_images: true) if cooked
|
||||
return nil unless cooked
|
||||
@excerpt ||= PrettyText.excerpt(cooked, 300, keep_emoji_images: true)
|
||||
end
|
||||
|
||||
def truncated
|
||||
true
|
||||
end
|
||||
|
||||
def include_truncated?
|
||||
excerpt != cooked
|
||||
end
|
||||
|
||||
def avatar_template
|
||||
|
|
Loading…
Reference in New Issue