From 2b7e4554c4e0dc6efeffecb5e699e1a666388190 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 16 Nov 2022 15:04:55 +0530 Subject: [PATCH] fix(desk): maintain realtime & cached data consistency - Clear docinfo_update callbacks before setting one; ensure only one active callback at any given point. - Remove document from local cache if list_update sent if not edited --- frappe/public/js/frappe/form/form.js | 22 ++++++++++++---------- frappe/public/js/frappe/list/list_view.js | 4 ++++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 60ec53250a..faebdf3493 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1944,21 +1944,24 @@ frappe.ui.form.Form = class FrappeForm { let docname = this.docname; frappe.socketio.doc_subscribe(doctype, docname); - - if (frappe.socketio.is_docinfo_listener_setup) { - return; - } - + frappe.realtime.off("docinfo_update"); frappe.realtime.on("docinfo_update", ({ doc, key, action = "update" }) => { - let doc_list = frappe.model.docinfo[doctype][docname][key] || []; - if (action === "add") { - frappe.model.docinfo[doctype][docname][key].push(doc); + if ( + !doc.reference_doctype || + !doc.reference_name || + doc.reference_doctype !== doctype || + doc.reference_name !== docname + ) { + return; } - + let doc_list = frappe.model.docinfo[doctype][docname][key] || []; let docindex = doc_list.findIndex((old_doc) => { return old_doc.name === doc.name; }); + if (action === "add") { + frappe.model.docinfo[doctype][docname][key].push(doc); + } if (docindex > -1) { if (action === "update") { frappe.model.docinfo[doctype][docname][key].splice(docindex, 1, doc); @@ -1979,7 +1982,6 @@ frappe.ui.form.Form = class FrappeForm { this.timeline && this.timeline.refresh(); } }); - frappe.socketio.is_docinfo_listener_setup = true; } // Filters fields from the reference doctype and sets them as options for a Select field diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index a71cdf0a35..c0bd534140 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -1317,6 +1317,10 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } frappe.socketio.list_subscribe(this.doctype); frappe.realtime.on("list_update", (data) => { + if (!frappe.get_doc(data?.doctype, data?.name)?.__unsaved) { + frappe.model.remove_from_locals(data.doctype, data.name); + } + if (this.avoid_realtime_update()) { return; }