Skip to content

Commit

Permalink
[FIXED JENKINS-13105] allow j/k navigation for search results
Browse files Browse the repository at this point in the history
  • Loading branch information
jieryn committed May 26, 2012
1 parent e3842f2 commit 51e77b9
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 11 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -31,7 +31,7 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.455</version>
<version>1.461</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
Expand Up @@ -41,6 +41,8 @@

import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;

/**
* The <a
Expand All @@ -52,6 +54,10 @@
*/
@Extension
public final class KeyboardShortcutsPageDecorator extends PageDecorator {
public static String getAllJobsAsJson() {
return JobUtils.getAllJobsAsJsonArray().toString();
}

public static String getAllNodesAsJson() {
return NodeUtils.getAllNodesAsJsonArray().toString();
}
Expand Down Expand Up @@ -101,10 +107,6 @@ public static String getAllViewsAsJson() {
return ViewUtils.getAllViewsAsJsonArray().toString();
}

public static String getAllJobsAsJson() {
return JobUtils.getAllJobsAsJsonArray().toString();
}

public static String getBaseJobUrl() {
final Item job = JobUtils.getJob();

Expand Down Expand Up @@ -164,6 +166,18 @@ public static boolean isJobPage() {
return JobUtils.getJob() != null;
}

public static boolean isSearchPage() {
return isSearchPage(Stapler.getCurrentRequest());
}

public static boolean isSearchPage(StaplerRequest request) {
if (request == null) {
return false;
}

return request.getPathInfo().contains("/search/");
}

public static boolean isViewPage() {
return !isJobPage() && ViewUtils.getView() != null;
}
Expand Down
Expand Up @@ -164,6 +164,40 @@
</tbody>
</table>
</td>
<td>
<table class="ks-help-section">
<tbody>
<tr>
<th colspan="3">${%KeyboardShortcuts.SearchPanel.Title}</th>
</tr>
<tr>
<td class="ks-help-section-key">j</td>
<td>:</td>
<td class="ks-help-section-desc">${%KeyboardShortcuts.SearchPanel.NextItem}</td>
</tr>
<tr>
<td class="ks-help-section-key">k</td>
<td>:</td>
<td class="ks-help-section-desc">${%KeyboardShortcuts.SearchPanel.PreviousItem}</td>
</tr>
<tr>
<td class="ks-help-section-key">n</td>
<td>:</td>
<td class="ks-help-section-desc">${%KeyboardShortcuts.SearchPanel.NextItem}</td>
</tr>
<tr>
<td class="ks-help-section-key">o</td>
<td>:</td>
<td class="ks-help-section-desc">${%KeyboardShortcuts.SearchPanel.OpenCurrentItem}</td>
</tr>
<tr>
<td class="ks-help-section-key">p</td>
<td>:</td>
<td class="ks-help-section-desc">${%KeyboardShortcuts.SearchPanel.PreviousItem}</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td>
Expand Down
Expand Up @@ -75,3 +75,8 @@ KeyboardShortcuts.Selector.FilterEmpty.Job = Job Selector -
KeyboardShortcuts.Selector.FilterEmpty.Permalink = Permalink Selector - Start Typing or Use Arrows
KeyboardShortcuts.Selector.FilterEmpty.Node = Computer Node Selector - Start Typing or Use Arrows
KeyboardShortcuts.Selector.FilterResultsEmpty = No results for specified prefix!

KeyboardShortcuts.SearchPanel.Title = Search Panel
KeyboardShortcuts.SearchPanel.NextItem = next item
KeyboardShortcuts.SearchPanel.OpenCurrentItem = open current item
KeyboardShortcuts.SearchPanel.PreviousItem = previous item
Expand Up @@ -30,6 +30,7 @@
var ks_enabled = !${it.disabled};
var ks_is_job_page = ${it.jobPage};
var ks_is_view_page = ${it.viewPage};
var ks_is_search_page = ${it.searchPage};
var ks_url = '${it.baseUrl}';
var ks_url_view = '${it.baseViewUrl}';
var ks_url_job = '${it.baseJobUrl}';
Expand All @@ -43,6 +44,7 @@
var ks_is_node_selector = false;
var ks_is_permalink_selector = false;
var ks_selector_filter = '';
var ks_search_item_selected = '';
</script>
<script type="text/javascript" src="${pluginUrl}/js/keyboard-shortcuts.js" />
</j:jelly>
4 changes: 4 additions & 0 deletions src/main/webapp/css/keyboard-shortcuts.css
Expand Up @@ -124,3 +124,7 @@ span#ks-selector-items-empty {
font-weight: bold;
text-align: center;
}

li.ks-search-item-selected {
background-color: orange;
}
75 changes: 69 additions & 6 deletions src/main/webapp/js/keyboard-shortcuts.js
Expand Up @@ -32,7 +32,10 @@ if (ks_enabled) {
Event.observe(document, 'keypress', ks_keypress);
});

