luci2: add AbstractWidget.appendTo() to support appending widgets to a container
[project/luci2/ui.git] / luci2 / htdocs / luci2 / luci2.js
index ffa58ea..291af57 100644 (file)
@@ -1013,6 +1013,21 @@ function LuCI2()
                        method: 'nslookup',
                        params: [ 'data' ],
                        expect: { '': { code: -1 } }
+               }),
+
+
+               setUp: _luci2.rpc.declare({
+                       object: 'luci2.network',
+                       method: 'ifup',
+                       params: [ 'data' ],
+                       expect: { '': { code: -1 } }
+               }),
+
+               setDown: _luci2.rpc.declare({
+                       object: 'luci2.network',
+                       method: 'ifdown',
+                       params: [ 'data' ],
+                       expect: { '': { code: -1 } }
                })
        };
 
@@ -1173,6 +1188,57 @@ function LuCI2()
                }
        };
 
+       this.firewall = {
+               getZoneColor: function(zone)
+               {
+                       if ($.isPlainObject(zone))
+                               zone = zone.name;
+
+                       if (zone == 'lan')
+                               return '#90f090';
+                       else if (zone == 'wan')
+                               return '#f09090';
+
+                       for (var i = 0, hash = 0;
+                                i < zone.length;
+                                hash = zone.charCodeAt(i++) + ((hash << 5) - hash));
+
+                       for (var i = 0, color = '#';
+                                i < 3;
+                                color += ('00' + ((hash >> i++ * 8) & 0xFF).tozoneing(16)).slice(-2));
+
+                       return color;
+               },
+
+               findZoneByNetwork: function(network)
+               {
+                       var self = this;
+                       var zone = undefined;
+
+                       return _luci2.uci.foreach('firewall', 'zone', function(z) {
+                               if (!z.name || !z.network)
+                                       return;
+
+                               if (!$.isArray(z.network))
+                                       z.network = z.network.split(/\s+/);
+
+                               for (var i = 0; i < z.network.length; i++)
+                               {
+                                       if (z.network[i] == network)
+                                       {
+                                               zone = z;
+                                               break;
+                                       }
+                               }
+                       }).then(function() {
+                               if (zone)
+                                       zone.color = self.getZoneColor(zone);
+
+                               return zone;
+                       });
+               }
+       };
+
        this.system = {
                getSystemInfo: _luci2.rpc.declare({
                        object: 'system',
@@ -2100,9 +2166,14 @@ function LuCI2()
                                .append(_luci2.globals.mainMenu.render(2, 900));
                },
 
-               renderView: function(node)
+               renderView: function()
                {
+                       var node = arguments[0];
                        var name = node.view.split(/\//).join('.');
+                       var args = [ ];
+
+                       for (var i = 1; i < arguments.length; i++)
+                               args.push(arguments[i]);
 
                        if (_luci2.globals.currentView)
                                _luci2.globals.currentView.finish();
@@ -2117,7 +2188,7 @@ function LuCI2()
                        if (_luci2._views[name] instanceof _luci2.ui.view)
                        {
                                _luci2.globals.currentView = _luci2._views[name];
-                               return _luci2._views[name].render();
+                               return _luci2._views[name].render.apply(_luci2._views[name], args);
                        }
 
                        var url = _luci2.globals.resource + '/view/' + name + '.js';
@@ -2143,7 +2214,7 @@ function LuCI2()
                                        });
 
                                        _luci2.globals.currentView = _luci2._views[name];
-                                       return _luci2._views[name].render();
+                                       return _luci2._views[name].render.apply(_luci2._views[name], args);
                                }
                                catch(e) {
                                        alert('Unable to instantiate view "%s": %s'.format(url, e));
@@ -2268,6 +2339,10 @@ function LuCI2()
 
                insertInto: function(id) {
                        return $(id).empty().append(this.render());
+               },
+
+               appendTo: function(id) {
+                       return $(id).append(this.render());
                }
        });
 
@@ -2320,8 +2395,13 @@ function LuCI2()
                                container.append($('<div />').addClass('cbi-map-descr').append(this.description));
 
                        var self = this;
+                       var args = [ ];
+
+                       for (var i = 0; i < arguments.length; i++)
+                               args.push(arguments[i]);
+
                        return this._fetch_template().then(function() {
-                               return _luci2.deferrable(self.execute());
+                               return _luci2.deferrable(self.execute.apply(self, args));
                        });
                },