From 14cdfe65679fda70b7c066012cfa554232bd043f Mon Sep 17 00:00:00 2001 From: Keagan Date: Tue, 24 Oct 2023 20:04:13 +0800 Subject: [PATCH 01/12] Rewrite dietary requirements to follow tags implementation --- .../logic/parser/GuestAddCommandParser.java | 11 +-- .../address/logic/parser/ParserUtil.java | 28 ++++-- .../model/person/DietaryRequirements.java | 88 ------------------ .../wedlog/address/model/person/Guest.java | 18 ++-- .../address/model/tag/DietaryRequirement.java | 48 ++++++++++ .../address/model/util/SampleDataUtil.java | 10 ++ .../JsonAdaptedDietaryRequirement.java | 46 +++++++++ .../address/storage/JsonAdaptedGuest.java | 27 +++--- ...ook.json => typicalGuestsAddressBook.json} | 0 .../model/person/DietaryRequirementsTest.java | 93 ------------------- 10 files changed, 154 insertions(+), 215 deletions(-) delete mode 100644 src/main/java/wedlog/address/model/person/DietaryRequirements.java create mode 100644 src/main/java/wedlog/address/model/tag/DietaryRequirement.java create mode 100644 src/main/java/wedlog/address/storage/JsonAdaptedDietaryRequirement.java rename src/test/data/JsonSerializableAddressBookTest/{typicaGuestsAddressBook.json => typicalGuestsAddressBook.json} (100%) delete mode 100644 src/test/java/wedlog/address/model/person/DietaryRequirementsTest.java diff --git a/src/main/java/wedlog/address/logic/parser/GuestAddCommandParser.java b/src/main/java/wedlog/address/logic/parser/GuestAddCommandParser.java index 021e80b731e..b46f9a6a585 100644 --- a/src/main/java/wedlog/address/logic/parser/GuestAddCommandParser.java +++ b/src/main/java/wedlog/address/logic/parser/GuestAddCommandParser.java @@ -16,13 +16,13 @@ import wedlog.address.logic.commands.GuestAddCommand; import wedlog.address.logic.parser.exceptions.ParseException; import wedlog.address.model.person.Address; -import wedlog.address.model.person.DietaryRequirements; import wedlog.address.model.person.Email; import wedlog.address.model.person.Guest; import wedlog.address.model.person.Name; import wedlog.address.model.person.Phone; import wedlog.address.model.person.RsvpStatus; import wedlog.address.model.person.TableNumber; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; /** @@ -46,9 +46,9 @@ public GuestAddCommand parse(String args) throws ParseException { // message usage is a generic message about how to use the add command for guests } - // throws parse exception if any field (except tags) is inputted twice + // throws parse exception if any field (except dietary and tags) is inputted twice argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_RSVP, - PREFIX_DIETARY, PREFIX_TABLE); + PREFIX_TABLE); // marks the optional fields null if they are empty Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()); @@ -58,9 +58,8 @@ public GuestAddCommand parse(String args) throws ParseException { RsvpStatus rsvpStatus = argMultimap.getValue(PREFIX_RSVP).isEmpty() ? RsvpStatus.unknown() // no input defaults to Status stored as unknown : ParserUtil.parseRsvp(argMultimap.getValue(PREFIX_RSVP).get()); - DietaryRequirements dietaryRequirements = argMultimap.getValue(PREFIX_DIETARY).isEmpty() - ? new DietaryRequirements(null) - : ParserUtil.parseDietary(argMultimap.getValue(PREFIX_DIETARY).get()); + Set dietaryRequirements = + ParserUtil.parseDietaryRequirements(argMultimap.getAllValues(PREFIX_DIETARY)); TableNumber tableNumber = argMultimap.getValue(PREFIX_TABLE).isEmpty() ? null : ParserUtil.parseTable(argMultimap.getValue(PREFIX_TABLE).get()); diff --git a/src/main/java/wedlog/address/logic/parser/ParserUtil.java b/src/main/java/wedlog/address/logic/parser/ParserUtil.java index 154ed3866cf..2dbe7bd1a9d 100644 --- a/src/main/java/wedlog/address/logic/parser/ParserUtil.java +++ b/src/main/java/wedlog/address/logic/parser/ParserUtil.java @@ -11,12 +11,12 @@ import wedlog.address.commons.util.StringUtil; import wedlog.address.logic.parser.exceptions.ParseException; import wedlog.address.model.person.Address; -import wedlog.address.model.person.DietaryRequirements; import wedlog.address.model.person.Email; import wedlog.address.model.person.Name; import wedlog.address.model.person.Phone; import wedlog.address.model.person.RsvpStatus; import wedlog.address.model.person.TableNumber; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; /** @@ -107,19 +107,29 @@ public static RsvpStatus parseRsvp(String rsvp) throws ParseException { } /** - * Parses a {@code String dietaryRequirements} into a {@code DietaryRequirements}. + * Parses a {@code String dietaryRequirement} into a {@code DietaryRequirement}. * Leading and trailing whitespaces will be trimmed. * - * @throws ParseException if the given {@code rsvp} is invalid. + * @throws ParseException if the given {@code dietaryRequirement} is invalid. */ - public static DietaryRequirements parseDietary(String dietaryRequirements) { + public static DietaryRequirement parseDietaryRequirement(String dietaryRequirement) { + requireNonNull(dietaryRequirement); + String trimmedDietaryRequirement = dietaryRequirement.trim(); + return new DietaryRequirement(trimmedDietaryRequirement); + } - if (dietaryRequirements == null) { - return new DietaryRequirements(null); + /** + * Parses {@code Collection dietaryRequirements} into a {@code Set}. + */ + public static Set parseDietaryRequirements(Collection dietaryRequirements) + throws ParseException { + requireNonNull(dietaryRequirements); + final Set dietarySet = new HashSet<>(); + for (String dietary : dietaryRequirements) { + // takes in a list of strings & parse then put into a hashset + dietarySet.add(parseDietaryRequirement(dietary)); } - - String trimmedDietaryRequirements = dietaryRequirements.trim(); - return new DietaryRequirements(trimmedDietaryRequirements); + return dietarySet; } /** diff --git a/src/main/java/wedlog/address/model/person/DietaryRequirements.java b/src/main/java/wedlog/address/model/person/DietaryRequirements.java deleted file mode 100644 index aeb07b66e11..00000000000 --- a/src/main/java/wedlog/address/model/person/DietaryRequirements.java +++ /dev/null @@ -1,88 +0,0 @@ -package wedlog.address.model.person; - -import java.util.Objects; - -/** - * Represents a Guest's dietary requirements in WedLog. - * Guarantees: immutable; is always valid - */ -public class DietaryRequirements { - - /** - * Dietary requirement status can only be one of the following values. - */ - public enum Status { - NONE, NULL, PRESENT; - } - public final String value; - public final Status status; - - /** - * Constructs a {@code DietaryRequirements}. - * - * @param remark A dietary requirement. - */ - public DietaryRequirements(String remark) { - if (remark == null) { - status = Status.NULL; - value = null; - return; - } - - value = remark.trim(); - - if (value.isEmpty()) { - status = Status.NONE; - } else { - status = Status.PRESENT; - } - - - } - - /** - * Returns true if there are no dietary requirements. - */ - public boolean isNoneDietaryRequirement() { - return status == Status.NONE; - } - - /** - * Returns true if dietary requirements are unspecified. - */ - public boolean isNullDietaryRequirement() { - return status == Status.NULL; - } - - @Override - public String toString() { - return value; - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - - // Dietary Requirement where Status.NULL is equal to null object - // See Messages.DisplayBuilder#add(String, Object) for usage - if (other == null) { - return this.status.equals(Status.NULL); - } - - // instanceof handles nulls - if (!(other instanceof DietaryRequirements)) { - return false; - } - - DietaryRequirements otherDr = (DietaryRequirements) other; - return status.equals(otherDr.status) && Objects.equals(value, otherDr.value); - } - - @Override - public int hashCode() { - return value.hashCode(); - } - -} diff --git a/src/main/java/wedlog/address/model/person/Guest.java b/src/main/java/wedlog/address/model/person/Guest.java index 8516f5a3b27..02a4f8c1e94 100644 --- a/src/main/java/wedlog/address/model/person/Guest.java +++ b/src/main/java/wedlog/address/model/person/Guest.java @@ -2,11 +2,14 @@ import static wedlog.address.commons.util.CollectionUtil.requireAllNonNull; +import java.util.Collections; +import java.util.HashSet; import java.util.Objects; import java.util.Optional; import java.util.Set; import wedlog.address.commons.util.ToStringBuilder; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; /** @@ -17,19 +20,18 @@ public class Guest extends Person { // Additional data fields private final RsvpStatus rsvpStatus; - private final DietaryRequirements dietaryRequirements; + private final Set dietaryRequirements = new HashSet<>(); private final Optional tableNumber; /** * Name, rsvp status, dietary requirements and tags must be present and not null. */ public Guest(Name name, Phone phone, Email email, Address address, RsvpStatus rsvpStatus, - DietaryRequirements dietaryRequirements, TableNumber tableNumber, Set tags) { + Set dietaryRequirements, TableNumber tableNumber, Set tags) { super(name, phone, email, address, tags); requireAllNonNull(rsvpStatus); this.rsvpStatus = rsvpStatus; - this.dietaryRequirements = - Objects.requireNonNullElseGet(dietaryRequirements, () -> new DietaryRequirements(null)); + this.dietaryRequirements.addAll(dietaryRequirements); this.tableNumber = Optional.ofNullable(tableNumber); } @@ -37,8 +39,12 @@ public RsvpStatus getRsvpStatus() { return rsvpStatus; } - public DietaryRequirements getDietaryRequirements() { - return dietaryRequirements; + /** + * Returns an immutable dietary requirement set, which throws {@code UnsupportedOperationException} + * if modification is attempted. + */ + public Set getDietaryRequirements() { + return Collections.unmodifiableSet(dietaryRequirements); } public Optional getTableNumber() { diff --git a/src/main/java/wedlog/address/model/tag/DietaryRequirement.java b/src/main/java/wedlog/address/model/tag/DietaryRequirement.java new file mode 100644 index 00000000000..a9801a5b7e1 --- /dev/null +++ b/src/main/java/wedlog/address/model/tag/DietaryRequirement.java @@ -0,0 +1,48 @@ +package wedlog.address.model.tag; + +import static java.util.Objects.requireNonNull; + +/** + * Represents a Guest's dietary requirement in WedLog. + * Guarantees: immutable; is always valid + */ +public class DietaryRequirement { + + public final String value; + + /** + * Constructs a {@code DietaryRequirement}. + * + * @param remark A dietary requirement. + */ + public DietaryRequirement(String remark) { + requireNonNull(remark); + this.value = remark; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof DietaryRequirement)) { + return false; + } + + DietaryRequirement otherDietaryRequirement = (DietaryRequirement) other; + return value.equals(otherDietaryRequirement.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toString() { + return '[' + value + ']'; + } + +} diff --git a/src/main/java/wedlog/address/model/util/SampleDataUtil.java b/src/main/java/wedlog/address/model/util/SampleDataUtil.java index f1174143293..78a2ef36fa4 100644 --- a/src/main/java/wedlog/address/model/util/SampleDataUtil.java +++ b/src/main/java/wedlog/address/model/util/SampleDataUtil.java @@ -11,6 +11,7 @@ import wedlog.address.model.person.Name; import wedlog.address.model.person.Person; import wedlog.address.model.person.Phone; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; /** @@ -57,4 +58,13 @@ public static Set getTagSet(String... strings) { .collect(Collectors.toSet()); } + /** + * Returns a set of dietary requirements containing the list of strings given. + */ + public static Set getDietaryRequirementSet(String... strings) { + return Arrays.stream(strings) + .map(DietaryRequirement::new) + .collect(Collectors.toSet()); + } + } diff --git a/src/main/java/wedlog/address/storage/JsonAdaptedDietaryRequirement.java b/src/main/java/wedlog/address/storage/JsonAdaptedDietaryRequirement.java new file mode 100644 index 00000000000..55f4147505e --- /dev/null +++ b/src/main/java/wedlog/address/storage/JsonAdaptedDietaryRequirement.java @@ -0,0 +1,46 @@ +package wedlog.address.storage; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import wedlog.address.commons.exceptions.IllegalValueException; +import wedlog.address.model.tag.DietaryRequirement; + +/** + * Jackson-friendly version of {@link DietaryRequirement}. + */ +public class JsonAdaptedDietaryRequirement { + + private final String dietaryRequirement; + + /** + * Constructs a {@code JsonAdaptedDietaryRequirement} with the given {@code dietaryRequirement}. + */ + @JsonCreator + public JsonAdaptedDietaryRequirement(String dietaryRequirement) { + this.dietaryRequirement = dietaryRequirement; + } + + /** + * Converts a given {@code DietaryRequirement} into this class for Jackson use. + */ + public JsonAdaptedDietaryRequirement(DietaryRequirement source) { + dietaryRequirement = source.value; + } + + @JsonValue + public String getDietaryRequirement() { + return dietaryRequirement; + } + + /** + * Converts this Jackson-friendly adapted dietary requirement object into the model's {@code DietaryRequirement} + * object. + * + * @throws IllegalValueException if there were any data constraints violated in the adapted dietary requirement. + */ + public DietaryRequirement toModelType() throws IllegalValueException { + return new DietaryRequirement(dietaryRequirement); + } + +} diff --git a/src/main/java/wedlog/address/storage/JsonAdaptedGuest.java b/src/main/java/wedlog/address/storage/JsonAdaptedGuest.java index 80c90aadf37..f1e3a6a96d8 100644 --- a/src/main/java/wedlog/address/storage/JsonAdaptedGuest.java +++ b/src/main/java/wedlog/address/storage/JsonAdaptedGuest.java @@ -10,13 +10,13 @@ import wedlog.address.commons.exceptions.IllegalValueException; import wedlog.address.model.person.Address; -import wedlog.address.model.person.DietaryRequirements; import wedlog.address.model.person.Email; import wedlog.address.model.person.Guest; import wedlog.address.model.person.Name; import wedlog.address.model.person.Phone; import wedlog.address.model.person.RsvpStatus; import wedlog.address.model.person.TableNumber; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; /** @@ -27,7 +27,7 @@ class JsonAdaptedGuest extends JsonAdaptedPerson { public static final String MISSING_FIELD_MESSAGE_FORMAT = "Guest's %s field is missing!"; private final String rsvpStatus; - private final String dietaryRequirements; + private final List dietaryRequirements = new ArrayList<>(); private final String tableNumber; /** @@ -37,14 +37,16 @@ class JsonAdaptedGuest extends JsonAdaptedPerson { public JsonAdaptedGuest(@JsonProperty("name") String name, @JsonProperty("phone") String phone, @JsonProperty("email") String email, @JsonProperty("address") String address, @JsonProperty("rsvpStatus") String rsvpStatus, - @JsonProperty("dietaryRequirements") String dietaryRequirements, + @JsonProperty("dietaryRequirements") List dietaryRequirements, @JsonProperty("tableNumber") String tableNumber, @JsonProperty("tags") List tags) { super(name, phone, email, address, tags); this.rsvpStatus = rsvpStatus; - this.dietaryRequirements = dietaryRequirements; this.tableNumber = tableNumber; + if (dietaryRequirements != null) { + this.dietaryRequirements.addAll(dietaryRequirements); + } } /** @@ -54,8 +56,10 @@ public JsonAdaptedGuest(Guest source) { super(source); rsvpStatus = source.getRsvpStatus().value; - dietaryRequirements = source.getDietaryRequirements().value; tableNumber = source.getTableNumber().map(tn -> tn.value).orElse(null); + dietaryRequirements.addAll(source.getDietaryRequirements().stream() + .map(JsonAdaptedDietaryRequirement::new) + .collect(java.util.stream.Collectors.toList())); } /** @@ -68,6 +72,10 @@ public Guest toModelType() throws IllegalValueException { for (JsonAdaptedTag tag : tags) { guestTags.add(tag.toModelType()); } + final List guestDietaryRequirements = new ArrayList<>(); + for (JsonAdaptedDietaryRequirement dietaryRequirement : dietaryRequirements) { + guestDietaryRequirements.add(dietaryRequirement.toModelType()); + } if (name == null) { throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName())); @@ -114,14 +122,6 @@ public Guest toModelType() throws IllegalValueException { modelRsvpStatus = new RsvpStatus(rsvpStatus); } - final DietaryRequirements modelDietaryRequirements; - if (dietaryRequirements == null) { - modelDietaryRequirements = null; - } else { - // Dietary Requirements are always valid - modelDietaryRequirements = new DietaryRequirements(dietaryRequirements); - } - final TableNumber modelTableNumber; if (tableNumber == null) { modelTableNumber = null; @@ -132,6 +132,7 @@ public Guest toModelType() throws IllegalValueException { } final Set modelTags = new HashSet<>(guestTags); + final Set modelDietaryRequirements = new HashSet<>(guestDietaryRequirements); return new Guest(modelName, modelPhone, modelEmail, modelAddress, modelRsvpStatus, modelDietaryRequirements, modelTableNumber, modelTags); } diff --git a/src/test/data/JsonSerializableAddressBookTest/typicaGuestsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalGuestsAddressBook.json similarity index 100% rename from src/test/data/JsonSerializableAddressBookTest/typicaGuestsAddressBook.json rename to src/test/data/JsonSerializableAddressBookTest/typicalGuestsAddressBook.json diff --git a/src/test/java/wedlog/address/model/person/DietaryRequirementsTest.java b/src/test/java/wedlog/address/model/person/DietaryRequirementsTest.java deleted file mode 100644 index 94e2ff6c12b..00000000000 --- a/src/test/java/wedlog/address/model/person/DietaryRequirementsTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package wedlog.address.model.person; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -/** - * Simple test class for DietaryRequirements. - * - * @author Keagan - * @version v1.2 - */ -public class DietaryRequirementsTest { - - @Test - public void equals() { - DietaryRequirements dr = new DietaryRequirements("Halal"); - - // same object -> returns true - assertTrue(dr.equals(dr)); - - // same values -> returns true - DietaryRequirements drCopy = new DietaryRequirements(dr.value); - assertTrue(dr.equals(drCopy)); - - // different types -> returns false - assertFalse(dr.equals(1)); - - // null -> returns false - assertFalse(dr.equals(null)); - - // different dr -> returns false - DietaryRequirements differentDr = new DietaryRequirements("Vegan"); - assertFalse(dr.equals(differentDr)); - - // same none status -> returns true - DietaryRequirements noneDr = new DietaryRequirements(""); - DietaryRequirements noneDrCopy = new DietaryRequirements(""); - assertTrue(noneDr.equals(noneDrCopy)); - - // same none status with spacing -> returns true - DietaryRequirements noneSpacedDrCopy = new DietaryRequirements(" "); - assertTrue(noneDr.equals(noneSpacedDrCopy)); - - // same null value -> returns true - DietaryRequirements nullDr = new DietaryRequirements(null); - DietaryRequirements nullDrCopy = new DietaryRequirements(null); - assertTrue(nullDr.equals(nullDrCopy)); - - // different status -> returns false - assertFalse(dr.equals(noneDr)); - assertFalse(noneDr.equals(nullDrCopy)); - } - - @Test - void isNoneDietaryRequirement() { - // present dietary requirement - DietaryRequirements dr = new DietaryRequirements("Halal"); - assertFalse(dr.isNoneDietaryRequirement()); - - // none dietary requirement - DietaryRequirements noneDr = new DietaryRequirements(""); - assertTrue(noneDr.isNoneDietaryRequirement()); - - // none dietary requirement with spacing - DietaryRequirements noneSpacedDr = new DietaryRequirements(" "); - assertTrue(noneSpacedDr.isNoneDietaryRequirement()); - - // null dietary requirement - DietaryRequirements nullDr = new DietaryRequirements(null); - assertFalse(nullDr.isNoneDietaryRequirement()); - } - - @Test - void isNullDietaryRequirement() { - // present dietary requirement - DietaryRequirements dr = new DietaryRequirements("Halal"); - assertFalse(dr.isNullDietaryRequirement()); - - // none dietary requirement - DietaryRequirements noneDr = new DietaryRequirements(""); - assertFalse(noneDr.isNullDietaryRequirement()); - - // none dietary requirement with spacing - DietaryRequirements noneSpacedDr = new DietaryRequirements(" "); - assertFalse(noneSpacedDr.isNullDietaryRequirement()); - - // null dietary requirement - DietaryRequirements nullDr = new DietaryRequirements(null); - assertTrue(nullDr.isNullDietaryRequirement()); - } -} From 681d559d6883b14e6e6c0bdfaa51f9bacfb5db4b Mon Sep 17 00:00:00 2001 From: Keagan Date: Tue, 24 Oct 2023 20:04:56 +0800 Subject: [PATCH 02/12] Rewrite testcases involving dietary requirements --- .../duplicateGuestAddressBook.json | 4 +- .../typicalGuestsAddressBook.json | 8 ++-- .../parser/GuestAddCommandParserTest.java | 3 +- .../address/logic/parser/ParserUtilTest.java | 47 ++++++++++++------- .../address/model/person/GuestTest.java | 19 ++++---- .../model/tag/DietaryRequirementTest.java | 14 ++++++ .../address/storage/JsonAdaptedGuestTest.java | 25 +++------- .../wedlog/address/testutil/GuestBuilder.java | 26 ++++------ .../wedlog/address/testutil/GuestUtil.java | 14 +++--- .../address/testutil/TypicalGuests.java | 5 +- 10 files changed, 89 insertions(+), 76 deletions(-) create mode 100644 src/test/java/wedlog/address/model/tag/DietaryRequirementTest.java diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicateGuestAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicateGuestAddressBook.json index 1bad81cb8d0..04a4a585b25 100644 --- a/src/test/data/JsonSerializableAddressBookTest/duplicateGuestAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/duplicateGuestAddressBook.json @@ -6,7 +6,7 @@ "email": "gina@example.com", "address": "123, Jurong West Ave 6, #08-111", "rsvpStatus": "yes", - "dietaryRequirements": "vegan", + "dietaryRequirements": [ "vegan" ], "tableNumber": "13", "tags": [ "friends" ] }, { @@ -15,7 +15,7 @@ "email": "pauline@example.com", "address": "4th street", "rsvpStatus": "unknown", - "dietaryRequirements": "no seafood", + "dietaryRequirements": [ "no seafood" ], "tableNumber": "31", "tags": [ "coworkers" ] } ], diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalGuestsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalGuestsAddressBook.json index 65c4078952d..dfaf1ecaa0c 100644 --- a/src/test/data/JsonSerializableAddressBookTest/typicalGuestsAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/typicalGuestsAddressBook.json @@ -7,7 +7,7 @@ "email" : "gina@example.com", "address" : "123, Jurong West Ave 6, #08-111", "rsvpStatus" : "yes", - "dietaryRequirements" : "vegan", + "dietaryRequirements" : [ "vegan" ], "tableNumber" : "1", "tags" : [ "friends" ] }, { @@ -16,7 +16,7 @@ "email" : "greg@example.com", "address" : "311, Clementi Ave 2, #02-25", "rsvpStatus" : "no", - "dietaryRequirements" : "none", + "dietaryRequirements" : [ "none" ], "tableNumber" : "2", "tags" : [ "owesMoney", "friends" ] }, { @@ -25,7 +25,7 @@ "email" : "gabkurz@example.com", "address" : "wall street", "rsvpStatus" : "unknown", - "dietaryRequirements" : "vegetarian", + "dietaryRequirements" : [ "vegetarian" ], "tableNumber" : "3", "tags" : [ ] }, { @@ -34,7 +34,7 @@ "email" : "georgemeier@example.com", "address" : "10th street", "rsvpStatus" : "yes", - "dietaryRequirements" : "no beef", + "dietaryRequirements" : [ "no beef" ], "tableNumber" : "4", "tags" : [ "friends" ] } ], diff --git a/src/test/java/wedlog/address/logic/parser/GuestAddCommandParserTest.java b/src/test/java/wedlog/address/logic/parser/GuestAddCommandParserTest.java index 2254aaa631c..eab5cdbbaf7 100644 --- a/src/test/java/wedlog/address/logic/parser/GuestAddCommandParserTest.java +++ b/src/test/java/wedlog/address/logic/parser/GuestAddCommandParserTest.java @@ -193,7 +193,6 @@ public void parse_missingPhone_success() { @Test public void parse_missingEmail_success() { - Guest expectedGuest = new GuestBuilder(GIA).withoutEmail().build(); assertParseSuccess(parser, NAME_DESC_GIA + PHONE_DESC_GIA + ADDRESS_DESC_GIA + RSVP_DESC_GIA + DIETARY_DESC_GIA + TABLE_DESC_GIA + TAG_DESC_FRIEND, @@ -218,7 +217,7 @@ public void parse_missingRsvp_success() { @Test public void parse_missingDietaryRequirement_success() { - Guest expectedGuest = new GuestBuilder(GIA).withNullDietaryRequirements().build(); + Guest expectedGuest = new GuestBuilder(GIA).withDietaryRequirements().build(); assertParseSuccess(parser, NAME_DESC_GIA + PHONE_DESC_GIA + EMAIL_DESC_GIA + ADDRESS_DESC_GIA + RSVP_DESC_GIA + TABLE_DESC_GIA + TAG_DESC_FRIEND, new GuestAddCommand(expectedGuest)); diff --git a/src/test/java/wedlog/address/logic/parser/ParserUtilTest.java b/src/test/java/wedlog/address/logic/parser/ParserUtilTest.java index b41dac65c9e..98eaced0ed2 100644 --- a/src/test/java/wedlog/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/wedlog/address/logic/parser/ParserUtilTest.java @@ -15,12 +15,12 @@ import wedlog.address.logic.parser.exceptions.ParseException; import wedlog.address.model.person.Address; -import wedlog.address.model.person.DietaryRequirements; import wedlog.address.model.person.Email; import wedlog.address.model.person.Name; import wedlog.address.model.person.Phone; import wedlog.address.model.person.RsvpStatus; import wedlog.address.model.person.TableNumber; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; public class ParserUtilTest { @@ -39,7 +39,8 @@ public class ParserUtilTest { private static final String VALID_RSVP_YES = "yes"; private static final String VALID_RSVP_NO = "no"; private static final String VALID_RSVP_UNKNOWN = "unknown"; - private static final String VALID_DIETARY_REQUIREMENT = "anything"; + private static final String VALID_DIETARY_REQUIREMENT_1 = "no beef"; + private static final String VALID_DIETARY_REQUIREMENT_2 = "vegan"; private static final String VALID_TABLE_NUMBER = "13"; private static final String VALID_TAG_1 = "friend"; private static final String VALID_TAG_2 = "neighbour"; @@ -199,33 +200,47 @@ public void parseRsvp_validValueWithoutWhitespace_returnsTrimmedRsvp() throws Ex } @Test - public void parseDietary_null_isValidInput() { - assertTrue(ParserUtil.parseDietary(null).value - == new DietaryRequirements(null).value); + public void parseDietaryRequirement_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> ParserUtil.parseDietaryRequirement(null)); } @Test - public void parseDietary_emptyString_dietaryRequirementStoredAsNone() { - DietaryRequirements dietaryRequirementWithEmptyString = new DietaryRequirements(""); - assertTrue(dietaryRequirementWithEmptyString.isNoneDietaryRequirement()); + public void parseDietaryRequirement_validValueWithoutWhiteSpace_returnsDietaryRequirement() { + DietaryRequirement expectedDietaryRequirement = new DietaryRequirement(VALID_DIETARY_REQUIREMENT_1); + assertEquals(expectedDietaryRequirement, ParserUtil.parseDietaryRequirement(VALID_DIETARY_REQUIREMENT_1)); } @Test - public void parseDietary_validValueWithWhitespace_returnsDietaryRequirements() throws Exception { - String dietaryRequirementsWithWhiteSpace = WHITESPACE + VALID_DIETARY_REQUIREMENT + WHITESPACE; - DietaryRequirements expectedDietaryRequirements = new DietaryRequirements(VALID_DIETARY_REQUIREMENT); - assertEquals(expectedDietaryRequirements, ParserUtil.parseDietary(dietaryRequirementsWithWhiteSpace)); + public void parseDietaryRequirement_validValueWithWhiteSpace_returnsTrimmedDietaryRequirement() { + String dietaryRequirementWithWhitespace = WHITESPACE + VALID_DIETARY_REQUIREMENT_1 + WHITESPACE; + DietaryRequirement expectedDietaryRequirement = new DietaryRequirement(VALID_DIETARY_REQUIREMENT_1); + assertEquals(expectedDietaryRequirement, ParserUtil.parseDietaryRequirement(dietaryRequirementWithWhitespace)); } @Test - public void parseDietary_validValueWithoutWhitespace_returnsDietaryRequirements() throws Exception { - DietaryRequirements expectedDietaryRequirements = new DietaryRequirements(VALID_DIETARY_REQUIREMENT); - assertEquals(expectedDietaryRequirements, ParserUtil.parseDietary(VALID_DIETARY_REQUIREMENT)); + public void parseDietaryRequirements_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> ParserUtil.parseDietaryRequirements(null)); + } + + @Test + public void parseDietaryRequirements_emptyCollection_returnsEmptySet() throws Exception { + assertTrue(ParserUtil.parseDietaryRequirements(Collections.emptyList()).isEmpty()); + } + + @Test + public void parseDietaryRequirements_nonEmptyCollection_returnsDietaryRequirementSet() throws Exception { + Set actualDietaryRequirementSet = ParserUtil.parseDietaryRequirements( + Arrays.asList(VALID_DIETARY_REQUIREMENT_1, VALID_DIETARY_REQUIREMENT_2)); + Set expectedDietaryRequirementSet = new HashSet<>( + Arrays.asList(new DietaryRequirement(VALID_DIETARY_REQUIREMENT_1), + new DietaryRequirement(VALID_DIETARY_REQUIREMENT_2))); + + assertEquals(expectedDietaryRequirementSet, actualDietaryRequirementSet); } @Test public void parseTable_null_throwsNullPointerException() { - assertThrows(NullPointerException.class, () -> ParserUtil.parseTable((String) null)); + assertThrows(NullPointerException.class, () -> ParserUtil.parseTable(null)); } @Test diff --git a/src/test/java/wedlog/address/model/person/GuestTest.java b/src/test/java/wedlog/address/model/person/GuestTest.java index d7f00e81980..bf7f73313aa 100644 --- a/src/test/java/wedlog/address/model/person/GuestTest.java +++ b/src/test/java/wedlog/address/model/person/GuestTest.java @@ -21,6 +21,7 @@ import static wedlog.address.model.person.PersonTest.VALID_TAGS; import static wedlog.address.testutil.Assert.assertThrows; import static wedlog.address.testutil.TypicalGuests.GINA; +import static wedlog.address.testutil.TypicalGuests.GRACE; import static wedlog.address.testutil.TypicalGuests.GREG; import java.util.HashSet; @@ -28,6 +29,7 @@ import org.junit.jupiter.api.Test; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; import wedlog.address.testutil.GuestBuilder; @@ -40,8 +42,7 @@ */ public class GuestTest { - public static final DietaryRequirements VALID_DIETARY_REQUIREMENTS = - new DietaryRequirements(VALID_DIETARY_REQUIREMENTS_AMY); + public static final Set VALID_DIETARY_REQUIREMENTS = new HashSet<>(); public static final RsvpStatus VALID_RSVP_STATUS = new RsvpStatus(VALID_RSVP_STATUS_AMY); @@ -66,7 +67,7 @@ public void constructor() { VALID_RSVP_STATUS, VALID_DIETARY_REQUIREMENTS, VALID_TABLE_NUMBER, VALID_TAGS)); // Dietary Requirements Null - assertDoesNotThrow(() -> new Guest(VALID_NAME, VALID_PHONE, VALID_EMAIL, + assertThrows(NullPointerException.class, () -> new Guest(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_RSVP_STATUS, null, VALID_TABLE_NUMBER, VALID_TAGS)); // Rsvp Status Null @@ -116,12 +117,12 @@ public void equals() { editedGina = new GuestBuilder(GINA).withAddress(VALID_ADDRESS_BOB).build(); assertFalse(GINA.equals(editedGina)); - // edited rsvp status -> returns false - editedGina = new GuestBuilder(GINA).withRsvpStatus(VALID_RSVP_STATUS_AMY).build(); + // different dietary requirements -> returns false + editedGina = new GuestBuilder(GINA).withDietaryRequirements(VALID_DIETARY_REQUIREMENTS_BOB).build(); assertFalse(GINA.equals(editedGina)); - // edited dietary requirements -> returns false - editedGina = new GuestBuilder(GINA).withDietaryRequirements(VALID_DIETARY_REQUIREMENTS_BOB).build(); + // edited rsvp status -> returns false + editedGina = new GuestBuilder(GINA).withRsvpStatus(VALID_RSVP_STATUS_AMY).build(); assertFalse(GINA.equals(editedGina)); // different table number -> returns false @@ -155,7 +156,9 @@ public void toStringTest() { Phone phone = new Phone("91234567"); Email email = new Email("bob@bob.com"); Address address = new Address("Blk 123"); - DietaryRequirements dietaryRequirements = new DietaryRequirements("Halal"); + DietaryRequirement dietaryRequirement = new DietaryRequirement("Halal"); + Set dietaryRequirements = new HashSet<>(); + dietaryRequirements.add(dietaryRequirement); RsvpStatus rsvpStatus = new RsvpStatus("yes"); TableNumber tableNumber = new TableNumber("13"); Tag tag = new Tag("friend"); diff --git a/src/test/java/wedlog/address/model/tag/DietaryRequirementTest.java b/src/test/java/wedlog/address/model/tag/DietaryRequirementTest.java new file mode 100644 index 00000000000..2f8914d8b03 --- /dev/null +++ b/src/test/java/wedlog/address/model/tag/DietaryRequirementTest.java @@ -0,0 +1,14 @@ +package wedlog.address.model.tag; + +import static wedlog.address.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class DietaryRequirementTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new DietaryRequirement(null)); + } + +} diff --git a/src/test/java/wedlog/address/storage/JsonAdaptedGuestTest.java b/src/test/java/wedlog/address/storage/JsonAdaptedGuestTest.java index f73d82e6e1f..e40ed7a84c9 100644 --- a/src/test/java/wedlog/address/storage/JsonAdaptedGuestTest.java +++ b/src/test/java/wedlog/address/storage/JsonAdaptedGuestTest.java @@ -40,9 +40,9 @@ public class JsonAdaptedGuestTest { private static final String VALID_YES_RSVP_STATUS = GINA.getRsvpStatus().toString(); private static final String VALID_NO_RSVP_STATUS = GREG.getRsvpStatus().toString(); private static final String VALID_UNKNOWN_RSVP_STATUS = GABRIEL.getRsvpStatus().toString(); - private static final String VALID_DIETARY_REQUIREMENTS = GINA.getDietaryRequirements().toString(); - private static final String VALID_NONE_DIETARY_REQUIREMENTS = GREG.getDietaryRequirements().toString(); - private static final String VALID_NULL_DIETARY_REQUIREMENTS = GABRIEL.getDietaryRequirements().toString(); + private static final List VALID_DIETARY_REQUIREMENTS = GINA.getDietaryRequirements().stream() + .map(JsonAdaptedDietaryRequirement::new) + .collect(Collectors.toList()); private static final String VALID_TABLE_NUMBER = GINA.getTableNumber().get().toString(); private static final String VALID_PRESENT_DIETARY_REQUIREMENTS = GINA.getDietaryRequirements().toString(); @@ -165,24 +165,13 @@ public void toModelType_validRsvpStatus_returnsGuest() throws Exception { @Test public void toModelType_validDietaryRequirements_returnsGuest() throws Exception { - // none dietary requirements status + List dietaryRequirements = new ArrayList<>(VALID_DIETARY_REQUIREMENTS); JsonAdaptedGuest guest = - new JsonAdaptedGuest(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_RSVP_STATUS, VALID_NONE_DIETARY_REQUIREMENTS, VALID_TABLE_NUMBER, VALID_TAGS); - Guest expectedGuest = new GuestBuilder(GINA).withDietaryRequirements(VALID_NONE_DIETARY_REQUIREMENTS).build(); - assertEquals(expectedGuest, guest.toModelType()); - - // null dietary requirements status - guest = new JsonAdaptedGuest(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_RSVP_STATUS, VALID_NULL_DIETARY_REQUIREMENTS, VALID_TABLE_NUMBER, VALID_TAGS); - expectedGuest = new GuestBuilder(GINA).withDietaryRequirements(VALID_NULL_DIETARY_REQUIREMENTS).build(); + new JsonAdaptedGuest(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_RSVP_STATUS, + dietaryRequirements, VALID_TABLE_NUMBER, VALID_TAGS); + Guest expectedGuest = new GuestBuilder(GINA).build(); assertEquals(expectedGuest, guest.toModelType()); - // present dietary requirements status - guest = new JsonAdaptedGuest(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_RSVP_STATUS, VALID_PRESENT_DIETARY_REQUIREMENTS, VALID_TABLE_NUMBER, VALID_TAGS); - expectedGuest = new GuestBuilder(GINA).withDietaryRequirements(VALID_PRESENT_DIETARY_REQUIREMENTS).build(); - assertEquals(expectedGuest, guest.toModelType()); } @Test diff --git a/src/test/java/wedlog/address/testutil/GuestBuilder.java b/src/test/java/wedlog/address/testutil/GuestBuilder.java index 3577f874068..de1250e41d7 100644 --- a/src/test/java/wedlog/address/testutil/GuestBuilder.java +++ b/src/test/java/wedlog/address/testutil/GuestBuilder.java @@ -4,13 +4,13 @@ import java.util.Set; import wedlog.address.model.person.Address; -import wedlog.address.model.person.DietaryRequirements; import wedlog.address.model.person.Email; import wedlog.address.model.person.Guest; import wedlog.address.model.person.Name; import wedlog.address.model.person.Phone; import wedlog.address.model.person.RsvpStatus; import wedlog.address.model.person.TableNumber; +import wedlog.address.model.tag.DietaryRequirement; import wedlog.address.model.tag.Tag; import wedlog.address.model.util.SampleDataUtil; @@ -24,7 +24,6 @@ public class GuestBuilder { public static final String DEFAULT_EMAIL = "amy@gmail.com"; public static final String DEFAULT_ADDRESS = "123, Jurong West Ave 6, #08-111"; public static final String DEFAULT_RSVP_STATUS = "yes"; - public static final String DEFAULT_DIETARY_REQUIREMENTS = "vegan"; public static final String DEFAULT_TABLE_NUMBER = "13"; private Name name; @@ -32,7 +31,7 @@ public class GuestBuilder { private Email email; private Address address; private RsvpStatus rsvpStatus; - private DietaryRequirements dietaryRequirements; + private Set dietaryRequirements; private TableNumber tableNumber; private Set tags; @@ -45,7 +44,7 @@ public GuestBuilder() { email = new Email(DEFAULT_EMAIL); address = new Address(DEFAULT_ADDRESS); rsvpStatus = new RsvpStatus(DEFAULT_RSVP_STATUS); - dietaryRequirements = new DietaryRequirements(DEFAULT_DIETARY_REQUIREMENTS); + dietaryRequirements = new HashSet<>(); tableNumber = new TableNumber(DEFAULT_TABLE_NUMBER); tags = new HashSet<>(); } @@ -59,7 +58,7 @@ public GuestBuilder(String name) { email = null; address = null; rsvpStatus = RsvpStatus.unknown(); - dietaryRequirements = new DietaryRequirements(null); + dietaryRequirements = new HashSet<>(); tableNumber = null; tags = new HashSet<>(); } @@ -73,7 +72,7 @@ public GuestBuilder(Guest guestToCopy) { email = guestToCopy.getEmail().orElse(null); address = guestToCopy.getAddress().orElse(null); rsvpStatus = guestToCopy.getRsvpStatus(); - dietaryRequirements = guestToCopy.getDietaryRequirements(); + dietaryRequirements = new HashSet<>(guestToCopy.getDietaryRequirements()); tableNumber = guestToCopy.getTableNumber().orElse(null); tags = new HashSet<>(guestToCopy.getTags()); } @@ -127,10 +126,11 @@ public GuestBuilder withRsvpStatus(String rsvpStatus) { } /** - * Sets the {@code DietaryRequirements} of the {@code Guest} that we are building. + * Parses the {@code dietaryRequirements} into a {@code Set} + * and set it to the {@code Guest} that we are building. */ - public GuestBuilder withDietaryRequirements(String dietaryRequirements) { - this.dietaryRequirements = new DietaryRequirements(dietaryRequirements); + public GuestBuilder withDietaryRequirements(String ... dietaryRequirements) { + this.dietaryRequirements = SampleDataUtil.getDietaryRequirementSet(dietaryRequirements); return this; } @@ -174,14 +174,6 @@ public GuestBuilder withUnknownRsvpStatus() { return this; } - /** - * Sets the {@code Dietary Requirements} of the {@code Guest} that we are building. - */ - public GuestBuilder withNullDietaryRequirements() { - this.dietaryRequirements = new DietaryRequirements(null); - return this; - } - /** * Sets the {@code TableNumber} of the {@code Guest} that we are building. */ diff --git a/src/test/java/wedlog/address/testutil/GuestUtil.java b/src/test/java/wedlog/address/testutil/GuestUtil.java index 7accfb9e395..d33cff6565a 100644 --- a/src/test/java/wedlog/address/testutil/GuestUtil.java +++ b/src/test/java/wedlog/address/testutil/GuestUtil.java @@ -30,7 +30,9 @@ public static String getGuestDetails(Guest guest) { sb.append(PREFIX_EMAIL + guest.getEmail().map(e -> e.value).orElse("") + " "); sb.append(PREFIX_ADDRESS + guest.getAddress().map(a -> a.value).orElse("") + " "); sb.append(PREFIX_RSVP + guest.getRsvpStatus().toString() + " "); - sb.append(PREFIX_DIETARY + guest.getDietaryRequirements().value + " "); + guest.getDietaryRequirements().stream().forEach( + d -> sb.append(PREFIX_DIETARY + d.value + " ") + ); sb.append(PREFIX_TABLE + guest.getTableNumber().map(tn -> tn.value).orElse("") + " "); guest.getTags().stream().forEach( s -> sb.append(PREFIX_TAG + s.tagName + " ") @@ -47,11 +49,11 @@ public static String getEditPersonDescriptorDetails(EditPersonDescriptor descrip descriptor.getPhone().ifPresent(phone -> sb.append(PREFIX_PHONE).append(phone.value).append(" ")); descriptor.getEmail().ifPresent(email -> sb.append(PREFIX_EMAIL).append(email.value).append(" ")); descriptor.getAddress().ifPresent(address -> sb.append(PREFIX_ADDRESS).append(address.value).append(" ")); - // descriptor.getRsvpStatus().ifPresent(rsvpStatus -> sb.append(PREFIX_RSVP).append(rsvpStatus.toString()) - // .append(" ")); - // descriptor.getDietaryRequirements().ifPresent(dietaryRequirements -> sb.append(PREFIX_DIETARY).append(" ")); - // descriptor.getTableNumber().ifPresent(tableNumber -> sb.append(PREFIX_TABLE).append(tableNumber.toString()) - // .append(" ")); +// descriptor.getRsvpStatus().ifPresent(rsvpStatus -> sb.append(PREFIX_RSVP).append(rsvpStatus.toString()) +// .append(" ")); +// descriptor.getDietaryRequirements().ifPresent(dietaryRequirements -> sb.append(PREFIX_DIETARY).append(" ")); +// descriptor.getTableNumber().ifPresent(tableNumber -> sb.append(PREFIX_TABLE).append(tableNumber.toString()) +// .append(" ")); if (descriptor.getTags().isPresent()) { Set tags = descriptor.getTags().get(); if (tags.isEmpty()) { diff --git a/src/test/java/wedlog/address/testutil/TypicalGuests.java b/src/test/java/wedlog/address/testutil/TypicalGuests.java index 63b9daa38db..48b4e4c7e62 100644 --- a/src/test/java/wedlog/address/testutil/TypicalGuests.java +++ b/src/test/java/wedlog/address/testutil/TypicalGuests.java @@ -40,7 +40,7 @@ public class TypicalGuests { .withTableNumber("1").withTags("owesMoney", "friends").build(); public static final Guest GABRIEL = new GuestBuilder().withName("Gabriel Kurz").withPhone("95352563") .withEmail("gabkurz@example.com").withAddress("wall street") - .withRsvpStatus("unknown").withNullDietaryRequirements().withTableNumber("2") + .withRsvpStatus("unknown").withTableNumber("2") .build(); public static final Guest GEORGE = new GuestBuilder().withName("George Tan").withPhone("87652533") .withEmail("georgemeier@example.com").withAddress("10th street") @@ -54,12 +54,11 @@ public class TypicalGuests { .build(); public static final Guest GRACE = new GuestBuilder().withName("Grace Mueller").withPhone("8482131") .withEmail("grace@example.com").withAddress("chicago ave") - .withRsvpStatus("unknown").withDietaryRequirements("none").withTableNumber("3") + .withRsvpStatus("unknown").withDietaryRequirements("no shellfish", "no pork").withTableNumber("3") .build(); // Manually added - Guest's details found in {@code CommandTestUtil} - public static final Guest GIA = new GuestBuilder().withName(VALID_NAME_GIA).withPhone(VALID_PHONE_GIA) .withEmail(VALID_EMAIL_GIA).withAddress(VALID_ADDRESS_GIA).withRsvpStatus(VALID_RSVP_STATUS_GIA) .withDietaryRequirements(VALID_DIETARY_REQUIREMENTS_GIA).withTableNumber(VALID_TABLE_NUMBER_GIA) From a075728d1f6b49ede8790b9633342bb5eabb0e17 Mon Sep 17 00:00:00 2001 From: Keagan Date: Tue, 24 Oct 2023 20:15:23 +0800 Subject: [PATCH 03/12] Update UI to reflect changes in dietary requirements --- src/main/java/wedlog/address/ui/GuestCard.java | 9 +++++---- src/main/resources/view/DarkTheme.css | 14 ++++++++++++++ src/main/resources/view/GuestListCard.fxml | 2 +- src/main/resources/view/GuestListPanel.fxml | 2 +- src/main/resources/view/MainWindow.fxml | 2 +- src/main/resources/view/StatisticsPanel.fxml | 2 +- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/wedlog/address/ui/GuestCard.java b/src/main/java/wedlog/address/ui/GuestCard.java index d957bcd125b..cd6d17da571 100644 --- a/src/main/java/wedlog/address/ui/GuestCard.java +++ b/src/main/java/wedlog/address/ui/GuestCard.java @@ -47,7 +47,7 @@ public class GuestCard extends UiPart { @FXML private Label rsvpStatus; @FXML - private Label dietaryRequirements; + private FlowPane dietaryRequirements; @FXML private Label tableNumber; @FXML @@ -79,9 +79,10 @@ public GuestCard(Guest guest, int displayedIndex) { rsvpStatus.setStyle("-fx-background-color: orange"); } - - dietaryRequirements.setText(Optional.ofNullable(guest.getDietaryRequirements()).map(d -> d.value) - .orElse("-")); + guest.getDietaryRequirements().stream() + .sorted(Comparator.comparing(dietaryRequirement -> dietaryRequirement.value)) + .forEach(dietaryRequirement -> dietaryRequirements.getChildren() + .add(new Label(dietaryRequirement.value))); guest.getTags().stream() .sorted(Comparator.comparing(tag -> tag.tagName)) .forEach(tag -> tags.getChildren().add(new Label(tag.tagName))); diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index 8da398dbbb3..ee6818ffe6d 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -348,6 +348,20 @@ -fx-background-color: transparent, #edede9, transparent, #edede9; } +#dietaryRequirements { + -fx-hgap: 7; + -fx-vgap: 3; +} + +#dietaryRequirements .label { + -fx-text-fill: black; + -fx-background-color: #83a832; + -fx-padding: 2 4 2 4; + -fx-border-radius: 2; + -fx-background-radius: 2; + -fx-font-size: 14; +} + #tags { -fx-hgap: 7; -fx-vgap: 3; diff --git a/src/main/resources/view/GuestListCard.fxml b/src/main/resources/view/GuestListCard.fxml index e177479b9b6..4d665df7213 100644 --- a/src/main/resources/view/GuestListCard.fxml +++ b/src/main/resources/view/GuestListCard.fxml @@ -28,11 +28,11 @@