r1898 + implement tag tree editor
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 25 Apr 2008 12:57:04 +0000 (12:57 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 25 Apr 2008 12:57:04 +0000 (12:57 +0000)
+ discard obsolete wipeTags()
+ fix renderTagRowForViewer() call
+ toss icons

inc/database.php
inc/functions.php
inc/interface.php
inc/navigation.php
inc/ophandlers.php

index caba12f..42449b4 100644 (file)
@@ -2587,14 +2587,17 @@ function commitDestroyTag ($tagid = 0)
                return 'useDeleteBlade() failed in ' . __FUNCTION__;
 }
 
-function wipeTags ($realm, $id)
+function commitUpdateTag ($tag_id, $tag_name, $parent_id)
 {
+       if ($parent_id == 0)
+               $parent_id = 'NULL';
        global $dbxlink;
-       $query = "delete from TagStorage where target_realm = '${realm}' and target_id = ${id}";
+       $query = "update TagTree set tag = '${tag_name}', parent_id = ${parent_id} " .
+               "where id = ${tag_id} limit 1";
        $result = $dbxlink->exec ($query);
        if ($result === NULL)
-               return FALSE;
-       return TRUE;
+               return 'SQL query failed in ' . __FUNCTION__;
+       return '';
 }
 
 function deleteTagsForEntity ($entity_realm, $entity_id)
index c7d5fab..a2a3650 100644 (file)
@@ -1380,6 +1380,36 @@ function getTagTree ()
        return $ret;
 }
 
+// Build a tree from the tag list and return everything _except_ the tree.
+function getOrphanedTags ()
+{
+       global $taglist;
+       $mytaglist = $taglist;
+       $dummy = array();
+       while (count ($mytaglist) > 0)
+       {
+               $picked = FALSE;
+               foreach ($mytaglist as $tagid => $taginfo)
+               {
+                       $taginfo['kids'] = array();
+                       if ($taginfo['parent_id'] == NULL)
+                       {
+                               $dummy[$tagid] = $taginfo;
+                               $picked = TRUE;
+                               unset ($mytaglist[$tagid]);
+                       }
+                       elseif (attachChildTag ($dummy, $taginfo['parent_id'], $tagid, $taginfo))
+                       {
+                               $picked = TRUE;
+                               unset ($mytaglist[$tagid]);
+                       }
+               }
+               if (!$picked) // Only orphaned items on the list.
+                       return $mytaglist;
+       }
+       return array();
+}
+
 function serializeTags ($trail)
 {
        $comma = '';
index afd62df..bb282ce 100644 (file)
@@ -3384,7 +3384,7 @@ function printImageHREF ($tag, $title = '', $do_input = FALSE, $tabindex = 0)
        $image['delete']['path'] = 'pix/tango-list-remove.png';
        $image['delete']['width'] = 16;
        $image['delete']['height'] = 16;
-       $image['nodelete']['path'] = 'pix/delete_g.png';
+       $image['nodelete']['path'] = 'pix/tango-list-remove-shadow.png';
        $image['nodelete']['width'] = 16;
        $image['nodelete']['height'] = 16;
        $image['grant'] = $image['add'];
@@ -3410,6 +3410,9 @@ function printImageHREF ($tag, $title = '', $do_input = FALSE, $tabindex = 0)
        $image['clear']['path'] = 'pix/tango-edit-clear.png';
        $image['clear']['width'] = 16;
        $image['clear']['height'] = 16;
+       $image['save']['path'] = 'pix/tango-document-save.png';
+       $image['save']['width'] = 16;
+       $image['save']['height'] = 16;
        if (!isset ($image[$tag]))
                $tag = 'error';
        $img = $image[$tag];
@@ -4917,17 +4920,15 @@ function renderAutoPortsForm ($object_id = 0)
        echo "</table>";
 }
 
-function renderTagRowForViewer ($taginfo, $realm, $level = 0)
+function renderTagRowForViewer ($taginfo, $level = 0)
 {
        echo '<tr><td align=left>';
        for ($i = 0; $i < $level; $i++)
                printImageHREF ('spacer');
        echo $taginfo['tag'];
-       if ($realm != '' && isset ($taginfo['refcnt'][$realm]))
-               echo ' (' . $taginfo['refcnt'][$realm] . ')';
        echo "</td></tr>\n";
        foreach ($taginfo['kids'] as $kid)
-               renderTagRowForViewer ($kid, $realm, $level + 1);
+               renderTagRowForViewer ($kid, $level + 1);
 }
 
 function renderTagRowForCloud ($taginfo, $realm, $level = 0)
