0

I'm using primefaces 3.5 and watching a strange datatable behavior when editing data. If I enter wrong data in 'year' field and click on the tick I get a message about mistake. But if I don't click on the tick and click on the 'Add row' button I don't get a message. Only new row is added. I expect to stay in edit mode. How to solve this problem?

<h:panelGrid columns="2" cellpadding="5">

       <h:outputText value="In cell editing" />
       <p:dataTable id="inCellEditing" var="car" value="#{dataTableController.cars}" rowKey="#{car.name}" editable="true">

          <p:ajax event="rowEdit" listener="#{dataTableController.onEdit}" update=":mainForm:growl" />
          <p:ajax event="rowEditCancel" listener="#{dataTableController.onCancel}" update=":mainForm:growl" />

          <p:column headerText="Year">
             <p:cellEditor>
                <f:facet name="output">
                   <h:outputText value="#{car.year}" />
                </f:facet>
                <f:facet name="input">
                   <p:inputText value="#{car.year}">
                      <p:ajax event="blur" update="@this"/>
                   </p:inputText>
                </f:facet>
              </p:cellEditor>
           </p:column>
           <p:column headerText="Name">
              <p:cellEditor>
                <f:facet name="output">
                  <h:outputText value="#{car.name}" />
                </f:facet>
                <f:facet name="input">
                  <h:selectOneMenu value="#{car.name}" >
                    <f:selectItems value="#{dataTableController.carNames}"
                                   var="name"
                                   itemLabel="#{name}"
                                   itemValue="#{name}" />
                   </h:selectOneMenu>
                 </f:facet>
              </p:cellEditor>
           </p:column>
           <p:column headerText="Actions">
              <p:rowEditor />
           </p:column>
       </p:dataTable>
       <p:commandButton action="#{dataTableController.addRow()}" value="Add row" ajax="false"/>         
</h:panelGrid>


    public class DataTableController implements Serializable {

    private List<Car> cars;
    private Car selectedCar;
    private Car[] selectedCars;
    private List<Car> selectedCarsList;
    private SelectItem[] carNamesOptions;

    public DataTableController() {
        cars = new ArrayList<Car>(CarConverter.cars.values());
    }

    public String[] getCarNames() {
        return CarConverter.cars.keySet().toArray(new String[0]);
    }

    public SelectItem[] getCarNamesAsOptions() {
        carNamesOptions = createFilterOptions(CarConverter.cars.keySet().toArray(new String[0]));
        return carNamesOptions;
    }

    private SelectItem[] createFilterOptions(String[] data) {
        SelectItem[] options = new SelectItem[data.length + 1];

        options[0] = new SelectItem("", "Select");
        for(int i = 0; i < data.length; i++) {
            options[i + 1] = new SelectItem(data[i], data[i]);
        }

        return options;
    }

    public void onEdit(RowEditEvent event) {
        MessageUtil.addInfoMessage("car.edit", ((Car) event.getObject()).getName());
    }

    public void onCancel(RowEditEvent event) {
        MessageUtil.addInfoMessage("car.edit.cancelled", ((Car) event.getObject()).getName());
    }

    public Car getSelectedCar() {
        return selectedCar;
    }

    public void setSelectedCar(Car selectedCar) {
        this.selectedCar = selectedCar;
    }

    public Car[] getSelectedCars() {
        return selectedCars;
    }

    public void setSelectedCars(Car[] selectedCars) {
        this.selectedCars = selectedCars;
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    public List<Car> getSelectedCarsList() {
        return selectedCarsList;
    }

    public void setSelectedCarsList(List<Car> selectedCarsList) {
        this.selectedCarsList = selectedCarsList;
    }

    public void addRow(){
        cars.add(new Car("",0));
    }
}
San Kap
  • 11
  • 6
  • Do you want it to submit the data (and cause the error message if its wrong) when you click the add row, or you want the add row button behavior to be creating a new row in edit mode already? – Mindwin Remember Monica Sep 23 '13 at 14:58
  • I want to submit the data and cause the error message if its wrong. – San Kap Sep 23 '13 at 15:04
  • Changing the behavior of the buttons can cause a frustrating user experience. New Row adds a new row, submit submits, everyone expects that. New row adding new row, submitting and staying in edit mode sounds very strange. Maybe you should create your own command for "submit and add new row"... check: http://stackoverflow.com/questions/16274638 , http://stackoverflow.com/questions/9561982 and dig through the linked questions on these two. – Mindwin Remember Monica Sep 23 '13 at 15:21
  • I don't want to change the behavior of the buttons. If we take a single input without p:dataTable with wrong data when form is submitted we get error message. I want to get error message if row is in edit mode with wrong data and form is submitted. – San Kap Sep 23 '13 at 20:21

0 Answers0