RE: Vaadin 8.1 Grid How to do filtering (and sorting and lazy loading at th

Hi,

The docs for filtering with lazy loading can be found here:
https://vaadin.com/docs/-/part/framework/datamodel/datamodel-providers.html

-Olli

On https://vaadin.com/elements/-/element/vaadin-grid#demos it tells us that: “Grid allows you sort and filter data”

Unfortunately no java code is provided as to how to implement for example filtering. Instead there is only xml and I can’t use that.
How to implement filtering with grid? (I already implemented sorting and lazy loading)

Any help is appreciated.

I followed the example, but it is not working yet. We have got (in test example):

  DataProvider<Image, String> dataProvider = DataProvider
        .fromFilteringCallbacks(query -> {
           int offset = query.getOffset();
           int limit = query.getLimit();
           Optional<String> filter = query.getFilter();
           return ImagesRepository.findAll(filter, query.getSortOrders())
                 .stream().skip(offset).limit(limit);
        }, query -> ImagesRepository.getImageCount());

  wrapper = dataProvider.withConfigurableFilter();

AND

filterInputField.addValueChangeListener(event → {
wrapper.setFilter(filterInputField.getValue());
});

BUT

The filter value: “Optional filter” is always empty.

Does your dataprovider’s callback get triggered after the setFilter() call in the value change listener?

-Olli

Yes, it does get triggered.

@Override
protected void init(VaadinRequest vaadinRequest)
{
final VerticalLayout layout = new VerticalLayout();

  makeMap();
  Panel mapPanel = new Panel();
  mapPanel.setSizeFull();
  mapPanel.setContent(leafletMap);
  layout.addComponent(mapPanel);

  filterInputField = new TextField();
  filterInputField.setCaption("Namen der Bilder Filter");
  layout.addComponent(filterInputField);

  Grid<Image> imgGrid = makeLazyTable();
  Panel lazyPanel = new Panel();
  lazyPanel.setSizeFull();
  lazyPanel.setContent(imgGrid);
  layout.addComponent(lazyPanel);

  filterInputField.addValueChangeListener(event -> {
     wrapper.setFilter(filterInputField.getValue());
  });
  setContent(layout);

}


private Grid makeLazyTable()
{
Grid grid = new Grid<>(Image.class);
grid.setColumns(“filename”, “orientation”, “latitude”, “longitude”,
“image”);
grid.setColumnOrder(“filename”, “orientation”, “latitude”, “longitude”,
“image”);
grid.getColumn(“filename”).setCaption(“Dateiname”).setSortable(false);
grid.getColumn(“orientation”)
.setSortProperty(Sortorder.Orientation.toString());
grid.getColumn(“latitude”).setCaption(“Breitengrad”)
.setSortProperty(Sortorder.Latitude.toString());
grid.getColumn(“longitude”).setCaption(“Längengrad”)
.setSortProperty(Sortorder.Longitude.toString());
grid.getColumn(“image”).setCaption(“Foto”).setSortable(false)
.setRenderer(new ImageRenderer());

  grid.addSelectionListener(event -> {
     Image selectedImage = event.getFirstSelectedItem().get();
     Double latitude = selectedImage.getLatitudeDouble();
     Double longitude = selectedImage.getLongitudeDouble();
     if (latitude != null && longitude != null)
     {
        showMarkerInMap(latitude, longitude, selectedImage.getFilename(),
              "latitude = " + latitude + "<br>longitude = " + longitude);
     }
     else
     {
        showMarkerInMap(0, 0, "selectedImage.getFilename()",
              "keine Angaben");
     }
  });

  // as prepared Column:
  // Column<Image, String> filenameColumn =
  // grid.addColumn(Image::getFilename);

  // Group headers by joining the cells
  HeaderRow groupingHeader = grid.prependHeaderRow();
  HeaderCell personCell = groupingHeader.join(
        groupingHeader.getCell("filename"),
        groupingHeader.getCell("orientation"),
        groupingHeader.getCell("latitude"),
        groupingHeader.getCell("longitude"));
  personCell.setText("Bilder");

  DataProvider<Image, String> dataProvider = DataProvider
        .fromFilteringCallbacks(query -> {
           int offset = query.getOffset();
           int limit = query.getLimit();
           List<QuerySortOrder> sortOrders = query.getSortOrders();
           Optional<String> filter = query.getFilter();
           
           return ImagesRepository.findAll(filter, sortOrders)
                 .stream().skip(offset).limit(limit);
        }, query -> ImagesRepository.getImageCount());

  wrapper = dataProvider.withConfigurableFilter();

  grid.setDataProvider(dataProvider);
  grid.setWidth(1200, Unit.PIXELS);
  return grid;

}

see screenshot attached
36317.jpg

Hi,
I found the bug!
“wrapper” is the new DataProvider (not “dataProvider” anymore) and has to be put into the grid:

grid.setDataProvider(wrapper);