以编程方式将dataTable,图表和面板添加到仪表板Primefaces 4.0

时间:2014-04-02 09:36:39

标签: jsf jsf-2 primefaces charts datatable

我想为每个用户创建一个仪表板。根据数据库查询的结果添加到仪表板的某些面板包含文本,图表或数据表。

使用这个支持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;
    }

}

这是对的吗?如果不是我该怎么办? 我事先并不知道仪表板中的面板数量。 我事先不知道仪表板是否包含数据表或图表或面板。

我希望这次我能更好地解释我的问题,如果是这样,我会感谢您的帮助!

0 个答案:

没有答案