diff --git a/.travis.yml b/.travis.yml index 328a85ef7..054edefba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ matrix: include: - node_js: "10" script: - - istanbul cover ./node_modules/.bin/grunt --report lcovonly && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage + - ./node_modules/.bin/grunt && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage before_script: - npm install -g istanbul coveralls - node_js: "8" diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d6cccb65..2a73106c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +#### 0.18.7: Maintenance Release + +Editor Fixes + + - Do not trim wires if node declares outputs in defaults but misses value Fixes #1737 + +Node Fixes + + - Relax twitter node version ready for major version bump + - Pass Date into the Function node sandbox to fix instanceof tests + - let TCP in node report remote ip and port when in single packet mode + - typo fix in node help (#1735) + +Other Fixes + - Tidy up default grunt task and fixup test break due to reorder Fixes #1738 + - Bump jsonata version + #### 0.18.6: Maintenance Release Editor Fixes diff --git a/Gruntfile.js b/Gruntfile.js index 1c01aa618..fb609c992 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -55,7 +55,7 @@ module.exports = function(grunt) { reportFormats: ['lcov','html'], print: 'both' }, - all: { src: ['test/**/*_spec.js'] }, + all: { src: ["test/_spec.js","test/red/**/*_spec.js","test/nodes/**/*_spec.js"] }, core: { src: ["test/_spec.js","test/red/**/*_spec.js"]}, nodes: { src: ["test/nodes/**/*_spec.js"]} }, @@ -495,7 +495,7 @@ module.exports = function(grunt) { grunt.registerTask('default', 'Builds editor content then runs code style checks and unit tests on all components', - ['build','test-core','test-editor','test-nodes']); + ['build','jshint:editor','mocha_istanbul:all']); grunt.registerTask('test-core', 'Runs code style check and unit tests on core runtime code', diff --git a/editor/js/nodes.js b/editor/js/nodes.js index 0a2fe7268..433e400a2 100644 --- a/editor/js/nodes.js +++ b/editor/js/nodes.js @@ -1033,15 +1033,31 @@ RED.nodes = (function() { node.type = "unknown"; } if (node._def.category != "config") { - node.inputs = n.inputs||node._def.inputs; - node.outputs = n.outputs||node._def.outputs; - // If 'wires' is longer than outputs, clip wires + if (n.hasOwnProperty('inputs')) { + node.inputs = n.inputs; + node._config.inputs = JSON.stringify(n.inputs); + } else { + node.inputs = node._def.inputs; + } + if (n.hasOwnProperty('outputs')) { + node.outputs = n.outputs; + node._config.outputs = JSON.stringify(n.outputs); + } else { + node.outputs = node._def.outputs; + } if (node.hasOwnProperty('wires') && node.wires.length > node.outputs) { - console.log("Warning: node.wires longer than node.outputs - trimming wires:",node.id," wires:",node.wires.length," outputs:",node.outputs); - node.wires = node.wires.slice(0,node.outputs); + if (!node._def.defaults.hasOwnProperty("outputs") || !isNaN(parseInt(n.outputs))) { + // If 'wires' is longer than outputs, clip wires + console.log("Warning: node.wires longer than node.outputs - trimming wires:",node.id," wires:",node.wires.length," outputs:",node.outputs); + node.wires = node.wires.slice(0,node.outputs); + } else { + // The node declares outputs in its defaults, but has not got a valid value + // Defer to the length of the wires array + node.outputs = node.wires.length; + } } for (d in node._def.defaults) { - if (node._def.defaults.hasOwnProperty(d)) { + if (node._def.defaults.hasOwnProperty(d) && d !== 'inputs' && d !== 'outputs') { node[d] = n[d]; node._config[d] = JSON.stringify(n[d]); } diff --git a/editor/js/red.js b/editor/js/red.js index fa6f62083..8acf93d67 100644 --- a/editor/js/red.js +++ b/editor/js/red.js @@ -176,13 +176,13 @@ var RED = (function() { loadFlows(function() { var project = RED.projects.getActiveProject(); var message = { - "change-branch":"Change to local branch '"+project.git.branches.local+"'", - "merge-abort":"Git merge aborted", - "loaded":"Project '"+msg.project+"' loaded", - "updated":"Project '"+msg.project+"' updated", - "pull":"Project '"+msg.project+"' reloaded", - "revert": "Project '"+msg.project+"' reloaded", - "merge-complete":"Git merge completed" + "change-branch": RED._("notification.project.change-branch", {project: project.git.branches.local}), + "merge-abort": RED._("notification.project.merge-abort"), + "loaded": RED._("notification.project.loaded", {project: msg.project}), + "updated": RED._("notification.project.updated", {project: msg.project}), + "pull": RED._("notification.project.pull", {project: msg.project}), + "revert": RED._("notification.project.revert", {project: msg.project}), + "merge-complete": RED._("notification.project.merge-complete") }[msg.action]; RED.notify("

"+message+"

"); RED.sidebar.info.refresh() @@ -206,7 +206,7 @@ var RED = (function() { if (!!RED.projects.getActiveProject()) { options.buttons = [ { - text: "Manage project dependencies", + text: RED._("notification.label.manage-project-dep"), click: function() { persistentNotifications[notificationId].hideNotification(); RED.projects.settings.show('deps'); @@ -217,7 +217,7 @@ var RED = (function() { } else { options.buttons = [ { - text: "Close", + text: RED._("common.label.close"), click: function() { persistentNotifications[notificationId].hideNotification(); } diff --git a/editor/js/ui/diff.js b/editor/js/ui/diff.js index 4a305eb6c..eb822df1e 100644 --- a/editor/js/ui/diff.js +++ b/editor/js/ui/diff.js @@ -1233,7 +1233,7 @@ RED.diff = (function() { // currentDiff = diff; var trayOptions = { - title: options.title||"Review Changes", //TODO: nls + title: options.title||RED._("diff.reviewChanges"), width: Infinity, overlay: true, buttons: [ @@ -1416,7 +1416,7 @@ RED.diff = (function() { function showTextDiff(textA,textB) { var trayOptions = { - title: "Compare Changes", //TODO: nls + title: RED._("diff.compareChanges"), width: Infinity, overlay: true, buttons: [ @@ -1747,7 +1747,7 @@ RED.diff = (function() { try { commonFlow = JSON.parse(commonVersion.content||"[]"); } catch(err) { - console.log("Common Version doesn't contain valid JSON:",commonVersionUrl); + console.log(RED._("diff.commonVersionError"),commonVersionUrl); console.log(err); return; } @@ -1755,7 +1755,7 @@ RED.diff = (function() { try { oldFlow = JSON.parse(oldVersion.content||"[]"); } catch(err) { - console.log("Old Version doesn't contain valid JSON:",oldVersionUrl); + console.log(RED._("diff.oldVersionError"),oldVersionUrl); console.log(err); return; } @@ -1765,7 +1765,7 @@ RED.diff = (function() { try { newFlow = JSON.parse(newVersion.content||"[]"); } catch(err) { - console.log("New Version doesn't contain valid JSON:",newFlow); + console.log(RED._("diff.newVersionError"),newFlow); console.log(err); return; } @@ -1797,11 +1797,11 @@ RED.diff = (function() { if (isBinary) { var diffBinaryRow = $('').appendTo(codeBody); var binaryContent = $('').appendTo(diffBinaryRow); - $('').text("Cannot show binary file contents").appendTo(binaryContent); + $('').text(RED._("diff.noBinaryFileShowed")).appendTo(binaryContent); } else { if (commitOptions.unmerged) { - conflictHeader = $(''+resolvedConflicts+' of '+unresolvedConflicts+' conflicts resolved').appendTo(content); + conflictHeader = $(''+RED._("diff.conflictHeader",{resolved:resolvedConflicts, unresolved:unresolvedConflicts})+'').appendTo(content); } hunks.forEach(function(hunk) { var diffRow = $('').appendTo(codeBody); @@ -1914,7 +1914,7 @@ RED.diff = (function() { diffRow.remove(); addedRows.find(".linetext").addClass('added'); conflictHeader.empty(); - $(''+resolvedConflicts+' of '+unresolvedConflicts+' conflicts resolved').appendTo(conflictHeader); + $(''+RED._("diff.conflictHeader",{resolved:resolvedConflicts, unresolved:unresolvedConflicts})+'').appendTo(conflictHeader); conflictResolutions[file.file] = conflictResolutions[file.file] || {}; conflictResolutions[file.file][hunk.localChangeStart] = { @@ -1946,7 +1946,7 @@ RED.diff = (function() { function showCommitDiff(options) { var commit = parseCommitDiff(options.commit); var trayOptions = { - title: "View Commit Changes", //TODO: nls + title: RED._("diff.viewCommitDiff"), width: Infinity, overlay: true, buttons: [ @@ -2008,7 +2008,7 @@ RED.diff = (function() { } var trayOptions = { - title: title||"Compare Changes", //TODO: nls + title: title|| RED._("diff.compareChanges"), width: Infinity, overlay: true, buttons: [ @@ -2041,7 +2041,7 @@ RED.diff = (function() { trayOptions.buttons.push( { id: "node-diff-view-resolve-diff", - text: "Save conflict resolution", + text: RED._("diff.saveConflict"), class: "primary disabled", click: function() { if (!$("#node-diff-view-resolve-diff").hasClass('disabled')) { diff --git a/editor/js/ui/projects/projectSettings.js b/editor/js/ui/projects/projectSettings.js index 91dbb57ff..011c9fbe7 100644 --- a/editor/js/ui/projects/projectSettings.js +++ b/editor/js/ui/projects/projectSettings.js @@ -49,7 +49,7 @@ RED.projects.settings = (function() { var tabContainer; var trayOptions = { - title: "Project Settings",// RED._("menu.label.userSettings"),, // TODO: nls + title: RED._("menu.label.userSettings"), buttons: [ { id: "node-dialog-ok", @@ -173,14 +173,14 @@ RED.projects.settings = (function() { container.empty(); var bg = $('').appendTo(container); var input = $('').val(summary||"").appendTo(container); - $('') + $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); updateProjectSummary(activeProject.summary, container); editButton.show(); }); - $('') + $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); @@ -223,7 +223,7 @@ RED.projects.settings = (function() { if (summary) { container.text(summary).removeClass('node-info-node'); } else { - container.text("No summary available").addClass('node-info-none');// TODO: nls + container.text(RED._("sidebar.project.projectSettings.noSummaryAvailable")).addClass('node-info-none'); } } @@ -235,7 +235,7 @@ RED.projects.settings = (function() { var summaryContent = $('
',{style:"color: #999"}).appendTo(summary); updateProjectSummary(activeProject.summary, summaryContent); if (RED.user.hasPermission("projects.write")) { - $('') + $('') .prependTo(summary) .click(function(evt) { evt.preventDefault(); @@ -250,7 +250,7 @@ RED.projects.settings = (function() { updateProjectDescription(activeProject, descriptionContent); if (RED.user.hasPermission("projects.write")) { - $('') + $('') .prependTo(description) .click(function(evt) { evt.preventDefault(); @@ -316,7 +316,7 @@ RED.projects.settings = (function() { // depsList.editableList('addItem',{index:3, label:"Unused dependencies"}); // TODO: nls // } if (totalCount === 0) { - depsList.editableList('addItem',{index:0, label:"None"}); // TODO: nls + depsList.editableList('addItem',{index:0, label:RED._("sidebar.project.projectSettings.none")}); } } @@ -381,7 +381,7 @@ RED.projects.settings = (function() { function createDependenciesPane(activeProject) { var pane = $('
'); if (RED.user.hasPermission("projects.write")) { - $('') + $('') .appendTo(pane) .click(function(evt) { evt.preventDefault(); @@ -451,7 +451,7 @@ RED.projects.settings = (function() { var buttons = $('
').appendTo(metaRow); if (RED.user.hasPermission("projects.write")) { if (!entry.installed && RED.settings.theme('palette.editable') !== false) { - $('install').appendTo(buttons) + $('' + RED._("sidebar.project.projectSettings.install") + '').appendTo(buttons) .click(function(evt) { evt.preventDefault(); RED.palette.editor.install(entry,row,function(err) { @@ -468,7 +468,7 @@ RED.projects.settings = (function() { }); }) } else if (entry.known && entry.count === 0) { - $('remove from project').appendTo(buttons) + $('' + RED._("sidebar.project.projectSettings.removeFromProject") + '').appendTo(buttons) .click(function(evt) { evt.preventDefault(); var deps = $.extend(true, {}, activeProject.dependencies); @@ -484,7 +484,7 @@ RED.projects.settings = (function() { }); }); } else if (!entry.known) { - $('add to project').appendTo(buttons) + $('' + RED._("sidebar.project.projectSettings.addToProject") + '').appendTo(buttons) .click(function(evt) { evt.preventDefault(); var deps = $.extend(true, {}, activeProject.dependencies); @@ -723,10 +723,10 @@ RED.projects.settings = (function() { // } function createFilesSection(activeProject,pane) { - var title = $('

