Hallo Community,
ich nutze Primefaces 3.4.x mit JSF 2 und habe ein Problem mit Datatable, Filter und Inplaces. Sobald ich im Filter ein Element auswähle, reißt es mir alle Inplaces in jeder Zeile im Edit Mode auf. Scheinbar wird das ganze Formular abgeschickt und validiert. Und da alle SelectOneMenu in den Inplaces auf Required stehen schlägt scheinbar das abschicken fehl. Wie kann ich das Problem umgehen?
Bei Tante Google habe ich niemanden gefunden, der Ähnliches berichtet. Vielleicht suche ich auch verkehrt.
[XML]<h:form id="form">
<p:dataTable var="car" value="#{tableBean.mediumCarsModel}"
selection="#{tableBean.selectedCar}" selectionMode="single">
<p:column filterBy="#{car.manufacturer}" headerText="Manufacturer"
footerText="exact" filterOptions="#{tableBean.manufacturerOptions}"
filterMatchMode="exact">
<p:inplace id="ajaxInplaceman" editor="true"
label="#{car.manufacturer}">
<p:ajax event="save" listener="#{tableBean.saveManufactures(car)}"
update="ajaxInplaceman" />
<p:selectOneMenu value="#{tableBean.textman}" required="true"
label="text">
<f:selectItem itemValue="" itemLabel="Select One"></f:selectItem>
<f:selectItems value="#{tableBean.items}" />
</p:selectOneMenu>
</p:inplace>
</p:column>
</p:dataTable>
</h:form>
</h:body>[/XML]
ich nutze Primefaces 3.4.x mit JSF 2 und habe ein Problem mit Datatable, Filter und Inplaces. Sobald ich im Filter ein Element auswähle, reißt es mir alle Inplaces in jeder Zeile im Edit Mode auf. Scheinbar wird das ganze Formular abgeschickt und validiert. Und da alle SelectOneMenu in den Inplaces auf Required stehen schlägt scheinbar das abschicken fehl. Wie kann ich das Problem umgehen?
Bei Tante Google habe ich niemanden gefunden, der Ähnliches berichtet. Vielleicht suche ich auch verkehrt.
[XML]<h:form id="form">
<p:dataTable var="car" value="#{tableBean.mediumCarsModel}"
selection="#{tableBean.selectedCar}" selectionMode="single">
<p:column filterBy="#{car.manufacturer}" headerText="Manufacturer"
footerText="exact" filterOptions="#{tableBean.manufacturerOptions}"
filterMatchMode="exact">
<p:inplace id="ajaxInplaceman" editor="true"
label="#{car.manufacturer}">
<p:ajax event="save" listener="#{tableBean.saveManufactures(car)}"
update="ajaxInplaceman" />
<p:selectOneMenu value="#{tableBean.textman}" required="true"
label="text">
<f:selectItem itemValue="" itemLabel="Select One"></f:selectItem>
<f:selectItems value="#{tableBean.items}" />
</p:selectOneMenu>
</p:inplace>
</p:column>
</p:dataTable>
</h:form>
</h:body>[/XML]
Java:
@Named("tableBean")
@Scope("session") //erstellt immer eine neue Instanz, wenn es eine neue Session gibt
public class TableBean implements Serializable {
private final static String[] colors;
private final static String[] manufacturers;
private SelectItem[] manufacturerOptions;
private List<Car> carsSmall;
private Car selectedCar;
private CarDataModel mediumCarsModel;
Logger log = Logger.getLogger(getClass());
private String text;
private String textman;
private String textcol;
private static Map<String, String> items; // +getter
private static Map<String, String> coloritems; // +getter
static {
colors = new String[10];
colors[0] = "Black";
colors[1] = "White";
colors[2] = "Green";
colors[3] = "Red";
colors[4] = "Blue";
colors[5] = "Orange";
colors[6] = "Silver";
colors[7] = "Yellow";
colors[8] = "Brown";
colors[9] = "Maroon";
manufacturers = new String[10];
manufacturers[0] = "Mercedes";
manufacturers[1] = "BMW";
manufacturers[2] = "Volvo";
manufacturers[3] = "Audi";
manufacturers[4] = "Renault";
manufacturers[5] = "Opel";
manufacturers[6] = "Volkswagen";
manufacturers[7] = "Chrysler";
manufacturers[8] = "Ferrari";
manufacturers[9] = "Ford";
items = new LinkedHashMap<String, String>();
for(String man : manufacturers)
items.put(man+"_anzeige ", man+"_id");
coloritems = new LinkedHashMap<String, String>();
for(String col : colors)
coloritems.put(col+"_anzeige ", col);
}
public TableBean() {
carsSmall = new ArrayList<Car>();
populateRandomCars(carsSmall, 9);
mediumCarsModel = new CarDataModel(carsSmall);
manufacturerOptions = createFilterOptions(manufacturers);
}
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;
}
private void populateRandomCars(List<Car> list, int size) {
for(int i = 0 ; i < size ; i++)
list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor()));
}
public void save(Car car){
log.info("TableBean.save text: "+text);
log.info("TableBean.save year: "+car.getYear());
log.info("TableBean.save yearSel: "+selectedCar.getYear());
car.setModel(text);
}
public void saveManufactures(Car car){
log.info("TableBean.saveManufactures textman: "+textman);
log.info("TableBean.saveManufactures year: "+car.getYear());
log.info("TableBean.saveManufactures yearSel: "+selectedCar.getYear());
car.setManufacturer(textman);
}
public void saveColor(Car car){
log.info("TableBean.saveColor textman: "+textman);
log.info("TableBean.saveColor year: "+car.getYear());
log.info("TableBean.saveColor yearSel: "+selectedCar.getYear());
car.setColor(textcol);
}
public List<Car> getCarsSmall() {
return carsSmall;
}
private int getRandomYear() {
return (int) (Math.random() * 50 + 1960);
}
private String getRandomColor() {
return colors[(int) (Math.random() * 10)];
}
private String getRandomManufacturer() {
return manufacturers[(int) (Math.random() * 10)];
}
private String getRandomModel() {
return UUID.randomUUID().toString().substring(0, 8);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Map<String, String> getItems() {
return items;
}
public String getTextman() {
return textman;
}
public void setTextman(String textman) {
this.textman = textman;
}
public Map<String, String> getColoritems() {
return coloritems;
}
public String getTextcol() {
return textcol;
}
public void setTextcol(String textcol) {
this.textcol = textcol;
}
public Car getSelectedCar() {
return selectedCar;
}
public void setSelectedCar(Car selectedCar) {
this.selectedCar = selectedCar;
}
public CarDataModel getMediumCarsModel() {
return mediumCarsModel;
}
public void setMediumCarsModel(CarDataModel mediumCarsModel) {
this.mediumCarsModel = mediumCarsModel;
}
public void onRowSelect(SelectEvent event) {
log.info("TableBean.onRowSelect yearSel: "+selectedCar.getYear());
}
public void onRowUnselect(UnselectEvent event) {
log.info("TableBean.onRowUnselect yearSel: "+selectedCar.getYear());
}
public SelectItem[] getManufacturerOptions() {
return manufacturerOptions;
}
}