From 88f0007cdaf354f9249a8619f7415a9dc9ac1d7c Mon Sep 17 00:00:00 2001 From: SViswa02 Date: Tue, 22 Oct 2024 11:05:13 +0800 Subject: [PATCH 1/5] Add mark and unmark command with changes to UI --- .../java/seedu/address/logic/Messages.java | 6 ++ .../address/logic/commands/MarkCommand.java | 102 ++++++++++++++++++ .../address/logic/commands/UnmarkCommand.java | 81 ++++++++++++++ .../logic/parser/AddressBookParser.java | 8 ++ .../seedu/address/logic/parser/CliSyntax.java | 1 + .../logic/parser/MarkCommandParser.java | 41 +++++++ .../address/logic/parser/ParserUtil.java | 23 ++++ .../logic/parser/UnmarkCommandParser.java | 41 +++++++ src/main/java/seedu/address/model/Model.java | 10 ++ .../seedu/address/model/ModelManager.java | 26 +++++ .../seedu/address/model/person/Person.java | 57 ++++++++++ .../address/storage/JsonAdaptedPerson.java | 15 ++- .../java/seedu/address/ui/PersonCard.java | 6 ++ src/main/resources/view/DarkTheme.css | 14 +++ src/main/resources/view/PersonListCard.fxml | 1 + .../seedu/address/logic/LogicManagerTest.java | 1 - .../logic/commands/AddCommandTest.java | 11 ++ .../storage/JsonAdaptedPersonTest.java | 37 ++++--- 18 files changed, 465 insertions(+), 16 deletions(-) create mode 100644 src/main/java/seedu/address/logic/commands/MarkCommand.java create mode 100644 src/main/java/seedu/address/logic/commands/UnmarkCommand.java create mode 100644 src/main/java/seedu/address/logic/parser/MarkCommandParser.java create mode 100644 src/main/java/seedu/address/logic/parser/UnmarkCommandParser.java diff --git a/src/main/java/seedu/address/logic/Messages.java b/src/main/java/seedu/address/logic/Messages.java index c24a1ded0ef..e24c20e9027 100644 --- a/src/main/java/seedu/address/logic/Messages.java +++ b/src/main/java/seedu/address/logic/Messages.java @@ -19,6 +19,12 @@ public class Messages { public static final String MESSAGE_DUPLICATE_FIELDS = "Multiple values specified for the following single-valued field(s): "; public static final String MESSAGE_INVALID_PERSON_DISPLAYED_NAME = "The person name provided is invalid"; + public static final String MESSAGE_MARK_SUCCESS = "%1$s is marked present for week %2$d"; + public static final String MESSAGE_INVALID_WEEK = "Invalid week number."; + public static final String MESSAGE_MARK_ALREADY_SUCCESS = "Attendance is already marked for this student!"; + public static final String MESSAGE_UNMARK_ALREADY_SUCCESS = "Attendance is already unmarked for this student"; + public static final String MESSAGE_UNMARK_SUCCESS = "%1$s is marked as absent for week %2$d"; + /** * Returns an error message indicating the duplicate prefixes. diff --git a/src/main/java/seedu/address/logic/commands/MarkCommand.java b/src/main/java/seedu/address/logic/commands/MarkCommand.java new file mode 100644 index 00000000000..37e8695fdf3 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/MarkCommand.java @@ -0,0 +1,102 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; +import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_NAME; +import static seedu.address.logic.Messages.MESSAGE_MARK_ALREADY_SUCCESS; +import static seedu.address.logic.Messages.MESSAGE_MARK_SUCCESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_WEEK; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +import seedu.address.commons.util.ToStringBuilder; +import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.model.Model; +import seedu.address.model.person.Name; +import seedu.address.model.person.Person; + +/** + * Marks a specific student as present for that particular week. + */ +public class MarkCommand extends Command { + + public static final String COMMAND_WORD = "mark"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Marks the name as present for that particular " + + "week.\n " + + "Parameters: " + PREFIX_NAME + "NAME" + PREFIX_WEEK + "WEEK NUMBER" + + "Example: " + COMMAND_WORD + " " + + PREFIX_NAME + "John Doe " + + PREFIX_WEEK + "1"; + + public final int week; + private final Name name; + + /** + * Constuctor for MarkCommand + * @param name the name of the student + * @param week the week number + */ + public MarkCommand(Name name, int week) { + this.name = name; + this.week = week; + } + + @Override + public CommandResult execute(Model model) throws CommandException { + requireNonNull(model); + + Optional optionalPersonToMark = model.getPerson(name); + if (!optionalPersonToMark.isPresent()) { + throw new CommandException(String.format(MESSAGE_INVALID_PERSON_DISPLAYED_NAME, name)); + } + + Person personToMark = optionalPersonToMark.get(); + Set updatedWeeksPresent = new HashSet<>(personToMark.getWeeksPresent()); + + if (!updatedWeeksPresent.add(week)) { + return new CommandResult(String.format(MESSAGE_MARK_ALREADY_SUCCESS, name, week)); + } + + Person updatedPerson = new Person( + personToMark.getName(), + personToMark.getPhone(), + personToMark.getAddress(), + personToMark.getEmail(), + personToMark.getTelegram(), + personToMark.getGithub(), + personToMark.getAssignment(), + updatedWeeksPresent, // Updated weeks present + personToMark.getTags()); + + model.setPerson(personToMark, updatedPerson); + + return new CommandResult(String.format(MESSAGE_MARK_SUCCESS, name, week)); + + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof MarkCommand)) { + return false; + } + + MarkCommand otherMarkCommand = (MarkCommand) other; + return name.equals(otherMarkCommand.name) && week == otherMarkCommand.week; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .add("name", name) + .add("week", week) + .toString(); + } +} diff --git a/src/main/java/seedu/address/logic/commands/UnmarkCommand.java b/src/main/java/seedu/address/logic/commands/UnmarkCommand.java new file mode 100644 index 00000000000..13e7c01fb20 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/UnmarkCommand.java @@ -0,0 +1,81 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; +import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_NAME; +import static seedu.address.logic.Messages.MESSAGE_UNMARK_SUCCESS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_WEEK; + +import java.util.Optional; + +import seedu.address.commons.util.ToStringBuilder; +import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.model.Model; +import seedu.address.model.person.Name; +import seedu.address.model.person.Person; + +/** + * Marks a specific student as present for that particular week. + */ +public class UnmarkCommand extends Command { + + public static final String COMMAND_WORD = "unmark"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Unmarks the name as present for that particular " + + "week.\n " + + "Parameters: " + PREFIX_NAME + "NAME" + PREFIX_WEEK + "WEEK NUMBER" + + "Example: " + COMMAND_WORD + " " + + PREFIX_NAME + "John Doe " + + PREFIX_WEEK + "1"; + + public final int week; + private final Name name; + + /** + * Constuctor for MarkCommand + * @param name the name of the student + * @param week the week number + */ + public UnmarkCommand(Name name, int week) { + this.name = name; + this.week = week; + } + + @Override + public CommandResult execute(Model model) throws CommandException { + requireNonNull(model); + + Optional personToUnmark = model.getPerson(name); + if (!personToUnmark.isPresent()) { + throw new CommandException(String.format(MESSAGE_INVALID_PERSON_DISPLAYED_NAME, name)); + } + + Person person = personToUnmark.get(); + person.unmarkWeekPresent(week); + + return new CommandResult(String.format(MESSAGE_UNMARK_SUCCESS, person.getName(), week)); + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + // instanceof handles nulls + if (!(other instanceof UnmarkCommand)) { + return false; + } + + UnmarkCommand otherUnmarkCommand = (UnmarkCommand) other; + return name.equals(otherUnmarkCommand.name) && week == otherUnmarkCommand.week; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .add("name", name) + .add("week", week) + .toString(); + } +} diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index b000478d671..3864ade5464 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -19,6 +19,8 @@ import seedu.address.logic.commands.FindCommand; import seedu.address.logic.commands.HelpCommand; import seedu.address.logic.commands.ListCommand; +import seedu.address.logic.commands.MarkCommand; +import seedu.address.logic.commands.UnmarkCommand; import seedu.address.logic.parser.exceptions.ParseException; /** @@ -85,6 +87,12 @@ public Command parseCommand(String userInput) throws ParseException { case FilterCommand.COMMAND_WORD: return new FilterCommandParser().parse(arguments); + case MarkCommand.COMMAND_WORD: + return new MarkCommandParser().parse(arguments); + + case UnmarkCommand.COMMAND_WORD: + return new UnmarkCommandParser().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/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java index 580c230b3a8..e30a85d02a4 100644 --- a/src/main/java/seedu/address/logic/parser/CliSyntax.java +++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java @@ -15,4 +15,5 @@ public class CliSyntax { public static final Prefix PREFIX_SCORE = new Prefix("s/"); public static final Prefix PREFIX_TELEGRAM = new Prefix("telegram/"); public static final Prefix PREFIX_GITHUB = new Prefix("github/"); + public static final Prefix PREFIX_WEEK = new Prefix("w/"); } diff --git a/src/main/java/seedu/address/logic/parser/MarkCommandParser.java b/src/main/java/seedu/address/logic/parser/MarkCommandParser.java new file mode 100644 index 00000000000..2c25039519b --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/MarkCommandParser.java @@ -0,0 +1,41 @@ +package seedu.address.logic.parser; + +import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_WEEK; + +import java.util.stream.Stream; + +import seedu.address.logic.commands.MarkCommand; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Name; + +/** + * Parses input arguments and creates a new MarkCommand object + */ +public class MarkCommandParser implements Parser { + + /** + * Parses the given {@code String} of arguments in the context of the seedu.address.logic.commands.MarkCommand + * and returns a seedu.address.logic.commands.MarkCommand object for execution. + * @throws ParseException if the user input does not conform the expected format + */ + public MarkCommand parse(String args) throws ParseException { + ArgumentMultimap argumentMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_WEEK); + + if (!arePrefixesPresent(argumentMultimap, PREFIX_NAME, PREFIX_WEEK)) { + throw new ParseException( + String.format(MESSAGE_INVALID_COMMAND_FORMAT, MarkCommand.MESSAGE_USAGE) + ); + } + + Name name = ParserUtil.parseName(argumentMultimap.getValue(PREFIX_NAME).get()); + int week = ParserUtil.parseWeek(argumentMultimap.getValue(PREFIX_WEEK).get()); + + return new MarkCommand(name, week); + } + + private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) { + return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent()); + } +} diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index b5c069e5e80..25034a4c101 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -171,4 +171,27 @@ public static Github parseGithub(String username) throws ParseException { } return new Github(trimmedUsername); } + + /** + * Parses a {@code String week} into an {@code int}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws ParseException if the given {@code week} is invalid. + */ + public static int parseWeek(String week) throws ParseException { + requireNonNull(week); + String trimmedWeek = week.trim(); + + // Ensure it's a non-negative integer. + try { + int parsedWeek = Integer.parseInt(trimmedWeek); + if (parsedWeek < 0) { + throw new ParseException("Week number must be a non-negative integer."); + } + return parsedWeek; + } catch (NumberFormatException e) { + throw new ParseException("Invalid week number. It must be a non-negative integer."); + } + } + } diff --git a/src/main/java/seedu/address/logic/parser/UnmarkCommandParser.java b/src/main/java/seedu/address/logic/parser/UnmarkCommandParser.java new file mode 100644 index 00000000000..99b3b68dc5d --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/UnmarkCommandParser.java @@ -0,0 +1,41 @@ +package seedu.address.logic.parser; + +import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_WEEK; + +import java.util.stream.Stream; + +import seedu.address.logic.commands.UnmarkCommand; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Name; + +/** + * Parses input arguments and creates a new MarkCommand object + */ +public class UnmarkCommandParser implements Parser { + + /** + * Parses the given {@code String} of arguments in the context of the seedu.address.logic.commands.MarkCommand + * and returns a seedu.address.logic.commands.MarkCommand object for execution. + * @throws ParseException if the user input does not conform the expected format + */ + public UnmarkCommand parse(String args) throws ParseException { + ArgumentMultimap argumentMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_WEEK); + + if (!arePrefixesPresent(argumentMultimap, PREFIX_NAME, PREFIX_WEEK)) { + throw new ParseException( + String.format(MESSAGE_INVALID_COMMAND_FORMAT, UnmarkCommand.MESSAGE_USAGE) + ); + } + + Name name = ParserUtil.parseName(argumentMultimap.getValue(PREFIX_NAME).get()); + int week = ParserUtil.parseWeek(argumentMultimap.getValue(PREFIX_WEEK).get()); + + return new UnmarkCommand(name, week); + } + + private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) { + return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent()); + } +} diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index 1f6cb316bcb..bca53213ec8 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -1,6 +1,7 @@ package seedu.address.model; import java.nio.file.Path; +import java.util.Optional; import java.util.function.Predicate; import javafx.collections.ObservableList; @@ -81,6 +82,13 @@ public interface Model { */ void setPerson(Person target, Person editedPerson); + /** + * Returns the person in the address book with the given name. + * @param name The Name to search for + * @return An Optional containing the matched person if that person is found, otherwise an empty Optional + */ + Optional getPerson(Name name); + /** * Returns an unmodifiable view of the filtered person list */ @@ -101,4 +109,6 @@ public interface Model { float maxScore(String assignment); String getAssignmentName(String name); boolean hasName(Name name); + + void markPersonPresent(Name name, int week); } diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index bdbbae0c98d..8d081b7310c 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -4,6 +4,7 @@ import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; import java.nio.file.Path; +import java.util.Optional; import java.util.function.Predicate; import java.util.logging.Logger; @@ -118,6 +119,17 @@ public void setPerson(Person target, Person editedPerson) { addressBook.setPerson(target, editedPerson); } + @Override + public Optional getPerson(Name name) { + for (Person person : addressBook.getPersonList()) { + if (person.getName().equals(name)) { + return Optional.of(person); // Return the person if found + } + } + + // Return an empty Optional if the person is not found + return Optional.empty(); + } //=========== Filtered Person List Accessors ============================================================= /** @@ -169,4 +181,18 @@ public String getAssignmentName(String name) { public boolean hasName(Name name) { return addressBook.hasName(name); } + + //=========== Marking people present ============================================================= + @Override + public void markPersonPresent(Name name, int week) { + for (Person person : filteredPersons) { + if (person.getName().fullName.equals(name.fullName)) { + person.markWeekPresent(week); + return; + } + } + + throw new IllegalArgumentException("Person not found: " + name); + } + } diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index f7fcbf279d2..620c411f48d 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -29,6 +29,7 @@ public class Person { private final Telegram telegram; private final Set tags = new HashSet<>(); private Assignment assignment; + private Set weeksPresent; /** * Every field must be present and not null. @@ -49,6 +50,8 @@ public Person( this.telegram = telegram; this.tags.addAll(tags); this.github = github; + this.weeksPresent = new HashSet<>(); + } /** @@ -73,6 +76,40 @@ public Person( this.address = address; this.tags.addAll(tags); this.assignment = assignment; + this.weeksPresent = new HashSet<>(); + } + + /** + * Constructs a new Person object + * @param name the name of the person + * @param phone the phone number of the person + * @param address the address of the person + * @param email the email of the person + * @param telegram the telegram ID of the person + * @param github the github username of the person + * @param assignment the assignment of the person + * @param weeksPresent the weeks present + * @param tags the tags for that person + */ + public Person(Name name, + Phone phone, + Address address, + Email email, + Telegram telegram, + Github github, + Assignment assignment, + Set weeksPresent, + Set tags) { + requireAllNonNull(name, phone, email, address, telegram, tags, github); + this.github = github; + this.telegram = telegram; + this.name = name; + this.phone = phone; + this.email = email; + this.address = address; + this.tags.addAll(tags); + this.assignment = assignment; + this.weeksPresent = weeksPresent; } public Name getName() { @@ -115,6 +152,26 @@ public Github getGithub() { return github; } + public void markWeekPresent(int week) { + this.weeksPresent.add(week); + } + + public void unmarkWeekPresent(int week) { + weeksPresent.remove(week); // Remove the specified week from the attendance set + } + /** + * Returns true if that week is present in the Set. + * @param week the current week + * @return true if that week is present + */ + public boolean isPresentForWeek(int week) { + return this.weeksPresent.contains(week); + } + + public Set getWeeksPresent() { + return this.weeksPresent; + } + /** * Returns true if both persons have the same name. * This defines a weaker notion of equality between two persons. diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index 930147b0b55..7a83877188b 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -36,6 +36,7 @@ class JsonAdaptedPerson { private final String github; private final String assignmentName; private final Float assignmentScore; + private final List attendance = new ArrayList<>(); /** * Constructs a {@code JsonAdaptedPerson} with the given person details. @@ -45,7 +46,8 @@ public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone @JsonProperty("email") String email, @JsonProperty("address") String address, @JsonProperty("telegram") String telegram, @JsonProperty("tags") List tags, @JsonProperty("github") String github, @JsonProperty("assignment") String assignment, - @JsonProperty("assignmentScore") Float assignmentScore) { + @JsonProperty("assignmentScore") Float assignmentScore, + @JsonProperty("attendance") List attendance) { this.name = name; this.phone = phone; this.email = email; @@ -57,6 +59,9 @@ public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone this.tags.addAll(tags); } this.github = github; + if (attendance != null) { + this.attendance.addAll(attendance); // Add attendance data + } } /** @@ -75,6 +80,8 @@ public JsonAdaptedPerson(Person source) { Assignment assignment = source.getAssignment(); assignmentName = assignment != null ? assignment.assignmentName : null; // Get assignment name assignmentScore = assignment != null ? assignment.score : null; + attendance.addAll(source.getWeeksPresent()); + } /** @@ -143,9 +150,11 @@ public Person toModelType() throws IllegalValueException { if (assignmentName != null && assignmentScore != null) { modelAssignment = new Assignment(assignmentName, assignmentScore); // Create Assignment object } + Set modelAttendance = new HashSet<>(attendance); // Convert List to Set for the model + return new Person( - modelName, modelPhone, modelEmail, - modelAddress, modelTelegram, modelTags, modelGithub, modelAssignment); + modelName, modelPhone, + modelAddress, modelEmail, modelTelegram, modelGithub, modelAssignment, modelAttendance, modelTags); } } diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index 3f34dc527c2..cc3f181a26b 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -46,6 +46,8 @@ public class PersonCard extends UiPart { private Label telegram; @FXML private Label github; + @FXML + private FlowPane weekLabel; /** * Creates a {@code PersonCode} with the given {@code Person} and index to display. @@ -74,6 +76,10 @@ public PersonCard(Person person, int displayedIndex) { github.setText("GitHub username unspecified"); } + person.getWeeksPresent().stream() + .sorted(Comparator.comparing(Integer::intValue)) + .forEach(weekNumber -> weekLabel.getChildren().add(new Label(weekNumber.toString()))); + } } diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index 9f1743ab919..1b95de4670e 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -361,3 +361,17 @@ -fx-background-radius: 2; -fx-font-size: 11; } + +#weekLabel { + -fx-hgap: 7; + -fx-vgap: 3; +} + +#weekLabel .label { + -fx-text-fill: white; + -fx-background-color: green; + -fx-padding: 1 3 1 3; + -fx-border-radius: 2; + -fx-background-radius: 2; + -fx-font-size: 11; +} \ No newline at end of file diff --git a/src/main/resources/view/PersonListCard.fxml b/src/main/resources/view/PersonListCard.fxml index 9272d5fb236..4d1977f3c81 100644 --- a/src/main/resources/view/PersonListCard.fxml +++ b/src/main/resources/view/PersonListCard.fxml @@ -40,6 +40,7 @@