Skip to content

Commit

Permalink
dashboard: support "position" when PATCHing a dashboard item
Browse files Browse the repository at this point in the history
  • Loading branch information
teosarca committed Jun 30, 2017
1 parent 802772b commit e4b821c
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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<Integer> 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<Integer> retrieveDashboardItemIdsOrdered(final int dashboardId, final DashboardWidgetType dashboardWidgetType)
Expand All @@ -515,7 +554,6 @@ private List<Integer> retrieveDashboardItemIdsOrdered(final int dashboardId, fin
//
.create()
.listIds();

}

private final int retrieveLastSeqNo(final int dashboardId, final DashboardWidgetType dashboardWidgetType)
Expand Down Expand Up @@ -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<Integer> dashboardOrderedItemIds;

public boolean isPositionChanged()
{
return dashboardOrderedItemIds != null && !dashboardOrderedItemIds.isEmpty();
}
}
}

0 comments on commit e4b821c

Please sign in to comment.