').text("Files").appendTo(pane); + var title = $('

').text(RED._("sidebar.project.projectSettings.files")).appendTo(pane); var filesContainer = $('
').appendTo(pane); if (RED.user.hasPermission("projects.write")) { - var editFilesButton = $('') + var editFilesButton = $('') .appendTo(title) .click(function(evt) { evt.preventDefault(); @@ -750,7 +750,7 @@ RED.projects.settings = (function() { // Flow files row = $('
').appendTo(filesContainer); - $('').text('Flow').appendTo(row); + $('').text(RED._("sidebar.project.projectSettings.flow")).appendTo(row); var flowFileLabel = $('
').appendTo(row); var flowFileLabelText = $('').text(activeProject.files.flow).appendTo(flowFileLabel); @@ -787,7 +787,7 @@ RED.projects.settings = (function() { }) row = $('').appendTo(filesContainer); - $('').text('Credentials').appendTo(row); + $('').text(RED._("sidebar.project.projectSettings.credentials")).appendTo(row); var credFileLabel = $('
').text(activeProject.files.credentials).appendTo(row); var credFileInput = $('
').text(activeProject.files.credentials).hide().insertAfter(credFileLabel); @@ -899,12 +899,12 @@ RED.projects.settings = (function() { var credentialFormRows = $('
',{style:"margin-top:10px"}).hide().appendTo(credentialStateLabel); - var credentialSetLabel = $('
Set the encryption key:
').hide().appendTo(credentialFormRows); - var credentialChangeLabel = $('
Change the encryption key:
').hide().appendTo(credentialFormRows); - var credentialResetLabel = $('
Reset the encryption key:
').hide().appendTo(credentialFormRows); + var credentialSetLabel = $('
' + RED._("sidebar.project.projectSettings.setTheEncryptionKey") + '
').hide().appendTo(credentialFormRows); + var credentialChangeLabel = $('
' + RED._("sidebar.project.projectSettings.changeTheEncryptionKey") + '
').hide().appendTo(credentialFormRows); + var credentialResetLabel = $('
' + RED._("sidebar.project.projectSettings.resetTheEncryptionKey") + '
').hide().appendTo(credentialFormRows); var credentialSecretExistingRow = $('').appendTo(credentialFormRows); - $('').text('Current key').appendTo(credentialSecretExistingRow); + $('').text(RED._("sidebar.project.projectSettings.currentKey")).appendTo(credentialSecretExistingRow); var credentialSecretExistingInput = $('').appendTo(credentialSecretExistingRow) .on("change keyup paste",function() { if (popover) { @@ -917,10 +917,10 @@ RED.projects.settings = (function() { var credentialSecretNewRow = $('').appendTo(credentialFormRows); - $('').text('New key').appendTo(credentialSecretNewRow); + $('').text(RED._("sidebar.project.projectSettings.newKey")).appendTo(credentialSecretNewRow); var credentialSecretNewInput = $('').appendTo(credentialSecretNewRow).on("change keyup paste",checkFiles); - var credentialResetWarning = $('
This will delete all existing credentials
').hide().appendTo(credentialFormRows); + var credentialResetWarning = $('
' + RED._("sidebar.project.projectSettings.credentialsAlert") + '
').hide().appendTo(credentialFormRows); var hideEditForm = function() { @@ -950,13 +950,13 @@ RED.projects.settings = (function() { } var formButtons = $('').hide().appendTo(filesContainer); - $('') + $('') .appendTo(formButtons) .click(function(evt) { evt.preventDefault(); hideEditForm(); }); - var saveButton = $('') + var saveButton = $('') .appendTo(formButtons) .click(function(evt) { evt.preventDefault(); @@ -1032,13 +1032,13 @@ RED.projects.settings = (function() { var updateForm = function() { if (activeProject.settings.credentialSecretInvalid) { credentialStateLabel.find(".user-settings-credentials-state-icon").removeClass().addClass("user-settings-credentials-state-icon fa fa-warning"); - credentialStateLabel.find(".user-settings-credentials-state").text("Invalid encryption key"); + credentialStateLabel.find(".user-settings-credentials-state").text(RED._("sidebar.project.projectSettings.invalidEncryptionKey")); } else if (activeProject.settings.credentialsEncrypted) { credentialStateLabel.find(".user-settings-credentials-state-icon").removeClass().addClass("user-settings-credentials-state-icon fa fa-lock"); - credentialStateLabel.find(".user-settings-credentials-state").text("Encryption enabled"); + credentialStateLabel.find(".user-settings-credentials-state").text(RED._("sidebar.project.projectSettings.encryptionEnabled")); } else { credentialStateLabel.find(".user-settings-credentials-state-icon").removeClass().addClass("user-settings-credentials-state-icon fa fa-unlock"); - credentialStateLabel.find(".user-settings-credentials-state").text("Encryption disabled"); + credentialStateLabel.find(".user-settings-credentials-state").text(RED._("sidebar.project.projectSettings.encryptionDisabled")); } credentialSecretResetButton.toggleClass('disabled',!activeProject.settings.credentialSecretInvalid && !activeProject.settings.credentialsEncrypted); credentialSecretResetButton.prop('disabled',!activeProject.settings.credentialSecretInvalid && !activeProject.settings.credentialsEncrypted); @@ -1050,7 +1050,7 @@ RED.projects.settings = (function() { function createLocalBranchListSection(activeProject,pane) { var localBranchContainer = $('').appendTo(pane); - $('

').text("Branches").appendTo(localBranchContainer); + $('

