Friday, August 31, 2012

IsEditor and Editor hasErrors always false problem, and getErrors always empty

Hi Everyone,
I am stuck with validating objects. So if anyone can help me or point me to the right direction that would be great.

I have following code:

SettingsViewImpl.ui.xml

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui"
    xmlns:c="urn:import:com.google.gwt.user.cellview.client"
    xmlns:w="urn:import:com.hat.coupled.client.ui.widget"
    xmlns:b="urn:import:com.github.gwtbootstrap.client.ui"
    xmlns:customPanel="urn:import:com.hat.coupled.client.ui.panel.disclosure"
    xmlns:customPanelHeader="urn:import:com.hat.coupled.client.ui.widget.header">
   
    <ui:image field="dpheaderbackground" />
   
    <ui:style>
        .disclosurePanelStyle {
            width: 100%;
            display: block;
            position: relative;
        }

        @sprite .disclosurePanelHeaderTextWrapperStyle {
            gwt-image: 'dpheaderbackground';
            background-repeat: repeat-x;
            background-position: 30px center;
            height: auto;
            width: 100%;
        }

        .disclosurePanelHeaderTextStyle {
            font-size: 13pt;
            line-height: 18pt;
            background-color: #F5F5F5;
            height: auto;
            width: auto;
            float: left;
            padding-right: 5px;
            padding-left: 5px;
        }

        .disclosurePanelHeaderStyle {
            margin-bottom: 10px;
        }
    </ui:style>
    <b:FluidContainer>
        <b:FluidRow ui:field="settingsPanelRow">
            <b:ButtonToolbar ui:field="buttonToolbar">
                <b:ButtonGroup>
                    <b:Button ui:field="backButton" icon="ARROW_LEFT">Back</b:Button>
                </b:ButtonGroup>
                <b:ButtonGroup>
                    <b:Button ui:field="saveButton" icon="SAVE" type="DANGER">Save</b:Button>
                </b:ButtonGroup>
            </b:ButtonToolbar>
        </b:FluidRow>
       
        <b:FluidRow ui:field="alertMessageWrapper">
            <!-- placeholder for alerts -->
        </b:FluidRow>
       
        <b:FluidRow ui:field="globalSettings">
                <b:Well>
                    <customPanel:DisclosurePanelWithDragHandler header="Global Site Settings"
                        width="100%" height="100%" animationEnabled="true"
                        open="true" isDraggable="false"
                        addHeaderTextWrapperStyleNames="{style.disclosurePanelHeaderTextWrapperStyle}"
                        addHeaderTextStyleNames="{style.disclosurePanelHeaderTextStyle}"
                        addHeaderStyleNames="{style.disclosurePanelHeaderStyle}"
                        >
                        <b:Form type="HORIZONTAL" ui:field="siteConfigForm">
                            <b:Fieldset>
                                <b:ControlGroup>
                                    <b:ControlLabel for="siteName">Site Name</b:ControlLabel>
                                    <b:Controls controlsRow="true">
                                           <b:Tooltip text='Site name is text that will be displayed in the browser titlebar' trigger="FOCUS" placement="RIGHT">
                                            <b:TextBox alternateSize="XLARGE" b:id="siteName"
                                                ui:field="siteName"></b:TextBox>
                                        </b:Tooltip>
                                    </b:Controls>
                               
                                    <b:ControlLabel for="siteEmail">Site Email</b:ControlLabel>
                                    <b:Controls controlsRow="true">
                                        <b:Tooltip text='Email that will be used to send all kind of information' trigger="HOVER" placement="RIGHT">
                                            <b:TextBox alternateSize="XLARGE" b:id="siteEmail"
                                            ui:field="siteEmail"></b:TextBox>
                                        </b:Tooltip>
                                    </b:Controls>
                           
                                    <b:ControlLabel for="contactEmail">Contact Email</b:ControlLabel>
                                    <b:Controls controlsRow="true">                                   
                                        <b:TextBox alternateSize="XLARGE" b:id="contactEmail"
                                            ui:field="contactEmail"></b:TextBox>
                                    </b:Controls>
                                    <b:ControlLabel for="favicon">Favicon</b:ControlLabel>
                                    <b:Controls controlsRow="true">                                   
                                        <b:TextBox alternateSize="XLARGE" b:id="favicon"
                                            ui:field="favicon"></b:TextBox>
                                    </b:Controls>
                                   
                                    <b:ControlLabel for="textDirection">Text Direction</b:ControlLabel>
                                    <b:Controls controlsRow="true">
                                     <b:ValueListBox alternateSize="SMALL" ui:field="textDirection">
                                         <!-- This is dropdown box for text direction -->
                                     </b:ValueListBox>
                                     </b:Controls>
                                    <b:Controls>
                                        <b:Button ui:field="resetGlobalSiteSettingsButton">Reset</b:Button>
                                         <b:Button ui:field="saveGlobalSiteSettingsButton" icon="SAVE" type="DANGER">Save</b:Button>
                                    </b:Controls>                                        
                                </b:ControlGroup>
                            </b:Fieldset>
                        </b:Form>
                    </customPanel:DisclosurePanelWithDragHandler>
                </b:Well>
            </b:FluidRow>
           
            <b:FluidRow>
                <b:Well>
                    <customPanel:DisclosurePanelWithDragHandler header="Global Site Settings"
                        width="100%" height="100%" animationEnabled="true"
                        open="true" isDraggable="false"
                        addHeaderTextWrapperStyleNames="{style.disclosurePanelHeaderTextWrapperStyle}"
                        addHeaderTextStyleNames="{style.disclosurePanelHeaderTextStyle}"
                        addHeaderStyleNames="{style.disclosurePanelHeaderStyle}"
                        >
                        <b:Form type="HORIZONTAL">
                            <b:Fieldset>
                                <b:ControlGroup>
                                    <b:ControlLabel for="blaBla">Site Name</b:ControlLabel>
                                    <b:Controls controlsRow="true">
                                        <b:TextBox alternateSize="XLARGE" b:id="blaBla"></b:TextBox>
                                    </b:Controls>
                                </b:ControlGroup>
                            </b:Fieldset>
                        </b:Form>
                    </customPanel:DisclosurePanelWithDragHandler>
                </b:Well>
            </b:FluidRow>       
    </b:FluidContainer>
