From bb5973c7f63f348026581be63fe38314e9dd6487 Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Fri, 13 Nov 2026 14:00:25 -0300 Subject: [PATCH 1/2] feat: allow customizing the button texts of a row action confirmation Close #22 --- .../easygrid/actions/EasyRowAction.java | 30 ++++++++- .../addons/easygrid/RowActionsDemo.java | 2 +- .../easygrid/actions/EasyRowActionTest.java | 67 ++++++++++++++++++- 3 files changed, 94 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowAction.java b/src/main/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowAction.java index f3a2bcc..16774b8 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowAction.java +++ b/src/main/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowAction.java @@ -219,8 +219,34 @@ public EasyRowAction withConfirmation(String title, return withConfirmation(title, messageProvider, "Ok", "Cancel"); } - private EasyRowAction withConfirmation(String title, - ValueProvider messageProvider, String confirmText, String cancelText) { + /** + * Configures a confirmation dialog with a title, a message and custom texts for the confirm and + * cancel buttons before the action is executed. + * + * @param title the dialog title, or {@code null} for a dialog without a heading + * @param message the confirmation message + * @param confirmText the text of the confirm button + * @param cancelText the text of the cancel button + * @return this action, for method chaining + */ + public EasyRowAction withConfirmation(String title, String message, + @NonNull String confirmText, @NonNull String cancelText) { + return withConfirmation(title, Constant.of(message), confirmText, cancelText); + } + + /** + * Configures a confirmation dialog with a static title and custom texts for the confirm and + * cancel buttons, whose message is computed from the row item when the action is clicked. + * + * @param title the dialog title, or {@code null} for a dialog without a heading + * @param messageProvider a function that returns the confirmation message for a given row item + * @param confirmText the text of the confirm button + * @param cancelText the text of the cancel button + * @return this action, for method chaining + */ + public EasyRowAction withConfirmation(String title, + @NonNull ValueProvider messageProvider, @NonNull String confirmText, + @NonNull String cancelText) { confirmDialogFactory = item -> { var dialog = new ConfirmDialog(); dialog.setHeader(title); diff --git a/src/test/java/com/flowingcode/vaadin/addons/easygrid/RowActionsDemo.java b/src/test/java/com/flowingcode/vaadin/addons/easygrid/RowActionsDemo.java index 4e1eb71..b281cdb 100644 --- a/src/test/java/com/flowingcode/vaadin/addons/easygrid/RowActionsDemo.java +++ b/src/test/java/com/flowingcode/vaadin/addons/easygrid/RowActionsDemo.java @@ -66,7 +66,7 @@ public RowActionsDemo() { Notification.show("Deactivated: " + person.getFirstName() + " " + person.getLastName())) .visibleWhen(Person::isActive) .withConfirmation("Deactivate person", - "Are you sure you want to deactivate this person?") + "Are you sure you want to deactivate this person?", "Deactivate", "Keep active") .addThemeVariants(ButtonVariant.LUMO_ERROR); // Visible only for inactive persons diff --git a/src/test/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowActionTest.java b/src/test/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowActionTest.java index 088e573..2b9c057 100644 --- a/src/test/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowActionTest.java +++ b/src/test/java/com/flowingcode/vaadin/addons/easygrid/actions/EasyRowActionTest.java @@ -222,8 +222,8 @@ public void tooltipOverridesManualTitle() { } // --- confirmation dialog contents --- - // The dialog is built at click time, so its title and message are read back from the - // ConfirmDialog element properties that setHeader/setText write. + // The dialog is built at click time, so its texts are read back from the ConfirmDialog + // element properties that setHeader/setText/setConfirmText/setCancelText write. private static String headerOf(ConfirmDialog dialog) { return dialog.getElement().getProperty("header"); @@ -233,6 +233,14 @@ private static String messageOf(ConfirmDialog dialog) { return dialog.getElement().getProperty("message"); } + private static String confirmTextOf(ConfirmDialog dialog) { + return dialog.getElement().getProperty("confirmText"); + } + + private static String cancelTextOf(ConfirmDialog dialog) { + return dialog.getElement().getProperty("cancelText"); + } + @Test public void withConfirmation_noConfirmation_hasNoDialog() { var action = new EasyRowAction(null, Constant.of("X"), null, item -> {}); @@ -287,6 +295,61 @@ public void withConfirmation_providerIsEvaluatedPerDialog() { assertEquals("Message 2", messageOf(action.getConfirmDialog(7))); } + @Test + public void withConfirmation_defaultButtonTexts() { + var action = new EasyRowAction(null, Constant.of("X"), null, item -> {}); + action.withConfirmation("Confirm", "Proceed?"); + ConfirmDialog dialog = action.getConfirmDialog(7); + assertEquals("Ok", confirmTextOf(dialog)); + assertEquals("Cancel", cancelTextOf(dialog)); + } + + @Test + public void withConfirmation_titleMessageAndButtonTexts_setsAllTexts() { + var action = new EasyRowAction(null, Constant.of("X"), null, item -> {}); + action.withConfirmation("Confirm", "Proceed?", "Yes", "No"); + ConfirmDialog dialog = action.getConfirmDialog(7); + assertEquals("Confirm", headerOf(dialog)); + assertEquals("Proceed?", messageOf(dialog)); + assertEquals("Yes", confirmTextOf(dialog)); + assertEquals("No", cancelTextOf(dialog)); + } + + @Test + public void withConfirmation_nullTitleMessageAndButtonTexts_hasNoHeader() { + var action = new EasyRowAction(null, Constant.of("X"), null, item -> {}); + action.withConfirmation(null, "Proceed?", "Yes", "No"); + ConfirmDialog dialog = action.getConfirmDialog(7); + assertNull(headerOf(dialog)); + assertEquals("Proceed?", messageOf(dialog)); + assertEquals("Yes", confirmTextOf(dialog)); + assertEquals("No", cancelTextOf(dialog)); + } + + @Test + public void withConfirmation_messageProviderAndButtonTexts_setsAllTexts() { + var action = new EasyRowAction(null, Constant.of("X"), null, item -> {}); + action.withConfirmation("Delete", item -> "Delete item " + item + "?", "Delete", "Keep"); + ConfirmDialog dialog = action.getConfirmDialog(7); + assertEquals("Delete", headerOf(dialog)); + assertEquals("Delete item 7?", messageOf(dialog)); + assertEquals("Delete", confirmTextOf(dialog)); + assertEquals("Keep", cancelTextOf(dialog)); + assertEquals("Delete item 8?", messageOf(action.getConfirmDialog(8))); + } + + @Test(expected = NullPointerException.class) + public void withConfirmation_nullConfirmText_throws() { + var action = new EasyRowAction(null, Constant.of("X"), null, item -> {}); + action.withConfirmation("Confirm", "Proceed?", null, "Cancel"); + } + + @Test(expected = NullPointerException.class) + public void withConfirmation_nullCancelText_throws() { + var action = new EasyRowAction(null, Constant.of("X"), null, item -> {}); + action.withConfirmation("Confirm", item -> "Proceed?", "Ok", null); + } + // --- execute: server-side enabledWhen guard --- @Test From 609713f46db075658ab9de329b4f2cd9f9a2fee7 Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Fri, 13 Nov 2026 14:01:22 -0300 Subject: [PATCH 2/2] build: bump version to 1.2.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 12b723c..1f5b392 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.flowingcode.vaadin.addons easy-grid-addon - 1.1.1-SNAPSHOT + 1.2.0-SNAPSHOT Easy Grid Add-on Easy Grid Add-on for Vaadin Flow https://www.flowingcode.com/en/open-source/