node-red/editor/js/ui/palette.js

371 lines
14 KiB
JavaScript
Raw Normal View History

2013-09-05 16:02:48 +02:00
/**
2015-03-12 01:08:47 +01:00
* Copyright 2013, 2015 IBM Corp.
2013-09-05 16:02:48 +02:00
*
* 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.
**/
2014-08-08 01:01:35 +02:00
RED.palette = (function() {
2014-06-30 17:31:02 +02:00
var exclusion = ['config','unknown','deprecated'];
var core = ['subflows', 'input', 'output', 'function', 'social', 'storage', 'analysis', 'advanced'];
2015-07-14 16:59:56 +02:00
var categoryContainers = {};
function createCategoryContainer(category, label){
label = label || category.replace("_", " ");
2015-07-14 16:59:56 +02:00
var catDiv = $('<div id="palette-container-'+category+'" class="palette-category palette-close hide">'+
2015-07-13 12:26:29 +02:00
'<div id="palette-header-'+category+'" class="palette-header"><i class="expanded fa fa-angle-down"></i><span>'+label+'</span></div>'+
'<div class="palette-content" id="palette-base-category-'+category+'">'+
2014-08-19 23:58:52 +02:00
'<div id="palette-'+category+'-input"></div>'+
'<div id="palette-'+category+'-output"></div>'+
'<div id="palette-'+category+'-function"></div>'+
'</div>'+
2015-07-14 16:59:56 +02:00
'</div>').appendTo("#palette-container");
categoryContainers[category] = {
container: catDiv,
close: function() {
catDiv.removeClass("palette-open");
catDiv.addClass("palette-closed");
$("#palette-base-category-"+category).slideUp();
$("#palette-header-"+category+" i").removeClass("expanded");
},
open: function() {
catDiv.addClass("palette-open");
catDiv.removeClass("palette-closed");
$("#palette-base-category-"+category).slideDown();
$("#palette-header-"+category+" i").addClass("expanded");
},
toggle: function() {
if (catDiv.hasClass("palette-open")) {
categoryContainers[category].close();
} else {
categoryContainers[category].open();
}
}
};
$("#palette-header-"+category).on('click', function(e) {
2015-07-14 16:59:56 +02:00
categoryContainers[category].toggle();
});
}
2014-02-25 00:35:11 +01:00
function setLabel(type, el,label) {
var nodeWidth = 80;
var nodeHeight = 25;
var lineHeight = 20;
var portHeight = 10;
var words = label.split(" ");
2014-02-25 00:35:11 +01:00
var displayLines = [];
2014-02-25 00:35:11 +01:00
var currentLine = words[0];
var currentLineWidth = RED.view.calculateTextWidth(currentLine, "palette_label", 0);
2014-02-25 00:35:11 +01:00
for (var i=1;i<words.length;i++) {
var newWidth = RED.view.calculateTextWidth(currentLine+" "+words[i], "palette_label", 0);
if (newWidth < nodeWidth) {
currentLine += " "+words[i];
currentLineWidth = newWidth;
} else {
displayLines.push(currentLine);
currentLine = words[i];
currentLineWidth = RED.view.calculateTextWidth(currentLine, "palette_label", 0);
}
}
displayLines.push(currentLine);
2014-02-25 00:35:11 +01:00
var lines = displayLines.join("<br/>");
var multiLineNodeHeight = 8+(lineHeight*displayLines.length);
el.css({height:multiLineNodeHeight+"px"});
var labelElement = el.find(".palette_label");
labelElement.html(lines);
2014-02-25 00:35:11 +01:00
el.find(".palette_port").css({top:(multiLineNodeHeight/2-5)+"px"});
2014-02-25 00:35:11 +01:00
var popOverContent;
try {
var l = "<p><b>"+label+"</b></p>";
if (label != type) {
l = "<p><b>"+label+"</b><br/><i>"+type+"</i></p>";
}
2015-07-01 00:42:03 +02:00
2015-05-22 01:40:27 +02:00
popOverContent = $(l+($("script[data-help-name|='"+type+"']").html()||"<p>"+RED._("palette.noInfo")+"</p>").trim())
.filter(function(n) {
return this.nodeType == 1 || (this.nodeType == 3 && this.textContent.trim().length > 0)
}).slice(0,2);
2014-02-25 00:35:11 +01:00
} catch(err) {
// Malformed HTML may cause errors. TODO: need to understand what can break
2015-07-01 00:42:03 +02:00
// NON-NLS: internal debug
console.log("Error generating pop-over label for ",type);
2014-02-25 00:35:11 +01:00
console.log(err.toString());
2015-05-22 01:40:27 +02:00
popOverContent = "<p><b>"+label+"</b></p><p>"+RED._("palette.noInfo")+"</p>";
2014-02-25 00:35:11 +01:00
}
2014-02-25 00:35:11 +01:00
el.data('popover').options.content = popOverContent;
}
2014-02-25 00:35:11 +01:00
function escapeNodeType(nt) {
return nt.replace(" ","_").replace(".","_").replace(":","_");
}
2014-02-25 00:35:11 +01:00
function addNodeType(nt,def) {
var nodeTypeId = escapeNodeType(nt);
if ($("#palette_node_"+nodeTypeId).length) {
return;
}
if (exclusion.indexOf(def.category)===-1) {
var category = def.category.replace(" ","_");
var rootCategory = category.split("-")[0];
var d = document.createElement("div");
d.id = "palette_node_"+nodeTypeId;
d.type = nt;
var label;
2014-10-09 11:05:45 +02:00
if (typeof def.paletteLabel === "undefined") {
label = /^(.*?)([ -]in|[ -]out)?$/.exec(nt)[1];
2014-10-09 11:05:45 +02:00
} else {
label = (typeof def.paletteLabel === "function" ? def.paletteLabel.call(def) : def.paletteLabel)||"";
}
2014-10-09 11:05:45 +02:00
2015-07-01 00:42:03 +02:00
$('<div/>',{class:"palette_label"+(def.align=="right"?" palette_label_right":"")}).appendTo(d);
d.className="palette_node";
2015-07-01 00:42:03 +02:00
if (def.icon) {
var icon_url = (typeof def.icon === "function" ? def.icon.call({}) : def.icon);
var iconContainer = $('<div/>',{class:"palette_icon_container"+(def.align=="right"?" palette_icon_container_right":"")}).appendTo(d);
$('<div/>',{class:"palette_icon",style:"background-image: url(icons/"+icon_url+")"}).appendTo(iconContainer);
}
d.style.backgroundColor = def.color;
if (def.outputs > 0) {
var portOut = document.createElement("div");
portOut.className = "palette_port palette_port_output";
d.appendChild(portOut);
}
if (def.inputs > 0) {
var portIn = document.createElement("div");
2014-02-25 00:35:11 +01:00
portIn.className = "palette_port palette_port_input";
d.appendChild(portIn);
}
if ($("#palette-base-category-"+rootCategory).length === 0) {
if(core.indexOf(rootCategory) !== -1){
createCategoryContainer(rootCategory, RED._("node-red:palette.label."+rootCategory, {defaultValue:rootCategory}));
2015-07-13 12:26:29 +02:00
} else {
var ns = def.set.id;
createCategoryContainer(rootCategory, RED._(ns+":palette.label."+rootCategory, {defaultValue:rootCategory}));
}
}
$("#palette-container-"+rootCategory).show();
if ($("#palette-"+category).length === 0) {
$("#palette-base-category-"+rootCategory).append('<div id="palette-'+category+'"></div>');
}
$("#palette-"+category).append(d);
d.onmousedown = function(e) { e.preventDefault(); };
$(d).popover({
title:d.type,
placement:"right",
trigger: "hover",
delay: { show: 750, hide: 50 },
html: true,
2014-02-25 00:35:11 +01:00
container:'body'
});
$(d).click(function() {
RED.view.focus();
var help = '<div class="node-help">'+($("script[data-help-name|='"+d.type+"']").html()||"")+"</div>";
$("#tab-info").html(help);
});
$(d).draggable({
helper: 'clone',
appendTo: 'body',
revert: true,
revertDuration: 50,
start: function() {RED.view.focus();}
});
2015-07-01 00:42:03 +02:00
if (def.category == "subflows") {
$(d).dblclick(function(e) {
RED.workspaces.show(nt.substring(8));
e.preventDefault();
});
}
2014-02-25 00:35:11 +01:00
setLabel(nt,$(d),label);
2015-07-01 00:42:03 +02:00
var categoryNode = $("#palette-container-"+category);
if (categoryNode.find(".palette_node").length === 1) {
2015-07-14 16:59:56 +02:00
categoryContainers[category].open();
}
2015-07-01 00:42:03 +02:00
}
2013-09-05 16:02:48 +02:00
}
function removeNodeType(nt) {
2014-02-25 00:35:11 +01:00
var nodeTypeId = escapeNodeType(nt);
2015-03-21 00:12:52 +01:00
var paletteNode = $("#palette_node_"+nodeTypeId);
var categoryNode = paletteNode.closest(".palette-category");
paletteNode.remove();
if (categoryNode.find(".palette_node").length === 0) {
if (categoryNode.find("i").hasClass("expanded")) {
categoryNode.find(".palette-content").slideToggle();
categoryNode.find("i").toggleClass("expanded");
}
}
}
function hideNodeType(nt) {
2014-02-25 00:35:11 +01:00
var nodeTypeId = escapeNodeType(nt);
$("#palette_node_"+nodeTypeId).hide();
}
function showNodeType(nt) {
2014-02-25 00:35:11 +01:00
var nodeTypeId = escapeNodeType(nt);
$("#palette_node_"+nodeTypeId).show();
}
2014-02-25 00:35:11 +01:00
function refreshNodeTypes() {
RED.nodes.eachSubflow(function(sf) {
var paletteNode = $("#palette_node_subflow_"+sf.id.replace(".","_"));
var portInput = paletteNode.find(".palette_port_input");
var portOutput = paletteNode.find(".palette_port_output");
2014-02-25 00:35:11 +01:00
if (portInput.length === 0 && sf.in.length > 0) {
var portIn = document.createElement("div");
portIn.className = "palette_port palette_port_input";
paletteNode.append(portIn);
} else if (portInput.length !== 0 && sf.in.length === 0) {
portInput.remove();
}
if (portOutput.length === 0 && sf.out.length > 0) {
2014-02-25 00:35:11 +01:00
var portOut = document.createElement("div");
portOut.className = "palette_port palette_port_output";
paletteNode.append(portOut);
} else if (portOutput.length !== 0 && sf.out.length === 0) {
2014-02-25 00:35:11 +01:00
portOutput.remove();
}
2014-02-25 00:35:11 +01:00
setLabel(sf.type+":"+sf.id,paletteNode,sf.name);
});
}
2014-01-19 01:01:27 +01:00
function filterChange() {
var val = $("#palette-search-input").val();
2014-08-08 01:01:35 +02:00
if (val === "") {
2014-01-19 01:01:27 +01:00
$("#palette-search-clear").hide();
} else {
$("#palette-search-clear").show();
}
var re = new RegExp(val,'i');
2014-01-19 01:01:27 +01:00
$(".palette_node").each(function(i,el) {
2015-03-20 12:40:34 +01:00
var currentLabel = $(el).find(".palette_label").text();
if (val === "" || re.test(el.id) || re.test(currentLabel)) {
2014-01-19 01:01:27 +01:00
$(this).show();
} else {
$(this).hide();
}
2013-09-05 16:02:48 +02:00
});
2015-07-14 16:59:56 +02:00
for (var category in categoryContainers) {
if (categoryContainers.hasOwnProperty(category)) {
if (categoryContainers[category].container
.find(".palette_node")
.filter(function() { return $(this).css('display') !== 'none'}).length === 0) {
categoryContainers[category].close();
} else {
categoryContainers[category].open();
}
}
}
2014-01-19 01:01:27 +01:00
}
2014-11-11 11:15:02 +01:00
function init() {
$(".palette-spinner").show();
if (RED.settings.paletteCategories) {
RED.settings.paletteCategories.forEach(function(category){
createCategoryContainer(category, RED._("palette.label."+category,{defaultValue:category}));
});
} else {
core.forEach(function(category){
createCategoryContainer(category, RED._("palette.label."+category,{defaultValue:category}));
});
}
2015-07-01 00:42:03 +02:00
2014-11-11 11:15:02 +01:00
$("#palette-search-input").focus(function(e) {
RED.keyboard.disable();
});
$("#palette-search-input").blur(function(e) {
RED.keyboard.enable();
});
2015-07-01 00:42:03 +02:00
2014-11-11 11:15:02 +01:00
$("#palette-search-clear").on("click",function(e) {
e.preventDefault();
$("#palette-search-input").val("");
filterChange();
$("#palette-search-input").focus();
});
2015-07-01 00:42:03 +02:00
2014-01-19 01:01:27 +01:00
$("#palette-search-input").val("");
2014-11-11 11:15:02 +01:00
$("#palette-search-input").on("keyup",function() {
filterChange();
});
2015-07-01 00:42:03 +02:00
2014-11-11 11:15:02 +01:00
$("#palette-search-input").on("focus",function() {
$("body").one("mousedown",function() {
$("#palette-search-input").blur();
});
2014-01-19 01:01:27 +01:00
});
2015-07-14 16:59:56 +02:00
$("#palette-collapse-all").on("click", function(e) {
e.preventDefault();
for (var cat in categoryContainers) {
if (categoryContainers.hasOwnProperty(cat)) {
categoryContainers[cat].close();
}
}
});
$("#palette-expand-all").on("click", function(e) {
e.preventDefault();
for (var cat in categoryContainers) {
if (categoryContainers.hasOwnProperty(cat)) {
categoryContainers[cat].open();
}
}
});
2014-11-11 11:15:02 +01:00
}
2013-09-05 16:02:48 +02:00
return {
2014-11-11 11:15:02 +01:00
init: init,
add:addNodeType,
remove:removeNodeType,
hide:hideNodeType,
2014-02-25 00:35:11 +01:00
show:showNodeType,
refresh:refreshNodeTypes
2013-09-05 16:02:48 +02:00
};
2014-08-08 01:01:35 +02:00
})();