Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b3364d4
#11: Newline at end of pom file
PhiGegner Feb 20, 2023
0d55f8c
#11: First sorting mechanism
PhiGegner Feb 20, 2023
bea4086
Merge branch 'develop' into feature/#11_sorting_possibility
Death111 Feb 26, 2023
b87673b
Merge branch 'develop' into feature/#11_sorting_possibility
Death111 Feb 27, 2023
6808c23
Merge branch 'develop' into feature/#11_sorting_possibility
Death111 Feb 27, 2023
63337eb
#11: Code formatting
PhiGegner Feb 28, 2023
e48f8ac
#11: Refactor filtering and extract sorting to dedicated controller
PhiGegner Feb 28, 2023
6720b3b
#11: Add first sorting controller test
PhiGegner Feb 28, 2023
866a16d
#11: Fix sorting by priority
PhiGegner Feb 28, 2023
3336bd8
#11: Add DueDate sorting test
PhiGegner Feb 28, 2023
cfef923
#11: Use WorkItem builder for tests
PhiGegner Feb 28, 2023
6d93788
#11: Add test for sorting by Priority and then by DueDate
PhiGegner Feb 28, 2023
7d1877d
#11: Put WorkItems with value null for sorting criteria to bottom
PhiGegner Feb 28, 2023
a3b97b1
#11: Add Monocle for CI
PhiGegner Feb 28, 2023
ece92bf
#11: Set system properties for headless execution
PhiGegner Feb 28, 2023
bc2135a
#11: Move TestFX system properties to pom.xml
PhiGegner Feb 28, 2023
87016ed
#11: Improve reverting order of expected list in tests
PhiGegner Mar 1, 2023
407c84b
#11: Add test for selecting sorting criteria with combobox
PhiGegner Mar 1, 2023
4cd28c1
#11: Split SortingController and SortingViewController (SRP)
PhiGegner Mar 3, 2023
ec0a5ee
#11: Fix DB changed datatype of priority
PhiGegner Mar 3, 2023
2090948
#11: Replace priority TextField by ComboBox
PhiGegner Mar 3, 2023
a6f0914
#11: Add Flyway migration for priority
PhiGegner Mar 6, 2023
f288839
#11: Add functionality to switch order direction (WIP)
PhiGegner Mar 30, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 48 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

Expand Down Expand Up @@ -78,11 +78,6 @@
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.flywaydb</groupId>
Expand All @@ -101,6 +96,38 @@
<artifactId>sonar-maven-plugin</artifactId>
<version>3.9.1.2184</version>
</dependency>

<!-- test dependencies-->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testfx/testfx-core -->
<dependency>
<groupId>org.testfx</groupId>
<artifactId>testfx-core</artifactId>
<version>4.0.16-alpha</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testfx/testfx-junit5 -->
<dependency>
<groupId>org.testfx</groupId>
<artifactId>testfx-junit5</artifactId>
<version>4.0.16-alpha</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testfx/openjfx-monocle -->
<dependency>
<groupId>org.testfx</groupId>
<artifactId>openjfx-monocle</artifactId>
<version>jdk-11+26</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
Expand Down Expand Up @@ -172,6 +199,20 @@
<generateGitPropertiesFile>false</generateGitPropertiesFile>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M9</version>
<configuration>
<systemPropertyVariables>
<!-- Execute JavaFX tests headless -->
<testfx.robot>glass</testfx.robot>
<glass.platform>Monocle</glass.platform>
<monocle.platform>Headless</monocle.platform>
<testfx.headless>true</testfx.headless>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
</project>
14 changes: 7 additions & 7 deletions src/main/java/de/doubleslash/keeptask/common/Resources.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ private Resources() {
throw new IllegalStateException("Utility class");
}

public static URL getResource(final RESOURCE resource) {
return Resources.class.getResource(resource.getResourceLocation());
}

