From 2db10864d7d419c565baba595acbf2b9e1ce530d Mon Sep 17 00:00:00 2001 From: Wyrkx <107403096+Wyrkx@users.noreply.github.com> Date: Tue, 19 Mar 2024 03:35:25 +0800 Subject: [PATCH 1/7] Add simple UI and sample data --- build.gradle | 2 +- .../java/tutorpro/model/person/Person.java | 6 ++ .../tutorpro/model/person/student/Level.java | 5 ++ .../model/person/student/Student.java | 12 ++++ .../model/person/student/Subject.java | 5 ++ .../tutorpro/model/util/SampleDataUtil.java | 4 +- .../java/tutorpro/ui/PersonListPanel.java | 2 +- src/main/java/tutorpro/ui/StudentCard.java | 67 +++++++++++++++++++ src/main/resources/view/DarkTheme.css | 14 ++++ src/main/resources/view/StudentListCard.fxml | 38 +++++++++++ 10 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 src/main/java/tutorpro/ui/StudentCard.java create mode 100644 src/main/resources/view/StudentListCard.fxml diff --git a/build.gradle b/build.gradle index 23a3cf36ce5..468ae27e447 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { id 'jacoco' } -mainClassName = 'address.Main' +mainClassName = 'tutorpro.Main' sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/src/main/java/tutorpro/model/person/Person.java b/src/main/java/tutorpro/model/person/Person.java index d7addd96a98..9f9d117ad2c 100644 --- a/src/main/java/tutorpro/model/person/Person.java +++ b/src/main/java/tutorpro/model/person/Person.java @@ -6,9 +6,12 @@ import java.util.Objects; import java.util.Set; +import javafx.scene.layout.Region; import tutorpro.commons.util.CollectionUtil; import tutorpro.commons.util.ToStringBuilder; import tutorpro.model.tag.Tag; +import tutorpro.ui.PersonCard; +import tutorpro.ui.UiPart; /** * Represents a Person in the address book. @@ -118,4 +121,7 @@ public String toString() { .toString(); } + public UiPart getCard(int displayIndex) { + return new PersonCard(this, displayIndex); + } } diff --git a/src/main/java/tutorpro/model/person/student/Level.java b/src/main/java/tutorpro/model/person/student/Level.java index 21920923462..754540763c5 100644 --- a/src/main/java/tutorpro/model/person/student/Level.java +++ b/src/main/java/tutorpro/model/person/student/Level.java @@ -37,6 +37,11 @@ public boolean equals(Object other) { return value.equals(otherLevel.value); } + @Override + public String toString() { + return value; + } + /** * Returns true if the given String is a valid Level. */ diff --git a/src/main/java/tutorpro/model/person/student/Student.java b/src/main/java/tutorpro/model/person/student/Student.java index ef7aa9f1b87..712004d0ee3 100644 --- a/src/main/java/tutorpro/model/person/student/Student.java +++ b/src/main/java/tutorpro/model/person/student/Student.java @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.Set; +import javafx.scene.layout.Region; import tutorpro.commons.util.CollectionUtil; import tutorpro.model.person.Address; import tutorpro.model.person.Email; @@ -11,6 +12,8 @@ import tutorpro.model.person.Person; import tutorpro.model.person.Phone; import tutorpro.model.tag.Tag; +import tutorpro.ui.StudentCard; +import tutorpro.ui.UiPart; /** * Represents a Student in TutorPro. @@ -59,4 +62,13 @@ public boolean equals(Object other) { Student otherStudent = (Student) other; return level.equals(otherStudent.level) && subjects.equals(otherStudent.subjects); } + + /** + * Returns a UI representation of the person. + * @param displayIndex The index to be displayed on the card. + */ + @Override + public UiPart getCard(int displayIndex) { + return new StudentCard(this, displayIndex); + } } diff --git a/src/main/java/tutorpro/model/person/student/Subject.java b/src/main/java/tutorpro/model/person/student/Subject.java index 4e19d5167ea..0de86dd6d3a 100644 --- a/src/main/java/tutorpro/model/person/student/Subject.java +++ b/src/main/java/tutorpro/model/person/student/Subject.java @@ -38,6 +38,11 @@ public boolean equals(Object other) { return value.equals(otherLevel.value); } + @Override + public String toString() { + return value; + } + /** * Returns true if the given String is a valid Level. */ diff --git a/src/main/java/tutorpro/model/util/SampleDataUtil.java b/src/main/java/tutorpro/model/util/SampleDataUtil.java index be1b1b9833a..552013cfe1d 100644 --- a/src/main/java/tutorpro/model/util/SampleDataUtil.java +++ b/src/main/java/tutorpro/model/util/SampleDataUtil.java @@ -56,7 +56,7 @@ public static Student[] getSampleStudents() { getTagSet(), new Level("J1"), getSubjectSet("Physics")), new Student(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"), new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), - getTagSet(), new Level("UNI"), getSubjectSet("Chemistry, Biology")), + getTagSet(), new Level("UNI"), getSubjectSet("Chemistry", "Biology")), new Student(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"), new Address("Blk 47 Tampines Street 20, #17-35"), getTagSet(), new Level("K2"), getSubjectSet("Reading")), @@ -68,7 +68,7 @@ public static Student[] getSampleStudents() { public static ReadOnlyAddressBook getSampleAddressBook() { AddressBook sampleAb = new AddressBook(); - for (Person samplePerson : getSamplePersons()) { + for (Person samplePerson : getSampleStudents()) { sampleAb.addPerson(samplePerson); } return sampleAb; diff --git a/src/main/java/tutorpro/ui/PersonListPanel.java b/src/main/java/tutorpro/ui/PersonListPanel.java index 20bd78d50c8..ed9a0585214 100644 --- a/src/main/java/tutorpro/ui/PersonListPanel.java +++ b/src/main/java/tutorpro/ui/PersonListPanel.java @@ -41,7 +41,7 @@ protected void updateItem(Person person, boolean empty) { setGraphic(null); setText(null); } else { - setGraphic(new PersonCard(person, getIndex() + 1).getRoot()); + setGraphic(person.getCard(getIndex() + 1).getRoot()); } } } diff --git a/src/main/java/tutorpro/ui/StudentCard.java b/src/main/java/tutorpro/ui/StudentCard.java new file mode 100644 index 00000000000..55dac0211f2 --- /dev/null +++ b/src/main/java/tutorpro/ui/StudentCard.java @@ -0,0 +1,67 @@ +package tutorpro.ui; + +import java.util.Comparator; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Region; +import tutorpro.model.person.student.Student; + +/** + * An UI component that displays information of a {@code Person}. + */ +public class StudentCard extends UiPart { + + private static final String FXML = "StudentListCard.fxml"; + + /** + * Note: Certain keywords such as "location" and "resources" are reserved keywords in JavaFX. + * As a consequence, UI elements' variable names cannot be set to such keywords + * or an exception will be thrown by JavaFX during runtime. + * + * @see The issue on AddressBook level 4 + */ + + public final Student student; + + @FXML + private HBox cardPane; + @FXML + private Label name; + @FXML + private Label id; + @FXML + private Label phone; + @FXML + private Label address; + @FXML + private Label email; + @FXML + private FlowPane tags; + @FXML + private Label level; + @FXML + private FlowPane subjects; + + /** + * Creates a {@code PersonCode} with the given {@code Person} and index to display. + */ + public StudentCard(Student student, int displayedIndex) { + super(FXML); + this.student = student; + id.setText(displayedIndex + ". "); + name.setText(student.getName().fullName); + phone.setText(student.getPhone().value); + address.setText(student.getAddress().value); + email.setText(student.getEmail().value); + level.setText(student.getLevel().toString()); + student.getTags().stream() + .sorted(Comparator.comparing(tag -> tag.tagName)) + .forEach(tag -> tags.getChildren().add(new Label(tag.tagName))); + student.getSubjects().stream() + .sorted(Comparator.comparing(subject -> subject.toString())) + .forEach(subject -> subjects.getChildren().add(new Label(subject.toString()))); + } +} diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index 36e6b001cd8..c63527bc038 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -350,3 +350,17 @@ -fx-background-radius: 2; -fx-font-size: 11; } + +#subjects { + -fx-hgap: 7; + -fx-vgap: 3; +} + +#subjects .label { + -fx-text-fill: white; + -fx-background-color: #8b0000; + -fx-padding: 1 3 1 3; + -fx-border-radius: 2; + -fx-background-radius: 2; + -fx-font-size: 11; +} diff --git a/src/main/resources/view/StudentListCard.fxml b/src/main/resources/view/StudentListCard.fxml new file mode 100644 index 00000000000..9e356992724 --- /dev/null +++ b/src/main/resources/view/StudentListCard.fxml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 0a3054c8f88299e270f640a1803a5287fadf5817 Mon Sep 17 00:00:00 2001 From: Wyrkx <107403096+Wyrkx@users.noreply.github.com> Date: Tue, 19 Mar 2024 03:57:42 +0800 Subject: [PATCH 2/7] Add tests --- .../model/person/student/LevelTest.java | 20 +++++++++++++++++++ .../model/person/student/SubjectTest.java | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/test/java/tutorpro/model/person/student/LevelTest.java b/src/test/java/tutorpro/model/person/student/LevelTest.java index f953ab0027e..23245f56947 100644 --- a/src/test/java/tutorpro/model/person/student/LevelTest.java +++ b/src/test/java/tutorpro/model/person/student/LevelTest.java @@ -60,4 +60,24 @@ public void equals() { // different values -> returns false assertFalse(level.equals(new Level("J1"))); } + + @Test + public void testToString() { + Level level = new Level("P6"); + + // same values -> returns true + assertTrue(level.toString().equals(new Level("P6").toString())); + + // same object -> returns true + assertTrue(level.toString().equals(level.toString())); + + // null -> returns false + assertFalse(level.toString().equals(null)); + + // different types -> returns false + assertFalse(level.toString().equals(5.0f)); + + // different values -> returns false + assertFalse(level.toString().equals(new Level("J1").toString())); + } } diff --git a/src/test/java/tutorpro/model/person/student/SubjectTest.java b/src/test/java/tutorpro/model/person/student/SubjectTest.java index 35eaed051cd..7d7a59b1e95 100644 --- a/src/test/java/tutorpro/model/person/student/SubjectTest.java +++ b/src/test/java/tutorpro/model/person/student/SubjectTest.java @@ -53,4 +53,24 @@ public void equals() { // different values -> returns false assertFalse(subject.equals(new Subject("Other Valid Subject"))); } + + @Test + public void testToString() { + Subject subject = new Subject("Valid Subject"); + + // same values -> returns true + assertTrue(subject.toString().equals(new Subject("Valid Subject").toString())); + + // same object -> returns true + assertTrue(subject.toString().equals(subject.toString())); + + // null -> returns false + assertFalse(subject.toString().equals(null)); + + // different types -> returns false + assertFalse(subject.toString().equals(5.0f)); + + // different values -> returns false + assertFalse(subject.toString().equals(new Subject("Other Valid Subject").toString())); + } } From 0dca8619c7ff2a0423b756c0c690b4ed0c3f413d Mon Sep 17 00:00:00 2001 From: Wyrkx <107403096+Wyrkx@users.noreply.github.com> Date: Tue, 19 Mar 2024 04:15:29 +0800 Subject: [PATCH 3/7] Add test --- src/test/java/tutorpro/ui/StudentCardTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/tutorpro/ui/StudentCardTest.java diff --git a/src/test/java/tutorpro/ui/StudentCardTest.java b/src/test/java/tutorpro/ui/StudentCardTest.java new file mode 100644 index 00000000000..ad669d19306 --- /dev/null +++ b/src/test/java/tutorpro/ui/StudentCardTest.java @@ -0,0 +1,16 @@ +package tutorpro.ui; + +import org.junit.jupiter.api.Test; + +import tutorpro.testutil.Assert; +import tutorpro.testutil.StudentBuilder; + +public class StudentCardTest { + + @Test + public void useless() { + // cannot create javafx objects outside of javafx thread anyway, so not possible to test this object + // this is to satisfy codecov + Assert.assertThrows(ExceptionInInitializerError.class, () -> new StudentBuilder().build().getCard(0)); + } +} From 3f14d45dea1f43b4362f22283827c8b0bf786648 Mon Sep 17 00:00:00 2001 From: Wyrkx <107403096+Wyrkx@users.noreply.github.com> Date: Tue, 19 Mar 2024 04:36:19 +0800 Subject: [PATCH 4/7] Remove redundant file --- src/test/java/tutorpro/ui/StudentCardTest.java | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/test/java/tutorpro/ui/StudentCardTest.java diff --git a/src/test/java/tutorpro/ui/StudentCardTest.java b/src/test/java/tutorpro/ui/StudentCardTest.java deleted file mode 100644 index ad669d19306..00000000000 --- a/src/test/java/tutorpro/ui/StudentCardTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package tutorpro.ui; - -import org.junit.jupiter.api.Test; - -import tutorpro.testutil.Assert; -import tutorpro.testutil.StudentBuilder; - -public class StudentCardTest { - - @Test - public void useless() { - // cannot create javafx objects outside of javafx thread anyway, so not possible to test this object - // this is to satisfy codecov - Assert.assertThrows(ExceptionInInitializerError.class, () -> new StudentBuilder().build().getCard(0)); - } -} From e0479695c64ea0915d0cf7ac66f9431e512982f2 Mon Sep 17 00:00:00 2001 From: Wyrkx <107403096+Wyrkx@users.noreply.github.com> Date: Tue, 19 Mar 2024 04:49:34 +0800 Subject: [PATCH 5/7] Add codecov.yml --- codecov.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000000..27988757646 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,2 @@ +ignore: + - "src/main/java/tutorpro/ui/StudentCard.java" \ No newline at end of file From 269da808ff5b005cd0bf8820ff9e70a562942af2 Mon Sep 17 00:00:00 2001 From: Wyrkx <107403096+Wyrkx@users.noreply.github.com> Date: Tue, 19 Mar 2024 04:50:53 +0800 Subject: [PATCH 6/7] Fix styling --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 27988757646..eef225a0db5 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,2 +1,2 @@ ignore: - - "src/main/java/tutorpro/ui/StudentCard.java" \ No newline at end of file + - "src/main/java/tutorpro/ui/StudentCard.java" From c991221274ea23815d1500cbe57a7cbf4fa20553 Mon Sep 17 00:00:00 2001 From: Wyrkx <107403096+Wyrkx@users.noreply.github.com> Date: Tue, 19 Mar 2024 05:52:20 +0800 Subject: [PATCH 7/7] Add tests --- .../java/tutorpro/model/person/PersonTest.java | 14 ++++++++++++++ .../tutorpro/model/person/student/StudentTest.java | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/test/java/tutorpro/model/person/PersonTest.java b/src/test/java/tutorpro/model/person/PersonTest.java index c6591dc890a..ed9c3d33fc6 100644 --- a/src/test/java/tutorpro/model/person/PersonTest.java +++ b/src/test/java/tutorpro/model/person/PersonTest.java @@ -1,5 +1,6 @@ package tutorpro.model.person; +import static org.junit.jupiter.api.Assertions.fail; import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; import static tutorpro.logic.commands.CommandTestUtil.VALID_NAME_BOB; @@ -12,6 +13,7 @@ import tutorpro.model.tag.Tag; import tutorpro.testutil.Assert; import tutorpro.testutil.PersonBuilder; +import tutorpro.testutil.StudentBuilder; import tutorpro.testutil.TypicalPersons; public class PersonTest { @@ -104,4 +106,16 @@ public void addTags() { person.addTags(tag); Assertions.assertTrue(person.getTags().contains(tag)); } + + @Test + public void getCard() { + try { + new StudentBuilder().build().getCard(1); + fail(); + } catch (ExceptionInInitializerError e) { + return; + } catch (NoClassDefFoundError e) { + return; + } + } } diff --git a/src/test/java/tutorpro/model/person/student/StudentTest.java b/src/test/java/tutorpro/model/person/student/StudentTest.java index 95863307bcb..a22866719fb 100644 --- a/src/test/java/tutorpro/model/person/student/StudentTest.java +++ b/src/test/java/tutorpro/model/person/student/StudentTest.java @@ -1,5 +1,6 @@ package tutorpro.model.person.student; +import static org.junit.jupiter.api.Assertions.fail; import static tutorpro.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; import static tutorpro.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; import static tutorpro.logic.commands.CommandTestUtil.VALID_LEVEL_UNI; @@ -75,4 +76,16 @@ public void equals() { editedAlice = new StudentBuilder(TypicalStudents.ALICE).withLevel(VALID_LEVEL_UNI).build(); Assertions.assertFalse(TypicalStudents.ALICE.equals(editedAlice)); } + + @Test + public void getCard() { + try { + new StudentBuilder().build().getCard(1); + fail(); + } catch (ExceptionInInitializerError e) { + return; + } catch (NoClassDefFoundError e) { + return; + } + } }