<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- We need a doctype to allow us to use special characters like
We use a "strict" DTD to make IE follow the alignment rules. -->
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
<body class="container">
<h3>Mixins</h3>
<noscript class="js-recommended">
${message:javascript_recommended}
</noscript>
Mixins, also known as Component Mixins, add behaviour to components. Tapestry has several built-in mixins.<br/>
Here we use the built-in mixin
<a href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/mixins/OverrideFieldFocus.html">OverrideFieldFocus</a>
to add behaviour to a TextField.
<div class="eg">
<t:form t:id="names" class="form-horizontal">
<div class="form-group">
<t:label for="firstName" class="col-sm-2"/>
<div class="col-sm-4">
<t:textfield t:id="firstName"/>
</div>
</div>
<div class="form-group">
<t:label for="lastName" class="col-sm-2"/>
<div class="col-sm-4">
<t:textfield t:id="lastName" t:mixins="OverrideFieldFocus"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<t:submit/>
</div>
</div>
</t:form>
</div>
To create your own mixins see the next example.<br/><br/>
References:
<a href="http://tapestry.apache.org/component-mixins.html">Component Mixins</a>,
<a href="http://tapestry.apache.org/built-in-mixins.html">Built-in Mixins</a>,
<a href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/mixins/OverrideFieldFocus.html">OverrideFieldFocus</a>.<br/><br/>
<t:pagelink page="Index">Home</t:pagelink><br/><br/>
<t:tabgroup>
<t:sourcecodetab src="/web/src/main/java/jumpstart/web/pages/examples/lang/Mixins.tml"/>
<t:sourcecodetab src="/web/src/main/java/jumpstart/web/pages/examples/lang/Mixins.java"/>
<t:sourcecodetab src="/web/src/main/resources/META-INF/assets/css/examples/js.css"/>
</t:tabgroup>
</body>
</html>
package jumpstart.web.pages.examples.lang;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.TextField;
@Import(stylesheet = "css/examples/js.css")
public class Mixins {
// Screen fields
@Property
@NotNull
@Size(max = 10)
private String firstName;
@Property
@NotNull
@Size(max = 10)
private String lastName;
// Generally useful bits and pieces
@InjectComponent("names")
private Form form;
@InjectComponent("firstName")
private TextField firstNameField;
// The code
void onValidateFromNames() {
// Note, this method is triggered even if server-side validation has already found error(s).
if (firstName != null && firstName.equals("Acme")) {
form.recordError(firstNameField, "First Name must not be Acme.");
}
}
Object onSuccess() {
// In a real application we would go to the next page.
return null;
}
}
.eg {
margin: 20px 0;
padding: 14px;
color: #888;
border: 1px solid #ddd;
border-radius: 6px;
-webkit-border-radius: 6px;
-mox-border-radius: 6px;
}
.js-required {
color: red;
display: block;
margin-bottom: 14px;
}
.js-recommended {
color: red;
display: block;
margin-bottom: 14px;
}