From 86b415b3e6c7dce9456a6a6dec6d641d3c453687 Mon Sep 17 00:00:00 2001 From: Sam Yong Jek Date: Fri, 8 Nov 2019 13:59:55 +0800 Subject: [PATCH] Fix #136 : Clear Schedule at end of the day (#143) --- src/main/java/seedu/address/logic/Logic.java | 5 + .../seedu/address/logic/LogicManager.java | 5 + src/main/java/seedu/address/model/Model.java | 16 +++ .../seedu/address/model/ModelManager.java | 11 ++ .../seedu/address/model/person/Schedule.java | 1 - .../seedu/address/model/task/TaskList.java | 5 + .../seedu/address/model/task/TaskManager.java | 1 + .../java/seedu/address/ui/HelpWindow.java | 10 ++ .../address/ui/IncompleteTaskListPanel.java | 45 +++++++ .../java/seedu/address/ui/MainWindow.java | 1 + .../seedu/address/ui/NotificationWindow.java | 114 ++++++++++++++++++ src/main/java/seedu/address/ui/UiManager.java | 5 +- .../view/IncompleteTaskListPanel.fxml | 15 +++ .../resources/view/NotificationWindow.fxml | 50 ++++++++ .../logic/commands/AddCommandTest.java | 5 + 15 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 src/main/java/seedu/address/ui/IncompleteTaskListPanel.java create mode 100644 src/main/java/seedu/address/ui/NotificationWindow.java create mode 100644 src/main/resources/view/IncompleteTaskListPanel.fxml create mode 100644 src/main/resources/view/NotificationWindow.fxml diff --git a/src/main/java/seedu/address/logic/Logic.java b/src/main/java/seedu/address/logic/Logic.java index bc0aac9d8b3..b755074032a 100644 --- a/src/main/java/seedu/address/logic/Logic.java +++ b/src/main/java/seedu/address/logic/Logic.java @@ -51,6 +51,11 @@ public interface Logic { /** Returns an unmodifiable view of the filtered list of customers */ ObservableList getFilteredCustomerList(); + /** + * Returns a list of incomplete tasks from previous days + */ + ObservableList getIncompleteTaskList(); + /** * Returns the user prefs' address book file path. */ diff --git a/src/main/java/seedu/address/logic/LogicManager.java b/src/main/java/seedu/address/logic/LogicManager.java index bafa8969172..3175858322c 100644 --- a/src/main/java/seedu/address/logic/LogicManager.java +++ b/src/main/java/seedu/address/logic/LogicManager.java @@ -81,6 +81,11 @@ public ObservableList getFilteredAssignedTaskList() { return model.getAssignedTaskList(); } + @Override + public ObservableList getIncompleteTaskList() { + return model.getIncompleteTaskList(); + } + @Override public ObservableList getFilteredDriverList() { return model.getFilteredDriverList(); diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index f1b73b73f95..cee96bebb6a 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -9,6 +9,7 @@ import javafx.collections.transformation.FilteredList; import seedu.address.commons.core.GuiSettings; +import seedu.address.logic.GlobalClock; import seedu.address.model.id.IdManager; import seedu.address.model.legacy.ReadOnlyAddressBook; import seedu.address.model.pdfmanager.exceptions.PdfNoTaskToDisplayException; @@ -48,6 +49,16 @@ public interface Model { */ Predicate PREDICATE_SHOW_ASSIGNED = task -> task.getStatus().equals(TaskStatus.ON_GOING); + /** + * {@code Predicate} that filters the task to completed status + */ + Predicate PREDICATE_SHOW_COMPLETED = task -> task.getStatus().equals(TaskStatus.COMPLETED); + + /** + * {@code Predicate} that filters the task to both incomplete and ongoing status + */ + Predicate PREDICATE_SHOW_PREVIOUS_DAYS = task -> task.getDate().isBefore(GlobalClock.dateToday()); + /** * Returns the user prefs. */ @@ -160,6 +171,11 @@ public interface Model { */ ObservableList getAssignedTaskList(); + /** + * Return a list of incomplete tasks from the previous days + */ + ObservableList getIncompleteTaskList(); + // customer manager CustomerManager getCustomerManager(); diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index 5a922800ee3..344beed2644 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -418,9 +418,20 @@ public ObservableList getAssignedTaskList() { return filteredTasks; } + /** + * Returns a observable view of the list of incomplete tasks from the previous days + */ + @Override + public ObservableList getIncompleteTaskList() { + FilteredList incompleteTasks = new FilteredList<>(this.taskManager.getList()); + updateFilteredTaskList(PREDICATE_SHOW_ASSIGNED.and(PREDICATE_SHOW_PREVIOUS_DAYS), incompleteTasks); + return incompleteTasks; + } + /** * Refreshes the display of task list. */ + @Override public void refreshFilteredTaskList() { //refresh assigned task list updateFilteredTaskList(PREDICATE_SHOW_EMPTY_TASKS, filteredTasks); diff --git a/src/main/java/seedu/address/model/person/Schedule.java b/src/main/java/seedu/address/model/person/Schedule.java index 85b60977189..34bfeeca5b5 100644 --- a/src/main/java/seedu/address/model/person/Schedule.java +++ b/src/main/java/seedu/address/model/person/Schedule.java @@ -146,7 +146,6 @@ public boolean remove(EventTime eventTime) { return schedule.remove(eventTime); } - private boolean isOutsideWorkingHours(EventTime eventTime) { return (eventTime.getEnd().compareTo(eventTime.getStart()) <= 0) || (eventTime.getStart().compareTo(workingHours.getStart()) < 0) diff --git a/src/main/java/seedu/address/model/task/TaskList.java b/src/main/java/seedu/address/model/task/TaskList.java index b2bb6ede838..9bb7f7922f3 100644 --- a/src/main/java/seedu/address/model/task/TaskList.java +++ b/src/main/java/seedu/address/model/task/TaskList.java @@ -4,6 +4,7 @@ import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; import java.util.Comparator; +import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -127,6 +128,10 @@ public List getFilteredList(Predicate predicate) { .collect(Collectors.toList()); } + public Iterator getIterator() { + return tasks.iterator(); + } + public void setTaskList(List savedTasks) { tasks.setAll(savedTasks); } diff --git a/src/main/java/seedu/address/model/task/TaskManager.java b/src/main/java/seedu/address/model/task/TaskManager.java index fc1d44837b7..be490af226f 100644 --- a/src/main/java/seedu/address/model/task/TaskManager.java +++ b/src/main/java/seedu/address/model/task/TaskManager.java @@ -2,6 +2,7 @@ import javafx.collections.ObservableList; + /** * Manages the task list. * It contains the minimal set of list operations. diff --git a/src/main/java/seedu/address/ui/HelpWindow.java b/src/main/java/seedu/address/ui/HelpWindow.java index 2b2bef9de3a..573adf2e5c9 100644 --- a/src/main/java/seedu/address/ui/HelpWindow.java +++ b/src/main/java/seedu/address/ui/HelpWindow.java @@ -7,6 +7,7 @@ import javafx.scene.control.Label; import javafx.scene.input.Clipboard; import javafx.scene.input.ClipboardContent; +import javafx.scene.layout.StackPane; import javafx.stage.Stage; import seedu.address.commons.core.LogsCenter; @@ -21,12 +22,21 @@ public class HelpWindow extends UiPart { private static final Logger logger = LogsCenter.getLogger(HelpWindow.class); private static final String FXML = "HelpWindow.fxml"; + private DriverListPanel driverListPanel; + private IncompleteTaskListPanel incompleteTaskListPanel; + + @FXML + private StackPane driverListPanelPlaceholder; + @FXML private Button copyButton; @FXML private Label helpMessage; + @FXML + private StackPane incompleteTaskListPanelPlaceholder; + /** * Creates a new HelpWindow. * diff --git a/src/main/java/seedu/address/ui/IncompleteTaskListPanel.java b/src/main/java/seedu/address/ui/IncompleteTaskListPanel.java new file mode 100644 index 00000000000..fab826351f0 --- /dev/null +++ b/src/main/java/seedu/address/ui/IncompleteTaskListPanel.java @@ -0,0 +1,45 @@ +package seedu.address.ui; + +import java.util.logging.Logger; + +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.layout.Region; +import seedu.address.commons.core.LogsCenter; +import seedu.address.model.task.Task; + +/** + * Panel containing the list of persons. + */ +public class IncompleteTaskListPanel extends UiPart { + private static final String FXML = "IncompleteTaskListPanel.fxml"; + private final Logger logger = LogsCenter.getLogger(IncompleteTaskListPanel.class); + + @FXML + private ListView incompleteTaskListView; + + public IncompleteTaskListPanel(ObservableList incompleteTaskList) { + super(FXML); + incompleteTaskListView.setItems(incompleteTaskList); + incompleteTaskListView.setCellFactory(listView -> new IncompleteTaskListPanel.IncompleteTaskListViewCell()); + } + + /** + * Custom {@code ListCell} that displays the graphics of a {@code Task} using a {@code TaskCard}. + */ + class IncompleteTaskListViewCell extends ListCell { + @Override + protected void updateItem(Task task, boolean empty) { + super.updateItem(task, empty); + + if (empty || task == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(new TaskCard(task, getIndex() + 1).getRoot()); + } + } + } +} diff --git a/src/main/java/seedu/address/ui/MainWindow.java b/src/main/java/seedu/address/ui/MainWindow.java index c67e6744dd5..9e0b331409c 100644 --- a/src/main/java/seedu/address/ui/MainWindow.java +++ b/src/main/java/seedu/address/ui/MainWindow.java @@ -35,6 +35,7 @@ public class MainWindow extends UiPart { // Independent Ui parts residing in this Ui container private ResultDisplay resultDisplay; private HelpWindow helpWindow; + private NotificationWindow notificationWindow; private AssignedTaskListPanel assignedTaskListPanel; private UnassignedTaskListPanel unassignedTaskListPanel; private CustomerListPanel customerListPanel; diff --git a/src/main/java/seedu/address/ui/NotificationWindow.java b/src/main/java/seedu/address/ui/NotificationWindow.java new file mode 100644 index 00000000000..6e27e78972e --- /dev/null +++ b/src/main/java/seedu/address/ui/NotificationWindow.java @@ -0,0 +1,114 @@ +package seedu.address.ui; + +import java.util.logging.Logger; + +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; +import seedu.address.commons.core.LogsCenter; +import seedu.address.logic.Logic; +import seedu.address.logic.commands.FreeCommand; +import seedu.address.model.person.Driver; +import seedu.address.model.task.Task; + +/** + * Controller for a help page + */ +public class NotificationWindow extends UiPart { + + private static final Logger logger = LogsCenter.getLogger(NotificationWindow.class); + private static final String FXML = "NotificationWindow.fxml"; + + private Logic logic; + + private IncompleteTaskListPanel incompleteTaskListPanel; + + @FXML + private StackPane incompleteTaskListPanelPlaceholder; + + @FXML + private Button okayButton; + + @FXML + private StackPane okayButtonPlaceholder; + + /** + * Creates a new HelpWindow. + * + * @param root Stage to use as the root of the HelpWindow. + */ + public NotificationWindow(Stage root, Logic logic) { + super(FXML, root); + this.logic = logic; + + incompleteTaskListPanel = new IncompleteTaskListPanel(this.logic.getIncompleteTaskList()); + incompleteTaskListPanelPlaceholder.getChildren().add(incompleteTaskListPanel.getRoot()); + } + + /** + * Creates a new HelpWindow. + */ + public NotificationWindow(Logic logic) { + this(new Stage(), logic); + } + + /** + * Shows the notification window. + * @throws IllegalStateException + *
    + *
  • + * if this method is called on a thread other than the JavaFX Application Thread. + *
  • + *
  • + * if this method is called during animation or layout processing. + *
  • + *
  • + * if this method is called on the primary stage. + *
  • + *
  • + * if {@code dialogStage} is already showing. + *
  • + *
