From f4aed83e7878a2f776f77ee89dc28cb520286a09 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Sat, 21 Oct 2023 01:00:23 +0800 Subject: [PATCH 01/15] Draft for View Command --- .../logic/commands/ViewClientCommand.java | 62 +++++++++++++++++++ .../address/logic/commands/ViewCommand.java | 31 ++++++++++ .../logic/commands/ViewLeadCommand.java | 62 +++++++++++++++++++ .../logic/parser/AddressBookParser.java | 8 +++ .../logic/parser/ViewClientCommandParser.java | 29 +++++++++ .../logic/parser/ViewLeadCommandParser.java | 29 +++++++++ src/main/java/seedu/address/model/Model.java | 25 +++++++- .../seedu/address/model/ModelManager.java | 21 +++++++ .../java/seedu/address/ui/MainWindow.java | 6 ++ src/main/java/seedu/address/ui/UiManager.java | 3 + .../seedu/address/ui/ViewClientListPanel.java | 48 ++++++++++++++ .../logic/commands/AddClientCommandTest.java | 8 +++ .../logic/commands/AddCommandTest.java | 4 ++ .../logic/commands/AddLeadCommandTest.java | 5 ++ 14 files changed, 338 insertions(+), 3 deletions(-) create mode 100644 src/main/java/seedu/address/logic/commands/ViewClientCommand.java create mode 100644 src/main/java/seedu/address/logic/commands/ViewCommand.java create mode 100644 src/main/java/seedu/address/logic/commands/ViewLeadCommand.java create mode 100644 src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java create mode 100644 src/main/java/seedu/address/logic/parser/ViewLeadCommandParser.java create mode 100644 src/main/java/seedu/address/ui/ViewClientListPanel.java diff --git a/src/main/java/seedu/address/logic/commands/ViewClientCommand.java b/src/main/java/seedu/address/logic/commands/ViewClientCommand.java new file mode 100644 index 00000000000..689a55ef5e5 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/ViewClientCommand.java @@ -0,0 +1,62 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; + +import java.util.function.Predicate; +import java.util.logging.Logger; + +import seedu.address.commons.core.LogsCenter; +import seedu.address.model.Model; +import seedu.address.model.person.Person; +import seedu.address.commons.core.index.Index; + +public class ViewClientCommand extends Command { + + public static final String COMMAND_WORD = "viewclient"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Views the client identified by the index number used in the listclient list.\n" + + "Parameters: INDEX (must be a positive integer)\n" + + "Example: " + COMMAND_WORD + " 1"; + + public static final String MESSAGE_SUCCESS = "Viewed Client Successfully"; + public static final String MESSAGE_INVALID_INDEX = "Invalid Client index"; + public static final String MESSAGE_NOT_A_CLIENT = "The person at the specified index is not a client."; + + + public static final Logger logger = LogsCenter.getLogger(ViewClientCommand.class); + + private final Index targetIndex; + + public ViewClientCommand(Index targetIndex) { + this.targetIndex = targetIndex; + } + + @Override + public CommandResult execute(Model model) { + requireNonNull(model); + + + if (targetIndex.getZeroBased() < 0) { + return new CommandResult(MESSAGE_INVALID_INDEX); + } + + Person clientToView = model.getFilteredPersonList().get(targetIndex.getZeroBased()); + + Predicate VIEW_CLIENT_PREDICATE = person -> person.equals(clientToView); + + model.updateFilteredPersonList(VIEW_CLIENT_PREDICATE); + + if (!VIEW_CLIENT_PREDICATE.test(clientToView)) { + return new CommandResult(MESSAGE_NOT_A_CLIENT); + } + + logger.info("Target Index: " + targetIndex.getZeroBased()); + logger.info("Client to View: " + clientToView); + return new CommandResult(MESSAGE_SUCCESS); + } + +} + + + diff --git a/src/main/java/seedu/address/logic/commands/ViewCommand.java b/src/main/java/seedu/address/logic/commands/ViewCommand.java new file mode 100644 index 00000000000..fd6eda074f8 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/ViewCommand.java @@ -0,0 +1,31 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; + +import seedu.address.model.Model; +import seedu.address.model.person.Person; +public class ViewCommand extends Command { + public static final String COMMAND_WORD = "view"; + + public static final String MESSAGE_SUCCESS = "View person success"; + + private final int targetIndex; + + public ViewCommand(int targetIndex) { + this.targetIndex = targetIndex; + } + + @Override + public CommandResult execute(Model model) { + requireNonNull(model); + + Person personToView = model.getPersonByIndex(targetIndex); + + if (personToView != null) { + return new CommandResult(MESSAGE_SUCCESS); + } else { + return new CommandResult("Person not found at index " + targetIndex); + } + } +} + diff --git a/src/main/java/seedu/address/logic/commands/ViewLeadCommand.java b/src/main/java/seedu/address/logic/commands/ViewLeadCommand.java new file mode 100644 index 00000000000..bf3d3c91825 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/ViewLeadCommand.java @@ -0,0 +1,62 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; + +import java.util.function.Predicate; +import java.util.logging.Logger; + +import seedu.address.commons.core.LogsCenter; +import seedu.address.model.Model; +import seedu.address.model.person.Person; +import seedu.address.commons.core.index.Index; + +public class ViewLeadCommand extends Command { + + public static final String COMMAND_WORD = "viewlead"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Views the client identified by the index number used in the listlead list.\n" + + "Parameters: INDEX (must be a positive integer)\n" + + "Example: " + COMMAND_WORD + " 1"; + + public static final String MESSAGE_SUCCESS = "Viewed Client Successfully"; + public static final String MESSAGE_INVALID_INDEX = "Invalid Client index"; + public static final String MESSAGE_NOT_A_LEAD = "The person at the specified index is not a lead."; + + + public static final Logger logger = LogsCenter.getLogger(ViewClientCommand.class); + + private final Index targetIndex; + + public ViewLeadCommand(Index targetIndex) { + this.targetIndex = targetIndex; + } + + @Override + public CommandResult execute(Model model) { + requireNonNull(model); + + + if (targetIndex.getZeroBased() < 0 || targetIndex.getZeroBased() >= model.getFilteredPersonList().size()) { + return new CommandResult(MESSAGE_INVALID_INDEX); + } + + Person leadToView = model.getFilteredPersonList().get(targetIndex.getZeroBased()); + + Predicate VIEW_LEAD_PREDICATE = person -> person.equals(leadToView); + + model.updateFilteredPersonList(VIEW_LEAD_PREDICATE); + + if (!VIEW_LEAD_PREDICATE.test(leadToView)) { + return new CommandResult(MESSAGE_NOT_A_LEAD); + } + + logger.info("Target Index: " + targetIndex.getZeroBased()); + logger.info("Client to View: " + leadToView); + return new CommandResult(MESSAGE_SUCCESS); + } + +} + + + diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index b7c6961fe01..e1bfc1ae3e3 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -20,6 +20,8 @@ import seedu.address.logic.commands.ListClientCommand; import seedu.address.logic.commands.ListCommand; import seedu.address.logic.commands.ListLeadCommand; +import seedu.address.logic.commands.ViewClientCommand; +import seedu.address.logic.commands.ViewLeadCommand; import seedu.address.logic.parser.exceptions.ParseException; /** @@ -89,6 +91,12 @@ public Command parseCommand(String userInput) throws ParseException { case ListLeadCommand.COMMAND_WORD: return new ListLeadCommand(); + case ViewClientCommand.COMMAND_WORD: + return new ViewClientCommandParser().parse(arguments); + + case ViewLeadCommand.COMMAND_WORD: + return new ViewLeadCommandParser().parse(arguments); + default: logger.finer("This user input caused a ParseException: " + userInput); throw new ParseException(MESSAGE_UNKNOWN_COMMAND); diff --git a/src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java b/src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java new file mode 100644 index 00000000000..0b8851c2808 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java @@ -0,0 +1,29 @@ +package seedu.address.logic.parser; + +import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; + +import seedu.address.commons.core.index.Index; +import seedu.address.logic.commands.ViewClientCommand; +import seedu.address.logic.parser.exceptions.ParseException; + +/** + * Parses input arguments and creates a new DeleteCommand object + */ +public class ViewClientCommandParser 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 ViewClientCommand parse(String args) throws ParseException { + try { + Index index = ParserUtil.parseIndex(args); + return new ViewClientCommand(index); + } catch (ParseException pe) { + throw new ParseException( + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewClientCommand.MESSAGE_USAGE), pe); + } + } + +} diff --git a/src/main/java/seedu/address/logic/parser/ViewLeadCommandParser.java b/src/main/java/seedu/address/logic/parser/ViewLeadCommandParser.java new file mode 100644 index 00000000000..8a49da01417 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/ViewLeadCommandParser.java @@ -0,0 +1,29 @@ +package seedu.address.logic.parser; + +import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; + +import seedu.address.commons.core.index.Index; +import seedu.address.logic.commands.ViewLeadCommand; +import seedu.address.logic.parser.exceptions.ParseException; + +/** + * Parses input arguments and creates a new DeleteCommand object + */ +public class ViewLeadCommandParser 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 ViewLeadCommand parse(String args) throws ParseException { + try { + Index index = ParserUtil.parseIndex(args); + return new ViewLeadCommand(index); + } catch (ParseException pe) { + throw new ParseException( + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewLeadCommand.MESSAGE_USAGE), pe); + } + } + +} diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index 983601c8882..d03a58f3450 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -13,7 +13,9 @@ * The API of the Model component. */ public interface Model { - /** {@code Predicate} that always evaluate to true */ + /** + * {@code Predicate} that always evaluate to true + */ Predicate PREDICATE_SHOW_ALL_PERSONS = unused -> true; /** @@ -51,7 +53,9 @@ public interface Model { */ void setAddressBook(ReadOnlyAddressBook addressBook); - /** Returns the AddressBook */ + /** + * Returns the AddressBook + */ ReadOnlyAddressBook getAddressBook(); /** @@ -82,12 +86,27 @@ public interface Model { */ void setPerson(Person target, Person editedPerson); - /** Returns an unmodifiable view of the filtered person list */ + /** + * Returns an unmodifiable view of the filtered person list + */ ObservableList getFilteredPersonList(); + /** + * Returns the person at the specified index in the filtered person list. + * + * @param index The index of the person to retrieve. + * @return The person at the specified index, or null if the index is out of bounds. + */ + Person getPersonByIndex(int index); + /** * Updates the filter of the filtered person list to filter by the given {@code predicate}. + * * @throws NullPointerException if {@code predicate} is null. */ void updateFilteredPersonList(Predicate predicate); + + void viewClient(Client clientToView); + + void viewLead(Lead clientToView); } diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index e138f7d1b9d..3e2603215b6 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -118,6 +118,19 @@ public void addLead(Lead lead) { updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); } + @Override + public void viewClient(Client clientToView) { + Predicate clientPredicate = person -> person.equals(clientToView); + updateFilteredPersonList(clientPredicate); + } + + @Override + public void viewLead(Lead clientToView) { + Predicate leadPredicate = person -> person.equals(clientToView); + updateFilteredPersonList(leadPredicate); + } + + @Override public void setPerson(Person target, Person editedPerson) { requireAllNonNull(target, editedPerson); @@ -158,5 +171,13 @@ public boolean equals(Object other) { && userPrefs.equals(otherModelManager.userPrefs) && filteredPersons.equals(otherModelManager.filteredPersons); } + @Override + public Person getPersonByIndex(int index) { + ObservableList filteredPersons = getFilteredPersonList(); + if (index >= 0 && index < filteredPersons.size()) { + return filteredPersons.get(index); + } + return null; + } } diff --git a/src/main/java/seedu/address/ui/MainWindow.java b/src/main/java/seedu/address/ui/MainWindow.java index 79e74ef37c0..bf034ae226c 100644 --- a/src/main/java/seedu/address/ui/MainWindow.java +++ b/src/main/java/seedu/address/ui/MainWindow.java @@ -13,6 +13,7 @@ import seedu.address.commons.core.GuiSettings; import seedu.address.commons.core.LogsCenter; import seedu.address.logic.Logic; +import seedu.address.model.person.Person; import seedu.address.logic.commands.CommandResult; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.exceptions.ParseException; @@ -44,6 +45,10 @@ public class MainWindow extends UiPart { @FXML private StackPane personListPanelPlaceholder; + @FXML + private StackPane clientListPanelPlaceholder; + + @FXML private StackPane resultDisplayPlaceholder; @@ -193,4 +198,5 @@ private CommandResult executeCommand(String commandText) throws CommandException throw e; } } + } diff --git a/src/main/java/seedu/address/ui/UiManager.java b/src/main/java/seedu/address/ui/UiManager.java index fdf024138bc..a5b16edcb08 100644 --- a/src/main/java/seedu/address/ui/UiManager.java +++ b/src/main/java/seedu/address/ui/UiManager.java @@ -1,5 +1,6 @@ package seedu.address.ui; + import java.util.logging.Logger; import javafx.application.Platform; @@ -11,6 +12,8 @@ import seedu.address.commons.core.LogsCenter; import seedu.address.commons.util.StringUtil; import seedu.address.logic.Logic; +import seedu.address.model.person.Client; +import seedu.address.model.person.Person; /** * The manager of the UI component. diff --git a/src/main/java/seedu/address/ui/ViewClientListPanel.java b/src/main/java/seedu/address/ui/ViewClientListPanel.java new file mode 100644 index 00000000000..7286fce0b52 --- /dev/null +++ b/src/main/java/seedu/address/ui/ViewClientListPanel.java @@ -0,0 +1,48 @@ +package seedu.address.ui; + +import java.util.logging.Logger; + +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.layout.Region; +import seedu.address.commons.core.LogsCenter; +import seedu.address.model.person.Person; + +/** + * Panel containing the list of clients. + */ +public class ViewClientListPanel extends UiPart { + private static final String FXML = "ClientListPanel.fxml"; + private final Logger logger = LogsCenter.getLogger(ViewClientListPanel.class); + + @FXML + private ListView clientListView; + + /** + * Creates a {@code ClientListPanel} with the given {@code ObservableList}. + */ + public ViewClientListPanel(ObservableList clientList) { + super(FXML); + clientListView.setItems(clientList); + clientListView.setCellFactory(listView -> new viewClientListCell()); + } + + /** + * Custom {@code ListCell} that displays the graphics of a {@code Person} using a {@code PersonCard}. + */ + class viewClientListCell extends ListCell { + @Override + protected void updateItem(Person person, boolean empty) { + super.updateItem(person, empty); + + if (empty || person == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(new PersonCard(person, getIndex() + 1).getRoot()); + } + } + } +} diff --git a/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java b/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java index 1fac9c54b19..a0730319cef 100644 --- a/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java @@ -182,6 +182,10 @@ private class ModelStubWithPerson extends ModelStub { requireNonNull(person); this.person = person; } + @Override + public Person getPersonByIndex(int index) { + return null; + } @Override public boolean hasPerson(Person person) { @@ -202,6 +206,10 @@ public boolean hasPerson(Person person) { return personsAdded.stream().anyMatch(person::isSamePerson); } + @Override + public Person getPersonByIndex(int index) { + return null; + } @Override public void addClient(Client client) { requireNonNull(client); diff --git a/src/test/java/seedu/address/logic/commands/AddCommandTest.java b/src/test/java/seedu/address/logic/commands/AddCommandTest.java index 16b3ef6914d..2bd35e8ee68 100644 --- a/src/test/java/seedu/address/logic/commands/AddCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddCommandTest.java @@ -123,6 +123,10 @@ public void setUserPrefs(ReadOnlyUserPrefs userPrefs) { throw new AssertionError("This method should not be called."); } + @Override + public Person getPersonByIndex(int index) { + return null; + } @Override public ReadOnlyUserPrefs getUserPrefs() { throw new AssertionError("This method should not be called."); diff --git a/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java b/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java index 671e897f66c..c9fbd7b93d4 100644 --- a/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java @@ -106,6 +106,11 @@ public GuiSettings getGuiSettings() { throw new AssertionError("This method should not be called."); } + @Override + public Person getPersonByIndex(int index) { + return null; + } + @Override public void setGuiSettings(GuiSettings guiSettings) { throw new AssertionError("This method should not be called."); From 11678eeb92b74600d4bc8e0eeb0b059b00b0877f Mon Sep 17 00:00:00 2001 From: yuxunn Date: Sun, 22 Oct 2023 01:24:49 +0800 Subject: [PATCH 02/15] Add view command tests --- .../logic/commands/ViewClientCommand.java | 62 ------------------- .../address/logic/commands/ViewCommand.java | 41 +++++++++--- .../logic/commands/ViewLeadCommand.java | 62 ------------------- .../logic/parser/AddressBookParser.java | 10 +-- .../logic/parser/ViewClientCommandParser.java | 29 --------- ...mandParser.java => ViewCommandParser.java} | 16 ++--- .../java/seedu/address/model/AddressBook.java | 1 - src/main/java/seedu/address/model/Model.java | 15 ++--- .../seedu/address/model/ModelManager.java | 20 +----- .../logic/commands/AddClientCommandTest.java | 27 +++----- .../logic/commands/AddCommandTest.java | 9 ++- .../logic/commands/AddLeadCommandTest.java | 10 ++- .../logic/commands/ViewCommandTest.java | 49 +++++++++++++++ 13 files changed, 115 insertions(+), 236 deletions(-) delete mode 100644 src/main/java/seedu/address/logic/commands/ViewClientCommand.java delete mode 100644 src/main/java/seedu/address/logic/commands/ViewLeadCommand.java delete mode 100644 src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java rename src/main/java/seedu/address/logic/parser/{ViewLeadCommandParser.java => ViewCommandParser.java} (59%) create mode 100644 src/test/java/seedu/address/logic/commands/ViewCommandTest.java diff --git a/src/main/java/seedu/address/logic/commands/ViewClientCommand.java b/src/main/java/seedu/address/logic/commands/ViewClientCommand.java deleted file mode 100644 index 689a55ef5e5..00000000000 --- a/src/main/java/seedu/address/logic/commands/ViewClientCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package seedu.address.logic.commands; - -import static java.util.Objects.requireNonNull; - -import java.util.function.Predicate; -import java.util.logging.Logger; - -import seedu.address.commons.core.LogsCenter; -import seedu.address.model.Model; -import seedu.address.model.person.Person; -import seedu.address.commons.core.index.Index; - -public class ViewClientCommand extends Command { - - public static final String COMMAND_WORD = "viewclient"; - - public static final String MESSAGE_USAGE = COMMAND_WORD - + ": Views the client identified by the index number used in the listclient list.\n" - + "Parameters: INDEX (must be a positive integer)\n" - + "Example: " + COMMAND_WORD + " 1"; - - public static final String MESSAGE_SUCCESS = "Viewed Client Successfully"; - public static final String MESSAGE_INVALID_INDEX = "Invalid Client index"; - public static final String MESSAGE_NOT_A_CLIENT = "The person at the specified index is not a client."; - - - public static final Logger logger = LogsCenter.getLogger(ViewClientCommand.class); - - private final Index targetIndex; - - public ViewClientCommand(Index targetIndex) { - this.targetIndex = targetIndex; - } - - @Override - public CommandResult execute(Model model) { - requireNonNull(model); - - - if (targetIndex.getZeroBased() < 0) { - return new CommandResult(MESSAGE_INVALID_INDEX); - } - - Person clientToView = model.getFilteredPersonList().get(targetIndex.getZeroBased()); - - Predicate VIEW_CLIENT_PREDICATE = person -> person.equals(clientToView); - - model.updateFilteredPersonList(VIEW_CLIENT_PREDICATE); - - if (!VIEW_CLIENT_PREDICATE.test(clientToView)) { - return new CommandResult(MESSAGE_NOT_A_CLIENT); - } - - logger.info("Target Index: " + targetIndex.getZeroBased()); - logger.info("Client to View: " + clientToView); - return new CommandResult(MESSAGE_SUCCESS); - } - -} - - - diff --git a/src/main/java/seedu/address/logic/commands/ViewCommand.java b/src/main/java/seedu/address/logic/commands/ViewCommand.java index fd6eda074f8..9b764bc9903 100644 --- a/src/main/java/seedu/address/logic/commands/ViewCommand.java +++ b/src/main/java/seedu/address/logic/commands/ViewCommand.java @@ -2,30 +2,53 @@ import static java.util.Objects.requireNonNull; +import java.util.logging.Logger; + +import seedu.address.commons.core.LogsCenter; +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.Person; + +/** + * Views specified person based on input index. + */ public class ViewCommand extends Command { + public static final String COMMAND_WORD = "view"; - public static final String MESSAGE_SUCCESS = "View person success"; + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Views the person identified by the index number used.\n" + + "Parameters: INDEX (must be a positive integer)\n" + + "Example: " + COMMAND_WORD + " 1"; + + public static final String MESSAGE_SUCCESS = "Viewed Person Successfully"; - private final int targetIndex; + private static final Logger logger = LogsCenter.getLogger(ViewCommand.class); - public ViewCommand(int targetIndex) { + private final Index targetIndex; + + public ViewCommand(Index targetIndex) { this.targetIndex = targetIndex; } @Override - public CommandResult execute(Model model) { + public CommandResult execute(Model model) throws CommandException { requireNonNull(model); - Person personToView = model.getPersonByIndex(targetIndex); - if (personToView != null) { - return new CommandResult(MESSAGE_SUCCESS); - } else { - return new CommandResult("Person not found at index " + targetIndex); + if (targetIndex.getZeroBased() < 0 || targetIndex.getZeroBased() >= model.getFilteredPersonList().size()) { + throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); } + + Person personToView = model.getFilteredPersonList().get(targetIndex.getZeroBased()); + model.view(personToView); + + logger.info("Target Index: " + targetIndex.getZeroBased()); + logger.info("Client to View: " + personToView); + return new CommandResult(MESSAGE_SUCCESS); } + } diff --git a/src/main/java/seedu/address/logic/commands/ViewLeadCommand.java b/src/main/java/seedu/address/logic/commands/ViewLeadCommand.java deleted file mode 100644 index bf3d3c91825..00000000000 --- a/src/main/java/seedu/address/logic/commands/ViewLeadCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package seedu.address.logic.commands; - -import static java.util.Objects.requireNonNull; - -import java.util.function.Predicate; -import java.util.logging.Logger; - -import seedu.address.commons.core.LogsCenter; -import seedu.address.model.Model; -import seedu.address.model.person.Person; -import seedu.address.commons.core.index.Index; - -public class ViewLeadCommand extends Command { - - public static final String COMMAND_WORD = "viewlead"; - - public static final String MESSAGE_USAGE = COMMAND_WORD - + ": Views the client identified by the index number used in the listlead list.\n" - + "Parameters: INDEX (must be a positive integer)\n" - + "Example: " + COMMAND_WORD + " 1"; - - public static final String MESSAGE_SUCCESS = "Viewed Client Successfully"; - public static final String MESSAGE_INVALID_INDEX = "Invalid Client index"; - public static final String MESSAGE_NOT_A_LEAD = "The person at the specified index is not a lead."; - - - public static final Logger logger = LogsCenter.getLogger(ViewClientCommand.class); - - private final Index targetIndex; - - public ViewLeadCommand(Index targetIndex) { - this.targetIndex = targetIndex; - } - - @Override - public CommandResult execute(Model model) { - requireNonNull(model); - - - if (targetIndex.getZeroBased() < 0 || targetIndex.getZeroBased() >= model.getFilteredPersonList().size()) { - return new CommandResult(MESSAGE_INVALID_INDEX); - } - - Person leadToView = model.getFilteredPersonList().get(targetIndex.getZeroBased()); - - Predicate VIEW_LEAD_PREDICATE = person -> person.equals(leadToView); - - model.updateFilteredPersonList(VIEW_LEAD_PREDICATE); - - if (!VIEW_LEAD_PREDICATE.test(leadToView)) { - return new CommandResult(MESSAGE_NOT_A_LEAD); - } - - logger.info("Target Index: " + targetIndex.getZeroBased()); - logger.info("Client to View: " + leadToView); - return new CommandResult(MESSAGE_SUCCESS); - } - -} - - - diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index e1bfc1ae3e3..f8d667bedf5 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -20,8 +20,7 @@ import seedu.address.logic.commands.ListClientCommand; import seedu.address.logic.commands.ListCommand; import seedu.address.logic.commands.ListLeadCommand; -import seedu.address.logic.commands.ViewClientCommand; -import seedu.address.logic.commands.ViewLeadCommand; +import seedu.address.logic.commands.ViewCommand; import seedu.address.logic.parser.exceptions.ParseException; /** @@ -91,11 +90,8 @@ public Command parseCommand(String userInput) throws ParseException { case ListLeadCommand.COMMAND_WORD: return new ListLeadCommand(); - case ViewClientCommand.COMMAND_WORD: - return new ViewClientCommandParser().parse(arguments); - - case ViewLeadCommand.COMMAND_WORD: - return new ViewLeadCommandParser().parse(arguments); + case ViewCommand.COMMAND_WORD: + return new ViewCommandParser().parse(arguments); default: logger.finer("This user input caused a ParseException: " + userInput); diff --git a/src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java b/src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java deleted file mode 100644 index 0b8851c2808..00000000000 --- a/src/main/java/seedu/address/logic/parser/ViewClientCommandParser.java +++ /dev/null @@ -1,29 +0,0 @@ -package seedu.address.logic.parser; - -import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; - -import seedu.address.commons.core.index.Index; -import seedu.address.logic.commands.ViewClientCommand; -import seedu.address.logic.parser.exceptions.ParseException; - -/** - * Parses input arguments and creates a new DeleteCommand object - */ -public class ViewClientCommandParser 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 ViewClientCommand parse(String args) throws ParseException { - try { - Index index = ParserUtil.parseIndex(args); - return new ViewClientCommand(index); - } catch (ParseException pe) { - throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewClientCommand.MESSAGE_USAGE), pe); - } - } - -} diff --git a/src/main/java/seedu/address/logic/parser/ViewLeadCommandParser.java b/src/main/java/seedu/address/logic/parser/ViewCommandParser.java similarity index 59% rename from src/main/java/seedu/address/logic/parser/ViewLeadCommandParser.java rename to src/main/java/seedu/address/logic/parser/ViewCommandParser.java index 8a49da01417..6dfe9e6aa49 100644 --- a/src/main/java/seedu/address/logic/parser/ViewLeadCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ViewCommandParser.java @@ -3,26 +3,26 @@ import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import seedu.address.commons.core.index.Index; -import seedu.address.logic.commands.ViewLeadCommand; +import seedu.address.logic.commands.ViewCommand; import seedu.address.logic.parser.exceptions.ParseException; /** - * Parses input arguments and creates a new DeleteCommand object + * Parses input arguments and creates a new ViewCommand object */ -public class ViewLeadCommandParser implements Parser { +public class ViewCommandParser implements Parser { /** - * Parses the given {@code String} of arguments in the context of the DeleteCommand - * and returns a DeleteCommand object for execution. + * Parses the given {@code String} of arguments in the context of the ViewCommand + * and returns a ViewCommand object for execution. * @throws ParseException if the user input does not conform the expected format */ - public ViewLeadCommand parse(String args) throws ParseException { + public ViewCommand parse(String args) throws ParseException { try { Index index = ParserUtil.parseIndex(args); - return new ViewLeadCommand(index); + return new ViewCommand(index); } catch (ParseException pe) { throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewLeadCommand.MESSAGE_USAGE), pe); + String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewCommand.MESSAGE_USAGE), pe); } } diff --git a/src/main/java/seedu/address/model/AddressBook.java b/src/main/java/seedu/address/model/AddressBook.java index e43f4aec194..3c755b67924 100644 --- a/src/main/java/seedu/address/model/AddressBook.java +++ b/src/main/java/seedu/address/model/AddressBook.java @@ -140,7 +140,6 @@ public boolean equals(Object other) { AddressBook otherAddressBook = (AddressBook) other; return persons.equals(otherAddressBook.persons); } - @Override public int hashCode() { return persons.hashCode(); diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index d03a58f3450..e97daf91eb9 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -91,14 +91,6 @@ public interface Model { */ ObservableList getFilteredPersonList(); - /** - * Returns the person at the specified index in the filtered person list. - * - * @param index The index of the person to retrieve. - * @return The person at the specified index, or null if the index is out of bounds. - */ - Person getPersonByIndex(int index); - /** * Updates the filter of the filtered person list to filter by the given {@code predicate}. * @@ -106,7 +98,8 @@ public interface Model { */ void updateFilteredPersonList(Predicate predicate); - void viewClient(Client clientToView); - - void viewLead(Lead clientToView); + /** + * Updates the filter of the filtered person list to just the specified person {@code predicate}. + */ + void view(Person clientToView); } diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index 3e2603215b6..35789924b67 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -117,20 +117,11 @@ public void addLead(Lead lead) { addressBook.addLead(lead); updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); } - @Override - public void viewClient(Client clientToView) { - Predicate clientPredicate = person -> person.equals(clientToView); - updateFilteredPersonList(clientPredicate); - } - - @Override - public void viewLead(Lead clientToView) { + public void view(Person clientToView) { Predicate leadPredicate = person -> person.equals(clientToView); updateFilteredPersonList(leadPredicate); } - - @Override public void setPerson(Person target, Person editedPerson) { requireAllNonNull(target, editedPerson); @@ -171,13 +162,4 @@ public boolean equals(Object other) { && userPrefs.equals(otherModelManager.userPrefs) && filteredPersons.equals(otherModelManager.filteredPersons); } - @Override - public Person getPersonByIndex(int index) { - ObservableList filteredPersons = getFilteredPersonList(); - if (index >= 0 && index < filteredPersons.size()) { - return filteredPersons.get(index); - } - return null; - } - } diff --git a/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java b/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java index a0730319cef..e00a41583b0 100644 --- a/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddClientCommandTest.java @@ -110,7 +110,6 @@ public GuiSettings getGuiSettings() { public void setGuiSettings(GuiSettings guiSettings) { throw new AssertionError("This method should not be called."); } - @Override public Path getAddressBookFilePath() { throw new AssertionError("This method should not be called."); @@ -170,6 +169,11 @@ public ObservableList getFilteredPersonList() { public void updateFilteredPersonList(Predicate predicate) { throw new AssertionError("This method should not be called."); } + + @Override + public void view(Person personToView) { + throw new AssertionError("This method should not be called."); + } } /** @@ -182,11 +186,6 @@ private class ModelStubWithPerson extends ModelStub { requireNonNull(person); this.person = person; } - @Override - public Person getPersonByIndex(int index) { - return null; - } - @Override public boolean hasPerson(Person person) { requireNonNull(person); @@ -200,22 +199,16 @@ public boolean hasPerson(Person person) { private class ModelStubAcceptingClientAdded extends ModelStub { final ArrayList personsAdded = new ArrayList<>(); - @Override - public boolean hasPerson(Person person) { - requireNonNull(person); - return personsAdded.stream().anyMatch(person::isSamePerson); - } - - @Override - public Person getPersonByIndex(int index) { - return null; - } @Override public void addClient(Client client) { requireNonNull(client); personsAdded.add(client); } - + @Override + public boolean hasPerson(Person person) { + requireNonNull(person); + return personsAdded.stream().anyMatch(person::isSamePerson); + } @Override public ReadOnlyAddressBook getAddressBook() { return new AddressBook(); diff --git a/src/test/java/seedu/address/logic/commands/AddCommandTest.java b/src/test/java/seedu/address/logic/commands/AddCommandTest.java index 2bd35e8ee68..61e44ccd13f 100644 --- a/src/test/java/seedu/address/logic/commands/AddCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddCommandTest.java @@ -122,11 +122,6 @@ private class ModelStub implements Model { public void setUserPrefs(ReadOnlyUserPrefs userPrefs) { throw new AssertionError("This method should not be called."); } - - @Override - public Person getPersonByIndex(int index) { - return null; - } @Override public ReadOnlyUserPrefs getUserPrefs() { throw new AssertionError("This method should not be called."); @@ -201,6 +196,10 @@ public ObservableList getFilteredPersonList() { public void updateFilteredPersonList(Predicate predicate) { throw new AssertionError("This method should not be called."); } + @Override + public void view(Person personToView) { + throw new AssertionError("This method should not be called."); + } } /** diff --git a/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java b/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java index c9fbd7b93d4..a7774e6542d 100644 --- a/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddLeadCommandTest.java @@ -105,12 +105,6 @@ public ReadOnlyUserPrefs getUserPrefs() { public GuiSettings getGuiSettings() { throw new AssertionError("This method should not be called."); } - - @Override - public Person getPersonByIndex(int index) { - return null; - } - @Override public void setGuiSettings(GuiSettings guiSettings) { throw new AssertionError("This method should not be called."); @@ -175,6 +169,10 @@ public ObservableList getFilteredPersonList() { public void updateFilteredPersonList(Predicate predicate) { throw new AssertionError("This method should not be called."); } + @Override + public void view(Person personToView) { + throw new AssertionError("This method should not be called."); + } } /** diff --git a/src/test/java/seedu/address/logic/commands/ViewCommandTest.java b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java new file mode 100644 index 00000000000..0b4bb8d939c --- /dev/null +++ b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java @@ -0,0 +1,49 @@ +package seedu.address.logic.commands; + +import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex; +import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import seedu.address.commons.core.index.Index; +import seedu.address.logic.Messages; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.person.Person; +import seedu.address.model.UserPrefs; + +/** + * Contains integration tests (interaction with the Model) and unit tests for ListCommand. + */ +public class ViewCommandTest { + + private Model model; + private Model expectedModel; + + @BeforeEach + public void setUp() { + model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + } + + @Test + public void execute_invalidIndex_throwsCommandException() { + Index outOfBoundIndex = Index.fromOneBased(model.getFilteredPersonList().size() + 1); + ViewCommand viewCommand = new ViewCommand(outOfBoundIndex); + + assertCommandFailure(viewCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); + } + + @Test + public void execute_validIndexViewPerson_success() { + ViewCommand viewCommand = new ViewCommand(INDEX_FIRST_PERSON); + String expectedMessage = String.format(ViewCommand.MESSAGE_SUCCESS); + Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + Person personToView = model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased()); + expectedModel.view(personToView); + assertCommandSuccess(viewCommand, model, expectedMessage, expectedModel); + } +} From 4e1abcccbe89a71452eb417b77ebad21818346bd Mon Sep 17 00:00:00 2001 From: yuxunn Date: Sun, 22 Oct 2023 01:29:11 +0800 Subject: [PATCH 03/15] Fix checkstyle --- .../java/seedu/address/ui/MainWindow.java | 1 - src/main/java/seedu/address/ui/UiManager.java | 2 - .../seedu/address/ui/ViewClientListPanel.java | 48 ------------------- 3 files changed, 51 deletions(-) delete mode 100644 src/main/java/seedu/address/ui/ViewClientListPanel.java diff --git a/src/main/java/seedu/address/ui/MainWindow.java b/src/main/java/seedu/address/ui/MainWindow.java index bf034ae226c..c0a14a5569b 100644 --- a/src/main/java/seedu/address/ui/MainWindow.java +++ b/src/main/java/seedu/address/ui/MainWindow.java @@ -13,7 +13,6 @@ import seedu.address.commons.core.GuiSettings; import seedu.address.commons.core.LogsCenter; import seedu.address.logic.Logic; -import seedu.address.model.person.Person; import seedu.address.logic.commands.CommandResult; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.exceptions.ParseException; diff --git a/src/main/java/seedu/address/ui/UiManager.java b/src/main/java/seedu/address/ui/UiManager.java index a5b16edcb08..dd26e9dde76 100644 --- a/src/main/java/seedu/address/ui/UiManager.java +++ b/src/main/java/seedu/address/ui/UiManager.java @@ -12,8 +12,6 @@ import seedu.address.commons.core.LogsCenter; import seedu.address.commons.util.StringUtil; import seedu.address.logic.Logic; -import seedu.address.model.person.Client; -import seedu.address.model.person.Person; /** * The manager of the UI component. diff --git a/src/main/java/seedu/address/ui/ViewClientListPanel.java b/src/main/java/seedu/address/ui/ViewClientListPanel.java deleted file mode 100644 index 7286fce0b52..00000000000 --- a/src/main/java/seedu/address/ui/ViewClientListPanel.java +++ /dev/null @@ -1,48 +0,0 @@ -package seedu.address.ui; - -import java.util.logging.Logger; - -import javafx.collections.ObservableList; -import javafx.fxml.FXML; -import javafx.scene.control.ListCell; -import javafx.scene.control.ListView; -import javafx.scene.layout.Region; -import seedu.address.commons.core.LogsCenter; -import seedu.address.model.person.Person; - -/** - * Panel containing the list of clients. - */ -public class ViewClientListPanel extends UiPart { - private static final String FXML = "ClientListPanel.fxml"; - private final Logger logger = LogsCenter.getLogger(ViewClientListPanel.class); - - @FXML - private ListView clientListView; - - /** - * Creates a {@code ClientListPanel} with the given {@code ObservableList}. - */ - public ViewClientListPanel(ObservableList clientList) { - super(FXML); - clientListView.setItems(clientList); - clientListView.setCellFactory(listView -> new viewClientListCell()); - } - - /** - * Custom {@code ListCell} that displays the graphics of a {@code Person} using a {@code PersonCard}. - */ - class viewClientListCell extends ListCell { - @Override - protected void updateItem(Person person, boolean empty) { - super.updateItem(person, empty); - - if (empty || person == null) { - setGraphic(null); - setText(null); - } else { - setGraphic(new PersonCard(person, getIndex() + 1).getRoot()); - } - } - } -} From 13da0812f98eaa5d12cbeb9a504369aa03c12fd5 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Sun, 22 Oct 2023 01:32:18 +0800 Subject: [PATCH 04/15] Fix checkstyle --- .../java/seedu/address/logic/commands/ViewCommandTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/ViewCommandTest.java b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java index 0b4bb8d939c..acb8ef2c8d4 100644 --- a/src/test/java/seedu/address/logic/commands/ViewCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java @@ -2,9 +2,9 @@ import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -12,8 +12,8 @@ import seedu.address.logic.Messages; import seedu.address.model.Model; import seedu.address.model.ModelManager; -import seedu.address.model.person.Person; import seedu.address.model.UserPrefs; +import seedu.address.model.person.Person; /** * Contains integration tests (interaction with the Model) and unit tests for ListCommand. From fc6916b986c02ac046ab52f48877ef35ce612ea2 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Sun, 22 Oct 2023 02:30:26 +0800 Subject: [PATCH 05/15] Add parser test --- .../address/logic/commands/ViewCommand.java | 13 ++++++++++ .../logic/parser/ViewCommandParserTest.java | 24 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java diff --git a/src/main/java/seedu/address/logic/commands/ViewCommand.java b/src/main/java/seedu/address/logic/commands/ViewCommand.java index 9b764bc9903..a91ca30c413 100644 --- a/src/main/java/seedu/address/logic/commands/ViewCommand.java +++ b/src/main/java/seedu/address/logic/commands/ViewCommand.java @@ -49,6 +49,19 @@ public CommandResult execute(Model model) throws CommandException { logger.info("Client to View: " + personToView); return new CommandResult(MESSAGE_SUCCESS); } + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (other == null || getClass() != other.getClass()) { + return false; + } + + ViewCommand that = (ViewCommand) other; + return targetIndex.equals(that.targetIndex); + } } diff --git a/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java new file mode 100644 index 00000000000..e1145fe9a21 --- /dev/null +++ b/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java @@ -0,0 +1,24 @@ +package seedu.address.logic.parser; + +import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; + +import org.junit.jupiter.api.Test; + +import seedu.address.commons.core.index.Index; +import seedu.address.logic.commands.ViewCommand; +public class ViewCommandParserTest { + private ViewCommandParser parser = new ViewCommandParser(); + + @Test + public void parse_emptyArg_throwsParseException() { + assertParseFailure(parser, " ", String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewCommand.MESSAGE_USAGE)); + } + @Test + public void parse_validArgs_returnsViewCommand() { + ViewCommand expectedViewCommand = new ViewCommand(Index.fromOneBased(2)); + assertParseSuccess(parser, "2", expectedViewCommand); + } + +} From 4763ecadee940411991d449b5a5b367d7133ca3c Mon Sep 17 00:00:00 2001 From: yuxunn Date: Sun, 22 Oct 2023 02:36:10 +0800 Subject: [PATCH 06/15] Add parser test --- .../java/seedu/address/logic/parser/ViewCommandParserTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java index e1145fe9a21..8e915b1efd4 100644 --- a/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java @@ -17,8 +17,7 @@ public void parse_emptyArg_throwsParseException() { } @Test public void parse_validArgs_returnsViewCommand() { - ViewCommand expectedViewCommand = new ViewCommand(Index.fromOneBased(2)); - assertParseSuccess(parser, "2", expectedViewCommand); + assertParseSuccess(parser, "2", new ViewCommand(Index.fromOneBased(2))); } } From 1e0ccf7dbef07dbda099acc80b795c86ccd1af1f Mon Sep 17 00:00:00 2001 From: yuxunn Date: Tue, 24 Oct 2023 18:36:46 +0800 Subject: [PATCH 07/15] Add CSS to view --- .../address/logic/commands/CommandResult.java | 11 ++- .../address/logic/commands/ExitCommand.java | 2 +- .../address/logic/commands/HelpCommand.java | 2 +- .../address/logic/commands/ListCommand.java | 1 + .../address/logic/commands/ViewCommand.java | 5 +- .../java/seedu/address/ui/MainWindow.java | 59 +++++++++++++- .../java/seedu/address/ui/ViewWindow.java | 74 ++++++++++++++++++ src/main/resources/images/profile.png | Bin 0 -> 14456 bytes src/main/resources/images/smartphone-call.png | Bin 0 -> 2820 bytes src/main/resources/view/MainWindow.fxml | 2 +- src/main/resources/view/ViewWindow.css | 21 +++++ src/main/resources/view/ViewWindow.fxml | 73 +++++++++++++++++ 12 files changed, 241 insertions(+), 9 deletions(-) create mode 100644 src/main/java/seedu/address/ui/ViewWindow.java create mode 100644 src/main/resources/images/profile.png create mode 100644 src/main/resources/images/smartphone-call.png create mode 100644 src/main/resources/view/ViewWindow.css create mode 100644 src/main/resources/view/ViewWindow.fxml diff --git a/src/main/java/seedu/address/logic/commands/CommandResult.java b/src/main/java/seedu/address/logic/commands/CommandResult.java index 249b6072d0d..984905acf57 100644 --- a/src/main/java/seedu/address/logic/commands/CommandResult.java +++ b/src/main/java/seedu/address/logic/commands/CommandResult.java @@ -19,13 +19,16 @@ public class CommandResult { /** The application should exit. */ private final boolean exit; + private String state; + /** * Constructs a {@code CommandResult} with the specified fields. */ - public CommandResult(String feedbackToUser, boolean showHelp, boolean exit) { + public CommandResult(String feedbackToUser, boolean showHelp, boolean exit, String state) { this.feedbackToUser = requireNonNull(feedbackToUser); this.showHelp = showHelp; this.exit = exit; + this.state = state; } /** @@ -33,7 +36,7 @@ public CommandResult(String feedbackToUser, boolean showHelp, boolean exit) { * and other fields set to their default value. */ public CommandResult(String feedbackToUser) { - this(feedbackToUser, false, false); + this(feedbackToUser, false, false, "null"); } public String getFeedbackToUser() { @@ -48,6 +51,10 @@ public boolean isExit() { return exit; } + public String checkState() { + return state; + } + @Override public boolean equals(Object other) { if (other == this) { diff --git a/src/main/java/seedu/address/logic/commands/ExitCommand.java b/src/main/java/seedu/address/logic/commands/ExitCommand.java index 3dd85a8ba90..a1eb8126c9d 100644 --- a/src/main/java/seedu/address/logic/commands/ExitCommand.java +++ b/src/main/java/seedu/address/logic/commands/ExitCommand.java @@ -13,7 +13,7 @@ public class ExitCommand extends Command { @Override public CommandResult execute(Model model) { - return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true); + return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true, "exit"); } } diff --git a/src/main/java/seedu/address/logic/commands/HelpCommand.java b/src/main/java/seedu/address/logic/commands/HelpCommand.java index bf824f91bd0..b33639d6e34 100644 --- a/src/main/java/seedu/address/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/address/logic/commands/HelpCommand.java @@ -16,6 +16,6 @@ public class HelpCommand extends Command { @Override public CommandResult execute(Model model) { - return new CommandResult(SHOWING_HELP_MESSAGE, true, false); + return new CommandResult(SHOWING_HELP_MESSAGE, true, false, "help"); } } diff --git a/src/main/java/seedu/address/logic/commands/ListCommand.java b/src/main/java/seedu/address/logic/commands/ListCommand.java index 84be6ad2596..dcdf8ceb3df 100644 --- a/src/main/java/seedu/address/logic/commands/ListCommand.java +++ b/src/main/java/seedu/address/logic/commands/ListCommand.java @@ -14,6 +14,7 @@ public class ListCommand extends Command { public static final String MESSAGE_SUCCESS = "Listed all persons"; + public static final String state = "list"; @Override public CommandResult execute(Model model) { diff --git a/src/main/java/seedu/address/logic/commands/ViewCommand.java b/src/main/java/seedu/address/logic/commands/ViewCommand.java index a91ca30c413..d0f2eb2e1ac 100644 --- a/src/main/java/seedu/address/logic/commands/ViewCommand.java +++ b/src/main/java/seedu/address/logic/commands/ViewCommand.java @@ -17,6 +17,8 @@ public class ViewCommand extends Command { public static final String COMMAND_WORD = "view"; + public static final String state = "view"; + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Views the person identified by the index number used.\n" @@ -39,6 +41,7 @@ public CommandResult execute(Model model) throws CommandException { if (targetIndex.getZeroBased() < 0 || targetIndex.getZeroBased() >= model.getFilteredPersonList().size()) { + logger.info(targetIndex.getZeroBased() + "+ " + model.getFilteredPersonList().size()); throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); } @@ -47,7 +50,7 @@ public CommandResult execute(Model model) throws CommandException { logger.info("Target Index: " + targetIndex.getZeroBased()); logger.info("Client to View: " + personToView); - return new CommandResult(MESSAGE_SUCCESS); + return new CommandResult(MESSAGE_SUCCESS, false, false, "view"); } @Override public boolean equals(Object other) { diff --git a/src/main/java/seedu/address/ui/MainWindow.java b/src/main/java/seedu/address/ui/MainWindow.java index c0a14a5569b..c8ffa5591de 100644 --- a/src/main/java/seedu/address/ui/MainWindow.java +++ b/src/main/java/seedu/address/ui/MainWindow.java @@ -2,6 +2,7 @@ import java.util.logging.Logger; +import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.MenuItem; @@ -9,10 +10,14 @@ import javafx.scene.input.KeyCombination; import javafx.scene.input.KeyEvent; import javafx.scene.layout.StackPane; +import javafx.stage.Modality; import javafx.stage.Stage; +import javafx.scene.Scene; import seedu.address.commons.core.GuiSettings; +import seedu.address.model.person.Person; import seedu.address.commons.core.LogsCenter; import seedu.address.logic.Logic; +import javafx.stage.StageStyle; import seedu.address.logic.commands.CommandResult; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.exceptions.ParseException; @@ -28,12 +33,17 @@ public class MainWindow extends UiPart { private final Logger logger = LogsCenter.getLogger(getClass()); private Stage primaryStage; + private Logic logic; // Independent Ui parts residing in this Ui container private PersonListPanel personListPanel; private ResultDisplay resultDisplay; private HelpWindow helpWindow; + private ViewWindow viewWindow; + @FXML + private StackPane viewWindowPlaceholder; + @FXML private StackPane commandBoxPlaceholder; @@ -64,14 +74,15 @@ public MainWindow(Stage primaryStage, Logic logic) { this.primaryStage = primaryStage; this.logic = logic; + // Configure the UI setWindowDefaultSize(logic.getGuiSettings()); setAccelerators(); - helpWindow = new HelpWindow(); } + public Stage getPrimaryStage() { return primaryStage; } @@ -109,7 +120,6 @@ private void setAccelerator(MenuItem menuItem, KeyCombination keyCombination) { } }); } - /** * Fills up all the placeholders of this window. */ @@ -166,7 +176,40 @@ private void handleExit() { helpWindow.hide(); primaryStage.hide(); } + @FXML + public void handleView(Person selectedPerson, int displayedIndex) { + logger.info("handleView"); + showViewWindow(selectedPerson, displayedIndex); + } + + + private void showViewWindow(Person selectedPerson, int displayedIndex) { + try { + if (viewWindow != null && viewWindowPlaceholder != null) { + clearViewContent(); + viewWindowPlaceholder.getChildren().add(viewWindow.getRoot()); + personListPanelPlaceholder.setVisible(false); + personListPanelPlaceholder.setManaged(false); + viewWindowPlaceholder.setVisible(true); + viewWindowPlaceholder.setManaged(true); + } else { + + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void clearViewContent() { + viewWindowPlaceholder.getChildren().clear(); + } + private void hideViewWindow() { + if (viewWindow != null && viewWindowPlaceholder != null) { + viewWindowPlaceholder.setVisible(false); + personListPanelPlaceholder.setVisible(true); + } + } public PersonListPanel getPersonListPanel() { return personListPanel; } @@ -177,9 +220,11 @@ public PersonListPanel getPersonListPanel() { * @see seedu.address.logic.Logic#execute(String) */ private CommandResult executeCommand(String commandText) throws CommandException, ParseException { + try { CommandResult commandResult = logic.execute(commandText); logger.info("Result: " + commandResult.getFeedbackToUser()); + logger.info("reached here: " + logic.getFilteredPersonList()); resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser()); if (commandResult.isShowHelp()) { @@ -190,6 +235,15 @@ private CommandResult executeCommand(String commandText) throws CommandException handleExit(); } + if (commandResult.checkState().equals("view")) { + ObservableList allPersons = logic.getFilteredPersonList(); + Person selectedPerson = allPersons.get(0); + viewWindow = new ViewWindow(selectedPerson, 1); + + handleView(selectedPerson, 0); + } else { + hideViewWindow(); + } return commandResult; } catch (CommandException | ParseException e) { logger.info("An error occurred while executing command: " + commandText); @@ -197,5 +251,4 @@ private CommandResult executeCommand(String commandText) throws CommandException throw e; } } - } diff --git a/src/main/java/seedu/address/ui/ViewWindow.java b/src/main/java/seedu/address/ui/ViewWindow.java new file mode 100644 index 00000000000..e369529a1c0 --- /dev/null +++ b/src/main/java/seedu/address/ui/ViewWindow.java @@ -0,0 +1,74 @@ +package seedu.address.ui; + +import java.util.Comparator; +import java.util.logging.Logger; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Region; +import seedu.address.commons.core.LogsCenter; +import seedu.address.logic.commands.ViewCommand; +import seedu.address.model.person.Person; + +/** + * An UI component that displays information of a {@code Person}. + */ +public class ViewWindow extends UiPart { + + private static final String FXML = "ViewWindow.fxml"; + + /** + * Note: Certain keywords such as "location" and "resources" are reserved keywords in JavaFX. + * As a consequence, UI elements' variable names cannot be set to such keywords + * or an exception will be thrown by JavaFX during runtime. + * + * @see The issue on AddressBook level 4 + */ + + public final Person person; + + @FXML + private HBox cardPane; + @FXML + private Label name; + @FXML + private Label id; + @FXML + private Label phone; + @FXML + private Label address; + @FXML + private Label email; + @FXML + private FlowPane tags; + + @FXML + private Label otherInfo; + private static final Logger logger = LogsCenter.getLogger(ViewWindow.class); + + /** + * Creates a {@code PersonCode} with the given {@code Person} and index to display. + */ + public ViewWindow(Person person, int displayedIndex) { + super(FXML); + this.person = person; + id.setText(displayedIndex + "."); + name.setText(person.getName().fullName); + phone.setText(person.getPhone().value); + address.setText(person.getAddress().value); + email.setText(person.getEmail().value); + + Label label = new Label(person.getType().value); + if (person.isClient()) { + label.getStyleClass().add("client-label"); + } else { + label.getStyleClass().add("lead-label"); + } + tags.getChildren().add(label); + person.getTags().stream() + .sorted(Comparator.comparing(tag -> tag.tagName)) + .forEach(tag -> tags.getChildren().add(new Label(tag.tagName))); + } +} diff --git a/src/main/resources/images/profile.png b/src/main/resources/images/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e07c6ff3e5e499d9342b045f5cdf7d78709e51 GIT binary patch literal 14456 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index 7778f666a0a..fe26539cff4 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -51,8 +51,8 @@ + - diff --git a/src/main/resources/view/ViewWindow.css b/src/main/resources/view/ViewWindow.css new file mode 100644 index 00000000000..c71e4002ea8 --- /dev/null +++ b/src/main/resources/view/ViewWindow.css @@ -0,0 +1,21 @@ +#cardPane { + -fx-background-color: #FBFBD4; +} +.label { + -fx-font-family: "Arial"; + -fx-font-size: 18px; +} +.cell_big_label { + -fx-font-size: 24px; + -fx-font-weight: bold; + -fx-text-fill: #666; + -fx-padding: 10px; +} + + +.cell_small_label { + -fx-font-size: 18px; + -fx-text-fill: #999; + -fx-padding: 5px; +} + diff --git a/src/main/resources/view/ViewWindow.fxml b/src/main/resources/view/ViewWindow.fxml new file mode 100644 index 00000000000..a15fd59f4ea --- /dev/null +++ b/src/main/resources/view/ViewWindow.fxml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 16e3922479b31cac80877efd3cfd8ff7cb928722 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Tue, 24 Oct 2023 21:02:46 +0800 Subject: [PATCH 08/15] Fix Checkstyle --- .../address/logic/commands/ListCommand.java | 3 - .../address/logic/commands/ViewCommand.java | 6 +- .../java/seedu/address/ui/MainWindow.java | 9 +-- .../java/seedu/address/ui/ViewWindow.java | 6 +- src/main/resources/images/application.png | Bin 0 -> 7142 bytes src/main/resources/images/email.png | Bin 0 -> 10763 bytes src/main/resources/images/home-address.png | Bin 0 -> 10572 bytes src/main/resources/view/DarkTheme.css | 2 +- src/main/resources/view/ViewWindow.css | 9 +-- src/main/resources/view/ViewWindow.fxml | 64 +++++++++++------- 10 files changed, 58 insertions(+), 41 deletions(-) create mode 100644 src/main/resources/images/application.png create mode 100644 src/main/resources/images/email.png create mode 100644 src/main/resources/images/home-address.png diff --git a/src/main/java/seedu/address/logic/commands/ListCommand.java b/src/main/java/seedu/address/logic/commands/ListCommand.java index dcdf8ceb3df..aa067bfdb54 100644 --- a/src/main/java/seedu/address/logic/commands/ListCommand.java +++ b/src/main/java/seedu/address/logic/commands/ListCommand.java @@ -13,9 +13,6 @@ public class ListCommand extends Command { public static final String COMMAND_WORD = "list"; public static final String MESSAGE_SUCCESS = "Listed all persons"; - - public static final String state = "list"; - @Override public CommandResult execute(Model model) { requireNonNull(model); diff --git a/src/main/java/seedu/address/logic/commands/ViewCommand.java b/src/main/java/seedu/address/logic/commands/ViewCommand.java index d0f2eb2e1ac..d50fb94fbfa 100644 --- a/src/main/java/seedu/address/logic/commands/ViewCommand.java +++ b/src/main/java/seedu/address/logic/commands/ViewCommand.java @@ -17,7 +17,9 @@ public class ViewCommand extends Command { public static final String COMMAND_WORD = "view"; - public static final String state = "view"; + + public static final String MESSAGE_SUCCESS = "Viewed Person Successfully"; + private static final String state = "view"; public static final String MESSAGE_USAGE = COMMAND_WORD @@ -25,8 +27,6 @@ public class ViewCommand extends Command { + "Parameters: INDEX (must be a positive integer)\n" + "Example: " + COMMAND_WORD + " 1"; - public static final String MESSAGE_SUCCESS = "Viewed Person Successfully"; - private static final Logger logger = LogsCenter.getLogger(ViewCommand.class); private final Index targetIndex; diff --git a/src/main/java/seedu/address/ui/MainWindow.java b/src/main/java/seedu/address/ui/MainWindow.java index c8ffa5591de..1eaac307bd5 100644 --- a/src/main/java/seedu/address/ui/MainWindow.java +++ b/src/main/java/seedu/address/ui/MainWindow.java @@ -10,17 +10,14 @@ import javafx.scene.input.KeyCombination; import javafx.scene.input.KeyEvent; import javafx.scene.layout.StackPane; -import javafx.stage.Modality; import javafx.stage.Stage; -import javafx.scene.Scene; import seedu.address.commons.core.GuiSettings; -import seedu.address.model.person.Person; import seedu.address.commons.core.LogsCenter; import seedu.address.logic.Logic; -import javafx.stage.StageStyle; import seedu.address.logic.commands.CommandResult; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Person; /** * The Main Window. Provides the basic application layout containing @@ -176,6 +173,10 @@ private void handleExit() { helpWindow.hide(); primaryStage.hide(); } + + /** + * Handles the View Command. + */ @FXML public void handleView(Person selectedPerson, int displayedIndex) { logger.info("handleView"); diff --git a/src/main/java/seedu/address/ui/ViewWindow.java b/src/main/java/seedu/address/ui/ViewWindow.java index e369529a1c0..21e8f6317d7 100644 --- a/src/main/java/seedu/address/ui/ViewWindow.java +++ b/src/main/java/seedu/address/ui/ViewWindow.java @@ -9,7 +9,6 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Region; import seedu.address.commons.core.LogsCenter; -import seedu.address.logic.commands.ViewCommand; import seedu.address.model.person.Person; /** @@ -27,6 +26,8 @@ public class ViewWindow extends UiPart { * @see The issue on AddressBook level 4 */ + private static final Logger logger = LogsCenter.getLogger(ViewWindow.class); + public final Person person; @FXML @@ -46,7 +47,6 @@ public class ViewWindow extends UiPart { @FXML private Label otherInfo; - private static final Logger logger = LogsCenter.getLogger(ViewWindow.class); /** * Creates a {@code PersonCode} with the given {@code Person} and index to display. @@ -54,7 +54,7 @@ public class ViewWindow extends UiPart { public ViewWindow(Person person, int displayedIndex) { super(FXML); this.person = person; - id.setText(displayedIndex + "."); + //id.setText(displayedIndex + "."); name.setText(person.getName().fullName); phone.setText(person.getPhone().value); address.setText(person.getAddress().value); diff --git a/src/main/resources/images/application.png b/src/main/resources/images/application.png new file mode 100644 index 0000000000000000000000000000000000000000..97a86c459ea94b60b97793608ae4b987bec5a6f1 GIT binary patch literal 7142 zcmeHLX;f3ovhD+e{4O|9NRE!t?qs()+d*zCz(w;^7Y)%Uo{TxPccc3%M3@G-7EZ=czq_*P zBoTLSex~yXoyQD^A$7NXaJraQke-I+Ok;SF z#bSt(EDWW^P_!+R^u$|`?aa6py!i6(VbgorI;oh_hcw|ci0wG0mebrc(h6BYt+Vpe z=$41lFs1ibgf}6zT&e2Sw!-6Zh)eY9w1a7M55L|T?kH4)2zkvlgv%>g{R-CtT*f}` z^6m|AE^5Fw`7?zUd6=TtzABDBPwnK@RJvu4IVRVd)$d*(k%w*c6h%fY;T)IUNw)zBH+?F9^!U=admll{~4Fch3dOo4^Ga^Ze)E+r%ja$fqLi0j) zZD^o4n)Qj${;0Y)$Y5coLTd^pCAfL z=vtte_WLj&aSoB@&H=_Q;nBXsfvq#h70Y<`xZXK&?lfjPme(#`HF8y;)u`QryM&^o=p zicX8tecC`VN`E5pQWK0uUhs_bIH>LR>1^L^#e@RRrQdqltYkiYM30eyR8~DuycNEK zlW~kZ;k-l60xK(wlN#{BHyE`;hNs6e_PO4eXdKKvGci9ye6mYiESbYSZzdV+g5G&q zZRSesha_HC2=6Z$PYxKZv~}WLhyBz0&#v7@m45p0qPIq*!dZcE$pP z8mu5UJSuNdJ;(hA2Ev>lneCY2A0Xh88YqRKKg8M-v$@mY>TO}ZsmHJPRci_Fh&Cwf zlzwW)Demxr?}A#jTojLZcPq1OgFxvgcNs3n{kp++al^}=7FCt!lG?uWE3rUDhF4OY zO=`yEzhdWPm>&N*LSO!+_LhZt@5qBI@Qm|uPN^Az@S)u?0m{MBPYoNcU}pGaTD5Al za8D#2w*p^rnv7O~A<$i{+#Bo_B`0T!m6%~%Q0Zdl{plJyKfQ1kMcE{xb*mDuTDO6_z zki7=KHkNGyfT8gJLjUiA{~QH)RO(IzSnIz8-PKtarbUdp|2AMYB)fqThLqk-VUWz{l-c&UaVwK8ZFQ3Hs|$*f50#x{K9%zu2+vOVo$e zG|fbk3zKHtn)%|xrdEzwm-MjUrjwg#yS{<2f#-F{D=LaPM+s^46;+!*({ZeB3ak1X zrWrm;j=9nKz*KP~(>L|s4!o8Vnse!bQp7=5)YsFP^j?PM@ zdv|;p4mh|pgx;Fz+6SY;b0^b5}$s& zIJ>QwEM~Vj&oRZ^Y_OJ&=jBE`8dE}*-RAvJieAj^zi#uE)u3*5itt%vz)_Nsb-Hl8 zOlG(1L$Vo`oC1TW`z#0aDpZH~X7#blvk%lEl@x(xjsDqKAL1}SGZiCLt>pRjNs;9AZSl6e z{k3ilHR<7L*sNg3vB^&ta;4h7d4X^>OL(H8`&?T)p5v68W77`lRs6y8+JY e8^k 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 QLM8~WcUgCPE%n&{06NEgA^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/images/email.png b/src/main/resources/images/email.png new file mode 100644 index 0000000000000000000000000000000000000000..3fed7b8e8e2ddef1d19d477b93ad0efabcd8de35 GIT binary patch literal 10763 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 WUSEed{ov&zL^icCd16Gl_J06)G|f){ literal 0 HcmV?d00001 diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index bfb1cab2a8d..ed71cf5383e 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -338,7 +338,7 @@ } #tags { - -fx-hgap: 7; + -fx-hgap: 10; -fx-vgap: 3; } diff --git a/src/main/resources/view/ViewWindow.css b/src/main/resources/view/ViewWindow.css index c71e4002ea8..22664d187b5 100644 --- a/src/main/resources/view/ViewWindow.css +++ b/src/main/resources/view/ViewWindow.css @@ -1,21 +1,22 @@ #cardPane { -fx-background-color: #FBFBD4; } + .label { -fx-font-family: "Arial"; -fx-font-size: 18px; + -fx-text-fill: black; } + .cell_big_label { -fx-font-size: 24px; -fx-font-weight: bold; - -fx-text-fill: #666; + -fx-text-fill: black; -fx-padding: 10px; } - .cell_small_label { -fx-font-size: 18px; - -fx-text-fill: #999; + -fx-text-fill: black; -fx-padding: 5px; } - diff --git a/src/main/resources/view/ViewWindow.fxml b/src/main/resources/view/ViewWindow.fxml index a15fd59f4ea..c92ec2447b7 100644 --- a/src/main/resources/view/ViewWindow.fxml +++ b/src/main/resources/view/ViewWindow.fxml @@ -11,6 +11,7 @@ + @@ -18,56 +19,73 @@ - + - - - - - - - - - - - + \ No newline at end of file From 041cd7ad03c516d1b8ecd3c6c15a1c335f622ee0 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Tue, 24 Oct 2023 21:07:43 +0800 Subject: [PATCH 09/15] Fix Checkstyle --- src/main/resources/view/MainWindow.fxml | 2 +- src/main/resources/view/ViewWindow.fxml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index fe26539cff4..19bf72caec4 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -53,7 +53,7 @@ - + diff --git a/src/main/resources/view/ViewWindow.fxml b/src/main/resources/view/ViewWindow.fxml index c92ec2447b7..b078982cfca 100644 --- a/src/main/resources/view/ViewWindow.fxml +++ b/src/main/resources/view/ViewWindow.fxml @@ -88,4 +88,4 @@ - \ No newline at end of file + From 01acabf0f8012c01738fac8a202d10bd6eeb12d3 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Tue, 24 Oct 2023 21:15:04 +0800 Subject: [PATCH 10/15] Fix Checkstyle --- .../address/logic/commands/CommandResultTest.java | 10 +++++----- .../seedu/address/logic/commands/ExitCommandTest.java | 2 +- .../seedu/address/logic/commands/HelpCommandTest.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/CommandResultTest.java b/src/test/java/seedu/address/logic/commands/CommandResultTest.java index 7b8c7cd4546..bc66589d8a0 100644 --- a/src/test/java/seedu/address/logic/commands/CommandResultTest.java +++ b/src/test/java/seedu/address/logic/commands/CommandResultTest.java @@ -14,7 +14,7 @@ public void equals() { // same values -> returns true assertTrue(commandResult.equals(new CommandResult("feedback"))); - assertTrue(commandResult.equals(new CommandResult("feedback", false, false))); + assertTrue(commandResult.equals(new CommandResult("feedback", false, false,"feedback"))); // same object -> returns true assertTrue(commandResult.equals(commandResult)); @@ -29,10 +29,10 @@ public void equals() { assertFalse(commandResult.equals(new CommandResult("different"))); // different showHelp value -> returns false - assertFalse(commandResult.equals(new CommandResult("feedback", true, false))); + assertFalse(commandResult.equals(new CommandResult("feedback", true, false, "help"))); // different exit value -> returns false - assertFalse(commandResult.equals(new CommandResult("feedback", false, true))); + assertFalse(commandResult.equals(new CommandResult("feedback", false, true, "exit"))); } @Test @@ -46,10 +46,10 @@ public void hashcode() { assertNotEquals(commandResult.hashCode(), new CommandResult("different").hashCode()); // different showHelp value -> returns different hashcode - assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", true, false).hashCode()); + assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", true, false, "help").hashCode()); // different exit value -> returns different hashcode - assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", false, true).hashCode()); + assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", false, true, "exit").hashCode()); } @Test diff --git a/src/test/java/seedu/address/logic/commands/ExitCommandTest.java b/src/test/java/seedu/address/logic/commands/ExitCommandTest.java index 9533c473875..b432a8d7c81 100644 --- a/src/test/java/seedu/address/logic/commands/ExitCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ExitCommandTest.java @@ -14,7 +14,7 @@ public class ExitCommandTest { @Test public void execute_exit_success() { - CommandResult expectedCommandResult = new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true); + CommandResult expectedCommandResult = new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT, false, true, "exit"); assertCommandSuccess(new ExitCommand(), model, expectedCommandResult, expectedModel); } } diff --git a/src/test/java/seedu/address/logic/commands/HelpCommandTest.java b/src/test/java/seedu/address/logic/commands/HelpCommandTest.java index 4904fc4352e..bae0e1cd3b8 100644 --- a/src/test/java/seedu/address/logic/commands/HelpCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/HelpCommandTest.java @@ -14,7 +14,7 @@ public class HelpCommandTest { @Test public void execute_help_success() { - CommandResult expectedCommandResult = new CommandResult(SHOWING_HELP_MESSAGE, true, false); + CommandResult expectedCommandResult = new CommandResult(SHOWING_HELP_MESSAGE, true, false, "help"); assertCommandSuccess(new HelpCommand(), model, expectedCommandResult, expectedModel); } } From 7236d762bf7d2fd37ed54a550800be10c6b38956 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Tue, 24 Oct 2023 21:17:13 +0800 Subject: [PATCH 11/15] Fix Checkstyle --- .../java/seedu/address/logic/commands/CommandResultTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/seedu/address/logic/commands/CommandResultTest.java b/src/test/java/seedu/address/logic/commands/CommandResultTest.java index bc66589d8a0..9321c28b86f 100644 --- a/src/test/java/seedu/address/logic/commands/CommandResultTest.java +++ b/src/test/java/seedu/address/logic/commands/CommandResultTest.java @@ -14,7 +14,7 @@ public void equals() { // same values -> returns true assertTrue(commandResult.equals(new CommandResult("feedback"))); - assertTrue(commandResult.equals(new CommandResult("feedback", false, false,"feedback"))); + assertTrue(commandResult.equals(new CommandResult("feedback", false, false, "feedback"))); // same object -> returns true assertTrue(commandResult.equals(commandResult)); From d9745ff34a7898c96cbc628dffd9e5f18b06997d Mon Sep 17 00:00:00 2001 From: yuxunn Date: Tue, 24 Oct 2023 23:19:49 +0800 Subject: [PATCH 12/15] Add tests --- .../logic/commands/CommandResultTest.java | 24 +++++++++++++++++++ .../logic/commands/ViewCommandTest.java | 18 ++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/test/java/seedu/address/logic/commands/CommandResultTest.java b/src/test/java/seedu/address/logic/commands/CommandResultTest.java index 9321c28b86f..36849f13d5e 100644 --- a/src/test/java/seedu/address/logic/commands/CommandResultTest.java +++ b/src/test/java/seedu/address/logic/commands/CommandResultTest.java @@ -51,6 +51,30 @@ public void hashcode() { // different exit value -> returns different hashcode assertNotEquals(commandResult.hashCode(), new CommandResult("feedback", false, true, "exit").hashCode()); } + @Test + public void stateTest() { + CommandResult commandResult = new CommandResult("feedback", true, false, "view"); + assertEquals("view", commandResult.checkState()); + } + + @Test + public void notEqualsTest() { + CommandResult commandResult1 = new CommandResult("feedback", true, true, "view"); + CommandResult commandResult2 = new CommandResult("differentFeedback", true, true, "help"); + assertNotEquals(commandResult1, commandResult2); + } + @Test + public void defaultConstructorTest() { + CommandResult commandResult = new CommandResult("feedback"); + assertFalse(commandResult.isShowHelp()); + assertFalse(commandResult.isExit()); + assertEquals("null", commandResult.checkState()); + } + @Test + public void hashCodeConsistencyTest() { + CommandResult commandResult = new CommandResult("feedback", true, false, "state"); + assertEquals(commandResult.hashCode(), commandResult.hashCode()); + } @Test public void toStringMethod() { diff --git a/src/test/java/seedu/address/logic/commands/ViewCommandTest.java b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java index acb8ef2c8d4..837ba1a9ceb 100644 --- a/src/test/java/seedu/address/logic/commands/ViewCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java @@ -1,5 +1,7 @@ package seedu.address.logic.commands; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; @@ -29,6 +31,21 @@ public void setUp() { expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); } + @Test + public void equals() { + Index index1 = Index.fromOneBased(1); + Index index2 = Index.fromOneBased(2); + + ViewCommand viewCommand1 = new ViewCommand(index1); + ViewCommand viewCommand2 = new ViewCommand(index2); + + assertTrue(viewCommand1.equals(viewCommand1)); + + assertFalse(viewCommand1.equals(viewCommand2)); + + assertFalse(viewCommand1.equals(5)); + } + @Test public void execute_invalidIndex_throwsCommandException() { Index outOfBoundIndex = Index.fromOneBased(model.getFilteredPersonList().size() + 1); @@ -47,3 +64,4 @@ public void execute_validIndexViewPerson_success() { assertCommandSuccess(viewCommand, model, expectedMessage, expectedModel); } } + From 69cfd20f2f8f32b7352d4991175cef6987819e62 Mon Sep 17 00:00:00 2001 From: yuxunn Date: Wed, 25 Oct 2023 00:53:36 +0800 Subject: [PATCH 13/15] Add test --- .../logic/parser/AddressBookParserTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index a89cb239f61..c3b56840fdf 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -15,6 +15,7 @@ import org.junit.jupiter.api.Test; +import seedu.address.commons.core.index.Index; import seedu.address.logic.commands.AddClientCommand; import seedu.address.logic.commands.AddLeadCommand; import seedu.address.logic.commands.ClearCommand; @@ -24,7 +25,10 @@ import seedu.address.logic.commands.ExitCommand; import seedu.address.logic.commands.FindCommand; import seedu.address.logic.commands.HelpCommand; +import seedu.address.logic.commands.ListClientCommand; import seedu.address.logic.commands.ListCommand; +import seedu.address.logic.commands.ListLeadCommand; +import seedu.address.logic.commands.ViewCommand; import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.person.Client; import seedu.address.model.person.Lead; @@ -120,4 +124,19 @@ public void parseCommand_unrecognisedInput_throwsParseException() { public void parseCommand_unknownCommand_throwsParseException() { assertThrows(ParseException.class, MESSAGE_UNKNOWN_COMMAND, () -> parser.parseCommand("unknownCommand")); } + + @Test + public void parseCommand_view() throws Exception { + ViewCommand command = (ViewCommand) parser.parseCommand( + ViewCommand.COMMAND_WORD + " " + 3); + assertEquals(new ViewCommand(Index.fromOneBased(3)), command); + } + @Test + public void parseCommand_listClient() throws Exception { + assertTrue(parser.parseCommand(ListClientCommand.COMMAND_WORD) instanceof ListClientCommand); + } + @Test + public void parseCommand_listLead() throws Exception { + assertTrue(parser.parseCommand(ListLeadCommand.COMMAND_WORD) instanceof ListLeadCommand); + } } From 54b7f5d1e9400c2a12d5276686118add7dab0867 Mon Sep 17 00:00:00 2001 From: LicongHuang Date: Wed, 25 Oct 2023 20:06:48 +0800 Subject: [PATCH 14/15] Update UserGuide --- docs/UserGuide.md | 20 ++++++++++++++++---- docs/images/List.png | Bin 0 -> 32606 bytes docs/images/Listclient.png | Bin 0 -> 22490 bytes docs/images/Listlead.png | Bin 0 -> 22351 bytes 4 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 docs/images/List.png create mode 100644 docs/images/Listclient.png create mode 100644 docs/images/Listlead.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 811b15aa0ce..6620620756f 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -67,11 +67,17 @@ Here are some descriptions of the words we use throughout the User Guide: - Command: `listclient`. - Precise expected outputs when the command succeeds: +In output section of the `List of all clients` -- Precise expected outputs when the command fails: +

Examples of usage:

-`Failed to view all clients. Please enter a valid command` +
+ +

List of leads and clients

+ +

After using listclient command

+
### View all leads @@ -81,9 +87,15 @@ Here are some descriptions of the words we use throughout the User Guide: `List of all leads` -- Precise expected outputs when the command fails: +

Example usage:

+ +
+ +

List of leads and clients

+ +

After using listlead command

+
-`Failed to view all leads. Please enter a valid command` ### Delete lead [Coming soon] diff --git a/docs/images/List.png b/docs/images/List.png new file mode 100644 index 0000000000000000000000000000000000000000..11630bf84337ed139360f37bfabdba0c6d356f4d GIT binary patch literal 32606 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 literal 0 HcmV?d00001 diff --git a/docs/images/Listlead.png b/docs/images/Listlead.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2e14200b5b0232ecf57209b713a0fba04c3f51 GIT binary patch literal 22351 zcmeFZXH-<#)-Fu9ZDFB3VIl(l$U5C1thMHv^O?_l=6-fpU6KAU z>tQ-NI(n4SEiF2_U#H<;okIuU8%3?2Wcbf-ZhxS34#7YEhb*4L|FgK?HgMN=vU2w_ zceSLmc64&E6m+}qYH8`{X5-|(w69(sek6$e=%%Zsxx1~C<2fB$2TMAAON(__l zDt8?pJuE`cf>rG~1!H(P=2k<>DjA&6+ZdHS{f_(g9hHh>%`dse2nu-28B5BWma$i| zj=WPZ=NIpNzVoEns=R;n3UXd#!>eZwHMT7r?A)*AmY> zf4+Pz^sxS+4{Y$$T(KwI+=D4@2G1R|q$3@bM2_xN4QH)slxlik9{u?P%kz3T*5HAx z#I|nkNiu5fV(C;CCf>Xv)tB!$TtKq?)^9_nzVpQ--o^-d@Fox}S%Wog55f_;-KHx? z#hyQpVl%`JQ`}hh2vHq_Oz^#TTsCh)d-k_)f5L~*&lgaxRVK)vbQ1DcL+aIRkS<`- z_SELPEEMzT0bl7vx}wO56DMSw=8((sC^THLs2n=Y%9@|AXW%W%F)=Zb_vX!AjtES~ zc%GJGT~A)`h00SL+;LVj`_eJ8S6a>@)~4=~ZOg~Ur)+L+t{beGcda%!B!r)juSF(9 zmAwzwU{#`Ydp}=*d2UV{AM>x$bad}|+wPU*-UvEy_;5b8@%)V&Hv*3|{Ns;5ax+*x z&ID^#GgDqYUNk?zPM3e`&aWl+ zJ=Xj5`GthkYdjaa;i2<|>vy%ZW@uN{5+ya^7P{uljZHJ=rW_9U6gZn@5Y;<0I7_aJ1HEVABjSS1__rcy9w zXC)kUXw*G1-!+>;biElzgkrF{P2&p|RuPM*8;c|y{aNu`?HqN>kCnm>0!*R7^k=i- zU%U2rF);MOlKUaUj+Kkmb3!EN2KvEj51d|sL0VnF&g@K1N`KnTkTPomhumtL=!&;2 zWxkYP5ud$zn?)`DTHcz8TBBWjHf3|E`0H1LLNmNkwr##fihR77eaxevpmOKYKT-zi z4hc|)V}9JC?DF?64_K$5u-U3{7f^gcLj6&^+Sj}mO`QHzSe909sQPqNnl9>oe6~>i zt}Cp+-RQ?B${HHPaCVt%f4-*^a~w9v%geJP*H&S%*r=G8Y|V^2&7;oKYdspogPi`~ z7Mfzk6;ClU+kgM`4911cyc5Q1JO8z0u*xmxlIrVoIX!ucq?$Q+guXAYF0PaPmUty4 z4HCp1x{)pL{rf#9G)zvh8=SP)^`qxC=_DI%bCR;**7gg7 z<;rSm(XA8R>9<3{b$B#$$0}h5%WN;=`tnmSR6~Z4jE{l-w%TzU3q$+FLq@(d>Ctf=5*cQ zK&-g#Hn@>%PUKnHZoGz z#H1ib(AW-)U0Gc{Mu$SoQlti@q@)x}jQDFW)vkt5b|m3`*>@nABKbuoZa8Xmvm#m;Q%uKC2iBccFR zERacbx8?kWoi4n)7_IR6^JiPwFuvdZI@t2KKf$Ta&}-NwM5t=~MEmQjH#sr8C3hk? z3O7eE=s9AszJ-NFT-^7vvNFCQol9b3x<{CWdQa<{q%q2GU02xs5d<4fU1s50*jWj6 zO-)VT-Q}k8fE~|?sVSUsr6Yu%mM>pAVfUHMRK>qoSGry~@WANJpMN2HnM2O^%e|86 zj0kxxu+h!W98LBx49TPpWiO#TfrmTYISO+x^Qo3;6?0eAw1W;Z3RS}N$FG4I3mTQ> zemuBruN89Z`oV`HLijZ;mf*DFI!gX9Hi}y%X1Zd?u?M_kj$x_Q%rlVzjank5JNp9omxI|dHfT=RzDJal~^-{s4luwItsM&MZmBAPN* zJ7hGlQCMuc&*~(MB~YuNn3Cd$t$+xQt8nm$zydDu+x*<)^R^0qzA*x2H}g<80Zn7F=9h zIv7nZx^Gd(Po2u7ZPKVI>FMcFuU{LC(nhzs4_yBSLG3Uj0_Ki(wgnJ*dL1ZO{75df2W?UJ5!OHpx- zGFPm>M8@;)K7a9|whQ{HiKsSTsYUBy+&PXPPXqk&Wx=y`#yv*Hsl=en zeMSp~9a_+XxU8(Kyz4S&%hYEgnp!IecXjUmVSjz|wzKmaqcWQ`*i|i~&RgzkIqFHh z)gJb+i`Zp6cP(Qc^_DGmcHR|p7}S}WnQ3Wl)dug?S70b=X>D!4M_Gr}&7Ww2*}jX0 zIpg8tn$F8f?zS(+XFoZ@%u(r3YSr$(gx}0pOAxmVcN%zmTSIpFF_@iwX)mixS9Oj1 zOgcomyH0i6*$0lENfmb(`~ubi?w~X6X1tV}Ro2{hxcCp^B+=AFwMWO<*}1AX{tzQ0 z@qUC{HiT#-inGf3mLaZ6-^}NBlC(#+sTXO2(9LgoCiu~#M|`^??JJxq3UeHyRxh-) zw61y18-%e*X+_9Wa{st_69#r|V8Ii^a1ybCkHwAPsH(ou2!IFsR-Dzrd7?19txXlb^*uB?d8E`@gI#Y-2Gi$IV!$W2 z2p&x5Ed21-Aaf(j-@~H>^qR}QToJ_D9&o%qQt6a3SZ<%wo*+TXsyMx7O@dFtUInPg zOAzdpRa9is>JW1w3_DhZ9^ulrmE3%t<#cL&PDqGa<~pGqmz{U@eq*l}Z{K%9^+7O+ z&dyGeCZX!-3#e|&`kcl)4BYs)_tND!3=n+>!wG( zJ~V@nY}=DPgKTdtEi9PjH#vO+gIvzQtsCIa)(y-*?;37C+JB@sONF^TQA#`5TnQVv zx2`X@-m5*~=>^w$-~2&IRdub`>$q;ozyrI1w@4=N_U&8uAKyOI-@0CCOA6T8=nG<$ z&#iKsvYYA7dj9O0CM;ESWMl@Qd*Y1=7-X))$lg1{J3alD9LJ)~e_K3C=}J_eLa+2~ zQ1f?Sdq}%azvSeDoqj#_$k&itaNCF4$A6KdJAL{zubiCRIpSCFY^k1m-2FdY98W?^ zf2wHEzwv>eW}PKxYY|9{gV|66bUkAqussUv{R zt4D*+?vj4`BjrCK7o(&5e{uHzJJKR^j53eLllNRY@TeLM_oXU(V}mhMPPYC}-{j7+er4 zT=%Z!?u@e}B8=Aw zVPMB{6&jY_X>M*Niw7N`*D^6ld|O&te(&?)02t%MqEoq%nCrNb$HJg4z#7VAf>W8t zoL-7urGWrUM~LtGY*w~fLd!KZZXO={uJqf0k0nP5jm&i~N~JyYrdD%jr+xzqn#FB~ z+#0HMDjssIQG;YIiYts&Ou4vrPF5gM9TY^WmA|w~WdCFKwfISeF1DRV$GS$~I^038YYvmoY{v36?i7=~o z1J>n(0t-s+H`z_JM8`{e*u{-0{#uLRbfsYPX_!aiNex*9T6hyoy+@z0irGb(1+44h zmmANL$0SJZkwrC&(uF2fT5x?VR~Uz!5vkgvN0cC&L8ETgW0g6d`U7(jkngdxvA}xu z-mN&pX~>CZ!X(I@g_UF@$D>r8Bo~U2wTC<-I#3;+D7Vfx<%WWujZH3B^OYAOO#!AN zB6hu(7Y0gmRBfU&w^yfdKyU&4+2A-U?Vh_aKQKn0fdxN(1HVc3lPB@>^W#iR0s0u# z`B!;WR9EO&C)V{FCK1MNVSZlU;C*{4hBA{=J)4hPgP4tQ5J=1~2X-dK%V(xDEl5jS zTg+!=+;s}9ysy^BZE4eCu&fKqtZgO-3Y(gzXZ=HDiAJ*6a&x@{e>{F(Xi@4v$k!)lu%1hNhtIl|u)2sfP_ zt||qrp>H{YWT3tq^Lf+L(;`g-1)6_~-4Qs$)6+BVKKM`Rxq?#vYU-_@i|2D8MbT1$ z2aH2UqmYogIX|E+o=`Zv45(_hi4!B>CLkc7ill-}!e#~VB_9uuBG4Aq0EIljE&$^b zhBm&K4UIKL5P|j3f$<@yrqFhCI;7_W+LPssflhnt#S;nJ(FTF#u=~pVw_Q=)#!mPw z@Pdkfin}3C@R;sAPtPK93-Li3_lL@CBN5{1h;Z%Qv*Hi#hB66WbNPO&inPcYpx38~ z7(q^PilWEgcAad*IF01Or5Rt2A7K)>%-pG>tbFS9=`0petEd5X3vhnE(`g~&u2r>7 zo=fDyfl_PxwdpS3wJt@=5`$}iW&<_`tgC0T6Rvs8>Hs`1RHfDLZ6q)WnN06dA+6|o z!6J%4_n!mfvIU?Dcsv_0sP4p9gp&a8We0Ey%N5(21+!%^*I$TR-+RBgG_tfR8Bo|m zBxFecJ_ivi*xB5s4PZ#aog@&;t6W7wZzEP!qU=4u%OzSny1Pg_E9@9+j6L7{a`e^s@|(Y7IM+Xi{(q#Uk3S^*#9|cdGgx!hESZ{K zudDC`@AF!&9AybMjPIoV9og@q!w*j?{ui)HFzWBTH~2V^9dN~8gU$buyf*wv{}U@n z%KrUC&fX?}fB4h;`R_l|+;7e&e}b3m|0#F=rx8%TFGtDzeeKz2O=GWy#$u*&QymMN zeBo|%(-F_yD-}g#+kT?Szdnxr_Uh!EVv<}8ftNsy8#yJryZoqL&>K~`8juwV3k_) zHSYi78qv;QxbO!;qA!WSEu5d@A_F=L^>EUj)2V<1dFAWMAst^^;V6 zZh;J!-?Gn*WI^zy-6Tye9oP6mFSf(fU9Ub60>$!9K)jekeko-=lH|DQH$rvJln=Gl zG}lZkxSMLr=t+)_Ar^M`dX+3-{}*#CQ|X-lO|x`^$0U zz$wyL1ulHJA!L1cUJA-K(T!#S(J?~Cmm-?93kMU#ZPRf@tQj5FiD{|l5=%=5=3=sMCwlXm028;^Y*0$9F$xCG-h|~v~G5xpripK8IuyY zJ;97$>uwz^_p5ZQS!YV}v0`>gxD=K!-6l#Xcx&oWWg--?w@$R{O#SP`U|F8tLVLV; zUyp`dR%6)Nx%NtO_o{GhYHh7-yZ`v{Bu}FnRw9C0tMz$Ar`Km@aYb10$PJ<#nl3IS zTr)&82EjjK_dYq}w~H%l9d0goLM1|fuD>{zs}Sl<9yXZx18Ymg?FpEC&zjl68mAO4 z-XhIJtk?XHstx<%y#%&!HZ?z+>Pph)T>nfSPfBNW#+{jxrj%S4HCTvTV;+y|fUu?U z+B||3_Y#SB%H7m`2iJy*>u1`8tYd7^5Uke$MN3uKZ#p8BOD+si*#ygl`#kHm0JR>N z2Egjk6N~i$es3u$ev7~N{Tz^o*1@$OKb#E(m@KWVVq{`p#ia?UwF;q{TU%F)_T)d# zxaULKA!esC>0(Rz0aV_Vr<|(^ir=v=Pwp>kx{)Gh&{fgNZ|L z(FDqvhmY*DA6ZTY798N0pX*zbqV9pUd^-h^Mn(mS(h=&OIq5X`l7~hvS_)jV?$YJf zOJ*KR{e^8VHKd|&c4?cTjfHg`L!W(=P5mV^eA$C-*VCs?ZJE>nrLz*wKHHNMakL>f zq8psWH$@Mo&K>Sc`RIG;-^Ywqu)b^4MS;(r&4Rg9su4vAy^5SvSVl=Bn1$Y4m14T_3?J-Zo;wGf&X0#;F&Tz-Cb4cyFQ->MK&n#1=~@| zY^&Y6*(p$X5u>e3E#0qLd^5s5} z%kMt$N(Y90e3kthi z8Oh0FD#VC-b>X&zIl1Jd$P7k>-CTw{u;6r zUujeKBg=5T(5cj5Zglrd7gJ8-twl-4vl(?CtGMY@Rxv8P?Dq zq1=+%eqwj#cy?2hS-LTLuhPUZf@6me>l*Wp8x^}IYue!J)ql3NPW!>F*LRXgrd}Pi z2)6yVS^cg2=x1HyN9JI;-lG#0p(vN7BCbs1Y1YR4BKJ;B!$+3mb}|OH`P%$Qbh$Zy zbmo%I7nYz?G2U5iZ_dPRI9D-5cO(yeuff?gNmnsiqp&NOU7f4?3JaT*K?!>}%3Z`stFjH033*If~(k7|B^W7ffqvwHZs_DHfViH&7quk1yB&JZKeRj!Xh{0mI z@koc>Eu}ZEM?!mxZ~7PZ{y%ruSFdKkV^Y3fsuR|4bZlngV+rm~snWS^O#JfB<}Irl z)c|{5e{xZwxOGstDVBh1-b2U8b5WXtGI(ZbMRf*3l}$T)kM$LLapQ7;OWHmWCgRz&e>)$#)=yh3S&Qkn+&2W2 z?H(UKrOVnTT8v##{DSIdZf>&2gd!)Qga2jgf{>S*(o0>Yp1Wq6E>8k{>u9w`h}$~% z1E6WXBNw7+Aez=#pq>hoK778{f|Lq+m&8LA-@RqfnS00O^L#~j!ig!+)nexsIzmOu z++`ch2j@S`@1=x3e``Vwu+LRkoZ;om%~1Yzl?q1=nUr&MDmZiX+A0xT2iE?&IQq^( z7ChK2KNs`qC^9n0-0OwHF5B%ag)A&`_B-Nz_r@(+N^NiNk?P5dK*c`1u0JP=+@YVnL=+vb*)dsxFSkwB*V{ZeY(pObV`GDa)zxj!m+IrE6JSl z4_-fdaASh9w-PEG?f1^T*agVZ%o{Lc8#Y45Lqfwk&$C^+$7KurB(L0|YXZb(7jsBiOF~;iVRz356PV+1F`#o5LBu?Ctmw7&*mNy+%B85JJ+P z=tzIoGjFlR%Pvm-`*+rS7n6%i2u`@>`svVVsU$2H2*#Q?lJbDoyalwTR$yQ> zY^2hQb6sI7Q6%7T@L+2n>)Eq7)JYzjd0l;8Y3b^=Dz^@KMa@^Q1}mNFO@v}Ek*;bI zsS8fzRSkvpOyGPo%GR#keylj1$HPIano1svB^-mf&IvY3xd8x;Rn)3%QjS)uS8R3> z)zZZ#@g*$#qAipYJE?R zT2H<%ZhZG*Dq7q%6RObHd|Kql_nQWHdzkRz7^=%0excuZtv*7b%VVr5TE=U>oR`HXH7XFq>#W;&HQKF&_QKNJ~x znw`CHYs(v@<>**6zoB4Vdh_PZ33q8-9i8O_q%_!9J{M>7);(|Y>-)dzd`n2u%OXR>B)<$uiz#DbaUW)}) z1O>G1bp@Omo6jb@(U5u3IxQQ`c-MZa}EL2&&=dG%GyjJ zBFPadO52zx;S34#Q-ygqbfStlMDJ`WNG`k^o9V2>AE0N;oqlceS?ooRo12yX*AA;v z+aKS!tO$T5?+U^e41NB*%zeO> zBV;0Cu%)`?Be6fl4ojOKD!Q4^f36HCI-IOi ztc;!atXYhcHS|)izPU-FJ>;5+NpR}tIl{~f93y>tIv?KahIv{yBS+NGnBGp0x^~D0 zdu{z?HuL!G#kx85iShC2h6wrmfrCFCas20Nr;oD9T)1M9Ogra}z zn#W|E>8X?Kg%kXB8yu~|mtPJo^tbfkbnf1z1b2GO5&4Oucbmf5%VA9H((Ye|>R_yZ z>Ye1aKaIT|T995S^91~z0U2JlnVcWrH31#0yKjyOsXWq3$wPz6`Rc;AUjvH|;jcu^qx_VEwqB9Pq|>cugI9_`VR_=U9K zIT!il$a?d~C)mtSpX!j}2CV*RCf59?Kb#lH_@Nks$iD zK~Azn4tV?8GPXA%JMV-(>WP?PfgV7GDv~3M2rN_}RMXSf5NZbyn!R3C+ARQDfQxG*)*LNZPwq~W4 zz;{tp8{j(7soh)l#eF%U%%Fe(p$MO#pxP8YN5R5SPEIr;crJ}VXGmv z)E*55?L`jo&BQ0nW~qewEiJ&?K?fK>G4KXBWM-7shG(6e}pib(cxfhKe3cx$#v%)$_){JuHw zli{+^<0e;0Hi`#P$neB>%irJTVJa7A2ht*`cvl}%TdGP{t8Bi}tjk(ZqF9}Vqhs9q z40TZf*mzLs@eCtReGVm5sj~efiy$=U@S&WRegVFttNW=w`tOpS-qOx*$52{{5F-biwV-Y{QAY+vwik<;+@i+ z5XK-4&&{1C@H`GEtbyX+EUBilj!HSp4l^_vfh^o$nN42j%VUL7QTZ3yBNz#EdB(w69^Lzm5VJn+xTelEMi9mB7wfHBwR`jrSkH`b1{xGGq6gVDK>*MTvXVx8>%Qw_TRnAz4SG0E$E9OkIgh}GnZnAE7%t%MWPBZ{{_C>?+E62PdJ?eJJ?UL^Rzba_q$J** zXlhx3+Jyqz=f*}o-z4)h&m$uAU-spbczG?YiY{Kfs0-SW)YNlO5Htd{FS(E{LCik; z$D1p_NN7W`xo?&LYIrsO+V1Wiys!~gc_h=W+~5=kQxR|jQlX)UGboM`;O)`44KSy- z(g}^L&~P-i};QHQAPs1IS1ji9eV3eSExxJZP0Yq`Ztx3WSIbt)MLT<3FKEM|*J2P5)_32`GA0 z(6^&6Sm$9MhNsw}wEh_SEv(Kpii`Jxh*ssWdn8*GgB)YcTh0okdfAMaAz{m1wd^}<<4l!Q z>D+8TLIQ)MEyKspr7pd`a)V#Lu>ar@CMB%z=4=*#^65!qr^ud}C>>U=rP?`1sU-EV z>hFiu>UMQ4oFYUmzD!Rm_h-KO44Go>}}8{D67uno}Ikpy^m4@ z6rCffdZv`1KwO#N&liiy%)9}G?pza+gS6H~_K&mJ# zTS&b@S#IKt-fI#Tt?M;qfsEoqP-MQGUvgYr-scodQICv=j)hJplMqE`@5GKBh_#UQ z0%fW1$N_rRFMzdQWKgryAQ*?NuACyiNkh-(&Bx0J_~O9NJP)$WO-@o^!-Sl%H*BUM_FT<`R zet7XhA*Qr!rNX%G-V=#T>Tav>Tcbkq^#BWY_tnXE|3#;nx0XLE*$(90NC57iKYdE< z+%hh=%L3+-Vl~my9UohK7fPYEDt7&WJB9G@m-F0tRY1L6{$OCmE`Z@Qu$M^cqgvu0m9KH;+EkI#A(0frJS>QtTD_E6B?A`t_@%Bx&AKATZcGo4oyc+9Fid?+xB?s2x(Km3^S6TV_<}Wo)^*ic4 zoW4ppy<$Bmc^8hz%td&N!uVSXX5^DW;SBub-1AmpVK@J|eg}~-1x&G2;^vfA688H& zsiY1O`wo@oDyL3atm5l4`X6x`(gMbrU&ON}Mj?DEJ-hTcp;}q_n)7vxpvhWZj37EK zPdnR&I_H$@Hr4TV|NfaBk2$VwsuUYkl}J)E4B!auC=H_HE6aa9yXaUoa|xvdQwBX3 zW+c}hHKfP^7&S@Sv-c6Bf{vbE%w}xSkNY1zZh603S)uJdDR}Ek*;vTHu0<>`62V5*4xUu7T~wpd@ug_)2F$S4+GDM>FzMH zbv~r-ttGv+xYTw)Xfj_bx1P+2O6JZVx5$$vuq`R zy0-h{?G&UJNbAOpzmPQPQ(eG1@PXtjMm^O_uO)8?##eT(v54B8GQf;f=x!XVIl#b{ z8jaIOR70TtH=;EhKw;z~UxJ1|=%8q?`1u?4G-?f39*D-@4m=pd+j~W?7ntF*yBBzI zq6b3z_#&DvLO5I~f#i>^P(9||+Cq;algf;C-ud(AkunnWJs_<=D2$Nko1q1)&Zuip z{-FC3xqauZ`E9cQDjEUa7Zs0gb|{5Ber)qKD|Qy7k$gmX$d5pUnK@T{7HxH)W|hVI z%N2jdFVw}QyZz@u+uS|1f%je4c`2ymHYHa~9Pw`0S^pR+oPRr%iHxt+_s9Ri%!pSC z*jeiWfvHCB;_sCs+3HEsGXn#qmbnxK{ycY<4v4Lkh0T$2|Lwz|2%c*SO8}+AVL^0V zdRq{_RllI~_RSDJfr2&Wm;6HYs!*k>Vc0FRP zxH)ypZGl;-PWH(r2Q1+a+ZzCYOO9JFXf)lCfck|!qWAmrCB;1fA{i&RqVYyUHyb082E-s)K@p#3Xr9*tL(fRphab@Atwu+@iU3 zw@andVI6EhodL}P`X=?}H=iuXQwSIkUGw9qg9<<@{48QnKSjzD-2~7@RsRF#Pwj0^ za|+kF4=)4CjWUmtU$T0gZDEwDKpjBTraB&leN6rzHzS@u*Yfs$2jmZK{Y`eUm8`5O zTF~%&kMZ^U_wJnn*5SpA7kpmlUn%c125lHPs$H#``W+lUHNQq$0XO?JJX}x7`Hk0P zZ3VbLkRySnwrA&0VQ{+T(UJi>L+&9BX=toh%Y*LjvmKW49-HYG^4uFYzRG>sn+f3z zT$B2t>qU=1tc|4+bmZIF%=+r@#nrgg(){p(0)hHXA6crmI8ux<@DTqgM@^jHy&7a@ zz4KF8kjwhdn*UzZ^?Ik--ou-$#cgE=Iq#;B@q3;$=z7Ditf)X@8ev&F04-AbGu!p~ zvw@2+Gr1U#x1p{54nt9KaWif^ucyyE`FeBL6BBBiuW6FlcHgX^2MD*Yx)o(;&p`yk z8!wNYj*YVEO4lfN9}uZ0)z@8n>UhrYDZZ{1E_YoF9)V`pjCFM~C^Ha1#JuCnHUu*M zbX{(fVb!-BLNh>Ti>Y|aAb;?>Y#hQ24D(yAl}8lMf^ z`rs!Ey?0~9c)cWu1V)`>-{1O<&vxgQUqhTjXx(dWibmn{h#fK}}~YJK7*M?I6g z$bSOIV&n$$sI_l zyn}6?tzB1om6`AMX~2(lEh*+|jZj;8D1CTZQS|7|$V;R&U7S9WM7-i6`S*lX-~axb zT9tKvCDi^G+&9O00cz;nyN6awyz=4fdz>_8PEcZQ3}~7zMH-v|#a2tZGvNP0A(?{o zB7Mu`LYx^QbiLhli~kF2rVl}(7_&DgC?|41SR!@gs`(=T@r8^`0x!AN7yDEqFR6Dz zjUJJSw)<{KwfkEH2ktFMB)RzVAlZnQM)G(3)Xoy-uGNOmteo~W|F3UEifbaA;1JoP z5<1rIn7TZ->B`=TgE ze|))pbaJwpRU6FK+lT&BnW({6wKr+rGu%rAAug^@Q~#JI=X~6%sY$%JLw<~)(KLpW zCe^wFURQJI@oxYid?N%+E82D_YwfgpykA5`sldD}b!bUm!c|VH3jOf%?ZY46A1lzT zxg2hg%6I>Gt-$3|w+~uJ$G8e#jLu7MJ^WnqbDo4%-wo?a!#c-qJ( z>am+2r5>NeMvjjs%3(guPmcfL`Oul8ZK_nSUzxlaK;Emho{CuVA+9d&l^zteD#myB z^py7Oflam~4wSBvmdL}h8zASkrQ$O(F7{-rwO$Nm$}%gSiqMb|WX8zO_KrZ5Ps_ z>)-u&j|j;f>KvWWXa=eAm%AT0*_-o9r`)>Fx*emWnpqh_qaR{rhU&%lR#IbWAUi_W~TB!|haT9o||VYsxA1>Peb! zj^wfa^Uu`n^>u!|f-it15}GQ?`+97yiCDHo9c5&k`m|YV{i$5QY_~Yijx(fA?E)@kX?)yV;CeTVfW>mCwG?w&Djb)qMt(V8V<(=nIJ(I#^2)#P+ zZ7e99VP?fNr(KOHXzKa~ck+cf+T2oT?thbvFnZg` z;d4uL9&s)X=1QC~d2w;`7~P*58_$JZd_ZzsI^LzYS{JFV{Fe8@2(4~&66D9WjbxP) z|LqmoYIj?8>E%yc3G%k%k55wHRAHc7%TVUZOAvxuLnx_Q*r}W-rp{$;zuy^2i9oxe z4)hnbqj-{EpH$y!FbP=CE+-N|4iENvaP>nE&HIz-ZV;MA=?&cL3R}XA?1%*JZtb@B zp<7O;(EQb9)+0o`Mgk(apf-}1pU+YvYSs4TYCUZu*1r(tx;8|;={7@HsvV_|6LYho zf~+)LGCO*^emytCb+?8rb+0W5nx~##H8nMzSzIJ9ES;x&pFDrMJ}8+>KX5cZ(W@h6 zD!v#axSrqA!>>2K!Y{x1Hi_m`MAf3UqD`VC>TLt_^OJ{`wmv-d7?1#vvaP{Mbr#yg z)whfUjA15U9;BiHyT;>~gxX%jiN1Alz8?s33fpU}?N?K1ADLHD6nw3yO~m?SSbEh& z$*cT&MPK$an?(gNNMBy^pOSI?@PyeCrp>Ty8tqD2ml&^gBeYjdrKFI_-%4d{hEosn{o>6ISL+z5WQYE%gJr8=+{+~lmgSX8R_XK5S!?= z)m}{!>|ex;<_k{}I;3$@Rv$n8UbXw2|1G5bBr3FE6id8;d?S0zPxqNds?20O4*okr?~eUw=7lq%5Z~TJ{&jRZ&!E z0iRBU!)~1VdOy6GX80zxsv(h>pc zEirbDWR$K(zFkj>k;5kW2675{t8t_m`VQW%l{8fh)Z-5xLkoeu_{`?zc)p|I&^tzC z-(JnCHDQ_vyl0?86i>*ksgXfktYGEv+XmrI!}`F0)wFKYav)BRGwRiuz_e~XB35TH zi_)Od8NPKZUT~q~=O!sL-iObz)&liZ$ixx!yV=`{3yW)vN0=u$5fgwJ61CNW>SGdG zetXtBA%%p%-yT0i>=U_xvoJG8Z4 zehSs+hmQ{Zr;kc1DM%x3ZEdzja?}`gj58CnaD9;$%f0=1S3#7UkwhiC@WRlys zwE@oSMV@v6a;>hr#rf_Yo>_Xu)(zhpxtd?&tC2yx2+oruNl{JfQ^Grn+&w+GQFeL1 zBR8NYY!r7m(A>T3931jy;cs1*RH+Ojes5z?Z+=BX9)BTk7NzSz(Z=~8g5WztLnFJ5 zi7Q3-OZ9W0bD!=C-=!C46EI$1&ky)@%(unM3({7$ghk&3CLz<&^+w-XG0=VlFZ#y( zexUaz-scB8_EP!JvC(U6$|uzCY;4{sx)Fg~>h39ISo@D7ACLXtkN-#K!S?I|6cpYk z=j!3I$oQY$&+l9WuY$^WWt5Su6K3K471_s^pZ&{y_OEx}|NZuV za!CJfO3K1EfRp_*LI(#pI7hE9(l@#{zc>GHe_(Tsm1R)!wN68`bF>Z^k0IjMxc`q@ z>3_c1%ZjdKFpv3X|I&5yv4#N>e^2SdI~So4M)>yQOFJ@(pQrVija>Tj z_b=~c#Q08`&De3qjsJc4zPIGfu+04Y4|H4Q&t57^K>}*K)*LyX{meIV66BBvo zcy2C)^l#QE=UxY=M>U-GI^ZwNW(e-Y{a-G(2e?CdD|f!BUtTn_zGeq~e0ZcbF> z2zXF4BnYj>|8qe65BB$^m1!EmEz%ydtsd3-I{a?JGn7l}iLZY@dFj-S5%gtgczJC) z#viA9?^F@9Z|_?WV+Yh;DjN2Hp7Mrw@vNBoE<=~5M6pl1y{BzkQ3vjHVcXtklaWPN zfYtTm_T;2ukCkSgsRmB!kNCJLj4p3O^ls9UzqPvL=;K)TaMD#_v-pD?-sj+* zWds|IeRSV+^RliN=ktZIdm2FFSKaX;KVM%Fx5+kUHVMdh+FoD1s9Qc3o1br&uvhqk zM6NXoXisX#_ua=@e0==-0LY{jAIwcpe*v6?WS*p}4h{}+@FoPSj>Nc*jt*0D{Q%@* zBA}(|wJTp(u7!D_36X;`An(6sXHjuPU;8=%`CgM3q5? zR4Hii<{b3NyJ5#Ka&9XHZhB!PP_EDodI?3{aH5IB>tKdwzOuLDqFoBx@X_}>4(TAt&vo<(vlVpOZ+FMmMM25Y(X9<$z7+>) z>QrgU-UAh4Pm3(_(AQYQ9(;Xs-pQxcSW8!zLZPh05&SRJ?@kC;%IMQQ)X#|db?@oL z@GtuqWnaR+<7!6nBt=QNO^(Czw?k{B>zDH(Z)kBQ-9eCfgHY zO9}Eaz_K+%*Wk*8Fh*)&VFAe?ry%v=vQ5TV-}ky!tk+mBvZ)t7;7?r&Sn`t^dm$RX ziXr%sBS)YCrPVUlH0Ek(l*xk9juv<=PVAkGSJ01p72d$%4DbEH%0fft z_QD8tArV8}hBq!*LN{(Tm+j1J!38K`NWt5PRw8Iy5!;gz^;IMqKL|v8jgp#r{IcN+!O@b9~s(JYLqL-pZq}-5fLdE8P#f&h8VjQ2m$yGgZTa)v^Vwb!~Te)kRvi z#&DxJ{C|8H_8^*GY!rak`LMLW*7g~HrT7-!iN@yn)qE%s18g?SK#hoJt53N|QFK+M zZvYBOaGV0>j9Jc{`SSk#_5A!6mnQbux#D{HP-bCu?Aqq$)S!KFJIn|4D2iT!YuY+F zX`s>QRarb9zx`P_uq$!%$im1xXcJrET@E6$vWf8ij0t;4LLjq`hIcbaqFmdqHjP8W zPjg0u{NR7<;p&5uzT+@E>-?j#>$=TrCEYeVx3O|&;grH%vl(*b>ejj8h#G3Xp-W0; zXf*Gd**abL4u)%G<{M_INT|%^A|+(@f-`*C@P!;R#D-+ zB6Pq8rqoP4gPV_N&oD02_2jR&>pgBggW9OI;XL4DLN&ElGs~!D4gS*7J(U@KA7m|A zI915?)jmGg8yk5MH)i%xxC&VeWt>$ZtRF0klP1cjJl4GeKk0jgyS5Xk#uvuM#_~Pm zh2b(7uS^la2rkwRb?zk2fx%De1O4jBb%h8``2nB14?Qv(rO3JmlAV<3-3woa(P+|c z)evUn+Y=s?pA-mc>gq0&Z{r5)-}{3%xg0uaGi z-yHjuK>$L7S{+`s*c0$@VBiv@{GV{|T^yR$f15(PBV$*1qenj);isP5n%-LzzBHY1 zc42-#4m6|Ev+R;;0BXa?kI?1C@n94V|K4}y@4JDUp2q$vZ>Osx~lp4`D;j;>Sm+#bqEss1hl7hE*LsoBeS6I?Giy|K(wq9(cI>I zNdzUB90qlFL@1>0^A1N_i|Dq^W~)5;kb$R%-<*Hu(TkD(lK{Ug@dR|}dfMoVf`r8` z+o>jPvxY2%R=PE-02@yQ(dL{82(JKI73NsE8&L7YJdZxLvBWY|0`m#?^^MIv@$lCn zI8}SUl>j6p6ga>tzo5kK+?5r<#}CNcO&6xv{jfO;g~&Twy#JD`q$zvLX6OCLIfJ4L zRc8{_n!N5YBSYgSm^ka@bDyY!0FUd=pr2?PRh?O_uOu|7upXNSV2J%ia{(gp>CVxP zBEoCO4689FO3|om^ySpm%}a>{xq#BT%Q;cxH2JE_{b?iWA#@#OAmGfB6gdM-4GMyk zB5(iIS-pRdEnve&P#m3YTCXeI)?tyWFf0$*sUPSIie)L%*z|?k=t;bvs)td4Si4P? zD)j^t2%LF}Od_d!lhZ{mqhN7oC4oxhGmHQD{rC_Devc3>oTYzbj3a7iS`xAX%j#sV z7hY)&M6KcQkMq+P%KbneYr*aW@7Pg{=;P62vf(&b@$s=e#J@-4H_?o*n+{;ZM=;t` zjok=?oS%q`rlvsPiaV27rpko65(U!pa16VZIcU$&dy#&L6AU}AK2ETyrr#K->zY0` zz?wPdm9y-2e%+FI@Py?o^YWl9&8}!alKtWjCA^9Fch`hmbQF_F7h11=D(a3tp+p#R zYMnFUL*~{R8XA|3fxW)*aLiCHIgF7)G@wmUTXTxuZ!rN7`iStoTlm=u(oyqrc-!g* V#TN!6MwcWKWAA|o`JSV>{{is1u2%p6 literal 0 HcmV?d00001 From 915cf806fb4e15d198e9a54287b826364eefec7b Mon Sep 17 00:00:00 2001 From: Gary Date: Wed, 25 Oct 2023 20:52:40 +0800 Subject: [PATCH 15/15] Update UG with addlead and addclient --- docs/UserGuide.md | 81 +++++++++++++++++++++++++++----------- docs/images/addclient.png | Bin 0 -> 22622 bytes docs/images/addlead.png | Bin 0 -> 22722 bytes 3 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 docs/images/addclient.png create mode 100644 docs/images/addlead.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 6620620756f..e66fb808bc2 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -41,29 +41,60 @@ Here are some descriptions of the words we use throughout the User Guide: ![Ui1](images/Ui1.png) -## Lead features - -### Add lead [Coming soon] +### Add lead - What it does: Add potential leads and their basic information, e.g. name, age, year of study, major, etc. -- Command format: `add --name --age --year --major `. -- Example usage: `add --name Dave --age 22 --year 2 --major Psychology`. +- Command format: `addlead n/NAME p/PHONE e/EMAIL a/ADDRESS [t/TAG]...`. +- Example usage: `Example: addlead n/John Doe p/98765432 e/johnd@example.com a/311, Clementi Ave 2, #02-25 t/classmate`. - Acceptable values for each parameter: - - `name`: can contain any character, up to 100 characters long. - - `age`: any integer between `1` and `100` inclusive. - - `year`: any integer between `1` and `5` inclusive. - - `major`: can contain any character, up to 50 characters long. + - `NAME`: can contain any character. + - `PHONE`: any valid 8-digit integer. + - `EMAIL`: a string of the format `local-part@domain` + - `ADDRESS`: can contain any character. + - `TAG`: can contain any character. - Precise expected outputs when the command succeeds: -`Lead added. ` +
+ +

After using addlead command

+
- Precise expected outputs when the command fails: -`Lead failed to add. Please enter a valid command` +``` +Invalid command format! +addlead: Adds a lead to the address book. Parameters: n/NAME p/PHONE e/EMAIL a/ADDRESS [t/TAG]... +Example: addlead n/John Doe p/98765432 e/johnd@example.com a/311, Clementi Ave 2, #02-25 t/classmate +``` + +### Add Client +- What it does: Add potential clients and their basic information, e.g. name, age, year of study, major, etc. +- Command format: `addclient n/NAME p/PHONE e/EMAIL a/ADDRESS [t/TAG]...`. +- Example usage: `Example: addclient n/John Doe p/98765432 e/johnd@example.com a/311, Clementi Ave 2, #02-25 t/classmate`. +- Acceptable values for each parameter: + - `NAME`: can contain any character. + - `PHONE`: any valid 8-digit integer. + - `EMAIL`: a string of the format `local-part@domain` + - `ADDRESS`: can contain any character. + - `TAG`: can contain any character. +- Precise expected outputs when the command succeeds: + +
+ +

After using addclient command

+
+ +- Precise expected outputs when the command fails: + +``` +Invalid command format! +addclient: Adds a client to the address book. Parameters: n/NAME p/PHONE e/EMAIL a/ADDRESS [t/TAG]... +Example: addclient n/John Doe p/98765432 e/johnd@example.com a/311, Clementi Ave 2, #02-25 t/classmate +``` ### View all clients -- What it does: View all clients you have stored, including their basic information and index in the list of leads, e.g. id, name, age, gender, occupation, etc. +- What it does: View all clients you have stored, including their basic information and index in the list of clients, e.g. id, name, age, gender, occupation, etc. - Command: `listclient`. - Precise expected outputs when the command succeeds: @@ -97,12 +128,12 @@ In output section of the -### Delete lead [Coming soon] +### Delete [Coming soon] - What it does: Deletes a lead from your list of leads. -- Command format: `delete --id `. -- Example usage: `delete --id 1`. -- Acceptable values for `id` parameter: +- Command format: `delete INDEX`. +- Example usage: `delete 1`. +- Acceptable values for `INDEX` parameter: - Must be an integer from `1` to the last index of the leads list - Precise expected outputs when the command succeeds: @@ -110,19 +141,23 @@ In output section of the - Precise expected outputs when the command fails: -`Lead failed to delete. Please enter a valid lead id` +``` +Invalid command format! +delete: Deletes the person identified by the index number used in the displayed person list. +Parameters: INDEX (must be a positive integer) +``` -### Add meeting time for lead [Coming soon] +### Add meeting time [Coming soon] - What it does: Adds a meeting time for a lead -- Command format: `addmeeting --lead --dt ` -- Example usage: `addmeeting --lead 1 --dt 23/9/2023 5:30PM` +- Command format: `addmeetingtime INDEX m/MEETING_TIME` +- Example usage: `addmeetingtime 1 m/12/12/2020 12:00` - Acceptable values for each parameter: - - `lead`: Any integer from `1` to the last index of the leads list - - `dt`: A valid DateTime String with the format dd/M/yyyy hh:mma. + - `INDEX`: Any integer from `1` to the last index of the leads list. + - `MEETING_TIME`: A string of format `dd/MM/yyyy HH:mm`. - Precise expected outputs when the command succeeds: -`Meeting time added to : ` +`Meeting time added to : ` - Precise expected outputs when the command fails: diff --git a/docs/images/addclient.png b/docs/images/addclient.png new file mode 100644 index 0000000000000000000000000000000000000000..331ee029d2f0f6a254409262a07912d415283bbc GIT binary patch literal 22622 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 literal 0 HcmV?d00001 diff --git a/docs/images/addlead.png b/docs/images/addlead.png new file mode 100644 index 0000000000000000000000000000000000000000..ec3d780156172f36591be589c00c39852f94ea5a GIT binary patch literal 22722 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�I-LRo_f$RABEBTqRQ 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 Y9o?0@nE+}E_Bn}D_Re+`80ya70OVjc-2eap literal 0 HcmV?d00001