From b0d333d85b3a8c34277afa9b8e96f41ac577d376 Mon Sep 17 00:00:00 2001 From: Pratik Vyas Date: Thu, 16 Jul 2015 12:55:10 +0530 Subject: [PATCH] Join and leave doc room on form-load and form-unload --- frappe/public/js/frappe/socket.js | 20 ++++++++++++++++++++ frappe/public/js/legacy/form.js | 6 ++++++ socketio.js | 13 +++++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/socket.js b/frappe/public/js/frappe/socket.js index c264292788..7dffe9ce04 100644 --- a/frappe/public/js/frappe/socket.js +++ b/frappe/public/js/frappe/socket.js @@ -8,12 +8,27 @@ frappe.socket = { frappe.socket.setup_listeners(); frappe.socket.setup_reconnect(); + $(document).on('form-load', function(e, frm) { + frappe.socket.doc_subscribe(frm.doctype, frm.docname); + }); + + $(document).on('form-unload', function(e, frm) { + frappe.socket.doc_unsubscribe(frm.doctype, frm.docname); + }); }, subscribe: function(task_id, opts) { frappe.socket.socket.emit('task_subscribe', task_id); frappe.socket.socket.emit('progress_subscribe', task_id); frappe.socket.open_tasks[task_id] = opts; + }, + doc_subscribe: function(doctype, docname) { + frappe.socket.socket.emit('doc_subscribe', doctype, docname); + frappe.socket.open_doc = {doctype: doctype, docname: docname}; + }, + doc_unsubscribe: function(doctype, docname) { + frappe.socket.socket.emit('doc_unsubscribe', doctype, docname); + frappe.socket.open_doc = null; }, setup_listeners: function() { frappe.socket.socket.on('task_status_change', function(data) { @@ -37,6 +52,10 @@ frappe.socket = { frappe.socket.subscribe(task_id, opts); }); }); + + if(frappe.socket.open_doc) { + frappe.socket.doc_subscribe(frappe.socket.open_doc.doctype, frappe.socket.open_doc.docname); + } }, process_response: function(data, method) { if(!data) { @@ -58,3 +77,4 @@ frappe.socket = { } $(frappe.socket.init); + diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index a7ef72e5c8..9cb2c44446 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -391,8 +391,13 @@ _f.Frm.prototype.refresh = function(docname) { // load the record for the first time, if not loaded (call 'onload') cur_frm.cscript.is_onload = false; if(!this.opendocs[this.docname]) { + var me = this; cur_frm.cscript.is_onload = true; this.setnewdoc(); + $(document).trigger("form-load", [this]); + $(this.page.wrapper).on('hide', function(e) { + $(document).trigger("form-unload", [me]); + }) } else { this.render_form(is_a_different_doc); } @@ -815,3 +820,4 @@ _f.Frm.prototype.validate_form_action = function(action) { _f.Frm.prototype.get_handlers = function(fieldname, doctype, docname) { return this.script_manager.get_handlers(fieldname, doctype || this.doctype, docname || this.docname) } + diff --git a/socketio.js b/socketio.js index 47068197c4..b84a5ba96a 100644 --- a/socketio.js +++ b/socketio.js @@ -37,10 +37,15 @@ io.on('connection', function(socket){ }) .end(function(err, res) { if(res.status == 200) { - socket.join('doc:'+ doctype + '/' + docname); + var room = get_doc_room(doctype, docname); + socket.join(room); } }) - }) + }); + socket.on('doc_unsubscribe', function(doctype, docname) { + var room = get_doc_room(doctype, docname); + socket.leave(room); + }); }); function send_existing_lines(task_id, socket) { @@ -65,3 +70,7 @@ subscriber.subscribe("events"); http.listen(3000, function(){ console.log('listening on *:3000'); }); + +function get_doc_room(doctype, docname) { + return 'doc:'+ doctype + '/' + docname; +}