use of com.haulmont.cuba.gui.components.data.value.ContainerValueSource in project cuba by cuba-platform.
the class AbstractComponentGenerationStrategy method createEntityField.
@SuppressWarnings("unchecked")
protected Component createEntityField(ComponentGenerationContext context, MetaPropertyPath mpp) {
String linkAttribute = null;
Element xmlDescriptor = context.getXmlDescriptor();
if (xmlDescriptor != null) {
linkAttribute = xmlDescriptor.attributeValue("link");
}
if (!Boolean.parseBoolean(linkAttribute)) {
Options options = context.getOptions();
boolean useOptionsLoader = false;
if (DynamicAttributesUtils.isDynamicAttribute(mpp.getMetaProperty())) {
DynamicAttributesMetaProperty metaProperty = (DynamicAttributesMetaProperty) mpp.getMetaProperty();
CategoryAttribute attribute = metaProperty.getAttribute();
CategoryAttributeConfiguration configuration = attribute.getConfiguration();
if (Boolean.TRUE.equals(attribute.getLookup()) && configuration.hasOptionsLoader()) {
useOptionsLoader = true;
}
}
PickerField pickerField;
if (options == null && !useOptionsLoader) {
pickerField = uiComponents.create(PickerField.class);
setValueSource(pickerField, context);
if (mpp.getMetaProperty().getType() == MetaProperty.Type.ASSOCIATION) {
guiActionSupport.createActionById(pickerField, PickerField.ActionType.LOOKUP.getId());
if (DynamicAttributesUtils.isDynamicAttribute(mpp.getMetaProperty())) {
DynamicAttributesMetaProperty dynamicAttributesMetaProperty = (DynamicAttributesMetaProperty) mpp.getMetaProperty();
getDynamicAttributesGuiTools().initEntityPickerField(pickerField, dynamicAttributesMetaProperty.getAttribute());
}
boolean actionsByMetaAnnotations = guiActionSupport.createActionsByMetaAnnotations(pickerField);
if (!actionsByMetaAnnotations) {
guiActionSupport.createActionById(pickerField, PickerField.ActionType.CLEAR.getId());
}
} else {
guiActionSupport.createActionById(pickerField, PickerField.ActionType.OPEN.getId());
guiActionSupport.createActionById(pickerField, PickerField.ActionType.CLEAR.getId());
}
} else {
LookupPickerField lookupPickerField = uiComponents.create(LookupPickerField.class);
setValueSource(lookupPickerField, context);
if (useOptionsLoader) {
DynamicAttributesMetaProperty metaProperty = (DynamicAttributesMetaProperty) mpp.getMetaProperty();
CategoryAttribute attribute = metaProperty.getAttribute();
ValueSource valueSource = context.getValueSource();
if (valueSource instanceof ContainerValueSource) {
setOptionsLoader(attribute, lookupPickerField, (ContainerValueSource) valueSource);
}
} else {
lookupPickerField.setOptions(options);
}
pickerField = lookupPickerField;
guiActionSupport.createActionsByMetaAnnotations(pickerField);
}
if (xmlDescriptor != null) {
String captionProperty = xmlDescriptor.attributeValue("captionProperty");
if (StringUtils.isNotEmpty(captionProperty)) {
pickerField.setCaptionMode(CaptionMode.PROPERTY);
pickerField.setCaptionProperty(captionProperty);
}
}
setValidators(pickerField, context);
return pickerField;
} else {
EntityLinkField linkField = uiComponents.create(EntityLinkField.class);
setValueSource(linkField, context);
setLinkFieldAttributes(linkField, context);
return linkField;
}
}
use of com.haulmont.cuba.gui.components.data.value.ContainerValueSource in project cuba by cuba-platform.
the class AbstractComponentGenerationStrategy method setOptionsLoader.
protected void setOptionsLoader(CategoryAttribute categoryAttribute, LookupField lookupField, ContainerValueSource valueSource) {
InstanceContainer<?> container = valueSource.getContainer();
Entity entity = container.getItemOrNull();
if (entity != null) {
List options = dynamicAttributesTools.loadOptions((BaseGenericIdEntity) entity, categoryAttribute);
// noinspection unchecked
lookupField.setOptions(new ListOptions(options));
}
container.addItemChangeListener(e -> {
List options = dynamicAttributesTools.loadOptions((BaseGenericIdEntity) e.getItem(), categoryAttribute);
// noinspection unchecked
lookupField.setOptions(new ListOptions(options));
});
List<CategoryAttribute> dependsOnAttributes = categoryAttribute.getConfiguration().getDependsOnAttributes();
if (dependsOnAttributes != null && !dependsOnAttributes.isEmpty()) {
List<String> dependsOnAttributesCodes = dependsOnAttributes.stream().map(a -> DynamicAttributesUtils.encodeAttributeCode(a.getCode())).collect(Collectors.toList());
container.addItemPropertyChangeListener(e -> {
if (dependsOnAttributesCodes.contains(e.getProperty())) {
List options = dynamicAttributesTools.loadOptions((BaseGenericIdEntity) e.getItem(), categoryAttribute);
// noinspection unchecked
lookupField.setOptions(new ListOptions(options));
if (!options.contains(lookupField.getValue())) {
// noinspection unchecked
lookupField.setValue(null);
}
}
});
}
}
use of com.haulmont.cuba.gui.components.data.value.ContainerValueSource in project cuba by cuba-platform.
the class WebTokenList method getViewForField.
/**
* If the value for a component is selected from the lookup screen there may be cases when lookup screen contains a list of entities loaded with a
* view that doesn't contain all attributes, required by the token list.
* <p>
* The method evaluates the view that was is for loading entities in the token list
*
* @return a view or null if the view cannot be evaluated
*/
@Nullable
protected View getViewForField() {
ValueSource valueSource = getValueSource();
if (valueSource instanceof ContainerValueSource) {
ContainerValueSource containerValueSource = (ContainerValueSource) valueSource;
InstanceContainer container = containerValueSource.getContainer();
View view = container.getView();
if (view != null) {
MetaPropertyPath metaPropertyPath = containerValueSource.getMetaPropertyPath();
View curView = view;
if (metaPropertyPath != null) {
for (MetaProperty metaProperty : metaPropertyPath.getMetaProperties()) {
ViewProperty viewProperty = curView.getProperty(metaProperty.getName());
if (viewProperty != null) {
curView = viewProperty.getView();
if (curView == null)
return null;
}
}
MetaProperty inverseMetaProperty = metaPropertyPath.getMetaProperty().getInverse();
if (inverseMetaProperty != null && !inverseMetaProperty.getRange().getCardinality().isMany()) {
curView.addProperty(inverseMetaProperty.getName());
}
}
if (curView != view) {
return curView;
}
}
}
return null;
}
use of com.haulmont.cuba.gui.components.data.value.ContainerValueSource in project cuba by cuba-platform.
the class DynamicAttributesGuiTools method getValueChangeEventListener.
/**
* Returns {@code ValueChangeEventListener} for dynamic attribute that has one or more dependent attributes.
* This listener recalculates values for all dependent dynamic attributes hierarchically. The listener uses
* {@code recalculationInProgress} ThreadLocal variable to avoid unnecessary calculation.
*/
@SuppressWarnings("unchecked")
public Consumer<HasValue.ValueChangeEvent> getValueChangeEventListener(final CategoryAttribute attribute) {
if (attribute.getConfiguration().getDependentAttributes() != null && !attribute.getConfiguration().getDependentAttributes().isEmpty()) {
return valueChangeEvent -> {
if (Boolean.TRUE.equals(recalculationInProgress.get())) {
return;
}
try {
recalculationInProgress.set(true);
com.haulmont.cuba.gui.components.Component component = valueChangeEvent.getComponent();
if (component instanceof HasValueSource) {
{
BaseGenericIdEntity entity = null;
String attributeCode = DynamicAttributesUtils.encodeAttributeCode(attribute.getCode());
if (((HasValueSource) component).getValueSource() instanceof ContainerValueSource) {
ContainerValueSource valueSource = (ContainerValueSource) ((HasValueSource) component).getValueSource();
InstanceContainer container = valueSource.getContainer();
if (container.getItem() instanceof BaseGenericIdEntity) {
entity = (BaseGenericIdEntity) container.getItem();
}
} else if (((HasValueSource) component).getValueSource() instanceof DatasourceValueSource) {
DatasourceValueSource valueSource = (DatasourceValueSource) ((HasValueSource) component).getValueSource();
if (valueSource.getItem() instanceof BaseGenericIdEntity) {
entity = (BaseGenericIdEntity) valueSource.getItem();
} else if (valueSource.getItem() instanceof DynamicAttributesEntity) {
entity = ((DynamicAttributesEntity) valueSource.getItem()).getMainItem();
}
}
entity.setValue(attributeCode, valueChangeEvent.getValue());
recalculationTools.recalculateDynamicAttributes(entity, attribute);
}
}
} finally {
recalculationInProgress.remove();
}
};
}
return null;
}
use of com.haulmont.cuba.gui.components.data.value.ContainerValueSource in project cuba by cuba-platform.
the class WebTableFieldFactory method createField.
@SuppressWarnings("unchecked")
@Override
public com.vaadin.v7.ui.Field<?> createField(com.vaadin.v7.data.Container container, Object itemId, Object propertyId, Component uiContext) {
String fieldPropertyId = String.valueOf(propertyId);
Table.Column columnConf = webTable.getColumnsInternal().get(propertyId);
TableDataContainer tableDataContainer = (TableDataContainer) container;
Entity entity = (Entity) tableDataContainer.getInternalItem(itemId);
InstanceContainer instanceContainer = webTable.getInstanceContainer((E) entity);
com.haulmont.cuba.gui.components.Component columnComponent = createField(new ContainerValueSource(instanceContainer, fieldPropertyId), fieldPropertyId, columnConf.getXmlDescriptor());
if (columnComponent instanceof Field) {
Field cubaField = (Field) columnComponent;
Map<Table.Column, String> requiredColumns = webTable.getRequiredColumnsInternal();
if (requiredColumns != null && requiredColumns.containsKey(columnConf)) {
cubaField.setRequired(true);
cubaField.setRequiredMessage(requiredColumns.get(columnConf));
}
}
if (!(columnComponent instanceof CheckBox)) {
// todo get rid of concrete CheckBox class !
columnComponent.setWidthFull();
}
if (columnComponent instanceof BelongToFrame) {
BelongToFrame belongToFrame = (BelongToFrame) columnComponent;
if (belongToFrame.getFrame() == null) {
belongToFrame.setFrame(webTable.getFrame());
}
}
applyPermissions(columnComponent);
columnComponent.setParent(webTable);
Component componentImpl = getComponentImplementation(columnComponent);
if (componentImpl instanceof com.vaadin.v7.ui.Field) {
return (com.vaadin.v7.ui.Field<?>) componentImpl;
}
return new EditableColumnFieldWrapper(componentImpl, columnComponent);
}
Aggregations