From b22244d6d0dc8d3e4cf124eadb09cb09d9574f24 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Sun, 22 Feb 2015 16:28:26 +0200 Subject: web client: ignore navigation events when UI is blocked eliminates race condition when sorting list elements by dragging from an anchor --- web/blocking.js | 20 ++++++++++++++++++++ web/client.js | 28 ++++++++++++++++++++-------- web/transaction.js | 10 +++++----- 3 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 web/blocking.js diff --git a/web/blocking.js b/web/blocking.js new file mode 100644 index 0000000..d45992f --- /dev/null +++ b/web/blocking.js @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2012-2015 Kaarle Ritvanen + * See LICENSE file for license details + */ + +define(["jquery", "jquery-blockui"], function($) { + var enabled = false; + + return { + enable: function() { + $.blockUI(); + enabled = true; + }, + disable: function() { + $.unblockUI(); + enabled = false; + }, + isEnabled: function() { return enabled; } + }; +}); diff --git a/web/client.js b/web/client.js index 346e458..0dd510a 100644 --- a/web/client.js +++ b/web/client.js @@ -1,10 +1,11 @@ /* - * Copyright (c) 2012-2014 Kaarle Ritvanen + * Copyright (c) 2012-2015 Kaarle Ritvanen * See LICENSE file for license details */ define( [ + "aconf/blocking", "aconf/dom", "aconf/error", "aconf/navigation", @@ -17,11 +18,20 @@ define( "underscore", "aconf/layout/stacked", "aconf/layout/tabular", - "domReady", - "jquery-blockui" + "domReady" ], function( - dom, formatError, navi, pth, statusBar, txnMgr, type, Inline, $, _ + blocking, + dom, + formatError, + navi, + pth, + statusBar, + txnMgr, + type, + Inline, + $, + _ ) { return function() { $("#login").submit(function() { @@ -194,11 +204,11 @@ define( function clearState() { statusBar.reset(); render(); - $.unblockUI(); + blocking.disable(); } $("#commit").click(function() { - $.blockUI(); + blocking.enable(); txnMgr.commit().done(clearState).fail(function(xhr) { statusBar.setError( formatError("Commit failed", xhr), "txn" @@ -206,7 +216,7 @@ define( }) }); $("#revert").click(function() { - $.blockUI(); + blocking.enable(); txnMgr.abort(); clearState(); }); @@ -220,7 +230,9 @@ define( statusBar.reset(); $("#content").empty(); - $(window).bind("hashchange", render); + $(window).bind("hashchange", function() { + if (!blocking.isEnabled()) render(); + }); navi.setPath("/"); }).fail(function() { diff --git a/web/transaction.js b/web/transaction.js index 5c0488d..3d4a953 100644 --- a/web/transaction.js +++ b/web/transaction.js @@ -1,11 +1,11 @@ /* - * Copyright (c) 2012-2014 Kaarle Ritvanen + * Copyright (c) 2012-2015 Kaarle Ritvanen * See LICENSE file for license details */ define( - ["aconf/path", "aconf/type", "jquery", "underscore", "jquery-blockui"], - function(pth, type, $, _) { + ["aconf/blocking", "aconf/path", "aconf/type", "jquery", "underscore"], + function(blocking, pth, type, $, _) { return function(token, saveRequired) { var txnMgr = {}; @@ -39,7 +39,7 @@ define( } function exclusive(task) { - $.blockUI(); + blocking.enable(); var def = $.Deferred(); function resolve(txnValid) { def.resolve(txnValid); } @@ -55,7 +55,7 @@ define( tasks[0].always(function() { exclusive(task).done(resolve).fail(reject); }); - else task().always($.unblockUI).done(resolve).fail(reject); + else task().always(blocking.disable).done(resolve).fail(reject); return def; } -- cgit v1.2.3