Compare commits
88 Commits
open-relea
...
mashal-m/a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdde5a1ddd | ||
|
|
d810913038 | ||
|
|
a6436997bb | ||
|
|
7959a39267 | ||
|
|
3a1dbfdee5 | ||
|
|
9b326f1ee8 | ||
|
|
3a87ebda1a | ||
|
|
25389ff296 | ||
|
|
80f782b87f | ||
|
|
8a2d767263 | ||
|
|
264bed987e | ||
|
|
738d460505 | ||
|
|
b8f43b92a1 | ||
|
|
7afffa4509 | ||
|
|
b9ad13e354 | ||
|
|
8ceb9e308f | ||
|
|
b58cab1249 | ||
|
|
f6d8c324d9 | ||
|
|
0c8d2017db | ||
|
|
c644da3dcc | ||
|
|
cc11ce0f81 | ||
|
|
549252038f | ||
|
|
192c8b4601 | ||
|
|
70e13eccfa | ||
|
|
e25a5a9549 | ||
|
|
358263de3c | ||
|
|
dc7fc94ab5 | ||
|
|
b643afd1b8 | ||
|
|
5ac1868d30 | ||
|
|
65063df731 | ||
|
|
9aee97dccb | ||
|
|
be1ce502c8 | ||
|
|
19e2f35522 | ||
|
|
d24ab3358b | ||
|
|
56803fb874 | ||
|
|
b7b94531aa | ||
|
|
78ada8ce34 | ||
|
|
194e61380c | ||
|
|
fa36e20de9 | ||
|
|
61cf386ee6 | ||
|
|
445cd15d9a | ||
|
|
db1cf48257 | ||
|
|
942d471097 | ||
|
|
1a769a4e70 | ||
|
|
b5cb2af513 | ||
|
|
6666c0df83 | ||
|
|
fa60d7d234 | ||
|
|
78cce21f10 | ||
|
|
e21c2a63e7 | ||
|
|
514792786d | ||
|
|
5ef2f1ba4f | ||
|
|
b986849c85 | ||
|
|
f8565c30d1 | ||
|
|
3a7e103317 | ||
|
|
f977e14ea6 | ||
|
|
ab4f1864f2 | ||
|
|
6e4d4c479c | ||
|
|
d74532f988 | ||
|
|
d577bc79f7 | ||
|
|
43ab328545 | ||
|
|
3ddfdf34d0 | ||
|
|
b751d41caf | ||
|
|
4f4b28e6f5 | ||
|
|
038bd117e1 | ||
|
|
7bb31a9aa0 | ||
|
|
b2f59fc3a1 | ||
|
|
60b63944bd | ||
|
|
2893a9e698 | ||
|
|
de4d0fb7f2 | ||
|
|
ca7254c3b0 | ||
|
|
6095869271 | ||
|
|
8fe67f918f | ||
|
|
b28e58e7cd | ||
|
|
a1436c3266 | ||
|
|
9b5e85a236 | ||
|
|
fe1388666a | ||
|
|
a07d6f9b80 | ||
|
|
3e685be116 | ||
|
|
0bb5f50917 | ||
|
|
49357a4e87 | ||
|
|
33ba1cdd08 | ||
|
|
7012fa82c9 | ||
|
|
7b418ff6e3 | ||
|
|
cc349faeb2 | ||
|
|
455ca15af9 | ||
|
|
f992331bf4 | ||
|
|
4158231d7a | ||
|
|
2fa46ab00e |
2
.env
2
.env
@@ -10,6 +10,8 @@ DATA_API_BASE_URL=''
|
||||
SEGMENT_KEY=''
|
||||
FEATURE_FLAGS={}
|
||||
ACCESS_TOKEN_COOKIE_NAME=''
|
||||
ACCOUNT_SETTINGS_URL=''
|
||||
ACCOUNT_PROFILE_URL=''
|
||||
NEW_RELIC_APP_ID=''
|
||||
NEW_RELIC_LICENSE_KEY=''
|
||||
SITE_NAME=''
|
||||
|
||||
@@ -4,6 +4,8 @@ BASE_URL='localhost:1993'
|
||||
LMS_BASE_URL='http://localhost:18000'
|
||||
LOGIN_URL='http://localhost:18000/login'
|
||||
LOGOUT_URL='http://localhost:18000/logout'
|
||||
ACCOUNT_SETTINGS_URL='http://localhost:1997'
|
||||
ACCOUNT_PROFILE_URL='http://localhost:1995'
|
||||
LOGO_URL=https://edx-cdn.org/v3/default/logo.svg
|
||||
LOGO_TRADEMARK_URL=https://edx-cdn.org/v3/default/logo-trademark.svg
|
||||
LOGO_WHITE_URL=https://edx-cdn.org/v3/default/logo-white.svg
|
||||
|
||||
@@ -3,6 +3,8 @@ PORT=1993
|
||||
BASE_URL='localhost:1993'
|
||||
LMS_BASE_URL='http://localhost:18000'
|
||||
LOGIN_URL='http://localhost:18000/login'
|
||||
ACCOUNT_SETTINGS_URL='http://localhost:1997'
|
||||
ACCOUNT_PROFILE_URL='http://localhost:1995'
|
||||
LOGOUT_URL='http://localhost:18000/logout'
|
||||
LOGO_URL=https://edx-cdn.org/v3/default/logo.svg
|
||||
LOGO_TRADEMARK_URL=https://edx-cdn.org/v3/default/logo-trademark.svg
|
||||
|
||||
@@ -11,6 +11,7 @@ const config = createConfig('eslint', {
|
||||
"react/forbid-prop-types": ["error", { "forbid": ["any", "array"] }], // arguable object proptype is use when I do not care about the shape of the object
|
||||
'no-import-assign': 'off',
|
||||
'no-promise-executor-return': 'off',
|
||||
'import/no-cycle': 'off',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
13
.github/workflows/ci.yml
vendored
13
.github/workflows/ci.yml
vendored
@@ -11,17 +11,16 @@ on:
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
node: [16]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
uses: actions/checkout@v3
|
||||
- name: Setup Nodejs Env
|
||||
run: echo "NODE_VER=`cat .nvmrc`" >> $GITHUB_ENV
|
||||
- name: Setup Nodejs
|
||||
uses: actions/setup-node@v2
|
||||
uses: actions/setup-node@v3
|
||||
# Because of node 18 bug (https://github.com/nodejs/node/issues/47563), Pinning node version 18.15 until the next release of node
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
node-version: 18.15
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
2
.github/workflows/lockfileversion-check.yml
vendored
2
.github/workflows/lockfileversion-check.yml
vendored
@@ -10,4 +10,4 @@ on:
|
||||
|
||||
jobs:
|
||||
version-check:
|
||||
uses: openedx/.github/.github/workflows/lockfileversion-check.yml@master
|
||||
uses: openedx/.github/.github/workflows/lockfileversion-check-v3.yml@master
|
||||
|
||||
18
Makefile
18
Makefile
@@ -3,8 +3,9 @@ npm-install-%: ## install specified % npm package
|
||||
git add package.json
|
||||
|
||||
transifex_resource = frontend-app-ora-grading
|
||||
transifex_langs = "ar,fr,es_419,zh_CN,fr_CA,it_IT,pt_PT,de_DE,uk,ru,hi"
|
||||
transifex_langs = "ar,de_DE,es_419,fa_IR,fr,fr_CA,hi,it_IT,pt_PT,uk,ru,zh_CN"
|
||||
|
||||
intl_imports = ./node_modules/.bin/intl-imports.js
|
||||
transifex_utils = ./node_modules/.bin/transifex-utils.js
|
||||
i18n = ./src/i18n
|
||||
transifex_input = $(i18n)/transifex_input.json
|
||||
@@ -53,9 +54,24 @@ push_translations:
|
||||
# Pushing comments to Transifex...
|
||||
./node_modules/@edx/reactifex/bash_scripts/put_comments_v3.sh
|
||||
|
||||
ifeq ($(OPENEDX_ATLAS_PULL),)
|
||||
# Pulls translations from Transifex.
|
||||
pull_translations:
|
||||
tx pull -t -f --mode reviewed --languages=$(transifex_langs)
|
||||
else
|
||||
# Experimental: OEP-58 Pulls translations using atlas
|
||||
pull_translations:
|
||||
rm -rf src/i18n/messages
|
||||
mkdir src/i18n/messages
|
||||
cd src/i18n/messages \
|
||||
&& atlas pull --filter=$(transifex_langs) \
|
||||
translations/frontend-component-footer/src/i18n/messages:frontend-component-footer \
|
||||
translations/frontend-component-header/src/i18n/messages:frontend-component-header \
|
||||
translations/paragon/src/i18n/messages:paragon \
|
||||
translations/frontend-app-ora-grading/src/i18n/messages:frontend-app-ora-grading
|
||||
|
||||
$(intl_imports) frontend-component-footer frontend-component-header paragon frontend-app-ora-grading
|
||||
endif
|
||||
|
||||
# This target is used by CI.
|
||||
validate-no-uncommitted-package-lock-changes:
|
||||
|
||||
21
README.md
21
README.md
@@ -1,21 +0,0 @@
|
||||
# frontend-app-ora-grading
|
||||
|
||||
The ORA Staff Grading App is a microfrontend (MFE) staff grading experience for Open Response Assessments (ORAs). This experience was designed to streamline the grading process and enable richer previews of submission content.
|
||||
|
||||
When enabled, ORAs with a staff grading step will link to this new MFE when clicking "Grade Available Responses" from the ORA or link in the instructor dashboard.
|
||||
|
||||
## Quickstart
|
||||
|
||||
To start the MFE and enable the feature in LMS:
|
||||
|
||||
1. Start the MFE with `npm run start`. Take a note of the path/port (defaults to `http://localhost:1993`).
|
||||
|
||||
2. Add the route root to `edx-platform` settings: In `edx-platform/lms/envs/private.py` or similar, add `ORA_GRADING_MICROFRONTEND_URL = 'http://localhost:1993'`
|
||||
|
||||
3. Enable the feature: In Django Admin go to django-waffle > Flags and add/enable a new flag called `openresponseassessment.enhanced_staff_grader`.
|
||||
|
||||
From there, visit the new experience by going to the Instructor Dashboard > Open Responses or an ORA with a Staff Graded Step and click a link to begin grading.
|
||||
|
||||
## Resources
|
||||
|
||||
See the [ORA Staff Grading](https://edx.readthedocs.io/projects/edx-partner-course-staff/en/latest/exercises_tools/open_response_assessments/ORA_Staff_Grading.html#ora-staff-grading) section on ReadTheDocs for usage information.
|
||||
233
README.rst
Normal file
233
README.rst
Normal file
@@ -0,0 +1,233 @@
|
||||
frontend-app-ora-grading
|
||||
#############################
|
||||
|
||||
|license-badge| |status-badge| |ci-badge| |codecov-badge|
|
||||
|
||||
|
||||
Purpose
|
||||
*******
|
||||
|
||||
The ORA Staff Grading App is a micro-frontend (MFE) staff grading experience
|
||||
for Open Response Assessments (ORAs). This experience was designed to
|
||||
streamline the grading process and enable richer previews of submission content
|
||||
and, eventually, replace on-platform grading workflows for ORA.
|
||||
|
||||
When enabled, ORAs with a staff grading step will link to this new MFE when
|
||||
clicking "Grade Available Responses" from the ORA or link in the instructor
|
||||
dashboard.
|
||||
|
||||
The ORA Staff Grader depends on the `lms/djangoapps/ora_staff_grader
|
||||
<https://github.com/openedx/edx-platform/tree/master/lms/djangoapps/ora_staff_grader>`_
|
||||
app in ``edx-platform``.
|
||||
|
||||
Getting Started
|
||||
***************
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
|
||||
The `devstack`_ is currently recommended as a development environment for your
|
||||
new MFE. If you start it with ``make dev.up.lms`` that should give you
|
||||
everything you need as a companion to this frontend.
|
||||
|
||||
Note that it is also possible to use `Tutor`_ to develop an MFE. You can refer
|
||||
to the `relevant tutor-mfe documentation`_ to get started using it.
|
||||
|
||||
.. _Devstack: https://github.com/openedx/devstack
|
||||
|
||||
.. _Tutor: https://github.com/overhangio/tutor
|
||||
|
||||
.. _relevant tutor-mfe documentation: https://github.com/overhangio/tutor-mfe#mfe-development
|
||||
|
||||
Developing
|
||||
==========
|
||||
|
||||
Cloning and Startup
|
||||
--------------
|
||||
|
||||
First, clone the repo, install code prerequisites, and start the app.
|
||||
|
||||
.. code-block::
|
||||
|
||||
|
||||
1. Clone your new repo:
|
||||
|
||||
``git clone git@github.com:openedx/frontend-app-ora-grading.git``
|
||||
|
||||
2. Use node v18.x.
|
||||
|
||||
The current version of the micro-frontend build scripts support node 18.
|
||||
Using other major versions of node *may* work, but this is unsupported. For
|
||||
convenience, this repository includes an .nvmrc file to help in setting the
|
||||
correct node version via `nvm <https://github.com/nvm-sh/nvm>`_.
|
||||
|
||||
3. Install npm dependencies:
|
||||
|
||||
``cd frontend-app-ora-grading && npm install``
|
||||
|
||||
4. Update the application port to use for local development:
|
||||
|
||||
Default port is 1993. If this does not work for you, update the line
|
||||
`PORT=1993` to your port in all .env.* files
|
||||
|
||||
5. Start the dev server:
|
||||
|
||||
``npm start``
|
||||
|
||||
The app will, by default, run on `http://localhost:1993` unless otherwise
|
||||
specified in ``.env.development:PORT`` and ``.env.development:BASE_URL``.
|
||||
|
||||
Next, enable the ORA Grading micro-frontend in `edx-platform`
|
||||
|
||||
#. Add the path to the ORA Grading app in `edx-platform`:
|
||||
|
||||
#. Go to your environment settings (e.g. `edx-platform/lms/envs/private.py`)
|
||||
|
||||
#. Add the environment variable, ``ORA_GRADING_MICROFRONTEND_URL`` pointing
|
||||
to the ORA Grading app location (e.g. ``http://localhost:1993``).
|
||||
|
||||
#. Start / restart the ``edx-platform`` ``lms``.
|
||||
|
||||
#. Enable the ORA Grading feature in Django Admin.
|
||||
|
||||
#. Go to Django Admin (`{lms-root}/admin`)
|
||||
|
||||
#. Navigate to ``django-waffle`` > ``Flags`` and click ``add/enable a new
|
||||
flag``.
|
||||
|
||||
#. Add a new flag called ``openresponseassessment.enhanced_staff_grader``
|
||||
and enable it.
|
||||
|
||||
From there, visit an Open Response Assessment with a Staff Graded Step and
|
||||
click the "View and grade responses" button to begin grading in the ORA Staff
|
||||
Grader experience.
|
||||
|
||||
|
||||
Making Changes
|
||||
--------------
|
||||
|
||||
Get / install the latest code:
|
||||
|
||||
.. code-block::
|
||||
|
||||
# Grab the latest code
|
||||
git checkout master
|
||||
git pull
|
||||
|
||||
# Install/update the dev requirements
|
||||
npm install
|
||||
|
||||
|
||||
Before committing:
|
||||
|
||||
.. code-block::
|
||||
|
||||
# Make a new branch for your changes
|
||||
git checkout -b <your_github_username>/<short_description>
|
||||
|
||||
# Using your favorite editor, edit the code to make your change.
|
||||
|
||||
# Run your new tests
|
||||
npm test
|
||||
|
||||
# Commit all your changes
|
||||
git commit ...
|
||||
git push
|
||||
|
||||
# Open a PR and ask for review.
|
||||
|
||||
Deploying
|
||||
=========
|
||||
|
||||
This component follows the standard deploy process for MFEs. For details, see
|
||||
the `MFE production deployment guide`_
|
||||
|
||||
.. _MFE production deployment guide: https://openedx.github.io/frontend-platform/#production-deployment-strategy
|
||||
|
||||
Internationalization
|
||||
====================
|
||||
|
||||
Please see refer to the `frontend-platform i18n howto`_ for documentation on
|
||||
internationalization.
|
||||
|
||||
.. _frontend-platform i18n howto: https://github.com/openedx/frontend-platform/blob/master/docs/how_tos/i18n.rst
|
||||
|
||||
Getting Help
|
||||
************
|
||||
|
||||
If you're having trouble, we have discussion forums at
|
||||
https://discuss.openedx.org where you can connect with others in the community.
|
||||
|
||||
Our real-time conversations are on Slack. You can request a `Slack
|
||||
invitation`_, then join our `community Slack workspace`_. Because this is a
|
||||
frontend repository, the best place to discuss it would be in the `#wg-frontend
|
||||
channel`_.
|
||||
|
||||
For anything non-trivial, the best path is to open an issue in this repository
|
||||
with as many details about the issue you are facing as you can provide.
|
||||
|
||||
https://github.com/openedx/frontend-app-ora-grading/issues
|
||||
|
||||
For more information about these options, see the `Getting Help`_ page.
|
||||
|
||||
.. _Slack invitation: https://openedx.org/slack
|
||||
.. _community Slack workspace: https://openedx.slack.com/
|
||||
.. _#wg-frontend channel: https://openedx.slack.com/archives/C04BM6YC7A6
|
||||
.. _Getting Help: https://openedx.org/community/connect
|
||||
|
||||
License
|
||||
*******
|
||||
|
||||
The code in this repository is licensed under the AGPLv3 unless otherwise
|
||||
noted.
|
||||
|
||||
Please see `LICENSE <LICENSE>`_ for details.
|
||||
|
||||
Contributing
|
||||
************
|
||||
|
||||
Contributions are very welcome. Please read `How To Contribute`_ for details.
|
||||
|
||||
.. _How To Contribute: https://openedx.org/r/how-to-contribute
|
||||
|
||||
This project is currently accepting all types of contributions, bug fixes,
|
||||
security fixes, maintenance work, or new features. However, please make sure
|
||||
to have a discussion about your new feature idea with the maintainers prior to
|
||||
beginning development to maximize the chances of your change being accepted.
|
||||
You can start a conversation by creating a new issue on this repo summarizing
|
||||
your idea.
|
||||
|
||||
The Open edX Code of Conduct
|
||||
****************************
|
||||
|
||||
All community members are expected to follow the `Open edX Code of Conduct`_.
|
||||
|
||||
.. _Open edX Code of Conduct: https://openedx.org/code-of-conduct/
|
||||
|
||||
People
|
||||
******
|
||||
|
||||
The assigned maintainers for this component and other project details may be
|
||||
found in `Backstage`_. Backstage pulls this data from the ``catalog-info.yaml``
|
||||
file in this repo.
|
||||
|
||||
.. _Backstage: https://open-edx-backstage.herokuapp.com/catalog/default/component/frontend-app-ora-grading
|
||||
|
||||
Reporting Security Issues
|
||||
*************************
|
||||
|
||||
Please do not report security issues in public, and email security@openedx.org instead.
|
||||
|
||||
.. |license-badge| image:: https://img.shields.io/github/license/openedx/frontend-app-ora-grading.svg
|
||||
:target: https://github.com/openedx/frontend-app-ora-grading/blob/master/LICENSE
|
||||
:alt: License
|
||||
|
||||
.. |status-badge| image:: https://img.shields.io/badge/Status-Maintained-brightgreen
|
||||
|
||||
.. |ci-badge| image:: https://github.com/openedx/frontend-app-ora-grading/actions/workflows/ci.yml/badge.svg
|
||||
:target: https://github.com/openedx/frontend-app-ora-grading/actions/workflows/ci.yml
|
||||
:alt: Continuous Integration
|
||||
|
||||
.. |codecov-badge| image:: https://codecov.io/github/openedx/frontend-app-ora-grading/coverage.svg?branch=master
|
||||
:target: https://codecov.io/github/openedx/frontend-app-ora-grading?branch=master
|
||||
:alt: Codecov
|
||||
19
catalog-info.yaml
Normal file
19
catalog-info.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
# This file records information about this repo. Its use is described in OEP-55:
|
||||
# https://open-edx-proposals.readthedocs.io/en/latest/processes/oep-0055-proc-project-maintainers.html
|
||||
|
||||
apiVersion: backstage.io/v1alpha1
|
||||
kind: Component
|
||||
metadata:
|
||||
name: 'frontend-app-ora-grading'
|
||||
description: "Frontend grading experience for Open Response Assessments (ORAs)"
|
||||
links:
|
||||
- url: "https://ora-grading.edx.org"
|
||||
title: "Production Site"
|
||||
icon: "Web"
|
||||
- url: "https://ora-grading.stage.edx.org"
|
||||
title: "Stage Site"
|
||||
icon: "Web"
|
||||
spec:
|
||||
owner: group:content-aurora
|
||||
type: 'website'
|
||||
lifecycle: 'production'
|
||||
@@ -26,4 +26,3 @@ There are only two requirements for a good `make target` name
|
||||
What `make validate-no-uncommitted-package-lock-changes` does is `git diff`s for any `package-lock.json` file changes in your project.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
42675
package-lock.json
generated
42675
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
51
package.json
51
package.json
@@ -24,22 +24,22 @@
|
||||
"access": "public"
|
||||
},
|
||||
"dependencies": {
|
||||
"@edx/brand": "npm:@edx/brand-edx.org@^2.0.3",
|
||||
"@edx/frontend-component-footer": "^11.1.1",
|
||||
"@edx/frontend-component-header": "^3.1.1",
|
||||
"@edx/frontend-platform": "^2.5.1",
|
||||
"@edx/paragon": "^19.9.0",
|
||||
"@edx/brand": "npm:@openedx/brand-openedx@^1.2.2",
|
||||
"@edx/frontend-component-footer": "12.5.0",
|
||||
"@edx/frontend-component-header": "4.8.0",
|
||||
"@edx/frontend-platform": "5.6.1",
|
||||
"@edx/paragon": "^20.44.0",
|
||||
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
||||
"@fortawesome/free-brands-svg-icons": "^5.15.4",
|
||||
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
||||
"@fortawesome/react-fontawesome": "^0.1.15",
|
||||
"@fortawesome/react-fontawesome": "^0.2.0",
|
||||
"@redux-beacon/segment": "^1.1.0",
|
||||
"@reduxjs/toolkit": "^1.6.1",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"@testing-library/user-event": "^14.0.0",
|
||||
"@zip.js/zip.js": "^2.4.6",
|
||||
"axios": "^0.21.4",
|
||||
"axios": "^0.27.0",
|
||||
"classnames": "^2.3.1",
|
||||
"core-js": "3.16.2",
|
||||
"core-js": "3.33.1",
|
||||
"dompurify": "^2.3.1",
|
||||
"email-prop-type": "^3.0.1",
|
||||
"enzyme": "^3.11.0",
|
||||
@@ -47,45 +47,46 @@
|
||||
"file-saver": "^2.0.5",
|
||||
"filesize": "^8.0.6",
|
||||
"font-awesome": "4.7.0",
|
||||
"history": "5.0.1",
|
||||
"history": "5.3.0",
|
||||
"html-react-parser": "^1.3.0",
|
||||
"lodash": "^4.17.21",
|
||||
"moment": "^2.29.3",
|
||||
"prop-types": "15.7.2",
|
||||
"query-string": "7.0.1",
|
||||
"react": "^16.14.0",
|
||||
"react-dom": "^16.14.0",
|
||||
"prop-types": "15.8.1",
|
||||
"query-string": "7.1.3",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-intl": "^5.20.9",
|
||||
"react-pdf": "^5.5.0",
|
||||
"react-redux": "^7.2.4",
|
||||
"react-router": "5.2.0",
|
||||
"react-router-dom": "5.2.0",
|
||||
"react-redux": "^7.2.9",
|
||||
"react-router": "6.17.0",
|
||||
"react-router-dom": "6.17.0",
|
||||
"react-router-redux": "^5.0.0-alpha.9",
|
||||
"redux": "4.1.1",
|
||||
"redux": "4.2.1",
|
||||
"redux-beacon": "^2.1.0",
|
||||
"redux-devtools-extension": "2.13.9",
|
||||
"redux-logger": "3.0.6",
|
||||
"redux-thunk": "2.3.0",
|
||||
"regenerator-runtime": "^0.13.9",
|
||||
"redux-thunk": "2.4.2",
|
||||
"regenerator-runtime": "^0.14.0",
|
||||
"reselect": "^4.0.0",
|
||||
"util": "^0.12.4",
|
||||
"whatwg-fetch": "^3.6.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@edx/frontend-build": "12.4",
|
||||
"@edx/browserslist-config": "^1.2.0",
|
||||
"@edx/frontend-build": "^12.7.0",
|
||||
"@edx/reactifex": "^2.1.1",
|
||||
"@testing-library/jest-dom": "^5.14.1",
|
||||
"@testing-library/react": "^12.1.0",
|
||||
"@testing-library/react": "12.1.5",
|
||||
"@wojtekmaj/enzyme-adapter-react-17": "0.8.0",
|
||||
"axios-mock-adapter": "^1.20.0",
|
||||
"enzyme-adapter-react-16": "^1.15.6",
|
||||
"fetch-mock": "^9.11.0",
|
||||
"husky": "^7.0.0",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"jest": "27.0.6",
|
||||
"jest": "29.7.0",
|
||||
"jest-expect-message": "^1.0.2",
|
||||
"react-dev-utils": "^12.0.1",
|
||||
"react-test-renderer": "^16.14.0",
|
||||
"react-test-renderer": "^17.0.2",
|
||||
"reactifex": "1.1.1",
|
||||
"redux-mock-store": "^1.5.4",
|
||||
"semantic-release": "^19.0.3"
|
||||
|
||||
34
renovate.json
Normal file
34
renovate.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"extends": [
|
||||
"config:base",
|
||||
"schedule:weekly",
|
||||
":automergeLinters",
|
||||
":automergeMinor",
|
||||
":automergeTesters",
|
||||
":enableVulnerabilityAlerts",
|
||||
":rebaseStalePrs",
|
||||
":semanticCommits",
|
||||
":updateNotScheduled"
|
||||
],
|
||||
"packageRules": [
|
||||
{
|
||||
"matchDepTypes": [
|
||||
"devDependencies"
|
||||
],
|
||||
"matchUpdateTypes": [
|
||||
"lockFileMaintenance",
|
||||
"minor",
|
||||
"patch",
|
||||
"pin"
|
||||
],
|
||||
"automerge": true
|
||||
},
|
||||
{
|
||||
"matchPackagePatterns": ["@edx", "@openedx"],
|
||||
"matchUpdateTypes": ["minor", "patch"],
|
||||
"automerge": true
|
||||
}
|
||||
],
|
||||
"timezone": "America/New_York",
|
||||
"schedule": ["before 11pm"]
|
||||
}
|
||||
@@ -7,29 +7,18 @@ exports[`app registry subscribe: APP_INIT_ERROR. snapshot: displays an ErrorPag
|
||||
`;
|
||||
|
||||
exports[`app registry subscribe: APP_READY. links App to root element 1`] = `
|
||||
<IntlProvider
|
||||
defaultFormats={Object {}}
|
||||
defaultLocale="en"
|
||||
fallbackOnEmptyString={true}
|
||||
formats={Object {}}
|
||||
locale="en"
|
||||
messages={Object {}}
|
||||
onError={[Function]}
|
||||
onWarn={[Function]}
|
||||
textComponent={Symbol(react.fragment)}
|
||||
>
|
||||
<AppProvider
|
||||
store={
|
||||
Object {
|
||||
"dispatch": [Function],
|
||||
"getState": [Function],
|
||||
"replaceReducer": [Function],
|
||||
"subscribe": [Function],
|
||||
Symbol(Symbol.observable): [Function],
|
||||
}
|
||||
<AppProvider
|
||||
store={
|
||||
Object {
|
||||
"dispatch": [Function],
|
||||
"getState": [Function],
|
||||
"replaceReducer": [Function],
|
||||
"subscribe": [Function],
|
||||
Symbol(Symbol.observable): [Function],
|
||||
}
|
||||
>
|
||||
<App />
|
||||
</AppProvider>
|
||||
</IntlProvider>
|
||||
}
|
||||
wrapWithRouter={false}
|
||||
>
|
||||
<App />
|
||||
</AppProvider>
|
||||
`;
|
||||
|
||||
@@ -81,13 +81,12 @@ describe('Text file preview hooks', () => {
|
||||
});
|
||||
});
|
||||
describe('onError', () => {
|
||||
it('calls get on the passed url when it changes', async (done) => {
|
||||
it('calls get on the passed url when it changes', async () => {
|
||||
axios.get.mockReturnValueOnce(Promise.reject(
|
||||
{ response: { status: testValue } },
|
||||
));
|
||||
await hooks.fetchFile({ ...props, setContent: state.setState.content });
|
||||
expect(props.onError).toHaveBeenCalledWith(testValue);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -28,6 +28,6 @@
|
||||
|
||||
@include media-breakpoint-down(sm) {
|
||||
.file-card-title {
|
||||
width: map-get($container-max-widths, "sm")/2;
|
||||
width: calc(map-get($container-max-widths, "sm")/2);
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,7 @@ export const FileInfo = ({ onClick, children }) => (
|
||||
)}
|
||||
>
|
||||
<Button
|
||||
size="small"
|
||||
size="sm"
|
||||
variant="tertiary"
|
||||
onClick={onClick}
|
||||
iconAfter={InfoOutline}
|
||||
|
||||
@@ -21,7 +21,7 @@ exports[`File Preview Card component snapshot 1`] = `
|
||||
<Button
|
||||
iconAfter={[MockFunction icons.InfoOutline]}
|
||||
onClick={[MockFunction this.props.onClick]}
|
||||
size="small"
|
||||
size="sm"
|
||||
variant="tertiary"
|
||||
>
|
||||
<FormattedMessage
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
const configuration = {
|
||||
// BASE_URL: process.env.BASE_URL,
|
||||
LMS_BASE_URL: process.env.LMS_BASE_URL,
|
||||
// LOGIN_URL: process.env.LOGIN_URL,
|
||||
// LOGOUT_URL: process.env.LOGOUT_URL,
|
||||
// CSRF_TOKEN_API_PATH: process.env.CSRF_TOKEN_API_PATH,
|
||||
// REFRESH_ACCESS_TOKEN_ENDPOINT: process.env.REFRESH_ACCESS_TOKEN_ENDPOINT,
|
||||
// DATA_API_BASE_URL: process.env.DATA_API_BASE_URL,
|
||||
// SECURE_COOKIES: process.env.NODE_ENV !== 'development',
|
||||
// SEGMENT_KEY: process.env.SEGMENT_KEY,
|
||||
// ACCESS_TOKEN_COOKIE_NAME: process.env.ACCESS_TOKEN_COOKIE_NAME,
|
||||
};
|
||||
|
||||
const features = {};
|
||||
|
||||
export { configuration, features };
|
||||
@@ -163,7 +163,7 @@ describe('Criterion Feedback', () => {
|
||||
});
|
||||
|
||||
describe('mapStateToProps', () => {
|
||||
const testState = { abitaryState: 'some data' };
|
||||
const testState = { arbitraryState: 'some data' };
|
||||
const ownProps = { orderNum: props.orderNum };
|
||||
let mapped;
|
||||
beforeEach(() => {
|
||||
|
||||
@@ -40,14 +40,14 @@ describe('Radio Criterion Container', () => {
|
||||
feedback: 'feedback mock',
|
||||
options: [
|
||||
{
|
||||
explanation: 'explaination',
|
||||
explanation: 'explanation',
|
||||
feedback: 'option feedback',
|
||||
label: 'this label',
|
||||
name: 'option name',
|
||||
points: 1,
|
||||
},
|
||||
{
|
||||
explanation: 'explaination 2',
|
||||
explanation: 'explanation 2',
|
||||
feedback: 'option feedback 2',
|
||||
label: 'this label 2',
|
||||
name: 'option name 2',
|
||||
@@ -129,7 +129,7 @@ describe('Radio Criterion Container', () => {
|
||||
});
|
||||
|
||||
describe('mapStateToProps', () => {
|
||||
const testState = { arbitary: 'some data' };
|
||||
const testState = { arbitrary: 'some data' };
|
||||
const ownProps = { orderNum: props.orderNum };
|
||||
let mapped;
|
||||
beforeEach(() => {
|
||||
|
||||
@@ -29,14 +29,14 @@ describe('Review Crition Container', () => {
|
||||
feedback: 'feedback mock',
|
||||
options: [
|
||||
{
|
||||
explanation: 'explaination',
|
||||
explanation: 'explanation',
|
||||
feedback: 'option feedback',
|
||||
label: 'this label',
|
||||
name: 'option name',
|
||||
points: 1,
|
||||
},
|
||||
{
|
||||
explanation: 'explaination 2',
|
||||
explanation: 'explanation 2',
|
||||
feedback: 'option feedback 2',
|
||||
label: 'this label 2',
|
||||
name: 'option name 2',
|
||||
@@ -78,7 +78,7 @@ describe('Review Crition Container', () => {
|
||||
});
|
||||
|
||||
describe('mapStateToProps', () => {
|
||||
const testState = { arbitary: 'some data' };
|
||||
const testState = { arbitrary: 'some data' };
|
||||
const ownProps = { orderNum: props.orderNum };
|
||||
let mapped;
|
||||
beforeEach(() => {
|
||||
|
||||
@@ -19,7 +19,7 @@ exports[`Criterion Container snapshot is graded and is not grading 1`] = `
|
||||
this label
|
||||
</strong>
|
||||
<br />
|
||||
explaination
|
||||
explanation
|
||||
</div>
|
||||
<div
|
||||
className="help-popover-option"
|
||||
@@ -29,7 +29,7 @@ exports[`Criterion Container snapshot is graded and is not grading 1`] = `
|
||||
this label 2
|
||||
</strong>
|
||||
<br />
|
||||
explaination 2
|
||||
explanation 2
|
||||
</div>
|
||||
</InfoPopover>
|
||||
</Form.Label>
|
||||
@@ -67,7 +67,7 @@ exports[`Criterion Container snapshot is ungraded and is grading 1`] = `
|
||||
this label
|
||||
</strong>
|
||||
<br />
|
||||
explaination
|
||||
explanation
|
||||
</div>
|
||||
<div
|
||||
className="help-popover-option"
|
||||
@@ -77,7 +77,7 @@ exports[`Criterion Container snapshot is ungraded and is grading 1`] = `
|
||||
this label 2
|
||||
</strong>
|
||||
<br />
|
||||
explaination 2
|
||||
explanation 2
|
||||
</div>
|
||||
</InfoPopover>
|
||||
</Form.Label>
|
||||
@@ -115,7 +115,7 @@ exports[`Criterion Container snapshot is ungraded and is not grading 1`] = `
|
||||
this label
|
||||
</strong>
|
||||
<br />
|
||||
explaination
|
||||
explanation
|
||||
</div>
|
||||
<div
|
||||
className="help-popover-option"
|
||||
@@ -125,7 +125,7 @@ exports[`Criterion Container snapshot is ungraded and is not grading 1`] = `
|
||||
this label 2
|
||||
</strong>
|
||||
<br />
|
||||
explaination 2
|
||||
explanation 2
|
||||
</div>
|
||||
</InfoPopover>
|
||||
</Form.Label>
|
||||
|
||||
@@ -34,14 +34,14 @@ describe('Criterion Container', () => {
|
||||
feedback: 'feedback mock',
|
||||
options: [
|
||||
{
|
||||
explanation: 'explaination',
|
||||
explanation: 'explanation',
|
||||
feedback: 'option feedback',
|
||||
label: 'this label',
|
||||
name: 'option name',
|
||||
points: 2,
|
||||
},
|
||||
{
|
||||
explanation: 'explaination 2',
|
||||
explanation: 'explanation 2',
|
||||
feedback: 'option feedback 2',
|
||||
label: 'this label 2',
|
||||
name: 'option name 2',
|
||||
@@ -89,16 +89,16 @@ describe('Criterion Container', () => {
|
||||
});
|
||||
|
||||
test('is ungraded and is grading (Radio criterion get render)', () => {
|
||||
const rubricCritera = el.find('.rubric-criteria');
|
||||
expect(rubricCritera.children(0).name()).toEqual('RadioCriterion');
|
||||
const rubricCriteria = el.find('.rubric-criteria');
|
||||
expect(rubricCriteria.children(0).name()).toEqual('RadioCriterion');
|
||||
});
|
||||
|
||||
test('is ungraded and is not grading (Review criterion get render)', () => {
|
||||
el.setProps({
|
||||
isGrading: false,
|
||||
});
|
||||
const rubricCritera = el.find('.rubric-criteria');
|
||||
expect(rubricCritera.children(0).name()).toEqual('ReviewCriterion');
|
||||
const rubricCriteria = el.find('.rubric-criteria');
|
||||
expect(rubricCriteria.children(0).name()).toEqual('ReviewCriterion');
|
||||
});
|
||||
|
||||
test('is graded and is not grading (Radio criterion get render)', () => {
|
||||
@@ -106,13 +106,13 @@ describe('Criterion Container', () => {
|
||||
isGrading: false,
|
||||
gradeStatus: gradeStatuses.graded,
|
||||
});
|
||||
const rubricCritera = el.find('.rubric-criteria');
|
||||
expect(rubricCritera.children(0).name()).toEqual('RadioCriterion');
|
||||
const rubricCriteria = el.find('.rubric-criteria');
|
||||
expect(rubricCriteria.children(0).name()).toEqual('RadioCriterion');
|
||||
});
|
||||
});
|
||||
|
||||
describe('mapStateToProps', () => {
|
||||
const testState = { abitaryState: 'some data' };
|
||||
const testState = { arbitraryState: 'some data' };
|
||||
const ownProps = { orderNum: props.orderNum };
|
||||
let mapped;
|
||||
beforeEach(() => {
|
||||
|
||||
@@ -14,7 +14,7 @@ const messages = defineMessages({
|
||||
optional: {
|
||||
id: 'ora-grading.CriterionFeedback.optional',
|
||||
defaultMessage: '(Optional)',
|
||||
description: 'addtional label for optional feedback field',
|
||||
description: 'additional label for optional feedback field',
|
||||
},
|
||||
optionPoints: {
|
||||
id: 'ora-grading.RadioCriterion.optionPoints',
|
||||
|
||||
@@ -22,7 +22,7 @@ export const ListViewBreadcrumb = ({ courseId, oraName }) => (
|
||||
</Hyperlink>
|
||||
<p className="py-4">
|
||||
<span className="h3">{oraName}</span>
|
||||
<Hyperlink className="align-middle" destination={urls.ora(courseId, locationId)}>
|
||||
<Hyperlink className="align-middle" destination={urls.ora(courseId, locationId())}>
|
||||
<Icon src={Launch} className="d-inline-block" />
|
||||
</Hyperlink>
|
||||
</p>
|
||||
|
||||
@@ -50,7 +50,7 @@ describe('ListViewBreadcrumb component', () => {
|
||||
test('ora destination', () => {
|
||||
expect(
|
||||
el.find(Hyperlink).at(1).props().destination,
|
||||
).toEqual(urls.ora(props.courseId, constants.locationId));
|
||||
).toEqual(urls.ora(props.courseId, constants.locationId()));
|
||||
});
|
||||
});
|
||||
describe('mapStateToProps', () => {
|
||||
|
||||
@@ -63,8 +63,8 @@ export class SubmissionsTable extends React.Component {
|
||||
translate = (...args) => this.props.intl.formatMessage(...args);
|
||||
|
||||
handleViewAllResponsesClick = (data) => () => {
|
||||
const getsubmissionUUID = (row) => row.original.submissionUUID;
|
||||
this.props.loadSelectionForReview(data.map(getsubmissionUUID));
|
||||
const getSubmissionUUID = (row) => row.original.submissionUUID;
|
||||
this.props.loadSelectionForReview(data.map(getSubmissionUUID));
|
||||
};
|
||||
|
||||
render() {
|
||||
|
||||
@@ -43,7 +43,7 @@ exports[`FileDownload component snapshot download is completed 1`] = `
|
||||
/>,
|
||||
"pending": <FormattedMessage
|
||||
defaultMessage="Downloading"
|
||||
description="Download files penging state label"
|
||||
description="Download files pending state label"
|
||||
id="ora-grading.ResponseDisplay.SubmissionFiles.downloading"
|
||||
/>,
|
||||
}
|
||||
@@ -96,7 +96,7 @@ exports[`FileDownload component snapshot download is failed 1`] = `
|
||||
/>,
|
||||
"pending": <FormattedMessage
|
||||
defaultMessage="Downloading"
|
||||
description="Download files penging state label"
|
||||
description="Download files pending state label"
|
||||
id="ora-grading.ResponseDisplay.SubmissionFiles.downloading"
|
||||
/>,
|
||||
}
|
||||
@@ -149,7 +149,7 @@ exports[`FileDownload component snapshot download is inactive 1`] = `
|
||||
/>,
|
||||
"pending": <FormattedMessage
|
||||
defaultMessage="Downloading"
|
||||
description="Download files penging state label"
|
||||
description="Download files pending state label"
|
||||
id="ora-grading.ResponseDisplay.SubmissionFiles.downloading"
|
||||
/>,
|
||||
}
|
||||
@@ -202,7 +202,7 @@ exports[`FileDownload component snapshot download is pending 1`] = `
|
||||
/>,
|
||||
"pending": <FormattedMessage
|
||||
defaultMessage="Downloading"
|
||||
description="Download files penging state label"
|
||||
description="Download files pending state label"
|
||||
id="ora-grading.ResponseDisplay.SubmissionFiles.downloading"
|
||||
/>,
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ const messages = defineMessages({
|
||||
downloading: {
|
||||
id: 'ora-grading.ResponseDisplay.SubmissionFiles.downloading',
|
||||
defaultMessage: 'Downloading',
|
||||
description: 'Download files penging state label',
|
||||
description: 'Download files pending state label',
|
||||
},
|
||||
downloaded: {
|
||||
id: 'ora-grading.ResponseDisplay.SubmissionFiles.downloaded',
|
||||
|
||||
@@ -19,7 +19,7 @@ jest.mock('data/redux/grading/selectors', () => ({
|
||||
doesExist: (state) => ({ nextDoesExist: state }),
|
||||
},
|
||||
activeIndex: (state) => ({ activeIndex: state }),
|
||||
selectionLength: (state) => ({ selectionlength: state }),
|
||||
selectionLength: (state) => ({ selectionLength: state }),
|
||||
}));
|
||||
jest.mock('data/redux/requests/selectors', () => ({
|
||||
allowNavigation: (state) => ({ allowNavigation: state }),
|
||||
|
||||
@@ -53,7 +53,7 @@ describe('ReviewContent component', () => {
|
||||
test('isFailed loads from requests.isFailed(fetchSubmission)', () => {
|
||||
expect(mapped.isFailed).toEqual(selectors.requests.isFailed(testState, { requestKey }));
|
||||
});
|
||||
test('isLoadeed loads from requests.isCompleted(fetchSubmission)', () => {
|
||||
test('isLoaded loads from requests.isCompleted(fetchSubmission)', () => {
|
||||
expect(mapped.isLoaded).toEqual(selectors.requests.isCompleted(testState, { requestKey }));
|
||||
});
|
||||
});
|
||||
|
||||
@@ -62,7 +62,7 @@ describe('DownloadErrors component', () => {
|
||||
});
|
||||
describe('behavior', () => {
|
||||
describe('clearState', () => {
|
||||
it('calls props.clearState with requestKey: downladFiles', () => {
|
||||
it('calls props.clearState with requestKey: downloadFiles', () => {
|
||||
el.instance().cancelAction();
|
||||
expect(props.clearState).toHaveBeenCalledWith({ requestKey: RequestKeys.downloadFiles });
|
||||
});
|
||||
|
||||
@@ -106,7 +106,7 @@ describe('Review Modal Submit Error hooks', () => {
|
||||
errorStatus = 'test-status';
|
||||
const mockErrorProps = (args) => ({
|
||||
confirm: { confirm: args },
|
||||
headingMessag: { headingMessage: args },
|
||||
headingMessage: { headingMessage: args },
|
||||
contentMessage: { contentMessage: args },
|
||||
});
|
||||
const mockProps = mockErrorProps({ dispatch, errorStatus });
|
||||
|
||||
@@ -32,7 +32,7 @@ jest.mock('data/redux/grading/selectors', () => ({
|
||||
overallFeedback: jest.fn((...args) => ({
|
||||
selectedOverallFeedback: args,
|
||||
})),
|
||||
isGrading: jest.fn((...args) => ({ isGragrding: args })),
|
||||
isGrading: jest.fn((...args) => ({ isGrading: args })),
|
||||
},
|
||||
validation: {
|
||||
overallFeedbackIsInvalid: jest.fn((...args) => ({
|
||||
@@ -44,7 +44,7 @@ jest.mock('data/redux/grading/selectors', () => ({
|
||||
describe('Rubric Feedback component', () => {
|
||||
const props = {
|
||||
intl: { formatMessage },
|
||||
config: 'config stirng',
|
||||
config: 'config string',
|
||||
isGrading: true,
|
||||
value: 'some value',
|
||||
isInvalid: false,
|
||||
@@ -135,7 +135,7 @@ describe('Rubric Feedback component', () => {
|
||||
});
|
||||
|
||||
describe('mapStateToProps', () => {
|
||||
const testState = { abitaryState: 'some data' };
|
||||
const testState = { arbitraryState: 'some data' };
|
||||
let mapped;
|
||||
beforeEach(() => {
|
||||
mapped = mapStateToProps(testState);
|
||||
|
||||
@@ -10,7 +10,7 @@ exports[`Rubric Feedback component snapshot feedback value is invalid 1`] = `
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Overall comments"
|
||||
description="Rubric overall commnents label"
|
||||
description="Rubric overall comments label"
|
||||
id="ora-grading.Rubric.overallComments"
|
||||
/>
|
||||
</span>
|
||||
@@ -53,7 +53,7 @@ exports[`Rubric Feedback component snapshot is graded 1`] = `
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Overall comments"
|
||||
description="Rubric overall commnents label"
|
||||
description="Rubric overall comments label"
|
||||
id="ora-grading.Rubric.overallComments"
|
||||
/>
|
||||
</span>
|
||||
@@ -84,7 +84,7 @@ exports[`Rubric Feedback component snapshot is grading 1`] = `
|
||||
>
|
||||
<FormattedMessage
|
||||
defaultMessage="Overall comments"
|
||||
description="Rubric overall commnents label"
|
||||
description="Rubric overall comments label"
|
||||
id="ora-grading.Rubric.overallComments"
|
||||
/>
|
||||
</span>
|
||||
|
||||
@@ -43,7 +43,7 @@ describe('Rubric hooks', () => {
|
||||
afterEach(state.restore);
|
||||
describe('redux values', () => {
|
||||
beforeEach(() => { hook = hooks.reduxValues(); });
|
||||
test('loads gradeIsPending from isPending requests selectror on submitGrade request', () => {
|
||||
test('loads gradeIsPending from isPending requests selector on submitGrade request', () => {
|
||||
expect(hook.gradeIsPending.useSelector(testState)).toEqual(
|
||||
selectors.requests.isPending(testState, { requestKey: RequestKeys.submitGrade }),
|
||||
);
|
||||
@@ -51,7 +51,7 @@ describe('Rubric hooks', () => {
|
||||
test('loads criteriaIndices from rubric selector', () => {
|
||||
expect(hook.criteriaIndices).toEqual(useSelector(selectors.app.rubric.criteriaIndices));
|
||||
});
|
||||
test('loads isCompleted from requests selectror on submitGrade request', () => {
|
||||
test('loads isCompleted from requests selector on submitGrade request', () => {
|
||||
expect(hook.isCompleted.useSelector(testState)).toEqual(
|
||||
selectors.requests.isCompleted(testState, { requestKey: RequestKeys.submitGrade }),
|
||||
);
|
||||
@@ -62,7 +62,7 @@ describe('Rubric hooks', () => {
|
||||
test('loads isGrading from grading selector for selected submission', () => {
|
||||
expect(hook.isGrading).toEqual(useSelector(selectors.grading.selected.isGrading));
|
||||
});
|
||||
test('loads lockIsPending from isPending requests selectror on setLock request', () => {
|
||||
test('loads lockIsPending from isPending requests selector on setLock request', () => {
|
||||
expect(hook.lockIsPending.useSelector(testState)).toEqual(
|
||||
selectors.requests.isPending(testState, { requestKey: RequestKeys.setLock }),
|
||||
);
|
||||
|
||||
@@ -24,7 +24,7 @@ const messages = defineMessages({
|
||||
overallComments: {
|
||||
id: 'ora-grading.Rubric.overallComments',
|
||||
defaultMessage: 'Overall comments',
|
||||
description: 'Rubric overall commnents label',
|
||||
description: 'Rubric overall comments label',
|
||||
},
|
||||
addComments: {
|
||||
id: 'ora-grading.Rubric.addComments',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
export const routePath = `${getConfig().PUBLIC_PATH}:courseId`;
|
||||
export const locationId = window.location.pathname.slice(1);
|
||||
export const routePath = () => `${getConfig().PUBLIC_PATH}:courseId`;
|
||||
export const locationId = () => decodeURIComponent(window.location.pathname).replace(getConfig().PUBLIC_PATH, '');
|
||||
|
||||
@@ -4,7 +4,7 @@ import * as constants from './app';
|
||||
jest.unmock('./app');
|
||||
|
||||
jest.mock('@edx/frontend-platform', () => {
|
||||
const PUBLIC_PATH = 'test-public-path';
|
||||
const PUBLIC_PATH = '/test-public-path/';
|
||||
return {
|
||||
getConfig: () => ({ PUBLIC_PATH }),
|
||||
PUBLIC_PATH,
|
||||
@@ -13,12 +13,31 @@ jest.mock('@edx/frontend-platform', () => {
|
||||
|
||||
describe('app constants', () => {
|
||||
test('route path draws from public path and adds courseId', () => {
|
||||
expect(constants.routePath).toEqual(`${platform.PUBLIC_PATH}:courseId`);
|
||||
expect(constants.routePath()).toEqual(`${platform.PUBLIC_PATH}:courseId`);
|
||||
});
|
||||
test('locationId returns trimmed pathname', () => {
|
||||
const old = window.location;
|
||||
window.location = { pathName: '/somePath.jpg' };
|
||||
expect(constants.locationId).toEqual(window.location.pathname.slice(1));
|
||||
window.location = old;
|
||||
describe('locationId', () => {
|
||||
const domain = 'https://example.com';
|
||||
|
||||
test('returns trimmed pathname', () => {
|
||||
const old = window.location;
|
||||
Object.defineProperty(window, 'location', {
|
||||
value: new URL(`${domain}${platform.PUBLIC_PATH}somePath.jpg`),
|
||||
writable: true,
|
||||
});
|
||||
expect(constants.locationId()).toEqual(window.location.pathname.replace(platform.PUBLIC_PATH, ''));
|
||||
window.location = old;
|
||||
});
|
||||
test('handle none-standard characters pathName', () => {
|
||||
const old = window.location;
|
||||
const noneStandardPath = `${platform.PUBLIC_PATH}ORG+%C4%90+2023`;
|
||||
const expectedPath = `${platform.PUBLIC_PATH}ORG+Đ+2023`;
|
||||
Object.defineProperty(window, 'location', {
|
||||
value: new URL(`${domain}${noneStandardPath}`),
|
||||
writable: true,
|
||||
});
|
||||
expect(noneStandardPath).not.toEqual(expectedPath);
|
||||
expect(constants.locationId()).toEqual(expectedPath.replace(platform.PUBLIC_PATH, ''));
|
||||
window.location = old;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -111,7 +111,7 @@ describe('app selectors unit tests', () => {
|
||||
test('rubricConfig selector returns rubricConfig from oraMetadata', () => {
|
||||
testOraSelector(selectors.rubric.config, oraMetadata.rubricConfig);
|
||||
});
|
||||
test('fileUploadResponseConfig returns fileUploadResponseconfig from oraMetadata', () => {
|
||||
test('fileUploadResponseConfig returns fileUploadResponseConfig from oraMetadata', () => {
|
||||
testOraSelector(
|
||||
selectors.ora.fileUploadResponseConfig,
|
||||
oraMetadata.fileUploadResponseConfig,
|
||||
@@ -184,11 +184,11 @@ describe('app selectors unit tests', () => {
|
||||
});
|
||||
});
|
||||
describe('shouldIncludeFeedback', () => {
|
||||
it('returns true iff the passed feedback is optional or required', () => {
|
||||
it('returns true if the passed feedback is optional or required', () => {
|
||||
expect(selectors.shouldIncludeFeedback(feedbackRequirement.optional)).toEqual(true);
|
||||
expect(selectors.shouldIncludeFeedback(feedbackRequirement.required)).toEqual(true);
|
||||
expect(selectors.shouldIncludeFeedback(feedbackRequirement.disabled)).toEqual(false);
|
||||
expect(selectors.shouldIncludeFeedback('aribitrary')).toEqual(false);
|
||||
expect(selectors.shouldIncludeFeedback('arbitrary')).toEqual(false);
|
||||
});
|
||||
});
|
||||
describe('fillGradeData selector', () => {
|
||||
|
||||
@@ -62,7 +62,7 @@ const initialState = {
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates the state's gradingData entry for the seleted submission,
|
||||
* Updates the state's gradingData entry for the selected submission,
|
||||
* overlaying the passed data on top of the existing data for the that
|
||||
* submission.
|
||||
* @return {object} - new state
|
||||
@@ -82,7 +82,7 @@ export const updateGradingData = (state, data) => {
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates the given state's gradingData entry for the seleted submission,
|
||||
* Updates the given state's gradingData entry for the selected submission,
|
||||
* overlaying the passed data on top of the existing data for the criterion
|
||||
* at the given index (orderNum) for the rubric.
|
||||
* @return {object} - new state
|
||||
|
||||
@@ -218,7 +218,7 @@ describe('app reducer', () => {
|
||||
describe('setCriterionFeedback', () => {
|
||||
it('loads feedback by orderNum', () => {
|
||||
expect(reducer(testState, actions.setCriterionFeedback(testState, args))).toEqual(
|
||||
mocks.updateCriterion(testState, orderNum, { feecback: testValue }),
|
||||
mocks.updateCriterion(testState, orderNum, { feedback: testValue }),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -21,7 +21,7 @@ export const next = {
|
||||
module.hasNext,
|
||||
),
|
||||
/**
|
||||
* Returns the submissionUUID for the next submission in the selection queu
|
||||
* Returns the submissionUUID for the next submission in the selection queue
|
||||
* @return {string} next submission id (null if there isn't one)
|
||||
*/
|
||||
submissionUUID: createSelector(
|
||||
|
||||
@@ -183,7 +183,7 @@ describe('selected submission grading selectors unit tests', () => {
|
||||
const { userDisplay } = selectors.selected;
|
||||
const username = 'USERname';
|
||||
const teamName = 'teamNAME';
|
||||
it('is a reselect selector based on the username, teamname, and whether the ORA is individual', () => {
|
||||
it('is a reselect selector based on the username, teamName, and whether the ORA is individual', () => {
|
||||
expect(userDisplay.preSelectors).toEqual([
|
||||
appSelectors.ora.isIndividual,
|
||||
selectors.selected.username,
|
||||
|
||||
@@ -32,7 +32,7 @@ validation.criteria = createSelector(
|
||||
criterion.feedback === feedbackRequirement.required
|
||||
&& gradingData.criteria[index].feedback === ''
|
||||
),
|
||||
selectedOption: gradingData.criteria[index].selectedOption !== '',
|
||||
selectedOption: rubricConfig.criteria[index].options.length === 0 || gradingData.criteria[index].selectedOption !== '',
|
||||
})),
|
||||
);
|
||||
|
||||
|
||||
@@ -64,8 +64,8 @@ describe('validation grading selectors unit tests', () => {
|
||||
expect(preSelectors).toEqual([selected.gradingData, appSelectors.rubric.config]);
|
||||
});
|
||||
describe('returned object', () => {
|
||||
const feedbackOptional = { feedback: feedbackRequirement.optional };
|
||||
const feedbackRequired = { feedback: feedbackRequirement.required };
|
||||
const feedbackOptional = { feedback: feedbackRequirement.optional, options: [1] };
|
||||
const feedbackRequired = { feedback: feedbackRequirement.required, options: [1] };
|
||||
describe('feedback', () => {
|
||||
const validFeedback = { feedback: 'Fair' };
|
||||
const emptyFeedback = { feedback: '' };
|
||||
@@ -85,6 +85,14 @@ describe('validation grading selectors unit tests', () => {
|
||||
);
|
||||
expect(output.map(({ selectedOption }) => selectedOption)).toEqual([true, false]);
|
||||
});
|
||||
it('returns true criteria options are empty', () => {
|
||||
const emptyOptionsFeedback = { ...feedbackOptional, options: [] };
|
||||
const output = cb(
|
||||
{ criteria: [{ selectedOption: '' }, { selectedOption: 'Invalid' }] },
|
||||
{ criteria: [emptyOptionsFeedback, emptyOptionsFeedback] },
|
||||
);
|
||||
expect(output.map(({ selectedOption }) => selectedOption)).toEqual([true, true]);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -123,8 +131,8 @@ describe('validation grading selectors unit tests', () => {
|
||||
let show;
|
||||
let criterionFeedback;
|
||||
const selector = selectors.validation.criterionFeedbackIsInvalid;
|
||||
const mockMethods = (showvalue, feedback) => {
|
||||
selectors.validation.show = () => showvalue;
|
||||
const mockMethods = (showValue, feedback) => {
|
||||
selectors.validation.show = () => showValue;
|
||||
selectors.validation.criterionFeedback = () => feedback;
|
||||
};
|
||||
beforeAll(() => {
|
||||
@@ -160,8 +168,8 @@ describe('validation grading selectors unit tests', () => {
|
||||
describe('validation.criterionSelectedOptionIsInvalid selector', () => {
|
||||
const testState = { some: 'state' };
|
||||
let show;
|
||||
const mockMethods = (showvalue, selectedValue) => {
|
||||
selectors.validation.show = () => showvalue;
|
||||
const mockMethods = (showValue, selectedValue) => {
|
||||
selectors.validation.show = () => showValue;
|
||||
selectors.validation.criterionSelectedOption.mockReturnValueOnce(selectedValue);
|
||||
};
|
||||
const selector = selectors.validation.criterionSelectedOptionIsInvalid;
|
||||
|
||||
@@ -72,7 +72,7 @@ describe('requests selectors unit tests', () => {
|
||||
expect(select(selectors.errorCode, { error: { response: { data: testValue } } }))
|
||||
.toEqual(testValue);
|
||||
});
|
||||
test('data reurns the request data', () => {
|
||||
test('data returns the request data', () => {
|
||||
expect(select(selectors.data, { data: testValue })).toEqual(testValue);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -75,7 +75,7 @@ describe('submission selectors unit tests', () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
test('returns gradingStatus as GradeStatus iff lockstatus is lock, else lockStatus', () => {
|
||||
test('returns gradingStatus as GradeStatus iff lockStatus is lock, else lockStatus', () => {
|
||||
expect(output[0].gradingStatus).toEqual(submissions[1].gradeStatus);
|
||||
expect(output[1].gradingStatus).toEqual(submissions[2].lockStatus);
|
||||
expect(output[2].gradingStatus).toEqual(submissions[0].lockStatus);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { StrictDict } from 'utils';
|
||||
|
||||
// eslint-disable-next-line import/no-cycle
|
||||
import { selectors, actions } from 'data/redux';
|
||||
import { locationId } from 'data/constants/app';
|
||||
|
||||
@@ -15,7 +15,7 @@ import * as module from './app';
|
||||
*/
|
||||
export const initialize = () => (dispatch) => {
|
||||
dispatch(initializeApp({
|
||||
locationId,
|
||||
locationId: locationId(),
|
||||
onSuccess: (response) => {
|
||||
dispatch(actions.app.loadIsEnabled(response.isEnabled));
|
||||
dispatch(actions.app.loadOraMetadata(response.oraMetadata));
|
||||
|
||||
@@ -25,7 +25,7 @@ describe('app thunkActions', () => {
|
||||
[[dispatchedAction]] = dispatch.mock.calls;
|
||||
});
|
||||
it('dispatches initializeApp with locationId and onSuccess', () => {
|
||||
expect(dispatchedAction.initializeApp.locationId).toEqual(locationId);
|
||||
expect(dispatchedAction.initializeApp.locationId).toEqual(locationId());
|
||||
expect(typeof dispatchedAction.initializeApp.onSuccess).toEqual('function');
|
||||
});
|
||||
describe('on success', () => {
|
||||
|
||||
@@ -2,6 +2,7 @@ import * as zip from '@zip.js/zip.js';
|
||||
import FileSaver from 'file-saver';
|
||||
|
||||
import { RequestKeys } from 'data/constants/requests';
|
||||
// eslint-disable-next-line import/no-cycle
|
||||
import { selectors } from 'data/redux';
|
||||
import { locationId } from 'data/constants/app';
|
||||
import api from 'data/services/lms/api';
|
||||
@@ -47,7 +48,7 @@ export const zipFiles = async (files, blobs, username) => {
|
||||
}
|
||||
|
||||
const zipFile = await zipWriter.close();
|
||||
const zipName = `${username}-${locationId}.zip`;
|
||||
const zipName = `${username}-${locationId()}.zip`;
|
||||
FileSaver.saveAs(zipFile, zipName);
|
||||
};
|
||||
|
||||
|
||||
@@ -182,7 +182,7 @@ describe('download thunkActions', () => {
|
||||
expect(download.zipFiles).toHaveBeenCalledWith(files, blobs, username);
|
||||
});
|
||||
it('network request catch all of the errors', () => {
|
||||
const blobsErrors = ['arbitary', 'error'];
|
||||
const blobsErrors = ['arbitrary', 'error'];
|
||||
download.downloadBlobs = () => Promise.reject(blobsErrors);
|
||||
|
||||
download.downloadFiles()(dispatch, getState);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { StrictDict } from 'utils';
|
||||
|
||||
// eslint-disable-next-line import/no-cycle
|
||||
import { actions, selectors } from 'data/redux';
|
||||
import { RequestKeys, ErrorStatuses } from 'data/constants/requests';
|
||||
|
||||
@@ -60,7 +60,7 @@ export const loadSubmission = () => (dispatch, getState) => {
|
||||
|
||||
/**
|
||||
* Start grading the current submission.
|
||||
* Attempts to lock the submisison, and on a success, sets the local grading state to
|
||||
* Attempts to lock the submission, and on a success, sets the local grading state to
|
||||
* True, and then loads initializes the grading process with GradeData associated with
|
||||
* the current submission. If there is no grade data, generates an empty grade entry
|
||||
* based on the rubric config.
|
||||
@@ -85,7 +85,7 @@ export const startGrading = () => (dispatch, getState) => {
|
||||
};
|
||||
|
||||
/**
|
||||
* Cancels the grading process for the current submisison.
|
||||
* Cancels the grading process for the current submission.
|
||||
* Releases the lock and dispatches stopGrading on success.
|
||||
*/
|
||||
export const cancelGrading = () => (dispatch, getState) => {
|
||||
|
||||
@@ -24,7 +24,7 @@ jest.mock('data/redux/grading/selectors', () => ({
|
||||
gradeData: jest.fn((state) => ({ gradeData: state })),
|
||||
gradingData: jest.fn((state) => ({ gradingData: state })),
|
||||
isGrading: jest.fn((state) => ({ isGrading: state })),
|
||||
submissionUUID: jest.fn((state) => ({ selectedsubmissionUUID: state })),
|
||||
submissionUUID: jest.fn((state) => ({ selectedSubmissionUUID: state })),
|
||||
lockStatus: jest.fn((state) => ({ lockStatus: state })),
|
||||
},
|
||||
validation: {
|
||||
@@ -62,7 +62,7 @@ describe('grading thunkActions', () => {
|
||||
expect(actionArgs).not.toEqual(undefined);
|
||||
});
|
||||
describe('fetchSubmissionArgs', () => {
|
||||
test('submissionUUID: selectors.grading.selected.submisssionUUID', () => {
|
||||
test('submissionUUID: selectors.grading.selected.submissionUUID', () => {
|
||||
expect(actionArgs.submissionUUID).toEqual(
|
||||
selectedUUID,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { StrictDict } from 'utils';
|
||||
|
||||
// eslint-disable-next-line import/no-cycle
|
||||
import app from './app';
|
||||
import download from './download';
|
||||
import grading from './grading';
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { StrictDict } from 'utils';
|
||||
|
||||
import { RequestKeys } from 'data/constants/requests';
|
||||
// eslint-disable-next-line import/no-cycle
|
||||
import { actions } from 'data/redux';
|
||||
import api from 'data/services/lms/api';
|
||||
|
||||
@@ -50,7 +51,7 @@ export const initializeApp = ({ locationId, ...rest }) => (dispatch) => {
|
||||
|
||||
/**
|
||||
* Tracked fetchSubmissionStatus api method.
|
||||
* Tracked to the `fetchSubmissinStatus` request key.
|
||||
* Tracked to the `fetchSubmissionStatus` request key.
|
||||
* @param {string} submissionUUID - target submission id
|
||||
* @param {[func]} onSuccess - onSuccess method ((response) => { ... })
|
||||
* @param {[func]} onFailure - onFailure method ((error) => { ... })
|
||||
|
||||
@@ -81,7 +81,7 @@ describe('requests thunkActions module', () => {
|
||||
[actions.requests.completeRequest({ requestKey, response: testData })],
|
||||
]);
|
||||
});
|
||||
it('on failure disaptches completeRequest', async () => {
|
||||
it('on failure dispatches completeRequest', async () => {
|
||||
await requests.networkRequest({ requestKey, promise: Promise.reject(testData) })(dispatch);
|
||||
expect(dispatch.mock.calls).toEqual([
|
||||
[actions.requests.startRequest(requestKey)],
|
||||
|
||||
@@ -32,15 +32,15 @@ import {
|
||||
* }
|
||||
*/
|
||||
const initializeApp = () => get(
|
||||
stringifyUrl(urls.oraInitializeUrl, {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
stringifyUrl(urls.oraInitializeUrl(), {
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
}),
|
||||
).then(response => response.data);
|
||||
|
||||
/**
|
||||
* get('/api/submission', { oraLocation, submissionUUID })
|
||||
* @return {
|
||||
* submision: {
|
||||
* submission: {
|
||||
* gradeData,
|
||||
* gradeStatus,
|
||||
* response: { files: [{}], text: <html> },
|
||||
@@ -48,8 +48,8 @@ const initializeApp = () => get(
|
||||
* }
|
||||
*/
|
||||
const fetchSubmission = (submissionUUID) => get(
|
||||
stringifyUrl(urls.fetchSubmissionUrl, {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
stringifyUrl(urls.fetchSubmissionUrl(), {
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
}),
|
||||
).then(response => response.data);
|
||||
@@ -61,8 +61,8 @@ const fetchSubmission = (submissionUUID) => get(
|
||||
* }
|
||||
*/
|
||||
const fetchSubmissionFiles = (submissionUUID) => get(
|
||||
stringifyUrl(urls.fetchSubmissionFilesUrl, {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
stringifyUrl(urls.fetchSubmissionFilesUrl(), {
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
}),
|
||||
).then(response => response.data);
|
||||
@@ -78,8 +78,8 @@ const fetchSubmissionFiles = (submissionUUID) => get(
|
||||
* }
|
||||
*/
|
||||
const fetchSubmissionStatus = (submissionUUID) => get(
|
||||
stringifyUrl(urls.fetchSubmissionStatusUrl, {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
stringifyUrl(urls.fetchSubmissionStatusUrl(), {
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
}),
|
||||
).then(response => response.data);
|
||||
@@ -89,8 +89,8 @@ const fetchSubmissionStatus = (submissionUUID) => get(
|
||||
* @param {string} submissionUUID
|
||||
*/
|
||||
const lockSubmission = (submissionUUID) => post(
|
||||
stringifyUrl(urls.fetchSubmissionLockUrl, {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
stringifyUrl(urls.fetchSubmissionLockUrl(), {
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
}),
|
||||
).then(response => response.data);
|
||||
@@ -100,8 +100,8 @@ const lockSubmission = (submissionUUID) => post(
|
||||
* @param {string} submissionUUID
|
||||
*/
|
||||
const unlockSubmission = (submissionUUID) => client().delete(
|
||||
stringifyUrl(urls.fetchSubmissionLockUrl, {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
stringifyUrl(urls.fetchSubmissionLockUrl(), {
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
}),
|
||||
).then(response => response.data);
|
||||
@@ -112,8 +112,8 @@ const unlockSubmission = (submissionUUID) => client().delete(
|
||||
*/
|
||||
const batchUnlockSubmissions = (submissionUUIDs) => post(
|
||||
stringifyUrl(
|
||||
urls.batchUnlockSubmissionsUrl,
|
||||
{ [paramKeys.oraLocation]: locationId },
|
||||
urls.batchUnlockSubmissionsUrl(),
|
||||
{ [paramKeys.oraLocation]: locationId() },
|
||||
),
|
||||
{ submissionUUIDs },
|
||||
).then(response => response.data);
|
||||
@@ -123,8 +123,8 @@ const batchUnlockSubmissions = (submissionUUIDs) => post(
|
||||
* @param {object} gradeData - full grading submission data
|
||||
*/
|
||||
const updateGrade = (submissionUUID, gradeData) => post(
|
||||
stringifyUrl(urls.updateSubmissionGradeUrl, {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
stringifyUrl(urls.updateSubmissionGradeUrl(), {
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
}),
|
||||
gradeData,
|
||||
|
||||
@@ -13,7 +13,7 @@ jest.mock('./utils', () => ({
|
||||
}));
|
||||
|
||||
jest.mock('data/constants/app', () => ({
|
||||
locationId: 'test-location-id',
|
||||
locationId: () => 'test-location-id',
|
||||
}));
|
||||
|
||||
const gradeData = 'test-grade-data';
|
||||
@@ -37,10 +37,10 @@ const testAPI = ({
|
||||
...otherExpected
|
||||
},
|
||||
}) => {
|
||||
it(`returns ${method}(${urlKey}) with correct args and reoslves with response data`, () => (
|
||||
it(`returns ${method}(${urlKey}) with correct args and resolves with response data`, () => (
|
||||
promise.then((data) => {
|
||||
expect(data[method]).toEqual({
|
||||
url: stringifyUrl(urls[urlKey], urlParams),
|
||||
url: stringifyUrl(urls[urlKey](), urlParams),
|
||||
...otherExpected,
|
||||
});
|
||||
})
|
||||
@@ -54,7 +54,7 @@ describe('lms service api methods', () => {
|
||||
method: methodKeys.get,
|
||||
expected: {
|
||||
urlKey: urlKeys.oraInitializeUrl,
|
||||
urlParams: { [paramKeys.oraLocation]: locationId },
|
||||
urlParams: { [paramKeys.oraLocation]: locationId() },
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -65,7 +65,7 @@ describe('lms service api methods', () => {
|
||||
expected: {
|
||||
urlKey: urlKeys.fetchSubmissionUrl,
|
||||
urlParams: {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
},
|
||||
},
|
||||
@@ -78,7 +78,7 @@ describe('lms service api methods', () => {
|
||||
expected: {
|
||||
urlKey: urlKeys.fetchSubmissionFilesUrl,
|
||||
urlParams: {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
},
|
||||
},
|
||||
@@ -91,7 +91,7 @@ describe('lms service api methods', () => {
|
||||
expected: {
|
||||
urlKey: urlKeys.fetchSubmissionStatusUrl,
|
||||
urlParams: {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
},
|
||||
},
|
||||
@@ -104,7 +104,7 @@ describe('lms service api methods', () => {
|
||||
expected: {
|
||||
urlKey: urlKeys.fetchSubmissionLockUrl,
|
||||
urlParams: {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
},
|
||||
},
|
||||
@@ -117,7 +117,7 @@ describe('lms service api methods', () => {
|
||||
expected: {
|
||||
urlKey: urlKeys.fetchSubmissionLockUrl,
|
||||
urlParams: {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
},
|
||||
},
|
||||
@@ -130,7 +130,7 @@ describe('lms service api methods', () => {
|
||||
expected: {
|
||||
urlKey: urlKeys.batchUnlockSubmissionsUrl,
|
||||
urlParams: {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
},
|
||||
data: { submissionUUIDs },
|
||||
},
|
||||
@@ -143,7 +143,7 @@ describe('lms service api methods', () => {
|
||||
expected: {
|
||||
urlKey: urlKeys.updateSubmissionGradeUrl,
|
||||
urlParams: {
|
||||
[paramKeys.oraLocation]: locationId,
|
||||
[paramKeys.oraLocation]: locationId(),
|
||||
[paramKeys.submissionUUID]: submissionUUID,
|
||||
},
|
||||
data: gradeData,
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
import { StrictDict } from 'utils';
|
||||
import { configuration } from 'config';
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
const baseUrl = `${configuration.LMS_BASE_URL}`;
|
||||
const baseUrl = () => getConfig().LMS_BASE_URL;
|
||||
|
||||
const api = `${baseUrl}/api/`;
|
||||
const baseEsgUrl = `${api}ora_staff_grader/`;
|
||||
const api = () => `${baseUrl()}/api/`;
|
||||
const baseEsgUrl = () => `${api()}ora_staff_grader/`;
|
||||
|
||||
const oraInitializeUrl = `${baseEsgUrl}initialize`;
|
||||
const fetchSubmissionUrl = `${baseEsgUrl}submission`;
|
||||
const fetchSubmissionFilesUrl = `${baseEsgUrl}submission/files`;
|
||||
const fetchSubmissionStatusUrl = `${baseEsgUrl}submission/status`;
|
||||
const fetchSubmissionLockUrl = `${baseEsgUrl}submission/lock`;
|
||||
const batchUnlockSubmissionsUrl = `${baseEsgUrl}submission/batch/unlock`;
|
||||
const updateSubmissionGradeUrl = `${baseEsgUrl}submission/grade`;
|
||||
const oraInitializeUrl = () => `${baseEsgUrl()}initialize`;
|
||||
const fetchSubmissionUrl = () => `${baseEsgUrl()}submission`;
|
||||
const fetchSubmissionFilesUrl = () => `${baseEsgUrl()}submission/files`;
|
||||
const fetchSubmissionStatusUrl = () => `${baseEsgUrl()}submission/status`;
|
||||
const fetchSubmissionLockUrl = () => `${baseEsgUrl()}submission/lock`;
|
||||
const batchUnlockSubmissionsUrl = () => `${baseEsgUrl()}submission/batch/unlock`;
|
||||
const updateSubmissionGradeUrl = () => `${baseEsgUrl()}submission/grade`;
|
||||
|
||||
const course = (courseId) => `${baseUrl}/courses/${courseId}`;
|
||||
const course = (courseId) => `${baseUrl()}/courses/${courseId}`;
|
||||
|
||||
const openResponse = (courseId) => (
|
||||
`${course(courseId)}/instructor#view-open_response_assessment`
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* Simple selector factory.
|
||||
* Takes a list of string keys, and returns a simple slector for each.
|
||||
* Takes a list of string keys, and returns a simple selector for each.
|
||||
*
|
||||
* @function
|
||||
* @param {Object|string[]} keys - If passed as object, Object.keys(keys) is used.
|
||||
|
||||
39
src/i18n/index.js
Normal file
39
src/i18n/index.js
Normal file
@@ -0,0 +1,39 @@
|
||||
import { messages as footerMessages } from '@edx/frontend-component-footer';
|
||||
import { messages as headerMessages } from '@edx/frontend-component-header';
|
||||
import { messages as paragonMessages } from '@edx/paragon';
|
||||
|
||||
import arMessages from './messages/ar.json';
|
||||
import deDEMessages from './messages/de_DE.json';
|
||||
import es419Messages from './messages/es_419.json';
|
||||
import faIRMessages from './messages/fa_IR.json';
|
||||
import frMessages from './messages/fr.json';
|
||||
import frCAMessages from './messages/fr_CA.json';
|
||||
import hiMessages from './messages/hi.json';
|
||||
import itITMessages from './messages/it_IT.json';
|
||||
import ptPTMessages from './messages/pt_PT.json';
|
||||
import ruMessages from './messages/ru.json';
|
||||
import ukMessages from './messages/uk.json';
|
||||
import zhCNMessages from './messages/zh_CN.json';
|
||||
// no need to import en messages-- they are in the defaultMessage field
|
||||
|
||||
const appMessages = {
|
||||
ar: arMessages,
|
||||
'de-de': deDEMessages,
|
||||
'es-419': es419Messages,
|
||||
'fa-ir': faIRMessages,
|
||||
fr: frMessages,
|
||||
'fr-ca': frCAMessages,
|
||||
hi: hiMessages,
|
||||
'it-it': itITMessages,
|
||||
'pt-pt': ptPTMessages,
|
||||
ru: ruMessages,
|
||||
uk: ukMessages,
|
||||
'zh-cn': zhCNMessages,
|
||||
};
|
||||
|
||||
export default [
|
||||
headerMessages,
|
||||
footerMessages,
|
||||
paragonMessages,
|
||||
appMessages,
|
||||
];
|
||||
@@ -1,28 +0,0 @@
|
||||
import arMessages from './messages/ar.json';
|
||||
// no need to import en messages-- they are in the defaultMessage field
|
||||
import es419Messages from './messages/es_419.json';
|
||||
import frMessages from './messages/fr.json';
|
||||
import zhcnMessages from './messages/zh_CN.json';
|
||||
import dedeMessages from './messages/de_DE.json';
|
||||
import frcaMessages from './messages/fr_CA.json';
|
||||
import hiMessages from './messages/hi.json';
|
||||
import ititMessages from './messages/it_IT.json';
|
||||
import ptptMessages from './messages/pt_PT.json';
|
||||
import ruMessages from './messages/ru.json';
|
||||
import ukMessages from './messages/uk.json';
|
||||
|
||||
const messages = {
|
||||
ar: arMessages,
|
||||
'es-419': es419Messages,
|
||||
fr: frMessages,
|
||||
'zh-cn': zhcnMessages,
|
||||
'de-de': dedeMessages,
|
||||
'fr-ca': frcaMessages,
|
||||
hi: hiMessages,
|
||||
'it-it': ititMessages,
|
||||
'pt-pt': ptptMessages,
|
||||
ru: ruMessages,
|
||||
uk: ukMessages,
|
||||
};
|
||||
|
||||
export default messages;
|
||||
105
src/i18n/messages/fa_IR.json
Normal file
105
src/i18n/messages/fa_IR.json
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"ora-grading.demoAlert.warningMessage": "ارسال نمره در حالت نمایشی از ORA Staff Grader جدید غیرفعال است.",
|
||||
"ora-grading.demoAlert.confirm": "تایید",
|
||||
"ora-grading.demoAlert.title": "از ارسال نسخه نمایشی ممانعت به عمل آمد",
|
||||
"ora-grading.FilePopoverContent.filePopoverNameTitle": "نام پرونده",
|
||||
"ora-grading.FilePopoverCellContent.filePopoverDescriptionTitle": "توصیف پرونده",
|
||||
"ora-grading.FilePopoverCellContent.fileSizeTitle": "اندازه پرونده ",
|
||||
"ora-grading.InfoPopover.fileInfo": "اطلاعات پرونده",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.retryButton": "تلاش دوباره",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.fileNotFound": "پرونده یافت نشد",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.unknownError": "خطاهای ناشناخته",
|
||||
"PageTitle": "درجه بندی کارکنان ORA | {siteName}",
|
||||
"ora-grading.InfoPopover.alt-text": "نمایش اطلاعات بیشتر",
|
||||
"ora-grading.CriterionFeedback.addCommentsLabel": "نظردهی",
|
||||
"ora-grading.CriterionFeedback.commentsLabel": "نظرات",
|
||||
"ora-grading.CriterionFeedback.optional": "(اختیاری)",
|
||||
"ora-grading.RadioCriterion.optionPoints": "{points} نمره",
|
||||
"ora-grading.RadioCriterion.rubricSelectedError": "راهنمای امتیازدهی ضروری است",
|
||||
"ora-grading.CriterionFeedback.criterionFeedbackError": "ارائه بازخورد ضروری است",
|
||||
"ora-grading.CTA.feedbackMessage": "از اینکه از تجربه جدید درجهبندی کارکنان ORA استفاده میکنید تشکر می کنیم.",
|
||||
"ora-grading.CTA.linkMessage": "ارائه بازخورد",
|
||||
"ora-grading.CTA.letUsKnowMessage": "و به ما بگویید که نظر شما چیست!",
|
||||
"ora-grading.ReviewModal.demoHeading": "حالت نسخهنمایشی",
|
||||
"ora-grading.ReviewModal.demoMessage": "شما در حال نمایش تجربه جدید رتبهبندی کارکنان ORA هستید. تا زمانی که این ویژگی را فعال نکنید، امکان ارسال نمرات را نخواهید داشت. این مورد به تجربه رتبهبندی پیشفرض در 9 مه (2022/05/09) خواهد شد. برای انتخاب زودهنگام یا انصراف، لطفاً با پشتیبانی تماس بگیرید.",
|
||||
"ora-grading.ListView.ListViewBreadcrumbs.backToResponses": "بازگشت به همه پاسخهای باز",
|
||||
"ora-grading.ListView.noResultsFoundTitle": "اینجا هنوز چیزی نیست",
|
||||
"ora-grading.ListView.noResultsFoundBody": "هنگامی که افراد پاسخها را ارسال کنند، در اینجا ظاهر میشوند",
|
||||
"ora-grading.ListView.viewAllResponses": "مشاهده همه پاسخها",
|
||||
"ora-grading.ListView.viewSelectedResponses": "مشاهده همه پاسخها ({value})",
|
||||
"ora-grading.ListView.tableHeaders.username": "نامکاربری",
|
||||
"ora-grading.ListView.tableHeaders.teamName": "نام تیم",
|
||||
"ora-grading.ListView.tableHeaders.learnerSubmissionDate": "تاریخ ارسال یادگیرنده",
|
||||
"ora-grading.ListView.tableHeaders.teamSubmissionDate": "تاریخ ارسال تیم",
|
||||
"ora-grading.ListView.tableHeaders.grade": "نمره",
|
||||
"ora-grading.ListView.tableHeaders.gradingStatus": "وضعیت نمرهدهی",
|
||||
"ora-grading.ListView.loadErrorHeading": "خطایی در هنگام بارگیری موارد ارسالی رخ داد",
|
||||
"ora-grading.ListView.loadErrorMessage1": "هنگام بارگیری موارد ارسالی برای این پاسخ، خطایی روی داد. صفحه را دوباره بارگیری کنید یا به {backToResponses} بروید.",
|
||||
"ora-grading.ListView.backToResponsesLowercase": "بازگشت به همه پاسخهای باز",
|
||||
"ora-grading.ListView.reloadSubmissions": "بارگیری مجدد موارد ارسالی",
|
||||
"ora-grading.ListView.loadingResponses": "بارگیری پاسخها",
|
||||
"ora-grading.ResponseDisplay.FilePopoverCell.filePopoverNameTitle": "نام پرونده",
|
||||
"ora-grading.ResponseDisplay.FilePopoverCell.filePopoverDescriptionTitle": "توصیف پرونده",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tableNameHeader": "نام",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tableExtensionHeader": "پسوند پرونده",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tablePopoverHeader": "فراداده پرونده",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloadFiles": "پروندههای بارگیریشده",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloading": "در حال بارگیری",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloaded": "بارگیری شد!",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.retryDownload": "تلاش دوباره برای بارگیری",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.submissionFile": "پروندههای ارسالی",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.fileSizeExceed": "از اندازه مجاز بارگیری فراتر رفت",
|
||||
"ora-grading.ReviewActions.overrideConfirmTitle": "آیا از لغو این نمره اطمینان دارید؟",
|
||||
"ora-grading.ReviewActions.overrideConfirmWarning": "این عمل،قابل بازگشت نیست. ممکن است یادگیرنده پیش از این، نمره خود را دریافت کرده باشد.",
|
||||
"ora-grading.ReviewActions.overrideConfirmContinue": "ادامه لغو نمره",
|
||||
"ora-grading.ReviewActions.StartGradingButton.startGrading": "آغاز نمرهدهی",
|
||||
"ora-grading.ReviewActions.StartGradingButton.overrideGrade": "لغو نمره",
|
||||
"ora-grading.ReviewActions.StartGradingButton.stopGrading": "توقف نمرهدهی به این پاسخ",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.override.title": "آیا از توقف لغو نمره اطمینان دارید؟",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.title": "آیا از توقف نمرهدهی این پاسخ اطمینان دارید؟",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.warning": "پیشرفت شما از بین خواهد رفت.",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.override.confirmText": "توقف لغو نمره",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.confirmText": "لغو نمرهدهی",
|
||||
"ora-grading.ReviewActions.goBack": "بازگشت",
|
||||
"ora-grading.ReviewActions.loadPrevious": "بارگیری ارسالی قبل",
|
||||
"ora-grading.ReviewActions.loadNext": "بارگیری ارسالی بعد",
|
||||
"ora-grading.ReviewActions.navigationLabel": "{current} از {total}",
|
||||
"ora-grading.ReviewActions.pointsDisplay": "امتیاز: {pointsEarned}/{pointsPossible}",
|
||||
"ora-grading.ReviewActions.hideRubric": "پنهانسازی راهنمای امتیازدهی",
|
||||
"ora-grading.ReviewActions.showRubric": "نمایش راهنمای امتیازدهی",
|
||||
"ora-grading.ReviewModal.closeReviewConfirm.title": "از بستن این مودال اطمینان دارید؟",
|
||||
"ora-grading.ReviewModal.closeReviewConfirmWarning": "این کار، قابل بازگشت نیست. با این کار، فعالیتهای ذخیرهنشده کنار گذاشته می شوند و این روند رتبهبندی متوقف میشود.",
|
||||
"ora-grading.ReviewModal.goBack": "بازگشت",
|
||||
"ora-grading.ReviewModal.CloseReviewConfirmModal.confirmText": "بستن مودال",
|
||||
"ora-grading.ReviewModal.loadingResponse": "بارگیری پاسخ",
|
||||
"ora-grading.ReviewModal.demoTitleMessage": "نسخهنمایشی بارمبندی",
|
||||
"ora-grading.ReviewModal.loadErrorHeading": "خطایی در هنگام بارگیری موارد ارسالی رخ داد",
|
||||
"ora-grading.ReviewModal.loadErrorMessage1": "هنگام بارگیری این ارسال خطایی روی داد. دوباره ارسال کنید.",
|
||||
"ora-grading.ReviewModal.reloadSubmission": "بارگیری مجدد ارسال",
|
||||
"ora-grading.ReviewModal.gradeNotSubmitted.heading": "نمره ارسال نشد",
|
||||
"ora-grading.ReviewModal.gradeNotSubmitted.Content": "متأسفیم، در هنگام تلاش برای ارسال این نمره، مشکلی پیش آمد. لطفا دوباره تلاش کنید.",
|
||||
"ora-grading.ReviewModal.resubmitGrade": "نمره را دوباره ارسال کنید",
|
||||
"ora-grading.ReviewModal.dismiss": "نادیده بگیر",
|
||||
"ora-grading.ReviewModal.errorSubmittingGrade.Heading": "خطایی در ارسال نمره رخ داد",
|
||||
"ora-grading.ReviewModal.errorSubmittingGrade.Content": "به نظر می رسد اول شخص دیگری به اینجا رسیده است! نمره ارسالی شما رد شدهاست",
|
||||
"ora-grading.ReviewModal.errorLockContestedHeading": "قفل متعلق به کاربر دیگری است",
|
||||
"ora-grading.ReviewModal.errorLockContested": "قفل متعلق به کاربر دیگری است",
|
||||
"ora-grading.ReviewModal.errorLockBadRequestHeading": "درخواست معتبر نیست. لطفا ورودی خود را بررسی کنید.",
|
||||
"ora-grading.ReviewModal.errorLockBadRequest": "درخواست معتبر نیست. لطفا ورودی خود را بررسی کنید.",
|
||||
"ora-grading.ReviewModal.errorDownloadFailed": "امکان بارگیری پروندهها وجود ندارد",
|
||||
"ora-grading.ReviewModal.errorDownloadFailedContent": "متأسفیم، هنگام دانلود این پروندهها مشکلی پیش آمد. لطفا دوباره تلاش کنید.",
|
||||
"ora-grading.ReviewModal.errorRetryDownload": "تلاش دوباره برای بارگیری",
|
||||
"ora-grading.ReviewModal.errorDownloadFailedFiles": "پروندههای ناموفق:",
|
||||
"ora-grading.Rubric.gradeSubmitted": "نمره ارائه شد",
|
||||
"ora-grading.Rubric.rubric": "راهنمای امتیازدهی",
|
||||
"ora-grading.Rubric.submitGrade": "ارائه نمره",
|
||||
"ora-grading.Rubric.submittingGrade": "ارائه نمره",
|
||||
"ora-grading.Rubric.overallComments": "نظرات کلی",
|
||||
"ora-grading.Rubric.addComments": "افزودن نظر (اختیاری)",
|
||||
"ora-grading.Rubric.comments": "نظرات (اختیاری)",
|
||||
"ora-grading.RubricFeedback.error": "ارائه بازخورد کلی ضروری است",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.ungraded": "بدون نمره",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.locked": "اکنون بهدست فرد دیگری نمرهدهی میشود",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.graded": "نمرهدهی تکمیل شد",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.inProgress": "شما در حال ارزیابی و نمرهدهی این پاسخ هستید"
|
||||
}
|
||||
@@ -67,10 +67,10 @@
|
||||
"ora-grading.ReviewActions.pointsDisplay": "Résultat : {pointsEarned}/{pointsPossible}",
|
||||
"ora-grading.ReviewActions.hideRubric": "Masquer la rubrique",
|
||||
"ora-grading.ReviewActions.showRubric": "Afficher la rubrique",
|
||||
"ora-grading.ReviewModal.closeReviewConfirm.title": "Voulez-vous vraiment fermer ce modal?",
|
||||
"ora-grading.ReviewModal.closeReviewConfirm.title": "Voulez-vous vraiment fermer cette fenêtre modale?",
|
||||
"ora-grading.ReviewModal.closeReviewConfirmWarning": "Ça ne peut pas être annulé. Cela supprimera le travail non enregistré et arrêtera ce processus de notation.",
|
||||
"ora-grading.ReviewModal.goBack": "Retour",
|
||||
"ora-grading.ReviewModal.CloseReviewConfirmModal.confirmText": "Fermer Modal",
|
||||
"ora-grading.ReviewModal.CloseReviewConfirmModal.confirmText": "Fermer la fenêtre modale",
|
||||
"ora-grading.ReviewModal.loadingResponse": "Chargement de la réponse",
|
||||
"ora-grading.ReviewModal.demoTitleMessage": "Démonstration de correcteur",
|
||||
"ora-grading.ReviewModal.loadErrorHeading": "Erreur lors du chargement des soumissions",
|
||||
@@ -84,8 +84,8 @@
|
||||
"ora-grading.ReviewModal.errorSubmittingGrade.Content": "Il semble que quelqu'un d'autre soit arrivé le premier! Votre soumission de note a été rejetée",
|
||||
"ora-grading.ReviewModal.errorLockContestedHeading": "La serrure appartenant à un autre utilisateur",
|
||||
"ora-grading.ReviewModal.errorLockContested": "La serrure appartenant à un autre utilisateur",
|
||||
"ora-grading.ReviewModal.errorLockBadRequestHeading": "Requête invalide. Veuillez vérifier votre entrée.",
|
||||
"ora-grading.ReviewModal.errorLockBadRequest": "Requête invalide. Veuillez vérifier votre entrée.",
|
||||
"ora-grading.ReviewModal.errorLockBadRequestHeading": "Demande invalide. Veuillez vérifier votre entrée.",
|
||||
"ora-grading.ReviewModal.errorLockBadRequest": "Demande invalide. Veuillez vérifier votre entrée.",
|
||||
"ora-grading.ReviewModal.errorDownloadFailed": "Impossible de télécharger les fichiers",
|
||||
"ora-grading.ReviewModal.errorDownloadFailedContent": "Nous sommes désolés, une erreur s'est produite lorsque nous avons essayé de télécharger ces fichiers. Veuillez réessayer.",
|
||||
"ora-grading.ReviewModal.errorRetryDownload": "Réessayez le téléchargement",
|
||||
|
||||
@@ -1,105 +1,105 @@
|
||||
{
|
||||
"ora-grading.demoAlert.warningMessage": "Grade submission is disabled in the Demo mode of the new ORA Staff Grader.",
|
||||
"ora-grading.demoAlert.confirm": "Confirm",
|
||||
"ora-grading.demoAlert.title": "Demo submit prevented",
|
||||
"ora-grading.FilePopoverContent.filePopoverNameTitle": "File Name",
|
||||
"ora-grading.FilePopoverCellContent.filePopoverDescriptionTitle": "File Description",
|
||||
"ora-grading.FilePopoverCellContent.fileSizeTitle": "File Size",
|
||||
"ora-grading.InfoPopover.fileInfo": "File info",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.retryButton": "Retry",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.fileNotFound": "File not found",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.unknownError": "Unknown errors",
|
||||
"PageTitle": "ORA staff grading | {siteName}",
|
||||
"ora-grading.InfoPopover.alt-text": "Display more info",
|
||||
"ora-grading.CriterionFeedback.addCommentsLabel": "Add comments",
|
||||
"ora-grading.CriterionFeedback.commentsLabel": "Comments",
|
||||
"ora-grading.CriterionFeedback.optional": "(Optional)",
|
||||
"ora-grading.RadioCriterion.optionPoints": "{points} points",
|
||||
"ora-grading.RadioCriterion.rubricSelectedError": "Rubric selection is required",
|
||||
"ora-grading.CriterionFeedback.criterionFeedbackError": "The feedback is required",
|
||||
"ora-grading.CTA.feedbackMessage": "Thanks for using the new ORA staff grading experience. ",
|
||||
"ora-grading.CTA.linkMessage": "Provide some feedback",
|
||||
"ora-grading.CTA.letUsKnowMessage": " and let us know what you think!",
|
||||
"ora-grading.ReviewModal.demoHeading": "Demo Mode",
|
||||
"ora-grading.ReviewModal.demoMessage": "You are demoing the new ORA staff grading experience. You will be unable to submit grades until you activate the feature. This will become the default grading experience on May 9th (05/09/2022). To opt-in early, or opt-out, please contact Partner Support.",
|
||||
"ora-grading.ListView.ListViewBreadcrumbs.backToResponses": "Back to all open responses",
|
||||
"ora-grading.ListView.noResultsFoundTitle": "Nothing here yet",
|
||||
"ora-grading.ListView.noResultsFoundBody": "When learners submit responses, they will appear here",
|
||||
"ora-grading.ListView.viewAllResponses": "View all responses",
|
||||
"ora-grading.ListView.viewSelectedResponses": "View selected responses ({value})",
|
||||
"ora-grading.ListView.tableHeaders.username": "Username",
|
||||
"ora-grading.ListView.tableHeaders.teamName": "Team name",
|
||||
"ora-grading.ListView.tableHeaders.learnerSubmissionDate": "Learner submission date",
|
||||
"ora-grading.ListView.tableHeaders.teamSubmissionDate": "Team submission date",
|
||||
"ora-grading.ListView.tableHeaders.grade": "Grade",
|
||||
"ora-grading.ListView.tableHeaders.gradingStatus": "Grading status",
|
||||
"ora-grading.ListView.loadErrorHeading": "Error loading submissions",
|
||||
"ora-grading.ListView.loadErrorMessage1": "An error occurred while loading the submissions for this response. Try reloading the page or going {backToResponses}.",
|
||||
"ora-grading.ListView.backToResponsesLowercase": "back to all Open Responses",
|
||||
"ora-grading.ListView.reloadSubmissions": "Reload submissions",
|
||||
"ora-grading.ListView.loadingResponses": "Loading responses",
|
||||
"ora-grading.ResponseDisplay.FilePopoverCell.filePopoverNameTitle": "File Name",
|
||||
"ora-grading.ResponseDisplay.FilePopoverCell.filePopoverDescriptionTitle": "File Description",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tableNameHeader": "Name",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tableExtensionHeader": "File Extension",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tablePopoverHeader": "File Metadata",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloadFiles": "Download files",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloading": "Downloading",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloaded": "Downloaded!",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.retryDownload": "Retry download",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.submissionFile": "Submission Files",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.fileSizeExceed": "Exceeded the allow download size",
|
||||
"ora-grading.ReviewActions.overrideConfirmTitle": "Are you sure you want to override this grade?",
|
||||
"ora-grading.ReviewActions.overrideConfirmWarning": "This cannot be undone. The learner may have already received their grade.",
|
||||
"ora-grading.ReviewActions.overrideConfirmContinue": "Continue grade override",
|
||||
"ora-grading.ReviewActions.StartGradingButton.startGrading": "Start grading",
|
||||
"ora-grading.ReviewActions.StartGradingButton.overrideGrade": "Override grade",
|
||||
"ora-grading.ReviewActions.StartGradingButton.stopGrading": "Stop grading this response",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.override.title": "Are you sure you want to stop grade override?",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.title": "Are you sure you want to stop grading this response?",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.warning": "Your progress will be lost.",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.override.confirmText": "Stop grade override",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.confirmText": "Cancel grading",
|
||||
"ora-grading.ReviewActions.goBack": "Go back",
|
||||
"ora-grading.ReviewActions.loadPrevious": "Load previous submission",
|
||||
"ora-grading.ReviewActions.loadNext": "Load next submission",
|
||||
"ora-grading.ReviewActions.navigationLabel": "{current} of {total}",
|
||||
"ora-grading.ReviewActions.pointsDisplay": "Score: {pointsEarned}/{pointsPossible}",
|
||||
"ora-grading.ReviewActions.hideRubric": "Hide Rubric",
|
||||
"ora-grading.ReviewActions.showRubric": "Show Rubric",
|
||||
"ora-grading.ReviewModal.closeReviewConfirm.title": "Are you sure you want to close this modal?",
|
||||
"ora-grading.ReviewModal.closeReviewConfirmWarning": "This cannot be undone. This will discard unsaved work and stop this grading process.",
|
||||
"ora-grading.ReviewModal.goBack": "Go back",
|
||||
"ora-grading.ReviewModal.CloseReviewConfirmModal.confirmText": "Close Modal",
|
||||
"ora-grading.ReviewModal.loadingResponse": "Loading response",
|
||||
"ora-grading.ReviewModal.demoTitleMessage": "Grading Demo",
|
||||
"ora-grading.ReviewModal.loadErrorHeading": "Error loading submissions",
|
||||
"ora-grading.ReviewModal.loadErrorMessage1": "An error occurred while loading this submission. Try reloading this submission.",
|
||||
"ora-grading.ReviewModal.reloadSubmission": "Reload submission",
|
||||
"ora-grading.ReviewModal.gradeNotSubmitted.heading": "Grade not submitted",
|
||||
"ora-grading.ReviewModal.gradeNotSubmitted.Content": "We're sorry, something went wrong when we tried to submit this grade. Please try again.",
|
||||
"ora-grading.ReviewModal.resubmitGrade": "Resubmit grate",
|
||||
"ora-grading.ReviewModal.dismiss": "Dismiss",
|
||||
"ora-grading.ReviewModal.errorSubmittingGrade.Heading": "Error submitting grade",
|
||||
"ora-grading.ReviewModal.errorSubmittingGrade.Content": "It looks like someone else got here first! Your grade submission has been rejected",
|
||||
"ora-grading.ReviewModal.errorLockContestedHeading": "The lock owned by another user",
|
||||
"ora-grading.ReviewModal.errorLockContested": "The lock owned by another user",
|
||||
"ora-grading.ReviewModal.errorLockBadRequestHeading": "Invalid request. Please check your input.",
|
||||
"ora-grading.ReviewModal.errorLockBadRequest": "Invalid request. Please check your input.",
|
||||
"ora-grading.ReviewModal.errorDownloadFailed": "Couldn't download files",
|
||||
"ora-grading.ReviewModal.errorDownloadFailedContent": "We're sorry, something went wrong when we tried to download these files. Please try again.",
|
||||
"ora-grading.ReviewModal.errorRetryDownload": "Retry download",
|
||||
"ora-grading.ReviewModal.errorDownloadFailedFiles": "Failed files:",
|
||||
"ora-grading.Rubric.gradeSubmitted": "Grade Submitted",
|
||||
"ora-grading.Rubric.rubric": "Rubric",
|
||||
"ora-grading.Rubric.submitGrade": "Submit grade",
|
||||
"ora-grading.Rubric.submittingGrade": "Submitting grade",
|
||||
"ora-grading.Rubric.overallComments": "Overall comments",
|
||||
"ora-grading.Rubric.addComments": "Add comments (Optional)",
|
||||
"ora-grading.Rubric.comments": "Comments (Optional)",
|
||||
"ora-grading.RubricFeedback.error": "The overall feedback is required",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.ungraded": "Ungraded",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.locked": "Currently being graded by someone else",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.graded": "Grading Completed",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.inProgress": "You are currently grading this response"
|
||||
"ora-grading.demoAlert.warningMessage": "A submissão de classificações está desativada no modo Demonstração no novo ORA Staff Grader.",
|
||||
"ora-grading.demoAlert.confirm": "Confirmar",
|
||||
"ora-grading.demoAlert.title": "Submissão impedida no modo de Demonstração",
|
||||
"ora-grading.FilePopoverContent.filePopoverNameTitle": "Nome do ficheiro",
|
||||
"ora-grading.FilePopoverCellContent.filePopoverDescriptionTitle": "Descrição do Ficheiro",
|
||||
"ora-grading.FilePopoverCellContent.fileSizeTitle": "Tamanho do Ficheiro",
|
||||
"ora-grading.InfoPopover.fileInfo": "Informações do Ficheiro",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.retryButton": "Tentar novamente",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.fileNotFound": "Ficheiro não encontrado",
|
||||
"ora-grading.ResponseDisplay.FileRenderer.unknownError": "Erros desconhecidos",
|
||||
"PageTitle": "Classificação pela equipa no ORA {siteName}",
|
||||
"ora-grading.InfoPopover.alt-text": "Mostrar mais informações",
|
||||
"ora-grading.CriterionFeedback.addCommentsLabel": "Adicionar comentários",
|
||||
"ora-grading.CriterionFeedback.commentsLabel": "Comentários",
|
||||
"ora-grading.CriterionFeedback.optional": "(Opcional)",
|
||||
"ora-grading.RadioCriterion.optionPoints": "{points} pontos",
|
||||
"ora-grading.RadioCriterion.rubricSelectedError": "A seleção de rúbricas é necessária",
|
||||
"ora-grading.CriterionFeedback.criterionFeedbackError": "O feedback é obrigatório",
|
||||
"ora-grading.CTA.feedbackMessage": "Obrigado por utilizar a nova experiência de classificação pela equipa do ORA.",
|
||||
"ora-grading.CTA.linkMessage": "Forneça algum tipo de feedback",
|
||||
"ora-grading.CTA.letUsKnowMessage": "e deixe-nos a sua opinião!",
|
||||
"ora-grading.ReviewModal.demoHeading": "Modo de Demonstração",
|
||||
"ora-grading.ReviewModal.demoMessage": "Está a fazer uma demonstração da nova experiência de classificação de equipa do ORA. Não poderá submeter as classificações até ativar a funcionalidade. Esta tornar-se-á a experiência de classificação padrão a 9 de Maio (09/05/2022). Para optar por entrar mais cedo, ou optar por sair, contacte o Apoio ao Parceiro.",
|
||||
"ora-grading.ListView.ListViewBreadcrumbs.backToResponses": "Voltar a todas as respostas abertas",
|
||||
"ora-grading.ListView.noResultsFoundTitle": "Ainda não há aqui nada",
|
||||
"ora-grading.ListView.noResultsFoundBody": "Quando os estudantes submeterem as respostas, elas aparecerão aqui",
|
||||
"ora-grading.ListView.viewAllResponses": "Ver todas as respostas",
|
||||
"ora-grading.ListView.viewSelectedResponses": "Ver as respostas selecionadas ({value})",
|
||||
"ora-grading.ListView.tableHeaders.username": "Nome de utilizador",
|
||||
"ora-grading.ListView.tableHeaders.teamName": "Nome da equipa",
|
||||
"ora-grading.ListView.tableHeaders.learnerSubmissionDate": "Data de submissão do estudante",
|
||||
"ora-grading.ListView.tableHeaders.teamSubmissionDate": "Data de submissão da equipa",
|
||||
"ora-grading.ListView.tableHeaders.grade": "Classificação",
|
||||
"ora-grading.ListView.tableHeaders.gradingStatus": "Estado de classificação",
|
||||
"ora-grading.ListView.loadErrorHeading": "Erro ao carregar as submissões",
|
||||
"ora-grading.ListView.loadErrorMessage1": "Ocorreu um erro ao carregar as submissões para esta resposta. Tente recarregar a página ou ir {backToResponses}.",
|
||||
"ora-grading.ListView.backToResponsesLowercase": "voltar a todas as Respostas Abertas",
|
||||
"ora-grading.ListView.reloadSubmissions": "Recarregar submissões",
|
||||
"ora-grading.ListView.loadingResponses": "A carregar respostas",
|
||||
"ora-grading.ResponseDisplay.FilePopoverCell.filePopoverNameTitle": "Nome do Ficheiro",
|
||||
"ora-grading.ResponseDisplay.FilePopoverCell.filePopoverDescriptionTitle": "Descrição do Ficheiro",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tableNameHeader": "Nome",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tableExtensionHeader": "Extensão do Ficheiro",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.tablePopoverHeader": "Metadados do Ficheiro",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloadFiles": "Transferir ficheiros",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloading": "A transferir",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.downloaded": "Transferido!",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.retryDownload": "Repetir a transferência",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.submissionFile": "Submissão de Ficheiros",
|
||||
"ora-grading.ResponseDisplay.SubmissionFiles.fileSizeExceed": "Excedeu o limite de tamanho de download",
|
||||
"ora-grading.ReviewActions.overrideConfirmTitle": "Tem a certeza de que quer substituir esta classificação?",
|
||||
"ora-grading.ReviewActions.overrideConfirmWarning": "Isto não pode ser desfeito. O estudante pode já ter recebido a sua classificação.",
|
||||
"ora-grading.ReviewActions.overrideConfirmContinue": "Continuar a substituição da classificação",
|
||||
"ora-grading.ReviewActions.StartGradingButton.startGrading": "Iniciar a classificação",
|
||||
"ora-grading.ReviewActions.StartGradingButton.overrideGrade": "Substituir a classificação",
|
||||
"ora-grading.ReviewActions.StartGradingButton.stopGrading": "Parar de classificar esta resposta",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.override.title": "Tem a certeza de que quer parar a substituição da classificação?",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.title": "Tem a certeza de que quer parar de classificar esta resposta?",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.warning": "O seu progresso será perdido.",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.override.confirmText": "Parar a substituição da classificação",
|
||||
"ora-grading.ReviewActions.StopGradingConfirmModal.confirmText": "Cancelar a classificação",
|
||||
"ora-grading.ReviewActions.goBack": "Voltar Atrás",
|
||||
"ora-grading.ReviewActions.loadPrevious": "Carregar a submissão anterior",
|
||||
"ora-grading.ReviewActions.loadNext": "Carregar a próxima submissão",
|
||||
"ora-grading.ReviewActions.navigationLabel": "{current} de {total}",
|
||||
"ora-grading.ReviewActions.pointsDisplay": "Pontuação: {pointsEarned}/{pointsPossible}",
|
||||
"ora-grading.ReviewActions.hideRubric": "Ocultar Rúbrica",
|
||||
"ora-grading.ReviewActions.showRubric": "Mostrar Rúbrica",
|
||||
"ora-grading.ReviewModal.closeReviewConfirm.title": "Tem a certeza de que quer fechar este modal?",
|
||||
"ora-grading.ReviewModal.closeReviewConfirmWarning": "Isto não pode ser desfeito. Isto irá desfazer o trabalho que não guardou e parar este processo de classificação.",
|
||||
"ora-grading.ReviewModal.goBack": "Voltar atrás",
|
||||
"ora-grading.ReviewModal.CloseReviewConfirmModal.confirmText": "Fechar Modal",
|
||||
"ora-grading.ReviewModal.loadingResponse": "A carregar resposta",
|
||||
"ora-grading.ReviewModal.demoTitleMessage": "Demonstração de Avaliação",
|
||||
"ora-grading.ReviewModal.loadErrorHeading": "Erro ao carregar submissões",
|
||||
"ora-grading.ReviewModal.loadErrorMessage1": "Ocorreu um erro ao carregar esta submissão. Tente recarregar esta submissão.",
|
||||
"ora-grading.ReviewModal.reloadSubmission": "Recarregar a submissão",
|
||||
"ora-grading.ReviewModal.gradeNotSubmitted.heading": "Classificação não submetida",
|
||||
"ora-grading.ReviewModal.gradeNotSubmitted.Content": "Lamentamos, algo correu mal quando tentámos submeter esta classificação. Por favor, tente novamente.",
|
||||
"ora-grading.ReviewModal.resubmitGrade": "Voltar a submeter a grelha",
|
||||
"ora-grading.ReviewModal.dismiss": "Ignorar",
|
||||
"ora-grading.ReviewModal.errorSubmittingGrade.Heading": "Erro ao submeter classificação",
|
||||
"ora-grading.ReviewModal.errorSubmittingGrade.Content": "Parece que outra pessoa chegou aqui primeiro! A sua submissão de classificações foi rejeitada",
|
||||
"ora-grading.ReviewModal.errorLockContestedHeading": "O bloqueio pertencente a outro utilizador",
|
||||
"ora-grading.ReviewModal.errorLockContested": "O bloqueio pertencente a outro utilizador",
|
||||
"ora-grading.ReviewModal.errorLockBadRequestHeading": "Pedido inválido. Por favor, verifique a sua entrada.",
|
||||
"ora-grading.ReviewModal.errorLockBadRequest": "Pedido inválido. Por favor, verifique a sua entrada.",
|
||||
"ora-grading.ReviewModal.errorDownloadFailed": "Não foi possível transferir os ficheiros",
|
||||
"ora-grading.ReviewModal.errorDownloadFailedContent": "Lamentamos, mas algo correu mal quando tentámos transferir estes ficheiros. Por favor, tente novamente.",
|
||||
"ora-grading.ReviewModal.errorRetryDownload": "Repetir a transferência",
|
||||
"ora-grading.ReviewModal.errorDownloadFailedFiles": "Ficheiros com falhas:",
|
||||
"ora-grading.Rubric.gradeSubmitted": "Classificação Submetida",
|
||||
"ora-grading.Rubric.rubric": "Rúbrica",
|
||||
"ora-grading.Rubric.submitGrade": "Submeter classificação",
|
||||
"ora-grading.Rubric.submittingGrade": "A submeter classificação",
|
||||
"ora-grading.Rubric.overallComments": "Comentários gerais",
|
||||
"ora-grading.Rubric.addComments": "Adicionar comentários (Opcional)",
|
||||
"ora-grading.Rubric.comments": "Comentários (Opcional)",
|
||||
"ora-grading.RubricFeedback.error": "O comentário geral é obrigatório",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.ungraded": "Não classificado",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.locked": "A ser classificado por outra pessoa neste momento",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.graded": "Avaliação Concluída",
|
||||
"ora-grading.lms-api.gradingStatusDisplay.inProgress": "Está a classificar esta resposta neste momento"
|
||||
}
|
||||
@@ -15,22 +15,15 @@ import {
|
||||
mergeConfig,
|
||||
} from '@edx/frontend-platform';
|
||||
|
||||
import { messages as footerMessages } from '@edx/frontend-component-footer';
|
||||
import { messages as headerMesssages } from '@edx/frontend-component-header';
|
||||
|
||||
import { IntlProvider } from '@edx/frontend-platform/i18n';
|
||||
|
||||
import messages from './i18n';
|
||||
|
||||
import App from './App';
|
||||
|
||||
subscribe(APP_READY, () => {
|
||||
ReactDOM.render(
|
||||
<IntlProvider locale="en">
|
||||
<AppProvider store={store}>
|
||||
<App />
|
||||
</AppProvider>
|
||||
</IntlProvider>,
|
||||
<AppProvider store={store} wrapWithRouter={false}>
|
||||
<App />
|
||||
</AppProvider>,
|
||||
document.getElementById('root'),
|
||||
);
|
||||
});
|
||||
@@ -52,10 +45,6 @@ initialize({
|
||||
}, appName);
|
||||
},
|
||||
},
|
||||
messages: [
|
||||
messages,
|
||||
headerMesssages,
|
||||
footerMessages,
|
||||
],
|
||||
messages,
|
||||
requireAuthenticatedUser: true,
|
||||
});
|
||||
|
||||
@@ -8,10 +8,7 @@ import {
|
||||
subscribe,
|
||||
} from '@edx/frontend-platform';
|
||||
|
||||
import { messages as footerMessages } from '@edx/frontend-component-footer';
|
||||
import { messages as headerMesssages } from '@edx/frontend-component-header';
|
||||
|
||||
import appMessages from './i18n';
|
||||
import messages from './i18n';
|
||||
import * as app from '.';
|
||||
|
||||
jest.mock('react-dom', () => ({
|
||||
@@ -19,10 +16,10 @@ jest.mock('react-dom', () => ({
|
||||
}));
|
||||
|
||||
jest.mock('@edx/frontend-component-footer', () => ({
|
||||
messages: 'frotnend-footer-messages',
|
||||
messages: 'frontend-footer-messages',
|
||||
}));
|
||||
jest.mock('@edx/frontend-component-header', () => ({
|
||||
messages: 'frotnend-header-messages',
|
||||
messages: 'frontend-header-messages',
|
||||
}));
|
||||
|
||||
jest.mock('@edx/frontend-platform', () => ({
|
||||
@@ -70,7 +67,7 @@ describe('app registry', () => {
|
||||
test('initialize is called with footerMessages and requireAuthenticatedUser', () => {
|
||||
expect(initialize).toHaveBeenCalledTimes(1);
|
||||
const initializeArg = initialize.mock.calls[0][0];
|
||||
expect(initializeArg.messages).toEqual([appMessages, headerMesssages, footerMessages]);
|
||||
expect(initializeArg.messages).toEqual(messages);
|
||||
expect(initializeArg.requireAuthenticatedUser).toEqual(true);
|
||||
});
|
||||
test('initialize config loads support url if available', () => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// The code in this file is from Segment's website:
|
||||
// https://segment.com/docs/sources/website/analytics.js/quickstart/
|
||||
import { configuration } from './config';
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
(function () {
|
||||
// Create a queue, but don't obliterate an existing one!
|
||||
@@ -81,5 +81,5 @@ import { configuration } from './config';
|
||||
|
||||
// Load Analytics.js with your key, which will automatically
|
||||
// load the tools you've enabled for your account. Boosh!
|
||||
analytics.load(configuration.SEGMENT_KEY);
|
||||
analytics.load(getConfig().SEGMENT_KEY);
|
||||
}());
|
||||
|
||||
@@ -3,7 +3,7 @@ import '@testing-library/jest-dom';
|
||||
import '@testing-library/jest-dom/extend-expect';
|
||||
|
||||
import Enzyme from 'enzyme';
|
||||
import Adapter from 'enzyme-adapter-react-16';
|
||||
import Adapter from '@wojtekmaj/enzyme-adapter-react-17';
|
||||
|
||||
Enzyme.configure({ adapter: new Adapter() });
|
||||
|
||||
@@ -113,7 +113,7 @@ jest.mock('@edx/paragon/icons', () => ({
|
||||
}));
|
||||
|
||||
jest.mock('data/constants/app', () => ({
|
||||
locationId: 'fake-location-id',
|
||||
locationId: () => 'fake-location-id',
|
||||
}));
|
||||
|
||||
jest.mock('hooks', () => ({
|
||||
|
||||
@@ -40,6 +40,11 @@ jest.mock('@edx/frontend-platform/auth', () => ({
|
||||
getLoginRedirectUrl: jest.fn(),
|
||||
}));
|
||||
|
||||
jest.mock('@edx/frontend-component-header', () => ({
|
||||
LearningHeader: () => 'Header',
|
||||
}));
|
||||
// jest.mock('@edx/frontend-component-footer', () => () => 'Footer');
|
||||
|
||||
jest.mock('react-pdf', () => ({
|
||||
Document: () => <div>Document</div>,
|
||||
Image: () => <div>Image</div>,
|
||||
@@ -186,8 +191,12 @@ const initialize = async () => {
|
||||
* Wait for the review page to show and update the top-level state object.
|
||||
*/
|
||||
const makeTableSelections = async () => {
|
||||
[0, 1, 2, 3, 4].forEach(index => userEvent.click(inspector.listView.listCheckbox(index)));
|
||||
userEvent.click(inspector.listView.selectedBtn(5));
|
||||
[0, 1, 2, 3, 4].forEach(
|
||||
index => userEvent.click(inspector.listView.listCheckbox(index))
|
||||
);
|
||||
|
||||
await inspector.find.listView.selectedBtn(5);
|
||||
await userEvent.click(inspector.listView.selectedBtn(5));
|
||||
// wait for navigation, which will show while request is pending
|
||||
try {
|
||||
await inspector.find.review.prevNav();
|
||||
@@ -213,7 +222,7 @@ describe('ESG app integration tests', () => {
|
||||
inspector = new Inspector(el);
|
||||
});
|
||||
|
||||
test('initialization', async (done) => {
|
||||
test('initialization', async () => {
|
||||
const verifyInitialState = async () => {
|
||||
await waitForRequestStatus(RequestKeys.initialize, RequestStates.pending);
|
||||
const testInitialState = (key) => expect(
|
||||
@@ -275,7 +284,6 @@ describe('ESG app integration tests', () => {
|
||||
|
||||
await makeTableSelections();
|
||||
await waitForRequestStatus(RequestKeys.fetchSubmission, RequestStates.pending);
|
||||
done();
|
||||
});
|
||||
|
||||
describe('initialized', () => {
|
||||
@@ -286,7 +294,7 @@ describe('ESG app integration tests', () => {
|
||||
await waitForRequestStatus(RequestKeys.fetchSubmission, RequestStates.pending);
|
||||
});
|
||||
|
||||
test('initial review state', async (done) => {
|
||||
test('initial review state', async () => {
|
||||
// Make table selection and load Review pane
|
||||
expect(
|
||||
state.grading.selection,
|
||||
@@ -304,10 +312,9 @@ describe('ESG app integration tests', () => {
|
||||
inspector.review.loadingResponse(),
|
||||
'Loading Responses pending state text should be displayed in the ReviewModal',
|
||||
).toBeVisible();
|
||||
done();
|
||||
});
|
||||
|
||||
test('fetch network error and retry', async (done) => {
|
||||
test('fetch network error and retry', async () => {
|
||||
await resolveFns.fetch.networkError();
|
||||
await waitForRequestStatus(RequestKeys.fetchSubmission, RequestStates.failed);
|
||||
expect(
|
||||
@@ -317,10 +324,9 @@ describe('ESG app integration tests', () => {
|
||||
// fetch: retry and succeed
|
||||
await userEvent.click(inspector.review.retryFetchLink());
|
||||
await waitForRequestStatus(RequestKeys.fetchSubmission, RequestStates.pending);
|
||||
done()
|
||||
});
|
||||
|
||||
test('fetch success and nav chain', async (done) => {
|
||||
test('fetch success and nav chain', async () => {
|
||||
let showRubric = false;
|
||||
// fetch: success with chained navigation
|
||||
const verifyFetchSuccess = async (submissionIndex) => {
|
||||
@@ -396,7 +402,6 @@ describe('ESG app integration tests', () => {
|
||||
await userEvent.click(inspector.review.prevNav());
|
||||
await verifyFetchSuccess(i);
|
||||
}
|
||||
done();
|
||||
});
|
||||
|
||||
describe('grading (basic)', () => {
|
||||
@@ -416,7 +421,7 @@ describe('ESG app integration tests', () => {
|
||||
const overallFeedback = 'some overall feedback';
|
||||
|
||||
// Set basic grade and feedback
|
||||
const setGrade = async (done) => {
|
||||
const setGrade = async () => {
|
||||
const {
|
||||
criterionOption,
|
||||
criterionFeedback,
|
||||
@@ -479,26 +484,25 @@ describe('ESG app integration tests', () => {
|
||||
await resolveFns.lock.success();
|
||||
}
|
||||
/*
|
||||
test('submit pending', async (done) => {
|
||||
test('submit pending', async () => {
|
||||
done();
|
||||
});
|
||||
test('submit failed', async (done) => {
|
||||
test('submit failed', async () => {
|
||||
done();
|
||||
});
|
||||
*/
|
||||
test('grade and submit',
|
||||
async (done) => {
|
||||
async () => {
|
||||
expect(await inspector.find.review.submitGradeBtn()).toBeVisible();
|
||||
await setGrade();
|
||||
checkGradingState();
|
||||
await userEvent.click(inspector.review.rubric.submitGradeBtn());
|
||||
await resolveFns.updateGrade.success();
|
||||
checkGradeSuccess();
|
||||
done();
|
||||
},
|
||||
);
|
||||
test('grade, navigate, and return, maintaining gradingState',
|
||||
async (done) => {
|
||||
async () => {
|
||||
expect(await inspector.find.review.submitGradeBtn()).toBeVisible();
|
||||
await setGrade();
|
||||
checkGradingState();
|
||||
@@ -507,7 +511,6 @@ describe('ESG app integration tests', () => {
|
||||
await loadPrev();
|
||||
await waitForEqual(() => getState().grading.activeIndex, 0, 'activeIndex');
|
||||
checkGradingState();
|
||||
done();
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
@@ -92,6 +92,7 @@ class Inspector {
|
||||
return {
|
||||
listView: {
|
||||
viewAllResponsesBtn: () => this.findByText(appMessages.ListView.viewAllResponses),
|
||||
selectedBtn: (num) => this.findByText(`View selected responses (${num})`),
|
||||
loadErrorHeading: () => this.findByText(appMessages.ListView.loadErrorHeading),
|
||||
},
|
||||
review: {
|
||||
|
||||
Reference in New Issue
Block a user