',{class:"palette-module-header"}).appendTo(row);
if (entry.label) {
- row.parent().addClass("palette-module-section");
+ if (entry.index === 0) {
+ headerRow.addClass("red-ui-search-empty")
+ } else {
+ row.parent().addClass("palette-module-section");
+ }
headerRow.text(entry.label);
if (entry.index === 1) {
var addButton = $('
').appendTo(headerRow).click(function(evt) {
@@ -358,6 +387,7 @@ RED.projects.settings = (function() {
});
}
} else {
+ headerRow.addClass("palette-module-header");
headerRow.toggleClass("palette-module-unused",entry.count === 0);
entry.element = headerRow;
var titleRow = $('
').appendTo(headerRow);
@@ -392,6 +422,216 @@ RED.projects.settings = (function() {
}
+ function createSettingsPane(activeProject) {
+ var pane = $('
').appendTo(pane);
+ if (activeProject.settings.credentialsEncrypted) {
+ $('
').appendTo(row);
+ }
+ var resetButton;
+ var action;
+ var changeButton = $('
')
+ .text(activeProject.settings.credentialsEncrypted?"Change key":"Enable encryption")
+ .appendTo(row)
+ .click(function(evt) {
+ evt.preventDefault();
+ newKey.val("");
+ if (currentKey) {
+ currentKey.val("");
+ currentKey.removeClass("input-error");
+ }
+ checkInputs();
+ saveButton.text("Save");
+
+ $(".project-settings-credentials-row").show();
+ $(".project-settings-credentials-current-row").show();
+ $(this).prop('disabled',true);
+ if (resetButton) {
+ resetButton.prop('disabled',true);
+ }
+ action = 'change';
+ });
+ if (activeProject.settings.credentialsEncrypted) {
+ resetButton = $('
')
+ .text("Reset key")
+ .appendTo(row)
+ .click(function(evt) {
+ evt.preventDefault();
+ newKey.val("");
+ if (currentKey) {
+ currentKey.val("");
+ currentKey.removeClass("input-error");
+ }
+ checkInputs();
+ saveButton.text("Reset key");
+
+ $(".project-settings-credentials-row").show();
+ $(".project-settings-credentials-reset-row").show();
+
+ $(this).prop('disabled',true);
+ changeButton.prop('disabled',true);
+ action = 'reset';
+ });
+ }
+
+ if (activeProject.settings.credentialsInvalid) {
+ row = $('
',{style:"position:relative"}).appendTo(pane);
+ var currentKey;
+ var newKey;
+
+ var checkInputs = function() {
+ var valid = true;
+ if (newKey.val().length === 0) {
+ valid = false;
+ }
+ if (currentKey && currentKey.val() === 0) {
+ valid = false;
+ }
+ saveButton.toggleClass('disabled',!valid);
+ }
+
+ if (activeProject.settings.credentialsEncrypted) {
+ if (!activeProject.settings.credentialsInvalid) {
+ row = $('
').appendTo(credentialsContainer);
+ $('
').appendTo(row);
+ currentKey = $('
').appendTo(row);
+ currentKey.on("change keyup paste",function() {
+ if (popover) {
+ popover.close();
+ popover = null;
+ $(this).removeClass('input-error');
+ }
+ checkInputs();
+ });
+ }
+ row = $('
').appendTo(credentialsContainer);
+ $('
Resetting the key will delete all existing credentials
').appendTo(row);
+
+ }
+ // $('
').appendTo(row);
+
+ row = $('
').appendTo(credentialsContainer);
+ $('
').text((activeProject.settings.credentialsEncrypted&& !activeProject.settings.credentialsInvalid)?"New key":"Encryption key").appendTo(row);
+ newKey = $('
').appendTo(row).on("change keyup paste",checkInputs);
+
+ row = $('
').appendTo(credentialsContainer);
+ var bg = $('
').appendTo(row);
+ $('
')
+ .appendTo(bg)
+ .click(function(evt) {
+ evt.preventDefault();
+ if (popover) {
+ popover.close();
+ popover = null;
+ }
+ changeButton.prop('disabled',false);
+ if (resetButton) {
+ resetButton.prop('disabled',false);
+ }
+ $(".project-settings-credentials-row").hide();
+ $(".project-settings-credentials-current-row").hide();
+ $(".project-settings-credentials-reset-row").hide();
+ });
+ var saveButton = $('
')
+ .text("Save")
+ .appendTo(bg)
+ .click(function(evt) {
+ evt.preventDefault();
+ if ($(this).hasClass('disabled')) {
+ return;
+ }
+ var spinner = addSpinnerOverlay(credentialsContainer);
+ var payload = {
+ credentialSecret: newKey.val()
+ };
+ if (activeProject.settings.credentialsInvalid) {
+ RED.deploy.setDeployInflight(true);
+ }
+
+ if (activeProject.settings.credentialsEncrypted) {
+ if (action === 'reset') {
+ payload.resetCredentialSecret = true;
+ } else if (!activeProject.settings.credentialsInvalid) {
+ payload.currentCredentialSecret = currentKey.val();
+ }
+ }
+ var done = function(err,res) {
+ spinner.remove();
+ if (err) {
+ console.log(err);
+ return;
+ }
+ }
+ utils.sendRequest({
+ url: "projects/"+activeProject.name,
+ type: "PUT",
+ responses: {
+ 0: function(error) {
+ done(error,null);
+ },
+ 200: function(data) {
+ if (popover) {
+ popover.close();
+ popover = null;
+ }
+ changeButton.prop('disabled',false);
+ if (resetButton) {
+ resetButton.prop('disabled',false);
+ }
+ $(".project-settings-credentials-row").hide();
+ $(".project-settings-credentials-current-row").hide();
+ $(".project-settings-credentials-reset-row").hide();
+ },
+ 400: {
+ 'unexpected_error': function(error) {
+ done(error,null);
+ },
+ 'missing_current_credential_key': function(error) {
+ currentKey.addClass("input-error");
+ popover = RED.popover.create({
+ target: currentKey,
+ direction: 'right',
+ size: 'small',
+ content: "Incorrect key"
+ }).open();
+ done();
+ }
+ },
+ }
+ },payload).always(function() {
+ if (activeProject.settings.credentialsInvalid) {
+ RED.deploy.setDeployInflight(false);
+ }
+ });
+ });
+
+
+
+ // $('
').text("Credentials").appendTo(pane);
+ // row = $('
').appendTo(pane);
+ // $('
Credentials are not encrypted').appendTo(row);
+ // $('
').appendTo(row);
+
+
+ // $('
').text("Repository").appendTo(pane);
+ // row = $('
').appendTo(pane);
+ // var input;
+ // $('
').appendTo(row);
+ // $('
').appendTo(row);
+
+
+ return pane;
+ }
+
+ var popover;
+
var utils;
var modulesInUse = {};
function init(_utils) {
@@ -408,6 +648,17 @@ RED.projects.settings = (function() {
get: createDependenciesPane,
close: function() { }
});
+ addPane({
+ id:'settings',
+ title: "Settings", // TODO: nls
+ get: createSettingsPane,
+ close: function() {
+ if (popover) {
+ popover.close();
+ popover = null;
+ }
+ }
+ });
RED.events.on('nodes:add', function(n) {
if (!/^subflow:/.test(n.type)) {
@@ -444,6 +695,10 @@ RED.projects.settings = (function() {
}
return {
init: init,
- show: show
+ show: show,
+ switchProject: function(name) {
+ // TODO: not ideal way to trigger this; should there be an editor-wide event?
+ modulesInUse = {};
+ }
};
})();
diff --git a/editor/js/ui/projects.js b/editor/js/ui/projects.js
index 8254deeb4..a78d094ec 100644
--- a/editor/js/ui/projects.js
+++ b/editor/js/ui/projects.js
@@ -273,61 +273,6 @@ RED.projects = (function() {
]
}
})(),
- 'credentialSecret': {
- content: function() {
- // Provide new secret or reset credentials.
- var container = $('
');
- var row = $('
').appendTo(container);
- // $('
').appendTo(row);
- $('
').appendTo(row);
- var projectSecret = $('
').appendTo(row);
-
- return container;
- },
- buttons: [
- {
- // id: "clipboard-dialog-cancel",
- text: RED._("common.label.cancel"),
- click: function() {
- dialog.dialog( "close" );
- }
- },
- {
- // id: "clipboard-dialog-cancel",
- text: "Update",
- click: function() {
- var done = function(err,data) {
- if (err) {
- console.log(err);
- }
- dialog.dialog( "close" );
- }
- RED.deploy.setDeployInflight(true);
- sendRequest({
- url: "projects/"+activeProject.name,
- type: "PUT",
- responses: {
- 200: function(data) {
- done(null,data);
- },
- 400: {
- 'credentials_load_failed': function(error) {
- done(error,null);
- },
- 'unexpected_error': function(error) {
- done(error,null);
- }
- },
- }
- },{credentialSecret:$('#projects-dialog-secret').val()}).always(function() {
- RED.deploy.setDeployInflight(false);
- })
-
-
- }
- }
- ]
- },
'open': {
content: function() {
return createProjectList({
@@ -371,7 +316,7 @@ RED.projects = (function() {
function switchProject(name,done) {
RED.deploy.setDeployInflight(true);
- modulesInUse = {};
+ RED.projects.settings.switchProject(name);
sendRequest({
url: "projects/"+name,
type: "PUT",
@@ -497,7 +442,7 @@ RED.projects = (function() {
console.log(err);
}).always(function() {
var delta = Date.now() - start;
- delta = Math.max(0,1000-delta);
+ delta = Math.max(0,500-delta);
setTimeout(function() {
// dialogBody.show();
$(".projects-dialog-spinner").hide();
@@ -967,7 +912,6 @@ function refresh() {
// updateProjectSummary();
// updateProjectDescription();
// updateProjectDependencies();
- console.log("project triggering a info refresh for ",activeProject)
RED.sidebar.info.refresh();
});
}
@@ -987,19 +931,13 @@ function refresh() {
selectProject: function() {
show('open')
},
- showCredentialsPrompt: function() {
- show('credentialSecret');
+ showCredentialsPrompt: function() { //TODO: rename this function
+ RED.projects.settings.show('settings');
},
// showSidebar: showSidebar,
refresh: refresh,
editProject: function() {
RED.projects.settings.show();
- // RED.editor.editProject({
- // project: activeProject,
- // complete: function(result) {
- // console.log(result);
- // }
- // });
},
getActiveProject: function() {
return activeProject;
diff --git a/editor/js/ui/tab-info.js b/editor/js/ui/tab-info.js
index 998d687ea..31b801d31 100644
--- a/editor/js/ui/tab-info.js
+++ b/editor/js/ui/tab-info.js
@@ -109,7 +109,6 @@ RED.sidebar.info = (function() {
return el;
}
function refresh(node) {
- console.log('sidebar.info.refresh');
if (node === undefined) {
refreshSelection();
return;
diff --git a/editor/sass/editor.scss b/editor/sass/editor.scss
index 9566d38dc..294bf75d0 100644
--- a/editor/sass/editor.scss
+++ b/editor/sass/editor.scss
@@ -196,6 +196,10 @@
text-decoration: underline;
}
+.form-warning {
+ border-color: #d6615f;
+}
+
.node-text-editor {
border:1px solid #ccc;
border-radius:5px;
diff --git a/editor/sass/mixins.scss b/editor/sass/mixins.scss
index 5f96329d5..fdfc1ad64 100644
--- a/editor/sass/mixins.scss
+++ b/editor/sass/mixins.scss
@@ -48,26 +48,26 @@
text-decoration: none;
cursor:pointer;
- &.disabled {
+ &.disabled, &:disabled {
cursor: default;
color: $workspace-button-color-disabled !important;
}
&:hover, &:focus {
text-decoration: none;
}
- &:not(.disabled):hover {
+ &:not(.disabled):not(:disabled):hover, {
color: $workspace-button-color-hover !important;
background: $workspace-button-background-hover;
}
- &:not(.disabled):focus {
+ &:not(.disabled):not(:disabled):focus {
color: $workspace-button-color-focus !important;
}
- &:not(.disabled):active {
+ &:not(.disabled):not(:disabled):active {
color: $workspace-button-color-active !important;
background: $workspace-button-background-active;
text-decoration: none;
}
- &.selected:not(.disabled) {
+ &.selected:not(.disabled):not(:disabled) {
color: $workspace-button-color-selected !important;
background: $workspace-button-background-active;
}
diff --git a/editor/templates/index.mst b/editor/templates/index.mst
index 4a8abe80b..502144117 100644
--- a/editor/templates/index.mst
+++ b/editor/templates/index.mst
@@ -234,21 +234,6 @@