[#14097] Create Submission Reminders page#14370
Conversation
There was a problem hiding this comment.
Pull request overview
Introduces a dedicated instructor “Send Reminders” page (replacing the previous modal) to better support large classes, while preserving existing reminder entry points from session-related instructor pages and updating test coverage accordingly.
Changes:
- Added a new instructor route and standalone page for selecting respondents and sending submission reminders, with optional preselection of non-submitters and return navigation.
- Refactored existing “send reminders” triggers to navigate to the new page instead of opening a modal / emitting modal results.
- Removed the old send-reminders modal implementation and updated/added unit + E2E tests and page objects for the new flow.
Reviewed changes
Copilot reviewed 29 out of 29 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| src/web/app/pages-instructor/instructor.routes.ts | Registers the new :feedbackSessionId/send-reminders route. |
| src/web/app/pages-instructor/instructor-session-send-reminders-page/instructor-session-send-reminders-page.component.ts | Implements the new page: data loading, selection logic, reminder submission, safe return URL. |
| src/web/app/pages-instructor/instructor-session-send-reminders-page/instructor-session-send-reminders-page.component.html | New page UI: session details, selection controls, respondent table, actions. |
| src/web/app/pages-instructor/instructor-session-send-reminders-page/instructor-session-send-reminders-page.component.scss | Styles for the new page layout and controls. |
| src/web/app/pages-instructor/instructor-session-send-reminders-page/instructor-session-send-reminders-page.component.spec.ts | Unit tests for selection behavior, toggles, navigation, and error handling. |
| src/web/app/pages-instructor/instructor-session-result-page/instructor-session-result-page.component.ts | Removes now-obsolete reminder-sending logic previously tied to the modal response. |
| src/web/app/pages-instructor/instructor-session-result-page/instructor-session-result-page.component.html | Removes event binding previously used to send reminders via the modal workflow. |
| src/web/app/pages-instructor/instructor-session-result-page/instructor-session-no-response-panel.component.ts | Replaces modal opening with navigation to the new send-reminders page. |
| src/web/app/pages-instructor/instructor-session-result-page/instructor-session-no-response-panel.component.html | Updates “Remind All” button to use the new navigation handler. |
| src/web/app/pages-instructor/instructor-session-result-page/instructor-session-no-response-panel.component.spec.ts | Updates/extends tests to assert navigation to the send-reminders page. |
| src/web/app/pages-instructor/instructor-session-modal-page.component.ts | Updates shared reminder handler to navigate to the new page (with preselect + returnUrl). |
| src/web/app/components/sessions-table/send-reminders-to-respondents-modal/send-reminders-to-respondents-model.ts | Deletes old modal response model. |
| src/web/app/components/sessions-table/send-reminders-to-respondents-modal/send-reminders-to-respondents-modal.component.ts | Deletes old modal component. |
| src/web/app/components/sessions-table/send-reminders-to-respondents-modal/send-reminders-to-respondents-modal.component.html | Deletes old modal template. |
| src/web/app/components/sessions-table/send-reminders-to-respondents-modal/send-reminders-to-respondents-modal.component.scss | Deletes old modal styles. |
| src/web/app/components/sessions-table/send-reminders-to-respondents-modal/send-reminders-to-respondents-modal.component.spec.ts | Deletes old modal unit tests. |
| src/web/app/components/sessions-table/respondent-list-info-table/respondent-list-info-table.component.ts | Adds optional table label inputs for reuse on the new page. |
| src/web/app/components/sessions-table/respondent-list-info-table/respondent-list-info-table.component.html | Renders optional student/instructor labels above the tables. |
| src/main/java/teammates/common/util/Const.java | Adds a frontend URI constant for the new send-reminders page. |
| src/e2e/resources/testng-e2e.xml | Includes the new E2E test in the TestNG suite. |
| src/e2e/resources/data/InstructorSessionSendRemindersPageE2ETest.json | Adds data bundle for the new send-reminders page E2E test. |
| src/e2e/java/teammates/e2e/pageobjects/InstructorSessionSendRemindersPage.java | New page object encapsulating interactions/assertions for the send-reminders page. |
| src/e2e/java/teammates/e2e/pageobjects/InstructorHomePage.java | Updates reminder flows to use the new send-reminders page object. |
| src/e2e/java/teammates/e2e/pageobjects/InstructorFeedbackSessionsPage.java | Updates reminder flows to use the new send-reminders page object. |
| src/e2e/java/teammates/e2e/pageobjects/InstructorFeedbackResultsPage.java | Updates reminder flow to use the new send-reminders page object. |
| src/e2e/java/teammates/e2e/cases/InstructorSessionSendRemindersPageE2ETest.java | Adds dedicated E2E test for the new send-reminders page. |
| src/e2e/java/teammates/e2e/cases/InstructorHomePageE2ETest.java | Updates existing E2E assertions to follow the new reminder navigation flow. |
| src/e2e/java/teammates/e2e/cases/InstructorFeedbackSessionsPageE2ETest.java | Updates existing E2E assertions to follow the new reminder navigation flow. |
| src/e2e/java/teammates/e2e/cases/InstructorFeedbackReportPageE2ETest.java | Updates existing E2E assertions to follow the new reminder navigation flow. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| class="btn btn-secondary btn-sm button" | ||
| type="button" | ||
| (click)="!isDisplayOnly && openSendReminderModal($event); $event.stopPropagation()" | ||
| (click)="!isDisplayOnly && openSendReminderPage($event); $event.stopPropagation()" |
| sendReminders(): void { | ||
| this.isSubmittingReminders = true; | ||
| this.feedbackSessionsService | ||
| .remindFeedbackSessionSubmissionForRespondents(this.feedbackSessionId, { | ||
| usersToRemind: this.selectedRespondents.map((model) => model.id), | ||
| isSendingCopyToInstructor: this.isSendingCopyToInstructor, | ||
| }) |
| @if (studentTableLabel) { | ||
| <h1>{{ studentTableLabel }}</h1> | ||
| } |
| @if (instructorTableLabel) { | ||
| <h1>{{ instructorTableLabel }}</h1> | ||
| } |
| .align-row-right { | ||
| align-items: center; | ||
| display: flex; | ||
| flex-wrap: wrap; | ||
| gap: 12px; | ||
| justify-content: right; | ||
| } |
| public void selectStudentByEmail(String studentEmail) { | ||
| WebElement studentList = waitForElementVisibility(By.id("student-list-table")); | ||
| List<WebElement> rows = studentList.findElements(By.cssSelector("tbody tr")); | ||
|
|
||
| for (WebElement row : rows) { | ||
| List<WebElement> cells = row.findElements(By.cssSelector("td")); | ||
| if (!cells.isEmpty() && cells.get(4).getText().equals(studentEmail)) { | ||
| click(cells.get(0).findElement(By.tagName("input"))); | ||
| break; | ||
| } | ||
| } | ||
| } |
|
@samuelfangjw hi, was investigating the e2e test errors: InstructorHomePageE2ETest: "download results" BaseE2ETestCase.verifyDownloadedFile is failing as the downloaded file could not be identified, and upon checking the downloads folder, the files are being saved as temporary download files that likely indicate the download is not being finalised (im using chrome so they appear as .com.google.Chrome.xxx). could i check if this is an existing issue or perhaps something to do with my test environment? im testing without my changes and the error seems to be happening as well. |
Hi @javieryeow, it's a known issue for chrome. Firefox is the only stable one at the moment. As long as it passes on CI it's ok. Please also help to remove the added InstructorSessionSendRemindersPageE2ETest, updating the existing tests will do. |
dc7f20e to
b4df6bd
Compare
Fixes #14097
Outline of Solution
on the new send-reminders page:
cleanup and test coverage: