|
@@ -292,6 +292,8 @@
|
|
|
<a href="#" id="refresh-counts" class="ml-3">Refresh Counts</a>
|
|
|
<a href="#" class="tree-expand-all ml-3" title="Expand All"><i class="fa fa-angle-double-down text-secondary"></i></a>
|
|
|
<a href="#" class="tree-collapse-all ml-2" title="Collapse All"><i class="fa fa-angle-double-up text-secondary"></i></a>
|
|
|
+ <a href="#" id="paste-as-root" class="ml-3">Paste as root</a>
|
|
|
+ <input type="text" id="paste-container" style="position: fixed; top: 0; left: 0;">
|
|
|
<div class="ml-auto mr-2 d-none if-changed">
|
|
|
<a href="#" class="btn btn-sm btn-primary text-white" id="btn-save-tree">Save</a>
|
|
|
<a href="#" class="ml-1 btn btn-sm btn-default border text-dark bg-white" onclick="return fastReload()">Reset</a>
|
|
@@ -623,9 +625,10 @@
|
|
|
StatTree.el.jstree(true).copy(selected.id);
|
|
|
|
|
|
// put into localStorage for paste_ext
|
|
|
- let node = StatTree.el.jstree(true).get_json(selected.id);
|
|
|
- localStorage.stPasteBuffer = JSON.stringify(StatTree.getPasteBufferForNode(node));
|
|
|
-
|
|
|
+ let node = StatTree.el.jstree(true).get_json(selected.id),
|
|
|
+ json = JSON.stringify(StatTree.getPasteBufferForNode(node));
|
|
|
+ localStorage.stPasteBuffer = json;
|
|
|
+ copyTextToClipboard(json);
|
|
|
}
|
|
|
},
|
|
|
},
|
|
@@ -896,7 +899,7 @@
|
|
|
if(!realNode.data) return;
|
|
|
if(parent && parent.data.lastRefreshCount !== null && parent.data.lastRefreshCount !== -1) {
|
|
|
if(node.data.lastRefreshCount !== null && node.data.lastRefreshCount !== -1) {
|
|
|
- realNode.data.dropPercent = (((parent.data.lastRefreshCount - node.data.lastRefreshCount) / parent.data.lastRefreshCount) * 100);
|
|
|
+ realNode.data.dropPercent = 100 - ((node.data.lastRefreshCount / parent.data.lastRefreshCount) * 100);
|
|
|
if(realNode.data.dropPercent) {
|
|
|
let element = StatTree.el.jstree(true).get_node(node.id, true), cssClass = '';
|
|
|
if(realNode.data.dropPercent > 75) {
|
|
@@ -914,7 +917,7 @@
|
|
|
element.find('>a.jstree-anchor')
|
|
|
.addClass('has-drop-visualization')
|
|
|
.addClass(cssClass)
|
|
|
- .attr('data-drop-percent', (realNode.data.dropPercent.toFixed(1)) + '% ⤵');
|
|
|
+ .attr('data-drop-percent', (realNode.data.dropPercent.toFixed(3)) + '% ⤵');
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1361,6 +1364,27 @@
|
|
|
return false;
|
|
|
});
|
|
|
|
|
|
+ $('#paste-as-root')
|
|
|
+ .off('click')
|
|
|
+ .on('click', function() {
|
|
|
+ let pasteInput = $('#paste-container');
|
|
|
+ pasteInput.empty().focus();
|
|
|
+ navigator.clipboard.readText().then(clipText => {
|
|
|
+ // check if valid json
|
|
|
+ try {
|
|
|
+ let parsed = JSON.parse(clipText);
|
|
|
+ // empty the tree
|
|
|
+ StatTree.el.jstree(true).delete_node(StatTree.el.jstree(true).get_node("#").children);
|
|
|
+
|
|
|
+ // paste it!
|
|
|
+ StatTree.el.jstree(true).create_node('#', parsed, 'first');
|
|
|
+ }
|
|
|
+ catch (e) {
|
|
|
+ toastr.error('Invalid paste buffer!');
|
|
|
+ }
|
|
|
+ })
|
|
|
+ });
|
|
|
+
|
|
|
$(document)
|
|
|
.off('click', '.mv-view-data-trigger')
|
|
|
.on('click', '.mv-view-data-trigger', function() {
|