justify page title handling
[racktables-incomplete-works] / wwwroot / inc / interface-lib.php
index eb11f441fac35465f87e2048c4495cd911f5890b..a8bd4089ca526e2976cb67c0f721abdd750a5b24 100644 (file)
@@ -114,6 +114,9 @@ $image['COMMIT gray']['height'] = 32;
 $image['RECALC']['path'] = 'pix/tango-view-refresh-32x32.png';
 $image['RECALC']['width'] = 32;
 $image['RECALC']['height'] = 32;
+$image['recalc']['path'] = 'pix/tango-view-refresh-16x16.png';
+$image['recalc']['width'] = 16;
+$image['recalc']['height'] = 16;
 $image['clear']['path'] = 'pix/tango-edit-clear.png';
 $image['clear']['width'] = 16;
 $image['clear']['height'] = 16;
@@ -467,7 +470,7 @@ function transformRequestData()
        // Escape any globals before we ever try to use them, but keep a copy of originals.
        $sic = array();
        // walk through merged GET and POST instead of REQUEST array because it
-       // can contain cookies with data which could not be decoded from UTF-8
+       // can contain cookies with data that could not be decoded from UTF-8
        foreach (($_POST + $_GET) as $key => $value)
        {
                if (is_array ($value))
@@ -592,7 +595,7 @@ function getRenderedIPv4NetCapacity ($range)
                $total = ip4_range_size ($range);
 
                // compute $a_total: own range size, without subranges
-               if ($range['kidc'] == 0)
+               if (! isset ($range['kidc']) or $range['kidc'] == 0)
                        $a_total = $total;
                else
                {
@@ -768,13 +771,26 @@ function getTagClassName ($tagid)
 
 function serializeTags ($chain, $baseurl = '')
 {
+       global $taglist;
        $tmp = array();
        usort ($chain, 'cmpTags');
        foreach ($chain as $taginfo)
        {
                $title = '';
                if (isset ($taginfo['user']) and isset ($taginfo['time']))
-                       $title = 'title="' . htmlspecialchars ($taginfo['user'] . ', ' . formatAge ($taginfo['time']), ENT_QUOTES) . '"';
+                       $title = htmlspecialchars ($taginfo['user'] . ', ' . formatAge ($taginfo['time']), ENT_QUOTES);
+               if (isset($taginfo['parent_id']))
+               {
+                       $parent_info = array();
+                       foreach ($taglist[$taginfo['id']]['trace'] as $tag_id)
+                               $parent_info[] = $taglist[$tag_id]['tag'];
+                       $parent_info[] = $taginfo['tag'];
+                       if (strlen ($title))
+                               $title .= "\n";
+                       $title .= implode (" \xE2\x86\x92  ", $parent_info); # right arrow
+               }
+               if (strlen ($title))
+                       $title = "title='$title'";
 
                $class = '';
                if (isset ($taginfo['id']))
@@ -806,10 +822,8 @@ function finishPortlet ()
 function getPageName ($page_code)
 {
        global $page;
-       $title = isset ($page[$page_code]['title']) ? $page[$page_code]['title'] : callHook ('dynamic_title_decoder' ,$page_code);
-       if (is_array ($title))
-               $title = $title['name'];
-       return $title;
+       $title = isset ($page[$page_code]['title']) ? $page[$page_code]['title'] : callHook ('dynamic_title_decoder', $page_code);
+       return niftyString (is_array ($title) ? $title['name'] : $title);
 }
 
 function printTagTRs ($cell, $baseurl = '')
@@ -901,8 +915,6 @@ function getOpLink ($params, $title,  $img_name = '', $comment = '', $class = ''
        $class = trim ($class);
        if (! empty ($class))
                $ret .= ' class="' . htmlspecialchars ($class, ENT_QUOTES) . '"';
-       if (! empty ($comment))
-               $ret .= 'title="' . htmlspecialchars($comment, ENT_QUOTES) . '"';
        $ret .= '>';
        if (! empty ($img_name))
        {
@@ -999,4 +1011,85 @@ function serializeFileLinks ($links, $scissors = FALSE)
        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 = '…'; // length is 1
+       if (!mb_strlen ($string))
+               return ' ';
+       // 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;
+       }
+}
+
+function makeIPAllocLink ($ip_bin, $alloc, $display_ifname = FALSE)
+{
+       $object_name = ! isset ($object_name) || ! strlen ($object_name) ?
+               formatEntityName (spotEntity ('object', $alloc['object_id'])) :
+               $alloc['object_name'];
+       $title = $display_ifname ?
+               '' :
+               "{$alloc['name']} @ {$object_name}";
+       return
+               '<a href="' . makeHref (array ('page' => 'object', 'tab' => 'default', 'object_id' => $alloc['object_id'], 'hl_ip' => ip_format ($ip_bin))) . '"' .
+               ' title="' . htmlspecialchars ($title, ENT_QUOTES) . '"' .
+               ">" . ($display_ifname ? $alloc['name'] . '@' : '') . $object_name . "</a>";
+}
+
 ?>