From 2e7e09387cf897da72fd4d8eac2ba66d8cf83e5f Mon Sep 17 00:00:00 2001 From: Nicholas Date: Tue, 14 Nov 2023 11:45:47 +0800 Subject: [PATCH 1/4] Update DG --- docs/DeveloperGuide.md | 52 +++++++++++------- .../AppointmentListSequenceDiagram.puml | 4 +- .../images/AppointmentListSequenceDiagram.png | Bin 15719 -> 17978 bytes .../logic/parser/GatherCommandParser.java | 34 +++++++++--- 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6980d143756..94c32f1bae7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -91,7 +91,7 @@ The `UI` component uses the JavaFx UI framework. The layout of these UI parts ar that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/AY2324S1-CS2103T-F12-1/tp/blob/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in -[`MainWindow.fxml`](https://github.com/AY2324S1-CS2103T-F12-1/tp/blob/master/src/main/resources/view/MainWindow.fxml) +[`MainWindow.fxml`](https://github.com/AY2324S1-CS2103T-F12-1/tp/blob/master/src/main/resources/view/MainWindow.fxml). The `UI` component, @@ -161,7 +161,7 @@ chronological order. * `observableAppointments` and `sortedAppointments` depend on `filteredPersons`. Hence, appointments listed are for `Person` objects in `filteredPersons`. * does not depend on any of the other three components (as the `Model` represents data entities of the domain, they -should make sense on their own without depending on other components) +should make sense on their own without depending on other components). ### Storage component @@ -256,22 +256,22 @@ Alternative 2: Create a hashset of Appointments for each Person. **Aspect: How to implement override prompt** -Alternative 1(current solution): Create a separate constructor in CommandResult to handle overriding +Alternative 1(current solution): Create a separate constructor in CommandResult to handle overriding. - Pros: - * Quick solution to the problem - * This "freezes" functionality of the program to force user to acknowledge or cancel the execution of the command + * Easy to implement. + * This "freezes" functionality of the program to force user to acknowledge or cancel the execution of the command. - Cons: - * This creates multiple different constructors within the CommandResult + * This creates multiple different constructors within the CommandResult. -Alternative 2: Abstract CommandResult to get a successfulExecutionResult and a PausedExecutionResult +Alternative 2: Abstract CommandResult to get a successfulExecutionResult and a PausedExecutionResult. - Pros: - * Improves code readability and reduces coupling in code + * Improves code readability and reduces coupling in code. - Cons: * Time-consuming to refactor code - * Improper implementation could result in breaking of coding principles + * Improper implementation could result in breaking of coding principles. - Note: * With additional time, alternative 2 can be implemented by refactoring the code to create multiple subclasses. Be wary of the - liskov substitution principle when doing so. The earlier alternative 2 is implemented, the better to reduce amount of code + Liskov Substitution Principle (LSP) when doing so. The earlier alternative 2 is implemented, the better to reduce amount of code that needs to be refactored. * The above implementation can be done in conjunction with the clear command prompt to reduce code coupling. @@ -288,7 +288,7 @@ The following sequence diagram illustrates how the complete operation is execute -
:information_source: The lifeline of the diagram should end at the destroyer mark (X) but reaches end of diagram due to limitation of plantUML +
:information_source: The lifeline of the diagram should end at the destroyer mark (X) but reaches end of diagram due to limitation of plantUML.
The following activity diagram illustrates how the complete operation is executed. @@ -375,7 +375,7 @@ The enhanced find mechanism is facilitated by the `CombinedPredicate` and utilis #### Implementation Overview -Here's a sequence diagram that demonstrates how `FindCommand` works. +Here's a sequence diagram that demonstrates how `FindCommand` works: ![FindCommandSequenceDiagram](images/FindCommandSequenceDiagram.png) @@ -433,7 +433,7 @@ time. This feature is facilitated through the `SortCommand` class. #### Implementation Overview -The following diagram summarises what happens when the user executes a sort command +The following diagram summarises what happens when the user executes a sort command: @@ -465,8 +465,8 @@ A `CommandResult` class is created and returned. **Alternative 1(current choice):** User can sort by name and appointment at any time. As such, calling find on the sorted list will result in the ordering of find to also be sorted. - Pros: Improved usability of maintaining order of list throughout without the list having to be reordered after -each command -- Cons: Limited sorting options as of now +each command. +- Cons: Limited sorting options as of now. ### Appointment List Feature @@ -493,11 +493,21 @@ The following sequence diagram shows how the appointment list is updated. The `s - Cons: Errors with respect to `addressBook` will affect the appointment list rendered. * **Alternative 2:** Implement it within `addressBook` - - Pros: `persons` and `appointmentList` are handled separately within `addressBook` and hence the appointment - list is not dependent on `persons` in `addressBook` + - Pros: `persons` and `appointmentList` are handled separately within. `addressBook` and hence the appointment + list is not dependent on `persons` in `addressBook`. - Cons: `filteredPersons` and `sortedAppointments` might not correspond since `sortedAppointments` is no longer dependent on `filteredPersons`. +**Aspect: How to update appointment list** +* **Alternative 1 (current choice):** +Empty `appointmentList` and populate the list when there is a command that can potentially update it. + - Pros: Easy to implement. + - Cons: Time complexity might not be optimal if the application is dealing with large amounts of data. +* **Alternative 2:** +Based on specific index that user inputs for commands, update `appointmentList` accordingly. + - Pros: Time complexity will be optimal and will not deterioriate with increasing amounts of data. + - Cons: More difficult to test. + -------------------------------------------------------------------------------------------------------------------- ## **Documentation, logging, testing, configuration, dev-ops** @@ -515,11 +525,11 @@ The following sequence diagram shows how the appointment list is updated. The `s ### Product scope **Target user profile**: Financial Advisors -* has a need to manage a significant number of client contacts +* has a need to manage a significant number of client contacts. * prefer desktop apps over other types -* can type fast -* prefers typing to mouse interactions -* is reasonably comfortable using CLI apps +* can type fast. +* prefers typing to mouse interactions. +* is reasonably comfortable using CLI apps. **Value proposition**: This tool functions as a digital address book suited to the needs of financial advisors. diff --git a/docs/diagrams/AppointmentListSequenceDiagram.puml b/docs/diagrams/AppointmentListSequenceDiagram.puml index 41defdf7677..03ae491fa78 100644 --- a/docs/diagrams/AppointmentListSequenceDiagram.puml +++ b/docs/diagrams/AppointmentListSequenceDiagram.puml @@ -21,7 +21,9 @@ deactivate observableAppointments loop through filteredPersons ModelManager -> ModelManager: addToAppointmentListIfPresent(person) activate ModelManager - + ModelManager -> observableAppointments: add(appointment) + activate observableAppointments + deactivate observableAppointments deactivate ModelManager end loop diff --git a/docs/images/AppointmentListSequenceDiagram.png b/docs/images/AppointmentListSequenceDiagram.png index d542087233573c5269837cc4b97bab5e81f363cb..dfacf9f2c19e39599f08d702081bde42171b3e68 100644 GIT binary patch literal 17978 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 X?WJNr!b(YS6-7q!;r)DxN6-ET_U<{a literal 15719 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 wCKv>KG~UN80Y2U`0R Date: Tue, 14 Nov 2023 11:51:43 +0800 Subject: [PATCH 2/4] Fix checkstyle errors --- docs/team/jylow.md | 8 ++++---- .../seedu/address/logic/parser/GatherCommandParser.java | 2 +- .../address/model/financialplan/FinancialPlanTest.java | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/team/jylow.md b/docs/team/jylow.md index 33b959c628a..0f4db45a992 100644 --- a/docs/team/jylow.md +++ b/docs/team/jylow.md @@ -23,12 +23,12 @@ Given below are my contributions to the project. * Justification: Most people only arrange one appointment at a time. So the design prevents multiple appointments and also serves as a reminder of a previously set appointment. * Highlights: This feature causes the logic flow of the method to change if there is currently an appointment and results in breaking the execution into 2, getting a response from the user before deciding whether to continue the execution of the program. * Credits: The feature was implemented by referencing the help function from AB3. However, the main logic of the function was done by myself. - + * **Code Contributed**: [RepoSense](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=jylow&breakdown=true) -* **Enhancements Implemented**: +* **Enhancements Implemented**: * Fixed bugs identified during manual testing. - + * **Contributions to the UG**: * Added documentation for the feature `sort`. [\#81](https://github.com/AY2324S1-CS2103T-F12-1/tp/pull/81) * Maintained known issues to be solved. @@ -44,5 +44,5 @@ Given below are my contributions to the project. * Contributed to 1 forum discussion. (examples: [1](https://github.com/nus-cs2103-AY2324S1/forum/issues/172#issuecomment-1730790631)) * Reported bugs and suggestions for other teams in the class during PED. -* **Contributions to team-based tasks**: +* **Contributions to team-based tasks**: * Released v1.3 and v1.4 of the application. diff --git a/src/main/java/seedu/address/logic/parser/GatherCommandParser.java b/src/main/java/seedu/address/logic/parser/GatherCommandParser.java index d18e2421f0b..e8adf16b327 100644 --- a/src/main/java/seedu/address/logic/parser/GatherCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/GatherCommandParser.java @@ -36,7 +36,7 @@ public GatherCommand parse(String args) throws ParseException { if (argMultimap.getValue(PREFIX_FINANCIAL_PLAN).isPresent()) { return createGatherByFinancialPlan(trimmedArgs); } - + if (argMultimap.getValue(PREFIX_TAG).isPresent()) { return createGatherByTag(trimmedArgs); } diff --git a/src/test/java/seedu/address/model/financialplan/FinancialPlanTest.java b/src/test/java/seedu/address/model/financialplan/FinancialPlanTest.java index d410c8db0c5..b8dd4ed2faf 100644 --- a/src/test/java/seedu/address/model/financialplan/FinancialPlanTest.java +++ b/src/test/java/seedu/address/model/financialplan/FinancialPlanTest.java @@ -49,5 +49,6 @@ public void equals() { assertTrue(fp1.equals(fp1)); assertTrue(fp1.equals(fp2)); assertFalse(fp1.equals(fp3)); + assertFalse(fp2.equals(null)); } } From ac8ca15a595622dda445cc10eda2ed96368428e8 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Tue, 14 Nov 2023 12:00:48 +0800 Subject: [PATCH 3/4] Add test --- .../seedu/address/model/person/UniquePersonListTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/seedu/address/model/person/UniquePersonListTest.java b/src/test/java/seedu/address/model/person/UniquePersonListTest.java index ce2471b71f6..afa60b2547e 100644 --- a/src/test/java/seedu/address/model/person/UniquePersonListTest.java +++ b/src/test/java/seedu/address/model/person/UniquePersonListTest.java @@ -206,4 +206,10 @@ public void asUnmodifiableObservableList_modifyList_throwsUnsupportedOperationEx public void toStringMethod() { assertEquals(uniquePersonList.asUnmodifiableObservableList().toString(), uniquePersonList.toString()); } + + @Test + public void equals() { + assertEquals(uniquePersonList, uniquePersonList); + assertFalse(uniquePersonList.equals(null)); + } } From fca190300aaeae039f306c8922ef72d6f5cda895 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Tue, 14 Nov 2023 12:06:26 +0800 Subject: [PATCH 4/4] Fix UG bugs --- docs/UserGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 1671bb3a66d..22ec58d256b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -420,12 +420,12 @@ matching the one input by user, **and is regardless of the currently displayed c - After performing the complete, the contact list displayed will be reset to display all contacts in the contact book.
:information_source: -Note that an appointment's date is considered to be a match with user's input `APPOINTMENT_DATE` if the **year, month and day are the same**. Time of the appointment does not matter in this command. +**Note that** an appointment's date is considered to be a match with user's input `APPOINTMENT_DATE` if the **year, month and day are the same**. Time of the appointment does not matter in this command.
Acceptable Values: Refer to [Argument Summary](#argument-summary). -
:information_source: +
:bulb: **Tip** To save time, you may find it useful to `complete` by `APPOINTMENT_DATE` once at the end of the day. This will clear all your completed appointments for the entire day.