public enum RESOURCE {
/**
* FONTS
Expand All @@ -35,16 +39,16 @@ public enum RESOURCE {
* LAYOUTS
**/
// main
FXML_VIEW_LAYOUT("/layouts/ViewLayout.fxml"),
FXML_VIEW_LAYOUT("/layouts/MainWindowLayout.fxml"),
FXML_EDIT_WORKITEM_LAYOUT("/layouts/EditWorkItemDialog.fxml"),
FXML_FILTER_LAYOUT("/layouts/FiltersLayout.fxml"),
FXML_SORTING_LAYOUT("/layouts/SortingLayout.fxml"),

SVG_TRASH_ICON("/svgs/trash-can.svg"),

SVG_PENCIL_ICON("/svgs/pencil.svg"),

ICON_MAIN("/icons/icon.png")
;
ICON_MAIN("/icons/icon.png");

String resourceLocation;

Expand All @@ -56,8 +60,4 @@ public String getResourceLocation() {
return resourceLocation;
}
}

public static URL getResource(final RESOURCE resource) {
return Resources.class.getResource(resource.getResourceLocation());
}
}
16 changes: 4 additions & 12 deletions src/main/java/de/doubleslash/keeptask/controller/Controller.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,17 @@

package de.doubleslash.keeptask.controller;

import java.time.LocalDateTime;
import java.util.List;
import java.util.function.Predicate;

import javax.annotation.PreDestroy;

