...
CSS class name | Constant | Description |
---|---|---|
redBg | RowStyle.RED_BACKGROUND | set row background to red |
boldFont | RowStyle.BOLD_FONT | set row font weight to bold |
yellowBg | RowStyle.YELLOW_BACKGROUND | set row background to yellow |
brownBg | RowStyle.BROWN_BACKGROUND | set row background to brown |
blueBg | RowStyle.BLUE_BACKGROUND | set row background to blue |
greenBg | RowStyle.GREEN_BACKGROUND | set row background to green |
Info |
---|
Prefer constants over CSS class name literals. This will help you avoid many mistakes and keep your code easier to maintain. |
...
- criteriaModifierName - arbitrary name of modifier method
- searchCriteriaBuilder - criteria builder used by component
To see how to bind modifier method with view component go to 'criteria modifiers' in 'Hook an Listeners' section.
If you need some sample code see Criteria modifier example in Examples section.
...
3. Examples
...
3.1 Custom validator example
...
theme | Eclipse |
---|---|
language | java |
linenumbers | true |
...
There is also second version of criteria modifier method that you can define:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public void criteriaModifierName(final SearchCriteriaBuilder searchCriteriaBuilder, final FilterValueHolder filterValueHolder ) { Entity order// = entity.getBelongsToField("order"); CRITERIA MODIFIER BODY } |
Where
- criteriaModifierName - arbitrary name of modifier method
- searchCriteriaBuilder - criteria builder used by component
- filterValueHolder - criteria value passed from before render hook.
To set FilterValueHolder you have to get it from LookupComponent in before render hook, modify it and set it again
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public void beforeRenderHook(final ViewDefinitionState viewDefinitionState) {
LookupComponent lookup= (LookupComponent)
viewDefinitionState.getComponentByReference("lookupReference");
FilterValueHolder holder = lookup.getFilterValue();
holder.put("key", "value");
lookup.setFilterValue(holder);
} |
To see how to bind modifier method with view component go to 'criteria modifiers' in 'Hook an Listeners' section.
If you need some sample code see Criteria modifier example in Examples section.
Anchor | ||||
---|---|---|---|---|
|
3. Examples
Anchor | ||||
---|---|---|---|---|
|
3.1 Custom validator example
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public boolean checkIfOrderHasTechnology(final DataDefinition dataDefinition, final Entity entity) {
Entity order = entity.getBelongsToField("order");
if (order == null) {
return true;
}
if (order.getField("technology") == null) {
entity.addError(dataDefinition.getField("order"), "products.validate.global.error.orderMustHaveTechnology");
return false;
} else {
return true;
}
} |
Anchor | ||||
---|---|---|---|---|
|
3.2 Model hook example:
(this particular example is used within the <onSave> tag:
Code Block |
---|
public void fillOrderDatesAndWorkers(final DataDefinition dataDefinition, final Entity entity) {
if (("02inProgress".equals(entity.getField("state")) || "03done".equals(entity.getField("state")))
&& entity.getField("effectiveDateFrom") == null) {
entity.setField("effectiveDateFrom", new Date());
entity.setField("startWorker", securityService.getCurrentUserName());
}
if ("03done".equals(entity.getField("state")) && entity.getField("effectiveDateTo") == null) {
entity.setField("effectiveDateTo", new Date());
entity.setField("endWorker", securityService.getCurrentUserName());
}
} |
Anchor | ||||
---|---|---|---|---|
|
3.3 View hook (preRender) example
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public void checkIfCommentIsRequiredBasedOnResult(final ViewDefinitionState state) { FieldComponentState comment = (FieldComponentState) state.getComponentByReference("comment"); FieldComponentState controlResult = (FieldComponentState) state.getComponentByReference("controlResult"); if (controlResult != null && controlResult.getFieldValue() != null && "03objection".equals(controlResult.getFieldValue())) { comment.setRequired(true); if (order == null)comment.requestComponentUpdateState(); } else { return truecomment.setRequired(false); } } |
Anchor | ||||
---|---|---|---|---|
|
3.3 View listener hook example
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
if (order.getField("technology") == null) { public void checkAcceptedDefectsQuantity(final ViewDefinitionState viewDefinitionState, final ComponentState state, entity.addError(dataDefinition.getField("order"), "products.validate.global.error.orderMustHaveTechnology"); final String[] args) { return false; if (!(state instanceof FieldComponentState)) { } else { throw new IllegalStateException("component is return truenot input"); } } |
...
3.2 Model hook example:
(this particular example is used within the <onSave> tag:
Code Block |
---|
public voidFieldComponentState fillOrderDatesAndWorkers(finalacceptedDefectsQuantity DataDefinition dataDefinition, final Entity entity) {= (FieldComponentState) state; FieldComponentState comment if= (("02inProgress".equals(entity.getField("state")) || "03done".equals(entity.getField("state"))) FieldComponentState) viewDefinitionState.getComponentByReference("comment"); if (acceptedDefectsQuantity.getFieldValue() != null) { && entity.getField("effectiveDateFrom") == null) {if (isNumber(acceptedDefectsQuantity.getFieldValue().toString()) && entity.setField("effectiveDateFrom", new Date()); new BigDecimal(acceptedDefectsQuantity.getFieldValue().toString())).compareTo(BigDecimal.ZERO) > 0) { entity.setField("startWorker", securityService.getCurrentUserName()); } comment.setRequired(true); if ("03done".equals(entity.getField("state")) && entity.getField("effectiveDateTo") == null) } else { entity.setField("effectiveDateTo", new Date() comment.setRequired(false); entity.setField("endWorker", securityService.getCurrentUserName());} } } |
Anchor | ||||
---|---|---|---|---|
|
3.
...
4 Row style resolver example
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public voidSet<String> checkIfCommentIsRequiredBasedOnResultproductsListRowStyleResolver(final ViewDefinitionStateEntity stateproduct) { final FieldComponentStateSet<String> commententityStyles = (FieldComponentState) state.getComponentByReference("comment"Sets.newHashSet(); final FieldComponentStateString controlResultmaterialType = (FieldComponentState) state.getComponentByReference("controlResult"); product.getStringField(ProductFields.GLOBAL_TYPE_OF_MATERIAL); if ("04waste".equals(materialType)) { if (controlResult != null && controlResult.getFieldValue() != null && "03objection".equals(controlResult.getFieldValue())) { entityStyles.add(RowStyle.RED_BACKGROUND); } comment.setRequired(true);if (StringUtils.isBlank(product.getStringField(ProductFields.EAN))) { commententityStyles.requestComponentUpdateStateadd(RowStyle.BOLD_FONT); } else { return entityStyles; comment.setRequired(false); } |
Anchor | ||||
---|---|---|---|---|
|
3.5 Criteria modifier example
Single parameter example:
Code Block theme Eclipse language java linenumbers true public void filterOutNotBelongingToCurrentUser(final SearchCriteriaBuilder scb) {
...
scb.add(SearchRestrictions.eq("owner", securityService.getCurrentUserName())); }
- Context example:
Models:- Shop
- Chain
- Industry
- Shop hasMany Industries
- Chain hasMany Industries
- Shop belongsTo Chain
Target: In industires lookup in shop details view show only industires that are in relation with chain of the shop.
Code Block theme Eclipse language
...
html/xml linenumbers true <view name="shopDetails" modelName="shop" ...> <component type="window" name="window"> ...
...
...
<component type="form" name="form" reference="form">
...
...
...
...
...
...
...
...
...
...
...
<component type="lookup" name="industry" reference="industryLookup" field="industries"
...
defaultVisible="false" persistent="false" hasLabel="false">
...
...
...
...
...
...
...
...
...
...
<criteriaModifier class="com.qcadoo.sdt.basic.criteriaModifiers.ShopIndustryLookupCriteriaModifier" method="restrictIndustriesToChainContext" />
...
...
...
...
...
...
...
</component> ...
...
</component>
...
...
...
</component> <hooks> <beforeRender class="com.qcadoo.sdt.basic.hooks.view.ShopDetailsBeforeRenderService" method="setCriteriaModifierParameters"/> </hooks> </view>
...
Code Block theme Eclipse language java linenumbers true @Service public class ShopDetailsBeforeRenderService { public void setCriteriaModifierParameters(final ViewDefinitionState
...
state) {
...
LookupComponent industryLookup =
...
3.4 Row style resolver example
...
theme | Eclipse |
---|---|
language | java |
linenumbers | true |
...
(LookupComponent) state.getComponentByReference("industryLookup"); FormComponent form = (FormComponent) state.getComponentByReference("form"); Entity shop = form.getEntity(); if (shop.getId() !=
...
null)
...
{
...
...
...
...
...
Entity
...
chain =
...
shop.
...
getBelongsToField(
...
ShopFields.
...
CHAIN_FIELD); FilterValueHolder holder
...
= industryLookup.getFilterValue();
...
holder.
...
put(ShopIndustryLookupCriteriaModifier.CHAIN_PARAMETER, chain.getId());
...
...
industryLookup.setFilterValue(holder); }
...
3.5 Criteria modifier example
...
theme | Eclipse |
---|---|
language | java |
linenumbers | true |
...
} }
Code Block theme Eclipse language java linenumbers true @Service public class ShopIndustryLookupCriteriaModifier { public static final String CHAIN_PARAMETER = "chain"; private static final String CHAIN_REQUIRED = "Chain parameter is required"; public void restrictIndustriesToChainContext(final SearchCriteriaBuilder scb, final FilterValueHolder filterValue){ if(!filterValue.has(CHAIN_PARAMETER)){ throw new IllegalArgumentException(CHAIN_REQUIRED); } Long chainId = filterValue.getLong(CHAIN_PARAMETER); scb.createAlias(IndustryFields.CHAINS_FIELD, "c").add(SearchRestrictions.eq("
...
c.id",
...
chainId)); }
...
}