Skip to content

Commit

Permalink
fix(issues): Fix assignees selection & filtering
Browse files Browse the repository at this point in the history
Fix bugs that occur when attempting to assign an issue to a person and when filtering the issue list based on assignee. Also adjust tests to these changes.

Signed-off-by: stelios maurommatakis <[email protected]>
  • Loading branch information
Stelios123 committed Apr 10, 2024
1 parent 0cb19ad commit 3e7bea4
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ public String getSelectedValues() {

@Override
public boolean storeValues(List<IssuePanel.AssigneesSelect.Assignee> data) {
delegates = data.stream().map(IssuePanel.AssigneesSelect.Assignee::name).collect(Collectors.toList());
delegates = data.stream().map(IssuePanel.AssigneesSelect.Assignee::did).collect(Collectors.toList());
refresh();
return true;
}
Expand Down Expand Up @@ -300,7 +300,7 @@ public CompletableFuture<List<IssuePanel.AssigneesSelect.Assignee>> showEditPopu
return data;
}
var myList = new ArrayList<>(data);
myList.add(new IssuePanel.AssigneesSelect.Assignee(addField.getText()));
myList.add(new IssuePanel.AssigneesSelect.Assignee(addField.getText(), null));
return myList;
});
}
Expand All @@ -318,17 +318,17 @@ public CompletableFuture<List<SelectionListCellRenderer.SelectableWrapper<IssueP
var radProjectId = output.getStdout().trim();
var projectInfo = api.fetchRadProject(radProjectId);
for (var delegate : projectInfo.delegates) {
var assignee = new IssuePanel.AssigneesSelect.Assignee(delegate);
var assignee = new IssuePanel.AssigneesSelect.Assignee(delegate, null);
var isSelected = delegates.contains(delegate);
var selectableWrapper = new SelectionListCellRenderer.SelectableWrapper<>(assignee, isSelected);
assignees.add(selectableWrapper);
}
for (var delegate : delegates) {
var exist = assignees.stream().anyMatch(el -> el.value.name().equals(delegate));
var exist = assignees.stream().anyMatch(el -> el.value.did().equals(delegate));
if (exist) {
continue;
}
var assignee = new IssuePanel.AssigneesSelect.Assignee(delegate);
var assignee = new IssuePanel.AssigneesSelect.Assignee(delegate, null);
var selectableWrapper = new SelectionListCellRenderer.SelectableWrapper<>(assignee, true);
assignees.add(selectableWrapper);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ public void filterList(IssueListSearchValue searchValue) {
p.author.id.equals(peerAuthorFilter))
.filter(p -> Strings.isNullOrEmpty(stateFilter) || (p.state != null && p.state.label.equals(stateFilter)))
.filter(p -> Strings.isNullOrEmpty(labelFilter) || p.labels.stream().anyMatch(label -> label.equals(labelFilter)))
.filter(p -> Strings.isNullOrEmpty(assigneeFilter) || p.assignees.stream().anyMatch(assignee -> assignee.equals(assigneeFilter)))
.filter(p -> Strings.isNullOrEmpty(assigneeFilter) || p.assignees.stream().anyMatch(assignee ->
assignee.generateLabelText().equals(assigneeFilter)))
.collect(Collectors.toList());
model.addAll(filteredPatches);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,13 +306,16 @@ public boolean isSingleSelection() {

public class AssigneesSelect extends LabeledListPanelHandle<AssigneesSelect.Assignee> {

public record Assignee(String name) { }
public record Assignee(String did, String alias) { }

public static class AssigneeRender extends SelectionListCellRenderer<AssigneesSelect.Assignee> {

@Override
public String getText(AssigneesSelect.Assignee value) {
return Utils.formatDid(value.name());
if (!Strings.isNullOrEmpty(value.alias)) {
return value.alias;
}
return Utils.formatDid(value.did());
}

@Override
Expand All @@ -336,7 +339,7 @@ public String getSelectedValues() {

@Override
public boolean storeValues(List<AssigneesSelect.Assignee> data) {
var addAssignees = data.stream().map(Assignee::name).toList();
var addAssignees = data.stream().map(Assignee::did).toList();
// We don't have changes so don't refresh the window
if (addAssignees.size() == issue.assignees.size()) {
return true;
Expand All @@ -362,7 +365,7 @@ public CompletableFuture<List<Assignee>> showEditPopup(JComponent parent) {
return data;
}
var myList = new ArrayList<>(data);
myList.add(new IssuePanel.AssigneesSelect.Assignee(addField.getText()));
myList.add(new IssuePanel.AssigneesSelect.Assignee(addField.getText(), null));
return myList;
});
}
Expand All @@ -378,17 +381,24 @@ public CompletableFuture<List<SelectionListCellRenderer.SelectableWrapper<Assign
var projectInfo = api.fetchRadProject(issue.projectId);
var assignees = new ArrayList<SelectionListCellRenderer.SelectableWrapper<Assignee>>();
for (var delegate : projectInfo.delegates) {
var assignee = new AssigneesSelect.Assignee(delegate);
var isSelected = issue.assignees.contains(delegate);
var author = issue.assignees.stream().filter(as -> as.id.contains(delegate)).findFirst().orElse(null);
final Assignee assignee;
if (author != null) {
assignee = new AssigneesSelect.Assignee(author.id, author.generateLabelText());
} else {
assignee = new AssigneesSelect.Assignee(delegate, null);
}
var isSelected = author != null;
var selectableWrapper = new SelectionListCellRenderer.SelectableWrapper<>(assignee, isSelected);
assignees.add(selectableWrapper);
}
for (var assign : issue.assignees) {
var exist = assignees.stream().anyMatch(el -> el.value.name.equals(assign.alias) || el.value.name.equals(assign.id));
var exist = assignees.stream().anyMatch(el -> el.value.did.equals(assign.id) ||
(el.value.alias != null && el.value.alias.equals(assign.alias)));
if (exist) {
continue;
}
var assignee = new AssigneesSelect.Assignee(assign.generateLabelText());
var assignee = new AssigneesSelect.Assignee(assign.id, assign.generateLabelText());
var selectableWrapper = new SelectionListCellRenderer.SelectableWrapper<>(assignee, true);
assignees.add(selectableWrapper);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ public void testFilterByAssignees() {
var controller = (IssueTabController) radicleToolWindow.issueTabController;
var listPanel = controller.getIssueListPanel();
var filter = new IssueListSearchValue();
filter.assignee = (String) issues.get(0).assignees.get(1);
filter.assignee = issues.get(0).assignees.get(1).id;
listPanel.filterList(filter);

var issueModel = listPanel.getModel();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,23 +140,6 @@ public void beforeTest() throws IOException, InterruptedException {
issue.project = null;
// Convert Reaction object to List<List<String>>
var map = RadicleProjectApi.MAPPER.convertValue(issue, new TypeReference<Map<String, Object>>() { });
var discussions = (ArrayList<Map<String, Object>>) map.get("discussion");
for (var discussion : discussions) {
var allReactions = new ArrayList<>();
var reactions = (ArrayList<Map<String, Object>>) discussion.get("reactions");
for (var reaction : reactions) {
var reactionList = new ArrayList<>();
var nid = reaction.get("nid");
var emoji = reaction.get("emoji");
reactionList.add(nid);
reactionList.add(emoji);
allReactions.add(reactionList);
}
discussion.remove("reactions");
discussion.put("reactions", allReactions);
discussion.remove("timestamp");
discussion.put("timestamp", Instant.now().getEpochSecond());
}
se = new StringEntity(RadicleProjectApi.MAPPER.writeValueAsString(map));
} else if ((req instanceof HttpGet) && ((HttpGet) req).getURI().getPath().contains("/patches")) {
// request to fetch patches
Expand Down Expand Up @@ -243,7 +226,8 @@ public void testIssueInfo() {
assertThat(issueIdLabel.getText()).isEqualTo(RadicleBundle.message("issueId", Strings.nullToEmpty(issue.id)));
assertThat(issueAuthorLabel.getText()).isEqualTo(RadicleBundle.message("issueAuthor", Strings.nullToEmpty(issue.author.id)));
assertThat(issueTagLabel.getText()).isEqualTo(RadicleBundle.message("issueLabels", String.join(",", issue.labels)));
assertThat(issueAssigneeLabel.getText()).isEqualTo(RadicleBundle.message("issueAssignees", String.join(",", issue.assignees)));
assertThat(issueAssigneeLabel.getText()).isEqualTo(RadicleBundle.message("issueAssignees",
String.join(",", issue.assignees.stream().map(as -> as.id).toList())));
assertThat(issueStateLabel.getText()).isEqualTo(RadicleBundle.message("issueState", Strings.nullToEmpty(issue.state.label)));
assertThat(issueCreatedLabel.getText()).isEqualTo(RadicleBundle.message("issueCreated", DATE_TIME_FORMATTER.format(issue.discussion.get(0).timestamp)));
}
Expand Down Expand Up @@ -504,15 +488,15 @@ public void addRemoveAssignersTest() throws InterruptedException {
assertThat(listmodel.getSize()).isEqualTo(3);

var firstAssignee = (SelectionListCellRenderer.SelectableWrapper<IssuePanel.AssigneesSelect.Assignee>) listmodel.getElementAt(0);
assertThat(firstAssignee.value.name()).isEqualTo(projectDelegates.get(0));
assertThat(firstAssignee.value.did()).isEqualTo(projectDelegates.get(0));
assertThat(firstAssignee.selected).isTrue();

var secondAssignee = (SelectionListCellRenderer.SelectableWrapper<IssuePanel.AssigneesSelect.Assignee>) listmodel.getElementAt(1);
assertThat(secondAssignee.value.name()).isEqualTo(projectDelegates.get(1));
assertThat(secondAssignee.value.did()).isEqualTo(projectDelegates.get(1));
assertThat(secondAssignee.selected).isTrue();

var thirdAssignee = (SelectionListCellRenderer.SelectableWrapper<IssuePanel.AssigneesSelect.Assignee>) listmodel.getElementAt(2);
assertThat(thirdAssignee.value.name()).isEqualTo(projectDelegates.get(2));
assertThat(thirdAssignee.value.did()).isEqualTo(projectDelegates.get(2));
assertThat(thirdAssignee.selected).isFalse();

((SelectionListCellRenderer.SelectableWrapper<?>) listmodel.getElementAt(0)).selected = false;
Expand Down

0 comments on commit 3e7bea4

Please sign in to comment.