r2207 - tree collapse/expand ops seem to work
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 12 Sep 2008 18:17:28 +0000 (18:17 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 12 Sep 2008 18:17:28 +0000 (18:17 +0000)
inc/functions.php
inc/interface.php
render_image.php

index 5092891..8305106 100644 (file)
@@ -1459,6 +1459,7 @@ function iptree_construct ($node)
                {
                        $node['ip'] = long2ip ($node['ip_bin']);
                        $node['kids'] = array();
+                       $node['kidc'] = 0;
                        $node['name'] = '';
                }
                return array ($node);
@@ -1548,4 +1549,39 @@ function loadOwnIPv4Addresses (&$node)
        $node['addrc'] = count ($node['addrlist']);
 }
 
+function prepareIPv4Tree ($netlist, $expanded_id = 0)
+{
+       $tree = treeFromList ($netlist); // medium call
+       sortTree ($tree, 'IPv4NetworkCmp');
+       treeApplyFunc ($tree, 'iptree_fill');
+       // complement the tree before markup to make the spare networks have "symbol" set
+       iptree_markup_collapsion ($tree, 2, $expanded_id); //getConfigVar ('TREE_THRESHOLD')
+       treeApplyFunc ($tree, 'countOwnIPv4Addresses'); // long call
+       return $tree;
+}
+
+// Check all items of the tree recursively, until the requested target id is
+// found. Mark all items leading to this item as "expanded", collapsing all
+// the rest, which exceed the given threshold (if the threshold is given).
+function iptree_markup_collapsion (&$tree, $threshold = 1024, $target = 0)
+{
+       $self = __FUNCTION__;
+       $ret = FALSE;
+       foreach (array_keys ($tree) as $key)
+       {
+               $here = ($target and $tree[$key]['id'] == $target);
+               $below = $self ($tree[$key]['kids'], $threshold, $target);
+               if (!$tree[$key]['kidc']) // terminal node
+                       $tree[$key]['symbol'] = 'spacer';
+               elseif ($tree[$key]['kidc'] < $threshold)
+                       $tree[$key]['symbol'] = 'node-expanded-static';
+               elseif ($here or $below)
+                       $tree[$key]['symbol'] = 'node-expanded';
+               else
+                       $tree[$key]['symbol'] = 'node-collapsed';
+               $ret = ($ret or $here or $below); // parentheses are necessary for this to be computed correctly
+       }
+       return $ret;
+}
+
 ?>
index c8b07e1..03c4fc2 100644 (file)
@@ -129,6 +129,9 @@ $image['node-collapsed']['height'] = 16;
 $image['node-expanded']['path'] = 'pix/node-expanded.png';
 $image['node-expanded']['width'] = 16;
 $image['node-expanded']['height'] = 16;
+$image['node-expanded-static']['path'] = 'pix/node-expanded-static.png';
+$image['node-expanded-static']['width'] = 16;
+$image['node-expanded-static']['height'] = 16;
 
 // This may be populated later onsite, report rendering function will use it.
 // See the $systemreport for structure.
@@ -1993,70 +1996,66 @@ function renderRackspaceHistory ()
        echo '</td></tr></table>';
 }
 