</ui:UiBinder>



SettingsViewImpl.java

package com.hat.coupled.client.ui;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.ButtonToolbar;
import com.github.gwtbootstrap.client.ui.FluidContainer;
import com.github.gwtbootstrap.client.ui.Dropdown;
import com.github.gwtbootstrap.client.ui.FluidRow;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.ValueListBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.EditorDelegate;
import com.google.gwt.editor.client.EditorError;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.ui.client.adapters.ValueBoxEditor;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.text.shared.Renderer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;

import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.WellForm;
import com.hat.coupled.client.domain.ClientConfig;

public class SettingsViewImpl implements SettingsView {

    interface SettingsViewImplUiBinder extends UiBinder<FluidContainer, SettingsViewImpl> {
    }

    private static SettingsViewImplUiBinder    uiBinder    = GWT.create(SettingsViewImplUiBinder.class);

    private Presenter                        presenter;

    private final FluidContainer            settingsContainer;

    @UiField
    FluidRow                                alertMessageWrapper;
   
    @UiField
    ButtonToolbar                            buttonToolbar;
    @UiField
    Button                                    backButton;
    @UiField
    Button                                    saveButton;

    @UiField
    Form                                    siteConfigForm;
    @UiField(provided = true)
    ValueListBox                            textDirection;
    @UiField
    TextBox                                    siteName;
    @UiField
    TextBox                                    siteEmail;
    @UiField
    TextBox                                    contactEmail;
    @UiField
    TextBox                                    favicon;
    @UiField
    Button                                    saveGlobalSiteSettingsButton;
    @UiField
    Button                                    resetGlobalSiteSettingsButton;

