Search in sources :

Example 11 with Column

use of com.vaadin.flow.component.grid.Grid.Column in project flow-components by vaadin.

the class GridViewEditorPage method createBufferedDynamicEditor.

private void createBufferedDynamicEditor() {
    Div message = new Div();
    message.setId("buffered-dynamic-editor-msg");
    Grid<Person> grid = new Grid<>();
    List<Person> persons = new ArrayList<>();
    persons.addAll(createItems());
    grid.setItems(persons);
    Column<Person> nameColumn = grid.addColumn(Person::getFirstName).setHeader("Name");
    Column<Person> subscriberColumn = grid.addColumn(Person::isSubscriber).setHeader("Subscriber");
    Column<Person> emailColumn = grid.addColumn(Person::getEmail).setHeader("E-mail");
    Binder<Person> binder = new Binder<>(Person.class);
    Editor<Person> editor = grid.getEditor();
    editor.setBinder(binder);
    editor.setBuffered(true);
    TextField field = new TextField();
    binder.bind(field, "firstName");
    nameColumn.setEditorComponent(field);
    Div validationStatus = new Div();
    validationStatus.getStyle().set("color", "red");
    validationStatus.setId("email-validation");
    Checkbox checkbox = new Checkbox();
    binder.bind(checkbox, "subscriber");
    subscriberColumn.setEditorComponent(checkbox);
    TextField emailField = new TextField();
    // When not a subscriber, we want to show a read-only text-field that
    // ignores whatever is set to it
    TextField readOnlyEmail = new TextField();
    readOnlyEmail.setValue("Not a subscriber");
    readOnlyEmail.setReadOnly(true);
    Runnable bindEmail = () -> binder.forField(emailField).withValidator(new EmailValidator("Invalid email")).withStatusLabel(validationStatus).bind("email");
    Runnable setEmail = () -> emailColumn.setEditorComponent(item -> {
        if (item.isSubscriber()) {
            bindEmail.run();
            return emailField;
        } else {
            return readOnlyEmail;
        }
    });
    // Sets the binding based on the Person bean state
    setEmail.run();
    // Refresh subscriber editor component when checkbox value is changed
    checkbox.addValueChangeListener(event -> {
        // Only updates from the client-side should be taken into account
        if (event.isFromClient()) {
            // When using buffered mode, the partial updates shouldn't be
            // propagated to the bean before the Save button is clicked, so
            // here we need to override the binding function to take the
            // checkbox state into consideration instead
            emailColumn.setEditorComponent(item -> {
                if (checkbox.getValue()) {
                    bindEmail.run();
                    return emailField;
                } else {
                    return readOnlyEmail;
                }
            });
            grid.getEditor().refresh();
        }
    });
    Collection<Button> editButtons = Collections.newSetFromMap(new WeakHashMap<>());
    // Resets the binding function to use the bean state whenever the editor
    // is closed
    editor.addCloseListener(event -> {
        setEmail.run();
        editButtons.stream().forEach(button -> button.setEnabled(true));
    });
    Column<Person> editorColumn = grid.addComponentColumn(person -> {
        Button edit = new Button("Edit");
        edit.addClassName("edit");
        edit.addClickListener(e -> {
            editor.editItem(person);
            field.focus();
        });
        edit.setEnabled(!editor.isOpen());
        editButtons.add(edit);
        return edit;
    });
    editor.addOpenListener(e -> editButtons.stream().forEach(button -> button.setEnabled(!editor.isOpen())));
    editor.addCloseListener(e -> editButtons.stream().forEach(button -> button.setEnabled(!editor.isOpen())));
    Button save = new Button("Save", e -> editor.save());
    save.addClassName("save");
    Button cancel = new Button("Cancel", e -> editor.cancel());
    cancel.addClassName("cancel");
    // Add a keypress listener that listens for an escape key up event.
    // Note! some browsers return key as Escape and some as Esc
    grid.getElement().addEventListener("keyup", event -> editor.cancel()).setFilter("event.key === 'Escape' || event.key === 'Esc'");
    Div buttons = new Div(save, cancel);
    editorColumn.setEditorComponent(buttons);
    editor.addSaveListener(event -> message.setText(event.getItem().getFirstName() + ", " + event.getItem().isSubscriber() + ", " + event.getItem().getEmail()));
    grid.setId("buffered-dynamic-editor");
    addCard("Grid Editor", "Dynamic Editor in Buffered Mode", message, validationStatus, grid);
}
Also used : Grid(com.vaadin.flow.component.grid.Grid) EmailValidator(com.vaadin.flow.data.validator.EmailValidator) Collection(java.util.Collection) Editor(com.vaadin.flow.component.grid.editor.Editor) Binder(com.vaadin.flow.data.binder.Binder) Div(com.vaadin.flow.component.html.Div) ArrayList(java.util.ArrayList) Route(com.vaadin.flow.router.Route) Checkbox(com.vaadin.flow.component.checkbox.Checkbox) List(java.util.List) Button(com.vaadin.flow.component.button.Button) Column(com.vaadin.flow.component.grid.Grid.Column) Person(com.vaadin.flow.data.bean.Person) Collections(java.util.Collections) TextField(com.vaadin.flow.component.textfield.TextField) WeakHashMap(java.util.WeakHashMap) EmailValidator(com.vaadin.flow.data.validator.EmailValidator) Grid(com.vaadin.flow.component.grid.Grid) ArrayList(java.util.ArrayList) Div(com.vaadin.flow.component.html.Div) Binder(com.vaadin.flow.data.binder.Binder) Button(com.vaadin.flow.component.button.Button) Checkbox(com.vaadin.flow.component.checkbox.Checkbox) TextField(com.vaadin.flow.component.textfield.TextField) Person(com.vaadin.flow.data.bean.Person)

Example 12 with Column

use of com.vaadin.flow.component.grid.Grid.Column in project flow-components by vaadin.

the class GridViewHeaderAndFooterRowsPage method createHeaderAndFooterUsingComponents.

private void createHeaderAndFooterUsingComponents() {
    Grid<Person> grid = new Grid<>();
    grid.setItems(getItems());
    Column<Person> nameColumn = grid.addColumn(Person::getFirstName).setHeader(new Span("Name")).setComparator((p1, p2) -> p1.getFirstName().compareToIgnoreCase(p2.getFirstName()));
    Column<Person> ageColumn = grid.addColumn(Person::getAge, "age").setHeader(new Span("Age"));
    Column<Person> streetColumn = grid.addColumn(person -> person.getAddress().getStreet()).setHeader(new Span("Street"));
    Column<Person> postalCodeColumn = grid.addColumn(person -> person.getAddress().getPostalCode()).setHeader(new Span("Postal Code"));
    HeaderRow topRow = grid.prependHeaderRow();
    HeaderCell informationCell = topRow.join(nameColumn, ageColumn);
    informationCell.setComponent(new Span("Basic Information"));
    HeaderCell addressCell = topRow.join(streetColumn, postalCodeColumn);
    addressCell.setComponent(new Span("Address Information"));
    grid.appendFooterRow().getCell(nameColumn).setComponent(new Span("Total: " + getItems().size() + " people"));
    grid.setId("grid-header-with-components");
    addCard("Header and footer rows", "Header and footer using components", grid);
}
Also used : Column(com.vaadin.flow.component.grid.Grid.Column) Person(com.vaadin.flow.data.bean.Person) Grid(com.vaadin.flow.component.grid.Grid) HeaderRow(com.vaadin.flow.component.grid.HeaderRow) Span(com.vaadin.flow.component.html.Span) HeaderCell(com.vaadin.flow.component.grid.HeaderRow.HeaderCell) Route(com.vaadin.flow.router.Route) HeaderRow(com.vaadin.flow.component.grid.HeaderRow) Grid(com.vaadin.flow.component.grid.Grid) HeaderCell(com.vaadin.flow.component.grid.HeaderRow.HeaderCell) Person(com.vaadin.flow.data.bean.Person) Span(com.vaadin.flow.component.html.Span)

Example 13 with Column

use of com.vaadin.flow.component.grid.Grid.Column in project flow-components by vaadin.

the class GridViewStylingPage method createStyling.

private void createStyling() {
    String instructions = "<p>In order to inject styles into Grid cells, " + "create a style-module like in the snippet below, " + "put it into an html-file in your resources folder, " + "and import it with <code>@HtmlImport</code>. " + "After this you can apply the CSS classes " + "(<code>subscriber</code> and <code>minor</code> in this case) " + "into grid rows and cells as shown in the next example.</p>";
    addCard("Styling", "Styling Grid Cells", new Html(instructions));
    Grid<Person> grid = new Grid<>();
    grid.setItems(getItems());
    grid.setSelectionMode(SelectionMode.NONE);
    grid.addColumn(Person::getFirstName).setHeader("Name");
    Column<Person> ageColumn = grid.addColumn(Person::getAge).setHeader("Age");
    grid.addColumn(person -> person.isSubscriber() ? "Yes" : "").setHeader("Subscriber");
    grid.setClassNameGenerator(person -> person.isSubscriber() ? "subscriber" : "");
    ageColumn.setClassNameGenerator(person -> person.getAge() < 18 ? "minor" : "");
    grid.setId("class-name-generator");
    addCard("Styling", "Generating CSS Class Names for Cells", grid);
}
Also used : Column(com.vaadin.flow.component.grid.Grid.Column) Person(com.vaadin.flow.data.bean.Person) Grid(com.vaadin.flow.component.grid.Grid) Html(com.vaadin.flow.component.Html) SelectionMode(com.vaadin.flow.component.grid.Grid.SelectionMode) Route(com.vaadin.flow.router.Route) Grid(com.vaadin.flow.component.grid.Grid) Html(com.vaadin.flow.component.Html) Person(com.vaadin.flow.data.bean.Person)

Aggregations

Column (com.vaadin.flow.component.grid.Grid.Column)13 Route (com.vaadin.flow.router.Route)11 Grid (com.vaadin.flow.component.grid.Grid)10 Person (com.vaadin.flow.data.bean.Person)7 Div (com.vaadin.flow.component.html.Div)6 TextField (com.vaadin.flow.component.textfield.TextField)6 Button (com.vaadin.flow.component.button.Button)5 ArrayList (java.util.ArrayList)5 List (java.util.List)5 Checkbox (com.vaadin.flow.component.checkbox.Checkbox)4 Editor (com.vaadin.flow.component.grid.editor.Editor)4 Binder (com.vaadin.flow.data.binder.Binder)4 EmailValidator (com.vaadin.flow.data.validator.EmailValidator)4 Collection (java.util.Collection)4 Collections (java.util.Collections)4 HeaderRow (com.vaadin.flow.component.grid.HeaderRow)3 Span (com.vaadin.flow.component.html.Span)3 WeakHashMap (java.util.WeakHashMap)3 SelectionMode (com.vaadin.flow.component.grid.Grid.SelectionMode)2 HeaderCell (com.vaadin.flow.component.grid.HeaderRow.HeaderCell)2