From 3fa72c1e4ec8e59e01c1ecded5093db3231bab0d Mon Sep 17 00:00:00 2001 From: Advay Pal Date: Mon, 17 Oct 2016 07:16:49 +0800 Subject: [PATCH 01/22] Remove overlooked addressbook --- docs/DeveloperGuide.md | 20 +++++++++---------- docs/UsingGradle.md | 4 ++-- .../java/seedu/task/model/ModelManager.java | 14 ++++++------- .../seedu/task/storage/XmlFileStorage.java | 8 ++++---- .../java/seedu/task/ui/StatusBarFooter.java | 2 +- .../ConfigUtilTest/ExtraValuesConfig.json | 4 ++-- .../data/ConfigUtilTest/TypicalConfig.json | 4 ++-- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index e4e8c2dbed9d..caab7b2dbe4b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -48,7 +48,7 @@ The **_Architecture Diagram_** given above explains the high-level design of the App. Given below is a quick overview of each component. -`Main` has only one class called [`MainApp`](../src/main/java/seedu/address/MainApp.java). It is responsible for, +`Main` has only one class called [`MainApp`](../src/main/java/seedu/task/MainApp.java). It is responsible for, * At app launch: Initializes the components in the correct sequence, and connect them up with each other. * At shut down: Shuts down the components and invoke cleanup method where necessary. @@ -94,7 +94,7 @@ The sections below give more details of each component.
-**API** : [`Ui.java`](../src/main/java/seedu/address/ui/Ui.java) +**API** : [`Ui.java`](../src/main/java/seedu/task/ui/Ui.java) The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter`, `BrowserPanel` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class @@ -102,7 +102,7 @@ and they can be loaded using the `UiPartLoader`. The `UI` component uses JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder.
-For example, the layout of the [`MainWindow`](../src/main/java/seedu/address/ui/MainWindow.java) is specified in +For example, the layout of the [`MainWindow`](../src/main/java/seedu/task/ui/MainWindow.java) is specified in [`MainWindow.fxml`](../src/main/resources/view/MainWindow.fxml) The `UI` component, @@ -114,7 +114,7 @@ The `UI` component,
-**API** : [`Logic.java`](../src/main/java/seedu/address/logic/Logic.java) +**API** : [`Logic.java`](../src/main/java/seedu/task/logic/Logic.java) 1. `Logic` uses the `Parser` class to parse the user command. 2. This results in a `Command` object which is executed by the `LogicManager`. @@ -129,7 +129,7 @@ API call.

-**API** : [`Model.java`](../src/main/java/seedu/address/model/Model.java) +**API** : [`Model.java`](../src/main/java/seedu/task/model/Model.java) The `Model`, * stores a `UserPref` object that represents the user's preferences. @@ -142,7 +142,7 @@ The `Model`,
-**API** : [`Storage.java`](../src/main/java/seedu/address/storage/Storage.java) +**API** : [`Storage.java`](../src/main/java/seedu/task/storage/Storage.java) The `Storage` component, * can save `UserPref` objects in json format and read it back. @@ -150,7 +150,7 @@ The `Storage` component, ### Common classes -Classes used by multiple components are in the `seedu.addressbook.commons` package. +Classes used by multiple components are in the `seedu.task.commons` package. ## Implementation @@ -200,13 +200,13 @@ We have two types of tests: These are in the `guitests` package. 2. **Non-GUI Tests** - These are tests not involving the GUI. They include, 1. _Unit tests_ targeting the lowest level methods/classes.
- e.g. `seedu.address.commons.UrlUtilTest` + e.g. `seedu.task.commons.UrlUtilTest` 2. _Integration tests_ that are checking the integration of multiple code units (those code units are assumed to be working).
- e.g. `seedu.address.storage.StorageManagerTest` + e.g. `seedu.task.storage.StorageManagerTest` 3. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.
- e.g. `seedu.address.logic.LogicManagerTest` + e.g. `seedu.task.logic.LogicManagerTest` **Headless GUI Testing** : Thanks to the [TestFX](https://github.com/TestFX/TestFX) library we use, our GUI tests can be run in the _headless_ mode. diff --git a/docs/UsingGradle.md b/docs/UsingGradle.md index 578c5f8634c2..69cb94b6e45c 100644 --- a/docs/UsingGradle.md +++ b/docs/UsingGradle.md @@ -35,7 +35,7 @@ Gradle commands look like this: ## Creating the JAR file * **`shadowJar`**
- Creates the `addressbook.jar` file in the `build/jar` folder, _if the current file is outdated_.
+ Creates the `taskmanager.jar` file in the `build/jar` folder, _if the current file is outdated_.
e.g. `./gradlew shadowJar` > To force Gradle to create the JAR file even if the current one is up-to-date, you can '`clean`' first.
@@ -56,7 +56,7 @@ If we package only our own class files into the JAR file, it will not work prope Runs all tests in the `guitests` package * **`nonGuiTests`**
- Runs all non-GUI tests in the `seedu.address` package + Runs all non-GUI tests in the `seedu.task` package * **`headless`**
Sets the test mode as _headless_. diff --git a/src/main/java/seedu/task/model/ModelManager.java b/src/main/java/seedu/task/model/ModelManager.java index de580da92b9b..649191387788 100644 --- a/src/main/java/seedu/task/model/ModelManager.java +++ b/src/main/java/seedu/task/model/ModelManager.java @@ -24,8 +24,8 @@ public class ModelManager extends ComponentManager implements Model { private final FilteredList filteredTasks; /** - * Initializes a ModelManager with the given AddressBook - * AddressBook and its variables should not be null + * Initializes a ModelManager with the given TaskManager + * TaskManager and its variables should not be null */ public ModelManager(TaskManager src, UserPrefs userPrefs) { super(); @@ -50,7 +50,7 @@ public ModelManager(ReadOnlyTaskManager initialData, UserPrefs userPrefs) { @Override public void resetData(ReadOnlyTaskManager newData) { taskManager.resetData(newData); - indicateAddressBookChanged(); + indicateTaskManagerChanged(); } @Override @@ -59,28 +59,28 @@ public ReadOnlyTaskManager getTaskManager() { } /** Raises an event to indicate the model has changed */ - private void indicateAddressBookChanged() { + private void indicateTaskManagerChanged() { raise(new TaskManagerChangedEvent(taskManager)); } @Override public synchronized void deleteTask(ReadOnlyTask target) throws UniqueTaskList.TaskNotFoundException { taskManager.removeTask(target); - indicateAddressBookChanged(); + indicateTaskManagerChanged(); } @Override public synchronized void addTask(Task task) throws UniqueTaskList.DuplicateTaskException { taskManager.addTask(task); updateFilteredListToShowAll(); - indicateAddressBookChanged(); + indicateTaskManagerChanged(); } @Override public synchronized void updateTask(ReadOnlyTask originalTask, Task updateTask) throws UniqueTaskList.DuplicateTaskException { taskManager.updateTask(originalTask, updateTask); updateFilteredListToShowAll(); - indicateAddressBookChanged(); + indicateTaskManagerChanged(); } //=========== Filtered Task List Accessors =============================================================== diff --git a/src/main/java/seedu/task/storage/XmlFileStorage.java b/src/main/java/seedu/task/storage/XmlFileStorage.java index e21139d36f1b..0fdbe51dae75 100644 --- a/src/main/java/seedu/task/storage/XmlFileStorage.java +++ b/src/main/java/seedu/task/storage/XmlFileStorage.java @@ -9,16 +9,16 @@ import java.io.FileNotFoundException; /** - * Stores addressbook data in an XML file + * Stores taskmanager data in an XML file */ public class XmlFileStorage { /** - * Saves the given addressbook data to the specified file. + * Saves the given taskmanager data to the specified file. */ - public static void saveDataToFile(File file, XmlSerializableTaskManager addressBook) + public static void saveDataToFile(File file, XmlSerializableTaskManager taskManager) throws FileNotFoundException { try { - XmlUtil.saveDataToFile(file, addressBook); + XmlUtil.saveDataToFile(file, taskManager); } catch (JAXBException e) { assert false : "Unexpected exception " + e.getMessage(); } diff --git a/src/main/java/seedu/task/ui/StatusBarFooter.java b/src/main/java/seedu/task/ui/StatusBarFooter.java index ea63cc9a8e4f..a76c39bc84b2 100644 --- a/src/main/java/seedu/task/ui/StatusBarFooter.java +++ b/src/main/java/seedu/task/ui/StatusBarFooter.java @@ -91,7 +91,7 @@ public String getFxmlPath() { } @Subscribe - public void handleAddressBookChangedEvent(TaskManagerChangedEvent abce) { + public void handleTaskManagerChangedEvent(TaskManagerChangedEvent abce) { String lastUpdated = (new Date()).toString(); logger.info(LogsCenter.getEventHandlingLogMessage(abce, "Setting last updated status to " + lastUpdated)); setSyncStatus("Last Updated: " + lastUpdated); diff --git a/src/test/data/ConfigUtilTest/ExtraValuesConfig.json b/src/test/data/ConfigUtilTest/ExtraValuesConfig.json index 97f96a30c33a..74409d629958 100644 --- a/src/test/data/ConfigUtilTest/ExtraValuesConfig.json +++ b/src/test/data/ConfigUtilTest/ExtraValuesConfig.json @@ -2,7 +2,7 @@ "appTitle" : "Typical App Title", "logLevel" : "INFO", "userPrefsFilePath" : "C:\\preferences.json", - "addressBookFilePath" : "taskmanager.xml", - "addressBookName" : "TypicalAddressBookName", + "taskManagerFilePath" : "data/taskmanager.xml", + "taskManagerName" : "MESS", "extra" : "extra value" } \ No newline at end of file diff --git a/src/test/data/ConfigUtilTest/TypicalConfig.json b/src/test/data/ConfigUtilTest/TypicalConfig.json index 117791a44194..50e787694320 100644 --- a/src/test/data/ConfigUtilTest/TypicalConfig.json +++ b/src/test/data/ConfigUtilTest/TypicalConfig.json @@ -2,6 +2,6 @@ "appTitle" : "Typical App Title", "logLevel" : "INFO", "userPrefsFilePath" : "C:\\preferences.json", - "addressBookFilePath" : "taskmanager.xml", - "addressBookName" : "TypicalTaskManagerName" + "taskManagerFilePath" : "data/taskmanager.xml", + "taskManagerName" : "MESS" } \ No newline at end of file From 5b92d47443a2291e100feac7154a1eaae94371f7 Mon Sep 17 00:00:00 2001 From: suki Date: Mon, 17 Oct 2016 22:17:54 +0800 Subject: [PATCH 02/22] Add CompleteCommand --- .../seedu/task/logic/commands/AddCommand.java | 3 +- .../task/logic/commands/CompleteCommand.java | 46 +++++++++++++++++++ .../task/logic/commands/UpdateCommand.java | 2 +- src/main/java/seedu/task/model/Model.java | 3 ++ .../java/seedu/task/model/ModelManager.java | 7 +++ .../java/seedu/task/model/TaskManager.java | 7 +++ .../seedu/task/model/task/ReadOnlyTask.java | 2 +- src/main/java/seedu/task/model/task/Task.java | 25 ++++++---- .../seedu/task/model/task/UniqueTaskList.java | 12 +++++ .../seedu/task/storage/XmlAdaptedTask.java | 8 ++-- .../seedu/task/logic/LogicManagerTest.java | 9 ++-- .../java/seedu/task/testutil/TestTask.java | 10 +++- .../java/seedu/task/testutil/TestUtil.java | 18 ++++---- 13 files changed, 125 insertions(+), 27 deletions(-) create mode 100644 src/main/java/seedu/task/logic/commands/CompleteCommand.java diff --git a/src/main/java/seedu/task/logic/commands/AddCommand.java b/src/main/java/seedu/task/logic/commands/AddCommand.java index b0645b2460c3..f63b2146fcda 100644 --- a/src/main/java/seedu/task/logic/commands/AddCommand.java +++ b/src/main/java/seedu/task/logic/commands/AddCommand.java @@ -41,7 +41,8 @@ public AddCommand(String name, Set tags) //String openTime, String close //new DateTime(openTime), //new DateTime(closeTime), //new Boolean(importance), - new UniqueTagList(tagSet) + new UniqueTagList(tagSet), + false ); } diff --git a/src/main/java/seedu/task/logic/commands/CompleteCommand.java b/src/main/java/seedu/task/logic/commands/CompleteCommand.java new file mode 100644 index 000000000000..32058a9f9110 --- /dev/null +++ b/src/main/java/seedu/task/logic/commands/CompleteCommand.java @@ -0,0 +1,46 @@ +package seedu.task.logic.commands; + +import seedu.task.commons.core.Messages; +import seedu.task.commons.core.UnmodifiableObservableList; +import seedu.task.model.task.ReadOnlyTask; +import seedu.task.model.task.UniqueTaskList.TaskNotFoundException; +import seedu.task.model.task.*; + +public class CompleteCommand extends Command{ + + public static final String COMMAND_WORD = "complete"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Marks the task identified by the index number used in the last task listing as completed.\n" + + "Parameters: INDEX (must be a positive integer)\n" + + "Example: " + COMMAND_WORD + " 1"; + + public static final String MESSAGE_COMPLETE_TASK_SUCCESS = "Completed Task: %1$s"; + + public final int targetIndex; + + public CompleteCommand(int targetIndex) { + this.targetIndex = targetIndex; + } + + @Override + public CommandResult execute() { + + UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + + if (lastShownList.size() < targetIndex) { + indicateAttemptToExecuteIncorrectCommand(); + return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); + } + + ReadOnlyTask orginialTask = lastShownList.get(targetIndex - 1); + Task completedTask=new Task(orginialTask.getName(),orginialTask.getTags(),orginialTask.getComplete()); + + + completedTask.setIsCompleted(true); + model.completeTask(orginialTask,completedTask); + + + return new CommandResult(String.format(MESSAGE_COMPLETE_TASK_SUCCESS, orginialTask)); +} +} diff --git a/src/main/java/seedu/task/logic/commands/UpdateCommand.java b/src/main/java/seedu/task/logic/commands/UpdateCommand.java index da28290273e5..5b432b50a515 100644 --- a/src/main/java/seedu/task/logic/commands/UpdateCommand.java +++ b/src/main/java/seedu/task/logic/commands/UpdateCommand.java @@ -73,7 +73,7 @@ public CommandResult execute() { Task newTask = new Task( updatedTaskName, - newTaskTags + newTaskTags,false ); assert model != null; diff --git a/src/main/java/seedu/task/model/Model.java b/src/main/java/seedu/task/model/Model.java index cbf3d66ccbc0..f54e241f6ca6 100644 --- a/src/main/java/seedu/task/model/Model.java +++ b/src/main/java/seedu/task/model/Model.java @@ -26,6 +26,9 @@ public interface Model { /** Updates the given task */ void updateTask(ReadOnlyTask orginalTask, Task updateTask) throws UniqueTaskList.DuplicateTaskException; + /** Mark the given task as completed */ + void completeTask(ReadOnlyTask originalTask, Task completedTask); + /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ UnmodifiableObservableList getFilteredTaskList(); diff --git a/src/main/java/seedu/task/model/ModelManager.java b/src/main/java/seedu/task/model/ModelManager.java index de580da92b9b..dcb09555d33e 100644 --- a/src/main/java/seedu/task/model/ModelManager.java +++ b/src/main/java/seedu/task/model/ModelManager.java @@ -83,6 +83,13 @@ public synchronized void updateTask(ReadOnlyTask originalTask, Task updateTask) indicateAddressBookChanged(); } + @Override + public synchronized void completeTask(ReadOnlyTask originalTask, Task completeTask){ + taskManager.completeTask(originalTask, completeTask); + updateFilteredListToShowAll(); + indicateAddressBookChanged(); + } + //=========== Filtered Task List Accessors =============================================================== @Override diff --git a/src/main/java/seedu/task/model/TaskManager.java b/src/main/java/seedu/task/model/TaskManager.java index 52fbe3c37529..5b19ba6e750a 100644 --- a/src/main/java/seedu/task/model/TaskManager.java +++ b/src/main/java/seedu/task/model/TaskManager.java @@ -93,7 +93,14 @@ public void updateTask(ReadOnlyTask originalTask, Task updateTask) throws Unique syncTagsWithMasterList(updateTask); tasks.update(originalTask,updateTask); } + /** + * Marks a specific task as completed to the task list. + */ + public void completeTask(ReadOnlyTask originalTask, Task completeTask) { + syncTagsWithMasterList(completeTask); + tasks.complete(originalTask,completeTask); + } /** * Ensures that every tag in this task: diff --git a/src/main/java/seedu/task/model/task/ReadOnlyTask.java b/src/main/java/seedu/task/model/task/ReadOnlyTask.java index 501637294c46..164b62556017 100644 --- a/src/main/java/seedu/task/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/task/model/task/ReadOnlyTask.java @@ -11,7 +11,7 @@ public interface ReadOnlyTask { Name getName(); //DateTime getOpenTime(); //DateTime getCloseTime(); - //boolean getImportance(); + boolean getComplete(); /** * The returned TagList is a deep copy of the internal TagList, diff --git a/src/main/java/seedu/task/model/task/Task.java b/src/main/java/seedu/task/model/task/Task.java index 43058b0a5cec..b7818df548dd 100644 --- a/src/main/java/seedu/task/model/task/Task.java +++ b/src/main/java/seedu/task/model/task/Task.java @@ -15,14 +15,14 @@ public class Task implements ReadOnlyTask { private Name name; //private DateTime openTime; //private DateTime closeTime; - //private boolean isImportant; + private boolean isCompleted; private UniqueTagList tags; /** * Every field must be present and not null. */ - public Task(Name name, UniqueTagList tags) { + public Task(Name name, UniqueTagList tags,boolean isCompleted) { // open time, urgent, and close time can be null assert !CollectionUtil.isAnyNull(name, tags); this.name = name; @@ -30,14 +30,15 @@ public Task(Name name, UniqueTagList tags) { //this.openTime = openTime; //this.closeTime = closeTime; //this.isImportant = isImportant; - this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list + this.tags = new UniqueTagList(tags); + this.isCompleted=false; // protect internal tags from changes in the arg list } /** * Copy constructor. */ public Task(ReadOnlyTask source) { - this(source.getName(), source.getTags()); + this(source.getName(), source.getTags(),source.getComplete()); } @Override @@ -53,13 +54,13 @@ public DateTime getOpenTime() { @Override public DateTime getCloseTime() { return closeTime; - } + }**/ @Override - public boolean getImportance() { - return isImportant; + public boolean getComplete() { + return isCompleted; } - **/ + @Override public UniqueTagList getTags() { return new UniqueTagList(tags); @@ -72,6 +73,14 @@ public void setTags(UniqueTagList replacement) { tags.setTags(replacement); } + /** + * Set isCompleted to be true for the selected task + */ + public void setIsCompleted(boolean isCompleted) { + this.isCompleted=isCompleted; + } + + @Override public boolean equals(Object other) { return other == this // short circuit if same object diff --git a/src/main/java/seedu/task/model/task/UniqueTaskList.java b/src/main/java/seedu/task/model/task/UniqueTaskList.java index 975bb4141acd..bd977d15af76 100644 --- a/src/main/java/seedu/task/model/task/UniqueTaskList.java +++ b/src/main/java/seedu/task/model/task/UniqueTaskList.java @@ -79,6 +79,18 @@ public void update(ReadOnlyTask toUpdate, Task updatedTask) throws DuplicateTask internalList.set(index, updatedTask); } + /** + * Marks a task as completed in the list. + */ + public void complete(ReadOnlyTask originalTask, Task completeTask) { + assert originalTask != null; + assert completeTask != null; + + int index = internalList.indexOf(originalTask); + assert index >= 0; + + internalList.set(index, completeTask); + } /** * Removes the equivalent task from the list. diff --git a/src/main/java/seedu/task/storage/XmlAdaptedTask.java b/src/main/java/seedu/task/storage/XmlAdaptedTask.java index d8452a879765..b1e0e1812fb6 100644 --- a/src/main/java/seedu/task/storage/XmlAdaptedTask.java +++ b/src/main/java/seedu/task/storage/XmlAdaptedTask.java @@ -22,8 +22,8 @@ public class XmlAdaptedTask { // private DateTime openTime; // @XmlElement(required = false) // private DateTime closeTime; -// @XmlElement(required = false) -// private boolean isImportant; + @XmlElement(required = false) + private boolean isComplete; @XmlElement private List tagged = new ArrayList<>(); @@ -47,6 +47,7 @@ public XmlAdaptedTask(ReadOnlyTask source) { tagged = new ArrayList<>(); for (Tag tag : source.getTags()) { tagged.add(new XmlAdaptedTag(tag)); + isComplete=source.getComplete(); } } @@ -65,6 +66,7 @@ public Task toModelType() throws IllegalValueException { // final DateTime closeTime = new DateTime(this.closeTime); // final boolean isImportant = this.isImportant; final UniqueTagList tags = new UniqueTagList(taskTags); - return new Task(name, tags); //(name, openTime, closeTime, isImportant, tags) + final boolean isComplete=false; + return new Task(name, tags,isComplete); //(name, openTime, closeTime, isImportant, tags) } } diff --git a/src/test/java/seedu/task/logic/LogicManagerTest.java b/src/test/java/seedu/task/logic/LogicManagerTest.java index 1d44ecf28c34..ae049ec708b9 100644 --- a/src/test/java/seedu/task/logic/LogicManagerTest.java +++ b/src/test/java/seedu/task/logic/LogicManagerTest.java @@ -388,7 +388,8 @@ Task adam() throws Exception { Tag tag1 = new Tag("tag1"); Tag tag2 = new Tag("tag2"); UniqueTagList tags = new UniqueTagList(tag1, tag2); - return new Task(name, tags); //privatePhone, email, privateAddress, + boolean isComplete=false; + return new Task(name, tags,isComplete); //privatePhone, email, privateAddress, } /** @@ -404,7 +405,8 @@ Task generateTask(int seed) throws Exception { // new Phone("" + Math.abs(seed)), // new Email(seed + "@email"), // new Address("House of " + seed), - new UniqueTagList(new Tag("tag" + Math.abs(seed)), new Tag("tag" + Math.abs(seed + 1))) + new UniqueTagList(new Tag("tag" + Math.abs(seed)), new Tag("tag" + Math.abs(seed + 1))), + false ); } @@ -503,7 +505,8 @@ Task generateTaskWithName(String name) throws Exception { // new Phone("1"), // new Email("1@email"), // new Address("House of 1"), - new UniqueTagList(new Tag("tag")) + new UniqueTagList(new Tag("tag")), + false ); } } diff --git a/src/test/java/seedu/task/testutil/TestTask.java b/src/test/java/seedu/task/testutil/TestTask.java index d855aa99b1a8..8a0aa5b30216 100644 --- a/src/test/java/seedu/task/testutil/TestTask.java +++ b/src/test/java/seedu/task/testutil/TestTask.java @@ -13,6 +13,7 @@ public class TestTask implements ReadOnlyTask { // private Email email; // private Phone phone; private UniqueTagList tags; + private boolean isCompleted; public TestTask() { tags = new UniqueTagList(); @@ -22,6 +23,9 @@ public void setName(Name name) { this.name = name; } + public void setIsCompleted(boolean isCompleted){ + this.isCompleted=isCompleted; + } // public void setAddress(Address address) { // this.address = address; // } @@ -53,7 +57,11 @@ public Name getName() { // public Address getAddress() { // return address; // } - + @Override + public boolean getComplete() { + return isCompleted; + } + @Override public UniqueTagList getTags() { return tags; diff --git a/src/test/java/seedu/task/testutil/TestUtil.java b/src/test/java/seedu/task/testutil/TestUtil.java index 54e6b4e716ec..e754001272cb 100644 --- a/src/test/java/seedu/task/testutil/TestUtil.java +++ b/src/test/java/seedu/task/testutil/TestUtil.java @@ -66,15 +66,15 @@ public static void assertThrows(Class expected, Runnable ex private static Task[] getSampleTaskData() { try { return new Task[]{ - new Task(new Name("Ali Muster"), new UniqueTagList()),//, new Phone("9482424"), new Email("hans@google.com"), new Address("4th street"), new UniqueTagList()), - new Task(new Name("Boris Mueller"), new UniqueTagList()),//, new Phone("87249245"), new Email("ruth@google.com"), new Address("81th street"), new UniqueTagList()), - new Task(new Name("Carl Kurz"), new UniqueTagList()),//, new Phone("95352563"), new Email("heinz@yahoo.com"), new Address("wall street"), new UniqueTagList()), - new Task(new Name("Daniel Meier"), new UniqueTagList()),// new Phone("87652533"), new Email("cornelia@google.com"), new Address("10th street"), new UniqueTagList()), - new Task(new Name("Elle Meyer"), new UniqueTagList()),// new Phone("9482224"), new Email("werner@gmail.com"), new Address("michegan ave"), new UniqueTagList()), - new Task(new Name("Fiona Kunz"), new UniqueTagList()),// new Phone("9482427"), new Email("lydia@gmail.com"), new Address("little tokyo"), new UniqueTagList()), - new Task(new Name("George Best"), new UniqueTagList()),// new Phone("9482442"), new Email("anna@google.com"), new Address("4th street"), new UniqueTagList()), - new Task(new Name("Hoon Meier"), new UniqueTagList()),// new Phone("8482424"), new Email("stefan@mail.com"), new Address("little india"), new UniqueTagList()), - new Task(new Name("Ida Mueller"), new UniqueTagList()),// new Phone("8482131"), new Email("hans@google.com"), new Address("chicago ave"), new UniqueTagList()) + new Task(new Name("Ali Muster"), new UniqueTagList(),false),//, new Phone("9482424"), new Email("hans@google.com"), new Address("4th street"), new UniqueTagList()), + new Task(new Name("Boris Mueller"), new UniqueTagList(),false),//, new Phone("87249245"), new Email("ruth@google.com"), new Address("81th street"), new UniqueTagList()), + new Task(new Name("Carl Kurz"), new UniqueTagList(),false),//, new Phone("95352563"), new Email("heinz@yahoo.com"), new Address("wall street"), new UniqueTagList()), + new Task(new Name("Daniel Meier"), new UniqueTagList(),false),// new Phone("87652533"), new Email("cornelia@google.com"), new Address("10th street"), new UniqueTagList()), + new Task(new Name("Elle Meyer"), new UniqueTagList(),false),// new Phone("9482224"), new Email("werner@gmail.com"), new Address("michegan ave"), new UniqueTagList()), + new Task(new Name("Fiona Kunz"), new UniqueTagList(),false),// new Phone("9482427"), new Email("lydia@gmail.com"), new Address("little tokyo"), new UniqueTagList()), + new Task(new Name("George Best"), new UniqueTagList(),false),// new Phone("9482442"), new Email("anna@google.com"), new Address("4th street"), new UniqueTagList()), + new Task(new Name("Hoon Meier"), new UniqueTagList(),false),// new Phone("8482424"), new Email("stefan@mail.com"), new Address("little india"), new UniqueTagList()), + new Task(new Name("Ida Mueller"), new UniqueTagList(),false),// new Phone("8482131"), new Email("hans@google.com"), new Address("chicago ave"), new UniqueTagList()) }; } catch (IllegalValueException e) { assert false; From 7185e8a96fa95542257fceaebb7dd814ca4be2a2 Mon Sep 17 00:00:00 2001 From: Advay Pal Date: Tue, 18 Oct 2016 12:54:30 +0800 Subject: [PATCH 03/22] Integrate open and close time --- .../seedu/task/logic/commands/AddCommand.java | 11 +++-- .../task/logic/commands/UpdateCommand.java | 8 +++- .../java/seedu/task/logic/parser/Parser.java | 15 ++++--- .../java/seedu/task/model/task/DateTime.java | 23 ++++++---- .../seedu/task/model/task/ReadOnlyTask.java | 5 +-- src/main/java/seedu/task/model/task/Task.java | 43 ++++++++----------- .../seedu/task/storage/XmlAdaptedTask.java | 23 +++++----- src/main/java/seedu/task/ui/TaskCard.java | 15 +++---- src/main/resources/view/TaskListCard.fxml | 2 + 9 files changed, 72 insertions(+), 73 deletions(-) diff --git a/src/main/java/seedu/task/logic/commands/AddCommand.java b/src/main/java/seedu/task/logic/commands/AddCommand.java index b0645b2460c3..5a97f1c43aee 100644 --- a/src/main/java/seedu/task/logic/commands/AddCommand.java +++ b/src/main/java/seedu/task/logic/commands/AddCommand.java @@ -16,10 +16,10 @@ public class AddCommand extends Command { public static final String COMMAND_WORD = "add"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task to the task list. " - + "Parameters: NAME [t/TAG]...\n" + + "Parameters: NAME s/start-datetime c/closedatetime [t/TAG]...\n" + "Example: " + COMMAND_WORD + " Finish CS2103"; - //TODO: o/OPENTIME c/CLOSETIME i/IMPORTANCE + //TODO: o/OPENTIME c/CLOSETIME public static final String MESSAGE_SUCCESS = "New task added: %1$s"; public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the task list"; @@ -30,7 +30,7 @@ public class AddCommand extends Command { * * @throws IllegalValueException if any of the raw values are invalid */ - public AddCommand(String name, Set tags) //String openTime, String closeTime, String importance, ) + public AddCommand(String name, String openTime, String closeTime, Set tags) throws IllegalValueException { final Set tagSet = new HashSet<>(); for (String tagName : tags) { @@ -38,9 +38,8 @@ public AddCommand(String name, Set tags) //String openTime, String close } this.toAdd = new Task( new Name(name), - //new DateTime(openTime), - //new DateTime(closeTime), - //new Boolean(importance), + new DateTime(openTime), + new DateTime(closeTime), new UniqueTagList(tagSet) ); } diff --git a/src/main/java/seedu/task/logic/commands/UpdateCommand.java b/src/main/java/seedu/task/logic/commands/UpdateCommand.java index da28290273e5..08b414a9d1d4 100644 --- a/src/main/java/seedu/task/logic/commands/UpdateCommand.java +++ b/src/main/java/seedu/task/logic/commands/UpdateCommand.java @@ -31,10 +31,12 @@ public class UpdateCommand extends Command { public final int targetIndex; private final Name newTaskName; + private final DateTime openTime; + private final DateTime closeTime; private final Set removedTags; private final UniqueTagList newTaskTags; - public UpdateCommand(int targetIndex, String name, Set tagsToAdd, Set tagsToRemove) throws IllegalValueException { + public UpdateCommand(int targetIndex, String name, String openTime, String closeTime, Set tagsToAdd, Set tagsToRemove) throws IllegalValueException { this.targetIndex = targetIndex; this.newTaskName = (name.isEmpty()) ? null : new Name(name); @@ -42,6 +44,8 @@ public UpdateCommand(int targetIndex, String name, Set tagsToAdd, Set\\S+(?:\\s+\\S+)*)"); // one or more keywords separated by whitespace private static final Pattern TASK_DATA_ARGS_FORMAT = // '/' forward slashes are reserved for delimiter prefixes - Pattern.compile("(?[^/]*)" -// + " (?p?)p/(?[^/]+)" -// + " (?p?)e/(?[^/]+)" -// + " (?p?)a/(?
[^/]+)" + Pattern.compile("(?[^/]+)" + + "( s/(?[^/]+))?" + + "( c/(?[^/]+))?" + "(?(?: t/[^/]+)*)" // variable number of tags + "(?(?: rt/[^/]+)*)"); @@ -97,9 +96,9 @@ private Command prepareAdd(String args) { } try { return new AddCommand(matcher.group("name"), - // matcher.group("phone"), - // matcher.group("email"), - // matcher.group("address"), + //TODO: set group somewhere + matcher.group("openTime"), + matcher.group("closeTime"), getTagsFromArgs(matcher.group("tagArguments"))); } catch (IllegalValueException ive) { return new IncorrectCommand(ive.getMessage()); @@ -205,6 +204,8 @@ private Command prepareUpdate(String args) { return new UpdateCommand( index.get(), argsMatcher.group("name"), + argsMatcher.group("openTime"), + argsMatcher.group("closeTime"), getTagsFromArgs(argsMatcher.group("tagArguments")), getTagsFromArgs("rt", argsMatcher.group("removeTagArguments")) ); diff --git a/src/main/java/seedu/task/model/task/DateTime.java b/src/main/java/seedu/task/model/task/DateTime.java index 1d69519ef149..e65521ce2775 100644 --- a/src/main/java/seedu/task/model/task/DateTime.java +++ b/src/main/java/seedu/task/model/task/DateTime.java @@ -15,7 +15,7 @@ */ public class DateTime { - public static final String MESSAGE_DATETIME_CONSTRAINTS = "Date entered should be in a relatively standard form (e.g. in X hours, tomorrow, 20 Jan 2016, 5pm)"; + public static final String MESSAGE_DATETIME_CONSTRAINTS = "HELLO"; public final Optional value; @@ -25,17 +25,16 @@ public class DateTime { * @throws IllegalValueException if given date/time string is invalid. */ public DateTime(String dateTime) throws IllegalValueException { - assert dateTime != null; - if (dateTime.equals("")) { + if (dateTime == null || dateTime.equals("")) { this.value = Optional.empty(); return; } - List possibleDates = new PrettyTimeParser().parse(dateTime); - if (!isValidDateTime(possibleDates)) { + if (!isValidDateTime(dateTime)) { throw new IllegalValueException(MESSAGE_DATETIME_CONSTRAINTS); } - + List possibleDates = new PrettyTimeParser().parse(dateTime); this.value = Optional.of(possibleDates.get(0).toInstant()); + } /** @@ -43,13 +42,19 @@ public DateTime(String dateTime) throws IllegalValueException { * * @param test output from date/time parser */ - public static boolean isValidDateTime(List test) { - return !test.isEmpty() && (test.size() == 1); + public static boolean isValidDateTime(String dateTime) { + //TODO: change this + List possibleDates = new PrettyTimeParser().parse(dateTime); + return !possibleDates.isEmpty() && (possibleDates.size() == 1); } @Override public String toString() { - return (value.isPresent()) ? value.get().toString() : ""; + if(value.isPresent()) { + return value.get().toString(); + } else { + return ""; + } } @Override diff --git a/src/main/java/seedu/task/model/task/ReadOnlyTask.java b/src/main/java/seedu/task/model/task/ReadOnlyTask.java index 501637294c46..5ad90738b299 100644 --- a/src/main/java/seedu/task/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/task/model/task/ReadOnlyTask.java @@ -9,9 +9,8 @@ public interface ReadOnlyTask { Name getName(); - //DateTime getOpenTime(); - //DateTime getCloseTime(); - //boolean getImportance(); + DateTime getOpenTime(); + DateTime getCloseTime(); /** * The returned TagList is a deep copy of the internal TagList, diff --git a/src/main/java/seedu/task/model/task/Task.java b/src/main/java/seedu/task/model/task/Task.java index 43058b0a5cec..3f4b69e8fcf4 100644 --- a/src/main/java/seedu/task/model/task/Task.java +++ b/src/main/java/seedu/task/model/task/Task.java @@ -1,6 +1,5 @@ package seedu.task.model.task; -import java.time.LocalDateTime; import java.util.Objects; import seedu.task.commons.util.CollectionUtil; @@ -13,23 +12,20 @@ public class Task implements ReadOnlyTask { private Name name; - //private DateTime openTime; - //private DateTime closeTime; - //private boolean isImportant; + private DateTime openTime; + private DateTime closeTime; private UniqueTagList tags; /** * Every field must be present and not null. */ - public Task(Name name, UniqueTagList tags) { + public Task(Name name, DateTime openTime, DateTime closeTime, UniqueTagList tags) { // open time, urgent, and close time can be null assert !CollectionUtil.isAnyNull(name, tags); this.name = name; - //TODO: set default values - //this.openTime = openTime; - //this.closeTime = closeTime; - //this.isImportant = isImportant; + this.openTime = openTime; + this.closeTime = closeTime; this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list } @@ -37,29 +33,14 @@ public Task(Name name, UniqueTagList tags) { * Copy constructor. */ public Task(ReadOnlyTask source) { - this(source.getName(), source.getTags()); + this(source.getName(), source.getOpenTime(), source.getCloseTime(), source.getTags()); } @Override public Name getName() { return name; } - /** - @Override - public DateTime getOpenTime() { - return openTime; - } - @Override - public DateTime getCloseTime() { - return closeTime; - } - - @Override - public boolean getImportance() { - return isImportant; - } - **/ @Override public UniqueTagList getTags() { return new UniqueTagList(tags); @@ -91,4 +72,16 @@ public String toString() { return getAsText(); } + @Override + public DateTime getOpenTime() { + // TODO Auto-generated method stub + return this.openTime; + } + + @Override + public DateTime getCloseTime() { + // TODO Auto-generated method stub + return this.closeTime; + } + } diff --git a/src/main/java/seedu/task/storage/XmlAdaptedTask.java b/src/main/java/seedu/task/storage/XmlAdaptedTask.java index d8452a879765..c1ebd6f1276c 100644 --- a/src/main/java/seedu/task/storage/XmlAdaptedTask.java +++ b/src/main/java/seedu/task/storage/XmlAdaptedTask.java @@ -18,12 +18,11 @@ public class XmlAdaptedTask { @XmlElement(required = true) private String name; -// @XmlElement(required = false) -// private DateTime openTime; -// @XmlElement(required = false) -// private DateTime closeTime; -// @XmlElement(required = false) -// private boolean isImportant; + @XmlElement(required = false) + private String openTime; + @XmlElement(required = false) + private String closeTime; + @XmlElement private List tagged = new ArrayList<>(); @@ -41,9 +40,8 @@ public XmlAdaptedTask() {} */ public XmlAdaptedTask(ReadOnlyTask source) { name = source.getName().taskName; -// openTime = source.getOpenTime(); -// closeTime = source.getCloseTime(); -// isImportant = source.getImportance(); + openTime = source.getOpenTime().toString(); + closeTime = source.getCloseTime().toString(); tagged = new ArrayList<>(); for (Tag tag : source.getTags()) { tagged.add(new XmlAdaptedTag(tag)); @@ -61,10 +59,9 @@ public Task toModelType() throws IllegalValueException { taskTags.add(tag.toModelType()); } final Name name = new Name(this.name); -// final DateTime openTime = new DateTime(this.openTime); -// final DateTime closeTime = new DateTime(this.closeTime); -// final boolean isImportant = this.isImportant; + final DateTime openTime = new DateTime(this.openTime); + final DateTime closeTime = new DateTime(this.closeTime); final UniqueTagList tags = new UniqueTagList(taskTags); - return new Task(name, tags); //(name, openTime, closeTime, isImportant, tags) + return new Task(name, openTime, closeTime, tags); } } diff --git a/src/main/java/seedu/task/ui/TaskCard.java b/src/main/java/seedu/task/ui/TaskCard.java index 285e2f544068..d7a597a93bc9 100644 --- a/src/main/java/seedu/task/ui/TaskCard.java +++ b/src/main/java/seedu/task/ui/TaskCard.java @@ -17,12 +17,10 @@ public class TaskCard extends UiPart{ private Label name; @FXML private Label id; -// @FXML -// private Label phone; -// @FXML -// private Label address; -// @FXML -// private Label email; + @FXML + private Label openTime; + @FXML + private Label closeTime; @FXML private Label tags; @@ -44,9 +42,8 @@ public static TaskCard load(ReadOnlyTask task, int displayedIndex){ public void initialize() { name.setText(task.getName().taskName); id.setText(displayedIndex + ". "); -// phone.setText(person.getPhone().value); -// address.setText(person.getAddress().value); -// email.setText(person.getEmail().value); + openTime.setText(task.getOpenTime().toString()); + closeTime.setText(task.getCloseTime().toString()); tags.setText(task.tagsString()); } diff --git a/src/main/resources/view/TaskListCard.fxml b/src/main/resources/view/TaskListCard.fxml index 63251b0f246e..af2177ba326c 100644 --- a/src/main/resources/view/TaskListCard.fxml +++ b/src/main/resources/view/TaskListCard.fxml @@ -27,6 +27,8 @@