From bf6af13ed170f8eb0f70c45c9dbc9e72511489f1 Mon Sep 17 00:00:00 2001 From: Kshitij Sobti Date: Mon, 19 Mar 2018 04:50:56 +0530 Subject: [PATCH] Add UI to browse and browse course structure and select the course/chapter/section... to generate a report of --- .../js/components/BlockBrowser/.eslintrc.js | 11 + .../components/BlockBrowser/BlockBrowser.jsx | 114 ++ .../BlockBrowser/BlockBrowser.test.jsx | 49 + .../BlockBrowser/BlockBrowserContainer.jsx | 22 + .../__snapshots__/BlockBrowser.test.jsx.snap | 706 ++++++++ .../BlockBrowser/test-block-tree.json | 1390 ++++++++++++++++ .../BlockBrowser/data/actions/constants.js | 8 + .../BlockBrowser/data/actions/courseBlocks.js | 38 + .../BlockBrowser/data/api/client.js | 34 + .../BlockBrowser/data/reducers/index.js | 55 + .../BlockBrowser/data/selectors/index.js | 16 + .../js/components/BlockBrowser/data/store.js | 15 + .../js/components/BlockBrowser/index.jsx | 12 + jest.config.js | 5 +- .../instructor/ProblemBrowser/.eslintrc.js | 11 + .../ProblemBrowser/components/Main/Main.jsx | 54 + .../components/Main/Main.test.jsx | 72 +- .../components/Main/MainContainer.jsx | 22 + .../Main/__snapshots__/Main.test.jsx.snap | 25 +- .../instructor/ProblemBrowser/index.jsx | 12 + .../sass/course/instructor/_instructor_2.scss | 47 + .../instructor_dashboard_2/data_download.html | 27 +- .../instructor_dashboard_2.html | 2 +- package-lock.json | 1458 ++++++++++------- package.json | 9 +- pavelib/paver_tests/test_js_test.py | 6 +- setupTests.js | 6 + webpack.common.config.js | 2 + 28 files changed, 3637 insertions(+), 591 deletions(-) create mode 100644 common/static/common/js/components/BlockBrowser/.eslintrc.js create mode 100644 common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.jsx create mode 100644 common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.test.jsx create mode 100644 common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowserContainer.jsx create mode 100644 common/static/common/js/components/BlockBrowser/components/BlockBrowser/__snapshots__/BlockBrowser.test.jsx.snap create mode 100644 common/static/common/js/components/BlockBrowser/components/BlockBrowser/test-block-tree.json create mode 100644 common/static/common/js/components/BlockBrowser/data/actions/constants.js create mode 100644 common/static/common/js/components/BlockBrowser/data/actions/courseBlocks.js create mode 100644 common/static/common/js/components/BlockBrowser/data/api/client.js create mode 100644 common/static/common/js/components/BlockBrowser/data/reducers/index.js create mode 100644 common/static/common/js/components/BlockBrowser/data/selectors/index.js create mode 100644 common/static/common/js/components/BlockBrowser/data/store.js create mode 100644 common/static/common/js/components/BlockBrowser/index.jsx create mode 100644 lms/djangoapps/instructor/static/instructor/ProblemBrowser/.eslintrc.js create mode 100644 lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.jsx create mode 100644 lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/MainContainer.jsx create mode 100644 lms/djangoapps/instructor/static/instructor/ProblemBrowser/index.jsx create mode 100644 setupTests.js diff --git a/common/static/common/js/components/BlockBrowser/.eslintrc.js b/common/static/common/js/components/BlockBrowser/.eslintrc.js new file mode 100644 index 000000000000..838b853a8277 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + extends: 'eslint-config-edx', + root: true, + settings: { + 'import/resolver': { + webpack: { + config: 'webpack.dev.config.js', + }, + }, + }, +}; diff --git a/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.jsx b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.jsx new file mode 100644 index 000000000000..b1817f221658 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.jsx @@ -0,0 +1,114 @@ +/* global gettext */ +import { Button, Icon } from '@edx/paragon'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; +import React from 'react'; + +const RightIcon = ( + +); + +const UpIcon = ( + +); + +const BLOCK_TYPE_NAME = { + course: 'Course', + chapter: 'Section', + sequential: 'Sub-section', + vertical: 'Unit', +}; + +const BlockType = PropTypes.shape({ + children: PropTypes.array, + display_name: PropTypes.string.isRequired, + id: PropTypes.string.isRequired, + parent: PropTypes.string, + type: PropTypes.string.isRequired, +}); + +export const BlockList = ({ blocks, selectedBlock, onSelectBlock, onChangeRoot }) => ( +
    + {blocks.map(block => ( +
  • +
  • + ))} +
+); + +BlockList.propTypes = { + blocks: PropTypes.arrayOf(BlockType), + selectedBlock: PropTypes.string, + onSelectBlock: PropTypes.func.isRequired, + onChangeRoot: PropTypes.func.isRequired, +}; + +BlockList.defaultProps = { + blocks: null, + selectedBlock: null, +}; + + +export const BlockBrowser = ({ blocks, selectedBlock, onSelectBlock, onChangeRoot, className }) => + !!blocks && ( +
+
+
+ +
+ ); + +BlockBrowser.propTypes = { + blocks: BlockType, + selectedBlock: PropTypes.string, + onSelectBlock: PropTypes.func.isRequired, + onChangeRoot: PropTypes.func.isRequired, +}; + +BlockBrowser.defaultProps = { + blocks: null, + selectedBlock: null, +}; diff --git a/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.test.jsx b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.test.jsx new file mode 100644 index 000000000000..861e7fec3b27 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowser.test.jsx @@ -0,0 +1,49 @@ +/* global jest,test,describe,expect */ +import React from 'react'; +import renderer from 'react-test-renderer'; +import { BlockBrowser, BlockList } from './BlockBrowser'; +import testBlockTree from './test-block-tree.json'; + +describe('BlockList component', () => { + test('render with basic parameters', () => { + const component = renderer.create( + , + ); + const tree = component.toJSON(); + expect(tree).toMatchSnapshot(); + }); +}); + +describe('BlockBrowser component', () => { + test('render with basic parameters', () => { + const component = renderer.create( + , + ); + const tree = component.toJSON(); + expect(tree).toMatchSnapshot(); + }); + + test('render with custom classname', () => { + const component = renderer.create( + , + ); + const tree = component.toJSON(); + expect(tree).toMatchSnapshot(); + }); +}); diff --git a/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowserContainer.jsx b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowserContainer.jsx new file mode 100644 index 000000000000..d3931c2bb541 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/BlockBrowserContainer.jsx @@ -0,0 +1,22 @@ +import { connect } from 'react-redux'; +import { changeRoot } from '../../data/actions/courseBlocks'; +import { getActiveBlockTree } from '../../data/selectors/index'; +import { BlockBrowser } from './BlockBrowser'; + +const mapStateToProps = state => ({ + blocks: getActiveBlockTree(state), + selectedBlock: state.selectedBlock, +}); + + +const mapDispatchToProps = dispatch => ({ + onChangeRoot: blockId => dispatch(changeRoot(blockId)), +}); + + +const BlockBrowserContainer = connect( + mapStateToProps, + mapDispatchToProps, +)(BlockBrowser); + +export default BlockBrowserContainer; diff --git a/common/static/common/js/components/BlockBrowser/components/BlockBrowser/__snapshots__/BlockBrowser.test.jsx.snap b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/__snapshots__/BlockBrowser.test.jsx.snap new file mode 100644 index 000000000000..d51261cbc1cf --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/__snapshots__/BlockBrowser.test.jsx.snap @@ -0,0 +1,706 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`BlockBrowser component render with basic parameters 1`] = ` +
+
+ + + Browsing + + Course + " + + edX Demonstration Course + + ": + +
+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
+
+`; + +exports[`BlockBrowser component render with custom classname 1`] = ` +
+
+ + + Browsing + + Course + " + + edX Demonstration Course + + ": + +
+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
+
+`; + +exports[`BlockList component render with basic parameters 1`] = ` +
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
+`; diff --git a/common/static/common/js/components/BlockBrowser/components/BlockBrowser/test-block-tree.json b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/test-block-tree.json new file mode 100644 index 000000000000..9fe2278067d9 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/components/BlockBrowser/test-block-tree.json @@ -0,0 +1,1390 @@ +{ + "parent": null, + "display_name": "edX Demonstration Course", + "block_id": "course", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "display_name": "Introduction", + "block_id": "d8a6192ade314473a78242dfeedfbf5b", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@d8a6192ade314473a78242dfeedfbf5b", + "display_name": "Demo Course Overview", + "block_id": "edx_introduction", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@edx_introduction", + "display_name": "Introduction: Video and Sequences", + "block_id": "vertical_0270f6de40fc", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc", + "display_name": "Blank HTML Page", + "block_id": "030e35c4756a4ddc8d40b95fbbfff4d4", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@030e35c4756a4ddc8d40b95fbbfff4d4", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@030e35c4756a4ddc8d40b95fbbfff4d4", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@030e35c4756a4ddc8d40b95fbbfff4d4" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc", + "display_name": "Discussion", + "block_id": "236f057b15b84679a26cd8c6af34e8d4", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@236f057b15b84679a26cd8c6af34e8d4", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@236f057b15b84679a26cd8c6af34e8d4", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@236f057b15b84679a26cd8c6af34e8d4" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc", + "display_name": "Welcome!", + "block_id": "0b9e39477cf34507a7a48f74be381fdd", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@video+block@0b9e39477cf34507a7a48f74be381fdd", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@video+block@0b9e39477cf34507a7a48f74be381fdd", + "type": "video", + "id": "block-v1:edX+DemoX+Demo_Course+type@video+block@0b9e39477cf34507a7a48f74be381fdd" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0270f6de40fc" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@edx_introduction", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@edx_introduction", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@edx_introduction" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@chapter+block@d8a6192ade314473a78242dfeedfbf5b", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@chapter+block@d8a6192ade314473a78242dfeedfbf5b", + "type": "chapter", + "id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@d8a6192ade314473a78242dfeedfbf5b" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "display_name": "Example Week 1: Getting Started", + "block_id": "interactive_demonstrations", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@interactive_demonstrations", + "display_name": "Lesson 1 - Getting Started", + "block_id": "19a30717eff543078a5d94ae9d6c18a5", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "display_name": "Getting Started", + "block_id": "867dddb6f55d410caaa9c1eb9c6743ec", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@867dddb6f55d410caaa9c1eb9c6743ec", + "display_name": "Getting Started", + "block_id": "82d599b014b246c7a9b5dfc750dc08a9", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@82d599b014b246c7a9b5dfc750dc08a9", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@82d599b014b246c7a9b5dfc750dc08a9", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@82d599b014b246c7a9b5dfc750dc08a9" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@867dddb6f55d410caaa9c1eb9c6743ec", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@867dddb6f55d410caaa9c1eb9c6743ec", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@867dddb6f55d410caaa9c1eb9c6743ec" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "display_name": "Working with Videos", + "block_id": "4f6c1b4e316a419ab5b6bf30e6c708e9", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@4f6c1b4e316a419ab5b6bf30e6c708e9", + "display_name": "", + "block_id": "6bcccc2d7343416e9e03fd7325b2f232", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@6bcccc2d7343416e9e03fd7325b2f232", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@6bcccc2d7343416e9e03fd7325b2f232", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@6bcccc2d7343416e9e03fd7325b2f232" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@4f6c1b4e316a419ab5b6bf30e6c708e9", + "display_name": "Science and Cooking Chef Profile: JOSÉ ANDRÉS", + "block_id": "7e9b434e6de3435ab99bd3fb25bde807", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@video+block@7e9b434e6de3435ab99bd3fb25bde807", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@video+block@7e9b434e6de3435ab99bd3fb25bde807", + "type": "video", + "id": "block-v1:edX+DemoX+Demo_Course+type@video+block@7e9b434e6de3435ab99bd3fb25bde807" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@4f6c1b4e316a419ab5b6bf30e6c708e9", + "display_name": "Working with Videos", + "block_id": "412dc8dbb6674014862237b23c1f643f", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@412dc8dbb6674014862237b23c1f643f", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@412dc8dbb6674014862237b23c1f643f", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@412dc8dbb6674014862237b23c1f643f" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@4f6c1b4e316a419ab5b6bf30e6c708e9", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@4f6c1b4e316a419ab5b6bf30e6c708e9", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@4f6c1b4e316a419ab5b6bf30e6c708e9" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "display_name": "Videos on edX", + "block_id": "3dc16db8d14842e38324e95d4030b8a0", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3dc16db8d14842e38324e95d4030b8a0", + "display_name": "Videos on edX", + "block_id": "0a3b4139f51a4917a3aff9d519b1eeb6", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@0a3b4139f51a4917a3aff9d519b1eeb6", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@0a3b4139f51a4917a3aff9d519b1eeb6", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@0a3b4139f51a4917a3aff9d519b1eeb6" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3dc16db8d14842e38324e95d4030b8a0", + "display_name": "Video", + "block_id": "5c90cffecd9b48b188cbfea176bf7fe9", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@video+block@5c90cffecd9b48b188cbfea176bf7fe9", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@video+block@5c90cffecd9b48b188cbfea176bf7fe9", + "type": "video", + "id": "block-v1:edX+DemoX+Demo_Course+type@video+block@5c90cffecd9b48b188cbfea176bf7fe9" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3dc16db8d14842e38324e95d4030b8a0", + "display_name": "Videos on edX", + "block_id": "722085be27c84ac693cfebc8ac5da700", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@722085be27c84ac693cfebc8ac5da700", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@722085be27c84ac693cfebc8ac5da700", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@722085be27c84ac693cfebc8ac5da700" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@3dc16db8d14842e38324e95d4030b8a0", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@3dc16db8d14842e38324e95d4030b8a0", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3dc16db8d14842e38324e95d4030b8a0" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "display_name": "Video Demonstrations", + "block_id": "4a1bba2a403f40bca5ec245e945b0d76", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@4a1bba2a403f40bca5ec245e945b0d76", + "display_name": "", + "block_id": "ed5dccf14ae94353961f46fa07217491", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@ed5dccf14ae94353961f46fa07217491", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@ed5dccf14ae94353961f46fa07217491", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@ed5dccf14ae94353961f46fa07217491" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@4a1bba2a403f40bca5ec245e945b0d76", + "display_name": "Video Demonstrations", + "block_id": "9f9e1373cc8243b985c8750cc8acec7d", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@9f9e1373cc8243b985c8750cc8acec7d", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@9f9e1373cc8243b985c8750cc8acec7d", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@9f9e1373cc8243b985c8750cc8acec7d" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@4a1bba2a403f40bca5ec245e945b0d76", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@4a1bba2a403f40bca5ec245e945b0d76", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@4a1bba2a403f40bca5ec245e945b0d76" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "display_name": "Video Presentation Styles", + "block_id": "256f17a44983429fb1a60802203ee4e0", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@256f17a44983429fb1a60802203ee4e0", + "display_name": "", + "block_id": "c2f7008c9ccf4bd09d5d800c98fb0722", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@c2f7008c9ccf4bd09d5d800c98fb0722", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@c2f7008c9ccf4bd09d5d800c98fb0722", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@c2f7008c9ccf4bd09d5d800c98fb0722" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@256f17a44983429fb1a60802203ee4e0", + "display_name": "Connecting a Circuit and a Circuit Diagram", + "block_id": "636541acbae448d98ab484b028c9a7f6", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@video+block@636541acbae448d98ab484b028c9a7f6", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@video+block@636541acbae448d98ab484b028c9a7f6", + "type": "video", + "id": "block-v1:edX+DemoX+Demo_Course+type@video+block@636541acbae448d98ab484b028c9a7f6" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@256f17a44983429fb1a60802203ee4e0", + "display_name": "Video Presentation Styles", + "block_id": "e2cb0e0994f84b0abfa5f4ae42ed9d44", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@e2cb0e0994f84b0abfa5f4ae42ed9d44", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@e2cb0e0994f84b0abfa5f4ae42ed9d44", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@e2cb0e0994f84b0abfa5f4ae42ed9d44" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@256f17a44983429fb1a60802203ee4e0", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@256f17a44983429fb1a60802203ee4e0", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@256f17a44983429fb1a60802203ee4e0" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "display_name": "Interactive Questions", + "block_id": "e3601c0abee6427d8c17e6d6f8fdddd1", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e3601c0abee6427d8c17e6d6f8fdddd1", + "display_name": "Interactive Questions", + "block_id": "9cee77a606ea4c1aa5440e0ea5d0f618", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@9cee77a606ea4c1aa5440e0ea5d0f618", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@9cee77a606ea4c1aa5440e0ea5d0f618", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@9cee77a606ea4c1aa5440e0ea5d0f618" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e3601c0abee6427d8c17e6d6f8fdddd1", + "display_name": "", + "block_id": "3169f89efde2452993f2f2d9bc74f5b2", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@3169f89efde2452993f2f2d9bc74f5b2", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@3169f89efde2452993f2f2d9bc74f5b2", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@3169f89efde2452993f2f2d9bc74f5b2" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@e3601c0abee6427d8c17e6d6f8fdddd1", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@e3601c0abee6427d8c17e6d6f8fdddd1", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e3601c0abee6427d8c17e6d6f8fdddd1" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "display_name": "Reading Assignments", + "block_id": "134df56c516a4a0dbb24dd5facef746e", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e", + "display_name": "Reading Assignments", + "block_id": "e0254b911fa246218bd98bbdadffef06", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@e0254b911fa246218bd98bbdadffef06", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@e0254b911fa246218bd98bbdadffef06", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@e0254b911fa246218bd98bbdadffef06" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e", + "display_name": "Text", + "block_id": "2574c523e97b477a9d72fbb37bfb995f", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@2574c523e97b477a9d72fbb37bfb995f", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@2574c523e97b477a9d72fbb37bfb995f", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@2574c523e97b477a9d72fbb37bfb995f" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e", + "display_name": "Perchance to Dream", + "block_id": "932e6f2ce8274072a355a94560216d1a", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@932e6f2ce8274072a355a94560216d1a", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@932e6f2ce8274072a355a94560216d1a", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@932e6f2ce8274072a355a94560216d1a" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e", + "display_name": "Attributing Blame", + "block_id": "303034da25524878a2e66fb57c91cf85", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@303034da25524878a2e66fb57c91cf85", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@303034da25524878a2e66fb57c91cf85", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@303034da25524878a2e66fb57c91cf85" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e", + "display_name": "Reading Sample", + "block_id": "ffa5817d49e14fec83ad6187cbe16358", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ffa5817d49e14fec83ad6187cbe16358", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ffa5817d49e14fec83ad6187cbe16358", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@ffa5817d49e14fec83ad6187cbe16358" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@134df56c516a4a0dbb24dd5facef746e" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@interactive_demonstrations", + "display_name": "Homework - Question Styles", + "block_id": "basic_questions", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "display_name": "Pointing on a Picture", + "block_id": "2152d4a4aadc4cb0af5256394a3d1fc7", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@2152d4a4aadc4cb0af5256394a3d1fc7", + "display_name": "Pointing on a Picture", + "block_id": "c554538a57664fac80783b99d9d6da7c", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@c554538a57664fac80783b99d9d6da7c", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@c554538a57664fac80783b99d9d6da7c", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@c554538a57664fac80783b99d9d6da7c" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@2152d4a4aadc4cb0af5256394a3d1fc7", + "display_name": "", + "block_id": "e5eac7e1a5a24f5fa7ed77bb6d136591", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@e5eac7e1a5a24f5fa7ed77bb6d136591", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@e5eac7e1a5a24f5fa7ed77bb6d136591", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@e5eac7e1a5a24f5fa7ed77bb6d136591" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@2152d4a4aadc4cb0af5256394a3d1fc7", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@2152d4a4aadc4cb0af5256394a3d1fc7", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@2152d4a4aadc4cb0af5256394a3d1fc7" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "display_name": "Drag and Drop", + "block_id": "47dbd5f836544e61877a483c0b75606c", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@47dbd5f836544e61877a483c0b75606c", + "display_name": "Drag and Drop", + "block_id": "d2e35c1d294b4ba0b3b1048615605d2a", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@d2e35c1d294b4ba0b3b1048615605d2a", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@d2e35c1d294b4ba0b3b1048615605d2a", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@d2e35c1d294b4ba0b3b1048615605d2a" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@47dbd5f836544e61877a483c0b75606c", + "display_name": "", + "block_id": "5ab88e67d46049b9aa694cb240c39cef", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@5ab88e67d46049b9aa694cb240c39cef", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@5ab88e67d46049b9aa694cb240c39cef", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@5ab88e67d46049b9aa694cb240c39cef" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@47dbd5f836544e61877a483c0b75606c", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@47dbd5f836544e61877a483c0b75606c", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@47dbd5f836544e61877a483c0b75606c" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "display_name": "Multiple Choice Questions", + "block_id": "54bb9b142c6c4c22afc62bcb628f0e68", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@54bb9b142c6c4c22afc62bcb628f0e68", + "display_name": "Multiple Choice Questions", + "block_id": "a0effb954cca4759994f1ac9e9434bf4", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@a0effb954cca4759994f1ac9e9434bf4", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@a0effb954cca4759994f1ac9e9434bf4", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@a0effb954cca4759994f1ac9e9434bf4" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@54bb9b142c6c4c22afc62bcb628f0e68", + "display_name": "", + "block_id": "67c26b1e826e47aaa29757f62bcd1ad0", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@67c26b1e826e47aaa29757f62bcd1ad0", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@67c26b1e826e47aaa29757f62bcd1ad0", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@67c26b1e826e47aaa29757f62bcd1ad0" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@54bb9b142c6c4c22afc62bcb628f0e68", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@54bb9b142c6c4c22afc62bcb628f0e68", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@54bb9b142c6c4c22afc62bcb628f0e68" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "display_name": "Mathematical Expressions", + "block_id": "vertical_0c92347a5c00", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0c92347a5c00", + "display_name": "Mathematical Expressions", + "block_id": "Sample_Algebraic_Problem", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@Sample_Algebraic_Problem", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@Sample_Algebraic_Problem", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@Sample_Algebraic_Problem" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0c92347a5c00", + "display_name": "", + "block_id": "870371212ba04dcf9536d7c7b8f3109e", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@870371212ba04dcf9536d7c7b8f3109e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@870371212ba04dcf9536d7c7b8f3109e", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@870371212ba04dcf9536d7c7b8f3109e" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0c92347a5c00", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0c92347a5c00", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0c92347a5c00" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "display_name": "Chemical Equations", + "block_id": "vertical_1fef54c2b23b", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_1fef54c2b23b", + "display_name": "Chemical Equations", + "block_id": "Sample_ChemFormula_Problem", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@Sample_ChemFormula_Problem", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@Sample_ChemFormula_Problem", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@Sample_ChemFormula_Problem" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_1fef54c2b23b", + "display_name": "", + "block_id": "4d672c5893cb4f1dad0de67d2008522e", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@4d672c5893cb4f1dad0de67d2008522e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@4d672c5893cb4f1dad0de67d2008522e", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@4d672c5893cb4f1dad0de67d2008522e" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_1fef54c2b23b", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_1fef54c2b23b", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_1fef54c2b23b" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "display_name": "Numerical Input", + "block_id": "2889db1677a549abb15eb4d886f95d1c", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@2889db1677a549abb15eb4d886f95d1c", + "display_name": "Numerical Input", + "block_id": "75f9562c77bc4858b61f907bb810d974", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@75f9562c77bc4858b61f907bb810d974", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@75f9562c77bc4858b61f907bb810d974", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@75f9562c77bc4858b61f907bb810d974" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@2889db1677a549abb15eb4d886f95d1c", + "display_name": "", + "block_id": "501aed9d902349eeb2191fa505548de2", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@501aed9d902349eeb2191fa505548de2", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@501aed9d902349eeb2191fa505548de2", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@501aed9d902349eeb2191fa505548de2" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@2889db1677a549abb15eb4d886f95d1c", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@2889db1677a549abb15eb4d886f95d1c", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@2889db1677a549abb15eb4d886f95d1c" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "display_name": "Text input", + "block_id": "e8a5cc2aed424838853defab7be45e42", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e8a5cc2aed424838853defab7be45e42", + "display_name": "Text Input", + "block_id": "0d759dee4f9d459c8956136dbde55f02", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@0d759dee4f9d459c8956136dbde55f02", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@0d759dee4f9d459c8956136dbde55f02", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@0d759dee4f9d459c8956136dbde55f02" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e8a5cc2aed424838853defab7be45e42", + "display_name": "", + "block_id": "6244918637ed4ff4b5f94a840a7e4b43", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@6244918637ed4ff4b5f94a840a7e4b43", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@6244918637ed4ff4b5f94a840a7e4b43", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@6244918637ed4ff4b5f94a840a7e4b43" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@e8a5cc2aed424838853defab7be45e42", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@e8a5cc2aed424838853defab7be45e42", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@e8a5cc2aed424838853defab7be45e42" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@basic_questions" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@chapter+block@interactive_demonstrations", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@chapter+block@interactive_demonstrations", + "type": "chapter", + "id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@interactive_demonstrations" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "display_name": "Example Week 2: Get Interactive", + "block_id": "graded_interactions", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@graded_interactions", + "display_name": "Lesson 2 - Let's Get Interactive!", + "block_id": "simulations", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@simulations", + "display_name": "Lesson 2 - Let's Get Interactive! ", + "block_id": "d0d804e8863c4a95a659c04d8a2b2bc0", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@d0d804e8863c4a95a659c04d8a2b2bc0", + "display_name": "Lesson 2: Let's Get Interactive!", + "block_id": "78d7d3642f3a4dbabbd1b017861aa5f2", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@78d7d3642f3a4dbabbd1b017861aa5f2", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@78d7d3642f3a4dbabbd1b017861aa5f2", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@78d7d3642f3a4dbabbd1b017861aa5f2" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@d0d804e8863c4a95a659c04d8a2b2bc0", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@d0d804e8863c4a95a659c04d8a2b2bc0", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@d0d804e8863c4a95a659c04d8a2b2bc0" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@simulations", + "display_name": "An Interactive Reference Table", + "block_id": "vertical_2dbb0072785e", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_2dbb0072785e", + "display_name": "An Interactive Reference Table", + "block_id": "html_07d547513285", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@html_07d547513285", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@html_07d547513285", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@html_07d547513285" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_2dbb0072785e", + "display_name": "", + "block_id": "6f7a6670f87147149caeff6afa07a526", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@6f7a6670f87147149caeff6afa07a526", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@6f7a6670f87147149caeff6afa07a526", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@6f7a6670f87147149caeff6afa07a526" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_2dbb0072785e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_2dbb0072785e", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_2dbb0072785e" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@simulations", + "display_name": "Zooming Diagrams", + "block_id": "vertical_98cf62510471", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_98cf62510471", + "display_name": "Zooming Diagrams", + "block_id": "700x_pathways", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@700x_pathways", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@700x_pathways", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@700x_pathways" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_98cf62510471", + "display_name": "", + "block_id": "e0d7423118ab432582d03e8e8dad8e36", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@e0d7423118ab432582d03e8e8dad8e36", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@e0d7423118ab432582d03e8e8dad8e36", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@e0d7423118ab432582d03e8e8dad8e36" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_98cf62510471", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_98cf62510471", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_98cf62510471" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@simulations", + "display_name": "Electronic Sound Experiment", + "block_id": "vertical_d32bf9b2242c", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_d32bf9b2242c", + "display_name": "Electronic Sound Experiment", + "block_id": "Lab_5B_Mosfet_Amplifier_Experiment", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@Lab_5B_Mosfet_Amplifier_Experiment", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@Lab_5B_Mosfet_Amplifier_Experiment", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@Lab_5B_Mosfet_Amplifier_Experiment" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_d32bf9b2242c", + "display_name": "", + "block_id": "03f051f9a8814881a3783d2511613aa6", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@03f051f9a8814881a3783d2511613aa6", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@03f051f9a8814881a3783d2511613aa6", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@03f051f9a8814881a3783d2511613aa6" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_d32bf9b2242c", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_d32bf9b2242c", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_d32bf9b2242c" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@simulations", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@simulations", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@simulations" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@graded_interactions", + "display_name": "Homework - Labs and Demos", + "block_id": "graded_simulations", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations", + "display_name": "Labs and Demos", + "block_id": "d6cee45205a449369d7ef8f159b22bdf", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6cee45205a449369d7ef8f159b22bdf", + "display_name": "Labs and Demos", + "block_id": "2bee8c4248e842a19ba1e73ed8d426c2", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@2bee8c4248e842a19ba1e73ed8d426c2", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@2bee8c4248e842a19ba1e73ed8d426c2", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@2bee8c4248e842a19ba1e73ed8d426c2" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6cee45205a449369d7ef8f159b22bdf", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6cee45205a449369d7ef8f159b22bdf", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6cee45205a449369d7ef8f159b22bdf" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations", + "display_name": "Molecule Editor", + "block_id": "vertical_0fab6aa52165", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0fab6aa52165", + "display_name": "", + "block_id": "2b94658d2eee4d85ae13f83bc24cfca9", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@2b94658d2eee4d85ae13f83bc24cfca9", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@2b94658d2eee4d85ae13f83bc24cfca9", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@2b94658d2eee4d85ae13f83bc24cfca9" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0fab6aa52165", + "display_name": "Molecule Editor", + "block_id": "700x_editmolB", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@700x_editmolB", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@700x_editmolB", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@700x_editmolB" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0fab6aa52165", + "display_name": "", + "block_id": "0aa7a3bdbe18427795b0c1a1d7c3cb9a", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@0aa7a3bdbe18427795b0c1a1d7c3cb9a", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@0aa7a3bdbe18427795b0c1a1d7c3cb9a", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@0aa7a3bdbe18427795b0c1a1d7c3cb9a" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0fab6aa52165", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0fab6aa52165", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_0fab6aa52165" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations", + "display_name": "Code Grader", + "block_id": "vertical_aae927868e55", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_aae927868e55", + "display_name": "Code Grader", + "block_id": "891211e17f9a472290a5f12c7a6626d7", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@891211e17f9a472290a5f12c7a6626d7", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@891211e17f9a472290a5f12c7a6626d7", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@891211e17f9a472290a5f12c7a6626d7" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_aae927868e55", + "display_name": "", + "block_id": "python_grader", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@python_grader", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@python_grader", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@python_grader" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_aae927868e55", + "display_name": "", + "block_id": "c6cd4bea43454aaea60ad01beb0cf213", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@c6cd4bea43454aaea60ad01beb0cf213", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@c6cd4bea43454aaea60ad01beb0cf213", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@c6cd4bea43454aaea60ad01beb0cf213" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_aae927868e55", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_aae927868e55", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_aae927868e55" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations", + "display_name": "Electric Circuit Simulator", + "block_id": "vertical_c037f3757df1", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_c037f3757df1", + "display_name": "Electronic Circuit Simulator", + "block_id": "d5a5caaf35e84ebc9a747038465dcfb4", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@d5a5caaf35e84ebc9a747038465dcfb4", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@d5a5caaf35e84ebc9a747038465dcfb4", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@d5a5caaf35e84ebc9a747038465dcfb4" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_c037f3757df1", + "display_name": "", + "block_id": "free_form_simulation", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@free_form_simulation", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@free_form_simulation", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@free_form_simulation" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_c037f3757df1", + "display_name": "", + "block_id": "logic_gate_problem", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@logic_gate_problem", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@logic_gate_problem", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@logic_gate_problem" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_c037f3757df1", + "display_name": "", + "block_id": "4f06b358a96f4d1dae57d6d81acd06f2", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@4f06b358a96f4d1dae57d6d81acd06f2", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@4f06b358a96f4d1dae57d6d81acd06f2", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@4f06b358a96f4d1dae57d6d81acd06f2" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_c037f3757df1", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_c037f3757df1", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_c037f3757df1" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations", + "display_name": "Protein Creator", + "block_id": "vertical_bc69a47c6fae", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_bc69a47c6fae", + "display_name": "Protein Builder", + "block_id": "78e3719e864e45f3bee938461f3c3de6", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@78e3719e864e45f3bee938461f3c3de6", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@78e3719e864e45f3bee938461f3c3de6", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@78e3719e864e45f3bee938461f3c3de6" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_bc69a47c6fae", + "display_name": "Designing Proteins in Two Dimensions", + "block_id": "700x_proteinmake", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@700x_proteinmake", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@700x_proteinmake", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@700x_proteinmake" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_bc69a47c6fae", + "display_name": "", + "block_id": "ed01bcd164e64038a78964a16eac3edc", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ed01bcd164e64038a78964a16eac3edc", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ed01bcd164e64038a78964a16eac3edc", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@ed01bcd164e64038a78964a16eac3edc" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_bc69a47c6fae", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_bc69a47c6fae", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_bc69a47c6fae" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@graded_simulations" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@graded_interactions", + "display_name": "Homework - Essays", + "block_id": "175e76c4951144a29d46211361266e0e", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@175e76c4951144a29d46211361266e0e", + "display_name": "Peer Assessed Essays", + "block_id": "fb79dcbad35b466a8c6364f8ffee9050", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@fb79dcbad35b466a8c6364f8ffee9050", + "display_name": "Open Response Assessment", + "block_id": "b24c33ea35954c7889e1d2944d3fe397", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@openassessment+block@b24c33ea35954c7889e1d2944d3fe397", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@openassessment+block@b24c33ea35954c7889e1d2944d3fe397", + "type": "openassessment", + "id": "block-v1:edX+DemoX+Demo_Course+type@openassessment+block@b24c33ea35954c7889e1d2944d3fe397" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@fb79dcbad35b466a8c6364f8ffee9050", + "display_name": "Peer Grading", + "block_id": "12ad4f3ff4c14114a6e629b00e000976", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@12ad4f3ff4c14114a6e629b00e000976", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@12ad4f3ff4c14114a6e629b00e000976", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@12ad4f3ff4c14114a6e629b00e000976" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@fb79dcbad35b466a8c6364f8ffee9050", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@fb79dcbad35b466a8c6364f8ffee9050", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@fb79dcbad35b466a8c6364f8ffee9050" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@175e76c4951144a29d46211361266e0e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@175e76c4951144a29d46211361266e0e", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@175e76c4951144a29d46211361266e0e" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@chapter+block@graded_interactions", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@chapter+block@graded_interactions", + "type": "chapter", + "id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@graded_interactions" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "display_name": "Example Week 3: Be Social", + "block_id": "social_integration", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@social_integration", + "display_name": "Lesson 3 - Be Social", + "block_id": "48ecb924d7fe4b66a230137626bfa93e", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@48ecb924d7fe4b66a230137626bfa93e", + "display_name": "Be Social", + "block_id": "3c4b575924bf4b75a2f3542df5c354fc", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3c4b575924bf4b75a2f3542df5c354fc", + "display_name": "Be Social", + "block_id": "f9f3a25e7bab46e583fd1fbbd7a2f6a0", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@f9f3a25e7bab46e583fd1fbbd7a2f6a0", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@f9f3a25e7bab46e583fd1fbbd7a2f6a0", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@f9f3a25e7bab46e583fd1fbbd7a2f6a0" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@3c4b575924bf4b75a2f3542df5c354fc", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@3c4b575924bf4b75a2f3542df5c354fc", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3c4b575924bf4b75a2f3542df5c354fc" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@48ecb924d7fe4b66a230137626bfa93e", + "display_name": "Discussion Forums", + "block_id": "vertical_3888db0bc286", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_3888db0bc286", + "display_name": "Discussion Forums", + "block_id": "html_49b4494da2f7", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@html_49b4494da2f7", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@html_49b4494da2f7", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@html_49b4494da2f7" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_3888db0bc286", + "display_name": "Discussion Forums", + "block_id": "discussion_5deb6081620d", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@discussion_5deb6081620d", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@discussion_5deb6081620d", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@discussion_5deb6081620d" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_3888db0bc286", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_3888db0bc286", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_3888db0bc286" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@48ecb924d7fe4b66a230137626bfa93e", + "display_name": "Getting Help", + "block_id": "312cb4faed17420e82ab3178fc3e251a", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@312cb4faed17420e82ab3178fc3e251a", + "display_name": "Getting Help", + "block_id": "8bb218cccf8d40519a971ff0e4901ccf", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@8bb218cccf8d40519a971ff0e4901ccf", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@8bb218cccf8d40519a971ff0e4901ccf", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@8bb218cccf8d40519a971ff0e4901ccf" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@312cb4faed17420e82ab3178fc3e251a", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@312cb4faed17420e82ab3178fc3e251a", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@312cb4faed17420e82ab3178fc3e251a" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@48ecb924d7fe4b66a230137626bfa93e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@48ecb924d7fe4b66a230137626bfa93e", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@48ecb924d7fe4b66a230137626bfa93e" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@social_integration", + "display_name": "Homework - Find Your Study Buddy", + "block_id": "dbe8fc027bcb4fe9afb744d2e8415855", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@dbe8fc027bcb4fe9afb744d2e8415855", + "display_name": "Homework - Find Your Study Buddy", + "block_id": "26d89b08f75d48829a63520ed8b0037d", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@26d89b08f75d48829a63520ed8b0037d", + "display_name": "Find Your Study Buddy", + "block_id": "6018785795994726950614ce7d0f38c5", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@6018785795994726950614ce7d0f38c5", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@6018785795994726950614ce7d0f38c5", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@6018785795994726950614ce7d0f38c5" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@26d89b08f75d48829a63520ed8b0037d", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@26d89b08f75d48829a63520ed8b0037d", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@26d89b08f75d48829a63520ed8b0037d" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@dbe8fc027bcb4fe9afb744d2e8415855", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@dbe8fc027bcb4fe9afb744d2e8415855", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@dbe8fc027bcb4fe9afb744d2e8415855" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@social_integration", + "display_name": "More Ways to Connect", + "block_id": "6ab9c442501d472c8ed200e367b4edfa", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@6ab9c442501d472c8ed200e367b4edfa", + "display_name": "Google Hangout", + "block_id": "3f2c11aba9434e459676a7d7acc4d960", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3f2c11aba9434e459676a7d7acc4d960", + "display_name": "Text", + "block_id": "d45779ad3d024a40a09ad8cc317c0970", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@d45779ad3d024a40a09ad8cc317c0970", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@d45779ad3d024a40a09ad8cc317c0970", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@d45779ad3d024a40a09ad8cc317c0970" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3f2c11aba9434e459676a7d7acc4d960", + "display_name": "Text", + "block_id": "55cbc99f262443d886a25cf84594eafb", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@55cbc99f262443d886a25cf84594eafb", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@55cbc99f262443d886a25cf84594eafb", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@55cbc99f262443d886a25cf84594eafb" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3f2c11aba9434e459676a7d7acc4d960", + "display_name": "Google Hangout", + "block_id": "ade92343df3d4953a40ab3adc8805390", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ade92343df3d4953a40ab3adc8805390", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ade92343df3d4953a40ab3adc8805390", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@ade92343df3d4953a40ab3adc8805390" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@3f2c11aba9434e459676a7d7acc4d960", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@3f2c11aba9434e459676a7d7acc4d960", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@3f2c11aba9434e459676a7d7acc4d960" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@6ab9c442501d472c8ed200e367b4edfa", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@6ab9c442501d472c8ed200e367b4edfa", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@6ab9c442501d472c8ed200e367b4edfa" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@chapter+block@social_integration", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@chapter+block@social_integration", + "type": "chapter", + "id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@social_integration" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "display_name": "About Exams and Certificates", + "block_id": "1414ffd5143b4b508f739b563ab468b7", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@1414ffd5143b4b508f739b563ab468b7", + "display_name": "edX Exams", + "block_id": "workflow", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "EdX Exams", + "block_id": "934cc32c177d41b580c8413e561346b3", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@934cc32c177d41b580c8413e561346b3", + "display_name": "EdX Exams", + "block_id": "8293139743f34377817d537b69911530", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@8293139743f34377817d537b69911530", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@8293139743f34377817d537b69911530", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@8293139743f34377817d537b69911530" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@934cc32c177d41b580c8413e561346b3", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@934cc32c177d41b580c8413e561346b3", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@934cc32c177d41b580c8413e561346b3" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Immediate Feedback", + "block_id": "vertical_f04afeac0131", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_f04afeac0131", + "display_name": "Immediate Feedback", + "block_id": "ex_practice_2", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_2", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_2", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_2" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_f04afeac0131", + "display_name": "", + "block_id": "4aba537a78774bd5a862485a8563c345", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@4aba537a78774bd5a862485a8563c345", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@4aba537a78774bd5a862485a8563c345", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@4aba537a78774bd5a862485a8563c345" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_f04afeac0131", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_f04afeac0131", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_f04afeac0131" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Getting Answers", + "block_id": "b6662b497c094bcc9b870d8270c90c93", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@b6662b497c094bcc9b870d8270c90c93", + "display_name": "Getting Answers", + "block_id": "45d46192272c4f6db6b63586520bbdf4", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@45d46192272c4f6db6b63586520bbdf4", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@45d46192272c4f6db6b63586520bbdf4", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@45d46192272c4f6db6b63586520bbdf4" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@b6662b497c094bcc9b870d8270c90c93", + "display_name": "", + "block_id": "f480df4ce91347c5ae4301ddf6146238", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@f480df4ce91347c5ae4301ddf6146238", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@f480df4ce91347c5ae4301ddf6146238", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@f480df4ce91347c5ae4301ddf6146238" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@b6662b497c094bcc9b870d8270c90c93", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@b6662b497c094bcc9b870d8270c90c93", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@b6662b497c094bcc9b870d8270c90c93" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Answering More Than Once", + "block_id": "f91d8d31f7cf48ce990f8d8745ae4cfa", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@f91d8d31f7cf48ce990f8d8745ae4cfa", + "display_name": "Answering More Than Once", + "block_id": "651e0945b77f42e0a4c89b8c3e6f5b3b", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@651e0945b77f42e0a4c89b8c3e6f5b3b", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@651e0945b77f42e0a4c89b8c3e6f5b3b", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@651e0945b77f42e0a4c89b8c3e6f5b3b" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@f91d8d31f7cf48ce990f8d8745ae4cfa", + "display_name": "", + "block_id": "b8cec2a19ebf463f90cd3544c7927b0e", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@b8cec2a19ebf463f90cd3544c7927b0e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@b8cec2a19ebf463f90cd3544c7927b0e", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@b8cec2a19ebf463f90cd3544c7927b0e" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@f91d8d31f7cf48ce990f8d8745ae4cfa", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@f91d8d31f7cf48ce990f8d8745ae4cfa", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@f91d8d31f7cf48ce990f8d8745ae4cfa" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Limited Checks", + "block_id": "vertical_ac391cde8a91", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_ac391cde8a91", + "display_name": "Limited Checks", + "block_id": "ex_practice_limited_checks", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_limited_checks", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_limited_checks", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_limited_checks" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_ac391cde8a91", + "display_name": "Few Checks", + "block_id": "d1b84dcd39b0423d9e288f27f0f7f242", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@d1b84dcd39b0423d9e288f27f0f7f242", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@d1b84dcd39b0423d9e288f27f0f7f242", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@d1b84dcd39b0423d9e288f27f0f7f242" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_ac391cde8a91", + "display_name": "", + "block_id": "cd177caa62444fbca48aa8f843f09eac", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@cd177caa62444fbca48aa8f843f09eac", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@cd177caa62444fbca48aa8f843f09eac", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@cd177caa62444fbca48aa8f843f09eac" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_ac391cde8a91", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_ac391cde8a91", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_ac391cde8a91" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Randomized Questions", + "block_id": "vertical_36e0beb03f0a", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_36e0beb03f0a", + "display_name": "Randomized Questions", + "block_id": "ex_practice_3", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_3", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_3", + "type": "problem", + "id": "block-v1:edX+DemoX+Demo_Course+type@problem+block@ex_practice_3" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_36e0beb03f0a", + "display_name": "", + "block_id": "ddede76df71045ffa16de9d1481d2119", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ddede76df71045ffa16de9d1481d2119", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@ddede76df71045ffa16de9d1481d2119", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@ddede76df71045ffa16de9d1481d2119" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_36e0beb03f0a", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_36e0beb03f0a", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@vertical_36e0beb03f0a" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Overall Grade Performance", + "block_id": "1b0e2c2c84884b95b1c99fb678cc964c", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@1b0e2c2c84884b95b1c99fb678cc964c", + "display_name": "Overall Grade", + "block_id": "f4a39219742149f781a1dda6f43a623c", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@f4a39219742149f781a1dda6f43a623c", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@f4a39219742149f781a1dda6f43a623c", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@f4a39219742149f781a1dda6f43a623c" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@1b0e2c2c84884b95b1c99fb678cc964c", + "display_name": "", + "block_id": "1a810b1a3b2447b998f0917d0e5a802b", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@1a810b1a3b2447b998f0917d0e5a802b", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@1a810b1a3b2447b998f0917d0e5a802b", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@1a810b1a3b2447b998f0917d0e5a802b" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@1b0e2c2c84884b95b1c99fb678cc964c", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@1b0e2c2c84884b95b1c99fb678cc964c", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@1b0e2c2c84884b95b1c99fb678cc964c" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Passing a Course", + "block_id": "c7e98fd39a6944edb6b286c32e1150ff", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@c7e98fd39a6944edb6b286c32e1150ff", + "display_name": "Passing a Course", + "block_id": "5e009378f0b64585baa0a14b155974b9", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@5e009378f0b64585baa0a14b155974b9", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@5e009378f0b64585baa0a14b155974b9", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@5e009378f0b64585baa0a14b155974b9" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@c7e98fd39a6944edb6b286c32e1150ff", + "display_name": "", + "block_id": "23e6eda482c04335af2bb265beacaf59", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@discussion+block@23e6eda482c04335af2bb265beacaf59", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@discussion+block@23e6eda482c04335af2bb265beacaf59", + "type": "discussion", + "id": "block-v1:edX+DemoX+Demo_Course+type@discussion+block@23e6eda482c04335af2bb265beacaf59" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@c7e98fd39a6944edb6b286c32e1150ff", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@c7e98fd39a6944edb6b286c32e1150ff", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@c7e98fd39a6944edb6b286c32e1150ff" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "display_name": "Getting Your edX Certificate", + "block_id": "d6eaa391d2be41dea20b8b1bfbcb1c45", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6eaa391d2be41dea20b8b1bfbcb1c45", + "display_name": "Getting Your edX Certificate", + "block_id": "148ae8fa73ea460eb6f05505da0ba6e6", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@148ae8fa73ea460eb6f05505da0ba6e6", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@148ae8fa73ea460eb6f05505da0ba6e6", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@148ae8fa73ea460eb6f05505da0ba6e6" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6eaa391d2be41dea20b8b1bfbcb1c45", + "display_name": "Blank HTML Page", + "block_id": "6b6bee43c7c641509da71c9299cc9f5a", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@6b6bee43c7c641509da71c9299cc9f5a", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@html+block@6b6bee43c7c641509da71c9299cc9f5a", + "type": "html", + "id": "block-v1:edX+DemoX+Demo_Course+type@html+block@6b6bee43c7c641509da71c9299cc9f5a" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6eaa391d2be41dea20b8b1bfbcb1c45", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6eaa391d2be41dea20b8b1bfbcb1c45", + "type": "vertical", + "id": "block-v1:edX+DemoX+Demo_Course+type@vertical+block@d6eaa391d2be41dea20b8b1bfbcb1c45" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@workflow" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@chapter+block@1414ffd5143b4b508f739b563ab468b7", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@chapter+block@1414ffd5143b4b508f739b563ab468b7", + "type": "chapter", + "id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@1414ffd5143b4b508f739b563ab468b7" + }, + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "display_name": "holding section", + "block_id": "9fca584977d04885bc911ea76a9ef29e", + "children": [ + { + "parent": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@9fca584977d04885bc911ea76a9ef29e", + "display_name": "New Subsection", + "block_id": "07bc32474380492cb34f76e5f9d9a135", + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@sequential+block@07bc32474380492cb34f76e5f9d9a135", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@sequential+block@07bc32474380492cb34f76e5f9d9a135", + "type": "sequential", + "id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@07bc32474380492cb34f76e5f9d9a135" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@chapter+block@9fca584977d04885bc911ea76a9ef29e", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@chapter+block@9fca584977d04885bc911ea76a9ef29e", + "type": "chapter", + "id": "block-v1:edX+DemoX+Demo_Course+type@chapter+block@9fca584977d04885bc911ea76a9ef29e" + } + ], + "student_view_url": "http://localhost:18000/xblock/block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "lms_web_url": "http://localhost:18000/courses/course-v1:edX+DemoX+Demo_Course/jump_to/block-v1:edX+DemoX+Demo_Course+type@course+block@course", + "type": "course", + "id": "block-v1:edX+DemoX+Demo_Course+type@course+block@course" +} diff --git a/common/static/common/js/components/BlockBrowser/data/actions/constants.js b/common/static/common/js/components/BlockBrowser/data/actions/constants.js new file mode 100644 index 000000000000..a881f36a33a5 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/data/actions/constants.js @@ -0,0 +1,8 @@ +export default { + fetch: { + SUCCESS: 'FETCH_COURSE_BLOCKS_SUCCESS', + FAILURE: 'FETCH_COURSE_BLOCKS_FAILURE', + }, + SELECT_BLOCK: 'SELECT_BLOCK', + CHANGE_ROOT: 'CHANGE_ROOT', +}; diff --git a/common/static/common/js/components/BlockBrowser/data/actions/courseBlocks.js b/common/static/common/js/components/BlockBrowser/data/actions/courseBlocks.js new file mode 100644 index 000000000000..8a44a144e946 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/data/actions/courseBlocks.js @@ -0,0 +1,38 @@ +import { getCourseBlocks } from '../api/client'; +import courseBlocksActions from './constants'; + +const fetchCourseBlocksSuccess = (blocks, excludeBlockTypes) => ({ + type: courseBlocksActions.fetch.SUCCESS, + blocks, + excludeBlockTypes, +}); + +const selectBlock = blockId => ({ + type: courseBlocksActions.SELECT_BLOCK, + blockId, +}); + +const changeRoot = blockId => ({ + type: courseBlocksActions.CHANGE_ROOT, + blockId, +}); + +const fetchCourseBlocks = (courseId, excludeBlockTypes) => dispatch => + getCourseBlocks(courseId) + .then((response) => { + if (response.ok) { + return response.json(); + } + throw new Error(response); + }) + .then( + json => dispatch(fetchCourseBlocksSuccess(json, excludeBlockTypes)), + error => console.log(error), // eslint-disable-line no-console + ); + +export { + fetchCourseBlocks, + fetchCourseBlocksSuccess, + selectBlock, + changeRoot, +}; diff --git a/common/static/common/js/components/BlockBrowser/data/api/client.js b/common/static/common/js/components/BlockBrowser/data/api/client.js new file mode 100644 index 000000000000..fd9876788591 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/data/api/client.js @@ -0,0 +1,34 @@ +import Cookies from 'js-cookie'; +import 'whatwg-fetch'; + +const COURSE_BLOCKS_API = '/api/courses/v1/blocks/'; + +const HEADERS = { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'X-CSRFToken': Cookies.get('csrftoken'), +}; + +export function buildQueryString(data) { + return Object.keys(data) + .map((key) => { + const value = Array.isArray(data[key]) + ? data[key].map(item => encodeURIComponent(item)).join(',') + : encodeURIComponent(data[key]); + return `${encodeURIComponent(key)}=${value}`; + }) + .join('&'); +} + +export const getCourseBlocks = courseId => fetch( + `${COURSE_BLOCKS_API}/?${buildQueryString({ + course_id: courseId, + all_blocks: true, + depth: 'all', + requested_fields: ['name', 'display_name', 'block_type', 'children'], + })}`, { + credentials: 'same-origin', + method: 'get', + headers: HEADERS, + }, +); diff --git a/common/static/common/js/components/BlockBrowser/data/reducers/index.js b/common/static/common/js/components/BlockBrowser/data/reducers/index.js new file mode 100644 index 000000000000..7d14e63052cd --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/data/reducers/index.js @@ -0,0 +1,55 @@ +import { combineReducers } from 'redux'; +import courseBlocksActions from '../actions/constants'; + +export const buildBlockTree = (blocks, excludeBlockTypes) => { + if (!(blocks && blocks.root)) return null; + const blockTree = (root, parent) => { + const tree = Object.assign({ parent }, blocks.blocks[root]); + if (tree.children) { + tree.children = tree.children.map(block => blockTree(block, root)); + if (excludeBlockTypes) { + tree.children = tree.children.filter( + block => !excludeBlockTypes.includes(block.type), + ); + } + } + return tree; + }; + return blockTree(blocks.root, null); +}; + +const blocks = (state = {}, action) => { + switch (action.type) { + case courseBlocksActions.fetch.SUCCESS: + return buildBlockTree(action.blocks, action.excludeBlockTypes); + default: + return state; + } +}; + +const selectedBlock = (state = null, action) => { + switch (action.type) { + case courseBlocksActions.SELECT_BLOCK: + return action.blockId; + default: + return state; + } +}; + + +const rootBlock = (state = null, action) => { + switch (action.type) { + case courseBlocksActions.fetch.SUCCESS: + return action.blocks.root; + case courseBlocksActions.CHANGE_ROOT: + return action.blockId; + default: + return state; + } +}; + +export default combineReducers({ + blocks, + selectedBlock, + rootBlock, +}); diff --git a/common/static/common/js/components/BlockBrowser/data/selectors/index.js b/common/static/common/js/components/BlockBrowser/data/selectors/index.js new file mode 100644 index 000000000000..cc217618715b --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/data/selectors/index.js @@ -0,0 +1,16 @@ +export const findBlockWithId = (blockList, blockId) => { + if (!blockList) return null; + for (let idx = 0; idx < blockList.length; idx += 1) { + const block = blockList[idx]; + if (block.id === blockId) return block; + + const foundBlock = findBlockWithId(block.children, blockId); + if (foundBlock) return foundBlock; + } + return null; +}; + +export const getActiveBlockTree = (state) => { + if (state.rootBlock === state.blocks.id) return state.blocks; + return findBlockWithId(state.blocks.children, state.rootBlock); +}; diff --git a/common/static/common/js/components/BlockBrowser/data/store.js b/common/static/common/js/components/BlockBrowser/data/store.js new file mode 100644 index 000000000000..5b3b242d3c21 --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/data/store.js @@ -0,0 +1,15 @@ +import { applyMiddleware, createStore } from 'redux'; +import thunkMiddleware from 'redux-thunk'; + +import rootReducer from './reducers'; + +const configureStore = initialState => createStore( + rootReducer, + initialState, + applyMiddleware(thunkMiddleware), +); + + +const store = configureStore(); + +export default store; diff --git a/common/static/common/js/components/BlockBrowser/index.jsx b/common/static/common/js/components/BlockBrowser/index.jsx new file mode 100644 index 000000000000..f1b530652bbf --- /dev/null +++ b/common/static/common/js/components/BlockBrowser/index.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Provider } from 'react-redux'; +import BlockBrowserContainer from './components/BlockBrowser/BlockBrowserContainer'; +import store from './data/store'; + +export const BlockBrowser = props => ( + + + +); + +export default BlockBrowser; diff --git a/jest.config.js b/jest.config.js index 602c21fcb5d0..75e52d71368e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,12 +5,13 @@ module.exports = { "modulePaths": [ "common/static/common/js/components", ], + "setupTestFrameworkScriptFile": "/setupTests.js", "testMatch": [ - "**/ProblemBrowser/**/*.test.jsx", + "/**/*.test.jsx", "common/static/common/js/components/**/?(*.)+(spec|test).js?(x)", ], "transform": { "^.+\\.jsx$": "babel-jest", "^.+\\.js$": "babel-jest", }, -} +}; diff --git a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/.eslintrc.js b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/.eslintrc.js new file mode 100644 index 000000000000..838b853a8277 --- /dev/null +++ b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + extends: 'eslint-config-edx', + root: true, + settings: { + 'import/resolver': { + webpack: { + config: 'webpack.dev.config.js', + }, + }, + }, +}; diff --git a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.jsx b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.jsx new file mode 100644 index 000000000000..aca0041c9948 --- /dev/null +++ b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.jsx @@ -0,0 +1,54 @@ +/* global gettext */ +import { Button } from '@edx/paragon'; +import { BlockBrowser } from 'BlockBrowser'; +import * as PropTypes from 'prop-types'; +import * as React from 'react'; + +export default class Main extends React.Component { + constructor(props) { + super(props); + this.handleToggleDropdown = this.handleToggleDropdown.bind(this); + this.state = { + showDropdown: false, + }; + } + + handleToggleDropdown() { + this.props.fetchCourseBlocks(this.props.courseId, this.props.excludeBlockTypes); + this.setState({ showDropdown: !this.state.showDropdown }); + } + + hideDropdown() { + this.setState({ showDropdown: false }); + } + + render() { + const { selectedBlock, onSelectBlock } = this.props; + + return ( +
+
+ ); + } +} + +Main.propTypes = { + courseId: PropTypes.string.isRequired, + excludeBlockTypes: PropTypes.arrayOf(PropTypes.string), + fetchCourseBlocks: PropTypes.func.isRequired, + onSelectBlock: PropTypes.func.isRequired, + selectedBlock: PropTypes.string, +}; + +Main.defaultProps = { + excludeBlockTypes: null, + selectedBlock: null, +}; diff --git a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.test.jsx b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.test.jsx index 2fde31f044d9..1c468b4ca009 100644 --- a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.test.jsx +++ b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.test.jsx @@ -1,9 +1,71 @@ +/* global jest,test,describe,expect */ +import { Button } from '@edx/paragon'; +import { BlockBrowser } from 'BlockBrowser'; +import { shallow } from 'enzyme'; import React from 'react'; -import Main from './Main.jsx'; import renderer from 'react-test-renderer'; -test('My first demo test', () => { - const component = renderer.create(
); - let tree = component.toJSON(); - expect(tree).toMatchSnapshot(); +import Main from './Main'; + +describe('ProblemBrowser Main component', () => { + const courseId = 'testcourse'; + const excludedBlockTypes = []; + + test('render with basic parameters', () => { + const component = renderer.create( +
, + ); + const tree = component.toJSON(); + expect(tree).toMatchSnapshot(); + }); + + test('render with selected block', () => { + const component = renderer.create( +
, + ); + const tree = component.toJSON(); + expect(tree).toMatchSnapshot(); + }); + + test('fetch course block on toggling dropdown', () => { + const fetchCourseBlocksMock = jest.fn(); + const component = renderer.create( +
, + ); + const instance = component.getInstance(); + instance.handleToggleDropdown(); + expect(fetchCourseBlocksMock.mock.calls.length).toBe(1); + }); + + test('display dropdown on toggling dropdown', () => { + const component = shallow( +
, + ); + component.find(Button).simulate('click'); + expect(component.find(BlockBrowser)).toBeTruthy(); + }); }); diff --git a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/MainContainer.jsx b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/MainContainer.jsx new file mode 100644 index 000000000000..a36b31978be9 --- /dev/null +++ b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/MainContainer.jsx @@ -0,0 +1,22 @@ +import { fetchCourseBlocks, selectBlock } from 'BlockBrowser/data/actions/courseBlocks'; +import { connect } from 'react-redux'; + +import Main from './Main'; + +const mapStateToProps = state => ({ + selectedBlock: state.selectedBlock, +}); + + +const mapDispatchToProps = dispatch => ({ + onSelectBlock: blockId => dispatch(selectBlock(blockId)), + fetchCourseBlocks: (courseId, excludeBlockTypes) => + dispatch(fetchCourseBlocks(courseId, excludeBlockTypes)), +}); + +const MainContainer = connect( + mapStateToProps, + mapDispatchToProps, +)(Main); + +export default MainContainer; diff --git a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/__snapshots__/Main.test.jsx.snap b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/__snapshots__/Main.test.jsx.snap index 82aa691791cb..2fafa3a6a3d5 100644 --- a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/__snapshots__/Main.test.jsx.snap +++ b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/__snapshots__/Main.test.jsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`My first demo test 1`] = ` +exports[`ProblemBrowser Main component render with basic parameters 1`] = `
@@ -17,6 +17,29 @@ exports[`My first demo test 1`] = ` disabled={true} name="problem-location" type="text" + value={null} + /> +
+`; + +exports[`ProblemBrowser Main component render with selected block 1`] = ` +
+ +
`; diff --git a/lms/djangoapps/instructor/static/instructor/ProblemBrowser/index.jsx b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/index.jsx new file mode 100644 index 000000000000..2e8b7849bb77 --- /dev/null +++ b/lms/djangoapps/instructor/static/instructor/ProblemBrowser/index.jsx @@ -0,0 +1,12 @@ +import store from 'BlockBrowser/data/store'; +import React from 'react'; + +import { Provider } from 'react-redux'; + +import MainContainer from './components/Main/MainContainer'; + +export const ProblemBrowser = props => ( + + + +); diff --git a/lms/static/sass/course/instructor/_instructor_2.scss b/lms/static/sass/course/instructor/_instructor_2.scss index 3ce9b5e028a5..52503e478ba8 100644 --- a/lms/static/sass/course/instructor/_instructor_2.scss +++ b/lms/static/sass/course/instructor/_instructor_2.scss @@ -1502,6 +1502,53 @@ } } } + + .block-browser { + .header { + display: flex; + flex-direction: row; + align-items: center; + + .title { + margin: 0 0.5em; + } + } + + ul { + display: flex; + flex-direction: column; + padding: 0; + margin: 0; + + li { + display: flex; + flex-direction: row; + align-items: center; + margin: 0.25em 0; + + .block-name { + flex-grow: 1; + margin-right: 0.5em; + text-align: left; + } + } + } + } + + .problem-browser { + .block-browser { + position: absolute; + background: white; + padding: 5px; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); + } + + input { + max-width: 800px; + width: 100%; + margin-bottom: 0; + } + } } // view - metrics diff --git a/lms/templates/instructor/instructor_dashboard_2/data_download.html b/lms/templates/instructor/instructor_dashboard_2/data_download.html index 4e6c381d64ca..400c376dbcd7 100644 --- a/lms/templates/instructor/instructor_dashboard_2/data_download.html +++ b/lms/templates/instructor/instructor_dashboard_2/data_download.html @@ -1,4 +1,5 @@ <%page args="section_data" expression_filter="h"/> +<%namespace name='static' file='/static_content.html'/> <%! from django.utils.translation import ugettext as _ from openedx.core.djangolib.markup import HTML, Text @@ -46,14 +47,30 @@