@@ -4947,15 +4948,32 @@ function renderTagRowForCloud ($taginfo, $realm, $level = 0)
 
 function renderTagRowForEditor ($taginfo, $level = 0)
 {
-       global $root, $pageno, $tabno;
+       global $root, $pageno, $tabno, $taglist;
        echo '<tr><td>';
-       // FIXME: check [supplied] refcnt for each tag
-       echo "<a href='${root}process.php?page=${pageno}&tab=${tabno}&op=destroyTag&id=${taginfo['id']}'>";
-       printImageHREF ('delete', 'Destroy tag');
-       echo "</a></td>\n<td>";
-       for ($i = 0; $i < $level; $i++)
-               printImageHREF ('spacer');
-       echo $taginfo['tag'] . "</td><td>&nbsp;</td></tr>\n";
+       $nrefs = 0;
+       foreach ($taginfo['refcnt'] as $part)
+               $nrefs += $part;
+       if ($nrefs > 0 or count ($taginfo['kids']) > 0)
+               printImageHREF ('nodelete', "${nrefs} references, " . count ($taginfo['kids']) . ' sub-tags');
+       else
+       {
+               echo "<a href='${root}process.php?page=${pageno}&tab=${tabno}&op=destroyTag&tag_id=${taginfo['id']}'>";
+               printImageHREF ('delete', 'Delete tag');
+               echo "</a>";
+       }
+       echo "</td>\n<td>";
+       echo "<form method=post action='${root}process.php?page=${pageno}&tab=${tabno}&op=updateTag'>";
+       echo "<input type=hidden name=tag_id value=${taginfo['id']}><input type=text name=tag_name ";
+       echo "value='${taginfo['tag']}'></td><td><select name=parent_id>";
+       echo "<option value=0>-- NONE --</option>\n";
+       foreach ($taglist as $tlinfo)
+       {
+               echo "<option value=${tlinfo['id']}" . ($tlinfo['id'] == $taginfo['parent_id'] ? ' selected' : '');
+               echo ">${tlinfo['tag']}</option>";
+       }
+       echo "</select></td><td>";
+       printImageHREF ('save', 'Save changes', TRUE);
+       echo "</form></td></tr>\n";
        foreach ($taginfo['kids'] as $kid)
                renderTagRowForEditor ($kid, $level + 1);
 }
@@ -4963,14 +4981,14 @@ function renderTagRowForEditor ($taginfo, $level = 0)
 function renderTagTree ()
 {
        global $tagtree;
-       echo '<table>';
+       echo '<center><table>';
        foreach ($tagtree as $taginfo)
        {
                echo '<tr>';
-               renderTagRowForViewer ($taginfo, $realm);
+               renderTagRowForViewer ($taginfo);
                echo "</tr>\n";
        }
-       echo '</table>';
+       echo '</table></center>';
 }
 
 function renderTagCloud ($realm = '')
