Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add markVisited-attraction command and parser #178

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 21 additions & 3 deletions docs/UserGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,24 @@ Editing the tag of an attraction does not add on to its existing tags. Rather, i
new tags you’re specifying.
</div>

#### 3.3.4 Finding a tourist attraction: `find-attraction`
#### 3.3.4 Mark a tourist attraction as visited: `markVisited-attraction`

Marks a tourist attraction in the current list of attractions as visited.

Format: `markVisited-attraction INDEX`

* Marks the attraction at the specified `INDEX` as visited.
* The index refers to the index number shown in the displayed tourist attraction list.
* The index **must be a positive integer** 1, 2, 3, …​
* Any attraction can be marked visited, even if the attraction was already visited.

Examples:
* `markVisited-attraction 2` marks the 2nd attraction in the TrackPad as visited.
![result for 'markVisited-attraction'](images/markVisitedAttraction.PNG)
<div align="center"><sup style="font-size:100%"><i>Figure 7. The result of 'markVisited-attraction 2</i></sup></div>
* Typing `markVisited-attraction 2` again will show that the 2nd attraction in the TrackPad is visited.

#### 3.3.5 Finding a tourist attraction: `find-attraction`

Finds any tourist attraction which contains the keyword(s).

Expand All @@ -180,7 +197,7 @@ Examples:
![result for 'find-attraction'](images/findJurongResult.PNG)
<div align="center"><sup style="font-size:100%"><i>Figure 7. The result of 'find-attraction jurong'</i></sup></div><br>

#### 3.3.5 Deleting a tourist attraction : `delete-attraction`
#### 3.3.6 Deleting a tourist attraction : `delete-attraction`

Deletes a tourist attraction from the current list of attractions.

Expand All @@ -198,7 +215,7 @@ Examples:
<sup style="font-size:100%"><i><text align="center">Figure 9. The result of 'delete-attraction 1'</text></i></sup><br>
* `find-attraction animals` followed by `delete 2` deletes the 2nd tourist attraction in the results of the `find-attraction` command.

#### 3.3.6 Clearing all attractions : `clear-attraction`
#### 3.3.7 Clearing all attractions : `clear-attraction`

Clears all tourist attractions.

Expand Down Expand Up @@ -380,6 +397,7 @@ Action | Format, Examples
**Add attraction** | `add-attraction n/ATTRACTION_NAME l/LOCATION [d/DESCRIPTION] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [op/OPENING_HOURS] [pr/PRICE_RANGE] [r/RATING] [v/VISITED] [t/TAG]…​` <br> e.g., `add n/Singapore Zoo p/62693411 t/hot a/80 Mandai Lake Rd, 729826`
**List attractions** | `list-attraction`
**Edit attraction** | `edit-attraction INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`<br> e.g.,`edit 2 n/Singapore Zoo e/zoo@example.com`
**Mark Visited attraction** | `markVisited-attraction INDEX`<br> e.g., `markVisited-attraction 2`
**Find attraction** | `find-attration KEYWORD [MORE_KEYWORDS]`<br> e.g., `find Zoo`
**Delete attraction** | `delete-attraction INDEX`<br> e.g., `delete 3`
**Clear all attractions** | `clear-attraction`
Expand Down
Binary file added docs/images/markVisitedAttraction.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package seedu.address.logic.commands.attraction;

import static java.util.Objects.requireNonNull;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_ATTRACTIONS;

import java.util.List;
import java.util.Set;

import seedu.address.commons.core.Messages;
import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.Command;
import seedu.address.logic.commands.CommandResult;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.attraction.Address;
import seedu.address.model.attraction.Attraction;
import seedu.address.model.attraction.Email;
import seedu.address.model.attraction.Location;
import seedu.address.model.attraction.OpeningHours;
import seedu.address.model.attraction.Phone;
import seedu.address.model.attraction.PriceRange;
import seedu.address.model.attraction.Rating;
import seedu.address.model.attraction.Visited;
import seedu.address.model.commons.Description;
import seedu.address.model.commons.Name;
import seedu.address.model.tag.Tag;

