Compare commits

..

19 Commits

Author SHA1 Message Date
Adolfo R. Brandes
3e76a4e606 feat: use frontend-plugin-framework to provide a FooterSlot (#397)
Co-authored-by: Brian Smith <bsmith@axim.org>
2024-06-06 15:05:25 -03:00
Adolfo R. Brandes
75725c16f4 Merge pull request #390 from DmytroAlipov/fix-original-grade-value
fix: Grade value is displayed in the modal
2024-05-01 12:37:00 -03:00
Dima Alipov
d59a4bf54d fix: grade value is displayed in the modal 2024-04-21 13:38:35 +03:00
Adolfo R. Brandes
c3823c39b0 Merge pull request #387 from DmytroAlipov/fix-second-opening-grade
fix: "An unexpected error occurred" after second opening any grade
2024-04-08 14:48:52 -03:00
Adolfo R. Brandes
ef8e20f2b3 Merge pull request #363 from raccoongang/fix/fix-responsive-issues-master
fix: fix sidebar scrolling and adaptation for mobile
2024-04-03 15:27:29 -03:00
Samir Sabri
d683e874b7 feat!: remove Transifex calls for OEP-58 2024-03-18 14:38:42 -04:00
Dima Alipov
4e9270ab8e fix: "An unexpected error occurred" after second opening any grade 2024-03-16 18:57:48 +02:00
Adolfo R. Brandes
6450d8648b Merge pull request #383 from brian-smith-tcril/update-build-paragon
chore(deps): update paragon and frontend-build to openedx scope
2024-02-27 11:46:22 -03:00
Brian Smith
9c7c848df5 chore(deps): update paragon and frontend-build to openedx scope 2024-02-23 14:27:48 -05:00
Omar Al-Ithawi
9ad10108ec feat: tutor-mfe compatiblilty for atlas pull (#379)
- install atlas
 - remove `--filter` to pull all languages by default
 - use ATLAS_OPTIONS to allow custom `--filter`
 - include frontend-platform in `atlas pull`

Refs: FC-0012 OEP-58
2024-02-02 11:15:59 -05:00
Syed Ali Abbas Zaidi
338498543a feat: migrate enzyme to react-unit-test-utils (#378)
* feat: migrate enzyme to react-unit-test-utils

* refactor: remove unnecessary usage of shallow wrapper
2024-01-30 12:31:48 +05:00
Adolfo R. Brandes
788476193c Merge pull request #375 from arbrandes/fix-route
fix: Route with PUBLIC_PATH
2023-12-15 13:23:34 -03:00
Adolfo R. Brandes
cb658776c6 fix: Route with PUBLIC_PATH
Prior to this change, the MFE would fail to render with any PUBLIC_PATH
set.  Because that is now handled entirely by `frontend-platform`, we
can avoid referring to PUBLIC_PATH entirely, here.
2023-12-08 16:32:16 -03:00
Mashal Malik
a4eff6991f refactor: updated README file to reflect template changes (#369) 2023-10-26 08:47:40 -04:00
ihor-romaniuk
f1c9140c8e fix: fix sidebar scrolling and adaptation for mobile
- fix text overload in heading
- fix appearance for sidebar with a short main content
- fix transformation of search and filter button on mobile
- fix extra empty space below main content table
- fix adaptation modal content to mobile view
2023-10-23 15:53:35 +03:00
Feanil Patel
ba9bd466a3 chore: Update to the new version of brand-openedx in the new scope. (#359)
Part of https://github.com/openedx/axim-engineering/issues/23

This updates the `@edx/brand` alias to point to the `brand-openedx` package at
the `openedx` scope. This does not impact imports because this package is used
via an alias.
2023-10-20 17:23:36 -04:00
Mashal Malik
e44f5dde44 refactor: update lock file version (#347) 2023-10-19 10:18:44 +05:00
Syed Ali Abbas Zaidi
d46ce000bb chore: bump frontend-platform (#356) 2023-10-16 13:11:40 +05:00
Muhammad Abdullah Waheed
bf3b37caa4 feat: babel-plugin-react-intl to babel-plugin-formatjs migration (#354)
* feat: babel-plugin-react-intl to babel-plugin-formatjs migration

* fix: upgraded frontend-build to fix security issue
2023-10-11 13:31:57 -04:00
114 changed files with 7508 additions and 7161 deletions

View File

@@ -7,7 +7,6 @@ LOGOUT_URL='http://localhost:18000/login'
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
LOGO_POWERED_BY_OPEN_EDX_URL_SVG=https://edx-cdn.org/v3/stage/open-edx-tag.svg
FAVICON_URL=https://edx-cdn.org/v3/default/favicon.ico
CSRF_TOKEN_API_PATH='/csrf/api/v1/token'
REFRESH_ACCESS_TOKEN_ENDPOINT='http://localhost:18000/login_refresh'

View File

@@ -1,5 +1,5 @@
// eslint-disable-next-line import/no-extraneous-dependencies
const { createConfig } = require('@edx/frontend-build');
const { createConfig } = require('@openedx/frontend-build');
const config = createConfig('eslint', {
rules: {

View File

@@ -10,4 +10,4 @@ on:
jobs:
version-check:
uses: openedx/.github/.github/workflows/lockfileversion-check-v3.yml@master
uses: openedx/.github/.github/workflows/lockfile-check.yml@master

2
.gitignore vendored
View File

@@ -23,3 +23,5 @@ temp/babel-plugin-react-intl
### transifex ###
src/i18n/transifex_input.json
temp
src/i18n/messages/

View File

@@ -1,9 +0,0 @@
[main]
host = https://www.transifex.com
[o:open-edx:p:edx-platform:r:frontend-app-gradebook]
file_filter = src/i18n/messages/<lang>.json
source_file = src/i18n/transifex_input.json
source_lang = en
type = KEYVALUEJSON

View File

@@ -1,18 +1,14 @@
npm-install-%: ## install specified % npm package
npm install $* --save-dev
npm ci $* --save-dev
git add package.json
export TRANSIFEX_RESOURCE = frontend-app-gradebook
transifex_langs = "ar,de,es_419,fa_IR,fr,fr_CA,hi,it,pt,ru,uk,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
tx_url1 = https://www.transifex.com/api/2/project/edx-platform/resource/$(transifex_resource)/translation/en/strings/
tx_url2 = https://www.transifex.com/api/2/project/edx-platform/resource/$(transifex_resource)/source/
# This directory must match .babelrc .
transifex_temp = ./temp/babel-plugin-react-intl
transifex_temp = ./temp/babel-plugin-formatjs
NPM_TESTS=build i18n_extract lint test is-es5
@@ -39,40 +35,20 @@ i18n.concat:
extract_translations: | requirements i18n.extract i18n.concat
# Despite the name, we actually need this target to detect changes in the incoming translated message files as well.
detect_changed_source_translations:
# Checking for changed translations...
git diff --exit-code $(i18n)
# Pushes translations to Transifex. You must run make extract_translations first.
push_translations:
# Pushing strings to Transifex...
tx push -s
# Fetching hashes from Transifex...
./node_modules/@edx/reactifex/bash_scripts/get_hashed_strings_v3.sh
# Writing out comments to file...
$(transifex_utils) $(transifex_temp) --comments --v3-scripts-path
# 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) \
&& atlas pull $(ATLAS_OPTIONS) \
translations/frontend-component-footer/src/i18n/messages:frontend-component-footer \
translations/frontend-component-header/src/i18n/messages:frontend-component-header \
translations/frontend-platform/src/i18n/messages:frontend-platform \
translations/paragon/src/i18n/messages:paragon \
translations/frontend-app-gradebook/src/i18n/messages:frontend-app-gradebook
$(intl_imports) paragon frontend-component-header frontend-component-footer frontend-app-gradebook
endif
$(intl_imports) frontend-platform paragon frontend-component-header frontend-component-footer frontend-app-gradebook
# This target is used by CI.
validate-no-uncommitted-package-lock-changes:

View File

@@ -1,3 +1,5 @@
# frontend-app-gradebook
[![Build Status](https://api.travis-ci.com/edx/frontend-app-gradebook.svg?branch=master)](https://travis-ci.com/edx/frontend-app-gradebook)
[![Codecov](https://img.shields.io/codecov/c/gh/openedx/frontend-app-gradebook)](https://app.codecov.io/gh/openedx/frontend-app-gradebook)
[![npm_version](https://img.shields.io/npm/v/@edx/frontend-app-gradebook.svg)](@edx/frontend-app-gradebook)
@@ -5,7 +7,7 @@
[![license](https://img.shields.io/npm/l/@edx/frontend-app-gradebook.svg)](@edx/frontend-app-gradebook)
[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
# Gradebook
# Purpose
Gradebook allows course staff to view, filter, and override subsection grades for a course. Additionally for Masters courses, Gradebook enables bulk management of subsection grades.
@@ -47,7 +49,8 @@ depending on their needs. Instructors that expect to review grades infrequently
to the problem in question will have a worse UX than the legacy gradebook provides. Instructors that rely on the graphs
generated by the current gradebook might find the lack of autogenerated graphs to be frustrating.
## Quickstart
## Getting Started
### Installation
@@ -55,6 +58,20 @@ To install gradebook into your project:
```
npm i --save @edx/frontend-app-gradebook
```
Cloning and Startup
===================
1. Clone your new repo:
``git clone https://github.com/openedx/frontend-app-gradebook.git``
2. Install npm dependencies:
``cd frontend-app-gradebook && npm install``
3. Start the dev server:
``npm start``
## Running the UI Standalone
@@ -91,6 +108,11 @@ check the ``enabled`` and ``enabled for all courses`` boxes.
numbers for grades. If your gradebook isn't accepting your changes, or the changes aren't resulting in sane,
recalculated grade values, verify you've set all flags correctly.
## Plugins
This MFE can be customized using [Frontend Plugin Framework](https://github.com/openedx/frontend-plugin-framework).
The parts of this MFE that can be customized in that manner are documented [here](/src/plugin-slots).
## Running tests
1. Assuming that you're operating in the context of the edX devstack,
@@ -119,3 +141,57 @@ running gradebook container.
## Authentication with backend API services
See the [`@edx/frontend-auth`](https://github.com/edx-unsupported/frontend-auth) repo for information about securing routes in your application that require user authentication.
License
=======
The code in this repository is licensed under the AGPLv3 unless otherwise
noted.
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.
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-gradebook/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
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/
Reporting Security Issues
=========================
Please do not report security issues in public. Please email security@openedx.org.

View File

@@ -1,3 +1,3 @@
const { createConfig } = require('@edx/frontend-build');
const { createConfig } = require('@openedx/frontend-build');
module.exports = createConfig('babel');

View File

@@ -1,13 +1,10 @@
const { createConfig } = require('@edx/frontend-build');
const { createConfig } = require('@openedx/frontend-build');
module.exports = createConfig('jest', {
setupFilesAfterEnv: [
'<rootDir>/src/setupTest.js',
],
modulePaths: ['<rootDir>/src/'],
snapshotSerializers: [
'enzyme-to-json/serializer',
],
coveragePathIgnorePatterns: [
'src/segment.js',
'src/postcss.config.js',

12630
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@
"scripts": {
"build": "fedx-scripts webpack",
"is-es5": "es-check es5 ./dist/*.js",
"i18n_extract": "BABEL_ENV=i18n fedx-scripts babel src --quiet > /dev/null",
"i18n_extract": "fedx-scripts formatjs extract",
"lint": "fedx-scripts eslint --ext .jsx,.js src/",
"lint-fix": "fedx-scripts eslint --fix --ext .jsx,.js src/",
"prepush": "npm run lint",
@@ -28,12 +28,14 @@
"extends @edx/browserslist-config"
],
"dependencies": {
"@edx/brand": "npm:@edx/brand-openedx@^1.2.0",
"@edx/frontend-component-footer": "12.2.0",
"@edx/frontend-component-header": "4.6.0",
"@edx/frontend-platform": "5.5.4",
"@edx/paragon": "20.45.0",
"@edx/react-unit-test-utils": "1.7.0",
"@edx/brand": "npm:@openedx/brand-openedx@^1.2.2",
"@edx/frontend-component-header": "^5.0.2",
"@edx/frontend-platform": "^7.1.0",
"@edx/openedx-atlas": "^0.6.0",
"@edx/react-unit-test-utils": "^2.0.0",
"@openedx/frontend-plugin-framework": "^1.1.2",
"@openedx/frontend-slot-footer": "^1.0.2",
"@openedx/paragon": "^22.1.1",
"@edx/reactifex": "^2.1.1",
"@fortawesome/fontawesome-svg-core": "^1.2.25",
"@fortawesome/free-brands-svg-icons": "^5.11.2",
@@ -44,8 +46,6 @@
"classnames": "^2.2.6",
"core-js": "3.6.5",
"email-prop-type": "^1.1.7",
"enzyme": "^3.10.0",
"enzyme-to-json": "^3.6.2",
"font-awesome": "4.7.0",
"history": "4.10.1",
"prop-types": "15.8.1",
@@ -68,9 +68,8 @@
},
"devDependencies": {
"@edx/browserslist-config": "^1.1.1",
"@edx/frontend-build": "12.9.3",
"@openedx/frontend-build": "^13.0.28",
"@testing-library/react": "12.1.5",
"@wojtekmaj/enzyme-adapter-react-17": "0.8.0",
"axios": "0.21.2",
"axios-mock-adapter": "^1.17.0",
"es-check": "^2.3.0",

View File

@@ -3,7 +3,7 @@ import { Route, Routes } from 'react-router-dom';
import { AppProvider } from '@edx/frontend-platform/react';
import Footer from '@edx/frontend-component-footer';
import FooterSlot from '@openedx/frontend-slot-footer';
import Header from '@edx/frontend-component-header';
import store from 'data/store';
@@ -24,7 +24,7 @@ const App = () => (
/>
</Routes>
</main>
<Footer logo={process.env.LOGO_POWERED_BY_OPEN_EDX_URL_SVG} />
<FooterSlot />
</div>
</AppProvider>
);

View File

@@ -1,7 +1,7 @@
// frontend-app-*/src/index.scss
@import "~@edx/brand/paragon/fonts";
@import "~@edx/brand/paragon/variables";
@import "~@edx/paragon/scss/core/core";
@import "~@openedx/paragon/scss/core/core";
@import "~@edx/brand/paragon/overrides";
$fa-font-path: "~font-awesome/fonts";

View File

@@ -1,75 +1,63 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { Route, Routes } from 'react-router-dom';
import { AppProvider } from '@edx/frontend-platform/react';
import Footer from '@edx/frontend-component-footer';
import Header from '@edx/frontend-component-header';
import { Route } from 'react-router-dom';
import store from 'data/store';
import GradebookPage from 'containers/GradebookPage';
import App from './App';
import Head from './head/Head';
jest.mock('react-router-dom', () => ({
BrowserRouter: () => 'BrowserRouter',
Route: () => 'Route',
Routes: () => 'Routes',
}));
jest.mock('@edx/frontend-platform/react', () => ({
AppProvider: () => 'AppProvider',
}));
jest.mock('@edx/frontend-component-footer', () => 'Footer');
jest.mock('@edx/frontend-component-footer', () => ({ FooterSlot: 'Footer' }));
jest.mock('data/store', () => 'testStore');
jest.mock('containers/GradebookPage', () => 'GradebookPage');
jest.mock('@edx/frontend-component-header', () => 'Header');
jest.mock('./head/Head', () => 'Head');
const logo = 'fakeLogo.png';
let el;
let secondChild;
describe('App router component', () => {
test('snapshot', () => {
expect(shallow(<App />)).toMatchSnapshot();
expect(shallow(<App />).snapshot).toMatchSnapshot();
});
describe('component', () => {
beforeEach(() => {
process.env.LOGO_POWERED_BY_OPEN_EDX_URL_SVG = logo;
el = shallow(<App />);
secondChild = el.childAt(1);
secondChild = el.instance.children;
});
describe('AppProvider', () => {
test('AppProvider is the parent component, passed the redux store props', () => {
expect(el.type()).toBe(AppProvider);
expect(el.props().store).toEqual(store);
expect(el.instance.type).toBe('AppProvider');
expect(el.instance.props.store).toEqual(store);
});
});
describe('Head', () => {
test('first child of AppProvider', () => {
expect(el.childAt(0).type()).toBe(Head);
expect(el.instance.children[0].type).toBe('Head');
});
});
describe('Router', () => {
test('second child of AppProvider', () => {
expect(secondChild.type()).toBe('div');
expect(secondChild[1].type).toBe('div');
});
test('Header is above/outside-of the routing', () => {
expect(secondChild.childAt(0).type()).toBe(Header);
expect(secondChild.childAt(1).type()).toBe('main');
expect(secondChild[1].children[0].type).toBe('Header');
expect(secondChild[1].children[1].type).toBe('main');
});
test('Routing - GradebookPage is only route', () => {
expect(secondChild.find('main')).toEqual(shallow(
<main>
<Routes>
<Route path="/:courseId" element={<GradebookPage />} />
</Routes>
</main>,
));
expect(secondChild[1].findByType(Route)).toHaveLength(1);
expect(secondChild[1].findByType(Route)[0].props.path).toEqual('/:courseId');
expect(secondChild[1].findByType(Route)[0].props.element.type).toEqual(GradebookPage);
});
});
test('Footer logo drawn from env variable', () => {
expect(secondChild.find(Footer).props().logo).toEqual(logo);
});
});
});

View File

@@ -8,14 +8,14 @@ exports[`App router component snapshot 1`] = `
<div>
<Header />
<main>
<Component>
<Routes>
<Route
element={<GradebookPage />}
path="/:courseId"
/>
</Component>
</Routes>
</main>
<Footer />
<FooterSlot />
</div>
</AppProvider>
`;

View File

@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import { connect } from 'react-redux';
import { Alert } from '@edx/paragon';
import { Alert } from '@openedx/paragon';
import selectors from 'data/selectors';
import messages from './messages';

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { shallow } from 'enzyme';
import { Alert } from '@edx/paragon';
import { shallow } from '@edx/react-unit-test-utils';
import { Alert } from '@openedx/paragon';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import selectors from 'data/selectors';
@@ -12,7 +12,7 @@ jest.mock('@edx/frontend-platform/i18n', () => ({
defineMessages: m => m,
FormattedMessage: () => 'FormattedMessage',
}));
jest.mock('@edx/paragon', () => ({
jest.mock('@openedx/paragon', () => ({
Alert: () => 'Alert',
}));
jest.mock('data/selectors', () => ({
@@ -35,17 +35,17 @@ describe('BulkManagementAlerts', () => {
el = shallow(<BulkManagementAlerts />);
});
test('snapshot - bulkImportError closed, success closed', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('closed danger alert', () => {
expect(el.childAt(0).is(Alert)).toEqual(true);
expect(el.childAt(0).props().show).toEqual(false);
expect(el.childAt(0).props().variant).toEqual('danger');
expect(el.instance.children[0].type).toBe('Alert');
expect(el.instance.findByType(Alert)[0].props.show).toEqual(false);
expect(el.instance.findByType(Alert)[0].props.variant).toEqual('danger');
});
test('closed success alert', () => {
expect(el.childAt(1).is(Alert)).toEqual(true);
expect(el.childAt(1).props().show).toEqual(false);
expect(el.childAt(1).props().variant).toEqual('success');
expect(el.instance.children[1].type).toBe('Alert');
expect(el.instance.findByType(Alert)[1].props.show).toEqual(false);
expect(el.instance.findByType(Alert)[1].props.variant).toEqual('success');
});
});
describe('no errer, no upload success', () => {
@@ -57,19 +57,19 @@ describe('BulkManagementAlerts', () => {
'success alert open with messages.successDialog',
];
test(`snapshot - ${assertions.join(', ')}`, () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('open danger alert with bulkImportError content', () => {
expect(el.childAt(0).is(Alert)).toEqual(true);
expect(el.childAt(0).children().text()).toEqual(errorMessage);
expect(el.childAt(0).props().show).toEqual(true);
expect(el.instance.children[0].type).toBe('Alert');
expect(el.instance.findByType(Alert)[0].children[0].el).toEqual(errorMessage);
expect(el.instance.findByType(Alert)[0].props.show).toEqual(true);
});
test('open success alert with messages.successDialog content', () => {
expect(el.childAt(1).is(Alert)).toEqual(true);
expect(el.childAt(1).children().getElement()).toEqual(
expect(el.instance.children[1].type).toBe('Alert');
expect(el.shallowWrapper.props.children[1].props.children).toEqual(
<FormattedMessage {...messages.successDialog} />,
);
expect(el.childAt(1).props().show).toEqual(true);
expect(el.instance.children[1].props.show).toEqual(true);
});
});
});

View File

@@ -3,7 +3,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { DataTable } from '@edx/paragon';
import { DataTable } from '@openedx/paragon';
import { bulkManagementColumns } from 'data/constants/app';
import selectors from 'data/selectors';

View File

@@ -1,7 +1,7 @@
/* eslint-disable import/no-named-as-default */
import React from 'react';
import { shallow } from 'enzyme';
import { DataTable } from '@edx/paragon';
import { shallow } from '@edx/react-unit-test-utils';
import { DataTable } from '@openedx/paragon';
import selectors from 'data/selectors';
import { bulkManagementColumns } from 'data/constants/app';
@@ -9,7 +9,7 @@ import { bulkManagementColumns } from 'data/constants/app';
import ResultsSummary from './ResultsSummary';
import { HistoryTable, mapStateToProps } from './HistoryTable';
jest.mock('@edx/paragon', () => ({ DataTable: () => 'DataTable' }));
jest.mock('@openedx/paragon', () => ({ DataTable: () => 'DataTable' }));
jest.mock('@edx/frontend-platform/i18n', () => ({
defineMessages: m => m,
@@ -56,12 +56,12 @@ describe('HistoryTable', () => {
el = shallow(<HistoryTable {...props} />);
});
test('snapshot - loads formatted table', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
describe('history table', () => {
let table;
beforeEach(() => {
table = el.find(DataTable);
table = el.instance.findByType(DataTable);
});
describe('data (from bulkManagementHistory.map(this.formatHistoryRow)', () => {
const fieldAssertions = [
@@ -70,10 +70,10 @@ describe('HistoryTable', () => {
'forwards the rest',
];
test(`snapshot: ${fieldAssertions.join(', ')}`, () => {
expect(table.props().data).toMatchSnapshot();
expect(table[0].props.data).toMatchSnapshot();
});
test(fieldAssertions.join(', '), () => {
const rows = table.props().data;
const rows = table[0].props.data;
expect(rows[0].resultsSummary).toEqual(<ResultsSummary {...entry1.resultsSummary} />);
expect(rows[0].user).toEqual(<span className="wrap-text-in-cell">{entry1.user}</span>);
expect(
@@ -87,7 +87,7 @@ describe('HistoryTable', () => {
});
});
test('columns from bulkManagementColumns', () => {
expect(table.props().columns).toEqual(bulkManagementColumns);
expect(table[0].props.columns).toEqual(bulkManagementColumns);
});
});
});

View File

@@ -2,8 +2,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Hyperlink, Icon } from '@edx/paragon';
import { Download } from '@edx/paragon/icons';
import { Hyperlink, Icon } from '@openedx/paragon';
import { Download } from '@openedx/paragon/icons';
import lms from 'data/services/lms';

View File

@@ -1,17 +1,16 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { Icon } from '@edx/paragon';
import { Download } from '@edx/paragon/icons';
import { Download } from '@openedx/paragon/icons';
import lms from 'data/services/lms';
import ResultsSummary from './ResultsSummary';
jest.mock('@edx/paragon', () => ({
jest.mock('@openedx/paragon', () => ({
Hyperlink: () => 'Hyperlink',
Icon: () => 'Icon',
}));
jest.mock('@edx/paragon/icons', () => ({
jest.mock('@openedx/paragon/icons', () => ({
Download: 'DownloadIcon',
}));
jest.mock('data/services/lms', () => ({
@@ -35,19 +34,19 @@ describe('ResultsSummary component', () => {
el = shallow(<ResultsSummary {...props} />);
});
test(`snapshot - ${assertions.join(', ')}`, () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('Hyperlink has target="_blank" and rel="noopener noreferrer"', () => {
expect(el.props().target).toEqual('_blank');
expect(el.props().rel).toEqual('noopener noreferrer');
expect(el.instance.props.target).toEqual('_blank');
expect(el.instance.props.rel).toEqual('noopener noreferrer');
});
test('Hyperlink has href to bulkGradesUrl', () => {
expect(el.props().href).toEqual(lms.urls.bulkGradesUrlByRow(props.rowId));
expect(el.instance.props.href).toEqual(lms.urls.bulkGradesUrlByRow(props.rowId));
});
test('displays Download Icon and text', () => {
const icon = el.childAt(0);
expect(icon.is(Icon)).toEqual(true);
expect(icon.props().src).toEqual(Download);
expect(el.childAt(1).text()).toEqual(props.text);
const icon = el.instance.children[0];
expect(icon.type).toEqual('Icon');
expect(icon.props.src).toEqual(Download);
expect(el.instance.children[1].el).toEqual(props.text);
});
});

View File

@@ -1,6 +1,6 @@
/* eslint-disable import/no-named-as-default */
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import { BulkManagementHistoryView } from '.';
@@ -24,20 +24,23 @@ describe('BulkManagementHistoryView', () => {
'<HistoryTable />',
];
test(`snapshot - loads ${snapshotSegments.join(', ')}`, () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('heading - h4 loaded from messages', () => {
const heading = el.find('h4');
expect(heading.getElement()).toEqual((
const heading = el.instance.findByType('h4')[0];
const expectedHeading = shallow(
<h4>
<FormattedMessage {...messages.heading} />
</h4>
));
</h4>,
);
expect(heading.el.type).toEqual(expectedHeading.type);
expect(heading.el.props).toEqual(expectedHeading.props);
});
test('heading, then alerts, then upload form, then table', () => {
expect(el.childAt(0).is('h4')).toEqual(true);
expect(el.childAt(2).is(BulkManagementAlerts)).toEqual(true);
expect(el.childAt(3).is(HistoryTable)).toEqual(true);
expect(el.instance.children[0].type).toEqual('h4');
expect(el.instance.children[2].type).toEqual(BulkManagementAlerts);
expect(el.instance.children[3].type).toEqual(HistoryTable);
});
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { Hyperlink } from '@edx/paragon';
import { Hyperlink } from '@openedx/paragon';
import { getConfig } from '@edx/frontend-platform';
/**

View File

@@ -1,11 +1,11 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { getConfig } from '@edx/frontend-platform';
import Header from '.';
jest.mock('@edx/paragon', () => ({
jest.mock('@openedx/paragon', () => ({
Hyperlink: () => 'Hyperlink',
}));
jest.mock('@edx/frontend-platform', () => ({
@@ -16,6 +16,6 @@ describe('Header', () => {
test('snapshot - has edx link with logo url', () => {
const url = 'www.ourLogo.url';
getConfig.mockReturnValue({ LOGO_URL: url });
expect(shallow(<Header />)).toMatchSnapshot();
expect(shallow(<Header />).snapshot).toMatchSnapshot();
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import SelectGroup from '../SelectGroup';
@@ -38,10 +38,10 @@ describe('AssignmentFilter component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('filter options', () => {
const { options } = el.find(SelectGroup).props();
const { options } = el.instance.findByType(SelectGroup)[0].props;
expect(options.length).toEqual(5);
const testOption = assignmentFilterOptions[0];
const optionProps = options[1].props;

View File

@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import useAssignmentGradeFilterData from './hooks';
import messages from '../messages';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import PercentGroup from '../PercentGroup';
import useAssignmentGradeFilterData from './hooks';
@@ -37,20 +37,20 @@ describe('AssignmentFilter component', () => {
describe('render', () => {
describe('with selected assignment', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
it('renders a PercentGroup for both Max and Min filters', () => {
let props = el.find(PercentGroup).at(0).props();
let { props } = el.instance.findByType(PercentGroup)[0];
expect(props.value).toEqual(hookData.assignmentGradeMin);
expect(props.disabled).toEqual(false);
expect(props.onChange).toEqual(hookData.handleSetMin);
props = el.find(PercentGroup).at(1).props();
props = el.instance.findByType(PercentGroup)[1].props;
expect(props.value).toEqual(hookData.assignmentGradeMax);
expect(props.disabled).toEqual(false);
expect(props.onChange).toEqual(hookData.handleSetMax);
});
it('renders a submit button', () => {
const props = el.find(Button).props();
const { props } = el.instance.findByType(Button)[0];
expect(props.disabled).toEqual(false);
expect(props.onClick).toEqual(hookData.handleSubmit);
});
@@ -64,12 +64,12 @@ describe('AssignmentFilter component', () => {
el = shallow(<AssignmentFilter updateQueryParams={updateQueryParams} />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
it('disables controls', () => {
let props = el.find(PercentGroup).at(0).props();
let { props } = el.instance.findByType(PercentGroup)[0];
expect(props.disabled).toEqual(true);
props = el.find(PercentGroup).at(1).props();
props = el.instance.findByType(PercentGroup)[1].props;
expect(props.disabled).toEqual(true);
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import SelectGroup from '../SelectGroup';
@@ -34,10 +34,10 @@ describe('AssignmentFilterType component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('filter options', () => {
const { options } = el.find(SelectGroup).props();
const { options } = el.instance.findByType(SelectGroup)[0].props;
expect(options.length).toEqual(5);
const optionProps = options[1].props;
expect(optionProps.value).toEqual(assignmentTypes[0]);

View File

@@ -1,6 +1,6 @@
import PropTypes from 'prop-types';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
import messages from '../messages';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import PercentGroup from '../PercentGroup';
import useCourseGradeFilterData from './hooks';
@@ -42,18 +42,18 @@ describe('CourseFilter component', () => {
describe('render', () => {
describe('with selected assignment', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
it('renders a PercentGroup for both Max and Min filters', () => {
let props = el.find(PercentGroup).at(0).props();
let { props } = el.instance.findByType(PercentGroup)[0];
expect(props.value).toEqual(hookData.min.value);
expect(props.onChange).toEqual(hookData.min.onChange);
props = el.find(PercentGroup).at(1).props();
props = el.instance.findByType(PercentGroup)[1].props;
expect(props.value).toEqual(hookData.max.value);
expect(props.onChange).toEqual(hookData.max.onChange);
});
it('renders a submit button', () => {
const props = el.find(Button).props();
const { props } = el.instance.findByType(Button)[0];
expect(props.disabled).toEqual(false);
expect(props.onClick).toEqual(hookData.handleApplyClick);
});
@@ -64,10 +64,10 @@ describe('CourseFilter component', () => {
el = shallow(<CourseFilter updateQueryParams={updateQueryParams} />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
it('disables submit', () => {
const props = el.find(Button).props();
const { props } = el.instance.findByType(Button)[0];
expect(props.disabled).toEqual(true);
});
});

View File

@@ -2,7 +2,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
const PercentGroup = ({
id,

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import PercentGroup from './PercentGroup';
@@ -22,11 +22,11 @@ describe('PercentGroup', () => {
describe('snapshots', () => {
test('basic snapshot', () => {
const el = shallow(<PercentGroup {...props} />);
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('disabled', () => {
const el = shallow(<PercentGroup {...props} disabled />);
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});
});

View File

@@ -2,7 +2,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
const SelectGroup = ({
id,

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import SelectGroup from './SelectGroup';
@@ -27,11 +27,11 @@ describe('SelectGroup', () => {
describe('snapshots', () => {
test('basic snapshot', () => {
const el = shallow(<SelectGroup {...props} />);
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('disabled', () => {
const el = shallow(<SelectGroup {...props} disabled />);
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import SelectGroup from '../SelectGroup';
@@ -48,14 +48,14 @@ describe('StudentGroupsFilter component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('track options', () => {
const {
options,
onChange,
value,
} = el.find(SelectGroup).at(0).props();
} = el.instance.findByType(SelectGroup)[0].props;
expect(value).toEqual(props.tracks.value);
expect(onChange).toEqual(props.tracks.handleChange);
expect(options.length).toEqual(5);
@@ -70,7 +70,7 @@ describe('StudentGroupsFilter component', () => {
onChange,
disabled,
value,
} = el.find(SelectGroup).at(1).props();
} = el.instance.findByType(SelectGroup)[1].props;
expect(value).toEqual(props.cohorts.value);
expect(disabled).toEqual(false);
expect(onChange).toEqual(props.cohorts.handleChange);

View File

@@ -6,8 +6,8 @@ import {
Icon,
IconButton,
Form,
} from '@edx/paragon';
import { Close } from '@edx/paragon/icons';
} from '@openedx/paragon';
import { Close } from '@openedx/paragon/icons';
import { useIntl } from '@edx/frontend-platform/i18n';
import messages from './messages';

View File

@@ -1,8 +1,8 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Collapsible } from '@edx/paragon';
import { Collapsible } from '@openedx/paragon';
import { formatMessage } from 'testUtils';
@@ -49,10 +49,10 @@ describe('GradebookFilters', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('Assignment filters', () => {
expect(el.find(Collapsible).at(0).children()).toMatchObject(shallow(
expect(el.instance.findByType(Collapsible)[0].children[0]).toMatchObject(shallow(
<div>
<AssignmentTypeFilter updateQueryParams={updateQueryParams} />
<AssignmentFilter updateQueryParams={updateQueryParams} />
@@ -61,22 +61,22 @@ describe('GradebookFilters', () => {
));
});
test('CourseGrade filters', () => {
expect(el.find(Collapsible).at(1).children()).toMatchObject(shallow(
expect(el.instance.findByType(Collapsible)[1].children[0]).toMatchObject(shallow(
<CourseGradeFilter updateQueryParams={updateQueryParams} />,
));
});
test('StudentGroups filters', () => {
expect(el.find(Collapsible).at(2).children()).toMatchObject(shallow(
expect(el.instance.findByType(Collapsible)[2].children[0]).toMatchObject(shallow(
<StudentGroupsFilter updateQueryParams={updateQueryParams} />,
));
});
test('includeCourseTeamMembers', () => {
const checkbox = el.find(Collapsible).at(3).children();
expect(checkbox.props()).toEqual({
const checkbox = el.instance.findByType(Collapsible)[3].children[0];
expect(checkbox.props).toEqual({
checked: true,
onChange: hookProps.includeCourseTeamMembers.handleChange,
children: formatMessage(messages.includeCourseTeamMembers),
});
expect(checkbox.children[0].el).toEqual(formatMessage(messages.includeCourseTeamMembers));
});
});
});

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import { instructorDashboardUrl } from 'data/services/lms/urls';
import useGradebookHeaderData from './hooks';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import { formatMessage } from 'testUtils';
import { instructorDashboardUrl } from 'data/services/lms/urls';
@@ -40,7 +40,7 @@ describe('GradebookHeader component', () => {
describe('render', () => {
describe('default view', () => {
test('shapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});
describe('show bulk management', () => {
@@ -49,10 +49,10 @@ describe('GradebookHeader component', () => {
el = shallow(<GradebookHeader />);
});
test('snapshot: show toggle view message button with handleToggleViewClick method', () => {
expect(el).toMatchSnapshot();
const { onClick, children } = el.find(Button).props();
expect(el.snapshot).toMatchSnapshot();
const { onClick } = el.instance.findByType(Button)[0].props;
expect(onClick).toEqual(hookProps.handleToggleViewClick);
expect(children).toEqual(formatMessage(hookProps.toggleViewMessage));
expect(el.instance.findByType(Button)[0].children[0].el).toEqual(formatMessage(hookProps.toggleViewMessage));
});
});
describe('frozen grades', () => {
@@ -61,7 +61,7 @@ describe('GradebookHeader component', () => {
el = shallow(<GradebookHeader />);
});
test('snapshot: show frozen warning', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});
describe('user cannot view gradebook', () => {
@@ -70,7 +70,7 @@ describe('GradebookHeader component', () => {
el = shallow(<GradebookHeader />);
});
test('snapshot: show unauthorized warning', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import useBulkManagementControlsData from './hooks';
import BulkManagementControls from '.';
@@ -22,7 +22,7 @@ describe('BulkManagementControls', () => {
});
describe('render', () => {
test('snapshot - show - network and import buttons', () => {
expect(shallow(<BulkManagementControls />)).toMatchSnapshot();
expect(shallow(<BulkManagementControls />).snapshot).toMatchSnapshot();
});
test('snapshot - empty if show is not truthy', () => {
useBulkManagementControlsData.mockReturnValueOnce({ ...hookProps, show: false });

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import HistoryHeader from './HistoryHeader';
@@ -11,7 +11,7 @@ describe('HistoryHeader', () => {
};
describe('Component', () => {
test('snapshot', () => {
expect(shallow(<HistoryHeader {...props} />)).toMatchSnapshot();
expect(shallow(<HistoryHeader {...props} />).snapshot).toMatchSnapshot();
});
});
});

View File

@@ -22,7 +22,7 @@ export const HistoryKeys = StrictDict({
*/
export const ModalHeaders = () => {
const { assignmentName, updateUserName } = selectors.app.useModalData();
const { currentGrade, originalGrade } = selectors.grades.useGradeData();
const { gradeOverrideCurrentEarnedGradedOverride, gradeOriginalEarnedGraded } = selectors.grades.useGradeData();
const { formatMessage } = useIntl();
return (
<div>
@@ -39,12 +39,12 @@ export const ModalHeaders = () => {
<HistoryHeader
id={HistoryKeys.originalGrade}
label={formatMessage(messages.originalGradeHeader)}
value={originalGrade}
value={gradeOriginalEarnedGraded}
/>
<HistoryHeader
id={HistoryKeys.currentGrade}
label={formatMessage(messages.currentGradeHeader)}
value={currentGrade}
value={gradeOverrideCurrentEarnedGradedOverride}
/>
</div>
);

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { selectors } from 'data/redux/hooks';
@@ -25,8 +25,8 @@ const modalData = {
};
selectors.app.useModalData.mockReturnValue(modalData);
const gradeData = {
currentGrade: 'test-current-grade',
originalGrade: 'test-original-grade',
gradeOverrideCurrentEarnedGradedOverride: 'test-current-grade',
gradeOriginalEarnedGraded: 'test-original-grade',
};
selectors.grades.useGradeData.mockReturnValue(gradeData);
@@ -47,10 +47,10 @@ describe('ModalHeaders', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('assignment header', () => {
const headerProps = el.find(HistoryHeader).at(0).props();
const headerProps = el.instance.findByType(HistoryHeader)[0].props;
expect(headerProps).toMatchObject({
id: HistoryKeys.assignment,
label: formatMessage(messages.assignmentHeader),
@@ -58,7 +58,7 @@ describe('ModalHeaders', () => {
});
});
test('student header', () => {
const headerProps = el.find(HistoryHeader).at(1).props();
const headerProps = el.instance.findByType(HistoryHeader)[1].props;
expect(headerProps).toMatchObject({
id: HistoryKeys.student,
label: formatMessage(messages.studentHeader),
@@ -66,19 +66,19 @@ describe('ModalHeaders', () => {
});
});
test('originalGrade header', () => {
const headerProps = el.find(HistoryHeader).at(2).props();
const headerProps = el.instance.findByType(HistoryHeader)[2].props;
expect(headerProps).toMatchObject({
id: HistoryKeys.originalGrade,
label: formatMessage(messages.originalGradeHeader),
value: gradeData.originalGrade,
value: gradeData.gradeOriginalEarnedGraded,
});
});
test('currentGrade header', () => {
const headerProps = el.find(HistoryHeader).at(3).props();
const headerProps = el.instance.findByType(HistoryHeader)[3].props;
expect(headerProps).toMatchObject({
id: HistoryKeys.currentGrade,
label: formatMessage(messages.currentGradeHeader),
value: gradeData.currentGrade,
value: gradeData.gradeOverrideCurrentEarnedGradedOverride,
});
});
});

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import useAdjustedGradeInputData from './hooks';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import useAdjustedGradeInputData from './hooks';
import AdjustedGradeInput from '.';
@@ -28,11 +28,11 @@ describe('AdjustedGradeInput component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
const control = el.find(Form.Control);
expect(control.props().value).toEqual(hookProps.value);
expect(control.props().onChange).toEqual(hookProps.onChange);
expect(el.contains(hookProps.hintText)).toEqual(true);
expect(el.snapshot).toMatchSnapshot();
const control = el.instance.findByType(Form.Control)[0];
expect(control.props.value).toEqual(hookProps.value);
expect(control.props.onChange).toEqual(hookProps.onChange);
expect(el.instance.children[1].el).toContain(hookProps.hintText);
});
});
});

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import useReasonInputData from './hooks';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import useReasonInputData from './hooks';
import ReasonInput from '.';
@@ -28,10 +28,10 @@ describe('ReasonInput component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
const control = el.find(Form.Control);
expect(control.props().value).toEqual(hookProps.value);
expect(control.props().onChange).toEqual(hookProps.onChange);
expect(el.snapshot).toMatchSnapshot();
const control = el.instance.findByType(Form.Control)[0];
expect(control.props.value).toEqual(hookProps.value);
expect(control.props.onChange).toEqual(hookProps.onChange);
});
});
});

View File

@@ -5,7 +5,7 @@ import useReasonInputData from './hooks';
import ReasonInput, { controlTestId } from '.';
jest.unmock('react');
jest.unmock('@edx/paragon');
jest.unmock('@openedx/paragon');
jest.mock('./hooks', () => ({ __esModule: true, default: jest.fn() }));
const focus = jest.fn();

View File

@@ -20,6 +20,6 @@ exports[`OverrideTable component render snapshot 1`] = `
},
]
}
itemCount={3}
itemCount={2}
/>
`;

View File

@@ -1,7 +1,7 @@
/* eslint-disable react/sort-comp, react/button-has-type, import/no-named-as-default */
import React from 'react';
import { DataTable } from '@edx/paragon';
import { DataTable } from '@openedx/paragon';
import { formatDateForDisplay } from 'utils';
@@ -20,20 +20,18 @@ export const OverrideTable = () => {
if (hide) { return null; }
const tableData = [
...data,
{
adjustedGrade: <AdjustedGradeInput />,
date: formatDateForDisplay(new Date()),
reason: <ReasonInput />,
},
];
return (
<DataTable
columns={columns}
data={tableData}
itemCount={tableData.length}
data={[
...data,
{
adjustedGrade: <AdjustedGradeInput />,
date: formatDateForDisplay(new Date()),
reason: <ReasonInput />,
},
]}
itemCount={data.length}
/>
);
};

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { DataTable } from '@edx/paragon';
import { DataTable } from '@openedx/paragon';
import { formatDateForDisplay } from 'utils';
@@ -48,10 +48,10 @@ describe('OverrideTable component', () => {
expect(el.isEmptyRender()).toEqual(true);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
const table = el.find(DataTable);
expect(table.props().columns).toEqual(hookProps.columns);
const data = [...table.props().data];
expect(el.snapshot).toMatchSnapshot();
const table = el.instance.findByType(DataTable)[0];
expect(table.props.columns).toEqual(hookProps.columns);
const data = [...table.props.data];
const inputRow = data.pop();
const formattedDate = formatDateForDisplay(new Date());
expect(data).toEqual(hookProps.data);

View File

@@ -5,7 +5,7 @@ import {
Alert,
ModalDialog,
ActionRow,
} from '@edx/paragon';
} from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
import OverrideTable from './OverrideTable';

View File

@@ -1,10 +1,10 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import {
ActionRow,
ModalDialog,
} from '@edx/paragon';
} from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
import { formatMessage } from 'testUtils';
@@ -43,60 +43,56 @@ describe('EditModal component', () => {
});
describe('render', () => {
test('modal props', () => {
const modalProps = el.find(ModalDialog).props();
const modalProps = el.instance.findByType(ModalDialog)[0].props;
expect(modalProps.title).toEqual(formatMessage(messages.title));
expect(modalProps.isOpen).toEqual(hookProps.isOpen);
expect(modalProps.onClose).toEqual(hookProps.onClose);
});
const loadBody = () => {
const body = el.find(ModalDialog).children().at(0);
const children = body.find('div').children();
const body = el.instance.findByType(ModalDialog)[0].children[0];
const { children } = body.children[0];
return { body, children };
};
const testBody = () => {
test('type', () => {
const { body } = loadBody();
expect(body.type()).toEqual('ModalDialog.Body');
expect(body.type).toEqual('ModalDialog.Body');
});
test('headers row', () => {
const { children } = loadBody();
expect(children.at(0)).toMatchObject(shallow(<ModalHeaders />));
expect(children[0]).toMatchObject(shallow(<ModalHeaders />));
});
test('table row', () => {
const { children } = loadBody();
expect(children.at(2)).toMatchObject(shallow(<OverrideTable />));
expect(children[2]).toMatchObject(shallow(<OverrideTable />));
});
test('messages', () => {
const { children } = loadBody();
expect(
children.at(3).contains(formatMessage(messages.visibility)),
).toEqual(true);
expect(
children.at(4).contains(formatMessage(messages.saveVisibility)),
).toEqual(true);
expect(children[3].children[0].el).toEqual(formatMessage(messages.visibility));
expect(children[4].children[0].el).toEqual(formatMessage(messages.saveVisibility));
});
};
const testFooter = () => {
let footer;
beforeEach(() => {
footer = el.find(ModalDialog).children().at(1);
footer = el.instance.findByType(ModalDialog)[0].children;
});
test('type', () => {
expect(footer.type()).toEqual('ModalDialog.Footer');
expect(footer[1].type).toEqual('ModalDialog.Footer');
});
test('contains action row', () => {
expect(footer.children().at(0).type()).toEqual('ActionRow');
expect(footer[1].children[0].type).toEqual('ActionRow');
});
test('close button', () => {
const button = footer.find(ActionRow).children().at(0);
expect(button.contains(formatMessage(messages.closeText))).toEqual(true);
expect(button.type()).toEqual('ModalDialog.CloseButton');
const button = footer[1].findByType(ActionRow)[0].children[0];
expect(button.children[0].el).toEqual(formatMessage(messages.closeText));
expect(button.type).toEqual('ModalDialog.CloseButton');
});
test('adjusted grade button', () => {
const button = footer.find(ActionRow).children().at(1);
expect(button.contains(formatMessage(messages.saveGrade))).toEqual(true);
expect(button.type()).toEqual('Button');
expect(button.props().onClick).toEqual(hookProps.handleAdjustedGradeClick);
const button = footer[1].findByType(ActionRow)[0].children[1];
expect(button.children[0].el).toEqual(formatMessage(messages.saveGrade));
expect(button.type).toEqual('Button');
expect(button.props.onClick).toEqual(hookProps.handleAdjustedGradeClick);
});
};
describe('without error', () => {
@@ -105,26 +101,26 @@ describe('EditModal component', () => {
el = shallow(<EditModal />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
testBody();
testFooter();
test('alert row', () => {
const alert = loadBody().children.at(1);
expect(alert.type()).toEqual('Alert');
expect(alert.props().show).toEqual(false);
const alert = loadBody().children[1];
expect(alert.type).toEqual('Alert');
expect(alert.props.show).toEqual(false);
});
});
describe('with error', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
testBody();
test('alert row', () => {
const alert = loadBody().children.at(1);
expect(alert.type()).toEqual('Alert');
expect(alert.props().show).toEqual(true);
expect(alert.contains(hookProps.error)).toEqual(true);
const alert = loadBody().children[1];
expect(alert.type).toEqual('Alert');
expect(alert.props.show).toEqual(true);
expect(alert.children[0].el).toEqual(hookProps.error);
});
testFooter();
});

View File

@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
import { selectors } from 'data/redux/hooks';
@@ -32,8 +32,8 @@ export const FilterBadge = ({
return (
<div>
<span className="badge badge-info">
<span>{formatMessage(displayName)}</span>
<span>
<span data-testid="display-name">{formatMessage(displayName)}</span>
<span data-testid="filter-value">
{!hideValue ? `: ${value}` : ''}
</span>
<Button

View File

@@ -1,13 +1,13 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { formatMessage } from 'testUtils';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import { selectors } from 'data/redux/hooks';
import FilterBadge from './FilterBadge';
jest.mock('@edx/paragon', () => ({
jest.mock('@openedx/paragon', () => ({
Button: () => 'Button',
}));
jest.mock('data/redux/hooks', () => ({
@@ -48,12 +48,12 @@ describe('FilterBadge', () => {
describe('render', () => {
const testDisplayName = () => {
test('formatted display name appears on badge', () => {
expect(el.contains(formatMessage(hookProps.displayName))).toEqual(true);
expect(el.instance.findByTestId('display-name')[0].children[0].el).toEqual(formatMessage(hookProps.displayName));
});
};
const testCloseButton = () => {
test('close button forwards close method', () => {
expect(el.find(Button).props().onClick).toEqual(handleClose(hookProps.connectedFilters));
expect(el.instance.findByType(Button)[0].props.onClick).toEqual(handleClose(hookProps.connectedFilters));
});
};
test('empty render if isDefault', () => {
@@ -75,20 +75,20 @@ describe('FilterBadge', () => {
testDisplayName();
testCloseButton();
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('value is note present in the badge', () => {
expect(el.contains(hookProps.value)).toEqual(false);
expect(el.instance.findByTestId('filter-value')[0].children).toHaveLength(0);
});
});
describe('do not hide value', () => {
testDisplayName();
testCloseButton();
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('value is note present in the badge', () => {
expect(el.text().includes(hookProps.value)).toEqual(true);
test('value is present in the badge', () => {
expect(el.instance.findByTestId('filter-value')[0].children[0].el).toBe(`: ${hookProps.value}`);
});
});
});

View File

@@ -5,10 +5,14 @@ exports[`FilterBadge render do not hide value snapshot 1`] = `
<span
className="badge badge-info"
>
<span>
<span
data-testid="display-name"
>
a common name
</span>
<span>
<span
data-testid="filter-value"
>
: a common value
</span>
<Button
@@ -39,10 +43,14 @@ exports[`FilterBadge render hide Value snapshot 1`] = `
<span
className="badge badge-info"
>
<span>
<span
data-testid="display-name"
>
a common name
</span>
<span />
<span
data-testid="filter-value"
/>
<Button
aria-label="close"
className="btn-info"

View File

@@ -1,6 +1,6 @@
/* eslint-disable import/no-named-as-default */
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import FilterBadges from '.';
import FilterBadge from './FilterBadge';
@@ -22,14 +22,14 @@ describe('FilterBadges', () => {
el = shallow(<FilterBadges handleClose={handleClose} />);
});
test('snapshot - has a filterbadge with handleClose for each filter in badgeOrder', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('has a filterbadge with handleClose for each filter in badgeOrder', () => {
const badgeProps = el.find(FilterBadge).map(badgeEl => badgeEl.props());
const badgeProps = el.instance.findByType(FilterBadge).map(badgeEl => badgeEl.props);
// key prop is not rendered by react
expect(badgeProps[0]).toEqual({ filterName: order[0], handleClose });
expect(badgeProps[1]).toEqual({ filterName: order[1], handleClose });
expect(badgeProps[2]).toEqual({ filterName: order[2], handleClose });
expect(badgeProps[0]).toMatchObject({ filterName: order[0], handleClose });
expect(badgeProps[1]).toMatchObject({ filterName: order[1], handleClose });
expect(badgeProps[2]).toMatchObject({ filterName: order[2], handleClose });
expect(badgeProps.length).toEqual(3);
});
});

View File

@@ -1,8 +1,8 @@
import React from 'react';
import { Button, Icon } from '@edx/paragon';
import { Button, Icon } from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
import { FilterAlt } from '@edx/paragon/icons';
import { FilterAlt } from '@openedx/paragon/icons';
import { thunkActions } from 'data/redux/hooks';

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
@@ -38,10 +38,10 @@ describe('FilterMenuToggle component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.type()).toEqual('Button');
expect(el.props().onClick).toEqual(toggleFilterMenu);
expect(el.text().includes(formatMessage(messages.editFilters)));
expect(el.snapshot).toMatchSnapshot();
expect(el.instance.type).toEqual('Button');
expect(el.instance.props.onClick).toEqual(toggleFilterMenu);
expect(el.instance.children[2].el).toContain(formatMessage(messages.editFilters));
});
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
@@ -46,8 +46,8 @@ describe('FilteredUsersLabel component', () => {
expect(shallow(<FilteredUsersLabel />).isEmptyRender()).toEqual(true);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el).toMatchObject(shallow(formatMessage(messages.visibilityLabel, {
expect(el.snapshot).toMatchSnapshot();
expect(el.instance).toMatchObject(shallow(formatMessage(messages.visibilityLabel, {
filteredUsers: <BoldText text={userCounts.filteredUsersCount} />,
totalUsers: <BoldText text={userCounts.totalUsersCount} />,
})));

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import Fields from './Fields';
@@ -16,14 +16,13 @@ describe('Gradebook Table Fields', () => {
el = shallow(<Fields.Username {...props} />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('wraps external user key and username', () => {
expect(el.find('span').childAt(0)).toMatchSnapshot();
expect(el.find('span').childAt(0)).toMatchSnapshot();
const content = el.find('span').childAt(0);
expect(content.childAt(0).text()).toEqual(username);
expect(content.childAt(1).text()).toEqual(props.userKey);
expect(el.instance.findByType('span')[0].el).toMatchSnapshot();
const content = el.instance.findByType('span')[0].children[0];
expect(content.children[0].children[0].el).toEqual(username);
expect(content.children[1].children[0].el).toEqual(props.userKey);
});
});
describe('without external_user_key', () => {
@@ -31,12 +30,12 @@ describe('Gradebook Table Fields', () => {
el = shallow(<Fields.Username username={username} />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('wraps username only', () => {
const content = el.find('span').childAt(0);
expect(content.childAt(0).text()).toEqual(username);
expect(content.children()).toHaveLength(1);
const content = el.instance.findByType('span')[0].children[0];
expect(content.children[0].children[0].el).toEqual(username);
expect(content.children).toHaveLength(1);
});
});
});
@@ -44,10 +43,10 @@ describe('Gradebook Table Fields', () => {
describe('Text', () => {
const value = 'myTag@place.com';
test('snapshot', () => {
expect(shallow(<Fields.Text value={value} />)).toMatchSnapshot();
expect(shallow(<Fields.Text value={value} />).snapshot).toMatchSnapshot();
});
test('wraps entry value', () => {
expect(shallow(<Fields.Text value={value} />).text()).toEqual(value);
expect(shallow(<Fields.Text value={value} />).instance.children[0].el).toEqual(value);
});
});
});

View File

@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import { selectors, thunkActions } from 'data/redux/hooks';
import transforms from 'data/redux/transforms';

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { selectors, thunkActions } from 'data/redux/hooks';
import transforms from 'data/redux/transforms';
@@ -101,8 +101,8 @@ describe('GradeButton', () => {
el = shallow(<GradeButton {...props} />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.text()).toEqual(hookProps.label);
expect(el.snapshot).toMatchSnapshot();
expect(el.instance.el).toEqual(hookProps.label);
});
});
describe('not frozen grades', () => {
@@ -111,10 +111,10 @@ describe('GradeButton', () => {
el = shallow(<GradeButton {...props} />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.type()).toEqual('Button');
expect(el.props().onClick).toEqual(hookProps.onClick);
expect(el.contains(hookProps.label)).toEqual(true);
expect(el.snapshot).toMatchSnapshot();
expect(el.instance.type).toEqual('Button');
expect(el.instance.props.onClick).toEqual(hookProps.onClick);
expect(el.instance.children[0].el).toEqual(hookProps.label);
});
});
});

View File

@@ -5,7 +5,7 @@ import {
Icon,
OverlayTrigger,
Tooltip,
} from '@edx/paragon';
} from '@openedx/paragon';
import { StrictDict } from 'utils';

View File

@@ -1,8 +1,8 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { getLocale } from '@edx/frontend-platform/i18n';
import { OverlayTrigger } from '@edx/paragon';
import { OverlayTrigger } from '@openedx/paragon';
import LabelReplacements from './LabelReplacements';
@@ -12,7 +12,7 @@ const {
MastersOnlyLabelReplacement,
} = LabelReplacements;
jest.mock('@edx/paragon', () => ({
jest.mock('@openedx/paragon', () => ({
Icon: () => 'Icon',
OverlayTrigger: () => 'OverlayTrigger',
Tooltip: () => 'Tooltip',
@@ -25,15 +25,15 @@ describe('LabelReplacements', () => {
el = shallow(<TotalGradeLabelReplacement />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('displays overlay tooltip', () => {
expect(el.find(OverlayTrigger).props().overlay).toMatchSnapshot();
expect(el.instance.findByType(OverlayTrigger)[0].props.overlay).toMatchSnapshot();
});
});
describe('UsernameLabelReplacement', () => {
test('snapshot', () => {
expect(shallow(<UsernameLabelReplacement />)).toMatchSnapshot();
expect(shallow(<UsernameLabelReplacement />).snapshot).toMatchSnapshot();
});
});
describe('MastersOnlyLabelReplacement', () => {
@@ -43,7 +43,7 @@ describe('LabelReplacements', () => {
defaultMessage: 'defaultMessAge',
description: 'desCripTion',
};
expect(shallow(<MastersOnlyLabelReplacement {...message} />)).toMatchSnapshot();
expect(shallow(<MastersOnlyLabelReplacement {...message} />).snapshot).toMatchSnapshot();
});
});
});
@@ -53,11 +53,11 @@ describe('snapshot', () => {
test('right to left overlay placement', () => {
getLocale.mockImplementation(() => 'en');
el = shallow(<TotalGradeLabelReplacement />);
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('left to right overlay placement', () => {
getLocale.mockImplementation(() => 'ar');
el = shallow(<TotalGradeLabelReplacement />);
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});

View File

@@ -28,29 +28,36 @@ exports[`Gradebook Table Fields Username with external_user_key snapshot 1`] = `
`;
exports[`Gradebook Table Fields Username with external_user_key wraps external user key and username 1`] = `
<div>
<div>
MyNameFromHere
</div>
<div
className="student-key"
>
My name from another land
</div>
</div>
`;
exports[`Gradebook Table Fields Username with external_user_key wraps external user key and username 2`] = `
<div>
<div>
MyNameFromHere
</div>
<div
className="student-key"
>
My name from another land
</div>
</div>
Object {
"children": Array [
Object {
"children": Array [
Object {
"children": Array [
"MyNameFromHere",
],
"props": Object {},
"type": "div",
},
Object {
"children": Array [
"My name from another land",
],
"props": Object {
"className": "student-key",
},
"type": "div",
},
],
"props": Object {},
"type": "div",
},
],
"props": Object {
"className": "wrap-text-in-cell",
},
"type": "span",
}
`;
exports[`Gradebook Table Fields Username without external_user_key snapshot 1`] = `

View File

@@ -1,4 +1,4 @@
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { DataTable } from '@edx/paragon';
import { DataTable } from '@openedx/paragon';
import useGradebookTableData from './hooks';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { DataTable } from '@edx/paragon';
import { DataTable } from '@openedx/paragon';
import useGradebookTableData from './hooks';
import GradebookTable from '.';
@@ -24,16 +24,16 @@ describe('GradebookTable', () => {
el = shallow(<GradebookTable />);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('Datatable props', () => {
const datatable = el.find(DataTable);
const props = datatable.props();
const datatable = el.instance.findByType(DataTable)[0];
const { props } = datatable;
expect(props.columns).toEqual(hookProps.columns);
expect(props.data).toEqual(hookProps.data);
expect(props.itemCount).toEqual(hookProps.grades.length);
expect(props.RowStatusComponent).toEqual(hookProps.nullMethod);
expect(datatable.children().at(2).type()).toEqual('DataTable.EmptyTable');
expect(datatable.children().at(2).props().content).toEqual(hookProps.emptyContent);
expect(datatable.children[2].type).toEqual('DataTable.EmptyTable');
expect(datatable.children[2].props.content).toEqual(hookProps.emptyContent);
});
});

View File

@@ -3,7 +3,7 @@ import React from 'react';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import NetworkButton from 'components/NetworkButton';
import messages from './messages';

View File

@@ -2,7 +2,7 @@ import React from 'react';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import NetworkButton from 'components/NetworkButton';
import useImportGradesButtonData from './hooks';

View File

@@ -5,7 +5,7 @@ import useImportGradesButtonData from './hooks';
import ImportGradesButton from '.';
jest.unmock('react');
jest.unmock('@edx/paragon');
jest.unmock('@openedx/paragon');
jest.mock('components/NetworkButton', () => 'network-button');
jest.mock('./hooks', () => ({ __esModule: true, default: jest.fn() }));

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { Toast } from '@edx/paragon';
import { Toast } from '@openedx/paragon';
import useImportSuccessToastData from './hooks';

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import useImportSuccessToastData from './hooks';
import ImportSuccessToast from '.';
@@ -26,14 +26,14 @@ describe('ImportSuccessToast component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('Toast', () => {
expect(el.type()).toEqual('Toast');
expect(el.props().action).toEqual(hookProps.action);
expect(el.props().onClose).toEqual(hookProps.onClose);
expect(el.props().show).toEqual(hookProps.show);
expect(el.text()).toEqual(hookProps.description);
expect(el.instance.type).toEqual('Toast');
expect(el.instance.props.action).toEqual(hookProps.action);
expect(el.instance.props.onClose).toEqual(hookProps.onClose);
expect(el.instance.props.show).toEqual(hookProps.show);
expect(el.instance.children[0].el).toEqual(hookProps.description);
});
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
@@ -33,8 +33,8 @@ describe('InterventionsReport component', () => {
expect(el.isEmptyRender()).toEqual(true);
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
const btnProps = el.find(NetworkButton).props();
expect(el.snapshot).toMatchSnapshot();
const btnProps = el.instance.findByType(NetworkButton)[0].props;
expect(btnProps.label).toEqual(messages.downloadBtn);
expect(btnProps.onClick).toEqual(hookProps.handleClick);
});

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import usePageButtonsData from './hooks';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import usePageButtonsData from './hooks';
import PageButtons from '.';
@@ -35,19 +35,19 @@ describe('PageButtons component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('prev button', () => {
const button = el.find(Button).at(0);
expect(button.props().disabled).toEqual(hookProps.prev.disabled);
expect(button.props().onClick).toEqual(hookProps.prev.onClick);
expect(button.text()).toEqual(hookProps.prev.text);
const button = el.instance.findByType(Button)[0];
expect(button.props.disabled).toEqual(hookProps.prev.disabled);
expect(button.props.onClick).toEqual(hookProps.prev.onClick);
expect(button.children[0].el).toEqual(hookProps.prev.text);
});
test('next button', () => {
const button = el.find(Button).at(1);
expect(button.props().disabled).toEqual(hookProps.next.disabled);
expect(button.props().onClick).toEqual(hookProps.next.onClick);
expect(button.text()).toEqual(hookProps.next.text);
const button = el.instance.findByType(Button)[1];
expect(button.props.disabled).toEqual(hookProps.next.disabled);
expect(button.props.onClick).toEqual(hookProps.next.onClick);
expect(button.children[0].el).toEqual(hookProps.next.text);
});
});
});

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { Form } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
import { actions, selectors } from 'data/redux/hooks';

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { useIntl } from '@edx/frontend-platform/i18n';
import { GradeFormats } from 'data/constants/grades';
@@ -40,27 +40,27 @@ describe('ScoreViewInput component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('label', () => {
const label = el.children().at(0);
expect(label.text()).toEqual(`${formatMessage(messages.scoreView)}:`);
const label = el.instance.children[0];
expect(label.children[0].el).toEqual(`${formatMessage(messages.scoreView)}`);
});
describe('form control', () => {
let control;
beforeEach(() => {
control = el.children().at(1);
control = el.instance.children;
});
test('value and onChange from redux hooks', () => {
expect(control.props().value).toEqual(gradeFormat);
expect(control.props().onChange).toEqual(toggleGradeFormat);
expect(control[1].props.value).toEqual(gradeFormat);
expect(control[1].props.onChange).toEqual(toggleGradeFormat);
});
test('absolute and percent options', () => {
const children = control.children();
expect(children.at(0).props().value).toEqual(GradeFormats.percent);
expect(children.at(0).text()).toEqual(formatMessage(messages.percent));
expect(children.at(1).props().value).toEqual(GradeFormats.absolute);
expect(children.at(1).text()).toEqual(formatMessage(messages.absolute));
const { children } = control[1];
expect(children[0].props.value).toEqual(GradeFormats.percent);
expect(children[0].children[0].el).toEqual(formatMessage(messages.percent));
expect(children[1].props.value).toEqual(GradeFormats.absolute);
expect(children[1].children[0].el).toEqual(formatMessage(messages.absolute));
});
});
});

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { SearchField } from '@edx/paragon';
import { SearchField } from '@openedx/paragon';
import useSearchControlsData from './hooks';
/**

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { SearchField } from '@edx/paragon';
import { SearchField } from '@openedx/paragon';
import useSearchControlsData from './hooks';
import SearchControls from '.';
@@ -31,10 +31,10 @@ describe('SearchControls component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('search field', () => {
const props = el.find(SearchField).props();
const { props } = el.instance.findByType(SearchField)[0];
expect(props.onSubmit).toEqual(hookProps.onSubmit);
expect(props.onBlur).toEqual(hookProps.onBlur);
expect(props.onClear).toEqual(hookProps.onClear);
@@ -42,7 +42,7 @@ describe('SearchControls component', () => {
expect(props.value).toEqual(hookProps.searchValue);
});
test('hint text', () => {
expect(el.find('small').text()).toEqual(hookProps.hintText);
expect(el.instance.findByType('small')[0].children[0].el).toEqual(hookProps.hintText);
});
});
});

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { Icon } from '@edx/paragon';
import { Icon } from '@openedx/paragon';
import { selectors } from 'data/redux/hooks';

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { selectors } from 'data/redux/hooks';
import SpinnerIcon from './SpinnerIcon';
@@ -29,7 +29,7 @@ describe('SpinnerIcon', () => {
expect(el.isEmptyRender()).toEqual(true);
});
test('snapshot - displays spinner overlay with spinner icon', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});
});

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { Alert } from '@edx/paragon';
import { Alert } from '@openedx/paragon';
import useStatusAlertsData from './hooks';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { Alert } from '@edx/paragon';
import { Alert } from '@openedx/paragon';
import useStatusAlertsData from './hooks';
import StatusAlerts from '.';
@@ -34,20 +34,20 @@ describe('StatusAlerts component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('success banner', () => {
const alert = el.find(Alert).at(0);
const props = alert.props();
const alert = el.instance.findByType(Alert)[0];
const { props } = alert;
expect(props.onClose).toEqual(hookProps.successBanner.onClose);
expect(props.show).toEqual(hookProps.successBanner.show);
expect(alert.text()).toEqual(hookProps.successBanner.text);
expect(alert.children[0].el).toEqual(hookProps.successBanner.text);
});
test('grade filter banner', () => {
const alert = el.find(Alert).at(1);
const props = alert.props();
const alert = el.instance.findByType(Alert)[1];
const { props } = alert;
expect(props.show).toEqual(hookProps.gradeFilter.show);
expect(alert.text()).toEqual(hookProps.gradeFilter.text);
expect(alert.children[0].el).toEqual(hookProps.gradeFilter.text);
});
});
});

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import FilterBadges from './FilterBadges';
@@ -46,10 +46,10 @@ describe('GradesView component', () => {
});
describe('render', () => {
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('filterBadges load close behavior from hook', () => {
expect(el.find(FilterBadges).props().handleClose).toEqual(
expect(el.instance.findByType(FilterBadges)[0].props.handleClose).toEqual(
hookProps.handleFilterBadgeClose,
);
});

View File

@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
import classNames from 'classnames';
import { connect } from 'react-redux';
import { StatefulButton, Icon } from '@edx/paragon';
import { StatefulButton, Icon } from '@openedx/paragon';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import selectors from 'data/selectors';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import { Icon, StatefulButton } from '@edx/paragon';
import { Icon, StatefulButton } from '@openedx/paragon';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import selectors from 'data/selectors';
@@ -10,7 +10,7 @@ import { NetworkButton, mapStateToProps, buttonStates } from '.';
jest.mock('@edx/frontend-platform/i18n', () => ({
FormattedMessage: () => 'FormattedMessage',
}));
jest.mock('@edx/paragon', () => ({
jest.mock('@openedx/paragon', () => ({
Icon: () => 'Icon',
StatefulButton: () => 'StatefulButton',
}));
@@ -37,10 +37,10 @@ describe('NetworkButton component', () => {
beforeEach(() => {
props.onClick = jest.fn();
el = shallow(<NetworkButton {...props} />);
btnProps = el.find(StatefulButton).props();
btnProps = el.instance.findByType(StatefulButton)[0].props;
});
test('snapshot', () => {
expect(el).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
it('sets labels to translated label prop', () => {
expect(btnProps.labels).toEqual({
@@ -58,8 +58,8 @@ describe('NetworkButton component', () => {
});
describe('import icons', () => {
it('sets icons with spinner pending icon and upload default', () => {
el.setProps({ import: true });
expect(el.find(StatefulButton).props().icons).toEqual({
el = shallow(<NetworkButton {...props} import />);
expect(el.instance.findByType(StatefulButton)[0].props.icons).toEqual({
pending: (<Icon className="fa mr-2 fa-spinner fa-spin" />),
default: (<Icon className="fa mr-2 fa-upload" />),
});
@@ -70,8 +70,8 @@ describe('NetworkButton component', () => {
expect(btnProps.state).toEqual(buttonStates.default);
});
it('is set to pending state if props.showSpinner', () => {
el.setProps({ showSpinner: true });
expect(el.find(StatefulButton).props().state).toEqual(buttonStates.pending);
el = shallow(<NetworkButton {...props} showSpinner />);
expect(el.instance.findByType(StatefulButton)[0].props.state).toEqual(buttonStates.pending);
expect(btnProps.state).toEqual(buttonStates.default);
});
});

View File

@@ -5,7 +5,7 @@ exports[`WithSidebar Component snapshots basic snapshot 1`] = `
className="d-flex sidebar-container page-gradebook"
>
<aside
className="sidebar-class-names"
className="sidebar d-none"
onTransitionEnd={[MockFunction handleSlideDone]}
>
<div>
@@ -13,7 +13,7 @@ exports[`WithSidebar Component snapshots basic snapshot 1`] = `
</div>
</aside>
<div
className="content-class-names"
className="sidebar-contents position-relative"
>
<b>
aby in a bi

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow } from '@edx/react-unit-test-utils';
import selectors from 'data/selectors';
import thunkActions from 'data/thunkActions';
@@ -56,30 +56,34 @@ describe('WithSidebar', () => {
el = shallow(<WithSidebar {...props} />);
});
describe('sidebarClassNames', () => {
const getVal = () => el.instance().sidebarClassNames.split(' ');
const getVal = () => [
...el.instance.props.className.split(' '),
...el.instance.children[0].props.className.split(' '),
...el.instance.children[1].props.className.split(' '),
];
it('returns a "sidebar" classname', () => {
expect(getVal()).toContain('sidebar');
});
it('includes an open className iff props.open', () => {
expect(getVal()).not.toContain('open');
el.setProps({ open: true });
el = shallow(<WithSidebar {...props} open />);
expect(getVal()).toContain('open');
});
it('includes a d-none className iff props.isClosed', () => {
expect(getVal()).toContain('d-none');
el.setProps({ isClosed: false });
el = shallow(<WithSidebar {...props} isClosed={false} />);
expect(getVal()).not.toContain('d-none');
});
});
describe('contentClassNames', () => {
const getVal = () => el.instance().contentClassNames.split(' ');
const getVal = () => el.instance.children[1].props.className.split(' ');
it('includes sidebar-contents and position-relative classNames', () => {
expect(getVal()).toContain('sidebar-contents');
expect(getVal()).toContain('position-relative');
});
it('includes an opening class iff props.isOpening', () => {
expect(getVal()).not.toContain('opening');
el.setProps({ isOpening: true });
el = shallow(<WithSidebar {...props} isOpening />);
expect(getVal()).toContain('opening');
});
});
@@ -87,11 +91,7 @@ describe('WithSidebar', () => {
describe('snapshots', () => {
test('basic snapshot', () => {
const el = shallow(<WithSidebar {...props} />);
const sidebarClassNames = 'sidebar-class-names';
const contentClassNames = 'content-class-names';
jest.spyOn(el.instance(), 'sidebarClassNames', 'get').mockReturnValue(sidebarClassNames);
jest.spyOn(el.instance(), 'contentClassNames', 'get').mockReturnValue(contentClassNames);
expect(el.instance().render()).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
});
});

View File

@@ -4,7 +4,7 @@ exports[`GradebookPage component snapshot - shows BulkManagementHistoryView if a
<WithSidebar
sidebar={
<GradebookFilters
updateQueryParams={[MockFunction updateQueryParams]}
updateQueryParams={[Function]}
/>
}
>
@@ -21,7 +21,7 @@ exports[`GradebookPage component snapshot - shows GradesView if aciveView === vi
<WithSidebar
sidebar={
<GradebookFilters
updateQueryParams={[MockFunction updateQueryParams]}
updateQueryParams={[Function]}
/>
}
>
@@ -30,7 +30,7 @@ exports[`GradebookPage component snapshot - shows GradesView if aciveView === vi
>
<GradebookHeader />
<GradesView
updateQueryParams={[MockFunction updateQueryParams]}
updateQueryParams={[Function]}
/>
</div>
</WithSidebar>

View File

@@ -1,6 +1,7 @@
/* eslint-disable import/no-named-as-default */
import React from 'react';
import { shallow } from 'enzyme';
import { render } from '@testing-library/react'; // eslint-disable-line import/no-extraneous-dependencies
import { shallow } from '@edx/react-unit-test-utils';
import queryString from 'query-string';
import selectors from 'data/selectors';
@@ -19,7 +20,7 @@ jest.mock('query-string', () => ({
stringify: (val) => `stringify: ${JSON.stringify(val, Object.keys(val).sort())}`,
}));
jest.mock('@edx/paragon', () => ({
jest.mock('@openedx/paragon', () => ({
Tab: () => 'Tab',
Tabs: () => 'Tabs',
}));
@@ -62,13 +63,11 @@ describe('GradebookPage', () => {
});
test('snapshot - shows BulkManagementHistoryView if activeView === views.bulkManagementHistory', () => {
el = shallow(<GradebookPage {...props} activeView={views.bulkManagementHistory} />);
el.instance().updateQueryParams = jest.fn().mockName('updateQueryParams');
expect(el.instance().render()).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
test('snapshot - shows GradesView if aciveView === views.grades', () => {
el = shallow(<GradebookPage {...props} />);
el.instance().updateQueryParams = jest.fn().mockName('updateQueryParams');
expect(el.instance().render()).toMatchSnapshot();
expect(el.snapshot).toMatchSnapshot();
});
describe('render', () => {
beforeEach(() => {
@@ -76,9 +75,9 @@ describe('GradebookPage', () => {
});
describe('top-level WithSidebar', () => {
test('sidebar from GradebookFilters, with updateQueryParams', () => {
const { sidebar } = el.props();
expect(sidebar).toEqual(
<GradebookFilters updateQueryParams={el.instance().updateQueryParams} />,
const { sidebar } = el.instance.props;
expect(sidebar).toMatchObject(
<GradebookFilters updateQueryParams={el.shallowWrapper.props.sidebar.props.updateQueryParams} />,
);
});
});
@@ -86,37 +85,37 @@ describe('GradebookPage', () => {
let content;
let children;
beforeEach(() => {
content = el.props().children;
children = content.props.children;
content = el.instance.children;
children = content[0].children;
});
it('is wrapped in a div w/ px-3 gradebook-content classNames', () => {
expect(content.type).toEqual('div');
expect(content.props.className).toEqual('px-3 gradebook-content');
expect(content[0].type).toEqual('div');
expect(content[0].props.className).toEqual('px-3 gradebook-content');
});
it('displays Gradebook header and then tabs', () => {
expect(children[0]).toEqual(<GradebookHeader />);
expect(shallow(children[0])).toEqual(shallow(<GradebookHeader />));
});
it('displays GradesView if activeView === views.grades', () => {
expect(shallow(children[1])).toEqual(shallow((
<GradesView updateQueryParams={el.instance().updateQueryParams} />
<GradesView updateQueryParams={el.shallowWrapper.props.sidebar.props.updateQueryParams} />
)));
});
it('displays Bulk Management History View if activeView === views.bulkManagementHistory', () => {
el = shallow(<GradebookPage {...props} activeView={views.bulkManagementHistory} />);
const mainView = el.props().children.props.children[1];
expect(mainView).toEqual((
<BulkManagementHistoryView />
const mainView = el.instance.children[0].children[1];
expect(shallow(mainView)).toEqual(shallow(
<BulkManagementHistoryView />,
));
});
});
});
describe('behavior', () => {
beforeEach(() => {
el = shallow(<GradebookPage {...props} />, { disableLifecucleMethods: true });
el = shallow(<GradebookPage {...props} />);
});
describe('componentDidMount', () => {
test('initializes app with courseId and urlQuery', () => {
el.instance().componentDidMount();
render(<GradebookPage {...props} />);
expect(props.initializeApp).toHaveBeenCalledWith(
courseId,
queryString.parse(props.location.search),
@@ -130,7 +129,7 @@ describe('GradebookPage', () => {
const val1 = 'VALUE';
const val2 = 'VALTWO!!';
const args = { [newKey]: val1, [props.location.search]: val2 };
el.instance().updateQueryParams(args);
el.shallowWrapper.props.sidebar.props.updateQueryParams(args);
expect(props.navigate).toHaveBeenCalledWith({ pathname: '/', search: `?${queryString.stringify(args)}` });
});
it('clears values for non-truthy values', () => {
@@ -139,7 +138,7 @@ describe('GradebookPage', () => {
const val1 = 'VALUE';
const val2 = false;
const args = { [newKey]: val1, [props.location.search]: val2 };
el.instance().updateQueryParams(args);
el.shallowWrapper.props.sidebar.props.updateQueryParams(args);
expect(props.navigate).toHaveBeenCalledWith(
{ pathname: '/', search: `?${queryString.stringify({ [newKey]: val1 })}` },
);

View File

@@ -1,6 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { Helmet } from 'react-helmet';
import { shallow } from '@edx/react-unit-test-utils';
import { getConfig } from '@edx/frontend-platform';
import Head from './Head';
@@ -21,11 +20,10 @@ getConfig.mockReturnValue(config);
describe('Head', () => {
it('should match render title tag and favicon with the site configuration values', () => {
const el = shallow(<Head />);
const helmet = el.find(Helmet);
const title = helmet.find('title');
const link = el.find('link');
expect(title.props().children).toEqual(`Gradebook | ${config.SITE_NAME}`);
expect(link.props().rel).toEqual('shortcut icon');
expect(link.props().href).toEqual(config.FAVICON_URL);
const title = el.instance.findByType('title')[0];
const link = el.instance.findByType('link')[0];
expect(title.children[0].el).toEqual(`Gradebook | ${config.SITE_NAME}`);
expect(link.props.rel).toEqual('shortcut icon');
expect(link.props.href).toEqual(config.FAVICON_URL);
});
});

View File

@@ -1,39 +1 @@
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 deMessages from './messages/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 itMessages from './messages/it.json';
import ptMessages from './messages/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,
'es-419': es419Messages,
'fa-ir': faIRMessages,
fr: frMessages,
'zh-cn': zhcnMessages,
pt: ptMessages,
it: itMessages,
de: deMessages,
hi: hiMessages,
'fr-ca': frCAMessages,
ru: ruMessages,
uk: ukMessages,
};
export default [
paragonMessages,
footerMessages,
headerMessages,
appMessages,
];
export default [];

View File

@@ -1,73 +0,0 @@
{
"gradebook.BulkManagementHistoryView.heading": "سجلّ الإدارة بالجملة",
"gradebook.BulkManagementHistoryView": "فيما يلي سجلّ رفع الدرجات. لتحميل CSV الدرجات أو استيراد درجات بديلة، عد إلى دفتر الدرجات. يرجى الملاحظة أن معالجة الدرجات البديلة قد يأخذ بضع ثوانٍ بعد الاستيراد.",
"gradebook.BulkManagementHistoryView.successDialog": "تتم الآن معالجة CSV. قد يتطلب إتمام رفع الملفات عدة دقائق.",
"gradebook.GradebookFilters.assignmentsFilterLabel": "الواجبات",
"gradebook.GradebookFilters.overallGradeFilterLabel": "الدرجة الكلّية",
"gradebook.GradebookFilters.studentGroupsFilterLabel": "مجموعات الطلبة",
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "تضمين أعضاء فريق المساق",
"gradebook.GradebookFilters.assignmentFilterLabel": "الواجب",
"gradebook.GradebookFilters.assignmentTypesLabel": "أنواع الواجبات",
"gradebook.GradebookFilters.maxGradeFilterLabel": " الدرجة القصوى",
"gradebook.GradebookFilters.minGradeFilterLabel": "الدرجة الدنيا",
"gradebook.GradebookFilters.cohorts": "الأفواج",
"gradebook.GradebookFilters.cohortsAll": "جميع الأفواج",
"gradebook.GradebookFilters.tracks": "المسارات",
"gradebook.GradebookFilters.trackAll": "جميع المسارات",
"gradebook.GradebookFilters.closeFilters": "إغلاق المرشحات",
"gradebook.GradebookHeader.backButton": "العودة إلى لوحة المعلومات",
"gradebook.GradebookHeader.appLabel": "دفتر الدرجات",
"gradebook.GradebookHeader.frozenWarning": "درجات هذا المساق الآن مجمدة. لم يعد تعديل الدرجات ممكنا.",
"gradebook.GradebookHeader.unauthorizedWarning": "أنت غير مخوّل بالاطّلاع على دفتر درجات هذا المساق.",
"gradebook.GradebookHeader.toActivityLogButton": "عرض سجلّ الإدارة بالجملة",
"gradebook.GradebookHeader.toGradesView": "العودة إلى دفتر الدرجات",
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "تحميل الدرجات",
"gradebook.GradesView.EditModal.headers.assignment": "الواجب",
"gradebook.GradesView.EditModal.headers.currentGrade": "الدرجة الحالية",
"gradebook.GradesView.EditModal.headers.originalGrade": "الدرجة الأصلية",
"gradebook.GradesView.EditModal.headers.student": "الطالب",
"gradebook.GradesView.EditModal.title": "تعديل الدرجات",
"gradebook.GradesView.EditModal.closeText": "إلغاء",
"gradebook.GradesView.EditModal.contactSupport": "يتم إظهار أحدث العمليات فقط (5 على الأكثر). للاطلاع على المزيد، يرجى الاتصال بالدعم.",
"gradebook.GradesView.EditModal.saveVisibility": "ملاحظة: ستظهر تعديلاتك للطلبة بمجرد الحفظ.",
"gradebook.GradesView.EditModal.saveGrade": "حفظ الدرجات",
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "الدرجة المعدّلة",
"gradebook.GradesView.EditModal.Overrides.dateHeader": "التاريخ",
"gradebook.GradesView.EditModal.Overrides.graderHeader": "صاحب التقييم",
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "السبب",
"gradebook.GradesTab.usersVisibilityLabel'": "عرض {filteredUsers} من إجمالي {totalUsers} متعلمًا",
"gradebook.GradesView.editFilterLabel": "تعديل المرشحات",
"gradebook.GradesView.table.headings.email": "البريد الإلكتروني",
"gradebook.GradesView.table.headings.totalGrade": "الدرجة الإجمالية (%)",
"gradebook.GradesView.table.headings.username": "اسم المستخدم",
"gradebook.GradesView.table.labels.studentKey": "مفتاح الطالب*",
"gradebook.GradesView.table.labels.username": "اسم المستخدم",
"gradebook.GradesView.table.totalGradePercentage": "الدرجات الإجمالية تظهر دائمًا على شكل نسب مئوية",
"gradebook.BulkManagementHistoryView.csvUploadLabel": "رفع درجات بصيغة CSV",
"gradebook.GradesView.importGradesBtnText": "استيراد الدرجات",
"gradebook.GradesView.ImportSuccessToast.description": "نجح الاستيراد! سيتم فورًا تحديث الدرجات.",
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "عرض سجلّ النشاط",
"gradebook.GradesView.InterventionsReport.title": "تقرير التدخلات",
"gradebook.GradesView.InterventionsReport.description": "هل تحتاج لإيجاد طلبة قد يكونون متأخرين؟ حمّل تقرير التدخلات للحصول على قياسات الالتزام كالزيارات و المحاولات الخاصة بكل فصل.",
"gradebook.GradesView.InterventionsReport.downloadBtn": "تحميل التدخلات",
"gradebook.GradesView.filterHeading": "الخطوة 1: ترشيح تقرير الدرجات",
"gradebook.GradesView.gradebookStepHeading": "الخطوة 2: معاينة و تعديل الدرجات على حدة",
"gradebook.GradesView.mastersHint": "متوفر فقط للمتعلمين المسجلين في مسار الماستر",
"gradebook.GradesView.PageButtons.prevPage": "الصفحة السابقة",
"gradebook.GradesView.PageButtons.nextPage": "الصفحة التالية",
"gradebook.GradesView.scoreViewLabel": "مظهر الدرجة",
"gradebook.GradesView.absoluteOption": "مطلقة",
"gradebook.GradesView.percentOption": "نسبة مئوية",
"gradebook.GradesView.search.label": "البحث عن متعلّم",
"gradebook.GradesView.search.hint": "ابحث حسب اسم المستخدم، البريد الإلكتروني أو مفتاح الطالب",
"gradebook.GradesView.editSuccessAlert": "تم تعديل الدرجة بنجاح. قد تلاحظ تأخّرًا طفيفا في ظهور التحديثات في دفتر الدرجات.",
"gradebook.GradesView.maxCourseGradeInvalid": "الدرجة القصوى يجب أن تكون بين 0 و 100",
"gradebook.GradesView.minCourseGradeInvalid": "الدرجة الدنيا يجب أن تكون بين 0 و 100",
"gradebook.GradesTab.FilterBadges.assignment": "الواجب",
"gradebook.GradesTab.FilterBadges.assignmentGrade": "درجة الواجب",
"gradebook.GradesTab.FilterBadges.assignmentType": "نوع الواجب",
"gradebook.GradesTab.FilterBadges.cohort": "فوج",
"gradebook.GradesTab.FilterBadges.courseGrade": "درجة المساق",
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "تضمين أعضاء فريق المساق",
"gradebook.GradesTab.FilterBadges.track": "المسار"
}

View File

@@ -1,73 +0,0 @@
{
"gradebook.BulkManagementHistoryView.heading": "Bulk Management History",
"gradebook.BulkManagementHistoryView": "Below is a log of previous grade imports. To download a CSV of your gradebook and import grades for override, return to the Gradebook. Please note, after importing grades, it may take a few seconds to process the override.",
"gradebook.BulkManagementHistoryView.successDialog": "CSV processing. File uploads may take several minutes to complete.",
"gradebook.GradebookFilters.assignmentsFilterLabel": "Assignments",
"gradebook.GradebookFilters.overallGradeFilterLabel": "Overall Grade",
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Student Groups",
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Include Course Team Members",
"gradebook.GradebookFilters.assignmentFilterLabel": "Assignment",
"gradebook.GradebookFilters.assignmentTypesLabel": "Assignment Types",
"gradebook.GradebookFilters.maxGradeFilterLabel": "Max Grade",
"gradebook.GradebookFilters.minGradeFilterLabel": "Min Grade",
"gradebook.GradebookFilters.cohorts": "Cohorts",
"gradebook.GradebookFilters.cohortsAll": "Cohort-All",
"gradebook.GradebookFilters.tracks": "Tracks",
"gradebook.GradebookFilters.trackAll": "Track-All",
"gradebook.GradebookFilters.closeFilters": "Close Filters",
"gradebook.GradebookHeader.backButton": "Back to Dashboard",
"gradebook.GradebookHeader.appLabel": "Gradebook",
"gradebook.GradebookHeader.frozenWarning": "The grades for this course are now frozen. Editing of grades is no longer allowed.",
"gradebook.GradebookHeader.unauthorizedWarning": "You are not authorized to view the gradebook for this course.",
"gradebook.GradebookHeader.toActivityLogButton": "View Bulk Management History",
"gradebook.GradebookHeader.toGradesView": "Return to Gradebook",
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Download Grades",
"gradebook.GradesView.EditModal.headers.assignment": "Assignment",
"gradebook.GradesView.EditModal.headers.currentGrade": "Current Grade",
"gradebook.GradesView.EditModal.headers.originalGrade": "Original Grade",
"gradebook.GradesView.EditModal.headers.student": "Student",
"gradebook.GradesView.EditModal.title": "Edit Grades",
"gradebook.GradesView.EditModal.closeText": "Cancel",
"gradebook.GradesView.EditModal.contactSupport": "Showing most recent actions (max 5). To see more, please contact support",
"gradebook.GradesView.EditModal.saveVisibility": "Note: Once you save, your changes will be visible to students.",
"gradebook.GradesView.EditModal.saveGrade": "Save Grades",
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Adjusted grade",
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Grader",
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Reason",
"gradebook.GradesTab.usersVisibilityLabel'": "Showing {filteredUsers} of {totalUsers} total learners",
"gradebook.GradesView.editFilterLabel": "Edit Filters",
"gradebook.GradesView.table.headings.email": "Email",
"gradebook.GradesView.table.headings.totalGrade": "Total Grade (%)",
"gradebook.GradesView.table.headings.username": "Username",
"gradebook.GradesView.table.labels.studentKey": "Student Key*",
"gradebook.GradesView.table.labels.username": "Username",
"gradebook.GradesView.table.totalGradePercentage": "Total Grade values are always displayed as a percentage",
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Upload Grade CSV",
"gradebook.GradesView.importGradesBtnText": "Import Grades",
"gradebook.GradesView.ImportSuccessToast.description": "Import Successful! Grades will be updated momentarily.",
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "View Activity Log",
"gradebook.GradesView.InterventionsReport.title": "Interventions Report",
"gradebook.GradesView.InterventionsReport.description": "Need to find students who may be falling behind? Download the interventions report to obtain engagement metrics such as section attempts and visits.",
"gradebook.GradesView.InterventionsReport.downloadBtn": "Download Interventions",
"gradebook.GradesView.filterHeading": "Step 1: Filter the Grade Report",
"gradebook.GradesView.gradebookStepHeading": "Step 2: View or Modify Individual Grades",
"gradebook.GradesView.mastersHint": "available for learners in the Master's track only",
"gradebook.GradesView.PageButtons.prevPage": "Previous Page",
"gradebook.GradesView.PageButtons.nextPage": "Next Page",
"gradebook.GradesView.scoreViewLabel": "Score View",
"gradebook.GradesView.absoluteOption": "Absolute",
"gradebook.GradesView.percentOption": "Percent",
"gradebook.GradesView.search.label": "Search for a learner",
"gradebook.GradesView.search.hint": "Search by username, email, or student key",
"gradebook.GradesView.editSuccessAlert": "The grade has been successfully edited. You may see a slight delay before updates appear in the Gradebook.",
"gradebook.GradesView.maxCourseGradeInvalid": "Maximum course grade must be between 0 and 100",
"gradebook.GradesView.minCourseGradeInvalid": "Minimum course grade must be between 0 and 100",
"gradebook.GradesTab.FilterBadges.assignment": "Assignment",
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Assignment Grade",
"gradebook.GradesTab.FilterBadges.assignmentType": "Assignment Type",
"gradebook.GradesTab.FilterBadges.cohort": "Cohort",
"gradebook.GradesTab.FilterBadges.courseGrade": "Course Grade",
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Include Course Team Members",
"gradebook.GradesTab.FilterBadges.track": "Track"
}

View File

@@ -1,73 +0,0 @@
{
"gradebook.BulkManagementHistoryView.heading": "Historial de administración masiva",
"gradebook.BulkManagementHistoryView": "A continuación se muestra un registro de importaciones de grados anteriores. Para descargar un archivo CSV de su libro de calificaciones e importar las calificaciones para anularlas, regrese al Libro de calificaciones. Tenga en cuenta que, después de importar las calificaciones, es posible que el procesamiento de la anulación demore unos segundos. ",
"gradebook.BulkManagementHistoryView.successDialog": "Procesando archivo CSV. Los archivos subidos pueden tomar algunos minutos para completarse.",
"gradebook.GradebookFilters.assignmentsFilterLabel": "Tareas",
"gradebook.GradebookFilters.overallGradeFilterLabel": "Calificación general",
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Grupos de estudiantes",
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Incluir miembros del equipo del curso",
"gradebook.GradebookFilters.assignmentFilterLabel": "Tarea",
"gradebook.GradebookFilters.assignmentTypesLabel": "Tipos de tareas",
"gradebook.GradebookFilters.maxGradeFilterLabel": "Calificación máxima",
"gradebook.GradebookFilters.minGradeFilterLabel": "Calificación mínima",
"gradebook.GradebookFilters.cohorts": "Cohortes",
"gradebook.GradebookFilters.cohortsAll": "Cohortes-todas",
"gradebook.GradebookFilters.tracks": "Seguimientos",
"gradebook.GradebookFilters.trackAll": " Seguimiento de todo",
"gradebook.GradebookFilters.closeFilters": "Filtros cerrados",
"gradebook.GradebookHeader.backButton": "Volver al Panel de Control",
"gradebook.GradebookHeader.appLabel": "Libro de Calificaciones",
"gradebook.GradebookHeader.frozenWarning": "Las calificaciones para este curso se encuentran congeladas. La edición de las calificaciones ya no se encuentra habilitada. ",
"gradebook.GradebookHeader.unauthorizedWarning": "No tienes autorización para ver el libro de calificaciones de este curso. ",
"gradebook.GradebookHeader.toActivityLogButton": "Ver historial de administración masiva",
"gradebook.GradebookHeader.toGradesView": "Volver al libro de calificaciones.",
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Descargar calificaciones",
"gradebook.GradesView.EditModal.headers.assignment": "Tarea",
"gradebook.GradesView.EditModal.headers.currentGrade": "Calificación actual",
"gradebook.GradesView.EditModal.headers.originalGrade": "Calificación original",
"gradebook.GradesView.EditModal.headers.student": "Estudiante",
"gradebook.GradesView.EditModal.title": "Editar calificaciones",
"gradebook.GradesView.EditModal.closeText": "Cancelar",
"gradebook.GradesView.EditModal.contactSupport": "Mostrar las acciones más recientes (máximo 5). Para ver más, por favor contacta a soporte.",
"gradebook.GradesView.EditModal.saveVisibility": "Nota: una vez hayas guardado, tus cambios serán visibles para los estudiantes.",
"gradebook.GradesView.EditModal.saveGrade": "Guardar calificaciones",
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Ajustar calificación",
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Fecha",
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Calificador",
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Razón",
"gradebook.GradesTab.usersVisibilityLabel'": "Mostrando {filteredUsers} de {totalUsers} estudiantes en total",
"gradebook.GradesView.editFilterLabel": "Editar filtros ",
"gradebook.GradesView.table.headings.email": "Correo electrónico",
"gradebook.GradesView.table.headings.totalGrade": "Calificación total (%)",
"gradebook.GradesView.table.headings.username": "Nombre de usuario",
"gradebook.GradesView.table.labels.studentKey": "Llave de estudiante*",
"gradebook.GradesView.table.labels.username": "Nombre de usuario",
"gradebook.GradesView.table.totalGradePercentage": "Los valores de las calificaciones totales serán siempre mostrados en porcentajes",
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Subir calificación en CSV",
"gradebook.GradesView.importGradesBtnText": "Importar calificaciones",
"gradebook.GradesView.ImportSuccessToast.description": "¡Importación exitosa! Las calificaciones serán actualizadas momentáneamente. ",
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "Ver actividad del log",
"gradebook.GradesView.InterventionsReport.title": "Reporte de intervenciones",
"gradebook.GradesView.InterventionsReport.description": "¿Necesitas encontrar estudiantes que no estén teniendo un buen rendimiento? Descarga el reporte de intervenciones para obtener métricas de comportamiento como lo son las visitas e intentos. ",
"gradebook.GradesView.InterventionsReport.downloadBtn": "Descargar de intervenciones",
"gradebook.GradesView.filterHeading": "Paso 1: Filtra el reporte de calificaciones",
"gradebook.GradesView.gradebookStepHeading": "Paso 2: Mira o modifica las calificaciones individuales",
"gradebook.GradesView.mastersHint": "Disponible solo para estudiante en el seguimiento máster",
"gradebook.GradesView.PageButtons.prevPage": "Página anterior",
"gradebook.GradesView.PageButtons.nextPage": "Siguiente página",
"gradebook.GradesView.scoreViewLabel": "Ver puntaje",
"gradebook.GradesView.absoluteOption": "Absoluto",
"gradebook.GradesView.percentOption": "Porcentaje",
"gradebook.GradesView.search.label": "Busca a un estudiante",
"gradebook.GradesView.search.hint": "Busca por nombre de usuario, correo electrónico o llave de estudiante",
"gradebook.GradesView.editSuccessAlert": "La calificación ha sido editada de manera exitosa. Podrás apreciar un retraso mínimo mientras se realizan las actualizaciones en el libro de calificaciones. ",
"gradebook.GradesView.maxCourseGradeInvalid": "La máxima calificación de curso debe estar entre 0 y 100",
"gradebook.GradesView.minCourseGradeInvalid": "La calificación de curso mínima debe estar entre 0 y 100",
"gradebook.GradesTab.FilterBadges.assignment": "Tarea",
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Calificación de la tarea",
"gradebook.GradesTab.FilterBadges.assignmentType": "Tipo de tarea",
"gradebook.GradesTab.FilterBadges.cohort": "Cohorte",
"gradebook.GradesTab.FilterBadges.courseGrade": "Calificación del curso",
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Incluir miembros del equipo del curso",
"gradebook.GradesTab.FilterBadges.track": "Hacer seguimiento"
}

View File

@@ -1,73 +0,0 @@
{
"gradebook.BulkManagementHistoryView.heading": "تاریخچه مدیریت انبوه",
"gradebook.BulkManagementHistoryView": "در زیر گزارشی از ورود نمره قبلی آمده است. برای بارگیری CSV از کارنامه خود و واردکردن نمرات برای لغو، به کارنامه بازگردید. لطفاً توجه کنید، پس از واردکردن نمرات، ممکن است چند ثانیه طول بکشد تا لغو پردازش شود.",
"gradebook.BulkManagementHistoryView.successDialog": "در حال پردازش بارگیری CSV پرونده. این فرایند ممکن است چند دقیقه طول بکشد تا تکمیل شود.",
"gradebook.GradebookFilters.assignmentsFilterLabel": "تکالیف",
"gradebook.GradebookFilters.overallGradeFilterLabel": "نمره کلی",
"gradebook.GradebookFilters.studentGroupsFilterLabel": "گروه‌های دانش‌آموزی",
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "شامل اعضای تیم دوره آموزشی",
"gradebook.GradebookFilters.assignmentFilterLabel": "تکلیف",
"gradebook.GradebookFilters.assignmentTypesLabel": "انواع تکلیف ",
"gradebook.GradebookFilters.maxGradeFilterLabel": "حداکثر نمره",
"gradebook.GradebookFilters.minGradeFilterLabel": "حداقل نمره",
"gradebook.GradebookFilters.cohorts": "انجمن‌ها",
"gradebook.GradebookFilters.cohortsAll": "انجمن-همه",
"gradebook.GradebookFilters.tracks": "مسیرها",
"gradebook.GradebookFilters.trackAll": "مسیر-همه",
"gradebook.GradebookFilters.closeFilters": "بستن فیلترها",
"gradebook.GradebookHeader.backButton": "بازگشت به پیشخوان",
"gradebook.GradebookHeader.appLabel": "کارنامه",
"gradebook.GradebookHeader.frozenWarning": "نمرات این دوره آموزشی اکنون متوقف شده اند. ویرایش نمرات، دیگر مجاز نیست.",
"gradebook.GradebookHeader.unauthorizedWarning": "شما مجاز به مشاهده کارنامه این دوره آموزشی نیستید.",
"gradebook.GradebookHeader.toActivityLogButton": "مشاهده تاریخچه مدیریت انبوه",
"gradebook.GradebookHeader.toGradesView": "بازگشت به کارنامه",
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "بارگیری نمرات",
"gradebook.GradesView.EditModal.headers.assignment": "تکلیف",
"gradebook.GradesView.EditModal.headers.currentGrade": "نمره کنونی",
"gradebook.GradesView.EditModal.headers.originalGrade": "نمره اصلی",
"gradebook.GradesView.EditModal.headers.student": "دانشجو",
"gradebook.GradesView.EditModal.title": "ویرایش نمرات",
"gradebook.GradesView.EditModal.closeText": "لغو",
"gradebook.GradesView.EditModal.contactSupport": "نمایش آخرین اقدامات (حداکثر 5). برای مشاهده موارد بیشتر لطفا با پشتیبانی تماس بگیرید",
"gradebook.GradesView.EditModal.saveVisibility": "توجه: پس از ذخیره‌سازی، تغییرات شما برای سایرین قابل مشاهده خواهد بود.",
"gradebook.GradesView.EditModal.saveGrade": "ذخیره نمرات",
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "نمره تعدیل‌شده",
"gradebook.GradesView.EditModal.Overrides.dateHeader": "تاریخ ",
"gradebook.GradesView.EditModal.Overrides.graderHeader": "نمره‌دهنده",
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "علت",
"gradebook.GradesTab.usersVisibilityLabel'": "نمایش {filteredUsers} از کل {totalUsers} یادگیرنده",
"gradebook.GradesView.editFilterLabel": "ویرایش فیلترها",
"gradebook.GradesView.table.headings.email": "نشانی رایانامه",
"gradebook.GradesView.table.headings.totalGrade": "نمره کل (%)",
"gradebook.GradesView.table.headings.username": "نام کاربری",
"gradebook.GradesView.table.labels.studentKey": " کلید یادگیرنده*",
"gradebook.GradesView.table.labels.username": "نام کاربری",
"gradebook.GradesView.table.totalGradePercentage": "مقادیر کل نمره همیشه به صورت درصدی نمایش داده می‌شوند",
"gradebook.BulkManagementHistoryView.csvUploadLabel": "بارگذاری CSV نمره",
"gradebook.GradesView.importGradesBtnText": "ورود نمره‌ها",
"gradebook.GradesView.ImportSuccessToast.description": "ورود داده‌ها با موفقیت انجام شد! نمرات به‌صورت لحظه‌ای روزآمد می‌شود.",
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "مشاهده گزارش فعالیت",
"gradebook.GradesView.InterventionsReport.title": "گزارش مداخلات",
"gradebook.GradesView.InterventionsReport.description": "آیا نیاز به یافتن یادگیرندگانی دارید که ممکن است عقب بمانند؟ گزارش مداخلات را دانلود کنید تا معیارهای تعامل مانند میزان تلاش‌ها و بازدیدها را به‌دست آورید.",
"gradebook.GradesView.InterventionsReport.downloadBtn": "دانلود مداخلات",
"gradebook.GradesView.filterHeading": "گام 1: فیلتر گزارش نمره",
"gradebook.GradesView.gradebookStepHeading": "گام 2: مشاهده یا تغییر نمرات فرد",
"gradebook.GradesView.mastersHint": "فقط برای یادگیرندگان در مسیر اصلی در دسترس است",
"gradebook.GradesView.PageButtons.prevPage": "صفحه پیشین",
"gradebook.GradesView.PageButtons.nextPage": "صفحه بعدی",
"gradebook.GradesView.scoreViewLabel": "مشاهده امتیاز",
"gradebook.GradesView.absoluteOption": "کامل",
"gradebook.GradesView.percentOption": "درصد",
"gradebook.GradesView.search.label": "جستجوی یادگیرنده",
"gradebook.GradesView.search.hint": "جستجوی نام کاربری، نشانی رایانامه یا کلید یادگیرنده",
"gradebook.GradesView.editSuccessAlert": "نمره با موفقیت ویرایش شد. ممکن است روزآمدسازی کارنامه کمی تأخیر داشته باشد.",
"gradebook.GradesView.maxCourseGradeInvalid": "حداکثر نمره دوره آموزشی باید بین 0 تا 100 باشد",
"gradebook.GradesView.minCourseGradeInvalid": "حداقل نمره دوره باید بین 0 تا 100 باشد",
"gradebook.GradesTab.FilterBadges.assignment": "تکلیف",
"gradebook.GradesTab.FilterBadges.assignmentGrade": "نمره تکلیف",
"gradebook.GradesTab.FilterBadges.assignmentType": "نوع تکلیف",
"gradebook.GradesTab.FilterBadges.cohort": "انجمن",
"gradebook.GradesTab.FilterBadges.courseGrade": "نمره دوره آموزشی",
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "شامل اعضای تیم دوره آموزشی",
"gradebook.GradesTab.FilterBadges.track": "مسیر"
}

View File

@@ -1,73 +0,0 @@
{
"gradebook.BulkManagementHistoryView.heading": "Historique des changements en lot",
"gradebook.BulkManagementHistoryView": "Ci-dessous se trouve un historique des imports de notes précédents. Pour télécharger un CSV de votre carnet de notes et importer des notes pour les remplacer, retournez au Carnet de Note. Veuillez noter qu'après l'importation des notes, la procédure de remplacement prendra quelques secondes.",
"gradebook.BulkManagementHistoryView.successDialog": "Traitement du CSV en cours. Le téléversement peut prendre plusieurs minutes à compléter.",
"gradebook.GradebookFilters.assignmentsFilterLabel": "Devoirs",
"gradebook.GradebookFilters.overallGradeFilterLabel": "Note globale",
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Groupe d'étudiants",
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Inclure les membres de l'équipe de cours",
"gradebook.GradebookFilters.assignmentFilterLabel": "Devoir",
"gradebook.GradebookFilters.assignmentTypesLabel": "Types de travaux",
"gradebook.GradebookFilters.maxGradeFilterLabel": "Note Maximale",
"gradebook.GradebookFilters.minGradeFilterLabel": "Note Minimale",
"gradebook.GradebookFilters.cohorts": "Cohortes",
"gradebook.GradebookFilters.cohortsAll": "Toutes les cohortes",
"gradebook.GradebookFilters.tracks": "Parcours",
"gradebook.GradebookFilters.trackAll": "Tous les parcours",
"gradebook.GradebookFilters.closeFilters": "Fermer les filtres",
"gradebook.GradebookHeader.backButton": "Retour au tableau de bord",
"gradebook.GradebookHeader.appLabel": "Bulletin de notes",
"gradebook.GradebookHeader.frozenWarning": "Les notes de ce cours sont gelées. Éditer les notes n'est plus permis.",
"gradebook.GradebookHeader.unauthorizedWarning": "Vous n'êtes pas autorisé à voir le livret de notes pour ce cours",
"gradebook.GradebookHeader.toActivityLogButton": "Voir l'historique des changements en lot",
"gradebook.GradebookHeader.toGradesView": "Retourner au carnet de notes",
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Télécharger les notes",
"gradebook.GradesView.EditModal.headers.assignment": "Devoir",
"gradebook.GradesView.EditModal.headers.currentGrade": "Note actuelle",
"gradebook.GradesView.EditModal.headers.originalGrade": "Note initiale",
"gradebook.GradesView.EditModal.headers.student": "Étudiant",
"gradebook.GradesView.EditModal.title": "Editez les notes",
"gradebook.GradesView.EditModal.closeText": "Annuler",
"gradebook.GradesView.EditModal.contactSupport": "Affiche les plus récentes actions (max 5). Pour en voir plus, veuillez contacter le support.",
"gradebook.GradesView.EditModal.saveVisibility": "Note : une fois sauvegardés, vos changements seront visibles aux étudiants.",
"gradebook.GradesView.EditModal.saveGrade": "Sauvegarder les notes",
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Note ajustée",
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Correcteur",
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Motif",
"gradebook.GradesTab.usersVisibilityLabel'": "Affiche {filteredUsers} des {totalUsers} apprenants totaux",
"gradebook.GradesView.editFilterLabel": "Editer les filtres",
"gradebook.GradesView.table.headings.email": "Email",
"gradebook.GradesView.table.headings.totalGrade": "Note totale (%)",
"gradebook.GradesView.table.headings.username": "Nom dutilisateur",
"gradebook.GradesView.table.labels.studentKey": "Clé d'étudiant",
"gradebook.GradesView.table.labels.username": "Nom dutilisateur",
"gradebook.GradesView.table.totalGradePercentage": "La note totale est toujours affiché en pourcentage",
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Importer les notes CSV",
"gradebook.GradesView.importGradesBtnText": "Importer les notes",
"gradebook.GradesView.ImportSuccessToast.description": "Import réussi ! Les notes vont être mises à jour.",
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "Voir le rapport d'activité",
"gradebook.GradesView.InterventionsReport.title": "Rapport d'interventions",
"gradebook.GradesView.InterventionsReport.description": "Besoin de trouver les étudiants en difficulté ? Téléchargez le rapport d'interventions afin d'obtenir les métriques d'engagement telles que le nombre de tentatives ou de visites des sections.",
"gradebook.GradesView.InterventionsReport.downloadBtn": "Télécharger les interventions",
"gradebook.GradesView.filterHeading": "Étape 1 : Filtrer le rapport de notes",
"gradebook.GradesView.gradebookStepHeading": "Étape 2 : Voir ou modifier les notes individuelles",
"gradebook.GradesView.mastersHint": "disponible seulement aux apprenants sur le parcours Master",
"gradebook.GradesView.PageButtons.prevPage": "Page précédente",
"gradebook.GradesView.PageButtons.nextPage": "Page suivante",
"gradebook.GradesView.scoreViewLabel": "Vue des notes",
"gradebook.GradesView.absoluteOption": "Absolu",
"gradebook.GradesView.percentOption": "Pourcentage",
"gradebook.GradesView.search.label": "Rechercher un apprenant",
"gradebook.GradesView.search.hint": "Chercher par nom d'utilisateur, email ou clé d'étudiant",
"gradebook.GradesView.editSuccessAlert": "Les notes ont été éditées avec succès. Un délai est possible avant que vous ne constatiez la mise-à-jour dans le carnet de note.",
"gradebook.GradesView.maxCourseGradeInvalid": "La note maximale du cours doit être entre 0 et 100",
"gradebook.GradesView.minCourseGradeInvalid": "La note minimale du cours doit être entre 0 et 100",
"gradebook.GradesTab.FilterBadges.assignment": "Devoir",
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Note des devoirs",
"gradebook.GradesTab.FilterBadges.assignmentType": "Type de travail",
"gradebook.GradesTab.FilterBadges.cohort": "Cohorte",
"gradebook.GradesTab.FilterBadges.courseGrade": "Note du cours",
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Inclure les membres de l'équipe de cours",
"gradebook.GradesTab.FilterBadges.track": "Parcours"
}

View File

@@ -1,73 +0,0 @@
{
"gradebook.BulkManagementHistoryView.heading": "Historique des changements en lot",
"gradebook.BulkManagementHistoryView": "Ci-dessous se trouve un historique des importations de notes précédentes. Pour télécharger un CSV de votre carnet de notes et importer des notes pour les remplacer, retournez au Carnet de Note. Veuillez noter qu'après l'importation des notes, la procédure de remplacement prendra quelques secondes.",
"gradebook.BulkManagementHistoryView.successDialog": "Traitement du CSV en cours. Le téléversement peut prendre plusieurs minutes à compléter.",
"gradebook.GradebookFilters.assignmentsFilterLabel": "Devoirs",
"gradebook.GradebookFilters.overallGradeFilterLabel": "Note globale",
"gradebook.GradebookFilters.studentGroupsFilterLabel": "Groupes d'étudiant",
"gradebook.GradebookFilters.includeCourseTeamMembersFilterLabel": "Inclure les membres de l'équipe de cours",
"gradebook.GradebookFilters.assignmentFilterLabel": "Devoir",
"gradebook.GradebookFilters.assignmentTypesLabel": "Types de travaux",
"gradebook.GradebookFilters.maxGradeFilterLabel": "Note maximale",
"gradebook.GradebookFilters.minGradeFilterLabel": "Note minimale",
"gradebook.GradebookFilters.cohorts": "Cohortes",
"gradebook.GradebookFilters.cohortsAll": "Toutes les cohortes",
"gradebook.GradebookFilters.tracks": "Parcours",
"gradebook.GradebookFilters.trackAll": "Tous les parcours",
"gradebook.GradebookFilters.closeFilters": "Fermer filtres",
"gradebook.GradebookHeader.backButton": "Retour au tableau de bord",
"gradebook.GradebookHeader.appLabel": "Bulletin de notes",
"gradebook.GradebookHeader.frozenWarning": "Les notes de ce cours sont gelées. Éditer les notes n'est plus permis.",
"gradebook.GradebookHeader.unauthorizedWarning": "Vous n'êtes pas autorisé à voir le carnet de note de ce cours.",
"gradebook.GradebookHeader.toActivityLogButton": "Voir l'historique des changements en lot",
"gradebook.GradebookHeader.toGradesView": "Retourner au carnet de notes",
"gradebook.GradesView.BulkManagementControls.bulkManagementLabel": "Télécharger les notes",
"gradebook.GradesView.EditModal.headers.assignment": "Devoir",
"gradebook.GradesView.EditModal.headers.currentGrade": "Note actuelle",
"gradebook.GradesView.EditModal.headers.originalGrade": "Note originale",
"gradebook.GradesView.EditModal.headers.student": "Étudiant",
"gradebook.GradesView.EditModal.title": "Éditer les notes",
"gradebook.GradesView.EditModal.closeText": "Annuler",
"gradebook.GradesView.EditModal.contactSupport": "Affiche les plus récentes actions (max 5). Pour en voir plus, veuillez contacter le support",
"gradebook.GradesView.EditModal.saveVisibility": "Note : une fois sauvegardés, vos changements seront visibles aux étudiants.",
"gradebook.GradesView.EditModal.saveGrade": "Sauvegarde des notes",
"gradebook.GradesView.EditModal.Overrides.adjustedGradeHeader": "Notes ajustées",
"gradebook.GradesView.EditModal.Overrides.dateHeader": "Date",
"gradebook.GradesView.EditModal.Overrides.graderHeader": "Correcteur",
"gradebook.GradesView.EditModal.Overrides.reasonHeader": "Raison",
"gradebook.GradesTab.usersVisibilityLabel'": "Affiche {filteredUsers} des {totalUsers} apprenants totaux",
"gradebook.GradesView.editFilterLabel": "Éditer les filtres",
"gradebook.GradesView.table.headings.email": "Courriel",
"gradebook.GradesView.table.headings.totalGrade": "Note totale (%)",
"gradebook.GradesView.table.headings.username": "Nom d'utilisateur",
"gradebook.GradesView.table.labels.studentKey": "Clé étudiante*",
"gradebook.GradesView.table.labels.username": "Nom d'utilisateur",
"gradebook.GradesView.table.totalGradePercentage": "La valeur des notes totales est toujours affichée en pourcentage",
"gradebook.BulkManagementHistoryView.csvUploadLabel": "Téléverser les notes en CSV",
"gradebook.GradesView.importGradesBtnText": "Importer les notes",
"gradebook.GradesView.ImportSuccessToast.description": "Importation réussie! Les notes seront mises à jour momentanément.",
"gradebook.GradesView.ImportSuccessToast.showHistoryViewBtn": "Voir le log des activités",
"gradebook.GradesView.InterventionsReport.title": "Rapport des interventions",
"gradebook.GradesView.InterventionsReport.description": "Besoin de trouver les étudiants en difficulté? Téléchargez le rapport d'interventions afin d'obtenir les métriques d'engagement telles que le nombre de tentatives ou de visites des sections.",
"gradebook.GradesView.InterventionsReport.downloadBtn": "Télécharger les interventions",
"gradebook.GradesView.filterHeading": "Étape 1 : Filtrer le rapport de notes",
"gradebook.GradesView.gradebookStepHeading": "Étape 2 : Voir ou modifier les notes individuelles",
"gradebook.GradesView.mastersHint": "disponible seulement aux apprenants sur le parcours Master",
"gradebook.GradesView.PageButtons.prevPage": "Page précédente",
"gradebook.GradesView.PageButtons.nextPage": "Page suivante",
"gradebook.GradesView.scoreViewLabel": "Vue des scores",
"gradebook.GradesView.absoluteOption": "Absolu",
"gradebook.GradesView.percentOption": "Pourcentage",
"gradebook.GradesView.search.label": "Chercher pour un apprenant",
"gradebook.GradesView.search.hint": "Chercher par nom d'utilisateur, courriel ou clé étudiante",
"gradebook.GradesView.editSuccessAlert": "Les notes ont été éditées avec succès. Un délai est possible avant que vous ne constatiez la mise-à-jour dans le carnet de note.",
"gradebook.GradesView.maxCourseGradeInvalid": "Note maximale du cours doit être entre 0 et 100",
"gradebook.GradesView.minCourseGradeInvalid": "Note minimale du cours doit être entre 0 et 100",
"gradebook.GradesTab.FilterBadges.assignment": "Devoir",
"gradebook.GradesTab.FilterBadges.assignmentGrade": "Note de devoir",
"gradebook.GradesTab.FilterBadges.assignmentType": "Type de devoir",
"gradebook.GradesTab.FilterBadges.cohort": "Cohorte",
"gradebook.GradesTab.FilterBadges.courseGrade": "Note du cours",
"gradebook.GradesTab.FilterBadges.includeCourseRoleMembers": "Inclure les membres de l'équipe de cours",
"gradebook.GradesTab.FilterBadges.track": "Parcours"
}

Some files were not shown because too many files have changed in this diff Show More