I cloned the Primefaces Test project and made changes to the following files:
pom.xml
Code: Select all
<dependency>
<groupId>org.primefaces.extensions</groupId>
<artifactId>primefaces-extensions</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>7.0</version>
</dependency>
test.xhtml
Code: Select all
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:pe="http://primefaces.org/ui/extensions">
<h:head>
<title>PrimeFaces Test</title>
</h:head>
<h:body>
<h1>#{testView.testString}</h1>
<h:form id="form">
<h3>Sheet Outside of ui:repeat (Day 0 data)</h3>
<pe:sheet id="testSheet"
widgetVar="sheetWidget"
value="#{testView.testMap.get(testView.testList.get(0))}"
var="row"
height="150"
rowKey="#{row.id}">
<p:ajax event="change"
listener="#{testView.cellChangeEvent}"
update="changedValues"/>
<pe:sheetcolumn headerText="Data [String]"
value="#{row.dataString}"/>
<pe:sheetcolumn headerText="Data [Integer]"
value="#{row.dataInteger}"/>
</pe:sheet>
<!-- Test whether ajax update is not working in general, or just in pe:sheet-->
<p:commandButton value="Test AJAX update"
action="#{testView.testAjax()}"
update="changedValues"/>
<h3>Sheets Inside ui:repeat</h3>
<p:outputPanel id="changedValues">
<h:panelGroup >
<p:panel id="testAjax">
<h:outputText value="AJAX update: " style="font-weight: bold; color: dodgerblue" />
<h:outputText value="#{testView.testAjaxValue}" /><br/><br/>
</p:panel>
<p:panel id="changedValue0">
<h:outputText value="Day 0 Row 1 'Data [String]' value: " style="font-weight: bold; color: dodgerblue"/>
<h:outputText value="#{testView.testMap.get(testView.testList.get(0)).get(0).dataString}" /><br/><br/>
</p:panel>
<p:panel id="changedValue1">
<h:outputText value="Day 1 Row 1 'Data [String]' value: " style="font-weight: bold; color: dodgerblue"/>
<h:outputText value="#{testView.testMap.get(testView.testList.get(1)).get(0).dataString}" /><br/><br/>
</p:panel>
<p:panel id="changedValue2">
<h:outputText value="Day 2 Row 1 'Data [String]' value: " style="font-weight: bold; color: dodgerblue"/>
<h:outputText value="#{testView.testMap.get(testView.testList.get(2)).get(0).dataString}" /><br/><br/>
</p:panel>
</h:panelGroup>
</p:outputPanel><br/><br/>
<ui:repeat value="#{testView.testList}" var="day">
<h:panelGroup id="sheetPanel">
<h:outputText value="DAY #{day}"/>
<pe:sheet id="sheet"
widgetVar="sheetWidget"
value="#{testView.testMap.get(day)}"
var="row"
height="150"
rowKey="#{row.id}">
<p:ajax event="change"
listener="#{testView.cellChangeEvent}"
update="@form:changedValues"/>
<pe:sheetcolumn headerText="Data [String]"
value="#{row.dataString}"/>
<pe:sheetcolumn headerText="Data [Integer]"
value="#{row.dataInteger}"/>
</pe:sheet>
</h:panelGroup>
</ui:repeat>
</h:form>
</h:body>
</html>
TestView.java
Code: Select all
package org.primefaces.test;
import org.primefaces.extensions.component.sheet.Sheet;
import org.primefaces.extensions.event.SheetEvent;
import org.primefaces.extensions.model.sheet.SheetUpdate;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import java.util.*;
@Named
@ViewScoped
public class TestView implements Serializable {
private String testString;
private HashMap<Integer, List<SheetDataRow>> testMap;
private List<Integer> testList;
private String testAjaxValue;
@PostConstruct
public void init() {
testString = "Welcome to PrimeFaces!!!";
// generate sheet data
testMap = new HashMap<>(3);
testList = new ArrayList<>(3);
for(int i = 0; i < 3; i++) {
List<SheetDataRow> sheetDataRows = new ArrayList<>(2);
for(int j = 0; j < 2; j++) {
SheetDataRow row = new SheetDataRow("String data " + i + j, i + j);
sheetDataRows.add(row);
}
testMap.put(i, sheetDataRows);
testList.add(i);
}
testAjaxValue = "click 'Test AJAX update' button to change me";
}
public String getTestString() { return testString; }
public void setTestString(String testString) { this.testString = testString; }
public HashMap<Integer, List<SheetDataRow>> getTestMap() { return testMap; }
public void setTestMap(HashMap<Integer, List<SheetDataRow>> inMap) { testMap = inMap; }
public List<Integer> getTestList() { return testList; }
public void setTestList(List<Integer> testList) { this.testList = testList; }
public String getTestAjaxValue() { return testAjaxValue; }
public void setTestAjaxValue(String testAjaxValue) { this.testAjaxValue = testAjaxValue; }
public void cellChangeEvent(SheetEvent event) {
System.out.println("inside cellChangeEvent()");
Sheet sheet = event.getSheet();
List<SheetUpdate> updates = sheet.getUpdates();
if(updates != null && updates.size() > 0) {
for(SheetUpdate sheetUpdate : updates)
{
System.out.println("updates are getting through :)");
}
} else {
System.out.println("updates NOT getting through :(");
}
sheet.commitUpdates();
}
public void testAjax() {
testAjaxValue = "AJAX update via commandButton works!";
}
}
New file:
SheetDataRow.java
Code: Select all
package org.primefaces.test;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class SheetDataRow implements Serializable {
private Integer id;
private String dataString;
private Integer dataInteger;
public SheetDataRow(){}
public SheetDataRow(String inDataString, Integer inDataInteger) {
dataString = inDataString;
dataInteger = inDataInteger;
id = inDataInteger;
}
@PostConstruct
public void init() {}
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getDataString() { return dataString; }
public void setDataString(String dataString) { this.dataString = dataString; }
public Integer getDataInteger() { return dataInteger; }
public void setDataInteger(Integer dataInteger) { this.dataInteger = dataInteger; }
}
I'm unable to exactly reproduce the issue I see in my own project. I couldn't figure out how to get pe:sheet to update at all in the Primefaces test project environment (inside or outside ui:repeat). My server shows the following custom message when I change a cell value:
Code: Select all
[INFO] Started Jetty Server
inside cellChangeEvent()
updates NOT getting through :(