diff options
| author | rr- | 2016-06-12 14:04:42 +0200 |
|---|---|---|
| committer | rr- | 2016-06-12 14:04:52 +0200 |
| commit | 1e48140b00da7c574717da750e41b5c95dc36cf1 (patch) | |
| tree | e7c396abfdfefdab3f2a2043cea3315ecd3ee22f /client | |
| parent | a67db59d99c00e3066818fdfffb3a965ea7f2843 (diff) | |
client/comments: add global comment list
Diffstat (limited to 'client')
| -rw-r--r-- | client/css/comments.styl | 28 | ||||
| -rw-r--r-- | client/css/main.styl | 2 | ||||
| -rw-r--r-- | client/css/posts.styl | 7 | ||||
| -rw-r--r-- | client/html/comments_page.tpl | 18 | ||||
| -rw-r--r-- | client/html/endless_pager_page.tpl | 2 | ||||
| -rw-r--r-- | client/js/controllers/comments_controller.js | 27 | ||||
| -rw-r--r-- | client/js/views/comments_page_view.js | 27 | ||||
| -rw-r--r-- | client/js/views/endless_page_view.js | 4 | ||||
| -rw-r--r-- | client/js/views/manual_page_view.js | 4 |
9 files changed, 109 insertions, 10 deletions
diff --git a/client/css/comments.styl b/client/css/comments.styl index a3d5280..79ddcdc 100644 --- a/client/css/comments.styl +++ b/client/css/comments.styl @@ -2,7 +2,7 @@ .comments>ul list-style-type: none - margin: 1em 0 + margin: 0 0 2em 0 padding: 0 .comment @@ -16,6 +16,8 @@ display: none .tabs .edit.tab display: none + .content + margin-left: 0.5em &.editing .tab:not(.active) display: none @@ -134,3 +136,27 @@ blockquote :last-child margin-bottom: 0 + +.global-comment-list + text-align: left + + &>ul + list-style-type: none + margin: 1em 0 + padding: 0 + + &>li + display: flex + margin-bottom: 2em + + .post-thumbnail + float: left + vertical-align: top + margin-right: 1em + .thumbnail + width: 12em + height: 8em + margin: 0 + + .comments-container + width: 100% diff --git a/client/css/main.styl b/client/css/main.styl index 699be1e..b08d81e 100644 --- a/client/css/main.styl +++ b/client/css/main.styl @@ -196,7 +196,7 @@ a .access-key height: 0 .page position: relative - p + .page-header margin: 0.5em 0.5em 0.5em 0 position: relative &:before diff --git a/client/css/posts.styl b/client/css/posts.styl index 877f001..22c9243 100644 --- a/client/css/posts.styl +++ b/client/css/posts.styl @@ -94,8 +94,11 @@ $safety-unsafe = #F3985F >.content width: 100% - .post-container .post-content - margin: 0 + .post-container + margin-bottom: 2em + + .post-content + margin: 0 .post-list ul diff --git a/client/html/comments_page.tpl b/client/html/comments_page.tpl new file mode 100644 index 0000000..e580e64 --- /dev/null +++ b/client/html/comments_page.tpl @@ -0,0 +1,18 @@ +<div class='global-comment-list'> + <ul><!-- + --><% for (let post of ctx.results) { %><!-- + --><li><!-- + --><div class='post-thumbnail'><!-- + --><% if (ctx.canViewPosts) { %><!-- + --><a href='/post/<%= post.id %>'><!-- + --><% } %><!-- + --><%= ctx.makeThumbnail(post.thumbnailUrl) %><!-- + --><% if (ctx.canViewPosts) { %><!-- + --></a><!-- + --><% } %><!-- + --></div><!-- + --><div class='comments-container' data-for='<%= post.id %>'></div><!-- + --></li><!-- + --><% } %><!-- + --></ul> +</div> diff --git a/client/html/endless_pager_page.tpl b/client/html/endless_pager_page.tpl index 37c98d3..93d2a3b 100644 --- a/client/html/endless_pager_page.tpl +++ b/client/html/endless_pager_page.tpl @@ -1,4 +1,4 @@ <div class='page'> - <p><span>Page <%= ctx.page %> of <%= ctx.totalPages %></span></p> + <p class='page-header'><span>Page <%= ctx.page %> of <%= ctx.totalPages %></span></p> <div class='page-content-holder'></div> </div> diff --git a/client/js/controllers/comments_controller.js b/client/js/controllers/comments_controller.js index 4f0e80e..fbc4896 100644 --- a/client/js/controllers/comments_controller.js +++ b/client/js/controllers/comments_controller.js @@ -1,18 +1,39 @@ 'use strict'; +const api = require('../api.js'); const page = require('page'); +const misc = require('../util/misc.js'); const topNavController = require('../controllers/top_nav_controller.js'); +const pageController = require('../controllers/page_controller.js'); +const CommentsPageView = require('../views/comments_page_view.js'); const EmptyView = require('../views/empty_view.js'); class CommentsController { registerRoutes() { - page('/comments', (ctx, next) => { this._listCommentsRoute(); }); + page('/comments/:query?', + (ctx, next) => { misc.parseSearchQueryRoute(ctx, next); }, + (ctx, next) => { this._listCommentsRoute(ctx); }); + this._commentsPageView = new CommentsPageView(); this._emptyView = new EmptyView(); } - _listCommentsRoute() { + _listCommentsRoute(ctx) { topNavController.activate('comments'); - this._emptyView.render(); + + pageController.run({ + searchQuery: ctx.searchQuery, + clientUrl: '/comments/' + misc.formatSearchQuery({page: '{page}'}), + requestPage: page => { + return api.get( + '/posts/?query=sort:comment-date+comment-count-min:1' + + `&page=${page}&pageSize=10&fields=` + + 'id,comments,commentCount,thumbnailUrl'); + }, + pageRenderer: this._commentsPageView, + pageContext: { + canViewPosts: api.hasPrivilege('posts:view'), + } + }); } } diff --git a/client/js/views/comments_page_view.js b/client/js/views/comments_page_view.js new file mode 100644 index 0000000..ed741ef --- /dev/null +++ b/client/js/views/comments_page_view.js @@ -0,0 +1,27 @@ +'use strict'; + +const views = require('../util/views.js'); +const CommentListControl = require('../controls/comment_list_control.js'); + +class CommentsPageView { + constructor() { + this._template = views.getTemplate('comments-page'); + } + + render(ctx) { + const target = ctx.target; + const source = this._template(ctx); + + for (let post of ctx.results) { + post.comments.reverse(); + new CommentListControl( + source.querySelector( + `.comments-container[data-for="${post.id}"]`), + post.comments); + } + + views.showView(target, source); + } +} + +module.exports = CommentsPageView; diff --git a/client/js/views/endless_page_view.js b/client/js/views/endless_page_view.js index 482de23..579db94 100644 --- a/client/js/views/endless_page_view.js +++ b/client/js/views/endless_page_view.js @@ -25,7 +25,9 @@ class EndlessPageView { this._working = 0; ctx.headerContext.target = pageHeaderHolder; - ctx.headerRenderer.render(ctx.headerContext); + if (ctx.headerRenderer) { + ctx.headerRenderer.render(ctx.headerContext); + } const threshold = window.innerHeight / 3; diff --git a/client/js/views/manual_page_view.js b/client/js/views/manual_page_view.js index fe93bb8..e67c9cf 100644 --- a/client/js/views/manual_page_view.js +++ b/client/js/views/manual_page_view.js @@ -70,7 +70,9 @@ class ManualPageView { const currentPage = ctx.searchQuery.page; ctx.headerContext.target = pageHeaderHolder; - ctx.headerRenderer.render(ctx.headerContext); + if (ctx.headerRenderer) { + ctx.headerRenderer.render(ctx.headerContext); + } ctx.requestPage(currentPage).then(response => { Object.assign(ctx.pageContext, response); |