Add "pin post" feature

This commit is contained in:
Suraj Shetty 2018-10-02 13:52:39 +05:30
parent 2cfef05eb7
commit 88a08fdfec
6 changed files with 138 additions and 10 deletions

View file

@ -7,12 +7,15 @@
<div class="content" v-html="post.content"></div>
</div>
<post-action
:is_pinnable="is_pinnable"
:is_pinned="post.is_pinned"
:like_count="like_count"
:reply_count="replies.length"
:post_liked="post_liked"
@toggle_reply="toggle_reply"
@new_reply="create_new_reply"
@toggle_like="toggle_like"
@toggle_pin="toggle_pin"
/>
<post-reply
class="post-reply"
@ -41,6 +44,7 @@ const Post = {
reply_count: 0,
replies: [],
show_replies: false,
is_pinnable: frappe.user_roles.includes('System Manager')
}
},
computed: {
@ -53,7 +57,7 @@ const Post = {
},
created() {
frappe.db.get_list('Post', {
fields: ['name', 'content', 'owner', 'creation', 'liked_by'],
fields: ['name', 'content', 'owner', 'creation', 'liked_by', 'is_pinned'],
order_by: 'creation desc',
filters: {
reply_to: this.post.name
@ -64,6 +68,9 @@ const Post = {
frappe.realtime.on('new_post_reply' + this.post.name, (post) => {
this.replies.push(post);
})
frappe.realtime.on('toggle_pin' + this.post.name, (is_pinned) => {
this.post.is_pinned = cint(is_pinned);
})
frappe.realtime.on('update_liked_by' + this.post.name, this.update_liked_by)
},
methods: {
@ -91,6 +98,9 @@ const Post = {
frappe.xcall('frappe.social.doctype.post.post.toggle_like', {
post_name: this.post.name,
})
},
toggle_pin() {
frappe.db.set_value('Post', this.post.name, 'is_pinned', cint(!this.post.is_pinned))
}
}
}

View file

@ -1,5 +1,8 @@
<template>
<div class="post-action-container text-muted">
<div class="pin" v-if="is_pinnable">
<i class="fa fa-thumb-tack" :class="{'pinned': is_pinned}" @click="$emit('toggle_pin')"></i>
</div>
<div class="reply">
<i class="fa fa-reply" @click="$emit('new_reply')"></i>
<span @click="$emit('toggle_reply')">{{ reply_count }}</span>
@ -24,6 +27,14 @@ export default {
'post_liked': {
'type': Boolean,
'default': true
},
'is_pinnable': {
'type': Boolean,
'default': false
},
'is_pinned': {
'type': Number,
'default': 0
}
},
}
@ -33,7 +44,7 @@ export default {
clear: both;
display: flex;
justify-content: flex-end;
.reply, .like {
.reply, .like, .pin {
cursor: pointer;
padding: 10px;
span {
@ -49,5 +60,8 @@ export default {
color: lighten(red, 20%) !important;
}
}
.pinned {
color: black;
}
}
</style>

View file

@ -37,7 +37,7 @@ export default {
filters: {
owner: this.user_id,
},
fields: ['name', 'content', 'owner', 'creation', 'liked_by'],
fields: ['name', 'content', 'owner', 'creation', 'liked_by', 'is_pinned'],
order_by: 'creation desc',
}).then((posts) => {
this.my_posts = posts;

View file

@ -1,19 +1,22 @@
<template>
<div class="wall-container">
<post-sidebar :user=user class="col-md-2"></post-sidebar>
<post-sidebar class="col-md-3" :user=user></post-sidebar>
<div class="post-container">
<div class="new_posts_count" @click="load_new_posts()" v-if='new_posts_count'>
{{ new_posts_count + ' new post'}}
</div>
<div v-for="post in posts" :key="post.name">
<post v-if="post.type == 'post'" :post="post"></post>
<div v-for="post in user_posts" :key="post.name">
<post v-if="post.type == 'post' && !post.is_pinned" :post="post"></post>
<event-card v-else :event="post"></event-card>
</div>
</div>
<div class="action-card-container hidden-xs">
<action-card></action-card>
<div class="action-card-container col-md-4">
<div class="text-muted text-center padding"><i class="fa fa-thumb-tack"></i> Pinned Posts </div>
<div v-for="post in pinned_posts" :key="post.name">
<post :post="post"></post>
</div>
</div>
</div>
</template>
<script>
@ -42,6 +45,14 @@ export default {
this.new_posts_count += 1;
})
},
computed: {
pinned_posts() {
return this.posts.filter((post) => post.is_pinned)
},
user_posts() {
return this.posts.filter((post) => !post.is_pinned)
}
},
methods: {
get_posts(load_only_new_posts = true) {
const filters = {
@ -51,7 +62,7 @@ export default {
filters.creation = ['>', this.posts[0].creation]
}
frappe.db.get_list('Post', {
fields: ['name', 'content', 'owner', 'creation', 'type', 'liked_by'],
fields: ['name', 'content', 'owner', 'creation', 'type', 'liked_by', 'is_pinned'],
filters: filters,
order_by: 'creation desc'
}).then((res) => {

View file

@ -141,6 +141,38 @@
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "is_pinned",
"fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Is Pinned",
"length": 0,
"no_copy": 0,
"permlevel": 1,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
@ -153,13 +185,32 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-09-28 16:09:09.171746",
"modified": "2018-10-02 12:00:21.827180",
"modified_by": "Administrator",
"module": "Social",
"name": "Post",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 0,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "All",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
@ -178,6 +229,44 @@
"share": 1,
"submit": 0,
"write": 1
},
{
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 0,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "All",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 0
},
{
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 1,

View file

@ -7,6 +7,10 @@ import frappe
from frappe.model.document import Document
class Post(Document):
def on_update(self):
if (self.get_doc_before_save().is_pinned != self.is_pinned):
frappe.publish_realtime('toggle_pin' + self.name, self.is_pinned, after_commit=True)
def after_insert(self):
if self.reply_to:
frappe.publish_realtime('new_post_reply' + self.reply_to, self, after_commit=True)