środa, 29 stycznia 2014

Zabbix - screen javascript search

Dużo screenów

Jednym z lepszych sposobów na organizowanie wykresów jest grupowanie ich w screen-y, które pozwalają na jednym ekranie pokazać kilka wykresów. W zabbix 2.0 mamy 2 typy screenów: ogólne oraz host screeny. Mnie na razie interesują te pierwsze w których można łączyć wykresy z różnych hostów. 
W dużym systemie może ich się pojawić dużo. Autorzy do wybierania screena wykorzystali pole combo (select), które przy dużej ilości wpisów jest wyjątkowo niewygodne.

Planowane ułatwienia

Zastanawiałem się nad zrobieniem pola autocomplete, które by zastąpiło pole combo. Ze względu na fakt że API w zabbix nie jest zbyt fajne i dodatkowo w PHP (jakoś przyzwyczaiłem się do Java) postanowiłem szukać innego rozwiązania.
Może to co przyszło mi do głowy, nie jest najszczęśliwsze, ale proste do zrobienia. Dodałem do pola combo filtr w postaci pola tekstowego, który zawęża wartości w polu combo do tych które zawierają wprowadzony tekst. Aktualizacja zawartości pola combo jest na onblur pola tekstowego.


Wartości pola tekstowego nie są zapamiętywane na stałe w serwerze... ale można się o to pokusić.
Myślę że nie warto, zamiast tego lepiej będzie popracować nad polem autocomplete.
Tymczasem proponowane rozwiązanie.

Zmiany

Modyfikacji poddałem include/views/js/general.script.confirm.js.php 
Obsługa dotyczy pola select#elementid, zrobiłem to korzystając z jQuery


<script type="text/javascript">

...
        function selectScreenRebuild(){
         var i=jQuery('input#screen_filter_value');
         var fv=i.val();
         fv=fv.trim();
         var selScreen=jQuery('select#elementid');
         //console.log('key', fv);
         var re=new RegExp(fv,"i");
         //clearall
         jQuery('select#elementid option').remove();
         jQuery('<option value="">-- wybierz --</option>').appendTo(selScreen);
         jQuery(selectScreenCopy).each(function(i,o){
          var ov=o.v;
          var ot=o.t;
          var o_visible=re.test(ot);
          if(o_visible) {
           //console.log("keydown", fv, ot);
           jQuery('<option value="'+ov+'">'+ot+'</option>').appendTo(selScreen);
          }
         });
        }

        var selectScreenCopy=[];
        jQuery(function(){
          jQuery('select#elementid option').each(function(i,o){
                //console.log(i,o);
                var f=jQuery(o);
                var v=f.val();
                var t=f.text();
                selectScreenCopy[i]={v:v,t:t};
          });

          var filter_value=jQuery('input#screen_filter_value');

          filter_value.keyup(function(e){
                selectScreenRebuild();
          });
          filter_value.change(function(e){
                selectScreenRebuild();
                //setTimeout(function(){ jQuery('select#elementid').closest('form').submit() },500)
          });
        });

Wyszukiwarka wydaje się prymitywna jednak przyspiesza niesamowicie szukanie po combo.


1 komentarz:

  1. Rozwiązanie wydaje się być bardzo trafione. Odciąża zabixa i dodatkowo możliwe, że skrypt bez modyfikacji zadziała w nowszej wersji zabixa o ile nie zmienią generacji pola combo:-)
    Javascript w interfejsie to nie brzytkie rozwiązanie. :-)

    OdpowiedzUsuń