/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.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.gnu.org/licenses/agpl.txt
*
* 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.
*/
package se.streamsource.streamflow.web.context.administration.forms.definition;
import org.qi4j.api.constraint.ConstraintViolationException;
import org.qi4j.api.constraint.Name;
import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.entity.Identity;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.specification.Specification;
import org.qi4j.api.structure.Module;
import org.qi4j.api.unitofwork.UnitOfWork;
import org.qi4j.api.util.Function;
import org.qi4j.api.util.Iterables;
import org.qi4j.api.value.ValueBuilder;
import org.qi4j.api.value.ValueBuilderFactory;
import se.streamsource.dci.api.IndexContext;
import se.streamsource.dci.api.RoleMap;
import se.streamsource.dci.value.link.LinksValue;
import se.streamsource.streamflow.api.administration.form.AttachmentFieldValue;
import se.streamsource.streamflow.api.administration.form.CheckboxesFieldValue;
import se.streamsource.streamflow.api.administration.form.ComboBoxFieldValue;
import se.streamsource.streamflow.api.administration.form.CommentFieldValue;
import se.streamsource.streamflow.api.administration.form.CreateFieldDTO;
import se.streamsource.streamflow.api.administration.form.CreateFieldGroupDTO;
import se.streamsource.streamflow.api.administration.form.DateFieldValue;
import se.streamsource.streamflow.api.administration.form.FieldGroupFieldValue;
import se.streamsource.streamflow.api.administration.form.FieldTypes;
import se.streamsource.streamflow.api.administration.form.FieldValue;
import se.streamsource.streamflow.api.administration.form.GeoLocationFieldValue;
import se.streamsource.streamflow.api.administration.form.ListBoxFieldValue;
import se.streamsource.streamflow.api.administration.form.NumberFieldValue;
import se.streamsource.streamflow.api.administration.form.OpenSelectionFieldValue;
import se.streamsource.streamflow.api.administration.form.OptionButtonsFieldValue;
import se.streamsource.streamflow.api.administration.form.PageDefinitionValue;
import se.streamsource.streamflow.api.administration.form.TextAreaFieldValue;
import se.streamsource.streamflow.api.administration.form.TextFieldValue;
import se.streamsource.streamflow.web.context.LinksBuilder;
import se.streamsource.streamflow.web.domain.Describable;
import se.streamsource.streamflow.web.domain.structure.form.Field;
import se.streamsource.streamflow.web.domain.structure.form.FieldGroup;
import se.streamsource.streamflow.web.domain.structure.form.FieldGroupValue;
import se.streamsource.streamflow.web.domain.structure.form.FieldGroups;
import se.streamsource.streamflow.web.domain.structure.form.FieldValueDefinition;
import se.streamsource.streamflow.web.domain.structure.form.Fields;
import se.streamsource.streamflow.web.domain.structure.form.Page;
import se.streamsource.streamflow.web.domain.structure.form.Pages;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* JAVADOC
*/
public class FormPageContext
implements IndexContext<PageDefinitionValue>
{
@Structure
Module module;
private static final String field_group = "field_group";
private static final String fieldgroup_group = "fieldgroup_group";
public PageDefinitionValue index()
{
Describable describable = RoleMap.role( Describable.class );
Identity identity = RoleMap.role( Identity.class );
Page page = RoleMap.role(Page.class);
ValueBuilder<PageDefinitionValue> builder = module.valueBuilderFactory().newValueBuilder( PageDefinitionValue.class );
builder.prototype().description().set( describable.getDescription() );
builder.prototype().page().set( EntityReference.parseEntityReference( identity.identity().get() ) );
builder.prototype().rule().set( page.getRule() );
return builder.newInstance();
}
public void move( @Name("direction") String direction )
{
Page page = RoleMap.role( Page.class );
Pages.Data pagesData = RoleMap.role( Pages.Data.class );
Pages pages = RoleMap.role( Pages.class );
int index = pagesData.pages().toList().indexOf( page );
if (direction.equalsIgnoreCase( "up" ))
{
try
{
pages.movePage( page, index - 1 );
} catch (ConstraintViolationException e)
{
}
} else
{
pages.movePage( page, index + 1 );
}
}
public void delete()
{
Page pageEntity = RoleMap.role( Page.class );
Pages form = RoleMap.role( Pages.class );
form.removePage( pageEntity );
}
public void create( CreateFieldDTO createFieldDTO )
{
Fields fields = RoleMap.role( Fields.class );
fields.createField( createFieldDTO.name().get(), getFieldValue( createFieldDTO.fieldType().get() ) );
}
public void createfieldgroup(CreateFieldGroupDTO createFieldGroupDTO ) {
Fields fields = RoleMap.role( Fields.class );
ValueBuilder<FieldGroupFieldValue> builder = module.valueBuilderFactory().newValueBuilder( FieldGroupFieldValue.class );
UnitOfWork uow = module.unitOfWorkFactory().currentUnitOfWork();
FieldGroup fieldGroup = uow.get( FieldGroup.class, createFieldGroupDTO.fieldGroup().get() );
builder.prototype().fieldGroup().set( EntityReference.getEntityReference( fieldGroup) );
fields.createField( createFieldGroupDTO.name().get(), builder.newInstance() );
}
private FieldValue getFieldValue( FieldTypes fieldType )
{
FieldValue value = null;
ValueBuilderFactory vbf = module.valueBuilderFactory();
switch (fieldType)
{
case attachment:
value = vbf.newValue( AttachmentFieldValue.class );
break;
case checkboxes:
value = vbf.newValue( CheckboxesFieldValue.class );
break;
case combobox:
value = vbf.newValue( ComboBoxFieldValue.class );
break;
case comment:
value = vbf.newValue( CommentFieldValue.class );
break;
case date:
value = vbf.newValue( DateFieldValue.class );
break;
case listbox:
value = vbf.newValue( ListBoxFieldValue.class );
break;
case number:
ValueBuilder<NumberFieldValue> numberBuilder = vbf.newValueBuilder( NumberFieldValue.class );
numberBuilder.prototype().integer().set( true );
value = numberBuilder.newInstance();
break;
case optionbuttons:
value = vbf.newValue( OptionButtonsFieldValue.class );
break;
case openselection:
ValueBuilder<OpenSelectionFieldValue> valueBuilder = vbf.newValueBuilder( OpenSelectionFieldValue.class );
valueBuilder.prototype().openSelectionName().set( "" );
value = valueBuilder.newInstance();
break;
case textarea:
ValueBuilder<TextAreaFieldValue> builder = vbf.newValueBuilder( TextAreaFieldValue.class );
builder.prototype().cols().set( 30 );
builder.prototype().rows().set( 5 );
value = builder.newInstance();
break;
case text:
ValueBuilder<TextFieldValue> textBuilder = vbf.newValueBuilder( TextFieldValue.class );
textBuilder.prototype().width().set( 30 );
value = textBuilder.newInstance();
break;
case geolocation:
value = vbf.newValue( GeoLocationFieldValue.class );
break;
}
return value;
}
public LinksValue possiblefields()
{
LinksBuilder builder = new LinksBuilder( module.valueBuilderFactory() );
ResourceBundle bundle = ResourceBundle.getBundle( FormPageContext.class.getName(), RoleMap.role( Locale.class ) );
for (FieldTypes fieldType : FieldTypes.values())
{
builder.addLink( bundle.getString( fieldType.toString()), fieldType.toString(), "createfield", "create", "field", bundle.getString( field_group ) );
}
List<FieldGroup> fieldGroups = RoleMap.role( FieldGroups.Data.class ).fieldGroups().toList();
for (FieldGroup fieldGroup : fieldGroups)
{
builder.addLink( fieldGroup.getDescription(), EntityReference.getEntityReference( fieldGroup).identity(), "createfieldgroup", "createfieldgroup", "fieldgroup", bundle.getString( fieldgroup_group ) );
}
return builder.newLinks();
}
@FirstPage(false)
public LinksValue possiblerulefields()
{
final Pages.Data pages = RoleMap.role( Pages.Data.class );
Page page = RoleMap.role( Page.class );
final int index = pages.pages().toList().indexOf( page );
Iterable<Field> possiblefields = Iterables.filter( new Specification<Field>()
{
public boolean satisfiedBy( Field field )
{
FieldValue fieldValue = ((FieldValueDefinition.Data) field).fieldValue().get();
boolean filter = fieldValue instanceof FieldGroupValue
|| fieldValue instanceof CommentFieldValue
|| fieldValue instanceof TextAreaFieldValue
|| fieldValue instanceof AttachmentFieldValue;
return !filter;
}
}, Iterables.flatten( Iterables.map( new Function<Page, Iterable<Field>>()
{
public Iterable<Field> map( Page page )
{
return ((Fields.Data) page).fields().toList();
}
}, Iterables.filter( new Specification<Page>()
{
public boolean satisfiedBy( Page page )
{
return pages.pages().toList().indexOf( page ) < index;
}
}, pages.pages() ) ) ) );
LinksBuilder builder = new LinksBuilder( module.valueBuilderFactory() );
builder.addLink( " ", "" );
for( Field field : possiblefields )
{
builder.addLink( field.getDescription() + "-" + field.getFieldId(), ((Identity)field).identity().get() );
}
return builder.newLinks();
}
}