Compare commits
19 Commits
open-relea
...
open-relea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97c58157f8 | ||
|
|
ce093efba4 | ||
|
|
799ef5b8a1 | ||
|
|
f956351cf7 | ||
|
|
7772e21c6a | ||
|
|
f07a96ce58 | ||
|
|
f64bc8d4a6 | ||
|
|
134dabb710 | ||
|
|
65c25f00b6 | ||
|
|
31748e246e | ||
|
|
650be29ef9 | ||
|
|
b713ab5748 | ||
|
|
5fe80b4a52 | ||
|
|
9e04813d06 | ||
|
|
a0e1a60d23 | ||
|
|
68c7944dd5 | ||
|
|
f4f6e5551f | ||
|
|
ee99bfdaa4 | ||
|
|
318ce349fc |
@@ -23,6 +23,7 @@ MARKETING_SITE_BASE_URL='http://localhost:18000'
|
||||
SUPPORT_URL='http://localhost:18000/support'
|
||||
CONTACT_URL='http://localhost:18000/contact'
|
||||
OPEN_SOURCE_URL='http://localhost:18000/openedx'
|
||||
ORDER_HISTORY_URL='http://localhost:1996/orders'
|
||||
TERMS_OF_SERVICE_URL='http://localhost:18000/terms-of-service'
|
||||
PRIVACY_POLICY_URL='http://localhost:18000/privacy-policy'
|
||||
FACEBOOK_URL='https://www.facebook.com'
|
||||
|
||||
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -3,4 +3,4 @@
|
||||
# These owners will be the default owners for everything in
|
||||
# the repo. Unless a later match takes precedence, they will
|
||||
# be requested for review when someone opens a pull request.
|
||||
* @edx/masters-devs-gta
|
||||
* @openedx/content-aurora
|
||||
|
||||
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -26,4 +26,4 @@ Collectively, these should be completed by reviewers of this PR:
|
||||
- [ ] I've tested the new functionality
|
||||
|
||||
|
||||
FYI: @edx/masters-devs-gta
|
||||
FYI: @openedx/content-aurora
|
||||
|
||||
19
.github/workflows/add-depr-ticket-to-depr-board.yml
vendored
Normal file
19
.github/workflows/add-depr-ticket-to-depr-board.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# Run the workflow that adds new tickets that are either:
|
||||
# - labelled "DEPR"
|
||||
# - title starts with "[DEPR]"
|
||||
# - body starts with "Proposal Date" (this is the first template field)
|
||||
# to the org-wide DEPR project board
|
||||
|
||||
name: Add newly created DEPR issues to the DEPR project board
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
routeissue:
|
||||
uses: openedx/.github/.github/workflows/add-depr-ticket-to-depr-board.yml@master
|
||||
secrets:
|
||||
GITHUB_APP_ID: ${{ secrets.GRAPHQL_AUTH_APP_ID }}
|
||||
GITHUB_APP_PRIVATE_KEY: ${{ secrets.GRAPHQL_AUTH_APP_PEM }}
|
||||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_ISSUE_BOT_TOKEN }}
|
||||
59
.github/workflows/ci.yml
vendored
Normal file
59
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
name: node_js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- "**"
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
node: [12, 14, 16]
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Nodejs
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Unit Tests
|
||||
run: npm run test
|
||||
|
||||
- name: Validate Package Lock
|
||||
run: make validate-no-uncommitted-package-lock-changes
|
||||
|
||||
- name: Run Lint
|
||||
run: npm run lint
|
||||
|
||||
- name: Run Test
|
||||
run: npm run test
|
||||
|
||||
- name: Run Build
|
||||
run: npm run build
|
||||
|
||||
- name: Run Coverage
|
||||
uses: codecov/codecov-action@v2
|
||||
|
||||
- name: Send failure notification
|
||||
if: ${{ failure() }}
|
||||
uses: dawidd6/action-send-mail@v3
|
||||
with:
|
||||
server_address: email-smtp.us-east-1.amazonaws.com
|
||||
server_port: 465
|
||||
username: ${{secrets.EDX_SMTP_USERNAME}}
|
||||
password: ${{secrets.EDX_SMTP_PASSWORD}}
|
||||
subject: CI workflow failed in ${{github.repository}}
|
||||
to: masters-grades@edx.org
|
||||
from: github-actions <github-actions@edx.org>
|
||||
body: CI workflow in ${{github.repository}} failed! For details see "github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||
33
.github/workflows/npm-publish.yml
vendored
Normal file
33
.github/workflows/npm-publish.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
name: Release CI
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Create Build
|
||||
run: npm run build
|
||||
|
||||
- name: Release Package
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_GITHUB_TOKEN }}
|
||||
NPM_TOKEN: ${{ secrets.SEMANTIC_RELEASE_NPM_TOKEN }}
|
||||
run: npm semantic-release
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,6 +5,8 @@ npm-debug.log
|
||||
coverage
|
||||
|
||||
dist/
|
||||
src/i18n/transifex_input.json
|
||||
temp/babel-plugin-react-intl
|
||||
|
||||
### pyenv ###
|
||||
.python-version
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
.eslintignore
|
||||
.eslintrc.json
|
||||
.gitignore
|
||||
.travis.yml
|
||||
docker-compose.yml
|
||||
Dockerfile
|
||||
Makefile
|
||||
|
||||
28
.travis.yml
28
.travis.yml
@@ -1,28 +0,0 @@
|
||||
language: node_js
|
||||
node_js: 12
|
||||
notifications:
|
||||
email:
|
||||
recipients:
|
||||
- masters-grades@edx.org
|
||||
on_success: never
|
||||
on_failure: always
|
||||
webhooks: https://www.travisbuddy.com/
|
||||
on_success: never
|
||||
before_install:
|
||||
- npm install -g greenkeeper-lockfile@1.14.0
|
||||
install:
|
||||
- npm ci
|
||||
before_script: greenkeeper-lockfile-update
|
||||
after_script: greenkeeper-lockfile-upload
|
||||
script:
|
||||
- make validate-no-uncommitted-package-lock-changes
|
||||
- npm run lint
|
||||
- npm run test
|
||||
- npm run build
|
||||
after_success:
|
||||
- npm run travis-deploy-once "npm run semantic-release"
|
||||
- npm run coveralls
|
||||
env:
|
||||
global:
|
||||
- secure: bBLQZVw1aVUxB7GFNXGrdKeztyFrCCJusVgFcSuej9S4qmj9/jrVsEc9dEcH+BMS+b49+SvILoxzd6ZYLaRygQLzevnO1/dX596DeCKVK48PTTZRsNyafaSMCkxNKqEmRcA9hYL52xJJ5GpKo7ViWsFy8VFgUfZEJxQi8/lYbfQ1vlXRpo2LJfJh09v85roSXdQmajyGJ1Dz6elcwUX5B+BgXmIHizJXUMfFci61xTEZmgKtfeCiwFQA5pCvVMHBQhgySqT2N3eRESzRt2jAfAdcRKBYXS0rwKymdlL1ZF349Jm8xwtqm19Fwsut21181Lnn6FmccMWhQ7man3WH1xfT0ahmHNs1KJMyZcwRJd/gDfbd6iD3LB9Pt9hEQ00Qh/m7MYeahMxTEL9bp2TyILi8cTP91jeBUHCExCdv2jRrUQEnUS5vZUYRdM8CR2DLoLmNh3APndKzwgr5U8rh6RdhbQBJp97Hb/YYVrBiP2atLJAaYPY/xEQHK/YoXelQgiZ6wHBMV+tF/L0ZRn7KyVWdkbBKWfbEjRKbEJD9WD+V7HayMR81tm5CSqlrG8mTvSy2boIGiX14GV11ZEfMj5bjb6W41BW+QGqQerZvmwk/4ywe304X85PD0OBhIYPRzeLIi0Gt6lD1aOpVxgm4M03tdgYQzCPWRPq32CB+1IA=
|
||||
- secure: w1d/E+cc4+Bf017Jpp9YsKBzLSZw9sqKZGeM2tNrO6eJZbMJqfKTmfUrRw8BoLh1Z8YRkHF7RADDy3ln7XEdeAX3j9OoC3Cz0zN6iDX6TPcI461NuOIscJYb4tyFcuWm6FhgVlBAlo/BI3q+zqKwjfWuDaORpk6+haacCmvTe5V0vWhY+MYT7M+LfnKeKVzhI4magGt8jPTE21oziIFwCqCCjJc4+AmsWoWTzU0Q7Db0DZiJnLXFfXybLbkedAgJmcSgEGZCSpaZIOkX0/Lbazsz1Ky4KASfkrYT1Z5iKQ8TE3skmx1IIu+1egN8iBbdrY+NhvV24RkT+rpUvD7TBIHTrjQ5JYLe0kGjN70vG7YlKgjNSyTjkrEd7fCKpuIol3DVjBRz3tV5aCl0t/A8mIPqKyNI94MamWsExpqsxgcb9vBVno5caZvD8ZXNrGNqanB3MSoLGxZTLKif9u+AZfLnB3xtjaiJg3/BNoWaOBPlp/M6BvGIGHElwvLrAhUvl8wzrwJcQQWpmRMh0b6enr6Y7ox/mGGs7NBCT+CNKEsWeCfY4thZzgi6/GocXyqdTpXMkNSI1PDoPmi+vKafBd+7aAYbcUlJBTU6TAxyncln0tF2JF+ghTZ0v8nNzEQ9VmV4ddyoOHx6YnHvEcenWZGMROQnMCVifyDbaHpPbPI=
|
||||
@@ -1,8 +1,9 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[edx-platform.frontend-app-gradebook]
|
||||
[o:open-edx:p:edx-platform:r:frontend-app-gradebook]
|
||||
file_filter = src/i18n/messages/<lang>.json
|
||||
source_file = src/i18n/transifex_input.json
|
||||
source_lang = en
|
||||
type = KEYVALUEJSON
|
||||
type = KEYVALUEJSON
|
||||
|
||||
|
||||
4
Makefile
4
Makefile
@@ -57,9 +57,9 @@ push_translations:
|
||||
|
||||
# Pulls translations from Transifex.
|
||||
pull_translations:
|
||||
tx pull -f --mode reviewed --language=$(transifex_langs)
|
||||
tx pull -f --mode reviewed --languages=$(transifex_langs)
|
||||
|
||||
# This target is used by Travis.
|
||||
# This target is used by CI.
|
||||
validate-no-uncommitted-package-lock-changes:
|
||||
# Checking for package-lock.json changes...
|
||||
git diff --exit-code package-lock.json
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
# Travis Configuration
|
||||
|
||||
Your project might have different build requirements - however, this project's `.travis.yml` configuration is supposed to represent a good starting point.
|
||||
|
||||
## Node JS Version
|
||||
|
||||
The minimum `Node` and `npm` versions that edX supports is `8.9.3` and `5.5.1`, respectively.
|
||||
|
||||
## Caching node_modules
|
||||
|
||||
While [the `Travis` blog](https://blog.travis-ci.com/2016-11-21-travis-ci-now-supports-yarn) recommends
|
||||
|
||||
```yaml
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
```
|
||||
|
||||
this causes issues when testing different versions of `Node` because [`node_modules` will store the compiled native modules](https://stackoverflow.com/a/42523517/5225575).
|
||||
|
||||
Caching the `~/.npm` directory avoids storing these native modules.
|
||||
|
||||
## Notifications
|
||||
|
||||
This project uses a service called [`TravisBuddy`](https://www.travisbuddy.com/), which provides Travis build context within a PR via webhooks (configured only to add feedback for build failures).
|
||||
|
||||

|
||||
|
||||
## Installing `greenkeeper-lockfile`
|
||||
|
||||
As explained in [the `Greenkeeper` documentation](https://greenkeeper.io/docs.html#greenkeeper-step-by-step), `Greenkeeper` is a service that keeps track of your project's dependencies, and will, for example, automatically open PRs with an updated `package.json` file when the latest version of a dependency is a major version ahead of the existing dependency version in your `package.json` file.
|
||||
|
||||
This automated updating is great, but `Greenkeeper` does not update your `package-lock.json` file, just your `package.json` file. This makes sense, as the only way to update the `package-lock.json` file would be to run `npm install` when building your project, using the latest `package.json`, and then committing the updated `package-lock.json` file.
|
||||
|
||||
This is essentially what you have to do manually when `Greenkeeper` opens a PR - `git checkout` the branch, `npm install` locally, `git commit` the `package-lock.json` changes, and then `git push` those changes to the `Greenkeeper` branch on `origin`. It's fun probably only the first time, and even then it gets old, fast.
|
||||
|
||||
What [`greenkeeper-lockfile`](https://github.com/greenkeeperio/greenkeeper-lockfile) does is that it automates the previous steps as part of the build process.
|
||||
|
||||
It will
|
||||
* Check that the branch is a `Greenkeeper` branch
|
||||
* Update the lockfile
|
||||
* Push a commit with the updated lockfile back to the Greenkeeper branch
|
||||
|
||||
This is why it's important to install `greenkeeper-lockfile` in the `before_install` step, and since it's used exclusively only in the Travis Build, why it's not part of the package's dependencies.
|
||||
|
||||
## Scripts
|
||||
|
||||
Most of the `script`s are self-explanatory - you probably want to fail a build if there are linting violations, or if any tests don't pass, or if it cannot compile your files.
|
||||
|
||||
However, there are a couple additional `script`s that might seem less self-explanatory.
|
||||
|
||||
### What the heck is `make validate-no-uncommitted-package-lock-changes`?
|
||||
|
||||
There are only two requirements for a good `make target` name
|
||||
|
||||
1. Definitely make it really verbose so people can't remember what it's called
|
||||
2. Definitely don't not use a double-negative
|
||||
|
||||
What `make validate-no-uncommitted-package-lock-changes` does is `git diff`s for any `package-lock.json` file changes in your project. It's important to remember that all build `script`s are executed in Travis *after* the `install` step (aka post-`npm install`).
|
||||
|
||||
This is important because `npm` uses the pinned dependencies in your `package-lock.json` file to build the `node_modules` directory. However, the dependencies defined within the `package.json` file can be modified manually, for example, to become misaligned with the dependencies defined within the `package-lock.json`. So when `npm install` executes, the `package-lock.json` file will be updated to mirror the modified `package.json` changes.
|
||||
|
||||
However, when these changes surface within a Travis build, this indicates differing dependency expectations between the committed `package.json` file and the `package-lock.json` file, which is a good reason to fail a build.
|
||||
|
||||
### What is this `npm run is-es5` check?
|
||||
|
||||
This project outputs production files to the `dist` folder. The `npm script`, `npm run is-es5`, checks the JavaScript files in the `dist` folder to make sure that they are `ES5`-compliant.
|
||||
|
||||
This check is important because `ES5` JavaScript has [greater browser compatibility](http://kangax.github.io/compat-table/es5/) than [`ES2015+`](http://kangax.github.io/compat-table/es6/) - particularly for `IE11`.
|
||||
|
||||
### `deploy` step
|
||||
|
||||
How your project deploys will probably differ between the cookie cutter and your own application.
|
||||
|
||||
For demonstrational purposes, the cookie cutter deploys to GitHub pages using [`Travis`'s GitHub pages configuration](https://docs.travis-ci.com/user/deployment/pages/).
|
||||
|
||||
Your application might deploy to an `S3` bucket or to `npm`.
|
||||
40
documentation/CI.md
Executable file
40
documentation/CI.md
Executable file
@@ -0,0 +1,40 @@
|
||||
# CI Configuration
|
||||
|
||||
Your project might have different build requirements - however, this project's `.github/ci.yml` configuration is supposed to represent a good starting point.
|
||||
|
||||
## Node JS Version
|
||||
|
||||
The minimum `Node` and `npm` versions that edX supports is `8.9.3` and `5.5.1`, respectively.
|
||||
|
||||
## Scripts
|
||||
|
||||
Most of the `script`s are self-explanatory - you probably want to fail a build if there are linting violations, or if any tests don't pass, or if it cannot compile your files.
|
||||
|
||||
However, there are a couple additional `script`s that might seem less self-explanatory.
|
||||
|
||||
### What the heck is `make validate-no-uncommitted-package-lock-changes`?
|
||||
|
||||
There are only two requirements for a good `make target` name
|
||||
|
||||
1. Definitely make it really verbose so people can't remember what it's called
|
||||
2. Definitely don't not use a double-negative
|
||||
|
||||
What `make validate-no-uncommitted-package-lock-changes` does is `git diff`s for any `package-lock.json` file changes in your project. It's important to remember that all build `script`s are executed in CI *after* the `install` step (aka post-`npm install`).
|
||||
|
||||
This is important because `npm` uses the pinned dependencies in your `package-lock.json` file to build the `node_modules` directory. However, the dependencies defined within the `package.json` file can be modified manually, for example, to become misaligned with the dependencies defined within the `package-lock.json`. So when `npm install` executes, the `package-lock.json` file will be updated to mirror the modified `package.json` changes.
|
||||
|
||||
However, when these changes surface within a CI build, this indicates differing dependency expectations between the committed `package.json` file and the `package-lock.json` file, which is a good reason to fail a build.
|
||||
|
||||
### What is this `npm run is-es5` check?
|
||||
|
||||
This project outputs production files to the `dist` folder. The `npm script`, `npm run is-es5`, checks the JavaScript files in the `dist` folder to make sure that they are `ES5`-compliant.
|
||||
|
||||
This check is important because `ES5` JavaScript has [greater browser compatibility](http://kangax.github.io/compat-table/es5/) than [`ES2015+`](http://kangax.github.io/compat-table/es6/) - particularly for `IE11`.
|
||||
|
||||
### `deploy` step
|
||||
|
||||
How your project deploys will probably differ between the cookie cutter and your own application.
|
||||
|
||||
For demonstrational purposes, the cookie cutter deploys to GitHub pages using [ GitHUb CI ].
|
||||
|
||||
Your application might deploy to an `S3` bucket or to `npm`.
|
||||
51461
package-lock.json
generated
51461
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@edx/frontend-app-gradebook",
|
||||
"version": "1.4.47",
|
||||
"version": "1.5.0",
|
||||
"description": "edx editable gradebook-ui to manipulate grade overrides on subsections",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -17,8 +17,7 @@
|
||||
"semantic-release": "semantic-release",
|
||||
"start": "fedx-scripts webpack-dev-server --progress",
|
||||
"test": "TZ=GMT fedx-scripts jest --coverage --passWithNoTests",
|
||||
"watch-tests": "jest --watch",
|
||||
"travis-deploy-once": "travis-deploy-once"
|
||||
"watch-tests": "jest --watch"
|
||||
},
|
||||
"author": "edX",
|
||||
"license": "AGPL-3.0",
|
||||
@@ -26,11 +25,17 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"browserslist": [
|
||||
"last 2 versions",
|
||||
"not ie > 0",
|
||||
"not ie_mob > 0"
|
||||
],
|
||||
"dependencies": {
|
||||
"@edx/brand": "npm:@edx/brand-edx.org@^1.3.2",
|
||||
"@edx/frontend-component-footer": "10.1.1",
|
||||
"@edx/frontend-platform": "1.9.5",
|
||||
"@edx/paragon": "14.16.4",
|
||||
"@edx/frontend-component-footer": "10.2.1",
|
||||
"@edx/frontend-component-header": "2.4.5",
|
||||
"@edx/frontend-platform": "1.15.1",
|
||||
"@edx/paragon": "19.6.0",
|
||||
"@fortawesome/fontawesome-svg-core": "^1.2.25",
|
||||
"@fortawesome/free-brands-svg-icons": "^5.11.2",
|
||||
"@fortawesome/free-solid-svg-icons": "^5.11.2",
|
||||
@@ -44,13 +49,12 @@
|
||||
"enzyme-to-json": "^3.6.2",
|
||||
"font-awesome": "4.7.0",
|
||||
"history": "4.10.1",
|
||||
"node-sass": "^4.14.1",
|
||||
"prop-types": "15.7.2",
|
||||
"query-string": "6.13.0",
|
||||
"react": "16.13.1",
|
||||
"react-dom": "16.13.1",
|
||||
"react": "16.14.0",
|
||||
"react-dom": "16.14.0",
|
||||
"react-intl": "^2.9.0",
|
||||
"react-redux": "^5.1.1",
|
||||
"react-redux": "^7.1.1",
|
||||
"react-router": "5.2.0",
|
||||
"react-router-dom": "5.2.0",
|
||||
"react-router-redux": "^5.0.0-alpha.9",
|
||||
@@ -60,11 +64,12 @@
|
||||
"redux-logger": "3.0.6",
|
||||
"redux-thunk": "2.3.0",
|
||||
"regenerator-runtime": "^0.13.7",
|
||||
"sass": "^1.49.0",
|
||||
"util": "^0.12.3",
|
||||
"whatwg-fetch": "^2.0.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@edx/frontend-build": "5.5.2",
|
||||
"@edx/frontend-build": "9.1.1",
|
||||
"axios": "0.21.1",
|
||||
"axios-mock-adapter": "^1.17.0",
|
||||
"codecov": "^3.6.1",
|
||||
@@ -78,7 +83,6 @@
|
||||
"react-test-renderer": "^16.10.1",
|
||||
"reactifex": "1.1.1",
|
||||
"redux-mock-store": "^1.5.3",
|
||||
"semantic-release": "^17.2.3",
|
||||
"travis-deploy-once": "^5.0.11"
|
||||
"semantic-release": "^17.2.3"
|
||||
}
|
||||
}
|
||||
|
||||
42
src/App.jsx
42
src/App.jsx
@@ -1,36 +1,34 @@
|
||||
import React from 'react';
|
||||
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
import { IntlProvider } from 'react-intl';
|
||||
|
||||
import { AppProvider } from '@edx/frontend-platform/react';
|
||||
|
||||
import Footer from '@edx/frontend-component-footer';
|
||||
import Header from '@edx/frontend-component-header';
|
||||
|
||||
import { routePath } from 'data/constants/app';
|
||||
import store from 'data/store';
|
||||
import GradebookPage from 'containers/GradebookPage';
|
||||
import EdxHeader from 'components/EdxHeader';
|
||||
import './App.scss';
|
||||
|
||||
const App = () => (
|
||||
<IntlProvider locale="en">
|
||||
<Provider store={store}>
|
||||
<Router>
|
||||
<div>
|
||||
<EdxHeader />
|
||||
<main>
|
||||
<Switch>
|
||||
<Route
|
||||
exact
|
||||
path={routePath}
|
||||
component={GradebookPage}
|
||||
/>
|
||||
</Switch>
|
||||
</main>
|
||||
<Footer logo={process.env.LOGO_POWERED_BY_OPEN_EDX_URL_SVG} />
|
||||
</div>
|
||||
</Router>
|
||||
</Provider>
|
||||
</IntlProvider>
|
||||
<AppProvider store={store}>
|
||||
<Router>
|
||||
<div>
|
||||
<Header />
|
||||
<main>
|
||||
<Switch>
|
||||
<Route
|
||||
exact
|
||||
path={routePath}
|
||||
component={GradebookPage}
|
||||
/>
|
||||
</Switch>
|
||||
</main>
|
||||
<Footer logo={process.env.LOGO_POWERED_BY_OPEN_EDX_URL_SVG} />
|
||||
</div>
|
||||
</Router>
|
||||
</AppProvider>
|
||||
);
|
||||
|
||||
export default App;
|
||||
|
||||
@@ -9,6 +9,7 @@ $fa-font-path: "~font-awesome/fonts";
|
||||
|
||||
$input-focus-box-shadow: $input-box-shadow; // hack to get upgrade to paragon 4.0.0 to work
|
||||
|
||||
@import "~@edx/frontend-component-header/dist/index";
|
||||
@import "~@edx/frontend-component-footer/dist/_footer";
|
||||
|
||||
@import "./components/GradesView/GradesView";
|
||||
|
||||
@@ -2,15 +2,14 @@ import React from 'react';
|
||||
import { shallow } from 'enzyme';
|
||||
|
||||
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
import { IntlProvider } from 'react-intl';
|
||||
import { AppProvider } from '@edx/frontend-platform/react';
|
||||
|
||||
import Footer from '@edx/frontend-component-footer';
|
||||
import Header from '@edx/frontend-component-header';
|
||||
|
||||
import { routePath } from 'data/constants/app';
|
||||
import store from 'data/store';
|
||||
import GradebookPage from 'containers/GradebookPage';
|
||||
import EdxHeader from 'components/EdxHeader';
|
||||
|
||||
import App from './App';
|
||||
|
||||
@@ -19,11 +18,8 @@ jest.mock('react-router-dom', () => ({
|
||||
Route: () => 'Route',
|
||||
Switch: () => 'Switch',
|
||||
}));
|
||||
jest.mock('react-redux', () => ({
|
||||
Provider: () => 'Provider',
|
||||
}));
|
||||
jest.mock('react-intl', () => ({
|
||||
IntlProvider: () => 'IntlProvider',
|
||||
jest.mock('@edx/frontend-platform/react', () => ({
|
||||
AppProvider: () => 'AppProvider',
|
||||
}));
|
||||
jest.mock('data/constants/app', () => ({
|
||||
routePath: '/:courseId',
|
||||
@@ -31,7 +27,7 @@ jest.mock('data/constants/app', () => ({
|
||||
jest.mock('@edx/frontend-component-footer', () => 'Footer');
|
||||
jest.mock('data/store', () => 'testStore');
|
||||
jest.mock('containers/GradebookPage', () => 'GradebookPage');
|
||||
jest.mock('components/EdxHeader', () => 'EdxHeader');
|
||||
jest.mock('@edx/frontend-component-header', () => 'Header');
|
||||
|
||||
const logo = 'fakeLogo.png';
|
||||
let el;
|
||||
@@ -45,28 +41,20 @@ describe('App router component', () => {
|
||||
beforeEach(() => {
|
||||
process.env.LOGO_POWERED_BY_OPEN_EDX_URL_SVG = logo;
|
||||
el = shallow(<App />);
|
||||
router = el.childAt(0).childAt(0);
|
||||
router = el.childAt(0);
|
||||
});
|
||||
describe('IntlProvider', () => {
|
||||
test('outer-wrapper component', () => {
|
||||
expect(el.type()).toBe(IntlProvider);
|
||||
});
|
||||
test('"en" locale', () => {
|
||||
expect(el.props().locale).toEqual('en');
|
||||
});
|
||||
});
|
||||
describe('Provider, inside IntlProvider', () => {
|
||||
test('first child, passed the redux store props', () => {
|
||||
expect(el.childAt(0).type()).toBe(Provider);
|
||||
expect(el.childAt(0).props().store).toEqual(store);
|
||||
describe('AppProvider', () => {
|
||||
test('AppProvider is the parent component, passed the redux store props', () => {
|
||||
expect(el.type()).toBe(AppProvider);
|
||||
expect(el.props().store).toEqual(store);
|
||||
});
|
||||
});
|
||||
describe('Router', () => {
|
||||
test('first child of Provider', () => {
|
||||
test('first child of AppProvider', () => {
|
||||
expect(router.type()).toBe(Router);
|
||||
});
|
||||
test('EdxHeader is above/outside-of the routing', () => {
|
||||
expect(router.childAt(0).childAt(0).type()).toBe(EdxHeader);
|
||||
test('Header is above/outside-of the routing', () => {
|
||||
expect(router.childAt(0).childAt(0).type()).toBe(Header);
|
||||
expect(router.childAt(0).childAt(1).type()).toBe('main');
|
||||
});
|
||||
test('Routing - GradebookPage is only route', () => {
|
||||
|
||||
@@ -1,27 +1,23 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`App router component snapshot 1`] = `
|
||||
<IntlProvider
|
||||
locale="en"
|
||||
<AppProvider
|
||||
store="testStore"
|
||||
>
|
||||
<Provider
|
||||
store="testStore"
|
||||
>
|
||||
<BrowserRouter>
|
||||
<div>
|
||||
<EdxHeader />
|
||||
<main>
|
||||
<Switch>
|
||||
<Route
|
||||
component="GradebookPage"
|
||||
exact={true}
|
||||
path="/:courseId"
|
||||
/>
|
||||
</Switch>
|
||||
</main>
|
||||
<Footer />
|
||||
</div>
|
||||
</BrowserRouter>
|
||||
</Provider>
|
||||
</IntlProvider>
|
||||
<BrowserRouter>
|
||||
<div>
|
||||
<Header />
|
||||
<main>
|
||||
<Switch>
|
||||
<Route
|
||||
component="GradebookPage"
|
||||
exact={true}
|
||||
path="/:courseId"
|
||||
/>
|
||||
</Switch>
|
||||
</main>
|
||||
<Footer />
|
||||
</div>
|
||||
</BrowserRouter>
|
||||
</AppProvider>
|
||||
`;
|
||||
|
||||
@@ -31,14 +31,14 @@ exports[`GradebookFilters Component snapshots basic snapshot 1`] = `
|
||||
}
|
||||
>
|
||||
<div>
|
||||
<Connect(AssignmentTypeFilter)
|
||||
updateQueryParams={[MockFunction]}
|
||||
<AssignmentTypeFilter
|
||||
updateQueryParams={[MockFunction this.props.updateQueryParams]}
|
||||
/>
|
||||
<Connect(AssignmentFilter)
|
||||
updateQueryParams={[MockFunction]}
|
||||
<AssignmentFilter
|
||||
updateQueryParams={[MockFunction this.props.updateQueryParams]}
|
||||
/>
|
||||
<Connect(AssignmentGradeFilter)
|
||||
updateQueryParams={[MockFunction]}
|
||||
<AssignmentGradeFilter
|
||||
updateQueryParams={[MockFunction this.props.updateQueryParams]}
|
||||
/>
|
||||
</div>
|
||||
</Collapsible>
|
||||
@@ -53,8 +53,8 @@ exports[`GradebookFilters Component snapshots basic snapshot 1`] = `
|
||||
/>
|
||||
}
|
||||
>
|
||||
<Connect(CourseGradeFilter)
|
||||
updateQueryParams={[MockFunction]}
|
||||
<CourseGradeFilter
|
||||
updateQueryParams={[MockFunction this.props.updateQueryParams]}
|
||||
/>
|
||||
</Collapsible>
|
||||
<Collapsible
|
||||
@@ -68,8 +68,8 @@ exports[`GradebookFilters Component snapshots basic snapshot 1`] = `
|
||||
/>
|
||||
}
|
||||
>
|
||||
<InjectIntl(ShimmedIntlComponent)
|
||||
updateQueryParams={[MockFunction]}
|
||||
<StudentGroupsFilter
|
||||
updateQueryParams={[MockFunction this.props.updateQueryParams]}
|
||||
/>
|
||||
</Collapsible>
|
||||
<Collapsible
|
||||
|
||||
@@ -22,6 +22,11 @@ jest.mock('@edx/paragon', () => ({
|
||||
jest.mock('@edx/paragon/icons', () => ({
|
||||
Close: 'paragon.icons.Close',
|
||||
}));
|
||||
jest.mock('./AssignmentTypeFilter', () => 'AssignmentTypeFilter');
|
||||
jest.mock('./AssignmentFilter', () => 'AssignmentFilter');
|
||||
jest.mock('./AssignmentGradeFilter', () => 'AssignmentGradeFilter');
|
||||
jest.mock('./CourseGradeFilter', () => 'CourseGradeFilter');
|
||||
jest.mock('./StudentGroupsFilter', () => 'StudentGroupsFilter');
|
||||
jest.mock('data/selectors', () => ({
|
||||
__esModule: true,
|
||||
default: {
|
||||
@@ -50,7 +55,7 @@ describe('GradebookFilters', () => {
|
||||
closeMenu: jest.fn().mockName('this.props.closeMenu'),
|
||||
fetchGrades: jest.fn(),
|
||||
updateIncludeCourseRoleMembers: jest.fn(),
|
||||
updateQueryParams: jest.fn(),
|
||||
updateQueryParams: jest.fn().mockName('this.props.updateQueryParams'),
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ const messages = defineMessages({
|
||||
downloadGradesBtn: {
|
||||
id: 'gradebook.GradesView.BulkManagementControls.bulkManagementLabel',
|
||||
defaultMessage: 'Download Grades',
|
||||
description: 'Button text for bulk grades download control in GradesView',
|
||||
description: 'A labeled button that allows an admin user to download course grades all at once (in bulk).',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ const messages = defineMessages({
|
||||
editFilters: {
|
||||
id: 'gradebook.GradesView.editFilterLabel',
|
||||
defaultMessage: 'Edit Filters',
|
||||
description: 'Button text on Grades tab to open/close the Filters tab',
|
||||
description: 'A labeled button in the Grades tab that opens/closes the Filters tab, allowing the grades to be filtered',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
OverlayTrigger,
|
||||
Tooltip,
|
||||
} from '@edx/paragon';
|
||||
import { FormattedMessage } from '@edx/frontend-platform/i18n';
|
||||
import { FormattedMessage, getLocale, isRtl } from '@edx/frontend-platform/i18n';
|
||||
|
||||
import messages from './messages';
|
||||
|
||||
@@ -23,7 +23,7 @@ const TotalGradeLabelReplacement = () => (
|
||||
<OverlayTrigger
|
||||
trigger={['hover', 'focus']}
|
||||
key="left-basic"
|
||||
placement="left"
|
||||
placement={isRtl(getLocale()) ? 'right' : 'left'}
|
||||
overlay={(
|
||||
<Tooltip id="course-grade-tooltip">
|
||||
<FormattedMessage {...messages.totalGradePercentage} />
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import React from 'react';
|
||||
import { shallow } from 'enzyme';
|
||||
import { getLocale } from '@edx/frontend-platform/i18n';
|
||||
|
||||
import { OverlayTrigger } from '@edx/paragon';
|
||||
|
||||
@@ -35,3 +36,17 @@ describe('LabelReplacements', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('snapshot', () => {
|
||||
let el;
|
||||
test('right to left overlay placement', () => {
|
||||
getLocale.mockImplementation(() => 'en');
|
||||
el = shallow(<TotalGradeLabelReplacement />);
|
||||
expect(el).toMatchSnapshot();
|
||||
});
|
||||
test('left to right overlay placement', () => {
|
||||
getLocale.mockImplementation(() => 'ar');
|
||||
el = shallow(<TotalGradeLabelReplacement />);
|
||||
expect(el).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -80,3 +80,99 @@ exports[`LabelReplacements UsernameLabelReplacement snapshot 1`] = `
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`snapshot left to right overlay placement 1`] = `
|
||||
<div>
|
||||
<OverlayTrigger
|
||||
key="left-basic"
|
||||
overlay={
|
||||
<Tooltip
|
||||
id="course-grade-tooltip"
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Total Grade values are always displayed as a percentage"
|
||||
description="Gradebook table message that total grades are displayed in percent format"
|
||||
id="gradebook.GradesView.table.totalGradePercentage"
|
||||
/>
|
||||
</Tooltip>
|
||||
}
|
||||
placement="right"
|
||||
trigger={
|
||||
Array [
|
||||
"hover",
|
||||
"focus",
|
||||
]
|
||||
}
|
||||
>
|
||||
<div>
|
||||
<FormattedMessage
|
||||
defaultMessage="Total Grade (%)"
|
||||
description="Gradebook table total grade column header"
|
||||
id="gradebook.GradesView.table.headings.totalGrade"
|
||||
/>
|
||||
<div
|
||||
id="courseGradeTooltipIcon"
|
||||
>
|
||||
<Icon
|
||||
className="fa fa-info-circle"
|
||||
screenReaderText={
|
||||
<FormattedMessage
|
||||
defaultMessage="Total Grade values are always displayed as a percentage"
|
||||
description="Gradebook table message that total grades are displayed in percent format"
|
||||
id="gradebook.GradesView.table.totalGradePercentage"
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</OverlayTrigger>
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`snapshot right to left overlay placement 1`] = `
|
||||
<div>
|
||||
<OverlayTrigger
|
||||
key="left-basic"
|
||||
overlay={
|
||||
<Tooltip
|
||||
id="course-grade-tooltip"
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Total Grade values are always displayed as a percentage"
|
||||
description="Gradebook table message that total grades are displayed in percent format"
|
||||
id="gradebook.GradesView.table.totalGradePercentage"
|
||||
/>
|
||||
</Tooltip>
|
||||
}
|
||||
placement="left"
|
||||
trigger={
|
||||
Array [
|
||||
"hover",
|
||||
"focus",
|
||||
]
|
||||
}
|
||||
>
|
||||
<div>
|
||||
<FormattedMessage
|
||||
defaultMessage="Total Grade (%)"
|
||||
description="Gradebook table total grade column header"
|
||||
id="gradebook.GradesView.table.headings.totalGrade"
|
||||
/>
|
||||
<div
|
||||
id="courseGradeTooltipIcon"
|
||||
>
|
||||
<Icon
|
||||
className="fa fa-info-circle"
|
||||
screenReaderText={
|
||||
<FormattedMessage
|
||||
defaultMessage="Total Grade values are always displayed as a percentage"
|
||||
description="Gradebook table message that total grades are displayed in percent format"
|
||||
id="gradebook.GradesView.table.totalGradePercentage"
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</OverlayTrigger>
|
||||
</div>
|
||||
`;
|
||||
|
||||
@@ -207,3 +207,13 @@
|
||||
select#ScoreView.form-control {
|
||||
padding-right: 26px;
|
||||
}
|
||||
|
||||
[dir=rtl] #course-grade-tooltip .arrow {
|
||||
right: initial;
|
||||
left: 0;
|
||||
|
||||
&:before {
|
||||
border-width: 0.4rem 0.4rem 0.4rem 0;
|
||||
border-right-color: $black;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@ const messages = defineMessages({
|
||||
csvUploadLabel: {
|
||||
id: 'gradebook.BulkManagementHistoryView.csvUploadLabel',
|
||||
defaultMessage: 'Upload Grade CSV',
|
||||
description: 'Button in BulkManagementHistoryView Alerts',
|
||||
description: 'A labeled button to upload a CSV containing course grades.',
|
||||
},
|
||||
importGradesBtnText: {
|
||||
id: 'gradebook.GradesView.importGradesBtnText',
|
||||
defaultMessage: 'Import Grades',
|
||||
description: 'Button in BulkManagement Tab File Upload Form',
|
||||
description: 'A labeled button to import grades in the BulkManagement Tab File Upload Form',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,12 +4,12 @@ const messages = defineMessages({
|
||||
description: {
|
||||
id: 'gradebook.GradesView.ImportSuccessToast.description',
|
||||
defaultMessage: 'Import Successful! Grades will be updated momentarily.',
|
||||
description: 'Import Success Toast description',
|
||||
description: 'A message congratulating a successful Import of grades',
|
||||
},
|
||||
showHistoryViewBtn: {
|
||||
id: 'gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn',
|
||||
defaultMessage: 'View Activity Log',
|
||||
description: 'Button text for action that loads Bulk Management Activity Log view',
|
||||
description: 'The text on a button that loads a view of the Bulk Management Activity Log',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,17 +4,17 @@ const messages = defineMessages({
|
||||
title: {
|
||||
id: 'gradebook.GradesView.InterventionsReport.title',
|
||||
defaultMessage: 'Interventions Report',
|
||||
description: 'Intervention report subsection label',
|
||||
description: 'The title for the Intervention report subsection',
|
||||
},
|
||||
description: {
|
||||
id: 'gradebook.GradesView.InterventionsReport.description',
|
||||
defaultMessage: 'Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits.',
|
||||
description: 'Intervention report subsection description',
|
||||
description: 'The description for the Intervention report subsection',
|
||||
},
|
||||
downloadBtn: {
|
||||
id: 'gradebook.GradesView.InterventionsReport.downloadBtn',
|
||||
defaultMessage: 'Download Interventions',
|
||||
description: 'Button text for intervention report download control in GradesView',
|
||||
description: 'The labeled button to download the Intervention report from the Grades View',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,17 +4,17 @@ const messages = defineMessages({
|
||||
scoreView: {
|
||||
id: 'gradebook.GradesView.scoreViewLabel',
|
||||
defaultMessage: 'Score View',
|
||||
description: 'Score format select dropdown label',
|
||||
description: 'The label for the dropdown list that allows a user to select the Score format',
|
||||
},
|
||||
absolute: {
|
||||
id: 'gradebook.GradesView.absoluteOption',
|
||||
defaultMessage: 'Absolute',
|
||||
description: 'Score format select dropdown option',
|
||||
description: 'A label within the Score Format dropdown list for the Absolute Grade Score option',
|
||||
},
|
||||
percent: {
|
||||
id: 'gradebook.GradesView.percentOption',
|
||||
defaultMessage: 'Percent',
|
||||
description: 'Score format select dropdown option',
|
||||
description: 'A label within the Score Format dropdown list for the Percent Grade Score option',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,12 +4,12 @@ const messages = defineMessages({
|
||||
label: {
|
||||
id: 'gradebook.GradesView.search.label',
|
||||
defaultMessage: 'Search for a learner',
|
||||
description: 'Search description label',
|
||||
description: 'Text prompting a user to use this functionality to search for a learner',
|
||||
},
|
||||
hint: {
|
||||
id: 'gradebook.GradesView.search.hint',
|
||||
defaultMessage: 'Search by username, email, or student key',
|
||||
description: 'Search hint label',
|
||||
description: 'A hint explaining the ways a user can search',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,17 +4,17 @@ const messages = defineMessages({
|
||||
editSuccessAlert: {
|
||||
id: 'gradebook.GradesView.editSuccessAlert',
|
||||
defaultMessage: 'The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook.',
|
||||
description: 'Alert text for successful edit action',
|
||||
description: 'An alert text for successfully editing a grade',
|
||||
},
|
||||
maxGradeInvalid: {
|
||||
id: 'gradebook.GradesView.maxCourseGradeInvalid',
|
||||
defaultMessage: 'Maximum course grade must be between 0 and 100',
|
||||
description: 'Alert text for invalid maximum course grade',
|
||||
description: 'An alert text for selecting a maximum course grade greater than 100',
|
||||
},
|
||||
minGradeInvalid: {
|
||||
id: 'gradebook.GradesView.minCourseGradeInvalid',
|
||||
defaultMessage: 'Minimum course grade must be between 0 and 100',
|
||||
description: 'Alert text for invalid minimum course grade',
|
||||
description: 'An alert text for selecting a minimum course grade less than 0',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ exports[`FilterMenuToggle component snapshots basic snapshot 1`] = `
|
||||
|
||||
<FormattedMessage
|
||||
defaultMessage="Edit Filters"
|
||||
description="Button text on Grades tab to open/close the Filters tab"
|
||||
description="A labeled button in the Grades tab that opens/closes the Filters tab, allowing the grades to be filtered"
|
||||
id="gradebook.GradesView.editFilterLabel"
|
||||
/>
|
||||
</Button>
|
||||
|
||||
@@ -19,7 +19,7 @@ exports[`ImportGradesButton component snapshot snapshot - loads export form w/ a
|
||||
label={
|
||||
<FormattedMessage
|
||||
defaultMessage="Upload Grade CSV"
|
||||
description="Button in BulkManagementHistoryView Alerts"
|
||||
description="A labeled button to upload a CSV containing course grades."
|
||||
id="gradebook.BulkManagementHistoryView.csvUploadLabel"
|
||||
/>
|
||||
}
|
||||
@@ -35,7 +35,7 @@ exports[`ImportGradesButton component snapshot snapshot - loads export form w/ a
|
||||
label={
|
||||
Object {
|
||||
"defaultMessage": "Import Grades",
|
||||
"description": "Button in BulkManagement Tab File Upload Form",
|
||||
"description": "A labeled button to import grades in the BulkManagement Tab File Upload Form",
|
||||
"id": "gradebook.GradesView.importGradesBtnText",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ exports[`InterventionsReport component snapshots snapshot 1`] = `
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Interventions Report"
|
||||
description="Intervention report subsection label"
|
||||
description="The title for the Intervention report subsection"
|
||||
id="gradebook.GradesView.InterventionsReport.title"
|
||||
/>
|
||||
</h4>
|
||||
@@ -19,7 +19,7 @@ exports[`InterventionsReport component snapshots snapshot 1`] = `
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits."
|
||||
description="Intervention report subsection description"
|
||||
description="The description for the Intervention report subsection"
|
||||
id="gradebook.GradesView.InterventionsReport.description"
|
||||
/>
|
||||
</div>
|
||||
@@ -27,7 +27,7 @@ exports[`InterventionsReport component snapshots snapshot 1`] = `
|
||||
label={
|
||||
Object {
|
||||
"defaultMessage": "Download Interventions",
|
||||
"description": "Button text for intervention report download control in GradesView",
|
||||
"description": "The labeled button to download the Intervention report from the Grades View",
|
||||
"id": "gradebook.GradesView.InterventionsReport.downloadBtn",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ exports[`ScoreViewInput component snapshot - select box with percent and absolut
|
||||
<FormLabel>
|
||||
<FormattedMessage
|
||||
defaultMessage="Score View"
|
||||
description="Score format select dropdown label"
|
||||
description="The label for the dropdown list that allows a user to select the Score format"
|
||||
id="gradebook.GradesView.scoreViewLabel"
|
||||
/>
|
||||
:
|
||||
|
||||
@@ -6,7 +6,7 @@ exports[`SearchControls Component Snapshots basic snapshot 1`] = `
|
||||
inputLabel={
|
||||
<FormattedMessage
|
||||
defaultMessage="Search for a learner"
|
||||
description="Search description label"
|
||||
description="Text prompting a user to use this functionality to search for a learner"
|
||||
id="gradebook.GradesView.search.label"
|
||||
/>
|
||||
}
|
||||
@@ -20,7 +20,7 @@ exports[`SearchControls Component Snapshots basic snapshot 1`] = `
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Search by username, email, or student key"
|
||||
description="Search hint label"
|
||||
description="A hint explaining the ways a user can search"
|
||||
id="gradebook.GradesView.search.hint"
|
||||
/>
|
||||
</small>
|
||||
|
||||
@@ -7,7 +7,7 @@ exports[`StatusAlerts snapshots basic snapshot 1`] = `
|
||||
dialog={
|
||||
<FormattedMessage
|
||||
defaultMessage="The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook."
|
||||
description="Alert text for successful edit action"
|
||||
description="An alert text for successfully editing a grade"
|
||||
id="gradebook.GradesView.editSuccessAlert"
|
||||
/>
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
exports[`WithSidebar Component snapshots basic snapshot 1`] = `
|
||||
<div
|
||||
className="d-flex sidebar-container"
|
||||
className="d-flex sidebar-container page-gradebook"
|
||||
>
|
||||
<aside
|
||||
className="sidebar-class-names"
|
||||
|
||||
@@ -32,7 +32,7 @@ export class WithSidebar extends React.Component {
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className="d-flex sidebar-container">
|
||||
<div className="d-flex sidebar-container page-gradebook">
|
||||
<aside className={this.sidebarClassNames} onTransitionEnd={this.props.handleSlideDone}>
|
||||
{ this.props.sidebar }
|
||||
</aside>
|
||||
|
||||
@@ -4,37 +4,37 @@ const messages = defineMessages({
|
||||
assignment: {
|
||||
id: 'gradebook.GradesTab.FilterBadges.assignment',
|
||||
defaultMessage: 'Assignment',
|
||||
description: 'Assignment FilterBadge label',
|
||||
description: 'A label describing the notification under the "Edit Filters" button that shows by which of the course\'s assignments the view is being filtered.',
|
||||
},
|
||||
assignmentGrade: {
|
||||
id: 'gradebook.GradesTab.FilterBadges.assignmentGrade',
|
||||
defaultMessage: 'Assignment Grade',
|
||||
description: 'Assignment Grade FilterBadge label',
|
||||
description: 'A label describing the notification under the "Edit Filters" button that shows that the view is being filtered to include assignment grades within the alloted range.',
|
||||
},
|
||||
assignmentType: {
|
||||
id: 'gradebook.GradesTab.FilterBadges.assignmentType',
|
||||
defaultMessage: 'Assignment Type',
|
||||
description: 'Assignment Type FilterBadge label',
|
||||
description: 'A label describing the notification under the "Edit Filters" button that shows by which of the course\'s assignment types the view is being filtered.',
|
||||
},
|
||||
cohort: {
|
||||
id: 'gradebook.GradesTab.FilterBadges.cohort',
|
||||
defaultMessage: 'Cohort',
|
||||
description: 'Cohort FilterBadge label',
|
||||
description: 'A label describing the notification under the "Edit Filters" button that shows by which of the course\'s cohorts the view is being filtered.',
|
||||
},
|
||||
courseGrade: {
|
||||
id: 'gradebook.GradesTab.FilterBadges.courseGrade',
|
||||
defaultMessage: 'Course Grade',
|
||||
description: 'Course Grade FilterBadge label',
|
||||
description: 'A label describing the notification under the "Edit Filters" button that shows that the view is being filtered to include course grades within the alloted range.',
|
||||
},
|
||||
includeCourseRoleMembers: {
|
||||
id: 'gradebook.GradesTab.FilterBadges.includeCourseRoleMembers',
|
||||
defaultMessage: 'Include Course Team Members',
|
||||
description: 'Include Course Team Members FilterBadge label',
|
||||
description: 'A label describing the notification under the "Edit Filters" button that shows that the view is being filtered to include course team members.',
|
||||
},
|
||||
track: {
|
||||
id: 'gradebook.GradesTab.FilterBadges.track',
|
||||
defaultMessage: 'Track',
|
||||
description: 'Track FilterBadge label',
|
||||
description: 'A label describing the notification under the "Edit Filters" button that shows by which of the course\'s tracks the view is being filtered.',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import { filterQuery, stringifyUrl } from './utils';
|
||||
|
||||
const baseUrl = `${configuration.LMS_BASE_URL}`;
|
||||
|
||||
const courseId = window.location.pathname.slice(1);
|
||||
const courseId = window.location.pathname.split('/').filter(Boolean).pop() || '';
|
||||
|
||||
const api = `${baseUrl}/api/`;
|
||||
const bulkGrades = `${api}bulk_grades/course/${courseId}/`;
|
||||
|
||||
@@ -1,2 +1,73 @@
|
||||
{
|
||||
}
|
||||
"gradebook.BulkManagementHistoryView.heading": "Bulk Management History",
|
||||
"gradebook.BulkManagementHistoryView": "Below is a log of previous grade imports. To download a CSV of your gradebook and import grades for override, return to the Gradebook. Please note, after importing grades, it may take a few seconds to process the override.",
|
||||
"gradebook.BulkManagementHistoryView.successDialog": "CSV processing. File uploads may take several minutes to complete.",
|
||||
"gradebook.GradebookFilters.assignmentsFilterLabel": "Assignments",
|
||||
"gradebook.GradebookFilters.overallGradeFilterLabel": "Overall Grade",
|
||||
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Student Groups",
|
||||
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Include Course Team Members",
|
||||
"gradebook.GradebookFilters.assignmentFilterLabel": "Assignment",
|
||||
"gradebook.GradebookFilters.assignmentTypesLabel": "Assignment Types",
|
||||
"gradebook.GradebookFilters.maxGradeFilterLabel": "Max Grade",
|
||||
"gradebook.GradebookFilters.minGradeFilterLabel": "Min Grade",
|
||||
"gradebook.GradebookFilters.cohorts": "Cohorts",
|
||||
"gradebook.GradebookFilters.cohortsAll": "Cohort-All",
|
||||
"gradebook.GradebookFilters.tracks": "Tracks",
|
||||
"gradebook.GradebookFilters.trackAll": "Track-All",
|
||||
"gradebook.GradebookFilters.closeFilters": "Close Filters",
|
||||
"gradebook.GradebookHeader.backButton": "Back to Dashboard",
|
||||
"gradebook.GradebookHeader.appLabel": "Gradebook",
|
||||
"gradebook.GradebookHeader.frozenWarning": "The grades for this course are now frozen. Editing of grades is no longer allowed.",
|
||||
"gradebook.GradebookHeader.unauthorizedWarning": "You are not authorized to view the gradebook for this course.",
|
||||
"gradebook.GradebookHeader.toActivityLogButton": "View Bulk Management History",
|
||||
"gradebook.GradebookHeader.toGradesView": "Return to Gradebook",
|
||||
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Download Grades",
|
||||
"gradebook.GradesView.EditModal.headers.assignment": "Assignment",
|
||||
"gradebook.GradesView.EditModal.headers.currentGrade": "Current Grade",
|
||||
"gradebook.GradesView.EditModal.headers.originalGrade": "Original Grade",
|
||||
"gradebook.GradesView.EditModal.headers.student": "Student",
|
||||
"gradebook.GradesView.EditModal.title": "Edit Grades",
|
||||
"gradebook.GradesView.EditModal.closeText": "Cancel",
|
||||
"gradebook.GradesView.EditModal.contactSupport": "Showing most recent actions (max 5). To see more, please contact support",
|
||||
"gradebook.GradesView.EditModal.saveVisibility": "Note: Once you save, your changes will be visible to students.",
|
||||
"gradebook.GradesView.EditModal.saveGrade": "Save Grades",
|
||||
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Adjusted grade",
|
||||
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
|
||||
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Grader",
|
||||
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Reason",
|
||||
"gradebook.GradesTab.usersVisibilityLabel'": "Showing {filteredUsers} of {totalUsers} total learners",
|
||||
"gradebook.GradesView.editFilterLabel": "Edit Filters",
|
||||
"gradebook.GradesView.table.headings.email": "Email",
|
||||
"gradebook.GradesView.table.headings.totalGrade": "Total Grade (%)",
|
||||
"gradebook.GradesView.table.headings.username": "Username",
|
||||
"gradebook.GradesView.table.labels.studentKey": "Student Key*",
|
||||
"gradebook.GradesView.table.labels.username": "Username",
|
||||
"gradebook.GradesView.table.totalGradePercentage": "Total Grade values are always displayed as a percentage",
|
||||
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Upload Grade CSV",
|
||||
"gradebook.GradesView.importGradesBtnText": "Import Grades",
|
||||
"gradebook.GradesView.ImportSuccessToast.description": "Import Successful! Grades will be updated momentarily.",
|
||||
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "View Activity Log",
|
||||
"gradebook.GradesView.InterventionsReport.title": "Interventions Report",
|
||||
"gradebook.GradesView.InterventionsReport.description": "Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits.",
|
||||
"gradebook.GradesView.InterventionsReport.downloadBtn": "Download Interventions",
|
||||
"gradebook.GradesView.filterHeading": "Step 1: Filter the Grade Report",
|
||||
"gradebook.GradesView.gradebookStepHeading": "Step 2: View or Modify Individual Grades",
|
||||
"gradebook.GradesView.mastersHint": "available for learners in the Master's track only",
|
||||
"gradebook.GradesView.PageButtons.prevPage": "Previous Page",
|
||||
"gradebook.GradesView.PageButtons.nextPage": "Next Page",
|
||||
"gradebook.GradesView.scoreViewLabel": "Score View",
|
||||
"gradebook.GradesView.absoluteOption": "Absolute",
|
||||
"gradebook.GradesView.percentOption": "Percent",
|
||||
"gradebook.GradesView.search.label": "Search for a learner",
|
||||
"gradebook.GradesView.search.hint": "Search by username, email, or student key",
|
||||
"gradebook.GradesView.editSuccessAlert": "The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook.",
|
||||
"gradebook.GradesView.maxCourseGradeInvalid": "Maximum course grade must be between 0 and 100",
|
||||
"gradebook.GradesView.minCourseGradeInvalid": "Minimum course grade must be between 0 and 100",
|
||||
"gradebook.GradesTab.FilterBadges.assignment": "Assignment",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Assignment Grade",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentType": "Assignment Type",
|
||||
"gradebook.GradesTab.FilterBadges.cohort": "Cohort",
|
||||
"gradebook.GradesTab.FilterBadges.courseGrade": "Course Grade",
|
||||
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Include Course Team Members",
|
||||
"gradebook.GradesTab.FilterBadges.track": "Track"
|
||||
}
|
||||
@@ -1,2 +1,73 @@
|
||||
{
|
||||
}
|
||||
"gradebook.BulkManagementHistoryView.heading": "Bulk Management History",
|
||||
"gradebook.BulkManagementHistoryView": "Below is a log of previous grade imports. To download a CSV of your gradebook and import grades for override, return to the Gradebook. Please note, after importing grades, it may take a few seconds to process the override.",
|
||||
"gradebook.BulkManagementHistoryView.successDialog": "CSV processing. File uploads may take several minutes to complete.",
|
||||
"gradebook.GradebookFilters.assignmentsFilterLabel": "Assignments",
|
||||
"gradebook.GradebookFilters.overallGradeFilterLabel": "Overall Grade",
|
||||
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Student Groups",
|
||||
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Include Course Team Members",
|
||||
"gradebook.GradebookFilters.assignmentFilterLabel": "Assignment",
|
||||
"gradebook.GradebookFilters.assignmentTypesLabel": "Assignment Types",
|
||||
"gradebook.GradebookFilters.maxGradeFilterLabel": "Max Grade",
|
||||
"gradebook.GradebookFilters.minGradeFilterLabel": "Min Grade",
|
||||
"gradebook.GradebookFilters.cohorts": "Cohorts",
|
||||
"gradebook.GradebookFilters.cohortsAll": "Cohort-All",
|
||||
"gradebook.GradebookFilters.tracks": "Tracks",
|
||||
"gradebook.GradebookFilters.trackAll": "Track-All",
|
||||
"gradebook.GradebookFilters.closeFilters": "Close Filters",
|
||||
"gradebook.GradebookHeader.backButton": "Back to Dashboard",
|
||||
"gradebook.GradebookHeader.appLabel": "Gradebook",
|
||||
"gradebook.GradebookHeader.frozenWarning": "The grades for this course are now frozen. Editing of grades is no longer allowed.",
|
||||
"gradebook.GradebookHeader.unauthorizedWarning": "You are not authorized to view the gradebook for this course.",
|
||||
"gradebook.GradebookHeader.toActivityLogButton": "View Bulk Management History",
|
||||
"gradebook.GradebookHeader.toGradesView": "Return to Gradebook",
|
||||
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Download Grades",
|
||||
"gradebook.GradesView.EditModal.headers.assignment": "Assignment",
|
||||
"gradebook.GradesView.EditModal.headers.currentGrade": "Current Grade",
|
||||
"gradebook.GradesView.EditModal.headers.originalGrade": "Original Grade",
|
||||
"gradebook.GradesView.EditModal.headers.student": "Student",
|
||||
"gradebook.GradesView.EditModal.title": "Edit Grades",
|
||||
"gradebook.GradesView.EditModal.closeText": "Cancel",
|
||||
"gradebook.GradesView.EditModal.contactSupport": "Showing most recent actions (max 5). To see more, please contact support",
|
||||
"gradebook.GradesView.EditModal.saveVisibility": "Note: Once you save, your changes will be visible to students.",
|
||||
"gradebook.GradesView.EditModal.saveGrade": "Save Grades",
|
||||
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Adjusted grade",
|
||||
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
|
||||
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Grader",
|
||||
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Reason",
|
||||
"gradebook.GradesTab.usersVisibilityLabel'": "Showing {filteredUsers} of {totalUsers} total learners",
|
||||
"gradebook.GradesView.editFilterLabel": "Edit Filters",
|
||||
"gradebook.GradesView.table.headings.email": "Email",
|
||||
"gradebook.GradesView.table.headings.totalGrade": "Total Grade (%)",
|
||||
"gradebook.GradesView.table.headings.username": "Username",
|
||||
"gradebook.GradesView.table.labels.studentKey": "Student Key*",
|
||||
"gradebook.GradesView.table.labels.username": "Username",
|
||||
"gradebook.GradesView.table.totalGradePercentage": "Total Grade values are always displayed as a percentage",
|
||||
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Upload Grade CSV",
|
||||
"gradebook.GradesView.importGradesBtnText": "Import Grades",
|
||||
"gradebook.GradesView.ImportSuccessToast.description": "Import Successful! Grades will be updated momentarily.",
|
||||
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "View Activity Log",
|
||||
"gradebook.GradesView.InterventionsReport.title": "Interventions Report",
|
||||
"gradebook.GradesView.InterventionsReport.description": "Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits.",
|
||||
"gradebook.GradesView.InterventionsReport.downloadBtn": "Download Interventions",
|
||||
"gradebook.GradesView.filterHeading": "Step 1: Filter the Grade Report",
|
||||
"gradebook.GradesView.gradebookStepHeading": "Step 2: View or Modify Individual Grades",
|
||||
"gradebook.GradesView.mastersHint": "available for learners in the Master's track only",
|
||||
"gradebook.GradesView.PageButtons.prevPage": "Previous Page",
|
||||
"gradebook.GradesView.PageButtons.nextPage": "Next Page",
|
||||
"gradebook.GradesView.scoreViewLabel": "Score View",
|
||||
"gradebook.GradesView.absoluteOption": "Absolute",
|
||||
"gradebook.GradesView.percentOption": "Percent",
|
||||
"gradebook.GradesView.search.label": "Search for a learner",
|
||||
"gradebook.GradesView.search.hint": "Search by username, email, or student key",
|
||||
"gradebook.GradesView.editSuccessAlert": "The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook.",
|
||||
"gradebook.GradesView.maxCourseGradeInvalid": "Maximum course grade must be between 0 and 100",
|
||||
"gradebook.GradesView.minCourseGradeInvalid": "Minimum course grade must be between 0 and 100",
|
||||
"gradebook.GradesTab.FilterBadges.assignment": "Assignment",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Assignment Grade",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentType": "Assignment Type",
|
||||
"gradebook.GradesTab.FilterBadges.cohort": "Cohort",
|
||||
"gradebook.GradesTab.FilterBadges.courseGrade": "Course Grade",
|
||||
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Include Course Team Members",
|
||||
"gradebook.GradesTab.FilterBadges.track": "Track"
|
||||
}
|
||||
@@ -1,2 +1,73 @@
|
||||
{
|
||||
}
|
||||
"gradebook.BulkManagementHistoryView.heading": "Bulk Management History",
|
||||
"gradebook.BulkManagementHistoryView": "Below is a log of previous grade imports. To download a CSV of your gradebook and import grades for override, return to the Gradebook. Please note, after importing grades, it may take a few seconds to process the override.",
|
||||
"gradebook.BulkManagementHistoryView.successDialog": "CSV processing. File uploads may take several minutes to complete.",
|
||||
"gradebook.GradebookFilters.assignmentsFilterLabel": "Devoirs",
|
||||
"gradebook.GradebookFilters.overallGradeFilterLabel": "Note globale",
|
||||
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Groupe d'étudiants",
|
||||
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Include Course Team Members",
|
||||
"gradebook.GradebookFilters.assignmentFilterLabel": "Devoir",
|
||||
"gradebook.GradebookFilters.assignmentTypesLabel": "Types de travaux",
|
||||
"gradebook.GradebookFilters.maxGradeFilterLabel": "Note Maximale",
|
||||
"gradebook.GradebookFilters.minGradeFilterLabel": "Note Minimale",
|
||||
"gradebook.GradebookFilters.cohorts": "Cohortes",
|
||||
"gradebook.GradebookFilters.cohortsAll": "Cohort-All",
|
||||
"gradebook.GradebookFilters.tracks": "Tracks",
|
||||
"gradebook.GradebookFilters.trackAll": "Track-All",
|
||||
"gradebook.GradebookFilters.closeFilters": "Fermer les filtres",
|
||||
"gradebook.GradebookHeader.backButton": "Retour au tableau de bord",
|
||||
"gradebook.GradebookHeader.appLabel": "Bulletin de notes",
|
||||
"gradebook.GradebookHeader.frozenWarning": "The grades for this course are now frozen. Editing of grades is no longer allowed.",
|
||||
"gradebook.GradebookHeader.unauthorizedWarning": "Vous n'êtes pas autorisé à voir le livret de notes pour ce cours",
|
||||
"gradebook.GradebookHeader.toActivityLogButton": "View Bulk Management History",
|
||||
"gradebook.GradebookHeader.toGradesView": "Return to Gradebook",
|
||||
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Télécharger les notes",
|
||||
"gradebook.GradesView.EditModal.headers.assignment": "Devoir",
|
||||
"gradebook.GradesView.EditModal.headers.currentGrade": "Note actuelle",
|
||||
"gradebook.GradesView.EditModal.headers.originalGrade": "Note initiale",
|
||||
"gradebook.GradesView.EditModal.headers.student": "Étudiant",
|
||||
"gradebook.GradesView.EditModal.title": "Editez les notes",
|
||||
"gradebook.GradesView.EditModal.closeText": "Annuler",
|
||||
"gradebook.GradesView.EditModal.contactSupport": "Showing most recent actions (max 5). To see more, please contact support",
|
||||
"gradebook.GradesView.EditModal.saveVisibility": "Note: Once you save, your changes will be visible to students.",
|
||||
"gradebook.GradesView.EditModal.saveGrade": "Sauvegarder les notes",
|
||||
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Note ajustée",
|
||||
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
|
||||
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Correcteur",
|
||||
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Motif",
|
||||
"gradebook.GradesTab.usersVisibilityLabel'": "Showing {filteredUsers} of {totalUsers} total learners",
|
||||
"gradebook.GradesView.editFilterLabel": "Editer les filtres",
|
||||
"gradebook.GradesView.table.headings.email": "Email",
|
||||
"gradebook.GradesView.table.headings.totalGrade": "Note totale (%)",
|
||||
"gradebook.GradesView.table.headings.username": "Nom d’utilisateur",
|
||||
"gradebook.GradesView.table.labels.studentKey": "Clé d'étudiant",
|
||||
"gradebook.GradesView.table.labels.username": "Nom d’utilisateur",
|
||||
"gradebook.GradesView.table.totalGradePercentage": "La note totale est toujours affiché en pourcentage",
|
||||
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Importer les notes CSV",
|
||||
"gradebook.GradesView.importGradesBtnText": "Importer les notes",
|
||||
"gradebook.GradesView.ImportSuccessToast.description": "Import réussi ! Les notes vont être mises à jour.",
|
||||
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "Voir le rapport d'activité",
|
||||
"gradebook.GradesView.InterventionsReport.title": "Rapport d'interventions",
|
||||
"gradebook.GradesView.InterventionsReport.description": "Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits.",
|
||||
"gradebook.GradesView.InterventionsReport.downloadBtn": "Télécharger les interventions",
|
||||
"gradebook.GradesView.filterHeading": "Étape 1 : Filtrer le rapport de notes",
|
||||
"gradebook.GradesView.gradebookStepHeading": "Step 2: View or Modify Individual Grades",
|
||||
"gradebook.GradesView.mastersHint": "available for learners in the Master's track only",
|
||||
"gradebook.GradesView.PageButtons.prevPage": "Page précédente",
|
||||
"gradebook.GradesView.PageButtons.nextPage": "Page suivante",
|
||||
"gradebook.GradesView.scoreViewLabel": "Vue des notes",
|
||||
"gradebook.GradesView.absoluteOption": "Absolu",
|
||||
"gradebook.GradesView.percentOption": "Pourcentage",
|
||||
"gradebook.GradesView.search.label": "Rechercher un apprenant",
|
||||
"gradebook.GradesView.search.hint": "Chercher par nom d'utilisateur, email ou clé d'étudiant",
|
||||
"gradebook.GradesView.editSuccessAlert": "The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook.",
|
||||
"gradebook.GradesView.maxCourseGradeInvalid": "La note maximale du cours doit être entre 0 et 100",
|
||||
"gradebook.GradesView.minCourseGradeInvalid": "La note minimale du cours doit être entre 0 et 100",
|
||||
"gradebook.GradesTab.FilterBadges.assignment": "Devoir",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Note des devoirs",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentType": "Type de travail",
|
||||
"gradebook.GradesTab.FilterBadges.cohort": "Cohorte",
|
||||
"gradebook.GradesTab.FilterBadges.courseGrade": "Note du cours",
|
||||
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Include Course Team Members",
|
||||
"gradebook.GradesTab.FilterBadges.track": "Track"
|
||||
}
|
||||
@@ -1,2 +1,73 @@
|
||||
{
|
||||
}
|
||||
"gradebook.BulkManagementHistoryView.heading": "Bulk Management History",
|
||||
"gradebook.BulkManagementHistoryView": "Below is a log of previous grade imports. To download a CSV of your gradebook and import grades for override, return to the Gradebook. Please note, after importing grades, it may take a few seconds to process the override.",
|
||||
"gradebook.BulkManagementHistoryView.successDialog": "CSV processing. File uploads may take several minutes to complete.",
|
||||
"gradebook.GradebookFilters.assignmentsFilterLabel": "Assignments",
|
||||
"gradebook.GradebookFilters.overallGradeFilterLabel": "Overall Grade",
|
||||
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Student Groups",
|
||||
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Include Course Team Members",
|
||||
"gradebook.GradebookFilters.assignmentFilterLabel": "Assignment",
|
||||
"gradebook.GradebookFilters.assignmentTypesLabel": "Assignment Types",
|
||||
"gradebook.GradebookFilters.maxGradeFilterLabel": "Max Grade",
|
||||
"gradebook.GradebookFilters.minGradeFilterLabel": "Min Grade",
|
||||
"gradebook.GradebookFilters.cohorts": "Cohorts",
|
||||
"gradebook.GradebookFilters.cohortsAll": "Cohort-All",
|
||||
"gradebook.GradebookFilters.tracks": "Tracks",
|
||||
"gradebook.GradebookFilters.trackAll": "Track-All",
|
||||
"gradebook.GradebookFilters.closeFilters": "Close Filters",
|
||||
"gradebook.GradebookHeader.backButton": "Back to Dashboard",
|
||||
"gradebook.GradebookHeader.appLabel": "Gradebook",
|
||||
"gradebook.GradebookHeader.frozenWarning": "The grades for this course are now frozen. Editing of grades is no longer allowed.",
|
||||
"gradebook.GradebookHeader.unauthorizedWarning": "You are not authorized to view the gradebook for this course.",
|
||||
"gradebook.GradebookHeader.toActivityLogButton": "View Bulk Management History",
|
||||
"gradebook.GradebookHeader.toGradesView": "Return to Gradebook",
|
||||
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Download Grades",
|
||||
"gradebook.GradesView.EditModal.headers.assignment": "Assignment",
|
||||
"gradebook.GradesView.EditModal.headers.currentGrade": "Current Grade",
|
||||
"gradebook.GradesView.EditModal.headers.originalGrade": "Original Grade",
|
||||
"gradebook.GradesView.EditModal.headers.student": "Student",
|
||||
"gradebook.GradesView.EditModal.title": "Edit Grades",
|
||||
"gradebook.GradesView.EditModal.closeText": "Cancel",
|
||||
"gradebook.GradesView.EditModal.contactSupport": "Showing most recent actions (max 5). To see more, please contact support",
|
||||
"gradebook.GradesView.EditModal.saveVisibility": "Note: Once you save, your changes will be visible to students.",
|
||||
"gradebook.GradesView.EditModal.saveGrade": "Save Grades",
|
||||
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Adjusted grade",
|
||||
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
|
||||
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Grader",
|
||||
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Reason",
|
||||
"gradebook.GradesTab.usersVisibilityLabel'": "Showing {filteredUsers} of {totalUsers} total learners",
|
||||
"gradebook.GradesView.editFilterLabel": "Edit Filters",
|
||||
"gradebook.GradesView.table.headings.email": "Email",
|
||||
"gradebook.GradesView.table.headings.totalGrade": "Total Grade (%)",
|
||||
"gradebook.GradesView.table.headings.username": "Username",
|
||||
"gradebook.GradesView.table.labels.studentKey": "Student Key*",
|
||||
"gradebook.GradesView.table.labels.username": "Username",
|
||||
"gradebook.GradesView.table.totalGradePercentage": "Total Grade values are always displayed as a percentage",
|
||||
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Upload Grade CSV",
|
||||
"gradebook.GradesView.importGradesBtnText": "Import Grades",
|
||||
"gradebook.GradesView.ImportSuccessToast.description": "Import Successful! Grades will be updated momentarily.",
|
||||
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "View Activity Log",
|
||||
"gradebook.GradesView.InterventionsReport.title": "Interventions Report",
|
||||
"gradebook.GradesView.InterventionsReport.description": "Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits.",
|
||||
"gradebook.GradesView.InterventionsReport.downloadBtn": "Download Interventions",
|
||||
"gradebook.GradesView.filterHeading": "Step 1: Filter the Grade Report",
|
||||
"gradebook.GradesView.gradebookStepHeading": "Step 2: View or Modify Individual Grades",
|
||||
"gradebook.GradesView.mastersHint": "available for learners in the Master's track only",
|
||||
"gradebook.GradesView.PageButtons.prevPage": "Previous Page",
|
||||
"gradebook.GradesView.PageButtons.nextPage": "Next Page",
|
||||
"gradebook.GradesView.scoreViewLabel": "Score View",
|
||||
"gradebook.GradesView.absoluteOption": "Absolute",
|
||||
"gradebook.GradesView.percentOption": "Percent",
|
||||
"gradebook.GradesView.search.label": "Search for a learner",
|
||||
"gradebook.GradesView.search.hint": "Search by username, email, or student key",
|
||||
"gradebook.GradesView.editSuccessAlert": "The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook.",
|
||||
"gradebook.GradesView.maxCourseGradeInvalid": "Maximum course grade must be between 0 and 100",
|
||||
"gradebook.GradesView.minCourseGradeInvalid": "Minimum course grade must be between 0 and 100",
|
||||
"gradebook.GradesTab.FilterBadges.assignment": "Assignment",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Assignment Grade",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentType": "Assignment Type",
|
||||
"gradebook.GradesTab.FilterBadges.cohort": "Cohort",
|
||||
"gradebook.GradesTab.FilterBadges.courseGrade": "Course Grade",
|
||||
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Include Course Team Members",
|
||||
"gradebook.GradesTab.FilterBadges.track": "Track"
|
||||
}
|
||||
@@ -1,8 +1,73 @@
|
||||
{
|
||||
"gradebook.BulkManagementTab.csvUploadLabel": "Upload Grade CSV",
|
||||
"gradebook.BulkManagementTab.heading": "Use this feature by downloading a CSV for bulk management, overriding grades locally, and coming back here to upload.",
|
||||
"gradebook.BulkManagementTab.hint1": "Results appear in the table below.",
|
||||
"gradebook.BulkManagementTab.hint2": "Grade processing may take a few seconds.",
|
||||
"gradebook.BulkManagementTab.importBtnText": "Import Grades",
|
||||
"gradebook.BulkManagementTab.successDialog": "CSV processing. File uploads may take several minutes to complete."
|
||||
"gradebook.BulkManagementHistoryView.heading": "Bulk Management History",
|
||||
"gradebook.BulkManagementHistoryView": "Below is a log of previous grade imports. To download a CSV of your gradebook and import grades for override, return to the Gradebook. Please note, after importing grades, it may take a few seconds to process the override.",
|
||||
"gradebook.BulkManagementHistoryView.successDialog": "CSV processing. File uploads may take several minutes to complete.",
|
||||
"gradebook.GradebookFilters.assignmentsFilterLabel": "Assignments",
|
||||
"gradebook.GradebookFilters.overallGradeFilterLabel": "Overall Grade",
|
||||
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Student Groups",
|
||||
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Include Course Team Members",
|
||||
"gradebook.GradebookFilters.assignmentFilterLabel": "Assignment",
|
||||
"gradebook.GradebookFilters.assignmentTypesLabel": "Assignment Types",
|
||||
"gradebook.GradebookFilters.maxGradeFilterLabel": "Max Grade",
|
||||
"gradebook.GradebookFilters.minGradeFilterLabel": "Min Grade",
|
||||
"gradebook.GradebookFilters.cohorts": "Cohorts",
|
||||
"gradebook.GradebookFilters.cohortsAll": "Cohort-All",
|
||||
"gradebook.GradebookFilters.tracks": "Tracks",
|
||||
"gradebook.GradebookFilters.trackAll": "Track-All",
|
||||
"gradebook.GradebookFilters.closeFilters": "Close Filters",
|
||||
"gradebook.GradebookHeader.backButton": "Back to Dashboard",
|
||||
"gradebook.GradebookHeader.appLabel": "Gradebook",
|
||||
"gradebook.GradebookHeader.frozenWarning": "The grades for this course are now frozen. Editing of grades is no longer allowed.",
|
||||
"gradebook.GradebookHeader.unauthorizedWarning": "You are not authorized to view the gradebook for this course.",
|
||||
"gradebook.GradebookHeader.toActivityLogButton": "View Bulk Management History",
|
||||
"gradebook.GradebookHeader.toGradesView": "Return to Gradebook",
|
||||
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Download Grades",
|
||||
"gradebook.GradesView.EditModal.headers.assignment": "Assignment",
|
||||
"gradebook.GradesView.EditModal.headers.currentGrade": "Current Grade",
|
||||
"gradebook.GradesView.EditModal.headers.originalGrade": "Original Grade",
|
||||
"gradebook.GradesView.EditModal.headers.student": "Student",
|
||||
"gradebook.GradesView.EditModal.title": "Edit Grades",
|
||||
"gradebook.GradesView.EditModal.closeText": "Cancel",
|
||||
"gradebook.GradesView.EditModal.contactSupport": "Showing most recent actions (max 5). To see more, please contact support",
|
||||
"gradebook.GradesView.EditModal.saveVisibility": "Note: Once you save, your changes will be visible to students.",
|
||||
"gradebook.GradesView.EditModal.saveGrade": "Save Grades",
|
||||
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Adjusted grade",
|
||||
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
|
||||
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Grader",
|
||||
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Reason",
|
||||
"gradebook.GradesTab.usersVisibilityLabel'": "Showing {filteredUsers} of {totalUsers} total learners",
|
||||
"gradebook.GradesView.editFilterLabel": "Edit Filters",
|
||||
"gradebook.GradesView.table.headings.email": "Email",
|
||||
"gradebook.GradesView.table.headings.totalGrade": "Total Grade (%)",
|
||||
"gradebook.GradesView.table.headings.username": "Username",
|
||||
"gradebook.GradesView.table.labels.studentKey": "Student Key*",
|
||||
"gradebook.GradesView.table.labels.username": "Username",
|
||||
"gradebook.GradesView.table.totalGradePercentage": "Total Grade values are always displayed as a percentage",
|
||||
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Upload Grade CSV",
|
||||
"gradebook.GradesView.importGradesBtnText": "Import Grades",
|
||||
"gradebook.GradesView.ImportSuccessToast.description": "Import Successful! Grades will be updated momentarily.",
|
||||
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "View Activity Log",
|
||||
"gradebook.GradesView.InterventionsReport.title": "Interventions Report",
|
||||
"gradebook.GradesView.InterventionsReport.description": "Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits.",
|
||||
"gradebook.GradesView.InterventionsReport.downloadBtn": "Download Interventions",
|
||||
"gradebook.GradesView.filterHeading": "Step 1: Filter the Grade Report",
|
||||
"gradebook.GradesView.gradebookStepHeading": "Step 2: View or Modify Individual Grades",
|
||||
"gradebook.GradesView.mastersHint": "available for learners in the Master's track only",
|
||||
"gradebook.GradesView.PageButtons.prevPage": "Previous Page",
|
||||
"gradebook.GradesView.PageButtons.nextPage": "Next Page",
|
||||
"gradebook.GradesView.scoreViewLabel": "Score View",
|
||||
"gradebook.GradesView.absoluteOption": "Absolute",
|
||||
"gradebook.GradesView.percentOption": "Percent",
|
||||
"gradebook.GradesView.search.label": "Search for a learner",
|
||||
"gradebook.GradesView.search.hint": "Search by username, email, or student key",
|
||||
"gradebook.GradesView.editSuccessAlert": "The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook.",
|
||||
"gradebook.GradesView.maxCourseGradeInvalid": "Maximum course grade must be between 0 and 100",
|
||||
"gradebook.GradesView.minCourseGradeInvalid": "Minimum course grade must be between 0 and 100",
|
||||
"gradebook.GradesTab.FilterBadges.assignment": "Assignment",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Assignment Grade",
|
||||
"gradebook.GradesTab.FilterBadges.assignmentType": "Assignment Type",
|
||||
"gradebook.GradesTab.FilterBadges.cohort": "Cohort",
|
||||
"gradebook.GradesTab.FilterBadges.courseGrade": "Course Grade",
|
||||
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Include Course Team Members",
|
||||
"gradebook.GradesTab.FilterBadges.track": "Track"
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
initialize,
|
||||
subscribe,
|
||||
} from '@edx/frontend-platform';
|
||||
import { messages as headerMessages } from '@edx/frontend-component-header';
|
||||
import { messages as footerMessages } from '@edx/frontend-component-footer';
|
||||
|
||||
import appMessages from './i18n';
|
||||
@@ -21,6 +22,7 @@ subscribe(APP_READY, () => {
|
||||
initialize({
|
||||
messages: [
|
||||
appMessages,
|
||||
headerMessages,
|
||||
footerMessages,
|
||||
],
|
||||
requireAuthenticatedUser: true,
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
initialize,
|
||||
subscribe,
|
||||
} from '@edx/frontend-platform';
|
||||
import { messages as headerMessages } from '@edx/frontend-component-header';
|
||||
import { messages as footerMessages } from '@edx/frontend-component-footer';
|
||||
|
||||
import appMessages from './i18n';
|
||||
@@ -20,6 +21,9 @@ jest.mock('@edx/frontend-platform', () => ({
|
||||
initialize: jest.fn(),
|
||||
subscribe: jest.fn(),
|
||||
}));
|
||||
jest.mock('@edx/frontend-component-header', () => ({
|
||||
messages: ['some', 'messages'],
|
||||
}));
|
||||
jest.mock('@edx/frontend-component-footer', () => ({
|
||||
messages: ['some', 'messages'],
|
||||
}));
|
||||
@@ -44,7 +48,7 @@ describe('app registry', () => {
|
||||
});
|
||||
test('initialize is called with footerMessages and requireAuthenticatedUser', () => {
|
||||
expect(initialize).toHaveBeenCalledWith({
|
||||
messages: [appMessages, footerMessages],
|
||||
messages: [appMessages, headerMessages, footerMessages],
|
||||
requireAuthenticatedUser: true,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -19,5 +19,6 @@ jest.mock('@edx/frontend-platform/i18n', () => {
|
||||
}),
|
||||
defineMessages: m => m,
|
||||
FormattedMessage: () => 'FormattedMessage',
|
||||
getLocale: jest.fn(),
|
||||
};
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user