+ */ + public void show() { + logger.fine("Showing page about the incomplete task from the previous day."); + getRoot().show(); + getRoot().centerOnScreen(); + } + + /** + * Returns true if the help window is currently being shown. + */ + public boolean isShowing() { + return getRoot().isShowing(); + } + + /** + * Hides the help window. + */ + public void hide() { + getRoot().hide(); + } + + /** + * Focuses on the help window. + */ + public void focus() { + getRoot().requestFocus(); + } + + /** + * Frees driver's schedule from tasks in the past + */ + @FXML + private void freeDriver() { + ObservableList tasksToBeCleared = logic.getIncompleteTaskList(); + for (Task task: tasksToBeCleared) { + Driver driver = task.getDriver().orElseThrow(); + FreeCommand.freeDriverFromTask(driver, task); + } + this.hide(); + } +} diff --git a/src/main/java/seedu/address/ui/UiManager.java b/src/main/java/seedu/address/ui/UiManager.java index 876621d79b9..50ab4caf12d 100644 --- a/src/main/java/seedu/address/ui/UiManager.java +++ b/src/main/java/seedu/address/ui/UiManager.java @@ -24,6 +24,7 @@ public class UiManager implements Ui { private Logic logic; private MainWindow mainWindow; + private NotificationWindow notificationWindow; public UiManager(Logic logic) { super(); @@ -41,7 +42,9 @@ public void start(Stage primaryStage) { mainWindow = new MainWindow(primaryStage, logic); mainWindow.show(); //This should be called before creating other UI parts mainWindow.fillInnerParts(); - + notificationWindow = new NotificationWindow(logic); + notificationWindow.show(); + notificationWindow.focus(); } catch (Throwable e) { logger.severe(StringUtil.getDetails(e)); showFatalErrorDialogAndShutdown("Fatal error during initializing", e); diff --git a/src/main/resources/view/IncompleteTaskListPanel.fxml b/src/main/resources/view/IncompleteTaskListPanel.fxml new file mode 100644 index 00000000000..f008aa7e84c --- /dev/null +++ b/src/main/resources/view/IncompleteTaskListPanel.fxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/src/main/resources/view/NotificationWindow.fxml b/src/main/resources/view/NotificationWindow.fxml new file mode 100644 index 00000000000..9c8467a893d --- /dev/null +++ b/src/main/resources/view/NotificationWindow.fxml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/seedu/address/logic/commands/AddCommandTest.java b/src/test/java/seedu/address/logic/commands/AddCommandTest.java index db81f2886e5..a8d7a914cad 100644 --- a/src/test/java/seedu/address/logic/commands/AddCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddCommandTest.java @@ -239,6 +239,11 @@ public void updateFilteredTaskList(Predicate predicate, FilteredList throw new AssertionError("This method should not be called."); } + @Override + public ObservableList getIncompleteTaskList() { + throw new AssertionError("This method should not be called."); + } + @Override public void refreshFilteredTaskList() { throw new AssertionError("This method should not be called.");