diff --git a/src/main/java/de/metas/ui/web/dashboard/DashboardRestController.java b/src/main/java/de/metas/ui/web/dashboard/DashboardRestController.java index ec95b65a2..58357b5d6 100644 --- a/src/main/java/de/metas/ui/web/dashboard/DashboardRestController.java +++ b/src/main/java/de/metas/ui/web/dashboard/DashboardRestController.java @@ -23,9 +23,11 @@ import de.metas.ui.web.config.WebConfig; import de.metas.ui.web.dashboard.UserDashboardRepository.DashboardItemPatchPath; import de.metas.ui.web.dashboard.UserDashboardRepository.DashboardPatchPath; +import de.metas.ui.web.dashboard.UserDashboardRepository.UserDashboardItemChangeResult; import de.metas.ui.web.dashboard.UserDashboardRepository.UserDashboardKey; import de.metas.ui.web.dashboard.json.JSONDashboard; import de.metas.ui.web.dashboard.json.JSONDashboardChangedEventsList; +import de.metas.ui.web.dashboard.json.JSONDashboardChangedEventsList.JSONDashboardChangedEventsListBuilder; import de.metas.ui.web.dashboard.json.JSONDashboardItem; import de.metas.ui.web.dashboard.json.JSONDashboardItemChangedEvent; import de.metas.ui.web.dashboard.json.JSONDashboardOrderChangedEvent; @@ -285,17 +287,27 @@ private final JSONDashboardItem changeDashboardItem(final DashboardWidgetType wi // // Chage the dashboard item final UserDashboardItemChangeRequest request = UserDashboardItemChangeRequest.of(widgetType, itemId, userSession.getAD_Language(), events); - userDashboardRepo.changeUserDashboardItem(getUserDashboardForWriting(), request); + final UserDashboardItemChangeResult changeResult = userDashboardRepo.changeUserDashboardItem(getUserDashboardForWriting(), request); // // Notify on websocket final UserDashboard dashboard = getUserDashboardForReading(); - sendEvents(dashboard, JSONDashboardChangedEventsList.builder() - .event(JSONDashboardItemChangedEvent.of(dashboard.getId(), itemId)) - .build()); + { + final JSONDashboardChangedEventsListBuilder eventBuilder = JSONDashboardChangedEventsList.builder() + .event(JSONDashboardItemChangedEvent.of(changeResult.getDashboardId(), changeResult.getItemId())); + + if(changeResult.isPositionChanged()) + { + eventBuilder.event(JSONDashboardOrderChangedEvent.of(changeResult.getDashboardId(), changeResult.getDashboardWidgetType(), changeResult.getDashboardOrderedItemIds())); + } + + sendEvents(dashboard, eventBuilder.build()); + } // Return the changed item - final UserDashboardItem item = dashboard.getItemById(DashboardWidgetType.KPI, itemId); - return JSONDashboardItem.of(item, newJSONOpts()); + { + final UserDashboardItem item = dashboard.getItemById(widgetType, itemId); + return JSONDashboardItem.of(item, newJSONOpts()); + } } } diff --git a/src/main/java/de/metas/ui/web/dashboard/UserDashboardItemChangeRequest.java b/src/main/java/de/metas/ui/web/dashboard/UserDashboardItemChangeRequest.java index 15bf15e98..2a7c7c6ef 100644 --- a/src/main/java/de/metas/ui/web/dashboard/UserDashboardItemChangeRequest.java +++ b/src/main/java/de/metas/ui/web/dashboard/UserDashboardItemChangeRequest.java @@ -84,6 +84,11 @@ else if (DashboardItemPatchPath.when.equals(path)) final JSONWhen when = event.getValueAsEnum(JsonUserDashboardItemAddRequest.JSONWhen.class); changeRequestBuilder.when(when); } + else if (DashboardItemPatchPath.position.equals(path)) + { + final int position = event.getValueAsInteger(-1); + changeRequestBuilder.position(position); + } else { throw new AdempiereException("Unknown path").setParameter("event", event).setParameter("availablePaths", Arrays.asList(DashboardItemPatchPath.values())); @@ -108,11 +113,13 @@ else if (DashboardItemPatchPath.when.equals(path)) private final String caption; private final JSONInterval interval; private final JSONWhen when; + private final int position; public boolean isEmpty() { return Check.isEmpty(caption, true) && interval == null - && when == null; + && when == null + && position < 0; } } diff --git a/src/main/java/de/metas/ui/web/dashboard/UserDashboardRepository.java b/src/main/java/de/metas/ui/web/dashboard/UserDashboardRepository.java index f57b405ce..c07361269 100644 --- a/src/main/java/de/metas/ui/web/dashboard/UserDashboardRepository.java +++ b/src/main/java/de/metas/ui/web/dashboard/UserDashboardRepository.java @@ -10,6 +10,7 @@ import java.util.concurrent.Callable; import java.util.stream.Collectors; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import org.adempiere.ad.dao.IQueryBL; @@ -42,7 +43,9 @@ import de.metas.ui.web.base.model.I_WEBUI_Dashboard; import de.metas.ui.web.base.model.I_WEBUI_DashboardItem; import de.metas.ui.web.base.model.I_WEBUI_KPI; +import de.metas.ui.web.dashboard.UserDashboardRepository.UserDashboardItemChangeResult.UserDashboardItemChangeResultBuilder; import de.metas.ui.web.window.datatypes.json.JSONPatchEvent; +import lombok.Builder; import lombok.NonNull; import lombok.Value; @@ -413,7 +416,7 @@ public int addUserDashboardItem(final UserDashboard userDashboard, @NonNull fina return executeChangeActionAndInvalidateAndReturn(dashboardId, () -> { // // Create dashboard item in database (will be added last). - final int itemId = createAndSaveDashboardItem(dashboardId, request); + final int itemId = createUserDashboardItemAndSave(dashboardId, request); // // Calculate item's position @@ -437,7 +440,7 @@ public int addUserDashboardItem(final UserDashboard userDashboard, @NonNull fina }); } - private int createAndSaveDashboardItem(final int dashboardId, @NonNull final UserDashboardItemAddRequest request) + private int createUserDashboardItemAndSave(final int dashboardId, @NonNull final UserDashboardItemAddRequest request) { // // Get the KPI @@ -490,17 +493,53 @@ public void deleteUserDashboardItem(final UserDashboard dashboard, final Dashboa public static enum DashboardItemPatchPath { - caption, interval, when + caption, interval, when, position } - public void changeUserDashboardItem(final UserDashboard dashboard, final UserDashboardItemChangeRequest request) + public UserDashboardItemChangeResult changeUserDashboardItem(final UserDashboard dashboard, final UserDashboardItemChangeRequest request) { - dashboard.assertItemIdExists(request.getWidgetType(), request.getItemId()); final int dashboardId = dashboard.getId(); + final DashboardWidgetType dashboardWidgetType = request.getWidgetType(); + final int itemId = request.getItemId(); + + dashboard.assertItemIdExists(dashboardWidgetType, itemId); // // Execute the change request - executeChangeActionAndInvalidate(dashboardId, () -> changeUserDashboardItemAndSave(request)); + return executeChangeActionAndInvalidateAndReturn(dashboardId, () -> { + final UserDashboardItemChangeResultBuilder resultBuilder = UserDashboardItemChangeResult.builder() + .dashboardId(dashboardId) + .dashboardWidgetType(dashboardWidgetType) + .itemId(itemId); + + // + // Actually change the item content + changeUserDashboardItemAndSave(request); + + // + // Change item's position + final int position = request.getPosition(); + if (position >= 0) + { + final List allItemIdsOrdered = new ArrayList<>(retrieveDashboardItemIdsOrdered(dashboardId, dashboardWidgetType)); + + if (position == Integer.MAX_VALUE || position > allItemIdsOrdered.size() - 1) + { + allItemIdsOrdered.remove((Object)itemId); + allItemIdsOrdered.add(itemId); + } + else + { + allItemIdsOrdered.remove((Object)itemId); + allItemIdsOrdered.add(position, itemId); + } + + updateUserDashboardItemsOrder(dashboardId, allItemIdsOrdered); + resultBuilder.dashboardOrderedItemIds(ImmutableList.copyOf(allItemIdsOrdered)); + } + + return resultBuilder.build(); + }); } private List retrieveDashboardItemIdsOrdered(final int dashboardId, final DashboardWidgetType dashboardWidgetType) @@ -515,7 +554,6 @@ private List retrieveDashboardItemIdsOrdered(final int dashboardId, fin // .create() .listIds(); - } private final int retrieveLastSeqNo(final int dashboardId, final DashboardWidgetType dashboardWidgetType) @@ -556,4 +594,20 @@ private UserDashboardKey(final int adClientId) } } + @Value + @Builder + public static final class UserDashboardItemChangeResult + { + private final int dashboardId; + private final DashboardWidgetType dashboardWidgetType; + private final int itemId; + + @Nullable + private ImmutableList dashboardOrderedItemIds; + + public boolean isPositionChanged() + { + return dashboardOrderedItemIds != null && !dashboardOrderedItemIds.isEmpty(); + } + } }