').text(RED._("sidebar.project.projectSettings.branches")).appendTo(localBranchContainer); var row = $('').appendTo(localBranchContainer); @@ -1063,7 +1063,7 @@ RED.projects.settings = (function() { var container = $('
').appendTo(row); if (entry.empty) { container.addClass('red-ui-search-empty'); - container.text("No branches"); + container.text(RED._("sidebar.project.projectSettings.noBranches")); return; } if (entry.current) { @@ -1095,7 +1095,7 @@ RED.projects.settings = (function() { .click(function(e) { e.preventDefault(); var spinner = utils.addSpinnerOverlay(row).addClass('projects-dialog-spinner-contain'); - var notification = RED.notify("Are you sure you want to delete the local branch '"+entry.name+"'? This cannot be undone.", { + var notification = RED.notify(RED._("sidebar.project.projectSettings.deleteConfirm", { name: entry.name }), { type: "warning", modal: true, fixed: true, @@ -1123,7 +1123,7 @@ RED.projects.settings = (function() { }, 400: { 'git_delete_branch_unmerged': function(error) { - notification = RED.notify("The local branch '"+entry.name+"' has unmerged changes that will be lost. Are you sure you want to delete it?", { + notification = RED.notify(RED._("sidebar.project.projectSettings.unmergedConfirm", { name: entry.name }), { type: "warning", modal: true, fixed: true, @@ -1135,7 +1135,7 @@ RED.projects.settings = (function() { notification.close(); } },{ - text: 'Delete unmerged branch', + text: RED._("sidebar.project.projectSettings.deleteUnmergedBranch"), click: function() { options.url += "?force=true"; notification.close(); @@ -1183,14 +1183,14 @@ RED.projects.settings = (function() { } function createRemoteRepositorySection(activeProject,pane) { - $('

').text("Version Control").appendTo(pane); + $('

').text(RED._("sidebar.project.projectSettings.versionControl")).appendTo(pane); createLocalBranchListSection(activeProject,pane); var repoContainer = $('').appendTo(pane); - var title = $('

').text("Git remotes").appendTo(repoContainer); + var title = $('

').text(RED._("sidebar.project.projectSettings.gitRemotes")).appendTo(repoContainer); - var editRepoButton = $('') + var editRepoButton = $('') .appendTo(title) .click(function(evt) { editRepoButton.attr('disabled',true); @@ -1221,7 +1221,7 @@ RED.projects.settings = (function() { var container = $('
').appendTo(row); if (entry.empty) { container.addClass('red-ui-search-empty'); - container.text("No remotes"); + container.text(RED._("sidebar.project.projectSettings.noRemotes")); return; } else { $('').appendTo(container); @@ -1240,7 +1240,7 @@ RED.projects.settings = (function() { .click(function(e) { e.preventDefault(); var spinner = utils.addSpinnerOverlay(row).addClass('projects-dialog-spinner-contain'); - var notification = RED.notify("Are you sure you want to delete the remote '"+entry.name+"'?", { + var notification = RED.notify(RED._("sidebar.project.projectSettings.deleteRemoteConfrim", { name: entry.name }), { type: "warning", modal: true, fixed: true, @@ -1252,7 +1252,7 @@ RED.projects.settings = (function() { notification.close(); } },{ - text: 'Delete remote', + text: RED._("sidebar.project.projectSettings.deleteRemote"), click: function() { notification.close(); @@ -1315,10 +1315,10 @@ RED.projects.settings = (function() { // var validRepo = /^(?:file|git|ssh|https?|[\d\w\.\-_]+@[\w\.]+):(?:\/\/)?[\w\.@:\/~_-]+(?:\.git)?(?:\/?|\#[\d\w\.\-_]+?)$/.test(remoteURLInput.val()); var validRepo = repo.length > 0 && !/\s/.test(repo); if (/^https?:\/\/[^/]+@/i.test(repo)) { - remoteURLLabel.text("Do not include the username/password in the url"); + remoteURLLabel.text(RED._("sidebar.project.projectSettings.urlRule2")); validRepo = false; } else { - remoteURLLabel.text("https://, ssh:// or file://"); + remoteURLLabel.text(RED._("sidebar.project.projectSettings.urlRule")); } saveButton.attr('disabled',(!validName || !validRepo)) remoteNameInput.toggleClass('input-error',remoteNameInputChanged&&!validName); @@ -1332,22 +1332,22 @@ RED.projects.settings = (function() { var remoteNameInputChanged = false; var remoteURLInputChanged = false; - $('
').text('Add remote').appendTo(addRemoteDialog); + $('
').text(RED._('sidebar.project.projectSettings.addRemote2')).appendTo(addRemoteDialog); row = $('').appendTo(addRemoteDialog); - $('').text('Remote name').appendTo(row); + $('').text(RED._("sidebar.project.projectSettings.remoteName")).appendTo(row); var remoteNameInput = $('').appendTo(row).on("change keyup paste",function() { remoteNameInputChanged = true; validateForm(); }); - $('').appendTo(row).find("small"); + $('').appendTo(row).find("small"); row = $('').appendTo(addRemoteDialog); - $('').text('URL').appendTo(row); + $('').text(RED._("sidebar.project.projectSettings.url")).appendTo(row); var remoteURLInput = $('').appendTo(row).on("change keyup paste",function() { remoteURLInputChanged = true; validateForm() }); - var remoteURLLabel = $('').appendTo(row).find("small"); + var remoteURLLabel = $('').appendTo(row).find("small"); var hideEditForm = function() { editRepoButton.attr('disabled',false); @@ -1361,13 +1361,13 @@ RED.projects.settings = (function() { } var formButtons = $('') .appendTo(addRemoteDialog); - $('') + $('') .appendTo(formButtons) .click(function(evt) { evt.preventDefault(); hideEditForm(); }); - var saveButton = $('') + var saveButton = $('') .appendTo(formButtons) .click(function(evt) { evt.preventDefault(); @@ -1484,19 +1484,19 @@ RED.projects.settings = (function() { utils = _utils; addPane({ id:'main', - title: "Project", // TODO: nls + title: RED._("sidebar.project.name"), get: createMainPane, close: function() { } }); addPane({ id:'deps', - title: "Dependencies", // TODO: nls + title: RED._("sidebar.project.dependencies"), get: createDependenciesPane, close: function() { } }); addPane({ id:'settings', - title: "Settings", // TODO: nls + title: RED._("sidebar.project.settings"), get: createSettingsPane, close: function() { if (popover) { diff --git a/editor/js/ui/projects/projectUserSettings.js b/editor/js/ui/projects/projectUserSettings.js index 4c3840461..c13bd476f 100644 --- a/editor/js/ui/projects/projectUserSettings.js +++ b/editor/js/ui/projects/projectUserSettings.js @@ -24,18 +24,18 @@ RED.projects.userSettings = (function() { var currentGitSettings = RED.settings.get('git') || {}; currentGitSettings.user = currentGitSettings.user || {}; - var title = $('

').text("Committer Details").appendTo(pane); + var title = $('

').text(RED._("editor:sidebar.project.userSettings.committerDetail")).appendTo(pane); var gitconfigContainer = $('').appendTo(pane); - $('
').appendTo(gitconfigContainer).text("Leave blank to use system default"); + $('
').appendTo(gitconfigContainer).text(RED._("editor:sidebar.project.userSettings.committerTip")); var row = $('').appendTo(gitconfigContainer); - $('').text('Username').appendTo(row); + $('').text(RED._("editor:sidebar.project.userSettings.userName")).appendTo(row); gitUsernameInput = $('').appendTo(row); gitUsernameInput.val(currentGitSettings.user.name||""); row = $('').appendTo(gitconfigContainer); - $('').text('Email').appendTo(row); + $('').text(RED._("editor:sidebar.project.userSettings.email")).appendTo(row); gitEmailInput = $('').appendTo(row); gitEmailInput.val(currentGitSettings.user.email||""); } @@ -44,10 +44,10 @@ RED.projects.userSettings = (function() { function createSSHKeySection(pane) { var container = $('').appendTo(pane); var popover; - var title = $('

').text("SSH Keys").appendTo(container); - var subtitle = $('
').appendTo(container).text("Allows you to create secure connections to remote git repositories."); + var title = $('

