From 9ff54246670ac604869aee3cc22529937cfefbbc Mon Sep 17 00:00:00 2001 From: Wilson Kurniawan Date: Sun, 8 Aug 2021 01:13:27 +0800 Subject: [PATCH] [#11329] Release V8.0.0 (#11343) --- .github/ISSUE_TEMPLATE/bug-report.md | 2 +- .github/ISSUE_TEMPLATE/feature-request.md | 2 +- build.gradle | 4 +- docs/design.md | 12 +- docs/development.md | 6 +- docs/e2e-testing.md | 11 +- docs/performance-testing.md | 2 +- docs/setting-up.md | 1 - .../resources/client.template.properties | 4 +- src/e2e/resources/test.template.properties | 2 +- .../cases/FeedbackQuestionUpdateLNPTest.java | 2 +- .../cases/FeedbackSessionSubmitLNPTest.java | 2 +- .../lnp/cases/FeedbackSessionViewLNPTest.java | 2 +- .../cases/InstructorSessionResultLNPTest.java | 2 +- .../lnp/cases/InstructorUpdateLNPTest.java | 2 +- .../lnp/cases/StudentEmailUpdateLNPTest.java | 2 +- .../cases/StudentSectionUpdateLNPTest.java | 2 +- .../lnp/cases/StudentTeamUpdateLNPTest.java | 2 +- src/lnp/resources/test.template.properties | 4 +- .../storage/search/SearchManager.java | 5 +- .../ui/servlets/WebSecurityHeaderFilter.java | 8 +- src/main/resources/build.template.properties | 4 +- ...tructor-search-page.component.spec.ts.snap | 3 + .../instructor-search-page.component.html | 6 + .../instructor-search-page.component.ts | 2 + src/web/data/developers.json | 202 ++++++++++-------- src/web/environments/config.template.ts | 8 +- 27 files changed, 175 insertions(+), 129 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 8fd238382dd..849cfc663f4 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -6,7 +6,7 @@ about: Report a bug or defect in the application -- **Environment**: +- **Environment**: **Steps to reproduce** diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index dd46e8ae9c3..c7518e69e60 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -6,7 +6,7 @@ about: Request a new or a change to existing user-facing feature -- **Environment**: +- **Environment**: **Description of feature/enhancement** diff --git a/build.gradle b/build.gradle index 6f96ddb02cc..c358e8fd8ae 100644 --- a/build.gradle +++ b/build.gradle @@ -81,10 +81,10 @@ dependencies { // For using Gmail API testImplementation("com.google.apis:google-api-services-gmail:v1-rev20200601-1.30.9") // For using JMeter APIs - testImplementation("org.apache.jmeter:ApacheJMeter_core:5.3") { + testImplementation("org.apache.jmeter:ApacheJMeter_core:5.4.1") { exclude group: "org.apache.jmeter", module: "bom" } - testImplementation("org.apache.jmeter:ApacheJMeter_http:5.3") { + testImplementation("org.apache.jmeter:ApacheJMeter_http:5.4.1") { exclude group: "org.apache.jmeter", module: "bom" } diff --git a/docs/design.md b/docs/design.md index 134a9efb6bc..02c6dce5339 100644 --- a/docs/design.md +++ b/docs/design.md @@ -92,8 +92,8 @@ This type of request will be processed as follows: 1. Request forwarded to the `WebApiServlet` and subsequent actions are the same as user-invoked AJAX requests. GAE server sends such automated requests through two different configurations: -- Cron jobs: These are jobs that are automatically scheduled for a specified period of time, e.g. scheduling feedback session opening reminders. It is configured in `cron.xml`. -- Task queue workers: These are hybrids of user-invoked and GAE-invoked in that they are queued by users (i.e. users request for the tasks to be added to queue), but executed by GAE (i.e. GAE determines when and which tasks in the queue are executed at any point of time). This is typically used for tasks that may take a long time to finish and can exceed the 1 minute standard request processing limit imposed by GAE. It is configured in `queue.xml` as well as the `TaskQueue` nested class of the [Const](../src/main/java/teammates/common/util/Const.java) class. +- Cron jobs: These are jobs that are automatically scheduled for a specified period of time, e.g. scheduling feedback session opening reminders. It is configured in `cron.yaml`. +- Task queue workers: These are hybrids of user-invoked and GAE-invoked in that they are queued by users (i.e. users request for the tasks to be added to queue), but executed by GAE (i.e. GAE determines when and which tasks in the queue are executed at any point of time). This is typically used for tasks that may take a long time to finish and might be blocking user's interaction. It is configured in `queue.yaml` as well as the `TaskQueue` nested class of the [Const](../src/main/java/teammates/common/util/Const.java) class. ### Template Method pattern @@ -119,7 +119,7 @@ On designing API endpoints (for AJAX requests): - Some fields are required be hidden in the API response, mostly for data privacy purposes. Whenever required, there should be methods in the request output objects catered for this. - API endpoints should not be concerned with how data is presented. - Case study 1: some endpoint will pass timezone information via two information: timezone ID and UNIX epoch milliseconds. It is up to the front-end on how to make use of those two pieces of information. - - Case study 2: CSV file for session result or student list is just a different way of presenting the same information in the web page. Due to this, when downloding CSV, the web page will request the same information as that used when displaying in web page and do the necessary conversion to CSV. + - Case study 2: CSV file for session result or student list is just a different way of presenting the same information in the web page. Due to this, when downloading CSV, the web page will request the same information as that used when displaying in web page and do the necessary conversion to CSV. On data exchange between front-end and back-end: @@ -284,11 +284,9 @@ The E2E component has no knowledge of the internal workings of the application a Package overview: -- **`e2e.util`**: Contains helpers needed for running E2E tests. +- **`e2e.util`**: Contains helpers needed for running E2E tests. Also contains the test cases for the said infrastructure/helpers. - **`e2e.pageobjects`**: Contains abstractions of the pages as they appear on a Browser (i.e. SUTs). -- **`e2e.cases`**: Contains test cases. - - **`.util`**: Component test cases for testing the test helpers. - - **`.e2e`**: System test cases for testing the application as a whole. +- **`e2e.cases`**: Contains system test cases for testing the application as a whole. ## Client Component diff --git a/docs/development.md b/docs/development.md index 7ef71cedddc..56a808aea89 100644 --- a/docs/development.md +++ b/docs/development.md @@ -143,17 +143,17 @@ The steps for adding a student is almost identical to the steps for adding instr - Where appropriate, change the reference to "instructor" to "student". - `Students` → `Enroll` to add students for the course. -**Alternative**: Run the test cases, they create several student and instructor accounts in the datastore. Use one of them to log in. +**Alternative**: Run the E2E test cases, they create several student and instructor accounts in the database. Use one of them to log in. ### Logging in without UI In dev server, it is also possible to "log in" without UI (e.g. when only testing API endpoints). In order to do that, you need to submit the following API call: ```sh -POST http://localhost:8080/devServerLogin?email=test@example.com&isAdmin=on +POST http://localhost:8080/devServerLogin?email=test@example.com ``` -where `email=test@example.com` and `isAdmin=on` can be replaced as appropriate. +where `email=test@example.com` can be replaced as appropriate. The back-end server will return cookies which will subsequently be used to authenticate your requests. diff --git a/docs/e2e-testing.md b/docs/e2e-testing.md index e49b8bd381d..abd06a234a9 100644 --- a/docs/e2e-testing.md +++ b/docs/e2e-testing.md @@ -72,22 +72,15 @@ If you are testing against a production server (staging server or live server), 1. Edit `src/e2e/resources/test.properties` as instructed is in its comments. * In particular, you will need a legitimate Gmail account to be used for testing. -1. You need to setup a `Gmail API`1 as follows: +1. If you are testing email sending, you need to setup a `Gmail API` as follows: * [Obtain a Gmail API credentials](https://github.com/TEAMMATES/teammates-ops/blob/master/platform-guide.md#setting-up-gmail-api-credentials) and download it. * Copy the file to `src/e2e/resources/gmail-api` (create the `gmail-api` folder) of your project and rename it to `client_secret.json`. * It is also possible to use the Gmail API credentials from any other Google Cloud Platform project for this purpose. * Run `EmailAccountTest` to confirm that the setup works. For the first run, it is expected that you will need to grant access from the test Gmail account to the above API. -1. Login manually to TEAMMATES on the browser used for testing to add cookie with login details to the browser profile. - * This profile will be added to the web driver so that E2E tests will start with user already logged in. - * This is required as Google does not allow login by automated software. - 1. Run the full test suite or any subset of it as how you would have done it in dev server. * Do note that the GAE daily quota is usually not enough to run the full test suite, in particular for accounts with no billing enabled. -1 This setup is necessary because our test suite uses the Gmail API to access the Gmail account used for testing (the account is specified in `test.properties`) to confirm that the account receives the expected emails from TEAMMATES. -This is needed only when testing against a production server because no actual emails are sent by the dev server and therefore delivery of emails is not tested when testing against the dev server. - ## Creating E2E tests As E2E tests should be written from the end user perspective, each test case should reflect some user workflow. @@ -135,4 +128,4 @@ All Page Object classes inherit from `AppPage` which contains methods that are c We bundle together everything as one test case instead of having multiple test cases. The advantage is that the time for the whole test class will be reduced because we minimize repetitive per-method setup/teardown. The downside is that it increases the time spent on re-running failed tests as the whole class has to be re-run. We opt for this approach because we expect tests to pass more frequently than to fail. **Why is there one JSON file for each test case?** -Each test case has its own JSON file and the data inside has a unique prefix to prevent clashes in the database that may cause test failure, since tests are run concurrently. \ No newline at end of file +Each test case has its own JSON file and the data inside has a unique prefix to prevent clashes in the database that may cause test failure, since tests are run concurrently. diff --git a/docs/performance-testing.md b/docs/performance-testing.md index 2268b4fcdc6..f86e342bdd9 100644 --- a/docs/performance-testing.md +++ b/docs/performance-testing.md @@ -19,7 +19,7 @@ To see a sample implementation of a test case, you can refer to `StudentProfileL If you want to use your own copy of [JMeter](https://jmeter.apache.org/download_jmeter.cgi), update the `test.jmeter.*` properties in `src/lnp/resources/test.properties` accordingly. -First, open the terminal and navigate to the root of project folder. Start the backend server, i.e. `./gradlew appengineRun`, before running the performance tests. +First, open the terminal and navigate to the root of project folder. Start the backend server, i.e. `./gradlew serverRun`, before running the performance tests. For more details about how to set up and run your local server, please refer to [Developer Guide](https://github.com/TEAMMATES/teammates/blob/master/docs/development.md). diff --git a/docs/setting-up.md b/docs/setting-up.md index b1135db4549..abaadcba240 100644 --- a/docs/setting-up.md +++ b/docs/setting-up.md @@ -41,7 +41,6 @@ More information can be found at [this documentation](https://help.github.com/ar These tools are necessary regardless of whether you are developing front-end or back-end: 1. Install Java JDK 11. -1. Install Python 3 (recommended) or Python 2.7. If you want to develop front-end, you need to install the following: diff --git a/src/client/resources/client.template.properties b/src/client/resources/client.template.properties index 609ccc8d12c..417ef606aad 100644 --- a/src/client/resources/client.template.properties +++ b/src/client/resources/client.template.properties @@ -7,7 +7,7 @@ # This is the URL of the database the script will run against. # For staging server, the URL should be the URL of the application. # e.g. client.target.url=http\://localhost\:8484 -# e.g. client.target.url=https\://7-0-0-dot-teammates-john.appspot.com +# e.g. client.target.url=https\://8-0-0-dot-teammates-john.appspot.com client.target.url=http\://localhost\:8484 # This is the URL of the API back-end that the script will be run against. @@ -15,7 +15,7 @@ client.target.url=http\://localhost\:8484 # This URL will be used for other back-end operations that need connection to other services such as search service. # The backdoor key and CSRF key will be the keys that are used in the specified API back-end. # e.g. client.api.url=https\://localhost\:8080 -# e.g. client.api.url=https\://7-0-0-dot-teammates-john.appspot.com +# e.g. client.api.url=https\://8-0-0-dot-teammates-john.appspot.com client.api.url= client.backdoor.key= client.csrf.key= diff --git a/src/e2e/resources/test.template.properties b/src/e2e/resources/test.template.properties index bf302d2531c..72e6fb396e5 100644 --- a/src/e2e/resources/test.template.properties +++ b/src/e2e/resources/test.template.properties @@ -6,7 +6,7 @@ # This is the url of the app we are testing against. # e.g. test.app.url=http\://localhost\:8080 -# e.g. test.app.url=https\://7-0-0-dot-teammates-john.appspot.com +# e.g. test.app.url=https\://8-0-0-dot-teammates-john.appspot.com # Note: the '.' in the url has been replaced by -dot- to support https connection for the staging server. test.app.url=http\://localhost\:8080 diff --git a/src/lnp/java/teammates/lnp/cases/FeedbackQuestionUpdateLNPTest.java b/src/lnp/java/teammates/lnp/cases/FeedbackQuestionUpdateLNPTest.java index f64487e9b3b..44ed6b0451b 100644 --- a/src/lnp/java/teammates/lnp/cases/FeedbackQuestionUpdateLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/FeedbackQuestionUpdateLNPTest.java @@ -136,7 +136,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/java/teammates/lnp/cases/FeedbackSessionSubmitLNPTest.java b/src/lnp/java/teammates/lnp/cases/FeedbackSessionSubmitLNPTest.java index 988bbd04037..4df2a3f07d3 100644 --- a/src/lnp/java/teammates/lnp/cases/FeedbackSessionSubmitLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/FeedbackSessionSubmitLNPTest.java @@ -134,7 +134,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/java/teammates/lnp/cases/FeedbackSessionViewLNPTest.java b/src/lnp/java/teammates/lnp/cases/FeedbackSessionViewLNPTest.java index daf1511f857..3f712b502fa 100644 --- a/src/lnp/java/teammates/lnp/cases/FeedbackSessionViewLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/FeedbackSessionViewLNPTest.java @@ -129,7 +129,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/java/teammates/lnp/cases/InstructorSessionResultLNPTest.java b/src/lnp/java/teammates/lnp/cases/InstructorSessionResultLNPTest.java index 5c95d004f2b..ee8aab4b774 100644 --- a/src/lnp/java/teammates/lnp/cases/InstructorSessionResultLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/InstructorSessionResultLNPTest.java @@ -130,7 +130,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/java/teammates/lnp/cases/InstructorUpdateLNPTest.java b/src/lnp/java/teammates/lnp/cases/InstructorUpdateLNPTest.java index a2d9c7c351f..d7343bdf8b7 100644 --- a/src/lnp/java/teammates/lnp/cases/InstructorUpdateLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/InstructorUpdateLNPTest.java @@ -135,7 +135,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/java/teammates/lnp/cases/StudentEmailUpdateLNPTest.java b/src/lnp/java/teammates/lnp/cases/StudentEmailUpdateLNPTest.java index f21254666bc..a5ce67e214a 100644 --- a/src/lnp/java/teammates/lnp/cases/StudentEmailUpdateLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/StudentEmailUpdateLNPTest.java @@ -133,7 +133,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/java/teammates/lnp/cases/StudentSectionUpdateLNPTest.java b/src/lnp/java/teammates/lnp/cases/StudentSectionUpdateLNPTest.java index 0d3609fe80e..1a59c247c67 100644 --- a/src/lnp/java/teammates/lnp/cases/StudentSectionUpdateLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/StudentSectionUpdateLNPTest.java @@ -133,7 +133,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/java/teammates/lnp/cases/StudentTeamUpdateLNPTest.java b/src/lnp/java/teammates/lnp/cases/StudentTeamUpdateLNPTest.java index cdbdad76439..9b1aa9f1217 100644 --- a/src/lnp/java/teammates/lnp/cases/StudentTeamUpdateLNPTest.java +++ b/src/lnp/java/teammates/lnp/cases/StudentTeamUpdateLNPTest.java @@ -133,7 +133,7 @@ protected Map generateFeedbackSessions() { FeedbackSessionAttributes session = FeedbackSessionAttributes .builder(FEEDBACK_SESSION_NAME, COURSE_ID) .withCreatorEmail(INSTRUCTOR_EMAIL) - .withStartTime(Instant.now()) + .withStartTime(Instant.now().plusMillis(100)) .withEndTime(Instant.now().plusSeconds(500)) .withSessionVisibleFromTime(Instant.now()) .withResultsVisibleFromTime(Instant.now()) diff --git a/src/lnp/resources/test.template.properties b/src/lnp/resources/test.template.properties index 00dad5adcfa..abd0d07ea5f 100644 --- a/src/lnp/resources/test.template.properties +++ b/src/lnp/resources/test.template.properties @@ -6,13 +6,13 @@ # This is the url of the app we are testing against. # e.g. test.app.url=http\://localhost\:8080 -# e.g. test.app.url=https\://7-0-0-dot-teammates-john.appspot.com +# e.g. test.app.url=https\://8-0-0-dot-teammates-john.appspot.com # Note: the '.' in the url has been replaced by -dot- to support https connection for the staging server. test.app.url=http\://localhost\:8080 # This is the domain of the app we are testing against. # e.g. test.app.domain=localhost -# e.g. test.app.domain=7-0-0-dot-teammates-john.appspot.com +# e.g. test.app.domain=8-0-0-dot-teammates-john.appspot.com test.app.domain=localhost # This is the port of the app we are testing against. diff --git a/src/main/java/teammates/storage/search/SearchManager.java b/src/main/java/teammates/storage/search/SearchManager.java index 9c1d754fa23..4afde069f04 100644 --- a/src/main/java/teammates/storage/search/SearchManager.java +++ b/src/main/java/teammates/storage/search/SearchManager.java @@ -54,7 +54,10 @@ abstract class SearchManager> { if (StringHelper.isEmpty(searchServiceHost)) { this.client = null; } else { - this.client = new HttpSolrClient.Builder(searchServiceHost).build(); + this.client = new HttpSolrClient.Builder(searchServiceHost) + .withConnectionTimeout(2000) // timeout for connecting to Solr server + .withSocketTimeout(5000) // timeout for reading data + .build(); } } diff --git a/src/main/java/teammates/ui/servlets/WebSecurityHeaderFilter.java b/src/main/java/teammates/ui/servlets/WebSecurityHeaderFilter.java index af5ea02f033..ba8f3d64250 100644 --- a/src/main/java/teammates/ui/servlets/WebSecurityHeaderFilter.java +++ b/src/main/java/teammates/ui/servlets/WebSecurityHeaderFilter.java @@ -11,17 +11,23 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; +import teammates.common.util.Config; + /** * Filter to add web security headers. */ public class WebSecurityHeaderFilter implements Filter { + private static final String IMG_SRC_CSP = Config.isDevServer() + ? "'self' data: http: https:" + : "'self' data: https:"; + private static final String CSP_POLICY = String.join("; ", Arrays.asList( "default-src 'none'", "script-src 'self' https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ https://cdn.jsdelivr.net/", "style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net/", "frame-src 'self' docs.google.com https://www.google.com/recaptcha/", - "img-src 'self' data: http: https:", + "img-src " + IMG_SRC_CSP, "font-src 'self' https://cdn.jsdelivr.net/", "connect-src 'self'", "manifest-src 'self'", diff --git a/src/main/resources/build.template.properties b/src/main/resources/build.template.properties index 83dec985857..d407cf4965c 100644 --- a/src/main/resources/build.template.properties +++ b/src/main/resources/build.template.properties @@ -16,8 +16,8 @@ app.region=us-central1 # This is the version number of the app. # Use dashes instead of dots because GAE does not allow dots in version number. -# e.g. app.version = 7-0-0 -app.version = 7-0-0 +# e.g. app.version = 8-0-0 +app.version = 8-0-0 # This is the URL for the front-end dev server. # This should be used only during development mode where the dev server needs to be whitelisted for CORS. diff --git a/src/web/app/pages-instructor/instructor-search-page/__snapshots__/instructor-search-page.component.spec.ts.snap b/src/web/app/pages-instructor/instructor-search-page/__snapshots__/instructor-search-page.component.spec.ts.snap index 5af3a386ee8..50da198d4ca 100644 --- a/src/web/app/pages-instructor/instructor-search-page/__snapshots__/instructor-search-page.component.spec.ts.snap +++ b/src/web/app/pages-instructor/instructor-search-page/__snapshots__/instructor-search-page.component.spec.ts.snap @@ -6,6 +6,7 @@ exports[`InstructorSearchPageComponent should snap with a search key 1`] = ` isSearching="false" searchParams={[Function Object]} searchService={[Function SearchService]} + searchWarningDisplayed="false" statusMessageService={[Function StatusMessageService]} studentsListRowTables={[Function Array]} > @@ -77,6 +78,7 @@ exports[`InstructorSearchPageComponent should snap with a student table 1`] = ` isSearching="false" searchParams={[Function Object]} searchService={[Function SearchService]} + searchWarningDisplayed="false" statusMessageService={[Function StatusMessageService]} studentsListRowTables={[Function Array]} > @@ -606,6 +608,7 @@ exports[`InstructorSearchPageComponent should snap with default fields 1`] = ` isSearching="false" searchParams={[Function Object]} searchService={[Function SearchService]} + searchWarningDisplayed="false" statusMessageService={[Function StatusMessageService]} studentsListRowTables={[Function Array]} > diff --git a/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.html b/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.html index 1256ec64a38..150e016f07d 100644 --- a/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.html +++ b/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.html @@ -1,3 +1,9 @@ +
+ NOTE: We are currently upgrading the search infrastructure of the system. + During this period, you may find your search results not up-to-date, particularly for older data. +
+ The upgrade is expected to finish by Aug 16, 2021. We apologize for any inconvenience caused. +
diff --git a/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.ts b/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.ts index 2e8fe64a5da..cbdc5b3c2f0 100644 --- a/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.ts +++ b/src/web/app/pages-instructor/instructor-search-page/instructor-search-page.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { forkJoin, Observable, of } from 'rxjs'; import { finalize, map, mergeMap } from 'rxjs/operators'; +import { environment } from '../../../environments/environment'; import { CourseService } from '../../../services/course.service'; import { InstructorSearchResult, SearchService } from '../../../services/search.service'; import { StatusMessageService } from '../../../services/status-message.service'; @@ -28,6 +29,7 @@ export class InstructorSearchPageComponent implements OnInit { }; studentsListRowTables: SearchStudentsListRowTable[] = []; isSearching: boolean = false; + searchWarningDisplayed: boolean = !!environment.searchWarningDisplayed; constructor( private statusMessageService: StatusMessageService, diff --git a/src/web/data/developers.json b/src/web/data/developers.json index e59af52ea1f..520c33db15d 100644 --- a/src/web/data/developers.json +++ b/src/web/data/developers.json @@ -77,8 +77,7 @@ "username": "95adityajain" }, { - "name": "Adrian Lachowicz", - "username": "Adrian27045" + "name": "Adrian Lachowicz" }, { "multiple": true, @@ -133,8 +132,7 @@ "username": "AlexM9200" }, { - "name": "Alexander Levy", - "username": "allevy3" + "name": "Alexander Levy" }, { "name": "Alexandr Kolymago", @@ -182,7 +180,7 @@ }, { "name": "Andrew Jefferson", - "username": "arkadyt" + "username": "iamarkadyt" }, { "name": "Andrew Levit", @@ -320,6 +318,10 @@ "name": "Bjarke S.", "username": "Wimpzer" }, + { + "multiple": true, + "username": "BoazWu" + }, { "multiple": true, "name": "Brian Coveney", @@ -338,6 +340,10 @@ "name": "Chan Junwei", "username": "chanjunweimy" }, + { + "name": "Chanwoo Jung", + "username": "ChanwooJung1" + }, { "name": "Chao Song", "username": "songchoa" @@ -370,6 +376,11 @@ "name": "Chin Yong Wei", "username": "vertigogarden" }, + { + "multiple": true, + "name": "Chloe Stapleton", + "username": "stapletonce" + }, { "name": "Chng Zhi Xuan", "username": "Chng-Zhi-Xuan" @@ -437,11 +448,6 @@ "name": "Dante Radovani", "username": "dRadest" }, - { - "multiple": true, - "name": "Dao Ngoc Hieu", - "username": "daongochieu2810" - }, { "multiple": true, "name": "Daryl Lim" @@ -469,6 +475,7 @@ "username": "dp80" }, { + "name": "Diana Ramos", "username": "Diana-Ramos" }, { @@ -555,6 +562,9 @@ "name": "Foo Yong Jie", "username": "jadow" }, + { + "username": "frankelsf" + }, { "name": "Fred Xu", "username": "fairbet" @@ -591,6 +601,9 @@ "name": "Georgios Theodorou", "username": "gthd" }, + { + "username": "Gily-H" + }, { "name": "Gonçalo Garcia", "username": "GoncaloGarcia" @@ -676,8 +689,7 @@ "username": "Malkone" }, { - "name": "Irene Tenison", - "username": "ireneten" + "name": "Irene Tenison" }, { "name": "Ivan Rocha", @@ -685,7 +697,7 @@ }, { "name": "Jackson Hoggard", - "username": "CremBluRay" + "username": "JacksonHoggard" }, { "name": "Jaikirat Singh Sandhu", @@ -771,8 +783,7 @@ "username": "lehighjcut" }, { - "name": "Jordan Niskanen", - "username": "jnisky" + "name": "Jordan Niskanen" }, { "name": "Jorge André", @@ -912,6 +923,10 @@ "name": "Lakmal Padmakumara", "username": "rclakmal" }, + { + "name": "Lan Yu Xuan", + "username": "Jellybeano" + }, { "name": "Le Minh Duc", "username": "darrenlmd" @@ -935,11 +950,6 @@ "name": "Leonard Hio", "username": "leonardhml" }, - { - "multiple": true, - "name": "Li Jianhan", - "username": "jianhandev" - }, { "multiple": true, "name": "Lian Wenhui Florine" @@ -952,11 +962,6 @@ "name": "Lim Jia Yee", "username": "jia1" }, - { - "multiple": true, - "name": "Lim Zi Wei", - "username": "halfwhole" - }, { "name": "Liu Jia Hao", "username": "LIUJIAHAOCS" @@ -990,12 +995,13 @@ "username": "lmk1988" }, { + "multiple": true, "name": "Lye Yi Xian", "username": "lyeyixian" }, { "name": "Mac Knight", - "username": "Shels1909" + "username": "mfdooom" }, { "name": "Madhav Thakker", @@ -1081,11 +1087,6 @@ { "username": "misaunde" }, - { - "multiple": true, - "name": "Mo Zongran", - "username": "moziliar" - }, { "name": "Moaz Baghdadi", "username": "moazbaghdadi" @@ -1246,7 +1247,7 @@ { "multiple": true, "name": "Peh Shao Hong", - "username": "pshken" + "username": "sh-ao" }, { "multiple": true, @@ -1296,6 +1297,11 @@ "name": "Pravesh Jain", "username": "praveshjain" }, + { + "multiple": true, + "name": "Priscilla Paulson", + "username": "pPris" + }, { "name": "Prithviraj Billa" }, @@ -1309,8 +1315,7 @@ "username": "Progyan1997" }, { - "name": "Pulasthi Harasgama", - "username": "Pulasthih" + "name": "Pulasthi Harasgama" }, { "multiple": true, @@ -1372,7 +1377,7 @@ }, { "name": "Rohith Mukku", - "username": "Naruto8" + "username": "rohithmukku" }, { "username": "RonMosenzon" @@ -1411,11 +1416,13 @@ "username": "samatdav" }, { - "name": "Sandeep Choudhary", - "username": "Skchoudhary" + "multiple": true, + "name": "Samuel Fang", + "username": "samuelfangjw" }, { - "username": "sandysingh11918" + "name": "Sandeep Choudhary", + "username": "Skchoudhary" }, { "name": "Sanjeev Kumar", @@ -1641,6 +1648,11 @@ "multiple": true, "name": "Tan Guo Wei" }, + { + "multiple": true, + "name": "Tan Jin", + "username": "tjtanjin" + }, { "multiple": true, "name": "Tan Jun Kiat", @@ -1709,10 +1721,16 @@ "name": "Thng Kai Yuan", "username": "thngkaiyuan" }, + { + "username": "tlhuynh" + }, { "name": "Tom Elliott", "username": "tomelliott1988" }, + { + "username": "TomKemperNL" + }, { "username": "tong72" }, @@ -1804,11 +1822,6 @@ "multiple": true, "name": "Wu Lifu" }, - { - "multiple": true, - "name": "Wu Qirui", - "username": "hhdqirui" - }, { "name": "Wu Xiao Xiao", "username": "a0129998" @@ -1852,11 +1865,6 @@ "name": "Yatri Patel", "username": "yatri1609" }, - { - "multiple": true, - "name": "Yen Pinhsuan", - "username": "ypinhsuan" - }, { "multiple": true, "name": "Yen Zi Shyun" @@ -1899,6 +1907,11 @@ "name": "Zhang Haoqiang", "username": "haoqiang" }, + { + "multiple": true, + "name": "Zhang Xinyi", + "username": "xyzhang00" + }, { "multiple": true, "name": "Zheng Pingxia" @@ -1911,27 +1924,44 @@ { "name": "Zhu Yilun", "username": "yilun-zhu" + } + ], + "committers": [ + { + "name": "Yen Pinhsuan", + "username": "ypinhsuan", + "startPeriod": "May 2021" }, { - "name": "sofefr", - "username": "sofefr" + "name": "Wu Qirui", + "username": "hhdqirui", + "startPeriod": "May 2021" }, { - "multiple": true, - "name": "stapletonce", - "username": "stapletonce" + "name": "Li Jianhan", + "username": "jianhandev", + "startPeriod": "Feb 2021" }, { - "name": "tlhuynh", - "username": "tlhuynh" - } - ], - "committers": [ + "name": "Lim Zi Wei", + "username": "halfwhole", + "startPeriod": "Feb 2021" + }, + { + "name": "Dao Ngoc Hieu", + "username": "daongochieu2810", + "startPeriod": "Feb 2021" + }, + { + "name": "Mo Zongran", + "username": "moziliar", + "startPeriod": "Aug 2020" + }, { "name": "Derek Zhuang", "username": "Derek-Hardy", "startPeriod": "May 2020", - "endPeriod": "Jul 2020" + "endPeriod": "May 2021" }, { "name": "Daryl Chan", @@ -2126,16 +2156,6 @@ "Committer (Apr 2015 - May 2015)" ] }, - { - "name": "Xiao Pu", - "username": "xpdavid", - "currentPosition": "Project Mentor (Aug 2020 - )", - "pastPositions": [ - "Project Lead (Jun 2018 - Aug 2020)", - "Area Lead (Jan 2018 - May 2018)", - "Committer (Jan 2017 - Apr 2017)" - ] - }, { "name": "Rahul Rajesh", "username": "rrtheonlyone", @@ -2154,18 +2174,10 @@ "Committer (Jan 2020 - May 2020)" ] }, - { - "name": "Ni Tianzhen", - "username": "niqiukun", - "currentPosition": "Area Lead (Aug 2020 - )", - "pastPositions": [ - "Committer (Jan 2020 - May 2020)" - ] - }, { "name": "Tiu Wee Han", "username": "tiuweehan", - "currentPosition": "Area Lead (Aug 2020 - )", + "currentPosition": "Snr Developer (Aug 2020 - )", "pastPositions": [ "Committer (Jan 2020 - May 2020)" ] @@ -2186,14 +2198,6 @@ "Committer (Jan 2020 - May 2020)" ] }, - { - "name": "Jason Tan", - "username": "jtankw3", - "currentPosition": "Snr Developer (Aug 2020 - )", - "pastPositions": [ - "Committer (Jan 2020 - Jul 2020)" - ] - }, { "name": "Chong Chee Yuan", "username": "ccyccyccy", @@ -2210,6 +2214,32 @@ "Committer (May 2020 - Jul 2020)" ] }, + { + "name": "Xiao Pu", + "username": "xpdavid", + "pastPositions": [ + "Project Mentor (Aug 2020 - Dec 2020)", + "Project Lead (Jun 2018 - Aug 2020)", + "Area Lead (Jan 2018 - May 2018)", + "Committer (Jan 2017 - Apr 2017)" + ] + }, + { + "name": "Ni Tianzhen", + "username": "niqiukun", + "pastPositions": [ + "Snr Developer (Aug 2020 - Dec 2020)", + "Committer (Jan 2020 - May 2020)" + ] + }, + { + "name": "Jason Tan", + "username": "jtankw3", + "pastPositions": [ + "Snr Developer (Aug 2020 - Dec 2020)", + "Committer (Jan 2020 - Jul 2020)" + ] + }, { "name": "Jiang Chunhui", "username": "Adoby7", diff --git a/src/web/environments/config.template.ts b/src/web/environments/config.template.ts index b32b24ff2d3..812b5390e3c 100644 --- a/src/web/environments/config.template.ts +++ b/src/web/environments/config.template.ts @@ -5,7 +5,7 @@ export const config: any = { /** * The application version. */ - version: '7.0.0', + version: '8.0.0', /** * The URL of page to be loaded for the account request page. @@ -29,4 +29,10 @@ export const config: any = { * Under maintenance mode, all requests to the front-end will be routed to the "under maintenance" page. */ maintenance: false, + + /** + * Indicates whether search feature warning should be displayed. + */ + searchWarningDisplayed: false, + };