/*
* #%L
* BroadleafCommerce Open Admin Platform
* %%
* Copyright (C) 2009 - 2013 Broadleaf Commerce
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.broadleafcommerce.openadmin.web.form.entity;
import org.apache.commons.lang3.builder.CompareToBuilder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class FieldGroup {
protected String title;
protected Integer order;
protected Set<Field> alternateOrderedFields = new HashSet<Field>();
protected Set<Field> fields = new HashSet<Field>();
protected Boolean isVisible;
public Boolean getIsVisible() {
if (isVisible != null) {
return isVisible;
}
for (Field f : getFields()) {
if (f.getIsVisible()) {
return true;
}
}
return false;
}
public void setIsVisible(Boolean isVisible) {
this.isVisible = isVisible;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public FieldGroup withTitle(String title) {
setTitle(title);
return this;
}
public FieldGroup withOrder(Integer order) {
setOrder(order);
return this;
}
public boolean addField(Field field) {
if (field.getAlternateOrdering()) {
return alternateOrderedFields.add(field);
} else {
return fields.add(field);
}
}
public boolean removeField(Field field) {
if (field.getAlternateOrdering()) {
return alternateOrderedFields.remove(field);
} else {
return fields.remove(field);
}
}
public Set<Field> getFields() {
List<Field> myFields = new ArrayList<Field>();
myFields.addAll(fields);
Collections.sort(myFields, new Comparator<Field>() {
@Override
public int compare(Field o1, Field o2) {
return new CompareToBuilder()
.append(o1.getOrder(), o2.getOrder())
.append(o1.getFriendlyName(), o2.getFriendlyName())
.append(o1.getName(), o2.getName())
.toComparison();
}
});
if (!alternateOrderedFields.isEmpty()) {
List<Field> mapFieldsList = new ArrayList<Field>(alternateOrderedFields);
Collections.sort(mapFieldsList, new Comparator<Field>() {
@Override
public int compare(Field o1, Field o2) {
return new CompareToBuilder()
.append(o1.getOrder(), o2.getOrder())
.append(o1.getFriendlyName(), o2.getFriendlyName())
.append(o1.getName(), o2.getName())
.toComparison();
}
});
/*
alternate ordered fields whose order is less or equal to zero appear first and are
prepended to the response list in order
*/
List<Field> smallOrderFields = new ArrayList<Field>();
for (Field mapField : mapFieldsList) {
if (mapField.getOrder() <= 0) {
smallOrderFields.add(mapField);
}
}
myFields.addAll(0, smallOrderFields);
/*
Alternate ordered fields (specifically custom fields) have a different ordering rule than regular fields. For example,
if a user enters 3 for the field order value for a custom field, that custom field should be the third
on the form. Regular BLC AdminPresentation fields tends to have orders like 1000, 2000, etc..., so this
distinction is necessary.
*/
for (Field mapField : mapFieldsList) {
if (mapField.getOrder() <= 0) {
continue;
}
if (mapField.getOrder() < myFields.size() + 1) {
myFields.add(mapField.getOrder() - 1, mapField);
continue;
}
myFields.add(mapField);
}
}
//don't allow any modification of the fields
return Collections.unmodifiableSet(new LinkedHashSet<Field>(myFields));
}
public void setFields(Set<Field> fields) {
this.fields = fields;
}
public boolean isMasterFieldGroup() {
if (getTitle() != null && getTitle().toLowerCase().contains("master")) {
return true;
}
return false;
}
public boolean containsFieldData() {
for (Field field : fields) {
if (field.getValue() != null) {
return true;
}
}
return false;
}
}