package net.techreadiness.ui.tags.form;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.techreadiness.service.common.ViewColumn;
import net.techreadiness.service.common.ViewComponent;
import net.techreadiness.service.common.ViewDef;
import net.techreadiness.service.common.ViewField;
import net.techreadiness.ui.tags.ParentTag;
import net.techreadiness.ui.tags.ToolbarTag;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.opensymphony.xwork2.util.TextParseUtil;
public class FieldSetTag extends ParentTag {
private String title;
private ViewDef viewDef;
private String field;
private boolean bottomToolbar;
private boolean editAlertDisabled;
private boolean readOnly;
private String var;
private List<String> hiddenErrors;
private List<FieldSetColumnTag> columns;
@Override
public String execute() throws Exception {
columns = new ArrayList<>();
if (field != null) {
field = TextParseUtil.translateVariables(field, getValueStack());
}
int colCount = 1;
if (var == null) {
var = field;
}
// Process the columns defined by the view definition.
if (viewDef != null) {
if (StringUtils.isNotBlank(viewDef.getName()) && StringUtils.isBlank(title)) {
title = viewDef.getName();
}
for (ViewColumn viewColumn : viewDef.getColumns()) {
FieldSetColumnTag colTag = new FieldSetColumnTag();
colTag.setWidth(viewColumn.getWidth());
colTag.setLabelWidth(viewColumn.getLabelWidth());
colTag.setId("viewColumn" + colCount++);
colTag.setParent(this);
for (ViewComponent viewComponent : viewColumn.getComponents()) {
FieldSetRowTag rowTag = new FieldSetRowTag();
rowTag.setViewComponent(viewComponent);
rowTag.setFieldName(field);
rowTag.setParent(colTag);
rowTag.setVar(var);
rowTag.setReadOnly(readOnly);
if (viewComponent instanceof ViewField) {
ViewField viewField = (ViewField) viewComponent;
rowTag.setDescription(viewField.getDescription());
rowTag.setCode(viewField.getCode());
if (StringUtils.isNotBlank(colTag.getLabelWidth())) {
// Currently the label width is specified on the column and needs to be forced to all labels.
viewField.setLabelStyle(StringUtils.defaultString(viewField.getLabelStyle()) + ";width:"
+ colTag.getLabelWidth());
}
} else {
rowTag.setCode(viewComponent.getName());
}
rowTag.setDisplayOrder(Integer.toString(viewComponent.getDisplayOrder()));
colTag.addRow(rowTag);
}
columns.add(colTag);
}
}
// Add the columns defined on the page.
for (FieldSetColumnTag col : getChildren(FieldSetColumnTag.class)) {
col.setId("viewColumn" + colCount++);
columns.add(col);
}
// If they have some rows not included in a column ... add them to the first column.
FieldSetColumnTag col1 = null;
int i = 0;
for (FieldSetRowTag row : getChildren(FieldSetRowTag.class)) {
if (col1 == null) {
if (columns.size() == 0) {
columns.add(new FieldSetColumnTag());
}
col1 = columns.get(0);
}
String rowCode = row.getCode();
row.setPageOrder(Integer.valueOf(i));
if (StringUtils.isBlank(rowCode)) {
rowCode = Integer.toString(i);
}
i++;
boolean found = false;
for (FieldSetColumnTag column : columns) {
if (column.getRowMap().containsKey(row.getCode())) {
column.getRowMap().put(row.getCode(), row);
found = true;
break;
}
}
if (!found) {
col1.addRow(row);
}
}
detectHiddenValidationErrors();
return "/form/fieldset.jsp";
}
private void detectHiddenValidationErrors() {
if (viewDef != null) {
Map<String, List<String>> fieldErrors = Maps.newHashMap((Map<String, List<String>>) getValueStack().findValue(
"fieldErrors"));
List<String> displayedFieldNames = Lists.newArrayList();
for (ViewField viewField : viewDef.getFields()) {
displayedFieldNames.add(field + "." + viewField.getCode());
}
Iterator<String> keyIterator = fieldErrors.keySet().iterator();
while (keyIterator.hasNext()) {
String key = keyIterator.next();
if (!StringUtils.startsWith(key, field)) {
keyIterator.remove();
} else {
displayedFieldNames.add(key);
}
}
fieldErrors.keySet().removeAll(displayedFieldNames);
if (!fieldErrors.isEmpty()) {
hiddenErrors = Lists.newArrayList();
for (Entry<String, List<String>> entry : fieldErrors.entrySet()) {
hiddenErrors.addAll(entry.getValue());
}
}
}
}
public List<String> getHiddenErrors() {
return hiddenErrors;
}
public List<ToolbarTag> getToolbars() {
return getChildren(ToolbarTag.class);
}
public boolean isFieldSetRowTag() {
return true;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setBottomToolbar(boolean bottomToolbar) {
this.bottomToolbar = bottomToolbar;
}
public boolean isBottomToolbar() {
return bottomToolbar;
}
public ViewDef getViewDef() {
return viewDef;
}
public void setViewDef(ViewDef viewDef) {
this.viewDef = viewDef;
}
public void setEditAlertDisabled(boolean editAlertDisabled) {
this.editAlertDisabled = editAlertDisabled;
}
public boolean isEditAlertDisabled() {
return editAlertDisabled;
}
public List<FieldSetColumnTag> getColumns() {
return columns;
}
public void setColumns(List<FieldSetColumnTag> columns) {
this.columns = columns;
}
public int getColumnCount() {
return columns == null ? 0 : columns.size();
}
public boolean isReadOnly() {
return readOnly;
}
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
}