Issues with Label Components with Tapestry 4.0

View: New views
11 Messages — Rating Filter:   Alert me  

Issues with Label Components with Tapestry 4.0

by mraible@virtuas :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I have two different "Label" components I'm trying to create.

Issue #1
---------------------------
The first is a simple component (just a Label.jwc and Label.html file in
WEB-INF) that writes a <label>.  I'd like to include the option to write
a "required" indicator.  However, I'm having a difficult time retrieving
a parameter's value.  Here's what I have so far:

Label.jwc
<component-specification allow-informal-parameters="yes">
    <parameter name="key" required="yes"/>
    <parameter name="class" required="no"/>
    <component id="label" type="Any" inherit-informal-parameters="yes"/>
</component-specification>

Label.html
<label jwcid="label"><span jwcid="@Insert"
value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
condition="ognl:class == 'required'"><span class="req"> *</span></label>

I'm pretty sure "class" won't work as a parameter name b/c I've seen a
stacktrace using this already.  Regardless, let's pretend it does (I've
tried using other names).  Here's the desired usage:

<label class="required desc" jwcid="@Label" for="phoneNumber"
key="user.phoneNumber">Phone Number</label> produces:

<label class="desc" jwcid="@Label" for="phoneNumber">Phone Number<span
class="req"> *</label>

I'm fine with the result having class="required desc" - I basically just
need some indicator to show a field is required when I'm not wiring up
it's input field as a component.

Issue #2
---------------------------
I'm overriding ValidationDelegate in order to add required field
indicators.  I used to be pre-pending an asterisk to the beginning of
the field, and I had that working.  Now I want to add <span class="req">
to the end of the <label> before the </label> shows up.  I'm using
@FieldLabel and everything *almost* works. I've eliminating error
styling in the class below so it's easier to read.

public class Validator extends ValidationDelegate {
    public void writeLabelSuffix(IFormComponent component,
                                 IMarkupWriter writer, IRequestCycle
cycle) {
        if (component.isRequired()) {
            writer.begin("span");
            writer.attribute("class", "req");
            writer.printRaw(" *");
            writer.end();
        }
    }

The code above results in <label>blah blah</label><span class="req">
*</span>, when I'd rather have the <span> w/in the <label>.  I tried
overriding writeLabelAttributes(), but that doesn't seem to allow me to
create a new tag and write it out w/in the label.  Am I missing
something here?  Has anyone done something like this - or knows how to
add a <span> withing an @FieldLabel?

Thanks,

Matt




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by mraible@virtuas :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hmmm, I'm guessing the answers to my questions below are "no, this isn't
possible." ;-)

Here's another question - is it possible in my custom Validator to get
the existing CSS classes on a component?  For example, I currently have:

    public void writeLabelAttributes(IMarkupWriter writer, IRequestCycle
cycle, IFormComponent component) {
        if (isInError(component)) {
            writer.attribute("class", "error");
        }
    }

    public void writeAttributes(IMarkupWriter writer, IRequestCycle cycle,
                                IFormComponent component, IValidator
validator) {
        if (isInError()) {
            writer.attribute("class", "error");
        }
    }

But I'd prefer to have something like this:

    public void writeLabelAttributes(IMarkupWriter writer, IRequestCycle
cycle, IFormComponent component) {
        if (isInError(component)) {
            writer.attribute("class", "error " +
component.getAttribute("class"));
        }
    }

