1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00
node-red/editor/js/ui/menu.js

225 lines
7.1 KiB
JavaScript
Raw Normal View History

2014-08-20 22:58:54 +02:00
/**
* Copyright 2014 IBM Corp.
*
* 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-20 22:58:54 +02:00
RED.menu = (function() {
2014-08-20 22:58:54 +02:00
var menuItems = {};
2014-08-20 22:58:54 +02:00
function createMenuItem(opt) {
var item;
function setState() {
var savedStateActive = isSavedStateActive(opt.id);
if (savedStateActive) {
link.addClass("active");
opt.onselect.call(opt, true);
} else if (savedStateActive === false) {
link.removeClass("active");
opt.onselect.call(opt, false);
} else if (opt.hasOwnProperty("selected")) {
if (opt.selected) {
link.addClass("active");
} else {
link.removeClass("active");
}
opt.onselect.call(opt, opt.selected);
}
}
2014-08-20 22:58:54 +02:00
if (opt === null) {
item = $('<li class="divider"></li>');
} else {
item = $('<li></li>');
2015-01-14 23:40:45 +01:00
2015-01-15 22:41:40 +01:00
var linkContent = '<a '+(opt.id?'id="'+opt.id+'" ':'')+'tabindex="-1" href="#">';
if (opt.toggle) {
linkContent += '<i class="fa fa-square pull-left"></i>';
linkContent += '<i class="fa fa-check-square pull-left"></i>';
}
2015-01-14 23:40:45 +01:00
if (opt.icon !== undefined) {
if (/\.png/.test(opt.icon)) {
linkContent += '<img src="'+opt.icon+'"/> ';
} else {
linkContent += '<i class="'+(opt.icon?opt.icon:'" style="display: inline-block;"')+'"></i> ';
}
}
if (opt.sublabel) {
linkContent += '<span class="menu-label-container"><span class="menu-label">'+opt.label+'</span>'+
'<span class="menu-sublabel">'+opt.sublabel+'</span></span>'
} else {
linkContent += '<span class="menu-label">'+opt.label+'</span>'
}
linkContent += '</a>';
var link = $(linkContent).appendTo(item);
2014-08-20 22:58:54 +02:00
menuItems[opt.id] = opt;
2014-08-20 22:58:54 +02:00
if (opt.onselect) {
link.click(function() {
2014-02-25 00:35:11 +01:00
if ($(this).parent().hasClass("disabled")) {
return;
}
if (opt.toggle) {
2015-01-14 23:40:45 +01:00
var selected = isSelected(opt.id);
if (typeof opt.toggle === "string") {
if (!selected) {
for (var m in menuItems) {
if (menuItems.hasOwnProperty(m)) {
var mi = menuItems[m];
if (mi.id != opt.id && opt.toggle == mi.toggle) {
setSelected(mi.id,false);
}
}
}
setSelected(opt.id,true);
}
} else {
setSelected(opt.id, !selected);
}
2014-02-25 00:35:11 +01:00
} else {
opt.onselect.call(opt);
}
});
setState();
2014-08-20 22:58:54 +02:00
} else if (opt.href) {
link.attr("target","_blank").attr("href",opt.href);
} else if (!opt.options) {
item.addClass("disabled");
link.click(function(event) {
event.preventDefault();
});
2014-08-20 22:58:54 +02:00
}
if (opt.options) {
item.addClass("dropdown-submenu pull-left");
var submenu = $('<ul id="'+opt.id+'-submenu" class="dropdown-menu"></ul>').appendTo(item);
2014-08-20 22:58:54 +02:00
for (var i=0;i<opt.options.length;i++) {
createMenuItem(opt.options[i]).appendTo(submenu);
}
}
if (opt.disabled) {
item.addClass("disabled");
}
if (opt.tip) {
item.popover({
placement:"left",
trigger: "hover",
delay: { show: 350, hide: 20 },
html: true,
container:'body',
content: opt.tip
});
}
2014-08-20 22:58:54 +02:00
}
2014-08-20 22:58:54 +02:00
return item;
2014-08-20 22:58:54 +02:00
}
function createMenu(options) {
2014-08-20 22:58:54 +02:00
var button = $("#"+options.id);
2014-11-12 14:21:39 +01:00
2014-12-10 15:16:07 +01:00
//button.click(function(event) {
// $("#"+options.id+"-submenu").show();
// event.preventDefault();
//});
var topMenu = $("<ul/>",{id:options.id+"-submenu", class:"dropdown-menu pull-right"}).insertAfter(button);
2014-08-20 22:58:54 +02:00
for (var i=0;i<options.options.length;i++) {
var opt = options.options[i];
createMenuItem(opt).appendTo(topMenu);
}
}
function isSavedStateActive(id) {
return RED.settings.get("menu-" + id);
}
2014-08-20 22:58:54 +02:00
function isSelected(id) {
return $("#" + id).hasClass("active");
2014-08-20 22:58:54 +02:00
}
function setSavedState(id, state) {
RED.settings.set("menu-" + id, state);
}
2014-08-20 22:58:54 +02:00
function setSelected(id,state) {
if (isSelected(id) == state) {
return;
}
var opt = menuItems[id];
if (state) {
$("#"+id).addClass("active");
} else {
$("#"+id).removeClass("active");
}
if (opt.onselect) {
opt.onselect.call(opt,state);
}
setSavedState(id, state);
2014-08-20 22:58:54 +02:00
}
2014-08-20 22:58:54 +02:00
function setDisabled(id,state) {
if (state) {
$("#"+id).parent().addClass("disabled");
} else {
$("#"+id).parent().removeClass("disabled");
}
}
2014-08-20 22:58:54 +02:00
function addItem(id,opt) {
createMenuItem(opt).appendTo("#"+id+"-submenu");
}
function removeItem(id) {
$("#"+id).parent().remove();
}
2014-02-25 00:35:11 +01:00
function setAction(id,action) {
menuItems[id].onselect = action;
$("#"+id).click(function() {
if ($(this).parent().hasClass("disabled")) {
return;
}
if (menuItems[id].toggle) {
setSelected(id,!isSelected(id));
} else {
menuItems[id].onselect.call(menuItems[id]);
}
});
}
2014-08-20 22:58:54 +02:00
return {
init: createMenu,
setSelected: setSelected,
isSelected: isSelected,
setDisabled: setDisabled,
addItem: addItem,
2014-02-25 00:35:11 +01:00
removeItem: removeItem,
setAction: setAction
2014-08-20 22:58:54 +02:00
//TODO: add an api for replacing a submenu - see library.js:loadFlowLibrary
}
})();