From 7e71818c55289b07cf488de21eb6d265ba2abb38 Mon Sep 17 00:00:00 2001 From: Mark Williams Date: Fri, 21 Nov 2025 11:00:19 +0000 Subject: [PATCH] LIMS-1854: Prevent submission of multiple reprocessing jobs --- api/src/Page/Process.php | 4 ++-- .../js/modules/dc/views/downstreamreprocess.js | 9 ++++++++- client/src/js/modules/dc/views/reprocess.js | 14 ++++++++++++-- .../src/js/modules/mc/views/datacollections.js | 17 ++++++++++++++--- client/src/js/templates/mc/datacollections.html | 4 ++-- client/src/js/utils.js | 12 +++++++----- 6 files changed, 45 insertions(+), 15 deletions(-) diff --git a/api/src/Page/Process.php b/api/src/Page/Process.php index b41cb22d9..317c0b19d 100644 --- a/api/src/Page/Process.php +++ b/api/src/Page/Process.php @@ -383,7 +383,7 @@ function _enqueue() ); $this->_send_zocalo_message($rabbitmq_zocalo_vhost, $message); - $this->_output(new \stdClass); + $this->_output('Job successfully submitted'); } function _enqueue_downstream() @@ -413,7 +413,7 @@ function _enqueue_downstream() $this->_submit_zocalo_recipe($this->arg('RECIPE'), $parameters); - $this->_output(new \stdClass); + $this->_output('Job successfully submitted'); } /* diff --git a/client/src/js/modules/dc/views/downstreamreprocess.js b/client/src/js/modules/dc/views/downstreamreprocess.js index 1ea5f86d7..b9b58e603 100644 --- a/client/src/js/modules/dc/views/downstreamreprocess.js +++ b/client/src/js/modules/dc/views/downstreamreprocess.js @@ -138,12 +138,19 @@ define(['backbone', 'marionette', 'views/dialog', submit: function(e) { e.preventDefault() - + this._disableIntegrateButton() this._enqueue({ RECIPE: this.model.get('PIPELINE'), DATACOLLECTIONID: this.model.get('ID'), SCALINGID: this.scalingid }) app.message({ message: 'Downstream processing job successfully submitted'}) }, + _disableIntegrateButton: function() { + var btn = $('.ui-dialog-buttonpane button:contains("Submit")') + btn.button('disable').button('option', 'label', 'Submitted!') + setTimeout(function() { + btn.button('enable').button('option', 'label', 'Submit') + }, 5000) + }, _enqueue: function(options) { Backbone.ajax({ diff --git a/client/src/js/modules/dc/views/reprocess.js b/client/src/js/modules/dc/views/reprocess.js index 27a8a5b6d..8ed8b3f5d 100644 --- a/client/src/js/modules/dc/views/reprocess.js +++ b/client/src/js/modules/dc/views/reprocess.js @@ -352,6 +352,7 @@ define(['backbone', 'marionette', 'views/dialog', integrate: function(e) { e.preventDefault() + this._disableIntegrateButton() var s = this.collection.where({ selected: true }) if (!s.length) { @@ -449,10 +450,10 @@ define(['backbone', 'marionette', 'views/dialog', }, this) $.when.apply($, reqs).done(function() { - app.message({ message: jobs+' reprocessing job(s) successfully submitted'}) _.each(rps, function(rp) { self._enqueue({ PROCESSINGJOBID: rp.get('PROCESSINGJOBID') }) }) + app.message({ message: jobs+' reprocessing job(s) successfully submitted'}) }) @@ -541,9 +542,9 @@ define(['backbone', 'marionette', 'views/dialog', reqs.push(reprocessingsweeps.save()) $.when.apply($, reqs).done(function() { - app.message({ message: '1 reprocessing job successfully submitted'}) self._enqueue({ PROCESSINGJOBID: reprocessing.get('PROCESSINGJOBID') }) }) + app.message({ message: '1 reprocessing job successfully submitted'}) }, error: function() { @@ -555,6 +556,15 @@ define(['backbone', 'marionette', 'views/dialog', }, + _disableIntegrateButton: function() { + var btn = $('.ui-dialog-buttonpane button:contains("Integrate")') + btn.button('disable').button('option', 'label', 'Submitted!') + setTimeout(function() { + btn.button('enable').button('option', 'label', 'Integrate') + }, 5000) + }, + + _enqueue: function(options) { Backbone.ajax({ url: app.apiurl+'/process/enqueue', diff --git a/client/src/js/modules/mc/views/datacollections.js b/client/src/js/modules/mc/views/datacollections.js index 1e5c70493..5ca413450 100644 --- a/client/src/js/modules/mc/views/datacollections.js +++ b/client/src/js/modules/mc/views/datacollections.js @@ -60,7 +60,7 @@ define(['backbone', 'marionette', events: { 'click .integrate': 'integrate', - 'click a.opt': 'toggleOpts', + 'click button.opt': 'toggleOpts', 'change @ui.pipeline': 'updatePipeline', }, @@ -106,11 +106,12 @@ define(['backbone', 'marionette', integrate: function(e) { e.preventDefault() + this._disableIntegrateButton() var s = this.collection.where({ selected: true }) if (!s.length) { - utils.confirm({ title: 'No data collections selected', content: 'Please selected some data sets to integrate' }) + utils.confirm({ title: 'No data collections selected', content: 'Please select some data sets to integrate', buttons: {'Ok': 'closeDialog'}}) return } @@ -198,8 +199,8 @@ define(['backbone', 'marionette', var reprocessingsweeps = new ReprocessingImageSweeps(sweeps) reprocessingsweeps.save() - app.message({ message: '1 reprocessing job successfully submitted'}) self._enqueue({ PROCESSINGJOBID: reprocessing.get('PROCESSINGJOBID') }) + app.message({ message: 'Reprocessing job successfully submitted'}) }, error: function() { @@ -210,6 +211,16 @@ define(['backbone', 'marionette', }, + _disableIntegrateButton: function() { + var btn = $('button.integrate') + var btnHtml = btn.html() + btn.prop('disabled', true).html(' Submitted!'); + setTimeout(function() { + btn.prop('disabled', false).html(btnHtml); + }, 5000) + }, + + _enqueue: function(options) { Backbone.ajax({ url: app.apiurl+'/process/enqueue', diff --git a/client/src/js/templates/mc/datacollections.html b/client/src/js/templates/mc/datacollections.html index 9af214cb3..6cad6eb85 100644 --- a/client/src/js/templates/mc/datacollections.html +++ b/client/src/js/templates/mc/datacollections.html @@ -32,8 +32,8 @@

Data Collections for <%-VISIT%>

- Integrate - Xia2 Options + +
diff --git a/client/src/js/utils.js b/client/src/js/utils.js index aea8e7fda..a469e020f 100644 --- a/client/src/js/utils.js +++ b/client/src/js/utils.js @@ -81,10 +81,10 @@ define(['backbone', }, events: { - 'click a.dismiss': 'disimss', + 'click a.dismiss': 'dismiss', }, - disimss: function(e) { + dismiss: function(e) { e.preventDefault() this.destroy() }, @@ -118,13 +118,15 @@ define(['backbone', var ConfirmDialog = DialogView.extend({ title: options.title, template: _.template(options.content), - buttons: { + buttons: options.buttons || { 'Ok': 'onOK', 'Cancel': 'closeDialog', }, onOK: function() { - options.callback() + if (typeof options.callback === 'function') { + options.callback(); + } this.closeDialog() }, }) @@ -236,4 +238,4 @@ define(['backbone', return utils -}) \ No newline at end of file +})