diff --git a/public/index.html b/public/index.html index 355146ff0..e8cb34ac2 100644 --- a/public/index.html +++ b/public/index.html @@ -250,6 +250,7 @@ + diff --git a/public/red/main.js b/public/red/main.js index aad40c9fc..e77c684df 100644 --- a/public/red/main.js +++ b/public/red/main.js @@ -142,12 +142,9 @@ var RED = (function() { }); function loadSettings() { - $.get('settings', function(data) { - RED.settings = data; - console.log("Node-RED: "+data.version); - loadNodeList(); - }); + RED.settings.init(loadNodeList); } + function loadNodeList() { $.ajax({ headers: { @@ -286,7 +283,7 @@ var RED = (function() { $(function() { RED.menu.init({id:"btn-sidemenu", options: [ - {id:"btn-sidebar",icon:"fa fa-columns",label:"Sidebar",toggle:true,onselect:RED.sidebar.toggleSidebar}, + {id:"btn-sidebar",icon:"fa fa-columns",label:"Sidebar",toggle:true,onselect:RED.sidebar.toggleSidebar, selected: true}, null, {id:"btn-node-status",icon:"fa fa-info",label:"Node Status",toggle:true,onselect:toggleStatus}, null, diff --git a/public/red/settings.js b/public/red/settings.js new file mode 100644 index 000000000..7deee90a5 --- /dev/null +++ b/public/red/settings.js @@ -0,0 +1,85 @@ +/** + * Copyright 2014 Antoine Aflalo + * + * 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.settings = (function () { + var hasLocalStorage = function () { + try { + return 'localStorage' in window && window['localStorage'] !== null; + } catch (e) { + return false; + } + }; + + var set = function (key, value) { + if (!hasLocalStorage()) { + return; + } + localStorage.setItem(key, JSON.stringify(value)); + }; + /** + * If the key is not set in the localStorage it returns undefined + * Else return the JSON parsed value + * @param key + * @returns {*} + */ + var get = function (key) { + if (!hasLocalStorage()) { + return undefined; + } + return JSON.parse(localStorage.getItem(key)); + }; + + var remove = function (key) { + if (!hasLocalStorage()) { + return; + } + localStorage.removeItem(key); + }; + + var setProperties = function(data) { + for(var prop in data) { + if(data.hasOwnProperty(prop)) { + RED.settings[prop] = data[prop]; + } + } + }; + + var init = function (callback) { + $.ajax({ + headers: { + "Accept": "application/json" + }, + dataType: "json", + cache: false, + url: 'settings', + success: function (data) { + setProperties(data); + console.log("Node-RED: " + data.version); + callback(); + } + }); + }; + + + return { + set: set, + get: get, + remove: remove, + init : init + } +}) +(); \ No newline at end of file diff --git a/public/red/ui/menu.js b/public/red/ui/menu.js index ce0ab9199..1821cc6c3 100644 --- a/public/red/ui/menu.js +++ b/public/red/ui/menu.js @@ -13,15 +13,34 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - + RED.menu = (function() { - + var menuItems = {}; - + 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); + } + } + if (opt === null) { item = $('
'); } else { @@ -31,27 +50,28 @@ RED.menu = (function() { (opt.icon?' ':'')+ opt.label+ '').appendTo(item); - + menuItems[opt.id] = opt; - + if (opt.onselect) { link.click(function() { if ($(this).parent().hasClass("disabled")) { return; } if (opt.toggle) { - setSelected(opt.id,!isSelected(opt.id)); + setSelected(opt.id, !isSelected(opt.id)); } else { opt.onselect.call(opt); } - }) + }); + setState(); } else if (opt.href) { link.attr("target","_blank").attr("href",opt.href); } if (opt.options) { item.addClass("dropdown-submenu pull-left"); var submenu = $(' ').appendTo(item); - + for (var i=0;i