Skip to content

Commit

Permalink
Merge pull request #105 from solomonng2001/add-birthday-reminders
Browse files Browse the repository at this point in the history
Add birthday reminders
  • Loading branch information
ReganChoy authored Mar 29, 2024
2 parents 765aea8 + 3a5aefa commit a3f2fba
Show file tree
Hide file tree
Showing 23 changed files with 365 additions and 39 deletions.
4 changes: 2 additions & 2 deletions src/main/java/seedu/address/commons/util/DateUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ public static boolean isParsableDateString(String test) {
* @param date the date to check
* @return true if the date is in the past
*/
public static boolean isPastDate(LocalDate date) {
public static boolean isFutureDate(LocalDate date) {
if (date == null) {
return false;
}
return date.isBefore(LocalDate.now());
return date.isAfter(LocalDate.now());
}

/**
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/seedu/address/logic/Logic.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,14 @@ public interface Logic {
* Returns the reminder list for the overdue last met to be displayed in RemindersPanel.
*/
ReminderList getOverDueLastMet();

/**
* Returns the reminder list for the appointments to be displayed in RemindersPanel.
*/
ReminderList getSchedules();

/**
* Returns the reminder list for the birthday reminders to be displayed in RemindersPanel.
*/
ReminderList getBirthdayReminders();
}
5 changes: 5 additions & 0 deletions src/main/java/seedu/address/logic/LogicManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,9 @@ public ReminderList getOverDueLastMet() {
public ReminderList getSchedules() {
return model.getSchedules();
}

@Override
public ReminderList getBirthdayReminders() {
return model.getBirthdayReminders();
}
}
8 changes: 8 additions & 0 deletions src/main/java/seedu/address/model/AddressBook.java
Original file line number Diff line number Diff line change
Expand Up @@ -143,4 +143,12 @@ public ObservableList<Person> getOverDueLastMet() {
public ObservableList<Person> getSchedules() {
return persons.getSchedules();
}

/**
* Returns the list of persons who have upcoming birthdays.
* @return list of persons who have upcoming birthdays
*/
public ObservableList<Person> getPersonsWithUpcomingBirthdays() {
return persons.filterHaveUpcomingBirthday();
}
}
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 @@ -116,8 +116,14 @@ public interface Model {
* Returns the reminder list for the overdue last met to be displayed in RemindersPanel.
*/
ReminderList getOverDueLastMet();

/**
* Returns the reminder list for the appointments to be displayed in RemindersPanel.
*/
ReminderList getSchedules();

/**
* Returns the reminder list for the birthdays reminders to be displayed in RemindersPanel.
*/
ReminderList getBirthdayReminders();
}
4 changes: 4 additions & 0 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -222,4 +222,8 @@ public ReminderList getSchedules() {
return new ReminderList(ReminderType.SCHEDULES, addressBook.getSchedules());
}

@Override
public ReminderList getBirthdayReminders() {
return new ReminderList(ReminderType.BIRTHDAYS, addressBook.getPersonsWithUpcomingBirthdays());
}
}
13 changes: 12 additions & 1 deletion src/main/java/seedu/address/model/person/Birthday.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,23 @@ public static boolean isValidBirthday(String test) {
return false;
}
LocalDate birthdayTest = DateUtil.parseStringToDate(test);
if (!DateUtil.isPastDate(birthdayTest)) {
if (DateUtil.isFutureDate(birthdayTest)) {
return false;
}
return true;
}

/**
* Returns true if the birthday is upcoming within at most 1 week's time and is not in the past.
* @return true if the birthday is upcoming
*/
public boolean isUpcoming() {
int currentYear = LocalDate.now().getYear();
LocalDate birthdayThisYear = date.withYear(currentYear);
return !birthdayThisYear.isBefore(LocalDate.now())
&& !birthdayThisYear.isAfter(LocalDate.now().plusWeeks(1));
}

