Initial implementation of pool navigation inside posts
This commit is contained in:
parent
8e8b15a1d8
commit
7750e43714
8 changed files with 123 additions and 42 deletions
|
@ -18,6 +18,8 @@ $message-error-border-color = #FCC
|
||||||
$message-error-background-color = #FFF5F5
|
$message-error-background-color = #FFF5F5
|
||||||
$message-success-border-color = #D3E3D3
|
$message-success-border-color = #D3E3D3
|
||||||
$message-success-background-color = #F5FFF5
|
$message-success-background-color = #F5FFF5
|
||||||
|
$pool-navigator-border-color = #888
|
||||||
|
$pool-navigator-background-color = #EEE
|
||||||
$input-bad-border-color = #FCC
|
$input-bad-border-color = #FCC
|
||||||
$input-bad-background-color = #FFF5F5
|
$input-bad-background-color = #FFF5F5
|
||||||
$input-good-border-color = #D3E3D3
|
$input-good-border-color = #D3E3D3
|
||||||
|
|
|
@ -1,9 +1,34 @@
|
||||||
@import colors
|
@import colors
|
||||||
$pool-navigator-header-background-color = $top-navigation-color
|
|
||||||
$pool-navigator-header-background-color-darktheme = $top-navigation-color-darktheme
|
|
||||||
|
|
||||||
.pool-navigator-container
|
.pool-navigator-container
|
||||||
padding: 0 0 0 60px
|
padding: 0 0.50em 0 0.50em
|
||||||
|
margin: 0 auto
|
||||||
|
|
||||||
|
.pool-info-wrapper
|
||||||
|
box-sizing: border-box
|
||||||
|
width: 100%
|
||||||
|
max-width: 40em
|
||||||
|
margin: 0 0 1em 0
|
||||||
|
display: flex
|
||||||
|
padding: 0.5em 1em
|
||||||
|
border: 1px solid $pool-navigator-border-color
|
||||||
|
background: $pool-navigator-background-color
|
||||||
|
&.active
|
||||||
|
font-weight: bold
|
||||||
|
|
||||||
|
.pool-name
|
||||||
|
flex: 1 1;
|
||||||
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
-o-text-overflow: ellipsis;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
.prev, .next
|
||||||
|
flex: 0 1;
|
||||||
|
margin: 0 .25em;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
|
||||||
.darktheme .pool-navigator-container
|
.darktheme .pool-navigator-container
|
||||||
background: $pool-navigator-header-background-color-darktheme
|
background: $pool-navigator-header-background-color-darktheme
|
||||||
|
|
|
@ -1,2 +1,31 @@
|
||||||
<div class='pool-navigator-container'>
|
<div class='pool-navigator-container'>
|
||||||
|
<div class='pool-info-wrapper <%= ctx.isActivePool ? "active" : "" %>'>
|
||||||
|
<span class='prev'>
|
||||||
|
<% if (ctx.canViewPosts && ctx.prevPost) { %>
|
||||||
|
<a class='<%- ctx.linkClass %>' href='<%= ctx.getPostUrl(ctx.prevPost.id, ctx.parameters) %>'>
|
||||||
|
<% } %>
|
||||||
|
‹ prev
|
||||||
|
<% if (ctx.canViewPosts && ctx.prevPost) { %>
|
||||||
|
</a>
|
||||||
|
<% } %>
|
||||||
|
</span>
|
||||||
|
<span class='pool-name'>
|
||||||
|
<% if (ctx.canViewPools) { %>
|
||||||
|
<a class='<%- ctx.linkClass %>' href='<%= ctx.formatClientLink("pool", ctx.pool.id) %>'>
|
||||||
|
<% } %>
|
||||||
|
<%- ctx.pool.names[0] %>
|
||||||
|
<% if (ctx.canViewPools) { %>
|
||||||
|
</a>
|
||||||
|
<% } %>
|
||||||
|
</span>
|
||||||
|
<span class='next'>
|
||||||
|
<% if (ctx.canViewPosts && ctx.nextPost) { %>
|
||||||
|
<a class='<%- ctx.linkClass %>' href='<%= ctx.getPostUrl(ctx.nextPost.id, ctx.parameters) %>'>
|
||||||
|
<% } %>
|
||||||
|
next ›
|
||||||
|
<% if (ctx.canViewPosts && ctx.nextPost) { %>
|
||||||
|
</a>
|
||||||
|
<% } %>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -16,10 +16,10 @@ class PostMainController extends BasePostController {
|
||||||
constructor(ctx, editMode) {
|
constructor(ctx, editMode) {
|
||||||
super(ctx);
|
super(ctx);
|
||||||
|
|
||||||
let poolPostsAround = Promise.resolve({results: [], activePool: null})
|
let poolPostsAround = Promise.resolve({results: [], activePool: null});
|
||||||
if (api.hasPrivilege("pools.list") && api.hasPrivilege("pools.view")) {
|
if (api.hasPrivilege("pools:list") && api.hasPrivilege("pools:view")) {
|
||||||
poolPostsAround = PostList.getPoolPostsAround(
|
poolPostsAround = PostList.getPoolPostsAround(
|
||||||
ctxt.parameters.id,
|
ctx.parameters.id,
|
||||||
parameters ? parameters.query : null
|
parameters ? parameters.query : null
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ class PostMainController extends BasePostController {
|
||||||
]).then(
|
]).then(
|
||||||
(responses) => {
|
(responses) => {
|
||||||
const [post, aroundResponse, poolPostsAroundResponse] = responses;
|
const [post, aroundResponse, poolPostsAroundResponse] = responses;
|
||||||
|
let activePool = null;
|
||||||
|
|
||||||
// remove junk from query, but save it into history so that it can
|
// remove junk from query, but save it into history so that it can
|
||||||
// be still accessed after history navigation / page refresh
|
// be still accessed after history navigation / page refresh
|
||||||
|
@ -48,13 +49,20 @@ class PostMainController extends BasePostController {
|
||||||
)
|
)
|
||||||
: uri.formatClientLink("post", ctx.parameters.id);
|
: uri.formatClientLink("post", ctx.parameters.id);
|
||||||
router.replace(url, ctx.state, false);
|
router.replace(url, ctx.state, false);
|
||||||
|
console.log(parameters.query);
|
||||||
|
parameters.query.split(" ").forEach((item) => {
|
||||||
|
const found = item.match(/^pool:([0-9]+)/i);
|
||||||
|
if (found) {
|
||||||
|
activePool = parseInt(found[1]);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this._post = post;
|
this._post = post;
|
||||||
this._view = new PostMainView({
|
this._view = new PostMainView({
|
||||||
post: post,
|
post: post,
|
||||||
poolPostsAround: poolPostsAroundResponse.results,
|
poolPostsAround: poolPostsAroundResponse,
|
||||||
activePool: poolPostsAroundResponse.activePool,
|
activePool: activePool,
|
||||||
editMode: editMode,
|
editMode: editMode,
|
||||||
prevPostId: aroundResponse.prev
|
prevPostId: aroundResponse.prev
|
||||||
? aroundResponse.prev.id
|
? aroundResponse.prev.id
|
||||||
|
|
|
@ -8,19 +8,26 @@ const views = require("../util/views.js");
|
||||||
const template = views.getTemplate("pool-navigator");
|
const template = views.getTemplate("pool-navigator");
|
||||||
|
|
||||||
class PoolNavigatorControl extends events.EventTarget {
|
class PoolNavigatorControl extends events.EventTarget {
|
||||||
constructor(hostNode, pool) {
|
constructor(hostNode, poolPostAround, isActivePool) {
|
||||||
super();
|
super();
|
||||||
this._hostNode = hostNode;
|
this._hostNode = hostNode;
|
||||||
this._pool = pool;
|
this._poolPostAround = poolPostAround;
|
||||||
|
this._isActivePool = isActivePool;
|
||||||
|
|
||||||
|
views.replaceContent(
|
||||||
|
this._hostNode,
|
||||||
|
template({
|
||||||
|
pool: poolPostAround.pool,
|
||||||
|
parameters: { query: `pool:${poolPostAround.pool.id}` },
|
||||||
|
linkClass: misc.makeCssName(poolPostAround.pool.category, "pool"),
|
||||||
|
canViewPosts: api.hasPrivilege("posts:view"),
|
||||||
|
canViewPools: api.hasPrivilege("pools:view"),
|
||||||
|
prevPost: poolPostAround.prevPost,
|
||||||
|
nextPost: poolPostAround.nextPost,
|
||||||
|
isActivePool: isActivePool
|
||||||
|
})
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get _formNode() {
|
|
||||||
// return this._hostNode.querySelector("form");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// get _scoreContainerNode() {
|
|
||||||
// return this._hostNode.querySelector(".score-container");
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = PoolNavigatorControl;
|
module.exports = PoolNavigatorControl;
|
||||||
|
|
|
@ -7,44 +7,53 @@ const PoolNavigatorControl = require("../controls/pool_navigator_control.js");
|
||||||
const template = views.getTemplate("pool-navigator-list");
|
const template = views.getTemplate("pool-navigator-list");
|
||||||
|
|
||||||
class PoolNavigatorListControl extends events.EventTarget {
|
class PoolNavigatorListControl extends events.EventTarget {
|
||||||
constructor(hostNode, pools) {
|
constructor(hostNode, poolPostsAround, activePool) {
|
||||||
super();
|
super();
|
||||||
this._hostNode = hostNode;
|
this._hostNode = hostNode;
|
||||||
|
this._poolPostsAround = poolPostsAround;
|
||||||
|
this._activePool = activePool;
|
||||||
|
this._indexToNode = {};
|
||||||
|
|
||||||
const poolList = [];
|
for (let [i, entry] of this._poolPostsAround.entries()) {
|
||||||
for (let pool of poolList) {
|
this._installPoolNavigatorNode(entry, i);
|
||||||
this._installPoolNavigatorNode(pool);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get _poolNavigatorListNode() {
|
get _poolNavigatorListNode() {
|
||||||
return this._hostNode.querySelector("ul");
|
return this._hostNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
_installPoolNavigatorNode(pool) {
|
_installPoolNavigatorNode(poolPostAround, i) {
|
||||||
const poolListItemNode = document.createElement("li");
|
const isActivePool = poolPostAround.pool.id == this._activePool
|
||||||
|
const poolListItemNode = document.createElement("div");
|
||||||
const poolControl = new PoolNavigatorControl(
|
const poolControl = new PoolNavigatorControl(
|
||||||
pool
|
poolListItemNode,
|
||||||
|
poolPostAround,
|
||||||
|
isActivePool
|
||||||
);
|
);
|
||||||
// events.proxyEvent(commentControl, this, "submit");
|
// events.proxyEvent(commentControl, this, "submit");
|
||||||
// events.proxyEvent(commentControl, this, "score");
|
// events.proxyEvent(commentControl, this, "score");
|
||||||
// events.proxyEvent(commentControl, this, "delete");
|
// events.proxyEvent(commentControl, this, "delete");
|
||||||
// this._commentIdToNode[comment.id] = commentListItemNode;
|
this._indexToNode[poolPostAround.id] = poolListItemNode;
|
||||||
this._poolNavigatorListNode.appendChild(poolListItemNode);
|
if (isActivePool) {
|
||||||
|
this._poolNavigatorListNode.insertBefore(poolListItemNode, this._poolNavigatorListNode.firstChild);
|
||||||
|
} else {
|
||||||
|
this._poolNavigatorListNode.appendChild(poolListItemNode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_uninstallCommentNode(pool) {
|
_uninstallPoolNavigatorNode(index) {
|
||||||
const poolListItemNode = this._commentIdToNode[pool.id];
|
const poolListItemNode = this._indexToNode[index];
|
||||||
poolListItemNode.parentNode.removeChild(poolListItemNode);
|
poolListItemNode.parentNode.removeChild(poolListItemNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// _evtAdd(e) {
|
_evtAdd(e) {
|
||||||
// this._installPoolNode(e.detail.comment);
|
this._installPoolNavigatorNode(e.detail.index);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// _evtRemove(e) {
|
_evtRemove(e) {
|
||||||
// this._uninstallPoolNode(e.detail.comment);
|
this._uninstallPoolNavigatorNode(e.detail.index);
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = PoolNavigatorListControl;
|
module.exports = PoolNavigatorListControl;
|
||||||
|
|
|
@ -59,7 +59,7 @@ class PostMainView {
|
||||||
this._installSidebar(ctx);
|
this._installSidebar(ctx);
|
||||||
this._installCommentForm();
|
this._installCommentForm();
|
||||||
this._installComments(ctx.post.comments);
|
this._installComments(ctx.post.comments);
|
||||||
this._installPoolNavigators(ctx);
|
this._installPoolNavigators(ctx.poolPostsAround, ctx.activePool);
|
||||||
|
|
||||||
const showPreviousImage = () => {
|
const showPreviousImage = () => {
|
||||||
if (ctx.prevPostId) {
|
if (ctx.prevPostId) {
|
||||||
|
@ -140,9 +140,9 @@ class PostMainView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_installPoolNavigators(ctx) {
|
_installPoolNavigators(poolPostsAround, activePool) {
|
||||||
const poolNavigatorsContainerNode = document.querySelector(
|
const poolNavigatorsContainerNode = document.querySelector(
|
||||||
"#content-holder .poolnavigators-container"
|
"#content-holder .pool-navigators-container"
|
||||||
);
|
);
|
||||||
if (!poolNavigatorsContainerNode) {
|
if (!poolNavigatorsContainerNode) {
|
||||||
return;
|
return;
|
||||||
|
@ -150,7 +150,8 @@ class PostMainView {
|
||||||
|
|
||||||
this.poolNavigatorsControl = new PoolNavigatorListControl(
|
this.poolNavigatorsControl = new PoolNavigatorListControl(
|
||||||
poolNavigatorsContainerNode,
|
poolNavigatorsContainerNode,
|
||||||
null
|
poolPostsAround,
|
||||||
|
activePool
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1033,8 +1033,8 @@ def serialize_pool_posts_around(around: List[PoolPostsAround]) -> Optional[rest.
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
"pool": pools.serialize_micro_pool(entry.pool),
|
"pool": pools.serialize_micro_pool(entry.pool),
|
||||||
"prev_post": entry.prev_post,
|
"prevPost": entry.prev_post,
|
||||||
"next_post": entry.next_post
|
"nextPost": entry.next_post
|
||||||
}
|
}
|
||||||
for entry in sort_pool_posts_around(around)
|
for entry in sort_pool_posts_around(around)
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in a new issue