/**
* Marks an existing attraction in the attractions list in TrackPad as visited.
*/
public class MarkVisitedAttractionCommand extends Command {

public static final String COMMAND_WORD = "markVisited-attraction";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Marks the attraction identified "
+ "by the index number used in the displayed attraction list as visited.\n"
+ "Parameters: INDEX (must be a positive integer) "
+ "Example: " + COMMAND_WORD + " 1 ";

public static final String MESSAGE_MARKVISITED_ATTRACTION_SUCCESS = "Attraction marked as visited: %1$s";

private final Index index;

/**
* @param index of the attraction in the filtered attraction list to mark as visited
// * @param markVisitedAttractionDescriptor details to edit the attraction with
*/
public MarkVisitedAttractionCommand(Index index) {
requireNonNull(index);
this.index = index;
}

@Override
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);
List<Attraction> lastShownList = model.getFilteredAttractionList();

if (index.getZeroBased() >= lastShownList.size()) {
throw new CommandException(Messages.MESSAGE_INVALID_ATTRACTION_DISPLAYED_INDEX);
}

Attraction attractionToMarkVisited = lastShownList.get(index.getZeroBased());
Attraction markedVisitedAttraction = createMarkVisitedAttraction(attractionToMarkVisited);

model.setAttraction(attractionToMarkVisited, markedVisitedAttraction);
model.updateFilteredAttractionList(PREDICATE_SHOW_ALL_ATTRACTIONS);
return new CommandResult(String.format(MESSAGE_MARKVISITED_ATTRACTION_SUCCESS, markedVisitedAttraction));
}

/**
* Creates and returns a {@code Attraction} with the details of {@code attractionToEdit}
* edited with {@code editAttractionDescriptor}.
*/
private static Attraction createMarkVisitedAttraction(Attraction attractionToMarkVisited) {
assert attractionToMarkVisited != null;

Name unchangedName = attractionToMarkVisited.getName();
Phone unchangedPhone = attractionToMarkVisited.getPhone();
Email unchangedEmail = attractionToMarkVisited.getEmail();
Address unchangedAddress = attractionToMarkVisited.getAddress();
Description unchangedDescription = attractionToMarkVisited.getDescription();
Location unchangedLocation = attractionToMarkVisited.getLocation();
OpeningHours unchangedOpeningHours = attractionToMarkVisited.getOpeningHours();
PriceRange unchangedPriceRange = attractionToMarkVisited.getPriceRange();
Rating unchangedRating = attractionToMarkVisited.getRating();
Visited updatedVisited = new Visited("TRUE");
Set<Tag> unchangedTags = attractionToMarkVisited.getTags();

return new Attraction(unchangedName, unchangedPhone, unchangedEmail, unchangedAddress,
unchangedDescription, unchangedLocation, unchangedOpeningHours, unchangedPriceRange,
unchangedRating, updatedVisited, unchangedTags);
}

