diff options
Diffstat (limited to 'client/js/controls/post_readonly_sidebar_control.js')
| -rw-r--r-- | client/js/controls/post_readonly_sidebar_control.js | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/client/js/controls/post_readonly_sidebar_control.js b/client/js/controls/post_readonly_sidebar_control.js index d11fa92..fc26281 100644 --- a/client/js/controls/post_readonly_sidebar_control.js +++ b/client/js/controls/post_readonly_sidebar_control.js @@ -2,23 +2,28 @@ const api = require("../api.js"); const events = require("../events.js"); +const settings = require("../models/settings.js"); const views = require("../util/views.js"); const uri = require("../util/uri.js"); const misc = require("../util/misc.js"); +const PostMetricListControl = require("./post_metric_list_control.js"); +const PostList = require("../models/post_list.js"); const template = views.getTemplate("post-readonly-sidebar"); const scoreTemplate = views.getTemplate("score"); const favTemplate = views.getTemplate("fav"); +const similarItemTemplate = views.getTemplate("similar-post-item") class PostReadonlySidebarControl extends events.EventTarget { - constructor(hostNode, post, postContentControl) { + constructor(hostNode, ctx, postContentControl) { super(); this._hostNode = hostNode; - this._post = post; + this._ctx = ctx; + this._post = ctx.post; this._postContentControl = postContentControl; - post.addEventListener("changeFavorite", (e) => this._evtChangeFav(e)); - post.addEventListener("changeScore", (e) => this._evtChangeScore(e)); + this._post.addEventListener("changeFavorite", (e) => this._evtChangeFav(e)); + this._post.addEventListener("changeScore", (e) => this._evtChangeScore(e)); views.replaceContent( this._hostNode, @@ -28,6 +33,7 @@ class PostReadonlySidebarControl extends events.EventTarget { canListPosts: api.hasPrivilege("posts:list"), canEditPosts: api.hasPrivilege("posts:edit"), canViewTags: api.hasPrivilege("tags:view"), + canViewSimilar: api.hasPrivilege("posts:view:similar"), escapeTagName: uri.escapeTagName, extractRootDomain: uri.extractRootDomain, getPrettyName: misc.getPrettyName, @@ -38,6 +44,13 @@ class PostReadonlySidebarControl extends events.EventTarget { this._installScore(); this._installFitButtons(); this._syncFitButton(); + if (this._metricsListNode) { + this._metricsControl = new PostMetricListControl( + this._metricsListNode, this._post + ); + } + this._loadSimilarPosts(); + this._loadLookalikePosts(); } get _scoreContainerNode() { @@ -80,6 +93,22 @@ class PostReadonlySidebarControl extends events.EventTarget { return this._hostNode.querySelector(".fit-height"); } + get _metricsListNode() { + return this._hostNode.querySelector("ul.compact-post-metrics"); + } + + get _similarListNode() { + return this._hostNode.querySelector("nav.similar ul"); + } + + get _lookalikesNode() { + return this._hostNode.querySelector("nav.lookalikes"); + } + + get _lookalikesListNode() { + return this._hostNode.querySelector("nav.lookalikes ul"); + } + _installFitButtons() { this._fitBothButtonNode.addEventListener( "click", @@ -218,6 +247,45 @@ class PostReadonlySidebarControl extends events.EventTarget { _evtChangeScore(e) { this._installScore(); } + + _loadSimilarPosts() { + return PostList.search( + "similar:" + this._post.id + " -id:" + this._post.id, + 0, + parseInt(settings.get().similarPosts), + ["id", "thumbnailUrl"], + ) + .then((response) => { + const listNode = this._similarListNode; + for (let post of response.results) { + let poseNode = similarItemTemplate({ + id: post.id, + thumbnailUrl: post.thumbnailUrl, + }); + listNode.appendChild(poseNode); + } + }); + } + + _loadLookalikePosts() { + const limit = parseInt(settings.get().similarPosts); + const fields = ["id", "thumbnailUrl"]; + const threshold = 1; + return PostList.reverseSearch(this._post.id, limit, threshold, fields) + .then((response) => { + if (response.results.length === 0) { + this._lookalikesNode.style.display = "none"; + } + const listNode = this._lookalikesListNode; + for (let post of response.results) { + let poseNode = similarItemTemplate({ + id: post.id, + thumbnailUrl: post.thumbnailUrl, + }); + listNode.appendChild(poseNode); + } + }); + } } module.exports = PostReadonlySidebarControl; |