Merge doc and change searches.

This CL puts a dropdown in the SearchPanel, to choose from changes
search (default) or documentation search.

I mostly copied the css for the search button to the dropdown, with
some minor changes.

If docs are not available (e.g. built without docs), the whole dropdown
will be gone and it should be the same as before.

Screenshot: https://i.imgur.com/Qyg2VZg.png

Change-Id: I04e15327f43fc9c8002cba364b44d77f52075234
This commit is contained in:
Yuxuan 'fishy' Wang 2015-11-09 16:32:45 -08:00
parent 573f8bad2d
commit ed1596b9df
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 (dropdown != null
&& dropdown.getSelectedValue().equals(Gerrit.C.searchDropdownDoc())) {
// doc
Gerrit.display(PageLinks.toDocumentationQuery(query));
} else {
// changes
if (query.matches("^[1-9][0-9]*$")) { if (query.matches("^[1-9][0-9]*$")) {
Gerrit.display(PageLinks.toChange(Change.Id.parse(query))); Gerrit.display(PageLinks.toChange(Change.Id.parse(query)));
} else { } else {
Gerrit.display(PageLinks.toChangeQuery(query), QueryScreen.forQuery(query)); 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() {