${_("Reports")}

%endif -

${_("To generate a CSV file that lists all student answers to a given problem, enter the location of the problem (from its Staff Debug Info).")}

+

${_("Select a problem to generate a CSV file that lists all student answers to the problem. You also select a section or chapter to include results of all problems in that section or chapter.")}

+ <% max_entries = settings.FEATURES.get('MAX_PROBLEM_RESPONSES_COUNT') %> + %if max_entries is not None: +

+ ${_("NOTE")}: + ${_("The generated report is limited to {max_entries} responses. If you expect more than {max_entries} " + "responses, try generating the report on a chapter-by-chapter, or problem-by-problem basis, or contact " + "your site administrator to increase the limit.").format(max_entries=max_entries)} +

+ %endif

- +

+ ${static.renderReact( + component="ProblemBrowser", + id="react-block-listing", + props={ + "courseId": course.id, + "excludeBlockTypes": ['html', 'video', 'discussion'] + } + )} +

+

diff --git a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html index a42547bcc661..1e51061786f0 100644 --- a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html +++ b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html @@ -48,12 +48,12 @@ + - <%static:js group='module-descriptor-js'/> <%static:js group='instructor_dash'/> <%static:js group='application'/> diff --git a/package-lock.json b/package-lock.json index 345aa6af6269..72ac54b0bfea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,18 +5,18 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz", - "integrity": "sha1-vs2AVIJzREDJ0TfkbXc0DmTX9Rs=", + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.53.tgz", + "integrity": "sha1-mA0VYLhjV1v1o3eSUDfgEy71kh4=", "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.49" + "@babel/highlight": "7.0.0-beta.53" } }, "@babel/highlight": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.49.tgz", - "integrity": "sha1-lr3GtD4TSCASumaRsQGEktOWIsw=", + "version": "7.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.53.tgz", + "integrity": "sha1-9OlS2tF4fSBeGI0+OEzc5JyjaPs=", "dev": true, "requires": { "chalk": "2.3.1", @@ -123,14 +123,14 @@ "prop-types": "15.6.0", "react": "16.4.1", "react-dom": "16.1.0", - "react-dropzone": "4.2.11", + "react-dropzone": "4.2.13", "react-intl": "2.4.0", "react-intl-translations-manager": "5.0.3", "react-paginate": "5.2.3", "react-redux": "5.0.7", - "react-transition-group": "2.3.1", + "react-transition-group": "2.4.0", "redux": "3.7.2", - "redux-devtools-extension": "2.13.2", + "redux-devtools-extension": "2.13.5", "redux-thunk": "2.2.0", "reselect": "3.0.1", "whatwg-fetch": "2.0.3" @@ -199,6 +199,12 @@ "stylelint-scss": "2.4.0" } }, + "@types/node": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.2.tgz", + "integrity": "sha512-m9zXmifkZsMHZBOyxZWilMwmTlpC8x5Ty360JKTiXvlXZfBWYpsg9ZZvP/Ye+iZUh+Q+MxDLjItVTWIsfwz+8Q==", + "dev": true + }, "abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -208,7 +214,7 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { "version": "1.3.3", @@ -394,7 +400,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { "version": "1.1.4", @@ -462,7 +468,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", @@ -643,9 +649,9 @@ "dev": true }, "attr-accept": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.2.tgz", - "integrity": "sha512-NUj0itVSnpFkUYCj3XKSRCZ7N9gPwWcyX/tF7HosqyDBPMSygALivvJIGI8VvlPcunns5khMkpxoNshvmhy/ZQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", + "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", "requires": { "core-js": "2.5.3" } @@ -910,7 +916,7 @@ "dev": true, "requires": { "babel-plugin-istanbul": "4.1.6", - "babel-preset-jest": "23.0.1" + "babel-preset-jest": "23.2.0" } }, "babel-loader": { @@ -964,9 +970,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz", - "integrity": "sha1-6qEclkVjrqnCG+zvK994U/fzwUg=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", "dev": true }, "babel-plugin-syntax-async-functions": { @@ -1382,12 +1388,12 @@ } }, "babel-preset-jest": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz", - "integrity": "sha1-YxzFRcbPAhlDATvK8i9F2H/mIZg=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", "dev": true, "requires": { - "babel-plugin-jest-hoist": "23.0.1", + "babel-plugin-jest-hoist": "23.2.0", "babel-plugin-syntax-object-rest-spread": "6.13.0" } }, @@ -1476,7 +1482,7 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "backbone": { "version": "1.3.3", @@ -1681,7 +1687,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { "version": "1.18.2", @@ -1709,6 +1715,12 @@ } } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", @@ -1763,9 +1775,9 @@ "dev": true }, "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { "resolve": "1.1.7" @@ -1838,7 +1850,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { "pako": "1.0.6" } @@ -2091,6 +2103,20 @@ "integrity": "sha1-Bew1hEm7wV3sOcatV/KuDs1SrrM=", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.5", + "parse5": "3.0.3" + } + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -2115,7 +2141,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { "inherits": "2.0.3", "safe-buffer": "5.1.1" @@ -2127,10 +2153,16 @@ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "circular-json-es6": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/circular-json-es6/-/circular-json-es6-2.0.2.tgz", + "integrity": "sha512-ODYONMMNb3p658Zv+Pp+/XPa5s6q7afhz3Tzyvo+VRh9WIrJ64J76ZC4GQxnlye/NesTn09jvOiuE8+xxfpwhQ==", + "dev": true + }, "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { "chalk": "1.1.3" }, @@ -2328,7 +2360,7 @@ "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { "color-name": "1.1.3" } @@ -2495,7 +2527,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { @@ -2517,7 +2549,7 @@ "copy-to-clipboard": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz", - "integrity": "sha1-9OgvSogw3ORma3643tDJvMMTq6k=", + "integrity": "sha512-c3GdeY8qxCHGezVb1EFQfHYK/8NZRemgcTIzPq7PuxjHAf/raKibn2QdhHPb/y6q74PMgH6yizaDZlRmw6QyKw==", "requires": { "toggle-selection": "1.0.6" } @@ -2535,7 +2567,7 @@ "cosmiconfig": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz", - "integrity": "sha1-ZAqUv5hH8yGABAPNJzr2BmXHM5c=", + "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", "dev": true, "requires": { "is-directory": "0.3.1", @@ -2547,7 +2579,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, "js-yaml": { @@ -2634,7 +2666,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { "browserify-cipher": "1.0.0", "browserify-sign": "4.0.4", @@ -2687,6 +2719,30 @@ } } }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + }, + "dependencies": { + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + } + } + }, "css-selector-tokenizer": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", @@ -2709,6 +2765,12 @@ } } }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, "cssesc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", @@ -2763,9 +2825,9 @@ } }, "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", "dev": true }, "cssstyle": { @@ -2774,7 +2836,7 @@ "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", "dev": true, "requires": { - "cssom": "0.3.2" + "cssom": "0.3.4" } }, "currently-unhandled": { @@ -2850,7 +2912,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -2876,6 +2938,15 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-equal-ident": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz", + "integrity": "sha1-BvS4nlNxDNbOpKd4HHqVZkLejck=", + "dev": true, + "requires": { + "lodash.isequal": "3.0.4" + } + }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", @@ -3084,6 +3155,12 @@ } } }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3313,7 +3390,7 @@ "emoji-regex": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha1-m66pKbFVVlwR6kHGYm6qZc75ksI=", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", "dev": true }, "emojis-list": { @@ -3451,6 +3528,74 @@ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", "dev": true }, + "enzyme": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", + "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", + "dev": true, + "requires": { + "cheerio": "1.0.0-rc.2", + "function.prototype.name": "1.1.0", + "has": "1.0.1", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.3", + "is-number-object": "1.0.3", + "is-string": "1.0.4", + "is-subset": "0.1.1", + "lodash": "4.17.5", + "object-inspect": "1.6.0", + "object-is": "1.0.1", + "object.assign": "4.1.0", + "object.entries": "1.0.4", + "object.values": "1.0.4", + "raf": "3.4.0", + "rst-selector-parser": "2.2.3" + } + }, + "enzyme-adapter-react-16": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", + "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "1.4.0", + "lodash": "4.17.5", + "object.assign": "4.1.0", + "object.values": "1.0.4", + "prop-types": "15.6.0", + "react-reconciler": "0.7.0", + "react-test-renderer": "16.4.0" + } + }, + "enzyme-adapter-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", + "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", + "dev": true, + "requires": { + "object.assign": "4.1.0", + "prop-types": "15.6.0" + } + }, + "enzyme-matchers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/enzyme-matchers/-/enzyme-matchers-6.0.2.tgz", + "integrity": "sha1-eU1OQyVNqqD//TpZHlhp/IYd7rI=", + "dev": true, + "requires": { + "circular-json-es6": "2.0.2", + "deep-equal-ident": "1.1.1" + } + }, + "enzyme-to-json": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.4.tgz", + "integrity": "sha1-Z8YEDpMRgvGDQYry659DIyWKp38=", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -3774,7 +3919,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -3832,7 +3977,7 @@ "eslint-config-airbnb-base": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz", - "integrity": "sha1-hwOxGr48iKx+wrdFt/31LgCuaAo=", + "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", "dev": true, "requires": { "eslint-restricted-globals": "0.1.1" @@ -4130,16 +4275,16 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "1.3.4", "safe-buffer": "5.1.1" } }, "exec-sh": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", - "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", "dev": true, "requires": { "merge": "1.2.0" @@ -4255,17 +4400,17 @@ } }, "expect": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.1.0.tgz", - "integrity": "sha1-v9/VeiogFw2HWZnul4fMcfAcIF8=", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.4.0.tgz", + "integrity": "sha1-baTsyZwUcSU+cogziYOtHrrbYMM=", "dev": true, "requires": { "ansi-styles": "3.2.0", - "jest-diff": "23.0.1", + "jest-diff": "23.2.0", "jest-get-type": "22.4.3", - "jest-matcher-utils": "23.0.1", - "jest-message-util": "23.1.0", - "jest-regex-util": "23.0.0" + "jest-matcher-utils": "23.2.0", + "jest-message-util": "23.4.0", + "jest-regex-util": "23.3.0" } }, "exports-loader": { @@ -4337,7 +4482,7 @@ "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { "lodash": "4.17.5" } @@ -4714,7 +4859,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.0", @@ -4802,7 +4947,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -4832,7 +4977,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { "version": "7.1.1", @@ -5380,7 +5525,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -5392,7 +5537,7 @@ "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, "import-local": { @@ -5652,10 +5797,16 @@ "binary-extensions": "1.11.0" } }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", @@ -5808,29 +5959,18 @@ "kind-of": "3.2.2" } }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -5863,7 +6003,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "3.0.1" } @@ -5917,6 +6057,18 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, "is-supported-regexp-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz", @@ -6224,7 +6376,7 @@ "dev": true, "requires": { "import-local": "1.0.0", - "jest-cli": "23.1.0" + "jest-cli": "23.4.1" }, "dependencies": { "ansi-escapes": { @@ -6239,6 +6391,16 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "babel-jest": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.4.0.tgz", + "integrity": "sha1-IsNMOS4hdvakw2eZKn/P9p0uhVc=", + "dev": true, + "requires": { + "babel-plugin-istanbul": "4.1.6", + "babel-preset-jest": "23.2.0" + } + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -6272,9 +6434,9 @@ "dev": true }, "jest-cli": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.1.0.tgz", - "integrity": "sha1-64vdTODRUlCJLjGtm2m8mdKo9r8=", + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.4.1.tgz", + "integrity": "sha512-Cmd7bex+kYmMGwGrIh/crwUieUFr+4PCTaK32tEA0dm0wklXV8zGgWh8n+8WbhsFPNzacolxdtcfBKIorcV5FQ==", "dev": true, "requires": { "ansi-escapes": "3.1.0", @@ -6288,30 +6450,176 @@ "istanbul-lib-coverage": "1.2.0", "istanbul-lib-instrument": "1.10.1", "istanbul-lib-source-maps": "1.2.5", - "jest-changed-files": "23.0.1", - "jest-config": "23.1.0", - "jest-environment-jsdom": "23.1.0", + "jest-changed-files": "23.4.0", + "jest-config": "23.4.1", + "jest-environment-jsdom": "23.4.0", "jest-get-type": "22.4.3", - "jest-haste-map": "23.1.0", - "jest-message-util": "23.1.0", - "jest-regex-util": "23.0.0", - "jest-resolve-dependencies": "23.0.1", - "jest-runner": "23.1.0", - "jest-runtime": "23.1.0", - "jest-snapshot": "23.0.1", - "jest-util": "23.1.0", - "jest-validate": "23.0.1", - "jest-watcher": "23.1.0", - "jest-worker": "23.0.1", + "jest-haste-map": "23.4.1", + "jest-message-util": "23.4.0", + "jest-regex-util": "23.3.0", + "jest-resolve-dependencies": "23.4.1", + "jest-runner": "23.4.1", + "jest-runtime": "23.4.1", + "jest-snapshot": "23.4.1", + "jest-util": "23.4.0", + "jest-validate": "23.4.0", + "jest-watcher": "23.4.0", + "jest-worker": "23.2.0", "micromatch": "2.3.11", "node-notifier": "5.2.1", - "realpath-native": "1.0.0", + "prompts": "0.1.12", + "realpath-native": "1.0.1", "rimraf": "2.6.2", "slash": "1.0.0", "string-length": "2.0.0", "strip-ansi": "4.0.0", "which": "1.3.0", - "yargs": "11.0.0" + "yargs": "11.1.0" + } + }, + "jest-config": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.4.1.tgz", + "integrity": "sha512-OT29qlcw9Iw7u0PC04wD9tjLJL4vpGdMZrrHMFwYSO3HxOikbHywjmtQ7rntW4qvBcpbi7iCMTPPRmpDjImQEw==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-jest": "23.4.0", + "chalk": "2.3.1", + "glob": "7.1.2", + "jest-environment-jsdom": "23.4.0", + "jest-environment-node": "23.4.0", + "jest-get-type": "22.4.3", + "jest-jasmine2": "23.4.1", + "jest-regex-util": "23.3.0", + "jest-resolve": "23.4.1", + "jest-util": "23.4.0", + "jest-validate": "23.4.0", + "pretty-format": "23.2.0" + } + }, + "jest-haste-map": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.4.1.tgz", + "integrity": "sha512-PGQxOEGAfRbTyJkmZeOKkVSs+KVeWgG625p89KUuq+sIIchY5P8iPIIc+Hw2tJJPBzahU3qopw1kF/qyhDdNBw==", + "dev": true, + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "23.2.0", + "jest-serializer": "23.0.1", + "jest-worker": "23.2.0", + "micromatch": "2.3.11", + "sane": "2.5.2" + } + }, + "jest-jasmine2": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.4.1.tgz", + "integrity": "sha512-nHmRgTtM9fuaK3RBz2z4j9mYVEJwB7FdoflQSvrwHV8mCT5z4DeHoKCvPp2R27F8fZTYJUYVMb36xn+ydg0tfA==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "co": "4.6.0", + "expect": "23.4.0", + "is-generator-fn": "1.0.0", + "jest-diff": "23.2.0", + "jest-each": "23.4.0", + "jest-matcher-utils": "23.2.0", + "jest-message-util": "23.4.0", + "jest-snapshot": "23.4.1", + "jest-util": "23.4.0", + "pretty-format": "23.2.0" + } + }, + "jest-resolve": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.4.1.tgz", + "integrity": "sha512-VNk4YRNR5gsHhNS0Lp46/DzTT11e+ecbUC61ikE593cKbtdrhrMO+zXkOJaE8YDD5sHxH9W6OfssNn4FkZBzZQ==", + "dev": true, + "requires": { + "browser-resolve": "1.11.3", + "chalk": "2.3.1", + "realpath-native": "1.0.1" + } + }, + "jest-resolve-dependencies": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.1.tgz", + "integrity": "sha512-Jp0wgNJg3OYPvXJfNVX4k4/niwGS6ARuKacum/vue48+4A1XPJ2H3aVFuNb3gUaiB/6Le7Zyl8AUb4MELBfcmg==", + "dev": true, + "requires": { + "jest-regex-util": "23.3.0", + "jest-snapshot": "23.4.1" + } + }, + "jest-runner": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.4.1.tgz", + "integrity": "sha512-78KyhObsx0VEuUQ74ikGt68NpP6PApTjGpJPSyZ7AvwOFRqFlxdHpCU/lFPQxW/fLEghl4irz9OHjRLGcGFNyQ==", + "dev": true, + "requires": { + "exit": "0.1.2", + "graceful-fs": "4.1.11", + "jest-config": "23.4.1", + "jest-docblock": "23.2.0", + "jest-haste-map": "23.4.1", + "jest-jasmine2": "23.4.1", + "jest-leak-detector": "23.2.0", + "jest-message-util": "23.4.0", + "jest-runtime": "23.4.1", + "jest-util": "23.4.0", + "jest-worker": "23.2.0", + "source-map-support": "0.5.6", + "throat": "4.1.0" + } + }, + "jest-runtime": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.4.1.tgz", + "integrity": "sha512-fnInrsEAbLpNctQa+RLnKZyQLMmb5u4YdoT9CbRKWhjMY7q6ledOu+x+ORZ3glQOK/vJIS701RaJRp1pc5ziaA==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-plugin-istanbul": "4.1.6", + "chalk": "2.3.1", + "convert-source-map": "1.5.1", + "exit": "0.1.2", + "fast-json-stable-stringify": "2.0.0", + "graceful-fs": "4.1.11", + "jest-config": "23.4.1", + "jest-haste-map": "23.4.1", + "jest-message-util": "23.4.0", + "jest-regex-util": "23.3.0", + "jest-resolve": "23.4.1", + "jest-snapshot": "23.4.1", + "jest-util": "23.4.0", + "jest-validate": "23.4.0", + "micromatch": "2.3.11", + "realpath-native": "1.0.1", + "slash": "1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "2.3.0", + "yargs": "11.1.0" + } + }, + "jest-snapshot": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.4.1.tgz", + "integrity": "sha512-oMjaQ4vB4uT211zx00X0R7hg+oLVRDvhVKiC6+vSg7Be9S/AmkDMCVUoaPcLRK/0NkZBTzrh4WCzrSZgUEZW3g==", + "dev": true, + "requires": { + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "chalk": "2.3.1", + "jest-diff": "23.2.0", + "jest-matcher-utils": "23.2.0", + "jest-message-util": "23.4.0", + "jest-resolve": "23.4.1", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "pretty-format": "23.2.0", + "semver": "5.5.0" } }, "os-locale": { @@ -6325,6 +6633,22 @@ "mem": "1.1.0" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "source-map": "0.6.1" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -6344,6 +6668,12 @@ "ansi-regex": "3.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -6351,9 +6681,9 @@ "dev": true }, "yargs": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", - "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { "cliui": "4.1.0", @@ -6382,403 +6712,213 @@ } }, "jest-changed-files": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.0.1.tgz", - "integrity": "sha1-95Vy0HIIROpd+EwqRI6GLCJU9gw=", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.0.tgz", + "integrity": "sha1-8bME+YwjWvXZox7FJCYsXk3jxv8=", "dev": true, "requires": { "throat": "4.1.0" } }, - "jest-config": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.1.0.tgz", - "integrity": "sha1-cIyg9DHTVu5CT7SJXTMIAGvdgkE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-jest": "23.0.1", - "chalk": "2.3.1", - "glob": "7.1.2", - "jest-environment-jsdom": "23.1.0", - "jest-environment-node": "23.1.0", - "jest-get-type": "22.4.3", - "jest-jasmine2": "23.1.0", - "jest-regex-util": "23.0.0", - "jest-resolve": "23.1.0", - "jest-util": "23.1.0", - "jest-validate": "23.0.1", - "pretty-format": "23.0.1" - } - }, "jest-diff": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.0.1.tgz", - "integrity": "sha1-PUkTfO4SwyCktNK0pvpugtSRoWo=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.2.0.tgz", + "integrity": "sha1-nyz0tR4Sx5FVAgCrwWtHEwrxBio=", "dev": true, "requires": { "chalk": "2.3.1", "diff": "3.4.0", "jest-get-type": "22.4.3", - "pretty-format": "23.0.1" + "pretty-format": "23.2.0" } }, "jest-docblock": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.0.1.tgz", - "integrity": "sha1-3t3RgzO+XcJBUmCgTvP86SdrVyU=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", "dev": true, "requires": { "detect-newline": "2.1.0" } }, "jest-each": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.1.0.tgz", - "integrity": "sha1-FhRrWSw1SGelrl4TzfFcbGW2lsY=", - "dev": true, - "requires": { - "chalk": "2.3.1", - "pretty-format": "23.0.1" - } - }, - "jest-environment-jsdom": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz", - "integrity": "sha1-hZKZFOI77TV32sl1X0EG0Gl8R5w=", - "dev": true, - "requires": { - "jest-mock": "23.1.0", - "jest-util": "23.1.0", - "jsdom": "11.11.0" - } - }, - "jest-environment-node": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.1.0.tgz", - "integrity": "sha1-RSwL+UnPy7rNoeF2Lu7XC8eEx9U=", - "dev": true, - "requires": { - "jest-mock": "23.1.0", - "jest-util": "23.1.0" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "jest-haste-map": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.1.0.tgz", - "integrity": "sha1-GObH1ajScTb5G32YUvhd4McHTEk=", - "dev": true, - "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "23.0.1", - "jest-serializer": "23.0.1", - "jest-worker": "23.0.1", - "micromatch": "2.3.11", - "sane": "2.5.2" - } - }, - "jest-jasmine2": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.1.0.tgz", - "integrity": "sha1-SvqzFym2VN3NKwdK3YSTlvE7MLg=", - "dev": true, - "requires": { - "chalk": "2.3.1", - "co": "4.6.0", - "expect": "23.1.0", - "is-generator-fn": "1.0.0", - "jest-diff": "23.0.1", - "jest-each": "23.1.0", - "jest-matcher-utils": "23.0.1", - "jest-message-util": "23.1.0", - "jest-snapshot": "23.0.1", - "jest-util": "23.1.0", - "pretty-format": "23.0.1" - } - }, - "jest-leak-detector": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.0.1.tgz", - "integrity": "sha1-nboHUFrDSVw50+wJrB5WRZnoYaA=", - "dev": true, - "requires": { - "pretty-format": "23.0.1" - } - }, - "jest-matcher-utils": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.0.1.tgz", - "integrity": "sha1-DGwNrt+YM8Kn82I2Bp7+y0w/bl8=", - "dev": true, - "requires": { - "chalk": "2.3.1", - "jest-get-type": "22.4.3", - "pretty-format": "23.0.1" - } - }, - "jest-message-util": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.1.0.tgz", - "integrity": "sha1-moCbpIfsrFzlEdTmmO47XuJGHqk=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.49", - "chalk": "2.3.1", - "micromatch": "2.3.11", - "slash": "1.0.0", - "stack-utils": "1.0.1" - } - }, - "jest-mock": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.1.0.tgz", - "integrity": "sha1-o4HDGxIasfYMRiotrbe4bczKxIc=", - "dev": true - }, - "jest-regex-util": { - "version": "23.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.0.0.tgz", - "integrity": "sha1-3Vwf3gxG9DcTFM8Q96dRoj9Oj3Y=", - "dev": true - }, - "jest-resolve": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.1.0.tgz", - "integrity": "sha1-ueMW7s69bwC8UKOWDRUnuuZXktI=", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", + "integrity": "sha1-L6nt2J2qGk7cn/m/YGKja3E0UUM=", "dev": true, "requires": { - "browser-resolve": "1.11.2", "chalk": "2.3.1", - "realpath-native": "1.0.0" + "pretty-format": "23.2.0" } }, - "jest-resolve-dependencies": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.0.1.tgz", - "integrity": "sha1-0BoQ3a2RUsTOzfXqwriFccS2pk0=", + "jest-environment-enzyme": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/jest-environment-enzyme/-/jest-environment-enzyme-6.0.2.tgz", + "integrity": "sha1-iQUmYi1d6KggoYSdJoTwO8AG4O8=", "dev": true, "requires": { - "jest-regex-util": "23.0.0", - "jest-snapshot": "23.0.1" - } - }, - "jest-runner": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.1.0.tgz", - "integrity": "sha1-+iCpM//3MaVDKzVh5/ZCZZT6KbU=", - "dev": true, - "requires": { - "exit": "0.1.2", - "graceful-fs": "4.1.11", - "jest-config": "23.1.0", - "jest-docblock": "23.0.1", - "jest-haste-map": "23.1.0", - "jest-jasmine2": "23.1.0", - "jest-leak-detector": "23.0.1", - "jest-message-util": "23.1.0", - "jest-runtime": "23.1.0", - "jest-util": "23.1.0", - "jest-worker": "23.0.1", - "source-map-support": "0.5.6", - "throat": "4.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", - "dev": true, - "requires": { - "buffer-from": "1.1.0", - "source-map": "0.6.1" - } - } - } - }, - "jest-runtime": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.1.0.tgz", - "integrity": "sha1-tK4OhyWeys/UqIS2OdsHz03WIK8=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-plugin-istanbul": "4.1.6", - "chalk": "2.3.1", - "convert-source-map": "1.5.1", - "exit": "0.1.2", - "fast-json-stable-stringify": "2.0.0", - "graceful-fs": "4.1.11", - "jest-config": "23.1.0", - "jest-haste-map": "23.1.0", - "jest-message-util": "23.1.0", - "jest-regex-util": "23.0.0", - "jest-resolve": "23.1.0", - "jest-snapshot": "23.0.1", - "jest-util": "23.1.0", - "jest-validate": "23.0.1", - "micromatch": "2.3.11", - "realpath-native": "1.0.0", - "slash": "1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "11.0.0" + "jest-environment-jsdom": "22.4.3" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "which-module": { + "callsites": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true - }, - "yargs": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", - "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "22.4.3", + "jest-util": "22.4.3", + "jsdom": "11.11.0" } }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", "dev": true, "requires": { - "camelcase": "4.1.0" + "@babel/code-frame": "7.0.0-beta.53", + "chalk": "2.3.1", + "micromatch": "2.3.11", + "slash": "1.0.0", + "stack-utils": "1.0.1" + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "2.0.0", + "chalk": "2.3.1", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "jest-message-util": "22.4.3", + "mkdirp": "0.5.1", + "source-map": "0.6.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, - "jest-serializer": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "23.2.0", + "jest-util": "23.4.0", + "jsdom": "11.11.0" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "23.2.0", + "jest-util": "23.4.0" + } + }, + "jest-enzyme": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/jest-enzyme/-/jest-enzyme-6.0.2.tgz", + "integrity": "sha1-vEZBad5sLVBgLgK7yUZEYFB/spU=", + "dev": true, + "requires": { + "enzyme-matchers": "6.0.2", + "enzyme-to-json": "3.3.4", + "jest-environment-enzyme": "6.0.2" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", "dev": true }, - "jest-snapshot": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.0.1.tgz", - "integrity": "sha1-ZnT6Gbnraamcq+zUFb3cQtavPn4=", + "jest-leak-detector": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz", + "integrity": "sha1-wonZYdxjjxQ1fU75bgQx7MGqN30=", + "dev": true, + "requires": { + "pretty-format": "23.2.0" + } + }, + "jest-matcher-utils": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz", + "integrity": "sha1-TUmB8jIT6Tnjzt8j3DTHR7WuGRM=", "dev": true, "requires": { "chalk": "2.3.1", - "jest-diff": "23.0.1", - "jest-matcher-utils": "23.0.1", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "23.0.1" + "jest-get-type": "22.4.3", + "pretty-format": "23.2.0" + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.53", + "chalk": "2.3.1", + "micromatch": "2.3.11", + "slash": "1.0.0", + "stack-utils": "1.0.1" } }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, "jest-util": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.1.0.tgz", - "integrity": "sha1-wCUbrzRkTG3S/qeKli9CY6xVdy0=", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", "dev": true, "requires": { "callsites": "2.0.0", "chalk": "2.3.1", "graceful-fs": "4.1.11", "is-ci": "1.1.0", - "jest-message-util": "23.1.0", + "jest-message-util": "23.4.0", "mkdirp": "0.5.1", "slash": "1.0.0", "source-map": "0.6.1" @@ -6799,21 +6939,21 @@ } }, "jest-validate": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.0.1.tgz", - "integrity": "sha1-zZ8BqJ0mu4hfEqhmdxXpyGWldU8=", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.4.0.tgz", + "integrity": "sha1-2W7t4B7wOskJwAnpyORVGX1IwgE=", "dev": true, "requires": { "chalk": "2.3.1", "jest-get-type": "22.4.3", "leven": "2.1.0", - "pretty-format": "23.0.1" + "pretty-format": "23.2.0" } }, "jest-watcher": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.1.0.tgz", - "integrity": "sha1-qNWELjjZ+0r/+CPfartCpYrmzb0=", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", "dev": true, "requires": { "ansi-escapes": "3.1.0", @@ -6830,9 +6970,9 @@ } }, "jest-worker": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.0.1.tgz", - "integrity": "sha1-nmSd2WP/QEYCb5HEAX8Dmmqkp7w=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", "dev": true, "requires": { "merge-stream": "1.0.1" @@ -6896,14 +7036,14 @@ "acorn": "5.5.0", "acorn-globals": "4.1.0", "array-equal": "1.0.0", - "cssom": "0.3.2", + "cssom": "0.3.4", "cssstyle": "0.3.1", "data-urls": "1.0.0", "domexception": "1.0.1", "escodegen": "1.10.0", "html-encoding-sniffer": "1.0.2", "left-pad": "1.3.0", - "nwsapi": "2.0.3", + "nwsapi": "2.0.4", "parse5": "4.0.0", "pn": "1.1.0", "request": "2.87.0", @@ -6989,6 +7129,12 @@ "sshpk": "1.13.1" } }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -7435,6 +7581,12 @@ "is-buffer": "1.1.6" } }, + "kleur": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-1.0.1.tgz", + "integrity": "sha512-8srIZ5BK5PCJw1L/JN741xgNfSjuQNK9ImYbYzv7ZUD3WPfuywaY+yd7lQOphJ+2vwXnMLnRZoAh5X+orRt4LQ==", + "dev": true + }, "known-css-properties": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.5.0.tgz", @@ -7543,6 +7695,17 @@ "integrity": "sha1-G2rh1frPPCVTI1ChPBGXy4u2dPQ=", "dev": true }, + "lodash._baseisequal": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", + "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", + "dev": true, + "requires": { + "lodash.isarray": "3.0.4", + "lodash.istypedarray": "3.0.6", + "lodash.keys": "3.1.2" + } + }, "lodash._basetostring": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", @@ -7553,6 +7716,12 @@ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", @@ -7639,6 +7808,12 @@ "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", "dev": true }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "lodash.get": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-3.7.0.tgz", @@ -7659,6 +7834,22 @@ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" }, + "lodash.isequal": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-3.0.4.tgz", + "integrity": "sha1-HDXrO27wzR/1F0Pj6jz3/f/ay2Q=", + "dev": true, + "requires": { + "lodash._baseisequal": "3.0.7", + "lodash._bindcallback": "3.0.1" + } + }, + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=", + "dev": true + }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", @@ -7972,7 +8163,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -8117,7 +8308,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.11" } @@ -8220,9 +8411,9 @@ "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==" }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "arr-diff": "4.0.0", @@ -8230,7 +8421,6 @@ "define-property": "2.0.2", "extend-shallow": "3.0.2", "fragment-cache": "0.2.1", - "is-odd": "2.0.0", "is-windows": "1.0.2", "kind-of": "6.0.2", "object.pick": "1.3.0", @@ -8283,6 +8473,18 @@ "integrity": "sha1-RvrCt92iVgpMt+YoZ3vV9k6sW+E=", "dev": true }, + "nearley": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.13.0.tgz", + "integrity": "sha512-ioYYogSaZhFlCpRizQgY3UT3G1qFXmHGY/5ozoFE3dMfiCRAeJfh+IPE3/eh9gCZvqLhPCWb4bLt7Bqzo+1mLQ==", + "dev": true, + "requires": { + "nomnom": "1.6.2", + "railroad-diagrams": "1.0.0", + "randexp": "0.4.6", + "semver": "5.5.0" + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -8292,7 +8494,7 @@ "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "0.1.12", "is-stream": "1.1.0" @@ -8334,7 +8536,7 @@ "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "requires": { "assert": "1.4.1", "browserify-zlib": "0.2.0", @@ -8470,6 +8672,30 @@ "is": "3.2.1" } }, + "nomnom": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", + "dev": true, + "requires": { + "colors": "0.5.1", + "underscore": "1.4.4" + }, + "dependencies": { + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", + "dev": true + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "dev": true + } + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -8481,7 +8707,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", @@ -8539,6 +8765,15 @@ "set-blocking": "2.0.0" } }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, "null-check": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", @@ -8556,9 +8791,9 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwsapi": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.3.tgz", - "integrity": "sha512-zFJF9lOpg2+uicP0BQKOAfIOqeTp/p8PC669mewxgRkR1hGjne8BMUHk4wpRS9o5Z0icA5Nv04HmGkW31KfMKw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.4.tgz", + "integrity": "sha512-Zt6HRR6RcJkuj5/N9zeE7FN6YitRW//hK2wTOwX274IBphbY3Zf5+yn5mZ9v/SzAOTMjQNxZf9KkmPLWn0cV4g==", "dev": true }, "oauth-sign": { @@ -8604,6 +8839,12 @@ "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz", "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=" }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, "object-is": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", @@ -8614,6 +8855,15 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -8636,15 +8886,6 @@ "has": "1.0.1" } }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -8683,6 +8924,18 @@ "isobject": "3.0.1" } }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0", + "function-bind": "1.1.1", + "has": "1.0.1" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -8882,7 +9135,7 @@ "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=" + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" }, "parse-asn1": { "version": "5.1.0", @@ -8930,10 +9183,13 @@ } }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "10.5.2" + } }, "parsejson": { "version": "0.0.3", @@ -9032,7 +9288,7 @@ "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "requires": { "create-hash": "1.1.3", "create-hmac": "1.1.6", @@ -9466,7 +9722,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -9554,7 +9810,7 @@ "postcss-reporter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha1-oUF3/RNCgp0pFlPyeG79ZxEDMsM=", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", "dev": true, "requires": { "chalk": "2.3.1", @@ -9577,7 +9833,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -9640,7 +9896,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -9736,9 +9992,9 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "pretty-format": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.0.1.tgz", - "integrity": "sha1-1h0GUmjkx1kIO8y8onoBrXx2AfQ=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.2.0.tgz", + "integrity": "sha1-OwqqY8AYpTWDNzwcs6XZbMXoMBc=", "dev": true, "requires": { "ansi-regex": "3.0.0", @@ -9756,7 +10012,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.11.10", @@ -9777,11 +10033,21 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "2.0.6" } }, + "prompts": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.12.tgz", + "integrity": "sha512-pgR1GE1JM8q8UsHVIgjdK62DPwvrf0kvaKWJ/mfMoCm2lwfIReX/giQ1p0AlMoUXNhQap/8UiOdqi3bOROm/eg==", + "dev": true, + "requires": { + "kleur": "1.0.1", + "sisteransi": "0.1.1" + } + }, "prop-types": { "version": "15.6.0", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", @@ -9874,10 +10140,35 @@ "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "dev": true, + "requires": { + "performance-now": "2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "0.1.15" + } + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -9979,11 +10270,11 @@ } }, "react-dropzone": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-4.2.11.tgz", - "integrity": "sha512-hE1yJ56GaWvLRgYPU0ffY2h1pxPpPwIe8UO77bREtJR6sgmSiTTdOZCkKw7rPE887g8XDSQ/fO3KWi8asrO4tQ==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-4.2.13.tgz", + "integrity": "sha512-kqpt0Up4GZZFoz4WvBTVzMmVDUZFoGRKDXeyV+baWXZx8Gt0CZmOtV7BSMF1JaBihx6mwy+rfYVNnOKB2hrY9Q==", "requires": { - "attr-accept": "1.1.2", + "attr-accept": "1.1.3", "prop-types": "15.6.0" } }, @@ -10043,25 +10334,29 @@ } }, "react-is": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.0.tgz", - "integrity": "sha512-8ADZg/mBw+t2Fbr5Hm1K64v8q8Q6E+DprV5wQ5A8PSLW6XP0XJFMdUskVEW8efQ5oUgWHn8EYdHEPAMF0Co6hA==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", + "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", "dev": true }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "react-paginate": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-5.2.3.tgz", "integrity": "sha512-4Bf2xbNNZpjHliPvgXndg4ictj9S9Mf/E/eSfctGPO9XpJseBU+UZbmaa0Zmd6FZmGm1uBu1wGiF4CPCpDwZLQ==", "requires": { - "prop-types": "15.6.1" + "prop-types": "15.6.2" }, "dependencies": { "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "requires": { - "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1" } @@ -10073,6 +10368,18 @@ "resolved": "https://registry.npmjs.org/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz", "integrity": "sha1-acLVdB5t9eCPIw82u8KUTuEiJVU=" }, + "react-reconciler": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", + "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", + "dev": true, + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, "react-redux": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", @@ -10109,25 +10416,25 @@ "fbjs": "0.8.16", "object-assign": "4.1.1", "prop-types": "15.6.0", - "react-is": "16.4.0" + "react-is": "16.4.1" } }, "react-transition-group": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.3.1.tgz", - "integrity": "sha512-hu4/LAOFSKjWt1+1hgnOv3ldxmt6lvZGTWz4KUkFrqzXrNDIVSu6txIcPszw7PNduR8en9YTN55JLRyd/L1ZiQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.4.0.tgz", + "integrity": "sha512-Xv5d55NkJUxUzLCImGSanK8Cl/30sgpOEMGc5m86t8+kZwrPxPCPcFqyx83kkr+5Lz5gs6djuvE5By+gce+VjA==", "requires": { "dom-helpers": "3.3.1", "loose-envify": "1.3.1", - "prop-types": "15.6.1" + "prop-types": "15.6.2", + "react-lifecycles-compat": "3.0.4" }, "dependencies": { "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "requires": { - "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1" } @@ -10197,7 +10504,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -10216,9 +10523,9 @@ } }, "realpath-native": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", - "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.1.tgz", + "integrity": "sha512-W14EcXuqUvKP8dkWkD7B95iMy77lpMnlFXbbk409bQtNCbeu0kvRE5reo+yIZ3JXxg6frbGsz2DLQ39lrCB40g==", "dev": true, "requires": { "util.promisify": "1.0.0" @@ -10277,7 +10584,7 @@ "redux": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s=", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { "lodash": "4.17.5", "lodash-es": "4.17.6", @@ -10286,9 +10593,9 @@ } }, "redux-devtools-extension": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz", - "integrity": "sha1-4Pmo6N/KfBe+kscSSVijuU6ykR0=" + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.5.tgz", + "integrity": "sha512-QQ9BRy77oURHMdGys9rfQcCQDzXZ1T4oW+eUyE5Cg7DNVau69HJzc4YNDMOmpi0Dzpi1zOQgQ2rUpgJta4Lfqg==" }, "redux-thunk": { "version": "2.2.0", @@ -10313,7 +10620,7 @@ "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { "babel-runtime": "6.26.0", "babel-types": "6.26.0", @@ -10638,6 +10945,16 @@ "inherits": "2.0.3" } }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "4.4.0", + "nearley": "2.13.0" + } + }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -10647,7 +10964,7 @@ "rtlcss": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.2.1.tgz", - "integrity": "sha1-+FN+QVUggWawXhiYAhMZNvzv0p4=", + "integrity": "sha512-JjQ5DlrmwiItAjlmhoxrJq5ihgZcE0wMFxt7S17bIrt4Lw0WwKKFk+viRhvodB/0falyG/5fiO043ZDh6/aqTw==", "requires": { "chalk": "2.3.1", "findup": "0.1.5", @@ -10669,7 +10986,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -10691,7 +11008,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safe-regex": { "version": "1.1.0", @@ -10715,7 +11032,7 @@ "requires": { "anymatch": "2.0.0", "capture-exit": "1.2.0", - "exec-sh": "0.2.1", + "exec-sh": "0.2.2", "fb-watchman": "2.0.0", "micromatch": "3.1.10", "minimist": "1.2.0", @@ -10994,7 +11311,7 @@ "extglob": "2.0.4", "fragment-cache": "0.2.1", "kind-of": "6.0.2", - "nanomatch": "1.2.9", + "nanomatch": "1.2.13", "object.pick": "1.3.0", "regex-not": "1.0.2", "snapdragon": "0.8.2", @@ -11023,7 +11340,7 @@ "sass-loader": { "version": "6.0.6", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", - "integrity": "sha1-6dXmwfFV+qMqSybXqbcQfCJeQPk=", + "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", "requires": { "async": "2.6.0", "clone-deep": "0.3.0", @@ -11035,7 +11352,7 @@ "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { "lodash": "4.17.5" } @@ -11283,6 +11600,12 @@ } } }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -11291,7 +11614,7 @@ "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" @@ -11323,7 +11646,7 @@ "map-cache": "0.2.2", "source-map": "0.5.7", "source-map-resolve": "0.5.2", - "use": "3.1.0" + "use": "3.1.1" }, "dependencies": { "define-property": { @@ -11567,7 +11890,7 @@ "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=" + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" }, "source-map": { "version": "0.5.7", @@ -11637,7 +11960,7 @@ "specificity": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha1-meZRHs7vD42bV5JJN6rCyxPRPEI=", + "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", "dev": true }, "split-string": { @@ -11795,7 +12118,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -12013,7 +12336,7 @@ "style-loader": { "version": "0.18.2", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha1-zDFFmvvNbYC3Ig7lSykan9Zv9es=", + "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", "requires": { "loader-utils": "1.1.0", "schema-utils": "0.3.0" @@ -12124,7 +12447,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -12279,13 +12602,13 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -12330,7 +12653,7 @@ "stylelint-config-recommended-scss": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-2.0.0.tgz", - "integrity": "sha1-P0SzOK+zv1tr2e663UaO7ydxOSI=", + "integrity": "sha512-DUIW3daRl5EAyU4ZR6xfPa+bqV5wDccS7X1je6Enes9edpbmWUBR/5XLfDPnjMJgqOe2QwqwaE/qnG4lXID9rg==", "dev": true, "requires": { "stylelint-config-recommended": "1.0.0" @@ -12339,7 +12662,7 @@ "stylelint-config-standard": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-17.0.0.tgz", - "integrity": "sha1-QhA6CQBU7io93p7K7VXl1NnQWfw=", + "integrity": "sha512-G8jMZ0KsaVH7leur9XLZVhwOBHZ2vdbuJV8Bgy0ta7/PpBhEHo6fjVDaNchyCGXB5sRcWVq6O9rEU/MvY9cQDQ==", "dev": true, "requires": { "stylelint-config-recommended": "1.0.0" @@ -12348,7 +12671,7 @@ "stylelint-formatter-pretty": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stylelint-formatter-pretty/-/stylelint-formatter-pretty-1.0.3.tgz", - "integrity": "sha1-prQ8PzoTIGvft3fQ2ozvxsdsNsM=", + "integrity": "sha512-Jg39kL6kkjUrdKIiHwwz/fbElcF5dOS48ZhvGrEJeWijUbmY1yudclfXv9H61eBqKKu0E33nfez2r0G4EvPtFA==", "dev": true, "requires": { "ansi-escapes": "2.0.0", @@ -12407,7 +12730,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -12462,7 +12785,7 @@ "sugarss": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", - "integrity": "sha1-voJtkAPg8kdzX5I2XcP9fxuunkQ=", + "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", "dev": true, "requires": { "postcss": "6.0.19" @@ -12482,7 +12805,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -12889,7 +13212,7 @@ "extglob": "2.0.4", "fragment-cache": "0.2.1", "kind-of": "6.0.2", - "nanomatch": "1.2.9", + "nanomatch": "1.2.13", "object.pick": "1.3.0", "regex-not": "1.0.2", "snapdragon": "0.8.2", @@ -12953,7 +13276,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -12976,7 +13299,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "1.0.2" @@ -13489,21 +13812,10 @@ } }, "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "user-home": { "version": "2.0.0", @@ -13679,7 +13991,7 @@ "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", "dev": true, "requires": { - "exec-sh": "0.2.1", + "exec-sh": "0.2.2", "minimist": "1.2.0" }, "dependencies": { @@ -13916,7 +14228,7 @@ "webpack-merge": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", - "integrity": "sha1-8Rl6Cpc+acb77rbWWCGaqMDBNVU=", + "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", "requires": { "lodash": "4.17.5" } @@ -13933,7 +14245,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -13998,7 +14310,7 @@ "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { "string-width": "1.0.2" } @@ -14084,7 +14396,7 @@ "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { "sax": "1.2.4", diff --git a/package.json b/package.json index b4ad0eaf2b46..d40f5ce32cc6 100644 --- a/package.json +++ b/package.json @@ -64,14 +64,17 @@ }, "devDependencies": { "@edx/stylelint-config-edx": "1.1.0", - "babel-jest": "^23.0.1", + "babel-jest": "23.0.1", "edx-custom-a11y-rules": "0.1.3", + "enzyme": "3.3.0", + "enzyme-adapter-react-16": "1.1.1", "eslint-config-edx": "3.0.1", "eslint-config-edx-es5": "2.0.0", "eslint-import-resolver-webpack": "0.8.4", "jasmine-core": "2.6.4", "jasmine-jquery": "2.1.1", - "jest": "^23.1.0", + "jest": "23.1.0", + "jest-enzyme": "6.0.2", "karma": "0.13.22", "karma-chrome-launcher": "0.2.3", "karma-coverage": "0.5.5", @@ -87,7 +90,7 @@ "pa11y": "4.0.1", "pa11y-reporter-json-oldnode": "1.0.0", "plato": "1.2.2", - "react-test-renderer": "^16.4.0", + "react-test-renderer": "16.4.0", "selenium-webdriver": "3.4.0", "sinon": "2.3.5", "squirejs": "0.1.0", diff --git a/pavelib/paver_tests/test_js_test.py b/pavelib/paver_tests/test_js_test.py index 46aaa6f7bca2..1188e043b2ed 100644 --- a/pavelib/paver_tests/test_js_test.py +++ b/pavelib/paver_tests/test_js_test.py @@ -117,11 +117,15 @@ def verify_messages(self, options, dev_mode): )) expected_messages.append(self.EXPECTED_INSTALL_NPM_ASSETS_COMMAND) + command_template = ( + u'nodejs --max_old_space_size=4096 node_modules/.bin/karma start {options}' + ) + for suite in suites: # Karma test command if suite != 'jest-snapshot': karma_config_file = Env.KARMA_CONFIG_FILES[Env.JS_TEST_ID_KEYS.index(suite)] - expected_test_tool_command = u'karma start {options}'.format( + expected_test_tool_command = command_template.format( options=self.EXPECTED_KARMA_OPTIONS.format( config_file=karma_config_file, single_run='false' if dev_mode else 'true', diff --git a/setupTests.js b/setupTests.js new file mode 100644 index 000000000000..4f652dffd8f6 --- /dev/null +++ b/setupTests.js @@ -0,0 +1,6 @@ +import {configure} from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +configure({adapter: new Adapter()}); + +global.gettext = (text) => text; diff --git a/webpack.common.config.js b/webpack.common.config.js index 241c90ab6339..5ad625f5eb01 100644 --- a/webpack.common.config.js +++ b/webpack.common.config.js @@ -52,6 +52,7 @@ module.exports = Merge.smart({ PasswordResetConfirmation: './lms/static/js/student_account/components/PasswordResetConfirmation.jsx', StudentAccountDeletion: './lms/static/js/student_account/components/StudentAccountDeletion.jsx', StudentAccountDeletionInitializer: './lms/static/js/student_account/StudentAccountDeletionInitializer.js', + ProblemBrowser: './lms/djangoapps/instructor/static/instructor/ProblemBrowser/index.jsx', // Learner Dashboard EntitlementFactory: './lms/static/js/learner_dashboard/course_entitlement_factory.js', @@ -341,6 +342,7 @@ module.exports = Merge.smart({ 'common/static/coffee/src', 'common/static/common/js', 'common/static/common/js/vendor/', + 'common/static/common/js/components', 'common/static/js/src', 'common/static/js/vendor/', 'common/static/js/vendor/jQuery-File-Upload/js/',