/** * Copyright JS Foundation and other contributors, http://js.foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ RED.sidebar.versionControl = (function() { var content; var sections; var allChanges = {}; var unstagedChangesList; var stageAllButton; var stagedChangesList; var unstageAllButton; var unstagedChanges; var stagedChanges; var bulkChangeSpinner; var commitButton; // TODO: DRY projectSummary.js function addSpinnerOverlay(container) { var spinner = $('
').appendTo(container); return spinner; } function createChangeEntry(row, entry, status, unstaged) { row.addClass("sidebar-version-control-change-entry"); var container = $('
').appendTo(row); var icon = $('').appendTo(container); var label = $('').appendTo(container); var bg = $('
').appendTo(row); $('').appendTo(bg); $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); var activeProject = RED.projects.getActiveProject(); entry.spinner = addSpinnerOverlay(row).addClass('projects-version-control-spinner-sidebar'); utils.sendRequest({ url: "projects/"+activeProject.name+"/stage/"+encodeURIComponent(entry.file), type: unstaged?"POST":"DELETE", responses: { 0: function(error) { console.log(error); // done(error,null); }, 200: function(data) { refreshFiles(data); }, 400: { 'unexpected_error': function(error) { console.log(error); // done(error,null); } }, } },{}); }); entry["update"+(unstaged?"Unstaged":"Staged")] = function(entry,status) { container.removeClass(); var iconClass = ""; if (status === 'A') { container.addClass("node-diff-added"); iconClass = "fa-plus-square"; } else if (status === '?') { container.addClass("node-diff-unchanged"); iconClass = "fa-question-circle-o"; } else if (status === 'D') { container.addClass("node-diff-deleted"); iconClass = "fa-minus-square"; } else if (status === 'M') { container.addClass("node-diff-changed"); iconClass = "fa-square"; } else if (status === 'R') { container.addClass("node-diff-changed"); iconClass = "fa-toggle-right"; } else { iconClass = "fa-exclamation-triangle" } label.empty(); $('').text(entry.file.replace(/\\(.)/g,"$1")).appendTo(label); if (entry.oldName) { $('').prependTo(label); $('').text(entry.oldName.replace(/\\(.)/g,"$1")).prependTo(label); // label.text(entry.oldName+" -> "+entry.file); } // console.log(entry.file,status,iconClass); icon.removeClass(); icon.addClass("fa "+iconClass); if (entry.spinner) { entry.spinner.remove(); delete entry.spinner; } } entry["update"+(unstaged?"Unstaged":"Staged")](entry, status); } var utils; function init(_utils) { utils = _utils; RED.actions.add("core:show-version-control-tab",show); content = $('
', {class:"sidebar-version-control"}); var stackContainer = $("
",{class:"sidebar-version-control-stack"}).appendTo(content); sections = RED.stack.create({ container: stackContainer, fill: true, singleExpanded: true }); var localChanges = sections.add({ title: "Local Changes", collapsible: true }); localChanges.expand(); localChanges.content.css({height:"100%"}); var bg = $('
').appendTo(localChanges.header); $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); refresh(true); }) var unstagedContent = $('').appendTo(localChanges.content); var header = $('').appendTo(unstagedContent); stageAllButton = $('') .appendTo(header) .click(function(evt) { evt.preventDefault(); evt.stopPropagation(); var toStage = Object.keys(allChanges).filter(function(fn) { return allChanges[fn].treeStatus !== ' '; }); updateBulk(toStage,true); }); unstagedChangesList = $("
    ",{style:"position: absolute; top: 30px; bottom: 0; right:0; left:0;"}).appendTo(unstagedContent); unstagedChangesList.editableList({ addButton: false, scrollOnAdd: false, addItem: function(row,index,entry) { createChangeEntry(row,entry,entry.treeStatus,true); }, sort: function(A,B) { if (A.treeStatus === '?' && B.treeStatus !== '?') { return 1; } else if (A.treeStatus !== '?' && B.treeStatus === '?') { return -1; } return A.file.localeCompare(B.file); } }) var stagedContent = $('').appendTo(localChanges.content); var header = $('').appendTo(stagedContent); bg = $('
    ').appendTo(header); commitButton = $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); evt.stopPropagation(); commitMessage.val(""); submitCommitButton.attr("disabled",true); unstagedContent.css("height","30px"); stagedContent.css("height","calc(100% - 30px - 175px)"); commitBox.css("height","175px"); stageAllButton.attr("disabled",true); unstageAllButton.attr("disabled",true); commitButton.attr("disabled",true); commitMessage.focus(); }); unstageAllButton = $('') .appendTo(bg) .click(function(evt) { evt.preventDefault(); evt.stopPropagation(); var toUnstage = Object.keys(allChanges).filter(function(fn) { return allChanges[fn].indexStatus !== ' ' && allChanges[fn].indexStatus !== '?'; }); updateBulk(toUnstage,false); }); stagedChangesList = $("
      ",{style:"position: absolute; top: 30px; bottom: 0; right:0; left:0;"}).appendTo(stagedContent); stagedChangesList.editableList({ addButton: false, scrollOnAdd: false, addItem: function(row,index,entry) { createChangeEntry(row,entry,entry.indexStatus,false); }, sort: function(A,B) { return A.file.localeCompare(B.file); } }) commitBox = $('').appendTo(localChanges.content); var commitMessage = $('