    public void writeAttributes(IMarkupWriter writer, IRequestCycle cycle,
                                IFormComponent component, IValidator
validator) {
        if (isInError()) {
            writer.attribute("class", "error " +
component.getAttribute("class"));
        }
    }

In other words, is there a method on component that allows me to get the
current CSS classes?

Matt

Matt Raible wrote:

> I have two different "Label" components I'm trying to create.
> Issue #1
> ---------------------------
> The first is a simple component (just a Label.jwc and Label.html file
> in WEB-INF) that writes a <label>.  I'd like to include the option to
> write a "required" indicator.  However, I'm having a difficult time
> retrieving a parameter's value.  Here's what I have so far:
>
> Label.jwc
> <component-specification allow-informal-parameters="yes">
>    <parameter name="key" required="yes"/>
>    <parameter name="class" required="no"/>
>    <component id="label" type="Any" inherit-informal-parameters="yes"/>
> </component-specification>
>
> Label.html
> <label jwcid="label"><span jwcid="@Insert"
> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
> condition="ognl:class == 'required'"><span class="req"> *</span></label>
>
> I'm pretty sure "class" won't work as a parameter name b/c I've seen a
> stacktrace using this already.  Regardless, let's pretend it does
> (I've tried using other names).  Here's the desired usage:
>
> <label class="required desc" jwcid="@Label" for="phoneNumber"
> key="user.phoneNumber">Phone Number</label> produces:
>
> <label class="desc" jwcid="@Label" for="phoneNumber">Phone Number<span
> class="req"> *</label>
>
> I'm fine with the result having class="required desc" - I basically
> just need some indicator to show a field is required when I'm not
> wiring up it's input field as a component.
>
> Issue #2
> ---------------------------
> I'm overriding ValidationDelegate in order to add required field
> indicators.  I used to be pre-pending an asterisk to the beginning of
> the field, and I had that working.  Now I want to add <span
> class="req"> to the end of the <label> before the </label> shows up.  
> I'm using @FieldLabel and everything *almost* works. I've eliminating
> error styling in the class below so it's easier to read.
>
> public class Validator extends ValidationDelegate {
>    public void writeLabelSuffix(IFormComponent component,
>                                 IMarkupWriter writer, IRequestCycle
> cycle) {
>        if (component.isRequired()) {
>            writer.begin("span");
>            writer.attribute("class", "req");
>            writer.printRaw(" *");
>            writer.end();
>        }
>    }
>
> The code above results in <label>blah blah</label><span class="req">
> *</span>, when I'd rather have the <span> w/in the <label>.  I tried
> overriding writeLabelAttributes(), but that doesn't seem to allow me
> to create a new tag and write it out w/in the label.  Am I missing
> something here?  Has anyone done something like this - or knows how to
> add a <span> withing an @FieldLabel?
>
> Thanks,
>
> Matt
>
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by Andreas Andreou-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

try component.getBinding("class")
if that's not null, do a getObject() on it

Matt Raible wrote:

> Hmmm, I'm guessing the answers to my questions below are "no, this
> isn't possible." ;-)
>
> Here's another question - is it possible in my custom Validator to get
> the existing CSS classes on a component?  For example, I currently have:
>
>    public void writeLabelAttributes(IMarkupWriter writer,
> IRequestCycle cycle, IFormComponent component) {
>        if (isInError(component)) {
>            writer.attribute("class", "error");
>        }
>    }
>
>    public void writeAttributes(IMarkupWriter writer, IRequestCycle cycle,
>                                IFormComponent component, IValidator
> validator) {
>        if (isInError()) {
>            writer.attribute("class", "error");
>        }
>    }
>
> But I'd prefer to have something like this:
>
>    public void writeLabelAttributes(IMarkupWriter writer,
> IRequestCycle cycle, IFormComponent component) {
>        if (isInError(component)) {
>            writer.attribute("class", "error " +
> component.getAttribute("class"));
>        }
>    }
>
>    public void writeAttributes(IMarkupWriter writer, IRequestCycle cycle,
>                                IFormComponent component, IValidator
> validator) {
>        if (isInError()) {
>            writer.attribute("class", "error " +
> component.getAttribute("class"));
>        }
>    }
>
> In other words, is there a method on component that allows me to get
> the current CSS classes?
>
> Matt
>
> Matt Raible wrote:
>
>> I have two different "Label" components I'm trying to create.
>> Issue #1
>> ---------------------------
>> The first is a simple component (just a Label.jwc and Label.html file
>> in WEB-INF) that writes a <label>.  I'd like to include the option to
>> write a "required" indicator.  However, I'm having a difficult time
>> retrieving a parameter's value.  Here's what I have so far:
>>
>> Label.jwc
>> <component-specification allow-informal-parameters="yes">
>>    <parameter name="key" required="yes"/>
>>    <parameter name="class" required="no"/>
>>    <component id="label" type="Any" inherit-informal-parameters="yes"/>
>> </component-specification>
>>
>> Label.html
>> <label jwcid="label"><span jwcid="@Insert"
>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
>> condition="ognl:class == 'required'"><span class="req"> *</span></label>
>>
>> I'm pretty sure "class" won't work as a parameter name b/c I've seen
>> a stacktrace using this already.  Regardless, let's pretend it does
>> (I've tried using other names).  Here's the desired usage:
>>
>> <label class="required desc" jwcid="@Label" for="phoneNumber"
>> key="user.phoneNumber">Phone Number</label> produces:
>>
>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone
>> Number<span class="req"> *</label>
>>
>> I'm fine with the result having class="required desc" - I basically
>> just need some indicator to show a field is required when I'm not
>> wiring up it's input field as a component.
>>
>> Issue #2
>> ---------------------------
>> I'm overriding ValidationDelegate in order to add required field
>> indicators.  I used to be pre-pending an asterisk to the beginning of
>> the field, and I had that working.  Now I want to add <span
>> class="req"> to the end of the <label> before the </label> shows up.  
>> I'm using @FieldLabel and everything *almost* works. I've eliminating
>> error styling in the class below so it's easier to read.
>>
>> public class Validator extends ValidationDelegate {
>>    public void writeLabelSuffix(IFormComponent component,
>>                                 IMarkupWriter writer, IRequestCycle
>> cycle) {
>>        if (component.isRequired()) {
>>            writer.begin("span");
>>            writer.attribute("class", "req");
>>            writer.printRaw(" *");
>>            writer.end();
>>        }
>>    }
>>
>> The code above results in <label>blah blah</label><span class="req">
>> *</span>, when I'd rather have the <span> w/in the <label>.  I tried
>> overriding writeLabelAttributes(), but that doesn't seem to allow me
>> to create a new tag and write it out w/in the label.  Am I missing
>> something here?  Has anyone done something like this - or knows how
>> to add a <span> withing an @FieldLabel?
>>
>> Thanks,
>>
>> Matt
>>
>>
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by mraible@virtuas :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Andreas Andreou wrote:

> try component.getBinding("class")
> if that's not null, do a getObject() on it

Thanks.  This works, but it also prints out duplicate "class" attributes.

class="text large error" class="text large"


It'd be nice to have something like:

writer.appendAttribute("class", "values to append");

Another question - it seems my full <label> and <input> is getting
wrapped with

<font color="red">

Is there anyway to get rid of that?  It's problematic b/c the closing
</font> isn't getting rendered until right before </form>.

Thanks,

Matt

>
> Matt Raible wrote:
>
>> Hmmm, I'm guessing the answers to my questions below are "no, this
>> isn't possible." ;-)
>>
>> Here's another question - is it possible in my custom Validator to
>> get the existing CSS classes on a component?  For example, I
>> currently have:
>>
>>    public void writeLabelAttributes(IMarkupWriter writer,
>> IRequestCycle cycle, IFormComponent component) {
>>        if (isInError(component)) {
>>            writer.attribute("class", "error");
>>        }
>>    }
>>
>>    public void writeAttributes(IMarkupWriter writer, IRequestCycle
>> cycle,
>>                                IFormComponent component, IValidator
>> validator) {
>>        if (isInError()) {
>>            writer.attribute("class", "error");
>>        }
>>    }
>>
>> But I'd prefer to have something like this:
>>
>>    public void writeLabelAttributes(IMarkupWriter writer,
>> IRequestCycle cycle, IFormComponent component) {
>>        if (isInError(component)) {
>>            writer.attribute("class", "error " +
>> component.getAttribute("class"));
>>        }
>>    }
>>
>>    public void writeAttributes(IMarkupWriter writer, IRequestCycle
>> cycle,
>>                                IFormComponent component, IValidator
>> validator) {
>>        if (isInError()) {
>>            writer.attribute("class", "error " +
>> component.getAttribute("class"));
>>        }
>>    }
>>
>> In other words, is there a method on component that allows me to get
>> the current CSS classes?
>>
>> Matt
>>
>> Matt Raible wrote:
>>
>>> I have two different "Label" components I'm trying to create.
>>> Issue #1
>>> ---------------------------
>>> The first is a simple component (just a Label.jwc and Label.html
>>> file in WEB-INF) that writes a <label>.  I'd like to include the
>>> option to write a "required" indicator.  However, I'm having a
>>> difficult time retrieving a parameter's value.  Here's what I have
>>> so far:
>>>
>>> Label.jwc
>>> <component-specification allow-informal-parameters="yes">
>>>    <parameter name="key" required="yes"/>
>>>    <parameter name="class" required="no"/>
>>>    <component id="label" type="Any" inherit-informal-parameters="yes"/>
>>> </component-specification>
>>>
>>> Label.html
>>> <label jwcid="label"><span jwcid="@Insert"
>>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
>>> condition="ognl:class == 'required'"><span class="req">
>>> *</span></label>
>>>
>>> I'm pretty sure "class" won't work as a parameter name b/c I've seen
>>> a stacktrace using this already.  Regardless, let's pretend it does
>>> (I've tried using other names).  Here's the desired usage:
>>>
>>> <label class="required desc" jwcid="@Label" for="phoneNumber"
>>> key="user.phoneNumber">Phone Number</label> produces:
>>>
>>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone
>>> Number<span class="req"> *</label>
>>>
>>> I'm fine with the result having class="required desc" - I basically
>>> just need some indicator to show a field is required when I'm not
>>> wiring up it's input field as a component.
>>>
>>> Issue #2
>>> ---------------------------
>>> I'm overriding ValidationDelegate in order to add required field
>>> indicators.  I used to be pre-pending an asterisk to the beginning
>>> of the field, and I had that working.  Now I want to add <span
>>> class="req"> to the end of the <label> before the </label> shows
>>> up.  I'm using @FieldLabel and everything *almost* works. I've
>>> eliminating error styling in the class below so it's easier to read.
>>>
>>> public class Validator extends ValidationDelegate {
>>>    public void writeLabelSuffix(IFormComponent component,
>>>                                 IMarkupWriter writer, IRequestCycle
>>> cycle) {
>>>        if (component.isRequired()) {
>>>            writer.begin("span");
>>>            writer.attribute("class", "req");
>>>            writer.printRaw(" *");
>>>            writer.end();
>>>        }
>>>    }
>>>
>>> The code above results in <label>blah blah</label><span class="req">
>>> *</span>, when I'd rather have the <span> w/in the <label>.  I tried
>>> overriding writeLabelAttributes(), but that doesn't seem to allow me
>>> to create a new tag and write it out w/in the label.  Am I missing
>>> something here?  Has anyone done something like this - or knows how
>>> to add a <span> withing an @FieldLabel?
>>>
>>> Thanks,
>>>
>>> Matt
>>>
>>>
>>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@...
>> For additional commands, e-mail: users-help@...
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by mraible@virtuas :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Matt Raible wrote:

> Andreas Andreou wrote:
>
>> try component.getBinding("class")
>> if that's not null, do a getObject() on it
>
>
> Thanks.  This works, but it also prints out duplicate "class" attributes.
>
> class="text large error" class="text large"
>
>
> It'd be nice to have something like:
>
> writer.appendAttribute("class", "values to append");
>
> Another question - it seems my full <label> and <input> is getting
> wrapped with
>
> <font color="red">
>
> Is there anyway to get rid of that?  It's problematic b/c the closing
> </font> isn't getting rendered until right before </form>.

Fixed this by using:

    public void writeLabelPrefix(IFormComponent component,
                                 IMarkupWriter writer, IRequestCycle
cycle) {
        // does nothing put prevent <font color="red"> from getting written
    }

>
> Thanks,
>
> Matt
>
>>
>> Matt Raible wrote:
>>
>>> Hmmm, I'm guessing the answers to my questions below are "no, this
>>> isn't possible." ;-)
>>>
>>> Here's another question - is it possible in my custom Validator to
>>> get the existing CSS classes on a component?  For example, I
>>> currently have:
>>>
>>>    public void writeLabelAttributes(IMarkupWriter writer,
>>> IRequestCycle cycle, IFormComponent component) {
>>>        if (isInError(component)) {
>>>            writer.attribute("class", "error");
>>>        }
>>>    }
>>>
>>>    public void writeAttributes(IMarkupWriter writer, IRequestCycle
>>> cycle,
>>>                                IFormComponent component, IValidator
>>> validator) {
>>>        if (isInError()) {
>>>            writer.attribute("class", "error");
>>>        }
>>>    }
>>>
>>> But I'd prefer to have something like this:
>>>
>>>    public void writeLabelAttributes(IMarkupWriter writer,
>>> IRequestCycle cycle, IFormComponent component) {
>>>        if (isInError(component)) {
>>>            writer.attribute("class", "error " +
>>> component.getAttribute("class"));
>>>        }
>>>    }
>>>
>>>    public void writeAttributes(IMarkupWriter writer, IRequestCycle
>>> cycle,
>>>                                IFormComponent component, IValidator
>>> validator) {
>>>        if (isInError()) {
>>>            writer.attribute("class", "error " +
>>> component.getAttribute("class"));
>>>        }
>>>    }
>>>
>>> In other words, is there a method on component that allows me to get
>>> the current CSS classes?
>>>
>>> Matt
>>>
>>> Matt Raible wrote:
>>>
>>>> I have two different "Label" components I'm trying to create.
>>>> Issue #1
>>>> ---------------------------
>>>> The first is a simple component (just a Label.jwc and Label.html
>>>> file in WEB-INF) that writes a <label>.  I'd like to include the
>>>> option to write a "required" indicator.  However, I'm having a
>>>> difficult time retrieving a parameter's value.  Here's what I have
>>>> so far:
>>>>
>>>> Label.jwc
>>>> <component-specification allow-informal-parameters="yes">
>>>>    <parameter name="key" required="yes"/>
>>>>    <parameter name="class" required="no"/>
>>>>    <component id="label" type="Any"
>>>> inherit-informal-parameters="yes"/>
>>>> </component-specification>
>>>>
>>>> Label.html
>>>> <label jwcid="label"><span jwcid="@Insert"
>>>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
>>>> condition="ognl:class == 'required'"><span class="req">
>>>> *</span></label>
>>>>
>>>> I'm pretty sure "class" won't work as a parameter name b/c I've
>>>> seen a stacktrace using this already.  Regardless, let's pretend it
>>>> does (I've tried using other names).  Here's the desired usage:
>>>>
>>>> <label class="required desc" jwcid="@Label" for="phoneNumber"
>>>> key="user.phoneNumber">Phone Number</label> produces:
>>>>
>>>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone
>>>> Number<span class="req"> *</label>
>>>>
>>>> I'm fine with the result having class="required desc" - I basically
>>>> just need some indicator to show a field is required when I'm not
>>>> wiring up it's input field as a component.
>>>>
>>>> Issue #2
>>>> ---------------------------
>>>> I'm overriding ValidationDelegate in order to add required field
>>>> indicators.  I used to be pre-pending an asterisk to the beginning
>>>> of the field, and I had that working.  Now I want to add <span
>>>> class="req"> to the end of the <label> before the </label> shows
>>>> up.  I'm using @FieldLabel and everything *almost* works. I've
>>>> eliminating error styling in the class below so it's easier to read.
>>>>
>>>> public class Validator extends ValidationDelegate {
>>>>    public void writeLabelSuffix(IFormComponent component,
>>>>                                 IMarkupWriter writer, IRequestCycle
>>>> cycle) {
>>>>        if (component.isRequired()) {
>>>>            writer.begin("span");
>>>>            writer.attribute("class", "req");
>>>>            writer.printRaw(" *");
>>>>            writer.end();
>>>>        }
>>>>    }
>>>>
>>>> The code above results in <label>blah blah</label><span
>>>> class="req"> *</span>, when I'd rather have the <span> w/in the
>>>> <label>.  I tried overriding writeLabelAttributes(), but that
>>>> doesn't seem to allow me to create a new tag and write it out w/in
>>>> the label.  Am I missing something here?  Has anyone done something
>>>> like this - or knows how to add a <span> withing an @FieldLabel?
>>>>
>>>> Thanks,
>>>>
>>>> Matt
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@...
>>> For additional commands, e-mail: users-help@...
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@...
>> For additional commands, e-mail: users-help@...
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by Ryan Holmes :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Your problem getting the span tag where you want it is due to how the
FieldLabel component renders itself. Here's the relevant part of
FieldLabel.renderComponent():

        delegate.writeLabelPrefix(field, writer, cycle);
        writer.begin("label");
        if (id != null)
            writer.attribute("for", id);
        delegate.writeLabelAttributes(writer, cycle, field);
        renderInformalParameters(writer, cycle);
        writer.print(displayName, getRaw());
        writer.end();
        delegate.writeLabelSuffix(field, writer, cycle);


You could argue that writeLabelPrefix() and writeLabelSuffix() should
both be inside the <label> tag (makes sense to me), but the current code
is symmetrical and not necessarily "wrong." Your best bet is probably to
override the FieldLabel component with your own version that renders the
delegate prefix and/or suffix inside the label tag. And I'm sure you
won't hesitate to file a bug report if you  feel strongly about it ;)

-Ryan


Matt Raible wrote:

> Matt Raible wrote:
>
>> Andreas Andreou wrote:
>>
>>> try component.getBinding("class")
>>> if that's not null, do a getObject() on it
>>
>>
>>
>> Thanks.  This works, but it also prints out duplicate "class"
>> attributes.
>>
>> class="text large error" class="text large"
>>
>>
>> It'd be nice to have something like:
>>
>> writer.appendAttribute("class", "values to append");
>>
>> Another question - it seems my full <label> and <input> is getting
>> wrapped with
>>
>> <font color="red">
>>
>> Is there anyway to get rid of that?  It's problematic b/c the closing
>> </font> isn't getting rendered until right before </form>.
>
>
> Fixed this by using:
>
>    public void writeLabelPrefix(IFormComponent component,
>                                 IMarkupWriter writer, IRequestCycle
> cycle) {
>        // does nothing put prevent <font color="red"> from getting
> written
>    }
>
>>
>> Thanks,
>>
>> Matt
>>
>>>
>>> Matt Raible wrote:
>>>
>>>> Hmmm, I'm guessing the answers to my questions below are "no, this
>>>> isn't possible." ;-)
>>>>
>>>> Here's another question - is it possible in my custom Validator to
>>>> get the existing CSS classes on a component?  For example, I
>>>> currently have:
>>>>
>>>>    public void writeLabelAttributes(IMarkupWriter writer,
>>>> IRequestCycle cycle, IFormComponent component) {
>>>>        if (isInError(component)) {
>>>>            writer.attribute("class", "error");
>>>>        }
>>>>    }
>>>>
>>>>    public void writeAttributes(IMarkupWriter writer, IRequestCycle
>>>> cycle,
>>>>                                IFormComponent component, IValidator
>>>> validator) {
>>>>        if (isInError()) {
>>>>            writer.attribute("class", "error");
>>>>        }
>>>>    }
>>>>
>>>> But I'd prefer to have something like this:
>>>>
>>>>    public void writeLabelAttributes(IMarkupWriter writer,
>>>> IRequestCycle cycle, IFormComponent component) {
>>>>        if (isInError(component)) {
>>>>            writer.attribute("class", "error " +
>>>> component.getAttribute("class"));
>>>>        }
>>>>    }
>>>>
>>>>    public void writeAttributes(IMarkupWriter writer, IRequestCycle
>>>> cycle,
>>>>                                IFormComponent component, IValidator
>>>> validator) {
>>>>        if (isInError()) {
>>>>            writer.attribute("class", "error " +
>>>> component.getAttribute("class"));
>>>>        }
>>>>    }
>>>>
>>>> In other words, is there a method on component that allows me to
>>>> get the current CSS classes?
>>>>
>>>> Matt
>>>>
>>>> Matt Raible wrote:
>>>>
>>>>> I have two different "Label" components I'm trying to create.
>>>>> Issue #1
>>>>> ---------------------------
>>>>> The first is a simple component (just a Label.jwc and Label.html
>>>>> file in WEB-INF) that writes a <label>.  I'd like to include the
>>>>> option to write a "required" indicator.  However, I'm having a
>>>>> difficult time retrieving a parameter's value.  Here's what I have
>>>>> so far:
>>>>>
>>>>> Label.jwc
>>>>> <component-specification allow-informal-parameters="yes">
>>>>>    <parameter name="key" required="yes"/>
>>>>>    <parameter name="class" required="no"/>
>>>>>    <component id="label" type="Any"
>>>>> inherit-informal-parameters="yes"/>
>>>>> </component-specification>
>>>>>
>>>>> Label.html
>>>>> <label jwcid="label"><span jwcid="@Insert"
>>>>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
>>>>> condition="ognl:class == 'required'"><span class="req">
>>>>> *</span></label>
>>>>>
>>>>> I'm pretty sure "class" won't work as a parameter name b/c I've
>>>>> seen a stacktrace using this already.  Regardless, let's pretend
>>>>> it does (I've tried using other names).  Here's the desired usage:
>>>>>
>>>>> <label class="required desc" jwcid="@Label" for="phoneNumber"
>>>>> key="user.phoneNumber">Phone Number</label> produces:
>>>>>
>>>>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone
>>>>> Number<span class="req"> *</label>
>>>>>
>>>>> I'm fine with the result having class="required desc" - I
>>>>> basically just need some indicator to show a field is required
>>>>> when I'm not wiring up it's input field as a component.
>>>>>
>>>>> Issue #2
>>>>> ---------------------------
>>>>> I'm overriding ValidationDelegate in order to add required field
>>>>> indicators.  I used to be pre-pending an asterisk to the beginning
>>>>> of the field, and I had that working.  Now I want to add <span
>>>>> class="req"> to the end of the <label> before the </label> shows
>>>>> up.  I'm using @FieldLabel and everything *almost* works. I've
>>>>> eliminating error styling in the class below so it's easier to read.
>>>>>
>>>>> public class Validator extends ValidationDelegate {
>>>>>    public void writeLabelSuffix(IFormComponent component,
>>>>>                                 IMarkupWriter writer,
>>>>> IRequestCycle cycle) {
>>>>>        if (component.isRequired()) {
>>>>>            writer.begin("span");
>>>>>            writer.attribute("class", "req");
>>>>>            writer.printRaw(" *");
>>>>>            writer.end();
>>>>>        }
>>>>>    }
>>>>>
>>>>> The code above results in <label>blah blah</label><span
>>>>> class="req"> *</span>, when I'd rather have the <span> w/in the
>>>>> <label>.  I tried overriding writeLabelAttributes(), but that
>>>>> doesn't seem to allow me to create a new tag and write it out w/in
>>>>> the label.  Am I missing something here?  Has anyone done
>>>>> something like this - or knows how to add a <span> withing an
>>>>> @FieldLabel?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Matt
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@...
>>>> For additional commands, e-mail: users-help@...
>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@...
>>> For additional commands, e-mail: users-help@...
>>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@...
>> For additional commands, e-mail: users-help@...
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by mraible@virtuas :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Is there an easy way to subclass FieldLabel and override the  
renderComponent() method to move writeLabelPrefix and  
writeLabelSuffix to be inside <label>?

Thanks,

Matt

On May 31, 2006, at 2:51 PM, Ryan Holmes wrote:

> Your problem getting the span tag where you want it is due to how  
> the FieldLabel component renders itself. Here's the relevant part  
> of FieldLabel.renderComponent():
>
>        delegate.writeLabelPrefix(field, writer, cycle);
>        writer.begin("label");
>        if (id != null)
>            writer.attribute("for", id);
>        delegate.writeLabelAttributes(writer, cycle, field);
>        renderInformalParameters(writer, cycle);
>        writer.print(displayName, getRaw());
>        writer.end();
>        delegate.writeLabelSuffix(field, writer, cycle);
>
>
> You could argue that writeLabelPrefix() and writeLabelSuffix()  
> should both be inside the <label> tag (makes sense to me), but the  
> current code is symmetrical and not necessarily "wrong." Your best  
> bet is probably to override the FieldLabel component with your own  
> version that renders the delegate prefix and/or suffix inside the  
> label tag. And I'm sure you won't hesitate to file a bug report if  
> you  feel strongly about it ;)
>
> -Ryan
>
>
> Matt Raible wrote:
>
>> Matt Raible wrote:
>>
>>> Andreas Andreou wrote:
>>>
>>>> try component.getBinding("class")
>>>> if that's not null, do a getObject() on it
>>>
>>>
>>>
>>> Thanks.  This works, but it also prints out duplicate "class"  
>>> attributes.
>>>
>>> class="text large error" class="text large"
>>>
>>>
>>> It'd be nice to have something like:
>>>
>>> writer.appendAttribute("class", "values to append");
>>>
>>> Another question - it seems my full <label> and <input> is  
>>> getting wrapped with
>>>
>>> <font color="red">
>>>
>>> Is there anyway to get rid of that?  It's problematic b/c the  
>>> closing </font> isn't getting rendered until right before </form>.
>>
>>
>> Fixed this by using:
>>
>>    public void writeLabelPrefix(IFormComponent component,
>>                                 IMarkupWriter writer,  
>> IRequestCycle cycle) {
>>        // does nothing put prevent <font color="red"> from getting  
>> written
>>    }
>>
>>>
>>> Thanks,
>>>
>>> Matt
>>>
>>>>
>>>> Matt Raible wrote:
>>>>
>>>>> Hmmm, I'm guessing the answers to my questions below are "no,  
>>>>> this isn't possible." ;-)
>>>>>
>>>>> Here's another question - is it possible in my custom Validator  
>>>>> to get the existing CSS classes on a component?  For example, I  
>>>>> currently have:
>>>>>
>>>>>    public void writeLabelAttributes(IMarkupWriter writer,  
>>>>> IRequestCycle cycle, IFormComponent component) {
>>>>>        if (isInError(component)) {
>>>>>            writer.attribute("class", "error");
>>>>>        }
>>>>>    }
>>>>>
>>>>>    public void writeAttributes(IMarkupWriter writer,  
>>>>> IRequestCycle cycle,
>>>>>                                IFormComponent component,  
>>>>> IValidator validator) {
>>>>>        if (isInError()) {
>>>>>            writer.attribute("class", "error");
>>>>>        }
>>>>>    }
>>>>>
>>>>> But I'd prefer to have something like this:
>>>>>
>>>>>    public void writeLabelAttributes(IMarkupWriter writer,  
>>>>> IRequestCycle cycle, IFormComponent component) {
>>>>>        if (isInError(component)) {
>>>>>            writer.attribute("class", "error " +  
>>>>> component.getAttribute("class"));
>>>>>        }
>>>>>    }
>>>>>
>>>>>    public void writeAttributes(IMarkupWriter writer,  
>>>>> IRequestCycle cycle,
>>>>>                                IFormComponent component,  
>>>>> IValidator validator) {
>>>>>        if (isInError()) {
>>>>>            writer.attribute("class", "error " +  
>>>>> component.getAttribute("class"));
>>>>>        }
>>>>>    }
>>>>>
>>>>> In other words, is there a method on component that allows me  
>>>>> to get the current CSS classes?
>>>>>
>>>>> Matt
>>>>>
>>>>> Matt Raible wrote:
>>>>>
>>>>>> I have two different "Label" components I'm trying to create.
>>>>>> Issue #1
>>>>>> ---------------------------
>>>>>> The first is a simple component (just a Label.jwc and  
>>>>>> Label.html file in WEB-INF) that writes a <label>.  I'd like  
>>>>>> to include the option to write a "required" indicator.  
>>>>>> However, I'm having a difficult time retrieving a parameter's  
>>>>>> value.  Here's what I have so far:
>>>>>>
>>>>>> Label.jwc
>>>>>> <component-specification allow-informal-parameters="yes">
>>>>>>    <parameter name="key" required="yes"/>
>>>>>>    <parameter name="class" required="no"/>
>>>>>>    <component id="label" type="Any" inherit-informal-
>>>>>> parameters="yes"/>
>>>>>> </component-specification>
>>>>>>
>>>>>> Label.html
>>>>>> <label jwcid="label"><span jwcid="@Insert"  
>>>>>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"  
>>>>>> condition="ognl:class == 'required'"><span class="req"> *</
>>>>>> span></label>
>>>>>>
>>>>>> I'm pretty sure "class" won't work as a parameter name b/c  
>>>>>> I've seen a stacktrace using this already.  Regardless, let's  
>>>>>> pretend it does (I've tried using other names).  Here's the  
>>>>>> desired usage:
>>>>>>
>>>>>> <label class="required desc" jwcid="@Label" for="phoneNumber"  
>>>>>> key="user.phoneNumber">Phone Number</label> produces:
>>>>>>
>>>>>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone  
>>>>>> Number<span class="req"> *</label>
>>>>>>
>>>>>> I'm fine with the result having class="required desc" - I  
>>>>>> basically just need some indicator to show a field is required  
>>>>>> when I'm not wiring up it's input field as a component.
>>>>>>
>>>>>> Issue #2
>>>>>> ---------------------------
>>>>>> I'm overriding ValidationDelegate in order to add required  
>>>>>> field indicators.  I used to be pre-pending an asterisk to the  
>>>>>> beginning of the field, and I had that working.  Now I want to  
>>>>>> add <span class="req"> to the end of the <label> before the </
>>>>>> label> shows up.  I'm using @FieldLabel and everything  
>>>>>> *almost* works. I've eliminating error styling in the class  
>>>>>> below so it's easier to read.
>>>>>>
>>>>>> public class Validator extends ValidationDelegate {
>>>>>>    public void writeLabelSuffix(IFormComponent component,
>>>>>>                                 IMarkupWriter writer,  
>>>>>> IRequestCycle cycle) {
>>>>>>        if (component.isRequired()) {
>>>>>>            writer.begin("span");
>>>>>>            writer.attribute("class", "req");
>>>>>>            writer.printRaw(" *");
>>>>>>            writer.end();
>>>>>>        }
>>>>>>    }
>>>>>>
>>>>>> The code above results in <label>blah blah</label><span  
>>>>>> class="req"> *</span>, when I'd rather have the <span> w/in  
>>>>>> the <label>.  I tried overriding writeLabelAttributes(), but  
>>>>>> that doesn't seem to allow me to create a new tag and write it  
>>>>>> out w/in the label.  Am I missing something here?  Has anyone  
>>>>>> done something like this - or knows how to add a <span>  
>>>>>> withing an @FieldLabel?
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Matt
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ------------------------------------------------------------------
>>>>> ---
>>>>> To unsubscribe, e-mail: users-unsubscribe@...
>>>>> For additional commands, e-mail: users-help@...
>>>>>
>>>>>
>>>>
>>>> -------------------------------------------------------------------
>>>> --
>>>> To unsubscribe, e-mail: users-unsubscribe@...
>>>> For additional commands, e-mail: users-help@...
>>>>
>>>
>>>
>>>
>>> --------------------------------------------------------------------
>>> -
>>> To unsubscribe, e-mail: users-unsubscribe@...
>>> For additional commands, e-mail: users-help@...
>>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@...
>> For additional commands, e-mail: users-help@...
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by Jessek :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Sure, but at that point you are basically overriding the behaviour provided
by the ValidationDelegate when it does before/after field rendering (not
talking about FieldLabel).

The FieldLabel component already supports informal parameters.

I noticed in your first email you mentioned trying to do this with something
like

<label jwcid="mycompid" class="class1 class2" > and only saw class1 output.

Try doing this instead (though I agree it sounds like a bug somehow):

<label jwcid="mycompid" class="ognl:'class class2'" />

On 6/1/06, Matt Raible <mraible@...> wrote:

>
> Is there an easy way to subclass FieldLabel and override the
> renderComponent() method to move writeLabelPrefix and
> writeLabelSuffix to be inside <label>?
>
> Thanks,
>
> Matt
>
> On May 31, 2006, at 2:51 PM, Ryan Holmes wrote:
>
> > Your problem getting the span tag where you want it is due to how
> > the FieldLabel component renders itself. Here's the relevant part
> > of FieldLabel.renderComponent():
> >
> >        delegate.writeLabelPrefix(field, writer, cycle);
> >        writer.begin("label");
> >        if (id != null)
> >            writer.attribute("for", id);
> >        delegate.writeLabelAttributes(writer, cycle, field);
> >        renderInformalParameters(writer, cycle);
> >        writer.print(displayName, getRaw());
> >        writer.end();
> >        delegate.writeLabelSuffix(field, writer, cycle);
> >
> >
> > You could argue that writeLabelPrefix() and writeLabelSuffix()
> > should both be inside the <label> tag (makes sense to me), but the
> > current code is symmetrical and not necessarily "wrong." Your best
> > bet is probably to override the FieldLabel component with your own
> > version that renders the delegate prefix and/or suffix inside the
> > label tag. And I'm sure you won't hesitate to file a bug report if
> > you  feel strongly about it ;)
> >
> > -Ryan
> >
> >
> > Matt Raible wrote:
> >
> >> Matt Raible wrote:
> >>
> >>> Andreas Andreou wrote:
> >>>
> >>>> try component.getBinding("class")
> >>>> if that's not null, do a getObject() on it
> >>>
> >>>
> >>>
> >>> Thanks.  This works, but it also prints out duplicate "class"
> >>> attributes.
> >>>
> >>> class="text large error" class="text large"
> >>>
> >>>
> >>> It'd be nice to have something like:
> >>>
> >>> writer.appendAttribute("class", "values to append");
> >>>
> >>> Another question - it seems my full <label> and <input> is
> >>> getting wrapped with
> >>>
> >>> <font color="red">
> >>>
> >>> Is there anyway to get rid of that?  It's problematic b/c the
> >>> closing </font> isn't getting rendered until right before </form>.
> >>
> >>
> >> Fixed this by using:
> >>
> >>    public void writeLabelPrefix(IFormComponent component,
> >>                                 IMarkupWriter writer,
> >> IRequestCycle cycle) {
> >>        // does nothing put prevent <font color="red"> from getting
> >> written
> >>    }
> >>
> >>>
> >>> Thanks,
> >>>
> >>> Matt
> >>>
> >>>>
> >>>> Matt Raible wrote:
> >>>>
> >>>>> Hmmm, I'm guessing the answers to my questions below are "no,
> >>>>> this isn't possible." ;-)
> >>>>>
> >>>>> Here's another question - is it possible in my custom Validator
> >>>>> to get the existing CSS classes on a component?  For example, I
> >>>>> currently have:
> >>>>>
> >>>>>    public void writeLabelAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle, IFormComponent component) {
> >>>>>        if (isInError(component)) {
> >>>>>            writer.attribute("class", "error");
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>>    public void writeAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle,
> >>>>>                                IFormComponent component,
> >>>>> IValidator validator) {
> >>>>>        if (isInError()) {
> >>>>>            writer.attribute("class", "error");
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>> But I'd prefer to have something like this:
> >>>>>
> >>>>>    public void writeLabelAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle, IFormComponent component) {
> >>>>>        if (isInError(component)) {
> >>>>>            writer.attribute("class", "error " +
> >>>>> component.getAttribute("class"));
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>>    public void writeAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle,
> >>>>>                                IFormComponent component,
> >>>>> IValidator validator) {
> >>>>>        if (isInError()) {
> >>>>>            writer.attribute("class", "error " +
> >>>>> component.getAttribute("class"));
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>> In other words, is there a method on component that allows me
> >>>>> to get the current CSS classes?
> >>>>>
> >>>>> Matt
> >>>>>
> >>>>> Matt Raible wrote:
> >>>>>
> >>>>>> I have two different "Label" components I'm trying to create.
> >>>>>> Issue #1
> >>>>>> ---------------------------
> >>>>>> The first is a simple component (just a Label.jwc and
> >>>>>> Label.html file in WEB-INF) that writes a <label>.  I'd like
> >>>>>> to include the option to write a "required" indicator.
> >>>>>> However, I'm having a difficult time retrieving a parameter's
> >>>>>> value.  Here's what I have so far:
> >>>>>>
> >>>>>> Label.jwc
> >>>>>> <component-specification allow-informal-parameters="yes">
> >>>>>>    <parameter name="key" required="yes"/>
> >>>>>>    <parameter name="class" required="no"/>
> >>>>>>    <component id="label" type="Any" inherit-informal-
> >>>>>> parameters="yes"/>
> >>>>>> </component-specification>
> >>>>>>
> >>>>>> Label.html
> >>>>>> <label jwcid="label"><span jwcid="@Insert"
> >>>>>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
> >>>>>> condition="ognl:class == 'required'"><span class="req"> *</
> >>>>>> span></label>
> >>>>>>
> >>>>>> I'm pretty sure "class" won't work as a parameter name b/c
> >>>>>> I've seen a stacktrace using this already.  Regardless, let's
> >>>>>> pretend it does (I've tried using other names).  Here's the
> >>>>>> desired usage:
> >>>>>>
> >>>>>> <label class="required desc" jwcid="@Label" for="phoneNumber"
> >>>>>> key="user.phoneNumber">Phone Number</label> produces:
> >>>>>>
> >>>>>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone
> >>>>>> Number<span class="req"> *</label>
> >>>>>>
> >>>>>> I'm fine with the result having class="required desc" - I
> >>>>>> basically just need some indicator to show a field is required
> >>>>>> when I'm not wiring up it's input field as a component.
> >>>>>>
> >>>>>> Issue #2
> >>>>>> ---------------------------
> >>>>>> I'm overriding ValidationDelegate in order to add required
> >>>>>> field indicators.  I used to be pre-pending an asterisk to the
> >>>>>> beginning of the field, and I had that working.  Now I want to
> >>>>>> add <span class="req"> to the end of the <label> before the </
> >>>>>> label> shows up.  I'm using @FieldLabel and everything
> >>>>>> *almost* works. I've eliminating error styling in the class
> >>>>>> below so it's easier to read.
> >>>>>>
> >>>>>> public class Validator extends ValidationDelegate {
> >>>>>>    public void writeLabelSuffix(IFormComponent component,
> >>>>>>                                 IMarkupWriter writer,
> >>>>>> IRequestCycle cycle) {
> >>>>>>        if (component.isRequired()) {
> >>>>>>            writer.begin("span");
> >>>>>>            writer.attribute("class", "req");
> >>>>>>            writer.printRaw(" *");
> >>>>>>            writer.end();
> >>>>>>        }
> >>>>>>    }
> >>>>>>
> >>>>>> The code above results in <label>blah blah</label><span
> >>>>>> class="req"> *</span>, when I'd rather have the <span> w/in
> >>>>>> the <label>.  I tried overriding writeLabelAttributes(), but
> >>>>>> that doesn't seem to allow me to create a new tag and write it
> >>>>>> out w/in the label.  Am I missing something here?  Has anyone
> >>>>>> done something like this - or knows how to add a <span>
> >>>>>> withing an @FieldLabel?
> >>>>>>
> >>>>>> Thanks,
> >>>>>>
> >>>>>> Matt
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> ------------------------------------------------------------------
> >>>>> ---
> >>>>> To unsubscribe, e-mail: users-unsubscribe@...
> >>>>> For additional commands, e-mail: users-help@...
> >>>>>
> >>>>>
> >>>>
> >>>> -------------------------------------------------------------------
> >>>> --
> >>>> To unsubscribe, e-mail: users-unsubscribe@...
> >>>> For additional commands, e-mail: users-help@...
> >>>>
> >>>
> >>>
> >>>
> >>> --------------------------------------------------------------------
> >>> -
> >>> To unsubscribe, e-mail: users-unsubscribe@...
> >>> For additional commands, e-mail: users-help@...
> >>>
> >>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@...
> >> For additional commands, e-mail: users-help@...
> >>
> >>
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@...
> > For additional commands, e-mail: users-help@...
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>
>


--
Jesse Kuhnert
Tacos/Tapestry, team member/developer

Open source based consulting work centered around
dojo/tapestry/tacos/hivemind.

Re: Issues with Label Components with Tapestry 4.0

by mraible :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

My issue isn't with label, it's with the inputs.  I have the following in my custom ValidationDelegate:

    public void writeAttributes(IMarkupWriter writer, IRequestCycle cycle,
                                IFormComponent component, IValidator validator) {
        if (isInError()) {
            String cssClass = ((component.getBinding("class") != null) ?
                                component.getBinding("class").getObject().toString() : "");
            writer.attribute("class", cssClass + " error");
        }
    }

However, rather than just writing a single "class" attribute, it writes two:

class="text large error" class="text large"

Obviously, this is not a big deal, but I would consider it a bug.  As far as overriding FieldLabel, I figured out how to do that.  I'll enter an enhancement request in JIRA to allow writing markup within the <label> tag.

Thanks,

Matt


Jessek wrote:
Sure, but at that point you are basically overriding the behaviour provided
by the ValidationDelegate when it does before/after field rendering (not
talking about FieldLabel).

The FieldLabel component already supports informal parameters.

I noticed in your first email you mentioned trying to do this with something
like

<label jwcid="mycompid" class="class1 class2" > and only saw class1 output.

Try doing this instead (though I agree it sounds like a bug somehow):

<label jwcid="mycompid" class="ognl:'class class2'" />

On 6/1/06, Matt Raible <mraible@virtuas.com> wrote:
>
> Is there an easy way to subclass FieldLabel and override the
> renderComponent() method to move writeLabelPrefix and
> writeLabelSuffix to be inside <label>?
>
> Thanks,
>
> Matt
>
> On May 31, 2006, at 2:51 PM, Ryan Holmes wrote:
>
> > Your problem getting the span tag where you want it is due to how
> > the FieldLabel component renders itself. Here's the relevant part
> > of FieldLabel.renderComponent():
> >
> >        delegate.writeLabelPrefix(field, writer, cycle);
> >        writer.begin("label");
> >        if (id != null)
> >            writer.attribute("for", id);
> >        delegate.writeLabelAttributes(writer, cycle, field);
> >        renderInformalParameters(writer, cycle);
> >        writer.print(displayName, getRaw());
> >        writer.end();
> >        delegate.writeLabelSuffix(field, writer, cycle);
> >
> >
> > You could argue that writeLabelPrefix() and writeLabelSuffix()
> > should both be inside the <label> tag (makes sense to me), but the
> > current code is symmetrical and not necessarily "wrong." Your best
> > bet is probably to override the FieldLabel component with your own
> > version that renders the delegate prefix and/or suffix inside the
> > label tag. And I'm sure you won't hesitate to file a bug report if
> > you  feel strongly about it ;)
> >
> > -Ryan
> >
> >
> > Matt Raible wrote:
> >
> >> Matt Raible wrote:
> >>
> >>> Andreas Andreou wrote:
> >>>
> >>>> try component.getBinding("class")
> >>>> if that's not null, do a getObject() on it
> >>>
> >>>
> >>>
> >>> Thanks.  This works, but it also prints out duplicate "class"
> >>> attributes.
> >>>
> >>> class="text large error" class="text large"
> >>>
> >>>
> >>> It'd be nice to have something like:
> >>>
> >>> writer.appendAttribute("class", "values to append");
> >>>
> >>> Another question - it seems my full <label> and <input> is
> >>> getting wrapped with
> >>>
> >>>
> >>>
> >>> Is there anyway to get rid of that?  It's problematic b/c the
> >>> closing
 isn't getting rendered until right before </form>.
> >>
> >>
> >> Fixed this by using:
> >>
> >>    public void writeLabelPrefix(IFormComponent component,
> >>                                 IMarkupWriter writer,
> >> IRequestCycle cycle) {
> >>        // does nothing put prevent  from getting
> >> written
> >>    }
> >>
> >>>
> >>> Thanks,
> >>>
> >>> Matt
> >>>
> >>>>
> >>>> Matt Raible wrote:
> >>>>
> >>>>> Hmmm, I'm guessing the answers to my questions below are "no,
> >>>>> this isn't possible." ;-)
> >>>>>
> >>>>> Here's another question - is it possible in my custom Validator
> >>>>> to get the existing CSS classes on a component?  For example, I
> >>>>> currently have:
> >>>>>
> >>>>>    public void writeLabelAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle, IFormComponent component) {
> >>>>>        if (isInError(component)) {
> >>>>>            writer.attribute("class", "error");
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>>    public void writeAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle,
> >>>>>                                IFormComponent component,
> >>>>> IValidator validator) {
> >>>>>        if (isInError()) {
> >>>>>            writer.attribute("class", "error");
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>> But I'd prefer to have something like this:
> >>>>>
> >>>>>    public void writeLabelAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle, IFormComponent component) {
> >>>>>        if (isInError(component)) {
> >>>>>            writer.attribute("class", "error " +
> >>>>> component.getAttribute("class"));
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>>    public void writeAttributes(IMarkupWriter writer,
> >>>>> IRequestCycle cycle,
> >>>>>                                IFormComponent component,
> >>>>> IValidator validator) {
> >>>>>        if (isInError()) {
> >>>>>            writer.attribute("class", "error " +
> >>>>> component.getAttribute("class"));
> >>>>>        }
> >>>>>    }
> >>>>>
> >>>>> In other words, is there a method on component that allows me
> >>>>> to get the current CSS classes?
> >>>>>
> >>>>> Matt
> >>>>>
> >>>>> Matt Raible wrote:
> >>>>>
> >>>>>> I have two different "Label" components I'm trying to create.
> >>>>>> Issue #1
> >>>>>> ---------------------------
> >>>>>> The first is a simple component (just a Label.jwc and
> >>>>>> Label.html file in WEB-INF) that writes a <label>.  I'd like
> >>>>>> to include the option to write a "required" indicator.
> >>>>>> However, I'm having a difficult time retrieving a parameter's
> >>>>>> value.  Here's what I have so far:
> >>>>>>
> >>>>>> Label.jwc
> >>>>>> <component-specification allow-informal-parameters="yes">
> >>>>>>    <parameter name="key" required="yes"/>
> >>>>>>    <parameter name="class" required="no"/>
> >>>>>>    <component id="label" type="Any" inherit-informal-
> >>>>>> parameters="yes"/>
> >>>>>> </component-specification>
> >>>>>>
> >>>>>> Label.html
> >>>>>> <label jwcid="label"> >>>>>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
> >>>>>> condition="ognl:class == 'required'"> *</
> >>>>>> span></label>
> >>>>>>
> >>>>>> I'm pretty sure "class" won't work as a parameter name b/c
> >>>>>> I've seen a stacktrace using this already.  Regardless, let's
> >>>>>> pretend it does (I've tried using other names).  Here's the
> >>>>>> desired usage:
> >>>>>>
> >>>>>> <label class="required desc" jwcid="@Label" for="phoneNumber"
> >>>>>> key="user.phoneNumber">Phone Number</label> produces:
> >>>>>>
> >>>>>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone
> >>>>>> Number *</label>
> >>>>>>
> >>>>>> I'm fine with the result having class="required desc" - I
> >>>>>> basically just need some indicator to show a field is required
> >>>>>> when I'm not wiring up it's input field as a component.
> >>>>>>
> >>>>>> Issue #2
> >>>>>> ---------------------------
> >>>>>> I'm overriding ValidationDelegate in order to add required
> >>>>>> field indicators.  I used to be pre-pending an asterisk to the
> >>>>>> beginning of the field, and I had that working.  Now I want to
> >>>>>> add  to the end of the <label> before the </
> >>>>>> label> shows up.  I'm using @FieldLabel and everything
> >>>>>> *almost* works. I've eliminating error styling in the class
> >>>>>> below so it's easier to read.
> >>>>>>
> >>>>>> public class Validator extends ValidationDelegate {
> >>>>>>    public void writeLabelSuffix(IFormComponent component,
> >>>>>>                                 IMarkupWriter writer,
> >>>>>> IRequestCycle cycle) {
> >>>>>>        if (component.isRequired()) {
> >>>>>>            writer.begin("span");
> >>>>>>            writer.attribute("class", "req");
> >>>>>>            writer.printRaw(" *");
> >>>>>>            writer.end();
> >>>>>>        }
> >>>>>>    }
> >>>>>>
> >>>>>> The code above results in <label>blah blah</label> >>>>>> class="req"> *, when I'd rather have the  w/in
> >>>>>> the <label>.  I tried overriding writeLabelAttributes(), but
> >>>>>> that doesn't seem to allow me to create a new tag and write it
> >>>>>> out w/in the label.  Am I missing something here?  Has anyone
> >>>>>> done something like this - or knows how to add a
> >>>>>> withing an @FieldLabel?
> >>>>>>
> >>>>>> Thanks,
> >>>>>>
> >>>>>> Matt
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> ------------------------------------------------------------------
> >>>>> ---
> >>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> >>>>> For additional commands, e-mail: users-help@tapestry.apache.org
> >>>>>
> >>>>>
> >>>>
> >>>> -------------------------------------------------------------------
> >>>> --
> >>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> >>>> For additional commands, e-mail: users-help@tapestry.apache.org
> >>>>
> >>>
> >>>
> >>>
> >>> --------------------------------------------------------------------
> >>> -
> >>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> >>> For additional commands, e-mail: users-help@tapestry.apache.org
> >>>
> >>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> >> For additional commands, e-mail: users-help@tapestry.apache.org
> >>
> >>
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> > For additional commands, e-mail: users-help@tapestry.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>


--
Jesse Kuhnert
Tacos/Tapestry, team member/developer

Open source based consulting work centered around
dojo/tapestry/tacos/hivemind.

Re: Issues with Label Components with Tapestry 4.0

by redijedi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I have the same need to add a span in the label. Did you ever come up
with a complete solution to this?

On 6/1/06, mraible <matt@...> wrote:

>
> My issue isn't with label, it's with the inputs.  I have the following in my
> custom ValidationDelegate:
>
>     public void writeAttributes(IMarkupWriter writer, IRequestCycle cycle,
>                                 IFormComponent component, IValidator
> validator) {
>         if (isInError()) {
>             String cssClass = ((component.getBinding("class") != null) ?
>
> component.getBinding("class").getObject().toString() : "");
>             writer.attribute("class", cssClass + " error");
>         }
>     }
>
> However, rather than just writing a single "class" attribute, it writes two:
>
> class="text large error" class="text large"
>
> Obviously, this is not a big deal, but I would consider it a bug.  As far as
> overriding FieldLabel, I figured out how to do that.  I'll enter an
> enhancement request in JIRA to allow writing markup within the <label> tag.
>
> Thanks,
>
> Matt
>
>
>
> Jessek wrote:
> >
> > Sure, but at that point you are basically overriding the behaviour
> > provided
> > by the ValidationDelegate when it does before/after field rendering (not
> > talking about FieldLabel).
> >
> > The FieldLabel component already supports informal parameters.
> >
> > I noticed in your first email you mentioned trying to do this with
> > something
> > like
> >
> > <label jwcid="mycompid" class="class1 class2" > and only saw class1
> > output.
> >
> > Try doing this instead (though I agree it sounds like a bug somehow):
> >
> > <label jwcid="mycompid" class="ognl:'class class2'" />
> >
> > On 6/1/06, Matt Raible <mraible@...> wrote:
> >>
> >> Is there an easy way to subclass FieldLabel and override the
> >> renderComponent() method to move writeLabelPrefix and
> >> writeLabelSuffix to be inside <label>?
> >>
> >> Thanks,
> >>
> >> Matt
> >>
> >> On May 31, 2006, at 2:51 PM, Ryan Holmes wrote:
> >>
> >> > Your problem getting the span tag where you want it is due to how
> >> > the FieldLabel component renders itself. Here's the relevant part
> >> > of FieldLabel.renderComponent():
> >> >
> >> >        delegate.writeLabelPrefix(field, writer, cycle);
> >> >        writer.begin("label");
> >> >        if (id != null)
> >> >            writer.attribute("for", id);
> >> >        delegate.writeLabelAttributes(writer, cycle, field);
> >> >        renderInformalParameters(writer, cycle);
> >> >        writer.print(displayName, getRaw());
> >> >        writer.end();
> >> >        delegate.writeLabelSuffix(field, writer, cycle);
> >> >
> >> >
> >> > You could argue that writeLabelPrefix() and writeLabelSuffix()
> >> > should both be inside the <label> tag (makes sense to me), but the
> >> > current code is symmetrical and not necessarily "wrong." Your best
> >> > bet is probably to override the FieldLabel component with your own
> >> > version that renders the delegate prefix and/or suffix inside the
> >> > label tag. And I'm sure you won't hesitate to file a bug report if
> >> > you  feel strongly about it ;)
> >> >
> >> > -Ryan
> >> >
> >> >
> >> > Matt Raible wrote:
> >> >
> >> >> Matt Raible wrote:
> >> >>
> >> >>> Andreas Andreou wrote:
> >> >>>
> >> >>>> try component.getBinding("class")
> >> >>>> if that's not null, do a getObject() on it
> >> >>>
> >> >>>
> >> >>>
> >> >>> Thanks.  This works, but it also prints out duplicate "class"
> >> >>> attributes.
> >> >>>
> >> >>> class="text large error" class="text large"
> >> >>>
> >> >>>
> >> >>> It'd be nice to have something like:
> >> >>>
> >> >>> writer.appendAttribute("class", "values to append");
> >> >>>
> >> >>> Another question - it seems my full <label> and <input> is
> >> >>> getting wrapped with
> >> >>>
> >> >>> <font color="red">
> >> >>>
> >> >>> Is there anyway to get rid of that?  It's problematic b/c the
> >> >>> closing </font> isn't getting rendered until right before </form>.
> >> >>
> >> >>
> >> >> Fixed this by using:
> >> >>
> >> >>    public void writeLabelPrefix(IFormComponent component,
> >> >>                                 IMarkupWriter writer,
> >> >> IRequestCycle cycle) {
> >> >>        // does nothing put prevent <font color="red"> from getting
> >> >> written
> >> >>    }
> >> >>
> >> >>>
> >> >>> Thanks,
> >> >>>
> >> >>> Matt
> >> >>>
> >> >>>>
> >> >>>> Matt Raible wrote:
> >> >>>>
> >> >>>>> Hmmm, I'm guessing the answers to my questions below are "no,
> >> >>>>> this isn't possible." ;-)
> >> >>>>>
> >> >>>>> Here's another question - is it possible in my custom Validator
> >> >>>>> to get the existing CSS classes on a component?  For example, I
> >> >>>>> currently have:
> >> >>>>>
> >> >>>>>    public void writeLabelAttributes(IMarkupWriter writer,
> >> >>>>> IRequestCycle cycle, IFormComponent component) {
> >> >>>>>        if (isInError(component)) {
> >> >>>>>            writer.attribute("class", "error");
> >> >>>>>        }
> >> >>>>>    }
> >> >>>>>
> >> >>>>>    public void writeAttributes(IMarkupWriter writer,
> >> >>>>> IRequestCycle cycle,
> >> >>>>>                                IFormComponent component,
> >> >>>>> IValidator validator) {
> >> >>>>>        if (isInError()) {
> >> >>>>>            writer.attribute("class", "error");
> >> >>>>>        }
> >> >>>>>    }
> >> >>>>>
> >> >>>>> But I'd prefer to have something like this:
> >> >>>>>
> >> >>>>>    public void writeLabelAttributes(IMarkupWriter writer,
> >> >>>>> IRequestCycle cycle, IFormComponent component) {
> >> >>>>>        if (isInError(component)) {
> >> >>>>>            writer.attribute("class", "error " +
> >> >>>>> component.getAttribute("class"));
> >> >>>>>        }
> >> >>>>>    }
> >> >>>>>
> >> >>>>>    public void writeAttributes(IMarkupWriter writer,
> >> >>>>> IRequestCycle cycle,
> >> >>>>>                                IFormComponent component,
> >> >>>>> IValidator validator) {
> >> >>>>>        if (isInError()) {
> >> >>>>>            writer.attribute("class", "error " +
> >> >>>>> component.getAttribute("class"));
> >> >>>>>        }
> >> >>>>>    }
> >> >>>>>
> >> >>>>> In other words, is there a method on component that allows me
> >> >>>>> to get the current CSS classes?
> >> >>>>>
> >> >>>>> Matt
> >> >>>>>
> >> >>>>> Matt Raible wrote:
> >> >>>>>
> >> >>>>>> I have two different "Label" components I'm trying to create.
> >> >>>>>> Issue #1
> >> >>>>>> ---------------------------
> >> >>>>>> The first is a simple component (just a Label.jwc and
> >> >>>>>> Label.html file in WEB-INF) that writes a <label>.  I'd like
> >> >>>>>> to include the option to write a "required" indicator.
> >> >>>>>> However, I'm having a difficult time retrieving a parameter's
> >> >>>>>> value.  Here's what I have so far:
> >> >>>>>>
> >> >>>>>> Label.jwc
> >> >>>>>> <component-specification allow-informal-parameters="yes">
> >> >>>>>>    <parameter name="key" required="yes"/>
> >> >>>>>>    <parameter name="class" required="no"/>
> >> >>>>>>    <component id="label" type="Any" inherit-informal-
> >> >>>>>> parameters="yes"/>
> >> >>>>>> </component-specification>
> >> >>>>>>
> >> >>>>>> Label.html
> >> >>>>>> <label jwcid="label"><span jwcid="@Insert"
> >> >>>>>> value="ognl:getMessages().getMessage(key)"/> <div jwcid="@If"
> >> >>>>>> condition="ognl:class == 'required'"><span class="req"> *</
> >> >>>>>> span></label>
> >> >>>>>>
> >> >>>>>> I'm pretty sure "class" won't work as a parameter name b/c
> >> >>>>>> I've seen a stacktrace using this already.  Regardless, let's
> >> >>>>>> pretend it does (I've tried using other names).  Here's the
> >> >>>>>> desired usage:
> >> >>>>>>
> >> >>>>>> <label class="required desc" jwcid="@Label" for="phoneNumber"
> >> >>>>>> key="user.phoneNumber">Phone Number</label> produces:
> >> >>>>>>
> >> >>>>>> <label class="desc" jwcid="@Label" for="phoneNumber">Phone
> >> >>>>>> Number<span class="req"> *</label>
> >> >>>>>>
> >> >>>>>> I'm fine with the result having class="required desc" - I
> >> >>>>>> basically just need some indicator to show a field is required
> >> >>>>>> when I'm not wiring up it's input field as a component.
> >> >>>>>>
> >> >>>>>> Issue #2
> >> >>>>>> ---------------------------
> >> >>>>>> I'm overriding ValidationDelegate in order to add required
> >> >>>>>> field indicators.  I used to be pre-pending an asterisk to the
> >> >>>>>> beginning of the field, and I had that working.  Now I want to
> >> >>>>>> add <span class="req"> to the end of the <label> before the </
> >> >>>>>> label> shows up.  I'm using @FieldLabel and everything
> >> >>>>>> *almost* works. I've eliminating error styling in the class
> >> >>>>>> below so it's easier to read.
> >> >>>>>>
> >> >>>>>> public class Validator extends ValidationDelegate {
> >> >>>>>>    public void writeLabelSuffix(IFormComponent component,
> >> >>>>>>                                 IMarkupWriter writer,
> >> >>>>>> IRequestCycle cycle) {
> >> >>>>>>        if (component.isRequired()) {
> >> >>>>>>            writer.begin("span");
> >> >>>>>>            writer.attribute("class", "req");
> >> >>>>>>            writer.printRaw(" *");
> >> >>>>>>            writer.end();
> >> >>>>>>        }
> >> >>>>>>    }
> >> >>>>>>
> >> >>>>>> The code above results in <label>blah blah</label><span
> >> >>>>>> class="req"> *</span>, when I'd rather have the <span> w/in
> >> >>>>>> the <label>.  I tried overriding writeLabelAttributes(), but
> >> >>>>>> that doesn't seem to allow me to create a new tag and write it
> >> >>>>>> out w/in the label.  Am I missing something here?  Has anyone
> >> >>>>>> done something like this - or knows how to add a <span>
> >> >>>>>> withing an @FieldLabel?
> >> >>>>>>
> >> >>>>>> Thanks,
> >> >>>>>>
> >> >>>>>> Matt
> >> >>>>>>
> >> >>>>>>
> >> >>>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>> ------------------------------------------------------------------
> >> >>>>> ---
> >> >>>>> To unsubscribe, e-mail: users-unsubscribe@...
> >> >>>>> For additional commands, e-mail: users-help@...
> >> >>>>>
> >> >>>>>
> >> >>>>
> >> >>>> -------------------------------------------------------------------
> >> >>>> --
> >> >>>> To unsubscribe, e-mail: users-unsubscribe@...
> >> >>>> For additional commands, e-mail: users-help@...
> >> >>>>
> >> >>>
> >> >>>
> >> >>>
> >> >>> --------------------------------------------------------------------
> >> >>> -
> >> >>> To unsubscribe, e-mail: users-unsubscribe@...
> >> >>> For additional commands, e-mail: users-help@...
> >> >>>
> >> >>
> >> >>
> >> >>
> >> >> ---------------------------------------------------------------------
> >> >> To unsubscribe, e-mail: users-unsubscribe@...
> >> >> For additional commands, e-mail: users-help@...
> >> >>
> >> >>
> >> >
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe, e-mail: users-unsubscribe@...
> >> > For additional commands, e-mail: users-help@...
> >> >
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@...
> >> For additional commands, e-mail: users-help@...
> >>
> >>
> >
> >
> > --
> > Jesse Kuhnert
> > Tacos/Tapestry, team member/developer
> >
> > Open source based consulting work centered around
> > dojo/tapestry/tacos/hivemind.
> >
> >
> --
> View this message in context: http://www.nabble.com/Issues+with+Label+Components+with+Tapestry+4.0-t1686779.html#a4670544
> Sent from the Tapestry - User forum at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@...
> For additional commands, e-mail: users-help@...
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Issues with Label Components with Tapestry 4.0

by mraible :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I ended up overriding the default FieldLabel:

http://fisheye5.cenqua.com/qsearch/appfuse/?q=FieldLabel