mirror of
https://github.com/pierre42100/ComunicWeb
synced 2024-12-27 11:18:50 +00:00
338 lines
7.6 KiB
JavaScript
338 lines
7.6 KiB
JavaScript
/**
|
|
* Comments UI
|
|
*
|
|
* @author Pierre HUBERT
|
|
*/
|
|
|
|
const CommentsUI = {
|
|
|
|
/**
|
|
* Display a list comments
|
|
*
|
|
* @param {Object} infos Informations about the comments
|
|
* @param {int} postID The ID of the post attached to the comments
|
|
* @param {HTMLElement} target The target for the comments
|
|
*/
|
|
display: function(infos, postID, target){
|
|
|
|
//First, get informations about the users
|
|
var usersID = ComunicWeb.components.comments.utils.get_users_id(infos);
|
|
|
|
//Get informations about the users
|
|
ComunicWeb.user.userInfos.getMultipleUsersInfo(usersID, function(result){
|
|
|
|
//Check for errors
|
|
if(result.error){
|
|
ComunicWeb.common.notificationSystem.showNotification(lang("comments_ui_err_get_users_info"), "danger");
|
|
return;
|
|
}
|
|
|
|
//Process the comments
|
|
ComunicWeb.components.comments.ui._process_comments(infos, result, postID, target);
|
|
|
|
}, false);
|
|
},
|
|
|
|
/**
|
|
* Process the list of comments
|
|
*
|
|
* @param {Object} infos Informations about the comments
|
|
* @param {Object} userInfos Informations about the users of the comments
|
|
* @param {int} postID The ID of the post attached to the comments
|
|
* @param {HTMLElement} target The target for the comments
|
|
*/
|
|
_process_comments: function(infos, usersInfos, postID, target){
|
|
|
|
//Create comments container
|
|
const container = createElem2({
|
|
appendTo: target,
|
|
type: "div",
|
|
class: "box-comments post-comments"
|
|
});
|
|
container.setAttribute("data-for-post-id", postID);
|
|
|
|
//Process the list of comments
|
|
for(i in infos){
|
|
this._show_comment(infos[i], usersInfos['user-' + infos[i].userID], container);
|
|
}
|
|
|
|
//Add comment creation form (if possible)
|
|
if(signed_in()){
|
|
ComunicWeb.components.comments.form.display(postID, container)
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
* Display a single comment
|
|
*
|
|
* @param {Object} infos Informations about the comment to display
|
|
* @param {HTMLElement} target The target for the comment
|
|
*/
|
|
display_comment: function(infos, target){
|
|
|
|
//Get informations about the user
|
|
ComunicWeb.user.userInfos.getUserInfos(infos.userID, function(result){
|
|
|
|
//Check for errors
|
|
if(result.error){
|
|
ComunicWeb.common.notificationSystem.showNotification(lang("comments_ui_err_get_user_info"), "danger");
|
|
return;
|
|
}
|
|
|
|
//Display the comment
|
|
ComunicWeb.components.comments.ui._show_comment(infos, result, target);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
/**
|
|
* Show a comment
|
|
*
|
|
* @param {object} infos Informations about the comment
|
|
* @param {object} user Informations about the user
|
|
* @param {HTMLElement} target The target for the comment
|
|
*/
|
|
_show_comment: function(infos, user, target){
|
|
|
|
//Create comment container (if required)
|
|
if(target.className != "box-comment"){
|
|
|
|
var commentContainer = createElem2({
|
|
appendTo: target,
|
|
type: "div",
|
|
class: "box-comment"
|
|
});
|
|
|
|
}
|
|
|
|
//Empty comment container
|
|
else {
|
|
emptyElem(target);
|
|
var commentContainer = target;
|
|
}
|
|
|
|
// Save comment ID for later use
|
|
commentContainer.setAttribute("data-comment-id", infos.ID)
|
|
|
|
|
|
//Add user image
|
|
createElem2({
|
|
appendTo: commentContainer,
|
|
type: "img",
|
|
class: "img-circle imgs-sm",
|
|
src: user.accountImage
|
|
});
|
|
|
|
//Create comment text
|
|
var commentText = createElem2({
|
|
appendTo: commentContainer,
|
|
type: "div",
|
|
class: "comment-text"
|
|
});
|
|
|
|
//Add username
|
|
var userNameContainer = createElem2({
|
|
appendTo: commentText,
|
|
type: "span",
|
|
class: "username",
|
|
innerHTML: userFullName(user)
|
|
});
|
|
|
|
//Add right elements
|
|
var rightContainer = createElem2({
|
|
appendTo: userNameContainer,
|
|
type: "span",
|
|
class: "text-muted pull-right"
|
|
});
|
|
|
|
//Add comment creation date
|
|
createElem2({
|
|
appendTo: rightContainer,
|
|
type: "span",
|
|
innerHTML: lang("dates_ago", [ComunicWeb.common.date.timeDiffToStr(infos.time_sent)])
|
|
});
|
|
|
|
//Offer the user the possibility to delete and update the comment if he is allowed to do so
|
|
if(userID() == infos.userID){
|
|
|
|
//Create a button to update the comment
|
|
var editCommentLink = createElem2({
|
|
appendTo: rightContainer,
|
|
type: "a",
|
|
class: "edit-comment-link"
|
|
});
|
|
|
|
createElem2({
|
|
appendTo: editCommentLink,
|
|
type: "i",
|
|
class: "fa fa-edit"
|
|
});
|
|
|
|
//Make edit button lives
|
|
editCommentLink.onclick = function(){
|
|
|
|
//Open comment editor
|
|
ComunicWeb.components.comments.editor.open(infos, commentContainer);
|
|
|
|
}
|
|
|
|
|
|
//Create a button to delete the comment
|
|
var deleteCommentLink = createElem2({
|
|
appendTo: rightContainer,
|
|
type: "a",
|
|
class: "delete-comment-link"
|
|
});
|
|
|
|
createElem2({
|
|
appendTo: deleteCommentLink,
|
|
type: "i",
|
|
class: "fa fa-trash"
|
|
});
|
|
|
|
//Make delete button lives
|
|
deleteCommentLink.onclick = function(){
|
|
|
|
ComunicWeb.common.messages.confirm(lang("comments_ui_confirm_delete"), function(response){
|
|
|
|
//Check if user cancelled the operation
|
|
if(!response)
|
|
return;
|
|
|
|
//Hide the comment
|
|
commentContainer.style.visibility = "hidden";
|
|
|
|
//Delete the comment
|
|
ComunicWeb.components.comments.interface.delete(infos.ID, function(response){
|
|
|
|
commentContainer.style.visibility = "visible";
|
|
|
|
//Check for errors
|
|
if(response.error){
|
|
ComunicWeb.common.notificationSystem.showNotification(lang("comments_ui_err_delete_comment"), "danger");
|
|
return;
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
}
|
|
|
|
//Add comment content
|
|
var commentContent = createElem2({
|
|
appendTo: commentText,
|
|
type: "div",
|
|
class: "comment-content",
|
|
innerHTML: infos.content
|
|
});
|
|
|
|
//Parse emojies
|
|
ComunicWeb.components.textParser.parse({
|
|
element: commentContent,
|
|
user: user
|
|
});
|
|
|
|
//Add comment image (if any)
|
|
if(infos.img_url != null){
|
|
|
|
var commentImageContainer = createElem2({
|
|
appendTo: commentText,
|
|
type: "div",
|
|
class: "comment-img-container"
|
|
});
|
|
|
|
var commentImageLink = createElem2({
|
|
appendTo: commentImageContainer,
|
|
type: "a",
|
|
href: infos.img_url
|
|
});
|
|
|
|
createElem2({
|
|
appendTo: commentImageLink,
|
|
type: "img",
|
|
class: "comment-img",
|
|
src: infos.img_url
|
|
});
|
|
|
|
commentImageLink.onclick = function(){
|
|
$(this).ekkoLightbox({
|
|
alwaysShowClose: true,
|
|
});
|
|
return false;
|
|
}
|
|
|
|
}
|
|
|
|
//Load likes
|
|
var likesTarget = createElem2({
|
|
appendTo: commentText,
|
|
type: "div",
|
|
});
|
|
|
|
var userLiking = null;
|
|
if(signed_in()){
|
|
userLiking = infos.userlike;
|
|
}
|
|
|
|
//Call component
|
|
ComunicWeb.components.like.button.display(
|
|
"comment",
|
|
infos.ID,
|
|
infos.likes,
|
|
userLiking,
|
|
likesTarget
|
|
);
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ComunicWeb.components.comments.ui = CommentsUI;
|
|
|
|
// Register to new comments events
|
|
document.addEventListener("new_comment", async (e) => {
|
|
const comment = e.detail;
|
|
|
|
const target = document.querySelector("[data-for-post-id='"+comment.postID+"'].post-comments");
|
|
|
|
if(target == null)
|
|
return;
|
|
|
|
// Check if there is comment form to avoid or not
|
|
const insertBefore = target.querySelector(".comment-creation-form");
|
|
|
|
const newCommentTarget = createElem2({
|
|
insertBefore: insertBefore,
|
|
appendTo: insertBefore ? null : target,
|
|
type: "div",
|
|
class: "box-comment"
|
|
});
|
|
|
|
CommentsUI._show_comment(comment, await userInfo(comment.userID), newCommentTarget)
|
|
})
|
|
|
|
// Register to comments updates events
|
|
document.addEventListener("commentUpdated", async (e) => {
|
|
const comment = e.detail;
|
|
const target = document.querySelector("[data-comment-id='"+comment.ID+"']");
|
|
|
|
if(target == null)
|
|
return;
|
|
|
|
CommentsUI._show_comment(comment, await userInfo(comment.userID), target)
|
|
})
|
|
|
|
// Register to comments deletion events
|
|
document.addEventListener("commentDeleted", async (e) => {
|
|
const commentID = e.detail;
|
|
|
|
const target = document.querySelector("[data-comment-id='"+commentID+"']");
|
|
|
|
if(target == null)
|
|
return;
|
|
|
|
target.remove();
|
|
}); |