').text(RED._("editor:sidebar.project.userSettings.sshKeys")).appendTo(container); + var subtitle = $('
').appendTo(container).text(RED._("editor:sidebar.project.userSettings.sshKeysTip")); - var addKeyButton = $('') + var addKeyButton = $('') .appendTo(subtitle) .click(function(evt) { addKeyButton.attr('disabled',true); @@ -72,9 +72,9 @@ RED.projects.userSettings = (function() { var validPassphrase = passphrase.length === 0 || passphrase.length >= 8; passphraseInput.toggleClass('input-error',!validPassphrase); if (!validPassphrase) { - passphraseInputSubLabel.text("Passphrase too short"); + passphraseInputSubLabel.text(RED._("editor:sidebar.project.userSettings.passphraseShort")); } else if (passphrase.length === 0) { - passphraseInputSubLabel.text("Optional"); + passphraseInputSubLabel.text(RED._("editor:sidebar.project.userSettings.optional")); } else { passphraseInputSubLabel.text(""); } @@ -91,11 +91,11 @@ RED.projects.userSettings = (function() { var row = $('').appendTo(container); var addKeyDialog = $('
').hide().appendTo(row); - $('
').text('Add SSH Key').appendTo(addKeyDialog); + $('
').text(RED._("editor:sidebar.project.userSettings.addSshKey")).appendTo(addKeyDialog); var addKeyDialogBody = $('
').appendTo(addKeyDialog); row = $('').appendTo(addKeyDialogBody); - $('
').appendTo(row).text("Generate a new public/private key pair"); + $('
').appendTo(row).text(RED._("editor:sidebar.project.userSettings.addSshKeyTip")); // var bg = $('
',{class:"button-group", style:"text-align: center"}).appendTo(row); // var addLocalButton = $('').appendTo(bg); // var uploadButton = $('').appendTo(bg); @@ -125,19 +125,19 @@ RED.projects.userSettings = (function() { row = $('').appendTo(addKeyDialogBody); - $('').text('Name').appendTo(row); + $('').text(RED._("editor:sidebar.project.userSettings.name")).appendTo(row); var keyNameInputChanged = false; var keyNameInput = $('').appendTo(row).on("change keyup paste",function() { keyNameInputChanged = true; validateForm(); }); - $('').appendTo(row).find("small"); + $('').appendTo(row).find("small"); var generateKeyPane = $('
').appendTo(addKeyDialogBody); row = $('').appendTo(generateKeyPane); - $('').text('Passphrase').appendTo(row); + $('').text(RED._("editor:sidebar.project.userSettings.passphrase")).appendTo(row); var passphraseInput = $('').appendTo(row).on("change keyup paste",validateForm); - var passphraseInputSubLabel = $('').appendTo(row).find("small"); + var passphraseInputSubLabel = $('').appendTo(row).find("small"); // var addLocalKeyPane = $('
').hide().appendTo(addKeyDialogBody); // row = $('').appendTo(addLocalKeyPane); @@ -179,13 +179,13 @@ RED.projects.userSettings = (function() { } } var formButtons = $('').appendTo(addKeyDialog); - $('') + $('') .appendTo(formButtons) .click(function(evt) { evt.preventDefault(); hideEditForm(); }); - var saveButton = $('') + var saveButton = $('') .appendTo(formButtons) .click(function(evt) { evt.preventDefault(); @@ -264,7 +264,7 @@ RED.projects.userSettings = (function() { utils.sendRequest(options); var formButtons = $('').appendTo(row); - $('') + $('') .appendTo(formButtons) .click(function(evt) { try { @@ -289,7 +289,7 @@ RED.projects.userSettings = (function() { var container = $('
').appendTo(row); if (entry.empty) { container.addClass('red-ui-search-empty'); - container.text("No SSH keys"); + container.text(RED._("editor:sidebar.project.userSettings.noSshKeys")); return; } var topRow = $('
').appendTo(container); @@ -313,7 +313,7 @@ RED.projects.userSettings = (function() { .click(function(e) { e.stopPropagation(); var spinner = utils.addSpinnerOverlay(row).addClass('projects-dialog-spinner-contain'); - var notification = RED.notify("Are you sure you want to delete the SSH key '"+entry.name+"'? This cannot be undone.", { + var notification = RED.notify(RED._("editor:sidebar.project.userSettings.deleteConfirm", {name:entry.name}), { type: 'warning', modal: true, fixed: true, @@ -326,7 +326,7 @@ RED.projects.userSettings = (function() { } }, { - text: "Delete key", + text: RED._("editor:sidebar.project.userSettings.delete"), click: function() { notification.close(); var url = "settings/user/keys/"+entry.name; @@ -400,7 +400,7 @@ RED.projects.userSettings = (function() { utils = _utils; RED.userSettings.add({ id:'gitconfig', - title: "Git config", // TODO: nls + title: RED._("editor:sidebar.project.userSettings.gitConfig"), get: createSettingsPane, close: function() { var currentGitSettings = RED.settings.get('git') || {}; diff --git a/editor/js/ui/projects/projects.js b/editor/js/ui/projects/projects.js index d7c2787d8..71a19d661 100644 --- a/editor/js/ui/projects/projects.js +++ b/editor/js/ui/projects/projects.js @@ -22,18 +22,18 @@ RED.projects = (function() { function reportUnexpectedError(error) { var notification; if (error.error === 'git_missing_user') { - notification = RED.notify("

You Git client is not configured with a username/email.

",{ + notification = RED.notify("

"+RED._("projects.errors.no-username-email")+"

",{ fixed: true, type:'error', buttons: [ { - text: "Cancel", + text: RED._("common.label.cancel"), click: function() { notification.close(); } }, { - text: "Configure Git client", + text: RED._("projects.config-git"), click: function() { RED.userSettings.show('gitconfig'); notification.close(); @@ -43,13 +43,13 @@ RED.projects = (function() { }) } else { console.log(error); - notification = RED.notify("

An unexpected error occurred:

"+error.message+"

code: "+error.error+"",{ + notification = RED.notify("

"+RED._("projects.errors.unexpected")+":

"+error.message+"

"+RED._("projects.errors.code")+": "+error.error+"",{ fixed: true, modal: true, type: 'error', buttons: [ { - text: "Close", + text: RED._("common.label.close"), click: function() { notification.close(); } @@ -75,14 +75,14 @@ RED.projects = (function() { migrateProjectHeader.appendTo(container); var body = $('
').appendTo(container); - $('

').text("Hello! We have introduced 'projects' to Node-RED.").appendTo(body); - $('

').text("This is a new way for you to manage your flow files and includes version control of your flows.").appendTo(body); - $('

').text("To get started you can create your first project or clone an existing project from a git repository.").appendTo(body); - $('

').text("If you are not sure, you can skip this for now. You will still be able to create your first project from the 'Projects' menu at any time.").appendTo(body); + $('

').text(RED._("projects.welcome.hello")).appendTo(body); + $('

').text(RED._("projects.welcome.desc0")).appendTo(body); + $('

').text(RED._("projects.welcome.desc1")).appendTo(body); + $('

').text(RED._("projects.welcome.desc2")).appendTo(body); var row = $('

').appendTo(body); - var createAsEmpty = $('').appendTo(row); - var createAsClone = $('').appendTo(row); + var createAsEmpty = $('').appendTo(row); + var createAsClone = $('').appendTo(row); createAsEmpty.click(function(e) { e.preventDefault(); @@ -105,7 +105,7 @@ RED.projects = (function() { buttons: [ { // id: "clipboard-dialog-cancel", - text: "Not right now", + text: RED._("projects.welcome.not-right-now"), click: function() { createProjectOptions = {}; $( this ).dialog( "close" ); @@ -139,23 +139,23 @@ RED.projects = (function() { migrateProjectHeader.appendTo(container); var body = $('
').appendTo(container); - $('

').text("Setup your version control client").appendTo(body); - $('

').text("Node-RED uses the open source tool Git for version control. It tracks changes to your project files and lets you push them to remote repositories.").appendTo(body); - $('

').text("When you commit a set of changes, Git records who made the changes with a username and email address. The Username can be anything you want - it does not need to be your real name.").appendTo(body); + $('

').text(RED._("projects.git-config.setup")).appendTo(body); + $('

').text(RED._("projects.git-config.desc0")).appendTo(body); + $('

').text(RED._("projects.git-config.desc1")).appendTo(body); if (isGlobalConfig) { - $('

').text("Your Git client is already configured with the details below.").appendTo(body); + $('

').text(RED._("projects.git-config.desc2")).appendTo(body); } - $('

').text("You can change these settings later under the 'Git config' tab of the settings dialog.").appendTo(body); + $('

').text(RED._("projects.git-config.desc3")).appendTo(body); var row = $('

').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); gitUsernameInput = $('').val((existingGitSettings&&existingGitSettings.name)||"").appendTo(row); // $('
').text("This does not need to be your real name").appendTo(row); gitUsernameInput.on("change keyup paste",validateForm); row = $('
').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); gitEmailInput = $('').val((existingGitSettings&&existingGitSettings.email)||"").appendTo(row); gitEmailInput.on("change keyup paste",validateForm); // $('
').text("Something something email").appendTo(row); @@ -168,14 +168,14 @@ RED.projects = (function() { buttons: [ { // id: "clipboard-dialog-cancel", - text: "Back", + text: RED._("common.label.back"), click: function() { show('welcome'); } }, { id: "projects-dialog-git-config", - text: "Next", // TODO: nls + text: RED._("common.label.next"), class: "primary", click: function() { var currentGitSettings = RED.settings.get('git') || {}; @@ -216,10 +216,10 @@ RED.projects = (function() { migrateProjectHeader.appendTo(container); var body = $('
').appendTo(container); - $('

').text("Create your project").appendTo(body); - $('

').text("A project is maintained as a Git repository. It makes it much easier to share your flows with others and to collaborate on them.").appendTo(body); - $('

').text("You can create multiple projects and quickly switch between them from the editor.").appendTo(body); - $('

').text("To begin, your project needs a name and an optional description.").appendTo(body); + $('

').text(RED._("projects.project-details.create")).appendTo(body); + $('

').text(RED._("projects.project-details.desc0")).appendTo(body); + $('

').text(RED._("projects.project-details.desc1")).appendTo(body); + $('