@@ -4990,8 +5008,10 @@ function renderTagTreeEditor ()
 {
        global $root, $pageno, $tabno, $taglist, $tagtree;
        showMessageOrError();
+       echo "<table class=objview border=0 width='100%'><tr><td class=pcleft>";
+       startPortlet ('tag tree');
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
-       echo "<tr><th>&nbsp;</th><th>tag</th><th>&nbsp;</th></tr>\n";
+       echo "<tr><th>&nbsp;</th><th>tag</th><th>parent</th><th>&nbsp;</th></tr>\n";
        foreach ($tagtree as $taginfo)
        {
                renderTagRowForEditor ($taginfo, TRUE);
@@ -5002,13 +5022,40 @@ function renderTagTreeEditor ()
        echo "<input type=hidden name=op value='createTag'>";
        echo "<tr><td>";
        printImageHREF ('grant', 'Create tag', TRUE);
-       echo '</td><td><input type=text name=tagname> under <select name=parent_id>';
+       echo '</td><td><input type=text name=tag_name></td><td><select name=parent_id>';
        echo "<option value=0>-- NONE --</option>\n";
        foreach ($taglist as $taginfo)
                echo "<option value=${taginfo['id']}>${taginfo['tag']}</option>";
        echo "</select></td><td>&nbsp;</td></tr>";
        echo "</form>\n";
        echo '</table>';
+       finishPortlet();
+
+       echo "</td><td><td class=pcright>";
+
+       startPortlet ('fallen leaves');
+       echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
+       echo "<tr><th>tag</th><th>parent</th><th>&nbsp;</th></tr>\n";
+       foreach (getOrphanedTags() as $taginfo)
+       {
+               echo '<tr><td>';
+               echo "<form method=post action='${root}process.php?page=${pageno}&tab=${tabno}&op=updateTag'>";
+               echo "<input type=hidden name=tag_id value=${taginfo['id']}>";
+               echo "<input type=hidden name=tag_name value=${taginfo['tag']}>";
+               echo "${taginfo['tag']}</td><td><select name=parent_id>";
+               echo "<option value=0>-- NONE --</option>\n";
+               foreach ($taglist as $tlinfo)
+               {
+                       echo "<option value=${tlinfo['id']}" . ($tlinfo['id'] == $taglist[$taginfo['id']]['parent_id'] ? ' selected' : '');
+                       echo ">${tlinfo['tag']}</option>";
+               }
+               echo "</select></td><td>";
+               printImageHREF ('save', 'Save changes', TRUE);
+               echo "</form></td></tr>\n";
+       }
+       echo '</table>';
+       finishPortlet();
+       echo "</td></tr></table>";
 }
 
 // Output a sequence of OPTION elements, selecting those, which are present on the
index 2828758..09e1152 100644 (file)
@@ -327,7 +327,7 @@ $ophandler['ui']['reset']['go'] = 'resetUIConfig';
 $page['tagtree']['title'] = 'Tag tree';
 $page['tagtree']['parent'] = 'config';
 $tab['tagtree']['default'] = 'View';
-$tab['tagtree']['edit'] = 'Change';
+$tab['tagtree']['edit'] = 'Edit';
 $tabhandler['tagtree']['default'] = 'renderTagTree';
 $tabhandler['tagtree']['edit'] = 'renderTagTreeEditor';
 $ophandler['tagtree']['edit']['destroyTag'] = 'destroyTag';
index c7265d3..61357ba 100644 (file)
@@ -1326,7 +1326,7 @@ function saveEntityTags ($realm, $bypass)
        $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
        // Build a trail from the submitted data, minimize it,
        // then wipe existing records and store the new set instead.
-       wipeTags ($realm, $entity_id);
+       deleteTagsForEntity ($realm, $entity_id);
        $newtrail = getExplicitTagsOnly (buildTrailFromIds ($taglist));
        $n_succeeds = $n_errors = 0;
        foreach ($newtrail as $taginfo)
@@ -1370,8 +1370,8 @@ function saveIPv4RSPoolTags ()
 function destroyTag ()
 {
        global $root, $pageno, $tabno;
-       assertUIntArg ('id', __FUNCTION__);
-       if (($ret = commitDestroyTag ($_REQUEST['id'])) == '')
+       assertUIntArg ('tag_id', __FUNCTION__);
+       if (($ret = commitDestroyTag ($_REQUEST['tag_id'])) == '')
                return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Successfully deleted tag.");
        else
                return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ("Error deleting tag: '${ret}'");
@@ -1380,9 +1380,9 @@ function destroyTag ()
 function createTag ()
 {
        global $root, $pageno, $tabno;
-       assertStringArg ('tagname', __FUNCTION__);
+       assertStringArg ('tag_name', __FUNCTION__);
        assertUIntArg ('parent_id', __FUNCTION__, TRUE);
-       $tagname = trim ($_REQUEST['tagname']);
+       $tagname = trim ($_REQUEST['tag_name']);
        if (($parent_id = $_REQUEST['parent_id']) <= 0)
                $parent_id = 'NULL';
        if (($ret = commitCreateTag ($tagname, $parent_id)) == '')
@@ -1391,4 +1391,19 @@ function createTag ()
                return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ("Could not create tag '${tagname}' because of error '${ret}'");
 }
 
+function updateTag ()
+{
+       global $root, $pageno, $tabno;
+       assertUIntArg ('tag_id', __FUNCTION__);
+       assertUIntArg ('parent_id', __FUNCTION__, TRUE);
+       assertStringArg ('tag_name', __FUNCTION__);
+       $tagname = trim ($_REQUEST['tag_name']);
+       if (($parent_id = $_REQUEST['parent_id']) <= 0)
+               $parent_id = 'NULL';
+       if (($ret = commitUpdateTag ($_REQUEST['tag_id'], $tagname, $parent_id)) == '')
+               return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Updated tag '${tagname}'.");
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ("Could not update tag '${tagname}' because of error '${ret}'");
+}
+
 ?>