package org.activityinfo.ui.client.page.entry.form;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.google.common.base.Strings;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import org.activityinfo.model.type.FieldTypeClass;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.shared.model.*;
import org.activityinfo.legacy.shared.type.IndicatorValueFormatter;
import java.util.List;
import java.util.Map.Entry;
import static com.google.gwt.safehtml.shared.SafeHtmlUtils.htmlEscape;
public class SiteRenderer {
private final IndicatorValueFormatter indicatorValueFormatter;
public SiteRenderer(IndicatorValueFormatter indicatorValueFormatter) {
super();
this.indicatorValueFormatter = indicatorValueFormatter;
}
public String renderLocation(SiteDTO site, ActivityFormDTO activity) {
StringBuilder html = new StringBuilder();
html.append("<table cellspacing='0'>");
if (!activity.getLocationType().isAdminLevel()) {
html.append("<tr><td>");
html.append(activity.getLocationType().getName()).append(": ");
html.append("</td><td>");
html.append(site.getLocationName());
if (!Strings.isNullOrEmpty(site.getLocationAxe())) {
html.append("<br>").append(site.getLocationAxe());
}
html.append("</td></tr>");
}
for (AdminLevelDTO level : activity.getAdminLevels()) {
AdminEntityDTO entity = site.getAdminEntity(level.getId());
if (entity != null) {
html.append("<tr><td>");
html.append(level.getName()).append(":</td><td>");
html.append(entity.getName());
html.append("</td></tr>");
}
}
html.append("</table>");
return html.toString();
}
public String renderSite(SiteDTO site, ActivityFormDTO activity, boolean renderComments) {
StringBuilder html = new StringBuilder();
if (renderComments && site.getComments() != null) {
String commentsHtml = site.getComments();
commentsHtml = commentsHtml.replace("\n", "<br/>");
html.append("<p class='comments'><span class='groupName'>");
html.append(I18N.CONSTANTS.comments());
html.append(":</span> ");
html.append(commentsHtml);
html.append("</p>");
}
renderAttributes(html, site, activity);
if (activity.getReportingFrequency() == ActivityFormDTO.REPORT_ONCE) {
html.append(renderIndicators(site, activity));
}
return html.toString();
}
private String renderIndicators(SiteDTO site, ActivityFormDTO activity) {
StringBuilder html = new StringBuilder();
html.append("<br/><p><span class='groupName'>");
html.append(I18N.CONSTANTS.indicators());
html.append(":</p>");
html.append("<table class='indicatorTable' cellspacing='0'>");
boolean hasContent = false;
for (IndicatorGroup group : activity.groupIndicators()) {
boolean groupHasContent = renderIndicatorGroup(html, group, site);
hasContent = hasContent || groupHasContent;
}
html.append("</table>");
return hasContent ? html.toString() : "";
}
private boolean renderIndicatorGroup(StringBuilder html,
IndicatorGroup group,
SiteDTO site) {
StringBuilder groupHtml = new StringBuilder();
boolean empty = true;
if (group.getName() != null) {
groupHtml.append("<tr><td class='indicatorGroupHeading'>")
.append(htmlEscape(group.getName()))
.append("</td><td> </td></tr>");
}
for (IndicatorDTO indicator : group.getIndicators()) {
Object value = getIndicatorValue(site, indicator);
if (value != null) {
groupHtml.append("<tr><td class='indicatorHeading");
if (group.getName() != null) {
groupHtml.append(" indicatorGroupChild");
}
groupHtml.append("'>")
.append(htmlEscape(indicator.getName()))
.append("</td>");
if(indicator.getType() == FieldTypeClass.QUANTITY) {
groupHtml
.append("<td class='indicatorValue'>")
.append(formatValue(indicator, value))
.append("</td><td class='indicatorUnits'>")
.append(indicator.getUnits())
.append("</td>");
} else {
groupHtml
.append("<td colspan=2>")
.append(formatValue(indicator, value))
.append("</td>");
}
groupHtml.append("</tr>");
empty = false;
}
}
if (!empty) {
html.append(groupHtml.toString());
return true;
} else {
return false;
}
}
private Object getIndicatorValue(SiteDTO site, IndicatorDTO indicator) {
if (indicator.getType() == FieldTypeClass.QUANTITY) {
if (indicator.getAggregation() == IndicatorDTO.AGGREGATE_SITE_COUNT) {
return 1.0;
} else if(indicator.getAggregation() == IndicatorDTO.AGGREGATE_SUM) {
Double value = site.getIndicatorDoubleValue(indicator);
if(value == null || value == 0.0) {
return null;
} else {
return value;
}
} else {
return site.getIndicatorValue(indicator);
}
} else {
return site.getIndicatorValue(indicator);
}
}
protected String formatValue(IndicatorDTO indicator, Object value) {
if(indicator.getType() == FieldTypeClass.QUANTITY) {
if (value instanceof Double) {
return indicatorValueFormatter.format((Double) value);
}
} else if(indicator.getType() == FieldTypeClass.FREE_TEXT) {
if (value instanceof String) {
return htmlEscape((String) value);
}
} else if(indicator.getType() == FieldTypeClass.NARRATIVE) {
if (value instanceof String) {
SafeHtmlBuilder html = new SafeHtmlBuilder();
html.appendEscapedLines((String)value);
return html.toSafeHtml().asString();
}
}
return "-";
}
protected void renderAttributes(StringBuilder html, SiteDTO site, ActivityFormDTO activity) {
if (site.hasAttributeDisplayMap()) {
for (Entry<String, List<String>> entry : site.getAttributeDisplayMap().entrySet()) {
renderAttribute(html, entry.getKey(), entry.getValue());
}
} else {
for (AttributeGroupDTO group : activity.getAttributeGroups()) {
renderAttribute(html, group, site);
}
}
}
protected void renderAttribute(StringBuilder html, String groupName, List<String> attributeNames) {
int count = 0;
for (String attributeName : attributeNames) {
if (count == 0) {
html.append("<p class='attribute'><span class='groupName'>");
html.append(groupName);
html.append(": </span><span class='attValues'>");
} else {
html.append(", ");
}
html.append(attributeName);
count++;
}
html.append("</span></p>");
}
protected void renderAttribute(StringBuilder html, AttributeGroupDTO group, SiteDTO site) {
int count = 0;
if (group != null) {
for (AttributeDTO attribute : group.getAttributes()) {
boolean value = site.getAttributeValue(attribute.getId());
if (value) {
if (count == 0) {
html.append("<p class='attribute'><span class='groupName'>");
html.append(group.getName());
html.append(": </span><span class='attValues'>");
} else {
html.append(", ");
}
html.append(attribute.getName());
count++;
}
}
if (count != 0) {
html.append("</span></p>");
}
}
}
}