').text(RED._("projects.project-details.desc2")).appendTo(body); var validateForm = function() { var projectName = projectNameInput.val(); @@ -236,14 +236,14 @@ RED.projects = (function() { projectNameValid = false; valid = false; if (projectList[projectName]) { - projectNameSublabel.text("Project already exists"); + projectNameSublabel.text(RED._("projects.project-details.already-exists")); } else { - projectNameSublabel.text("Must contain only A-Z 0-9 _ -"); + projectNameSublabel.text(RED._("projects.project-details.must-contain")); } } else { projectNameInput.removeClass("input-error"); $('').appendTo(projectNameStatus); - projectNameSublabel.text("Must contain only A-Z 0-9 _ -"); + projectNameSublabel.text(RED._("projects.project-details.must-contain")); projectNameValid = true; } projectNameLastChecked = projectName; @@ -253,7 +253,7 @@ RED.projects = (function() { } var row = $('

').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); var subrow = $('
').appendTo(row); projectNameInput = $('').val(createProjectOptions.name||"").appendTo(subrow); @@ -283,13 +283,13 @@ RED.projects = (function() { checkProjectName = null; },300) }); - projectNameSublabel = $('').appendTo(row).find("small"); + projectNameSublabel = $('').appendTo(row).find("small"); // Empty Project row = $('
').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); projectSummaryInput = $('').val(createProjectOptions.summary||"").appendTo(row); - $('').appendTo(row); + $('').appendTo(row); setTimeout(function() { projectNameInput.focus(); @@ -300,7 +300,7 @@ RED.projects = (function() { buttons: function(options) { return [ { - text: "Back", + text: RED._("common.label.back"), click: function() { show('git-config'); } @@ -308,7 +308,7 @@ RED.projects = (function() { { id: "projects-dialog-create-name", disabled: true, - text: "Next", // TODO: nls + text: RED._("common.label.next"), class: "primary disabled", click: function() { createProjectOptions.name = projectNameInput.val(); @@ -344,8 +344,8 @@ RED.projects = (function() { var container = $('
'); migrateProjectHeader.appendTo(container); var body = $('
').appendTo(container); - $('

').text("Clone a project").appendTo(body); - $('

').text("If you already have a git repository containing a project, you can clone it to get started.").appendTo(body); + $('

').text(RED._("projects.clone-project.clone")).appendTo(body); + $('

').text(RED._("projects.clone-project.desc0")).appendTo(body); var projectList = null; var pendingFormValidation = false; @@ -376,14 +376,14 @@ RED.projects = (function() { projectNameValid = false; valid = false; if (projectList[projectName]) { - projectNameSublabel.text("Project already exists"); + projectNameSublabel.text(RED._("projects.clone-project.already-exists")); } else { - projectNameSublabel.text("Must contain only A-Z 0-9 _ -"); + projectNameSublabel.text(RED._("projects.clone-project.must-contain")); } } else { projectNameInput.removeClass("input-error"); $('').appendTo(projectNameStatus); - projectNameSublabel.text("Must contain only A-Z 0-9 _ -"); + projectNameSublabel.text(RED._("projects.clone-project.must-contain")); projectNameValid = true; } projectNameLastChecked = projectName; @@ -395,7 +395,7 @@ RED.projects = (function() { // var validRepo = /^(?:file|git|ssh|https?|[\d\w\.\-_]+@[\w\.]+):(?:\/\/)?[\w\.@:\/~_-]+(?:\/?|\#[\d\w\.\-_]+?)$/.test(repo); var validRepo = repo.length > 0 && !/\s/.test(repo); if (/^https?:\/\/[^/]+@/i.test(repo)) { - $("#projects-dialog-screen-create-project-repo-label small").text("Do not include the username/password in the url"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.clone-project.no-info-in-url")); validRepo = false; } if (!validRepo) { @@ -426,7 +426,7 @@ RED.projects = (function() { var row; row = $('

