Merge "Enhance plugin extension panels to allow ordering per a config"

This commit is contained in:
Martin Fick
2017-04-04 14:25:53 +00:00
committed by Gerrit Code Review
11 changed files with 149 additions and 19 deletions

View File

@@ -100,9 +100,9 @@ public class ApiGlue {
var s = new SettingsScreenDefinition(p,m,c);
(this.settingsScreens[n] || (this.settingsScreens[n]=[])).push(s);
},
panel: function(i,c){this._panel(this.getPluginName(),i,c)},
_panel: function(n,i,c){
var p = new PanelDefinition(n,c);
panel: function(i,c,n){this._panel(this.getPluginName(),i,c,n)},
_panel: function(n,i,c,x){
var p = new PanelDefinition(n,c,x);
(this.panels[i] || (this.panels[i]=[])).push(p);
},

View File

@@ -22,7 +22,10 @@ import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -32,13 +35,18 @@ public class ExtensionPanel extends FlowPanel {
private final List<Context> contexts;
public ExtensionPanel(GerritUiExtensionPoint extensionPoint) {
this.extensionPoint = extensionPoint;
this.contexts = create();
this(extensionPoint, new ArrayList<String>());
}
private List<Context> create() {
List<Context> contexts = new ArrayList<>();
for (Definition def : Natives.asList(Definition.get(extensionPoint.name()))) {
public ExtensionPanel(GerritUiExtensionPoint extensionPoint,
List<String> panelNames) {
this.extensionPoint = extensionPoint;
this.contexts = create(panelNames);
}
private List<Context> create(List<String> panelNames) {
List<Context> contexts = new ArrayList<Context>();
for (Definition def : getOrderedDefs(panelNames)) {
SimplePanel p = new SimplePanel();
add(p);
contexts.add(Context.create(def, p));
@@ -46,6 +54,45 @@ public class ExtensionPanel extends FlowPanel {
return contexts;
}
private List<Definition> getOrderedDefs(List<String> panelNames) {
if (panelNames == null) {
panelNames = Collections.emptyList();
}
Map<String, List<Definition>> defsOrderedByName =
new LinkedHashMap<String, List<Definition>>();
for (String name : panelNames) {
defsOrderedByName.put(name, new ArrayList<Definition>());
}
for (Definition def : Natives.asList(
Definition.get(extensionPoint.name()))) {
addDef(def, defsOrderedByName);
}
List<Definition> orderedDefs = new ArrayList<Definition>();
for (List<Definition> defList : defsOrderedByName.values()) {
orderedDefs.addAll(defList);
}
return orderedDefs;
}
private static void addDef(Definition def,
Map<String, List<Definition>> defsOrderedByName) {
String panelName = def.getPanelName();
if (panelName.equals(def.getPluginName() + ".undefined")) {
/* Handle a partially undefined panel name from the
javascript layer by generating a random panel name.
This maintains support for panels that do not provide a name. */
panelName = def.getPluginName() + "." + Long.toHexString(
Double.doubleToLongBits(Math.random()));
}
if (defsOrderedByName.containsKey(panelName)) {
defsOrderedByName.get(panelName).add(def);
} else if (defsOrderedByName.containsKey(def.getPluginName())) {
defsOrderedByName.get(def.getPluginName()).add(def);
} else {
defsOrderedByName.put(panelName, Collections.singletonList(def));
}
}
public void put(GerritUiExtensionPoint.Key key, String value) {
for (Context ctx : contexts) {
ctx.put(key.name(), value);
@@ -103,9 +150,10 @@ public class ExtensionPanel extends FlowPanel {
static final JavaScriptObject TYPE = init();
private static native JavaScriptObject init() /*-{
function PanelDefinition(n, c) {
function PanelDefinition(n, c, x) {
this.pluginName = n;
this.onLoad = c;
this.name = x;
};
return PanelDefinition;
}-*/;
@@ -113,6 +161,9 @@ public class ExtensionPanel extends FlowPanel {
static native JsArray<Definition> get(String i) /*-{ return $wnd.Gerrit.panels[i] || [] }-*/;
protected Definition() {}
public final native String getPanelName() /*-{ return this.pluginName + "." + this.name; }-*/;
public final native String getPluginName() /*-{ return this.pluginName; }-*/;
}
static class Context extends JavaScriptObject {

View File

@@ -68,7 +68,7 @@ final class Plugin extends JavaScriptObject {
onAction: function(t,n,c){G._onAction(this.name,t,n,c)},
screen: function(p,c){G._screen(this.name,p,c)},
settingsScreen: function(p,m,c){G._settingsScreen(this.name,p,m,c)},
panel: function(i,c){G._panel(this.name,i,c)},
panel: function(i,c,n){G._panel(this.name,i,c,n)},
url: function (u){return G.url(this._url(u))},
get: function(u,b){@com.google.gerrit.client.api.ActionContext::get(

View File

@@ -309,8 +309,7 @@ public class ChangeScreen extends Screen {
@Override
public void onSuccess(final ChangeInfo info) {
info.init();
addExtensionPoints(info, initCurrentRevision(info));
initCurrentRevision(info);
final RevisionInfo rev = info.revision(revision);
CallbackGroup group = new CallbackGroup();
loadCommit(rev, group);
@@ -379,7 +378,8 @@ public class ChangeScreen extends Screen {
return resolveRevisionToDisplay(info);
}
private void addExtensionPoints(ChangeInfo change, RevisionInfo rev) {
private void addExtensionPoints(ChangeInfo change, RevisionInfo rev,
Entry result) {
addExtensionPoint(GerritUiExtensionPoint.CHANGE_SCREEN_HEADER, headerExtension, change, rev);
addExtensionPoint(
GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_BUTTONS,
@@ -392,7 +392,10 @@ public class ChangeScreen extends Screen {
change,
rev);
addExtensionPoint(
GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK, changeExtension, change, rev);
GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK,
changeExtension, change, rev,
result.getExtensionPanelNames(
GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK.toString()));
addExtensionPoint(
GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_RELATED_INFO_BLOCK,
relatedExtension,
@@ -408,13 +411,19 @@ public class ChangeScreen extends Screen {
}
private void addExtensionPoint(
GerritUiExtensionPoint extensionPoint, Panel p, ChangeInfo change, RevisionInfo rev) {
ExtensionPanel extensionPanel = new ExtensionPanel(extensionPoint);
GerritUiExtensionPoint extensionPoint, Panel p, ChangeInfo change,
RevisionInfo rev, List<String> panelNames) {
ExtensionPanel extensionPanel = new ExtensionPanel(extensionPoint, panelNames);
extensionPanel.putObject(GerritUiExtensionPoint.Key.CHANGE_INFO, change);
extensionPanel.putObject(GerritUiExtensionPoint.Key.REVISION_INFO, rev);
p.add(extensionPanel);
}
private void addExtensionPoint(
GerritUiExtensionPoint extensionPoint, Panel p, ChangeInfo change, RevisionInfo rev) {
addExtensionPoint(extensionPoint, p, change, rev, Collections.emptyList());
}
private boolean enableSignedPush() {
return Gerrit.info().receive().enableSignedPush();
}
@@ -1031,6 +1040,14 @@ public class ChangeScreen extends Screen {
loadRevisionInfo();
}
});
ConfigInfoCache.get(
info.projectNameKey(),
new GerritCallback<Entry>() {
@Override
public void onSuccess(Entry entry) {
addExtensionPoints(info, rev, entry);
}
});
}
private void updateToken(ChangeInfo info, DiffObject base, RevisionInfo rev) {

View File

@@ -116,6 +116,8 @@ public class ConfigInfo extends JavaScriptObject {
final native ThemeInfo theme() /*-{ return this.theme; }-*/;
final native NativeMap<JsArrayString> extensionPanelNames() /*-{ return this.extension_panel_names; }-*/;
protected ConfigInfo() {}
static class CommentLinkInfo extends JavaScriptObject {

View File

@@ -16,12 +16,16 @@ package com.google.gerrit.client.projects;
import com.google.gerrit.client.changes.ChangeApi;
import com.google.gerrit.client.info.ChangeInfo;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** Cache of {@link ConfigInfo} objects by project name. */
@@ -48,6 +52,10 @@ public class ConfigInfoCache {
public ThemeInfo getTheme() {
return info.theme();
}
public List<String> getExtensionPanelNames(String extensionPoint) {
return Natives.asList(info.extensionPanelNames().get(extensionPoint));
}
}
public static void get(Project.NameKey name, AsyncCallback<Entry> cb) {