Skip to content

Commit

Permalink
[1408] Milestone picker: pick next milestone by default
Browse files Browse the repository at this point in the history
  • Loading branch information
garbanzos committed Mar 29, 2016
2 parents b20957b + b4b231e commit 6848265
Show file tree
Hide file tree
Showing 3 changed files with 192 additions and 32 deletions.
41 changes: 12 additions & 29 deletions src/main/java/ui/components/pickers/MilestonePickerDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,15 @@ public MilestonePickerDialog(Stage stage, TurboIssue issue, List<TurboMilestone>
state = new MilestonePickerState(originalMilestones);
initUI();
setupKeyEvents();
setInputFieldToDefaultMilestone();
}

getExistingMilestone(originalMilestones)
.map(PickerMilestone::getTitle)
.ifPresent(this::fillInputFieldWithMilestoneName);
/**
* Fills the input field of milestone picker dialog with default milestone's title
*/
private void setInputFieldToDefaultMilestone() {
Optional<PickerMilestone> defaultMilestone = PickerMilestone.getDefaultMilestone(originalMilestones);
defaultMilestone.map(PickerMilestone::getTitle).ifPresent(this::fillInputFieldWithMilestoneName);
}

private boolean areFromSameRepo(TurboIssue issue, List<TurboMilestone> milestones) {
Expand Down Expand Up @@ -99,11 +104,8 @@ private void setupButtons(DialogPane milestonePickerDialogPane) {
private void setConfirmResultConverter() {
setResultConverter((dialogButton) -> {
List<PickerMilestone> finalList = state.getCurrentMilestonesList();
if (hasSelectedMilestone(finalList)) {
return new MilestonePickerDialogResponse(dialogButton,
Optional.of(getSelectedMilestone(finalList).get().getId()));
}
return new MilestonePickerDialogResponse(dialogButton, Optional.empty());
Optional<PickerMilestone> selectedMilestone = PickerMilestone.getSelectedMilestone(finalList);
return new MilestonePickerDialogResponse(dialogButton, selectedMilestone.map(PickerMilestone::getId));
});
}

Expand Down Expand Up @@ -146,9 +148,9 @@ private void refreshUI(MilestonePickerState state) {

private void populateAssignedMilestone(List<PickerMilestone> pickerMilestoneList, FlowPane assignedMilestonePane) {
assignedMilestonePane.getChildren().clear();
updateExistingMilestone(getExistingMilestone(pickerMilestoneList), assignedMilestonePane);
updateExistingMilestone(PickerMilestone.getExistingMilestone(pickerMilestoneList), assignedMilestonePane);
addAssignmentIndicator(assignedMilestonePane);
updateNewlyAssignedMilestone(getSelectedMilestone(pickerMilestoneList), assignedMilestonePane);
updateNewlyAssignedMilestone(PickerMilestone.getSelectedMilestone(pickerMilestoneList), assignedMilestonePane);
}

private void populateMatchingMilestones(List<PickerMilestone> matchingMilestoneList, VBox matchingMilestones) {
Expand Down Expand Up @@ -274,23 +276,4 @@ private HBox createPreviouslyAssignedMilestoneBox() {
return milestoneBox;
}

private Optional<PickerMilestone> getExistingMilestone(List<PickerMilestone> milestoneList) {
return milestoneList.stream()
.filter(PickerMilestone::isExisting)
.findAny();
}

private boolean hasSelectedMilestone(List<PickerMilestone> milestoneList) {
return milestoneList.stream()
.filter(PickerMilestone::isSelected)
.findAny()
.isPresent();
}

private Optional<PickerMilestone> getSelectedMilestone(List<PickerMilestone> milestoneList) {
return milestoneList.stream()
.filter(PickerMilestone::isSelected)
.findAny();
}

}
64 changes: 61 additions & 3 deletions src/main/java/ui/components/pickers/PickerMilestone.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import javafx.scene.control.Label;
import javafx.scene.text.Font;

import java.util.List;
import java.util.Optional;

/**
* This class handles the statuses and appearance of the milestones in MilestonePickerDialog
*/
Expand Down Expand Up @@ -97,6 +100,59 @@ private void setRemovedInUI(Label milestone) {
milestone.getStyleClass().add("labels-removed"); // add strikethrough
}

/**
* Gets the existing milestone from the milestoneList
*
* @param milestoneList
* @return Optional of existing milestone
*/
public static Optional<PickerMilestone> getExistingMilestone(List<PickerMilestone> milestoneList) {
return milestoneList.stream()
.filter(PickerMilestone::isExisting)
.findAny();
}

/**
* Gets the selected milestone from the milestoneList
*
* @param milestoneList
* @return Optional of selected milestone
*/
public static Optional<PickerMilestone> getSelectedMilestone(List<PickerMilestone> milestoneList) {
return milestoneList.stream()
.filter(PickerMilestone::isSelected)
.findAny();
}

/**
* Gets the default milestone from the sortedMilestoneList
* If there is an existing milestone, default milestone is the existing milestone
* Else it is the first open milestone that is not overdue
* Precondition: sortedMilestoneList needs to be sorted in its natural order
*
* @param sortedMilestoneList
* @return Optional of default milestone
*/
public static Optional<PickerMilestone> getDefaultMilestone(List<PickerMilestone> sortedMilestoneList) {
return PickerMilestone.getExistingMilestone(sortedMilestoneList)
.map(Optional::of)
.orElse(PickerMilestone.getNextOpenMilestone(sortedMilestoneList));

}

/**
* Gets the the first PickerMilestone that is open and not overdue from the sortedMilestoneList
* Precondition: sortedMilestoneList needs to be sorted in its natural order
*
* @param sortedMilestoneList
* @return Optional of first PickerMilestone that is open and not overdue
*/
private static Optional<PickerMilestone> getNextOpenMilestone(List<PickerMilestone> sortedMilestoneList) {
return sortedMilestoneList.stream()
.filter(milestone -> !milestone.isOverdue() && milestone.isOpen())
.findFirst();
}

public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
Expand Down Expand Up @@ -132,15 +188,17 @@ public int compareTo(PickerMilestone milestone) {
return this.isOpen() ? -1 : 1;
}

if (this.getDueDate().equals(milestone.getDueDate())) return 0;
// milestones ordered according to their titles if due dates are the same
if (this.getDueDate().equals(milestone.getDueDate())) {
return this.getTitle().compareTo(milestone.getTitle());
}

// milestones with due dates are smaller
if (!this.getDueDate().isPresent()) return 1;
if (!milestone.getDueDate().isPresent()) return -1;

// milestones with earlier due dates are smaller
return this.getDueDate().get()
.isBefore(milestone.getDueDate().get()) ? -1 : 1;
return this.getDueDate().get().isBefore(milestone.getDueDate().get()) ? -1 : 1;
}

@Override
Expand Down
119 changes: 119 additions & 0 deletions src/test/java/tests/PickerMilestoneTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package tests;

import backend.resource.TurboMilestone;
import org.junit.BeforeClass;
import org.junit.Test;
import ui.components.pickers.PickerMilestone;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static org.junit.Assert.assertEquals;

public class PickerMilestoneTest {

private static final String REPO_ID = "test/testrepo";

private static List<PickerMilestone> listWithNoExistingAndSelected, listWithNoDefaultMilestone,
listWithExisting, listWithSelected, listWithNextMilestone, listWithMilestonesWithNoDueDates,
listWithMilesonesWithSameDueDates;
private static PickerMilestone noDueDateMilestone1, noDueDateMilestone2, openMilestone1, openMilestone2,
closedMilestone, existingMilestone, selectedMilestone;

@BeforeClass
public static void initialize() {
noDueDateMilestone1 = new PickerMilestone(new TurboMilestone(REPO_ID, 1, "noDueDateMilestone1"));

noDueDateMilestone2 = new PickerMilestone(new TurboMilestone(REPO_ID, 2, "noDueDateMilestone2"));

openMilestone1 = new PickerMilestone(new TurboMilestone(REPO_ID, 3, "openMilestone1"));
openMilestone1.setDueDate(Optional.of(LocalDate.now().plusDays(1)));

openMilestone2 = new PickerMilestone(new TurboMilestone(REPO_ID, 4, "openMilestone2"));
openMilestone2.setDueDate(Optional.of(LocalDate.now().plusDays(1)));

closedMilestone = new PickerMilestone(new TurboMilestone(REPO_ID, 5, "closedMilestone"));
closedMilestone.setOpen(false);

existingMilestone = new PickerMilestone(new TurboMilestone(REPO_ID, 6, "existingMilestone"));
existingMilestone.setExisting(true);

selectedMilestone = new PickerMilestone(new TurboMilestone(REPO_ID, 7, "selectedMilestone"));
selectedMilestone.setSelected(true);

listWithNoExistingAndSelected = new ArrayList<>();
listWithNoExistingAndSelected.add(openMilestone1);
listWithNoExistingAndSelected.add(openMilestone2);

listWithNoDefaultMilestone = new ArrayList<>();
listWithNoDefaultMilestone.add(closedMilestone);
listWithNoDefaultMilestone.add(closedMilestone);

listWithExisting = new ArrayList<>();
listWithExisting.add(existingMilestone);
listWithExisting.add(openMilestone1);

listWithSelected = new ArrayList<>();
listWithSelected.add(selectedMilestone);
listWithSelected.add(openMilestone1);

listWithNextMilestone = new ArrayList<>();
listWithNextMilestone.add(openMilestone1);
listWithNextMilestone.add(closedMilestone);

listWithMilestonesWithNoDueDates = new ArrayList<>();
listWithMilestonesWithNoDueDates.add(noDueDateMilestone1);
listWithMilestonesWithNoDueDates.add(noDueDateMilestone2);

listWithMilesonesWithSameDueDates = listWithNoExistingAndSelected;
}

@Test
public void getExistingMilestone_noExistingMilestone_returnEmpty() {
assertEquals(Optional.empty(), PickerMilestone.getExistingMilestone(listWithNoExistingAndSelected));
}

@Test
public void getExistingMilestone_haveExistingMilestone_returnExistingMilestone() {
assertEquals(Optional.of(existingMilestone), PickerMilestone.getExistingMilestone(listWithExisting));
}

@Test
public void getSelectedMilestone_noSelectedMilestone_returnEmpty() {
assertEquals(Optional.empty(), PickerMilestone.getSelectedMilestone(listWithNoExistingAndSelected));
}

@Test
public void getSelectedMilestone_haveSelectedMilestone_returnSelectedMilestone() {
assertEquals(Optional.of(selectedMilestone), PickerMilestone.getSelectedMilestone(listWithSelected));
}

@Test
public void getDefaultMilestone_noDefaultMilestone_returnEmpty() {
assertEquals(Optional.empty(), PickerMilestone.getDefaultMilestone(listWithNoDefaultMilestone));
}

@Test
public void getDefaultMilestone_haveExistingMilestone_returnExistingMilestone() {
assertEquals(Optional.of(existingMilestone), PickerMilestone.getDefaultMilestone(listWithExisting));
}

@Test
public void getDefaultMilestone_haveNoExistingButHaveNextMilestone_returnNextMilestone() {
assertEquals(Optional.of(openMilestone1), PickerMilestone.getDefaultMilestone(listWithNextMilestone));
}

@Test
public void getDefaultMilestone_haveMilestonesWithNoDueDates_returnMilestoneWithLexicographicallySmallerName() {
assertEquals(Optional.of(noDueDateMilestone1),
PickerMilestone.getDefaultMilestone(listWithMilestonesWithNoDueDates));
}

@Test
public void getDefaultMilestone_haveMilestonesWithSameDueDates_returnMilestoneWithLexicographicallySmallerName() {
assertEquals(Optional.of(openMilestone1),
PickerMilestone.getDefaultMilestone(listWithMilesonesWithSameDueDates));
}
}

0 comments on commit 6848265

Please sign in to comment.