diff --git a/.eslintrc b/.eslintrc deleted file mode 100755 index f643f69..0000000 --- a/.eslintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "extends": "eslint-config-edx", - "parser": "babel-eslint", - "rules": { - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": [ - "config/*.js", - "**/*.test.jsx", - "**/*.test.js" - ] - } - ], - // https://github.com/evcohen/eslint-plugin-jsx-a11y/issues/340#issuecomment-338424908 - "jsx-a11y/anchor-is-valid": [ "error", { - "components": [ "Link" ], - "specialLink": [ "to" ] - }], - // https://github.com/yannickcr/eslint-plugin-react/issues/1754#issuecomment-378838053 - // tl;dr: this rule is no longer going to cause any user-facing visual weirdness, its original motivation - "react/no-did-mount-set-state": "off" - }, - "env": { - "jest": true - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..6f4fb65 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +const { createConfig } = require('@edx/frontend-build'); + +module.exports = createConfig('eslint'); diff --git a/package-lock.json b/package-lock.json index e5d6767..b399269 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1248,31 +1248,6 @@ "integrity": "sha512-+CXg2ydBME6BL3gMyuzBv303XvI1Tru50xKG1AnS3wgwaeymmjOrTd18kfh/fv5uDotIx4WfvQ11kAs1aRfM8w==", "dev": true }, - "@edx/frontend-auth": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@edx/frontend-auth/-/frontend-auth-4.0.0.tgz", - "integrity": "sha512-nWbdq9c3WDzNyIA16MI9jRMaSbUn4lMUA1gLi1xmxxviR9Kppm6Ne6vZpCpo0p18X2kcWsfEnEprTfRg1i+5Ew==", - "requires": { - "axios": "^0.18.0", - "camelcase-keys": "^5.0.0", - "jwt-decode": "^2.2.0", - "pubsub-js": "^1.7.0", - "snakecase-keys": "^2.1.0", - "universal-cookie": "^3.0.4", - "url-parse": "^1.4.3" - }, - "dependencies": { - "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - } - } - } - }, "@edx/frontend-build": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@edx/frontend-build/-/frontend-build-5.2.0.tgz", @@ -6002,16 +5977,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "camelcase-keys": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-5.2.0.tgz", - "integrity": "sha512-mSM/OQKD1HS5Ll2AXxeaHSdqCGC/QQ8IrgTbKYA/rxnC36thBKysfIr9+OVBWuW17jyZF4swHkjtglawgBmVFg==", - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^3.0.0", - "quick-lru": "^1.0.0" - } - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -6340,12 +6305,6 @@ "safe-buffer": "^5.0.1" } }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -7223,11 +7182,6 @@ "safe-buffer": "~5.1.1" } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -9017,437 +8971,6 @@ "object.entries": "^1.1.2" } }, - "eslint-config-edx": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-edx/-/eslint-config-edx-4.0.4.tgz", - "integrity": "sha512-4xm13P14kcm3IppkjL8X3HDxLgA064l3F50sy7z8ioyB4kDLRepSSXhyDHR8vHDd46yztmnuIPXbEEgVNOL4xg==", - "dev": true, - "requires": { - "eslint": "^4.5.0", - "eslint-config-airbnb": "^16.1.0", - "eslint-plugin-dollar-sign": "^1.0.1", - "eslint-plugin-import": "^2.8.0", - "eslint-plugin-jsx-a11y": "6.0.3", - "eslint-plugin-react": "^7.5.1" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "aria-query": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", - "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "axobject-query": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", - "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "emoji-regex": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", - "dev": true - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - } - }, - "eslint-config-airbnb": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz", - "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^12.1.0" - } - }, - "eslint-config-airbnb-base": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", - "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", - "dev": true, - "requires": { - "eslint-restricted-globals": "^0.1.1" - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz", - "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=", - "dev": true, - "requires": { - "aria-query": "^0.7.0", - "array-includes": "^3.0.3", - "ast-types-flow": "0.0.7", - "axobject-query": "^0.1.0", - "damerau-levenshtein": "^1.0.0", - "emoji-regex": "^6.1.0", - "jsx-ast-utils": "^2.0.0" - } - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "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 - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.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-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - } - } - }, "eslint-import-resolver-node": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", @@ -9548,12 +9071,6 @@ } } }, - "eslint-plugin-dollar-sign": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-dollar-sign/-/eslint-plugin-dollar-sign-1.0.2.tgz", - "integrity": "sha512-AtA5MJpMAh0kKzSx/u7DuDbPRijIZmlt6n75CR8Q3UQ18Fo4QFfYK15lJ8OhXQQUYR7zTMMB2x37KyP3LnAC/g==", - "dev": true - }, "eslint-plugin-import": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", @@ -9669,12 +9186,6 @@ "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", "dev": true }, - "eslint-restricted-globals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", - "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", - "dev": true - }, "eslint-scope": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", @@ -11621,41 +11132,182 @@ "dev": true }, "husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-2.7.0.tgz", + "integrity": "sha512-LIi8zzT6PyFpcYKdvWRCn/8X+6SuG2TgYYMrM6ckEYhlp44UcEduVymZGIZNLiwOUjrEud+78w/AsAiqJA/kRg==", "dev": true, "requires": { - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" + "cosmiconfig": "^5.2.0", + "execa": "^1.0.0", + "find-up": "^3.0.0", + "get-stdin": "^7.0.0", + "is-ci": "^2.0.0", + "pkg-dir": "^4.1.0", + "please-upgrade-node": "^3.1.1", + "read-pkg": "^5.1.1", + "run-node": "^1.0.0", + "slash": "^3.0.0" }, "dependencies": { - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "ci-info": "^1.5.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", "dev": true }, - "strip-indent": { + "import-fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } @@ -15024,11 +14676,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-3.1.0.tgz", - "integrity": "sha512-Xg1iyYz/+iIW6YoMldux47H/e5QZyDSB41Kb0ev+YYHh3FJnyyzY0vTk/WbVeWcCvdXd70cOriUBmhP8alUFBA==" - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -20986,11 +20633,14 @@ } } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } }, "pngquant-bin": { "version": "5.0.2", @@ -21895,11 +21545,6 @@ } } }, - "pubsub-js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.9.0.tgz", - "integrity": "sha512-bBGaOnAdkn3jhZC71mhjNB4mxQAOM99GTh/NoVuf/VXWUuQAZJGWIkEJlkXi0ACdKx3z65u5qilWaE5G4mMQOw==" - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -21981,12 +21626,8 @@ "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true }, "raf": { "version": "3.4.1", @@ -23225,43 +22866,11 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "dependencies": { - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true }, "resolve": { "version": "1.17.0", @@ -23552,6 +23161,12 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, "run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", @@ -24140,6 +23755,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", @@ -24480,22 +24101,6 @@ } } }, - "snakecase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-2.1.0.tgz", - "integrity": "sha512-oQSiCIgNCwixBf8Kxgv0SPo67zQSutIEymAk/dkgcdZEOMPvGMGPua/WwYGPG4LLHArGGews3CB3zEEfqlMk2g==", - "requires": { - "map-obj": "~3.0.0", - "to-snake-case": "~1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-3.0.0.tgz", - "integrity": "sha512-Ot+2wruG8WqTbJngDxz0Ifm03y2pO4iL+brq/l+yEkGjUza03BnMQqX2XT//Jls8MOOl2VTHviAoLX+/nq/HXw==" - } - } - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -26010,11 +25615,6 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-no-case": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", - "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -26069,22 +25669,6 @@ "repeat-string": "^1.6.1" } }, - "to-snake-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-snake-case/-/to-snake-case-1.0.0.tgz", - "integrity": "sha1-znRpE4l5RgGah+Yu366upMYIq4w=", - "requires": { - "to-space-case": "^1.0.0" - } - }, - "to-space-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", - "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", - "requires": { - "to-no-case": "^1.0.0" - } - }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -26646,17 +26230,6 @@ "crypto-random-string": "^1.0.0" } }, - "universal-cookie": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-3.1.0.tgz", - "integrity": "sha512-sP6WuFgqIUro7ikgI2ndrsw9Ro+YvVBe5O9cQfWnjTicpLaSMUEUUDjQF8m8utzWF2ONl7tRkcZd7v4n6NnzjQ==", - "requires": { - "@types/cookie": "^0.3.1", - "@types/object-assign": "^4.0.30", - "cookie": "^0.3.1", - "object-assign": "^4.1.0" - } - }, "universal-user-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", @@ -26836,6 +26409,7 @@ "version": "1.4.7", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" diff --git a/package.json b/package.json index 28cac3a..c219d6c 100755 --- a/package.json +++ b/package.json @@ -10,8 +10,9 @@ "build": "fedx-scripts webpack", "coveralls": "cat ./coverage/lcov.info | coveralls", "is-es5": "es-check es5 ./dist/*.js", - "lint": "eslint --ext .js --ext .jsx .", - "precommit": "npm run lint", + "lint": "fedx-scripts eslint --ext .jsx,.js src/", + "lint-fix": "fedx-scripts eslint --fix --ext .jsx,.js src/", + "prepush": "npm run lint", "semantic-release": "semantic-release", "start": "fedx-scripts webpack-dev-server --progress", "test": "TZ=GMT fedx-scripts jest --coverage --passWithNoTests", @@ -25,7 +26,6 @@ "access": "public" }, "dependencies": { - "@edx/frontend-auth": "^4.0.0", "@edx/frontend-component-footer": "10.0.11", "@edx/frontend-platform": "1.5.0", "@edx/paragon": "10.0.1", @@ -63,9 +63,8 @@ "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.14.0", "es-check": "^2.3.0", - "eslint-config-edx": "^4.0.4", "fetch-mock": "^6.5.2", - "husky": "^0.14.3", + "husky": "2.7.0", "identity-obj-proxy": "^3.0.0", "react-dev-utils": "^5.0.3", "react-test-renderer": "^16.10.1", diff --git a/src/components/Drawer/index.jsx b/src/components/Drawer/index.jsx index d626750..1052f9e 100644 --- a/src/components/Drawer/index.jsx +++ b/src/components/Drawer/index.jsx @@ -14,11 +14,6 @@ export default class Drawer extends React.Component { }; } - deferToNextRepaint(callback) { - window.requestAnimationFrame(() => - window.setTimeout(callback, 0)); - } - close = () => { if (this.state.open) { this.toggleOpen(); @@ -39,6 +34,10 @@ export default class Drawer extends React.Component { } }; + deferToNextRepaint(callback) { + window.requestAnimationFrame(() => window.setTimeout(callback, 0)); + } + render() { return (
diff --git a/src/components/FilterBadges/index.jsx b/src/components/FilterBadges/index.jsx index 559f758..a4939dc 100644 --- a/src/components/FilterBadges/index.jsx +++ b/src/components/FilterBadges/index.jsx @@ -1,4 +1,3 @@ - import { connect } from 'react-redux'; import React from 'react'; @@ -27,27 +26,43 @@ function RangeFilterBadge({ filterValue2, handleBadgeClose, }) { - return ((filterValue1 !== initialFilters[filterName1]) || - (filterValue2 !== initialFilters[filterName2])) - && + return ((filterValue1 !== initialFilters[filterName1]) + || (filterValue2 !== initialFilters[filterName2])) + && ( ; + /> + ); } - +RangeFilterBadge.propTypes = { + displayName: PropTypes.string.isRequired, + filterName1: PropTypes.string.isRequired, + filterValue1: PropTypes.string.isRequired, + filterName2: PropTypes.string.isRequired, + filterValue2: PropTypes.string.isRequired, + handleBadgeClose: PropTypes.func.isRequired, +}; function SingleValueFilterBadge({ displayName, filterName, filterValue, handleBadgeClose, }) { - return (filterValue !== initialFilters[filterName]) && + return (filterValue !== initialFilters[filterName]) + && ( ; + /> + ); } +SingleValueFilterBadge.propTypes = { + displayName: PropTypes.string.isRequired, + filterName: PropTypes.string.isRequired, + filterValue: PropTypes.string.isRequired, + handleBadgeClose: PropTypes.func.isRequired, +}; function FilterBadges({ assignment, @@ -150,4 +165,3 @@ FilterBadges.propTypes = { courseGradeMax: PropTypes.string, handleFilterBadgeClose: PropTypes.func.isRequired, }; - diff --git a/src/components/Gradebook/index.jsx b/src/components/Gradebook/index.jsx index 34ef93f..d0568e2 100644 --- a/src/components/Gradebook/index.jsx +++ b/src/components/Gradebook/index.jsx @@ -1,3 +1,4 @@ +/* eslint-disable react/sort-comp, react/button-has-type */ import React from 'react'; import PropTypes from 'prop-types'; import { @@ -24,7 +25,6 @@ import { formatDateForDisplay } from '../../data/actions/utils'; import initialFilters from '../../data/constants/filters'; import ConnectedFilterBadges from '../FilterBadges'; - const DECIMAL_PRECISION = 2; const GRADE_OVERRIDE_HISTORY_COLUMNS = [{ label: 'Date', key: 'date' }, { label: 'Grader', key: 'grader' }, { label: 'Reason', key: 'reason' }, @@ -166,8 +166,7 @@ export default class Gradebook extends React.Component { }; handleAssignmentFilterChange = (assignment) => { - const selectedFilterOption = this.props.assignmentFilterOptions.find(assig => - assig.label === assignment); + const selectedFilterOption = this.props.assignmentFilterOptions.find(assig => assig.label === assignment); const { type, id } = selectedFilterOption || {}; const typedValue = { label: assignment, type, id }; this.props.updateAssignmentFilter(typedValue); @@ -396,7 +395,8 @@ export default class Gradebook extends React.Component { onClick={() => this.setNewModalState(entry, subsection)} > {this.roundGrade(subsection.percent * 100)}% - ); + + ); } return acc; }, {}); @@ -550,47 +550,45 @@ export default class Gradebook extends React.Component { href={this.lmsInstructorDashboardUrl(this.props.courseId)} className="mb-3" > - {'Back to Dashboard'} + Back to Dashboard

Gradebook

{this.props.courseId}

- {this.props.areGradesFrozen && -
+ {this.props.areGradesFrozen + && ( +
The grades for this course are now frozen. Editing of grades is no longer allowed.
- } - {(this.props.canUserViewGradebook === false) && -
+ )} + {(this.props.canUserViewGradebook === false) + && ( +
You are not authorized to view the gradebook for this course.
- } + )}

Step 1: Filter the Grade Report

-
+
{this.props.showSpinner &&
}
- this.props.searchForUser( - this.props.courseId, - value, - this.props.selectedCohort, - this.props.selectedTrack, - this.props.selectedAssignmentType, - ) - } + onSubmit={value => this.props.searchForUser( + this.props.courseId, + value, + this.props.selectedCohort, + this.props.selectedTrack, + this.props.selectedAssignmentType, + )} inputLabel="Search for a learner" onChange={filterValue => this.setState({ filterValue })} - onClear={() => - this.props.getUserGrades( - this.props.courseId, - this.props.selectedCohort, - this.props.selectedTrack, - this.props.selectedAssignmentType, - ) - } + onClear={() => this.props.getUserGrades( + this.props.courseId, + this.props.selectedCohort, + this.props.selectedTrack, + this.props.selectedAssignmentType, + )} value={this.state.filterValue} /> Search by username, email, or student key @@ -610,21 +608,22 @@ export default class Gradebook extends React.Component { dialog={this.getCourseGradeFilterAlertDialog()} dismissible={false} open={ - !this.state.isMinCourseGradeFilterValid || - !this.state.isMaxCourseGradeFilterValid + !this.state.isMinCourseGradeFilterValid + || !this.state.isMaxCourseGradeFilterValid } />

Step 2: View or Modify Individual Grades

- {this.props.totalUsersCount ? -
- Showing - {this.props.filteredUsersCount} - of - {this.props.totalUsersCount} - total learners -
: - null - } + {this.props.totalUsersCount + ? ( +
+ Showing + {this.props.filteredUsersCount} + of + {this.props.totalUsersCount} + total learners +
+ ) + : null}
), }]} - />)} + /> + )}
Showing most recent actions (max 5). To see more, please contact - support. + support.
Note: Once you save, your changes will be visible to students.
@@ -814,16 +814,17 @@ export default class Gradebook extends React.Component { ]} className="table-striped" /> - )} + + )}
)} initiallyOpen={false} - title={ - + title={( + <> Filter By... - - } + + )} >
diff --git a/src/components/PageButtons/index.jsx b/src/components/PageButtons/index.jsx index 3f04889..89824af 100644 --- a/src/components/PageButtons/index.jsx +++ b/src/components/PageButtons/index.jsx @@ -2,7 +2,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Button } from '@edx/paragon'; - export default function PageButtons({ prevPage, nextPage, selectedTrack, selectedCohort, selectedAssignmentType, getPrevNextGrades, match, @@ -16,14 +15,13 @@ export default function PageButtons({ style={{ margin: '20px' }} variant="outline-primary" disabled={!prevPage} - onClick={() => - getPrevNextGrades( - prevPage, - match.params.courseId, - selectedCohort, - selectedTrack, - selectedAssignmentType, - )} + onClick={() => getPrevNextGrades( + prevPage, + match.params.courseId, + selectedCohort, + selectedTrack, + selectedAssignmentType, + )} > Previous Page @@ -31,14 +29,13 @@ export default function PageButtons({ style={{ margin: '20px' }} variant="outline-primary" disabled={!nextPage} - onClick={() => - getPrevNextGrades( - nextPage, - match.params.courseId, - selectedCohort, - selectedTrack, - selectedAssignmentType, - )} + onClick={() => getPrevNextGrades( + nextPage, + match.params.courseId, + selectedCohort, + selectedTrack, + selectedAssignmentType, + )} > Next Page @@ -76,4 +73,3 @@ PageButtons.propTypes = { name: PropTypes.string, }), }; - diff --git a/src/containers/GradebookPage/index.jsx b/src/containers/GradebookPage/index.jsx index 50a63c4..d963753 100644 --- a/src/containers/GradebookPage/index.jsx +++ b/src/containers/GradebookPage/index.jsx @@ -18,7 +18,9 @@ import { } from '../../data/actions/grades'; import { fetchCohorts } from '../../data/actions/cohorts'; import { fetchTracks } from '../../data/actions/tracks'; -import { initializeFilters, resetFilters, updateAssignmentFilter, updateAssignmentLimits, updateCourseGradeFilter } from '../../data/actions/filters'; +import { + initializeFilters, resetFilters, updateAssignmentFilter, updateAssignmentLimits, updateCourseGradeFilter, +} from '../../data/actions/filters'; import stateHasMastersTrack from '../../data/selectors/tracks'; import { getBulkManagementHistory, @@ -37,7 +39,7 @@ import LmsApiService from '../../data/services/LmsApiService'; function shouldShowSpinner(state) { if (state.roles.canUserViewGradebook === true) { return state.grades.showSpinner; - } else if (state.roles.canUserViewGradebook === false) { + } if (state.roles.canUserViewGradebook === false) { return false; } // canUserViewGradebook === null return true; @@ -104,12 +106,12 @@ const mapStateToProps = (state, ownProps) => ( courseGradeMin: formatMinCourseGrade(state.filters.courseGradeMin), courseGradeMax: formatMaxCourseGrade(state.filters.courseGradeMax), }), - bulkImportError: state.grades.bulkManagement && - state.grades.bulkManagement.errorMessages ? - `Errors while processing: ${state.grades.bulkManagement.errorMessages.join(', ')}` : - '', - uploadSuccess: !!(state.grades.bulkManagement && - state.grades.bulkManagement.uploadSuccess), + bulkImportError: state.grades.bulkManagement + && state.grades.bulkManagement.errorMessages + ? `Errors while processing: ${state.grades.bulkManagement.errorMessages.join(', ')}` + : '', + uploadSuccess: !!(state.grades.bulkManagement + && state.grades.bulkManagement.uploadSuccess), showBulkManagement: stateHasMastersTrack(state) && state.config.bulkManagementAvailable, bulkManagementHistory: getBulkManagementHistory(state), totalUsersCount: state.grades.totalUsersCount, diff --git a/src/data/actions/assignmentTypes.js b/src/data/actions/assignmentTypes.js index e09714c..043e058 100644 --- a/src/data/actions/assignmentTypes.js +++ b/src/data/actions/assignmentTypes.js @@ -38,4 +38,3 @@ export { gotAssignmentTypes, errorFetchingAssignmentTypes, }; - diff --git a/src/data/actions/filters.js b/src/data/actions/filters.js index 7322b28..4e6d150 100644 --- a/src/data/actions/filters.js +++ b/src/data/actions/filters.js @@ -1,5 +1,7 @@ import initialFilters from '../constants/filters'; -import { INITIALIZE_FILTERS, RESET_FILTERS, UPDATE_ASSIGNMENT_FILTER, UPDATE_ASSIGNMENT_LIMITS, UPDATE_COURSE_GRADE_LIMITS } from '../constants/actionTypes/filters'; +import { + INITIALIZE_FILTERS, RESET_FILTERS, UPDATE_ASSIGNMENT_FILTER, UPDATE_ASSIGNMENT_LIMITS, UPDATE_COURSE_GRADE_LIMITS, +} from '../constants/actionTypes/filters'; const initializeFilters = ({ assignment = initialFilters.assignment, diff --git a/src/data/actions/grades.js b/src/data/actions/grades.js index 350e277..b7a08e1 100644 --- a/src/data/actions/grades.js +++ b/src/data/actions/grades.js @@ -26,7 +26,9 @@ import { } from '../constants/actionTypes/grades'; import LmsApiService from '../services/LmsApiService'; import { sortAlphaAsc, formatDateForDisplay } from './utils'; -import { formatMaxAssignmentGrade, formatMinAssignmentGrade, formatMaxCourseGrade, formatMinCourseGrade } from '../selectors/grades'; +import { + formatMaxAssignmentGrade, formatMinAssignmentGrade, formatMaxCourseGrade, formatMinCourseGrade, +} from '../selectors/grades'; import { getFilters } from '../selectors/filters'; const defaultAssignmentFilter = 'All'; @@ -108,7 +110,6 @@ const uploadOverrideFailure = (courseId, error) => ({ payload: { error }, }); - const toggleGradeFormat = formatType => ({ type: TOGGLE_GRADE_FORMAT, formatType }); const filterAssignmentType = filterType => ( @@ -191,27 +192,26 @@ const doneViewingAssignment = () => dispatch => dispatch({ type: DONE_VIEWING_ASSIGNMENT, }); const fetchGradeOverrideHistory = (subsectionId, userId) => ( - dispatch => - LmsApiService.fetchGradeOverrideHistory(subsectionId, userId) - .then(response => response.data) - .then((data) => { - dispatch(gotGradeOverrideHistory({ - overrideHistory: formatGradeOverrideForDisplay(data.history), - currentEarnedAllOverride: data.override ? data.override.earned_all_override : null, - currentPossibleAllOverride: data.override ? data.override.possible_all_override : null, - currentEarnedGradedOverride: data.override ? data.override.earned_graded_override : null, - currentPossibleGradedOverride: data.override ? - data.override.possible_graded_override : null, - originalGradeEarnedAll: data.original_grade ? data.original_grade.earned_all : null, - originalGradePossibleAll: data.original_grade ? data.original_grade.possible_all : null, - originalGradeEarnedGraded: data.original_grade ? data.original_grade.earned_graded : null, - originalGradePossibleGraded: data.original_grade ? - data.original_grade.possible_graded : null, - })); - }) - .catch(() => { - dispatch(errorFetchingGradeOverrideHistory()); - }) + dispatch => LmsApiService.fetchGradeOverrideHistory(subsectionId, userId) + .then(response => response.data) + .then((data) => { + dispatch(gotGradeOverrideHistory({ + overrideHistory: formatGradeOverrideForDisplay(data.history), + currentEarnedAllOverride: data.override ? data.override.earned_all_override : null, + currentPossibleAllOverride: data.override ? data.override.possible_all_override : null, + currentEarnedGradedOverride: data.override ? data.override.earned_graded_override : null, + currentPossibleGradedOverride: data.override + ? data.override.possible_graded_override : null, + originalGradeEarnedAll: data.original_grade ? data.original_grade.earned_all : null, + originalGradePossibleAll: data.original_grade ? data.original_grade.possible_all : null, + originalGradeEarnedGraded: data.original_grade ? data.original_grade.earned_graded : null, + originalGradePossibleGraded: data.original_grade + ? data.original_grade.possible_graded : null, + })); + }) + .catch(() => { + dispatch(errorFetchingGradeOverrideHistory()); + }) ); const fetchMatchingUserGrades = ( @@ -293,11 +293,10 @@ const submitFileUploadFormData = (courseId, formData) => ( ); const fetchBulkUpgradeHistory = courseId => ( - dispatch => - // todo add loading effect - LmsApiService.fetchGradeBulkOperationHistory(courseId).then((response) => { - dispatch(gotBulkHistory(response)); - }).catch(() => dispatch(bulkHistoryError())) + // todo add loading effect + dispatch => LmsApiService.fetchGradeBulkOperationHistory(courseId).then( + (response) => { dispatch(gotBulkHistory(response)); }, + ).catch(() => dispatch(bulkHistoryError())) ); const updateGradesIfAssignmentGradeFiltersSet = ( diff --git a/src/data/actions/grades.test.js b/src/data/actions/grades.test.js index 7740da8..cedf5c6 100644 --- a/src/data/actions/grades.test.js +++ b/src/data/actions/grades.test.js @@ -14,7 +14,6 @@ import { } from '../constants/actionTypes/grades'; import { sortAlphaAsc } from './utils'; - const mockStore = configureMockStore([thunk]); jest.mock('@edx/frontend-platform/auth'); diff --git a/src/data/actions/roles.test.js b/src/data/actions/roles.test.js index 36622bf..2b3c668 100644 --- a/src/data/actions/roles.test.js +++ b/src/data/actions/roles.test.js @@ -15,7 +15,6 @@ import { STARTED_FETCHING_TRACKS } from '../constants/actionTypes/tracks'; import { STARTED_FETCHING_COHORTS } from '../constants/actionTypes/cohorts'; import { STARTED_FETCHING_ASSIGNMENT_TYPES } from '../constants/actionTypes/assignmentTypes'; - const mockStore = configureMockStore([thunk]); jest.mock('@edx/frontend-platform/auth'); diff --git a/src/data/actions/utils.js b/src/data/actions/utils.js index 1c78d0c..b51af20 100644 --- a/src/data/actions/utils.js +++ b/src/data/actions/utils.js @@ -27,4 +27,3 @@ const sortAlphaAsc = (gradeRowA, gradeRowB) => { }; export { sortAlphaAsc, formatDateForDisplay }; - diff --git a/src/data/constants/actionTypes/assignmentTypes.js b/src/data/constants/actionTypes/assignmentTypes.js index ba81c5e..203feed 100644 --- a/src/data/constants/actionTypes/assignmentTypes.js +++ b/src/data/constants/actionTypes/assignmentTypes.js @@ -9,4 +9,3 @@ export { ERROR_FETCHING_ASSIGNMENT_TYPES, GOT_ARE_GRADES_FROZEN, }; - diff --git a/src/data/reducers/assignmentTypes.js b/src/data/reducers/assignmentTypes.js index daca7da..1edc840 100644 --- a/src/data/reducers/assignmentTypes.js +++ b/src/data/reducers/assignmentTypes.js @@ -11,7 +11,6 @@ const initialState = { errorFetching: false, }; - const assignmentTypes = (state = initialState, action) => { switch (action.type) { case GOT_ASSIGNMENT_TYPES: @@ -45,4 +44,3 @@ const assignmentTypes = (state = initialState, action) => { }; export default assignmentTypes; - diff --git a/src/data/reducers/cohorts.js b/src/data/reducers/cohorts.js index ebc09d8..7acc22f 100644 --- a/src/data/reducers/cohorts.js +++ b/src/data/reducers/cohorts.js @@ -10,7 +10,6 @@ const initialState = { errorFetching: false, }; - const cohorts = (state = initialState, action) => { switch (action.type) { case GOT_COHORTS: @@ -37,4 +36,3 @@ const cohorts = (state = initialState, action) => { }; export default cohorts; - diff --git a/src/data/reducers/filters.js b/src/data/reducers/filters.js index dc9bf3f..ae82fe5 100644 --- a/src/data/reducers/filters.js +++ b/src/data/reducers/filters.js @@ -1,6 +1,8 @@ import { GOT_GRADES, FILTER_BY_ASSIGNMENT_TYPE } from '../constants/actionTypes/grades'; -import { INITIALIZE_FILTERS, UPDATE_ASSIGNMENT_FILTER, UPDATE_ASSIGNMENT_LIMITS, UPDATE_COURSE_GRADE_LIMITS, RESET_FILTERS } from '../constants/actionTypes/filters'; +import { + INITIALIZE_FILTERS, UPDATE_ASSIGNMENT_FILTER, UPDATE_ASSIGNMENT_LIMITS, UPDATE_COURSE_GRADE_LIMITS, RESET_FILTERS, +} from '../constants/actionTypes/filters'; import initialFilters from '../constants/filters'; @@ -15,8 +17,8 @@ const reducer = (state = initialState, action) => { ...state, assignmentType: action.filterType, assignment: ( - action.filterType !== '' && - (state.assignment || {}).type !== action.filterType) + action.filterType !== '' + && (state.assignment || {}).type !== action.filterType) ? '' : state.assignment, }; case INITIALIZE_FILTERS: diff --git a/src/data/reducers/tracks.js b/src/data/reducers/tracks.js index 63fc4da..399af8b 100644 --- a/src/data/reducers/tracks.js +++ b/src/data/reducers/tracks.js @@ -10,7 +10,6 @@ const initialState = { errorFetching: false, }; - const tracks = (state = initialState, action) => { switch (action.type) { case GOT_TRACKS: @@ -37,4 +36,3 @@ const tracks = (state = initialState, action) => { }; export default tracks; - diff --git a/src/data/selectors/cohorts.js b/src/data/selectors/cohorts.js index 8463aba..647c7d6 100644 --- a/src/data/selectors/cohorts.js +++ b/src/data/selectors/cohorts.js @@ -1,4 +1,3 @@ - const getCohorts = state => state.cohorts.results || []; const getCohortById = (state, selectedCohortId) => { @@ -6,7 +5,6 @@ const getCohortById = (state, selectedCohortId) => { return cohort; }; -const getCohortNameById = (state, selectedCohortId) => - (getCohortById(state, selectedCohortId) || {}).name; +const getCohortNameById = (state, selectedCohortId) => (getCohortById(state, selectedCohortId) || {}).name; export { getCohortById, getCohortNameById, getCohorts }; diff --git a/src/data/selectors/filters.js b/src/data/selectors/filters.js index 257cecf..df64030 100644 --- a/src/data/selectors/filters.js +++ b/src/data/selectors/filters.js @@ -1,7 +1,6 @@ const getFilters = state => state.filters || {}; -const getAssignmentsFromResultsSubstate = results => - (results[0] || {}).section_breakdown || []; +const getAssignmentsFromResultsSubstate = results => (results[0] || {}).section_breakdown || []; const selectableAssignments = (state) => { const selectedAssignmentType = getFilters(state).assignmentType; @@ -20,14 +19,12 @@ const chooseRelevantAssignmentData = assignment => ({ id: assignment.module_id, }); -const selectableAssignmentLabels = state => - selectableAssignments(state).map(chooseRelevantAssignmentData); +const selectableAssignmentLabels = state => selectableAssignments(state).map(chooseRelevantAssignmentData); const typeOfSelectedAssignment = (state) => { const selectedAssignmentLabel = getFilters(state).assignment; const sectionBreakdown = (state.grades.results[0] || {}).section_breakdown || []; - const selectedAssignment = sectionBreakdown.find(section => - section.label === selectedAssignmentLabel); + const selectedAssignment = sectionBreakdown.find(section => section.label === selectedAssignmentLabel); return selectedAssignment && selectedAssignment.category; }; diff --git a/src/data/selectors/grades.js b/src/data/selectors/grades.js index 431a846..c6ab62d 100644 --- a/src/data/selectors/grades.js +++ b/src/data/selectors/grades.js @@ -33,10 +33,8 @@ const transformHistoryEntry = (historyRow) => { ...rest, }; }; -const getBulkManagementHistoryFromState = state => - state.grades.bulkManagement.history || []; -const getBulkManagementHistory = state => - getBulkManagementHistoryFromState(state).map(transformHistoryEntry); +const getBulkManagementHistoryFromState = state => state.grades.bulkManagement.history || []; +const getBulkManagementHistory = state => getBulkManagementHistoryFromState(state).map(transformHistoryEntry); const headingMapper = (category, label = 'All') => { const filters = { @@ -82,13 +80,12 @@ const getHeadings = (state) => { return headingMapper(type, assignment)(assignments); }; -const composeFilters = (...predicates) => (percentGrade, options = {}) => - predicates.reduce((accum, predicate) => { - if (predicate(percentGrade, options)) { - return null; - } - return accum; - }, percentGrade); +const composeFilters = (...predicates) => (percentGrade, options = {}) => predicates.reduce((accum, predicate) => { + if (predicate(percentGrade, options)) { + return null; + } + return accum; +}, percentGrade); const percentGradeIsMax = percentGrade => ( percentGrade === '100' diff --git a/src/data/selectors/tracks.js b/src/data/selectors/tracks.js index d7e40b0..eed1b39 100644 --- a/src/data/selectors/tracks.js +++ b/src/data/selectors/tracks.js @@ -1,7 +1,6 @@ const compose = (...fns) => { const [firstFunc, ...rest] = fns.reverse(); - return (...args) => - rest.reduce((accum, fn) => fn(accum), firstFunc(...args)); + return (...args) => rest.reduce((accum, fn) => fn(accum), firstFunc(...args)); }; const getTracks = state => state.tracks.results || []; diff --git a/src/data/services/LmsApiService.js b/src/data/services/LmsApiService.js index 14d2643..fd7ac10 100644 --- a/src/data/services/LmsApiService.js +++ b/src/data/services/LmsApiService.js @@ -1,8 +1,9 @@ -import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth' +import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; import { configuration } from '../../config'; class LmsApiService { static baseUrl = configuration.LMS_BASE_URL; + static pageSize = 25 static fetchGradebookData(courseId, searchText, cohort, track, options = {}) { @@ -96,8 +97,8 @@ class LmsApiService { static getGradeExportCsvUrl(courseId, options = {}) { const queryParams = ['track', 'cohort', 'assignment', 'assignmentType', 'assignmentGradeMax', 'assignmentGradeMin', 'courseGradeMin', 'courseGradeMax'] - .filter(opt => options[opt] && - options[opt] !== 'All') + .filter(opt => options[opt] + && options[opt] !== 'All') .map(opt => `${opt}=${encodeURIComponent(options[opt])}`) .join('&'); return `${LmsApiService.baseUrl}/api/bulk_grades/course/${courseId}/?${queryParams}`; @@ -106,8 +107,8 @@ class LmsApiService { static getInterventionExportCsvUrl(courseId, options = {}) { const queryParams = ['track', 'cohort', 'assignment', 'assignmentType', 'assignmentGradeMax', 'assignmentGradeMin', 'courseGradeMin', 'courseGradeMax'] - .filter(opt => options[opt] && - options[opt] !== 'All') + .filter(opt => options[opt] + && options[opt] !== 'All') .map(opt => `${opt}=${encodeURIComponent(options[opt])}`) .join('&'); return `${LmsApiService.baseUrl}/api/bulk_grades/course/${courseId}/intervention?${queryParams}`; diff --git a/src/data/store.js b/src/data/store.js index 83c4bcf..6a72c48 100755 --- a/src/data/store.js +++ b/src/data/store.js @@ -90,7 +90,6 @@ const eventsMap = { const segmentMiddleware = createMiddleware(eventsMap, Segment()); - const store = createStore( reducers, composeWithDevTools(applyMiddleware(thunkMiddleware, loggerMiddleware, segmentMiddleware)), diff --git a/src/index.jsx b/src/index.jsx index d8b16cf..67f8a36 100755 --- a/src/index.jsx +++ b/src/index.jsx @@ -1,5 +1,3 @@ -console.log("index.jsx"); -import 'babel-polyfill'; import React from 'react'; import ReactDOM from 'react-dom'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; @@ -49,51 +47,47 @@ const socialLinks = [ }, ]; -const App = () => { - console.log("App"); - return ( - - - - { console.log("App Render") } -
-
-
- - - -
- -
-
-
-
- ); -} +const App = () => ( + + + +
+
+
+ + + +
+ +
+
+
+
+); subscribe(APP_READY, () => { ReactDOM.render(, document.getElementById('root')); -}) +}); initialize({ messages: [ @@ -101,5 +95,3 @@ initialize({ ], requireAuthenticatedUser: true, }); - -console.log("end of index.jsx");