EN · DE · RU · FR · ES

#3256: ConsumptionBarPanel.java

projectforge-wicket/src/main/java/org/projectforge/web/wicket/components/ConsumptionBarPanel.java Тип: Java · Роль: Панель · Источник: projectforge-wicket/src/main/java/org/projectforge/web/wicket/components/ConsumptionBarPanel.java 133 строки · 85 кода · 40 комментариев · 8 пустых
Компонент панели Wicket для ConsumptionBar. Многоразовый UI-фрагмент, встраиваемый в страницы или диалоги.

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

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

Классы: ConsumptionBarPanel

Расширяет: Panel

Методы (2): onClick, getTooltip

Поля (2): serialVersionUID, tooltip

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

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

package org.projectforge.web.wicket.components;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.projectforge.framework.utils.NumberHelper;
import org.projectforge.web.timesheet.TimesheetListPage;
import org.projectforge.web.wicket.WicketUtils;

import java.math.BigDecimal;


/**
 * Отображает слой div с цветной процентной шкалой.
 * @author Kai Reinhard (k.reinhard@micromata.de)
 *
 */
public class ConsumptionBarPanel extends Panel
{
  private static final long serialVersionUID = -4328646802035960450L;

  private final String tooltip;

  /**
   * @param id
   * @param usage
   * @param maxValue
   * @param taskId
   * @param taskNodeFinished В зависимости от того, завершён ли узел задачи, цвета различаются: например, шкала, использованная на 95%, зелёная для
   *          завершённых задач, для незавершённых — нет.
   * @param unit
   * @param linkEnabled Если true, пользователь может нажать на эту шкалу для просмотра всех табелей учёта времени, стоящих за этой шкалой.
   */
  public ConsumptionBarPanel(final String id, final BigDecimal usage, BigDecimal maxValue, final Long taskId,
      final boolean taskNodeFinished, final String unit, final boolean linkEnabled)
  {
    super(id);
    if (NumberHelper.isNotZero(maxValue) == false) {
      maxValue = null;
    }
    @SuppressWarnings("serial")
    final Link< Void> showTimesheetsLink = new Link<Void>("sheets") {
      @Override
      public void onClick()
      {
        final PageParameters parameters = new PageParameters();
        parameters.add(TimesheetListPage.PARAMETER_KEY_CLEAR_ALL, true);
        parameters.add(TimesheetListPage.PARAMETER_KEY_STORE_FILTER, false);
        parameters.add(TimesheetListPage.PARAMETER_KEY_TASK_ID, taskId);
        final TimesheetListPage timesheetListPage = new TimesheetListPage(parameters);
        setResponsePage(timesheetListPage);
      }
    };
    showTimesheetsLink.setEnabled(linkEnabled);
    add(showTimesheetsLink);
    final WebMarkupContainer bar = new WebMarkupContainer("bar");
    final Label progressLabel = new Label("progress", new Model<String>(" "));
    final int percentage = maxValue != null ? usage.divide(maxValue, 2, BigDecimal.ROUND_HALF_UP).multiply(NumberHelper.HUNDRED).intValue()
        : 0;
    final int width = percentage <= 100 ? percentage : 10000 / percentage;
    bar.add(AttributeModifier.replace("class", "progress"));
    if (percentage <= 80 || (taskNodeFinished == true && percentage <= 100)) {
      if (percentage > 0) {
        bar.add(AttributeModifier.append("class", "progress-done"));
      } else {
        bar.add(AttributeModifier.append("class", "progress-none"));
        progressLabel.setVisible(false);
      }
    } else if (percentage <= 90) {
      bar.add(AttributeModifier.append("class", "progress-80"));
    } else if (percentage <= 100) {
      bar.add(AttributeModifier.append("class", "progress-90"));
    } else if (taskNodeFinished == true && percentage <= 110) {
      bar.add(AttributeModifier.append("class", "progress-overbooked-min"));
    } else {
      bar.add(AttributeModifier.append("class", "progress-overbooked"));
    }
    if (maxValue == null && (usage == null || usage.compareTo(BigDecimal.ZERO) == 0)) {
      bar.setVisible(false);
    }
    progressLabel.add(AttributeModifier.replace("style", "width: " + width + "%;"));
    final StringBuilder buf = new StringBuilder();
    buf.append(NumberHelper.getNumberFractionFormat(getLocale(), usage.scale()).format(usage));
    if (unit != null) {
      buf.append(unit);
    }
    if (maxValue != null) {
      buf.append("/");
      buf.append(NumberHelper.getNumberFractionFormat(getLocale(), maxValue.scale()).format(maxValue));
      buf.append(unit);
      buf.append(" (").append(percentage).append("%)");
    }
    tooltip = buf.toString();
    WicketUtils.addTooltip(bar, tooltip);
    showTimesheetsLink.add(bar);
    bar.add(progressLabel);
  }

  /**
   * @return всплывающая подсказка
   */
  public String getTooltip()
  {
    return tooltip;
  }
}

История Git

868d6abb7 2025 → 2026
63081666f Заголовки исходных файлов: 2024 → 2025.
a72903e36 *.java, *.kt: StringBuffer → StringBuilder.
4c04cfd65 КРУПНОЕ ИЗМЕНЕНИЕ! Миграция целочисленных id на Long id (включая внешние ключи и т.д.)
b6092df09 Авторские права 2023 → 2024