Some values are reset only after first ajax update of the form (but others are just fine)

136 Views Asked by At

Hi I've a really strange situation that I can't get rid of. On the first ajax update of the entire form some values are just fine (they have the expected values) but some others just lose their values in some way (when I go with the debugger over those properties getters/setters I see that they have the expected value in the first part of the debugging session but then their setters just set them back to default value).

I am using Primefaces v7.0.10 and my Backing Bean is marked as @ViewScoped

To refresh the form I am using this p:selectOneMenu on whom onChage event a setter is called which opens a dialog whose outcome is just to refresh the entire form :

<div class="ui-sm-12 ui-g-6">
    <p:selectOneMenu value="#{currentEntity.definitionId}"
        widgetVar="selectProductDefinitionId" filter="true"
        id="inputDefinitionId" required="true" styleClass="ui-g-9"
        label="#{translate['table.product.definitionId']}"
        hideNoSelectionOption="true">
        <f:selectItem itemValue="#{null}"
        itemLabel="#{translate['product.productDefinition.select']}"
        noSelectionOption="true" />
        <f:selectItems value="#{bean.availableProductDefinitions}" />
        <p:ajax listener="#{bean.setProductDefinition}"></p:ajax>
    </p:selectOneMenu>
</div>

Here is some other snippets of the .xhtml file of the view:

<p:confirmDialog widgetVar="importDefinitionInfos"
    header="#{translate['gen.confirm.header']}"
    message="#{translate['product.productDefinition.confirm.message']}">
    <p:commandButton value="#{translate['gen.yes']}" update="form_product"
        action="#{bean.fetchProductDefinition()}"
        oncomplete="PF('importDefinitionInfos').hide();">
        <f:actionListener
            binding="#{bean.setReplaceWithDefinitionData(true)}"></f:actionListener>
    </p:commandButton>
    <p:commandButton value="#{translate['gen.no']}" update="form_product"
        action="#{bean.fetchProductDefinition()}"
        oncomplete="PF('importDefinitionInfos').hide()">
        <f:actionListener
            binding="#{bean.setReplaceWithDefinitionData(false)}"></f:actionListener>
    </p:commandButton>
</p:confirmDialog>


<h:form id="form_product">
    <h:panelGroup layout="block" id="productContent">
        <h:panelGroup styleClass="card no-margin" layout="block">
            <h:panelGroup layout="block"
                rendered="#{not empty currentEntity.id}">
                <h2>#{currentEntity.id} - #{currentEntity.producerProductId}</h2>
            </h:panelGroup>
            <h:panelGroup layout="block" styleClass="entityEditor ui-g"
                id="entityEditor">
                <p:tabView style="margin:20px 0 20px 0;" id="editTabView">
                    <p:tab
                        title="#{translate['table.productDefinition.tabView.title1']}">
                        <h:panelGroup styleClass="ui-g">
                            /*(OK) ALL OF THESE VALUES ARE AS EXPECTED AFTER THE FIRST AJAX UPDATE */
                            <div class="ui-sm-12 ui-g-6">
                                <h:outputLabel styleClass="ui-g-3 required"
                                    for="inputmanufacturerId">#{translate['table.productDefinition.manufacturerId']}</h:outputLabel>
                                <p:selectOneMenu value="#{currentEntity.manufacturerId}"
                                    filter="true" id="inputmanufacturerId" required="true"
                                    styleClass="ui-g-9 icon-top-10-percent"
                                    label="#{translate['table.productDefinition.manufacturerId']}">
                                    <f:selectItems value="#{bean.availableManufacturers}" />
                                </p:selectOneMenu>
                            </div>
                            /*OTHER FORM ELEMENTS*/

                                /*(NOT OK) THIS FIELDSET IS RESET ON THE FIRST AJAX UPDATE */
                            <p:fieldset legend="#{translate['product.extraData.longitude']}"
                                style="margin:20px 0 20px 0; width:100%;" styleClass="ui-g"
                                id="fieldsForLongitude">
                                <div class="ui-sm-12 ui-g-6 ui-lg-4">
                                    <h:outputLabel for="selectHemisphereLongitude"
                                        styleClass="ui-g-3">#{translate['coordinates.hemisphere']}:</h:outputLabel>
                                    <p:selectOneMenu
                                        value="#{bean.longitudeCoordinates.hemisphereLetter}"
                                        filter="false" id="selectHemisphereLongitude"
                                        styleClass="ui-g-9"
                                        label="#{translate['coordinates.hemisphere']}">
                                        <f:selectItems
                                            value="#{bean.getLongitudeHemisphereSelectItems()}" />
                                        <p:ajax event="change" async="true"
                                            listener="#{bean.updateLongitudeCoordinates}"
                                            update="inputGpsCoordinatesLongitude" />
                                    </p:selectOneMenu>
                                </div>
                                <div class="ui-sm-12 ui-g-6 ui-lg-4">
                                    <h:outputLabel for="inputDegreesLongitude" styleClass="ui-g-3">#{translate['coordinates.degrees']}:</h:outputLabel>
                                    <p:inputNumber id="inputDegreesLongitude"
                                        value="#{bean.longitudeCoordinates.degrees}" symbol=" °"
                                        placeholder="°" symbolPosition="s" styleClass="ui-g-9">
                                        <p:ajax event="change" async="true"
                                            listener="#{bean.updateLongitudeCoordinates}"
                                            update="inputGpsCoordinatesLongitude" />
                                    </p:inputNumber>
                                </div>
                                <div class="ui-sm-12 ui-g-6 ui-lg-4">
                                    <h:outputLabel for="inputMinutesLongitude" styleClass="ui-g-3">#{translate['coordinates.minutes']}:</h:outputLabel>
                                    <p:inputNumber id="inputMinutesLongitude"
                                        value="#{bean.longitudeCoordinates.minutes}" symbol=" '"
                                        placeholder="'" symbolPosition="s" styleClass="ui-g-9">
                                        <p:ajax event="change" async="true"
                                            listener="#{bean.updateLongitudeCoordinates}"
                                            update="inputGpsCoordinatesLongitude" />
                                    </p:inputNumber>
                                </div>
                                <div class="ui-sm-12 ui-g-6 ui-lg-4">
                                    <h:outputLabel for="inputDegreesLongitude" styleClass="ui-g-3">#{translate['coordinates.seconds']}:</h:outputLabel>
                                    <p:inputNumber id="inputSecondsLongitude"
                                        value="#{bean.longitudeCoordinates.seconds}" symbol=" ''"
                                        placeholder="''" symbolPosition="s" styleClass="ui-g-9"
                                        decimalPlaces="4">
                                        <p:ajax event="change" async="true"
                                            listener="#{bean.updateLongitudeCoordinates}"
                                            update="inputGpsCoordinatesLongitude" />
                                    </p:inputNumber>
                                </div>
                            </p:fieldset>
/*Other divs*/
</h:form>

The strange behavior is that this issue arise only on first onChange event of that p:selectOneMenu from before .. from the second and onwards onChange events everything is just fine and the entire form has the expected values (even those divs whose values was reset on the first ajax update).

Thanks in advance ...

0

There are 0 best solutions below