From 9c981e2e25e5b24e7279a9ba5cb4662d42c678c9 Mon Sep 17 00:00:00 2001 From: Jeremy Choo Date: Thu, 1 Nov 2018 16:05:12 +0800 Subject: [PATCH 1/5] Initial commit --- .../logic/commands/SelfEditCommand.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/main/java/seedu/address/logic/commands/SelfEditCommand.java diff --git a/src/main/java/seedu/address/logic/commands/SelfEditCommand.java b/src/main/java/seedu/address/logic/commands/SelfEditCommand.java new file mode 100644 index 000000000000..8351ad201134 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/SelfEditCommand.java @@ -0,0 +1,82 @@ +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_NAME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_PROJECT; +import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY; +import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import seedu.address.commons.core.Messages; +import seedu.address.commons.core.index.Index; +import seedu.address.commons.util.CollectionUtil; +import seedu.address.logic.CommandHistory; +import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.model.Model; +import seedu.address.model.permission.Permission; +import seedu.address.model.person.Address; +import seedu.address.model.person.Email; +import seedu.address.model.person.Name; +import seedu.address.model.person.Person; +import seedu.address.model.person.Phone; +import seedu.address.model.person.Salary; +import seedu.address.model.project.Project; + + +/** + * Edits the details of an existing person in the address book. + */ +public class SelfEditCommand extends Command { + + public static final String COMMAND_WORD = "myself"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of yourself, the currently logged " + + "in person. Existing values will be overwritten by the input values.\n" + + "Parameters: " + + "[" + PREFIX_PHONE + " PHONE] " + + "[" + PREFIX_EMAIL + " EMAIL] " + + "[" + PREFIX_ADDRESS + " ADDRESS] " + + "[" + PREFIX_PROJECT + " PROJECT]...\n" + + "Example: " + COMMAND_WORD + " 1 " + + PREFIX_PHONE + " 91234567 " + + PREFIX_EMAIL + " johndoe@example.com"; + + 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."; + + public SelfEditCommand() { + } + + @Override + public CommandResult runBody(Model model, CommandHistory history) throws CommandException { + requireNonNull(model); + model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); + model.commitAddressBook(); + return new CommandResult(MESSAGE_EDIT_PERSON_SUCCESS); + } + + @Override + public boolean equals(Object other) { + // short circuit if same object + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof SelfEditCommand)) { + return false; + } + + // state check + SelfEditCommand e = (SelfEditCommand) other; + return true; + } +} From 2a2188a6d7a20bd9720530ea965df97590580d4c Mon Sep 17 00:00:00 2001 From: Jeremy Choo Date: Thu, 1 Nov 2018 16:14:46 +0800 Subject: [PATCH 2/5] Added to autocomplete --- .../seedu/address/logic/commands/AutoCompleteCommandHelper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/seedu/address/logic/commands/AutoCompleteCommandHelper.java b/src/main/java/seedu/address/logic/commands/AutoCompleteCommandHelper.java index a6824ed44ea0..7d3b192a3cca 100644 --- a/src/main/java/seedu/address/logic/commands/AutoCompleteCommandHelper.java +++ b/src/main/java/seedu/address/logic/commands/AutoCompleteCommandHelper.java @@ -23,6 +23,7 @@ public class AutoCompleteCommandHelper { PasswordCommand.COMMAND_WORD, RedoCommand.COMMAND_WORD, SelectCommand.COMMAND_WORD, + SelfEditCommand.COMMAND_WORD, UndoCommand.COMMAND_WORD, ViewPermissionCommand.COMMAND_WORD }; From 050885dd0c0e80da7cea5117da185f72ca093020 Mon Sep 17 00:00:00 2001 From: Jeremy Choo Date: Thu, 1 Nov 2018 18:30:49 +0800 Subject: [PATCH 3/5] Implemented self edit command --- .../address/logic/commands/EditCommand.java | 2 +- .../logic/commands/SelfEditCommand.java | 36 +++++----- .../logic/parser/SelfEditCommandParser.java | 69 +++++++++++++++++++ 3 files changed, 87 insertions(+), 20 deletions(-) create mode 100644 src/main/java/seedu/address/logic/parser/SelfEditCommandParser.java diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index dd3f20e39fac..b1510247833c 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -98,7 +98,7 @@ public CommandResult runBody(Model model, CommandHistory history) throws Command * Creates and returns a {@code Person} with the details of {@code personToEdit} * edited with {@code editPersonDescriptor}. */ - private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) { + public static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) { assert personToEdit != null; Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName()); diff --git a/src/main/java/seedu/address/logic/commands/SelfEditCommand.java b/src/main/java/seedu/address/logic/commands/SelfEditCommand.java index 8351ad201134..eccf56fa4058 100644 --- a/src/main/java/seedu/address/logic/commands/SelfEditCommand.java +++ b/src/main/java/seedu/address/logic/commands/SelfEditCommand.java @@ -3,36 +3,20 @@ 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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_PROJECT; -import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY; import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -import seedu.address.commons.core.Messages; -import seedu.address.commons.core.index.Index; -import seedu.address.commons.util.CollectionUtil; import seedu.address.logic.CommandHistory; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; import seedu.address.model.permission.Permission; -import seedu.address.model.person.Address; -import seedu.address.model.person.Email; -import seedu.address.model.person.Name; import seedu.address.model.person.Person; -import seedu.address.model.person.Phone; -import seedu.address.model.person.Salary; -import seedu.address.model.project.Project; /** * Edits the details of an existing person in the address book. + * This command makes use of EditCommand's classes to perform it's work. */ public class SelfEditCommand extends Command { @@ -52,15 +36,29 @@ public class SelfEditCommand extends Command { 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."; - public SelfEditCommand() { + private EditCommand.EditPersonDescriptor editPersonDescriptor; + + /** + * @param editPersonDescriptor details to edit the person with + */ + public SelfEditCommand(EditCommand.EditPersonDescriptor editPersonDescriptor) { + requireNonNull(editPersonDescriptor); + + requiredPermission.addPermissions(Permission.EDIT_EMPLOYEE); + this.editPersonDescriptor = new EditCommand.EditPersonDescriptor(editPersonDescriptor); } @Override public CommandResult runBody(Model model, CommandHistory history) throws CommandException { requireNonNull(model); + + Person personToEdit = model.getLoggedInUser().getPerson(); + Person editedPerson = EditCommand.createEditedPerson(personToEdit, editPersonDescriptor); + + model.updatePerson(personToEdit, editedPerson); model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); model.commitAddressBook(); - return new CommandResult(MESSAGE_EDIT_PERSON_SUCCESS); + return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, editedPerson)); } @Override diff --git a/src/main/java/seedu/address/logic/parser/SelfEditCommandParser.java b/src/main/java/seedu/address/logic/parser/SelfEditCommandParser.java new file mode 100644 index 000000000000..7de2c953ba06 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/SelfEditCommandParser.java @@ -0,0 +1,69 @@ +package seedu.address.logic.parser; + +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_PHONE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_PROJECT; + +import java.util.Collection; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; + +import seedu.address.logic.commands.EditCommand.EditPersonDescriptor; +import seedu.address.logic.commands.SelfEditCommand; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.project.Project; + +/** + * Parses input arguments and creates a new EditCommand object + */ +public class SelfEditCommandParser 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 SelfEditCommand parse(String args) throws ParseException { + requireNonNull(args); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, + PREFIX_PROJECT); + + EditPersonDescriptor editPersonDescriptor = new EditPersonDescriptor(); + if (argMultimap.getValue(PREFIX_PHONE).isPresent()) { + editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get())); + } + if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) { + editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get())); + } + if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { + editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get())); + } + parseProjectsForEdit(argMultimap.getAllValues(PREFIX_PROJECT)).ifPresent(editPersonDescriptor::setProjects); + + if (!editPersonDescriptor.isAnyFieldEdited()) { + throw new ParseException(SelfEditCommand.MESSAGE_NOT_EDITED); + } + + return new SelfEditCommand(editPersonDescriptor); + } + + /** + * Parses {@code Collection tags} into a {@code Set} if {@code tags} is non-empty. + * If {@code tags} contain only one element which is an empty string, it will be parsed into a + * {@code Set} containing zero tags. + */ + private Optional> parseProjectsForEdit(Collection tags) throws ParseException { + assert tags != null; + + if (tags.isEmpty()) { + return Optional.empty(); + } + Collection tagSet = tags.size() == 1 && tags.contains("") ? Collections.emptySet() : tags; + return Optional.of(ParserUtil.parseProjects(tagSet)); + } + +} From ef951b6191e4bb0c9bf7aa9c7f2b6a57f1bdd975 Mon Sep 17 00:00:00 2001 From: Jeremy Choo Date: Thu, 1 Nov 2018 18:32:38 +0800 Subject: [PATCH 4/5] Added admin edit check --- .../java/seedu/address/logic/commands/SelfEditCommand.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/seedu/address/logic/commands/SelfEditCommand.java b/src/main/java/seedu/address/logic/commands/SelfEditCommand.java index eccf56fa4058..ed98a1f07901 100644 --- a/src/main/java/seedu/address/logic/commands/SelfEditCommand.java +++ b/src/main/java/seedu/address/logic/commands/SelfEditCommand.java @@ -35,6 +35,8 @@ public class SelfEditCommand extends Command { 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."; + public static final String ADMIN_EDIT_ERROR = "You're currently logged in as admin, not as an employee!\nAdmin" + + " cannot be edit. Perhaps you meant edit instead?"; private EditCommand.EditPersonDescriptor editPersonDescriptor; @@ -52,6 +54,10 @@ public SelfEditCommand(EditCommand.EditPersonDescriptor editPersonDescriptor) { public CommandResult runBody(Model model, CommandHistory history) throws CommandException { requireNonNull(model); + if (model.getLoggedInUser().isAdminUser()) { + throw new CommandException(ADMIN_EDIT_ERROR); + } + Person personToEdit = model.getLoggedInUser().getPerson(); Person editedPerson = EditCommand.createEditedPerson(personToEdit, editPersonDescriptor); From 4ce7728210b5cd742185362b5b045584c113073d Mon Sep 17 00:00:00 2001 From: Jeremy Choo Date: Thu, 1 Nov 2018 18:34:18 +0800 Subject: [PATCH 5/5] Added self edit command parser to address book parser --- .../java/seedu/address/logic/parser/AddressBookParser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index 499e1b042e04..9c55a42a08df 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -25,6 +25,7 @@ import seedu.address.logic.commands.PasswordCommand; import seedu.address.logic.commands.RedoCommand; import seedu.address.logic.commands.SelectCommand; +import seedu.address.logic.commands.SelfEditCommand; import seedu.address.logic.commands.UndoCommand; import seedu.address.logic.commands.ViewPermissionCommand; import seedu.address.logic.parser.exceptions.ParseException; @@ -116,6 +117,9 @@ public Command parseCommand(String userInput) throws ParseException { case ViewPermissionCommand.COMMAND_WORD: return new ViewPermissionCommandParser().parse(arguments); + case SelfEditCommand.COMMAND_WORD: + return new SelfEditCommandParser().parse(arguments); + default: throw new ParseException(MESSAGE_UNKNOWN_COMMAND); }