Prevent shortcut deploy when deploy button shaded

fixes #3509
This commit is contained in:
Steve-Mcl 2022-04-04 17:06:29 +01:00
parent 77e2e44abc
commit 780e41d6a6
1 changed files with 199 additions and 196 deletions

View File

@ -319,21 +319,25 @@ RED.deploy = (function() {
},delta); },delta);
}); });
} }
function save(skipValidation,force) { function save(skipValidation, force) {
if (!$("#red-ui-header-button-deploy").hasClass("disabled")) { if ($("#red-ui-header-button-deploy").hasClass("disabled")) {
return; //deploy is disabled
}
if ($("#red-ui-header-shade").is(":visible")) {
return; //deploy is shaded
}
if (!RED.user.hasPermission("flows.write")) { if (!RED.user.hasPermission("flows.write")) {
RED.notify(RED._("user.errors.deploy"),"error"); RED.notify(RED._("user.errors.deploy"), "error");
return; return;
} }
if (!skipValidation) { if (!skipValidation) {
var hasUnknown = false; let hasUnknown = false;
var hasInvalid = false; let hasInvalid = false;
var hasUnusedConfig = false; let hasUnusedConfig = false;
const unknownNodes = [];
const invalidNodes = [];
var unknownNodes = []; RED.nodes.eachConfig(function (node) {
var invalidNodes = [];
RED.nodes.eachConfig(function(node) {
if (node.valid === undefined) { if (node.valid === undefined) {
RED.editor.validateNode(node); RED.editor.validateNode(node);
} }
@ -346,7 +350,7 @@ RED.deploy = (function() {
} }
} }
}); });
RED.nodes.eachNode(function(node) { RED.nodes.eachNode(function (node) {
if (!node.valid && !node.d) { if (!node.valid && !node.d) {
invalidNodes.push(getNodeInfo(node)); invalidNodes.push(getNodeInfo(node));
} }
@ -359,31 +363,31 @@ RED.deploy = (function() {
hasUnknown = unknownNodes.length > 0; hasUnknown = unknownNodes.length > 0;
hasInvalid = invalidNodes.length > 0; hasInvalid = invalidNodes.length > 0;
var unusedConfigNodes = []; const unusedConfigNodes = [];
RED.nodes.eachConfig(function(node) { RED.nodes.eachConfig(function (node) {
if ((node._def.hasUsers !== false) && (node.users.length === 0)) { if ((node._def.hasUsers !== false) && (node.users.length === 0)) {
unusedConfigNodes.push(getNodeInfo(node)); unusedConfigNodes.push(getNodeInfo(node));
hasUnusedConfig = true; hasUnusedConfig = true;
} }
}); });
var showWarning = false; let showWarning = false;
var notificationMessage; let notificationMessage;
var notificationButtons = []; let notificationButtons = [];
var notification; let notification;
if (hasUnknown && !ignoreDeployWarnings.unknown) { if (hasUnknown && !ignoreDeployWarnings.unknown) {
showWarning = true; showWarning = true;
notificationMessage = "<p>"+RED._('deploy.confirm.unknown')+"</p>"+ notificationMessage = "<p>" + RED._('deploy.confirm.unknown') + "</p>" +
'<ul class="red-ui-deploy-dialog-confirm-list"><li>'+cropList(unknownNodes).map(function(n) { return sanitize(n) }).join("</li><li>")+"</li></ul><p>"+ '<ul class="red-ui-deploy-dialog-confirm-list"><li>' + cropList(unknownNodes).map(function (n) { return sanitize(n) }).join("</li><li>") + "</li></ul><p>" +
RED._('deploy.confirm.confirm')+ RED._('deploy.confirm.confirm') +
"</p>"; "</p>";
notificationButtons= [ notificationButtons = [
{ {
id: "red-ui-deploy-dialog-confirm-deploy-deploy", id: "red-ui-deploy-dialog-confirm-deploy-deploy",
text: RED._("deploy.confirm.button.confirm"), text: RED._("deploy.confirm.button.confirm"),
class: "primary", class: "primary",
click: function() { click: function () {
save(true); save(true);
notification.close(); notification.close();
} }
@ -393,16 +397,16 @@ RED.deploy = (function() {
showWarning = true; showWarning = true;
invalidNodes.sort(sortNodeInfo); invalidNodes.sort(sortNodeInfo);
notificationMessage = "<p>"+RED._('deploy.confirm.improperlyConfigured')+"</p>"+ notificationMessage = "<p>" + RED._('deploy.confirm.improperlyConfigured') + "</p>" +
'<ul class="red-ui-deploy-dialog-confirm-list"><li>'+cropList(invalidNodes.map(function(A) { return sanitize( (A.tab?"["+A.tab+"] ":"")+A.label+" ("+A.type+")")})).join("</li><li>")+"</li></ul><p>"+ '<ul class="red-ui-deploy-dialog-confirm-list"><li>' + cropList(invalidNodes.map(function (A) { return sanitize((A.tab ? "[" + A.tab + "] " : "") + A.label + " (" + A.type + ")") })).join("</li><li>") + "</li></ul><p>" +
RED._('deploy.confirm.confirm')+ RED._('deploy.confirm.confirm') +
"</p>"; "</p>";
notificationButtons= [ notificationButtons = [
{ {
id: "red-ui-deploy-dialog-confirm-deploy-deploy", id: "red-ui-deploy-dialog-confirm-deploy-deploy",
text: RED._("deploy.confirm.button.confirm"), text: RED._("deploy.confirm.button.confirm"),
class: "primary", class: "primary",
click: function() { click: function () {
save(true); save(true);
notification.close(); notification.close();
} }
@ -413,28 +417,28 @@ RED.deploy = (function() {
notificationButtons.unshift( notificationButtons.unshift(
{ {
text: RED._("common.label.cancel"), text: RED._("common.label.cancel"),
click: function() { click: function () {
notification.close(); notification.close();
} }
} }
); );
notification = RED.notify(notificationMessage,{ notification = RED.notify(notificationMessage, {
modal: true, modal: true,
fixed: true, fixed: true,
buttons:notificationButtons buttons: notificationButtons
}); });
return; return;
} }
} }
var nns = RED.nodes.createCompleteNodeSet(); const nns = RED.nodes.createCompleteNodeSet();
const startTime = Date.now();
var startTime = Date.now(); $(".red-ui-deploy-button-content").css('opacity', 0);
$(".red-ui-deploy-button-content").css('opacity',0);
$(".red-ui-deploy-button-spinner").show(); $(".red-ui-deploy-button-spinner").show();
$("#red-ui-header-button-deploy").addClass("disabled"); $("#red-ui-header-button-deploy").addClass("disabled");
var data = {flows:nns}; const data = { flows: nns };
if (!force) { if (!force) {
data.rev = RED.nodes.version(); data.rev = RED.nodes.version();
@ -446,25 +450,25 @@ RED.deploy = (function() {
$("#red-ui-palette-shade").show(); $("#red-ui-palette-shade").show();
$("#red-ui-sidebar-shade").show(); $("#red-ui-sidebar-shade").show();
$.ajax({ $.ajax({
url:"flows", url: "flows",
type: "POST", type: "POST",
data: JSON.stringify(data), data: JSON.stringify(data),
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
headers: { headers: {
"Node-RED-Deployment-Type":deploymentType "Node-RED-Deployment-Type": deploymentType
} }
}).done(function(data,textStatus,xhr) { }).done(function (data, textStatus, xhr) {
RED.nodes.dirty(false); RED.nodes.dirty(false);
RED.nodes.version(data.rev); RED.nodes.version(data.rev);
RED.nodes.originalFlow(nns); RED.nodes.originalFlow(nns);
if (hasUnusedConfig) { if (hasUnusedConfig) {
RED.notify( RED.notify(
'<p>'+RED._("deploy.successfulDeploy")+'</p>'+ '<p>' + RED._("deploy.successfulDeploy") + '</p>' +
'<p>'+RED._("deploy.unusedConfigNodes")+' <a href="#" onclick="RED.sidebar.config.show(true); return false;">'+RED._("deploy.unusedConfigNodesLink")+'</a></p>',"success",false,6000); '<p>' + RED._("deploy.unusedConfigNodes") + ' <a href="#" onclick="RED.sidebar.config.show(true); return false;">' + RED._("deploy.unusedConfigNodesLink") + '</a></p>', "success", false, 6000);
} else { } else {
RED.notify('<p>'+RED._("deploy.successfulDeploy")+'</p>',"success"); RED.notify('<p>' + RED._("deploy.successfulDeploy") + '</p>', "success");
} }
RED.nodes.eachNode(function(node) { RED.nodes.eachNode(function (node) {
if (node.changed) { if (node.changed) {
node.dirty = true; node.dirty = true;
node.changed = false; node.changed = false;
@ -473,7 +477,7 @@ RED.deploy = (function() {
node.dirty = true; node.dirty = true;
node.moved = false; node.moved = false;
} }
if(node.credentials) { if (node.credentials) {
delete node.credentials; delete node.credentials;
} }
}); });
@ -483,42 +487,41 @@ RED.deploy = (function() {
delete confNode.credentials; delete confNode.credentials;
} }
}); });
RED.nodes.eachSubflow(function(subflow) { RED.nodes.eachSubflow(function (subflow) {
subflow.changed = false; subflow.changed = false;
}); });
RED.nodes.eachWorkspace(function(ws) { RED.nodes.eachWorkspace(function (ws) {
ws.changed = false; ws.changed = false;
}); });
// Once deployed, cannot undo back to a clean state // Once deployed, cannot undo back to a clean state
RED.history.markAllDirty(); RED.history.markAllDirty();
RED.view.redraw(); RED.view.redraw();
RED.events.emit("deploy"); RED.events.emit("deploy");
}).fail(function(xhr,textStatus,err) { }).fail(function (xhr, textStatus, err) {
RED.nodes.dirty(true); RED.nodes.dirty(true);
$("#red-ui-header-button-deploy").removeClass("disabled"); $("#red-ui-header-button-deploy").removeClass("disabled");
if (xhr.status === 401) { if (xhr.status === 401) {
RED.notify(RED._("deploy.deployFailed",{message:RED._("user.notAuthorized")}),"error"); RED.notify(RED._("deploy.deployFailed", { message: RED._("user.notAuthorized") }), "error");
} else if (xhr.status === 409) { } else if (xhr.status === 409) {
resolveConflict(nns, true); resolveConflict(nns, true);
} else if (xhr.responseText) { } else if (xhr.responseText) {
RED.notify(RED._("deploy.deployFailed",{message:xhr.responseText}),"error"); RED.notify(RED._("deploy.deployFailed", { message: xhr.responseText }), "error");
} else { } else {
RED.notify(RED._("deploy.deployFailed",{message:RED._("deploy.errors.noResponse")}),"error"); RED.notify(RED._("deploy.deployFailed", { message: RED._("deploy.errors.noResponse") }), "error");
} }
}).always(function() { }).always(function () {
deployInflight = false; deployInflight = false;
var delta = Math.max(0,300-(Date.now()-startTime)); const delta = Math.max(0, 300 - (Date.now() - startTime));
setTimeout(function() { setTimeout(function () {
$(".red-ui-deploy-button-content").css('opacity',1); $(".red-ui-deploy-button-content").css('opacity', 1);
$(".red-ui-deploy-button-spinner").hide(); $(".red-ui-deploy-button-spinner").hide();
$("#red-ui-header-shade").hide(); $("#red-ui-header-shade").hide();
$("#red-ui-editor-shade").hide(); $("#red-ui-editor-shade").hide();
$("#red-ui-palette-shade").hide(); $("#red-ui-palette-shade").hide();
$("#red-ui-sidebar-shade").hide(); $("#red-ui-sidebar-shade").hide();
},delta); }, delta);
}); });
} }
}
return { return {
init: init, init: init,
setDeployInflight: function(state) { setDeployInflight: function(state) {