From bbea46771dafee9dee3d6b675daeefbe71ad346e Mon Sep 17 00:00:00 2001 From: Valentijn Nieman Date: Wed, 12 Sep 2018 12:21:24 -0400 Subject: [PATCH 01/35] Removed old build steps and replaced with new ones --- package.json | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f4477161b..40b20ef56 100644 --- a/package.json +++ b/package.json @@ -8,16 +8,13 @@ }, "main": "src/index.js", "scripts": { - "build-dev": "builder run clean-lib && builder run extract-metadata && builder run generate-python-classes && webpack -w --config=./config/webpack/webpack.config.dev.js", - "build-dist": "builder run clean-lib && builder run extract-metadata && builder run generate-python-classes && cross-env NODE_ENV=production webpack --config=./config/webpack/webpack.config.dist.js", - "copy-lib": "cp -f lib/* dash_core_components", "generate-python-classes": "python -c \"import dash; dash.development.component_loader.generate_classes('dash_core_components', 'dash_core_components/metadata.json');\"", "install-local": "npm run copy-lib && python setup.py install", - "prepublish": "npm test && builder run build-dist && npm run copy-lib", + "prepublish": "npm test && npm run build:js && npm run build:py", "publish-all": "npm publish && python setup.py sdist upload", "publish-pypi": "npm run prepublish && python setup.py sdist && twine upload --sign --skip-existing", "start": "./node_modules/.bin/builder run build-dev", - "test": "eslint src", + "lint": "eslint src", "test-watch": "./node_modules/.bin/builder run test-frontend-watch", "test-debug": "./node_modules/.bin/builder run test-frontend-debug", "uninstall-local": "pip uninstall dash-core-components -y", From be3f77cf3d86a02c00a0661e88d3b8c3bc61fbb1 Mon Sep 17 00:00:00 2001 From: Valentijn Nieman Date: Wed, 12 Sep 2018 12:22:30 -0400 Subject: [PATCH 02/35] Renamed test command to lint, added real test command, added format command --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 40b20ef56..e7f5a8fb2 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,12 @@ "scripts": { "generate-python-classes": "python -c \"import dash; dash.development.component_loader.generate_classes('dash_core_components', 'dash_core_components/metadata.json');\"", "install-local": "npm run copy-lib && python setup.py install", - "prepublish": "npm test && npm run build:js && npm run build:py", + "prepublish": "npm run lint && npm run build:js && npm run build:py", "publish-all": "npm publish && python setup.py sdist upload", "publish-pypi": "npm run prepublish && python setup.py sdist && twine upload --sign --skip-existing", "start": "./node_modules/.bin/builder run build-dev", "lint": "eslint src", + "format": "prettier --config .prettierrc --write src/**/*.js", "test-watch": "./node_modules/.bin/builder run test-frontend-watch", "test-debug": "./node_modules/.bin/builder run test-frontend-debug", "uninstall-local": "pip uninstall dash-core-components -y", From 18cd646afe1c1c7a91b5ccf6bbb225b5d48be563 Mon Sep 17 00:00:00 2001 From: Valentijn Nieman Date: Wed, 12 Sep 2018 12:29:40 -0400 Subject: [PATCH 03/35] Added github pre-push hook via Husky --- package.json | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index e7f5a8fb2..0e7a71b17 100644 --- a/package.json +++ b/package.json @@ -10,18 +10,22 @@ "scripts": { "generate-python-classes": "python -c \"import dash; dash.development.component_loader.generate_classes('dash_core_components', 'dash_core_components/metadata.json');\"", "install-local": "npm run copy-lib && python setup.py install", - "prepublish": "npm run lint && npm run build:js && npm run build:py", + "prepublish": "npm run format && npm run lint && npm run build:js && npm run build:py", "publish-all": "npm publish && python setup.py sdist upload", "publish-pypi": "npm run prepublish && python setup.py sdist && twine upload --sign --skip-existing", "start": "./node_modules/.bin/builder run build-dev", "lint": "eslint src", + "test": "DASH_TEST_PROCESSES=1 python -m unittest -v test.test_integration.Tests", "format": "prettier --config .prettierrc --write src/**/*.js", - "test-watch": "./node_modules/.bin/builder run test-frontend-watch", - "test-debug": "./node_modules/.bin/builder run test-frontend-debug", "uninstall-local": "pip uninstall dash-core-components -y", "build:js": "webpack --mode production", "build:py": "node ./extract-meta src/components > dash_core_components/metadata.json && cp package.json dash_core_components && npm run generate-python-classes" }, + "husky": { + "hooks": { + "pre-push": "npm run format && npm run lint && npm test" + } + }, "author": "Chris Parmer ", "license": "MIT", "dependencies": { @@ -63,7 +67,8 @@ "devDependencies": { "component-playground": "^2.0.0", "dash-components-archetype-dev": "^0.3.0-rc1", - "enzyme": "^2.4.1" + "enzyme": "^2.4.1", + "husky": "^1.0.0-rc.14" }, "peerDependencies": { "react": "^15.4.0 || ^16.0.0", From 3f29c40a2e4d5efcde98d3d4725b1ee326fad566 Mon Sep 17 00:00:00 2001 From: Valentijn Nieman Date: Wed, 12 Sep 2018 12:48:31 -0400 Subject: [PATCH 04/35] Updated circleci test to lint command --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 771ebb493..34b64a8c0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -42,8 +42,8 @@ jobs: npm run build:py - run: - name: npm test - command: npm test + name: npm lint + command: npm lint - run: name: Run tests From e4e5401935d06c7ef003944437abc58db96e711d Mon Sep 17 00:00:00 2001 From: Valentijn Nieman Date: Wed, 12 Sep 2018 12:49:51 -0400 Subject: [PATCH 05/35] Formatted all source code and rebuild --- dash_core_components/DatePickerRange.py | 4 +- dash_core_components/metadata.json | 16 +- dash_core_components/package.json | 19 +- package-lock.json | 325 +++++++++++++----- src/components/Checklist.react.js | 21 +- src/components/ConfirmDialog.react.js | 55 ++- src/components/ConfirmDialogProvider.react.js | 43 ++- src/components/DatePickerRange.react.js | 59 ++-- src/components/DatePickerSingle.react.js | 71 ++-- src/components/Dropdown.react.js | 55 +-- src/components/Graph.react.js | 150 ++++---- src/components/Input.react.js | 32 +- src/components/Interval.react.js | 11 +- src/components/Link.react.js | 17 +- src/components/Location.react.js | 49 +-- src/components/Markdown.react.js | 17 +- src/components/RadioItems.react.js | 22 +- src/components/RangeSlider.react.js | 31 +- src/components/Slider.react.js | 32 +- src/components/SyntaxHighlighter.react.js | 18 +- src/components/Tab.react.js | 6 +- src/components/Textarea.react.js | 27 +- src/components/Upload.react.js | 51 ++- 23 files changed, 660 insertions(+), 471 deletions(-) diff --git a/dash_core_components/DatePickerRange.py b/dash_core_components/DatePickerRange.py index 5bfd9265a..89f35e2d4 100644 --- a/dash_core_components/DatePickerRange.py +++ b/dash_core_components/DatePickerRange.py @@ -73,10 +73,10 @@ class DatePickerRange(Component): not a small "x" appears on the right of the dropdown that removes the selected value. - updatemode (a value equal to: 'singledate', 'bothdates'; optional): Determines when the component should update -its value. If `bothdates`, then the DatePicker +its value. If `bothdates`, then the DatePicker will only trigger its value when the user has finished picking both dates. If `singledate`, then -the DatePicker will update its value +the DatePicker will update its value as one date is picked. Available events: 'change'""" diff --git a/dash_core_components/metadata.json b/dash_core_components/metadata.json index db39fb707..406acfb9d 100644 --- a/dash_core_components/metadata.json +++ b/dash_core_components/metadata.json @@ -653,7 +653,7 @@ ] }, "required": false, - "description": "Determines when the component should update\nits value. If `bothdates`, then the DatePicker \nwill only trigger its value when the user has\nfinished picking both dates. If `singledate`, then\nthe DatePicker will update its value \nas one date is picked.", + "description": "Determines when the component should update\nits value. If `bothdates`, then the DatePicker\nwill only trigger its value when the user has\nfinished picking both dates. If `singledate`, then\nthe DatePicker will update its value\nas one date is picked.", "defaultValue": { "value": "'singledate'", "computed": false @@ -1150,7 +1150,7 @@ "required": false, "description": "The ID of this component, used to identify dash components\nin callbacks. The ID needs to be unique across all of the\ncomponents in an app.", "defaultValue": { - "value": "'graph-' + Math.random().toString(36).substring(2,7)", + "value": "'graph-' +\nMath.random()\n .toString(36)\n .substring(2, 7)", "computed": false } }, @@ -1252,7 +1252,7 @@ "required": false, "description": "Beta: Object containing animation settings.\nOnly applies if `animate` is `true`", "defaultValue": { - "value": "{\n frame: {\n redraw: false\n },\n transition: {\n duration: 750,\n ease: 'cubic-in-out'\n }\n}", + "value": "{\n frame: {\n redraw: false,\n },\n transition: {\n duration: 750,\n ease: 'cubic-in-out',\n },\n}", "computed": false } }, @@ -1458,7 +1458,7 @@ "required": false, "description": "Plotly.js config options.\nSee https://plot.ly/javascript/configuration-options/\nfor more info.", "defaultValue": { - "value": "{\n staticPlot: false,\n editable: false,\n edits: {\n annotationPosition: false,\n annotationTail: false,\n annotationText: false,\n axisTitleText: false,\n colorbarPosition: false,\n colorbarTitleText: false,\n legendPosition: false,\n legendText: false,\n shapePosition: false,\n titleText: false\n },\n autosizable: false,\n queueLength: 0,\n fillFrame: false,\n frameMargins: 0,\n scrollZoom: false,\n doubleClick: 'reset+autosize',\n showTips: true,\n showAxisDragHandles: true,\n showAxisRangeEntryBoxes: true,\n showLink: false,\n sendData: true,\n linkText: 'Edit chart',\n showSources: false,\n displayModeBar: 'hover',\n modeBarButtonsToRemove: [],\n modeBarButtonsToAdd: [],\n modeBarButtons: false,\n displaylogo: true,\n plotGlPixelRatio: 2,\n topojsonURL: 'https://cdn.plot.ly/',\n mapboxAccessToken: null\n}", + "value": "{\n staticPlot: false,\n editable: false,\n edits: {\n annotationPosition: false,\n annotationTail: false,\n annotationText: false,\n axisTitleText: false,\n colorbarPosition: false,\n colorbarTitleText: false,\n legendPosition: false,\n legendText: false,\n shapePosition: false,\n titleText: false,\n },\n autosizable: false,\n queueLength: 0,\n fillFrame: false,\n frameMargins: 0,\n scrollZoom: false,\n doubleClick: 'reset+autosize',\n showTips: true,\n showAxisDragHandles: true,\n showAxisRangeEntryBoxes: true,\n showLink: false,\n sendData: true,\n linkText: 'Edit chart',\n showSources: false,\n displayModeBar: 'hover',\n modeBarButtonsToRemove: [],\n modeBarButtonsToAdd: [],\n modeBarButtons: false,\n displaylogo: true,\n plotGlPixelRatio: 2,\n topojsonURL: 'https://cdn.plot.ly/',\n mapboxAccessToken: null,\n}", "computed": false } }, @@ -2742,7 +2742,7 @@ "required": false, "description": "Overrides the default (inline) styles when disabled", "defaultValue": { - "value": "{\n color: '#d6d6d6'\n}", + "value": "{\n color: '#d6d6d6',\n}", "computed": false } }, @@ -3342,7 +3342,7 @@ "required": false, "description": "CSS styles to apply while active", "defaultValue": { - "value": "{\n borderStyle: 'solid',\n borderColor: '#6c6',\n backgroundColor: '#eee'\n}", + "value": "{\n borderStyle: 'solid',\n borderColor: '#6c6',\n backgroundColor: '#eee',\n}", "computed": false } }, @@ -3353,7 +3353,7 @@ "required": false, "description": "CSS styles if rejected", "defaultValue": { - "value": "{\n borderStyle: 'solid',\n borderColor: '#c66',\n backgroundColor: '#eee'\n}", + "value": "{\n borderStyle: 'solid',\n borderColor: '#c66',\n backgroundColor: '#eee',\n}", "computed": false } }, @@ -3364,7 +3364,7 @@ "required": false, "description": "CSS styles if disabled", "defaultValue": { - "value": "{\n opacity: 0.5\n}", + "value": "{\n opacity: 0.5,\n}", "computed": false } }, diff --git a/dash_core_components/package.json b/dash_core_components/package.json index f4477161b..0e7a71b17 100644 --- a/dash_core_components/package.json +++ b/dash_core_components/package.json @@ -8,22 +8,24 @@ }, "main": "src/index.js", "scripts": { - "build-dev": "builder run clean-lib && builder run extract-metadata && builder run generate-python-classes && webpack -w --config=./config/webpack/webpack.config.dev.js", - "build-dist": "builder run clean-lib && builder run extract-metadata && builder run generate-python-classes && cross-env NODE_ENV=production webpack --config=./config/webpack/webpack.config.dist.js", - "copy-lib": "cp -f lib/* dash_core_components", "generate-python-classes": "python -c \"import dash; dash.development.component_loader.generate_classes('dash_core_components', 'dash_core_components/metadata.json');\"", "install-local": "npm run copy-lib && python setup.py install", - "prepublish": "npm test && builder run build-dist && npm run copy-lib", + "prepublish": "npm run format && npm run lint && npm run build:js && npm run build:py", "publish-all": "npm publish && python setup.py sdist upload", "publish-pypi": "npm run prepublish && python setup.py sdist && twine upload --sign --skip-existing", "start": "./node_modules/.bin/builder run build-dev", - "test": "eslint src", - "test-watch": "./node_modules/.bin/builder run test-frontend-watch", - "test-debug": "./node_modules/.bin/builder run test-frontend-debug", + "lint": "eslint src", + "test": "DASH_TEST_PROCESSES=1 python -m unittest -v test.test_integration.Tests", + "format": "prettier --config .prettierrc --write src/**/*.js", "uninstall-local": "pip uninstall dash-core-components -y", "build:js": "webpack --mode production", "build:py": "node ./extract-meta src/components > dash_core_components/metadata.json && cp package.json dash_core_components && npm run generate-python-classes" }, + "husky": { + "hooks": { + "pre-push": "npm run format && npm run lint && npm test" + } + }, "author": "Chris Parmer ", "license": "MIT", "dependencies": { @@ -65,7 +67,8 @@ "devDependencies": { "component-playground": "^2.0.0", "dash-components-archetype-dev": "^0.3.0-rc1", - "enzyme": "^2.4.1" + "enzyme": "^2.4.1", + "husky": "^1.0.0-rc.14" }, "peerDependencies": { "react": "^15.4.0 || ^16.0.0", diff --git a/package-lock.json b/package-lock.json index 2a91e06e4..25b77b171 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dash-core-components", - "version": "0.27.1", + "version": "0.28.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2297,8 +2297,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bowser": { "version": "1.9.2", @@ -2816,7 +2815,6 @@ "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "dev": true, "requires": { "css-select": "~1.2.0", "dom-serializer": "~0.1.0", @@ -3819,7 +3817,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, "requires": { "boolbase": "~1.0.0", "css-what": "2.1", @@ -3852,8 +3849,7 @@ "css-what": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, "cssesc": { "version": "0.1.0", @@ -4600,7 +4596,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.1", "entities": "~1.1.1" @@ -4609,8 +4604,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=" } } }, @@ -4622,14 +4616,12 @@ "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=" }, "domhandler": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", - "dev": true, "requires": { "domelementtype": "1" } @@ -4638,7 +4630,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", "domelementtype": "1" @@ -4870,7 +4861,6 @@ "version": "2.9.1", "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.9.1.tgz", "integrity": "sha1-B9XOaRJBJA+4F78sSxjW5TAkDfY=", - "dev": true, "requires": { "cheerio": "^0.22.0", "function.prototype.name": "^1.0.0", @@ -4887,8 +4877,7 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" } } }, @@ -5210,6 +5199,21 @@ } } }, + "eslint-config-prettier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.0.1.tgz", + "integrity": "sha512-vA0TB8HCx/idHXfKHYcg9J98p0Q8nkfNwNAoP7e+ywUidn6ScaFS5iqncZAHPz+/a0A/tp657ulFHFx/2JDP4Q==", + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" + } + } + }, "eslint-import-resolver-node": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", @@ -6500,8 +6504,7 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "optional": true + "bundled": true }, "aproba": { "version": "1.1.1", @@ -6557,7 +6560,6 @@ "block-stream": { "version": "0.0.9", "bundled": true, - "optional": true, "requires": { "inherits": "~2.0.0" } @@ -6565,7 +6567,6 @@ "boom": { "version": "2.10.1", "bundled": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -6580,8 +6581,7 @@ }, "buffer-shims": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "caseless": { "version": "0.12.0", @@ -6595,13 +6595,11 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "combined-stream": { "version": "1.0.5", "bundled": true, - "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -6612,18 +6610,15 @@ }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, - "optional": true + "bundled": true }, "cryptiles": { "version": "2.0.5", "bundled": true, - "optional": true, "requires": { "boom": "2.x.x" } @@ -6658,8 +6653,7 @@ }, "delayed-stream": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "delegates": { "version": "1.0.0", @@ -6686,8 +6680,7 @@ }, "extsprintf": { "version": "1.0.2", - "bundled": true, - "optional": true + "bundled": true }, "forever-agent": { "version": "0.6.1", @@ -6711,7 +6704,6 @@ "fstream": { "version": "1.0.11", "bundled": true, - "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -6773,8 +6765,7 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true, - "optional": true + "bundled": true }, "har-schema": { "version": "1.0.5", @@ -6798,7 +6789,6 @@ "hawk": { "version": "3.1.3", "bundled": true, - "optional": true, "requires": { "boom": "2.x.x", "cryptiles": "2.x.x", @@ -6840,7 +6830,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6852,8 +6841,7 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "isstream": { "version": "0.1.2", @@ -6916,13 +6904,11 @@ }, "mime-db": { "version": "1.27.0", - "bundled": true, - "optional": true + "bundled": true }, "mime-types": { "version": "2.1.15", "bundled": true, - "optional": true, "requires": { "mime-db": "~1.27.0" } @@ -6936,13 +6922,11 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, - "optional": true + "bundled": true }, "mkdirp": { "version": "0.5.1", "bundled": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -6992,8 +6976,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "oauth-sign": { "version": "0.8.2", @@ -7042,8 +7025,7 @@ }, "process-nextick-args": { "version": "1.0.7", - "bundled": true, - "optional": true + "bundled": true }, "punycode": { "version": "1.4.1", @@ -7076,7 +7058,6 @@ "readable-stream": { "version": "2.2.9", "bundled": true, - "optional": true, "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", @@ -7125,8 +7106,7 @@ }, "safe-buffer": { "version": "5.0.1", - "bundled": true, - "optional": true + "bundled": true }, "semver": { "version": "5.3.0", @@ -7146,7 +7126,6 @@ "sntp": { "version": "1.0.9", "bundled": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -7177,7 +7156,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7187,7 +7165,6 @@ "string_decoder": { "version": "1.0.1", "bundled": true, - "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -7200,7 +7177,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -7213,7 +7189,6 @@ "tar": { "version": "2.2.1", "bundled": true, - "optional": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -7263,8 +7238,7 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, - "optional": true + "bundled": true }, "uuid": { "version": "3.0.1", @@ -7850,7 +7824,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.3.0", @@ -7953,6 +7926,164 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" }, + "husky": { + "version": "1.0.0-rc.14", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.0.0-rc.14.tgz", + "integrity": "sha512-lxdl0+FrKhRXvhOW978oCHCiaXQAtwoR0hdaPY1CwKd+dgbtktepEvk/3DXwQ7L1YriuG/9HDc4AHlzQ0T6cNw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.6", + "execa": "^0.9.0", + "find-up": "^3.0.0", + "get-stdin": "^6.0.0", + "is-ci": "^1.2.1", + "pkg-dir": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "read-pkg": "^4.0.1", + "run-node": "^1.0.0", + "slash": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.5.1.tgz", + "integrity": "sha512-fKFIKXaYiL1exImwJ0AhR/6jxFPSKQBk2ayV5NiNoruUs2+rxC2kNw0EG+1Z9dugZRdCrppskQ8DN2cyaUM1Hw==", + "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" + } + }, + "execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "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": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "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==", + "dev": true, + "requires": { + "ci-info": "^1.5.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-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.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" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "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 + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, "hyphenate-style-name": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", @@ -8439,7 +8570,7 @@ "is-my-ip-valid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", "dev": true }, "is-my-json-valid": { @@ -8501,7 +8632,7 @@ "is-path-in-cwd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", "requires": { "is-path-inside": "^1.0.0" } @@ -8603,8 +8734,7 @@ "is-subset": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=" }, "is-svg": { "version": "2.1.0", @@ -9571,14 +9701,12 @@ "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", - "dev": true + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" }, "lodash.bind": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", - "dev": true + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" }, "lodash.camelcase": { "version": "4.3.0", @@ -9599,8 +9727,7 @@ "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, "lodash.endswith": { "version": "4.2.1", @@ -9611,8 +9738,7 @@ "lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", - "dev": true + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" }, "lodash.find": { "version": "4.6.0", @@ -9629,14 +9755,12 @@ "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" }, "lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", - "dev": true + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" }, "lodash.get": { "version": "3.7.0", @@ -9682,8 +9806,7 @@ "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" }, "lodash.memoize": { "version": "4.1.2", @@ -9693,32 +9816,27 @@ "lodash.merge": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "dev": true + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" }, "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" }, "lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", - "dev": true + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" }, "lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", - "dev": true + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" }, "lodash.uniq": { "version": "4.5.0", @@ -10652,7 +10770,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, "requires": { "boolbase": "~1.0.0" } @@ -10713,8 +10830,7 @@ "object-is": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" }, "object-keys": { "version": "1.0.11", @@ -11300,6 +11416,15 @@ "find-up": "^1.0.0" } }, + "please-upgrade-node": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", + "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", @@ -12872,6 +12997,12 @@ "is-promise": "^2.1.0" } }, + "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-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -12970,6 +13101,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" }, + "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", diff --git a/src/components/Checklist.react.js b/src/components/Checklist.react.js index 32894daf0..4620efead 100644 --- a/src/components/Checklist.react.js +++ b/src/components/Checklist.react.js @@ -29,7 +29,7 @@ export default class Checklist extends Component { labelStyle, options, setProps, - style + style, } = this.props; const {values} = this.state; @@ -55,8 +55,12 @@ export default class Checklist extends Component { newValues = append(option.value, values); } this.setState({values: newValues}); - if (setProps) {setProps({values: newValues});} - if (fireEvent) {fireEvent({event: 'change'});} + if (setProps) { + setProps({values: newValues}); + } + if (fireEvent) { + fireEvent({event: 'change'}); + } }} /> {option.label} @@ -73,8 +77,8 @@ Checklist.propTypes = { /** * An array of options */ - options: PropTypes.arrayOf( - PropTypes.shape({ + options: PropTypes.arrayOf( + PropTypes.shape({ /** * The checkbox's label */ @@ -90,7 +94,7 @@ Checklist.propTypes = { /** * If true, this checkbox is disabled and can't be clicked on. */ - disabled: PropTypes.bool + disabled: PropTypes.bool, }) ), @@ -109,7 +113,6 @@ Checklist.propTypes = { */ style: PropTypes.object, - /** * The style of the checkbox element */ @@ -142,7 +145,7 @@ Checklist.propTypes = { */ setProps: PropTypes.func, - dashEvents: PropTypes.oneOf(['change']) + dashEvents: PropTypes.oneOf(['change']), }; Checklist.defaultProps = { @@ -150,5 +153,5 @@ Checklist.defaultProps = { inputClassName: '', labelStyle: {}, labelClassName: '', - options: [] + options: [], }; diff --git a/src/components/ConfirmDialog.react.js b/src/components/ConfirmDialog.react.js index ac61229df..c4f1ad9d1 100644 --- a/src/components/ConfirmDialog.react.js +++ b/src/components/ConfirmDialog.react.js @@ -1,7 +1,6 @@ import PropTypes from 'prop-types'; import {Component} from 'react'; - /** * ConfirmDialog is used to display the browser's native "confirm" modal, * with an optional message and two buttons ("OK" and "Cancel"). @@ -9,56 +8,54 @@ import {Component} from 'react'; * is performing an action that should require an extra step of verification. */ export default class ConfirmDialog extends Component { - constructor(props) { super(props); this.state = { - displayed: props.displayed + displayed: props.displayed, }; this._update(); } _setStateAndProps(value) { - const { setProps } = this.props; + const {setProps} = this.props; this.setState({displayed: value.displayed}); - if (setProps) {setProps(value);} + if (setProps) { + setProps(value); + } } componentWillReceiveProps(props) { - this.setState({displayed: props.displayed}) + this.setState({displayed: props.displayed}); } _update() { - const { - message, - cancel_n_clicks, - submit_n_clicks - } = this.props; + const {message, cancel_n_clicks, submit_n_clicks} = this.props; const displayed = this.state.displayed; if (displayed) { - new Promise(resolve => resolve(window.confirm(message))).then(result => { - - if (result) { - this._setStateAndProps({ - submit_n_clicks: submit_n_clicks + 1, - submit_n_clicks_timestamp: Date.now(), - displayed: false - }); - } else { - this._setStateAndProps({ - cancel_n_clicks: cancel_n_clicks + 1, - cancel_n_clicks_timestamp: Date.now(), - displayed: false - }); + new Promise(resolve => resolve(window.confirm(message))).then( + result => { + if (result) { + this._setStateAndProps({ + submit_n_clicks: submit_n_clicks + 1, + submit_n_clicks_timestamp: Date.now(), + displayed: false, + }); + } else { + this._setStateAndProps({ + cancel_n_clicks: cancel_n_clicks + 1, + cancel_n_clicks_timestamp: Date.now(), + displayed: false, + }); + } } - }); + ); } } componentDidUpdate() { - this._update() + this._update(); } render() { @@ -70,7 +67,7 @@ ConfirmDialog.defaultProps = { submit_n_clicks: 0, submit_n_clicks_timestamp: -1, cancel_n_clicks: 0, - cancel_n_clicks_timestamp: -1 + cancel_n_clicks_timestamp: -1, }; ConfirmDialog.propTypes = { @@ -105,5 +102,5 @@ ConfirmDialog.propTypes = { /** * Dash-assigned callback that gets fired when the value changes. */ - setProps: PropTypes.func + setProps: PropTypes.func, }; diff --git a/src/components/ConfirmDialogProvider.react.js b/src/components/ConfirmDialogProvider.react.js index 82a1ff434..0dd0a191f 100644 --- a/src/components/ConfirmDialogProvider.react.js +++ b/src/components/ConfirmDialogProvider.react.js @@ -1,9 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import ConfirmDialog from './ConfirmDialog.react' - - +import ConfirmDialog from './ConfirmDialog.react'; /** * A wrapper component that will display a confirmation dialog @@ -24,22 +22,25 @@ export default class ConfirmDialogProvider extends React.Component { } componentWillReceiveProps(props) { - this.setState({displayed: props.displayed}) + this.setState({displayed: props.displayed}); } render() { - const { id, setProps, children } = this.props; + const {id, setProps, children} = this.props; const displayed = this.state.displayed; // Will lose the previous onClick of the child - const wrapClick = (child) => React.cloneElement(child, {onClick: () => - { - const update = {displayed: true}; - this.setState(update); - if (setProps) {setProps(update);} - } - }); + const wrapClick = child => + React.cloneElement(child, { + onClick: () => { + const update = {displayed: true}; + this.setState(update); + if (setProps) { + setProps(update); + } + }, + }); const realChild = children.props ? children.props.children @@ -47,16 +48,12 @@ export default class ConfirmDialogProvider extends React.Component { return (
- { - realChild && realChild.length - ? realChild.map(wrapClick) - : wrapClick(realChild) - } - + {realChild && realChild.length + ? realChild.map(wrapClick) + : wrapClick(realChild)} +
- ) + ); } } @@ -64,7 +61,7 @@ ConfirmDialogProvider.defaultProps = { submit_n_clicks: 0, submit_n_clicks_timestamp: -1, cancel_n_clicks: 0, - cancel_n_clicks_timestamp: -1 + cancel_n_clicks_timestamp: -1, }; ConfirmDialogProvider.propTypes = { @@ -102,5 +99,5 @@ ConfirmDialogProvider.propTypes = { /** * The children to hijack clicks from and display the popup. */ - children: PropTypes.any + children: PropTypes.any, }; diff --git a/src/components/DatePickerRange.react.js b/src/components/DatePickerRange.react.js index 851e3e35e..fafc8764d 100644 --- a/src/components/DatePickerRange.react.js +++ b/src/components/DatePickerRange.react.js @@ -35,8 +35,8 @@ export default class DatePickerRange extends Component { 'end_date', 'initial_visible_month', 'max_date_allowed', - 'min_date_allowed' - ] + 'min_date_allowed', + ]; momentProps.forEach(prop => { if (R.type(newProps[prop]) !== 'Undefined') { newState[prop] = moment(newProps[prop]); @@ -49,7 +49,7 @@ export default class DatePickerRange extends Component { } componentWillReceiveProps(newProps) { - this.propsToState(newProps) + this.propsToState(newProps); } componentWillMount() { @@ -57,23 +57,25 @@ export default class DatePickerRange extends Component { } onDatesChange({startDate: start_date, endDate: end_date}) { const {setProps, fireEvent, updatemode} = this.props; - const old_start_date = this.state.start_date - const old_end_date = this.state.end_date + const old_start_date = this.state.start_date; + const old_end_date = this.state.end_date; const newState = {}; if (setProps && start_date !== null && start_date !== old_start_date) { - if(updatemode === 'singledate') { + if (updatemode === 'singledate') { setProps({start_date: start_date.format('YYYY-MM-DD')}); } - } + } newState.start_date = start_date; if (setProps && end_date !== null && end_date !== old_end_date) { - if(updatemode === 'singledate') { + if (updatemode === 'singledate') { setProps({end_date: end_date.format('YYYY-MM-DD')}); - } - else if (updatemode === 'bothdates') { - setProps({start_date: start_date.format('YYYY-MM-DD'), end_date: end_date.format('YYYY-MM-DD')}); + } else if (updatemode === 'bothdates') { + setProps({ + start_date: start_date.format('YYYY-MM-DD'), + end_date: end_date.format('YYYY-MM-DD'), + }); } } newState.end_date = end_date; @@ -87,7 +89,12 @@ export default class DatePickerRange extends Component { isOutsideRange(date) { const {min_date_allowed, max_date_allowed} = this.state; - const notUndefined = R.complement(R.pipe(R.type, R.equals('Undefined'))); + const notUndefined = R.complement( + R.pipe( + R.type, + R.equals('Undefined') + ) + ); return ( (notUndefined(min_date_allowed) && date < min_date_allowed) || (notUndefined(max_date_allowed) && date >= max_date_allowed) @@ -99,7 +106,7 @@ export default class DatePickerRange extends Component { start_date, end_date, focusedInput, - initial_visible_month + initial_visible_month, } = this.state; const { @@ -119,10 +126,10 @@ export default class DatePickerRange extends Component { start_date_placeholder_text, stay_open_on_select, with_full_screen_portal, - with_portal + with_portal, } = this.props; - const verticalFlag = (calendar_orientation !== 'vertical'); + const verticalFlag = calendar_orientation !== 'vertical'; return ( { if (initial_visible_month) { - return initial_visible_month - } - if (focusedInput === 'endDate') { - return end_date; - } - return start_date; - - + return initial_visible_month; + } + if (focusedInput === 'endDate') { + return end_date; + } + return start_date; }} isOutsideRange={this.isOutsideRange} isRTL={is_RTL} @@ -305,7 +310,7 @@ DatePickerRange.propTypes = { */ disabled: PropTypes.bool, - /** + /** * Whether or not the dropdown is "clearable", that is, whether or * not a small "x" appears on the right of the dropdown that removes * the selected value. @@ -324,10 +329,10 @@ DatePickerRange.propTypes = { /** * Determines when the component should update - * its value. If `bothdates`, then the DatePicker + * its value. If `bothdates`, then the DatePicker * will only trigger its value when the user has * finished picking both dates. If `singledate`, then - * the DatePicker will update its value + * the DatePicker will update its value * as one date is picked. */ updatemode: PropTypes.oneOf(['singledate', 'bothdates']), @@ -347,5 +352,5 @@ DatePickerRange.defaultProps = { reopen_calendar_on_clear: false, clearable: false, disabled: false, - updatemode: 'singledate' + updatemode: 'singledate', }; diff --git a/src/components/DatePickerSingle.react.js b/src/components/DatePickerSingle.react.js index 6e80d7387..389a009e1 100644 --- a/src/components/DatePickerSingle.react.js +++ b/src/components/DatePickerSingle.react.js @@ -34,8 +34,8 @@ export default class DatePickerSingle extends Component { 'date', 'initial_visible_month', 'max_date_allowed', - 'min_date_allowed' - ] + 'min_date_allowed', + ]; momentProps.forEach(prop => { if (R.type(newProps[prop]) !== 'Undefined') { newState[prop] = moment(newProps[prop]); @@ -48,7 +48,7 @@ export default class DatePickerSingle extends Component { } componentWillReceiveProps(newProps) { - this.propsToState(newProps) + this.propsToState(newProps); } componentWillMount() { @@ -57,14 +57,18 @@ export default class DatePickerSingle extends Component { isOutsideRange(date) { const {min_date_allowed, max_date_allowed} = this.state; - const notUndefined = R.complement(R.pipe(R.type, R.equals('Undefined'))); + const notUndefined = R.complement( + R.pipe( + R.type, + R.equals('Undefined') + ) + ); return ( (notUndefined(min_date_allowed) && date < min_date_allowed) || (notUndefined(max_date_allowed) && date >= max_date_allowed) ); } - onDateChange(date) { const {setProps, fireEvent} = this.props; if (setProps && date !== null) { @@ -78,11 +82,7 @@ export default class DatePickerSingle extends Component { } render() { - const { - date, - focused, - initial_visible_month - } = this.state; + const {date, focused, initial_visible_month} = this.state; const { calendar_orientation, @@ -99,10 +99,10 @@ export default class DatePickerSingle extends Component { show_outside_days, stay_open_on_select, with_full_screen_portal, - with_portal + with_portal, } = this.props; - const verticalFlag = (calendar_orientation !== 'vertical'); + const verticalFlag = calendar_orientation !== 'vertical'; return ( text - ); - } -} + tokenize(text) { + return text.split(REGEX).filter( + // Filter empty tokens + text => text + ); + }, +}; const DELIMETER = ','; @@ -37,8 +35,8 @@ export default class Dropdown extends Component { value: props.value, filterOptions: createFilterOptions({ options: props.options, - tokenizer: TOKENIZER - }) + tokenizer: TOKENIZER, + }), }; } @@ -48,16 +46,14 @@ export default class Dropdown extends Component { this.setState({ filterOptions: createFilterOptions({ options: newProps.options, - tokenizer: TOKENIZER - }) + tokenizer: TOKENIZER, + }), }); } } render() { - const { - id, fireEvent, multi, options, setProps, style - } = this.props; + const {id, fireEvent, multi, options, setProps, style} = this.props; const {filterOptions, value} = this.state; let selectedValue; if (R.type(value) === 'array') { @@ -75,23 +71,29 @@ export default class Dropdown extends Component { if (multi) { let value; if (R.isNil(selectedOption)) { - value = [] + value = []; } else { value = R.pluck('value', selectedOption); } this.setState({value}); - if (setProps) {setProps({value});} + if (setProps) { + setProps({value}); + } } else { let value; if (R.isNil(selectedOption)) { - value = null + value = null; } else { value = selectedOption.value; } this.setState({value}); - if (setProps) {setProps({value});} + if (setProps) { + setProps({value}); + } + } + if (fireEvent) { + fireEvent('change'); } - if (fireEvent) {fireEvent('change');} }} {...omit(['fireEvent', 'setProps', 'value'], this.props)} /> @@ -106,8 +108,8 @@ Dropdown.propTypes = { /** * An array of options */ - options: PropTypes.arrayOf( - PropTypes.shape({ + options: PropTypes.arrayOf( + PropTypes.shape({ /** * The checkbox's label */ @@ -123,7 +125,7 @@ Dropdown.propTypes = { /** * If true, this checkbox is disabled and can't be clicked on. */ - disabled: PropTypes.bool + disabled: PropTypes.bool, }) ), @@ -137,7 +139,7 @@ Dropdown.propTypes = { */ value: PropTypes.oneOfType([ PropTypes.string, - PropTypes.arrayOf(PropTypes.string) + PropTypes.arrayOf(PropTypes.string), ]), /** @@ -145,7 +147,6 @@ Dropdown.propTypes = { */ className: PropTypes.string, - /** * Whether or not the dropdown is "clearable", that is, whether or * not a small "x" appears on the right of the dropdown that removes @@ -189,5 +190,5 @@ Dropdown.defaultProps = { clearable: true, disabled: false, multi: false, - searchable: true + searchable: true, }; diff --git a/src/components/Graph.react.js b/src/components/Graph.react.js index 983d4aa72..20340b32f 100644 --- a/src/components/Graph.react.js +++ b/src/components/Graph.react.js @@ -22,18 +22,20 @@ const filterEventData = (gd, eventData, event) => { */ const data = gd.data; - for(let i=0; i < eventData.points.length; i++) { + for (let i = 0; i < eventData.points.length; i++) { const fullPoint = eventData.points[i]; const pointData = filter(function(o) { - return !contains(type(o), ['Object', 'Array']) + return !contains(type(o), ['Object', 'Array']); }, fullPoint); - if (has('curveNumber', fullPoint) && + if ( + has('curveNumber', fullPoint) && has('pointNumber', fullPoint) && has('customdata', data[pointData.curveNumber]) ) { - pointData.customdata = data[ - pointData.curveNumber - ].customdata[fullPoint.pointNumber]; + pointData.customdata = + data[pointData.curveNumber].customdata[ + fullPoint.pointNumber + ]; } // specific to histogram. see https://github.com/plotly/plotly.js/pull/2113/ @@ -42,9 +44,8 @@ const filterEventData = (gd, eventData, event) => { } points[i] = pointData; - } - filteredEventData = {points} + filteredEventData = {points}; } else if (event === 'relayout') { /* * relayout shouldn't include any big objects @@ -74,18 +75,20 @@ export default class PlotlyGraph extends Component { const {id, figure, animate, animation_options, config} = props; const gd = document.getElementById(id); - if (animate && this._hasPlotted && figure.data.length === gd.data.length) { + if ( + animate && + this._hasPlotted && + figure.data.length === gd.data.length + ) { return Plotly.animate(id, figure, animation_options); } - return Plotly.react(id, figure.data, figure.layout, config).then( - () => { - if (!this._hasPlotted) { - this.bindEvents(); - Plotly.Plots.resize(document.getElementById(id)); - this._hasPlotted = true; - } + return Plotly.react(id, figure.data, figure.layout, config).then(() => { + if (!this._hasPlotted) { + this.bindEvents(); + Plotly.Plots.resize(document.getElementById(id)); + this._hasPlotted = true; } - ); + }); } bindEvents() { @@ -93,42 +96,66 @@ export default class PlotlyGraph extends Component { const gd = document.getElementById(id); - gd.on('plotly_click', (eventData) => { + gd.on('plotly_click', eventData => { const clickData = filterEventData(gd, eventData, 'click'); if (!isNil(clickData)) { - if (setProps) {setProps({clickData});} - if (fireEvent) {fireEvent({event: 'click'});} + if (setProps) { + setProps({clickData}); + } + if (fireEvent) { + fireEvent({event: 'click'}); + } } }); - gd.on('plotly_hover', (eventData) => { + gd.on('plotly_hover', eventData => { const hoverData = filterEventData(gd, eventData, 'hover'); if (!isNil(hoverData)) { - if (setProps) {setProps({hoverData});} - if (fireEvent) {fireEvent({event: 'hover'})} + if (setProps) { + setProps({hoverData}); + } + if (fireEvent) { + fireEvent({event: 'hover'}); + } } }); - gd.on('plotly_selected', (eventData) => { + gd.on('plotly_selected', eventData => { const selectedData = filterEventData(gd, eventData, 'selected'); if (!isNil(selectedData)) { - if (setProps) {setProps({selectedData});} - if (fireEvent) {fireEvent({event: 'selected'});} + if (setProps) { + setProps({selectedData}); + } + if (fireEvent) { + fireEvent({event: 'selected'}); + } } }); gd.on('plotly_deselect', () => { - if (setProps) {setProps({selectedData: null});} - if (fireEvent) {fireEvent({event: 'selected'});} + if (setProps) { + setProps({selectedData: null}); + } + if (fireEvent) { + fireEvent({event: 'selected'}); + } }); - gd.on('plotly_relayout', (eventData) => { + gd.on('plotly_relayout', eventData => { const relayoutData = filterEventData(gd, eventData, 'relayout'); if (!isNil(relayoutData)) { - if (setProps) {setProps({relayoutData});} - if (fireEvent) {fireEvent({event: 'relayout'});} + if (setProps) { + setProps({relayoutData}); + } + if (fireEvent) { + fireEvent({event: 'relayout'}); + } } }); gd.on('plotly_unhover', () => { if (clear_on_unhover) { - if (setProps) {setProps({hoverData: null});} - if (fireEvent) {fireEvent({event: 'unhover'});} + if (setProps) { + setProps({hoverData: null}); + } + if (fireEvent) { + fireEvent({event: 'unhover'}); + } } }); } @@ -177,18 +204,10 @@ export default class PlotlyGraph extends Component { } } - render(){ + render() { const {className, id, style} = this.props; - return ( -
- ); - + return
; } } @@ -244,7 +263,6 @@ PlotlyGraph.propTypes = { */ className: PropTypes.string, - /** * Beta: If true, animate between updates using * plotly.js's `animate` function @@ -268,11 +286,11 @@ PlotlyGraph.propTypes = { */ staticPlot: PropTypes.bool, - /** - * we can edit titles, move annotations, etc - sets all pieces of `edits` - * unless a separate `edits` config item overrides individual parts - */ - editable: PropTypes.bool, + /** + * we can edit titles, move annotations, etc - sets all pieces of `edits` + * unless a separate `edits` config item overrides individual parts + */ + editable: PropTypes.bool, /** * a set of editable properties @@ -310,7 +328,7 @@ PlotlyGraph.propTypes = { /** * the global `layout.title` */ - titleText: PropTypes.bool + titleText: PropTypes.bool, }), /** @@ -346,7 +364,7 @@ PlotlyGraph.propTypes = { false, 'reset', 'autosize', - 'reset+autosize' + 'reset+autosize', ]), /** @@ -383,9 +401,7 @@ PlotlyGraph.propTypes = { /** * display the mode bar (true, false, or 'hover') */ - displayModeBar: PropTypes.oneOf([ - true, false, 'hover' - ]), + displayModeBar: PropTypes.oneOf([true, false, 'hover']), /** * remove mode bar button by name. @@ -432,7 +448,7 @@ PlotlyGraph.propTypes = { * If using an Mapbox Atlas server, set this option to '', * so that plotly.js won't attempt to authenticate to the public Mapbox server. */ - mapboxAccessToken: PropTypes.any + mapboxAccessToken: PropTypes.any, }), /** @@ -443,7 +459,7 @@ PlotlyGraph.propTypes = { 'hover', 'selected', 'relayout', - 'unhover' + 'unhover', ]), /** @@ -454,12 +470,16 @@ PlotlyGraph.propTypes = { /** * Function that fires events */ - fireEvent: PropTypes.func -} + fireEvent: PropTypes.func, +}; PlotlyGraph.defaultProps = { /* eslint-disable no-magic-numbers */ - id: 'graph-' + Math.random().toString(36).substring(2,7), + id: + 'graph-' + + Math.random() + .toString(36) + .substring(2, 7), /* eslint-enable no-magic-numbers */ clickData: null, hoverData: null, @@ -469,12 +489,12 @@ PlotlyGraph.defaultProps = { animate: false, animation_options: { frame: { - redraw: false + redraw: false, }, transition: { duration: 750, - ease: 'cubic-in-out' - } + ease: 'cubic-in-out', + }, }, clear_on_unhover: false, config: { @@ -490,7 +510,7 @@ PlotlyGraph.defaultProps = { legendPosition: false, legendText: false, shapePosition: false, - titleText: false + titleText: false, }, autosizable: false, queueLength: 0, @@ -512,6 +532,6 @@ PlotlyGraph.defaultProps = { displaylogo: true, plotGlPixelRatio: 2, topojsonURL: 'https://cdn.plot.ly/', - mapboxAccessToken: null - } + mapboxAccessToken: null, + }, }; diff --git a/src/components/Input.react.js b/src/components/Input.react.js index 2c11d9d07..9cf905114 100644 --- a/src/components/Input.react.js +++ b/src/components/Input.react.js @@ -20,11 +20,7 @@ export default class Input extends Component { } render() { - const { - fireEvent, - setProps, - type - } = this.props; + const {fireEvent, setProps, type} = this.props; const {value} = this.state; return ( { - if (fireEvent) {fireEvent({event: 'blur'});} + if (fireEvent) { + fireEvent({event: 'blur'}); + } }} value={value} {...omit(['fireEvent', 'setProps', 'value'], this.props)} @@ -78,7 +77,15 @@ Input.propTypes = { */ type: PropTypes.oneOf([ // Only allowing the input types with wide browser compatability - 'text', 'number', 'password', 'email', 'range', 'search', 'tel', 'url', 'hidden' + 'text', + 'number', + 'password', + 'email', + 'range', + 'search', + 'tel', + 'url', + 'hidden', ]), /** @@ -150,7 +157,7 @@ Input.propTypes = { /** * URL input. Use type="url" if possible instead. */ - 'url' + 'url', ]), /** @@ -173,7 +180,6 @@ Input.propTypes = { */ maxlength: PropTypes.string, - /** * The minimum (numeric or date-time) value for this item, which must not be greater than its maximum (max attribute) value. */ @@ -254,5 +260,5 @@ Input.propTypes = { */ setProps: PropTypes.func, - dashEvents: PropTypes.oneOf(['blur', 'change']) + dashEvents: PropTypes.oneOf(['blur', 'change']), }; diff --git a/src/components/Interval.react.js b/src/components/Interval.react.js index 1389b164a..d9fd89f79 100644 --- a/src/components/Interval.react.js +++ b/src/components/Interval.react.js @@ -24,7 +24,7 @@ export default class Interval extends Component { if (setProps && !props.disabled) { setProps({n_intervals: this.props.n_intervals + 1}); } - }, interval) + }, interval), }); } @@ -53,7 +53,10 @@ export default class Interval extends Component { } } else { // So we can restart the interval after it was 0 - if(this.props.max_intervals === 0 && nextProps.max_intervals !== 0) { + if ( + this.props.max_intervals === 0 && + nextProps.max_intervals !== 0 + ) { if (this.props.fireEvent || this.props.setProps) { this.setInterval(nextProps); } @@ -106,11 +109,11 @@ Interval.propTypes = { */ setProps: PropTypes.func, - dashEvents: PropTypes.oneOf(['interval']) + dashEvents: PropTypes.oneOf(['interval']), }; Interval.defaultProps = { interval: 1000, n_intervals: 0, - max_intervals: -1 + max_intervals: -1, }; diff --git a/src/components/Link.react.js b/src/components/Link.react.js index 4b5c90c77..84d9db879 100644 --- a/src/components/Link.react.js +++ b/src/components/Link.react.js @@ -14,10 +14,15 @@ function CustomEvent(event, params) { bubbles: false, cancelable: false, // eslint-disable-next-line no-undefined - detail: undefined + detail: undefined, }; const evt = document.createEvent('CustomEvent'); - evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + evt.initCustomEvent( + event, + params.bubbles, + params.cancelable, + params.detail + ); return evt; } CustomEvent.prototype = window.Event.prototype; @@ -31,7 +36,7 @@ export default class Link extends Component { updateLocation(e) { // prevent anchor from updating location e.preventDefault(); - const { href, refresh } = this.props; + const {href, refresh} = this.props; if (refresh) { window.location.pathname = href; } else { @@ -43,7 +48,7 @@ export default class Link extends Component { } render() { - const { className, style, id, href } = this.props; + const {className, style, id, href} = this.props; /* * ideally, we would use cloneElement however * that doesn't work with dash's recursive @@ -69,9 +74,9 @@ Link.propTypes = { className: PropTypes.string, style: PropTypes.object, id: PropTypes.string, - children: PropTypes.node + children: PropTypes.node, }; Link.defaultProps = { - refresh: false + refresh: false, }; diff --git a/src/components/Location.react.js b/src/components/Location.react.js index 821dab2cb..3d3a9ab37 100644 --- a/src/components/Location.react.js +++ b/src/components/Location.react.js @@ -14,14 +14,7 @@ export default class Location extends Component { } updateLocation(props) { - const { - hash, - href, - pathname, - refresh, - search, - setProps - } = props; + const {hash, href, pathname, refresh, search, setProps} = props; // Keep track of props relating to window.location that may need to be updated via setProps const propsToSet = {}; @@ -37,11 +30,13 @@ export default class Location extends Component { * @returns {boolean} * Returns true if the prop with fieldName is different and the window state needs to be updated */ - const checkExistsUpdateWindowLocation = (fieldName) => { + const checkExistsUpdateWindowLocation = fieldName => { const propVal = props[fieldName]; - if ((R.type(propVal) === 'Undefined' || propVal === null) - && R.type(window.location[fieldName]) !== 'Undefined') { + if ( + (R.type(propVal) === 'Undefined' || propVal === null) && + R.type(window.location[fieldName]) !== 'Undefined' + ) { // propVal is undefined or null, but window.location has this fieldName defined propsToSet[fieldName] = window.location[fieldName]; } else if (propVal !== window.location[fieldName]) { @@ -67,18 +62,25 @@ export default class Location extends Component { const searchUpdated = checkExistsUpdateWindowLocation('search'); // propsToSet has been updated -- batch update to Dash - if (R.type(setProps) === 'Function' && (Object.keys(propsToSet).length > 0)) { + if ( + R.type(setProps) === 'Function' && + Object.keys(propsToSet).length > 0 + ) { setProps(propsToSet); } // Special case -- overrides everything! - if (hrefUpdated) - {window.history.pushState({}, '', href);} - else if (pathnameUpdated || hashUpdated || searchUpdated) { + if (hrefUpdated) { + window.history.pushState({}, '', href); + } else if (pathnameUpdated || hashUpdated || searchUpdated) { // Otherwise, we can mash everything together const searchVal = R.type(search) !== 'Undefined' ? search : ''; - const hashVal = R.type(hash) !== 'Undefined' ? hash : ''; - window.history.pushState({}, '', `${pathname}${searchVal}${hashVal}`); + const hashVal = R.type(hash) !== 'Undefined' ? hash : ''; + window.history.pushState( + {}, + '', + `${pathname}${searchVal}${hashVal}` + ); } } @@ -86,14 +88,15 @@ export default class Location extends Component { const listener = () => { return () => { const {setProps} = this.props; - if (setProps) - {setProps({ + if (setProps) { + setProps({ pathname: window.location.pathname, href: window.location.href, hash: window.location.hash, - search: window.location.search - });} - } + search: window.location.search, + }); + } + }; }; window.addEventListener('onpopstate', listener()); window.onpopstate = listener('POP'); @@ -131,5 +134,5 @@ Location.propTypes = { }; Location.defaultProps = { - refresh: true + refresh: true, }; diff --git a/src/components/Markdown.react.js b/src/components/Markdown.react.js index e27e28cb7..9d2c5ffb6 100644 --- a/src/components/Markdown.react.js +++ b/src/components/Markdown.react.js @@ -8,19 +8,12 @@ import Markdown from 'react-markdown'; * A component that renders Markdown text as specified by the * CommonMark spec. */ -function DashMarkdown (props) { - - if(type(props.children) === 'Array') { +function DashMarkdown(props) { + if (type(props.children) === 'Array') { props.children = props.children.join('\n'); } - return ( - - ) + return ; } DashMarkdown.propTypes = { @@ -41,8 +34,8 @@ DashMarkdown.propTypes = { */ children: PropTypes.oneOfType([ PropTypes.string, - PropTypes.arrayOf(PropTypes.string) - ]) + PropTypes.arrayOf(PropTypes.string), + ]), }; export default DashMarkdown; diff --git a/src/components/RadioItems.react.js b/src/components/RadioItems.react.js index 3966410ab..de7d5c60c 100644 --- a/src/components/RadioItems.react.js +++ b/src/components/RadioItems.react.js @@ -29,7 +29,7 @@ export default class RadioItems extends Component { labelClassName, labelStyle, options, - setProps + setProps, } = this.props; const {value} = this.state; @@ -40,7 +40,11 @@ export default class RadioItems extends Component { return (
{options.map(option => ( -