Skip to content

Commit

Permalink
Merge pull request #68 from Shruthiiii03/branch-EmergencyNameCommand
Browse files Browse the repository at this point in the history
Complete Emergency Contact Name functionality
  • Loading branch information
gohqingkhang authored Oct 17, 2024
2 parents 08f67a7 + 4f48c14 commit ba43d1b
Show file tree
Hide file tree
Showing 25 changed files with 471 additions and 109 deletions.
21 changes: 21 additions & 0 deletions docs/UserGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,27 @@ Examples:
* `list` followed by `delete 2` deletes the 2nd person in the address book.
* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.


### Adding an Emergency contact's name : 'addEmergencyContactName'

Adds an emergency contact's name to the specified person in the address book.

Format: 'addEmergencyContactName INDEX en/[ECNAME]'

<box type="tip" seamless>

**Tip:** You can delete the emergency contact's name by leaving the `ECNAME` field empty.
</box>

* Adds the emergency contact's name `ECNAME` to the person at the specified `INDEX`
* Deletes the emergency contact's name at the specified `INDEX`
* The index **must be a positive integer** 1, 2, 3, …​

Examples:
* `addEmergencyContactName 1 en/John Doe` to add the emergency contact's name "John Doe" to the 1st person
in the list.
* `addEmergencyContactName 2 en/` to delete the emergency contact's name from the 2nd person in the list.

### Adding an Emergency phone number : `emergencyPhone`

Adds a emergency phone number to the specified person in the address book.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;

import java.util.List;

import seedu.address.commons.core.index.Index;
import seedu.address.logic.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.person.Name;
import seedu.address.model.person.EmergencyContactName;
import seedu.address.model.person.Person;

/**
* Adds an emergency contact name to an existing person in the address book.
Expand All @@ -13,34 +20,55 @@ public class AddEmergencyContactNameCommand extends Command {
public static final String COMMAND_WORD = "addEmergencyContactName";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds an emergency contact name to the student "
+ "identified by the name. "
+ "Parameters: n/NAME e/EMERGENCY_CONTACT\n"
+ "Example: " + COMMAND_WORD + " n/Henry e/John Doe";
+ "identified by the index.\n"
+ "Parameters: [INDEX] en/EMERGENCY_CONTACT\n"
+ "Example: " + COMMAND_WORD + " 1 en/John Doe";

public static final String MESSAGE_ADD_CONTACT_SUCCESS = "Added emergency contact's name for Student: %1$s";
public static final String MESSAGE_DELETE_CONTACT_SUCCESS = "Removed emergency contact's name from Student: %1$s";
public static final String MESSAGE_ADD_ECNAME_SUCCESS = "Added emergency contact's name for Person: %1$s";
public static final String MESSAGE_DELETE_ECNAME_SUCCESS = "Removed emergency contact's name from Person: %1$s";

public static final String MESSAGE_STUDENT_NOT_FOUND = "The student with name '%1$s' could not be found.";
public static final String MESSAGE_ARGUMENTS = "Name: %1$s, ECName: %2$s";
public static final String MESSAGE_ARGUMENTS = "Index: %1$d, ECName: %2$s";

private final Name name;
private final Name emergencyContactName;
private final Index index;
private final EmergencyContactName ecName;

/**
* @param name of the student in the filtered list
* @param eCName to be added
* @param index of the student in the filtered list
* @param ecName to be added
*/
public AddEmergencyContactNameCommand(Name name, Name eCName) {
requireAllNonNull(name, eCName);
public AddEmergencyContactNameCommand(Index index, EmergencyContactName ecName) {
requireAllNonNull(index, ecName);

this.name = name;
this.emergencyContactName = eCName;
this.index = index;
this.ecName = ecName;
}

@Override
public CommandResult execute(Model model) throws CommandException {
// Placeholder - Update with actual logic
throw new CommandException(String.format(MESSAGE_ARGUMENTS, name, emergencyContactName));
requireNonNull(model);
List<Person> lastShownList = model.getFilteredPersonList();
if (index.getZeroBased() >= lastShownList.size()) {
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
}

Person personToEdit = lastShownList.get(index.getZeroBased());
Person editedPerson = new Person(personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),
personToEdit.getAddress(), personToEdit.getRegisterNumber(), personToEdit.getSex(),
personToEdit.getStudentClass(), ecName, personToEdit.getEmergencyPhone(), personToEdit.getTags());
model.setPerson(personToEdit, editedPerson);
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
return new CommandResult(generateSuccessMessage(editedPerson));
}

