mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Add flow diff view
This commit is contained in:
parent
c720d78c39
commit
932ea7ba8f
@ -119,6 +119,7 @@ module.exports = function(grunt) {
|
|||||||
"editor/js/ui/utils.js",
|
"editor/js/ui/utils.js",
|
||||||
"editor/js/ui/actions.js",
|
"editor/js/ui/actions.js",
|
||||||
"editor/js/ui/deploy.js",
|
"editor/js/ui/deploy.js",
|
||||||
|
"editor/js/ui/diff.js",
|
||||||
"editor/js/ui/keyboard.js",
|
"editor/js/ui/keyboard.js",
|
||||||
"editor/js/ui/workspaces.js",
|
"editor/js/ui/workspaces.js",
|
||||||
"editor/js/ui/view.js",
|
"editor/js/ui/view.js",
|
||||||
|
@ -249,10 +249,10 @@
|
|||||||
RED.view.init();
|
RED.view.init();
|
||||||
RED.editor.init();
|
RED.editor.init();
|
||||||
RED.keyboard.init();
|
RED.keyboard.init();
|
||||||
|
RED.diff.init();
|
||||||
|
|
||||||
RED.menu.init({id:"btn-sidemenu",options: menuOptions});
|
RED.menu.init({id:"btn-sidemenu",options: menuOptions});
|
||||||
|
|
||||||
|
|
||||||
RED.deploy.init(RED.settings.theme("deployButton",null));
|
RED.deploy.init(RED.settings.theme("deployButton",null));
|
||||||
|
|
||||||
RED.actions.add("core:show-about", showAbout);
|
RED.actions.add("core:show-about", showAbout);
|
||||||
|
@ -29,6 +29,8 @@ RED.nodes = (function() {
|
|||||||
added: {}
|
added: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var initialLoad;
|
||||||
|
|
||||||
var dirty = false;
|
var dirty = false;
|
||||||
|
|
||||||
function setDirty(d) {
|
function setDirty(d) {
|
||||||
@ -697,6 +699,9 @@ RED.nodes = (function() {
|
|||||||
if (!$.isArray(newNodes)) {
|
if (!$.isArray(newNodes)) {
|
||||||
newNodes = [newNodes];
|
newNodes = [newNodes];
|
||||||
}
|
}
|
||||||
|
if (!initialLoad) {
|
||||||
|
initialLoad = JSON.parse(JSON.stringify(newNodes));
|
||||||
|
}
|
||||||
var unknownTypes = [];
|
var unknownTypes = [];
|
||||||
for (i=0;i<newNodes.length;i++) {
|
for (i=0;i<newNodes.length;i++) {
|
||||||
n = newNodes[i];
|
n = newNodes[i];
|
||||||
@ -1228,6 +1233,13 @@ RED.nodes = (function() {
|
|||||||
node: getNode,
|
node: getNode,
|
||||||
|
|
||||||
version: flowVersion,
|
version: flowVersion,
|
||||||
|
originalFlow: function(flow) {
|
||||||
|
if (flow === undefined) {
|
||||||
|
return initialLoad;
|
||||||
|
} else {
|
||||||
|
initialLoad = flow;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
filterNodes: filterNodes,
|
filterNodes: filterNodes,
|
||||||
filterLinks: filterLinks,
|
filterLinks: filterLinks,
|
||||||
|
@ -157,198 +157,7 @@ RED.deploy = (function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// $("#node-dialog-view-diff").dialog({
|
|
||||||
// title: RED._('deploy.confirm.button.review'),
|
|
||||||
// modal: true,
|
|
||||||
// autoOpen: false,
|
|
||||||
// buttons: [
|
|
||||||
// {
|
|
||||||
// text: RED._("deploy.confirm.button.cancel"),
|
|
||||||
// click: function() {
|
|
||||||
// $( this ).dialog( "close" );
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// text: RED._("deploy.confirm.button.merge"),
|
|
||||||
// class: "primary",
|
|
||||||
// click: function() {
|
|
||||||
// $( this ).dialog( "close" );
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ],
|
|
||||||
// open: function() {
|
|
||||||
// $(this).dialog({width:Math.min($(window).width(),900),height:Math.min($(window).height(),600)});
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
// $("#node-dialog-view-diff-diff").editableList({
|
|
||||||
// addButton: false,
|
|
||||||
// scrollOnAdd: false,
|
|
||||||
// addItem: function(container,i,object) {
|
|
||||||
// var tab = object.tab.n;
|
|
||||||
// var tabDiv = $('<div>',{class:"node-diff-tab collapsed"}).appendTo(container);
|
|
||||||
//
|
|
||||||
// var titleRow = $('<div>',{class:"node-diff-tab-title"}).appendTo(tabDiv);
|
|
||||||
// titleRow.click(function(evt) {
|
|
||||||
// evt.preventDefault();
|
|
||||||
// titleRow.parent().toggleClass('collapsed');
|
|
||||||
// })
|
|
||||||
// var chevron = $('<i class="fa fa-angle-down node-diff-chevron ">').appendTo(titleRow);
|
|
||||||
// var title = $('<span>').html(tab.label||tab.id).appendTo(titleRow);
|
|
||||||
//
|
|
||||||
// var stats = $('<span>',{class:"node-diff-tab-stats"}).appendTo(titleRow);
|
|
||||||
//
|
|
||||||
// var addedCount = 0;
|
|
||||||
// var deletedCount = 0;
|
|
||||||
// var changedCount = 0;
|
|
||||||
// var conflictedCount = 0;
|
|
||||||
//
|
|
||||||
// object.tab.nodes.forEach(function(node) {
|
|
||||||
// var realNode = RED.nodes.node(node.id);
|
|
||||||
// var hasChanges = false;
|
|
||||||
// if (currentDiff.added[node.id]) {
|
|
||||||
// addedCount++;
|
|
||||||
// hasChanges = true;
|
|
||||||
// }
|
|
||||||
// if (currentDiff.deleted[node.id]) {
|
|
||||||
// deletedCount++;
|
|
||||||
// hasChanges = true;
|
|
||||||
// }
|
|
||||||
// if (currentDiff.changed[node.id]) {
|
|
||||||
// changedCount++;
|
|
||||||
// hasChanges = true;
|
|
||||||
// }
|
|
||||||
// if (currentDiff.conflicted[node.id]) {
|
|
||||||
// conflictedCount++;
|
|
||||||
// hasChanges = true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (hasChanges) {
|
|
||||||
// var def = RED.nodes.getType(node.type)||{};
|
|
||||||
// var div = $("<div>",{class:"node-diff-node-entry collapsed"}).appendTo(tabDiv);
|
|
||||||
// var nodeTitleDiv = $("<div>",{class:"node-diff-node-entry-title"}).appendTo(div);
|
|
||||||
// nodeTitleDiv.click(function(evt) {
|
|
||||||
// evt.preventDefault();
|
|
||||||
// $(this).parent().toggleClass('collapsed');
|
|
||||||
// })
|
|
||||||
// var newNode = currentDiff.newConfig.all[node.id];
|
|
||||||
// var nodePropertiesDiv = $("<div>",{class:"node-diff-node-entry-properties"}).appendTo(div);
|
|
||||||
//
|
|
||||||
// var nodePropertiesTable = $("<table>").appendTo(nodePropertiesDiv);
|
|
||||||
//
|
|
||||||
// if (node.hasOwnProperty('x')) {
|
|
||||||
// if (newNode.x !== node.x || newNode.y !== node.y) {
|
|
||||||
// var currentPosition = node.x+", "+node.y
|
|
||||||
// var newPosition = newNode.x+", "+newNode.y;
|
|
||||||
// $("<tr><td>position</td><td>"+currentPosition+"</td><td>"+newPosition+"</td></tr>").appendTo(nodePropertiesTable);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// var properties = Object.keys(node).filter(function(p) { return p!='z'&&p!='wires'&&p!=='x'&&p!=='y'&&p!=='id'&&p!=='type'&&(!def.defaults||!def.defaults.hasOwnProperty(p))});
|
|
||||||
// if (def.defaults) {
|
|
||||||
// properties = properties.concat(Object.keys(def.defaults));
|
|
||||||
// }
|
|
||||||
// properties.forEach(function(d) {
|
|
||||||
// var localValue = JSON.stringify(node[d]);
|
|
||||||
// var remoteValue = JSON.stringify(newNode[d]);
|
|
||||||
// var originalValue = realNode._config[d];
|
|
||||||
//
|
|
||||||
// if (remoteValue !== originalValue) {
|
|
||||||
// var formattedProperty = formatNodeProperty(node[d]);
|
|
||||||
// var newFormattedProperty = formatNodeProperty(newNode[d]);
|
|
||||||
// if (localValue === originalValue) {
|
|
||||||
// // no conflict change
|
|
||||||
// } else {
|
|
||||||
// // conflicting change
|
|
||||||
// }
|
|
||||||
// $("<tr><td>"+d+'</td><td class="">'+formattedProperty+'</td><td class="node-diff-property-changed">'+newFormattedProperty+"</td></tr>").appendTo(nodePropertiesTable);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// })
|
|
||||||
// var nodeChevron = $('<i class="fa fa-angle-down node-diff-chevron">').appendTo(nodeTitleDiv);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // var leftColumn = $('<div>',{class:"node-diff-column"}).appendTo(div);
|
|
||||||
// // var rightColumn = $('<div>',{class:"node-diff-column"}).appendTo(div);
|
|
||||||
// // rightColumn.html(" ");
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// var nodeDiv = $("<div>",{class:"node-diff-node-entry-node"}).appendTo(nodeTitleDiv);
|
|
||||||
// var colour = def.color;
|
|
||||||
// var icon_url = "arrow-in.png";
|
|
||||||
// if (node.type === 'tab') {
|
|
||||||
// colour = "#C0DEED";
|
|
||||||
// icon_url = "subflow.png";
|
|
||||||
// } else if (def.category === 'config') {
|
|
||||||
// icon_url = "cog.png";
|
|
||||||
// } else if (node.type === 'unknown') {
|
|
||||||
// icon_url = "alert.png";
|
|
||||||
// } else {
|
|
||||||
// icon_url = def.icon;
|
|
||||||
// }
|
|
||||||
// nodeDiv.css('backgroundColor',colour);
|
|
||||||
//
|
|
||||||
// var iconContainer = $('<div/>',{class:"palette_icon_container"}).appendTo(nodeDiv);
|
|
||||||
// $('<div/>',{class:"palette_icon",style:"background-image: url(icons/"+icon_url+")"}).appendTo(iconContainer);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// var contentDiv = $('<div>',{class:"node-diff-node-description"}).appendTo(nodeTitleDiv);
|
|
||||||
//
|
|
||||||
// $('<span>',{class:"node-diff-node-label"}).html(node.label || node.name || node.id).appendTo(contentDiv);
|
|
||||||
// //$('<div>',{class:"red-ui-search-result-node-type"}).html(node.type).appendTo(contentDiv);
|
|
||||||
// //$('<div>',{class:"red-ui-search-result-node-id"}).html(node.id).appendTo(contentDiv);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// var statsInfo = '<span class="node-diff-count">'+object.tab.nodes.length+" nodes"+
|
|
||||||
// (addedCount+deletedCount+changedCount+conflictedCount > 0 ? " : ":"")+
|
|
||||||
// "</span> "+
|
|
||||||
// ((addedCount > 0)?'<span class="node-diff-added">'+addedCount+' added</span> ':'')+
|
|
||||||
// ((deletedCount > 0)?'<span class="node-diff-deleted">'+deletedCount+' deleted</span> ':'')+
|
|
||||||
// ((changedCount > 0)?'<span class="node-diff-changed">'+changedCount+' changed</span> ':'')+
|
|
||||||
// ((conflictedCount > 0)?'<span class="node-diff-conflicted">'+conflictedCount+' conflicts</span>':'');
|
|
||||||
// stats.html(statsInfo);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// //
|
|
||||||
// //
|
|
||||||
// //
|
|
||||||
// // var node = object.node;
|
|
||||||
// // var realNode = RED.nodes.node(node.id);
|
|
||||||
// // var def = RED.nodes.getType(object.node.type)||{};
|
|
||||||
// // var l = "";
|
|
||||||
// // if (def && def.label && realNode) {
|
|
||||||
// // l = def.label;
|
|
||||||
// // try {
|
|
||||||
// // l = (typeof l === "function" ? l.call(realNode) : l);
|
|
||||||
// // } catch(err) {
|
|
||||||
// // console.log("Definition error: "+node.type+".label",err);
|
|
||||||
// // }
|
|
||||||
// // }
|
|
||||||
// // l = l||node.label||node.name||node.id||"";
|
|
||||||
// // console.log(node);
|
|
||||||
// // var div = $('<div>').appendTo(container);
|
|
||||||
// // div.html(l);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatNodeProperty(prop) {
|
|
||||||
var formattedProperty = prop;
|
|
||||||
if (formattedProperty === null) {
|
|
||||||
formattedProperty = 'null';
|
|
||||||
} else if (formattedProperty === undefined) {
|
|
||||||
formattedProperty = 'undefined';
|
|
||||||
} else if (typeof formattedProperty === 'object') {
|
|
||||||
formattedProperty = JSON.stringify(formattedProperty);
|
|
||||||
}
|
|
||||||
if (/\n/.test(formattedProperty)) {
|
|
||||||
formattedProperty = "<pre>"+formattedProperty+"</pre>"
|
|
||||||
}
|
|
||||||
return formattedProperty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNodeInfo(node) {
|
function getNodeInfo(node) {
|
||||||
@ -414,124 +223,6 @@ RED.deploy = (function() {
|
|||||||
// });
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
// function parseNodes(nodeList) {
|
|
||||||
// var tabOrder = [];
|
|
||||||
// var tabs = {};
|
|
||||||
// var subflows = {};
|
|
||||||
// var globals = [];
|
|
||||||
// var all = {};
|
|
||||||
//
|
|
||||||
// nodeList.forEach(function(node) {
|
|
||||||
// all[node.id] = node;
|
|
||||||
// if (node.type === 'tab') {
|
|
||||||
// tabOrder.push(node.id);
|
|
||||||
// tabs[node.id] = {n:node,nodes:[]};
|
|
||||||
// } else if (node.type === 'subflow') {
|
|
||||||
// subflows[node.id] = {n:node,nodes:[]};
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// nodeList.forEach(function(node) {
|
|
||||||
// if (node.type !== 'tab' && node.type !== 'subflow') {
|
|
||||||
// if (tabs[node.z]) {
|
|
||||||
// tabs[node.z].nodes.push(node);
|
|
||||||
// } else if (subflows[node.z]) {
|
|
||||||
// subflows[node.z].nodes.push(node);
|
|
||||||
// } else {
|
|
||||||
// globals.push(node);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// return {
|
|
||||||
// all: all,
|
|
||||||
// tabOrder: tabOrder,
|
|
||||||
// tabs: tabs,
|
|
||||||
// subflows: subflows,
|
|
||||||
// globals: globals
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function generateDiff(currentNodes,newNodes) {
|
|
||||||
// var currentConfig = parseNodes(currentNodes);
|
|
||||||
// var newConfig = parseNodes(newNodes);
|
|
||||||
// var pending = RED.nodes.pending();
|
|
||||||
// var added = {};
|
|
||||||
// var deleted = {};
|
|
||||||
// var changed = {};
|
|
||||||
// var conflicted = {};
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Object.keys(currentConfig.all).forEach(function(id) {
|
|
||||||
// var node = RED.nodes.workspace(id)||RED.nodes.subflow(id)||RED.nodes.node(id);
|
|
||||||
// if (!newConfig.all.hasOwnProperty(id)) {
|
|
||||||
// if (!pending.added.hasOwnProperty(id)) {
|
|
||||||
// deleted[id] = true;
|
|
||||||
// conflicted[id] = node.changed;
|
|
||||||
// }
|
|
||||||
// } else if (JSON.stringify(currentConfig.all[id]) !== JSON.stringify(newConfig.all[id])) {
|
|
||||||
// changed[id] = true;
|
|
||||||
// conflicted[id] = node.changed;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// Object.keys(newConfig.all).forEach(function(id) {
|
|
||||||
// if (!currentConfig.all.hasOwnProperty(id) && !pending.deleted.hasOwnProperty(id)) {
|
|
||||||
// added[id] = true;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// // console.log("Added",added);
|
|
||||||
// // console.log("Deleted",deleted);
|
|
||||||
// // console.log("Changed",changed);
|
|
||||||
// // console.log("Conflicted",conflicted);
|
|
||||||
//
|
|
||||||
// var formatString = function(id) {
|
|
||||||
// return conflicted[id]?"!":(added[id]?"+":(deleted[id]?"-":(changed[id]?"~":" ")));
|
|
||||||
// }
|
|
||||||
// newConfig.tabOrder.forEach(function(tabId) {
|
|
||||||
// var tab = newConfig.tabs[tabId];
|
|
||||||
// console.log(formatString(tabId),"Flow:",tab.n.label, "("+tab.n.id+")");
|
|
||||||
// tab.nodes.forEach(function(node) {
|
|
||||||
// console.log(" ",formatString(node.id),node.type,node.name || node.id);
|
|
||||||
// })
|
|
||||||
// if (currentConfig.tabs[tabId]) {
|
|
||||||
// currentConfig.tabs[tabId].nodes.forEach(function(node) {
|
|
||||||
// if (deleted[node.id]) {
|
|
||||||
// console.log(" ",formatString(node.id),node.type,node.name || node.id);
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// currentConfig.tabOrder.forEach(function(tabId) {
|
|
||||||
// if (deleted[tabId]) {
|
|
||||||
// console.log(formatString(tabId),"Flow:",tab.n.label, "("+tab.n.id+")");
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// currentDiff = {
|
|
||||||
// currentConfig: currentConfig,
|
|
||||||
// newConfig: newConfig,
|
|
||||||
// added: added,
|
|
||||||
// deleted: deleted,
|
|
||||||
// changed: changed,
|
|
||||||
// conflicted: conflicted
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function showDiff() {
|
|
||||||
// if (currentDiff) {
|
|
||||||
// var list = $("#node-dialog-view-diff-diff");
|
|
||||||
// list.editableList('empty');
|
|
||||||
// var currentConfig = currentDiff.currentConfig;
|
|
||||||
// currentConfig.tabOrder.forEach(function(tabId) {
|
|
||||||
// var tab = currentConfig.tabs[tabId];
|
|
||||||
// list.editableList('addItem',{tab:tab})
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// $("#node-dialog-view-diff").dialog("open");
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
function save(skipValidation,force) {
|
function save(skipValidation,force) {
|
||||||
if (!$("#btn-deploy").hasClass("disabled")) {
|
if (!$("#btn-deploy").hasClass("disabled")) {
|
||||||
if (!skipValidation) {
|
if (!skipValidation) {
|
||||||
@ -624,6 +315,7 @@ RED.deploy = (function() {
|
|||||||
}).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);
|
||||||
if (hasUnusedConfig) {
|
if (hasUnusedConfig) {
|
||||||
RED.notify(
|
RED.notify(
|
||||||
'<p>'+RED._("deploy.successfulDeploy")+'</p>'+
|
'<p>'+RED._("deploy.successfulDeploy")+'</p>'+
|
||||||
|
@ -22,26 +22,40 @@
|
|||||||
border-radius:1px;
|
border-radius:1px;
|
||||||
padding:0;
|
padding:0;
|
||||||
}
|
}
|
||||||
ol {
|
#node-dialog-view-diff-diff {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top:10px;
|
top:50px;
|
||||||
bottom:10px;
|
bottom:10px;
|
||||||
left:10px;
|
left:10px;
|
||||||
right:10px;
|
right:10px;
|
||||||
li {
|
li {
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
border: none;
|
border: none;
|
||||||
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.red-ui-editableList-item-content {
|
.red-ui-editableList-item-content {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
padding-bottom: 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
.node-diff-toolbar {
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
color: #666;
|
||||||
|
text-align: right;
|
||||||
|
padding: 8px 10px;
|
||||||
|
background: #f3f3f3;
|
||||||
|
border-bottom: 1px solid $secondary-border-color;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.node-diff-tab {
|
.node-diff-tab {
|
||||||
border: 1px solid $secondary-border-color;
|
border: 1px solid $secondary-border-color;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
&.collapsed {
|
&.collapsed {
|
||||||
.node-diff-tab-title > .node-diff-chevron {
|
.node-diff-tab-title > .node-diff-chevron {
|
||||||
@ -55,9 +69,11 @@
|
|||||||
.node-diff-tab-stats {
|
.node-diff-tab-stats {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
top: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.node-diff-chevron {
|
.node-diff-chevron {
|
||||||
|
display: inline-block;
|
||||||
width: 15px;
|
width: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin: 3px 5px 3px 5px;
|
margin: 3px 5px 3px 5px;
|
||||||
@ -65,10 +81,7 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
.node-diff-node-entry {
|
.node-diff-node-entry {
|
||||||
padding: 0 0 0 5px;
|
border-top: 1px solid $secondary-border-color;
|
||||||
&:not(:last-child) {
|
|
||||||
border-bottom: 1px solid $secondary-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.collapsed {
|
&.collapsed {
|
||||||
.node-diff-chevron {
|
.node-diff-chevron {
|
||||||
@ -88,13 +101,16 @@
|
|||||||
border: 1px solid $secondary-border-color;
|
border: 1px solid $secondary-border-color;
|
||||||
padding: 3px 5px;
|
padding: 3px 5px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
tr {
|
||||||
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
td:nth-child(1) {
|
td:nth-child(1) {
|
||||||
width: 150px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
td:not(:first-child) {
|
td:not(:first-child) {
|
||||||
width: calc(50% - 150px);
|
width: calc(50% - 100px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.node-diff-column {
|
.node-diff-column {
|
||||||
@ -108,6 +124,7 @@
|
|||||||
border-right: 1px solid $secondary-border-color
|
border-right: 1px solid $secondary-border-color
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.node-diff-tab-title {
|
.node-diff-tab-title {
|
||||||
padding: 3px 3px 3px 0;
|
padding: 3px 3px 3px 0;
|
||||||
background: #f6f6f6;
|
background: #f6f6f6;
|
||||||
@ -135,15 +152,60 @@
|
|||||||
width: 24px;
|
width: 24px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.node-diff-tab-empty {
|
||||||
|
.node-diff-chevron i {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.node-diff-tab-title {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.node-diff-node-deleted {
|
||||||
|
//background: #fadddd;
|
||||||
|
cursor: default !important;
|
||||||
|
.node-diff-status {
|
||||||
|
color: #f80000;
|
||||||
|
}
|
||||||
|
.node-diff-node-entry-node {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
.node-diff-node-description {
|
||||||
|
opacity: 0.5;
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.node-diff-node-added {
|
||||||
|
//background: #eefaee;
|
||||||
|
cursor: default !important;
|
||||||
|
.node-diff-status {
|
||||||
|
color: #009900;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.node-diff-node-changed {
|
||||||
|
//background: #fff2ca;
|
||||||
|
.node-diff-status {
|
||||||
|
color: #f89406;
|
||||||
|
}
|
||||||
|
}
|
||||||
.node-diff-node-entry-title {
|
.node-diff-node-entry-title {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
.node-diff-status {
|
||||||
|
margin-left: 15px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.node-diff-node-entry-properties {
|
.node-diff-node-entry-properties {
|
||||||
margin-left: 30px;
|
margin: 6px 8px 6px 30px;
|
||||||
margin-right: 8px;
|
|
||||||
margin-bottom:8px;
|
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
}
|
||||||
|
.node-diff-status {
|
||||||
|
display: inline-block;
|
||||||
|
width: 15px;
|
||||||
|
height: 20px;
|
||||||
|
margin-left: 5px;
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.node-diff-node-description {
|
.node-diff-node-description {
|
||||||
color: $form-text-color;
|
color: $form-text-color;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
@ -156,7 +218,13 @@
|
|||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.node-diff-node-meta {
|
||||||
|
float: right;
|
||||||
|
font-size: 0.9em;
|
||||||
|
color: #999;
|
||||||
|
margin-top: 7px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.node-diff-count { color: #999}
|
.node-diff-count { color: #999}
|
||||||
.node-diff-added { color: #009900}
|
.node-diff-added { color: #009900}
|
||||||
|
@ -97,9 +97,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div id="node-dialog-view-diff" class="hide">
|
|
||||||
<ol id="node-dialog-view-diff-diff"></ol>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="node-dialog-library-save-confirm" class="hide">
|
<div id="node-dialog-library-save-confirm" class="hide">
|
||||||
<form class="form-horizontal">
|
<form class="form-horizontal">
|
||||||
|
Loading…
Reference in New Issue
Block a user