From 544eb44772d812d0e93dbbb68680c5cadc573d97 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Thu, 11 Apr 2024 23:57:38 +0800 Subject: [PATCH 01/20] Add parenthesis around ternary operator --- src/main/java/seedu/address/logic/commands/ListCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/commands/ListCommand.java b/src/main/java/seedu/address/logic/commands/ListCommand.java index b0cf87265e7..d485a5f3f11 100644 --- a/src/main/java/seedu/address/logic/commands/ListCommand.java +++ b/src/main/java/seedu/address/logic/commands/ListCommand.java @@ -26,6 +26,7 @@ public class ListCommand extends Command { public static final String MESSAGE_SUCCESS = "Listed all persons"; public static final String MESSAGE_SUCCESS_LIST = "Listed all persons with: %1$s"; + private final ListKeywordsPredicate predicate; /** @@ -74,7 +75,7 @@ public boolean equals(Object other) { @Override public String toString() { return new ToStringBuilder(this) - .add("predicate", predicate == null ? "null" : predicate) + .add("predicate", (predicate == null) ? "null" : predicate) .toString(); } } From f978752a1381c7983c8ed59af2121dfc88073ef5 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:02:38 +0800 Subject: [PATCH 02/20] Clean up ListCommandParser and add descriptive messages for assertions --- .../logic/parser/ListCommandParser.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/seedu/address/logic/parser/ListCommandParser.java b/src/main/java/seedu/address/logic/parser/ListCommandParser.java index 96464fe5320..735a93735e6 100644 --- a/src/main/java/seedu/address/logic/parser/ListCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ListCommandParser.java @@ -23,14 +23,14 @@ public class ListCommandParser implements Parser { */ public ListCommand parse(String args) throws ParseException { String trimmedArgs = args.trim(); - // If there are no arguments, return a ListCommand object with no predicate + + // If there are no arguments, list all patients if (trimmedArgs.isEmpty()) { - return new ListCommand(); // return a ListCommand object with no predicate + return new ListCommand(); } - // If there are arguments, parse the arguments and return a ListCommand object with the parsed predicate - ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_TAG, PREFIX_WARD); + // If there are arguments, filter patients based on the arguments + ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_TAG, PREFIX_WARD); if (!argMultimap.getPreamble().isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ListCommand.MESSAGE_USAGE)); } @@ -39,20 +39,20 @@ public ListCommand parse(String args) throws ParseException { List tagList = List.of(); if (arePrefixesPresent(argMultimap, PREFIX_TAG)) { tagList = ParserUtil.parseTagsKeywords(argMultimap.getAllValues(PREFIX_TAG)); - assert !tagList.isEmpty(); + assert !tagList.isEmpty(): "tagList should not be empty"; } String ward = ""; if (arePrefixesPresent(argMultimap, PREFIX_WARD)) { ward = ParserUtil.parseWard(argMultimap.getValue(PREFIX_WARD).orElse(null)).toString(); - assert !ward.isEmpty(); + assert !ward.isEmpty(): "ward should not be empty"; } - if (ward.isEmpty() && tagList.isEmpty()) { // If there are no valid arguments, throw an exception + if (ward.isEmpty() && tagList.isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, ListCommand.MESSAGE_USAGE)); } - assert !tagList.isEmpty() || !ward.isEmpty(); + assert !tagList.isEmpty() || !ward.isEmpty() : "at least either tagList or ward must be supplied"; return new ListCommand(new ListKeywordsPredicate(tagList, ward)); } From 12a90c8b93ca26d56c3a7a2231d4a4c01d2f7292 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:08:20 +0800 Subject: [PATCH 03/20] Modify variable name for static final variable --- src/main/java/seedu/address/commons/util/DateUtil.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/seedu/address/commons/util/DateUtil.java b/src/main/java/seedu/address/commons/util/DateUtil.java index 686ba223806..3de2e28110f 100644 --- a/src/main/java/seedu/address/commons/util/DateUtil.java +++ b/src/main/java/seedu/address/commons/util/DateUtil.java @@ -11,7 +11,8 @@ public class DateUtil { public static final String MESSAGE_CONSTRAINTS_FORMAT = "%1$s takes in a date of format dd/MM/yyyy"; public static final String MESSAGE_CONSTRAINTS_FUTURE_OCCURRENCE = "%1$s should not be later than current date"; - private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy"); /** * Returns true if a given string is a valid date. @@ -20,7 +21,7 @@ public class DateUtil { */ public static boolean isValidDate(String value) { try { - LocalDate date = LocalDate.parse(value, formatter); + LocalDate date = LocalDate.parse(value, FORMATTER); return true; } catch (DateTimeParseException e) { return false; @@ -33,7 +34,7 @@ public static boolean isValidDate(String value) { */ public static boolean isFutureDate(String value) { if (isValidDate(value)) { - LocalDate date = LocalDate.parse(value, formatter); + LocalDate date = LocalDate.parse(value, FORMATTER); return date.isAfter(LocalDate.now()); } return false; @@ -43,6 +44,6 @@ public static boolean isFutureDate(String value) { * Returns the formatter for the date. */ public static DateTimeFormatter getFormatter() { - return formatter; + return FORMATTER; } } From 490b4fb6ffefdb9549956e6c8775f9c91dbff53d Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:18:23 +0800 Subject: [PATCH 04/20] Add comments and modify structure to convention standards --- .../java/seedu/address/model/person/AdmissionDate.java | 9 +++++---- src/main/java/seedu/address/model/person/Dob.java | 7 ++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/seedu/address/model/person/AdmissionDate.java b/src/main/java/seedu/address/model/person/AdmissionDate.java index b3f112accec..fcc18a1ae5f 100644 --- a/src/main/java/seedu/address/model/person/AdmissionDate.java +++ b/src/main/java/seedu/address/model/person/AdmissionDate.java @@ -12,10 +12,10 @@ */ public class AdmissionDate extends DateUtil { public static final String DATE_TYPE = "Admission date"; - public static final String MESSAGE_CONSTRAINTS_FORMAT = - String.format(DateUtil.MESSAGE_CONSTRAINTS_FORMAT, DATE_TYPE); - public static final String MESSAGE_CONSTRAINTS_OCCURRENCE = - "Admission date should not be earlier than date of birth or later than current date"; + public static final String MESSAGE_CONSTRAINTS_FORMAT = String + .format(DateUtil.MESSAGE_CONSTRAINTS_FORMAT, DATE_TYPE); + public static final String MESSAGE_CONSTRAINTS_OCCURRENCE = String + .format("%1$s should not be earlier than date of birth or later than current date", DATE_TYPE); private final LocalDate admissionDate; private final String value; @@ -51,6 +51,7 @@ public boolean equals(Object other) { return true; } + // instanceof handles nulls if (!(other instanceof AdmissionDate)) { return false; } diff --git a/src/main/java/seedu/address/model/person/Dob.java b/src/main/java/seedu/address/model/person/Dob.java index 00ef26e98ad..08837710c1a 100644 --- a/src/main/java/seedu/address/model/person/Dob.java +++ b/src/main/java/seedu/address/model/person/Dob.java @@ -17,11 +17,11 @@ public class Dob extends DateUtil { String.format(DateUtil.MESSAGE_CONSTRAINTS_FORMAT, DATE_TYPE); public static final String MESSAGE_CONSTRAINTS_FUTURE_OCCURRENCE = String.format(DateUtil.MESSAGE_CONSTRAINTS_FUTURE_OCCURRENCE, DATE_TYPE); - public static final String MESSAGE_DOB_AFTER_ADMISSION = "Date of birth should not be later than date of admission."; - private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + private final LocalDate dob; private final String value; @@ -34,7 +34,7 @@ public Dob(String value) { requireNonNull(value); checkArgument(isValidDate(value), MESSAGE_CONSTRAINTS_FORMAT); checkArgument(!isFutureDate(value), MESSAGE_CONSTRAINTS_FUTURE_OCCURRENCE); - this.dob = LocalDate.parse(value, formatter); + this.dob = LocalDate.parse(value, FORMATTER); this.value = value; } @@ -63,6 +63,7 @@ public boolean equals(Object other) { return true; } + // instanceof handles nulls if (!(other instanceof Dob)) { return false; } From 1a0a67c68e3f67a6890e05dfa460a370ca3fd56f Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:23:55 +0800 Subject: [PATCH 05/20] Update comment in ParserUtil --- src/main/java/seedu/address/logic/parser/ParserUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index 11f15588683..7e1d702191a 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -128,7 +128,7 @@ public static Ic parseIc(String ic) throws ParseException { } /** - * Parses a {@code String admissionDate, Dob dob} into a {@code AdmissionDate}. + * Parses a {@code String admissionDate} into a {@code AdmissionDate}. * Leading and trailing whitespaces will be trimmed. * * @throws ParseException if the given {@code admissionDate} is invalid. @@ -163,7 +163,7 @@ public static Ward parseWard(String ward) throws ParseException { * Parses a {@code String remark} into a {@code Remark}. * Leading and trailing whitespaces will be trimmed. */ - public static Remark parseRemark(String remark) throws ParseException { + public static Remark parseRemark(String remark) { if (remark == null) { return new Remark(""); } else { From ebd702f5e3bef3774499cbafcc98418394102b75 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:29:59 +0800 Subject: [PATCH 06/20] Add javadocs to prefix --- src/main/java/seedu/address/logic/parser/Prefix.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/seedu/address/logic/parser/Prefix.java b/src/main/java/seedu/address/logic/parser/Prefix.java index 348b7686c8a..8c0a829988f 100644 --- a/src/main/java/seedu/address/logic/parser/Prefix.java +++ b/src/main/java/seedu/address/logic/parser/Prefix.java @@ -7,10 +7,20 @@ public class Prefix { private final String prefix; + /** + * Constructs a Prefix object. + * + * @param prefix A valid prefix. + */ public Prefix(String prefix) { this.prefix = prefix; } + /** + * Returns the prefix string. + * + * @return Prefix string. + */ public String getPrefix() { return prefix; } From d7369230535b48cd1172fcef0d407cdbeac71005 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:34:39 +0800 Subject: [PATCH 07/20] Update javadocs for ListCommandParser --- .../java/seedu/address/logic/parser/ListCommandParser.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/seedu/address/logic/parser/ListCommandParser.java b/src/main/java/seedu/address/logic/parser/ListCommandParser.java index 735a93735e6..35022293d2e 100644 --- a/src/main/java/seedu/address/logic/parser/ListCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ListCommandParser.java @@ -19,7 +19,10 @@ public class ListCommandParser implements Parser { /** * Parses the given {@code String} of arguments in the context of the ListCommand * and returns a ListCommand object for execution. + * * @throws ParseException if the user input does not conform the expected format + * @param args the arguments to parse. + * @return a ListCommand object for execution. */ public ListCommand parse(String args) throws ParseException { String trimmedArgs = args.trim(); @@ -60,6 +63,9 @@ public ListCommand parse(String args) throws ParseException { /** * Returns true if none of the prefixes contains empty {@code Optional} values in the given * {@code ArgumentMultimap}. + * + * @param argumentMultimap the {@code ArgumentMultimap} to check for the presence of prefixes. + * @param prefixes the prefixes to check for. */ private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) { return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent()); From b42dd89162f4d55f92f5b3961da3930f2fbf13ab Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:36:25 +0800 Subject: [PATCH 08/20] Update form of javadoc comment in ListCommandParser --- src/main/java/seedu/address/logic/parser/FindCommandParser.java | 1 + src/main/java/seedu/address/logic/parser/ListCommandParser.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/parser/FindCommandParser.java b/src/main/java/seedu/address/logic/parser/FindCommandParser.java index 8bb6a82ca12..b46ea16c092 100644 --- a/src/main/java/seedu/address/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/FindCommandParser.java @@ -20,6 +20,7 @@ public class FindCommandParser implements Parser { /** * Parses the given {@code String} of arguments in the context of the FindCommand * and returns a FindCommand object for execution. + * * @throws ParseException if the user input does not conform the expected format */ public FindCommand parse(String args) throws ParseException { diff --git a/src/main/java/seedu/address/logic/parser/ListCommandParser.java b/src/main/java/seedu/address/logic/parser/ListCommandParser.java index 35022293d2e..e1e75b6597d 100644 --- a/src/main/java/seedu/address/logic/parser/ListCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ListCommandParser.java @@ -20,9 +20,9 @@ public class ListCommandParser implements Parser { * Parses the given {@code String} of arguments in the context of the ListCommand * and returns a ListCommand object for execution. * - * @throws ParseException if the user input does not conform the expected format * @param args the arguments to parse. * @return a ListCommand object for execution. + * @throws ParseException if the user input does not conform the expected format */ public ListCommand parse(String args) throws ParseException { String trimmedArgs = args.trim(); From 3a75b0e0d00a6486034ab82654b4d106b5c6ac82 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:42:14 +0800 Subject: [PATCH 09/20] Add line separator between description and throws section --- src/main/java/seedu/address/logic/parser/AddCommandParser.java | 1 + .../java/seedu/address/logic/parser/DeleteCommandParser.java | 1 + src/main/java/seedu/address/logic/parser/EditCommandParser.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index db08ec6a57c..5c2eecf620b 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -31,6 +31,7 @@ public class AddCommandParser implements Parser { /** * Parses the given {@code String} of arguments in the context of the AddCommand * and returns an AddCommand object for execution. + * * @throws ParseException if the user input does not conform the expected format */ public AddCommand parse(String args) throws ParseException { diff --git a/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java b/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java index 3527fe76a3e..4e29d82d253 100644 --- a/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java @@ -14,6 +14,7 @@ public class DeleteCommandParser implements Parser { /** * Parses the given {@code String} of arguments in the context of the DeleteCommand * and returns a DeleteCommand object for execution. + * * @throws ParseException if the user input does not conform the expected format */ public DeleteCommand parse(String args) throws ParseException { diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index 1e6c727f895..a50cc27fa3e 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -29,6 +29,7 @@ public class EditCommandParser implements Parser { /** * Parses the given {@code String} of arguments in the context of the EditCommand * and returns an EditCommand object for execution. + * * @throws ParseException if the user input does not conform the expected format */ public EditCommand parse(String args) throws ParseException { From c1b9ed95e57cfb77de34d6ebad1d2b14e9443da0 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:43:45 +0800 Subject: [PATCH 10/20] Newline to prevent exceeding 120 characters in ExitCommand --- src/main/java/seedu/address/logic/commands/ExitCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/seedu/address/logic/commands/ExitCommand.java b/src/main/java/seedu/address/logic/commands/ExitCommand.java index 3dd85a8ba90..4f52a0c5f8a 100644 --- a/src/main/java/seedu/address/logic/commands/ExitCommand.java +++ b/src/main/java/seedu/address/logic/commands/ExitCommand.java @@ -13,6 +13,7 @@ public class ExitCommand extends Command { @Override public CommandResult execute(Model model) { + return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true); } From 9e2f8995af75db55a343e0b61ad0d21c3436b984 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:46:25 +0800 Subject: [PATCH 11/20] Fix grouping in AddCommand file --- src/main/java/seedu/address/logic/commands/AddCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 15ea1cd2713..cfb1d939bea 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -20,6 +20,7 @@ * Adds a person to the address book. */ public class AddCommand extends Command { + public static final String COMMAND_WORD = "add"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a person to the address book. \n" + "Parameters: " @@ -39,7 +40,6 @@ public class AddCommand extends Command { + PREFIX_REMARK + "Prevent bed sores. " + PREFIX_TAG + "FallRisk"; public static final String MESSAGE_SUCCESS = "New patient added: %1$s"; - public static final String MESSAGE_DUPLICATE_PERSON = "A patient with this IC already exists in the address book"; private final Person toAdd; From e71b4ff7adcf5ee78c5e777f184c2f2e83a1b506 Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:50:27 +0800 Subject: [PATCH 12/20] Create javadocs for SampleDataUtil --- src/main/java/seedu/address/model/util/SampleDataUtil.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 99db8560eec..16ef97974ac 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -20,6 +20,10 @@ * Contains utility methods for populating {@code AddressBook} with sample data. */ public class SampleDataUtil { + + /** + * Returns an array of sample persons. + */ public static Person[] getSamplePersons() { return new Person[]{ @@ -40,6 +44,9 @@ public static Person[] getSamplePersons() { }; } + /** + * Returns an address book containing sample persons. + */ public static ReadOnlyAddressBook getSampleAddressBook() { AddressBook sampleAb = new AddressBook(); for (Person samplePerson : getSamplePersons()) { From e28dc7bb1c77278efed752e08ff4c5740cd8c4bf Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 00:56:48 +0800 Subject: [PATCH 13/20] Add line to improve readability --- .../seedu/address/logic/commands/EditCommand.java | 11 +++++++++++ src/main/java/seedu/address/model/person/Ic.java | 1 + 2 files changed, 12 insertions(+) diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 50e8efce215..d35b1922a91 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -207,36 +207,47 @@ public void setTags(Set tags) { public Optional> getTags() { return (tags != null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty(); } + public void setIc(Ic ic) { this.ic = ic; } + public Optional getIc() { return Optional.ofNullable(ic); } + public void setDob(Dob dob) { this.dob = dob; } + public Optional getDob() { return Optional.ofNullable(dob); } + public void setAdmissionDate(AdmissionDate admissionDate) { this.admissionDate = admissionDate; } + public Optional getAdmissionDate() { return Optional.ofNullable(admissionDate); } + public void setWard(Ward ward) { this.ward = ward; } + public Optional getWard() { return Optional.ofNullable(ward); } + public void setRemark(Remark remark) { this.remark = remark; } + public Optional getRemark() { return Optional.ofNullable(remark); } + @Override public boolean equals(Object other) { if (other == this) { diff --git a/src/main/java/seedu/address/model/person/Ic.java b/src/main/java/seedu/address/model/person/Ic.java index e91b2ce790b..7150981e627 100644 --- a/src/main/java/seedu/address/model/person/Ic.java +++ b/src/main/java/seedu/address/model/person/Ic.java @@ -45,6 +45,7 @@ public boolean equals(Object other) { return true; } + // instanceof handles nulls if (!(other instanceof Ic)) { return false; } From 19c85cdb00f1c8b0a74959ca09d0a4bb7d6ab0eb Mon Sep 17 00:00:00 2001 From: ryanlimdx Date: Fri, 12 Apr 2024 12:27:20 +0800 Subject: [PATCH 14/20] Fix whitespace error --- .../java/seedu/address/logic/parser/ListCommandParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/address/logic/parser/ListCommandParser.java b/src/main/java/seedu/address/logic/parser/ListCommandParser.java index e1e75b6597d..daba20edaee 100644 --- a/src/main/java/seedu/address/logic/parser/ListCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ListCommandParser.java @@ -42,13 +42,13 @@ public ListCommand parse(String args) throws ParseException { List tagList = List.of(); if (arePrefixesPresent(argMultimap, PREFIX_TAG)) { tagList = ParserUtil.parseTagsKeywords(argMultimap.getAllValues(PREFIX_TAG)); - assert !tagList.isEmpty(): "tagList should not be empty"; + assert !tagList.isEmpty() : "tagList should not be empty"; } String ward = ""; if (arePrefixesPresent(argMultimap, PREFIX_WARD)) { ward = ParserUtil.parseWard(argMultimap.getValue(PREFIX_WARD).orElse(null)).toString(); - assert !ward.isEmpty(): "ward should not be empty"; + assert !ward.isEmpty() : "ward should not be empty"; } if (ward.isEmpty() && tagList.isEmpty()) { From 50db021f9d733e36ac6e138b8e5922d55326da04 Mon Sep 17 00:00:00 2001 From: iamtr Date: Fri, 12 Apr 2024 14:44:58 +0800 Subject: [PATCH 15/20] Update Developer Guide --- docs/DeveloperGuide.md | 50 ++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3e89ce1c440..8a66205ed2b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -6,13 +6,12 @@ title: Developer Guide {:toc} -------------------------------------------------------------------------------------------------------------------- - ## **Acknowledgements** -* Libraries used: [JavaFX](https://openjfx.io/), [JUnit5](https://github.com/junit-team/junit5), [Jackson](https://github.com/FasterXML/jackson) * The [original AB3 project](https://github.com/se-edu/addressbook-level3), which Nursing Address Book is based from. --------------------------------------------------------------------------------------------------------------------- +* Libraries used: [JavaFX](https://openjfx.io/), [JUnit5](https://github.com/junit-team/junit5), [Jackson](https://github.com/FasterXML/jackson) +-------------------------------------------------------------------------------------------------------------------- ## **Setting up, getting started** Refer to the guide [_Setting up and getting started_](SettingUp.md). @@ -21,8 +20,6 @@ Refer to the guide [_Setting up and getting started_](SettingUp.md). ## **Design** -
- ### Architecture @@ -114,7 +111,7 @@ How the parsing works: ### Model component **API** : [`Model.java`](https://github.com/AY2324S2-CS2103T-F10-1/tp/blob/master/src/main/java/seedu/address/model/Model.java) - + The `Model` component, @@ -156,15 +153,16 @@ Given below is an example usage scenario and how the add patient feature behaves Step 1. The user inputs an add Command (e.g. `add n\Alice ic\A0055679T ad\01/01/2022 dob\01/01/2002 w\WA`) to add a new patient named Alice to the address book.
:information_source: **Note:** The format of the add command is as follows: -n\: Indicates the name of the patient -ic\: Indicates the NRIC of the patient -ad\: Indicates the admission date of the patient -dob\: Indicates the date of birth of the patient -w\: Indicates the ward of the patient is currently in -r\: Indicates remarks for the patient (optional) -t\: Indicates the tags of the patient (optional, can have multiple) +- **n**: Indicates the name of the patient +- **ic**: Indicates the NRIC of the patient +- **ad**: Indicates the admission date of the patient +- **dob**: Indicates the date of birth of the patient +- **w**: Indicates the ward the patient is currently in +- **r**: Indicates remarks for the patient (optional) +- **t**: Indicates the tags of the patient (optional, can have multiple)
+ Step 2. The `add` command calls `AddCommandParser#parse(String)` to parse the user input and creates a new `AddCommand` object. Step 3. The created `AddCommand` is returned to `LogicManager`. Then, `AddCommand` is executed by calling `AddCommand#execute(Model)`. @@ -221,10 +219,15 @@ The `HelpCommand` class extends the `Command` interface and is responsible for e The following class diagram shows the relevant classes involved in the help command implementation: Step 1. The `LogicManager` is called to execute the "help" command. + Step 2. The `AddressBookParser` parses the command and creates a new `HelpCommand` instance. + Step 3. The `LogicManager` calls the `execute()` method of the `HelpCommand`. + Step 4. The `HelpCommand` creates a new `CommandResult` with the help message. + Step 5. The `MainWindow` handles the help command and calls the `handleHelp()` method. + Step 6. The `ResultDisplay` is updated with the help message obtained from `HelpCommand.SHOWING_HELP_MESSAGE`. The `HelpCommand` class interacts with the `Logic` component and utilizes the `CommandResult` class to encapsulate the result of executing the `help` command. The `MainWindow` and `ResultDisplay` classes in the UI component are responsible for handling the display of the help message to the user. @@ -253,27 +256,6 @@ When the user executes the help command, the following steps occur: The `HelpCommand` class interacts with the `Logic` component and utilizes the `CommandResult` class to encapsulate the result of executing the `help` command. The `MainWindow` and `ResultDisplay` classes in the UI component are responsible for handling the display of the help message to the user. -### Add a patient - -#### Implementation - -The add patient feature is facilitated by `AddCommand`, `AddCommandParser` and `Person`. - -Given below is an example usage scenario and how the add patient feature behaves at each step. - -Step 1. The user launches the application for the first time. - -Step 2. The user executes an Add Command (e.g. 'add n\Alice ic\A0055679T ad\01/01/2022 dob\01/01/2002 w\WA') to add a new patient to the address book. - -n\: Indicates the name of the patient -ic\: Indicates the NRIC of the patient -ad\: Indicates the admission date of the patient -dob\: Indicates the date of birth of the patient -w\: Indicates the ward of the patient is currently in - -The `AddCommandParser` parses the user input, creating a new `AddCommand` object. -The `AddCommand` object then creates a new `Person` object with the parsed details. - ### List by tags and/or ward feature #### Implementation From a9679c24011f3e818c6adb519af5c563f8bb70cf Mon Sep 17 00:00:00 2001 From: erv-teo <107994607+erv-teo@users.noreply.github.com> Date: Fri, 12 Apr 2024 15:45:38 +0800 Subject: [PATCH 16/20] Update manual testing --- docs/DeveloperGuide.md | 130 ++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 55 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 723a24d2aa1..ad3f1745cd8 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -611,59 +611,64 @@ Given below are instructions to test the app manually. 1. Initial launch - 1. Download the jar file and copy into an empty folder - 2. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. + 1. Download the jar file and copy into an empty folder + 2. Double-click the jar file
+ Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. 2. Saving window preferences - 1. Resize the window to an optimum size. Move the window to a different location. Close the window. - 2. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained. + 1. Resize the window to an optimum size. Move the window to a different location. Close the window. + 2. Re-launch the app by double-clicking the jar file.
+ Expected: The most recent window size and location is retained. ### Adding a patient 1. Adding a patient - 1. Prerequisites: There exist no patient with NRIC `A1234567B` in the patient records. + 1. Prerequisites: There exist no patient with NRIC `A1234567B` in the patient records. - 2. Test case (Valid parameters): `add n\John Smith ic\A1234567B dob\01/01/2000 ad\02/02/2020 w\a1 t\diarrhea - r\likes to go to the park`
- Expected: Patient successfully added into patient list. Details of the added patient shown in the status bar. + 2. Test case (Valid parameters): `add n\John Smith ic\A1234567B dob\01/01/2000 ad\02/02/2020 w\a1 t\diarrhea + r\likes to go to the park`
+ Expected: Patient successfully added into patient list. Details of the added patient shown in the status bar. - 3. Test case (Missing parameter): `add n\John Smith`
- Expected: No patient is added. Error details shown in the status bar. + 3. Test case (Missing parameter): `add n\John Smith`
+ Expected: No patient is added. Error details shown in the status bar. - 4. Test case (Invalid Name): `add n\ ic\A1234567B dob\01/01/2000 ad\02/02/2020 w\a1 t\diarrhea r\likes to go to the park`
- Expected: Similar to previous. + 4. Test case (Invalid Name): `add n\ ic\A1234567B dob\01/01/2000 ad\02/02/2020 w\a1 t\diarrhea r\likes to go to the park`
+ Expected: Similar to previous. + + 5. Test case (Invalid NRIC): `add n\John Smith ic\A12347B dob\01/01/2000 ad\02/02/2020 w\a1 t\diarrhea r\likes to go to the park`
+ Expected: Similar to previous. - 5. Test case (Invalid NRIC): `add n\John Smith ic\A12347B dob\01/01/2000 ad\02/02/2020 w\a1 t\diarrhea r\likes to go to the park`
- Expected: Similar to previous. + 6. Test case (Invalid Date of Birth): `add n\John Smith ic\A1234567B dob\2000 ad\02/02/2020 w\a1 t\diarrhea r\likes to go to the park`
+ Expected: Similar to previous. + + 7. Test case (Repeated Parameter): `add n\John Smith ic\A1234567B ic\A1234567B dob\01/01/2000 ad\02/02/2020 w\a1 + t\diarrhea r\likes to go to the park`
+ Expected: Similar to previous. - 6. Test case (Invalid Date of Birth): `add n\John Smith ic\A1234567B dob\2000 ad\02/02/2020 w\a1 t\diarrhea r\likes to go to the park`
- Expected: Similar to previous. + 8. Test case (Date of Birth after Admission Date): `add n\John Smith ic\A1234567B dob\03/03/2000 ad\01/01/1999 w\a1`
+ Expected: Similar to previous. - 7. Test case (Repeated Parameter): `add n\John Smith ic\A1234567B ic\A1234567B dob\01/01/2000 ad\02/02/2020 w\a1 - t\diarrhea r\likes to go to the park`
- Expected: Similar to previous. ### Viewing patients 1. Viewing all patients - 1. Prerequisites: Multiple patients in the patient list. + 1. Prerequisites: Multiple patients in the patient list. - 2. Test case: `list`
- Expected: List of patients is shown. + 2. Test case: `list`
+ Expected: List of patients is shown. - 3. Test case: `list 181` or any command with extra characters supplied
- Expected: Similar to previous. + 3. Test case: `list 181` or any command with extra characters supplied
+ Expected: Similar to previous. 2. Viewing patients by tags and ward 1. Prerequisites: Multiple patients in the patient list. 1. Test case: `list tag\diarrhea w\a1`
- Expected: List of patients is shown. + Expected: List of patients is shown. 1. Test case: `list t\diarrhea`
Expected: List of patients is shown. @@ -673,27 +678,45 @@ Given below are instructions to test the app manually. ### Editing a patient -1. Edit a person while all persons are being shown +1. Edit a patient while all patients are being shown - 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list. + 1. Prerequisites: List all patients using the `list` command. Multiple patients in the list. 1. Test case: `edit 1 n\John`
Expected: Name of first patient is changed. Details of the edited patient is shown in the status bar. - 1. Test case: `edit 1 ic\W9876543M`
- Expected: NRIC of first patient is changed. Details of the edited patient is shown in the status bar. + 1. Test case: `edit 1 ic\W9876543M`
+ Expected: NRIC of first patient is changed. Details of the edited patient is shown in the status bar. + + 1. Test case: `edit 1 dob\03/03/2005`
+ Expected: Date of birth of first patient is changed. Details of the edited patient is shown in the status bar. - 1. Test case: `edit 1 dob\03/03/2005`
- Expected: Date of birth of first patient is changed. Details of the edited patient is shown in the status bar. + 1. Test case: `edit 1 ad\05/05/2021`
+ Expected: Admission date of first patient is changed. Details of the edited patient is shown in the status bar. - 1. Test case: `edit 1 ad\05/05/2021`
- Expected: Admission date of first patient is changed. Details of the edited patient is shown in the status bar. + 1. Test case: `edit 1 t\flu r\afraid of darkness`
+ Expected: tag and remark of first patient is changed. Details of the edited patient is shown in the status bar. - 1. Test case: `edit 1 t\flu r\afraid of darkness`
- Expected: tag and remark of first patient is changed. Details of the edited patient is shown in the status bar. + 2. Test case (Invalid Index): `edit x n\John` where x is larger than list size
+ Expected: Error details shown in status bar. - 1. Test case(invalid name): `edit n\ `
- Expected: Patient name is not changed. Error details shown in the status message. + 1. Test case (Invalid Name): `edit 1 n\ `
+ Expected: Patient name is not changed. Error details shown in the status bar. + + 2. Test case (Invalid NRIC): `edit 1 ic\a1231234b`
+ Expected: Patient NRIC is not changed. Error details shown in the status bar. + + 3. Test case (Invalid Date of Birth): `edit 1 dob\03-03-2004`
+ Expected: Patient Date of Birth is not changed. Error details shown in the status bar. + + 4. Test case (Invalid Admission Date): `edit 1 ad\04-02-2024 `
+ Expected: Patient Admission Date is not changed. Error details shown in the status bar. + + 5. Test case (Date of Birth after Admission Date): `edit 1 dob\03/03/2024 ad\01/01/2024 `
+ Expected: Patient Date of Birth and Admission Date is not changed. Error details shown in the status bar. + + 6. Test case (Invalid Ward): `edit 1 w\B-1 `
+ Expected: Patient ward is not changed. Error details shown in the status bar. ### Finding a patient @@ -710,15 +733,15 @@ Given below are instructions to test the app manually. 1. Test case: `find n\Smith`
Expected: Similar to previous. - 1. Test case: `find n\j`
- Expected: No patient is shown. + 1. Test case: `find n\j`
+ Expected: No patient is shown. - 1. Test case: `find n\`
- Expected: Similar to previous. + 1. Test case: `find n\`
+ Expected: Similar to previous. 2. Finding a patient by NRIC - 1. Prerequisites: There exist a patient with the NRIC `A1234567B` in the patient records. + 1. Prerequisites: There exist a patient with the NRIC `A1234567B` in the address book. 1. Test case: `find ic\A1234567`
Expected: The patient with the NRIC `A1234567B` is shown. @@ -726,26 +749,23 @@ Given below are instructions to test the app manually. 1. Test case: `find ic\a1234567b`
Expected: Similar to previous. - 1. Test case: `find n\Smith`
- Expected: Similar to previous. - 1. Test case: `find ic\`
Expected: No patient is shown. ### Deleting a person -1. Deleting a person while all persons are being shown +1. Deleting a patient while all patients are being shown - 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list. + 1. Prerequisites: List all patients using the `list` command. Multiple patients in the list. - 1. Test case: `delete 1`
- Expected: First patient is deleted from the list. Details of the deleted contact shown in the status message. + 1. Test case: `delete 1`
+ Expected: First patient is deleted from the list. Details of the deleted contact shown in the status message. - 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. + 1. Test case: `delete 0`
+ Expected: No patient is deleted. Error details shown in the status message. - 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
- Expected: Similar to previous. + 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ Expected: Similar to previous. ### Saving data @@ -755,4 +775,4 @@ Given below are instructions to test the app manually. 1. Prerequisites: The addressbook.json file in the data directory must exist. 1. Test case: Delete the addressbook.json file.
- Expected: The app launches successfully, populated with the sample data. + Expected: The app launches successfully, populated with the sample data. From 72d079a47fef626df71107611a0054e83fc75bff Mon Sep 17 00:00:00 2001 From: iamtr Date: Fri, 12 Apr 2024 16:29:37 +0800 Subject: [PATCH 17/20] Add activity diagrams --- docs/DeveloperGuide.md | 74 +++++++++++++++++------ docs/diagrams/AddActivityDiagram.puml | 23 +++++++ docs/diagrams/DeleteActivityDiagram.puml | 10 +++ docs/images/AddActivityDiagram.png | Bin 0 -> 27542 bytes 4 files changed, 87 insertions(+), 20 deletions(-) create mode 100644 docs/diagrams/AddActivityDiagram.puml create mode 100644 docs/diagrams/DeleteActivityDiagram.puml create mode 100644 docs/images/AddActivityDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8a66205ed2b..8f76faee240 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -146,30 +146,31 @@ This section contains some noteworthy details on how certain features are being #### Implementation -The add patient feature is facilitated by `AddCommand`, `AddCommandParser` and `LogicManager`. +The add patient feature is facilitated mainly by `AddCommand`, `AddCommandParser` and `LogicManager`. Given below is an example usage scenario and how the add patient feature behaves at each step. -Step 1. The user inputs an add Command (e.g. `add n\Alice ic\A0055679T ad\01/01/2022 dob\01/01/2002 w\WA`) to add a new patient named Alice to the address book. +**Step 1.** The user inputs an add Command (e.g. `add n\Alice ic\A0055679T ad\01/01/2022 dob\01/01/2002 w\WA`) to add a new patient named Alice to the address book. -
:information_source: **Note:** The format of the add command is as follows: -- **n**: Indicates the name of the patient -- **ic**: Indicates the NRIC of the patient -- **ad**: Indicates the admission date of the patient -- **dob**: Indicates the date of birth of the patient -- **w**: Indicates the ward the patient is currently in -- **r**: Indicates remarks for the patient (optional) -- **t**: Indicates the tags of the patient (optional, can have multiple) +
:information_source: **Note:** The format of the add command is as follows: + +- **n\\**: Indicates the name of the patient +- **ic\\**: Indicates the NRIC of the patient +- **ad\\**: Indicates the admission date of the patient into the hospital +- **dob\\**: Indicates the date of birth of the patient +- **w\\**: Indicates the ward the patient is currently in +- **r\\**: Indicates remarks for the patient (optional) +- **t\\**: Indicates the tags of the patient (optional, can have multiple)
-Step 2. The `add` command calls `AddCommandParser#parse(String)` to parse the user input and creates a new `AddCommand` object. +**Step 2.** The command is parsed via `AddressBookParser#parseCommand(String)`, which calls `AddCommandParser#parse(String)` to parse the user input and creates a new `AddCommand` object. -Step 3. The created `AddCommand` is returned to `LogicManager`. Then, `AddCommand` is executed by calling `AddCommand#execute(Model)`. +**Step 3.** The created `AddCommand` is returned to `LogicManager`. Then, `AddCommand` is executed by calling `AddCommand#execute(Model)`. -Step 4. The `AddCommand#execute(Model)` then calls `Model#addPerson(Person)` to add the new patient to the address book. +**Step 4.** The `AddCommand#execute(Model)` then calls `Model#addPerson(Person)` to add the new patient to the address book. -Step 5. The `CommandResult` from the `AddCommand` object is returned to `LogicManager` and then to `UI` to display the success message. +**Step 5.** The `CommandResult` from the `AddCommand` object is returned to `LogicManager` and then to `UI` to display the success message. **UML Diagrams:** @@ -177,24 +178,57 @@ The following sequence diagram summarizes what happens when a user executes a ne ![AddSequenceDiagram.png](images%2FAddSequenceDiagram.png) + +The following activity diagram summarizes what happens when a user executes a new command: + +![AddActivityDiagram.png](images%2FAddActivityDiagram.png) + +### Deleting a patient from Nursing Address Book + +#### Implementation + +The delete patient feature is facilitated mainly by `DeleteCommand`, `DeleteCommandParser` and `LogicManager`. + +Given below is an example usage scenario and how the delete patient feature behaves at each step. + +**Step 1.** The user inputs a delete Command (e.g. `delete 1`) to delete the patient at index 1 in Nursing Address Book. + +**Step 2.** The command is parsed via `AddressBookParser#parseCommand(String)`, which calls `DeleteCommandParser#parse(String)` to parse the user input and creates a new `DeleteCommand` object. + +**Step 3.** The created `DeleteCommand` is returned to `LogicManager`. Then, `DeleteCommand` is executed by calling `DeleteCommand#execute(Model)`. + +**Step 4.** The `DeleteCommand#execute(Model)` then calls `Model#deletePerson(Person)` to delete the patient from the address book. + +**Step 5.** The `CommandResult` from the `DeleteCommand` object is returned to `LogicManager` and then to `UI` to display the success message. + +**UML Diagrams:** + +Given below is the sequence diagram that summarizes what happens when a user executes a new command: + +![DeleteSequenceDiagram.png](images/DeleteSequenceDiagram.png) + +The following activity diagram summarizes what happens when a user executes a new command: + +![DeleteActivityDiagram.png](images/DeleteActivityDiagram.png) + ### Editing a patient's details #### Implementation -Editing a patient's details is facilitated by `EditCommand`, `EditCommandParser` and `LogicManager`. +Editing a patient's details is facilitated mainly by `EditCommand`, `EditCommandParser` and `LogicManager`. Given below is an example usage scenario and how the edit patient feature behaves at each step. -Step 1. The user inputs an edit Command (e.g. `edit 1 w\WB`) to edit the ward of the patient at index 1 in Nursing Address Book. +**Step 1.** The user inputs an edit Command (e.g. `edit 1 w\WB`) to edit the ward of the patient at index 1 in Nursing Address Book. -Step 2. The `edit` command calls `EditCommandParser#parse(String)` to parse the user input. +**Step 2.** The command is parsed via `AddressBookParser#parseCommand(String)`, which calls `EditCommandParser#parse(String)`to parse the user input and creates a new `EditCommand` object. -Step 3. A new `EditPersonDescriptor` object is created with the new ward details. +**Step 3.** A new `EditPersonDescriptor` object is created with the new ward details. A new `EditCommand` instance will be created with the index of the patient to be edited and the new `EditPersonDescriptor` object. -Step 4. The `EditCommand` instace is returned to the `LogicManager` and `execute` is called. +**Step 4.** The `EditCommand` instace is returned to the `LogicManager` and `execute` is called. -Step 5. The `EditCommand` instance calls `Model#setPerson(Person, Person)` to edit the patient's details. +**Step 5.** The `EditCommand` instance calls `Model#setPerson(Person, Person)` to edit the patient's details. The patient specified will have its ward updated to the new ward specified. **UML Diagrams:** diff --git a/docs/diagrams/AddActivityDiagram.puml b/docs/diagrams/AddActivityDiagram.puml new file mode 100644 index 00000000000..41e9560071d --- /dev/null +++ b/docs/diagrams/AddActivityDiagram.puml @@ -0,0 +1,23 @@ +@startuml +'https://plantuml.com/activity-diagram-beta + +start +:User enters add command; +:LogicManager executes user input; +:AddressBookParser parses add command; +:AddCommandParser parses the arguments provided in add command; + +if () then ([else]) + :Outputs error message; + stop +else ([valid arguments]) + :AddCommand object is created; + if () then ([person already exists]) + :Outputs error message; + else ([else]) + :AddCommand object is passed to LogicManager; + :New patient added into Nursing Address Book; +endif +stop + +@enduml diff --git a/docs/diagrams/DeleteActivityDiagram.puml b/docs/diagrams/DeleteActivityDiagram.puml new file mode 100644 index 00000000000..8aedf18d7a2 --- /dev/null +++ b/docs/diagrams/DeleteActivityDiagram.puml @@ -0,0 +1,10 @@ +@startuml +'https://plantuml.com/activity-diagram-beta + +start +: + + +stop + +@enduml diff --git a/docs/images/AddActivityDiagram.png b/docs/images/AddActivityDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8581f485f79d0e0cce693277933558d2ffba487b GIT binary patch literal 27542 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 R&oE-!r)i*(wa5Cx{{UMVt;qlY literal 0 HcmV?d00001 From ac35a1536c6600a585cc757f976648552fb90e81 Mon Sep 17 00:00:00 2001 From: iamtr Date: Fri, 12 Apr 2024 16:34:38 +0800 Subject: [PATCH 18/20] Add DeleteActivityDiagram --- docs/diagrams/DeleteActivityDiagram.puml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/diagrams/DeleteActivityDiagram.puml b/docs/diagrams/DeleteActivityDiagram.puml index 8aedf18d7a2..862240d707e 100644 --- a/docs/diagrams/DeleteActivityDiagram.puml +++ b/docs/diagrams/DeleteActivityDiagram.puml @@ -2,7 +2,15 @@ 'https://plantuml.com/activity-diagram-beta start -: +: User enters delete command; +: LogicManager executes user input; +: AddressBookParser parses delete command; +: DeleteCommandParser parses the arguments provided in add command; +if() then ([valid index]) +: AddressBookManager deletes the contact; +else ([else]) +: Outputs an error message; +endif stop From e71be8236c9dd9e1fce83dac68c8d5bb3f0c28a7 Mon Sep 17 00:00:00 2001 From: iamtr Date: Fri, 12 Apr 2024 16:35:53 +0800 Subject: [PATCH 19/20] Add image for delete activity diagram --- docs/images/DeleteActivityDiagram.png | Bin 0 -> 17457 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/DeleteActivityDiagram.png diff --git a/docs/images/DeleteActivityDiagram.png b/docs/images/DeleteActivityDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..7c47cc882b51eea1d6feb9e560fbd44290ec4dd0 GIT binary patch literal 17457 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 literal 0 HcmV?d00001 From adbf86cf6367240bec774c16480214f3c111eb79 Mon Sep 17 00:00:00 2001 From: iamtr Date: Fri, 12 Apr 2024 16:44:30 +0800 Subject: [PATCH 20/20] Fix spelling error in FindActivityDiagram --- docs/DeveloperGuide.md | 2 +- ...ityDiagram.puml => FindActivityDiagram.puml} | 0 docs/images/FindActivityDiagram.png | Bin 0 -> 28880 bytes docs/images/FindAvtivityDiagram.png | Bin 19583 -> 0 bytes 4 files changed, 1 insertion(+), 1 deletion(-) rename docs/diagrams/{FindAvtivityDiagram.puml => FindActivityDiagram.puml} (100%) create mode 100644 docs/images/FindActivityDiagram.png delete mode 100644 docs/images/FindAvtivityDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d7687810d35..132f8ee7890 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -385,7 +385,7 @@ The following sequence diagram shows how the finding of patient would work: The following activity diagram summarizes what happens when a user executes a new command to find a patient: - +![FindActivityDiagram](images/FindActivityDiagram.png) #### Design considerations: diff --git a/docs/diagrams/FindAvtivityDiagram.puml b/docs/diagrams/FindActivityDiagram.puml similarity index 100% rename from docs/diagrams/FindAvtivityDiagram.puml rename to docs/diagrams/FindActivityDiagram.puml diff --git a/docs/images/FindActivityDiagram.png b/docs/images/FindActivityDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c141b0aa66c1876ee0adc494334c594bf30c2ec7 GIT binary patch literal 28880 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 literal 0 HcmV?d00001 diff --git a/docs/images/FindAvtivityDiagram.png b/docs/images/FindAvtivityDiagram.png deleted file mode 100644 index a98031c6c1edf46be336bf88950dc58943644558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19583 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 jl4+6=i~nYMzMQc