@Override
public String toString() {
return DateUtil.parseDateToString(date);
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/seedu/address/model/person/Person.java
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ public String toString() {
public boolean isOverDueLastMet() {
return lastMet.getIsOverdue() && schedule.getIsDone();
}

/**
* Returns true if the person has an active schedule, false otherwise.
* @return true if the person has an active schedule.
Expand All @@ -231,18 +232,35 @@ public boolean hasActiveSchedule() {
return !schedule.getIsDone();
}

/**
* Returns true if the person has an upcoming birthday, false otherwise.
* @return true if the person has an upcoming birthday.
*/
public boolean hasUpcomingBirthday() {
return birthday.isUpcoming();
}

/**
* Returns the string representation of the overdue person for GUI.
* @return The string representation of the overdue person
*/
public String overdueLastMetStringFormat() {
return String.format(name + " - %dd ago", lastMet.getPeriodGap());
}

/**
* Returns the string representation of the scheduled person for GUI.
* @return The string representation of the scheduled person
*/
public String scheduleStringFormat() {
return schedule.getScheduleDateString() + " - " + name + (schedule.getIsMissed() ? " (Missed)" : "");
}

/**
* Returns the string representation of the person's birthday for GUI.
* @return The string representation of the person's birthday
*/
public String birthdayStringFormat() {
return birthday.toString() + " - " + name;
}
}
16 changes: 16 additions & 0 deletions src/main/java/seedu/address/model/person/UniquePersonList.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static java.util.Objects.requireNonNull;
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;

import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

Expand Down Expand Up @@ -178,4 +179,19 @@ public ObservableList<Person> getSchedules() {
schedules.sort((p1, p2) -> p1.getSchedule().compareTo(p2.getSchedule()));
return schedules;
}

/**
* Returns the list of persons who have upcoming birthdays, sorted by birthday.
* @return list of persons who have upcoming birthdays
*/
public ObservableList<Person> filterHaveUpcomingBirthday() {
ObservableList<Person> personsWithUpcomingBirthdays = FXCollections.observableArrayList();
for (Person person : internalList) {
if (person.hasUpcomingBirthday()) {
personsWithUpcomingBirthdays.add(person);
}
}
personsWithUpcomingBirthdays.sort(Comparator.comparing(Person::getBirthday));
return personsWithUpcomingBirthdays;
}
}
26 changes: 26 additions & 0 deletions src/main/java/seedu/address/model/reminder/ReminderList.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,36 @@ public String toString() {
case SCHEDULES:
sb.append(p.scheduleStringFormat()).append("\n");
break;
case BIRTHDAYS:
sb.append(p.birthdayStringFormat()).append("\n");
break;
default:
break;
}
}
return sb.toString();
}

