From 7941a187c3fe3485762c140bed90b5ac1b57209b Mon Sep 17 00:00:00 2001 From: Edwin Kempin Date: Tue, 25 Mar 2014 01:59:25 +0100 Subject: [PATCH] Populate 'My' menu from user preferences Instead of hard coding the 'My' menu on client side the menu will now be populated from the user preferences which are returned from the server. On server side the menu items are still hard coded, but follow-up changes will make it configurable per user. The idea is that users should be able to configure custom dashboards that they want to link under the 'My' menu. Change-Id: I6aec34045777114027e5f3f3d37102f67b1036ed Signed-off-by: Edwin Kempin --- .../java/com/google/gerrit/client/Gerrit.java | 24 ++++++++++++----- .../gerrit/client/account/Preferences.java | 27 +++++++++++++++++++ .../gerrit/server/account/GetPreferences.java | 16 +++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Preferences.java diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java index cd2cccdca2..20a454bce4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java @@ -18,8 +18,10 @@ import static com.google.gerrit.common.data.GlobalCapability.ADMINISTRATE_SERVER import static com.google.gerrit.common.data.GlobalCapability.CREATE_GROUP; import static com.google.gerrit.common.data.GlobalCapability.CREATE_PROJECT; +import com.google.gerrit.client.account.AccountApi; import com.google.gerrit.client.account.AccountCapabilities; import com.google.gerrit.client.account.AccountInfo; +import com.google.gerrit.client.account.Preferences; import com.google.gerrit.client.admin.ProjectScreen; import com.google.gerrit.client.api.ApiGlue; import com.google.gerrit.client.api.PluginLoader; @@ -70,6 +72,7 @@ import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.History; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window.Location; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FocusPanel; @@ -585,14 +588,21 @@ public class Gerrit implements EntryPoint { menuLeft.add(m, C.menuAll()); if (signedIn) { - m = new LinkMenuBar(); + final LinkMenuBar myBar = new LinkMenuBar(); menuBars.put(GerritTopMenu.MY.menuName, m); - addLink(m, C.menuMyChanges(), PageLinks.MINE); - addLink(m, C.menuMyDrafts(), PageLinks.toChangeQuery("is:draft")); - addLink(m, C.menuMyDraftComments(), PageLinks.toChangeQuery("has:draft")); - addLink(m, C.menuMyWatchedChanges(), PageLinks.toChangeQuery("is:watched status:open")); - addLink(m, C.menuMyStarredChanges(), PageLinks.toChangeQuery("is:starred")); - menuLeft.add(m, C.menuMine()); + AccountApi.self().view("preferences").get(new AsyncCallback() { + @Override + public void onSuccess(Preferences prefs) { + for (TopMenuItem item : Natives.asList(prefs.my())) { + addExtensionLink(myBar, item); + } + } + + @Override + public void onFailure(Throwable caught) { + } + }); + menuLeft.add(myBar, C.menuMine()); menuLeft.selectTab(1); } else { menuLeft.selectTab(0); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Preferences.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Preferences.java new file mode 100644 index 0000000000..d102ca28d2 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Preferences.java @@ -0,0 +1,27 @@ +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.client.account; + +import com.google.gerrit.client.extensions.TopMenuItem; +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.core.client.JsArray; + +public class Preferences extends JavaScriptObject { + + public final native JsArray my() /*-{ return this.my; }-*/; + + protected Preferences() { + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java index 8eb6947617..b36dee0945 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java @@ -17,6 +17,7 @@ package com.google.gerrit.server.account; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestReadView; +import com.google.gerrit.extensions.webui.TopMenu; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen; @@ -32,6 +33,9 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; +import java.util.ArrayList; +import java.util.List; + public class GetPreferences implements RestReadView { private final Provider self; private final Provider db; @@ -74,6 +78,7 @@ public class GetPreferences implements RestReadView { CommentVisibilityStrategy commentVisibilityStrategy; DiffView diffView; ChangeScreen changeScreen; + List my; PreferenceInfo(AccountGeneralPreferences p) { changesPerPage = p.getMaximumPageSize(); @@ -91,6 +96,17 @@ public class GetPreferences implements RestReadView { commentVisibilityStrategy = p.getCommentVisibilityStrategy(); diffView = p.getDiffView(); changeScreen = p.getChangeScreen(); + my = my(); + } + + private List my() { + List my = new ArrayList<>(); + my.add(new TopMenu.MenuItem("Changes", "#/", "")); + my.add(new TopMenu.MenuItem("Drafts", "#/q/is:draft", "")); + my.add(new TopMenu.MenuItem("Draft Comments", "#/q/has:draft", "")); + my.add(new TopMenu.MenuItem("Watched Changes", "#/q/is:watched+is:open", "")); + my.add(new TopMenu.MenuItem("Starred Changes", "#/q/is:starred", "")); + return my; } } }