/* JENKINS-13106 - event.stopPropagation() and event.cancelBubble=true both fail */
/*
* JENKINS-13106 - event.stopPropagation() and event.cancelBubble=true both
* fail
*/
function clearSearchBox() {
Form.Element.clear('search-box');
}
Expand Down Expand Up @@ -294,14 +297,20 @@ if (ks_enabled) {
ks_job_selector_show();
}
else {
if (ks_is_view()) {
if (ks_is_search()) {
ks_search_item_next();
}
else if (ks_is_view()) {
ks_view_job_next();
}
}
break;

case 'k':
if (ks_is_view()) {
if (ks_is_search()) {
ks_search_item_prev();
}
else if (ks_is_view()) {
ks_view_job_prev();
}
break;
Expand All @@ -322,7 +331,10 @@ if (ks_enabled) {
ks_set_window_location(ks_url + '/computer');
}
else {
if (ks_is_view()) {
if (ks_is_search()) {
ks_search_item_next();
}
else if (ks_is_view()) {
ks_view_job_next();
}
}
Expand All @@ -335,7 +347,10 @@ if (ks_enabled) {
break;

case 'o':
if (ks_is_view()) {
if (ks_is_search()) {
ks_search_item_open();
}
else if (ks_is_view()) {
ks_view_job_open();
}
break;
Expand All @@ -350,7 +365,10 @@ if (ks_enabled) {
}
}
else {
if (ks_is_view()) {
if (ks_is_search()) {
ks_search_item_prev();
}
else if (ks_is_view()) {
ks_view_job_prev();
}
}
Expand Down Expand Up @@ -427,6 +445,10 @@ if (ks_enabled) {
return typeof ks_is_view_page != 'undefined' && ks_is_view_page;
}

function ks_is_search() {
return typeof ks_is_search_page != 'undefined' && ks_is_search_page;
}

function ks_is_selector() {
return ks_is_view_selector || ks_is_job_selector || ks_is_node_selector || ks_is_permalink_selector;
}
Expand Down Expand Up @@ -976,6 +998,47 @@ if (ks_enabled) {
ks_permalink_selector_first();
}
}

function ks_search_item_next() {
var lis = $('main-panel').select('li');
var lids = lis.collect(function(li) {
return li.id;
});

lis.each(function(li) {
li.removeClassName('ks-search-item-selected');
});

var lidx = ($A(lids).indexOf(ks_search_item_selected) + 1) % lids.length;
ks_search_item_selected = lids[lidx];
$(ks_search_item_selected).addClassName('ks-search-item-selected');
}

function ks_search_item_prev() {
var lis = $('main-panel').select('li');
var lids = lis.collect(function(li) {
return li.id;
});

lis.each(function(li) {
li.removeClassName('ks-search-item-selected');
});

var lidx = ($A(lids).indexOf(ks_search_item_selected) - 1) % lids.length;
if (lidx < 0) {
lidx = lids.length - 1;
}
ks_search_item_selected = lids[lidx];
$(ks_search_item_selected).addClassName('ks-search-item-selected');
}

function ks_search_item_open() {
if (typeof ks_search_item_selected != 'undefined') {
$(ks_search_item_selected).select('a').each(function(a) {
ks_set_window_location(a.href);
});
}
}
}

0;

0 comments on commit 51e77b9

Please sign in to comment.