/**
* Generates a command execution success message based on whether the emergency contact name is added to or
* removed from
* {@code personToEdit}.
*/
private String generateSuccessMessage(Person personToEdit) {
String message = !ecName.fullName.isEmpty() ? MESSAGE_ADD_ECNAME_SUCCESS
: MESSAGE_DELETE_ECNAME_SUCCESS;
return String.format(message, personToEdit);
}

@Override
Expand All @@ -54,8 +82,8 @@ public boolean equals(Object other) {
}

AddEmergencyContactNameCommand e = (AddEmergencyContactNameCommand) other;
return name.equals(e.name)
&& emergencyContactName.equals(e.emergencyContactName);
return index.equals(e.index)
&& ecName.equals(e.ecName);
}
}

4 changes: 3 additions & 1 deletion src/main/java/seedu/address/logic/commands/EditCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import seedu.address.model.Model;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.EmergencyContactName;
import seedu.address.model.person.EmergencyPhone;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
Expand Down Expand Up @@ -114,11 +115,12 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript
Sex updatedSex = editPersonDescriptor.getSex().orElse(personToEdit.getSex());
StudentClass updatedStudentClass = editPersonDescriptor.getStudentClass()
.orElse(personToEdit.getStudentClass());
EmergencyContactName updatedEcName = personToEdit.getEmergencyContactName();
EmergencyPhone updatedEmergencyPhone = personToEdit.getEmergencyPhone();
Set<Tag> updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());

return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedRegisterNumber, updatedSex,
updatedStudentClass, updatedEmergencyPhone, updatedTags);
updatedStudentClass, updatedEcName, updatedEmergencyPhone, updatedTags);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ public CommandResult execute(Model model) throws CommandException {
Person personToEdit = lastShownList.get(index.getZeroBased());
Person editedPerson = new Person(personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),
personToEdit.getAddress(), personToEdit.getRegisterNumber(), personToEdit.getSex(),
personToEdit.getStudentClass(), emergencyPhone, personToEdit.getTags());
personToEdit.getStudentClass(), personToEdit.getEmergencyContactName(), emergencyPhone,
personToEdit.getTags());
model.setPerson(personToEdit, editedPerson);
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
return new CommandResult(generateSuccessMessage(editedPerson));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.EmergencyContactName;
import seedu.address.model.person.EmergencyPhone;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
Expand Down Expand Up @@ -58,11 +59,13 @@ public AddCommand parse(String args) throws ParseException {
.get());
Sex sex = ParserUtil.parseSex(argMultimap.getValue(PREFIX_SEX).get());
StudentClass studentClass = ParserUtil.parseStudentClass(argMultimap.getValue(PREFIX_STUDENT_CLASS).get());
EmergencyContactName ecName = new EmergencyContactName("");
//Adding a student does not allow ECName to be added right away
EmergencyPhone emergencyPhone = new EmergencyPhone("");
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));

Person person = new Person(name, phone, email, address, registerNumber, sex,
studentClass, emergencyPhone, tagList);
Person person = new Person(name, phone, email, address, registerNumber, sex, studentClass, ecName,
emergencyPhone, tagList);

return new AddCommand(person);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
import static java.util.Objects.requireNonNull;
import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_ECNAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;

import seedu.address.commons.core.index.Index;
import seedu.address.commons.exceptions.IllegalValueException;
import seedu.address.logic.commands.AddEmergencyContactNameCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Name;
import seedu.address.model.person.EmergencyContactName;

/**
* Parses input arguments and creates a new {@code AddEmergencyContactNameCommand} object
Expand All @@ -22,24 +22,25 @@ public class AddEmergencyContactNameCommandParser implements Parser<AddEmergency
*/
public AddEmergencyContactNameCommand parse(String args) throws ParseException {
requireNonNull(args);
ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_ECNAME);
if (!argMultimap.getValue(PREFIX_NAME).isPresent() || !argMultimap.getValue(PREFIX_ECNAME).isPresent()) {
ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_ECNAME);
if (!argMultimap.getValue(PREFIX_ECNAME).isPresent()) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
AddEmergencyContactNameCommand.MESSAGE_USAGE));
}

Name name;
Name eCName;
Index index;
EmergencyContactName ecName;
try {
name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());
eCName = ParserUtil.parseName(argMultimap.getValue(PREFIX_ECNAME).get());
index = ParserUtil.parseIndex(argMultimap.getPreamble());
ecName = (EmergencyContactName) ParserUtil.parseEmergencyContactName(
argMultimap.getValue(PREFIX_ECNAME).get());

} catch (IllegalValueException ive) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
AddEmergencyContactNameCommand.MESSAGE_USAGE), ive);
}

