From 527bb5a2e641b27125849835a7d90ae4de06a90a Mon Sep 17 00:00:00 2001 From: Matt Hughes Date: Tue, 25 Sep 2018 11:40:53 -0400 Subject: [PATCH] perf(assets): use paragon pagination & search Paragon's `Pagination` and `SearchField` components are now used for the Assets page and the parallel Add Image Modal. This involves some visual changes, and a difference in the number of pages ellided in the navigation bar. `perf` in the title here is used to force a new patch version, but `refactor` would likely be more descriptive. fixes EDUCATOR-3421 --- package-lock.json | 1151 ++++++----------- package.json | 3 +- src/components/AssetsList/AssetsList.scss | 1 - src/components/AssetsPage/AssetsPage.test.jsx | 2 +- src/components/AssetsSearch/AssetsSearch.scss | 14 +- .../AssetsSearch/AssetsSearch.test.jsx | 59 +- .../AssetsSearch/displayMessages.jsx | 5 + src/components/AssetsSearch/index.jsx | 55 +- .../EditImageModal/EditImageModal.test.jsx | 8 +- src/components/Pagination/Pagination.scss | 7 +- src/components/Pagination/Pagination.test.jsx | 115 +- src/components/Pagination/displayMessages.jsx | 16 + src/components/Pagination/index.jsx | 103 +- src/data/actions/assets.js | 9 - src/data/actions/assets.test.js | 1 - src/data/constants/actionTypes.js | 1 - src/data/i18n/default/transifex_input.json | 5 +- src/data/reducers/assets.js | 2 - src/data/reducers/assets.test.js | 12 - 19 files changed, 562 insertions(+), 1007 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29d47bed..31f2234f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "dependencies": { "chalk": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { @@ -57,7 +57,7 @@ }, "@commitlint/config-angular": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/config-angular/-/config-angular-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/config-angular/-/config-angular-6.1.3.tgz", "integrity": "sha1-aPRnhv08PveAjEztQuBXIerY9gQ=", "dev": true, "requires": { @@ -66,13 +66,13 @@ }, "@commitlint/config-angular-type-enum": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/config-angular-type-enum/-/config-angular-type-enum-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/config-angular-type-enum/-/config-angular-type-enum-6.1.3.tgz", "integrity": "sha1-8xDcHCTIvp7TIMJikajRjPoRpF8=", "dev": true }, "@commitlint/ensure": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/ensure/-/ensure-6.1.3.tgz", "integrity": "sha1-gTtYyf364VNRty/mRqFi69tx6io=", "dev": true, "requires": { @@ -85,7 +85,7 @@ }, "@commitlint/execute-rule": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-6.1.3.tgz", "integrity": "sha1-SJKOc27xXocQ0zKhXHyJlVXk4Qs=", "dev": true, "requires": { @@ -94,7 +94,7 @@ }, "@commitlint/format": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/format/-/format-6.1.3.tgz", "integrity": "sha1-QUuQSKmvVFh9qWIicXujMjR6veM=", "dev": true, "requires": { @@ -104,7 +104,7 @@ }, "@commitlint/is-ignored": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-6.1.3.tgz", "integrity": "sha1-icm5ZKTWIoh1pXnCv1UtADc0t+g=", "dev": true, "requires": { @@ -126,7 +126,7 @@ }, "@commitlint/load": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/load/-/load-6.1.3.tgz", "integrity": "sha1-G+QHETl5WPMWz0BXepyHmhbwClQ=", "dev": true, "requires": { @@ -143,13 +143,13 @@ }, "@commitlint/message": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/message/-/message-6.1.3.tgz", "integrity": "sha1-XgRzMwyIcBYBDExWJwcjuAARRdI=", "dev": true }, "@commitlint/parse": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/parse/-/parse-6.1.3.tgz", "integrity": "sha1-/x5NksJ81naBK7a512zYhTwNlAc=", "dev": true, "requires": { @@ -159,7 +159,7 @@ }, "@commitlint/read": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/read/-/read-6.1.3.tgz", "integrity": "sha1-n52NtQ+/Z/MACSFlftbvrbjPnxo=", "dev": true, "requires": { @@ -171,7 +171,7 @@ }, "@commitlint/resolve-extends": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-6.1.3.tgz", "integrity": "sha1-9F/P5Dhg4F4489lNVMrtfdqkHiU=", "dev": true, "requires": { @@ -197,13 +197,13 @@ }, "@commitlint/to-lines": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/to-lines/-/to-lines-6.1.3.tgz", "integrity": "sha1-erFqAsrtjapH6Vkmm5YWRhCinQw=", "dev": true }, "@commitlint/top-level": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-6.1.3.tgz", + "resolved": "http://registry.npmjs.org/@commitlint/top-level/-/top-level-6.1.3.tgz", "integrity": "sha1-Em3LbeFnY0LGnNQiYUg/RHhUcpk=", "dev": true, "requires": { @@ -232,21 +232,48 @@ } }, "@edx/paragon": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-3.1.2.tgz", - "integrity": "sha512-JeR00LQcf3t3pCRh+q4lSxuI4HiT74U4Y2ga3rAw3/97/orPaud2Hch1Ku9baVLp4bTrpgfcHwpf7bwPF42uQA==", + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-3.4.8.tgz", + "integrity": "sha512-Aba1/s7IEvHhyBvtILL3MIpghu4gJ04lvKXpuvl3AqdGluSVEp1u4dfCvsvBF4ZDP2CPUwkGXWolIA9yHxj7Nw==", "requires": { "@edx/edx-bootstrap": "1.0.0", + "airbnb-prop-types": "2.10.0", "babel-polyfill": "6.26.0", "classnames": "2.2.5", "email-prop-type": "1.1.7", "font-awesome": "4.7.0", "mailto-link": "1.0.0", "prop-types": "15.6.1", - "react": "16.3.2", + "react": "16.5.2", "react-dom": "16.3.2", "react-element-proptypes": "1.0.0", - "react-proptype-conditional-require": "1.0.4" + "react-proptype-conditional-require": "1.0.4", + "react-responsive": "5.0.0", + "sanitize-html": "1.19.0" + }, + "dependencies": { + "react": { + "version": "16.5.2", + "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", + "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", + "requires": { + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.2", + "schedule": "0.5.0" + }, + "dependencies": { + "prop-types": { + "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": { + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + } + } + } } }, "@marionebl/sander": { @@ -1131,8 +1158,7 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.2.1", @@ -1270,7 +1296,7 @@ }, "autoprefixer": { "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "resolved": "http://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", "dev": true, "requires": { @@ -1353,7 +1379,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -1684,67 +1710,67 @@ }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, "babel-plugin-syntax-async-generators": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", "dev": true }, "babel-plugin-syntax-class-constructor-call": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", "dev": true }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", "dev": true }, "babel-plugin-syntax-decorators": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", "dev": true }, "babel-plugin-syntax-dynamic-import": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", "dev": true }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, "babel-plugin-syntax-export-extensions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", "dev": true }, "babel-plugin-syntax-flow": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", "dev": true }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "dev": true }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, @@ -2743,7 +2769,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -3137,7 +3163,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -3833,8 +3859,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "4.0.0", @@ -3960,7 +3985,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -4014,6 +4039,11 @@ } } }, + "css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" + }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -4134,7 +4164,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -4537,6 +4567,13 @@ "repeating": "2.0.1" } }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", @@ -4663,7 +4700,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, "requires": { "domelementtype": "1.1.3", "entities": "1.1.1" @@ -4672,8 +4708,7 @@ "domelementtype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, @@ -4686,8 +4721,7 @@ "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domexception": { "version": "1.0.1", @@ -4702,7 +4736,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, "requires": { "domelementtype": "1.3.0" } @@ -4711,7 +4744,6 @@ "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" @@ -4885,8 +4917,7 @@ "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "env-ci": { "version": "2.1.0", @@ -5121,7 +5152,7 @@ }, "eslint": { "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { @@ -5691,7 +5722,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -6326,603 +6357,95 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.4" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" } }, "fstream": { @@ -7254,13 +6777,13 @@ "dependencies": { "minimist": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", "dev": true }, "yargs": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", "dev": true, "requires": { @@ -7523,7 +7046,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -7813,7 +7336,7 @@ }, "html-webpack-plugin": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { @@ -7844,7 +7367,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, "requires": { "domelementtype": "1.3.0", "domhandler": "2.4.2", @@ -7918,7 +7440,7 @@ }, "http-proxy-middleware": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", "dev": true, "requires": { @@ -8276,6 +7798,11 @@ } } }, + "hyphenate-style-name": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", + "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" + }, "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -8332,6 +7859,16 @@ "integrity": "sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=", "dev": true }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, "import-from": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", @@ -9823,7 +9360,7 @@ }, "chalk": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { @@ -10369,7 +9906,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -10427,7 +9964,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -10551,8 +10088,12 @@ "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" }, "lodash.flattendeep": { "version": "4.4.0", @@ -10563,8 +10104,12 @@ "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, "lodash.kebabcase": { "version": "4.1.1", @@ -10587,8 +10132,7 @@ "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" }, "lodash.omit": { "version": "4.5.0", @@ -10891,6 +10435,14 @@ } } }, + "matchmediaquery": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.0.tgz", + "integrity": "sha512-u0dlv+VENJ+3YepvwSPBieuvnA6DWfaYa/ctwysAR13y4XLJNyt7bEVKzNj/Nvjo+50d88Pj+xL9xaSo6JmX/w==", + "requires": { + "css-mediaquery": "0.1.2" + } + }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", @@ -11060,7 +10612,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -11211,7 +10763,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minimist-options": { @@ -11224,6 +10776,34 @@ "is-plain-obj": "1.1.0" } }, + "minipass": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", + "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "dev": true + } + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.4" + } + }, "mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", @@ -11283,7 +10863,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -11413,6 +10993,18 @@ "semver": "5.5.0" } }, + "needle": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.2.tgz", + "integrity": "sha512-mW7W8dKuVYefCpNzE3Z7xUmPI9wSrSL/1qH31YGMxmSOAnjatS3S9Zv3cmiHrhx3Jkp1SrWWBdOFXjfF48Uq3A==", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.23", + "sax": "1.2.4" + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -11560,6 +11152,61 @@ "which": "1.3.0" } }, + "node-pre-gyp": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", + "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.2", + "nopt": "4.0.1", + "npm-packlist": "1.1.11", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.6" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "tar": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", + "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.2" + } + }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "dev": true, + "optional": true + } + } + }, "node-sass": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", @@ -11611,7 +11258,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -11696,7 +11343,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -11916,6 +11563,24 @@ } } }, + "npm-bundled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", + "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.5" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -11961,8 +11626,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwmatcher": { "version": "1.4.4", @@ -12713,7 +12377,6 @@ "version": "6.0.22", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", - "dev": true, "requires": { "chalk": "2.4.1", "source-map": "0.6.1", @@ -12739,7 +12402,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -12812,7 +12475,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -12884,7 +12547,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -12955,7 +12618,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13026,7 +12689,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13097,7 +12760,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13168,7 +12831,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13240,7 +12903,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13312,7 +12975,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13553,7 +13216,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13624,7 +13287,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13709,7 +13372,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13788,7 +13451,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13860,7 +13523,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -13934,7 +13597,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14008,7 +13671,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14118,7 +13781,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14192,7 +13855,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14264,7 +13927,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14335,7 +13998,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14417,7 +14080,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14488,7 +14151,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14561,7 +14224,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14655,7 +14318,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14728,7 +14391,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14807,7 +14470,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14934,8 +14597,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "2.0.0", @@ -15248,7 +14910,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -15299,7 +14961,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -15377,14 +15039,6 @@ "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==", "dev": true }, - "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" - } - }, "react-proptype-conditional-require": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz", @@ -15415,6 +15069,16 @@ "prop-types": "15.6.1" } }, + "react-responsive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-5.0.0.tgz", + "integrity": "sha512-oEimZ0FTCC3/pjGDEBHOz06nWbBNDIbMGOdRYp6K9SBUmrqgNAX77hTiqvmRQeLyI97zz4F4kiaFRxFspDxE+w==", + "requires": { + "hyphenate-style-name": "1.0.2", + "matchmediaquery": "0.3.0", + "prop-types": "15.6.1" + } + }, "react-test-renderer": { "version": "16.3.2", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.3.2.tgz", @@ -15478,7 +15142,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -15492,8 +15155,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, @@ -15858,7 +15520,7 @@ }, "request": { "version": "2.77.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.77.0.tgz", + "resolved": "http://registry.npmjs.org/request/-/request-2.77.0.tgz", "integrity": "sha1-KwDYIDDt7cyXCJ/6XYgQqcKqMUs=", "dev": true, "requires": { @@ -16137,8 +15799,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -16457,12 +16118,29 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, + "sanitize-html": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.19.0.tgz", + "integrity": "sha512-Qt2imq49f2qP4537a7R2Xgx9sjTvw18jIT7zKurhu5kpYNQfMo8EZaW3OcpoXCvg3GTN4C4R3mN8ao7STUtKtA==", + "requires": { + "chalk": "2.4.1", + "htmlparser2": "3.9.2", + "lodash.clonedeep": "4.5.0", + "lodash.escaperegexp": "4.1.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mergewith": "4.6.1", + "postcss": "6.0.22", + "srcset": "1.0.0", + "xtend": "4.0.1" + } + }, "sass-graph": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", @@ -16526,7 +16204,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -16666,6 +16344,14 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "schedule": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", + "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", + "requires": { + "object-assign": "4.1.1" + } + }, "schema-utils": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", @@ -17278,8 +16964,7 @@ "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 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { "version": "0.5.2", @@ -17417,6 +17102,15 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "srcset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", + "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", + "requires": { + "array-uniq": "1.0.3", + "number-is-nan": "1.0.1" + } + }, "sshpk": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", @@ -17625,7 +17319,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "5.1.2" } @@ -17795,7 +17488,7 @@ "dependencies": { "rimraf": { "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", "dev": true } @@ -18804,8 +18497,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", @@ -18966,7 +18658,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -19712,7 +19404,7 @@ }, "chalk": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { @@ -19888,7 +19580,7 @@ }, "yargs": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { @@ -20590,7 +20282,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -20664,8 +20356,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", @@ -20910,7 +20601,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } diff --git a/package.json b/package.json index c37d8287..5237a051 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "license": "AGPL-3.0", "dependencies": { "@edx/edx-bootstrap": "^1.0.0", - "@edx/paragon": "3.1.2", + "@edx/paragon": "3.4.8", "airbnb-prop-types": "^2.10.0", "babel-polyfill": "^6.26.0", "classnames": "^2.2.5", @@ -30,7 +30,6 @@ "react-dropzone": "^4.2.3", "react-intl": "^2.4.0", "react-intl-translations-manager": "^5.0.1", - "react-paginate": "^5.0.0", "react-redux": "^5.0.6", "react-transition-group": "^2.2.1", "redux": "^3.7.2", diff --git a/src/components/AssetsList/AssetsList.scss b/src/components/AssetsList/AssetsList.scss index 0b5c6d37..fb88ab6f 100644 --- a/src/components/AssetsList/AssetsList.scss +++ b/src/components/AssetsList/AssetsList.scss @@ -18,7 +18,6 @@ li span { word-wrap: break-word; - width: 100%; } // from Bootstrap list-group-item class diff --git a/src/components/AssetsPage/AssetsPage.test.jsx b/src/components/AssetsPage/AssetsPage.test.jsx index 94baef65..38c7e799 100644 --- a/src/components/AssetsPage/AssetsPage.test.jsx +++ b/src/components/AssetsPage/AssetsPage.test.jsx @@ -44,7 +44,7 @@ const renderAssetsTableTest = () => { }; const renderPaginationTest = () => { - expect(wrapper.find('Connect(Pagination)')).toHaveLength(1); + expect(wrapper.find('Connect(InjectIntl(Pagination))')).toHaveLength(1); }; const rendersAssetsResultsCountTest = () => { diff --git a/src/components/AssetsSearch/AssetsSearch.scss b/src/components/AssetsSearch/AssetsSearch.scss index 743517cf..8a9488b9 100644 --- a/src/components/AssetsSearch/AssetsSearch.scss +++ b/src/components/AssetsSearch/AssetsSearch.scss @@ -1,15 +1,9 @@ @import 'edx-bootstrap'; +@import "~@edx/paragon/src/SearchField/SearchField"; -.form-inline { - margin-bottom: 0; -} -.form-inline label { - margin-right: 1.0rem; - font-weight: 600; -} -.form-inline button { - margin-left: 1.0rem; - padding: 0.625rem 0.9rem; +// Overriding SFE _var-reset rules which interfere with paragon search field functionality +.search-field .form-group.form-inline { + background-color: transparent } diff --git a/src/components/AssetsSearch/AssetsSearch.test.jsx b/src/components/AssetsSearch/AssetsSearch.test.jsx index faf11ebb..7075dabd 100644 --- a/src/components/AssetsSearch/AssetsSearch.test.jsx +++ b/src/components/AssetsSearch/AssetsSearch.test.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import { SearchField } from '@edx/paragon'; import AssetsSearch from './index'; import { searchInitial } from './../../data/reducers/assets'; @@ -10,58 +11,54 @@ const defaultProps = { courseDetails: {}, }; -let wrapper; describe('', () => { describe('renders', () => { + let wrapper; + let searchField; beforeEach(() => { wrapper = mountWithIntl( , ); + searchField = wrapper.find(SearchField); }); - it('has label, input, and button in a form element', () => { - const searchForm = wrapper.find('form'); - - expect(searchForm).toHaveLength(1); - expect(searchForm.find('label')).toHaveLength(1); - expect(searchForm.find('input[type="search"]')).toHaveLength(1); - expect(searchForm.find('button[type="submit"]')).toHaveLength(1); - }); - it('has correct styling', () => { - const button = wrapper.find('form').find('button[type="submit"]'); - expect(wrapper.find('form').hasClass('form-group')).toEqual(true); - expect(wrapper.find('form').hasClass('form-inline')).toEqual(true); - expect(button.find('span.fa')).toHaveLength(1); - expect(button.find('span.fa').hasClass('fa-search')).toEqual(true); + it('has a paragon SearchField', () => { + expect(searchField).toHaveLength(1); }); it('handles onChange callback correctly', () => { - const searchInput = wrapper.find('form input[type="search"]'); - - searchInput.simulate('change', { target: { value: 'edX' } }); + searchField.prop('onChange')('edX'); expect(wrapper.state('value')).toEqual('edX'); }); - it('calls updateSearch when submit button is clicked', () => { - const searchSpy = jest.fn(); + describe('how updateSearch is called', () => { + let searchSpy; - wrapper.setProps({ - updateSearch: searchSpy, - }); + beforeEach(() => { + searchSpy = jest.fn(); - const submitButton = wrapper.find('form button[type="submit"]'); - const searchInput = wrapper.find('form input[type="search"]'); - searchInput.simulate('change', { target: { value: 'edX' } }); - submitButton.simulate('submit'); + wrapper.setProps({ + updateSearch: searchSpy, + }); + searchField.prop('onChange')('edX'); + searchField.prop('onSubmit')(); + }); - expect(searchSpy).toHaveBeenCalledTimes(1); - expect(searchSpy).toHaveBeenCalledWith('edX', defaultProps.courseDetails); + it('calls updateSearch when submit button is clicked', () => { + expect(searchSpy).toHaveBeenCalledTimes(1); + expect(searchSpy).toHaveBeenCalledWith('edX', defaultProps.courseDetails); + }); + it('calls updateSearch when clear button is clicked', () => { + searchField.prop('onClear')(); + expect(searchSpy).toHaveBeenCalledTimes(2); + expect(searchSpy).toHaveBeenLastCalledWith('', defaultProps.courseDetails); + }); }); it('updates search input text when search redux state is updated', () => { - const searchInput = wrapper.find('form input[type="search"]'); wrapper.setProps({ assetsSearch: { search: 'foobar' } }, () => { + searchField = wrapper.find(SearchField); expect(wrapper.state('value')).toEqual('foobar'); - expect(searchInput.instance().value).toEqual('foobar'); + expect(searchField.prop('value')).toEqual('foobar'); }); }); }); diff --git a/src/components/AssetsSearch/displayMessages.jsx b/src/components/AssetsSearch/displayMessages.jsx index a654fa5f..e4dc058b 100644 --- a/src/components/AssetsSearch/displayMessages.jsx +++ b/src/components/AssetsSearch/displayMessages.jsx @@ -11,6 +11,11 @@ const messages = defineMessages({ defaultMessage: 'Submit search', description: 'Label for search submit button that has a magnifying glass icon', }, + assetsClearSearchButtonLabel: { + id: 'assetsClearSearchButtonLabel', + defaultMessage: 'Clear search', + description: 'Label for a button that clears the search applied to a table.', + }, }); export default messages; diff --git a/src/components/AssetsSearch/index.jsx b/src/components/AssetsSearch/index.jsx index dc8e69b5..bda2139d 100644 --- a/src/components/AssetsSearch/index.jsx +++ b/src/components/AssetsSearch/index.jsx @@ -1,8 +1,6 @@ import React from 'react'; -import classNames from 'classnames'; import PropTypes from 'prop-types'; -import { Button, Icon, InputText } from '@edx/paragon'; -import FontAwesomeStyles from 'font-awesome/css/font-awesome.min.css'; +import { SearchField } from '@edx/paragon'; import WrappedMessage from '../../utils/i18n/formattedMessageWrapper'; import messages from './displayMessages'; @@ -14,7 +12,6 @@ export default class AssetsSearch extends React.Component { this.state = { value: props.assetsSearch.search }; this.handleChange = this.handleChange.bind(this); - this.submit = this.submit.bind(this); } componentWillReceiveProps(nextProps) { @@ -23,49 +20,35 @@ export default class AssetsSearch extends React.Component { } } - submit(event) { + submit = () => { this.props.updateSearch(this.state.value, this.props.courseDetails); - event.preventDefault(); // prevent the page from navigating to the form action URL } handleChange(value) { this.setState({ value }); } + handleClear = () => { + // relying on `submit` introduces as state update race + // condition + this.props.updateSearch('', this.props.courseDetails); + } + render() { - // TODO: InputText creates its own form-group div. Nesting them is not semantic. - // Once Paragon's asInput is refactored, use only one form-group element. return ( -
- } - value={this.state.value} +
+ { - txt => ( - - ) - } - } - /> - )} + onClear={this.handleClear} + inputLabel={} + screenReaderText={{ + clearButton: , + searchButton: , + }} + value={this.state.value} /> - +
); } } diff --git a/src/components/EditImageModal/EditImageModal.test.jsx b/src/components/EditImageModal/EditImageModal.test.jsx index b9ff54a2..d79170c1 100644 --- a/src/components/EditImageModal/EditImageModal.test.jsx +++ b/src/components/EditImageModal/EditImageModal.test.jsx @@ -198,7 +198,7 @@ describe('EditImageModal', () => { it('no Pagination component', () => { - expect(getModalBody(editImageModal).find('Connect(Pagination)')).toHaveLength(0); + expect(getModalBody(editImageModal).find('Pagination')).toHaveLength(0); }); }); @@ -244,7 +244,7 @@ describe('EditImageModal', () => { }); it('a Pagination component', () => { - expect(getModalBody(editImageModal).find('Connect(Pagination)')).toHaveLength(1); + expect(getModalBody(editImageModal).find('Connect(InjectIntl(Pagination))')).toHaveLength(1); }); }); @@ -294,7 +294,7 @@ describe('EditImageModal', () => { }); it('no Pagination component', () => { - expect(getModalBody(editImageModal).find('Connect(Pagination)')).toHaveLength(0); + expect(getModalBody(editImageModal).find('Pagination')).toHaveLength(0); }); }); @@ -345,7 +345,7 @@ describe('EditImageModal', () => { }); it('no Pagination component', () => { - expect(getModalBody(editImageModal).find('Connect(Pagination)')).toHaveLength(0); + expect(getModalBody(editImageModal).find('Pagination')).toHaveLength(0); }); }); }); diff --git a/src/components/Pagination/Pagination.scss b/src/components/Pagination/Pagination.scss index 8cd64bd7..66eca138 100644 --- a/src/components/Pagination/Pagination.scss +++ b/src/components/Pagination/Pagination.scss @@ -1,4 +1,7 @@ +$pagination-disabled-bg: transparent; + @import 'edx-bootstrap'; +@import '~@edx/paragon/src/Pagination/Pagination'; .pagination { justify-content: center; @@ -11,7 +14,6 @@ } .page-item { - min-width: 50px; text-align: center; } @@ -29,3 +31,6 @@ @extend .disabled; } } +.page-item.disabled .page-link { + background-color: $pagination-disabled-bg; +} diff --git a/src/components/Pagination/Pagination.test.jsx b/src/components/Pagination/Pagination.test.jsx index c5d4400e..881266f2 100644 --- a/src/components/Pagination/Pagination.test.jsx +++ b/src/components/Pagination/Pagination.test.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import { Pagination as ParagonPagination } from '@edx/paragon'; import { courseDetails } from '../../utils/testConstants'; import { mountWithIntl } from '../../utils/i18n/enzymeHelper'; @@ -20,8 +21,7 @@ const totalPages = Math.ceil( describe('', () => { let wrapper; - let pageItems; - let pageLinks; + let paragonPagination; beforeEach(() => { wrapper = mountWithIntl( @@ -29,33 +29,22 @@ describe('', () => { {...defaultProps} />, ); - - pageItems = wrapper.find('.page-item'); - pageLinks = wrapper.find('.page-item .page-link'); + paragonPagination = wrapper.find(ParagonPagination); }); - it('renders correct number of pages', () => { - expect(parseInt(pageItems.last().text(), 10)).toEqual(totalPages); - expect(parseInt(pageLinks.last().text(), 10)).toEqual(totalPages); + it('renders exactly one paragon Pagination component', () => { + expect(paragonPagination.length).toEqual(1); }); - it('page click calls updatePage', () => { - const updatePageSpy = jest.fn(); - - wrapper.setProps({ updatePage: updatePageSpy }); - - pageLinks.last().simulate('click'); - - expect(updatePageSpy).toHaveBeenCalledTimes(1); - // API treats pages as 0-indexed, but we treat them as 1-indexed - expect(updatePageSpy).toHaveBeenCalledWith(totalPages - 1, defaultProps.courseDetails); + it('provides the correct number of pages to the paragon pagination component', () => { + expect(paragonPagination.last().prop('pageCount')).toEqual(totalPages); }); - it('changes the current page when assets list state updates', () => { - let currentPage = wrapper.props().assetsListMetadata.page; - let currentPageLink = pageItems.at(0).find('a'); + it('translates zero-indexed page numbers to one-indexed page numbers for paragon\'s ingestion', () => { + const currentPage = wrapper.props().assetsListMetadata.page; expect(currentPage).toEqual(0); - expect(currentPageLink.prop('aria-label')).toContain('current page'); - + expect(paragonPagination.prop('currentPage')).toEqual(currentPage + 1); + }); + it('changes the current page when assets list state updates', () => { wrapper.setProps({ assetsListMetadata: { page: 1, @@ -63,79 +52,19 @@ describe('', () => { totalCount: 5000, }, }); - - pageItems = wrapper.find('.page-item'); - currentPage = wrapper.props().assetsListMetadata.page; - currentPageLink = pageItems.at(1).find('a'); + const currentPage = wrapper.props().assetsListMetadata.page; + paragonPagination = wrapper.find(ParagonPagination); expect(currentPage).toEqual(1); - expect(currentPageLink.prop('aria-label')).toContain('current page'); + expect(paragonPagination.prop('currentPage')).toEqual(currentPage + 1); }); - describe('break link', () => { - let breakLink; - - beforeEach(() => { - breakLink = wrapper.find('.disabled.page-link'); - }); - - it('has disabled break link', () => { - expect(breakLink).toHaveLength(1); - expect(breakLink.text()).toEqual('...button is disabled'); - }); - it('has sr-only text on disabled break link', () => { - const breakScreenReader = breakLink.find('.sr-only'); - expect(breakScreenReader).toHaveLength(1); - expect(breakScreenReader.text()).toEqual('button is disabled'); - }); - }); - describe('previous link', () => { - let previousLink; - - beforeEach(() => { - wrapper.setProps({ - ...defaultProps, - assetsListMetadata: { - ...defaultProps.assetsListMetadata, - page: 0, - }, - }); - - previousLink = wrapper.find('.disabled > .page-link'); - }); - it('is disabled when page is first page', () => { - expect(previousLink).toHaveLength(1); - expect(previousLink.text()).toEqual('previousbutton is disabled'); - }); - it('has sr-only text', () => { - const breakScreenReader = previousLink.find('.sr-only'); - expect(breakScreenReader).toHaveLength(1); - expect(breakScreenReader.text()).toEqual('button is disabled'); - }); - }); - describe('next link has sr-only text when disabled', () => { - let nextLink; - - beforeEach(() => { - wrapper.setProps({ - ...defaultProps, - assetsListMetadata: { - ...defaultProps.assetsListMetadata, - page: totalPages - 1, - }, - }); - - pageLinks.last().simulate('click'); - - nextLink = wrapper.find('.disabled > .page-link'); - }); - it('is disabled when page is last page', () => { - expect(nextLink).toHaveLength(1); - expect(nextLink.text()).toEqual('nextbutton is disabled'); - }); - it('has sr-only text when disabled', () => { - const breakScreenReader = nextLink.find('.sr-only'); - expect(breakScreenReader).toHaveLength(1); - expect(breakScreenReader.text()).toEqual('button is disabled'); + it('calls provided updatePage function when paragon\'s pagination changes page number', () => { + const updatePageSpy = jest.fn(); + wrapper.setProps({ + updatePage: updatePageSpy, }); + paragonPagination.prop('onPageSelect')(7); + expect(updatePageSpy).toHaveBeenCalledTimes(1); + expect(updatePageSpy).toHaveBeenCalledWith(6, defaultProps.courseDetails); }); }); diff --git a/src/components/Pagination/displayMessages.jsx b/src/components/Pagination/displayMessages.jsx index 41333022..cd8594de 100644 --- a/src/components/Pagination/displayMessages.jsx +++ b/src/components/Pagination/displayMessages.jsx @@ -21,6 +21,22 @@ const messages = defineMessages({ defaultMessage: 'previous', description: 'Label for previous button', }, + paginationPage: { + id: 'paginationPage', + defaultMessage: 'page', + description: 'Label for a page in a page navigation element', + }, + paginationCurrentPage: { + id: 'paginationCurrentPage', + defaultMessage: 'current page', + description: 'Label for the current page in a page navigation element', + }, + paginationOf: { + id: 'paginationOf', + defaultMessage: 'of', + description: 'word used to show the number of pages out of which a page is selected; for example, "page 5 of 10" current page in a page navigation element', + }, + }); export default messages; diff --git a/src/components/Pagination/index.jsx b/src/components/Pagination/index.jsx index abc70e5e..7f9acbd3 100644 --- a/src/components/Pagination/index.jsx +++ b/src/components/Pagination/index.jsx @@ -1,90 +1,46 @@ import React from 'react'; import PropTypes from 'prop-types'; -import ReactPaginate from 'react-paginate'; +import { Pagination as ParagonPagination } from '@edx/paragon'; +import { intlShape, injectIntl } from 'react-intl'; -import classNames from 'classnames'; -import paginationStyles from './Pagination.scss'; -import edxBootstrap from '../../SFE.scss'; +import './Pagination.scss'; import messages from './displayMessages'; import WrappedMessage from '../../utils/i18n/formattedMessageWrapper'; -export default class Pagination extends React.Component { - constructor(props) { - super(props); - this.onPageClick = this.onPageClick.bind(this); - } - - onPageClick(pageData) { - this.props.updatePage(pageData.selected, this.props.courseDetails); - } - - getDisabledScreenReaderText() { - return ( - - { displayText => {displayText} } - - ); - } - - getPreviousLabel(totalPages) { - return ( - - - {(this.props.assetsListMetadata.page === 0 && totalPages >= 0) && - this.getDisabledScreenReaderText()} - - ); - } - - getNextLabel(totalPages) { - return ( - - - {(this.props.assetsListMetadata.page === totalPages - 1 && - totalPages > 0) && this.getDisabledScreenReaderText()} - - ); - } - - getBreakLabel() { - return ( - - ... - {this.getDisabledScreenReaderText()} - - ); +/** + * Pagination component specific to the Studio Asset page + * + * Translates between zero-indexed Asset page metadata and Paragon's + * Pagination component's one-indexed page numbers + * + * @extends React.Component + */ +class Pagination extends React.Component { + onPageClick = (oneIndexedPageNumber) => { + this.props.updatePage(oneIndexedPageNumber - 1, this.props.courseDetails); } render() { - const { page, pageSize, totalCount } = this.props.assetsListMetadata; + const { page: zeroIndexedPageNumber, pageSize, totalCount } = this.props.assetsListMetadata; const totalPages = Math.ceil(totalCount / pageSize); return ( { paginationLabel => ( - + ) } @@ -112,4 +68,7 @@ Pagination.propTypes = { base_url: PropTypes.string, }).isRequired, updatePage: PropTypes.func.isRequired, + intl: intlShape.isRequired, }; + +export default injectIntl(Pagination); diff --git a/src/data/actions/assets.js b/src/data/actions/assets.js index c7b53fad..a48df5ad 100644 --- a/src/data/actions/assets.js +++ b/src/data/actions/assets.js @@ -174,10 +174,6 @@ export const pageUpdateFailure = previousPageState => ({ previousState: { ...previousPageState }, }); -export const resetPageState = () => ({ - type: assetActions.paginate.RESET_PAGE, -}); - export const pageUpdate = (page, courseDetails) => (dispatch, getState) => { const currentPageState = getState().metadata.pagination; @@ -188,11 +184,6 @@ export const pageUpdate = (page, courseDetails) => return dispatch(getAssets(parameters, courseDetails)).then((responseAction) => { if (requestFailed(responseAction)) { - // react-paginate does not force the page state via the forcePage prop when - // the previous and next props for forcePage are the same; therefore, we - // have to reset the page state after a failed click in order to be able - // to reset the page - dispatch(resetPageState()); dispatch(pageUpdateFailure(currentPageState)); } }); diff --git a/src/data/actions/assets.test.js b/src/data/actions/assets.test.js index 611c9747..86f7dcc8 100644 --- a/src/data/actions/assets.test.js +++ b/src/data/actions/assets.test.js @@ -505,7 +505,6 @@ describe('Assets Action Creators', () => { { type: assetActions.request.REQUEST_ASSETS_FAILURE, previousState: initialState.assets, response: errorResponse }, - { type: assetActions.paginate.RESET_PAGE }, { type: assetActions.paginate.PAGE_UPDATE_FAILURE, previousState: { ...initialState.metadata.pagination } }, ]; diff --git a/src/data/constants/actionTypes.js b/src/data/constants/actionTypes.js index e0e00239..04aafdff 100644 --- a/src/data/constants/actionTypes.js +++ b/src/data/constants/actionTypes.js @@ -25,7 +25,6 @@ export const assetActions = { paginate: { PAGE_UPDATE: 'PAGE_UPDATE', PAGE_UPDATE_FAILURE: 'PAGE_UPDATE_FAILURE', - RESET_PAGE: 'RESET_PAGE', }, request: { REQUEST_ASSETS_SUCCESS: 'REQUEST_ASSETS_SUCCESS', diff --git a/src/data/i18n/default/transifex_input.json b/src/data/i18n/default/transifex_input.json index 6a24bee4..c8993c09 100644 --- a/src/data/i18n/default/transifex_input.json +++ b/src/data/i18n/default/transifex_input.json @@ -163,5 +163,8 @@ "paginationAriaLabel": "Content pagination", "paginationButtonDisabled": "button is disabled", "paginationNext": "next", - "paginationPrevious": "previous" + "paginationPrevious": "previous", + "paginationPage": "page", + "paginationCurrentPage": "current page", + "paginationOf": "of" } \ No newline at end of file diff --git a/src/data/reducers/assets.js b/src/data/reducers/assets.js index 8267d150..5c826c12 100644 --- a/src/data/reducers/assets.js +++ b/src/data/reducers/assets.js @@ -101,8 +101,6 @@ export const pagination = (state = paginationInitial, action) => { }; case assetActions.paginate.PAGE_UPDATE_FAILURE: return { ...state, ...action.previousState }; - case assetActions.paginate.RESET_PAGE: - return { ...state, page: -1 }; default: return state; } diff --git a/src/data/reducers/assets.test.js b/src/data/reducers/assets.test.js index fc46d942..480c4fad 100644 --- a/src/data/reducers/assets.test.js +++ b/src/data/reducers/assets.test.js @@ -266,18 +266,6 @@ describe('Assets Reducers', () => { ...action.previousState, }); }); - it('returns correct pagination state on RESET_PAGE action', () => { - action = { - type: assetActions.paginate.RESET_PAGE, - }; - - state = reducers.pagination(defaultState, action); - - expect(state).toEqual({ - ...defaultState, - page: -1, - }); - }); }); describe('sort reducer', () => { it('returns correct sort and direction state on REQUEST_ASSETS_SUCCESS action', () => {