/** * 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.menu = (function() { var menuItems = {}; let menuItemCount = 0 function createMenuItem(opt) { var item; if (opt !== null && opt.id) { var themeSetting = RED.settings.theme("menu."+opt.id); if (themeSetting === false) { return null; } } function setInitialState() { var savedStateActive = RED.settings.get("menu-" + opt.id); if (opt.setting) { // May need to migrate pre-0.17 setting if (savedStateActive !== null) { RED.settings.set(opt.setting,savedStateActive); RED.settings.remove("menu-" + opt.id); } else { savedStateActive = RED.settings.get(opt.setting); } } if (savedStateActive) { link.addClass("active"); triggerAction(opt.id,true); } else if (savedStateActive === false) { link.removeClass("active"); triggerAction(opt.id,false); } else if (opt.hasOwnProperty("selected")) { if (opt.selected) { link.addClass("active"); } else { link.removeClass("active"); } triggerAction(opt.id,opt.selected); } } if (opt === null) { item = $('
  • '); } else { item = $('
  • '); if (!opt.id) { opt.id = 'red-ui-menu-item-'+(menuItemCount++) } if (opt.group) { item.addClass("red-ui-menu-group-"+opt.group); } var linkContent = ''; if (opt.toggle) { linkContent += ''; linkContent += ''; } if (opt.icon !== undefined) { if (/\.(png|svg)/.test(opt.icon)) { linkContent += ' '; } else { linkContent += ' '; } } let label = opt.label if (!opt.label && typeof opt.onselect === 'string') { label = RED.actions.getLabel(opt.onselect) } if (opt.sublabel) { linkContent += ''+label+''+ ''+opt.sublabel+'' } else { linkContent += ''+label+'' } linkContent += ''; var link = $(linkContent).appendTo(item); opt.link = link; if (typeof opt.onselect === 'string' || opt.shortcut) { var shortcut = opt.shortcut || RED.keyboard.getShortcut(opt.onselect); if (shortcut && shortcut.key) { opt.shortcutSpan = $(''+RED.keyboard.formatKey(shortcut.key, true)+'').appendTo(link.find(".red-ui-menu-label")); } } menuItems[opt.id] = opt; if (opt.onselect) { link.on("click", function(e) { e.preventDefault(); if ($(this).parent().hasClass("disabled")) { return; } if (opt.toggle) { if (opt.toggle === true) { setSelected(opt.id, !isSelected(opt.id)); } else { setSelected(opt.id, true); } } else { triggerAction(opt.id); } }); if (opt.toggle) { setInitialState(); } } else if (opt.href) { link.attr("target","_blank").attr("href",opt.href); } else if (!opt.options) { item.addClass("disabled"); link.on("click", function(event) { event.preventDefault(); }); } if (opt.options) { item.addClass("red-ui-menu-dropdown-submenu"+(opt.direction!=='right'?" pull-left":"")); var submenu = $('').appendTo(item); var hasIcons = false var hasSubmenus = false for (var i=0;i",{class:"red-ui-menu red-ui-menu-dropdown pull-right"}); if (options.direction) { topMenu.addClass("red-ui-menu-dropdown-direction-"+options.direction) } if (options.id) { topMenu.attr({id:options.id+"-submenu"}); var menuParent = $("#"+options.id); if (menuParent.length === 1) { topMenu.insertAfter(menuParent); menuParent.on("click", function(evt) { evt.stopPropagation(); evt.preventDefault(); if (topMenu.is(":visible")) { $(document).off("click.red-ui-menu"); topMenu.hide(); } else { $(document).on("click.red-ui-menu", function(evt) { $(document).off("click.red-ui-menu"); activeMenu = null; topMenu.hide(); }); $(".red-ui-menu.red-ui-menu-dropdown").hide(); topMenu.show(); } }) } } var lastAddedSeparator = false; var hasSubmenus = false; var hasIcons = false; for (var i=0;i'+RED.keyboard.formatKey(shortcut.key, true)+'').appendTo(opt.link.find(".red-ui-menu-label")); } } } } } return { init: createMenu, setSelected: setSelected, isSelected: isSelected, toggleSelected: toggleSelected, setDisabled: setDisabled, setVisible: setVisible, addItem: addItem, removeItem: removeItem, setAction: setAction, refreshShortcuts: refreshShortcuts } })();