    public SettingsViewImpl() {

        textDirection = new ValueListBox<String>(new Renderer<String>() {

            public void render(String object, Appendable appendable) throws IOException {
                appendable.append(render(object));
            }

            public String render(String object) {
                return object;
            }
        });
        settingsContainer = uiBinder.createAndBindUi(this);

        backButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                History.back();
            }
        });

    }

    public Widget asWidget() {
        return settingsContainer;
    }

    public void setPresenter(Presenter presenter) {
        this.presenter = presenter;
    }

    public void reset() {
        // TODO implement reset method
    }

    public Boolean save() {
        // TODO Auto-generated method stub
        return null;
    }

    public FluidRow getAlertMessageWrapper() {
        return alertMessageWrapper;
    }
   
    public Button getSaveButton() {
        return saveButton;
    }

    public Button getSaveGlobalSiteSettingsButton() {
        return saveGlobalSiteSettingsButton;
    }

    public Button getResetGlobalSiteSettingsButton() {
        return resetGlobalSiteSettingsButton;
    }

    public ValueListBox<String> getTextDirectionEditor() {
        return textDirection;
    }

    public IsEditor<ValueBoxEditor<String>> getSiteNameEditor() {
        return siteName;
    }

    public IsEditor<ValueBoxEditor<String>> getSiteEmailEditor() {
        return siteEmail;
    }

    public IsEditor<ValueBoxEditor<String>> getContactEmailEditor() {
        return contactEmail;
    }

    public IsEditor<ValueBoxEditor<String>> getFaviconEditor() {
        return favicon;
    }

    public void showErrors(List<EditorError> errors) {
        Window.alert("ShowErrors" + errors.size());
        StringBuilder strBuilder = new StringBuilder();
        for (EditorError error : errors) {
            Window.alert(error.getAbsolutePath());
            strBuilder.append(error.getMessage()).append(error.getAbsolutePath());
        }
        Window.alert(strBuilder.toString());
    }

//    public void setDelegate(EditorDelegate<ClientConfig> delegate) {
//        delegate.recordError("kurac", new ClientConfig(), null);   
//    }
   
}

SettingsView.java

package com.hat.coupled.client.ui;

import java.util.List;

import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.FluidRow;
import com.github.gwtbootstrap.client.ui.ValueListBox;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.HasEditorDelegate;
import com.google.gwt.editor.client.HasEditorErrors;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.Editor.Path;
import com.google.gwt.editor.ui.client.adapters.ValueBoxEditor;
import com.google.gwt.user.client.ui.IsWidget;
import com.hat.coupled.client.domain.ClientConfig;

public interface SettingsView extends IsWidget, Editor<ClientConfig>,
    HasEditorErrors<ClientConfig> {
   
    void setPresenter(Presenter presenter);

    public interface Presenter {
       
    }
   
    @Path("textDirection")
    ValueListBox<String> getTextDirectionEditor();
   
    @Path("siteName")
    IsEditor<ValueBoxEditor<String>> getSiteNameEditor();
   
    @Path("siteEmail")
    IsEditor<ValueBoxEditor<String>> getSiteEmailEditor();
   
    @Path("contactEmail")
    IsEditor<ValueBoxEditor<String>> getContactEmailEditor();
   
    @Path("favicon")
    IsEditor<ValueBoxEditor<String>> getFaviconEditor();
   
    public void reset();
    public Boolean save();
   
    public FluidRow getAlertMessageWrapper();
   
    public Button getSaveButton();
   
    public Button getSaveGlobalSiteSettingsButton();
    public Button getResetGlobalSiteSettingsButton();
   
}


ClientConfig.java

package com.hat.coupled.client.domain;

import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;


public class ClientConfig {
    private Integer siteId;
   
    @NotNull
    private String textDirection = "ltr";
   
    @NotNull(message="bla bla bla")
    @Max(10)
    @Size(min = 3, max=10, message="size bla bla bla")
    private String siteName;
   
    @Size(min=7, max=100)
    @NotNull(message="site email is not set")
    @Pattern(regexp="\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b", message="email not valid")
    private String siteEmail;
   
    @Size(min=7, max=100)
    @NotNull(message="site email is not set")
    @Pattern(regexp="\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b", message="email not valid")
    private String contactEmail;
   
    private String favicon;

}


Each time, when I try to validate form, for example making Site Name empty i don't get any error message

i am validating using following code in my activity class:

                    ClientConfig config = editor.flush();
                    if (editor.hasErrors()) {
                        Window.alert("has errors");
                        List<EditorError> errors = editor.getErrors();
                        StringBuilder strBuilder = new StringBuilder();
                        for (EditorError error : errors) {
                            strBuilder.append(error.getMessage()).append(error.getAbsolutePath());
                        }
                    } else {
                        saveConfig(config);
                    }


Does anyone know why there are not error messages in editor.getErrors() and editor.hasErrors() is not being set to true.

Thanks,
Milan

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-web-toolkit/-/ANoYA2EUih0J.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.

No comments:

Post a Comment