@Override
public boolean equals(Object other) {
// short circuit if same object
if (other == this) {
return true;
}

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

// state check
MarkVisitedAttractionCommand e = (MarkVisitedAttractionCommand) other;
return index.equals(e.index);
}

}
5 changes: 5 additions & 0 deletions src/main/java/seedu/address/logic/parser/TrackPadParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import seedu.address.logic.commands.attraction.EditAttractionCommand;
import seedu.address.logic.commands.attraction.FindAttractionCommand;
import seedu.address.logic.commands.attraction.ListAttractionCommand;
import seedu.address.logic.commands.attraction.MarkVisitedAttractionCommand;
import seedu.address.logic.commands.itinerary.AddItineraryCommand;
import seedu.address.logic.commands.itinerary.ClearItineraryCommand;
import seedu.address.logic.commands.itinerary.DeleteItineraryCommand;
Expand All @@ -25,6 +26,7 @@
import seedu.address.logic.parser.attraction.DeleteAttractionCommandParser;
import seedu.address.logic.parser.attraction.EditAttractionCommandParser;
import seedu.address.logic.parser.attraction.FindAttractionCommandParser;
import seedu.address.logic.parser.attraction.MarkVisitedAttractionCommandParser;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.logic.parser.itinerary.AddItineraryCommandParser;
import seedu.address.logic.parser.itinerary.DeleteItineraryCommandParser;
Expand Down Expand Up @@ -67,6 +69,9 @@ public Command parseCommand(String userInput) throws ParseException {
case DeleteAttractionCommand.COMMAND_WORD:
return new DeleteAttractionCommandParser().parse(arguments);

case MarkVisitedAttractionCommand.COMMAND_WORD:
return new MarkVisitedAttractionCommandParser().parse(arguments);

case ClearAttractionCommand.COMMAND_WORD:
return new ClearAttractionCommand();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package seedu.address.logic.parser.attraction;

import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;

import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.attraction.MarkVisitedAttractionCommand;
import seedu.address.logic.parser.Parser;
import seedu.address.logic.parser.ParserUtil;
import seedu.address.logic.parser.exceptions.ParseException;

/**
* Parses input arguments and creates a new MarkVisitedAttractionCommand object
*/
public class MarkVisitedAttractionCommandParser implements Parser<MarkVisitedAttractionCommand> {

/**
* Parses the given {@code String} of arguments in the context of the MarkVisitedAttractionCommand
* and returns a MarkVisitedAttractionCommand object for execution.
* @throws ParseException if the user input does not conform the expected format
*/
public MarkVisitedAttractionCommand parse(String args) throws ParseException {
try {
Index index = ParserUtil.parseIndex(args);
return new MarkVisitedAttractionCommand(index);
} catch (ParseException pe) {
throw new ParseException(
String.format(MESSAGE_INVALID_COMMAND_FORMAT, MarkVisitedAttractionCommand.MESSAGE_USAGE), pe);
}
}

}
6 changes: 6 additions & 0 deletions src/main/java/seedu/address/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ public interface Model {
*/
void setAttraction(Attraction target, Attraction editedAttraction);

/**
* Marks the given attraction {@code target} as visited.
* {@code target} must exist in the attraction list.
*/
void markVisitedAttraction(Attraction target);

/** Returns an unmodifiable view of the filtered attraction list */
ObservableList<Attraction> getFilteredAttractionList();

Expand Down
36 changes: 36 additions & 0 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,27 @@
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;

import java.nio.file.Path;
import java.util.Set;
import java.util.function.Predicate;
import java.util.logging.Logger;

import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import seedu.address.commons.core.GuiSettings;
import seedu.address.commons.core.LogsCenter;
import seedu.address.model.attraction.Address;
import seedu.address.model.attraction.Attraction;
import seedu.address.model.attraction.Email;
import seedu.address.model.attraction.Location;
import seedu.address.model.attraction.OpeningHours;
import seedu.address.model.attraction.Phone;
import seedu.address.model.attraction.PriceRange;
import seedu.address.model.attraction.Rating;
import seedu.address.model.attraction.Visited;
import seedu.address.model.commons.Description;
import seedu.address.model.commons.Name;
import seedu.address.model.itinerary.Itinerary;
import seedu.address.model.tag.Tag;

/**
* Represents the in-memory model of the TrackPad data.
Expand Down Expand Up @@ -94,6 +106,7 @@ public void setItineraryListFilePath(Path itineraryListFilePath) {
userPrefs.setItineraryListFilePath(itineraryListFilePath);
}


//=========== AttractionList ================================================================================

public void setAttractionList(ReadOnlyAttractionList attractionList) {
Expand Down Expand Up @@ -129,6 +142,29 @@ public void setAttraction(Attraction target, Attraction editedAttraction) {
attractionList.setAttraction(target, editedAttraction);
}

@Override
public void markVisitedAttraction(Attraction target) {
requireAllNonNull(target);

Name unchangedName = target.getName();
Phone unchangedPhone = target.getPhone();
Email unchangedEmail = target.getEmail();
Address unchangedAddress = target.getAddress();
Description unchangedDescription = target.getDescription();
Location unchangedLocation = target.getLocation();
OpeningHours unchangedOpeningHours = target.getOpeningHours();
PriceRange unchangedPriceRange = target.getPriceRange();
Rating unchangedRating = target.getRating();
Visited updatedVisited = new Visited("TRUE");
Set<Tag> unchangedTags = target.getTags();

Attraction markVisitedAttraction = new Attraction(unchangedName, unchangedPhone, unchangedEmail,
unchangedAddress, unchangedDescription, unchangedLocation, unchangedOpeningHours, unchangedPriceRange,
unchangedRating, updatedVisited, unchangedTags);

attractionList.setAttraction(target, markVisitedAttraction);
}

//=========== Filtered Attraction List Accessors =============================================================

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,11 @@ public void setAttraction(Attraction target, Attraction editedAttraction) {
throw new AssertionError("This method should not be called.");
}

@Override
public void markVisitedAttraction(Attraction target) {
throw new AssertionError("This method should not be called.");
}

@Override
public ObservableList<Attraction> getFilteredAttractionList() {
throw new AssertionError("This method should not be called.");
Expand Down