commit 6158305fed780e0b652f08c06043205ce15f8003 Author: Trang Truong Thi Huyen Date: Tue May 26 17:49:12 2015 +0700 MGNLUI-3415: process for one or multi item(s) selection of an action diff --git a/magnolia-ui-contentapp/src/main/java/info/magnolia/ui/contentapp/browser/BrowserPresenter.java b/magnolia-ui-contentapp/src/main/java/info/magnolia/ui/contentapp/browser/BrowserPresenter.java index 445d84f..8ed7b5f 100644 --- a/magnolia-ui-contentapp/src/main/java/info/magnolia/ui/contentapp/browser/BrowserPresenter.java +++ b/magnolia-ui-contentapp/src/main/java/info/magnolia/ui/contentapp/browser/BrowserPresenter.java @@ -368,8 +368,14 @@ public class BrowserPresenter implements ActionbarPresenter.Listener, BrowserVie selectedItems.add(contentConnector.getItem(idIt.next())); } - argList.add(selectedItems); - argList.add(selectedItems.isEmpty() ? new NullItem() : selectedItems.get(0)); + if (selectedItems.size() <= 1) { + // we have a simple selection; action implementation may expect either an item, either a list parameter, so we have to support both. + argList.add(selectedItems.isEmpty() ? new NullItem() : selectedItems.get(0)); + argList.add(selectedItems); + } else { + // we have a multiple selection; action implementation must support a list parameter, no way around that. + argList.add(selectedItems); + } return argList.toArray(new Object[argList.size()]); } } diff --git a/magnolia-ui-contentapp/src/test/java/info/magnolia/ui/contentapp/browser/BrowserPresenterTest.java b/magnolia-ui-contentapp/src/test/java/info/magnolia/ui/contentapp/browser/BrowserPresenterTest.java index 91e1e0a..439aaf3 100644 --- a/magnolia-ui-contentapp/src/test/java/info/magnolia/ui/contentapp/browser/BrowserPresenterTest.java +++ b/magnolia-ui-contentapp/src/test/java/info/magnolia/ui/contentapp/browser/BrowserPresenterTest.java @@ -33,6 +33,7 @@ */ package info.magnolia.ui.contentapp.browser; +import static org.hamcrest.Matchers.arrayWithSize; import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; @@ -85,6 +86,7 @@ import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import com.vaadin.data.Item; import com.vaadin.data.Property; /** @@ -338,4 +340,56 @@ public class BrowserPresenterTest { verify(availabilityChecker).isAvailable(eq(availability), anyList()); } + + @Test + public void handleMultiSelectedItemsOnActionClick() throws Exception { + + // GIVEN + Node node1 = session.getRootNode().addNode("node1"); + Node node2 = session.getRootNode().addNode("node2"); + List ids = new ArrayList(); + ids.add(node1.getIdentifier()); + ids.add(node2.getIdentifier()); + when(presenter.getSelectedItemIds()).thenReturn(ids); + + List selectedItems = new ArrayList(); + selectedItems.add(contentConnector.getItem(ids.get(0))); + selectedItems.add(contentConnector.getItem(ids.get(1))); + + ConfiguredActionDefinition myActionDefinition = new ConfiguredActionDefinition(); + myActionDefinition.setName("myAction"); + doReturn(myActionDefinition).when(actionExecutor).getActionDefinition(myActionDefinition.getName()); + when(availabilityChecker.isAvailable(myActionDefinition.getAvailability(), ids)).thenReturn(true); + + // WHEN + presenter.onActionbarItemClicked(myActionDefinition.getName()); + + // THEN + verify(actionExecutor).execute(eq(myActionDefinition.getName()), eq(selectedItems)); + assertThat(selectedItems.toArray(), arrayWithSize(2)); + } + + @Test + public void handleOneSelectedItemOnActionClick() throws Exception { + + // GIVEN + List ids = new ArrayList(); + ids.add(node.getIdentifier()); + when(presenter.getSelectedItemIds()).thenReturn(ids); + + List selectedItems = new ArrayList(); + selectedItems.add(contentConnector.getItem(ids.get(0))); + + ConfiguredActionDefinition myActionDefinition = new ConfiguredActionDefinition(); + myActionDefinition.setName("myAction"); + + doReturn(myActionDefinition).when(actionExecutor).getActionDefinition(myActionDefinition.getName()); + when(availabilityChecker.isAvailable(myActionDefinition.getAvailability(), ids)).thenReturn(true); + + // WHEN + presenter.onActionbarItemClicked(myActionDefinition.getName()); + + // THEN + verify(actionExecutor).execute(eq(myActionDefinition.getName()), eq(selectedItems.get(0)), eq(selectedItems)); + } }