import de.doubleslash.keeptask.model.Model;
import de.doubleslash.keeptask.model.WorkItem;
import de.doubleslash.keeptask.model.repos.WorkItemRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import de.doubleslash.keeptask.model.Model;
import javax.annotation.PreDestroy;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class Controller {
Expand Down Expand Up @@ -95,11 +92,6 @@ public void shutdown() {
LOG.info("Controller shutdown");
}

public void setFilterPredicate(Predicate<WorkItem> filterPredicate) {
LOG.debug("Filters were changed");
model.getWorkFilteredList().setPredicate(filterPredicate);
}

public void setLatestSelectedProject(String projectName) {
model.setLatestSelectedProject(projectName);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package de.doubleslash.keeptask.controller;

import de.doubleslash.keeptask.model.Sorting.DueDate;
import de.doubleslash.keeptask.model.Sorting.Priority;
import de.doubleslash.keeptask.model.Sorting.SortingCriteria;
import de.doubleslash.keeptask.model.Sorting.SortingDirection;
import de.doubleslash.keeptask.model.WorkItem;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.collections.transformation.SortedList;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class SortingController {
final ObservableList<SortingCriteria> selectedSortingCriteriaList = FXCollections.observableArrayList();
private List<SortingCriteria> possibleSortingCriteriaList;
private SortedList<WorkItem> sortedWorkItems;

public SortingController() {
possibleSortingCriteriaList = Arrays.asList(
new Priority(),
new DueDate()
);
selectedSortingCriteriaList.addListener((ListChangeListener<? super SortingCriteria>) change -> updateComparator());
}

private Comparator<WorkItem> getSortingComparator() {
Comparator comparator = null;
SortingCriteria sortingCriteria;

if (selectedSortingCriteriaList.size() > 0) {
sortingCriteria = selectedSortingCriteriaList.get(0);
comparator = Comparator.comparing(sortingCriteria.getOrderFunction(), Comparator.nullsLast(getComparatorBySortingDirection(sortingCriteria.getSortingDirection())));
}

for (int i = 1; i < selectedSortingCriteriaList.size(); i++) {
sortingCriteria = selectedSortingCriteriaList.get(i);
comparator = comparator.thenComparing(sortingCriteria.getOrderFunction(), Comparator.nullsLast(getComparatorBySortingDirection(sortingCriteria.getSortingDirection())));
}
return comparator;
}

private Comparator getComparatorBySortingDirection(final SortingDirection sortingDirection) {
Comparator comparator = null;

switch (sortingDirection) {
case Ascending:
comparator = Comparator.naturalOrder();
break;

case Descending:
comparator = Comparator.reverseOrder();
break;

default:
throw new RuntimeException("The selected sorting direction could not be mapped to a comparator.");
}

return comparator;
}

private void updateComparator() {
Comparator<WorkItem> comparator = getSortingComparator();
sortedWorkItems.setComparator(comparator);
}

public void setWorkItemsToSort(ObservableList<WorkItem> workItemsToSort) {
sortedWorkItems = new SortedList<>(workItemsToSort);
updateComparator();
}

public SortedList<WorkItem> getSortedWorkItems() {
return sortedWorkItems;
}

public void addSortingCriteriaByString(String sortingCriteriaString) {
SortingCriteria foundSortingCriteria = possibleSortingCriteriaList.stream().filter(sortingCriteria -> sortingCriteria.getName() == sortingCriteriaString).findFirst().get();
selectedSortingCriteriaList.add(foundSortingCriteria);
}

public void removeSortingCriteriaByString(String sortingCriteriaString) {
SortingCriteria foundSortingCriteria = possibleSortingCriteriaList.stream().filter(sortingCriteria -> sortingCriteria.getName() == sortingCriteriaString).findFirst().get();
selectedSortingCriteriaList.remove(foundSortingCriteria);
}

public List<String> getSortingCriterias() {
return possibleSortingCriteriaList.stream().map(SortingCriteria::getName).collect(Collectors.toList());
}
}
23 changes: 4 additions & 19 deletions src/main/java/de/doubleslash/keeptask/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,57 +16,42 @@

package de.doubleslash.keeptask.model;

import de.doubleslash.keeptask.model.repos.WorkItemRepository;
import javafx.beans.InvalidationListener;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.scene.paint.Color;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javafx.scene.paint.Color;

import java.util.List;

@Component
public class Model {



public static final Color ORIGINAL_DEFAULT_BACKGROUND_COLOR = Color.WHITE;
public final ObjectProperty<Color> defaultBackgroundColor = new SimpleObjectProperty<>(
ORIGINAL_DEFAULT_BACKGROUND_COLOR);
private ObservableList<WorkItem> workItems = FXCollections.observableArrayList();
private FilteredList<WorkItem> workFilteredItems = new FilteredList(workItems);

private StringProperty latestSelectedProject = new SimpleStringProperty();

@Autowired
public Model() {
super();
}

public void setWorkItems(List<WorkItem> workItems) {
this.workItems.clear();
this.workItems.addAll(workItems);
}

public ObservableList<WorkItem> getWorkItems() {
return FXCollections.unmodifiableObservableList(workItems);
}

public ObservableList<WorkItem> getWorkFilteredItems() {
return FXCollections.unmodifiableObservableList(workFilteredItems);
public void setWorkItems(List<WorkItem> workItems) {
this.workItems.clear();
this.workItems.addAll(workItems);
}

public FilteredList<WorkItem> getWorkFilteredList(){return workFilteredItems;}

public StringProperty latestSelectedProjectProperty() {
return latestSelectedProject;
}
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/de/doubleslash/keeptask/model/Sorting/DueDate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package de.doubleslash.keeptask.model.Sorting;

import de.doubleslash.keeptask.model.WorkItem;

import java.util.function.Function;

public class DueDate extends SortingCriteria {
public DueDate() {
name = "Due Date";
sortingDirection = SortingDirection.Ascending;
}

@Override
public Function<WorkItem, ? extends Comparable> getOrderFunction() {
return WorkItem::getDueDateTime;
}
}
17 changes: 17 additions & 0 deletions src/main/java/de/doubleslash/keeptask/model/Sorting/Priority.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package de.doubleslash.keeptask.model.Sorting;

import de.doubleslash.keeptask.model.WorkItem;

import java.util.function.Function;

public class Priority extends SortingCriteria {
public Priority() {
name = "Priority";
sortingDirection = SortingDirection.Descending;
}

@Override
public Function<WorkItem, ? extends Comparable> getOrderFunction() {
return WorkItem::getPriority;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package de.doubleslash.keeptask.model.Sorting;

import de.doubleslash.keeptask.model.WorkItem;

import java.util.function.Function;

public abstract class SortingCriteria {
protected String name = null;
protected SortingDirection sortingDirection = SortingDirection.Ascending;

public String getName() {
return name;
}

public SortingDirection getSortingDirection() {
return sortingDirection;
}

public void setSortingDirection(SortingDirection sortingDirection) {
this.sortingDirection = sortingDirection;
}

public abstract Function<WorkItem, ? extends Comparable> getOrderFunction();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package de.doubleslash.keeptask.model.Sorting;

public enum SortingDirection {
Ascending, Descending
}
Loading