Crud UI Add-on - Vaadin Add-on Directory
Automatically generate Create, Read, Update, and Delete (CRUD) UIs with grids and forms for your entities/beans/POJOs at runtime
[](https://vaadin.com/directory/component/crud-ui-add-on)
[](https://vaadin.com/directory/component/crud-ui-add-on)
[](https://img.shields.io/vaadin-directory/v/crud-ui-add-on.svg)
Crud UI Add-on provides a fluent, type-safe API to generate CRUD UIs for Java beans in Vaadin.
The main entrypoint is `Crud.of(YourBean.class)`, which starts with sensible defaults:
- List: `GridList`
- Layout: `SplitCrudLayout`
- Form factory: `AutoGeneratedFormFactory`
For questions, use the forum thread: https://vaadin.com/forum/t/crud-ui-add-on/156634/1
## Requirements
- Java 21+
- Vaadin 25.2.3
- Maven
## Quick Start
Minimal CRUD with defaults (no actual backend operations are performed):
```java
Crud crud = Crud.of(User.class).build();
add(crud);
```
CRUD wired to backend operations:
```java
Crud crud = Crud.of(User.class)
.onCreate(userService::save)
.onRead(userService::findAll)
.onUpdate(userService::save)
.onDelete(userService::delete)
.build();
add(crud);
```
## Core API
`Crud` is a Vaadin component (`Composite`) with a fluent builder API:
- `Crud.of(Class)`
- `onCreate(Consumer)`
- `onRead(Supplier extends Collection>)`
- `onRead(DataProvider)`
- `onUpdate(Consumer)`
- `onDelete(Consumer)`
- `list(CrudListFactory)`
- `layout(CrudLayoutFactory)`
- `form(CrudFormFactory)`
- `build()`
Main contracts:
- `CrudLayout`: how list + form are arranged in the UI
- `CrudList`: list abstraction (selection, refresh, data provider)
- `CrudForm`: form abstraction (value/read-only/validation)
- `CrudFormFactory`: factory for operation-specific forms
## Read Operations
You can wire reads using either a collection supplier or a `DataProvider`.
### Collection Supplier
```java
Crud crud = Crud.of(User.class)
.onRead(userService::findAll)
.build();
```
### Lazy/Paginated DataProvider
```java
Crud crud = Crud.of(User.class)
.onRead(DataProvider.fromCallbacks(
query -> userService.findByNameContainingIgnoreCase(
filterValue, query.getPage(), query.getPageSize()).stream(),
query -> (int) userService.countByNameContainingIgnoreCase(filterValue)
))
.build();
```
## Layout Customization
### Split Layout (default)
```java
Crud crud = Crud.of(User.class)
.layout(SplitCrudLayout.of(User.class)
.orientation(Orientation.HORIZONTAL))
.build();
```
### Dialog Layout
```java
Crud crud = Crud.of(User.class)
.layout(DialogCrudLayout.of(User.class)
.dialogWidth("60vw")
.dialogResizable(true))
.build();
```
## List Customization
Use your own configured `Grid` and plug it into `GridList`:
```java
Grid grid = new Grid<>();
grid.addColumn(User::getId).setHeader("ID");
grid.addColumn(User::getName).setHeader("Name");
grid.addColumn(User::getEmail).setHeader("Email");
Crud crud = Crud.of(User.class)
.list(GridList.of(User.class).grid(grid))
.onCreate(userService::save)
.onRead(userService::findAll)
.onUpdate(userService::save)
.onDelete(userService::delete)
.build();
```
## Form Customization
`AutoGeneratedFormFactory` supports operation-specific fields and fluent field configuration.
```java
Crud crud = Crud.of(User.class)
.form(AutoGeneratedFormFactory.of(User.class)
.fields(
Field.of(User::getName, User::setName, String.class).label("Name"),
Field.of(User::getEmail, User::setEmail, String.class).label("Email"),
Field.of(User::getActive, User::setActive, Boolean.class).label("Active")
)
.fieldsFor(CrudOperation.CREATE,
Field.of(User::getName, User::setName, String.class).label("Name"),
Field.of(User::getEmail, User::setEmail, String.class).label("Email"),
Field.of(User::getPassword, User::setPassword, String.class).label("Password")
)
.useBeanValidation()
.captions("Create user", "Edit user"))
.build();
```
Other useful methods:
- `additionalFieldsFor(CrudOperation, Field.Builder...)`
- `replace(propertyName, Field.Builder)`
## Behavior and UX Options
### View-before-edit mode
Show selected items read-only first, then edit after clicking Update:
```java
Crud crud = Crud.of(User.class)
.viewBeforeEdit(true)
.build();
```
### Operation visibility
```java
Crud crud = Crud.of(User.class)
.createOperationVisible(true)
.updateOperationVisible(true)
.deleteOperationVisible(false)
.build();
```
### Custom new instance supplier
```java
Crud crud = Crud.of(User.class)
.form().newInstanceSupplier(() -> {
User user = new User();
user.setActive(true);
return user;
})
.build();
```
### Filter components
```java
TextField nameFilter = new TextField();
nameFilter.setPlaceholder("Search by name...");
Crud crud = Crud.of(User.class)
.addFilterComponent(nameFilter)
.onRead(dataProvider)
.build();
```
## Button and Dialog Customization
Customize action buttons by CRUD operation:
```java
Crud crud = Crud.of(User.class)
.button(CrudOperation.CREATE).label("New", VaadinIcon.PLUS::create)
.button(CrudOperation.UPDATE).variants(ButtonVariant.LUMO_PRIMARY)
.button(CrudOperation.DELETE).label("Remove", VaadinIcon.TRASH::create, ButtonVariant.LUMO_ERROR)
.build();
```
Customize delete confirmation text:
```java
Crud crud = Crud.of(User.class)
.deleteConfirmation().texts(
"Delete user?",
"This operation cannot be undone.",
"Delete",
"Cancel"
)
.onDelete(userService::delete)
.build();
```
## Success/Error Hooks
```java
Crud crud = Crud.of(User.class)
.onSaveSuccess(saved -> Notification.show("Saved: " + saved.getName()))
.onDeleteSuccess(deleted -> Notification.show("Deleted: " + deleted.getName()))
.onOperationError(error -> Notification.show("Operation failed: " + error.getMessage()))
.build();
```
## Legacy API Migration Notes
If you are upgrading from older version of CrudUI Add-On, use this mapping:
| Legacy usage | Current usage |
| --- | --- |
| `new GridCrud<>(User.class)` | `Crud.of(User.class).build()` |
| `setFindAllOperation(...)` | `onRead(...)` |
| `setAddOperation(...)` | `onCreate(...)` |
| `setUpdateOperation(...)` | `onUpdate(...)` |
| `setDeleteOperation(...)` | `onDelete(...)` |
| `CrudListener` / `LazyCrudListener` wiring | Fluent `onCreate/onRead/onUpdate/onDelete` methods |
| `DefaultCrudFormFactory` old API methods | `AutoGeneratedFormFactory.of(...).fields(...).fieldsFor(...).useBeanValidation()` |
## Examples in This Repository
- Basic: `crud-ui-demo/src/main/java/org/vaadin/crudui/demo/ui/view/DefaultView.java`
- Advanced: `crud-ui-demo/src/main/java/org/vaadin/crudui/demo/ui/view/CustomizedView.java`
## License
Apache License 2.0
View on GitHub
Author Homepage
Crud UI Add-on API
Discussion Forum (ask questions here)
Online Demo
Issue tracker
Crud UI Add-on version 1.2
null
Crud UI Add-on version 1.3
null
Crud UI Add-on version 1.4
null
Crud UI Add-on version 1.5
null
Crud UI Add-on version 1.5.1
null
Crud UI Add-on version 1.6.0
null
Crud UI Add-on version 2.0.0
Compiled with Vaadin 8 compatibility packages
Crud UI Add-on version 2.1.0
Upgraded to Vaadin 8.1.4
Crud UI Add-on version 2.1.1
Small fixes and enhancements
Crud UI Add-on version 2.1.2
Several bug fixes and enhancements.
Crud UI Add-on version 2.1.3
Added VerticalSplitCrudLayout implementation.
Crud UI Add-on version 2.1.4
Added VerticalCrudLayout implementation
Added Grid.setClickRowToUpdate(boolean) method
Crud UI Add-on version 2.1.5
Fixed cancel button when used with Grid.setClickRowToUpdate(true)
Fixed form caption in VerticalCrudLayout
Crud UI Add-on version 2.3.0
Compiled with Vaadin Framework 8.2.0 (fixes NoSuchMethodError: com.vaadin.ui.Notification.show(Ljava/lang/String;)V)
Crud UI Add-on version 3.0
Added Vaadin 10 support. Thanks to Johannes Häyry for the contributions.
Crud UI Add-on version 3.1
Bug fixes.
Crud UI Add-on version 3.1.0
Crud UI Add-on version 3.2.0
Added lazy loading support
Crud UI Add-on version 3.3.0
Crud UI Add-on version 3.4.0
Fixed NPE. Added Renderer support in FieldProviders. Changed from Grid-based CheckBoxProvider to CheckboxGroup from Directory
Crud UI Add-on version 3.5.0
Added OffsetBasedPageRequest for Spring Data.
Crud UI Add-on version 3.6.0
Updated checkbox-group-java (which fixes a bug related to the slf4j-simple dependency).
Crud UI Add-on version 3.7.0
Crud UI Add-on version 3.7.1
Fixed strange bug when hiding forms.
Fixed VerticalCrudLayout.
Crud UI Add-on version 2.3.1
Updated to Vaadin 8.6.4
Crud UI Add-on version 3.7.2
External notifications in GridCrud.
Crud UI Add-on version 3.7.3
Fixed #44 Needless scrollbars appear (w/ fix)
Crud UI Add-on version 3.8.0
Updated to Vaadin 13.0.1.
Use vaadin-core dependency.
Use Vaadin Flow's CheckboxGroup.
Allow domain-object specific captions using CrudFormFactory.
Crud UI Add-on version 3.8.1
Allow setting values in FieldCreationListeners
Crud UI Add-on version 3.9.0
Crud UI Add-on version 4.0.0
- Updated to Vaadin 14.0.2
- Fixes #34 Method to set a Converter for a specific field
Crud UI Add-on version 4.0.1
Fixes #56 flow-build-info.json shoudn't be included in JAR
Crud UI Add-on version 4.1.0
* The Grid component in is no longer size full.
* OffsetBasedPageRequest now uses Vaadin's QuerySortOrder (Spring Data).
Crud UI Add-on version 4.2.0
Loosen generic to allow use of TreeDataProvider
Bumps up Vaadin version 14.1.25
Crud UI Add-on version 4.3.0
Fixes #67 this.domainType.newInstance(); Does not work with no public constructor.
Crud UI Add-on version 4.3.1
Fixes #59 Custom converter is not working in CrudFormFactory
Crud UI Add-on version 4.3.2
* Fixes #72 setFindAllOperationVisible always sets visibility to false, ignoring the passed value
* Uses serializable versions of Producer and Consumer
Crud UI Add-on version 4.4.0
Updates to Vaadin 14.5.3
Fixes #82 Exceptions in CRUD operations show success message
Crud UI Add-on version 4.4.1
Fixes #92 Issue with dialog buttons in some use cases
Crud UI Add-on version 4.5.0
Updated to Vaadin 19.
Crud UI Add-on version 4.6.0
Fixes #94 Add support for colspan in DefaultCrudFormFactory
Updated to Vaadin 20
Crud UI Add-on version 5.0.0
Updated to Vaadin 21.0.3.
Crud UI Add-on version 5.1.0
Adds TreeGridCRUD implementation which uses TreeGrid (contributed by Boniface Chacha).
Crud UI Add-on version 6.0.0
Vaadin 23 support.
FieldProvider (PR #102, thanks XakepSDK for the contribution)
Crud UI Add-on version 6.1.0
- Show error messages from CrudOperationException when relevant
- Provide ENTER shortcut for operation button on the form
- New method on Grid to add an optional Update button column
- New method on form factory to enable/disable notifications, cf. the existing method on Grid
(All features contributed by Paul Parlett. Thanks a lot, Paul!)
Crud UI Add-on version 6.2.0
Requires Java 11 and Vaadin 23.1.3. Fixes base FieldProvider generics
Thanks to Boniface Chacha for the contributions.
Crud UI Add-on version 7.0.0
Supports Vaadin 24
Crud UI Add-on version 7.1.0
- Bump several dependencies for Vaadin 24.0.5 (by Francisco A. Lozano)
- Allow overriding behaviors in `AbstractAutoGeneratedCrudFormFactory` (by Francisco A. Lozano)
Crud UI Add-on version 7.1.2
Fixes #51 - Prevent form from closing if add/edit operation fails with exception.
Scroll to added/updated item in GridCrud.
Updated to Java 21 and Vaadin 24.4.4
Crud UI Add-on version 7.2.0
- Fixes [#127](https://github.com/alejandro-du/crudui/issues/127) (and [#136](https://github.com/alejandro-du/crudui/issues/136)) Binding Exception with Double type in GridCrud using NumberField (thanks Matti Tahvonen!)
- Fixes [#125](https://github.com/alejandro-du/crudui/issues/125) - Not support LocalDateTime type (thanks Matti Tahvonen!)
- Fixes exception when using TreeGrid
- Fixes [#133](https://github.com/alejandro-du/crudui/issues/133) - Translated captions (form titles)
- Fixes [#135](https://github.com/alejandro-du/crudui/issues/135) - NullPointerException if all operations are sent null (thanks duclad!)
Crud UI Add-on version 8.0.0
- New fluent API (breaks previous API)
- Java 21
- Vaadin 25.2.3+