generalize parent node options AJAX
authorDenis Ovsienko <denis@ovsienko.info>
Tue, 19 Jan 2016 13:35:38 +0000 (13:35 +0000)
committerDenis Ovsienko <denis@ovsienko.info>
Tue, 19 Jan 2016 13:35:38 +0000 (13:35 +0000)
* navigation: replace "get-tag-select" with "get-parent-node-options"
* renderTagRowForEditor(): rename AJAX request parameters
* renderTagTreeEditor(): idem
* getTagSelectAJAX(): replace with the two new generic functions below
* getParentNodeOptions(): new function to produce the list of options
* getParentNodeOptionsAJAX(): new function to interface with AJAX
  clients (with the existing "node_type=tag" case now using a security
  context)

wwwroot/inc/ajax-interface.php
wwwroot/inc/functions.php
wwwroot/inc/interface-config.php
wwwroot/inc/navigation.php

index 73dbb48..da735d0 100644 (file)
@@ -120,32 +120,6 @@ function formatLoggedSpan ($log_item, $text, $html_class = '')
                ">$text</span>";
 }
 
-function getTagSelectAJAX()
-{
-       global $taglist;
-       $options = array();
-       $selected_id = '';
-       if (! isset($_REQUEST['tagid']))
-               $options['error'] = "Sorry, param 'tagid' is empty. Reload page and try again";
-       elseif (! preg_match("/tagid_(\d+)/i", $_REQUEST['tagid'], $m))
-               $options['error'] = "Sorry, wrong format tagid:'".$_REQUEST['tagid']."'. Reload page and try again";
-       else
-       {
-               $current_tag_id = $m[1];
-               $selected_id = $taglist[$current_tag_id]['parent_id'];
-               $options[0] = '-- NONE --';
-               foreach ($taglist as $tag_id => $taginfo)
-                       if
-                       (
-                               array_key_exists ('trace', $taginfo) &&
-                               ! in_array ($current_tag_id, $taginfo['trace']) &&
-                               $current_tag_id != $tag_id
-                       )
-                               $options[$tag_id] = $taginfo['tag'];
-       }
-       echo getSelectOptions ($options, $selected_id);
-}
-
 function getLocationSelectAJAX()
 {
        $locationlist = listCells ('location');
@@ -175,6 +149,38 @@ function getLocationSelectAJAX()
        }
 }
 
+function getParentNodeOptionsAJAX()
+{
+       global $pageno, $tabno;
+       $selected_id = NULL;
+       try
+       {
+               $tmp = genericAssertion ('node_id', 'string');
+               if (! preg_match ('/^nodeid_(\d+)$/', $tmp, $m))
+                       throw new InvalidRequestArgException ('node_id', $tmp, 'format mismatch');
+               $node_id = $m[1];
+               switch ($node_type = genericAssertion ('node_type', 'string'))
+               {
+                       case 'tag':
+                               $pageno = 'tagtree';
+                               $tabno = 'default';
+                               fixContext();
+                               assertPermission();
+                               global $taglist;
+                               $selected_id = $taglist[$node_id]['parent_id'];
+                               $options = getParentNodeOptions ($taglist, 'tag', $node_id);
+                               break;
+                       default:
+                               throw new InvalidRequestArgException ('node_type', $node_type, 'unknown type');
+               }
+       }
+       catch (Exception $e)
+       {
+               $options = array ('error' => $e->getMessage());
+       }
+       echo getSelectOptions ($options, $selected_id);
+}
+
 function verifyCodeAJAX()
 {
        global $pageno, $tabno;
index 2d5181c..ec0aafa 100644 (file)
@@ -1462,6 +1462,23 @@ function assertValidParentId ($nodelist, $node_id, $parent_id)
                throw new InvalidArgException ('parent_id', $parent_id, 'would create a new graph cycle');
 }
 
+// Filter a list of traced nodes and silently skip the options that don't
+// qualify. Filtering criteria are effectively the same as in the function
+// above but use a simpler expression.
+function getParentNodeOptions ($nodelist, $textfield, $node_id)
+{
+       $ret = array (0 => '-- NONE --');
+       foreach ($nodelist as $key => $each)
+               if
+               (
+                       $key != $node_id &&
+                       array_key_exists ('trace', $each) &&
+                       ! in_array ($node_id, $each['trace'])
+               )
+                       $ret[$key] = $each[$textfield];
+       return $ret;
+}
+
 // removes implicit tags from ['etags'] array and fills ['itags'] array
 // Replaces call sequence "getExplicitTagsOnly, getImplicitTags"
 function sortEntityTags (&$cell)
index 6f98a0d..b7f4c26 100644 (file)
@@ -904,7 +904,7 @@ function renderTagRowForEditor ($taginfo, $level = 0)
        echo getSelect
        (
                array ($parent_id => $parent_name),
-               array ('name' => 'parent_id', 'id' => 'tagid_' . $taginfo['id'], 'class' => 'taglist-popup'),
+               array ('name' => 'parent_id', 'id' => 'nodeid_' . $taginfo['id'], 'class' => 'taglist-popup'),
                $taginfo['parent_id'],
                FALSE
        );
@@ -919,7 +919,7 @@ function renderTagTreeEditor ()
        (
 <<<END
 function tageditor_showselectbox(e) {
-       $(this).load('index.php', {module: 'ajax', ac: 'get-tag-select', tagid: this.id});
+       $(this).load('index.php', {module: 'ajax', ac: 'get-parent-node-options', node_type: 'tag', node_id: this.id});
        $(this).unbind('mousedown', tageditor_showselectbox);
 }
 $(document).ready(function () {
index 80f305c..9ab4d07 100644 (file)
@@ -884,7 +884,7 @@ $ophandler['cables']['amount']['inc'] = 'replenishPatchCable';
 $ophandler['cables']['amount']['set'] = 'setPatchCableAmount';
 $interface_requires['cables-*'] = 'interface-cables.php';
 
-$ajaxhandler['get-tag-select'] = 'getTagSelectAJAX';
+$ajaxhandler['get-parent-node-options'] = 'getParentNodeOptionsAJAX';
 $ajaxhandler['get-location-select'] = 'getLocationSelectAJAX';
 $ajaxhandler['verifyCode'] = 'verifyCodeAJAX';
 $ajaxhandler['get-port-link'] = 'getPortInfoAJAX';