@Override
public boolean equals(Object other) {

if (other == this) {
return true;
}

if (!(other instanceof ReminderList)) {
return false;
}

ReminderList otherReminderList = (ReminderList) other;
if (otherReminderList.reminderType != reminderType) {
return false;
}

if (!remindersList.equals(otherReminderList.remindersList)) {
return false;
}

return true;
}
}
5 changes: 4 additions & 1 deletion src/main/java/seedu/address/model/reminder/ReminderType.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
*/
public enum ReminderType {
LAST_MET,
SCHEDULES;
SCHEDULES,
BIRTHDAYS;

@Override
public String toString() {
Expand All @@ -14,6 +15,8 @@ public String toString() {
return "Last Met";
case SCHEDULES:
return "Schedules";
case BIRTHDAYS:
return "Birthday";
default:
throw new IllegalArgumentException();
}
Expand Down
12 changes: 10 additions & 2 deletions src/main/java/seedu/address/ui/MainWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ public class MainWindow extends UiPart<Stage> {
@FXML
private StackPane appointmentsCardPlaceholder;

@FXML
private StackPane birthdayRemindersCardPlaceholder;

@FXML
private StackPane resultDisplayPlaceholder;

Expand Down Expand Up @@ -134,7 +137,8 @@ void fillInnerParts() {
clearClientViewPanel();
}

remindersPanel = new RemindersPanel(logic.getOverDueLastMet(), logic.getSchedules());
remindersPanel = new RemindersPanel(logic.getOverDueLastMet(), logic.getSchedules(),
logic.getBirthdayReminders());
addRemindersPanel();


Expand Down Expand Up @@ -211,6 +215,9 @@ private void addRemindersPanel() {

RemindersCard appointmentsCard = remindersPanel.getAppointmentsCard();
appointmentsCardPlaceholder.getChildren().add(appointmentsCard.getRoot());

RemindersCard birthdayRemindersCard = remindersPanel.getBirthdayRemindersCard();
birthdayRemindersCardPlaceholder.getChildren().add(birthdayRemindersCard.getRoot());
}

/**
Expand All @@ -226,7 +233,8 @@ private void clearRemindersPanel() {
*/
private void refreshRemindersPanel() {
clearRemindersPanel();
remindersPanel.updateRemindersPanel(logic.getOverDueLastMet(), logic.getSchedules());
remindersPanel.updateRemindersPanel(logic.getOverDueLastMet(), logic.getSchedules(),
logic.getBirthdayReminders());
addRemindersPanel();
}

Expand Down
20 changes: 18 additions & 2 deletions src/main/java/seedu/address/ui/RemindersPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@
public class RemindersPanel {
private RemindersCard lastMetCard;
private RemindersCard scheduleCard;
private RemindersCard birthdayRemindersCard;

/**
* Creates a {@code RemindersPanel} with the given {@code }.
*/
public RemindersPanel(ReminderList overDueLastMetList, ReminderList appointmentsList) {
public RemindersPanel(ReminderList overDueLastMetList, ReminderList appointmentsList,
ReminderList birthdayRemindersList) {
this.lastMetCard = new RemindersCard(ReminderType.LAST_MET, overDueLastMetList);
this.scheduleCard = new RemindersCard(ReminderType.SCHEDULES, appointmentsList);
this.birthdayRemindersCard = new RemindersCard(ReminderType.BIRTHDAYS, birthdayRemindersList);
}

public RemindersCard getLastMetCard() {
Expand All @@ -27,6 +30,10 @@ public RemindersCard getAppointmentsCard() {
return scheduleCard;
}

public RemindersCard getBirthdayRemindersCard() {
return birthdayRemindersCard;
}

/**
* Updates the {@code LastMetCard} with new {@code }.
*/
Expand All @@ -41,11 +48,20 @@ public void updateAppointmentsCard(ReminderList updatedAppointmentsList) {
scheduleCard = new RemindersCard(ReminderType.SCHEDULES, updatedAppointmentsList);
}

/**
* Updates the {@code BirthdayRemindersCard} with new {@code }
*/
public void updateBirthdayRemindersCard(ReminderList updatedBirthdayRemindersList) {
birthdayRemindersCard = new RemindersCard(ReminderType.BIRTHDAYS, updatedBirthdayRemindersList);
}

/**
* Updates the {@code RemindersPanel} with new {@code }.
*/
public void updateRemindersPanel(ReminderList updatedOverDueList, ReminderList updatedAppointmentsList) {
public void updateRemindersPanel(ReminderList updatedOverDueList, ReminderList updatedAppointmentsList,
ReminderList updatedBirthdayRemindersList) {
updateLastMetCard(updatedOverDueList);
updateAppointmentsCard(updatedAppointmentsList);
updateBirthdayRemindersCard(updatedBirthdayRemindersList);
}
}
2 changes: 2 additions & 0 deletions src/main/resources/view/MainWindow.fxml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@
<StackPane fx:id="lastMetCardPlaceholder" VBox.vgrow="ALWAYS"/>
<Region prefWidth="310" prefHeight="20"/>
<StackPane fx:id="appointmentsCardPlaceholder" VBox.vgrow="ALWAYS"/>
<Region prefWidth="310" prefHeight="20"/>
<StackPane fx:id="birthdayRemindersCardPlaceholder" VBox.vgrow="ALWAYS"/>
</VBox>
</content>
</ScrollPane>
Expand Down
18 changes: 9 additions & 9 deletions src/test/java/seedu/address/commons/util/DateUtilTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,22 +105,22 @@ public void isParsableDateString() {
}

@Test
public void isPastDate() {
public void isFutureDate() {
// null date
assertFalse(DateUtil.isPastDate(null));
assertFalse(DateUtil.isFutureDate(null));

// future dates
assertFalse(DateUtil.isPastDate(LocalDate.now().plusDays(1)));
assertFalse(DateUtil.isPastDate(LocalDate.now().plusMonths(1)));
assertFalse(DateUtil.isPastDate(LocalDate.now().plusYears(1)));
assertTrue(DateUtil.isFutureDate(LocalDate.now().plusDays(1)));
assertTrue(DateUtil.isFutureDate(LocalDate.now().plusMonths(1)));
assertTrue(DateUtil.isFutureDate(LocalDate.now().plusYears(1)));

// current date
assertFalse(DateUtil.isPastDate(LocalDate.now()));
assertFalse(DateUtil.isFutureDate(LocalDate.now()));

// past dates
assertTrue(DateUtil.isPastDate(LocalDate.now().minusDays(1)));
assertTrue(DateUtil.isPastDate(LocalDate.now().minusMonths(1)));
assertTrue(DateUtil.isPastDate(LocalDate.now().minusYears(1)));
assertFalse(DateUtil.isFutureDate(LocalDate.now().minusDays(1)));
assertFalse(DateUtil.isFutureDate(LocalDate.now().minusMonths(1)));
assertFalse(DateUtil.isFutureDate(LocalDate.now().minusYears(1)));
}

@Test
Expand Down
Loading

0 comments on commit a3f2fba

Please sign in to comment.