]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
WEBUI JS: add dynamic support to the idnode_tree
authorJaroslav Kysela <perex@perex.cz>
Thu, 4 Sep 2014 06:34:33 +0000 (08:34 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 8 Sep 2014 14:48:59 +0000 (16:48 +0200)
src/webui/static/app/idnode.js

index 75b7c9bdcdc4acbfc0092be3f52ef414f53ff3bf..877f9eca02f93bf4e0eaa31e6650ccb77a201bf1 100644 (file)
@@ -1290,9 +1290,9 @@ tvheadend.idnode_grid = function(panel, conf)
         if (grid === null || !tvheadend.dynamic)
             return;
         if (conf.comet)
-            tvheadend.comet.removeListener(conf.comet, update);
+            tvheadend.comet.un(conf.comet, update);
         if (event)
-            tvheadend.comet.removeListener(event, update);
+            tvheadend.comet.un(event, update);
         dpanel.removeAll(true);
         store.destroy();
         grid = null;
@@ -1566,7 +1566,7 @@ tvheadend.idnode_form_grid = function(panel, conf)
         if (mpanel === null || !tvheadend.dynamic)
             return;
         if (conf.comet)
-            tvheadend.comet.removeListener(conf.comet, update);
+            tvheadend.comet.un(conf.comet, update);
         dpanel.removeAll(true);
         store.destroy();
         mpanel = null;
@@ -1592,61 +1592,20 @@ tvheadend.idnode_form_grid = function(panel, conf)
  */
 tvheadend.idnode_tree = function(panel, conf)
 {
-    var current = null;
+    var tree = null;
     var events = {};
-    var params = conf.params || {};
-    var loader = new Ext.tree.TreeLoader({
-        dataUrl: conf.url,
-        baseParams: params,
-        preloadChildren: conf.preload,
-        nodeParameter: 'uuid'
-    });
 
-    loader.on('load', function(l, n, r) {
-        if (n.uuid && n.event && !(n.event in events)) {
-          events[n.event] = 1;
-          tvheadend.comet.on(n.event, function(o) {
-            if (o.uuid)
-                tree.getRootNode().reload();
-          });
-        }
-    });
-
-    var tree = new Ext.tree.TreePanel({
-        loader: loader,
-        flex: 1,
-        autoScroll: true,
-        border: false,
-        animate: false,
-        root: new Ext.tree.AsyncTreeNode({
-            id: conf.root || 'root',
-            text: conf.title || ''
-        }),
-        listeners: {
-            click: function(n) {
-                if (current) {
-                    panel.remove(current);
-                    current = null;
-                }
-                if (!n.isRoot)
-                    current = panel.add(new tvheadend.idnode_editor(n.attributes, {
-                        title: 'Parameters',
-                        fixedHeight: true,
-                        help: conf.help || null
-                    }));
-                panel.doLayout();
-            }
-        }
-    });
+    function update(o) {
+        if (tree && o.reload)
+            tree.getRootNode().reload();
+    }
 
-    if (conf.comet) {
-        tvheadend.comet.on(conf.comet, function(o) {
-            if (o.reload)
-                tree.getRootNode().reload();
-        });
+    function updatenode(o) {
+        if (o.uuid)
+            tree.getRootNode().reload();
     }
 
-    tvheadend.comet.on('title', function(o) {
+    function updatetitle(o) {
         var n = tree.getNodeById(o.uuid);
         if (n) {
             if (o.text)
@@ -1654,24 +1613,114 @@ tvheadend.idnode_tree = function(panel, conf)
             tree.getRootNode().reload();
             // cannot get this to properly reload children and maintain state
         }
-    });
+    }
 
-    var mpanel = new Ext.Panel({
-        title: conf.title || '',
-        layout: 'hbox',
-        flex: 1,
-        padding: 5,
-        border: false,
-        layoutConfig: {
-            align: 'stretch'
-        },
-        items: [tree]
-    });
+    function builder() {
+        if (tree)
+            return;
+        if (conf.builder)
+            conf.builder(conf);
 
-    tvheadend.paneladd(panel, mpanel, conf.tabIndex);
+        var current = null;
+        var first = true;
+        var params = conf.params || {};
+        var loader = new Ext.tree.TreeLoader({
+            dataUrl: conf.url,
+            baseParams: params,
+            preloadChildren: conf.preload,
+            nodeParameter: 'uuid'
+        });
+
+        loader.on('load', function(l, n, r) {
+            var event = n.attributes.event;
+            if (n.attributes.uuid && event && !(event in events)) {
+                events[event] = 1;
+                tvheadend.comet.on(event, updatenode);
+            }
+            if (first) { /* hack */
+                dpanel.doLayout();
+                first = false;
+            }
+        });
 
-    tree.on('beforerender', function() {
-        // To be honest this isn't quite right, but it'll do
-        tree.expandAll();
+        tree = new Ext.tree.TreePanel({
+            loader: loader,
+            width: 550,
+            flex: 1,
+            autoScroll: true,
+            border: false,
+            animate: false,
+            root: new Ext.tree.AsyncTreeNode({
+                id: conf.root || 'root',
+                text: conf.title || ''
+            }),
+            listeners: {
+                click: function(n) {
+                    if (current) {
+                        mpanel.remove(current);
+                        current = null;
+                    }
+                    if (!n.isRoot)
+                        current = mpanel.add(new tvheadend.idnode_editor(n.attributes, {
+                            title: 'Parameters',
+                            width: 550,
+                            noautoWidth: true,
+                            fixedHeight: true,
+                            help: conf.help || null
+                        }));
+                    mpanel.doLayout();
+                }
+            }
+        });
+
+        var mpanel = new Ext.Panel({
+            layout: 'hbox',
+            flex: 1,
+            padding: 5,
+            border: false,
+            layoutConfig: {
+                align: 'stretch'
+            },
+            items: [tree]
+        });
+
+        tree.on('beforerender', function() {
+            // To be honest this isn't quite right, but it'll do
+            tree.expandAll();
+        });
+
+        dpanel.add(mpanel);
+        dpanel.doLayout(false, true);
+
+        if (conf.comet)
+            tvheadend.comet.on(conf.comet, update);
+
+        tvheadend.comet.on('title', updatetitle);
+    }
+
+    function destroyer() {
+        if (tree === null || !tvheadend.dynamic)
+            return;
+        for (var event in events)
+            tvheadend.comet.un(event, updatenode);
+        delete events;
+        events = {};
+        tvheadend.comet.un('title', updatetitle);
+        if (conf.comet)
+            tvheadend.comet.un(conf.comet, update);
+        dpanel.removeAll(true);
+        tree = null;
+        if (conf.destroyer)
+            conf.destroyer(conf);
+    }
+
+    var dpanel = new Ext.Panel({
+        border: false,
+        header: false,
+        layout: 'fit',
+        title: conf.title || '',
     });
+
+    tvheadend.paneladd(panel, dpanel, conf.tabIndex);
+    tvheadend.panelreg(panel, dpanel, builder, destroyer);
 };