Merge pull request #53 from gescheit/suggest
authorAlexey Andriyanov <alan@al-an.info>
Fri, 17 Jan 2014 13:46:16 +0000 (17:46 +0400)
committerAlexey Andriyanov <alan@al-an.info>
Fri, 17 Jan 2014 13:46:16 +0000 (17:46 +0400)
Added tag picker with autocompletion

1  2 
ChangeLog
wwwroot/inc/interface-lib.php
wwwroot/inc/interface.php
wwwroot/inc/navigation.php
wwwroot/inc/ophandlers.php

diff --cc ChangeLog
Simple merge
index 73020f6e18d89213c45f9fccb82f39ec9f225b1b,13a063768b460bb7c2a383272de82d9420043e1f..281508dd69c371967a7381353a8f9f99d6bb90cb
@@@ -997,23 -1012,51 +1010,70 @@@ function serializeFileLinks ($links, $s
        return $ret;
  }
  
 +// This is a dual-purpose formating function:
 +// 1. Replace empty strings with nbsp.
 +// 2. Cut strings that are too long: append "cut here" indicator and provide a mouse hint.
 +function niftyString ($string, $maxlen = 30, $usetags = TRUE)
 +{
 +      $cutind = '&hellip;'; // length is 1
 +      if (!mb_strlen ($string))
 +              return '&nbsp;';
 +      // a tab counts for a space
 +      $string = preg_replace ("/\t/", ' ', $string);
 +      if (!$maxlen or mb_strlen ($string) <= $maxlen)
 +              return htmlspecialchars ($string, ENT_QUOTES, 'UTF-8');
 +      return
 +              ($usetags ? ("<span title='" . htmlspecialchars ($string, ENT_QUOTES, 'UTF-8') . "'>") : '') .
 +              str_replace (' ', '&nbsp;', htmlspecialchars (mb_substr ($string, 0, $maxlen - 1), ENT_QUOTES, 'UTF-8')) .
 +              $cutind .
 +              ($usetags ? '</span>' : '');
 +}
 +
+ function printTagsPicker ($preselect=NULL)
+ {
+       printTagsPickerInput ();
+       printTagsPickerUl ($preselect);
+       enableTagsPicker ();
+ }
+ function printTagsPickerInput ($input_name="taglist")
+ {
+       # use data-attribute as identifier for tagit
+       echo "<input type='text' data-tagit-valuename='" . $input_name . "' data-tagit='yes' placeholder='new tags here...' class='ui-autocomplete-input' autocomplete='off' role='textbox' aria-autocomplete='list' aria-haspopup='true'>";
+       echo "<span title='show tag tree' class='icon-folder-open tagit_input_" . $input_name . "'></span>";
+ }
+ function printTagsPickerUl ($preselect=NULL, $input_name="taglist")
+ {
+       global $target_given_tags;
+       if ($preselect === NULL)
+               $preselect = $target_given_tags;
+       foreach ($preselect as $key => $value) # readable time format
+               $preselect[$key]['time_parsed'] = formatAge ($value['time']);
+       usort ($preselect, 'cmpTags');
+       $preselect_hidden = "";
+       foreach ($preselect as $value){
+               $preselect_hidden .= "<input type=hidden name=" . $input_name . "[] value=" . $value['id'] . ">";
+       }
+       echo $preselect_hidden; # print preselected tags id that used in case javascript problems
+       echo "<ul data-tagit='yes' data-tagit-valuename='" . $input_name . "' data-tagit-preselect='" . json_encode($preselect) . "' class='tagit-vertical'></ul>";
+ }
+ function enableTagsPicker ()
+ {
+       global $taglist;
+       static $taglist_inserted;
+       includeJQueryUI ();
+       addCSS ('css/tagit.css');
+       addJS ('js/tag-it.js');
+       addJS ('js/tag-it-local.js');
+       if (! $taglist_inserted)
+       {
+               $taglist_filtered = array();
+               foreach ($taglist as $key => $taginfo) # remove unused fields
+                       $taglist_filtered[$key] = array_sub ($taginfo, array("tag", "is_assignable", "trace"));
+               addJS ('var taglist = ' . json_encode ($taglist_filtered) . ';', TRUE);
+               $taglist_inserted = TRUE;
+       }
+ }
  ?>
Simple merge
Simple merge
index b73c5b9af80843d349613dd5c648368ed1576e35,7f43c2c83581332b1b0a78b831bc6a1989433be3..705c3c84f29c45cfb1ba01e22e10b7267b687125
@@@ -907,10 -849,9 +849,9 @@@ function addIPv4Prefix (
  {
        assertStringArg ('range');
        assertStringArg ('name', TRUE);
-       $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
+       $taglist = genericAssertion ('taglist', 'array0');
        global $sic;
 -      $vlan_ck = empty ($sic['vlan_ck']) ? NULL : $sic['vlan_ck'];
 +      $vlan_ck = empty ($sic['vlan_ck']) ? NULL : genericAssertion ('vlan_ck', 'uint-vlan1');
        $net_id = createIPv4Prefix ($_REQUEST['range'], $sic['name'], isCheckSet ('is_connected'), $taglist, $vlan_ck);
        showSuccess ('IP network ' . mkA ($_REQUEST['range'], 'ipv4net', $net_id) . ' has been created');
  }
@@@ -919,10 -860,9 +860,9 @@@ function addIPv6Prefix (
  {
        assertStringArg ('range');
        assertStringArg ('name', TRUE);
-       $taglist = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
+       $taglist = genericAssertion ('taglist', 'array0');
        global $sic;
 -      $vlan_ck = empty ($sic['vlan_ck']) ? NULL : $sic['vlan_ck'];
 +      $vlan_ck = empty ($sic['vlan_ck']) ? NULL : genericAssertion ('vlan_ck', 'uint-vlan1');
        $net_id = createIPv6Prefix ($_REQUEST['range'], $sic['name'], isCheckSet ('is_connected'), $taglist, $vlan_ck);
        showSuccess ('IP network ' . mkA ($_REQUEST['range'], 'ipv6net', $net_id) . ' has been created');
  }