').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); var subrow = $('
').appendTo(row); projectNameInput = $('').appendTo(subrow); @@ -456,19 +456,19 @@ RED.projects = (function() { checkProjectName = null; },300) }); - projectNameSublabel = $('').appendTo(row).find("small"); + projectNameSublabel = $('').appendTo(row).find("small"); row = $('
').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); projectRepoInput = $('').appendTo(row); - $('').appendTo(row); + $('').appendTo(row); var projectRepoChanged = false; var lastProjectRepo = ""; projectRepoInput.on("change keyup paste",function() { projectRepoChanged = true; var repo = $(this).val(); if (lastProjectRepo !== repo) { - $("#projects-dialog-screen-create-project-repo-label small").text("https://, ssh:// or file://"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.clone-project.protocols")); } lastProjectRepo = repo; @@ -486,24 +486,24 @@ RED.projects = (function() { var cloneAuthRows = $('
').appendTo(body); row = $('
').hide().appendTo(cloneAuthRows); - $('
Authentication failed
').appendTo(row); + $('
'+RED._("projects.clone-project.auth-failed")+'
').appendTo(row); // Repo credentials - username/password ---------------- row = $('
').hide().appendTo(cloneAuthRows); var subrow = $('
').appendTo(row); - $('').appendTo(subrow); + $('').appendTo(subrow); projectRepoUserInput = $('').appendTo(subrow); subrow = $('
').appendTo(row); - $('').appendTo(subrow); + $('').appendTo(subrow); projectRepoPasswordInput = $('').appendTo(subrow); // ----------------------------------------------------- // Repo credentials - key/passphrase ------------------- row = $('
').hide().appendTo(cloneAuthRows); subrow = $('
').appendTo(row); - $('').appendTo(subrow); + $('').appendTo(subrow); projectRepoSSHKeySelect = $("').appendTo(subrow); subrow = $('
').appendTo(cloneAuthRows); var sshwarningRow = $('
').hide().appendTo(subrow); - $('
Before you can clone a repository over ssh you must add an SSH key to access it.
').appendTo(sshwarningRow); + $('
'+RED._("projects.clone-project.ssh-key-desc")+'
').appendTo(sshwarningRow); subrow = $('
').appendTo(sshwarningRow); - $('').appendTo(subrow).click(function(e) { + $('').appendTo(subrow).click(function(e) { e.preventDefault(); $('#projects-dialog-cancel').click(); RED.userSettings.show('gitconfig'); @@ -543,7 +543,7 @@ RED.projects = (function() { // Secret - clone row = $('
').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); projectSecretInput = $('').appendTo(row); @@ -553,7 +553,7 @@ RED.projects = (function() { buttons: function(options) { return [ { - text: "Back", + text: RED._("common.label.back"), click: function() { show('git-config'); } @@ -561,7 +561,7 @@ RED.projects = (function() { { id: "projects-dialog-clone-project", disabled: true, - text: "Clone project", // TODO: nls + text: RED._("common.label.clone"), class: "primary disabled", click: function() { var projectType = $(".projects-dialog-screen-create-type.selected").data('type'); @@ -585,7 +585,7 @@ RED.projects = (function() { }; } else { - console.log("Error! Can't get selected SSH key path."); + console.log(RED._("projects.clone-project.cant-get-ssh-key")); return; } } @@ -602,7 +602,7 @@ RED.projects = (function() { } $(".projects-dialog-screen-create-row-auth-error").hide(); - $("#projects-dialog-screen-create-project-repo-label small").text("https://, ssh:// or file://"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.clone-project.protocols")); projectRepoUserInput.removeClass("input-error"); projectRepoPasswordInput.removeClass("input-error"); @@ -622,22 +622,22 @@ RED.projects = (function() { }, 400: { 'project_exists': function(error) { - console.log("already exists"); + console.log(RED._("projects.clone-project.already-exists")); }, 'git_error': function(error) { - console.log("git error",error); + console.log(RED._("projects.clone-project.git-error"),error); }, 'git_connection_failed': function(error) { projectRepoInput.addClass("input-error"); - $("#projects-dialog-screen-create-project-repo-label small").text("Connection failed"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.clone-project.connection-failed")); }, 'git_not_a_repository': function(error) { projectRepoInput.addClass("input-error"); - $("#projects-dialog-screen-create-project-repo-label small").text("Not a git repository"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.clone-project.not-git-repo")); }, 'git_repository_not_found': function(error) { projectRepoInput.addClass("input-error"); - $("#projects-dialog-screen-create-project-repo-label small").text("Repository not found"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.clone-project.repo-not-found")); }, 'git_auth_failed': function(error) { $(".projects-dialog-screen-create-row-auth-error").show(); @@ -689,11 +689,11 @@ RED.projects = (function() { migrateProjectHeader.appendTo(container); var body = $('
').appendTo(container); - $('

').text("Create your project files").appendTo(body); - $('

').text("A project contains your flow files, a README file and a package.json file.").appendTo(body); - $('

').text("It can contain any other files you want to maintain in the Git repository.").appendTo(body); + $('

').text(RED._("projects.default-files.create")).appendTo(body); + $('

').text(RED._("projects.default-files.desc0")).appendTo(body); + $('

').text(RED._("projects.default-files.desc1")).appendTo(body); if (!options.existingProject && RED.settings.files) { - $('

').text("Your existing flow and credential files will be copied into the project.").appendTo(body); + $('

').text(RED._("projects.default-files.desc2")).appendTo(body); } var validateForm = function() { @@ -724,7 +724,7 @@ RED.projects = (function() { $("#projects-dialog-create-default-files").prop('disabled',!valid).toggleClass('disabled ui-button-disabled ui-state-disabled',!valid); } var row = $('

').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); var subrow = $('
').appendTo(row); var defaultFlowFile = (createProjectOptions.files &&createProjectOptions.files.flow) || (RED.settings.files && RED.settings.files.flow)||"flow.json"; projectFlowFileInput = $('').val(defaultFlowFile) @@ -735,7 +735,7 @@ RED.projects = (function() { var defaultCredentialsFile = (createProjectOptions.files &&createProjectOptions.files.credentials) || (RED.settings.files && RED.settings.files.credentials)||"flow_cred.json"; row = $('
').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); subrow = $('
').appendTo(row); projectCredentialFileInput = $('
').text(defaultCredentialsFile) .appendTo(subrow); @@ -752,7 +752,7 @@ RED.projects = (function() { return [ { // id: "clipboard-dialog-cancel", - text: options.existingProject?"Cancel":"Back", + text: RED._(options.existingProject ? "common.label.cancel": "common.label.back"), click: function() { if (options.existingProject) { $(this).dialog('close'); @@ -763,7 +763,7 @@ RED.projects = (function() { }, { id: "projects-dialog-create-default-files", - text: "Next", // TODO: nls + text: RED._("common.label.next"), class: "primary", click: function() { createProjectOptions.files = { @@ -789,22 +789,22 @@ RED.projects = (function() { migrateProjectHeader.appendTo(container); var body = $('
').appendTo(container); - $('

').text("Setup encryption of your credentials file").appendTo(body); + $('

').text(RED._("projects.encryption-config.setup")).appendTo(body); if (options.existingProject) { - $('

').text("Your flow credentials file can be encrypted to keep its contents secure.").appendTo(body); - $('

').text("If you want to store these credentials in a public Git repository, you must encrypt them by providing a secret key phrase.").appendTo(body); + $('

').text(RED._("projects.encryption-config.desc0")).appendTo(body); + $('

').text(RED._("projects.encryption-config.desc1")).appendTo(body); } else { if (RED.settings.flowEncryptionType === 'disabled') { - $('

').text("Your flow credentials file is not currently encrypted.").appendTo(body); - $('

').text("That means its contents, such as passwords and access tokens, can be read by anyone with access to the file.").appendTo(body); - $('

').text("If you want to store these credentials in a public Git repository, you must encrypt them by providing a secret key phrase.").appendTo(body); + $('

').text(RED._("projects.encryption-config.desc2")).appendTo(body); + $('

').text(RED._("projects.encryption-config.desc3")).appendTo(body); + $('

').text(RED._("projects.encryption-config.desc4")).appendTo(body); } else { if (RED.settings.flowEncryptionType === 'user') { - $('

').text("Your flow credentials file is currently encrypted using the credentialSecret property from your settings file as the key.").appendTo(body); + $('

').text(RED._("projects.encryption-config.desc5")).appendTo(body); } else if (RED.settings.flowEncryptionType === 'system') { - $('

').text("Your flow credentials file is currently encrypted using a system-generated key. You should provide a new secret key for this project.").appendTo(body); + $('

').text(RED._("projects.encryption-config.desc6")).appendTo(body); } - $('

').text("The key will be stored separately from your project files. You will need to provide the key to use this project in another instance of Node-RED.").appendTo(body); + $('

').text(RED._("projects.encryption-config.desc7")).appendTo(body); } } @@ -832,16 +832,16 @@ RED.projects = (function() { var row = $('

').appendTo(body); - $('').appendTo(row); + $('').appendTo(row); var credentialsBox = $('
').appendTo(row); var credentialsRightBox = $('
').appendTo(credentialsBox); var credentialsLeftBox = $('
').appendTo(credentialsBox); var credentialsEnabledBox = $('
').appendTo(credentialsLeftBox); - $('').appendTo(credentialsEnabledBox); + $('').appendTo(credentialsEnabledBox); var credentialsDisabledBox = $('
').appendTo(credentialsLeftBox); - $('').appendTo(credentialsDisabledBox); + $('').appendTo(credentialsDisabledBox); credentialsLeftBox.find("input[name=projects-encryption-type]").click(function(e) { var val = $(this).val(); @@ -876,15 +876,15 @@ RED.projects = (function() { }) row = $('
').appendTo(credentialsRightBox); - $('').appendTo(row); + $('').appendTo(row); row = $('
').appendTo(credentialsRightBox); - $('').appendTo(row); + $('').appendTo(row); row = $('
').appendTo(credentialsRightBox); emptyProjectCredentialInput = $('').appendTo(row); emptyProjectCredentialInput.on("change keyup paste", validateForm); row = $('
').hide().appendTo(credentialsRightBox); - $('
The credentials file will not be encrypted and its contents easily read
').appendTo(row); + $('
'+RED._("projects.encryption-config.desc8")+'
').appendTo(row); credentialsRightBox.find("input[name=projects-encryption-key]").click(function() { var val = $(this).val(); @@ -911,14 +911,14 @@ RED.projects = (function() { return [ { // id: "clipboard-dialog-cancel", - text: "Back", + text: RED._("common.label.back"), click: function() { show('default-files',options); } }, { id: "projects-dialog-create-encryption", - text: options.existingProject?"Create project files":"Create project", // TODO: nls + text: RED._(options.existingProject?"projects.encryption-config.create-project-files":"projects.encryption-config.create-project"), class: "primary disabled", disabled: true, click: function() { @@ -966,10 +966,10 @@ RED.projects = (function() { }, 400: { 'project_exists': function(error) { - console.log("already exists"); + console.log(RED._("projects.encryption-config.already-exists")); }, 'git_error': function(error) { - console.log("git error",error); + console.log(RED._("projects.encryption-config.git-error"),error); }, 'git_connection_failed': function(error) { projectRepoInput.addClass("input-error"); @@ -978,7 +978,7 @@ RED.projects = (function() { projectRepoUserInput.addClass("input-error"); projectRepoPasswordInput.addClass("input-error"); // getRepoAuthDetails(req); - console.log("git auth error",error); + console.log(RED._("projects.encryption-config.git-auth-error"),error); }, '*': function(error) { reportUnexpectedError(error); @@ -1004,19 +1004,16 @@ RED.projects = (function() { migrateProjectHeader.appendTo(container); var body = $('
').appendTo(container); - $('

').text("You have successfully created your first project!").appendTo(body); - $('

').text("You can now continue to use Node-RED just as you always have.").appendTo(body); - $('

').text("The 'info' tab in the sidebar shows you what your current active project is. "+ - "The button next to the name can be used to access the project settings view.").appendTo(body); - $('

').text("The 'history' tab in the sidebar can be used to view files that have changed "+ - "in your project and to commit them. It shows you a complete history of your commits and "+ - "allows you to push your changes to a remote repository.").appendTo(body); + $('

').text(RED._("projects.create-success.success")).appendTo(body); + $('

').text(RED._("projects.create-success.desc0")).appendTo(body); + $('

').text(RED._("projects.create-success.desc1")).appendTo(body); + $('

').text(RED._("projects.create-success.desc2")).appendTo(body); return container; }, buttons: [ { - text: "Done", + text: RED._("common.label.done"), click: function() { $( this ).dialog( "close" ); } @@ -1043,7 +1040,7 @@ RED.projects = (function() { var selectedProject; return { - title: "Projects", // TODO: NLS + title: RED._("projects.create.projects"), content: function(options) { var projectList = null; selectedProject = null; @@ -1077,14 +1074,14 @@ RED.projects = (function() { projectNameValid = false; valid = false; if (projectList[projectName]) { - projectNameSublabel.text("Project already exists"); + projectNameSublabel.text(RED._("projects.create.already-exists")); } else { - projectNameSublabel.text("Must contain only A-Z 0-9 _ -"); + projectNameSublabel.text(RED._("projects.create.must-contain")); } } else { projectNameInput.removeClass("input-error"); $('').appendTo(projectNameStatus); - projectNameSublabel.text("Must contain only A-Z 0-9 _ -"); + projectNameSublabel.text(RED._("projects.create.must-contain")); projectNameValid = true; } projectNameLastChecked = projectName; @@ -1102,7 +1099,7 @@ RED.projects = (function() { // var validRepo = /^(?:file|git|ssh|https?|[\d\w\.\-_]+@[\w\.]+):(?:\/\/)?[\w\.@:\/~_-]+(?:\/?|\#[\d\w\.\-_]+?)$/.test(repo); var validRepo = repo.length > 0 && !/\s/.test(repo); if (/^https?:\/\/[^/]+@/i.test(repo)) { - $("#projects-dialog-screen-create-project-repo-label small").text("Do not include the username/password in the url"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.create.no-info-in-url")); validRepo = false; } if (!validRepo) { @@ -1159,10 +1156,10 @@ RED.projects = (function() { row = $('

').appendTo(container); - var openProject = $('').appendTo(row); - var createAsEmpty = $('').appendTo(row); + var openProject = $('').appendTo(row); + var createAsEmpty = $('').appendTo(row); // var createAsCopy = $('').appendTo(row); - var createAsClone = $('').appendTo(row); + var createAsClone = $('').appendTo(row); // var createAsClone = $('').appendTo(row); row.find(".projects-dialog-screen-create-type").click(function(evt) { evt.preventDefault(); @@ -1173,9 +1170,9 @@ RED.projects = (function() { validateForm(); projectNameInput.focus(); switch ($(this).data('type')) { - case "open": $("#projects-dialog-create").text("Open project"); break; - case "empty": $("#projects-dialog-create").text("Create project"); break; - case "clone": $("#projects-dialog-create").text("Clone project"); break; + case "open": $("#projects-dialog-create").text(RED._("projects.create.open")); break; + case "empty": $("#projects-dialog-create").text(RED._("projects.create.create")); break; + case "clone": $("#projects-dialog-create").text(RED._("projects.create.clone")); break; } }) @@ -1201,7 +1198,7 @@ RED.projects = (function() { }).appendTo(row); row = $('
').appendTo(container); - $('').appendTo(row); + $('').appendTo(row); var subrow = $('
').appendTo(row); projectNameInput = $('').appendTo(subrow); @@ -1231,16 +1228,16 @@ RED.projects = (function() { checkProjectName = null; },300) }); - projectNameSublabel = $('').appendTo(row).find("small"); + projectNameSublabel = $('').appendTo(row).find("small"); // Empty Project row = $('
').appendTo(container); - $('').appendTo(row); + $('').appendTo(row); projectSummaryInput = $('').appendTo(row); - $('').appendTo(row); + $('').appendTo(row); row = $('
').appendTo(container); - $('').appendTo(row); + $('').appendTo(row); subrow = $('
').appendTo(row); projectFlowFileInput = $('').val("flow.json") .on("change keyup paste",validateForm) @@ -1249,16 +1246,16 @@ RED.projects = (function() { $('').appendTo(row); row = $('
').appendTo(container); - $('').appendTo(row); + $('').appendTo(row); var credentialsBox = $('
').appendTo(row); var credentialsRightBox = $('
').appendTo(credentialsBox); var credentialsLeftBox = $('
').appendTo(credentialsBox); var credentialsEnabledBox = $('
').appendTo(credentialsLeftBox); - $('').appendTo(credentialsEnabledBox); + $('').appendTo(credentialsEnabledBox); var credentialsDisabledBox = $('
').appendTo(credentialsLeftBox); - $('').appendTo(credentialsDisabledBox); + $('').appendTo(credentialsDisabledBox); credentialsLeftBox.find("input[name=projects-encryption-type]").click(function(e) { var val = $(this).val(); @@ -1292,15 +1289,15 @@ RED.projects = (function() { }) row = $('
').appendTo(credentialsRightBox); - $('').appendTo(row); + $('').appendTo(row); // row = $('
').appendTo(credentialsRightBox); emptyProjectCredentialInput = $('').appendTo(row); emptyProjectCredentialInput.on("change keyup paste", validateForm); - $('').appendTo(row); + $('').appendTo(row); row = $('
').hide().appendTo(credentialsRightBox); - $('
The credentials file will not be encrypted and its contents easily read
').appendTo(row); + $('
'+RED._("projects.create.desc1")+'
').appendTo(row); credentialsRightBox.find("input[name=projects-encryption-key]").click(function() { var val = $(this).val(); @@ -1313,9 +1310,9 @@ RED.projects = (function() { // Clone Project row = $('
').appendTo(container); - $('').appendTo(row); + $('').appendTo(row); projectRepoInput = $('').appendTo(row); - $('').appendTo(row); + $('').appendTo(row); var projectRepoChanged = false; var lastProjectRepo = ""; @@ -1323,7 +1320,7 @@ RED.projects = (function() { projectRepoChanged = true; var repo = $(this).val(); if (lastProjectRepo !== repo) { - $("#projects-dialog-screen-create-project-repo-label small").text("https://, ssh:// or file://"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.create.protocols")); } lastProjectRepo = repo; @@ -1342,24 +1339,24 @@ RED.projects = (function() { var cloneAuthRows = $('
').hide().appendTo(container); row = $('
').hide().appendTo(cloneAuthRows); - $('
Authentication failed
').appendTo(row); + $('
'+RED._("projects.create.auth-failed")+'
').appendTo(row); // Repo credentials - username/password ---------------- row = $('
').hide().appendTo(cloneAuthRows); var subrow = $('
').appendTo(row); - $('').appendTo(subrow); + $('').appendTo(subrow); projectRepoUserInput = $('').appendTo(subrow); subrow = $('
').appendTo(row); - $('').appendTo(subrow); + $('').appendTo(subrow); projectRepoPasswordInput = $('').appendTo(subrow); // ----------------------------------------------------- // Repo credentials - key/passphrase ------------------- row = $('
').hide().appendTo(cloneAuthRows); subrow = $('
').appendTo(row); - $('').appendTo(subrow); + $('').appendTo(subrow); projectRepoSSHKeySelect = $("').appendTo(subrow); subrow = $('
').appendTo(cloneAuthRows); var sshwarningRow = $('
').hide().appendTo(subrow); - $('
Before you can clone a repository over ssh you must add an SSH key to access it.
').appendTo(sshwarningRow); + $('
'+RED._("projects.create.desc2")+'
').appendTo(sshwarningRow); subrow = $('
').appendTo(sshwarningRow); - $('').appendTo(subrow).click(function(e) { + $('').appendTo(subrow).click(function(e) { e.preventDefault(); $('#projects-dialog-cancel').click(); RED.userSettings.show('gitconfig'); @@ -1399,7 +1396,7 @@ RED.projects = (function() { // Secret - clone row = $('
').appendTo(container); - $('').appendTo(row); + $('').appendTo(row); projectSecretInput = $('').appendTo(row); @@ -1421,9 +1418,9 @@ RED.projects = (function() { buttons: function(options) { var initialLabel; switch (options.screen||"empty") { - case "open": initialLabel = "Open project"; break; - case "empty": initialLabel = "Create project"; break; - case "clone": initialLabel = "Clone project"; break; + case "open": initialLabel = RED._("projects.create.open"); break; + case "empty": initialLabel = RED._("projects.create.create"); break; + case "clone": initialLabel = RED._("projects.create.clone"); break; } return [ { @@ -1477,7 +1474,7 @@ RED.projects = (function() { }; } else { - console.log("Error! Can't get selected SSH key path."); + console.log(RED._("projects.create.cant-get-ssh-key-path")); return; } } @@ -1497,14 +1494,14 @@ RED.projects = (function() { dialog.dialog( "close" ); if (err) { if (err.error !== 'credentials_load_failed') { - console.log("unexpected_error",err) + console.log(RED._("projects.create.unexpected_error"),err) } } }) } $(".projects-dialog-screen-create-row-auth-error").hide(); - $("#projects-dialog-screen-create-project-repo-label small").text("https://, ssh:// or file://"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.create.protocols")); projectRepoUserInput.removeClass("input-error"); projectRepoPasswordInput.removeClass("input-error"); @@ -1524,22 +1521,22 @@ RED.projects = (function() { }, 400: { 'project_exists': function(error) { - console.log("already exists"); + console.log(RED._("projects.create.already-exists-2")); }, 'git_error': function(error) { - console.log("git error",error); + console.log(RED._("projects.create.git-error"),error); }, 'git_connection_failed': function(error) { projectRepoInput.addClass("input-error"); - $("#projects-dialog-screen-create-project-repo-label small").text("Connection failed"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.create.con-failed")); }, 'git_not_a_repository': function(error) { projectRepoInput.addClass("input-error"); - $("#projects-dialog-screen-create-project-repo-label small").text("Not a git repository"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.create.not-git")); }, 'git_repository_not_found': function(error) { projectRepoInput.addClass("input-error"); - $("#projects-dialog-screen-create-project-repo-label small").text("Repository not found"); + $("#projects-dialog-screen-create-project-repo-label small").text(RED._("projects.create.no-resource")); }, 'git_auth_failed': function(error) { $(".projects-dialog-screen-create-row-auth-error").show(); @@ -1619,15 +1616,15 @@ RED.projects = (function() { whitespace: "nowrap", width:"1000px" }).click(function(evt) { evt.stopPropagation(); }).appendTo(row); - $('').css({"lineHeight":"40px"}).text("Are you sure you want to delete this project?").appendTo(cover); - $('') + $('').css({"lineHeight":"40px"}).text(RED._("projects.delete.confirm")).appendTo(cover); + $('') .appendTo(cover) .click(function(e) { e.stopPropagation(); cover.remove(); done(true); }); - $('') + $('') .appendTo(cover) .click(function(e) { e.stopPropagation(); @@ -1681,7 +1678,7 @@ RED.projects = (function() { var filterTerm = ""; var searchDiv = $("
",{class:"red-ui-search-container"}).appendTo(container); - var searchInput = $('').appendTo(searchDiv).searchBox({ + var searchInput = $('').appendTo(searchDiv).searchBox({ //data-i18n="[placeholder]menu.label.searchInput" delay: 200, change: function() { @@ -1790,7 +1787,7 @@ RED.projects = (function() { $('').text(entry.name).appendTo(header); if (activeProject && activeProject.name === entry.name) { header.addClass("projects-list-entry-current"); - $('current').appendTo(header); + $(''+RED._("projects.create-project-list.current")+'').appendTo(header); if (options.canSelectActive === false) { // active project cannot be selected; so skip the rest return @@ -1852,7 +1849,7 @@ RED.projects = (function() { function requireCleanWorkspace(done) { if (RED.nodes.dirty()) { - var message = '

You have undeployed changes that will be lost.

Do you want to continue?

'; + var message = RED._("projects.require-clean.confirm"); var cleanNotification = RED.notify(message,{ type:"info", fixed: true, @@ -1867,7 +1864,7 @@ RED.projects = (function() { done(true); } },{ - text: 'Continue', + text: RED._("common.label.cont"), click: function() { cleanNotification.close(); done(false); @@ -1945,14 +1942,14 @@ RED.projects = (function() { var url = activeProject.git.remotes[xhr.responseJSON.remote||options.remote||'origin'].fetch; var message = $('
'+ - '
Authentication required for repository:
'+ + '
'+RED._("projects.send-req.auth-req")+':
'+ '
'+url+'
'+ '
'); var isSSH = false; if (/^https?:\/\//.test(url)) { - $('
'+ - '
').appendTo(message); + $('
'+ + '
').appendTo(message); } else if (/^(?:ssh|[\d\w\.\-_]+@[\w\.]+):(?:\/\/)?/.test(url)) { isSSH = true; var row = $('
').appendTo(message); @@ -1969,7 +1966,7 @@ RED.projects = (function() { } }); row = $('
').appendTo(message); - $('').appendTo(row); + $('').appendTo(row); $('').appendTo(row); } @@ -1999,7 +1996,7 @@ RED.projects = (function() { } var done = function(err) { if (err) { - console.log("Failed to update auth"); + console.log(RED._("projects.send-req.update-failed")); console.log(err); } else { sendRequest(options,body); @@ -2039,7 +2036,7 @@ RED.projects = (function() { return; } } - console.log("Unhandled error response:"); + console.log(RED._("projects.send-req.unhandled")+":"); console.log(xhr); console.log(textStatus); console.log(err); @@ -2073,7 +2070,7 @@ RED.projects = (function() { branchFilterCreateItem.addClass("input-error"); branchFilterCreateItem.find("i").addClass("fa-warning").removeClass("fa-code-fork"); } - branchFilterCreateItem.find("span").text("Invalid branch: "+branchPrefix+branchFilterTerm); + branchFilterCreateItem.find("span").text(RED._("projects.create-branch-list.invalid")+": "+branchPrefix+branchFilterTerm); } else { if (branchFilterCreateItem.hasClass("input-error")) { branchFilterCreateItem.removeClass("input-error"); @@ -2093,14 +2090,14 @@ RED.projects = (function() { if (!entry.hasOwnProperty('commit')) { branchFilterCreateItem = container; $('').appendTo(container); - $('').text("Create branch:").appendTo(container); + $('').text(RED._("projects.create-branch-list.create")+":").appendTo(container); $('
').text(entry.name).appendTo(container); } else { $('').appendTo(container); $('').text(entry.name).appendTo(container); if (entry.current) { container.addClass("selected"); - $('').text(options.currentLabel||"current").appendTo(container); + $('').text(options.currentLabel||RED._("projects.create-branch-list.current")).appendTo(container); } } container.click(function(evt) { @@ -2240,9 +2237,9 @@ RED.projects = (function() { function createDefaultFileSet() { if (!activeProject) { - throw new Error("Cannot create default file set without an active project"); + throw new Error(RED._("projects.create-default-file-set.no-active")); } else if (!activeProject.empty) { - throw new Error("Cannot create default file set on a non-empty project"); + throw new Error(RED._("projects.create-default-file-set.no-empty")); } if (!RED.user.hasPermission("projects.write")) { RED.notify(RED._("user.errors.notAuthorized"),"error"); @@ -2269,7 +2266,7 @@ RED.projects = (function() { 200: function(data) { }, 400: { 'git_error': function(error) { - console.log("git error",error); + console.log(RED._("projects.create-default-file-set.git-error"),error); }, 'missing_flow_file': function(error) { // This is a natural next error - but let the runtime event diff --git a/editor/js/ui/projects/tab-versionControl.js b/editor/js/ui/projects/tab-versionControl.js index 4560a56e5..ee8cb98f4 100644 --- a/editor/js/ui/projects/tab-versionControl.js +++ b/editor/js/ui/projects/tab-versionControl.js @@ -52,11 +52,11 @@ RED.sidebar.versionControl = (function() { 200: function(data) { var title; if (state === 'unstaged') { - title = 'Unstaged changes : '+entry.file + title = RED._("sidebar.project.versionControl.unstagedChanges")+' : '+entry.file } else if (state === 'staged') { - title = 'Staged changes : '+entry.file + title = RED._("sidebar.project.versionControl.stagedChanges")+' : '+entry.file } else { - title = 'Resolve conflicts : '+entry.file + title = RED._("sidebar.project.versionControl.resolveConflicts")+' : '+entry.file } var options = { diff: data.diff, @@ -65,18 +65,18 @@ RED.sidebar.versionControl = (function() { project: activeProject } if (state == 'unstaged') { - options.oldRevTitle = entry.indexStatus === " "?"HEAD":"Staged"; - options.newRevTitle = "Unstaged"; + options.oldRevTitle = entry.indexStatus === " "?RED._("sidebar.project.versionControl.head"):RED._("sidebar.project.versionControl.staged"); + options.newRevTitle = RED._("sidebar.project.versionControl.unstaged"); options.oldRev = entry.indexStatus === " "?"@":":0"; options.newRev = "_"; } else if (state === 'staged') { - options.oldRevTitle = "HEAD"; - options.newRevTitle = "Staged"; + options.oldRevTitle = RED._("sidebar.project.versionControl.head"); + options.newRevTitle = RED._("sidebar.project.versionControl.staged"); options.oldRev = "@"; options.newRev = ":0"; } else { - options.oldRevTitle = "Local"; - options.newRevTitle = "Remote"; + options.oldRevTitle = RED._("sidebar.project.versionControl.local"); + options.newRevTitle = RED._("sidebar.project.versionControl.remote"); options.commonRev = ":1"; options.oldRev = ":2"; options.newRev = ":3"; @@ -156,7 +156,7 @@ RED.sidebar.versionControl = (function() { evt.preventDefault(); var spinner = utils.addSpinnerOverlay(container).addClass('projects-dialog-spinner-contain'); - var notification = RED.notify("Are you sure you want to revert the changes to '"+entry.file+"'? This cannot be undone.", { + var notification = RED.notify(RED._("sidebar.project.versionControl.revert",{file:entry.file}), { type: "warning", modal: true, fixed: true, @@ -168,7 +168,7 @@ RED.sidebar.versionControl = (function() { notification.close(); } },{ - text: 'Revert changes', + text: RED._("sidebar.project.versionControl.revertChanges"), click: function() { notification.close(); var activeProject = RED.projects.getActiveProject(); @@ -281,6 +281,8 @@ RED.sidebar.versionControl = (function() { entry["update"+((state==='unstaged')?"Unstaged":"Staged")](entry, status); } var utils; + var emptyStagedItem; + var emptyMergedItem; function init(_utils) { utils = _utils; @@ -312,7 +314,7 @@ RED.sidebar.versionControl = (function() { }); localChanges = sections.add({ - title: "Local Changes", + title: RED._("sidebar.project.versionControl.localChanges"), collapsible: true }); localChanges.expand(); @@ -326,10 +328,12 @@ RED.sidebar.versionControl = (function() { refresh(true); }) + emptyStagedItem = { label: RED._("sidebar.project.versionControl.none") }; + emptyMergedItem = { label: RED._("sidebar.project.versionControl.conflictResolve") }; var unstagedContent = $('').appendTo(localChanges.content); - var header = $('').appendTo(unstagedContent); - stageAllButton = $('') + var header = $('').appendTo(unstagedContent); + stageAllButton = $('') .appendTo(header) .click(function(evt) { evt.preventDefault(); @@ -359,9 +363,9 @@ RED.sidebar.versionControl = (function() { unmergedContent = $('').appendTo(localChanges.content); - header = $('').appendTo(unmergedContent); + header = $('').appendTo(unmergedContent); bg = $('
').appendTo(header); - var abortMergeButton = $('') + var abortMergeButton = $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); @@ -399,7 +403,7 @@ RED.sidebar.versionControl = (function() { addItem: function(row,index,entry) { if (entry === emptyMergedItem) { entry.button = { - label: 'commit', + label: RED._("sidebar.project.versionControl.commit"), click: function(evt) { evt.preventDefault(); evt.stopPropagation(); @@ -423,7 +427,7 @@ RED.sidebar.versionControl = (function() { var stagedContent = $('').appendTo(localChanges.content); - header = $('').appendTo(stagedContent); + header = $('').appendTo(stagedContent); bg = $('
').appendTo(header); var showCommitBox = function() { @@ -446,14 +450,14 @@ RED.sidebar.versionControl = (function() { abortMergeButton.attr("disabled",true); commitMessage.focus(); } - commitButton = $('') + commitButton = $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); evt.stopPropagation(); showCommitBox(); }); - unstageAllButton = $('') + unstageAllButton = $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); @@ -480,14 +484,14 @@ RED.sidebar.versionControl = (function() { commitBox = $('').hide().appendTo(localChanges.content); - var commitMessage = $('') + var commitMessage = $('') .appendTo(commitBox) .on("change keyup paste",function() { submitCommitButton.attr('disabled',$(this).val().trim()===""); }); var commitToolbar = $('