diff --git a/frappe/public/js/frappe/ui/like.js b/frappe/public/js/frappe/ui/like.js index b8fa87e778..07a984a769 100644 --- a/frappe/public/js/frappe/ui/like.js +++ b/frappe/public/js/frappe/ui/like.js @@ -2,21 +2,15 @@ // MIT License. See license.txt frappe.ui.is_liked = function (doc) { - var liked = frappe.ui.get_liked_by(doc); - return liked.indexOf(frappe.session.user) === -1 ? false : true; + return frappe.ui.get_liked_by(doc).includes(frappe.session.user); }; frappe.ui.get_liked_by = function (doc) { - var liked = doc._liked_by; - if (liked) { - liked = JSON.parse(liked); - } - - return liked || []; + return doc._liked_by ? JSON.parse(doc._liked_by) : []; }; frappe.ui.toggle_like = function ($btn, doctype, name, callback) { - var add = $btn.hasClass("not-liked") ? "Yes" : "No"; + const add = $btn.hasClass("not-liked") ? "Yes" : "No"; // disable click $btn.css("pointer-events", "none"); @@ -32,32 +26,31 @@ frappe.ui.toggle_like = function ($btn, doctype, name, callback) { // renable click $btn.css("pointer-events", "auto"); - if (!r.exc) { - for (const like of document.querySelectorAll(".like-action")) { - if (like.dataset.name === name && like.dataset.doctype === doctype) { - like.classList.toggle("not-liked", add === "No"); - like.classList.toggle("liked", add === "Yes"); - } + if (r.exc) { + return; + } + + $btn.toggleClass("not-liked", add === "No"); + $btn.toggleClass("liked", add === "Yes"); + + // update in locals (form) + const doc = locals[doctype] && locals[doctype][name]; + if (doc) { + let liked_by = frappe.ui.get_liked_by(doc); + + if (add === "Yes" && !liked_by.includes(frappe.session.user)) { + liked_by.push(frappe.session.user); } - // update in locals (form) - var doc = locals[doctype] && locals[doctype][name]; - if (doc) { - var liked_by = JSON.parse(doc._liked_by || "[]"), - idx = liked_by.indexOf(frappe.session.user); - if (add === "Yes") { - if (idx === -1) liked_by.push(frappe.session.user); - } else { - if (idx !== -1) { - liked_by = liked_by.slice(0, idx).concat(liked_by.slice(idx + 1)); - } - } - doc._liked_by = JSON.stringify(liked_by); + if (add === "No" && liked_by.includes(frappe.session.user)) { + liked_by = liked_by.filter((user) => user !== frappe.session.user); } - if (callback) { - callback(); - } + doc._liked_by = JSON.stringify(liked_by); + } + + if (callback) { + callback(); } }, });