AndaP
AndaP

Reputation: 1298

How to set JSF input field value before submit

I a have a JSF page with PrimeFaces with some input fields. Before a submit is done, I would like to use the value of a field as input for a method which does some calculations and updates another field with the result but without submitting the form.

This is the field that will be used as input for my method:

<h:outputLabel for="hiredate" value="#{msgs['addUser.hireDate']}" />
                                <p:calendar id="hiredate" value="#{userWizardMB.user.hireDate}" required="true" immediate="true"/>
                                <p:message for="hiredate" />

The calculation is done by clicking a <p:commandButton>:

<p:commandButton value="Calculate days" icon="ui-icon-circle-check" action="#{userWizardMB.calculateVacationDays}" update="vacationDays" process="@this" immediate="true"/>

And this is the method called:

public void calculateVacationDays() {
        user.setVacationDays((int) vacationDaysCalculator
                .calculateWithHireDate(user.getHireDate()));
}

When debugging, though, I see that this field is NULL even if I set value in the form.

How can I force the setting of this field - user.hireDate because I really need this value for my calculation?

Thank you

Edit: I removed all of the other fields in the form and the immediate attribute:

<h:form id="addUserForm">
    <p:wizard widgetVar="wizard" flowListener="#{userWizardMB.onFlowProcess}">
                <!-- TAB FOR PERSONAL DATA -->
                    <p:tab id="personal" title="#{msgs['addUser.personalTab']}">
                        <p:panel header="#{msgs['addUser.personalInformation']}">
                            <p:message for="vacationDays" showDetail="true" autoUpdate="true" closable="true"/>
                            <h:panelGrid columns="3" columnClasses="label, value" styleClass="grid">

                                <h:outputLabel for="hiredate" value="#{msgs['addUser.hireDate']}" />
                                <p:calendar id="hiredate" value="#{userWizardMB.user.hireDate}" required="true" />
                                <p:message for="hiredate" />


                                <h:outputLabel for="vacationDays" value="#{msgs['addUser.vacationDays']}"/>
                                <p:inputText id="vacationDays" value="#{userWizardMB.user.vacationDays}"/>
                                <p:commandButton value="Calculate days" icon="ui-icon-circle-check" action="#{userWizardMB.calculateVacationDays}"  process="@this hiredate" update="vacationDays"/>
                </h:panelGrid>
            </p:panel>
        </p:tab>
    </p:wizard>
</h:form>

And the backing bean method is still not called.

Upvotes: 1

Views: 11051

Answers (3)

Santiago
Santiago

Reputation: 51

Old question, but did you add partialSubmit="true" in the commandButton tag? At least in PrimeFaces 3.5, false is the default value of this attribute (see the PrimeFaces PDF documentation).

Upvotes: 0

BalusC
BalusC

Reputation: 1108712

Remove immediate="true" from the input and the command component. Do not use immediate unless you really understand what it should be used for. Further you also need to include the input component which you'd like to process in the update attribute of the command component. Note that this should represent the client ID, not the property name as mentioned in one of your comments.

<p:calendar id="hiredate" value="#{userWizardMB.user.hireDate}" required="true" />
...
<p:commandButton value="Calculate days" icon="ui-icon-circle-check" 
    action="#{userWizardMB.calculateVacationDays}" 
    process="@this hiredate" update="vacationDays" />

See also:

Upvotes: 1

SJuan76
SJuan76

Reputation: 24885

Use process="@form" (or process="[the id of the calendar component]" in the commandButton

process="@this" means that only the part of the model related to the commandButton (usually none) gets updated.

Upvotes: 0

Related Questions