diff --git a/app/assets/javascripts/admin/components/flagged-post.js.es6 b/app/assets/javascripts/admin/components/flagged-post.js.es6 new file mode 100644 index 00000000000..c798bb3ae7b --- /dev/null +++ b/app/assets/javascripts/admin/components/flagged-post.js.es6 @@ -0,0 +1,36 @@ +import showModal from 'discourse/lib/show-modal'; + +export default Ember.Component.extend({ + tagName: '', + + removeAfter(promise) { + return promise.then(() => { + this.attrs.removePost(); + }).catch(() => { + bootbox.alert(I18n.t("admin.flags.error")); + }); + }, + + _spawnModal(name, model, modalClass) { + let controller = showModal(name, { model, admin: true, modalClass }); + controller.removeAfter = (p) => this.removeAfter(p); + }, + + actions: { + showAgreeFlagModal() { + this._spawnModal('admin-agree-flag', this.get('flaggedPost'), 'agree-flag-modal'); + }, + + showDeleteFlagModal() { + this._spawnModal('admin-delete-flag', this.get('flaggedPost'), 'delete-flag-modal'); + }, + + disagree() { + this.removeAfter(this.get('flaggedPost').disagreeFlags()); + }, + + defer() { + this.removeAfter(this.get('flaggedPost').deferFlags()); + } + } +}); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 index a5f20e63683..43b14f4dbb1 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 @@ -5,7 +5,7 @@ export default Ember.Controller.extend(ModalFunctionality, { _agreeFlag(action) { let flaggedPost = this.get('model'); - return this.removeAfter(flaggedPost.agreeFlags(action), flaggedPost).then(() => { + return this.removeAfter(flaggedPost.agreeFlags(action)).then(() => { this.send('closeModal'); }); }, diff --git a/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 index 2cabebb04bc..be9f74d0eff 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 @@ -6,14 +6,14 @@ export default Ember.Controller.extend(ModalFunctionality, { actions: { deletePostDeferFlag() { let flaggedPost = this.get('model'); - this.removeAfter(flaggedPost.deferFlags(true), flaggedPost).then(() => { + this.removeAfter(flaggedPost.deferFlags(true)).then(() => { this.send('closeModal'); }); }, deletePostAgreeFlag() { let flaggedPost = this.get('model'); - this.removeAfter(flaggedPost.agreeFlags('delete'), flaggedPost).then(() => { + this.removeAfter(flaggedPost.agreeFlags('delete')).then(() => { this.send('closeModal'); }); } diff --git a/app/assets/javascripts/admin/models/flagged-post.js.es6 b/app/assets/javascripts/admin/models/flagged-post.js.es6 index c1517836dbd..4f1cc61d106 100644 --- a/app/assets/javascripts/admin/models/flagged-post.js.es6 +++ b/app/assets/javascripts/admin/models/flagged-post.js.es6 @@ -27,7 +27,7 @@ const FlaggedPost = Post.extend({ disposedAt: postAction.disposed_at, dispositionIcon: this.dispositionIcon(postAction.disposition), tookAction: postAction.staff_took_action - } + }; }); }, @@ -144,25 +144,31 @@ const FlaggedPost = Post.extend({ }); FlaggedPost.reopenClass({ - findAll(args) { - let { offset, filter } = args; - offset = offset || 0; + let { filter } = args; let result = []; result.set('loading', true); - return ajax('/admin/flags/' + filter + '.json?offset=' + offset).then(function (data) { + let data = {}; + if (args.topic_id) { + data.topic_id = args.topic_id; + } + if (args.offset) { + data.offset = args.offset; + } + + return ajax(`/admin/flags/${filter}.json`, { data }).then(response => { // users let userLookup = {}; - data.users.forEach(user => userLookup[user.id] = AdminUser.create(user)); + response.users.forEach(user => userLookup[user.id] = AdminUser.create(user)); // topics let topicLookup = {}; - data.topics.forEach(topic => topicLookup[topic.id] = Topic.create(topic)); + response.topics.forEach(topic => topicLookup[topic.id] = Topic.create(topic)); // posts - data.posts.forEach(post => { + response.posts.forEach(post => { let f = FlaggedPost.create(post); f.userLookup = userLookup; f.topicLookup = topicLookup; diff --git a/app/assets/javascripts/admin/routes/admin-flags-posts-active.js.es6 b/app/assets/javascripts/admin/routes/admin-flags-posts-active.js.es6 index c38488e0f6e..c1d2dd21017 100644 --- a/app/assets/javascripts/admin/routes/admin-flags-posts-active.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-flags-posts-active.js.es6 @@ -2,6 +2,6 @@ import FlaggedPost from 'admin/models/flagged-post'; export default Discourse.Route.extend({ model() { - return FlaggedPost.findAll('active'); + return FlaggedPost.findAll({ filter: 'active' }); } }); diff --git a/app/assets/javascripts/admin/routes/admin-flags-posts-old.js.es6 b/app/assets/javascripts/admin/routes/admin-flags-posts-old.js.es6 index 312e2405275..ff3c1305984 100644 --- a/app/assets/javascripts/admin/routes/admin-flags-posts-old.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-flags-posts-old.js.es6 @@ -2,6 +2,6 @@ import FlaggedPost from 'admin/models/flagged-post'; export default Discourse.Route.extend({ model() { - return FlaggedPost.findAll('old'); + return FlaggedPost.findAll({ filter: 'old' }); }, }); diff --git a/app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 b/app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 index 66b87352268..fca10d61511 100644 --- a/app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-flags-topics-show.js.es6 @@ -8,7 +8,10 @@ export default Ember.Route.extend({ return Ember.RSVP.hash({ topic, - flaggedPosts: FlaggedPost.findAll({ filter: 'active' }) + flaggedPosts: FlaggedPost.findAll({ + filter: 'active', + topic_id: params.id + }) }); }, diff --git a/app/assets/javascripts/admin/templates/components/flagged-post.hbs b/app/assets/javascripts/admin/templates/components/flagged-post.hbs new file mode 100644 index 00000000000..1a2ce66c413 --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/flagged-post.hbs @@ -0,0 +1,169 @@ + + +
+
+ {{#if flaggedPost.postAuthorFlagged}} + {{#if flaggedPost.user}} + {{#link-to 'adminUser' flaggedPost.user}}{{avatar flaggedPost.user imageSize="large"}}{{/link-to}} + {{#if flaggedPost.wasEdited}} + {{d-icon "pencil" title="admin.flags.was_edited"}} + {{/if}} + {{/if}} + {{/if}} + {{#if canAct}} + {{#if flaggedPost.previous_flags_count}} + {{flaggedPost.previous_flags_count}} + {{/if}} + {{/if}} +
+
+

+ {{#if flaggedPost.topic.isPrivateMessage}} + {{d-icon "envelope"}} + {{/if}} + {{topic-status topic=flaggedPost.topic}} + {{{unbound flaggedPost.topic.fancyTitle}}} +

+ {{#unless site.mobileView}} + {{#if flaggedPost.postAuthorFlagged}} +

{{{flaggedPost.excerpt}}}

+ {{/if}} + {{/unless}} +
+
+ + {{#if site.mobileView}} + {{#if flaggedPost.postAuthorFlagged}} +

{{{flaggedPost.excerpt}}}

+ {{/if}} + {{/if}} + + + + + + {{#each flaggedPost.flaggers as |flagger|}} + + + + + {{/each}} + +
+ {{#link-to 'adminUser' flagger.user}} + {{avatar flagger.user imageSize="medium"}} + {{/link-to}} + + {{#link-to 'adminUser' flagger.user}} + {{flagger.user.username}} + {{/link-to}} + {{format-age flagger.flaggedAt}} +
+ {{flagger.flagType}} +
+ + + + {{#if showResolvedBy}} + + + {{#each flaggedPost.flaggers as |flagger|}} + + + + + {{/each}} + +
+ {{#link-to 'adminUser' flagger.disposedBy}} + {{avatar flagger.disposedBy imageSize="medium"}} + {{/link-to}} + + {{format-age flagger.disposedAt}} + {{{flagger.dispositionIcon}}} + {{#if flagger.tookAction}} + {{d-icon "gavel" title="admin.flags.took_action"}} + {{/if}} +
+ {{/if}} + + + + +{{#if flaggedPost.topicFlagged}} + + +
+ {{{i18n 'admin.flags.topic_flagged'}}} {{i18n 'admin.flags.visit_topic'}} +
+ + +{{/if}} + +{{#each flaggedPost.conversations as |c|}} + + +
+ {{#if c.response}} +

+ {{#link-to 'adminUser' c.response.user}}{{avatar c.response.user imageSize="medium"}}{{/link-to}} {{{c.response.excerpt}}} +

+ {{#if c.reply}} +

+ {{#link-to 'adminUser' c.reply.user}}{{avatar c.reply.user imageSize="medium"}}{{/link-to}} {{{c.reply.excerpt}}} + {{#if c.hasMore}} + {{i18n 'admin.flags.more'}} + {{/if}} +

+ {{/if}} + + {{d-button + class="btn-reply" + icon="reply" + label="admin.flags.reply_message"}} + + {{/if}} +
+ + +{{/each}} + +{{#if canAct}} + + + {{d-button + title="admin.flags.agree_title" + label="admin.flags.agree" + icon="thumbs-o-up" + action="showAgreeFlagModal" + ellipsis=true}} + + {{#if flaggedPost.postHidden}} + {{d-button + title="admin.flags.disagree_flag_unhide_post_title" + action="disagree" + icon="thumbs-o-down" + label="admin.flags.disagree_flag_unhide_post"}} + {{else}} + {{d-button + title="admin.flags.disagree_flag_title" + action="disagree" + icon="thumbs-o-down" + label="admin.flags.disagree_flag"}} + {{/if}} + + {{d-button + title="admin.flags.defer_flag_title" + action="defer" + icon="external-link" + label="admin.flags.defer_flag"}} + + {{d-button + class="btn-danger" + title="admin.flags.delete_title" + action="showDeleteFlagModal" + icon="trash-o" + label="admin.flags.delete"}} + + +{{/if}} diff --git a/app/assets/javascripts/admin/templates/components/flagged-posts.hbs b/app/assets/javascripts/admin/templates/components/flagged-posts.hbs index 6a93dcb0d05..8a58ce4537e 100644 --- a/app/assets/javascripts/admin/templates/components/flagged-posts.hbs +++ b/app/assets/javascripts/admin/templates/components/flagged-posts.hbs @@ -10,157 +10,17 @@ {{#each flaggedPosts as |flaggedPost|}} - - - - -
-
- {{#if flaggedPost.postAuthorFlagged}} - {{#if flaggedPost.user}} - {{#link-to 'adminUser' flaggedPost.user}}{{avatar flaggedPost.user imageSize="large"}}{{/link-to}} - {{#if flaggedPost.wasEdited}} - {{d-icon "pencil" title="admin.flags.was_edited"}} - {{/if}} - {{/if}} - {{/if}} - {{#if canAct}} - {{#if flaggedPost.previous_flags_count}} - {{flaggedPost.previous_flags_count}} - {{/if}} - {{/if}} -
-
-

- {{#if flaggedPost.topic.isPrivateMessage}} - {{d-icon "envelope"}} - {{/if}} - {{topic-status topic=flaggedPost.topic}} - {{{unbound flaggedPost.topic.fancyTitle}}} -

- {{#unless site.mobileView}} - {{#if flaggedPost.postAuthorFlagged}} -

{{{flaggedPost.excerpt}}}

- {{/if}} - {{/unless}} -
-
- - {{#if site.mobileView}} - {{#if flaggedPost.postAuthorFlagged}} -

{{{flaggedPost.excerpt}}}

- {{/if}} - {{/if}} - - - - - - {{#each flaggedPost.flaggers as |flagger|}} - - - - - {{/each}} - -
- {{#link-to 'adminUser' flagger.user}} - {{avatar flagger.user imageSize="medium"}} - {{/link-to}} - - {{#link-to 'adminUser' flagger.user}} - {{flagger.user.username}} - {{/link-to}} - {{format-age flagger.flaggedAt}} -
- {{flagger.flagType}} -
- - - - {{#if showResolvedBy}} - - - {{#each flaggedPost.flaggers as |flagger|}} - - - - - {{/each}} - -
- {{#link-to 'adminUser' flagger.disposedBy}} - {{avatar flagger.disposedBy imageSize="medium"}} - {{/link-to}} - - {{format-age flagger.disposedAt}} - {{{flagger.dispositionIcon}}} - {{#if flagger.tookAction}} - {{d-icon "gavel" title="admin.flags.took_action"}} - {{/if}} -
- {{/if}} - - - - - {{#if flaggedPost.topicFlagged}} - - -
- {{{i18n 'admin.flags.topic_flagged'}}} {{i18n 'admin.flags.visit_topic'}} -
- - - {{/if}} - - {{#each flaggedPost.conversations as |c|}} - - -
- {{#if c.response}} -

- {{#link-to 'adminUser' c.response.user}}{{avatar c.response.user imageSize="medium"}}{{/link-to}} {{{c.response.excerpt}}} -

- {{#if c.reply}} -

- {{#link-to 'adminUser' c.reply.user}}{{avatar c.reply.user imageSize="medium"}}{{/link-to}} {{{c.reply.excerpt}}} - {{#if c.hasMore}} - {{i18n 'admin.flags.more'}} - {{/if}} -

- {{/if}} - - - - - {{/if}} -
- - - {{/each}} - - {{#if canAct}} - - - - {{#if flaggedPost.postHidden}} - - {{else}} - - {{/if}} - - - - - {{/if}} - + {{flagged-post + flaggedPost=flaggedPost + canAct=canAct + showResolvedBy=showResolvedBy + removePost=(action "removePost" flaggedPost) + }} {{/each}} {{/load-more}} - {{else}}

{{i18n 'admin.flags.no_results'}}

{{/if}} diff --git a/app/assets/javascripts/discourse/components/flagged-posts.js.es6 b/app/assets/javascripts/discourse/components/flagged-posts.js.es6 index 99a7e58e48b..c381c197601 100644 --- a/app/assets/javascripts/discourse/components/flagged-posts.js.es6 +++ b/app/assets/javascripts/discourse/components/flagged-posts.js.es6 @@ -1,39 +1,20 @@ import FlaggedPost from 'admin/models/flagged-post'; -import showModal from 'discourse/lib/show-modal'; export default Ember.Component.extend({ canAct: Ember.computed.equal('filter', 'active'), showResolvedBy: Ember.computed.equal('filter', 'old'), - removeAfter(promise, flaggedPost) { - return promise.then(() => { - this.get('flaggedPosts').removeObject(flaggedPost); - }).catch(() => { - bootbox.alert(I18n.t("admin.flags.error")); - }); - }, - - _spawnModal(name, flaggedPost, modalClass) { - let controller = showModal(name, { - model: flaggedPost, - admin: true, - modalClass - }); - controller.removeAfter = (p, f) => this.removeAfter(p, f); - }, - actions: { - disagree(flaggedPost) { - this.removeAfter(flaggedPost.disagreeFlags(), flaggedPost); - }, - - defer(flaggedPost) { - this.removeAfter(flaggedPost.deferFlags(), flaggedPost); + removePost(flaggedPost) { + this.get('flaggedPosts').removeObject(flaggedPost); }, loadMore() { const flaggedPosts = this.get('flaggedPosts'); - return FlaggedPost.findAll(this.get('query'), flaggedPosts.length+1).then(data => { + return FlaggedPost.findAll({ + filter: this.get('query'), + offset: flaggedPosts.length+1 + }).then(data => { if (data.length===0) { flaggedPosts.set("allLoaded",true); } @@ -41,12 +22,5 @@ export default Ember.Component.extend({ }); }, - showAgreeFlagModal(flaggedPost) { - this._spawnModal('admin-agree-flag', flaggedPost, 'agree-flag-modal'); - }, - - showDeleteFlagModal(flaggedPost) { - this._spawnModal('admin-delete-flag', flaggedPost, 'delete-flag-modal'); - } } }); diff --git a/app/assets/javascripts/discourse/templates/components/d-button.hbs b/app/assets/javascripts/discourse/templates/components/d-button.hbs index d06d14e66df..755e4ea857f 100644 --- a/app/assets/javascripts/discourse/templates/components/d-button.hbs +++ b/app/assets/javascripts/discourse/templates/components/d-button.hbs @@ -3,7 +3,7 @@ {{/if}} {{#if translatedLabel}} - {{{translatedLabel}}} + {{{translatedLabel}}}{{#if ellipsis}}…{{/if}} {{/if}} {{yield}}