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

Re: Issues with Label Components with Tapestry 4.0

by mraible :: Rate this Message:

Reply to Author | View in Thread

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.

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