web-dev-qa-db-fra.com

Comment ajouter des filtres de grille dans Vaadin 8?

Vaadin 8 vient de sortir. l'ajout de filtres dans Grid n'a jamais été dans leur documentation, je n'ai trouvé qu'une seule solution de travail ici dans stackoverflow.

  HeaderCell cell = filterRow.getCell(pid);
                    // Have an input field to use for filter
                    TextField filterField = new TextField();
                    filterField.setColumns(0);
                    filterField.setHeight("23");



                    // Update filter When the filter input is changed
                    filterField.addTextChangeListener(change -> {
                        // Can't modify filters so need to replace
                        b.removeContainerFilters(pid);

                        // (Re)create the filter if necessary
                        if (! change.getText().isEmpty())
                            b.addContainerFilter(
                                new SimpleStringFilter(pid,
                                    change.getText(), true, false));
                    });
                    cell.setComponent(filterField);

Mais maintenant, depuis la mise à jour, cette solution ne fonctionne plus car SimpleStringFilter n'est plus disponible dans la nouvelle grille, et BeanItemContainer n'est plus reconnu et permet uniquement à setItems () de remplir les données de la grille.

Quelqu'un peut-il m'aider à mettre à jour ce code pour Vaadin 8?

15
gigz

Il est possible d'ajouter un filtrage pour Vaadin 8 Grid.

Supposons que nous ayons défini le modèle Personne comme:

final class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}

Notre implémentation de la grille devrait ressembler à ceci:

final class PersonGrid extends Grid<Person> {

    public PersonGrid() {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("foo"));
        persons.add(new Person("bar"));
        persons.add(new Person("foobar"));

        addColumn(Person::getName).setCaption("Name");

        setItems(persons);
    }

}

Maintenant, nous pouvons créer une mise en page avec un TextField qui sera notre filtre:

final class FilteredGridLayout extends VerticalLayout {

    private final PersonGrid personGrid;
    private final TextField nameFilter;

    public FilteredGridLayout() {
        nameFilter = new TextField();
        nameFilter.setPlaceholder("Name...");
        nameFilter.addValueChangeListener(this::onNameFilterTextChange);
        addComponent(nameFilter);

        personGrid = new PersonGrid();
        addComponentsAndExpand(personGrid);
    }

    private void onNameFilterTextChange(HasValue.ValueChangeEvent<String> event) {
        ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) personGrid.getDataProvider();
        dataProvider.setFilter(Person::getName, s -> caseInsensitiveContains(s, event.getValue()));
    }

    private Boolean caseInsensitiveContains(String where, String what) {
        return where.toLowerCase().contains(what.toLowerCase());
    }

}

Le résultat est indiqué ci-dessous: Filtering using Vaadin 8 Grid

Pour une entrée vide, le résultat est: foo , bar et foobar .

Pour foo le résultat est: foo et foo bar.

Pour bar le résultat est: bar et foo barre .

Pour foobar le résultat est: foobar .

13
Patryk Krawczyk

Il y a un addon de grille Vaadin qui sera porté sur Vaadin 8 plus tard, donc si vous avez le temps de l'attendre, vous pouvez obtenir une ligne de filtre dans un joli paquet.

https://vaadin.com/directory#!addon/gridutil

Veuillez lire ici l'estimation des efforts de l'auteur de GridUtil.

https://github.com/melistik/vaadin-grid-util/issues/37#issuecomment-2827561

5
Jukka Nikki