Skip to content

Commit

Permalink
Add and edit feature (#57)
Browse files Browse the repository at this point in the history
* Add skeleton Birthday, LevelOfFriendship and GroupTag class

* Add Birthday and GroupTag skeleton classes, add full LevelOfFriendship class

* Edit logic portion in source

* Edit source model classes

* Edit storage

* Edit person card

* Update some test files

* Minor changes

* Edit XmlAdaptedPerson class

* Edit XmlUtilTest

* Edit minor changes, remove birthday and grouptag class

* Fix bug

* Add 3 classes

* Minor changes

* Add changes

* Update all related documents for adding new classes

* Add heart symbols

* Remove unused import

* Edit failing tests

* Minor edits

* Add heart string method

* Edited several failing tests, added extra method in GuiTestAssert

* Edit GUI test

* Add git ignore to AddCommandSystemtest

* Comment out AddCommandSystemTest to fix later

* Add more tests to pass coveralls
  • Loading branch information
deborahlow97 authored Mar 21, 2018
1 parent 0cc8e6e commit ba3bd4d
Show file tree
Hide file tree
Showing 60 changed files with 2,124 additions and 723 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ lib/*
*.csv
config.json
src/test/data/sandbox/
src/test/java/systemtests/AddCommandSystemTest
preferences.json
.DS_Store
./screenshot*.png
Expand Down
19 changes: 13 additions & 6 deletions src/main/java/seedu/address/logic/commands/AddCommand.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_CCA;
import static seedu.address.logic.parser.CliSyntax.PREFIX_LEVEL_OF_FRIENDSHIP;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.logic.parser.CliSyntax.PREFIX_UNIT_NUMBER;

import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.person.Person;
Expand All @@ -23,14 +25,19 @@ public class AddCommand extends UndoableCommand {
+ "Parameters: "
+ PREFIX_NAME + "NAME "
+ PREFIX_PHONE + "PHONE "
+ PREFIX_EMAIL + "EMAIL "
+ PREFIX_ADDRESS + "ADDRESS "
+ PREFIX_BIRTHDAY + "BIRTHDAY "
+ PREFIX_LEVEL_OF_FRIENDSHIP + "LEVEL OF FRIENDSHIP "
+ PREFIX_UNIT_NUMBER + "UNIT NUMBER "
+ PREFIX_CCA + "CCA "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_NAME + "John Doe "
+ PREFIX_PHONE + "98765432 "
+ PREFIX_EMAIL + "johnd@example.com "
+ PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 "
+ PREFIX_BIRTHDAY + "24/05/1997 "
+ PREFIX_LEVEL_OF_FRIENDSHIP + "9 "
+ PREFIX_UNIT_NUMBER + "#02-25 "
+ PREFIX_CCA + "Badminton "
+ PREFIX_CCA + "tennis "
+ PREFIX_TAG + "friends "
+ PREFIX_TAG + "owesMoney";

Expand Down
93 changes: 68 additions & 25 deletions src/main/java/seedu/address/logic/commands/EditCommand.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_CCA;
import static seedu.address.logic.parser.CliSyntax.PREFIX_LEVEL_OF_FRIENDSHIP;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.logic.parser.CliSyntax.PREFIX_UNIT_NUMBER;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;

import java.util.Collections;
Expand All @@ -19,12 +21,14 @@
import seedu.address.commons.core.index.Index;
import seedu.address.commons.util.CollectionUtil;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Birthday;
import seedu.address.model.person.Cca;
import seedu.address.model.person.LevelOfFriendship;
import seedu.address.model.person.Meet;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.person.UnitNumber;
import seedu.address.model.person.exceptions.DuplicatePersonException;
import seedu.address.model.person.exceptions.PersonNotFoundException;
import seedu.address.model.tag.Tag;
Expand All @@ -44,12 +48,14 @@ public class EditCommand extends UndoableCommand {
+ "Parameters: INDEX (must be a positive integer) "
+ "[" + PREFIX_NAME + "NAME] "
+ "[" + PREFIX_PHONE + "PHONE] "
+ "[" + PREFIX_EMAIL + "EMAIL] "
+ "[" + PREFIX_ADDRESS + "ADDRESS] "
+ "[" + PREFIX_BIRTHDAY + "BIRTHDAY] "
+ "[" + PREFIX_LEVEL_OF_FRIENDSHIP + "LEVEL OF FRIENDSHIP] "
+ "[" + PREFIX_UNIT_NUMBER + "UNIT NUMBER] "
+ "[" + PREFIX_CCA + "CCA]... "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ "Example: " + COMMAND_WORD + " 1 "
+ PREFIX_PHONE + "91234567 "
+ PREFIX_EMAIL + "johndoe@example.com";
+ PREFIX_BIRTHDAY + "21/3/1990 ";

public static final String MESSAGE_EDIT_PERSON_SUCCESS = "Edited Person: %1$s";
public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided.";
Expand Down Expand Up @@ -107,12 +113,16 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript

Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName());
Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());
Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());
Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
Birthday updatedBirthday = editPersonDescriptor.getBirthday().orElse(personToEdit.getBirthday());
LevelOfFriendship updatedLevelOfFriendship = editPersonDescriptor.getLevelOfFriendship()
.orElse(personToEdit.getLevelOfFriendship());
UnitNumber updatedUnitNumber = editPersonDescriptor.getUnitNumber().orElse(personToEdit.getUnitNumber());
Meet updatedMeetDate = personToEdit.getMeetDate();
Set<Cca> updatedCcas = editPersonDescriptor.getCcas().orElse(personToEdit.getCcas());
Set<Tag> updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());

return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedMeetDate, updatedTags);
return new Person(updatedName, updatedPhone, updatedBirthday, updatedLevelOfFriendship, updatedUnitNumber,
updatedCcas, updatedMeetDate, updatedTags);
}

@Override
Expand Down Expand Up @@ -141,8 +151,10 @@ public boolean equals(Object other) {
public static class EditPersonDescriptor {
private Name name;
private Phone phone;
private Email email;
private Address address;
private Birthday birthday;
private LevelOfFriendship levelOfFriendship;
private UnitNumber unitNumber;
private Set<Cca> ccas;
private Set<Tag> tags;

public EditPersonDescriptor() {}
Expand All @@ -154,16 +166,19 @@ public EditPersonDescriptor() {}
public EditPersonDescriptor(EditPersonDescriptor toCopy) {
setName(toCopy.name);
setPhone(toCopy.phone);
setEmail(toCopy.email);
setAddress(toCopy.address);
setBirthday(toCopy.birthday);
setLevelOfFriendship(toCopy.levelOfFriendship);
setUnitNumber(toCopy.unitNumber);
setCcas(toCopy.ccas);
setTags(toCopy.tags);
}

/**
* Returns true if at least one field is edited.
*/
public boolean isAnyFieldEdited() {
return CollectionUtil.isAnyNonNull(this.name, this.phone, this.email, this.address, this.tags);
return CollectionUtil.isAnyNonNull(this.name, this.phone, this.birthday,
this.levelOfFriendship, this.unitNumber, this.ccas, this.tags);
}

public void setName(Name name) {
Expand All @@ -182,20 +197,46 @@ public Optional<Phone> getPhone() {
return Optional.ofNullable(phone);
}

public void setEmail(Email email) {
this.email = email;
public void setBirthday(Birthday birthday) {
this.birthday = birthday;
}

public Optional<Email> getEmail() {
return Optional.ofNullable(email);
public Optional<Birthday> getBirthday() {
return Optional.ofNullable(birthday);
}

public void setAddress(Address address) {
this.address = address;
public void setLevelOfFriendship(LevelOfFriendship levelOfFriendship) {
this.levelOfFriendship = levelOfFriendship;
}

public Optional<Address> getAddress() {
return Optional.ofNullable(address);
public Optional<LevelOfFriendship> getLevelOfFriendship() {
return Optional.ofNullable(levelOfFriendship);
}

public void setUnitNumber(UnitNumber unitNumber) {
this.unitNumber = unitNumber;
}

public Optional<UnitNumber> getUnitNumber() {
return Optional.ofNullable(unitNumber);
}


/**
* Sets {@code ccas} to this object's {@code ccas}.
* A defensive copy of {@code ccas} is used internally.
*/
public void setCcas(Set<Cca> ccas) {
this.ccas = (ccas != null) ? new HashSet<>(ccas) : null;
}

/**
* Returns an unmodifiable cca set, which throws {@code UnsupportedOperationException}
* if modification is attempted.
* Returns {@code Optional#empty()} if {@code ccas} is null.
*/
public Optional<Set<Cca>> getCcas() {
return (ccas != null) ? Optional.of(Collections.unmodifiableSet(ccas)) : Optional.empty();
}

/**
Expand Down Expand Up @@ -232,8 +273,10 @@ public boolean equals(Object other) {

return getName().equals(e.getName())
&& getPhone().equals(e.getPhone())
&& getEmail().equals(e.getEmail())
&& getAddress().equals(e.getAddress())
&& getBirthday().equals(e.getBirthday())
&& getLevelOfFriendship().equals(e.getLevelOfFriendship())
&& getUnitNumber().equals(e.getUnitNumber())
&& getCcas().equals(e.getCcas())
&& getTags().equals(e.getTags());
}
}
Expand Down
31 changes: 20 additions & 11 deletions src/main/java/seedu/address/logic/parser/AddCommandParser.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,31 @@
package seedu.address.logic.parser;

import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_CCA;
import static seedu.address.logic.parser.CliSyntax.PREFIX_LEVEL_OF_FRIENDSHIP;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.logic.parser.CliSyntax.PREFIX_UNIT_NUMBER;

import java.util.Set;
import java.util.stream.Stream;

import seedu.address.commons.exceptions.IllegalValueException;
import seedu.address.logic.commands.AddCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Birthday;
import seedu.address.model.person.Cca;
import seedu.address.model.person.LevelOfFriendship;
import seedu.address.model.person.Meet;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.person.UnitNumber;
import seedu.address.model.tag.Tag;


/**
* Parses input arguments and creates a new AddCommand object
*/
Expand All @@ -33,23 +38,27 @@ public class AddCommandParser implements Parser<AddCommand> {
*/
public AddCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_BIRTHDAY,
PREFIX_LEVEL_OF_FRIENDSHIP, PREFIX_UNIT_NUMBER, PREFIX_CCA, PREFIX_TAG);

if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)
if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_BIRTHDAY, PREFIX_PHONE, PREFIX_UNIT_NUMBER,
PREFIX_LEVEL_OF_FRIENDSHIP, PREFIX_UNIT_NUMBER)
|| !argMultimap.getPreamble().isEmpty()) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
}

try {
Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME)).get();
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE)).get();
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL)).get();
Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS)).get();
Birthday birthday = ParserUtil.parseBirthday(argMultimap.getValue(PREFIX_BIRTHDAY)).get();
UnitNumber unitNumber = ParserUtil.parseUnitNumber(argMultimap.getValue(PREFIX_UNIT_NUMBER)).get();
LevelOfFriendship levelOfFriendship = ParserUtil.parseLevelOfFriendship(argMultimap
.getValue(PREFIX_LEVEL_OF_FRIENDSHIP)).get();
Set<Cca> ccaList = ParserUtil.parseCcas(argMultimap.getAllValues(PREFIX_CCA));
Meet meetDate = new Meet("");
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));

