Add "pin post" feature
This commit is contained in:
parent
2cfef05eb7
commit
88a08fdfec
6 changed files with 138 additions and 10 deletions
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue