Battle-Cattle/BCUK-Bot-3

View on GitHub
src/main/java/com/expiredminotaur/bcukbot/web/view/collection/CollectionView.java

Summary

Maintainability
A
0 mins
Test Coverage
package com.expiredminotaur.bcukbot.web.view.collection;

import com.expiredminotaur.bcukbot.Role;
import com.expiredminotaur.bcukbot.web.component.Form;
import com.expiredminotaur.bcukbot.web.security.UserTools;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.renderer.ComponentRenderer;
import org.springframework.data.repository.CrudRepository;

import java.util.ArrayList;

public abstract class CollectionView<T> extends VerticalLayout
{
    private final Grid<T> grid;
    private final UserTools userTools;
    private final CrudRepository<T, Integer> repository;
    private final Class<T> type;
    private EditForm editForm;

    public CollectionView(UserTools userTools, CrudRepository<T, Integer> repository, Class<T> type)
    {
        this.userTools = userTools;
        this.repository = repository;
        this.grid = new Grid<>(type);
        this.type = type;
    }

    protected void setup(String title, String dataField, String label)
    {
        this.editForm = new EditForm(type, dataField, label);
        setSizeFull();
        H2 header = new H2(title);
        grid.setColumns("id", dataField, "source", "date");
        grid.setSizeFull();

        if (userTools.hasAccess(Role.MOD))
        {
            grid.addColumn(new ComponentRenderer<>(data -> new Button("Edit", e -> editForm.open(data))))
                    .setHeader("Edit")
                    .setFlexGrow(0);
        }

        grid.getColumns().forEach(c -> c.setAutoWidth(true));
        grid.recalculateColumnWidths();

        grid.setItems((ArrayList<T>) repository.findAll());

        add(header, grid);
    }

    private class EditForm extends Form<T>
    {
        public EditForm(Class<T> type, String dataField, String label)
        {
            super(type);
            addField(label, new TextField(), dataField).setWidthFull();
        }

        @Override
        protected void saveData(T data)
        {
            repository.save(data);
            grid.getDataProvider().refreshItem(data);
        }
    }
}