return new AddEmergencyContactNameCommand(name, eCName);
return new AddEmergencyContactNameCommand(index, ecName);
}

}
16 changes: 16 additions & 0 deletions src/main/java/seedu/address/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.EmergencyContactName;
import seedu.address.model.person.EmergencyPhone;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
Expand Down Expand Up @@ -144,6 +145,21 @@ public static StudentClass parseStudentClass(String studentClass) throws ParseEx
return new StudentClass(trimmedStudentClass);
}

/**
* Parses a {@code String ecName} into a {@code EmergencyContactName}.
* Leading and trailing whitespaces will be trimmed.
*
* @throws ParseException if the given {@code ecName} is invalid.
*/
public static EmergencyContactName parseEmergencyContactName(String ecName) throws ParseException {
requireNonNull(ecName);
String trimmedEcName = ecName.trim();
if (!EmergencyContactName.isValidEmergencyContactName(trimmedEcName)) {
throw new ParseException(EmergencyContactName.MESSAGE_CONSTRAINTS);
}
return new EmergencyContactName(trimmedEcName);
}

/**
* Parses a {@code String emergencyPhone} into a {@code EmergencyPhone}.
* Leading and trailing whitespaces will be trimmed.
Expand Down
66 changes: 66 additions & 0 deletions src/main/java/seedu/address/model/person/EmergencyContactName.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package seedu.address.model.person;

import static java.util.Objects.requireNonNull;
import static seedu.address.commons.util.AppUtil.checkArgument;

/**
* Represents a person's emergency contact name in the address book
* The name can be empty or contain only alphanumeric characters and spaces.
*/
public class EmergencyContactName {

public static final String MESSAGE_CONSTRAINTS =
"Emergency contact names should only contain alphanumeric characters and spaces, "
+ "and it can be blank if no contact is provided.";

/**
* The first character of the name must not be a whitespace,
* otherwise " " (a blank string) becomes a valid input.
*/
public static final String VALIDATION_REGEX = "[\\p{Alnum}][\\p{Alnum} ]*";
public final String fullName;


/**
* Constructs an EmergencyContactName
* @param ecName
*/
public EmergencyContactName(String ecName) {
requireNonNull(ecName);
checkArgument(isValidEmergencyContactName(ecName), MESSAGE_CONSTRAINTS);
fullName = ecName;
}

/**
* Returns true if a given string is a valid name.
*/
public static boolean isValidEmergencyContactName(String name) {
return name != null && (name.isEmpty() || name.matches(VALIDATION_REGEX));
}

@Override
public String toString() {
return fullName;
}

@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}

// instanceof handles nulls
if (!(other instanceof EmergencyContactName)) {
return false;
}

EmergencyContactName otherName = (EmergencyContactName) other;
return fullName.equals(otherName.fullName);
}

@Override
public int hashCode() {
return fullName.hashCode();
}

}
11 changes: 9 additions & 2 deletions src/main/java/seedu/address/model/person/Person.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,25 @@ public class Person {

// Data fields
private final Address address;
private final EmergencyContactName ecName;
private final EmergencyPhone emergencyPhone;
private final Set<Tag> tags = new HashSet<>();

/**
* Every field must be present and not null.
*/
public Person(Name name, Phone phone, Email email, Address address, RegisterNumber registerNumber, Sex sex,
StudentClass studentClass, EmergencyPhone emergencyPhone, Set<Tag> tags) {
requireAllNonNull(name, phone, email, address, registerNumber, sex, studentClass, emergencyPhone, tags);
StudentClass studentClass, EmergencyContactName ecName, EmergencyPhone emergencyPhone, Set<Tag> tags) {
requireAllNonNull(name, phone, email, address, registerNumber, sex, studentClass, ecName, emergencyPhone, tags);

this.name = name;
this.phone = phone;
this.email = email;
this.address = address;
this.registerNumber = registerNumber;
this.sex = sex;
this.studentClass = studentClass;
this.ecName = ecName;
this.emergencyPhone = emergencyPhone;
this.tags.addAll(tags);
}
Expand Down Expand Up @@ -73,6 +76,9 @@ public Sex getSex() {
public StudentClass getStudentClass() {
return studentClass;
}
public EmergencyContactName getEmergencyContactName() {
return ecName;
}

public EmergencyPhone getEmergencyPhone() {
return emergencyPhone;
Expand Down Expand Up @@ -142,6 +148,7 @@ public String toString() {
.add("register number", registerNumber)
.add("sex", sex)
.add("class", studentClass)
.add("emergency contact name", ecName)
.add("emergency phone", emergencyPhone)
.add("tags", tags)
.toString();
Expand Down
Loading

0 comments on commit ba43d1b

Please sign in to comment.