Merge "Merge doc and change searches."
This commit is contained in:
commit
9a90351e8d
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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; }-*/;
|
||||||
|
@ -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()
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -109,3 +109,6 @@ stringListPanelAdd = Add
|
|||||||
stringListPanelDelete = Delete
|
stringListPanelDelete = Delete
|
||||||
stringListPanelUp = Up
|
stringListPanelUp = Up
|
||||||
stringListPanelDown = Down
|
stringListPanelDown = Down
|
||||||
|
|
||||||
|
searchDropdownChanges = Changes
|
||||||
|
searchDropdownDoc = Documentation
|
||||||
|
@ -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() {
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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() {
|
||||||
|
Loading…
Reference in New Issue
Block a user