Person person = new Person(name, phone, email, address, meetDate, tagList);

Person person = new Person(name, phone, birthday, levelOfFriendship, unitNumber, ccaList, meetDate,
tagList);
return new AddCommand(person);
} catch (IllegalValueException ive) {
throw new ParseException(ive.getMessage(), ive);
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ public class CliSyntax {
/* Prefix definitions */
public static final Prefix PREFIX_NAME = new Prefix("n/");
public static final Prefix PREFIX_PHONE = new Prefix("p/");
public static final Prefix PREFIX_EMAIL = new Prefix("e/");
public static final Prefix PREFIX_ADDRESS = new Prefix("a/");
public static final Prefix PREFIX_BIRTHDAY = new Prefix("b/");
public static final Prefix PREFIX_LEVEL_OF_FRIENDSHIP = new Prefix("*/");
public static final Prefix PREFIX_UNIT_NUMBER = new Prefix("u/");
public static final Prefix PREFIX_CCA = new Prefix("cca/");
public static final Prefix PREFIX_TAG = new Prefix("t/");
public static final Prefix PREFIX_DATE = new Prefix("d/");

Expand Down
34 changes: 29 additions & 5 deletions src/main/java/seedu/address/logic/parser/EditCommandParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import static java.util.Objects.requireNonNull;
import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_CCA;
import static seedu.address.logic.parser.CliSyntax.PREFIX_LEVEL_OF_FRIENDSHIP;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.logic.parser.CliSyntax.PREFIX_UNIT_NUMBER;

import java.util.Collection;
import java.util.Collections;
Expand All @@ -18,6 +20,7 @@
import seedu.address.logic.commands.EditCommand;
import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Cca;
import seedu.address.model.tag.Tag;

/**
Expand All @@ -33,7 +36,8 @@ public class EditCommandParser implements Parser<EditCommand> {
public EditCommand parse(String args) throws ParseException {
requireNonNull(args);
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_BIRTHDAY,
PREFIX_LEVEL_OF_FRIENDSHIP, PREFIX_UNIT_NUMBER, PREFIX_CCA, PREFIX_TAG);

Index index;

Expand All @@ -47,8 +51,13 @@ public EditCommand parse(String args) throws ParseException {
try {
ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME)).ifPresent(editPersonDescriptor::setName);
ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE)).ifPresent(editPersonDescriptor::setPhone);
ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL)).ifPresent(editPersonDescriptor::setEmail);
ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS)).ifPresent(editPersonDescriptor::setAddress);
ParserUtil.parseBirthday(argMultimap.getValue(PREFIX_BIRTHDAY))
.ifPresent(editPersonDescriptor::setBirthday);
ParserUtil.parseLevelOfFriendship(argMultimap.getValue(PREFIX_LEVEL_OF_FRIENDSHIP))
.ifPresent(editPersonDescriptor::setLevelOfFriendship);
ParserUtil.parseUnitNumber(argMultimap.getValue(PREFIX_UNIT_NUMBER))
.ifPresent(editPersonDescriptor::setUnitNumber);
parseCcasForEdit(argMultimap.getAllValues(PREFIX_CCA)).ifPresent(editPersonDescriptor::setCcas);
parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);
} catch (IllegalValueException ive) {
throw new ParseException(ive.getMessage(), ive);
Expand All @@ -61,6 +70,21 @@ public EditCommand parse(String args) throws ParseException {
return new EditCommand(index, editPersonDescriptor);
}

/**
* Parses {@code Collection<String> ccas} into a {@code Set<Cca>} if {@code ccas} is non-empty.
* If {@code ccas} contain only one element which is an empty string, it will be parsed into a
* {@code Set<Cca>} containing zero ccas.
*/
private Optional<Set<Cca>> parseCcasForEdit(Collection<String> ccas) throws IllegalValueException {
assert ccas != null;

if (ccas.isEmpty()) {
return Optional.empty();
}
Collection<String> ccaSet = ccas.size() == 1 && ccas.contains("") ? Collections.emptySet() : ccas;
return Optional.of(ParserUtil.parseCcas(ccaSet));
}

/**
* Parses {@code Collection<String> tags} into a {@code Set<Tag>} if {@code tags} is non-empty.
* If {@code tags} contain only one element which is an empty string, it will be parsed into a
Expand Down
Loading

0 comments on commit ba3bd4d

Please sign in to comment.