Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[JENKINS-47437] Allow sorting of users by their full name in the clai…
…m page.
  • Loading branch information
Greybird committed Nov 7, 2017
1 parent 0884648 commit 433b102
Show file tree
Hide file tree
Showing 7 changed files with 129 additions and 7 deletions.
3 changes: 2 additions & 1 deletion pom.xml
Expand Up @@ -23,6 +23,7 @@
<properties>
<jenkins.version>1.596.1</jenkins.version>
<findbugs.failOnError>false</findbugs.failOnError> <!-- TODO fix 19 bugs -->
<java.level>8</java.level>
</properties>

<build>
Expand All @@ -37,7 +38,7 @@
</plugin>
</plugins>
</pluginManagement>
</build>
</build>

<repositories>
<repository>
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/hudson/plugins/claim/ClaimConfig.java
Expand Up @@ -23,6 +23,11 @@ public ClaimConfig() {
*/
private boolean stickyByDefault = true;

/**
* Sort users by full name.
*/
private boolean sortUsersByFullName;

/**
* Groovy script to be run when a claim is changed.
*/
Expand All @@ -41,6 +46,7 @@ public boolean configure(StaplerRequest req, JSONObject formData) throws FormExc
// set that to properties and call save().
sendEmails = formData.getBoolean("sendEmails");
stickyByDefault = formData.getBoolean("stickyByDefault");
sortUsersByFullName = formData.getBoolean("sortUsersByFullName");
groovyScript = formData.getString("groovyScript");
save();
return super.configure(req,formData);
Expand Down Expand Up @@ -81,6 +87,26 @@ public void setStickyByDefault(boolean stickyByDefault) {
this.stickyByDefault = stickyByDefault;
}


/**
* Returns true if the users should be sorted by full name instead of ids.
*
* @return true to make users sorted by full name, else false.
*/
public boolean isSortUsersByFullName() {
return sortUsersByFullName;
}

/**
* Sets the user sort method.
*
* @param sortUsersByFullName
* true to make users sorted by full name, else false.
*/
public void setSortUsersByFullName(boolean sortUsersByFullName) {
this.sortUsersByFullName = sortUsersByFullName;
}

/**
* This method returns the Groovy script as a String
* @return String containing the Groovy script to run when claims are changed.
Expand Down
16 changes: 10 additions & 6 deletions src/main/java/hudson/plugins/claim/DescribableTestAction.java
Expand Up @@ -25,11 +25,9 @@ public Descriptor<DescribableTestAction> getDescriptor() {
return DESCRIPTOR;
}

private static Comparator<User> comparator = new Comparator<User>() {
public int compare(User c1, User c2) {
return c1.getId().compareTo(c2.getId());
}
};
private static Comparator<User> idComparator = Comparator.comparing(User::getId);
private static Comparator<User> fullNameComparator = Comparator.comparing(User::getFullName)
.thenComparing(idComparator);

@Extension
public static final class DescriptorImpl extends Descriptor<DescribableTestAction> {
Expand Down Expand Up @@ -58,7 +56,7 @@ public ListBoxModel doFillAssigneeItems() {

if (c!= null ) {
List<User> l = new ArrayList<User>(c);
Collections.sort(l, comparator);
Collections.sort(l, getComparator());
for (User u : l) {
items.add(u.getDisplayName(), u.getId());
}
Expand Down Expand Up @@ -90,4 +88,10 @@ public ListBoxModel doFillErrorsItems() throws Exception {
return items;
}
}

private static Comparator<? super User> getComparator() {
return ClaimConfig.get().isSortUsersByFullName()
? fullNameComparator
: idComparator;
}
}
Expand Up @@ -7,6 +7,9 @@
<f:entry title="${%StickyByDefault}" field="stickyByDefault" help="/plugin/claim/help-stickyByDefault.html">
<f:checkbox />
</f:entry>
<f:entry title="${%SortUsersByFullName}" field="sortUsersByFullName" help="/plugin/claim/help-sortUsersByFullName.html">
<f:checkbox />
</f:entry>
<f:entry title="${%GroovyScript}" field="groovyScript" help="/plugin/claim/help-groovyScript.html">
<f:textarea checkMethod="post" codemirror-mode="clike"
codemirror-config="mode: 'text/x-groovy', lineNumbers: true, matchBrackets: true, onBlur: function(editor){editor.save()}"/>
Expand Down
@@ -1,3 +1,4 @@
SendEmails=Send emails when assigning/claiming builds
StickyByDefault=Sets the default value for stickiness when claiming builds
SortUsersByFullName=Sorts the users by their name rather than they ids when listing them
GroovyScript=The Groovy script to run when claims are changed
3 changes: 3 additions & 0 deletions src/main/webapp/help-sortUsersByFullName.html
@@ -0,0 +1,3 @@
<div>
Checking this option will make users by sorted by their full name rather than id in the claim dialog user list.
</div>
84 changes: 84 additions & 0 deletions src/test/java/hudson/plugins/claim/DescribableTestActionTest.java
@@ -0,0 +1,84 @@
package hudson.plugins.claim;

import hudson.model.User;
import hudson.security.FullControlOnceLoggedInAuthorizationStrategy;
import hudson.util.ListBoxModel;
import jenkins.model.GlobalConfiguration;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertArrayEquals;

public class DescribableTestActionTest {
@Rule
public JenkinsRule j = new JenkinsRule();

private User user0;
private User user1;
private User user2;
private User user3;
private User user4;

@Before
public void setUp() throws Exception {
j.jenkins.setAuthorizationStrategy(new FullControlOnceLoggedInAuthorizationStrategy());
j.jenkins.setSecurityRealm(j.createDummySecurityRealm());
JenkinsRule.WebClient wc = j.createWebClient();
wc.login("user0", "user0");
wc.login("user1", "user1");
wc.login("user2", "user2");
wc.login("user3", "user3");
wc.login("user4", "user4");
wc.closeAllWindows();

(user0 = j.jenkins.getUser("user0")).setFullName("T-800");
(user1 = j.jenkins.getUser("user1")).setFullName("Sarah CONNOR");
(user2 = j.jenkins.getUser("user2")).setFullName("John CONNOR");
(user3 = j.jenkins.getUser("user3")).setFullName("Kyle REESE");
(user4 = j.jenkins.getUser("user4")).setFullName("T-800");
}

private static class DescribableTestActionImpl extends DescribableTestAction
{
@Override
public String getIconFileName() {
return null;
}

@Override
public String getDisplayName() {
return null;
}

@Override
public String getUrlName() {
return null;
}
}

@Test
public void assignee_list_is_sorted_by_id_by_default() {
DescribableTestActionImpl.DescriptorImpl descriptor = new DescribableTestActionImpl.DescriptorImpl();
ListBoxModel items = descriptor.doFillAssigneeItems();
Object[] users = getUsers(items);
assertArrayEquals(new String[] {"SYSTEM", user0.getId(), user1.getId(), user2.getId(), user3.getId(), user4.getId()}, users);
}

@Test
public void assignee_list_full_name_sorts_by_fullName_then_id() {
DescribableTestActionImpl.DescriptorImpl descriptor = new DescribableTestActionImpl.DescriptorImpl();
((ClaimConfig)j.jenkins.getDescriptor(ClaimConfig.class)).setSortUsersByFullName(true);
ListBoxModel items = descriptor.doFillAssigneeItems();
Object[] users = getUsers(items);
assertArrayEquals(new String[] {"SYSTEM", user2.getId(), user3.getId(), user1.getId(), user0.getId(), user4.getId()}, users);
}

private String[] getUsers(ListBoxModel items) {
return items.stream().map(o -> o.value).toArray(String[]::new);
}
}

0 comments on commit 433b102

Please sign in to comment.