Add-on Directory

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 Crud UI Add-on - Vaadin Add-on Directory
[![Published on Vaadin Directory](https://img.shields.io/badge/Vaadin%20Directory-published-00b4f0.svg)](https://vaadin.com/directory/component/crud-ui-add-on) [![Stars on Vaadin Directory](https://img.shields.io/vaadin-directory/star/crud-ui-add-on.svg)](https://vaadin.com/directory/component/crud-ui-add-on) [![Latest version on vaadin.com/directory](https://img.shields.io/vaadin-directory/v/crud-ui-add-on.svg)](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>)` - `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+