Merge "Merge doc and change searches."

This commit is contained in:
Dave Borowitz 2015-11-25 17:55:31 +00:00 committed by Gerrit Code Review
commit 9a90351e8d
10 changed files with 73 additions and 8 deletions

View File

@ -115,6 +115,7 @@ As result a link:#server-info[ServerInfo] entity is returned.
"gerrit": { "gerrit": {
"all_projects": "All-Projects", "all_projects": "All-Projects",
"all_users": "All-Users" "all_users": "All-Users"
"doc_search": true
}, },
"sshd": {}, "sshd": {},
"suggest": { "suggest": {
@ -1189,6 +1190,8 @@ Name of the link:config-gerrit.html#gerrit.allProjects[root project].
|`all_users_name` || |`all_users_name` ||
Name of the link:config-gerrit.html#gerrit.allUsers[project in which Name of the link:config-gerrit.html#gerrit.allUsers[project in which
meta data of all users is stored]. meta data of all users is stored].
|`doc_search` ||
Whether documentation search is available.
|`doc_url` |optional| |`doc_url` |optional|
Custom base URL where Gerrit server documentation is located. Custom base URL where Gerrit server documentation is located.
(Documentation may still be available at /Documentation relative to the (Documentation may still be available at /Documentation relative to the

View File

@ -49,6 +49,7 @@ public class PageLinks {
public static final String ADMIN_CREATE_PROJECT = "/admin/create-project/"; public static final String ADMIN_CREATE_PROJECT = "/admin/create-project/";
public static final String ADMIN_PLUGINS = "/admin/plugins/"; public static final String ADMIN_PLUGINS = "/admin/plugins/";
public static final String MY_GROUPS = "/groups/self"; public static final String MY_GROUPS = "/groups/self";
public static final String DOCUMENTATION = "/Documentation/";
public static String toChange(final ChangeInfo c) { public static String toChange(final ChangeInfo c) {
return toChange(c.getId()); return toChange(c.getId());
@ -140,6 +141,10 @@ public class PageLinks {
return SETTINGS_EXTENSION + pluginName + "/" + path; return SETTINGS_EXTENSION + pluginName + "/" + path;
} }
public static String toDocumentationQuery(String query) {
return DOCUMENTATION + KeyUtil.encode(query);
}
private static String status(Status status) { private static String status(Status status) {
switch (status) { switch (status) {
case ABANDONED: case ABANDONED:

View File

@ -36,6 +36,7 @@ public class GerritInfo extends JavaScriptObject {
public final native String allProjects() /*-{ return this.all_projects; }-*/; public final native String allProjects() /*-{ return this.all_projects; }-*/;
public final native String allUsers() /*-{ return this.all_users; }-*/; public final native String allUsers() /*-{ return this.all_users; }-*/;
public final native boolean docSearch() /*-{ return this.doc_search; }-*/;
public final native String docUrl() /*-{ return this.doc_url; }-*/; public final native String docUrl() /*-{ return this.doc_url; }-*/;
public final native boolean editGpgKeys() /*-{ return this.edit_gpg_keys || false; }-*/; public final native boolean editGpgKeys() /*-{ return this.edit_gpg_keys || false; }-*/;
public final native String reportBugUrl() /*-{ return this.report_bug_url; }-*/; public final native String reportBugUrl() /*-{ return this.report_bug_url; }-*/;

View File

@ -118,6 +118,7 @@ public class Gerrit implements EntryPoint {
private static AccountPreferencesInfo myPrefs; private static AccountPreferencesInfo myPrefs;
private static UrlAliasMatcher urlAliasMatcher; private static UrlAliasMatcher urlAliasMatcher;
private static boolean hasDocumentation; private static boolean hasDocumentation;
private static boolean docSearch;
private static String docUrl; private static String docUrl;
private static HostPageData.Theme myTheme; private static HostPageData.Theme myTheme;
private static String defaultScreenToken; private static String defaultScreenToken;
@ -487,6 +488,7 @@ public class Gerrit implements EntryPoint {
hasDocumentation = true; hasDocumentation = true;
docUrl = du; docUrl = du;
} }
docSearch = info.gerrit().docSearch();
} }
})); }));
HostPageDataService hpd = GWT.create(HostPageDataService.class); HostPageDataService hpd = GWT.create(HostPageDataService.class);
@ -918,6 +920,10 @@ public class Gerrit implements EntryPoint {
urlAliasMatcher.updateUserAliases(myPrefs.urlAliases()); urlAliasMatcher.updateUserAliases(myPrefs.urlAliases());
} }
public static boolean hasDocSearch() {
return docSearch;
}
private static void getDocIndex(final AsyncCallback<DocInfo> cb) { private static void getDocIndex(final AsyncCallback<DocInfo> cb) {
RequestBuilder req = RequestBuilder req =
new RequestBuilder(RequestBuilder.HEAD, GWT.getHostPageBaseURL() new RequestBuilder(RequestBuilder.HEAD, GWT.getHostPageBaseURL()

View File

@ -126,4 +126,7 @@ public interface GerritConstants extends Constants {
String stringListPanelDelete(); String stringListPanelDelete();
String stringListPanelUp(); String stringListPanelUp();
String stringListPanelDown(); String stringListPanelDown();
String searchDropdownChanges();
String searchDropdownDoc();
} }

View File

@ -109,3 +109,6 @@ stringListPanelAdd = Add
stringListPanelDelete = Delete stringListPanelDelete = Delete
stringListPanelUp = Up stringListPanelUp = Up
stringListPanelDown = Down stringListPanelDown = Down
searchDropdownChanges = Changes
searchDropdownDoc = Documentation

View File

@ -27,6 +27,7 @@ import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.globalkey.client.GlobalKey;
@ -34,6 +35,7 @@ import com.google.gwtexpui.globalkey.client.KeyCommand;
class SearchPanel extends Composite { class SearchPanel extends Composite {
private final HintTextBox searchBox; private final HintTextBox searchBox;
private final ListBox dropdown;
private HandlerRegistration regFocus; private HandlerRegistration regFocus;
SearchPanel() { SearchPanel() {
@ -54,6 +56,18 @@ class SearchPanel extends Composite {
} }
}); });
if (Gerrit.hasDocSearch()) {
dropdown = new ListBox();
dropdown.setStyleName("searchDropdown");
dropdown.addItem(Gerrit.C.searchDropdownChanges());
dropdown.addItem(Gerrit.C.searchDropdownDoc());
dropdown.setVisibleItemCount(1);
dropdown.setSelectedIndex(0);
} else {
// Doc search is NOT available.
dropdown = null;
}
final SuggestBox suggestBox = final SuggestBox suggestBox =
new SuggestBox(new SearchSuggestOracle(), searchBox, suggestionDisplay); new SuggestBox(new SearchSuggestOracle(), searchBox, suggestionDisplay);
searchBox.setStyleName("searchTextBox"); searchBox.setStyleName("searchTextBox");
@ -70,6 +84,9 @@ class SearchPanel extends Composite {
}); });
body.add(suggestBox); body.add(suggestBox);
if (dropdown != null) {
body.add(dropdown);
}
body.add(searchButton); body.add(searchButton);
} }
@ -110,14 +127,23 @@ class SearchPanel extends Composite {
searchBox.setFocus(false); searchBox.setFocus(false);
if (query.matches("^[1-9][0-9]*$")) { if (dropdown != null
Gerrit.display(PageLinks.toChange(Change.Id.parse(query))); && dropdown.getSelectedValue().equals(Gerrit.C.searchDropdownDoc())) {
// doc
Gerrit.display(PageLinks.toDocumentationQuery(query));
} else { } else {
Gerrit.display(PageLinks.toChangeQuery(query), QueryScreen.forQuery(query)); // changes
if (query.matches("^[1-9][0-9]*$")) {
Gerrit.display(PageLinks.toChange(Change.Id.parse(query)));
} else {
Gerrit.display(
PageLinks.toChangeQuery(query), QueryScreen.forQuery(query));
}
} }
} }
private static class MySuggestionDisplay extends SuggestBox.DefaultSuggestionDisplay { private static class MySuggestionDisplay
extends SuggestBox.DefaultSuggestionDisplay {
private boolean isSuggestionSelected; private boolean isSuggestionSelected;
private MySuggestionDisplay() { private MySuggestionDisplay() {

View File

@ -307,7 +307,15 @@ a:hover {
} }
.searchPanel .searchTextBox { .searchPanel .searchTextBox {
font-size: 9pt; font-size: 9pt;
margin: 5.286px 3px 0 0; margin: 8.286px 3px 0 0;
}
.searchPanel .searchDropdown {
font-size: 8pt;
border: 2px solid;
border-color: rgba(0, 0, 0, 0.15);
height: 16px;
border-radius: 2px;
box-sizing: content-box;
} }
.searchPanel .searchButton { .searchPanel .searchButton {
text-align: center; text-align: center;

View File

@ -35,6 +35,7 @@ import com.google.gerrit.server.avatar.AvatarProvider;
import com.google.gerrit.server.change.ArchiveFormat; import com.google.gerrit.server.change.ArchiveFormat;
import com.google.gerrit.server.change.GetArchive; import com.google.gerrit.server.change.GetArchive;
import com.google.gerrit.server.change.Submit; import com.google.gerrit.server.change.Submit;
import com.google.gerrit.server.documentation.QueryDocumentationExecutor;
import com.google.inject.Inject; import com.google.inject.Inject;
import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Config;
@ -64,6 +65,7 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
private final GitwebConfig gitwebConfig; private final GitwebConfig gitwebConfig;
private final DynamicItem<AvatarProvider> avatar; private final DynamicItem<AvatarProvider> avatar;
private final boolean enableSignedPush; private final boolean enableSignedPush;
private final QueryDocumentationExecutor docSearcher;
@Inject @Inject
public GetServerInfo( public GetServerInfo(
@ -79,7 +81,8 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
@AnonymousCowardName String anonymousCowardName, @AnonymousCowardName String anonymousCowardName,
GitwebConfig gitwebConfig, GitwebConfig gitwebConfig,
DynamicItem<AvatarProvider> avatar, DynamicItem<AvatarProvider> avatar,
@EnableSignedPush boolean enableSignedPush) { @EnableSignedPush boolean enableSignedPush,
QueryDocumentationExecutor docSearcher) {
this.config = config; this.config = config;
this.authConfig = authConfig; this.authConfig = authConfig;
this.realm = realm; this.realm = realm;
@ -93,6 +96,7 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
this.gitwebConfig = gitwebConfig; this.gitwebConfig = gitwebConfig;
this.avatar = avatar; this.avatar = avatar;
this.enableSignedPush = enableSignedPush; this.enableSignedPush = enableSignedPush;
this.docSearcher = docSearcher;
} }
@Override @Override
@ -238,6 +242,7 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
info.reportBugUrl = cfg.getString("gerrit", null, "reportBugUrl"); info.reportBugUrl = cfg.getString("gerrit", null, "reportBugUrl");
info.reportBugText = cfg.getString("gerrit", null, "reportBugText"); info.reportBugText = cfg.getString("gerrit", null, "reportBugText");
info.docUrl = getDocUrl(cfg); info.docUrl = getDocUrl(cfg);
info.docSearch = docSearcher.isAvailable();
info.editGpgKeys = toBoolean(enableSignedPush info.editGpgKeys = toBoolean(enableSignedPush
&& cfg.getBoolean("gerrit", null, "editGpgKeys", true)); && cfg.getBoolean("gerrit", null, "editGpgKeys", true));
return info; return info;
@ -366,10 +371,11 @@ public class GetServerInfo implements RestReadView<ConfigResource> {
public static class GerritInfo { public static class GerritInfo {
public String allProjects; public String allProjects;
public String allUsers; public String allUsers;
public Boolean docSearch;
public String docUrl; public String docUrl;
public Boolean editGpgKeys;
public String reportBugUrl; public String reportBugUrl;
public String reportBugText; public String reportBugText;
public Boolean editGpgKeys;
} }
public static class GitwebInfo { public static class GitwebInfo {

View File

@ -74,7 +74,7 @@ public class QueryDocumentationExecutor {
} }
public List<DocResult> doQuery(String q) throws DocQueryException { public List<DocResult> doQuery(String q) throws DocQueryException {
if (parser == null || searcher == null) { if (!isAvailable()) {
throw new DocQueryException("Documentation search not available"); throw new DocQueryException("Documentation search not available");
} }
try { try {
@ -123,6 +123,10 @@ public class QueryDocumentationExecutor {
return dir; return dir;
} }
public boolean isAvailable() {
return parser != null && searcher != null;
}
@SuppressWarnings("serial") @SuppressWarnings("serial")
public static class DocQueryException extends Exception { public static class DocQueryException extends Exception {
DocQueryException() { DocQueryException() {