You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Inge Solvoll <in...@gmail.com> on 2009/04/01 12:50:03 UTC
T5: Maxlength mixin for textareas and text fields
Hi!
I would like to share another mixin with you guys. Most of you probably know
how easy it is to create these, but maybe this can help beginners in
understanding things. I really love the mixin concept, it makes it so very
very easy to separate concerns in the view layer.
The mixin code below prevents the user from entering more in a text field
than you want him to do. It adds a required "max" parameter to the
containing component, which can be any input element with a value property,
really. But it probably only makes sense in a text field and a text area. An
optional counter box is displayed below the textarea, for keeping track of
remaining space.
USAGE: <textarea t:type="textarea" value="someProperty" rows="9"
t:mixins="maxlength" max="50"
/**
* Enforces maxlength on a textfield or a textarea
*
* @author Inge
*
*/
@IncludeJavaScriptLibrary("MaxLength.js")
public class MaxLength {
@InjectContainer
private ClientElement container;
@Parameter(required=true)
private int max;
@Parameter("true")
private boolean displayCounter;
@Environmental
private RenderSupport renderSupport;
void afterRender(MarkupWriter writer) {
String id = container.getClientId();
writer.element("div", "id", id + "-counter-container");
if (!displayCounter) {
writer.attributes("style", "display: none");
}
writer.element("input", "type", "text", "id", id + "-counter",
"disabled", "disabled", "size", "3");
writer.end();
writer.end();
renderSupport.addScript("new MaxLength('%s', %s)", id, max);
}
}
Javascript MaxLength.js, put in the same package as the java file:
var MaxLength = Class.create();
MaxLength.prototype = {
initialize: function(id, max) {
this.max = max;
this.element = $(id);
this.element.observe('keyup', this.keyup.bindAsEventListener(this));
this.counterElement = $(id + "_counter");
this.updateCounter();
},
keyup: function(event) {
if (this.element.value.length > this.max) {
this.element.value = this.element.value.substring(0, this.max);
}
this.updateCounter();
},
updateCounter: function() {
var currentLength = this.element.value.length;
this.counterElement.value = (this.max - currentLength);
}
}
Re: T5: Maxlength mixin for textareas and text fields
Posted by Andy Pahne <an...@gmail.com>.
Great one, thank you...
Andy
Inge Solvoll schrieb:
> Hi!
>
> I would like to share another mixin with you guys. Most of you probably know
> how easy it is to create these, but maybe this can help beginners in
> understanding things. I really love the mixin concept, it makes it so very
> very easy to separate concerns in the view layer.
>
> The mixin code below prevents the user from entering more in a text field
> than you want him to do. It adds a required "max" parameter to the
> containing component, which can be any input element with a value property,
> really. But it probably only makes sense in a text field and a text area. An
> optional counter box is displayed below the textarea, for keeping track of
> remaining space.
>
> USAGE: <textarea t:type="textarea" value="someProperty" rows="9"
> t:mixins="maxlength" max="50"
>
> /**
> * Enforces maxlength on a textfield or a textarea
> *
> * @author Inge
> *
> */
> @IncludeJavaScriptLibrary("MaxLength.js")
> public class MaxLength {
>
> @InjectContainer
> private ClientElement container;
>
> @Parameter(required=true)
> private int max;
>
> @Parameter("true")
> private boolean displayCounter;
>
> @Environmental
> private RenderSupport renderSupport;
>
> void afterRender(MarkupWriter writer) {
> String id = container.getClientId();
> writer.element("div", "id", id + "-counter-container");
> if (!displayCounter) {
> writer.attributes("style", "display: none");
> }
> writer.element("input", "type", "text", "id", id + "-counter",
> "disabled", "disabled", "size", "3");
> writer.end();
> writer.end();
> renderSupport.addScript("new MaxLength('%s', %s)", id, max);
> }
> }
>
> Javascript MaxLength.js, put in the same package as the java file:
>
> var MaxLength = Class.create();
>
> MaxLength.prototype = {
> initialize: function(id, max) {
> this.max = max;
> this.element = $(id);
> this.element.observe('keyup', this.keyup.bindAsEventListener(this));
> this.counterElement = $(id + "_counter");
> this.updateCounter();
> },
> keyup: function(event) {
> if (this.element.value.length > this.max) {
> this.element.value = this.element.value.substring(0, this.max);
> }
> this.updateCounter();
> },
> updateCounter: function() {
> var currentLength = this.element.value.length;
> this.counterElement.value = (this.max - currentLength);
> }
> }
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org