EN · DE · RU · FR · ES

#3241: PFAutoCompleteBehavior.java

projectforge-wicket/src/main/java/org/projectforge/web/wicket/autocompletion/PFAutoCompleteBehavior.java Тип: Java · Роль: Автодополнение · Источник: projectforge-wicket/src/main/java/org/projectforge/web/wicket/autocompletion/PFAutoCompleteBehavior.java 283 строки · 177 кода · 81 комментарий · 25 пустых
Поведение AJAX-автодополнения Wicket. Обеспечивает серверные подсказки для текстовых полей ввода с избранными записями, недавними вводами и настраиваемыми параметрами сопоставления/отображения.

Структура кода

Пакет: org.projectforge.web.wicket.autocompletion

Классы: PFAutoCompleteBehavior, MyJsonBuilder

Расширяет: AbstractDefaultAjaxBehavior

Методы (14): renderHead, renderAutocompleteHead, getSettingsJS, addSetting, addSetting, onBind, respond, respond, onRequest, respond, detach, formatLabel, formatValue, transform

Поля (4): serialVersionUID, settings, renderer, serialVersionUID

Импорты: 14 пакетов

Исходный код (сокращённый)

package org.projectforge.web.wicket.autocompletion;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.handler.TextRequestHandler;
import org.apache.wicket.util.string.Strings;
import org.projectforge.web.core.JsonBuilder;
import org.projectforge.web.wicket.WicketRenderHeadUtils;

import java.util.ArrayList;
import java.util.List;

public abstract class PFAutoCompleteBehavior<T> extends AbstractDefaultAjaxBehavior
{
  private static final long serialVersionUID = -6532710378025987377L;

  protected PFAutoCompleteSettings settings;

  protected IAutoCompleteRenderer<String> renderer;

  public PFAutoCompleteBehavior(final IAutoCompleteRenderer<String> renderer, final PFAutoCompleteSettings settings)
  {
    this.renderer = renderer;
    this.settings = settings;
  }

  /**
   * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#renderHead(org.apache.wicket.Component,
   *      org.apache.wicket.markup.html.IHeaderResponse)
   */
  @Override
  public void renderHead(final Component component, final IHeaderResponse response)
  {
    super.renderHead(component, response);
    WicketRenderHeadUtils.renderMainJavaScriptIncludes(response);
    response.render(JavaScriptReferenceHeaderItem.forUrl("scripts/jquery.wicket-autocomplete.js"));
    renderAutocompleteHead(response);
  }

  /**
   * Рендеринг JavaScript-инициализации автодополнения и других вкладов в заголовок
   * 
   * @param response
   */
  private void renderAutocompleteHead(final IHeaderResponse response)
  {
    final String id = getComponent().getMarkupId();
    String indicatorId = findIndicatorId();
    if (Strings.isEmpty(indicatorId)) {
      indicatorId = "null";
    } else {
      indicatorId = "'" + indicatorId + "'";
    }
    final StringBuilder buf = new StringBuilder();
    buf.append("var favorite" + id + " = ");
    final List<T> favorites = getFavorites();
    final MyJsonBuilder builder = new MyJsonBuilder();
    if (favorites != null) {
      buf.append(builder.append(favorites).getAsString());
    } else {
      buf.append(builder.append(getRecentUserInputs()).getAsString());
    }
    buf.append(";").append("var z = $(\"#").append(id).append("\");\n").append("z.autocomplete(\"").append(getCallbackUrl()).append("\",{");
    boolean first = true;
    for (final String setting : getSettingsJS()) {
      if (first == true)
        first = false;
      else buf.append(", ");
      buf.append(setting);
    }
    if (first == true)
      first = false;
    else buf.append(", ");
    buf.append("favoriteEntries:favorite" + id);
    buf.append("});");
    if (settings.isHasFocus() == true) {
      buf.append("\nz.focus();");
    }
    final String initJS = buf.toString();
    // String initJS = String.format("new Wicket.AutoComplete('%s','%s',%s,%s);", id, getCallbackUrl(), constructSettingsJS(), indicatorId);
    response.render(OnDomReadyHeaderItem.forScript(initJS));
  }

  protected final List<String> getSettingsJS()
  {
    final List<String> result = new ArrayList<String>();
    addSetting(result, "matchContains", settings.isMatchContains());
    addSetting(result, "minChars", settings.getMinChars());
    addSetting(result, "delay", settings.getDelay());
    addSetting(result, "matchCase", settings.isMatchCase());
    addSetting(result, "matchSubset", settings.isMatchSubset());
    addSetting(result, "cacheLength", settings.getCacheLength());
    addSetting(result, "mustMatch", settings.isMustMatch());
    addSetting(result, "selectFirst", settings.isSelectFirst());
    addSetting(result, "selectOnly", settings.isSelectOnly());
    addSetting(result, "maxItemsToShow", settings.getMaxItemsToShow());
    addSetting(result, "autoFill", settings.isAutoFill());
    addSetting(result, "autoSubmit", settings.isAutoSubmit());
    addSetting(result, "scroll", settings.isScroll());
    addSetting(result, "scrollHeight", settings.getScrollHeight());
    addSetting(result, "width", settings.getWidth());
    addSetting(result, "deletableItem", settings.isDeletableItem());
    if (settings.isLabelValue() == true) {
      addSetting(result, "labelValue", settings.isLabelValue());
    }
    return result;
  }

  private final void addSetting(final List<String> result, final String name, final Boolean value)
  {
    if (value == null) {
      return;
    }
// ... (сокращено, всего 261 строка)

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024 -> 2025.
a72903e36 *.java, *.kt: StringBuffer -> StringBuilder.
b6092df09 Авторские права 2023 -> 2024
ab45d51fa Авторские права 2001-2022 -> 2001-2023.