Announcement

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

    Setting attributes for client datasources

    I am trying to set an attribute for client-side datasources, and it seems not to work. For server-side datasources it works.
    I only see "abc" after mouse hover.

    entrypoint:
    Code:
    public void onModuleLoad() {  
     
            VStack vStack = new VStack(20);  
            vStack.setWidth100();  
     
            final TileGrid tileGrid = new TileGrid();  
            tileGrid.setTileWidth(158);  
            tileGrid.setTileHeight(225);  
            tileGrid.setHeight(400);  
            tileGrid.setID("boundList");  
            tileGrid.setCanReorderTiles(true);  
            tileGrid.setShowAllRecords(true);  
            tileGrid.setDataSource(AnimalXmlDS.getInstance());  
            tileGrid.setAutoFetchData(false);  
            tileGrid.setAnimateTileChange(true);  
     
            DetailViewerField pictureField = new DetailViewerField("picture");  
            DetailViewerField commonNameField = new DetailViewerField("commonName");  
            commonNameField.setCellStyle("commonName");  
     
            DetailViewerField lifeSpanField = new DetailViewerField("lifeSpan");  
            lifeSpanField.setCellStyle("lifeSpan");  
            lifeSpanField.setDetailFormatter(new DetailFormatter() {  
                public String format(Object value, Record record, DetailViewerField field) {  
                    return "Lifespan: " + value;  
                }  
            });  
     
            DetailViewerField statusField = new DetailViewerField("status");  
            statusField.setCellStyleHandler(new CellStyleHandler() {  
                public String execute(Object value, DetailViewerField field, Record record) {  
                    if("Endangered".equals(value)) {  
                        return "endangered";  
                    } else if ("Threatened".equals(value)) {  
                        return "threatened";  
                    } else if ("Not Endangered".equals(value)) {  
                        return "notEndangered";  
                    } else {  
                        return null;  
                    }  
                }  
            });  
            tileGrid.setFields(pictureField, commonNameField, lifeSpanField, statusField);  
     
            vStack.addMember(tileGrid);  
     
            final DynamicForm filterForm = new DynamicForm();  
            filterForm.setIsGroup(true);  
            filterForm.setGroupTitle("Search");  
            filterForm.setNumCols(6);  
            filterForm.setDataSource(AnimalXmlDS.getInstance());  
            filterForm.setAutoFocus(false);  
     
            TextItem commonNameItem = new TextItem("commonName");  
            SliderItem lifeSpanItem = new SliderItem("lifeSpan");  
            lifeSpanItem.setTitle("Max Life Span");  
            lifeSpanItem.setMinValue(1);  
            lifeSpanItem.setMaxValue(60);  
            lifeSpanItem.setDefaultValue(60);  
            lifeSpanItem.setHeight(50);  
            lifeSpanItem.setOperator(OperatorId.LESS_THAN);  
     
            SelectItem statusItem = new SelectItem("status");  
            statusItem.setOperator(OperatorId.EQUALS);  
            statusItem.setAllowEmptyValue(true);  
     
            filterForm.setFields(commonNameItem, lifeSpanItem, statusItem);  
     
            filterForm.addItemChangedHandler(new ItemChangedHandler() {  
                public void onItemChanged(ItemChangedEvent event) {  
                    tileGrid.fetchData(filterForm.getValuesAsCriteria());  
                }  
            });  
     
            vStack.addMember(filterForm);  
     
            final DynamicForm sortForm = new DynamicForm();  
            sortForm.setID("sortForm");  
            sortForm.setIsGroup(true);  
            sortForm.setGroupTitle("Sort");  
            sortForm.setAutoFocus(false);  
            sortForm.setNumCols(6);  
     
            SelectItem sortItem = new SelectItem();  
            sortItem.setName("sortBy");  
            sortItem.setTitle("Sort by");  
     
            LinkedHashMap valueMap = new LinkedHashMap();  
            valueMap.put("commonName", "Animal");  
            valueMap.put("lifeSpan", "Life Span");  
            valueMap.put("status", "Endangered Status");  
     
            sortItem.setValueMap(valueMap);  
     
            final CheckboxItem ascendingItem = new CheckboxItem("chkSortDir");  
            ascendingItem.setTitle("Ascending");  
     
            sortForm.setFields(sortItem, ascendingItem);  
     
            sortForm.addItemChangedHandler(new ItemChangedHandler() {  
                public void onItemChanged(ItemChangedEvent event) {  
                    String sortVal = sortForm.getValueAsString("sortBy");  
                    Boolean sortDir = (Boolean) ascendingItem.getValue();  
                    if(sortDir == null) sortDir = false;  
                    if(sortVal != null) {  
                       tileGrid.sortByProperty(sortVal, sortDir);  
                    }  
                }  
            });  
            vStack.addMember(sortForm);  
     
            HLayout hLayout = new HLayout(10);  
            hLayout.setHeight(22);  
     
            IButton filterButton = new IButton("Filter");  
            filterButton.addClickHandler(new ClickHandler() {  
                public void onClick(ClickEvent event) {  
                    tileGrid.fetchData(filterForm.getValuesAsCriteria());  
                }  
            });  
            filterButton.setAutoFit(true);  
     
            IButton clearButton = new IButton("Clear");  
            clearButton.setAutoFit(true);  
            clearButton.addClickHandler(new ClickHandler() {  
                public void onClick(ClickEvent event) {  
                    tileGrid.fetchData();  
                    filterForm.clearValues();  
                    sortForm.clearValues();  
                }  
            });  
     
            hLayout.addMember(filterButton);  
            hLayout.addMember(clearButton);  
            vStack.addMember(hLayout);  
            
            tileGrid.fetchData(null, new DSCallback() {
                
                @Override
                public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) {
                    for (Record rec: dsResponse.getData()) {
                        rec.setAttribute("commonName", "abc");
                    }
                }
            });
     
            vStack.draw();  
        }
    Using smartgwt 6.0p power 12.05

    #2
    It looks like you're trying to modify the data in the callback of fetchData() right? You may, at that point, be dealing with a copy of the data rather than the actual data incorporated into the TileGrid's dataset or into client-side caches (where applicable), and you also have other ways of fetching in your code that would not go through that callback. The correct way to implement client-side data modification that affects all components is to use DataSource.transformResponse().

    Comment


      #3
      ok, but why do I see the modified data when passing the mouse over the tiles?
      This means that the Tile's grid data is actually being modified, but not shown, only after a mouseOver this data is shown.

      This is actually working with server-side datasources. I modify the data when needed in the fetch(), and the listGrid (maybe the difference is that there I use a listGrid?) shows the modified data correctly.

      I am not implementing data modification that affects all components, I only need in this specific fetch to modify the data depending on some criteria. I have simplified the testcase.

      Comment


        #4
        Because you're trying to modify data in a place where it's not intended to be allowed, basically anything could happen.

        If you want to modify the data in the TileGrid, modify the data in the TileGrid (via getData()) - not the DSResponse.

        Comment


          #5
          Ok, I thought the data in the DSResponse was returned *before* the listGrid/TileGrid got populated with the data.

          For getting data with getData() the fetch must have completed, so where to put a call to getData()? In the DSResponse? or is this also invalid?

          Comment


            #6
            Isomorphic? Is this valid or invalid?

            Comment


              #7
              The DSResponse is returned before data population, but as we keep mentioning, data copies occur during processing and/or on API accesses. So you are not necessarily affecting the data that actually ends up in the TileGrid.

              You could use Scheduler to wait a trivial delay (so that the data has been populated) then use getData() to access it and modify it.

              Or you could use transformResponse, but only modify the data for a particular operationId that the TileGrid uses.

              Comment

              Working...
              X