Автозаполнение пользовательского интерфейса jQuery - Показать категории в выбранном журнале результатов - PullRequest
0 голосов
/ 01 ноября 2019

Я работал над большим выбором поиска, используя автозаполнение jquery ui.

Он извлекает удаленные данные из запроса и работает хорошо. Настройка такова, что у пользователя есть панель поиска.

В левом блоке Div отображаются результаты поиска, затем они щелкают (выбирают) элемент, и он отображается в правом блоке Div.

В настоящее времявставленный код делает это. Но я хочу, чтобы результаты в журнале (правый div) также форматировались так же, как и div поиска, поэтому значения должны находиться в пределах их категории выше.

Я могу добавить категорию к каждому журналу, например: log(ui.item.category + ui.item.value);, но я этого не хочу. Поскольку он показывает категорию перед каждым отдельным элементом, где, как если бы вы выбирали 4 из одной и той же категории, категория просто находилась бы выше, как результаты поиска.

Вот код на данный момент.

$( function() {
    function split( val ) {
      return val.split( /,\s*/ );
    }
    function extractLast( term ) {
      return split( term ).pop();
    }
    function log( message ) {
      $( "<div>" ).text( message ).prependTo( ".selected-results" );
      $( ".selected-results" ).scrollTop( 0 );
    }

    // Show class category
    $.widget( "custom.catcomplete", $.ui.autocomplete, {
      _create: function() {
        this._super();
        this.widget().menu( "option", "items", "> :not(.ui-autocomplete-category)" );
      },
      _renderMenu: function( ul, items ) {
        var that = this,
          currentCategory = "";
        $.each( items, function( index, item ) {
          var li;
          if ( item.category != currentCategory ) {
            ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" );
            currentCategory = item.category;
          }
          li = that._renderItemData( ul, item );
          if ( item.category ) {
            li.attr( "aria-label", item.category + " : " + item.label );
          }
        });
      }
    });

    // Start
    $("#autocomplete")
      // don't navigate away from the field on tab when selecting an item
      .on( "keydown", function( event ) {
        if ( event.keyCode === $.ui.keyCode.TAB &&
            $( this ).autocomplete( "instance" ).menu.active ) {
          event.preventDefault();
        }
      })
      .catcomplete({
        source: function( request, response ) {
          $.getJSON( "search.php", {
            term: extractLast( request.term )
          }, response );
        },
        appendTo: ".search-results",
        search: function() {
          // custom minLength
          var term = extractLast( this.value );
          if ( term.length < 2 ) {
            return false;
          }
        },
        focus: function() {
          // prevent value inserted on focus
          return false;
        },
        select: function( event, ui ) {
          log(ui.item.category + ui.item.value);
          var terms = split( this.value );
          // remove the current input
          terms.pop();
          // add the selected item
          terms.push( ui.item.value );
          // add placeholder to get the comma-and-space at the end
          terms.push( "" );
          this.value = terms.join( ", " );
          return false;
        },
        close: function (event, ui) {
          if (!$("ul.ui-autocomplete").is(":visible")) {
            $("ul.ui-autocomplete").show();
          }
        }
      });
  } );

HTML

<input id="autocomplete" size="50" placeholder="Enter a search term">
<div class="search-results"></div>
<div class="selected-results"></div>

Я чувствую, что я рядом, но я просто не знаю, как это сделать, это сводит меня с ума. Любой совет будет очень признателен.

Спасибо

...