« Return to Thread: Issues with Label Components with Tapestry 4.0

Re: Issues with Label Components with Tapestry 4.0

by Ryan Holmes :: Rate this Message:

Reply to Author | View in Thread

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@...

 « Return to Thread: Issues with Label Components with Tapestry 4.0