我想为每个用户创建一个仪表板。根据数据库查询的结果添加到仪表板的某些面板包含文本,图表或数据表。
使用这个支持bean,我可以通过编程方式创建一个仪表板并添加一些面板,但我不能添加一个dataTable?
@Named
@ViewScoped
public class DashboardBacker implements Serializable {
@Inject
private DashboardModelView dashboardModelView;
@Inject
private DashboardEJB dashboardEJB;
private Dashboard dashboard;
public DashboardBacker() {
}
@PostConstruct
public void init() {
logger.info("Creating model");
//String userId = "myId";
FacesContext fc = FacesContext.getCurrentInstance();
Application application = fc.getApplication();
String componentType = "org.primefaces.component.Dashboard";
String rendredDashboardType = "org.primefaces.component.DashboardRenderer";
dashboard = (Dashboard) application.createComponent(fc, componentType, rendredDashboardType);
dashboard.setId("dynamic_dashboard");
dashboard.setModel(dashboardModelView.getModel());
System.out.println("passage ds init(), du dashBacker : "+dashboardModelView.getModel().getColumnCount());
addChildren();
}
public void addChildren() {
System.out.println("passage dans addChildren(), avant clear() : "+dashboardModelView.getModel().getColumnCount());
dashboard.getChildren().clear();
System.out.println("passage dans addChildren(), après clear(): "+dashboardModelView.getModel().getColumnCount());
FacesContext fc = FacesContext.getCurrentInstance();
Application application = fc.getApplication();
String panelType = "org.primefaces.component.Panel";
String rendredPanelType = "org.primefaces.component.PanelRenderer";
List<DashboardColumn> columns = (List<DashboardColumn>) dashboardModelView.getModel().getColumns();
int index = 0;
for (Abonnement abonnement : dashboardModelView.getAbonnements()) {
Panel panel = (Panel) application.createComponent(fc,
panelType, rendredPanelType);
//Pour le test de dataTable : a enlever
if(index == 6){
abonnement.setTypeAffichage(2);
}
if(abonnement.getTypeAffichage()==null){
panel.setId(abonnement.getPanelId());
panel.setHeader(abonnement.getIndicator().getLibelle());
panel.setClosable(true);
panel.setToggleable(true);
dashboard.getChildren().add(panel);
DashboardColumn columnI = columns.get(index % columns.size());
columnI.addWidget(abonnement.getPanelId());
HtmlOutputText text = new HtmlOutputText();
text.setId("item"
+ Long.toString(abonnement.getIndicator()
.getIndicatorId()));
text.setValue(abonnement.getIndicator().getValeur() + "");
panel.getChildren().add(text);
}else if(abonnement.getTypeAffichage()==1){
/* type d'affichage Chart */
//TODO : createChart();
}else if(abonnement.getTypeAffichage() == 2){
/* dataTable*/
System.out.println("create dataTable"+abonnement.getTypeAffichage());
createDataTable(panel);
}
index++;
}
System.out.println("passage après bcle d'ajout de panels: "+dashboardModelView.getModel().getColumnCount());
User user = dashboardModelView.getUser() ;
UserPreferences prefUser = user.getUserPreferences();
prefUser.setSerializableModel((DefaultDashboardModel) dashboardModelView.getModel());
prefUser.setClassName(dashboardModelView.getModel().getClass().getName());
user.setUserPreferences(prefUser);
dashboardEJB.updateUser(user);
}
private void createDataTable(Panel panel) {
FacesContext fc = FacesContext.getCurrentInstance();
Application application = fc.getApplication();
ExpressionFactory ef = application.getExpressionFactory();
ELContext elc = fc.getELContext();
//Model
String[][] rows = new String[][]{ { "1", "Foo" }, { "2", "Bar" }, {"3", "Baz" } };
ArrayDataModel<String[]> model = new ArrayDataModel<String[]>( rows );
//Table
DataTable table = (DataTable) application.createComponent(DataTable.COMPONENT_TYPE);
table.setValue(model);
table.setVar("item");
UIOutput tableTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
tableTitle.setValue("Table Title");
table.getFacets().put("header", tableTitle);
//Index
Column indexColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
UIOutput indexColumnTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
indexColumnTitle.setValue("Index");
indexColumn.getFacets().put("header", indexColumnTitle);
// table.getColumns().add(column);
table.getChildren().add( indexColumn );
ValueExpression indexValueExp = ef.createValueExpression(elc, "#{item[0]}", Object.class);
HtmlOutputText indexOutput = (HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
indexOutput.setValueExpression("value", indexValueExp);
indexColumn.getChildren().add( indexOutput );
//Name Column
Column nameColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
UIOutput nameColumnTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
nameColumnTitle.setValue("Name");
nameColumn.getFacets().put("header", nameColumnTitle);
table.getChildren().add( nameColumn );
ValueExpression nameValueExp = ef.createValueExpression(elc, "#{item[1]}", Object.class);
HtmlOutputText nameOutput = (HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
nameOutput.setValueExpression("value", nameValueExp);
nameColumn.getChildren().add( nameOutput );
panel.getChildren().add(table);
}
private void addMessage(FacesMessage message) {
FacesContext.getCurrentInstance().addMessage(null, message);
}
public DashboardEJB getDashboardEJB() {
return dashboardEJB;
}
public void setDashboardEJB(DashboardEJB dashboardEJB) {
this.dashboardEJB = dashboardEJB;
}
public Dashboard getDashboard() {
//addChildren();
return dashboard;
}
public void setDashboard(Dashboard dashboard) {
this.dashboard = dashboard;
}
public DashboardModelView getDashboardModelView() {
return dashboardModelView;
}
public void setDashboardModelView(DashboardModelView dashboardModelView) {
this.dashboardModelView = dashboardModelView;
}
public DynamicDatatable getDynamicDatatable() {
return dynamicDatatable;
}
public void setDynamicDatatable(DynamicDatatable dynamicDatatable) {
this.dynamicDatatable = dynamicDatatable;
}
}
这是对的吗?如果不是我该怎么办? 我事先并不知道仪表板中的面板数量。 我事先不知道仪表板是否包含数据表或图表或面板。
我希望这次我能更好地解释我的问题,如果是这样,我会感谢您的帮助!