-function renderIPv4SpaceRecords ($tree, $todo, $level = 1, &$tagcache = array())
+function renderIPv4SpaceRecords ($tree, &$tagcache, $baseurl, $level = 1)
 {
        $self = __FUNCTION__;
-       $doing = 1;
-       $expanded_id = 0;
        foreach ($tree as $item)
        {
                $total = $item['addrt'];
-               if (!$item['kidc'])
-                       $symbol = 'spacer';
-               elseif (getConfigVar ('TREE_THRESHOLD') > 0 and $item['kidc'] >= getConfigVar ('TREE_THRESHOLD') and $item['id'] != $expanded_id)
-                       $symbol = 'node-collapsed';
-               else
-                       $symbol = 'node-expanded';
                if (isset ($item['id']))
                {
                        loadIPv4AddrList ($item);
                        $used = $item['addrc'];
+                       if ($item['symbol'] == 'node-collapsed')
+                               $expandurl = "${baseurl}&eid=" . $item['id'];
+                       elseif ($item['symbol'] == 'node-expanded')
+                               $expandurl = "${baseurl}&eid=" . $item['parent_id'];
+                       else
+                               $expandurl = '';
                        echo "<tr valign=top>";
-                       printIPv4NetInfoTDs ($item, 'tdleft', $level, $symbol);
+                       printIPv4NetInfoTDs ($item, 'tdleft', $level, $item['symbol'], $expandurl);
                        echo "<td class=tdcenter>";
                        renderProgressBar ($total ? $used/$total : 0);
                        echo "<br><small>${used}/${total}</small></td>";
                        if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
                                printRoutersTD (findRouters ($item['addrlist']), $tagcache);
                        echo "</tr>";
-                       if ($symbol == 'node-expanded')
-                               $self ($item['kids'], $item['kidc'], $level + 1, $tagcache);
+                       if ($item['symbol'] == 'node-expanded' or $item['symbol'] == 'node-expanded-static')
+                               $self ($item['kids'], $tagcache, $baseurl, $level + 1);
                }
                else
                {
                        $used = 0;
                        echo "<tr valign=top>";
-                       printIPv4NetInfoTDs ($item, 'tdleft sparenetwork', $level, $symbol);
+                       printIPv4NetInfoTDs ($item, 'tdleft sparenetwork', $level, $item['symbol']);
                        echo "<td class=tdcenter>";
-                       renderProgressBar ($used/$total);
+                       renderProgressBar ($used/$total, 'sparenetwork');
                        echo "<br><small>${used}/${total}</small></td>";
                        echo "<td>&nbsp;</td></tr>";
                }
-               $doing++;
        }
 }
 
 function renderIPv4Space ()
 {
+       global $root, $pageno, $tabno;
        $tagfilter = getTagFilter();
        $netlist = getIPv4NetworkList ($tagfilter, getTFMode());
        $netcount = count ($netlist);
-       $tree = treeFromList ($netlist, getConfigVar ('TREE_THRESHOLD'));
+       $tree = prepareIPv4Tree ($netlist, isset ($_REQUEST['eid']) ? $_REQUEST['eid'] : 0);
        unset ($netlist);
-       sortTree ($tree, 'IPv4NetworkCmp');
-       treeApplyFunc ($tree, 'iptree_fill');
-       treeApplyFunc ($tree, 'countOwnIPv4Addresses');
 
        echo "<table border=0 class=objectview>\n";
        echo "<tr><td class=pcleft>";
-       // FIXME: the counter is wrong
        startPortlet ("networks (${netcount})");
        echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
        echo "<tr><th>prefix</th><th>name/tags</th><th>%% used</th>";
        if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
                echo "<th>routed by</th>";
        echo "</tr>\n";
-       renderIPv4SpaceRecords ($tree, count ($tree));
+       $tagcache = array();
+       $baseurl = "${root}?page=${pageno}&tab=${tabno}&tagfilter[]=" . getTagFilterStr();
+       renderIPv4SpaceRecords ($tree, $tagcache, $baseurl);
        echo "</table>\n";
        finishPortlet();
        echo '</td><td class=pcright>';
@@ -4027,11 +4026,12 @@ function renderVirtualService ($vsid)
        echo '</tr><table>';
 }
 
-function renderProgressBar ($percentage = 0)
+function renderProgressBar ($percentage = 0, $theme = '')
 {
        global $root;
        $done = ((int) ($percentage * 100));
-       echo "<img width=100 height=10 border=0 title='${done}%' src='${root}render_image.php?img=progressbar&done=${done}'>";
+       echo "<img width=100 height=10 border=0 title='${done}%' src='${root}render_image.php?img=progressbar&done=${done}";
+       echo (empty ($theme) ? '' : "&theme=${theme}") . "'>";
 }
 
 function renderRSPoolServerForm ($pool_id = 0)
@@ -5295,7 +5295,7 @@ function printRoutersTD ($rlist, &$tagcache = array())
 }
 
 // Same as for routers, but produce two TD cells to lay the content out better.
-function printIPv4NetInfoTDs ($netinfo, $tdclass = 'tdleft', $indent = 0, $verge = 'spacer')
+function printIPv4NetInfoTDs ($netinfo, $tdclass = 'tdleft', $indent = 0, $symbol = 'spacer', $symbolurl = '')
 {
        global $root;
        $tags = isset ($netinfo['id']) ? loadIPv4PrefixTags ($netinfo['id']) : array();
@@ -5303,7 +5303,13 @@ function printIPv4NetInfoTDs ($netinfo, $tdclass = 'tdleft', $indent = 0, $verge
        for ($i = 0; $i < $indent - 1; $i++)
                printImageHREF ('spacer');
        if ($indent)
-               printImageHREF ($verge);
+       {
+               if (!empty ($symbolurl))
+                       echo "<a href='${symbolurl}'>";
+               printImageHREF ($symbol, $symbolurl);
+               if (!empty ($symbolurl))
+                       echo '</a>';
+       }
        if (isset ($netinfo['id']))
                echo "<a href='${root}?page=iprange&id=${netinfo['id']}'>";
        echo "${netinfo['ip']}/${netinfo['mask']}";
index 9ee256c..c47deef 100644 (file)
@@ -131,8 +131,17 @@ function generateMiniRack ($rack_id = 0)
 function renderProgressBarImage ($done)
 {
        $img = @imagecreatetruecolor (100, 10);
-       $color['T'] = colorFromHex ($img, getConfigVar ('color_T'));
-       $color['F'] = colorFromHex ($img, getConfigVar ('color_F'));
+       switch (isset ($_REQUEST['theme']) ? $_REQUEST['theme'] : 'rackspace')
+       {
+               case 'sparenetwork':
+                       $color['T'] = colorFromHex ($img, '808080');
+                       $color['F'] = colorFromHex ($img, 'c0c0c0');
+                       break;
+               case 'rackspace': // teal
+               default:
+                       $color['T'] = colorFromHex ($img, getConfigVar ('color_T'));
+                       $color['F'] = colorFromHex ($img, getConfigVar ('color_F'));
+       }
        imagefilledrectangle ($img, 0, 0, $done, 10, $color['T']);
        imagefilledrectangle ($img, $done, 0, 100, 10, $color['F']);
        header("Content-type: image/png");