diff --git a/src/main/java/seedu/address/logic/commands/AddMeetingCommand.java b/src/main/java/seedu/address/logic/commands/AddMeetingCommand.java index 51150b7b59e..71b377b7a8d 100644 --- a/src/main/java/seedu/address/logic/commands/AddMeetingCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddMeetingCommand.java @@ -31,8 +31,9 @@ public class AddMeetingCommand extends Command { + PREFIX_START_TIME + "START TIME " + PREFIX_END_TIME + "END TIME " + PREFIX_DESCRIPTION + "DESCRIPTION "; - public static final String MESSAGE_DUPLICATE_MEETING = "This meeting already exists in MyInsuRec"; - public static final String MESSAGE_CLIENT_NOT_FOUND = "A client named %s could not be found"; + public static final String MESSAGE_CONFLICTING_MEETING = + "This meeting conflicts with another that exists in MyInsuRec"; + public static final String MESSAGE_MEETING_NOT_FOUND = "A meeting %s could not be found"; private final MeetingDate meetingDate; private final MeetingTime meetingStartTime; @@ -63,7 +64,7 @@ public CommandResult execute(Model model) throws CommandException { Meeting meetingToAdd = new Meeting(clientToUpdate, description, meetingDate, meetingStartTime, meetingEndTime); if (model.hasMeeting(meetingToAdd)) { - throw new CommandException(MESSAGE_DUPLICATE_MEETING); + throw new CommandException(MESSAGE_CONFLICTING_MEETING); } clientToUpdate.addMeeting(meetingToAdd); diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditClientCommand.java similarity index 88% rename from src/main/java/seedu/address/logic/commands/EditCommand.java rename to src/main/java/seedu/address/logic/commands/EditClientCommand.java index 296ee51542d..5ad9c063361 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditClientCommand.java @@ -9,7 +9,6 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_PRODUCT; -import static seedu.address.model.Model.PREDICATE_SHOW_ALL_CLIENTS; import java.util.Collections; import java.util.HashSet; @@ -17,6 +16,7 @@ import java.util.Optional; import java.util.Set; +import javafx.collections.ObservableList; import seedu.address.commons.core.Messages; import seedu.address.commons.core.index.Index; import seedu.address.commons.util.CollectionUtil; @@ -28,14 +28,15 @@ import seedu.address.model.client.Email; import seedu.address.model.client.Name; import seedu.address.model.client.Phone; +import seedu.address.model.meeting.Meeting; import seedu.address.model.product.Product; /** * Edits the details of an existing client in MyInsuRec. */ -public class EditCommand extends Command { +public class EditClientCommand extends Command { - public static final String COMMAND_WORD = "edit"; + public static final String COMMAND_WORD = "editClient"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the client identified " + "by the index number used in the displayed client list. " @@ -63,7 +64,7 @@ public class EditCommand extends Command { * @param index of the client in the filtered client list to edit * @param editClientDescriptor details to edit the client with */ - public EditCommand(Index index, EditClientDescriptor editClientDescriptor) { + public EditClientCommand(Index index, EditClientDescriptor editClientDescriptor) { requireNonNull(index); requireNonNull(editClientDescriptor); @@ -73,9 +74,7 @@ public EditCommand(Index index, EditClientDescriptor editClientDescriptor) { @Override public CommandResult execute(Model model) throws CommandException { - requireNonNull(model); - List lastShownList = model.getFilteredClientList(); - + ObservableList lastShownList = model.getFilteredClientList(); if (index.getZeroBased() >= lastShownList.size()) { throw new CommandException(Messages.MESSAGE_INVALID_CLIENT_DISPLAYED_INDEX); } @@ -95,8 +94,7 @@ public CommandResult execute(Model model) throws CommandException { } model.setClient(clientToEdit, editedClient); - model.updateFilteredClientList(PREDICATE_SHOW_ALL_CLIENTS); - return new CommandResult(String.format(MESSAGE_EDIT_CLIENT_SUCCESS, editedClient)); + return new CommandResult(String.format(MESSAGE_EDIT_CLIENT_SUCCESS, editedClient), CommandSpecific.CLIENT); } /** @@ -119,8 +117,21 @@ private static Client createEditedClient(Client clientToEdit, EditClientDescript : editClientDescriptor.getBirthday(); Set updatedProducts = editClientDescriptor.getProducts().orElse(clientToEdit.getProducts()); - return new Client(updatedName, updatedPhone, updatedEmail, updatedAddress, + Client client = new Client(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedBirthday, updatedProducts); + + // update client in each meeting this client has + List meetings = clientToEdit.getMeetings(); + + Meeting meeting; + Meeting updatedMeeting; + for (int i = 0; i < meetings.size(); i++) { + meeting = meetings.get(i); + updatedMeeting = new Meeting(client, meeting.getDescription(), meeting.getMeetingDate(), + meeting.getMeetingStartTime(), meeting.getMeetingEndTime()); + client.addMeeting(updatedMeeting); + } + return client; } @Override @@ -131,12 +142,12 @@ public boolean equals(Object other) { } // instanceof handles nulls - if (!(other instanceof EditCommand)) { + if (!(other instanceof EditClientCommand)) { return false; } // state check - EditCommand e = (EditCommand) other; + EditClientCommand e = (EditClientCommand) other; return index.equals(e.index) && editClientDescriptor.equals(e.editClientDescriptor); } @@ -166,7 +177,6 @@ public EditClientDescriptor(EditClientDescriptor toCopy) { address = toCopy.address; birthday = toCopy.birthday; products = toCopy.products; - } /** diff --git a/src/main/java/seedu/address/logic/commands/EditMeetingCommand.java b/src/main/java/seedu/address/logic/commands/EditMeetingCommand.java new file mode 100644 index 00000000000..6240ae58144 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/EditMeetingCommand.java @@ -0,0 +1,212 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; +import static seedu.address.commons.core.Messages.MESSAGE_END_TIME_BEFORE_START_TIME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_DESCRIPTION; +import static seedu.address.logic.parser.CliSyntax.PREFIX_END_TIME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_INDEX; +import static seedu.address.logic.parser.CliSyntax.PREFIX_START_TIME; + +import java.util.List; +import java.util.Optional; + +import seedu.address.commons.core.Messages; +import seedu.address.commons.core.index.Index; +import seedu.address.commons.util.CollectionUtil; +import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.model.Model; +import seedu.address.model.client.Client; +import seedu.address.model.meeting.Description; +import seedu.address.model.meeting.Meeting; +import seedu.address.model.meeting.MeetingDate; +import seedu.address.model.meeting.MeetingTime; + + +/** + * Edits the details of an existing meeting in MyInsuRec. + */ +public class EditMeetingCommand extends Command { + + public static final String COMMAND_WORD = "editMeeting"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the meeting identified " + + "by the index number used in the displayed meeting list. \n" + + "Existing values will be overwritten by the input values.\n" + + "Parameters: INDEX (must be a positive integer) \n" + + "[" + PREFIX_DATE + "DATE] " + + "[" + PREFIX_START_TIME + "START TIME] " + + "[" + PREFIX_END_TIME + "END TIME] " + + "[" + PREFIX_DESCRIPTION + "DESCRIPTION]\n" + + "Example: " + COMMAND_WORD + " " + + PREFIX_INDEX + "1 " + + PREFIX_DATE + "23122022 "; + + public static final String MESSAGE_EDIT_MEETING_SUCCESS = "Edited Meeting: %1$s"; + public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided."; + public static final String MESSAGE_DUPLICATE_MEETING = "This meeting already exists in MyInsuRec."; + + private final Index index; + private final EditMeetingDescriptor editMeetingDescriptor; + + /** + * @param index of the meeting in the filtered meeting list to edit + * @param editMeetingDescriptor details to edit the meeting with + */ + public EditMeetingCommand(Index index, EditMeetingDescriptor editMeetingDescriptor) { + requireNonNull(index); + requireNonNull(editMeetingDescriptor); + + this.index = index; + this.editMeetingDescriptor = new EditMeetingDescriptor(editMeetingDescriptor); + } + + @Override + public CommandResult execute(Model model) throws CommandException { + requireNonNull(model); + List lastShownList = model.getFilteredMeetingList(); + + if (index.getZeroBased() >= lastShownList.size()) { + throw new CommandException(Messages.MESSAGE_INVALID_MEETING_DISPLAYED_INDEX); + } + + Meeting meetingToEdit = lastShownList.get(index.getZeroBased()); + Meeting editedMeeting = createEditedMeeting(meetingToEdit, editMeetingDescriptor); + + if (model.hasMeeting(editedMeeting)) { + throw new CommandException(MESSAGE_DUPLICATE_MEETING); + } + + // update meeting list + model.setMeeting(meetingToEdit, editedMeeting); + + // update meeting in client + Client client = meetingToEdit.getClient(); + client.removeMeeting(meetingToEdit); + client.addMeeting(editedMeeting); + + return new CommandResult(String.format(MESSAGE_EDIT_MEETING_SUCCESS, editedMeeting), CommandSpecific.MEETING); + } + + /** + * Creates and returns a {@code Meeting} with the details of {@code meetingToEdit} + * edited with {@code EditMeetingDescriptor}. + */ + private static Meeting createEditedMeeting(Meeting meetingToEdit, EditMeetingDescriptor editMeetingDescriptor) + throws CommandException { + assert meetingToEdit != null; + + MeetingDate updatedDate = editMeetingDescriptor.getDate().orElse(meetingToEdit.getMeetingDate()); + Description updatedDescription = editMeetingDescriptor.getDescription().orElse(meetingToEdit.getDescription()); + MeetingTime updatedEndTime = editMeetingDescriptor.getEndTime().orElse(meetingToEdit.getMeetingEndTime()); + MeetingTime updatedStartTime = editMeetingDescriptor.getStartTime().orElse(meetingToEdit.getMeetingStartTime()); + if (updatedEndTime.isBefore(updatedStartTime)) { + throw new CommandException(MESSAGE_END_TIME_BEFORE_START_TIME); + } + Meeting meeting = new Meeting(meetingToEdit.getClient(), updatedDescription, updatedDate, + updatedStartTime, updatedEndTime); + return meeting; + } + + @Override + public boolean equals(Object other) { + // short circuit if same object + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof EditMeetingCommand)) { + return false; + } + + // state check + EditMeetingCommand e = (EditMeetingCommand) other; + return index.equals(e.index) + && editMeetingDescriptor.equals(e.editMeetingDescriptor); + } + + /** + * Stores the details to edit the meeting with. Each non-empty field value will replace the + * corresponding field value of the meeting. + */ + public static class EditMeetingDescriptor { + private MeetingDate date; + private MeetingTime startTime; + private MeetingTime endTime; + private Description description; + + public EditMeetingDescriptor() {} + + /** + * Copy constructor. + */ + public EditMeetingDescriptor(EditMeetingDescriptor toCopy) { + date = toCopy.date; + startTime = toCopy.startTime; + endTime = toCopy.endTime; + description = toCopy.description; + } + + /** + * Returns true if at least one field is edited. + */ + public boolean isAnyFieldEdited() { + return CollectionUtil.isAnyNonNull(date, startTime, endTime, description); + } + + public void setDate(MeetingDate date) { + this.date = date; + } + + public Optional getDate() { + return Optional.ofNullable(date); + } + + public void setStartTime(MeetingTime startTime) { + this.startTime = startTime; + } + + public Optional getStartTime() { + return Optional.ofNullable(startTime); + } + + public void setEndTime(MeetingTime endTime) { + this.endTime = endTime; + } + + public Optional getEndTime() { + return Optional.ofNullable(endTime); + } + + public void setDescription(Description description) { + this.description = description; + } + + public Optional getDescription() { + return Optional.ofNullable(description); + } + + + @Override + public boolean equals(Object other) { + // short circuit if same object + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof EditMeetingDescriptor)) { + return false; + } + + // state check + EditMeetingDescriptor e = (EditMeetingDescriptor) other; + + return getDate().equals(e.getDate()) + && getEndTime().equals(e.getEndTime()) + && getStartTime().equals(e.getStartTime()) + && getDescription().equals(e.getDescription()); + } + } +} diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditClientCommandParser.java similarity index 85% rename from src/main/java/seedu/address/logic/parser/EditCommandParser.java rename to src/main/java/seedu/address/logic/parser/EditClientCommandParser.java index dc36e412259..59ee3ebea3c 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditClientCommandParser.java @@ -18,23 +18,23 @@ import java.util.Set; import seedu.address.commons.core.index.Index; -import seedu.address.logic.commands.EditCommand; -import seedu.address.logic.commands.EditCommand.EditClientDescriptor; +import seedu.address.logic.commands.EditClientCommand; +import seedu.address.logic.commands.EditClientCommand.EditClientDescriptor; import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.client.Birthday; import seedu.address.model.product.Product; /** - * Parses input arguments and creates a new EditCommand object + * Parses input arguments and creates a new EditClientCommand object */ -public class EditCommandParser implements Parser { +public class EditClientCommandParser implements Parser { /** - * Parses the given {@code String} of arguments in the context of the EditCommand - * and returns an EditCommand object for execution. + * Parses the given {@code String} of arguments in the context of the EditClientCommand + * and returns an EditClientCommand object for execution. * @throws ParseException if the user input does not conform the expected format */ - public EditCommand parse(String args) throws ParseException { + public EditClientCommand parse(String args) throws ParseException { requireNonNull(args); ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_INDEX, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, @@ -45,7 +45,7 @@ public EditCommand parse(String args) throws ParseException { try { index = ParserUtil.parseIndex(argMultimap.getValue(PREFIX_INDEX).get()); } catch (ParseException | NoSuchElementException e) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), e); + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditClientCommand.MESSAGE_USAGE), e); } EditClientDescriptor editClientDescriptor = new EditClientDescriptor(); @@ -73,10 +73,10 @@ public EditCommand parse(String args) throws ParseException { if (!editClientDescriptor.isAnyFieldEdited()) { - throw new ParseException(EditCommand.MESSAGE_NOT_EDITED); + throw new ParseException(EditClientCommand.MESSAGE_NOT_EDITED); } - return new EditCommand(index, editClientDescriptor); + return new EditClientCommand(index, editClientDescriptor); } /** diff --git a/src/main/java/seedu/address/logic/parser/EditMeetingCommandParser.java b/src/main/java/seedu/address/logic/parser/EditMeetingCommandParser.java new file mode 100644 index 00000000000..2272434d4b5 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/EditMeetingCommandParser.java @@ -0,0 +1,68 @@ +package seedu.address.logic.parser; + +import static java.util.Objects.requireNonNull; +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_DESCRIPTION; +import static seedu.address.logic.parser.CliSyntax.PREFIX_END_TIME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_INDEX; +import static seedu.address.logic.parser.CliSyntax.PREFIX_START_TIME; + +import java.util.NoSuchElementException; + +import seedu.address.commons.core.index.Index; +import seedu.address.logic.commands.EditMeetingCommand; +import seedu.address.logic.commands.EditMeetingCommand.EditMeetingDescriptor; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.meeting.Description; +import seedu.address.model.meeting.MeetingDate; + + +/** + * Parses input arguments and creates a new EditMeetingCommand object + */ +public class EditMeetingCommandParser implements Parser { + + /** + * Parses the given {@code String} of arguments in the context of the EditMeetingCommand + * and returns an EditMeetingCommand object for execution. + * + * @throws ParseException if the user input does not conform the expected format + */ + public EditMeetingCommand parse(String args) throws ParseException { + requireNonNull(args); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_INDEX, PREFIX_DATE, PREFIX_START_TIME, PREFIX_END_TIME, + PREFIX_DESCRIPTION); + + Index index; + + try { + index = ParserUtil.parseIndex(argMultimap.getValue(PREFIX_INDEX).get()); + } catch (ParseException | NoSuchElementException e) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, + EditMeetingCommand.MESSAGE_USAGE), e); + } + + EditMeetingDescriptor editMeetingDescriptor = new EditMeetingDescriptor(); + if (argMultimap.getValue(PREFIX_DESCRIPTION).isPresent()) { + editMeetingDescriptor.setDescription(new Description(argMultimap.getValue(PREFIX_DESCRIPTION).get())); + } + if (argMultimap.getValue(PREFIX_DATE).isPresent()) { + editMeetingDescriptor.setDate(new MeetingDate(ParserUtil.parseDate(argMultimap.getValue(PREFIX_DATE).get(), + "meeting"))); + } + if (argMultimap.getValue(PREFIX_START_TIME).isPresent()) { + editMeetingDescriptor.setStartTime(ParserUtil.parseTime(argMultimap.getValue(PREFIX_START_TIME).get())); + } + if (argMultimap.getValue(PREFIX_END_TIME).isPresent()) { + editMeetingDescriptor.setEndTime(ParserUtil.parseTime(argMultimap.getValue(PREFIX_END_TIME).get())); + } + + if (!editMeetingDescriptor.isAnyFieldEdited()) { + throw new ParseException(EditMeetingCommand.MESSAGE_NOT_EDITED); + } + + return new EditMeetingCommand(index, editMeetingDescriptor); + } +} diff --git a/src/main/java/seedu/address/logic/parser/MyInsuRecParser.java b/src/main/java/seedu/address/logic/parser/MyInsuRecParser.java index 0e33195d729..11de49a25c6 100644 --- a/src/main/java/seedu/address/logic/parser/MyInsuRecParser.java +++ b/src/main/java/seedu/address/logic/parser/MyInsuRecParser.java @@ -14,7 +14,8 @@ import seedu.address.logic.commands.DeleteClientCommand; import seedu.address.logic.commands.DeleteMeetingCommand; import seedu.address.logic.commands.DeleteProductCommand; -import seedu.address.logic.commands.EditCommand; +import seedu.address.logic.commands.EditClientCommand; +import seedu.address.logic.commands.EditMeetingCommand; import seedu.address.logic.commands.ExitCommand; import seedu.address.logic.commands.FindCommand; import seedu.address.logic.commands.HelpCommand; @@ -55,8 +56,11 @@ public Command parseCommand(String userInput) throws ParseException { case AddClientCommand.COMMAND_WORD: return new AddClientCommandParser().parse(arguments); - case EditCommand.COMMAND_WORD: - return new EditCommandParser().parse(arguments); + case EditClientCommand.COMMAND_WORD: + return new EditClientCommandParser().parse(arguments); + + case EditMeetingCommand.COMMAND_WORD: + return new EditMeetingCommandParser().parse(arguments); case DeleteClientCommand.COMMAND_WORD: return new DeleteClientCommandParser().parse(arguments); diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index 39f34cff8ae..7e76c438e1d 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -82,12 +82,25 @@ public interface Model { */ boolean hasMeeting(Meeting meeting); + /** + * Returns true if a meeting with the same date, time, and description as {@code meeting} exists in the MyInsuRec. + * This is a stronger version of hasMeeting. + */ + boolean hasSpecificMeeting(Meeting meeting); + /** * Adds the given meeting. * {@code meeting} must not already exist in the MyInsuRec. */ void addMeeting(Meeting meeting); + /** + * Replaces the given meeting {@code target} with {@code editedMeeting}. + * {@code target} must exist in the MyInsuRec. + * The meeting identity of {@code editedMeeting} must not be the same as another existing meeting in the MyInsuRec. + */ + void setMeeting(Meeting target, Meeting editedMeeting); + /** * Adds the given product. * {@code product} must not already exist in the MyInsuRec. diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index ce4e1a74709..a088dd6ec92 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -123,6 +123,7 @@ public void setClient(Client target, Client editedClient) { requireAllNonNull(target, editedClient); myInsuRec.setClient(target, editedClient); + updateFilteredClientList(PREDICATE_SHOW_ALL_CLIENTS); } @Override @@ -137,6 +138,20 @@ public boolean hasMeeting(Meeting meeting) { return myInsuRec.hasMeeting(meeting); } + @Override + public boolean hasSpecificMeeting(Meeting meeting) { + requireNonNull(meeting); + return myInsuRec.hasSpecificMeeting(meeting); + } + + @Override + public void setMeeting(Meeting target, Meeting editedMeeting) { + requireAllNonNull(target, editedMeeting); + + myInsuRec.setMeeting(target, editedMeeting); + } + + @Override public void addMeeting(Meeting meeting) { requireNonNull(meeting); diff --git a/src/main/java/seedu/address/model/MyInsuRec.java b/src/main/java/seedu/address/model/MyInsuRec.java index 156bfdc20e7..15fdfa644b0 100644 --- a/src/main/java/seedu/address/model/MyInsuRec.java +++ b/src/main/java/seedu/address/model/MyInsuRec.java @@ -140,12 +140,33 @@ public void removeMeeting(Meeting meeting) { } /** - * Returns true if a meeting with the same identity as {@code meeting} exists in the meetings book. + * Returns true if a meeting with the same date and time as {@code meeting} exists in the meetings book. */ public boolean hasMeeting(Meeting meeting) { return meetings.contains(meeting); } + /** + * Returns true if a meeting with the same date, time, and description + * as {@code meeting} exists in the meetings book. + * This is stronger version of hasMeeting. + */ + public boolean hasSpecificMeeting(Meeting meeting) { + return meetings.containsSpecific(meeting); + } + + /** + * Replaces the given meeting {@code target} in the list with {@code editedMeeting}. + * {@code target} must exist in MyInsuRec. + * The Meeting identity of {@code editedMeeting} must not be the same as + * another existing Meeting in MyInsuRec. + */ + public void setMeeting(Meeting target, Meeting editedMeeting) { + requireNonNull(editedMeeting); + + meetings.setMeeting(target, editedMeeting); + } + //// product-level operations /** diff --git a/src/main/java/seedu/address/model/meeting/NoConflictMeetingList.java b/src/main/java/seedu/address/model/meeting/NoConflictMeetingList.java index faffe6126ae..055af8b3826 100644 --- a/src/main/java/seedu/address/model/meeting/NoConflictMeetingList.java +++ b/src/main/java/seedu/address/model/meeting/NoConflictMeetingList.java @@ -37,6 +37,14 @@ public boolean contains(Meeting toCheck) { return internalList.stream().anyMatch(toCheck::willConflict); } + /** + * Returns true if the list contains an identical meeting as the given argument. + */ + public boolean containsSpecific(Meeting toCheck) { + requireNonNull(toCheck); + return internalList.stream().anyMatch(toCheck::equals); + } + /** * Adds a meeting to the list. * The meeting must not conflict with any meetings in the list. diff --git a/src/main/java/seedu/address/ui/ClientCard.java b/src/main/java/seedu/address/ui/ClientCard.java index 4a6b3164481..b89daf5903e 100644 --- a/src/main/java/seedu/address/ui/ClientCard.java +++ b/src/main/java/seedu/address/ui/ClientCard.java @@ -43,7 +43,7 @@ public class ClientCard extends UiPart { public ClientCard(Client client, int displayedIndex) { super(FXML); this.client = client; - id.setText(displayedIndex + ""); + id.setText(displayedIndex + ". "); name.setText(client.getName().fullName); phone.setText(client.getPhone().value); email.setText(client.getEmail().map(Email::toString).orElse("")); diff --git a/src/main/resources/view/ClientDetailedView.fxml b/src/main/resources/view/ClientDetailedView.fxml index bbae110a6b8..0a05fd8707f 100644 --- a/src/main/resources/view/ClientDetailedView.fxml +++ b/src/main/resources/view/ClientDetailedView.fxml @@ -14,7 +14,7 @@ - + diff --git a/src/main/resources/view/ClientDetailedViewPanel.fxml b/src/main/resources/view/ClientDetailedViewPanel.fxml index 41edaf76fec..daf9bf588d0 100644 --- a/src/main/resources/view/ClientDetailedViewPanel.fxml +++ b/src/main/resources/view/ClientDetailedViewPanel.fxml @@ -3,6 +3,6 @@ - + diff --git a/src/main/resources/view/ClientListCard.fxml b/src/main/resources/view/ClientListCard.fxml index d6a6b9bea33..0e9cda9dab6 100644 --- a/src/main/resources/view/ClientListCard.fxml +++ b/src/main/resources/view/ClientListCard.fxml @@ -8,7 +8,7 @@ - + diff --git a/src/main/resources/view/ClientListPanel.fxml b/src/main/resources/view/ClientListPanel.fxml index d6eac874221..d7b8006f628 100644 --- a/src/main/resources/view/ClientListPanel.fxml +++ b/src/main/resources/view/ClientListPanel.fxml @@ -9,7 +9,7 @@ - +