Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    Export PDF via exportContent makes 2 calls for a ListGrid

    If I call RPCManager.exportContent passing in a ListGrid, 2 rpc calls are made to the server for operation getPdfObject and as a result I get 2 requests to save the pdf output. However, if I pass in a Layout that contains the ListGrid, then only a single request to the server is made for operation getPdfObject.

    Below is sample code to reproduce it.

    "Download PDF - 1" passes in the layout and results in 1 request as expected.
    "Download PDF - 2" passes in the listgrid and results in 2 requests.

    Code:
    public class Sandbox1 implements EntryPoint {
        DataSource dataSource;
        ListGrid grid;
        int counter = 0;
        ListGridRecord[] cacheData = new ListGridRecord[3];
    
        @Override
        public void onModuleLoad() {
    
            cacheData[0] = new ListGridRecord();
            cacheData[0].setAttribute("fldId", 1);
            cacheData[0].setAttribute("fld1", "val 1");
            cacheData[0].setAttribute("fld2", 10);
            cacheData[0].setAttribute("fld3", new Date());
            cacheData[1] = new ListGridRecord();
            cacheData[1].setAttribute("fldId", 2);
            cacheData[1].setAttribute("fld1", "val 2");
            cacheData[1].setAttribute("fld2", 20);
            cacheData[1].setAttribute("fld3", new Date());
            cacheData[2] = new ListGridRecord();
            cacheData[2].setAttribute("fldId", 3);
            cacheData[2].setAttribute("fld1", "val 3");
            cacheData[2].setAttribute("fld2", 30);
            cacheData[2].setAttribute("fld3", new Date());
    
            final VLayout appLayout = new VLayout();
            appLayout.setWidth100();
            appLayout.setHeight100();
    
            buildDataSource();
            buildGrid();
    
            IButton downloadPdf1 = new IButton("Download PDF - 1");
            downloadPdf1.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    DSRequest reqProps = new DSRequest();
                    reqProps.setAttribute("skinName", "Enterprise");
                    reqProps.setAttribute("pdfName", "export");
                    RPCManager.exportContent(appLayout, reqProps);
                }
            });
    
            IButton downloadPdf2 = new IButton("Download PDF - 2");
            downloadPdf2.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    DSRequest reqProps = new DSRequest();
                    reqProps.setAttribute("skinName", "Enterprise");
                    reqProps.setAttribute("pdfName", "export");
                    RPCManager.exportContent(grid, reqProps);
                }
            });
    
            appLayout.setMargin(5);
            appLayout.setMembersMargin(5);
            appLayout.addMembers(downloadPdf1, downloadPdf2, grid);
            appLayout.draw();
    
        }
    
        private void buildGrid() {
            grid = new ListGrid();
            grid.setWidth100();
            grid.setHeight100();
    
            grid.setDataFetchMode(FetchMode.PAGED);
            grid.setDataPageSize(100);
            // Experimenting with some tweaks to draw ahead ratios.
            grid.setDrawAheadRatio(1.5F);
            grid.setQuickDrawAheadRatio(3.0F);
    
            grid.setTitle("Test Grid");
            grid.setAutoFitFieldsFillViewport(Boolean.TRUE);
            grid.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
            grid.setAutoFitFieldWidths(Boolean.TRUE);
            grid.setCanFreezeFields(Boolean.FALSE);
            grid.setCanGroupBy(Boolean.FALSE);
            grid.setRecordComponentPoolingMode(RecordComponentPoolingMode.RECYCLE);
            grid.setAlternateRecordStyles(Boolean.TRUE);
            grid.setWidth100();
            grid.setAutoFetchData(true);
            // Disable roll over on grid, consider exposing properties for these later.
            grid.setShowRollOver(Boolean.FALSE);
            grid.setUseAdvancedFieldPicker(Boolean.TRUE);
            // Always use advanced field picker
            grid.setAdvancedFieldPickerThreshold(0);
    
            grid.setSelectionType(SelectionStyle.MULTIPLE);
            grid.setSelectionAppearance(SelectionAppearance.ROW_STYLE);
    
            grid.addRecordClickHandler(new RecordClickHandler() {
                @Override
                public void onRecordClick(RecordClickEvent event) {
                    ListGridRecord[] selectedRecords = grid.getSelectedRecords();
                    if (selectedRecords != null && selectedRecords.length == 1) {
                        GWT.log("1 row selected");
                    } else {
                        GWT.log(selectedRecords.length + " rows selected");
                    }
                }
            });
    
            grid.addHoverHandler(new HoverHandler() {
                @Override
                public void onHover(HoverEvent event) {
                    event.cancel();
                }
            });
    
            grid.addDrawHandler(new DrawHandler() {
                @Override
                public void onDraw(DrawEvent event) {
                    GWT.log("Draw event ");
                }
            });
    
            grid.addFetchDataHandler(new FetchDataHandler() {
                @Override
                public void onFilterData(FetchDataEvent event) {
                    GWT.log("FetchDataEvent event ");
                }
            });
    
            grid.addRowContextClickHandler(new RowContextClickHandler() {
                @Override
                public void onRowContextClick(RowContextClickEvent event) {
                    GWT.log("RowContextClickEvent event ");
                }
            });
    
            grid.addDataArrivedHandler(new DataArrivedHandler() {
                @Override
                public void onDataArrived(DataArrivedEvent event) {
                    GWT.log("DataArrivedEvent event ");
                }
            });
    
            grid.addFieldStateChangedHandler(new FieldStateChangedHandler() {
                @Override
                public void onFieldStateChanged(final FieldStateChangedEvent event) {
                    GWT.log("FieldStateChangedEvent event ");
                }
            });
    
            ListGridField gfld1 = new ListGridField("fld1", "Field 1");
            ListGridField gfld2 = new ListGridField("fld2", "Field 2");
            ListGridField gfld3 = new ListGridField("fld3", "Field 3");
    
            grid.setFields(gfld1, gfld2, gfld3);
    
            grid.setDataSource(dataSource, grid.getAllFields());
        }
    
        private void buildDataSource() {
            dataSource = new DataSource();
            dataSource.setClientOnly(true);
            dataSource.setDataFormat(DSDataFormat.JSON);
            DataSourceField fldId = new DataSourceField("fldId", FieldType.INTEGER);
            fldId.setPrimaryKey(true);
            DataSourceField fld1 = new DataSourceField("fld1", FieldType.TEXT);
            DataSourceField fld2 = new DataSourceField("fld2", FieldType.INTEGER);
            DataSourceField fld3 = new DataSourceField("fld3", FieldType.DATE);
            dataSource.setFields(fldId, fld1, fld2, fld3);
    
            dataSource.setCacheData(cacheData);
    
        }
    
    }
    Using: SmartClient Version: v9.1p_2014-09-20/Pro Deployment (built 2014-09-20)

    #2
    That is an extremely strange result. A couple of quick clarifications:

    1. was this done in a completely clean project? Something like an authentication system or other system causing a redirect might cause something like this

    2. do the two PDFs differ? Are either or both the expected output?

    3. when you run this are you seeing concurrent requests to the server for the two exports, or serial?

    Comment


      #3
      1. Yes an completely clean project, no authentication or redirects.

      2. PDFs are the same (listgrid basically).

      3. Two concurrent requests yes.

      Comment


        #4
        Here is another case that reproduces the same issue. In this scenario, we are exporting a FacetChart.

        Code:
        public class Sandbox1 implements EntryPoint {
        
            @Override
            public void onModuleLoad() {
        
                final FacetChart fc = new FacetChart();
                fc.setChartType(ChartType.PIE);
                fc.setShowTitle(Boolean.FALSE);
                fc.setFacets(new Facet("somefield", ""));
                fc.setValueProperty("somevalue");
                RecordList rl = new RecordList();
                Record r = new Record();
                r.setAttribute("somefield", "A");
                r.setAttribute("somevalue", 1);
                rl.add(r);
                fc.setData(rl);
                Window window = new Window();
                window.setWidth(400);
                window.setHeight(400);
                window.setTitle("Chart Window");
                window.addItem(fc);
        
                IButton downloadPdf1 = new IButton("Download FacetChart");
                downloadPdf1.setWidth(200);
                downloadPdf1.addClickHandler(new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        DSRequest reqProps = new DSRequest();
                        reqProps.setAttribute("skinName", "Enterprise");
                        reqProps.setAttribute("pdfName", "export");
                        RPCManager.exportContent(fc, reqProps);
                    }
                });
        
                window.addItem(downloadPdf1);
                window.show();
            }
        }

        Comment


          #5
          We've made a change that should address this - please retest with a build dated September 26 or later

          Comment


            #6
            Works great thanks.

            Comment

            Working...
            X